From 28852ce47de0d27d42d23c535210385c4cfdafd2 Mon Sep 17 00:00:00 2001 From: Schife <52859362+Schife@users.noreply.github.com> Date: Fri, 20 Sep 2019 15:10:15 +0100 Subject: [PATCH] Razvan/merge 4.3 into 4.4 (#5494) * NOTICK: Corda 4.3-RC01 Created first release candidate of Corda 4.3 - RC01. * CORDA-3141: Add GracefulReconnect callbacks which allow logic to be performed when RPC disconnects unexpectedly (#5430) Also removed potential for growing stack trace on reconnects. * CORDA-2050 Upgrade Corda to Java 11 (compatibility mode) (#5356) Upgrade Corda to run with Java 11 (compatibility mode) - see https://github.com/corda/corda/pull/5356 * ENT-4198 Adding legal text Signed-off-by: Ed Prosser * TM-29 new baseline for 4.3 since new debt has been added with the last few commits (#5487) * TM-23 compileAll task to compile all code (#5490) * Add simple compileAll task to be used by warning check * lazy configure compileAll * TM-32 Merge OS 4.3 into 4.4 * TM-32 fixed detekt issue * Downgrade Dokka back to 0.9.17 due to failing docs_builder. * add ability to group test types together (#5459) * add ability to group test types together * add ability to specify podCount for use in parallel testing * remove compiler xml * add Jenkinsfile to enable scanning * trigger build * add ability to specify what docker tag to use from outside of the build * fix docker work dir * fix pipeline syntax issues * use environment rather than `def` * move agent restrictor outside of stages block * use steps block * more pipeline syntax fixes * even more pipeline syntax fixes * even more pipeline syntax fixes * add kubenetize as property to image build * move clear of docker image to end of build rather than start to prevent colocated builds * escape dollar on docker image remove command * attempt to kill all existing jobs * fix compile issue due to killall_jobs * fix compile issue due to killall_jobs pt2 * fix spelling * make all variables environment variables * add logic to delete images locally after pushing * wrap testing phase with try / finally so that junit reports are always evaluated * change the behaviour around post build actions * break implicit link between testing phase and image building phase, allowing testing to occur without a rebuild and push of image * prepend registry name to provided tag * allow tasks to specify whether they wish to stream output from containers * add timestamps directive to Jenkinsfile to have timing info on output * make KubesTest resilient against transient pod failures in k8s * increase CPU request * add logic to allow specifying container resource requests * attempt to run unit and integration tests in parallel * change unit tests to use 3 cores to allow co-location on 8c machines * join grouped tests together to give pod meaningful name * add step to renew token with GKE * change renew step to use pods instead of nodes * fix bug where memory request is not correctly passed to pod * disable unit tests for now * [CORDA-2368] Added exception handling for missing files that displays appropriate messages rather than defaulting to file names. (#5472) * NOTIK Minor adjustments to Detekt rules to reflect current working practises (#5498) * Minor adjustments to rules to reflect current working practises (including IntelliJ code style alignment) * Adjust another rule in line with existing code style. * rebaseline with changed detekt ruleset * rebaseline with NodeStartup changes --- .idea/codeStyles/Project.xml | 183 + .idea/codeStyles/codeStyleConfig.xml | 1 - Jenkinsfile | 52 +- build.gradle | 121 +- buildSrc/build.gradle | 1 + .../corda/testing/DistributedTesting.groovy | 83 +- .../net/corda/testing/ImageBuilding.groovy | 56 +- .../groovy/net/corda/testing/KubesTest.groovy | 285 +- .../corda/testing/ParallelTestGroup.groovy | 41 + .../java/net/corda/testing/KubePodResult.java | 3 + .../net/corda/testing/KubesReporting.java | 21 +- client/jfx/build.gradle | 14 + .../client/jfx/utils/AggregatedList.java | 19 + .../client/jfx/utils/ConcatenatedList.java | 16 + .../corda/client/jfx/utils/FlattenedList.java | 17 + .../corda/client/jfx/utils/MappedList.java | 17 + .../corda/client/jfx/utils/ReplayedList.java | 16 + .../net/corda/client/jfx/model/Models.kt | 2 +- .../client/jfx/model/NodeMonitorModel.kt | 3 +- ...gatedList.kt => AbstractAggregatedList.kt} | 6 +- ...tedList.kt => AbstractConcatenatedList.kt} | 11 +- ...ttenedList.kt => AbstractFlattenedList.kt} | 5 +- .../{MappedList.kt => AbstractMappedList.kt} | 3 +- ...eplayedList.kt => AbstractReplayedList.kt} | 2 +- .../client/jfx/utils/ObservableUtilities.kt | 13 +- .../client/jfx/utils/FlattenedListTest.kt | 3 +- client/rpc/build.gradle | 3 + .../CordaRPCClientReconnectionTest.kt | 11 +- .../net/corda/client/rpc/CordaRPCClient.kt | 52 +- .../rpc/internal/ReconnectingCordaRPCOps.kt | 148 +- .../net/corda/common/logging/Constants.kt | 3 +- .../net/corda/common/logging/Constants.kt | 3 +- constants.properties | 4 + core-deterministic/build.gradle | 21 +- .../CheatingSecurityProvider.java | 61 + .../deterministic/CheatingSecurityProvider.kt | 44 - ...ttachmentsClassLoaderSerializationTests.kt | 2 +- .../AttachmentsClassLoaderTests.kt | 2 +- core/build.gradle | 10 + .../core/crypto/CordaSecurityProvider.kt | 1 + .../corda/core/flows/ContractUpgradeFlow.kt | 2 +- .../net/corda/core/internal/CordaUtils.kt | 1 + .../net/corda/core/internal/InternalUtils.kt | 14 +- .../TransactionVerifierServiceInternal.kt | 2 +- .../ContractUpgradeTransactions.kt | 2 +- .../core/internal/X509EdDSAEngineTest.java | 133 + .../net/corda/core/flows/FlowsInJavaTest.java | 0 .../core/internal/X509EdDSAEngineTest.kt | 125 - detekt-baseline.xml | 5469 +---------------- detekt-config.yml | 12 +- docker/build.gradle | 19 +- .../docker/Dockerfile.zulu-sa-jdk-11-patch | 28 + docker/src/docker/Dockerfile11 | 78 + docs/source/changelog.rst | 6 +- docs/source/clientrpc.rst | 25 +- docs/source/example-code/build.gradle | 15 +- .../WorkflowTransactionBuildTutorialTest.kt | 4 +- .../docs/kotlin/vault/CustomVaultQueryTest.kt | 3 +- docs/source/index.rst | 3 +- docs/source/legal-info.rst | 3813 ++++++++++++ lib/quasar.jar | Bin 1272595 -> 1315142 bytes node-api/build.gradle | 3 + ...tachmentsClassLoaderStaticContractTests.kt | 2 +- .../internal/crypto/TlsDiffProtocolsTest.kt | 4 +- .../internal/crypto/X509UtilitiesTest.kt | 2 - node/build.gradle | 23 +- node/capsule/build.gradle | 10 +- node/capsule/src/main/java/CordaCaplet.java | 5 +- .../node/services/rpc/RpcReconnectTests.kt | 27 +- .../net/corda/node/internal/AbstractNode.kt | 25 +- .../corda/node/internal/DataSourceFactory.kt | 2 +- .../kotlin/net/corda/node/internal/Node.kt | 10 +- .../net/corda/node/internal/NodeStartup.kt | 9 +- .../internal/artemis/BrokerJaasLoginModule.kt | 10 +- .../artemis/CertificateChainCheckPolicy.kt | 21 +- .../MigrationServicesForResolution.kt | 5 +- .../kryo/DefaultKryoCustomizer.kt | 7 +- .../node/services/rpc/CheckpointDumper.kt | 6 +- .../corda/node/utilities/JVMAgentRegistry.kt | 52 - .../net/corda/node/utilities/JVMAgentUtil.kt | 25 + .../net/corda/node/internal/NodeTest.kt | 11 + .../cordapp/JarScanningCordappLoaderTest.kt | 4 +- .../node/serialization/kryo/KryoTests.kt | 8 +- .../events/FlowLogicRefFromJavaTest.java | 0 .../network/DBNetworkParametersStorageTest.kt | 21 +- .../persistence/ExposeJpaToFlowsTests.kt | 4 +- samples/bank-of-corda-demo/build.gradle | 13 +- .../corda/bank/api/BankOfCordaClientApi.kt | 3 +- samples/cordapp-configuration/build.gradle | 5 +- samples/simm-valuation-demo/build.gradle | 9 +- .../contracts-states/build.gradle | 8 +- serialization-deterministic/build.gradle | 23 +- .../internal/amqp/SerializationOutputTests.kt | 41 +- serialization/build.gradle | 5 + .../internal/AllButBlacklisted.kt | 4 - .../internal/DefaultWhitelist.kt | 2 - .../internal/amqp/ArraySerializer.kt | 4 +- .../internal/amqp/ObjectBuilder.kt | 4 + .../internal/carpenter/ClassCarpenter.kt | 2 +- .../amqp/DeserializeSimpleTypesTests.kt | 9 +- .../internal/amqp/testutils/AMQPTestUtils.kt | 2 +- .../internal/carpenter/ClassCarpenterTest.kt | 2 +- settings.gradle | 16 +- testing/node-driver/build.gradle | 11 + .../driver/SharedMemoryIncremental.java | 79 + .../kotlin/net/corda/testing/driver/Driver.kt | 1 - .../internal/SharedMemoryIncremental.kt | 74 - .../testing/node/internal/DriverDSLImpl.kt | 17 +- .../testing/node/internal/TestCordappImpl.kt | 8 +- .../TestResponseFlowInIsolationInJava.java | 5 +- testing/test-cli/build.gradle | 2 +- .../testing/CommandLineCompatibilityUtils.kt | 4 +- .../testing/internal/db/DBRunnerExtension.kt | 2 +- testing/test-utils/build.gradle | 1 + .../testing/core/JarSignatureCollectorTest.kt | 18 +- tools/checkpoint-agent/build.gradle | 2 +- .../kotlin/net/corda/tools/CheckpointAgent.kt | 1 + tools/cliutils/build.gradle | 2 - tools/demobench/build.gradle | 16 + tools/explorer/build.gradle | 16 + tools/explorer/capsule/build.gradle | 8 - .../views/cordapps/cash/CashViewer.kt | 3 +- tools/network-builder/build.gradle | 16 + .../net/corda/tools/shell/InteractiveShell.kt | 5 +- .../tools/shell/OutputFormatCommandTest.java | 5 +- .../src/main/java/CordaWebserverCaplet.java | 5 +- .../kotlin/net/corda/webserver/WebServer.kt | 3 +- .../corda/webserver/internal/NodeWebServer.kt | 3 +- webserver/webcapsule/build.gradle | 10 +- 129 files changed, 5664 insertions(+), 6214 deletions(-) create mode 100644 buildSrc/src/main/groovy/net/corda/testing/ParallelTestGroup.groovy create mode 100644 client/jfx/src/main/java/net/corda/client/jfx/utils/AggregatedList.java create mode 100644 client/jfx/src/main/java/net/corda/client/jfx/utils/ConcatenatedList.java create mode 100644 client/jfx/src/main/java/net/corda/client/jfx/utils/FlattenedList.java create mode 100644 client/jfx/src/main/java/net/corda/client/jfx/utils/MappedList.java create mode 100644 client/jfx/src/main/java/net/corda/client/jfx/utils/ReplayedList.java rename client/jfx/src/main/kotlin/net/corda/client/jfx/utils/{AggregatedList.kt => AbstractAggregatedList.kt} (96%) rename client/jfx/src/main/kotlin/net/corda/client/jfx/utils/{ConcatenatedList.kt => AbstractConcatenatedList.kt} (96%) rename client/jfx/src/main/kotlin/net/corda/client/jfx/utils/{FlattenedList.kt => AbstractFlattenedList.kt} (94%) rename client/jfx/src/main/kotlin/net/corda/client/jfx/utils/{MappedList.kt => AbstractMappedList.kt} (95%) rename client/jfx/src/main/kotlin/net/corda/client/jfx/utils/{ReplayedList.kt => AbstractReplayedList.kt} (95%) create mode 100644 core-deterministic/testing/src/test/java/net/corda/deterministic/CheatingSecurityProvider.java delete mode 100644 core-deterministic/testing/src/test/kotlin/net/corda/deterministic/CheatingSecurityProvider.kt create mode 100644 core/src/test/java/net/corda/core/internal/X509EdDSAEngineTest.java create mode 100644 core/src/test/kotlin/net/corda/core/flows/FlowsInJavaTest.java delete mode 100644 core/src/test/kotlin/net/corda/core/internal/X509EdDSAEngineTest.kt create mode 100644 docker/src/docker/Dockerfile.zulu-sa-jdk-11-patch create mode 100644 docker/src/docker/Dockerfile11 create mode 100644 docs/source/legal-info.rst delete mode 100644 node/src/main/kotlin/net/corda/node/utilities/JVMAgentRegistry.kt create mode 100644 node/src/main/kotlin/net/corda/node/utilities/JVMAgentUtil.kt rename node/src/test/{java => kotlin}/net/corda/node/services/events/FlowLogicRefFromJavaTest.java (100%) create mode 100644 testing/node-driver/src/main/java/net/corda/testing/driver/SharedMemoryIncremental.java delete mode 100644 testing/node-driver/src/main/kotlin/net/corda/testing/driver/internal/SharedMemoryIncremental.kt rename testing/node-driver/src/test/{java/net/corda/testing/node => kotlin/net/corda/testing/node/internal}/TestResponseFlowInIsolationInJava.java (95%) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index e6da17c0e7..bd066d2c35 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -27,6 +27,7 @@ \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml index 6e6eec1148..79ee123c2b 100644 --- a/.idea/codeStyles/codeStyleConfig.xml +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -1,6 +1,5 @@ \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile index 49b3ca6686..c6155604fd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,6 +2,8 @@ killall_jobs() pipeline { agent { label 'k8s' } + options { timestamps() } + environment { DOCKER_TAG_TO_USE = "${UUID.randomUUID().toString().toLowerCase().subSequence(0, 12)}" EXECUTOR_NUMBER = "${env.EXECUTOR_NUMBER}" @@ -9,7 +11,7 @@ pipeline { } stages { - stage('Corda Pull Request Integration Tests - Generate Build Image') { + stage('Corda Pull Request - Generate Build Image') { steps { withCredentials([string(credentialsId: 'container_reg_passwd', variable: 'DOCKER_PUSH_PWD')]) { sh "./gradlew " + @@ -19,26 +21,42 @@ pipeline { "-Ddocker.provided.tag=\"\${DOCKER_TAG_TO_USE}\"" + " clean pushBuildImage" } - } - } - stage('Corda Pull Request Integration Tests - Run Integration Tests') { - steps { - withCredentials([string(credentialsId: 'container_reg_passwd', variable: 'DOCKER_PUSH_PWD')]) { - sh "./gradlew " + - "-DbuildId=\"\${BUILD_ID}\" " + - "-Ddocker.push.password=\"\${DOCKER_PUSH_PWD}\" " + - "-Dkubenetize=true " + - "-Ddocker.tag=\"\${DOCKER_TAG_TO_USE}\"" + - " allParallelIntegrationTest" - } - junit '**/build/test-results-xml/**/*.xml' + sh "kubectl auth can-i get pods" } } - stage('Clear testing images') { - steps { - sh """docker rmi -f \$(docker images | grep \${DOCKER_TAG_TO_USE} | awk '{print \$3}') || echo \"there were no images to delete\"""" + stage('Corda Pull Request - Run Tests') { + parallel { + stage('Integration Tests') { + steps { + sh "./gradlew " + + "-DbuildId=\"\${BUILD_ID}\" " + + "-Dkubenetize=true " + + "-Ddocker.tag=\"\${DOCKER_TAG_TO_USE}\"" + + " allParallelIntegrationTest" + } + post { + always { + junit '**/build/test-results-xml/**/*.xml' + } + } + } +// stage('Unit Tests') { +// steps { +// sh "./gradlew " + +// "-DbuildId=\"\${BUILD_ID}\" " + +// "-Dkubenetize=true " + +// "-Ddocker.tag=\"\${DOCKER_TAG_TO_USE}\"" + +// " allParallelUnitTest" +// } +// post { +// always { +// junit '**/build/test-results-xml/**/*.xml' +// } +// } +// } } + } } } diff --git a/build.gradle b/build.gradle index b31e5882de..3170fb0595 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,8 @@ import net.corda.testing.DistributedTesting +import net.corda.testing.ParallelTestGroup + +import static org.gradle.api.JavaVersion.VERSION_1_8 +import static org.gradle.api.JavaVersion.VERSION_11 buildscript { // For sharing constants between builds @@ -17,7 +21,15 @@ buildscript { ext.warnings_as_errors = project.hasProperty("compilation.warningsAsErrors") ? project.property("compilation.warningsAsErrors").toBoolean() : false ext.quasar_group = 'co.paralleluniverse' - ext.quasar_version = constants.getProperty("quasarVersion") + // Set version of Quasar according to version of Java used: + if (JavaVersion.current() == JavaVersion.VERSION_11) { + ext.quasar_version = constants.getProperty("quasarVersion11") + ext.quasar_classifier = constants.getProperty("quasarClassifier11") + } + else { + ext.quasar_version = constants.getProperty("quasarVersion") + ext.quasar_classifier = constants.getProperty("quasarClassifier") + } ext.quasar_exclusions = [ 'co.paralleluniverse**', 'groovy**', @@ -96,7 +108,6 @@ buildscript { ext.docker_compose_rule_version = '0.35.0' ext.selenium_version = '3.141.59' ext.ghostdriver_version = '2.1.0' - ext.eaagentloader_version = '1.0.3' ext.proguard_version = constants.getProperty('proguardVersion') ext.jsch_version = '0.1.55' ext.protonj_version = '0.33.0' // Overide Artemis version @@ -106,8 +117,8 @@ buildscript { ext.picocli_version = '3.9.6' ext.commons_io_version = '2.6' ext.controlsfx_version = '8.40.15' - ext.fontawesomefx_commons_version = '8.15' - ext.fontawesomefx_fontawesome_version = '4.7.0-5' + ext.fontawesomefx_commons_version = '11.0' + ext.fontawesomefx_fontawesome_version = '4.7.0-11' // Name of the IntelliJ SDK created for the deterministic Java rt.jar. // ext.deterministic_idea_sdk = '1.8 (Deterministic)' @@ -179,8 +190,17 @@ apply plugin: 'com.jfrog.artifactory' // with the run configurations. It also doesn't realise that the project is a Java 8 project and misconfigures // the resulting import. This fixes it. apply plugin: 'java' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 + +println "Java version: " + JavaVersion.current() +sourceCompatibility = VERSION_1_8 +if (JavaVersion.current() == JavaVersion.VERSION_1_8) + targetCompatibility = VERSION_1_8 +else + targetCompatibility = VERSION_11 +println "Java source compatibility: " + sourceCompatibility +println "Java target compatibility: " + targetCompatibility +println "Quasar version: " + quasar_version +println "Quasar classifier: " + quasar_classifier allprojects { apply plugin: 'kotlin' @@ -210,8 +230,16 @@ allprojects { nugetconfEnabled = false } } - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + sourceCompatibility = VERSION_1_8 + if (JavaVersion.current() == JavaVersion.VERSION_1_8) + targetCompatibility = VERSION_1_8 + else + targetCompatibility = VERSION_11 + + jacoco { + // JDK11 official support (https://github.com/jacoco/jacoco/releases/tag/v0.8.3) + toolVersion = "0.8.3" + } tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" << "-Xlint:-options" << "-parameters" @@ -235,6 +263,10 @@ allprojects { } } + tasks.register('compileAll') { task -> + task.dependsOn tasks.withType(AbstractCompile) + } + tasks.withType(Jar) { task -> // Includes War and Ear manifest { @@ -248,6 +280,7 @@ allprojects { tasks.withType(Test) { forkEvery = 10 + ignoreFailures = project.hasProperty('tests.ignoreFailures') ? project.property('tests.ignoreFailures').toBoolean() : false failFast = project.hasProperty('tests.failFast') ? project.property('tests.failFast').toBoolean() : false // Prevent the project from creating temporary files outside of the build directory. @@ -333,6 +366,10 @@ allprojects { if (!JavaVersion.current().java8Compatible) throw new GradleException("Corda requires Java 8, please upgrade to at least 1.8.0_$java8_minUpdateVersion") +configurations { + detekt +} + // Required for building out the fat JAR. dependencies { compile project(':node') @@ -352,6 +389,7 @@ dependencies { runtime project(':finance:contracts') runtime project(':webserver') testCompile project(':test-utils') + detekt 'io.gitlab.arturbosch.detekt:detekt-cli:1.0.1' } jar { @@ -380,6 +418,26 @@ task jacocoRootReport(type: org.gradle.testing.jacoco.tasks.JacocoReport) { } } +task detekt(type: JavaExec) { + main = "io.gitlab.arturbosch.detekt.cli.Main" + classpath = configurations.detekt + def input = "$projectDir" + def config = "$projectDir/detekt-config.yml" + def baseline = "$projectDir/detekt-baseline.xml" + def params = ['-i', input, '-c', config, '-b', baseline] + args(params) +} + +task detektBaseline(type: JavaExec) { + main = "io.gitlab.arturbosch.detekt.cli.Main" + classpath = configurations.detekt + def input = "$projectDir" + def config = "$projectDir/detekt-config.yml" + def baseline = "$projectDir/detekt-baseline.xml" + def params = ['-i', input, '-c', config, '-b', baseline, '--create-baseline'] + args(params) +} + tasks.withType(Test) { reports.html.destination = file("${reporting.baseDir}/${name}") } @@ -521,32 +579,27 @@ buildScan { termsOfServiceAgree = 'yes' } +task allParallelIntegrationTest(type: ParallelTestGroup) { + testGroups "integrationTest" + numberOfShards 15 + streamOutput false + coresPerFork 6 + memoryInGbPerFork 10 +} +task allParallelUnitTest(type: ParallelTestGroup) { + testGroups "test" + numberOfShards 15 + streamOutput false + coresPerFork 3 + memoryInGbPerFork 6 +} +task allParallelUnitAndIntegrationTest(type: ParallelTestGroup) { + testGroups "test", "integrationTest" + numberOfShards 20 + streamOutput false + coresPerFork 6 + memoryInGbPerFork 10 +} apply plugin: DistributedTesting -configurations { - detekt -} -dependencies { - detekt 'io.gitlab.arturbosch.detekt:detekt-cli:1.0.1' -} - -task detekt(type: JavaExec) { - main = "io.gitlab.arturbosch.detekt.cli.Main" - classpath = configurations.detekt - def input = "$projectDir" - def config = "$projectDir/detekt-config.yml" - def baseline = "$projectDir/detekt-baseline.xml" - def params = ['-i', input, '-c', config, '-b', baseline] - args(params) -} - -task detektBaseline(type: JavaExec) { - main = "io.gitlab.arturbosch.detekt.cli.Main" - classpath = configurations.detekt - def input = "$projectDir" - def config = "$projectDir/detekt-config.yml" - def baseline = "$projectDir/detekt-baseline.xml" - def params = ['-i', input, '-c', config, '-b', baseline, '--create-baseline'] - args(params) -} diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 8c21690366..58443e65e1 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -35,6 +35,7 @@ dependencies { compile gradleApi() compile "io.fabric8:kubernetes-client:4.4.1" compile 'org.apache.commons:commons-compress:1.19' + compile 'org.apache.commons:commons-lang3:3.9' compile 'commons-codec:commons-codec:1.13' compile "io.github.classgraph:classgraph:$class_graph_version" compile "com.bmuschko:gradle-docker-plugin:5.0.0" diff --git a/buildSrc/src/main/groovy/net/corda/testing/DistributedTesting.groovy b/buildSrc/src/main/groovy/net/corda/testing/DistributedTesting.groovy index 5965908cd2..dff995e2bd 100644 --- a/buildSrc/src/main/groovy/net/corda/testing/DistributedTesting.groovy +++ b/buildSrc/src/main/groovy/net/corda/testing/DistributedTesting.groovy @@ -1,10 +1,8 @@ package net.corda.testing - import com.bmuschko.gradle.docker.tasks.image.DockerPushImage import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.Task import org.gradle.api.tasks.testing.Test /** @@ -22,6 +20,7 @@ class DistributedTesting implements Plugin { ensureImagePluginIsApplied(project) ImageBuilding imagePlugin = project.plugins.getPlugin(ImageBuilding) DockerPushImage imageBuildingTask = imagePlugin.pushTask + String providedTag = System.getProperty("docker.tag") //in each subproject //1. add the task to determine all tests within the module @@ -31,7 +30,7 @@ class DistributedTesting implements Plugin { subProject.tasks.withType(Test) { Test task -> ListTests testListerTask = createTestListingTasks(task, subProject) Test modifiedTestTask = modifyTestTaskForParallelExecution(subProject, task, testListerTask) - KubesTest parallelTestTask = generateParallelTestingTask(subProject, task, imageBuildingTask) + KubesTest parallelTestTask = generateParallelTestingTask(subProject, task, imageBuildingTask, providedTag) } } @@ -45,55 +44,57 @@ class DistributedTesting implements Plugin { //first step is to create a single task which will invoke all the submodule tasks for each grouping //ie allParallelTest will invoke [node:test, core:test, client:rpc:test ... etc] //ie allIntegrationTest will invoke [node:integrationTest, core:integrationTest, client:rpc:integrationTest ... etc] - createGroupedParallelTestTasks(allKubesTestingTasksGroupedByType, project, imageBuildingTask) + Set userGroups = new HashSet<>(project.tasks.withType(ParallelTestGroup)) + + Collection userDefinedGroups = userGroups.forEach { testGrouping -> + List groups = ((ParallelTestGroup) testGrouping).groups.collect { + allKubesTestingTasksGroupedByType.get(it) + }.flatten() + String superListOfTasks = groups.collect { it.fullTaskToExecutePath }.join(" ") + + def userDefinedParallelTask = project.rootProject.tasks.create("userDefined" + testGrouping.name.capitalize(), KubesTest) { + if (!providedTag) { + dependsOn imageBuildingTask + } + numberOfPods = testGrouping.getShardCount() + printOutput = testGrouping.printToStdOut + fullTaskToExecutePath = superListOfTasks + taskToExecuteName = testGrouping.groups.join("And") + memoryGbPerFork = testGrouping.gbOfMemory + numberOfCoresPerFork = testGrouping.coresToUse + doFirst { + dockerTag = dockerTag = providedTag ? ImageBuilding.registryName + ":" + providedTag : (imageBuildingTask.imageName.get() + ":" + imageBuildingTask.tag.get()) + } + } + def reportOnAllTask = project.rootProject.tasks.create("userDefinedReports${testGrouping.name.capitalize()}", KubesReporting) { + dependsOn userDefinedParallelTask + destinationDir new File(project.rootProject.getBuildDir(), "userDefinedReports${testGrouping.name.capitalize()}") + doFirst { + destinationDir.deleteDir() + shouldPrintOutput = !testGrouping.printToStdOut + podResults = userDefinedParallelTask.containerResults + reportOn(userDefinedParallelTask.testOutput) + } + } + userDefinedParallelTask.finalizedBy(reportOnAllTask) + testGrouping.dependsOn(userDefinedParallelTask) + } } } - private List createGroupedParallelTestTasks(Map> allKubesTestingTasksGroupedByType, Project project, DockerPushImage imageBuildingTask) { - allKubesTestingTasksGroupedByType.entrySet().collect { entry -> - def taskType = entry.key - def allTasksOfType = entry.value - def allParallelTask = project.rootProject.tasks.create("allParallel" + taskType.capitalize(), KubesTest) { - dependsOn imageBuildingTask - printOutput = true - fullTaskToExecutePath = allTasksOfType.collect { task -> task.fullTaskToExecutePath }.join(" ") - taskToExecuteName = taskType - doFirst { - dockerTag = imageBuildingTask.imageName.get() + ":" + imageBuildingTask.tag.get() - } - } - - //second step is to create a task to use the reports output by the parallel test task - def reportOnAllTask = project.rootProject.tasks.create("reportAllParallel${taskType.capitalize()}", KubesReporting) { - dependsOn allParallelTask - destinationDir new File(project.rootProject.getBuildDir(), "allResults${taskType.capitalize()}") - doFirst { - destinationDir.deleteDir() - podResults = allParallelTask.containerResults - reportOn(allParallelTask.testOutput) - } - } - - //invoke this report task after parallel testing - allParallelTask.finalizedBy(reportOnAllTask) - project.logger.info "Created task: ${allParallelTask.getPath()} to enable testing on kubenetes for tasks: ${allParallelTask.fullTaskToExecutePath}" - project.logger.info "Created task: ${reportOnAllTask.getPath()} to generate test html output for task ${allParallelTask.getPath()}" - return allParallelTask - - } - } - - private KubesTest generateParallelTestingTask(Project projectContainingTask, Test task, DockerPushImage imageBuildingTask) { + private KubesTest generateParallelTestingTask(Project projectContainingTask, Test task, DockerPushImage imageBuildingTask, String providedTag) { def taskName = task.getName() def capitalizedTaskName = task.getName().capitalize() KubesTest createdParallelTestTask = projectContainingTask.tasks.create("parallel" + capitalizedTaskName, KubesTest) { - dependsOn imageBuildingTask + if (!providedTag) { + dependsOn imageBuildingTask + } printOutput = true fullTaskToExecutePath = task.getPath() taskToExecuteName = taskName doFirst { - dockerTag = imageBuildingTask.imageName.get() + ":" + imageBuildingTask.tag.get() + dockerTag = providedTag ? ImageBuilding.registryName + ":" + providedTag : (imageBuildingTask.imageName.get() + ":" + imageBuildingTask.tag.get()) } } projectContainingTask.logger.info "Created task: ${createdParallelTestTask.getPath()} to enable testing on kubenetes for task: ${task.getPath()}" diff --git a/buildSrc/src/main/groovy/net/corda/testing/ImageBuilding.groovy b/buildSrc/src/main/groovy/net/corda/testing/ImageBuilding.groovy index 54f6e91f74..dbbe22a5ba 100644 --- a/buildSrc/src/main/groovy/net/corda/testing/ImageBuilding.groovy +++ b/buildSrc/src/main/groovy/net/corda/testing/ImageBuilding.groovy @@ -1,10 +1,7 @@ package net.corda.testing import com.bmuschko.gradle.docker.DockerRegistryCredentials -import com.bmuschko.gradle.docker.tasks.container.DockerCreateContainer -import com.bmuschko.gradle.docker.tasks.container.DockerLogsContainer -import com.bmuschko.gradle.docker.tasks.container.DockerStartContainer -import com.bmuschko.gradle.docker.tasks.container.DockerWaitContainer +import com.bmuschko.gradle.docker.tasks.container.* import com.bmuschko.gradle.docker.tasks.image.* import org.gradle.api.GradleException import org.gradle.api.Plugin @@ -16,6 +13,7 @@ import org.gradle.api.Project */ class ImageBuilding implements Plugin { + public static final String registryName = "stefanotestingcr.azurecr.io/testing" DockerPushImage pushTask @Override @@ -25,7 +23,7 @@ class ImageBuilding implements Plugin { registryCredentialsForPush.username.set("stefanotestingcr") registryCredentialsForPush.password.set(System.getProperty("docker.push.password") ? System.getProperty("docker.push.password") : "") - DockerPullImage pullTask = project.tasks.create("pullBaseImage", DockerPullImage){ + DockerPullImage pullTask = project.tasks.create("pullBaseImage", DockerPullImage) { repository = "stefanotestingcr.azurecr.io/buildbase" tag = "latest" doFirst { @@ -83,33 +81,41 @@ class ImageBuilding implements Plugin { targetContainerId createBuildContainer.getContainerId() } + DockerTagImage tagBuildImageResult = project.tasks.create('tagBuildImageResult', DockerTagImage) { dependsOn commitBuildImageResult imageId = commitBuildImageResult.getImageId() - tag = System.getProperty("docker.provided.tag") ? System.getProperty("docker.provided.tag") : "${UUID.randomUUID().toString().toLowerCase().subSequence(0, 12)}" - repository = "stefanotestingcr.azurecr.io/testing" + tag = System.getProperty("docker.provided.tag") ? System.getProperty("docker.provided.tag") : "${UUID.randomUUID().toString().toLowerCase().subSequence(0, 12)}" + repository = registryName } - if (System.getProperty("docker.tag")) { - DockerPushImage pushBuildImage = project.tasks.create('pushBuildImage', DockerPushImage) { - doFirst { - registryCredentials = registryCredentialsForPush - } - imageName = "stefanotestingcr.azurecr.io/testing" - tag = System.getProperty("docker.tag") + DockerPushImage pushBuildImage = project.tasks.create('pushBuildImage', DockerPushImage) { + dependsOn tagBuildImageResult + doFirst { + registryCredentials = registryCredentialsForPush } - this.pushTask = pushBuildImage - } else { - DockerPushImage pushBuildImage = project.tasks.create('pushBuildImage', DockerPushImage) { - dependsOn tagBuildImageResult - doFirst { - registryCredentials = registryCredentialsForPush - } - imageName = "stefanotestingcr.azurecr.io/testing" - tag = tagBuildImageResult.tag - } - this.pushTask = pushBuildImage + imageName = registryName + tag = tagBuildImageResult.tag } + this.pushTask = pushBuildImage + + DockerRemoveContainer deleteContainer = project.tasks.create('deleteBuildContainer', DockerRemoveContainer) { + dependsOn pushBuildImage + targetContainerId createBuildContainer.getContainerId() + } + DockerRemoveImage deleteTaggedImage = project.tasks.create('deleteTaggedImage', DockerRemoveImage) { + dependsOn pushBuildImage + force = true + targetImageId commitBuildImageResult.getImageId() + } + DockerRemoveImage deleteBuildImage = project.tasks.create('deleteBuildImage', DockerRemoveImage) { + dependsOn deleteContainer, deleteTaggedImage + force = true + targetImageId buildDockerImageForSource.getImageId() + } + if (System.getProperty("docker.keep.image") == null) { + pushBuildImage.finalizedBy(deleteContainer, deleteBuildImage, deleteTaggedImage) + } } } \ No newline at end of file diff --git a/buildSrc/src/main/groovy/net/corda/testing/KubesTest.groovy b/buildSrc/src/main/groovy/net/corda/testing/KubesTest.groovy index b9a4896597..7ed6bb15f0 100644 --- a/buildSrc/src/main/groovy/net/corda/testing/KubesTest.groovy +++ b/buildSrc/src/main/groovy/net/corda/testing/KubesTest.groovy @@ -16,7 +16,6 @@ import java.util.concurrent.CompletableFuture import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -import java.util.function.Consumer import java.util.stream.Collectors import java.util.stream.IntStream @@ -29,6 +28,8 @@ class KubesTest extends DefaultTask { String fullTaskToExecutePath String taskToExecuteName Boolean printOutput = false + Integer numberOfCoresPerFork = 4 + Integer memoryGbPerFork = 6 public volatile List testOutput = Collections.emptyList() public volatile List containerResults = Collections.emptyList() @@ -38,7 +39,6 @@ class KubesTest extends DefaultTask { int numberOfPods = 20 int timeoutInMinutesForPodToStart = 60 - @TaskAction void runTestsOnKubes() { @@ -53,7 +53,7 @@ class KubesTest extends DefaultTask { def currentUser = System.getProperty("user.name") ? System.getProperty("user.name") : "UNKNOWN_USER" - String stableRunId = new BigInteger(64, new Random(buildId.hashCode() + currentUser.hashCode())).toString(36).toLowerCase() + String stableRunId = new BigInteger(64, new Random(buildId.hashCode() + currentUser.hashCode() + taskToExecuteName.hashCode())).toString(36).toLowerCase() String suffix = new BigInteger(64, new Random()).toString(36).toLowerCase() io.fabric8.kubernetes.client.Config config = new io.fabric8.kubernetes.client.ConfigBuilder() @@ -77,164 +77,179 @@ class KubesTest extends DefaultTask { //it's possible that a pod is being deleted by the original build, this can lead to racey conditions } - - List> podCreationFutures = IntStream.range(0, numberOfPods).mapToObj({ i -> - CompletableFuture.supplyAsync({ - File outputFile = Files.createTempFile("container", ".log").toFile() - String podName = (taskToExecuteName + "-" + stableRunId + suffix + i).toLowerCase() - Pod podRequest = buildPod(podName) - project.logger.lifecycle("created pod: " + podName) - Pod createdPod = client.pods().inNamespace(namespace).create(podRequest) - Runtime.getRuntime().addShutdownHook({ - println "Deleting pod: " + podName - client.pods().delete(createdPod) - }) - CompletableFuture waiter = new CompletableFuture() - KubePodResult result = new KubePodResult(createdPod, waiter, outputFile) - startBuildAndLogging(client, namespace, numberOfPods, i, podName, printOutput, waiter, { int resultCode -> - println podName + " has completed with resultCode=$resultCode" - result.setResultCode(resultCode) - }, outputFile) - - return result - }, executorService) + List> futures = IntStream.range(0, numberOfPods).mapToObj({ i -> + String podName = (taskToExecuteName + "-" + stableRunId + suffix + i).toLowerCase() + runBuild(client, namespace, numberOfPods, i, podName, printOutput, 3) }).collect(Collectors.toList()) - - def binaryFileFutures = podCreationFutures.collect { creationFuture -> - return creationFuture.thenComposeAsync({ podResult -> - return podResult.waiter.thenApply { - project.logger.lifecycle("Successfully terminated log streaming for " + podResult.createdPod.getMetadata().getName()) - println "Gathering test results from ${podResult.createdPod.metadata.name}" - def binaryResults = downloadTestXmlFromPod(client, namespace, podResult.createdPod) - project.logger.lifecycle("deleting: " + podResult.createdPod.getMetadata().getName()) - client.resource(podResult.createdPod).delete() - return binaryResults - } - }, singleThreadedExecutor) - } - - def allFilesDownloadedFuture = CompletableFuture.allOf(*binaryFileFutures.toArray(new CompletableFuture[0])).thenApply { - def allBinaryFiles = binaryFileFutures.collect { future -> - Collection binaryFiles = future.get() - return binaryFiles - }.flatten() - this.testOutput = Collections.synchronizedList(allBinaryFiles) - return allBinaryFiles - } - - allFilesDownloadedFuture.get() - this.containerResults = podCreationFutures.collect { it -> it.get() } + this.testOutput = Collections.synchronizedList(futures.collect { it -> it.get().binaryResults }.flatten()) + this.containerResults = futures.collect { it -> it.get() } } - void startBuildAndLogging(KubernetesClient client, - String namespace, - int numberOfPods, - int podIdx, - String podName, - boolean printOutput, - CompletableFuture waiter, - Consumer resultSetter, - File outputFileForContainer) { - try { - project.logger.lifecycle("Waiting for pod " + podName + " to start before executing build") - client.pods().inNamespace(namespace).withName(podName).waitUntilReady(timeoutInMinutesForPodToStart, TimeUnit.MINUTES) - project.logger.lifecycle("pod " + podName + " has started, executing build") - Watch eventWatch = client.pods().inNamespace(namespace).withName(podName).watch(new Watcher() { - @Override - void eventReceived(Watcher.Action action, Pod resource) { - project.logger.lifecycle("[StatusChange] pod " + resource.getMetadata().getName() + " " + action.name()) - } + CompletableFuture runBuild(KubernetesClient client, + String namespace, + int numberOfPods, + int podIdx, + String podName, + boolean printOutput, + int numberOfRetries) { - @Override - void onClose(KubernetesClientException cause) { - } - }) + CompletableFuture toReturn = new CompletableFuture() - def stdOutOs = new PipedOutputStream() - def stdOutIs = new PipedInputStream(4096) - ByteArrayOutputStream errChannelStream = new ByteArrayOutputStream(); + executorService.submit({ + int tryCount = 0 + Pod createdPod = null + while (tryCount < numberOfRetries) { + try { + Pod podRequest = buildPod(podName) + project.logger.lifecycle("requesting pod: " + podName) + createdPod = client.pods().inNamespace(namespace).create(podRequest) + project.logger.lifecycle("scheduled pod: " + podName) + File outputFile = Files.createTempFile("container", ".log").toFile() + attachStatusListenerToPod(client, namespace, podName) + schedulePodForDeleteOnShutdown(podName, client, createdPod) + waitForPodToStart(podName, client, namespace) + def stdOutOs = new PipedOutputStream() + def stdOutIs = new PipedInputStream(4096) + ByteArrayOutputStream errChannelStream = new ByteArrayOutputStream(); + KubePodResult result = new KubePodResult(createdPod, null, outputFile) + CompletableFuture waiter = new CompletableFuture<>() + ExecListener execListener = buildExecListenerForPod(podName, errChannelStream, waiter, result) + stdOutIs.connect(stdOutOs) + ExecWatch execWatch = client.pods().inNamespace(namespace).withName(podName) + .writingOutput(stdOutOs) + .writingErrorChannel(errChannelStream) + .usingListener(execListener).exec(getBuildCommand(numberOfPods, podIdx)) - def terminatingListener = new ExecListener() { - - @Override - void onOpen(Response response) { - project.logger.lifecycle("Build started on pod " + podName) - } - - @Override - void onFailure(Throwable t, Response response) { - project.logger.lifecycle("Received error from rom pod " + podName) - waiter.completeExceptionally(t) - } - - @Override - void onClose(int code, String reason) { - project.logger.lifecycle("Received onClose() from pod " + podName + " with returnCode=" + code) + startLogPumping(outputFile, stdOutIs, podIdx, printOutput) + KubePodResult execResult = waiter.join() + project.logger.lifecycle("build has ended on on pod ${podName} (${podIdx}/${numberOfPods})") + project.logger.lifecycle "Gathering test results from ${execResult.createdPod.metadata.name}" + def binaryResults = downloadTestXmlFromPod(client, namespace, execResult.createdPod) + project.logger.lifecycle("deleting: " + execResult.createdPod.getMetadata().getName()) + client.resource(execResult.createdPod).delete() + result.binaryResults = binaryResults + toReturn.complete(result) + break + } catch (Exception e) { + logger.error("Encountered error during testing cycle on pod ${podName} (${podIdx}/${numberOfPods})", e) try { - def errChannelContents = errChannelStream.toString() - println errChannelContents - Status status = Serialization.unmarshal(errChannelContents, Status.class); - resultSetter.accept(status.details?.causes?.first()?.message?.toInteger() ? status.details?.causes?.first()?.message?.toInteger() : 0) - waiter.complete() - } catch (Exception e) { - waiter.completeExceptionally(e) + if (createdPod) { + client.pods().delete(createdPod) + while (client.pods().inNamespace(namespace).list().getItems().find { p -> p.metadata.name == podName }) { + logger.warn("pod ${podName} has not been deleted, waiting 1s") + Thread.sleep(1000) + } + } + } catch (Exception ignored) { } + tryCount++ + logger.lifecycle("will retry ${podName} another ${numberOfRetries - tryCount} times") } } + if (tryCount >= numberOfRetries) { + toReturn.completeExceptionally(new RuntimeException("Failed to build in pod ${podName} (${podIdx}/${numberOfPods}) within retry limit")) + } + }) + return toReturn + } - stdOutIs.connect(stdOutOs) - - ExecWatch execWatch = client.pods().inNamespace(namespace).withName(podName) - .writingOutput(stdOutOs) - .writingErrorChannel(errChannelStream) - .usingListener(terminatingListener).exec(getBuildCommand(numberOfPods, podIdx)) - - project.logger.lifecycle("Pod: " + podName + " has started ") - - Thread loggingThread = new Thread({ -> - BufferedWriter out = null - BufferedReader br = null - try { - out = new BufferedWriter(new FileWriter(outputFileForContainer)) - br = new BufferedReader(new InputStreamReader(stdOutIs)) - String line - while ((line = br.readLine()) != null) { - def toWrite = ("${taskToExecuteName}/Container" + podIdx + ": " + line).trim() - if (printOutput) { - project.logger.lifecycle(toWrite) - } - out.println(toWrite) + void startLogPumping(File outputFile, stdOutIs, podIdx, boolean printOutput) { + Thread loggingThread = new Thread({ -> + BufferedWriter out = null + BufferedReader br = null + try { + out = new BufferedWriter(new FileWriter(outputFile)) + br = new BufferedReader(new InputStreamReader(stdOutIs)) + String line + while ((line = br.readLine()) != null) { + def toWrite = ("${taskToExecuteName}/Container" + podIdx + ": " + line).trim() + if (printOutput) { + project.logger.lifecycle(toWrite) } - } catch (IOException ignored) { + out.println(toWrite) } - finally { - out?.close() - br?.close() - } - }) + } catch (IOException ignored) { + } + finally { + out?.close() + br?.close() + } + }) - loggingThread.setDaemon(true) - loggingThread.start() - } catch (InterruptedException ignored) { - throw new GradleException("Could not get slot on cluster within timeout") + loggingThread.setDaemon(true) + loggingThread.start() + } + + ExecListener buildExecListenerForPod(podName, errChannelStream, CompletableFuture waitingFuture, KubePodResult result) { + + new ExecListener() { + @Override + void onOpen(Response response) { + project.logger.lifecycle("Build started on pod " + podName) + } + + @Override + void onFailure(Throwable t, Response response) { + project.logger.lifecycle("Received error from rom pod " + podName) + waitingFuture.completeExceptionally(t) + } + + @Override + void onClose(int code, String reason) { + project.logger.lifecycle("Received onClose() from pod " + podName + " with returnCode=" + code) + try { + def errChannelContents = errChannelStream.toString() + Status status = Serialization.unmarshal(errChannelContents, Status.class); + result.resultCode = status.details?.causes?.first()?.message?.toInteger() ? status.details?.causes?.first()?.message?.toInteger() : 0 + waitingFuture.complete(result) + } catch (Exception e) { + waitingFuture.completeExceptionally(e) + } + } } } + void schedulePodForDeleteOnShutdown(String podName, client, Pod createdPod) { + project.logger.info("attaching shutdown hook for pod ${podName}") + Runtime.getRuntime().addShutdownHook({ + println "Deleting pod: " + podName + client.pods().delete(createdPod) + }) + } + + Watch attachStatusListenerToPod(KubernetesClient client, String namespace, String podName) { + client.pods().inNamespace(namespace).withName(podName).watch(new Watcher() { + @Override + void eventReceived(Watcher.Action action, Pod resource) { + project.logger.lifecycle("[StatusChange] pod ${resource.getMetadata().getName()} ${action.name()} (${resource.status.phase})") + } + + @Override + void onClose(KubernetesClientException cause) { + } + }) + } + + void waitForPodToStart(String podName, KubernetesClient client, String namespace) { + project.logger.lifecycle("Waiting for pod " + podName + " to start before executing build") + client.pods().inNamespace(namespace).withName(podName).waitUntilReady(timeoutInMinutesForPodToStart, TimeUnit.MINUTES) + project.logger.lifecycle("pod " + podName + " has started, executing build") + } + Pod buildPod(String podName) { return new PodBuilder().withNewMetadata().withName(podName).endMetadata() .withNewSpec() .addNewVolume() .withName("gradlecache") .withNewHostPath() - .withPath("/gradle") + .withPath("/tmp/gradle") .withType("DirectoryOrCreate") .endHostPath() .endVolume() .addNewContainer() .withImage(dockerTag) .withCommand("bash") - //max container life time is 30min - .withArgs("-c", "sleep 1800") + .withArgs("-c", "sleep 3600") .addNewEnv() .withName("DRIVER_NODE_MEMORY") .withValue("1024m") @@ -243,8 +258,8 @@ class KubesTest extends DefaultTask { .endEnv() .withName(podName) .withNewResources() - .addToRequests("cpu", new Quantity("2")) - .addToRequests("memory", new Quantity("6Gi")) + .addToRequests("cpu", new Quantity("${numberOfCoresPerFork}")) + .addToRequests("memory", new Quantity("${memoryGbPerFork}Gi")) .endResources() .addNewVolumeMount() .withName("gradlecache") @@ -276,7 +291,7 @@ class KubesTest extends DefaultTask { tempDir.toFile().mkdirs() } - project.logger.lifecycle("saving to " + podName + " results to: " + tempDir.toAbsolutePath().toFile().getAbsolutePath()) + project.logger.lifecycle("Saving " + podName + " results to: " + tempDir.toAbsolutePath().toFile().getAbsolutePath()) client.pods() .inNamespace(namespace) .withName(podName) diff --git a/buildSrc/src/main/groovy/net/corda/testing/ParallelTestGroup.groovy b/buildSrc/src/main/groovy/net/corda/testing/ParallelTestGroup.groovy new file mode 100644 index 0000000000..3d4edad7df --- /dev/null +++ b/buildSrc/src/main/groovy/net/corda/testing/ParallelTestGroup.groovy @@ -0,0 +1,41 @@ +package net.corda.testing + +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.TaskAction + +class ParallelTestGroup extends DefaultTask { + + List groups = new ArrayList<>() + int shardCount = 20 + int coresToUse = 4 + int gbOfMemory = 4 + boolean printToStdOut = true + + void numberOfShards(int shards){ + this.shardCount = shards + } + + void coresPerFork(int cores){ + this.coresToUse = cores + } + + void memoryInGbPerFork(int gb){ + this.gbOfMemory = gb + } + + //when this is false, only containers will "failed" exit codes will be printed to stdout + void streamOutput(boolean print){ + this.printToStdOut = print + } + + void testGroups(String... group) { + testGroups(group.toList()) + } + + void testGroups(List group) { + group.forEach { + groups.add(it) + } + } + +} diff --git a/buildSrc/src/main/java/net/corda/testing/KubePodResult.java b/buildSrc/src/main/java/net/corda/testing/KubePodResult.java index 43377654ff..d5f725e646 100644 --- a/buildSrc/src/main/java/net/corda/testing/KubePodResult.java +++ b/buildSrc/src/main/java/net/corda/testing/KubePodResult.java @@ -3,6 +3,8 @@ package net.corda.testing; import io.fabric8.kubernetes.api.model.Pod; import java.io.File; +import java.util.Collection; +import java.util.Collections; import java.util.concurrent.CompletableFuture; public class KubePodResult { @@ -11,6 +13,7 @@ public class KubePodResult { private final CompletableFuture waiter; private volatile Integer resultCode = 255; private final File output; + private volatile Collection binaryResults = Collections.emptyList(); KubePodResult(Pod createdPod, CompletableFuture waiter, File output) { this.createdPod = createdPod; diff --git a/buildSrc/src/main/java/net/corda/testing/KubesReporting.java b/buildSrc/src/main/java/net/corda/testing/KubesReporting.java index b54e73759d..ffd55b20f3 100644 --- a/buildSrc/src/main/java/net/corda/testing/KubesReporting.java +++ b/buildSrc/src/main/java/net/corda/testing/KubesReporting.java @@ -16,6 +16,7 @@ package net.corda.testing; +import org.apache.commons.compress.utils.IOUtils; import org.gradle.api.DefaultTask; import org.gradle.api.GradleException; import org.gradle.api.Transformer; @@ -33,6 +34,8 @@ import org.gradle.internal.operations.BuildOperationExecutor; import javax.inject.Inject; import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -49,6 +52,7 @@ public class KubesReporting extends DefaultTask { private File destinationDir = new File(getProject().getBuildDir(), "test-reporting"); private List results = new ArrayList(); List podResults = new ArrayList<>(); + boolean shouldPrintOutput = true; public KubesReporting() { //force this task to always run, as it's responsible for parsing exit codes @@ -147,12 +151,17 @@ public class KubesReporting extends DefaultTask { if (!containersWithNonZeroReturnCodes.isEmpty()) { String reportUrl = new ConsoleRenderer().asClickableFileUrl(new File(destinationDir, "index.html")); - - String containerOutputs = containersWithNonZeroReturnCodes.stream().map(KubePodResult::getOutput).map(file -> new ConsoleRenderer().asClickableFileUrl(file)).reduce("", - (s, s2) -> s + "\n" + s2 - ); - - String message = "remote build failed, check test report at " + reportUrl + "\n and container outputs at " + containerOutputs; + if (shouldPrintOutput){ + containersWithNonZeroReturnCodes.forEach(container -> { + try { + System.out.println("\n##### CONTAINER OUTPUT START #####"); + IOUtils.copy(new FileInputStream(container.getOutput()), System.out); + System.out.println("##### CONTAINER OUTPUT END #####\n"); + } catch (IOException ignored) { + } + }); + } + String message = "remote build failed, check test report at " + reportUrl; throw new GradleException(message); } } else { diff --git a/client/jfx/build.gradle b/client/jfx/build.gradle index e1f6620860..d8a1b514ec 100644 --- a/client/jfx/build.gradle +++ b/client/jfx/build.gradle @@ -1,3 +1,17 @@ +// JDK 11 JavaFX +plugins { + id 'org.openjfx.javafxplugin' version '0.0.7' apply false +} + +if (JavaVersion.current().isJava9Compatible()) { + apply plugin: 'org.openjfx.javafxplugin' + javafx { + version = "11.0.2" + modules = ['javafx.controls', + 'javafx.fxml' + ] + } +} apply plugin: 'kotlin' apply plugin: 'net.corda.plugins.quasar-utils' apply plugin: 'net.corda.plugins.publish-utils' diff --git a/client/jfx/src/main/java/net/corda/client/jfx/utils/AggregatedList.java b/client/jfx/src/main/java/net/corda/client/jfx/utils/AggregatedList.java new file mode 100644 index 0000000000..cf4967b595 --- /dev/null +++ b/client/jfx/src/main/java/net/corda/client/jfx/utils/AggregatedList.java @@ -0,0 +1,19 @@ +package net.corda.client.jfx.utils; + +import javafx.collections.ObservableList; +import kotlin.jvm.functions.Function1; +import kotlin.jvm.functions.Function2; +import org.jetbrains.annotations.NotNull; + +// Java 9 introduces a new abstract method that we need to override (without using the explicit Kotlin `override` keyword to be backwards compatible +// https://docs.oracle.com/javase/9/docs/api/javafx/collections/transformation/TransformationList.html#getViewIndex-int- +public class AggregatedList extends AbstractAggregatedList { + @SuppressWarnings("unchecked") + public AggregatedList(@NotNull ObservableList list, @NotNull Function1 toKey, @NotNull Function2,A> assemble) { + super(list, toKey, assemble); + } + + public int getViewIndex(int i) { + return 0; + } +} diff --git a/client/jfx/src/main/java/net/corda/client/jfx/utils/ConcatenatedList.java b/client/jfx/src/main/java/net/corda/client/jfx/utils/ConcatenatedList.java new file mode 100644 index 0000000000..8921fcde1a --- /dev/null +++ b/client/jfx/src/main/java/net/corda/client/jfx/utils/ConcatenatedList.java @@ -0,0 +1,16 @@ +package net.corda.client.jfx.utils; + +import javafx.collections.ObservableList; +import org.jetbrains.annotations.NotNull; + +// Java 9 introduces a new abstract method that we need to override (without using the explicit Kotlin `override` keyword to be backwards compatible +// https://docs.oracle.com/javase/9/docs/api/javafx/collections/transformation/TransformationList.html#getViewIndex-int- +public class ConcatenatedList extends AbstractConcatenatedList { + public ConcatenatedList(@NotNull ObservableList> sourceList) { + super(sourceList); + } + + public int getViewIndex(int i) { + return 0; + } +} diff --git a/client/jfx/src/main/java/net/corda/client/jfx/utils/FlattenedList.java b/client/jfx/src/main/java/net/corda/client/jfx/utils/FlattenedList.java new file mode 100644 index 0000000000..f2fc402233 --- /dev/null +++ b/client/jfx/src/main/java/net/corda/client/jfx/utils/FlattenedList.java @@ -0,0 +1,17 @@ +package net.corda.client.jfx.utils; + +import javafx.collections.ObservableList; +import org.jetbrains.annotations.NotNull; + +// Java 9 introduces a new abstract method that we need to override (without using the explicit Kotlin `override` keyword to be backwards compatible +// https://docs.oracle.com/javase/9/docs/api/javafx/collections/transformation/TransformationList.html#getViewIndex-int- +public class FlattenedList extends AbstractFlattenedList { + @SuppressWarnings("unchecked") + public FlattenedList(@NotNull ObservableList sourceList) { + super(sourceList); + } + + public int getViewIndex(int i) { + return 0; + } +} diff --git a/client/jfx/src/main/java/net/corda/client/jfx/utils/MappedList.java b/client/jfx/src/main/java/net/corda/client/jfx/utils/MappedList.java new file mode 100644 index 0000000000..ea6b5c9193 --- /dev/null +++ b/client/jfx/src/main/java/net/corda/client/jfx/utils/MappedList.java @@ -0,0 +1,17 @@ +package net.corda.client.jfx.utils; + +import javafx.collections.ObservableList; +import kotlin.jvm.functions.Function1; +import org.jetbrains.annotations.NotNull; + +// Java 9 introduces a new abstract method that we need to override (without using the explicit Kotlin `override` keyword to be backwards compatible +// https://docs.oracle.com/javase/9/docs/api/javafx/collections/transformation/TransformationList.html#getViewIndex-int- +public class MappedList extends AbstractMappedList { + public MappedList(@NotNull ObservableList list, @NotNull Function1 function) { + super(list, function); + } + + public int getViewIndex(int i) { + return 0; + } +} diff --git a/client/jfx/src/main/java/net/corda/client/jfx/utils/ReplayedList.java b/client/jfx/src/main/java/net/corda/client/jfx/utils/ReplayedList.java new file mode 100644 index 0000000000..2dc7c57ea8 --- /dev/null +++ b/client/jfx/src/main/java/net/corda/client/jfx/utils/ReplayedList.java @@ -0,0 +1,16 @@ +package net.corda.client.jfx.utils; + +import javafx.collections.ObservableList; +import org.jetbrains.annotations.NotNull; + +// Java 9 introduces a new abstract method that we need to override (without using the explicit Kotlin `override` keyword to be backwards compatible +// https://docs.oracle.com/javase/9/docs/api/javafx/collections/transformation/TransformationList.html#getViewIndex-int- +public class ReplayedList extends AbstractReplayedList { + public ReplayedList(@NotNull ObservableList sourceList) { + super(sourceList); + } + + public int getViewIndex(int i) { + return 0; + } +} diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/Models.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/Models.kt index 420e53fa6a..ebb00729c7 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/Models.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/Models.kt @@ -63,7 +63,7 @@ object Models { */ private val dependencyGraph = HashMap, MutableSet>>() - fun initModel(klass: KClass) = modelStore.getOrPut(klass) { klass.java.newInstance() } + fun initModel(klass: KClass) = modelStore.getOrPut(klass) { klass.java.getDeclaredConstructor().newInstance() } fun get(klass: KClass, origin: KClass<*>): M { dependencyGraph.getOrPut(origin) { mutableSetOf() }.add(klass) val model = initModel(klass) diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt index 142a9c868f..65e026bd2f 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt @@ -1,6 +1,7 @@ package net.corda.client.jfx.model import javafx.beans.property.SimpleObjectProperty +import net.corda.client.rpc.CordaRPCClientConfiguration import net.corda.client.rpc.internal.ReconnectingCordaRPCOps import net.corda.core.contracts.ContractState import net.corda.core.flows.StateMachineRunId @@ -71,7 +72,7 @@ class NodeMonitorModel : AutoCloseable { * TODO provide an unsubscribe mechanism */ fun register(nodeHostAndPort: NetworkHostAndPort, username: String, password: String) { - rpc = ReconnectingCordaRPCOps(nodeHostAndPort, username, password) + rpc = ReconnectingCordaRPCOps(nodeHostAndPort, username, password, CordaRPCClientConfiguration.DEFAULT) proxyObservable.value = rpc diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AggregatedList.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractAggregatedList.kt similarity index 96% rename from client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AggregatedList.kt rename to client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractAggregatedList.kt index e468fb3950..ef04431c7f 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AggregatedList.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractAggregatedList.kt @@ -6,7 +6,7 @@ import javafx.collections.ObservableList import javafx.collections.transformation.TransformationList /** - * Given an [ObservableList]<[E]> and a grouping key [K], [AggregatedList] groups the elements by the key into a fresh + * Given an [ObservableList]<[E]> and a grouping key [K], [AbstractAggregatedList] groups the elements by the key into a fresh * [ObservableList]<[E]> for each group and exposes the groups as an observable list of [A]s by calling [assemble] on each. * * Changes done to elements of the input list are reflected in the observable list of the respective group, whereas @@ -36,8 +36,8 @@ import javafx.collections.transformation.TransformationList * @param toKey Function to extract the key from an element. * @param assemble Function to assemble the aggregation into the exposed [A]. */ -class AggregatedList( - list: ObservableList, +abstract class AbstractAggregatedList( + val list: ObservableList, val toKey: (E) -> K, val assemble: (K, ObservableList) -> A ) : TransformationList(list) { diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/ConcatenatedList.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractConcatenatedList.kt similarity index 96% rename from client/jfx/src/main/kotlin/net/corda/client/jfx/utils/ConcatenatedList.kt rename to client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractConcatenatedList.kt index d36e96583f..ff4b33add4 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/ConcatenatedList.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractConcatenatedList.kt @@ -7,13 +7,14 @@ import javafx.collections.transformation.TransformationList import java.util.* /** - * [ConcatenatedList] takes a list of lists and concatenates them. Any change to the underlying lists or the outer list + * [AbstractConcatenatedList] takes a list of lists and concatenates them. Any change to the underlying lists or the outer list * is propagated as expected. */ -class ConcatenatedList(sourceList: ObservableList>) : TransformationList>(sourceList) { +abstract class AbstractConcatenatedList(sourceList: ObservableList>) : TransformationList>(sourceList) { + // A wrapper for input lists so we hash differently even if a list is reused in the input. @VisibleForTesting - internal class WrappedObservableList( + class WrappedObservableList( val observableList: ObservableList ) // First let's clarify some concepts as it's easy to confuse which list we're handling where. @@ -37,9 +38,9 @@ class ConcatenatedList(sourceList: ObservableList>) : Trans // Note that similar to 'nestedIndexOffsets', 'startingOffsetOf' also isn't a one-to-one mapping because of // potentially several empty nested lists. @VisibleForTesting - internal val indexMap = HashMap, Pair>>() + val indexMap = HashMap, Pair>>() @VisibleForTesting - internal val nestedIndexOffsets = ArrayList(sourceList.size) + val nestedIndexOffsets = ArrayList(sourceList.size) init { var offset = 0 diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/FlattenedList.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractFlattenedList.kt similarity index 94% rename from client/jfx/src/main/kotlin/net/corda/client/jfx/utils/FlattenedList.kt rename to client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractFlattenedList.kt index f8d9f721af..9f092da31e 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/FlattenedList.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractFlattenedList.kt @@ -8,11 +8,10 @@ import javafx.collections.transformation.TransformationList import java.util.* /** - * [FlattenedList] flattens the passed in list of [ObservableValue]s so that changes in individual updates to the values + * [AbstractFlattenedList] flattens the passed in list of [ObservableValue]s so that changes in individual updates to the values * are reflected in the exposed list as expected. */ -class FlattenedList(val sourceList: ObservableList>) : TransformationList>(sourceList) { - +abstract class AbstractFlattenedList(val sourceList: ObservableList>) : TransformationList>(sourceList) { /** * We maintain an ObservableValue->index map. This is needed because we need the ObservableValue's index in order to * propagate a change and if the listener closure captures the index at the time of the call to diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/MappedList.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractMappedList.kt similarity index 95% rename from client/jfx/src/main/kotlin/net/corda/client/jfx/utils/MappedList.kt rename to client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractMappedList.kt index d3ad2399b1..91a927e79f 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/MappedList.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractMappedList.kt @@ -10,7 +10,8 @@ import java.util.* * when an element is inserted or updated. * Use this instead of [EasyBind.map] to trade off memory vs CPU, or if (god forbid) the mapped function is side-effecting. */ -class MappedList(list: ObservableList, val function: (A) -> B) : TransformationList(list) { +abstract class AbstractMappedList(list: ObservableList, val function: (A) -> B) : TransformationList(list) { + private val backingList = ArrayList(list.size) init { diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/ReplayedList.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractReplayedList.kt similarity index 95% rename from client/jfx/src/main/kotlin/net/corda/client/jfx/utils/ReplayedList.kt rename to client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractReplayedList.kt index 14e17eb979..1cad6da2ab 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/ReplayedList.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AbstractReplayedList.kt @@ -9,7 +9,7 @@ import java.util.* * This list type just replays changes propagated from the underlying source list. Used for testing changes and backing a * non-backed observable */ -class ReplayedList(sourceList: ObservableList) : TransformationList(sourceList) { +abstract class AbstractReplayedList(sourceList: ObservableList) : TransformationList(sourceList) { val replayedList = ArrayList(sourceList) diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/ObservableUtilities.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/ObservableUtilities.kt index 975d32c7da..f33c1eb126 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/ObservableUtilities.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/ObservableUtilities.kt @@ -143,14 +143,16 @@ fun ObservableList.foldObservable(initial: B, folderFunction: (B, * val people: ObservableList = (..) * val heights: ObservableList = people.map(Person::height).flatten() */ -fun ObservableList>.flatten(): ObservableList = FlattenedList(this) +@Suppress("UNCHECKED_CAST") +fun ObservableList>.flatten(): ObservableList = FlattenedList(this) as ObservableList /** * data class Person(val height: ObservableValue) * val people: List = listOf(alice, bob) * val heights: ObservableList = people.map(Person::height).sequence() */ -fun Collection>.sequence(): ObservableList = FlattenedList(FXCollections.observableArrayList(this)) +@Suppress("UNCHECKED_CAST") +fun Collection>.sequence(): ObservableList = FlattenedList(FXCollections.observableArrayList(this)) as ObservableList /** * data class Person(val height: Long) @@ -173,9 +175,12 @@ fun ObservableList.associateBy(toKey: (A) -> K): ObservableMap = (..) * val heightToNames: ObservableMap> = people.associateByAggregation(Person::height) { name, person -> person.name } */ +@Suppress("UNCHECKED_CAST") fun ObservableList.associateByAggregation(toKey: (A) -> K, assemble: (K, A) -> B): ObservableMap> { - return AssociatedList(AggregatedList(this, toKey) { key, members -> Pair(key, members) }, { it.first }) { key, pair -> - pair.second.map { assemble(key, it) } + @Suppress("UNCHECKED_CAST") + val sourceList = AggregatedList(this, toKey) { key, members -> Pair(key, members) } as AggregatedList>, A, K> + return AssociatedList(sourceList, { (it as Pair>).first }) { key, pair -> + (pair as Pair>).second.map { assemble(key, it) } } } diff --git a/client/jfx/src/test/kotlin/net/corda/client/jfx/utils/FlattenedListTest.kt b/client/jfx/src/test/kotlin/net/corda/client/jfx/utils/FlattenedListTest.kt index 36b55233c7..5059c2078c 100644 --- a/client/jfx/src/test/kotlin/net/corda/client/jfx/utils/FlattenedListTest.kt +++ b/client/jfx/src/test/kotlin/net/corda/client/jfx/utils/FlattenedListTest.kt @@ -16,7 +16,8 @@ class FlattenedListTest { @Before fun setup() { sourceList = FXCollections.observableArrayList(SimpleObjectProperty(1234)) - flattenedList = FlattenedList(sourceList) + @Suppress("UNCHECKED_CAST") + flattenedList = FlattenedList(sourceList) as ObservableList replayedList = ReplayedList(flattenedList) } diff --git a/client/rpc/build.gradle b/client/rpc/build.gradle index 8a650328d3..2e53526dba 100644 --- a/client/rpc/build.gradle +++ b/client/rpc/build.gradle @@ -98,6 +98,9 @@ dependencies { smokeTestImplementation "junit:junit:$junit_version" smokeTestRuntimeOnly "org.junit.vintage:junit-vintage-engine:${junit_vintage_version}" smokeTestRuntimeOnly "org.junit.platform:junit-platform-launcher:${junit_platform_version}" + + // JDK11: required by Quasar at run-time + smokeTestRuntimeOnly "com.esotericsoftware:kryo:4.0.2" } task integrationTest(type: Test) { diff --git a/client/rpc/src/integration-test/kotlin/net/corda/client/rpcreconnect/CordaRPCClientReconnectionTest.kt b/client/rpc/src/integration-test/kotlin/net/corda/client/rpcreconnect/CordaRPCClientReconnectionTest.kt index ef72fa5de1..67277b05a0 100644 --- a/client/rpc/src/integration-test/kotlin/net/corda/client/rpcreconnect/CordaRPCClientReconnectionTest.kt +++ b/client/rpc/src/integration-test/kotlin/net/corda/client/rpcreconnect/CordaRPCClientReconnectionTest.kt @@ -3,6 +3,7 @@ package net.corda.client.rpcreconnect import net.corda.client.rpc.CordaRPCClient import net.corda.client.rpc.CordaRPCClientConfiguration import net.corda.client.rpc.CordaRPCClientTest +import net.corda.client.rpc.GracefulReconnect import net.corda.client.rpc.internal.ReconnectingCordaRPCOps import net.corda.core.messaging.startTrackedFlow import net.corda.core.utilities.NetworkHostAndPort @@ -30,6 +31,8 @@ class CordaRPCClientReconnectionTest { private val portAllocator = incrementalPortAllocation() + private val gracefulReconnect = GracefulReconnect() + companion object { val rpcUser = User("user1", "test", permissions = setOf(Permissions.all())) } @@ -53,7 +56,7 @@ class CordaRPCClientReconnectionTest { maxReconnectAttempts = 5 )) - (client.start(rpcUser.username, rpcUser.password, gracefulReconnect = true).proxy as ReconnectingCordaRPCOps).use { + (client.start(rpcUser.username, rpcUser.password, gracefulReconnect = gracefulReconnect).proxy as ReconnectingCordaRPCOps).use { val rpcOps = it val networkParameters = rpcOps.networkParameters val cashStatesFeed = rpcOps.vaultTrack(Cash.State::class.java) @@ -68,7 +71,7 @@ class CordaRPCClientReconnectionTest { val networkParametersAfterCrash = rpcOps.networkParameters assertThat(networkParameters).isEqualTo(networkParametersAfterCrash) assertTrue { - latch.await(2, TimeUnit.SECONDS) + latch.await(20, TimeUnit.SECONDS) } } } @@ -93,7 +96,7 @@ class CordaRPCClientReconnectionTest { maxReconnectAttempts = 5 )) - (client.start(rpcUser.username, rpcUser.password, gracefulReconnect = true).proxy as ReconnectingCordaRPCOps).use { + (client.start(rpcUser.username, rpcUser.password, gracefulReconnect = gracefulReconnect).proxy as ReconnectingCordaRPCOps).use { val rpcOps = it val cashStatesFeed = rpcOps.vaultTrack(Cash.State::class.java) val subscription = cashStatesFeed.updates.subscribe { latch.countDown() } @@ -133,7 +136,7 @@ class CordaRPCClientReconnectionTest { maxReconnectAttempts = 5 )) - (client.start(rpcUser.username, rpcUser.password, gracefulReconnect = true).proxy as ReconnectingCordaRPCOps).use { + (client.start(rpcUser.username, rpcUser.password, gracefulReconnect = gracefulReconnect).proxy as ReconnectingCordaRPCOps).use { val rpcOps = it val networkParameters = rpcOps.networkParameters val cashStatesFeed = rpcOps.vaultTrack(Cash.State::class.java) diff --git a/client/rpc/src/main/kotlin/net/corda/client/rpc/CordaRPCClient.kt b/client/rpc/src/main/kotlin/net/corda/client/rpc/CordaRPCClient.kt index bbd5e1b99f..dace40f2fa 100644 --- a/client/rpc/src/main/kotlin/net/corda/client/rpc/CordaRPCClient.kt +++ b/client/rpc/src/main/kotlin/net/corda/client/rpc/CordaRPCClient.kt @@ -41,8 +41,20 @@ class CordaRPCConnection private constructor( companion object { @CordaInternal - internal fun createWithGracefulReconnection(username: String, password: String, addresses: List): CordaRPCConnection { - return CordaRPCConnection(null, ReconnectingCordaRPCOps(addresses, username, password)) + internal fun createWithGracefulReconnection( + username: String, + password: String, + addresses: List, + rpcConfiguration: CordaRPCClientConfiguration, + gracefulReconnect: GracefulReconnect + ): CordaRPCConnection { + return CordaRPCConnection(null, ReconnectingCordaRPCOps( + addresses, + username, + password, + rpcConfiguration, + gracefulReconnect + )) } } @@ -241,6 +253,20 @@ open class CordaRPCClientConfiguration @JvmOverloads constructor( } +/** + * GracefulReconnect provides the opportunity to perform certain logic when the RPC encounters a connection disconnect + * during communication with the node. + * + * NOTE: The callbacks provided may be executed on a separate thread to that which called the RPC command. + * + * @param onDisconnect implement this callback to perform logic when the RPC disconnects on connection disconnect + * @param onReconnect implement this callback to perform logic when the RPC has reconnected after connection disconnect + */ +class GracefulReconnect(val onDisconnect: () -> Unit = {}, val onReconnect: () -> Unit = {}) { + constructor(onDisconnect: Runnable, onReconnect: Runnable ) : + this(onDisconnect = { onDisconnect.run() }, onReconnect = { onReconnect.run() }) +} + /** * An RPC client connects to the specified server and allows you to make calls to the server that perform various * useful tasks. Please see the Client RPC section of docs.corda.net to learn more about how this API works. A brief @@ -371,11 +397,11 @@ class CordaRPCClient private constructor( * * @param username The username to authenticate with. * @param password The password to authenticate with. - * @param gracefulReconnect whether the connection will reconnect gracefully. + * @param gracefulReconnect a [GracefulReconnect] class containing callback logic when the RPC is dis/reconnected unexpectedly * @throws RPCException if the server version is too low or if the server isn't reachable within a reasonable timeout. */ @JvmOverloads - fun start(username: String, password: String, gracefulReconnect: Boolean = false): CordaRPCConnection { + fun start(username: String, password: String, gracefulReconnect: GracefulReconnect? = null): CordaRPCConnection { return start(username, password, null, null, gracefulReconnect) } @@ -388,11 +414,11 @@ class CordaRPCClient private constructor( * @param username The username to authenticate with. * @param password The password to authenticate with. * @param targetLegalIdentity in case of multi-identity RPC endpoint specific legal identity to which the calls must be addressed. - * @param gracefulReconnect whether the connection will reconnect gracefully. + * @param gracefulReconnect a [GracefulReconnect] class containing callback logic when the RPC is dis/reconnected unexpectedly * @throws RPCException if the server version is too low or if the server isn't reachable within a reasonable timeout. */ @JvmOverloads - fun start(username: String, password: String, targetLegalIdentity: CordaX500Name, gracefulReconnect: Boolean = false): CordaRPCConnection { + fun start(username: String, password: String, targetLegalIdentity: CordaX500Name, gracefulReconnect: GracefulReconnect? = null): CordaRPCConnection { return start(username, password, null, null, targetLegalIdentity, gracefulReconnect) } @@ -406,11 +432,11 @@ class CordaRPCClient private constructor( * @param password The password to authenticate with. * @param externalTrace external [Trace] for correlation. * @param impersonatedActor the actor on behalf of which all the invocations will be made. - * @param gracefulReconnect whether the connection will reconnect gracefully. + * @param gracefulReconnect a [GracefulReconnect] class containing callback logic when the RPC is dis/reconnected unexpectedly * @throws RPCException if the server version is too low or if the server isn't reachable within a reasonable timeout. */ @JvmOverloads - fun start(username: String, password: String, externalTrace: Trace?, impersonatedActor: Actor?, gracefulReconnect: Boolean = false): CordaRPCConnection { + fun start(username: String, password: String, externalTrace: Trace?, impersonatedActor: Actor?, gracefulReconnect: GracefulReconnect? = null): CordaRPCConnection { return start(username, password, externalTrace, impersonatedActor, null, gracefulReconnect) } @@ -425,19 +451,21 @@ class CordaRPCClient private constructor( * @param externalTrace external [Trace] for correlation. * @param impersonatedActor the actor on behalf of which all the invocations will be made. * @param targetLegalIdentity in case of multi-identity RPC endpoint specific legal identity to which the calls must be addressed. - * @param gracefulReconnect whether the connection will reconnect gracefully. + * @param gracefulReconnect a [GracefulReconnect] class containing callback logic when the RPC is dis/reconnected unexpectedly. + * Note that when using graceful reconnect the values for [CordaRPCClientConfiguration.connectionMaxRetryInterval] and + * [CordaRPCClientConfiguration.maxReconnectAttempts] will be overridden in order to mangage the reconnects. * @throws RPCException if the server version is too low or if the server isn't reachable within a reasonable timeout. */ @JvmOverloads - fun start(username: String, password: String, externalTrace: Trace?, impersonatedActor: Actor?, targetLegalIdentity: CordaX500Name?, gracefulReconnect: Boolean = false): CordaRPCConnection { + fun start(username: String, password: String, externalTrace: Trace?, impersonatedActor: Actor?, targetLegalIdentity: CordaX500Name?, gracefulReconnect: GracefulReconnect? = null): CordaRPCConnection { val addresses = if (haAddressPool.isEmpty()) { listOf(hostAndPort!!) } else { haAddressPool } - return if (gracefulReconnect) { - CordaRPCConnection.createWithGracefulReconnection(username, password, addresses) + return if (gracefulReconnect != null) { + CordaRPCConnection.createWithGracefulReconnection(username, password, addresses, configuration, gracefulReconnect) } else { CordaRPCConnection(getRpcClient().start(InternalCordaRPCOps::class.java, username, password, externalTrace, impersonatedActor, targetLegalIdentity)) } diff --git a/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/ReconnectingCordaRPCOps.kt b/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/ReconnectingCordaRPCOps.kt index e9a2d09d8f..c460f39926 100644 --- a/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/ReconnectingCordaRPCOps.kt +++ b/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/ReconnectingCordaRPCOps.kt @@ -1,6 +1,7 @@ package net.corda.client.rpc.internal import net.corda.client.rpc.* +import net.corda.client.rpc.internal.ReconnectingCordaRPCOps.ReconnectingRPCConnection.CurrentState.* import net.corda.client.rpc.reconnect.CouldNotStartFlowException import net.corda.core.flows.StateMachineRunId import net.corda.core.internal.div @@ -11,12 +12,14 @@ import net.corda.core.messaging.ClientRpcSslOptions import net.corda.core.messaging.CordaRPCOps import net.corda.core.messaging.DataFeed import net.corda.core.messaging.FlowHandle -import net.corda.core.utilities.* +import net.corda.core.utilities.NetworkHostAndPort +import net.corda.core.utilities.contextLogger +import net.corda.core.utilities.debug +import net.corda.core.utilities.seconds import net.corda.nodeapi.exceptions.RejectedCommandException import org.apache.activemq.artemis.api.core.ActiveMQConnectionTimedOutException import org.apache.activemq.artemis.api.core.ActiveMQSecurityException import org.apache.activemq.artemis.api.core.ActiveMQUnBlockedException -import rx.Observable import java.lang.reflect.InvocationHandler import java.lang.reflect.InvocationTargetException import java.lang.reflect.Method @@ -52,22 +55,25 @@ class ReconnectingCordaRPCOps private constructor( nodeHostAndPort: NetworkHostAndPort, username: String, password: String, + rpcConfiguration: CordaRPCClientConfiguration, sslConfiguration: ClientRpcSslOptions? = null, classLoader: ClassLoader? = null, observersPool: ExecutorService? = null ) : this( - ReconnectingRPCConnection(listOf(nodeHostAndPort), username, password, sslConfiguration, classLoader), + ReconnectingRPCConnection(listOf(nodeHostAndPort), username, password, rpcConfiguration, sslConfiguration, classLoader), observersPool ?: Executors.newCachedThreadPool(), observersPool != null) constructor( nodeHostAndPorts: List, username: String, password: String, + rpcConfiguration: CordaRPCClientConfiguration, + gracefulReconnect: GracefulReconnect? = null, sslConfiguration: ClientRpcSslOptions? = null, classLoader: ClassLoader? = null, observersPool: ExecutorService? = null ) : this( - ReconnectingRPCConnection(nodeHostAndPorts, username, password, sslConfiguration, classLoader), + ReconnectingRPCConnection(nodeHostAndPorts, username, password, rpcConfiguration, sslConfiguration, classLoader, gracefulReconnect), observersPool ?: Executors.newCachedThreadPool(), observersPool != null) private companion object { @@ -116,43 +122,59 @@ class ReconnectingCordaRPCOps private constructor( val nodeHostAndPorts: List, val username: String, val password: String, + val rpcConfiguration: CordaRPCClientConfiguration, val sslConfiguration: ClientRpcSslOptions? = null, - val classLoader: ClassLoader? + val classLoader: ClassLoader?, + val gracefulReconnect: GracefulReconnect? = null ) : RPCConnection { private var currentRPCConnection: CordaRPCConnection? = null enum class CurrentState { UNCONNECTED, CONNECTED, CONNECTING, CLOSED, DIED } - private var currentState = CurrentState.UNCONNECTED + + private var currentState = UNCONNECTED + init { current } private val current: CordaRPCConnection @Synchronized get() = when (currentState) { - CurrentState.UNCONNECTED -> connect() - CurrentState.CONNECTED -> currentRPCConnection!! - CurrentState.CLOSED -> throw IllegalArgumentException("The ReconnectingRPCConnection has been closed.") - CurrentState.CONNECTING, CurrentState.DIED -> throw IllegalArgumentException("Illegal state: $currentState ") + UNCONNECTED -> connect() + CONNECTED -> currentRPCConnection!! + CLOSED -> throw IllegalArgumentException("The ReconnectingRPCConnection has been closed.") + CONNECTING, DIED -> throw IllegalArgumentException("Illegal state: $currentState ") } - /** - * Called on external error. - * Will block until the connection is established again. - */ + @Synchronized - fun reconnectOnError(e: Throwable) { - val previousConnection = currentRPCConnection - currentState = CurrentState.DIED + private fun doReconnect(e: Throwable, previousConnection: CordaRPCConnection?) { + if (previousConnection != currentRPCConnection) { + // We've already done this, skip + return + } + // First one to get here gets to do all the reconnect logic, including calling onDisconnect and onReconnect. This makes sure + // that they're only called once per reconnect. + currentState = DIED + gracefulReconnect?.onDisconnect?.invoke() //TODO - handle error cases log.error("Reconnecting to ${this.nodeHostAndPorts} due to error: ${e.message}") log.debug("", e) connect() previousConnection?.forceClose() + gracefulReconnect?.onReconnect?.invoke() + } + /** + * Called on external error. + * Will block until the connection is established again. + */ + fun reconnectOnError(e: Throwable) { + val previousConnection = currentRPCConnection + doReconnect(e, previousConnection) } @Synchronized private fun connect(): CordaRPCConnection { - currentState = CurrentState.CONNECTING + currentState = CONNECTING currentRPCConnection = establishConnectionWithRetry() - currentState = CurrentState.CONNECTED + currentState = CONNECTED return currentRPCConnection!! } @@ -161,7 +183,7 @@ class ReconnectingCordaRPCOps private constructor( log.info("Connecting to: $attemptedAddress") try { return CordaRPCClient( - attemptedAddress, CordaRPCClientConfiguration(connectionMaxRetryInterval = retryInterval, maxReconnectAttempts = 1), sslConfiguration, classLoader + attemptedAddress, rpcConfiguration.copy(connectionMaxRetryInterval = retryInterval, maxReconnectAttempts = 1), sslConfiguration, classLoader ).start(username, password).also { // Check connection is truly operational before returning it. require(it.proxy.nodeInfo().legalIdentitiesAndCerts.isNotEmpty()) { @@ -204,63 +226,70 @@ class ReconnectingCordaRPCOps private constructor( get() = current.serverProtocolVersion @Synchronized override fun notifyServerAndClose() { - currentState = CurrentState.CLOSED + currentState = CLOSED currentRPCConnection?.notifyServerAndClose() } @Synchronized override fun forceClose() { - currentState = CurrentState.CLOSED + currentState = CLOSED currentRPCConnection?.forceClose() } @Synchronized override fun close() { - currentState = CurrentState.CLOSED + currentState = CLOSED currentRPCConnection?.close() } } private class ErrorInterceptingHandler(val reconnectingRPCConnection: ReconnectingRPCConnection, val observersPool: ExecutorService) : InvocationHandler { private fun Method.isStartFlow() = name.startsWith("startFlow") || name.startsWith("startTrackedFlow") - override fun invoke(proxy: Any, method: Method, args: Array?): Any? { - val result: Any? = try { - log.debug { "Invoking RPC $method..." } - method.invoke(reconnectingRPCConnection.proxy, *(args ?: emptyArray())).also { - log.debug { "RPC $method invoked successfully." } - } - } catch (e: InvocationTargetException) { - fun retry() = if (method.isStartFlow()) { - // Don't retry flows - throw CouldNotStartFlowException(e.targetException) - } else { - this.invoke(proxy, method, args) - } - when (e.targetException) { - is RejectedCommandException -> { - log.error("Node is being shutdown. Operation ${method.name} rejected. Retrying when node is up...", e) - reconnectingRPCConnection.reconnectOnError(e) - this.invoke(proxy, method, args) + + private fun checkIfIsStartFlow(method: Method, e: InvocationTargetException) { + if (method.isStartFlow()) { + // Don't retry flows + throw CouldNotStartFlowException(e.targetException) + } + } + + private fun doInvoke(method: Method, args: Array?): Any? { + // will stop looping when [method.invoke] succeeds + while (true) { + try { + log.debug { "Invoking RPC $method..." } + return method.invoke(reconnectingRPCConnection.proxy, *(args ?: emptyArray())).also { + log.debug { "RPC $method invoked successfully." } } - is ConnectionFailureException -> { - log.error("Failed to perform operation ${method.name}. Connection dropped. Retrying....", e) - reconnectingRPCConnection.reconnectOnError(e) - retry() - } - is RPCException -> { - log.error("Failed to perform operation ${method.name}. RPCException. Retrying....", e) - reconnectingRPCConnection.reconnectOnError(e) - Thread.sleep(1000) // TODO - explain why this sleep is necessary - retry() - } - else -> { - log.error("Failed to perform operation ${method.name}. Unknown error. Retrying....", e) - reconnectingRPCConnection.reconnectOnError(e) - retry() + } catch (e: InvocationTargetException) { + when (e.targetException) { + is RejectedCommandException -> { + log.error("Node is being shutdown. Operation ${method.name} rejected. Retrying when node is up...", e) + reconnectingRPCConnection.reconnectOnError(e) + } + is ConnectionFailureException -> { + log.error("Failed to perform operation ${method.name}. Connection dropped. Retrying....", e) + reconnectingRPCConnection.reconnectOnError(e) + checkIfIsStartFlow(method, e) + } + is RPCException -> { + log.error("Failed to perform operation ${method.name}. RPCException. Retrying....", e) + reconnectingRPCConnection.reconnectOnError(e) + Thread.sleep(1000) // TODO - explain why this sleep is necessary + checkIfIsStartFlow(method, e) + } + else -> { + log.error("Failed to perform operation ${method.name}. Unknown error. Retrying....", e) + reconnectingRPCConnection.reconnectOnError(e) + checkIfIsStartFlow(method, e) + } } } } + } + + override fun invoke(proxy: Any, method: Method, args: Array?): Any? { return when (method.returnType) { DataFeed::class.java -> { - // Intercept the data feed methods and returned a ReconnectingObservable instance - val initialFeed: DataFeed = uncheckedCast(result) + // Intercept the data feed methods and return a ReconnectingObservable instance + val initialFeed: DataFeed = uncheckedCast(doInvoke(method, args)) val observable = ReconnectingObservable(reconnectingRPCConnection, observersPool, initialFeed) { // This handles reconnecting and creates new feeds. uncheckedCast(this.invoke(reconnectingRPCConnection.proxy, method, args)) @@ -268,10 +297,11 @@ class ReconnectingCordaRPCOps private constructor( initialFeed.copy(updates = observable) } // TODO - add handlers for Observable return types. - else -> result + else -> doInvoke(method, args) } } } + override fun close() { if (!userPool) observersPool.shutdown() retryFlowsPool.shutdown() diff --git a/common/logging/src/main/kotlin/net/corda/common/logging/Constants.kt b/common/logging/src/main/kotlin/net/corda/common/logging/Constants.kt index ee3bc1108a..bb666a3c6e 100644 --- a/common/logging/src/main/kotlin/net/corda/common/logging/Constants.kt +++ b/common/logging/src/main/kotlin/net/corda/common/logging/Constants.kt @@ -5,7 +5,8 @@ package net.corda.common.logging /** * constants in this file are generated by gradle * to change this file, edit src/main/template/kotlin/net/corda/common/logging/Constants.kt - * the generated file does not need to be committed to source control (originally added to source control for ease of use) + * the generated file does not need to be committed to source control + * (originally added to source control for ease of use) */ internal const val CURRENT_MAJOR_RELEASE = "4.4-SNAPSHOT" \ No newline at end of file diff --git a/common/logging/src/main/template/kotlin/net/corda/common/logging/Constants.kt b/common/logging/src/main/template/kotlin/net/corda/common/logging/Constants.kt index 19f2cb8651..00ebdae950 100644 --- a/common/logging/src/main/template/kotlin/net/corda/common/logging/Constants.kt +++ b/common/logging/src/main/template/kotlin/net/corda/common/logging/Constants.kt @@ -5,7 +5,8 @@ package net.corda.common.logging /** * constants in this file are generated by gradle * to change this file, edit src/main/template/kotlin/net/corda/common/logging/Constants.kt - * the generated file does not need to be committed to source control (originally added to source control for ease of use) + * the generated file does not need to be committed to source control + * (originally added to source control for ease of use) */ internal const val CURRENT_MAJOR_RELEASE = "@corda_release_version@" \ No newline at end of file diff --git a/constants.properties b/constants.properties index 03a335d739..5c8fd948dd 100644 --- a/constants.properties +++ b/constants.properties @@ -12,7 +12,11 @@ java8MinUpdateVersion=171 # ***************************************************************# platformVersion=5 guavaVersion=28.0-jre +# Quasar version to use with Java 8: quasarVersion=0.7.10 +quasarClassifier=jdk8 +# Quasar version to use with Java 11: +quasarVersion11=0.8.0 proguardVersion=6.1.1 bouncycastleVersion=1.60 classgraphVersion=4.8.41 diff --git a/core-deterministic/build.gradle b/core-deterministic/build.gradle index 2613cd0d05..4b84f32d7e 100644 --- a/core-deterministic/build.gradle +++ b/core-deterministic/build.gradle @@ -8,6 +8,9 @@ apply plugin: 'idea' evaluationDependsOn(":core") +// required by DJVM and Avian JVM (for running inside the SGX enclave) which only supports Java 8. +targetCompatibility = VERSION_1_8 + def javaHome = System.getProperty('java.home') def jarBaseName = "corda-${project.name}".toString() @@ -69,8 +72,12 @@ task predeterminise(type: ProGuardTask) { injars patchCore outjars file("$buildDir/proguard/pre-deterministic-${project.version}.jar") - libraryjars file("$javaHome/lib/rt.jar") - libraryjars file("$javaHome/lib/jce.jar") + if (JavaVersion.current().isJava9Compatible()) { + libraryjars "$javaHome/jmods" + } else { + libraryjars "$javaHome/lib/rt.jar" + libraryjars "$javaHome/lib/jce.jar" + } configurations.compileClasspath.forEach { if (originalJar != it) { libraryjars it, filter: '!META-INF/versions/**' @@ -118,8 +125,12 @@ task determinise(type: ProGuardTask) { injars jarFilter outjars file("$buildDir/proguard/$jarBaseName-${project.version}.jar") - libraryjars file("$javaHome/lib/rt.jar") - libraryjars file("$javaHome/lib/jce.jar") + if (JavaVersion.current().isJava9Compatible()) { + libraryjars "$javaHome/jmods" + } else { + libraryjars "$javaHome/lib/rt.jar" + libraryjars "$javaHome/lib/jce.jar" + } configurations.deterministicLibraries.forEach { libraryjars it, filter: '!META-INF/versions/**' } @@ -145,6 +156,8 @@ task determinise(type: ProGuardTask) { } import net.corda.gradle.jarfilter.MetaFixerTask +import static org.gradle.api.JavaVersion.VERSION_1_8 + task metafix(type: MetaFixerTask) { outputDir file("$buildDir/libs") jars determinise diff --git a/core-deterministic/testing/src/test/java/net/corda/deterministic/CheatingSecurityProvider.java b/core-deterministic/testing/src/test/java/net/corda/deterministic/CheatingSecurityProvider.java new file mode 100644 index 0000000000..6d4c54a7b4 --- /dev/null +++ b/core-deterministic/testing/src/test/java/net/corda/deterministic/CheatingSecurityProvider.java @@ -0,0 +1,61 @@ +package net.corda.deterministic; + +import java.security.Provider; +import java.security.SecureRandom; +import java.security.SecureRandomSpi; +import java.security.Security; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.Assert.assertEquals; + +/** + * Temporarily restore Sun's [SecureRandom] provider. + * This is ONLY for allowing us to generate test data, e.g. signatures. + * + * JDK11 upgrade: rewritten in Java to gain access to private internal JDK classes via module directives (not available to Kotlin compiler): + * sun.security.provider.SecureRandom() + */ +public class CheatingSecurityProvider extends Provider implements AutoCloseable { + + private static AtomicInteger counter = new AtomicInteger(); + + @SuppressWarnings("deprecation") // JDK11: should replace with Provider(String name, double version, String info) (since 9) + public CheatingSecurityProvider() { + super("Cheat-" + counter.getAndIncrement(), 1.8, "Cheat security provider"); + putService(new CheatingSecureRandomService(this)); + assertEquals(1, Security.insertProviderAt(this, 1)); + } + + public void close() { + Security.removeProvider(getName()); + } + + private class SunSecureRandom extends SecureRandom { + public SunSecureRandom() { + // JDK11 upgrade: rewritten in Java to gain access to private internal JDK classes via open module directive + super(new sun.security.provider.SecureRandom(), null); + } + } + + private class CheatingSecureRandomService extends Provider.Service { + + public CheatingSecureRandomService(Provider provider) { + super(provider, "SecureRandom", "CheatingPRNG", CheatingSecureRandomSpi.class.getName(), null, null); + } + + private SecureRandomSpi instance = new CheatingSecureRandomSpi(); + + public Object newInstance(Object constructorParameter){ + return instance; + } + } + + private class CheatingSecureRandomSpi extends SecureRandomSpi { + + private SecureRandom secureRandom = new SunSecureRandom(); + + public void engineSetSeed(byte[] seed) { secureRandom.setSeed(seed); } + public void engineNextBytes(byte[] bytes) { secureRandom.nextBytes(bytes); } + public byte[] engineGenerateSeed(int numBytes) { return secureRandom.generateSeed(numBytes); } + } +} \ No newline at end of file diff --git a/core-deterministic/testing/src/test/kotlin/net/corda/deterministic/CheatingSecurityProvider.kt b/core-deterministic/testing/src/test/kotlin/net/corda/deterministic/CheatingSecurityProvider.kt deleted file mode 100644 index f62c67b2c3..0000000000 --- a/core-deterministic/testing/src/test/kotlin/net/corda/deterministic/CheatingSecurityProvider.kt +++ /dev/null @@ -1,44 +0,0 @@ -package net.corda.deterministic - -import org.junit.Assert.* -import java.security.Provider -import java.security.SecureRandom -import java.security.SecureRandomSpi -import java.security.Security -import java.util.concurrent.atomic.AtomicInteger - -/** - * Temporarily restore Sun's [SecureRandom] provider. - * This is ONLY for allowing us to generate test data, e.g. signatures. - */ -class CheatingSecurityProvider : Provider("Cheat-${counter.getAndIncrement()}", 1.8, "Cheat security provider"), AutoCloseable { - private companion object { - private val counter = AtomicInteger() - } - - init { - putService(CheatingSecureRandomService(this)) - assertEquals(1, Security.insertProviderAt(this, 1)) - } - - override fun close() { - Security.removeProvider(name) - } - - private class SunSecureRandom : SecureRandom(sun.security.provider.SecureRandom(), null) - - private class CheatingSecureRandomService(provider: Provider) - : Provider.Service(provider, "SecureRandom", "CheatingPRNG", CheatingSecureRandomSpi::javaClass.name, null, null) { - - private val instance: SecureRandomSpi = CheatingSecureRandomSpi() - override fun newInstance(constructorParameter: Any?) = instance - } - - private class CheatingSecureRandomSpi : SecureRandomSpi() { - private val secureRandom: SecureRandom = SunSecureRandom() - - override fun engineSetSeed(seed: ByteArray) = secureRandom.setSeed(seed) - override fun engineNextBytes(bytes: ByteArray) = secureRandom.nextBytes(bytes) - override fun engineGenerateSeed(numBytes: Int): ByteArray = secureRandom.generateSeed(numBytes) - } -} \ No newline at end of file diff --git a/core-tests/src/test/kotlin/net/corda/coretests/transactions/AttachmentsClassLoaderSerializationTests.kt b/core-tests/src/test/kotlin/net/corda/coretests/transactions/AttachmentsClassLoaderSerializationTests.kt index 22f19126f6..bf9fe5e34d 100644 --- a/core-tests/src/test/kotlin/net/corda/coretests/transactions/AttachmentsClassLoaderSerializationTests.kt +++ b/core-tests/src/test/kotlin/net/corda/coretests/transactions/AttachmentsClassLoaderSerializationTests.kt @@ -57,7 +57,7 @@ class AttachmentsClassLoaderSerializationTests { SecureHash.zeroHash, { attachmentTrustCalculator.calculate(it) }) { classLoader -> val contractClass = Class.forName(ISOLATED_CONTRACT_CLASS_NAME, true, classLoader) - val contract = contractClass.newInstance() as Contract + val contract = contractClass.getDeclaredConstructor().newInstance() as Contract assertEquals("helloworld", contract.declaredField("magicString").value) val txt = IOUtils.toString(classLoader.getResourceAsStream("file1.txt"), Charsets.UTF_8.name()) diff --git a/core-tests/src/test/kotlin/net/corda/coretests/transactions/AttachmentsClassLoaderTests.kt b/core-tests/src/test/kotlin/net/corda/coretests/transactions/AttachmentsClassLoaderTests.kt index 34214311d0..9007a7e28d 100644 --- a/core-tests/src/test/kotlin/net/corda/coretests/transactions/AttachmentsClassLoaderTests.kt +++ b/core-tests/src/test/kotlin/net/corda/coretests/transactions/AttachmentsClassLoaderTests.kt @@ -90,7 +90,7 @@ class AttachmentsClassLoaderTests { val classloader = createClassloader(isolatedId) val contractClass = Class.forName(ISOLATED_CONTRACT_CLASS_NAME, true, classloader) - val contract = contractClass.newInstance() as Contract + val contract = contractClass.getDeclaredConstructor().newInstance() as Contract assertEquals("helloworld", contract.declaredField("magicString").value) } diff --git a/core/build.gradle b/core/build.gradle index d9221ba1bc..c31e4872cd 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,3 +1,5 @@ +import static org.gradle.api.JavaVersion.VERSION_1_8 + apply plugin: 'kotlin' apply plugin: 'kotlin-jpa' apply plugin: 'net.corda.plugins.quasar-utils' @@ -7,6 +9,11 @@ apply plugin: 'com.jfrog.artifactory' description 'Corda core' +evaluationDependsOn(':node:capsule') + +// required by DJVM and Avian JVM (for running inside the SGX enclave) which only supports Java 8. +targetCompatibility = VERSION_1_8 + configurations { integrationTestCompile.extendsFrom testCompile integrationTestRuntimeOnly.extendsFrom testRuntimeOnly @@ -71,6 +78,9 @@ dependencies { compile group: "io.github.classgraph", name: "classgraph", version: class_graph_version + // JDK11: required by Quasar at run-time + testRuntimeOnly "com.esotericsoftware:kryo:4.0.2" + testCompile "com.nhaarman:mockito-kotlin:$mockito_kotlin_version" testCompile "org.mockito:mockito-core:$mockito_version" testCompile "org.assertj:assertj-core:$assertj_version" diff --git a/core/src/main/kotlin/net/corda/core/crypto/CordaSecurityProvider.kt b/core/src/main/kotlin/net/corda/core/crypto/CordaSecurityProvider.kt index ac1e2fdb00..8b6d29c190 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/CordaSecurityProvider.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CordaSecurityProvider.kt @@ -9,6 +9,7 @@ import org.bouncycastle.asn1.ASN1ObjectIdentifier import java.security.Provider @KeepForDJVM +@Suppress("DEPRECATION") // JDK11: should replace with Provider(String name, double version, String info) (since 9) class CordaSecurityProvider : Provider(PROVIDER_NAME, 0.1, "$PROVIDER_NAME security provider wrapper") { companion object { const val PROVIDER_NAME = "Corda" diff --git a/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt b/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt index 6c286be8b2..cad491adb3 100644 --- a/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt +++ b/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt @@ -35,7 +35,7 @@ object ContractUpgradeFlow { // DOCEND 1 @Suspendable override fun call(): Void? { - val upgrade = upgradedContractClass.newInstance() + val upgrade = upgradedContractClass.getDeclaredConstructor().newInstance() if (upgrade.legacyContract != stateAndRef.state.contract) { throw FlowException("The contract state cannot be upgraded using provided UpgradedContract.") } diff --git a/core/src/main/kotlin/net/corda/core/internal/CordaUtils.kt b/core/src/main/kotlin/net/corda/core/internal/CordaUtils.kt index a001fd727f..182629d85b 100644 --- a/core/src/main/kotlin/net/corda/core/internal/CordaUtils.kt +++ b/core/src/main/kotlin/net/corda/core/internal/CordaUtils.kt @@ -41,6 +41,7 @@ fun checkMinimumPlatformVersion(minimumPlatformVersion: Int, requiredMinPlatform } } +// JDK11: revisit (JDK 9+ uses different numbering scheme: see https://docs.oracle.com/javase/9/docs/api/java/lang/Runtime.Version.html) @Throws(NumberFormatException::class) fun getJavaUpdateVersion(javaVersion: String): Long = javaVersion.substringAfter("_").substringBefore("-").toLong() diff --git a/core/src/main/kotlin/net/corda/core/internal/InternalUtils.kt b/core/src/main/kotlin/net/corda/core/internal/InternalUtils.kt index d97e23a4dd..f1b6a65d99 100644 --- a/core/src/main/kotlin/net/corda/core/internal/InternalUtils.kt +++ b/core/src/main/kotlin/net/corda/core/internal/InternalUtils.kt @@ -352,6 +352,7 @@ class DeclaredField(clazz: Class<*>, name: String, private val receiver: Any? val name: String = javaField.name private fun Field.accessible(action: Field.() -> RESULT): RESULT { + @Suppress("DEPRECATION") // JDK11: isAccessible() should be replaced with canAccess() (since 9) val accessible = isAccessible isAccessible = true try { @@ -393,16 +394,17 @@ fun Iterable>.toMultiMap(): Map> = this.groupBy({ i val Class<*>.location: URL get() = protectionDomain.codeSource.location /** Convenience method to get the package name of a class literal. */ -val KClass<*>.packageName: String get() = java.packageName -val Class<*>.packageName: String get() = requireNotNull(this.packageNameOrNull) { "$this not defined inside a package" } +val KClass<*>.packageName: String get() = java.packageName_ +// re-defined to prevent clash with Java 9 Class.packageName: https://docs.oracle.com/javase/9/docs/api/java/lang/Class.html#getPackageName-- +val Class<*>.packageName_: String get() = requireNotNull(this.packageNameOrNull) { "$this not defined inside a package" } val Class<*>.packageNameOrNull: String? // This intentionally does not go via `package` as that code path is slow and contended and just ends up doing this. get() { - val name = this.getName() + val name = this.name val i = name.lastIndexOf('.') - if (i != -1) { - return name.substring(0, i) + return if (i != -1) { + name.substring(0, i) } else { - return null + null } } diff --git a/core/src/main/kotlin/net/corda/core/internal/TransactionVerifierServiceInternal.kt b/core/src/main/kotlin/net/corda/core/internal/TransactionVerifierServiceInternal.kt index d0323d123e..b96cdb99ee 100644 --- a/core/src/main/kotlin/net/corda/core/internal/TransactionVerifierServiceInternal.kt +++ b/core/src/main/kotlin/net/corda/core/internal/TransactionVerifierServiceInternal.kt @@ -366,7 +366,7 @@ class Verifier(val ltx: LedgerTransaction, private val transactionClassLoader: C val contractInstances: List = contractClasses.map { (contractClassName, contractClass) -> try { - contractClass.newInstance() + contractClass.getDeclaredConstructor().newInstance() } catch (e: Exception) { throw TransactionVerificationException.ContractCreationError(ltx.id, contractClassName, e) } diff --git a/core/src/main/kotlin/net/corda/core/transactions/ContractUpgradeTransactions.kt b/core/src/main/kotlin/net/corda/core/transactions/ContractUpgradeTransactions.kt index be28edb03f..c590047267 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/ContractUpgradeTransactions.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/ContractUpgradeTransactions.kt @@ -133,7 +133,7 @@ data class ContractUpgradeWireTransaction( private fun upgradedContract(className: ContractClassName, classLoader: ClassLoader): UpgradedContract = try { @Suppress("UNCHECKED_CAST") - classLoader.loadClass(className).asSubclass(UpgradedContract::class.java).newInstance() as UpgradedContract + classLoader.loadClass(className).asSubclass(UpgradedContract::class.java).getDeclaredConstructor().newInstance() as UpgradedContract } catch (e: Exception) { throw TransactionVerificationException.ContractCreationError(id, className, e) } diff --git a/core/src/test/java/net/corda/core/internal/X509EdDSAEngineTest.java b/core/src/test/java/net/corda/core/internal/X509EdDSAEngineTest.java new file mode 100644 index 0000000000..d5d458c97f --- /dev/null +++ b/core/src/test/java/net/corda/core/internal/X509EdDSAEngineTest.java @@ -0,0 +1,133 @@ +package net.corda.core.internal; + +import net.corda.core.crypto.Crypto; +import net.i2p.crypto.eddsa.EdDSAEngine; +import net.i2p.crypto.eddsa.EdDSAPublicKey; +import org.junit.Test; +import sun.security.util.BitArray; +import sun.security.util.ObjectIdentifier; +import sun.security.x509.AlgorithmId; +import sun.security.x509.X509Key; + +import java.io.IOException; +import java.math.BigInteger; +import java.security.InvalidKeyException; +import java.security.KeyPair; +import java.security.SignatureException; +import java.util.Random; + +import static org.junit.Assert.assertTrue; + +/** + * JDK11 upgrade: rewritten in Java to gain access to private internal JDK classes via module directives (not available to Kotlin compiler): + * import sun.security.util.BitArray; + * import sun.security.util.ObjectIdentifier; + * import sun.security.x509.AlgorithmId; + * import sun.security.x509.X509Key; + */ +public class X509EdDSAEngineTest { + + private static long SEED = 20170920L; + private static int TEST_DATA_SIZE = 2000; + + // offset into an EdDSA header indicating where the key header and actual key start + // in the underlying byte array + private static int keyHeaderStart = 9; + private static int keyStart = 12; + + private X509Key toX509Key(EdDSAPublicKey publicKey) throws IOException, InvalidKeyException { + byte[] internals = publicKey.getEncoded(); + + // key size in the header includes the count unused bits at the end of the key + // [keyHeaderStart + 2] but NOT the key header ID [keyHeaderStart] so the + // actual length of the key blob is size - 1 + int keySize = (internals[keyHeaderStart + 1]) - 1; + + byte[] key = new byte[keySize]; + System.arraycopy(internals, keyStart, key, 0, keySize); + + // 1.3.101.102 is the EdDSA OID + return new TestX509Key(new AlgorithmId(new ObjectIdentifier("1.3.101.112")), new BitArray(keySize * 8, key)); + } + + class TestX509Key extends X509Key { + TestX509Key(AlgorithmId algorithmId, BitArray key) throws InvalidKeyException { + this.algid = algorithmId; + this.setKey(key); + this.encode(); + } + } + + /** + * Put the X509EdDSA engine through basic tests to verify that the functions are hooked up correctly. + */ + @Test + public void SignAndVerify() throws InvalidKeyException, SignatureException { + X509EdDSAEngine engine = new X509EdDSAEngine(); + KeyPair keyPair = Crypto.deriveKeyPairFromEntropy(Crypto.EDDSA_ED25519_SHA512, BigInteger.valueOf(SEED)); + EdDSAPublicKey publicKey = (EdDSAPublicKey) keyPair.getPublic(); + byte[] randomBytes = new byte[TEST_DATA_SIZE]; + new Random(SEED).nextBytes(randomBytes); + engine.initSign(keyPair.getPrivate()); + engine.update(randomBytes[0]); + engine.update(randomBytes, 1, randomBytes.length - 1); + + // Now verify the signature + byte[] signature = engine.sign(); + + engine.initVerify(publicKey); + engine.update(randomBytes); + assertTrue(engine.verify(signature)); + } + + /** + * Verify that signing with an X509Key wrapped EdDSA key works. + */ + @Test + public void SignAndVerifyWithX509Key() throws InvalidKeyException, SignatureException, IOException { + X509EdDSAEngine engine = new X509EdDSAEngine(); + KeyPair keyPair = Crypto.deriveKeyPairFromEntropy(Crypto.EDDSA_ED25519_SHA512, BigInteger.valueOf(SEED + 1)); + X509Key publicKey = toX509Key((EdDSAPublicKey) keyPair.getPublic()); + byte[] randomBytes = new byte[TEST_DATA_SIZE]; + new Random(SEED + 1).nextBytes(randomBytes); + engine.initSign(keyPair.getPrivate()); + engine.update(randomBytes[0]); + engine.update(randomBytes, 1, randomBytes.length - 1); + + // Now verify the signature + byte[] signature = engine.sign(); + + engine.initVerify(publicKey); + engine.update(randomBytes); + assertTrue(engine.verify(signature)); + } + + /** + * Verify that signing with an X509Key wrapped EdDSA key succeeds when using the underlying EdDSAEngine. + */ + @Test + public void SignAndVerifyWithX509KeyAndOldEngineFails() throws InvalidKeyException, SignatureException, IOException { + X509EdDSAEngine engine = new X509EdDSAEngine(); + KeyPair keyPair = Crypto.deriveKeyPairFromEntropy(Crypto.EDDSA_ED25519_SHA512, BigInteger.valueOf(SEED + 1)); + X509Key publicKey = toX509Key((EdDSAPublicKey) keyPair.getPublic()); + byte[] randomBytes = new byte[TEST_DATA_SIZE]; + new Random(SEED + 1).nextBytes(randomBytes); + engine.initSign(keyPair.getPrivate()); + engine.update(randomBytes[0]); + engine.update(randomBytes, 1, randomBytes.length - 1); + + // Now verify the signature + byte[] signature = engine.sign(); + engine.initVerify(publicKey); + engine.update(randomBytes); + engine.verify(signature); + } + + /** Verify will fail if the input public key cannot be converted to EdDSA public key. */ + @Test(expected = InvalidKeyException.class) + public void verifyWithNonSupportedKeyTypeFails() throws InvalidKeyException { + EdDSAEngine engine = new EdDSAEngine(); + KeyPair keyPair = Crypto.deriveKeyPairFromEntropy(Crypto.ECDSA_SECP256K1_SHA256, BigInteger.valueOf(SEED)); + engine.initVerify(keyPair.getPublic()); + } +} diff --git a/core/src/test/kotlin/net/corda/core/flows/FlowsInJavaTest.java b/core/src/test/kotlin/net/corda/core/flows/FlowsInJavaTest.java new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core/src/test/kotlin/net/corda/core/internal/X509EdDSAEngineTest.kt b/core/src/test/kotlin/net/corda/core/internal/X509EdDSAEngineTest.kt deleted file mode 100644 index eb5586c483..0000000000 --- a/core/src/test/kotlin/net/corda/core/internal/X509EdDSAEngineTest.kt +++ /dev/null @@ -1,125 +0,0 @@ -package net.corda.core.internal - -import net.corda.core.crypto.Crypto -import net.i2p.crypto.eddsa.EdDSAEngine -import net.i2p.crypto.eddsa.EdDSAPublicKey -import org.junit.Test -import sun.security.util.BitArray -import sun.security.util.ObjectIdentifier -import sun.security.x509.AlgorithmId -import sun.security.x509.X509Key -import java.math.BigInteger -import java.security.InvalidKeyException -import java.util.* -import kotlin.test.assertFailsWith -import kotlin.test.assertTrue - -class TestX509Key(algorithmId: AlgorithmId, key: BitArray) : X509Key() { - init { - this.algid = algorithmId - this.setKey(key) - this.encode() - } -} - -class X509EdDSAEngineTest { - companion object { - private const val SEED = 20170920L - private const val TEST_DATA_SIZE = 2000 - - // offset into an EdDSA header indicating where the key header and actual key start - // in the underlying byte array - private const val keyHeaderStart = 9 - private const val keyStart = 12 - - private fun toX509Key(publicKey: EdDSAPublicKey): X509Key { - val internals = publicKey.encoded - - // key size in the header includes the count unused bits at the end of the key - // [keyHeaderStart + 2] but NOT the key header ID [keyHeaderStart] so the - // actual length of the key blob is size - 1 - val keySize = (internals[keyHeaderStart + 1].toInt()) - 1 - - val key = ByteArray(keySize) - System.arraycopy(internals, keyStart, key, 0, keySize) - - // 1.3.101.102 is the EdDSA OID - return TestX509Key(AlgorithmId(ObjectIdentifier("1.3.101.112")), BitArray(keySize * 8, key)) - } - } - - /** - * Put the X509EdDSA engine through basic tests to verify that the functions are hooked up correctly. - */ - @Test - fun `sign and verify`() { - val engine = X509EdDSAEngine() - val keyPair = Crypto.deriveKeyPairFromEntropy(Crypto.EDDSA_ED25519_SHA512, BigInteger.valueOf(SEED)) - val publicKey = keyPair.public as EdDSAPublicKey - val randomBytes = ByteArray(TEST_DATA_SIZE) - Random(SEED).nextBytes(randomBytes) - engine.initSign(keyPair.private) - engine.update(randomBytes[0]) - engine.update(randomBytes, 1, randomBytes.size - 1) - - // Now verify the signature - val signature = engine.sign() - - engine.initVerify(publicKey) - engine.update(randomBytes) - assertTrue { engine.verify(signature) } - } - - /** - * Verify that signing with an X509Key wrapped EdDSA key works. - */ - @Test - fun `sign and verify with X509Key`() { - val engine = X509EdDSAEngine() - val keyPair = Crypto.deriveKeyPairFromEntropy(Crypto.EDDSA_ED25519_SHA512, BigInteger.valueOf(SEED + 1)) - val publicKey = toX509Key(keyPair.public as EdDSAPublicKey) - val randomBytes = ByteArray(TEST_DATA_SIZE) - Random(SEED + 1).nextBytes(randomBytes) - engine.initSign(keyPair.private) - engine.update(randomBytes[0]) - engine.update(randomBytes, 1, randomBytes.size - 1) - - // Now verify the signature - val signature = engine.sign() - - engine.initVerify(publicKey) - engine.update(randomBytes) - assertTrue { engine.verify(signature) } - } - - /** - * Verify that signing with an X509Key wrapped EdDSA key fails when using the underlying EdDSAEngine. - */ - @Test - fun `sign and verify with X509Key and old engine fails`() { - val engine = EdDSAEngine() - val keyPair = Crypto.deriveKeyPairFromEntropy(Crypto.EDDSA_ED25519_SHA512, BigInteger.valueOf(SEED + 1)) - val publicKey = toX509Key(keyPair.public as EdDSAPublicKey) - val randomBytes = ByteArray(TEST_DATA_SIZE) - Random(SEED + 1).nextBytes(randomBytes) - engine.initSign(keyPair.private) - engine.update(randomBytes[0]) - engine.update(randomBytes, 1, randomBytes.size - 1) - - // Now verify the signature - val signature = engine.sign() - assertFailsWith { - engine.initVerify(publicKey) - engine.update(randomBytes) - engine.verify(signature) - } - } - - /** Verify will fail if the input public key cannot be converted to EdDSA public key. */ - @Test - fun `verify with non-supported key type fails`() { - val engine = EdDSAEngine() - val keyPair = Crypto.deriveKeyPairFromEntropy(Crypto.ECDSA_SECP256K1_SHA256, BigInteger.valueOf(SEED)) - assertFailsWith { engine.initVerify(keyPair.public) } - } -} \ No newline at end of file diff --git a/detekt-baseline.xml b/detekt-baseline.xml index c5b6ea23cf..d05e9643a5 100644 --- a/detekt-baseline.xml +++ b/detekt-baseline.xml @@ -98,11 +98,14 @@ ComplexMethod:AMQPBridgeTest.kt$AMQPBridgeTest$@Test fun `test acked and nacked messages`() ComplexMethod:AMQPChannelHandler.kt$AMQPChannelHandler$override fun userEventTriggered(ctx: ChannelHandlerContext, evt: Any) ComplexMethod:AMQPTypeIdentifierParser.kt$AMQPTypeIdentifierParser$// Make sure our inputs aren't designed to blow things up. private fun validate(typeString: String) - ComplexMethod:AMQPTypeIdentifierParser.kt$AMQPTypeIdentifierParser.ParseState.ParsingRawType$override fun accept(c: Char) - ComplexMethod:AMQPTypeIdentifiers.kt$AMQPTypeIdentifiers$fun nameForType(typeIdentifier: TypeIdentifier): String ComplexMethod:ANSIProgressRenderer.kt$ANSIProgressRenderer$// Returns number of lines rendered. private fun renderLevel(ansi: Ansi, error: Boolean): Int ComplexMethod:ANSIProgressRenderer.kt$ANSIProgressRenderer$@Synchronized protected fun draw(moveUp: Boolean, error: Throwable? = null) + ComplexMethod:AbstractConcatenatedList.kt$AbstractConcatenatedList$// This is where we create a listener for a *nested* list. Note that 'indexMap' doesn't need to be adjusted on any // of these changes as the indices of nested lists don't change, just their contents. private fun createListener(wrapped: WrappedObservableList<A>): ListChangeListener<A> + ComplexMethod:AbstractConcatenatedList.kt$AbstractConcatenatedList$// This is where we handle changes to the *source* list. override fun sourceChanged(change: ListChangeListener.Change<out ObservableList<A>>) + ComplexMethod:AbstractFlattenedList.kt$AbstractFlattenedList$override fun sourceChanged(c: ListChangeListener.Change<out ObservableValue<out A>>) + ComplexMethod:AbstractMappedList.kt$AbstractMappedList$override fun sourceChanged(change: ListChangeListener.Change<out A>) ComplexMethod:AbstractNode.kt$AbstractNode$private fun installCordaServices() + ComplexMethod:AbstractReplayedList.kt$AbstractReplayedList$override fun sourceChanged(c: ListChangeListener.Change<out A>) ComplexMethod:ActionExecutorImpl.kt$ActionExecutorImpl$@Suspendable override fun executeAction(fiber: FlowFiber, action: Action) ComplexMethod:AggregatedListTest.kt$AggregatedListTest$@Test fun removeWorks() ComplexMethod:Amount.kt$AmountTransfer$ fun apply(balances: List<SourceAndAmount<T, P>>, newRef: Any? = null): List<SourceAndAmount<T, P>> @@ -124,8 +127,6 @@ ComplexMethod:ClassCarpenter.kt$ClassCarpenterImpl$ private fun validateSchema(schema: Schema) ComplexMethod:CollectSignaturesFlow.kt$CollectSignaturesFlow$@Suspendable override fun call(): SignedTransaction ComplexMethod:CompatibleTransactionTests.kt$CompatibleTransactionTests$@Test fun `Command visibility tests`() - ComplexMethod:ConcatenatedList.kt$ConcatenatedList$// This is where we create a listener for a *nested* list. Note that 'indexMap' doesn't need to be adjusted on any // of these changes as the indices of nested lists don't change, just their contents. private fun createListener(wrapped: WrappedObservableList<A>): ListChangeListener<A> - ComplexMethod:ConcatenatedList.kt$ConcatenatedList$// This is where we handle changes to the *source* list. override fun sourceChanged(change: ListChangeListener.Change<out ObservableList<A>>) ComplexMethod:ConfigUtilities.kt$// For Iterables figure out the type parameter and apply the same logic as above on the individual elements. private fun Iterable<*>.toConfigIterable(field: Field): Iterable<Any?> ComplexMethod:ConfigUtilities.kt$// TODO Move this to KeyStoreConfigHelpers. fun MutualSslConfiguration.configureDevKeyAndTrustStores(myLegalName: CordaX500Name, signingCertificateStore: FileBasedCertificateStoreSupplier, certificatesDirectory: Path, cryptoService: CryptoService? = null) ComplexMethod:ConfigUtilities.kt$@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") // Reflect over the fields of the receiver and generate a value Map that can use to create Config object. private fun Any.toConfigMap(): Map<String, Any> @@ -146,7 +147,6 @@ ComplexMethod:DriverDSLImpl.kt$DriverDSLImpl$private fun startRegisteredNode(name: CordaX500Name, localNetworkMap: LocalNetworkMap?, parameters: NodeParameters, p2pAddress: NetworkHostAndPort = portAllocation.nextHostAndPort()): CordaFuture<NodeHandle> ComplexMethod:Expect.kt$ fun <S, E : Any> S.genericExpectEvents( isStrict: Boolean = true, stream: S.((E) -> Unit) -> Unit, expectCompose: () -> ExpectCompose<E> ) ComplexMethod:FinalityFlow.kt$FinalityFlow$@Suspendable @Throws(NotaryException::class) override fun call(): SignedTransaction - ComplexMethod:FlattenedList.kt$FlattenedList$override fun sourceChanged(c: ListChangeListener.Change<out ObservableValue<out A>>) ComplexMethod:FlowMonitor.kt$FlowMonitor$private fun warningMessageForFlowWaitingOnIo(request: FlowIORequest<*>, flow: FlowStateMachineImpl<*>, now: Instant): String ComplexMethod:FlowStateMachineImpl.kt$FlowStateMachineImpl$ @Suspendable private fun processEventsUntilFlowIsResumed(isDbTransactionOpenOnEntry: Boolean, isDbTransactionOpenOnExit: Boolean): Any? ComplexMethod:GenerateRpcSslCertsCli.kt$GenerateRpcSslCerts$private fun generateRpcSslCertificates(conf: NodeConfiguration) @@ -162,7 +162,7 @@ ComplexMethod:InteractiveShell.kt$InteractiveShell$ @JvmStatic fun runFlowByNameFragment(nameFragment: String, inputData: String, output: RenderPrintWriter, rpcOps: CordaRPCOps, ansiProgressRenderer: ANSIProgressRenderer, inputObjectMapper: ObjectMapper = createYamlInputMapper(rpcOps)) ComplexMethod:InteractiveShell.kt$InteractiveShell$ private fun maybeAbbreviateGenericType(type: Type, extraRecognisedPackage: String): String ComplexMethod:InteractiveShell.kt$InteractiveShell$@JvmStatic fun gracefulShutdown(userSessionOut: RenderPrintWriter, cordaRPCOps: CordaRPCOps) - ComplexMethod:InteractiveShell.kt$InteractiveShell$@JvmStatic fun runRPCFromString(input: List<String>, out: RenderPrintWriter, context: InvocationContext<out Any>, cordaRPCOps: InternalCordaRPCOps, inputObjectMapper: ObjectMapper): Any? + ComplexMethod:InteractiveShell.kt$InteractiveShell$@JvmStatic fun runRPCFromString(input: List<String>, out: RenderPrintWriter, context: InvocationContext<out Any>, cordaRPCOps: CordaRPCOps, inputObjectMapper: ObjectMapper): Any? ComplexMethod:Kryo.kt$ImmutableClassSerializer$override fun read(kryo: Kryo, input: Input, type: Class<T>): T ComplexMethod:Kryo.kt$ImmutableClassSerializer$override fun write(kryo: Kryo, output: Output, obj: T) ComplexMethod:LoadTest.kt$LoadTest$fun run(nodes: Nodes, parameters: RunParameters, random: SplittableRandom) @@ -170,9 +170,7 @@ ComplexMethod:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$private fun buildForClass(type: Class<*>, typeIdentifier: TypeIdentifier, isOpaque: Boolean): LocalTypeInformation ComplexMethod:LoginView.kt$LoginView$tailrec fun login(): NodeMonitorModel? ComplexMethod:Main.kt$Node$fun dumpDag(f: File) - ComplexMethod:MappedList.kt$MappedList$override fun sourceChanged(change: ListChangeListener.Change<out A>) ComplexMethod:MerkleTransaction.kt$FilteredTransaction.Companion$ private fun filterWithFun(wtx: WireTransaction, filtering: Predicate<Any>): List<FilteredComponentGroup> - ComplexMethod:MigrationNamedCacheFactory.kt$MigrationNamedCacheFactory$private fun <K, V> configuredForNamed(caffeine: Caffeine<K, V>, name: String): Caffeine<K, V> ComplexMethod:NetworkBootstrapper.kt$NetworkBootstrapper$private fun bootstrap( directory: Path, cordappJars: List<Path>, copyCordapps: CopyCordapps, fromCordform: Boolean, networkParametersOverrides: NetworkParametersOverrides = NetworkParametersOverrides() ) ComplexMethod:NetworkBootstrapper.kt$NetworkBootstrapper$private fun createNodeDirectoriesIfNeeded(directory: Path, fromCordform: Boolean): Boolean ComplexMethod:NetworkMapUpdater.kt$NetworkMapUpdater$fun updateNetworkMapCache(): Duration @@ -187,18 +185,13 @@ ComplexMethod:ObjectDiffer.kt$ObjectDiffer$fun diff(a: Any?, b: Any?): DiffTree? ComplexMethod:Obligation.kt$Obligation$override fun verify(tx: LedgerTransaction) ComplexMethod:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$override fun addNodes(nodes: List<NodeInfo>) - ComplexMethod:PrettyPrint.kt$PrettyPrint$fun prettyPrint(arr: Arrangement) - ComplexMethod:PrettyPrint.kt$PrettyPrint$fun prettyPrintBigDecimal(per: Perceivable<BigDecimal>) - ComplexMethod:PrettyPrint.kt$PrettyPrint$fun prettyPrintBoolean(per: Perceivable<Boolean>) ComplexMethod:QuasarInstrumentationHook.kt$QuasarInstrumentationHookAgent.Companion$@JvmStatic fun premain(argumentsString: String?, instrumentation: Instrumentation) ComplexMethod:RPCClientProxyHandler.kt$RPCClientProxyHandler$ private fun close(notify: Boolean = true) ComplexMethod:RPCClientProxyHandler.kt$RPCClientProxyHandler$// The handler for Artemis messages. private fun artemisMessageHandler(message: ClientMessage) ComplexMethod:RPCClientProxyHandler.kt$RPCClientProxyHandler$// This is the general function that transforms a client side RPC to internal Artemis messages. override fun invoke(proxy: Any, method: Method, arguments: Array<out Any?>?): Any? ComplexMethod:RPCClientProxyHandler.kt$RPCClientProxyHandler$private fun attemptReconnect() ComplexMethod:RPCServer.kt$RPCServer$private fun clientArtemisMessageHandler(artemisMessage: ClientMessage) - ComplexMethod:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps.ErrorInterceptingHandler$override fun invoke(proxy: Any, method: Method, args: Array<out Any>?): Any? ComplexMethod:RemoteTypeCarpenter.kt$SchemaBuildingRemoteTypeCarpenter$override fun carpent(typeInformation: RemoteTypeInformation): Type - ComplexMethod:ReplayedList.kt$ReplayedList$override fun sourceChanged(c: ListChangeListener.Change<out A>) ComplexMethod:RpcReconnectTests.kt$RpcReconnectTests$ @Test fun `test that the RPC client is able to reconnect and proceed after node failure, restart, or connection reset`() ComplexMethod:SchemaMigration.kt$SchemaMigration$ private fun migrateOlderDatabaseToUseLiquibase(existingCheckpoints: Boolean): Boolean ComplexMethod:SchemaMigration.kt$SchemaMigration$private fun doRunMigration(run: Boolean, check: Boolean, existingCheckpoints: Boolean? = null) @@ -208,26 +201,17 @@ ComplexMethod:SignedTransaction.kt$SignedTransaction$// TODO: Verify contract constraints here as well as in LedgerTransaction to ensure that anything being deserialised // from the attachment is trusted. This will require some partial serialisation work to not load the ContractState // objects from the TransactionState. @DeleteForDJVM private fun verifyRegularTransaction(services: ServiceHub, checkSufficientSignatures: Boolean) ComplexMethod:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$override fun retryFlowFromSafePoint(currentState: StateMachineState) ComplexMethod:StartedFlowTransition.kt$StartedFlowTransition$override fun transition(): TransitionResult - ComplexMethod:StartedFlowTransition.kt$StartedFlowTransition$private fun collectRelevantErrorsToThrow(flowIORequest: FlowIORequest<*>, checkpoint: Checkpoint): List<Throwable> ComplexMethod:StatusTransitions.kt$StatusTransitions$ fun verify(tx: LedgerTransaction) ComplexMethod:StringToMethodCallParser.kt$StringToMethodCallParser$ @Throws(UnparseableCallException::class) fun parse(target: T?, command: String): ParsedMethodCall - ComplexMethod:SwapData.kt$SwapData$private fun getSwapConvention(name: String): FixedIborSwapConvention ComplexMethod:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest$@Test fun testClientServerTlsExchange() - ComplexMethod:TopLevelTransition.kt$TopLevelTransition$override fun transition(): TransitionResult ComplexMethod:TransactionBuilder.kt$TransactionBuilder$ fun withItems(vararg items: Any) ComplexMethod:TransactionBuilder.kt$TransactionBuilder$ private fun addMissingDependency(services: ServicesForResolution, wireTx: WireTransaction): Boolean - ComplexMethod:TransactionBuilder.kt$TransactionBuilder$ private fun attachmentConstraintsTransition( constraints: Set<AttachmentConstraint>, attachmentToUse: ContractAttachment, services: ServicesForResolution ): AttachmentConstraint ComplexMethod:TransactionBuilder.kt$TransactionBuilder$ private fun handleContract( contractClassName: ContractClassName, inputStates: List<TransactionState<ContractState>>?, outputStates: List<TransactionState<ContractState>>?, explicitContractAttachment: AttachmentId?, services: ServicesForResolution ): Pair<AttachmentId, List<TransactionState<ContractState>>?> ComplexMethod:TransactionUtils.kt$ fun createComponentGroups(inputs: List<StateRef>, outputs: List<TransactionState<ContractState>>, commands: List<Command<*>>, attachments: List<SecureHash>, notary: Party?, timeWindow: TimeWindow?, references: List<StateRef>, networkParametersHash: SecureHash?): List<ComponentGroup> - ComplexMethod:TypeIdentifier.kt$TypeIdentifier.Companion$ fun forGenericType(type: Type, resolutionContext: Type = type): TypeIdentifier ComplexMethod:TypeModellingFingerPrinter.kt$FingerPrintingState$// For a type we haven't seen before, determine the correct path depending on the type of type it is. private fun fingerprintNewType(type: LocalTypeInformation) - ComplexMethod:UniversalContract.kt$UniversalContract$fun <T> replaceStartEnd(p: Perceivable<T>, start: Instant, end: Instant): Perceivable<T> - ComplexMethod:UniversalContract.kt$UniversalContract$fun evalBigDecimal(tx: LedgerTransaction, expr: Perceivable<BigDecimal>): BigDecimal - ComplexMethod:UniversalContract.kt$UniversalContract$fun evalBoolean(tx: LedgerTransaction, expr: Perceivable<Boolean>): Boolean ComplexMethod:UniversalContract.kt$UniversalContract$override fun verify(tx: LedgerTransaction) ComplexMethod:Util.kt$fun <T> debugCompare(perLeft: Perceivable<T>, perRight: Perceivable<T>) ComplexMethod:Util.kt$fun debugCompare(arrLeft: Arrangement, arrRight: Arrangement) - ComplexMethod:Util.kt$fun replaceParty(arrangement: Arrangement, from: Party, to: Party): Arrangement ComplexMethod:WebServer.kt$fun main(args: Array<String>) EmptyCatchBlock:ClockUtilsTest.kt$ClockUtilsTest${ } EmptyCatchBlock:NodeTerminalView.kt$NodeTerminalView${} @@ -247,61 +231,7 @@ EmptyDefaultConstructor:FlowRetryTest.kt$RetryFlow$() EmptyDefaultConstructor:FlowRetryTest.kt$ThrowingFlow$() EmptyElseBlock:CordaCliWrapper.kt${ } - EmptyFunctionBlock:AMQPPrimitiveSerializer.kt$AMQPPrimitiveSerializer${ } - EmptyFunctionBlock:AbstractNode.kt$FlowStarterImpl.<no name provided>${} - EmptyFunctionBlock:AttachmentVersionNumberMigration.kt$AttachmentVersionNumberMigration${ } - EmptyFunctionBlock:AzureContainerPusher.kt$AzureContainerPusher.<no name provided>${ } - EmptyFunctionBlock:BFTSmartNotaryService.kt$BFTSmartNotaryService${ } - EmptyFunctionBlock:CheckpointDumperTest.kt$CheckpointDumperTest.<no name provided>${} - EmptyFunctionBlock:ClientRPCInfrastructureTests.kt$ClientRPCInfrastructureTests.TestOpsImpl${} - EmptyFunctionBlock:CommsContracts.kt$CommsTestContract${ } - EmptyFunctionBlock:ComposableTypePropertySerializer.kt$AMQPCharPropertyWriteStategy${} - EmptyFunctionBlock:ComposableTypePropertySerializer.kt$AMQPPropertyWriteStrategy${} - EmptyFunctionBlock:ConnectionManager.kt$<no name provided>.<no name provided>${} - EmptyFunctionBlock:ContractUpgradeFlowTest.kt$ContractUpgradeFlowTest.CashV2${} - EmptyFunctionBlock:CorDappCustomSerializer.kt$CorDappCustomSerializer${} - EmptyFunctionBlock:CordaClassResolverTests.kt$CustomSerializable${ } - EmptyFunctionBlock:CordaClassResolverTests.kt$DefaultSerializableSerializer${ } - EmptyFunctionBlock:CordaMigration.kt$CordaMigration${ } - EmptyFunctionBlock:CordaPersistence.kt$NoOpSubscriber${} - EmptyFunctionBlock:CustomNotaryTest.kt$CustomNotaryTest.CustomNotaryService${} - EmptyFunctionBlock:CustomSerializer.kt$CustomSerializer.CustomSerializerImp${} - EmptyFunctionBlock:DBCheckpointStorageTests.kt$DBCheckpointStorageTests.<no name provided>${} - EmptyFunctionBlock:DummyDealContract.kt$DummyDealContract${} - EmptyFunctionBlock:DummyStates.kt$DoNothingContract${} - EmptyFunctionBlock:GroupAMoreTests.kt$GroupAMoreTests${ } - EmptyFunctionBlock:GroupATests.kt$GroupATests${ } - EmptyFunctionBlock:GroupBTests.kt$GroupBTests${ } - EmptyFunctionBlock:InMemoryTransactionVerifierService.kt$InMemoryTransactionVerifierService${} - EmptyFunctionBlock:InteractiveShellIntegrationTest.kt$FlowForCheckpointDumpingResponder.<no name provided>${ } - EmptyFunctionBlock:InteractiveShellIntegrationTest.kt$MyContract${} - EmptyFunctionBlock:IrsDemoWebApplicationTests.kt$IrsDemoWebApplicationTests${ } - EmptyFunctionBlock:LaunchSpaceshipFlow.kt$LaunchSpaceshipFlow${ } - EmptyFunctionBlock:LaunchSpaceshipFlow.kt$LaunchSpaceshipFlowCorrect${ } - EmptyFunctionBlock:LocalTypeModelTests.kt$LocalTypeModelTests.<no name provided>${} - EmptyFunctionBlock:MyCustomNotaryService.kt$MyCustomValidatingNotaryService${} - EmptyFunctionBlock:NoOpTestDatabaseContext.kt$NoOpTestDatabaseContext${} - EmptyFunctionBlock:NodePerformanceTests.kt$NodePerformanceTests.EmptyFlow${ } - EmptyFunctionBlock:NotaryTestContracts.kt$NotaryTestContract${ } - EmptyFunctionBlock:ObjectBuilder.kt$ConstructorBasedObjectBuilder${} - EmptyFunctionBlock:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.ReceiveSplitMessagesFlow.<no name provided>${ } - EmptyFunctionBlock:PersistentIdentityMigration.kt$PersistentIdentityMigration${ } - EmptyFunctionBlock:PersistentIdentityMigrationNewTable.kt$PersistentIdentityMigrationNewTable${ } - EmptyFunctionBlock:SerializationOutputTests.kt$SerializationOutputTests.<no name provided>${ } - EmptyFunctionBlock:SerializationOutputTests.kt$SerializationOutputTests.FooContract${ } - EmptyFunctionBlock:SimpleNotaryService.kt$SimpleNotaryService${} - EmptyFunctionBlock:TestObservableContext.kt$TestObservableContext${ } - EmptyFunctionBlock:TimedFlowTests.kt$TimedFlowTests.TestNotaryService${} - EmptyFunctionBlock:TransactionSerializationTests.kt$TransactionSerializationTests.TestCash${ } - EmptyFunctionBlock:TransitionExecutorImpl.kt$TransitionExecutorImpl${} - EmptyFunctionBlock:UniqueDummyFungibleContract.kt$UniqueDummyFungibleContract${} - EmptyFunctionBlock:UniqueDummyLinearContract.kt$UniqueDummyLinearContract${} - EmptyFunctionBlock:UniquenessProviderTests.kt$UniquenessProviderFactory${} - EmptyFunctionBlock:Utils.kt$<no name provided>${} - EmptyFunctionBlock:VaultQueryTests.kt$VaultQueryTestsBase.MyContractClass${} - EmptyFunctionBlock:VaultSoftLockManagerTest.kt$VaultSoftLockManagerTest.ContractImpl${} - EmptyFunctionBlock:VaultUpdateTests.kt$VaultUpdateTests.DummyContract${ } - EmptyFunctionBlock:WebServerPluginRegistry.kt$WebServerPluginRegistry${} + EmptyIfBlock:InMemoryIdentityService.kt$InMemoryIdentityService${ } EmptyKtFile:KryoHook.kt$.KryoHook.kt EmptyKtFile:ValidatingNotaryService.kt$.ValidatingNotaryService.kt EnumNaming:LoginView.kt$LoginView.LoginStatus$exception @@ -467,6 +397,7 @@ ForbiddenComment:InternalUtils.kt$// TODO: Add inline back when a new Kotlin version is released and check if the java.lang.VerifyError ForbiddenComment:InternalUtils.kt$// TODO: Currently the certificate revocation status is not handled here. Nowhere in the code the second parameter is used. Consider adding the support in the future. ForbiddenComment:IrsDemoClientApi.kt$IRSDemoClientApi$// TODO: Add uploading of files to the HTTP API + ForbiddenComment:JarSignatureCollectorTest.kt$JarSignatureCollectorTest$// TODO: use programmatic API support to implement signing (see https://docs.oracle.com/javase/9/docs/api/jdk/security/jarsigner/JarSigner.html) ForbiddenComment:KeyStoreConfigHelpers.kt$// TODO: X509Utilities.validateCertificateChain() ForbiddenComment:Kryo.kt$PublicKeySerializer$// TODO: Instead of encoding to the default X509 format, we could have a custom per key type (space-efficient) serialiser. ForbiddenComment:LegalNameValidator.kt$LegalNameValidator.Rule.Companion$// TODO: Implement confusable character detection if we add more scripts. @@ -543,7 +474,6 @@ ForbiddenComment:ServiceHubCoreInternal.kt$ServiceHubCoreInternal$// TODO: This should really be called ServiceHubInternal but that name is already taken by net.corda.node.services.api.ServiceHubInternal. ForbiddenComment:ServiceHubInternal.kt$WritableTransactionStorage$// TODO: Throw an exception if trying to add a transaction with fewer signatures than an existing entry. ForbiddenComment:ServicesForResolutionImpl.kt$ServicesForResolutionImpl$// TODO: check only one (or until one is resolved successfully), max recursive invocations check? - ForbiddenComment:SharedMemoryIncremental.kt$SharedMemoryIncremental$// TODO: Do we really need 16 bytes? Given that we care about Int it should be enough to have 4 ForbiddenComment:SignedTransaction.kt$SignedTransaction$// TODO: Verify contract constraints here as well as in LedgerTransaction to ensure that anything being deserialised ForbiddenComment:SignedTransaction.kt$SignedTransaction$// TODO: We could probably optimise the below by ForbiddenComment:SignedTransaction.kt$SignedTransaction$// TODO: We need a much better way of structuring this data. @@ -722,10 +652,12 @@ FunctionNaming:VersionedParsingExampleTest.kt$VersionedParsingExampleTest$@Test fun default_value_is_used_for_absent_version() LargeClass:AMQPBridgeTest.kt$AMQPBridgeTest LargeClass:ANSIProgressRenderer.kt$ANSIProgressRenderer + LargeClass:AbstractConcatenatedList.kt$AbstractConcatenatedList<A> : TransformationList LargeClass:AbstractNode.kt$AbstractNode<S> : SingletonSerializeAsToken LargeClass:ActionExecutorImpl.kt$ActionExecutorImpl : ActionExecutor LargeClass:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase<K, V, E, out EK> LargeClass:ArtemisMessagingTest.kt$ArtemisMessagingTest + LargeClass:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest LargeClass:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests LargeClass:AuthDBTests.kt$AuthDBTests : NodeBasedTest LargeClass:BootstrapperView.kt$BootstrapperView : View @@ -740,7 +672,6 @@ LargeClass:CommercialPaperTests.kt$CommercialPaperTestsGeneric LargeClass:CompatibleTransactionTests.kt$CompatibleTransactionTests LargeClass:CompositeKeyTests.kt$CompositeKeyTests - LargeClass:ConcatenatedList.kt$ConcatenatedList<A> : TransformationList LargeClass:ConfigParsingTest.kt$ConfigParsingTest LargeClass:ConnectionStateMachine.kt$ConnectionStateMachine : BaseHandler LargeClass:ConstraintsPropagationTests.kt$ConstraintsPropagationTests @@ -780,6 +711,7 @@ LargeClass:KryoTests.kt$KryoTests LargeClass:LedgerTransaction.kt$LedgerTransaction : FullTransaction LargeClass:LedgerTransactionQueryTests.kt$LedgerTransactionQueryTests + LargeClass:LocalSerializerFactory.kt$DefaultLocalSerializerFactory : LocalSerializerFactory LargeClass:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder LargeClass:MockNodeMessagingService.kt$MockNodeMessagingService : SingletonSerializeAsTokenMessagingService LargeClass:Network.kt$Network : CordaView @@ -812,6 +744,7 @@ LargeClass:ObservablesTests.kt$ObservablesTests LargeClass:P2PMessagingClient.kt$P2PMessagingClient : SingletonSerializeAsTokenMessagingServiceAddressToArtemisQueueResolver LargeClass:PartialMerkleTreeTest.kt$PartialMerkleTreeTest + LargeClass:PersistentIdentityService.kt$PersistentIdentityService : SingletonSerializeAsTokenIdentityService LargeClass:PersistentIdentityServiceTests.kt$PersistentIdentityServiceTests LargeClass:PersistentNetworkMapCache.kt$PersistentNetworkMapCache : NetworkMapCacheInternalSingletonSerializeAsToken LargeClass:PersistentUniquenessProvider.kt$PersistentUniquenessProvider : UniquenessProviderSingletonSerializeAsToken @@ -854,1048 +787,10 @@ LargeClass:WireTransaction.kt$WireTransaction : TraversableTransaction LargeClass:X509Utilities.kt$X509Utilities LargeClass:X509UtilitiesTest.kt$X509UtilitiesTest - LongMethod:AMQPBridgeManager.kt$AMQPBridgeManager.AMQPBridge$private fun clientArtemisMessageHandler(artemisMessage: ClientMessage) - LongMethod:AMQPBridgeManager.kt$AMQPBridgeManager.AMQPBridge$private fun onSocketConnected(connected: Boolean) - LongMethod:AMQPBridgeTest.kt$AMQPBridgeTest$@Test fun `test acked and nacked messages`() - LongMethod:AMQPBridgeTest.kt$AMQPBridgeTest$private fun createAMQPServer(maxMessageSize: Int = MAX_MESSAGE_SIZE): AMQPServer - LongMethod:AMQPBridgeTest.kt$AMQPBridgeTest$private fun createArtemis(sourceQueueName: String?, crlCheckSoftFail: Boolean = true): Triple<ArtemisMessagingServer, ArtemisMessagingClient, BridgeManager> - LongMethod:AMQPChannelHandler.kt$AMQPChannelHandler$override fun userEventTriggered(ctx: ChannelHandlerContext, evt: Any) - LongMethod:AMQPChannelHandler.kt$AMQPChannelHandler$override fun write(ctx: ChannelHandlerContext, msg: Any, promise: ChannelPromise) - LongMethod:AMQPClient.kt$AMQPClient.ClientChannelInitializer$override fun initChannel(ch: SocketChannel) - LongMethod:AMQPExceptionsTests.kt$AMQPExceptionsTests$// However, if its a shiny new AMQPNotSerializable one, we have cool new toys, so // lets make sure those are set @Test fun catchAMQPNotSerializable() - LongMethod:AMQPRemoteTypeModel.kt$AMQPRemoteTypeModel$ fun interpret(serializationSchemas: SerializationSchemas): Map<TypeDescriptor, RemoteTypeInformation> - LongMethod:AMQPRemoteTypeModelTests.kt$AMQPRemoteTypeModelTests$@Test fun `round-trip some types through AMQP serialisations`() - LongMethod:AMQPSerializationScheme.kt$AbstractAMQPSerializationScheme$private fun registerCustomSerializers(context: SerializationContext, factory: SerializerFactory) - LongMethod:AMQPServer.kt$AMQPServer.ServerChannelInitializer$override fun initChannel(ch: SocketChannel) - LongMethod:AMQPTypeIdentifierParser.kt$AMQPTypeIdentifierParser$// Make sure our inputs aren't designed to blow things up. private fun validate(typeString: String) - LongMethod:ANSIProgressRenderer.kt$ANSIProgressRenderer$// Create a new tree of steps that also holds a reference to the parent of each step. This is required to uniquely identify each step // (assuming that each step label is unique at a given level). private fun transformTree(inputTree: List<InputTreeStep>): List<ProgressStep> - LongMethod:ANSIProgressRenderer.kt$ANSIProgressRenderer$// Returns number of lines rendered. private fun renderLevel(ansi: Ansi, error: Boolean): Int - LongMethod:ANSIProgressRenderer.kt$ANSIProgressRenderer$fun printingBody() - LongMethod:ANSIProgressRenderer.kt$ANSIProgressRenderer$private fun renderInternal(flowProgressHandle: FlowProgressHandle<*>?) - LongMethod:ANSIProgressRenderer.kt$StdoutANSIProgressRenderer$override fun setup() - LongMethod:AbstractAMQPSerializationSchemeTest.kt$AbstractAMQPSerializationSchemeTest$@Test fun `number of cached factories must be bounded by maxFactories`() - LongMethod:AbstractCashSelection.kt$AbstractCashSelection$ @Suspendable fun unconsumedCashStatesForSpending(services: ServiceHub, amount: Amount<Currency>, onlyFromIssuerParties: Set<AbstractParty> = emptySet(), notary: Party? = null, lockId: UUID, withIssuerRefs: Set<OpaqueBytes> = emptySet()): List<StateAndRef<Cash.State>> - LongMethod:AbstractCashSelection.kt$AbstractCashSelection$private fun attemptSpend(services: ServiceHub, amount: Amount<Currency>, lockId: UUID, notary: Party?, onlyFromIssuerParties: Set<AbstractParty>, withIssuerRefs: Set<OpaqueBytes>, stateAndRefs: MutableList<StateAndRef<Cash.State>>): Boolean - LongMethod:AbstractNode.kt$AbstractNode$ private fun loadNotaryClusterIdentity(serviceLegalName: CordaX500Name): Pair<PartyAndCertificate, KeyPair> - LongMethod:AbstractNode.kt$AbstractNode$ private fun obtainIdentity(): Pair<PartyAndCertificate, KeyPair> - LongMethod:AbstractNode.kt$AbstractNode$fun <T : SerializeAsToken> installCordaService(serviceClass: Class<T>): T - LongMethod:AbstractNode.kt$AbstractNode$open fun start(): S - LongMethod:AbstractNode.kt$AbstractNode$private fun createAndStoreLegalIdentity(alias: String): PartyAndCertificate - LongMethod:AbstractNode.kt$AbstractNode$private fun installCordaServices() - LongMethod:AbstractNode.kt$AbstractNode$private fun makeCordappLoader(configuration: NodeConfiguration, versionInfo: VersionInfo): CordappLoader - LongMethod:AbstractNode.kt$AbstractNode$private fun updateNodeInfo(identity: PartyAndCertificate, identityKeyPair: KeyPair, publish: Boolean): Triple<MutableSet<KeyPair>, NodeInfoAndSigned, PartyAndCertificate?> - LongMethod:AbstractNode.kt$AbstractNode$private fun validateKeyStores(): X509Certificate - LongMethod:AbstractRPCTest.kt$AbstractRPCTest$inline fun <reified I : RPCOps> RPCDriverDSL.testProxy( ops: I, rpcUser: User = rpcTestUser, clientConfiguration: CordaRPCClientConfiguration = CordaRPCClientConfiguration.DEFAULT, serverConfiguration: RPCServerConfiguration = RPCServerConfiguration.DEFAULT, queueDrainTimeout: Duration = 5.seconds ): TestProxy<I> - LongMethod:ActionExecutorImpl.kt$ActionExecutorImpl$@Suspendable override fun executeAction(fiber: FlowFiber, action: Action) - LongMethod:AdditionP2PAddressModeTest.kt$AdditionP2PAddressModeTest$@Test fun `runs nodes with one configured to use additionalP2PAddresses`() - LongMethod:AdvancedExceptionDialog.kt$//Attach a stacktrace for the exception that was used in the initialization of the dialog. fun AdvancedExceptionDialog.withStacktrace() : AdvancedExceptionDialog - LongMethod:AffinityExecutorTests.kt$AffinityExecutorTests$@Test fun `pooled executor`() - LongMethod:AffinityExecutorTests.kt$AffinityExecutorTests$@Test fun `single threaded affinity executor runs on correct thread`() - LongMethod:AggregatedList.kt$AggregatedList$override fun sourceChanged(c: ListChangeListener.Change<out E>) - LongMethod:AggregatedList.kt$AggregatedList$private fun addItem(addedItem: E): Int? - LongMethod:AggregatedList.kt$AggregatedList$private fun removeItem(removedItem: E): Pair<Int, AggregationGroup<E, A>>? - LongMethod:AggregatedListTest.kt$AggregatedListTest$@Test fun removeWorks() - LongMethod:Amount.kt$Amount.Companion$ @JvmStatic fun parseCurrency(input: String): Amount<Currency> - LongMethod:Amount.kt$AmountTransfer$ fun apply(balances: List<SourceAndAmount<T, P>>, newRef: Any? = null): List<SourceAndAmount<T, P>> - LongMethod:AmountTests.kt$AmountTests$@Test fun `amount transfer aggregation`() - LongMethod:AmountTests.kt$AmountTests$@Test fun `amount transfer apply`() - LongMethod:AmountTests.kt$AmountTests$@Test fun `amount transfers equality`() - LongMethod:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase$private fun set(key: K, value: V, logWarning: Boolean, store: (K, V) -> V?): Boolean - LongMethod:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase.Transactional.InFlight$fun alsoWrite(_value: T) - LongMethod:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest$@Test fun `concurrent test purge between A and B`() - LongMethod:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest$@Test fun `test no purge with only a single transaction`() - LongMethod:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest$@Test fun `test purge mid-way in a single transaction`() - LongMethod:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest.TestThread$private fun doActivity() - LongMethod:ArtemisMessagingServer.kt$ArtemisMessagingServer$// TODO: Maybe wrap [IOException] on a key store load error so that it's clearly splitting key store loading from // Artemis IO errors @Throws(IOException::class, AddressBindingException::class, KeyStoreException::class) private fun configureAndStartServer() - LongMethod:ArtemisMessagingServer.kt$ArtemisMessagingServer$private fun createArtemisConfig() - LongMethod:ArtemisMessagingTest.kt$ArtemisMessagingTest$@Before fun setUp() - LongMethod:ArtemisRpcTests.kt$ArtemisRpcTests$private fun testSslCommunication(nodeSSlconfig: MutualSslConfiguration, brokerSslOptions: BrokerRpcSslOptions?, useSslForBroker: Boolean, clientSslOptions: ClientRpcSslOptions?, address: NetworkHostAndPort = ports.nextHostAndPort(), adminAddress: NetworkHostAndPort = ports.nextHostAndPort(), baseDirectory: Path = tempFolder.root.toPath() ) - LongMethod:AttachmentDemo.kt$@Suppress("DEPRECATION") // DOCSTART 1 fun recipient(rpc: CordaRPCOps, webPort: Int) - LongMethod:AttachmentDemo.kt$fun main(args: Array<String>) - LongMethod:AttachmentDemoTest.kt$AttachmentDemoTest$// run with a 10,000,000 bytes in-memory zip file. In practice, a slightly bigger file will be used (~10,002,000 bytes). @Test fun `attachment demo using a 10MB zip file`() - LongMethod:AttachmentDownloadServlet.kt$AttachmentDownloadServlet$@Throws(IOException::class) override fun doGet(req: HttpServletRequest, resp: HttpServletResponse) - LongMethod:AttachmentVersionNumberMigration.kt$AttachmentVersionNumberMigration$override fun execute(database: Database?) - LongMethod:AttachmentsClassLoader.kt$AttachmentsClassLoader$private fun checkAttachments(attachments: List<Attachment>) - LongMethod:AttachmentsClassLoader.kt$AttachmentsClassLoader.Companion$ private fun setOrDecorateURLStreamHandlerFactory() - LongMethod:AttachmentsClassLoader.kt$AttachmentsClassLoaderBuilder$ fun <T> withAttachmentsClassloaderContext(attachments: List<Attachment>, params: NetworkParameters, txId: SecureHash, isAttachmentTrusted: (Attachment) -> Boolean, parent: ClassLoader = ClassLoader.getSystemClassLoader(), block: (ClassLoader) -> T): T - LongMethod:AttachmentsClassLoaderSerializationTests.kt$AttachmentsClassLoaderSerializationTests$@Test fun `Can serialize and deserialize with an attachment classloader`() - LongMethod:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$@Test fun `Allow loading an untrusted contract jar if another attachment exists that was signed by a trusted uploader - intersection of keys match existing attachment`() - LongMethod:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$@Test fun `Allow loading an untrusted contract jar if another attachment exists that was signed with the same keys and uploaded by a trusted uploader`() - LongMethod:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$@Test fun `Attachments with inherited trust do not grant trust to attachments being loaded (no chain of trust)`() - LongMethod:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$@Test fun `Cannot load an untrusted contract jar if no other attachment exists that was signed with the same keys and uploaded by a trusted uploader`() - LongMethod:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$@Test fun `Cannot load an untrusted contract jar if no other attachment exists that was signed with the same keys`() - LongMethod:AuthDBTests.kt$AuthDBTests$@Before override fun setUp() - LongMethod:AzureBackend.kt$AzureBackend.Companion$fun fromContext(context: Context): AzureBackend - LongMethod:AzureInstantiator.kt$AzureInstantiator$override fun instantiateContainer(imageId: String, portsToOpen: List<Int>, instanceName: String, env: Map<String, String>?): CompletableFuture<Pair<String, Map<Int, Int>>> - LongMethod:BCCryptoServiceTests.kt$BCCryptoServiceTests$private fun createKeystore(alias: String, keyPair: KeyPair) : CertificateStoreSupplier - LongMethod:BCCryptoServiceTests.kt$BCCryptoServiceTests$private fun generateKeyAndSignForScheme(cryptoService: BCCryptoService, signatureScheme: SignatureScheme) - LongMethod:BFTNotaryServiceTests.kt$BFTNotaryServiceTests$@Test fun `detect double spend`() - LongMethod:BFTNotaryServiceTests.kt$BFTNotaryServiceTests$@Test fun `transactions can be re-notarised outside their time window`() - LongMethod:BFTNotaryServiceTests.kt$BFTNotaryServiceTests$@Test fun `transactions outside their time window are rejected`() - LongMethod:BFTNotaryServiceTests.kt$BFTNotaryServiceTests.Companion$fun startBftClusterAndNode(clusterSize: Int, mockNet: InternalMockNetwork, exposeRaces: Boolean = false): Pair<Party, TestStartedNode> - LongMethod:BFTSmart.kt$BFTSmart.Replica$protected fun commitInputStates( states: List<StateRef>, txId: SecureHash, callerName: CordaX500Name, requestSignature: NotarisationRequestSignature, timeWindow: TimeWindow?, references: List<StateRef> = emptyList() ) - LongMethod:BFTSmartNotaryService.kt$BFTSmartNotaryService$private fun createMap(): AppendOnlyPersistentMap<StateRef, SecureHash, CommittedState, PersistentStateRef> - LongMethod:BankOfCordaWebApi.kt$BankOfCordaWebApi$ @POST @Path("issue-asset-request") @Consumes(MediaType.APPLICATION_JSON) fun issueAssetRequest(params: IssueRequestParams): Response - LongMethod:Base58Test.kt$Base58Test$@Test fun testDecode() - LongMethod:BlobInspector.kt$BlobInspector$fun run(out: PrintStream): Int - LongMethod:BootstrapperView.kt$BootstrapperView$private fun processSelectedDirectory(dir: File) - LongMethod:BridgeControlListener.kt$BridgeControlListener$fun start() - LongMethod:BridgeControlListener.kt$BridgeControlListener$private fun processControlMessage(msg: ClientMessage) - LongMethod:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$// The Main authentication logic, responsible for running all the configured checks for each user type // and return the actual User and principals private fun authenticateAndAuthorise(username: String, certificates: Array<X509Certificate>?, password: String): Pair<String, List<RolePrincipal>> - LongMethod:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$override fun login(): Boolean - LongMethod:BusinessCalendar.kt$BusinessCalendar.Companion$ @JvmStatic fun createGenericSchedule(startDate: LocalDate, period: Frequency, calendar: BusinessCalendar = EMPTY, dateRollConvention: DateRollConvention = DateRollConvention.Following, noOfAdditionalPeriods: Int = Integer.MAX_VALUE, endDate: LocalDate? = null, periodOffset: Int? = null): List<LocalDate> - LongMethod:Cap.kt$Cap$@Test fun `first fixing`() - LongMethod:Cap.kt$Cap$@Test fun `second fixing`() - LongMethod:Caplet.kt$Caplet$@Test fun fixing() - LongMethod:Cash.kt$Cash$override fun verify(tx: LedgerTransaction) - LongMethod:CashExitFlow.kt$CashExitFlow$ @Suspendable @Throws(CashException::class) override fun call(): AbstractCashFlow.Result - LongMethod:CashPaymentFlow.kt$CashPaymentFlow$@Suspendable override fun call(): AbstractCashFlow.Result - LongMethod:CashPaymentFlowTests.kt$CashPaymentFlowTests$@Test fun `pay some cash`() - LongMethod:CashSelectionH2Impl.kt$CashSelectionH2Impl$// We are using an H2 specific means of selecting a minimum set of rows that match a request amount of coins: // 1) There is no standard SQL mechanism of calculating a cumulative total on a field and restricting row selection on the // running total of such an accumulator // 2) H2 uses session variables to perform this accumulator function: // http://www.h2database.com/html/functions.html#set // 3) H2 does not support JOIN's in FOR UPDATE (hence we are forced to execute 2 queries) override fun executeQuery(connection: Connection, amount: Amount<Currency>, lockId: UUID, notary: Party?, onlyFromIssuerParties: Set<AbstractParty>, withIssuerRefs: Set<OpaqueBytes>, withResultSet: (ResultSet) -> Boolean): Boolean - LongMethod:CashSelectionPostgreSQLImpl.kt$CashSelectionPostgreSQLImpl$// This is using PostgreSQL window functions for selecting a minimum set of rows that match a request amount of coins: // 1) This may also be possible with user-defined functions (e.g. using PL/pgSQL) // 2) The window function accumulated column (`total`) does not include the current row (starts from 0) and cannot // appear in the WHERE clause, hence restricting row selection and adjusting the returned total in the outer query. // 3) Currently (version 9.6), FOR UPDATE cannot be specified with window functions override fun executeQuery(connection: Connection, amount: Amount<Currency>, lockId: UUID, notary: Party?, onlyFromIssuerParties: Set<AbstractParty>, withIssuerRefs: Set<OpaqueBytes>, withResultSet: (ResultSet) -> Boolean): Boolean - LongMethod:CashSelectionSQLServerImpl.kt$CashSelectionSQLServerImpl$// This is one MSSQL implementation of the query to select just enough cash states to meet the desired amount. // We select the cash states with smaller amounts first so that as the result, we minimize the numbers of // unspent cash states remaining in the vault. // // If there is not enough cash, the query will return an empty resultset, which should signal to the caller // of an exception, since the desired amount is assumed to always > 0. // NOTE: The other two implementations, H2 and PostgresSQL, behave differently in this case - they return // all in the vault instead of nothing. That seems to give the caller an extra burden to verify total returned // >= amount. // In addition, extra data fetched results in unnecessary I/O. // Nevertheless, if so desired, we can achieve the same by changing the last FROM clause to // FROM CTE LEFT JOIN Boundary AS B ON 1 = 1 // WHERE B.seqNo IS NULL OR CTE.seqNo <= B.seqNo // // Common Table Expression and Windowed functions help make the query more readable. // Query plan does index scan on pennies_idx, which may be unavoidable due to the nature of the query. override fun executeQuery(connection: Connection, amount: Amount<Currency>, lockId: UUID, notary: Party?, onlyFromIssuerParties: Set<AbstractParty>, withIssuerRefs: Set<OpaqueBytes>, withResultSet: (ResultSet) -> Boolean): Boolean - LongMethod:CashSelectionTest.kt$CashSelectionTest$@Test fun `cash selection sees states added in the same transaction`() - LongMethod:CashSelectionTest.kt$CashSelectionTest$@Test fun `don't return extra coins if the selected amount has been reached`() - LongMethod:CashSelectionTest.kt$CashSelectionTest$@Test fun `select cash states issued by single transaction and give change`() - LongMethod:CashTests.kt$CashTests$// Double spend. @Test fun chainCashDoubleSpendFailsWith() - LongMethod:CashTests.kt$CashTests$// TODO: Optimise this so that we don't throw away and rebuild state that can be shared across tests. @Before fun setUp() - LongMethod:CashTests.kt$CashTests$@Test fun `extended issue examples`() - LongMethod:CashTests.kt$CashTests$@Test fun exitLedger() - LongMethod:CashTests.kt$CashTests$@Test fun generateSimpleSpendWithChange() - LongMethod:CashTests.kt$CashTests$@Test fun generateSpendMixedDeposits() - LongMethod:CashTests.kt$CashTests$@Test fun generateSpendTwiceWithinATransaction() - LongMethod:CashTests.kt$CashTests$@Test fun multiIssuer() - LongMethod:CashTests.kt$CashTests$@Test fun multiSpend() - LongMethod:CashTests.kt$CashTests$@Test fun testMergeSplit() - LongMethod:CashTests.kt$CashTests$@Test fun trivial() - LongMethod:CashTests.kt$CashTests$@Test fun trivialMismatches() - LongMethod:CashUtils.kt$CashUtils$ @JvmStatic @JvmOverloads @Throws(InsufficientBalanceException::class) @Suspendable fun generateSpend(services: ServiceHub, tx: TransactionBuilder, payments: List<PartyAndAmount<Currency>>, ourIdentity: PartyAndCertificate, onlyFromParties: Set<AbstractParty> = emptySet(), anonymous: Boolean = true): Pair<TransactionBuilder, List<PublicKey>> - LongMethod:CertRoleTests.kt$CertRoleTests$@Test fun `check cert roles verify for various cert hierarchies`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$@Test fun `AMPQ Client to Server connection fails when client's certificate is revoked and soft fail is disabled`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$@Test fun `AMPQ Client to Server connection fails when client's certificate is revoked and soft fail is enabled`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$@Test fun `AMPQ Client to Server connection fails when servers's certificate is revoked and soft fail is enabled`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$@Test fun `AMPQ Client to Server connection fails when servers's certificate is revoked`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$@Test fun `AMPQ Client to Server connection succeeds when CRL cannot be obtained and soft fail is enabled`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$@Test fun `AMPQ Client to Server connection succeeds when CRL retrieval is forbidden and soft fail is enabled`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$@Test fun `Revocation status chceck fails when the CRL distribution point is not set and soft fail is disabled`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$@Test fun `Revocation status chceck succeds when the CRL distribution point is not set and soft fail is enabled`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$@Test fun `Simple AMPQ Client to Server connection works and soft fail is disabled`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$@Test fun `Simple AMPQ Client to Server connection works and soft fail is enabled`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$@Test fun `verify CRL algorithms`() - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$private fun Pair<CertificateStoreSupplier, MutualSslConfiguration>.recreateNodeCaAndTlsCertificates(nodeCaCrlDistPoint: String, tlsCrlDistPoint: String?): X509Certificate - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$private fun createClient(targetPort: Int, crlCheckSoftFail: Boolean, nodeCrlDistPoint: String = "http://${server.hostAndPort}/crl/node.crl", tlsCrlDistPoint: String? = "http://${server.hostAndPort}/crl/empty.crl", maxMessageSize: Int = MAX_MESSAGE_SIZE): Pair<AMQPClient, X509Certificate> - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$private fun createServer(port: Int, name: CordaX500Name = ALICE_NAME, crlCheckSoftFail: Boolean, nodeCrlDistPoint: String = "http://${server.hostAndPort}/crl/node.crl", tlsCrlDistPoint: String? = "http://${server.hostAndPort}/crl/empty.crl", maxMessageSize: Int = MAX_MESSAGE_SIZE): Pair<AMQPServer, X509Certificate> - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$private fun replaceCrlDistPointCaCertificate(currentCaCert: X509Certificate, certType: CertificateType, issuerKeyPair: KeyPair, crlDistPoint: String?, crlIssuer: X500Name? = null): X509Certificate - LongMethod:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests.Companion$fun createRevocationList(clrServer: CrlServer, signatureAlgorithm: String, caCertificate: X509Certificate, caPrivateKey: PrivateKey, endpoint: String, indirect: Boolean, vararg serialNumbers: BigInteger): X509CRL - LongMethod:CheckpointAgent.kt$CheckpointAgent.Companion$fun parseArguments(argumentsString: String?) - LongMethod:CheckpointAgent.kt$CheckpointHook$@JvmStatic fun readExit(input: Input, clazz: Class<*>, value: Any?) - LongMethod:CheckpointAgent.kt$CheckpointHook$private fun <T> getArrayValue(clazz: Class<T>, value: Any?): String? - LongMethod:CheckpointAgent.kt$CheckpointHook$private fun instrumentClass(clazz: CtClass): CtClass? - LongMethod:CheckpointAgent.kt$CheckpointHook$private fun prettyStatsTree(indent: Int, statsInfo: StatsInfo, identityInfo: IdentityInfo, builder: StringBuilder) - LongMethod:CheckpointAgent.kt$fun readTree(events: List<StatsEvent>, index: Int, idMap: IdentityHashMap<Any, IdentityInfo> = IdentityHashMap()): Pair<Int, IdentityInfo> - LongMethod:CheckpointAgent.kt$fun readTrees(events: List<StatsEvent>, index: Int, idMap: IdentityHashMap<Any, IdentityInfo>): Pair<Int, List<Pair<StatsInfo, IdentityInfo>>> - LongMethod:CheckpointDumper.kt$CheckpointDumper$fun dump() - LongMethod:CheckpointDumper.kt$CheckpointDumper$fun start(tokenizableServices: List<Any>) - LongMethod:CheckpointDumper.kt$CheckpointDumper$private fun Checkpoint.toJson(id: UUID, now: Instant): CheckpointJson - LongMethod:CheckpointDumper.kt$CheckpointDumper$private fun FlowIORequest<*>.toSuspendedOn(suspendedTimestamp: Instant, now: Instant): SuspendedOn - LongMethod:CheckpointVerifier.kt$CheckpointVerifier$ fun verifyCheckpointsCompatible( checkpointStorage: CheckpointStorage, currentCordapps: List<Cordapp>, platformVersion: Int, serviceHub: ServiceHub, tokenizableServices: List<Any> ) - LongMethod:ClassCarpenter.kt$ClassCarpenterImpl$ override fun build(schema: Schema): Class<*> - LongMethod:ClassCarpenter.kt$ClassCarpenterImpl$ private fun validateSchema(schema: Schema) - LongMethod:ClassCarpenter.kt$ClassCarpenterImpl$private fun ClassWriter.generateClassConstructor(schema: Schema) - LongMethod:ClassCarpenter.kt$ClassCarpenterImpl$private fun ClassWriter.generateStaticEnumConstructor(schema: Schema) - LongMethod:ClassCarpenter.kt$ClassCarpenterImpl$private fun generateClass(classSchema: Schema): Class<*> - LongMethod:ClassCarpenterTest.kt$ClassCarpenterTest$@Test fun `generate multiple interfaces`() - LongMethod:ClassCarpenterTest.kt$ClassCarpenterTest$@Test fun `interface implementing interface`() - LongMethod:ClassCarpenterTest.kt$ClassCarpenterTest$@Test fun `string arrays`() - LongMethod:ClassCarpenterTest.kt$ClassCarpenterTest$@Test fun prims() - LongMethod:ClassCarpenterTestUtils.kt$AmqpCarpenterBase$protected fun RemoteTypeInformation.rename(from: TypeIdentifier, to: TypeIdentifier): RemoteTypeInformation - LongMethod:ClassCarpentingTypeLoaderTests.kt$ClassCarpentingTypeLoaderTests$@Test fun `carpent some related classes`() - LongMethod:ClientRPCInfrastructureTests.kt$ClientRPCInfrastructureTests$@Test fun `complex ListenableFuture`() - LongMethod:ClientRPCInfrastructureTests.kt$ClientRPCInfrastructureTests$@Test fun `complex observables`() - LongMethod:ClientRpcTutorial.kt$// START 6 fun generateTransactions(proxy: CordaRPCOps) - LongMethod:ClientRpcTutorial.kt$@Suppress("DEPRECATION") fun main(args: Array<String>) - LongMethod:ClockUtilsTest.kt$ClockUtilsTest$@Test @Suspendable fun `test waiting for a deadline with multiple clock advance and incomplete Guava future on Fibers`() - LongMethod:ClockUtilsTest.kt$ClockUtilsTest$@Test @Suspendable fun `test waiting for a deadline with multiple clock advance and incomplete JDK8 future on Fibers`() - LongMethod:CollectSignaturesFlow.kt$CollectSignaturesFlow$@Suspendable override fun call(): SignedTransaction - LongMethod:CollectSignaturesFlow.kt$SignTransactionFlow$@Suspendable override fun call(): SignedTransaction - LongMethod:CollectSignaturesFlowTests.kt$CollectSignaturesFlowTests$@Test fun `successfully collects signatures when sessions are initiated with both AnonymousParty and WellKnownParty`() - LongMethod:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$fun checkAllParamsAreOfTheSameType(old: CommandDescription, new: CommandDescription): List<CliBackwardsCompatibilityValidationCheck> - LongMethod:CommandLineInterface.kt$CommandLineInterface$fun run(parsedArgs: CliParser) - LongMethod:CommercialPaper.kt$CommercialPaper$override fun verify(tx: LedgerTransaction) - LongMethod:CommercialPaperTests.kt$CommercialPaperTestsGeneric$@Test fun `issue move and then redeem`() - LongMethod:CommercialPaperTests.kt$CommercialPaperTestsGeneric$@Test fun `trade lifecycle test`() - LongMethod:CompatibilityTest.kt$CompatibilityTest$private fun assertSchemasMatch(original: Schema, reserialized: Schema) - LongMethod:CompatibleTransactionTests.kt$CompatibleTransactionTests$@Test fun `Command visibility tests`() - LongMethod:CompatibleTransactionTests.kt$CompatibleTransactionTests$@Test fun `FilteredTransaction constructors and compatibility`() - LongMethod:CompatibleTransactionTests.kt$CompatibleTransactionTests$@Test fun `FilteredTransaction signer manipulation tests`() - LongMethod:CompatibleTransactionTests.kt$CompatibleTransactionTests$@Test fun `Merkle root computations`() - LongMethod:CompatibleTransactionTests.kt$CompatibleTransactionTests$@Test fun `WireTransaction constructors and compatibility`() - LongMethod:CompatibleTransactionTests.kt$CompatibleTransactionTests$@Test fun `parameters hash visibility`() - LongMethod:CompositeKeyTests.kt$CompositeKeyTests$@Test fun `Test save to keystore`() - LongMethod:CompositeKeyTests.kt$CompositeKeyTests$@Test() fun `composite key constraints`() - LongMethod:CompositeKeyTests.kt$CompositeKeyTests$@Test() fun `composite key validation with graph cycle detection`() - LongMethod:ConcatenatedList.kt$ConcatenatedList$// This is where we create a listener for a *nested* list. Note that 'indexMap' doesn't need to be adjusted on any // of these changes as the indices of nested lists don't change, just their contents. private fun createListener(wrapped: WrappedObservableList<A>): ListChangeListener<A> - LongMethod:ConcatenatedList.kt$ConcatenatedList$// This is where we handle changes to the *source* list. override fun sourceChanged(change: ListChangeListener.Change<out ObservableList<A>>) - LongMethod:ConcatenatedListTest.kt$ConcatenatedListTest$@Test fun addWorks() - LongMethod:ConcatenatedListTest.kt$ConcatenatedListTest$@Test fun permutationWorks() - LongMethod:ConcatenatedListTest.kt$ConcatenatedListTest$@Test fun removeWorks() - LongMethod:ConfigExporter.kt$fun main(args: Array<String>) - LongMethod:ConfigUtilities.kt$// For Iterables figure out the type parameter and apply the same logic as above on the individual elements. private fun Iterable<*>.toConfigIterable(field: Field): Iterable<Any?> - LongMethod:ConfigUtilities.kt$// Problems: // - Forces you to have a primary constructor with all fields of name and type matching the configuration file structure. // - Encourages weak bean-like types. // - Cannot support a many-to-one relationship between configuration file structures and configuration domain type. This is essential for versioning of the configuration files. // - It's complicated and based on reflection, meaning problems with it are typically found at runtime. // - It doesn't support validation errors in a structured way. If something goes wrong, it throws exceptions, which doesn't support good usability practices like displaying all the errors at once. fun <T : Any> Config.parseAs(clazz: KClass<T>, onUnknownKeys: ((Set<String>, logger: Logger) -> Unit) = UnknownConfigKeysPolicy.FAIL::handle, nestedPath: String? = null, baseDirectory: Path? = null): T - LongMethod:ConfigUtilities.kt$// TODO Move this to KeyStoreConfigHelpers. fun MutualSslConfiguration.configureDevKeyAndTrustStores(myLegalName: CordaX500Name, signingCertificateStore: FileBasedCertificateStoreSupplier, certificatesDirectory: Path, cryptoService: CryptoService? = null) - LongMethod:ConfigUtilities.kt$@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") // Reflect over the fields of the receiver and generate a value Map that can use to create Config object. private fun Any.toConfigMap(): Map<String, Any> - LongMethod:ConfigUtilities.kt$ConfigHelper$fun loadConfig(baseDirectory: Path, configFile: Path = baseDirectory / "node.conf", allowMissingConfig: Boolean = false, configOverrides: Config = ConfigFactory.empty()): Config - LongMethod:ConfigUtilities.kt$private fun Config.getCollectionValue(path: String, type: KType, onUnknownKeys: (Set<String>, logger: Logger) -> Unit, nestedPath: String?, baseDirectory: Path?): Collection<Any> - LongMethod:ConfigUtilities.kt$private fun Config.getSingleValue(path: String, type: KType, onUnknownKeys: (Set<String>, logger: Logger) -> Unit, nestedPath: String?, baseDirectory: Path?): Any? - LongMethod:ConnectionStateMachine.kt$ConnectionStateMachine$fun transportProcessInput(msg: ByteBuf) - LongMethod:ConnectionStateMachine.kt$ConnectionStateMachine$fun transportProcessOutput(ctx: ChannelHandlerContext) - LongMethod:ConnectionStateMachine.kt$ConnectionStateMachine$override fun onConnectionFinal(event: Event) - LongMethod:ConnectionStateMachine.kt$ConnectionStateMachine$override fun onDelivery(event: Event) - LongMethod:ConnectionStateMachine.kt$ConnectionStateMachine$private fun getSender(target: String): Sender - LongMethod:ConnectionStateMachine.kt$ConnectionStateMachine$private fun transmitMessages(sender: Sender) - LongMethod:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$@Test @Ignore // TODO(mike): rework fun `Happy path for Hash to Signature Constraint migration`() - LongMethod:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$@Test fun `Attachment canBeTransitionedFrom behaves as expected`() - LongMethod:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$@Test fun `Fail early in the TransactionBuilder when attempting to change the hash of the HashConstraint on the spending transaction`() - LongMethod:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$@Test fun `Input states contract version may be lower that current contract version`() - LongMethod:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$@Test fun `On contract annotated with NoConstraintPropagation there is no platform check for propagation, but the transaction builder can't use the AutomaticPlaceholderConstraint`() - LongMethod:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$@Test fun `Transaction validation fails, when constraints do not propagate correctly`() - LongMethod:ContractDefinition.kt$ContractDefinition$/* @Test fun `builder problem - should not compile`() { val arr = arrange { actions { acmeCorp may { "execute" anytime { acmeCorp may { "problem" anytime { highStreetBank.gives(acmeCorp, 1.M, USD) } } } } } } assertTrue( arr is Actions ) if (arr is Actions) { assertEquals(1, arr.actions.size) } } */ @Test fun `builder problem - legal`() - LongMethod:ContractJarTestUtils.kt$ContractJarTestUtils$fun signContractJar(jarURL: URL, copyFirst: Boolean, keyStoreDir: Path? = null, alias: String = "testAlias", pwd: String = "testPassword"): Pair<Path, PublicKey> - LongMethod:ContractJarTestUtils.kt$ContractJarTestUtils$private fun createTestClass(workingDir: Path, className: String, packages: List<String>, versionSeed: Int = 0): Path - LongMethod:ContractUpgradeFlowRPCTest.kt$ContractUpgradeFlowRPCTest$@Test fun `2 parties contract upgrade using RPC`() - LongMethod:ContractUpgradeFlowTest.kt$ContractUpgradeFlowTest$@Test fun `2 parties contract upgrade`() - LongMethod:ContractUpgradeFlowTest.kt$ContractUpgradeFlowTest$@Test fun `upgrade Cash to v2`() - LongMethod:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$ fun resolve(services: ServicesForResolution, sigs: List<TransactionSignature>): ContractUpgradeLedgerTransaction - LongMethod:ContractUpgradeUtils.kt$ContractUpgradeUtils$fun <OldState : ContractState, NewState : ContractState> assembleUpgradeTx( stateAndRef: StateAndRef<OldState>, upgradedContractClass: Class<out UpgradedContract<OldState, NewState>>, privacySalt: PrivacySalt, services: ServicesForResolution ): ContractUpgradeWireTransaction - LongMethod:CorDappInfoServlet.kt$CorDappInfoServlet$@Throws(IOException::class) override fun doGet(req: HttpServletRequest, resp: HttpServletResponse) - LongMethod:CorDappSerializerTests.kt$CorDappSerializerTests$@Test fun testWithWhitelistAllowed() - LongMethod:CordaCliWrapper.kt$fun CordaCliWrapper.start(args: Array<String>) - LongMethod:CordaFutureImpl.kt$ fun <V> Collection<CordaFuture<out V>>.transpose(): CordaFuture<List<V>> - LongMethod:CordaFutureImplTest.kt$CordaFutureTest$@Test fun `flatMap works`() - LongMethod:CordaFutureImplTest.kt$CordaFutureTest$@Test fun `map works`() - LongMethod:CordaModule.kt$CordaModule$override fun setupModule(context: SetupContext) - LongMethod:CordaPersistence.kt$CordaPersistence$private fun <T> inTopLevelTransaction(isolationLevel: TransactionIsolationLevel, recoverableFailureTolerance: Int, recoverAnyNestedSQLException: Boolean, statement: DatabaseTransaction.() -> T): T - LongMethod:CordaRPCClient.kt$CordaRPCClientConfiguration$ @Suppress("DEPRECATION") @JvmOverloads fun copy( connectionMaxRetryInterval: Duration = this.connectionMaxRetryInterval, minimumServerProtocolVersion: Int = this.minimumServerProtocolVersion, trackRpcCallSites: Boolean = this.trackRpcCallSites, reapInterval: Duration = this.reapInterval, observationExecutorPoolSize: Int = this.observationExecutorPoolSize, cacheConcurrencyLevel: Int = this.cacheConcurrencyLevel, connectionRetryInterval: Duration = this.connectionRetryInterval, connectionRetryIntervalMultiplier: Double = this.connectionRetryIntervalMultiplier, maxReconnectAttempts: Int = this.maxReconnectAttempts, maxFileSize: Int = this.maxFileSize, deduplicationCacheExpiry: Duration = this.deduplicationCacheExpiry ): CordaRPCClientConfiguration - LongMethod:CordaRPCClientReconnectionTest.kt$CordaRPCClientReconnectionTest$@Test fun `a client can successfully unsubscribe a reconnecting observable`() - LongMethod:CordaRPCClientReconnectionTest.kt$CordaRPCClientReconnectionTest$@Test fun `rpc client calls and returned observables continue working when the server crashes and restarts`() - LongMethod:CordaRPCClientReconnectionTest.kt$CordaRPCClientReconnectionTest$@Test fun `rpc client calls and returned observables continue working when there is failover between servers`() - LongMethod:CordaRPCClientTest.kt$CordaRPCClientTest$@Test fun `flow initiator via RPC`() - LongMethod:CordaRPCClientTest.kt$CordaRPCClientTest$@Test fun `shutdown command stops the node`() - LongMethod:CordaRPCOps.kt$ @Deprecated("For automated upgrades, consider using the `gracefulShutdown` command in an SSH session instead.") fun CordaRPCOps.pendingFlowsCount(): DataFeed<Int, Pair<Int, Int>> - LongMethod:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$override fun nodeDiagnosticInfo(): NodeDiagnosticInfo - LongMethod:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$override fun terminate(drainPendingFlows: Boolean) - LongMethod:CordaRPCOpsImplTest.kt$CordaRPCOpsImplTest$@Test fun `cash issue accepted`() - LongMethod:CordaRPCOpsImplTest.kt$CordaRPCOpsImplTest$@Test fun `issue and move`() - LongMethod:CordappConstraintsTests.kt$CordappConstraintsTests$@Test @Ignore // TODO(mike): rework fun `issue cash and transfer using hash to signature constraints migration`() - LongMethod:CordappConstraintsTests.kt$CordappConstraintsTests$@Test fun `issue and consume cash using hash constraints`() - LongMethod:CordappConstraintsTests.kt$CordappConstraintsTests$@Test fun `issue and consume cash using signature constraints`() - LongMethod:CordappConstraintsTests.kt$CordappConstraintsTests$@Test fun `issue cash using hash and signature constraints`() - LongMethod:CordappConstraintsTests.kt$CordappConstraintsTests$@Test fun `issue cash using signature constraints`() - LongMethod:CordappSmokeTest.kt$CordappSmokeTest$@Test fun `FlowContent appName returns the filename of the CorDapp jar`() - LongMethod:CordappSmokeTest.kt$CordappSmokeTest$private fun createNodeInfoWithSingleIdentity(name: CordaX500Name, nodeKeyPair: KeyPair, identityCertPublicKey: PublicKey): NodeInfo - LongMethod:CrossCashTest.kt$CrossCashState$override fun toString(): String - LongMethod:CryptoUtilsTest.kt$CryptoUtilsTest$// key generation test @Test fun `Generate key pairs`() - LongMethod:CryptoUtilsTest.kt$CryptoUtilsTest$@Test fun `ECDSA K1 keyPair from entropy`() - LongMethod:CryptoUtilsTest.kt$CryptoUtilsTest$@Test fun `ECDSA R1 keyPair from entropy`() - LongMethod:CryptoUtilsTest.kt$CryptoUtilsTest$@Test fun `ECDSA secp256K1 deterministic key generation`() - LongMethod:CryptoUtilsTest.kt$CryptoUtilsTest$@Test fun `ECDSA secp256R1 deterministic key generation`() - LongMethod:CryptoUtilsTest.kt$CryptoUtilsTest$@Test fun `ECDSA secp256k1 full process keygen-sign-verify`() - LongMethod:CryptoUtilsTest.kt$CryptoUtilsTest$@Test fun `ECDSA secp256r1 full process keygen-sign-verify`() - LongMethod:CryptoUtilsTest.kt$CryptoUtilsTest$@Test fun `EDDSA ed25519 full process keygen-sign-verify`() - LongMethod:CryptoUtilsTest.kt$CryptoUtilsTest$@Test fun `EdDSA ed25519 deterministic key generation`() - LongMethod:CryptoUtilsTest.kt$CryptoUtilsTest$@Test fun `RSA full process keygen-sign-verify`() - LongMethod:CryptoUtilsTest.kt$CryptoUtilsTest$@Test fun `SPHINCS-256 full process keygen-sign-verify`() - LongMethod:CustomCordapp.kt$CustomCordapp$@VisibleForTesting internal fun packageAsJar(file: Path) - LongMethod:CustomCordapp.kt$CustomCordapp$private fun signJar(jarFile: Path) - LongMethod:CustomSerializerRegistry.kt$CachingCustomSerializerRegistry$ override fun register(customSerializer: CustomSerializer<out Any>) - LongMethod:CustomSerializerRegistry.kt$CachingCustomSerializerRegistry$private fun doFindCustomSerializer(clazz: Class<*>, declaredType: Type): AMQPSerializer<Any>? - LongMethod:CustomVaultQuery.kt$CustomVaultQuery.Service$fun rebalanceCurrencyReserves(): List<Amount<Currency>> - LongMethod:DBCheckpointStorageTests.kt$DBCheckpointStorageTests$@Test fun `add checkpoint and then remove after 'restart'`() - LongMethod:DBCheckpointStorageTests.kt$DBCheckpointStorageTests$@Test fun `add two checkpoints then remove first one`() - LongMethod:DBCheckpointStorageTests.kt$DBCheckpointStorageTests$@Test fun `verify checkpoints compatible`() - LongMethod:DBNetworkParametersStorageTest.kt$DBNetworkParametersStorageTest$@Before fun setUp() - LongMethod:DBTransactionStorage.kt$DBTransactionStorage.Companion$fun createTransactionsMap(cacheFactory: NamedCacheFactory) : AppendOnlyPersistentMapBase<SecureHash, TxCacheValue, DBTransaction, String> - LongMethod:DataUploadServlet.kt$DataUploadServlet$@Throws(IOException::class) override fun doPost(req: HttpServletRequest, resp: HttpServletResponse) - LongMethod:DbMapDeadlockTest.kt$DbMapDeadlockTest$fun recreateDeadlock(hikariProperties: Properties) - LongMethod:DbTransactionsResolver.kt$DbTransactionsResolver$@Suspendable override fun downloadDependencies() - LongMethod:DefaultKryoCustomizer.kt$DefaultKryoCustomizer$fun customize(kryo: Kryo, publicKeySerializer: Serializer<PublicKey> = PublicKeySerializer): Kryo - LongMethod:DefaultKryoCustomizer.kt$DefaultKryoCustomizer.ContractAttachmentSerializer$@Suppress("UNCHECKED_CAST") override fun read(kryo: Kryo, input: Input, type: Class<ContractAttachment>): ContractAttachment - LongMethod:DeliverSessionMessageTransition.kt$DeliverSessionMessageTransition$override fun transition(): TransitionResult - LongMethod:DeliverSessionMessageTransition.kt$DeliverSessionMessageTransition$private fun TransitionBuilder.confirmMessageTransition(sessionState: SessionState, message: ConfirmSessionMessage) - LongMethod:DeliverSessionMessageTransition.kt$DeliverSessionMessageTransition$private fun TransitionBuilder.endMessageTransition() - LongMethod:DeliverSessionMessageTransition.kt$DeliverSessionMessageTransition$private fun TransitionBuilder.errorMessageTransition(sessionState: SessionState, payload: ErrorSessionMessage) - LongMethod:DeliverSessionMessageTransition.kt$DeliverSessionMessageTransition$private fun TransitionBuilder.rejectMessageTransition(sessionState: SessionState, payload: RejectSessionMessage) - LongMethod:DeserializationInput.kt$DeserializationInput$fun readObject(obj: Any, schemas: SerializationSchemas, type: Type, context: SerializationContext): Any - LongMethod:DeserializationInput.kt$DeserializationInput.Companion$@VisibleForTesting @Throws(AMQPNoTypeNotSerializableException::class) fun <T> withDataBytes( byteSequence: ByteSequence, encodingWhitelist: EncodingWhitelist, task: (ByteBuffer) -> T ) : T - LongMethod:DeserializeNeedingCarpentryOfEnumsTest.kt$DeserializeNeedingCarpentryOfEnumsTest$@Test fun compositeIncludingEnums() - LongMethod:DeserializeNeedingCarpentrySimpleTypesTest.kt$DeserializeNeedingCarpentrySimpleTypesTest$@Test fun manyTypes() - LongMethod:DeserializeNeedingCarpentryTests.kt$DeserializeNeedingCarpentryTests$@Test fun arrayOfTypes() - LongMethod:DeserializeNeedingCarpentryTests.kt$DeserializeNeedingCarpentryTests$@Test fun listOfType() - LongMethod:DeserializeNeedingCarpentryTests.kt$DeserializeNeedingCarpentryTests$@Test fun repeatedTypesAreRecognised() - LongMethod:DeserializeNeedingCarpentryTests.kt$DeserializeNeedingCarpentryTests$@Test fun verySimpleType() - LongMethod:DeserializeSimpleTypesTests.kt$DeserializeSimpleTypesTests$@Test fun arrayOfArrayOfIntArray() - LongMethod:DeserializeSimpleTypesTests.kt$DeserializeSimpleTypesTests$@Test fun testByteArray() - LongMethod:DeserializeSimpleTypesTests.kt$DeserializeSimpleTypesTests$@Test fun testCharArray() - LongMethod:Disruption.kt$fun <A> Nodes.withDisruptions(disruptions: List<DisruptionSpec>, mainRandom: SplittableRandom, action: () -> A): A - LongMethod:DistributedServiceTests.kt$DistributedServiceTests$// TODO This should be in RaftNotaryServiceTests @Test fun `cluster survives if a notary is killed`() - LongMethod:DistributedServiceTests.kt$DistributedServiceTests$private fun setup(compositeIdentity: Boolean = false, testBlock: () -> Unit) - LongMethod:DockerInstantiator.kt$DockerInstantiator$override fun instantiateContainer(imageId: String, portsToOpen: List<Int>, instanceName: String, env: Map<String, String>?): CompletableFuture<Pair<String, Map<Int, Int>>> - LongMethod:Driver.kt$ fun <A> driver(defaultParameters: DriverParameters = DriverParameters(), dsl: DriverDSL.() -> A): A - LongMethod:Driver.kt$DriverParameters$fun copy( isDebug: Boolean, driverDirectory: Path, portAllocation: PortAllocation, debugPortAllocation: PortAllocation, systemProperties: Map<String, String>, useTestClock: Boolean, startNodesInProcess: Boolean, waitForAllNodesToFinish: Boolean, notarySpecs: List<NotarySpec>, extraCordappPackagesToScan: List<String>, jmxPolicy: JmxPolicy, networkParameters: NetworkParameters ) - LongMethod:Driver.kt$DriverParameters$fun copy( isDebug: Boolean, driverDirectory: Path, portAllocation: PortAllocation, debugPortAllocation: PortAllocation, systemProperties: Map<String, String>, useTestClock: Boolean, startNodesInProcess: Boolean, waitForAllNodesToFinish: Boolean, notarySpecs: List<NotarySpec>, extraCordappPackagesToScan: List<String>, jmxPolicy: JmxPolicy, networkParameters: NetworkParameters, cordappsForAllNodes: Set<TestCordapp>? ) - LongMethod:DriverDSL.kt$DriverDSL$ fun startNode( defaultParameters: NodeParameters = NodeParameters(), providedName: CordaX500Name? = defaultParameters.providedName, rpcUsers: List<User> = defaultParameters.rpcUsers, verifierType: VerifierType = defaultParameters.verifierType, customOverrides: Map<String, Any?> = defaultParameters.customOverrides, startInSameProcess: Boolean? = defaultParameters.startInSameProcess, maximumHeapSize: String = defaultParameters.maximumHeapSize, logLevelOverride: String? = defaultParameters.logLevelOverride ): CordaFuture<NodeHandle> - LongMethod:DriverDSLImpl.kt$ fun <DI : DriverDSL, D : InternalDriverDSL, A> genericDriver( defaultParameters: DriverParameters = DriverParameters(), driverDslWrapper: (DriverDSLImpl) -> D, coerce: (D) -> DI, dsl: DI.() -> A ): A - LongMethod:DriverDSLImpl.kt$DriverDSLImpl$override fun start() - LongMethod:DriverDSLImpl.kt$DriverDSLImpl$private fun establishRpc(config: NodeConfig, processDeathFuture: CordaFuture<out Process>): CordaFuture<CordaRPCOps> - LongMethod:DriverDSLImpl.kt$DriverDSLImpl$private fun startNodeInternal(config: NodeConfig, webAddress: NetworkHostAndPort, localNetworkMap: LocalNetworkMap?, parameters: NodeParameters): CordaFuture<NodeHandle> - LongMethod:DriverDSLImpl.kt$DriverDSLImpl$private fun startNodeRegistration( providedName: CordaX500Name, rootCert: X509Certificate, networkServicesConfig: NetworkServicesConfig, customOverrides: Map<String, Any?> = mapOf() ): CordaFuture<NodeConfig> - LongMethod:DriverDSLImpl.kt$DriverDSLImpl$private fun startNotaryIdentityGeneration(): CordaFuture<List<NotaryInfo>> - LongMethod:DriverDSLImpl.kt$DriverDSLImpl$private fun startNotaryRegistration( spec: NotarySpec, rootCert: X509Certificate, compatibilityZone: CompatibilityZoneParams ): CordaFuture<NotaryInfo> - LongMethod:DriverDSLImpl.kt$DriverDSLImpl$private fun startRaftNotaryCluster(spec: NotarySpec, localNetworkMap: LocalNetworkMap?): CordaFuture<List<NodeHandle>> - LongMethod:DriverDSLImpl.kt$DriverDSLImpl$private fun startRegisteredNode(name: CordaX500Name, localNetworkMap: LocalNetworkMap?, parameters: NodeParameters, p2pAddress: NetworkHostAndPort = portAllocation.nextHostAndPort()): CordaFuture<NodeHandle> - LongMethod:DriverDSLImpl.kt$DriverDSLImpl.Companion$private fun startInProcessNode( executorService: ScheduledExecutorService, config: NodeConfig ): CordaFuture<Pair<NodeWithInfo, Thread>> - LongMethod:DriverDSLImpl.kt$DriverDSLImpl.Companion$private fun startOutOfProcessNode( config: NodeConfig, quasarJarPath: String, debugPort: Int?, overriddenSystemProperties: Map<String, String>, maximumHeapSize: String, logLevelOverride: String?, vararg extraCmdLineFlag: String ): Process - LongMethod:DriverDSLImpl.kt$NetworkVisibilityController.VisibilityHandle$fun listen(rpc: CordaRPCOps): CordaFuture<Unit> - LongMethod:DriverDSLImpl.kt$fun <A> internalDriver( isDebug: Boolean = DriverParameters().isDebug, driverDirectory: Path = DriverParameters().driverDirectory, portAllocation: PortAllocation = DriverParameters().portAllocation, debugPortAllocation: PortAllocation = DriverParameters().debugPortAllocation, systemProperties: Map<String, String> = DriverParameters().systemProperties, useTestClock: Boolean = DriverParameters().useTestClock, startNodesInProcess: Boolean = DriverParameters().startNodesInProcess, extraCordappPackagesToScan: List<String> = DriverParameters().extraCordappPackagesToScan, waitForAllNodesToFinish: Boolean = DriverParameters().waitForAllNodesToFinish, notarySpecs: List<NotarySpec> = DriverParameters().notarySpecs, jmxPolicy: JmxPolicy = DriverParameters().jmxPolicy, networkParameters: NetworkParameters = DriverParameters().networkParameters, compatibilityZone: CompatibilityZoneParams? = null, notaryCustomOverrides: Map<String, Any?> = DriverParameters().notaryCustomOverrides, inMemoryDB: Boolean = DriverParameters().inMemoryDB, cordappsForAllNodes: Collection<TestCordappInternal>? = null, dsl: DriverDSLImpl.() -> A ): A - LongMethod:DummyFungibleContract.kt$DummyFungibleContract$override fun verify(tx: LedgerTransaction) - LongMethod:DummyFungibleContract.kt$DummyFungibleContract.State$ override fun generateMappedObject(schema: MappedSchema): PersistentState - LongMethod:DummyLinearContract.kt$DummyLinearContract.State$override fun generateMappedObject(schema: MappedSchema): PersistentState - LongMethod:DumpHistoryOnErrorInterceptor.kt$DumpHistoryOnErrorInterceptor$@Suspendable override fun executeTransition( fiber: FlowFiber, previousState: StateMachineState, event: Event, transition: TransitionResult, actionExecutor: ActionExecutor ): Pair<FlowContinuation, StateMachineState> LongMethod:EdDSATests.kt$EdDSATests$@Test fun `PureEdDSA Ed25519 test vectors`() - LongMethod:EnumEvolvabilityTests.kt$EnumEvolvabilityTests$@Test fun defaultAnnotationIsAddedToEnvelopeAndDeserialised() - LongMethod:EnumEvolvabilityTests.kt$EnumEvolvabilityTests$@Test fun doubleRenameAnnotationIsAdded() - LongMethod:EnumEvolvabilityTests.kt$EnumEvolvabilityTests$@Test fun multiEnums() - LongMethod:EnumEvolvabilityTests.kt$EnumEvolvabilityTests$@Test fun renameAnnotationIsAdded() - LongMethod:EnumEvolveTests.kt$EnumEvolveTests$@Test fun deserializeWithRename() - LongMethod:EnumEvolveTests.kt$EnumEvolveTests$@Test fun multiOperations() - LongMethod:EnumTests.kt$EnumTests$@Test fun deserialiseSimpleTest() - LongMethod:EnumTransforms.kt$EnumTransforms$ private fun validateNoCycles(constants: Map<String, Int>) - LongMethod:ErrorCodeLoggingTests.kt$ErrorCodeLoggingTests$// This is used to detect broken logging which can be caused by loggers being initialized // before the initLogging() call is made @Test fun `When logging is set to error level, there are no other levels logged after node startup`() - LongMethod:ErrorFlowTransition.kt$ErrorFlowTransition$// Buffer error messages in Initiating sessions, return the initialised ones. private fun bufferErrorMessagesInInitiatingSessions( sessions: Map<SessionId, SessionState>, errorMessages: List<ErrorSessionMessage> ): Pair<List<SessionState.Initiated>, Map<SessionId, SessionState>> - LongMethod:ErrorFlowTransition.kt$ErrorFlowTransition$override fun transition(): TransitionResult - LongMethod:Eventually.kt$ inline fun <R> eventually( duration: Duration = Duration.ofSeconds(5), waitBetween: Duration = Duration.ofMillis(100), waitBefore: Duration = waitBetween, test: () -> R): R - LongMethod:EvolvabilityTests.kt$EvolvabilityTests$@Test fun addMandatoryFieldWithAltReorderedConstructor() - LongMethod:EvolvabilityTests.kt$EvolvabilityTests$@Test fun addMandatoryFieldWithAltReorderedConstructorAndRemoval() - LongMethod:EvolvabilityTests.kt$EvolvabilityTests$@Test fun changeSubType() - LongMethod:EvolvabilityTests.kt$EvolvabilityTests$@Test fun moreComplexNonNullWithReorder() - LongMethod:EvolvabilityTests.kt$EvolvabilityTests$@Test fun multiVersion() - LongMethod:EvolvabilityTests.kt$EvolvabilityTests$@Test fun multiVersionWithRemoval() - LongMethod:Expect.kt$ fun <S, E : Any> S.genericExpectEvents( isStrict: Boolean = true, stream: S.((E) -> Unit) -> Unit, expectCompose: () -> ExpectCompose<E> ) - LongMethod:Expect.kt$ExpectComposeState.Companion$fun <E : Any> fromExpectCompose(expectCompose: ExpectCompose<E>): ExpectComposeState<E> - LongMethod:Explorer.kt$Explorer$@Throws(IOException::class) fun open(config: NodeConfigWrapper, onExit: (NodeConfigWrapper) -> Unit) - LongMethod:ExternalIdMappingTest.kt$ExternalIdMappingTest$@Test fun `Two states can be mapped to a single externalId`() - LongMethod:ExternalIdMappingTest.kt$ExternalIdMappingTest$@Test fun `externalIds query criteria test`() - LongMethod:FXFwdTimeOption.kt$FXFwdTimeOption$@Test fun `maturity, bank exercise`() - LongMethod:FXFwdTimeOption.kt$FXFwdTimeOption$@Test fun `maturity, corp exercise`() - LongMethod:FetchDataFlow.kt$FetchDataFlow$@Suspendable @Throws(HashNotFound::class, MissingNetworkParameters::class) override fun call(): Result<T> - LongMethod:FiberDeserializationCheckingInterceptor.kt$FiberDeserializationChecker$fun start(checkpointSerializationContext: CheckpointSerializationContext) - LongMethod:FinalityFlow.kt$FinalityFlow$@Suspendable @Throws(NotaryException::class) override fun call(): SignedTransaction - LongMethod:FlattenedList.kt$FlattenedList$override fun sourceChanged(c: ListChangeListener.Change<out ObservableValue<out A>>) - LongMethod:FlattenedListTest.kt$FlattenedListTest$@Test fun addWorks() - LongMethod:FlowCheckpointVersionNodeStartupCheckTest.kt$FlowCheckpointVersionNodeStartupCheckTest$@Test fun `restart node with mismatch between suspended flow and installed CorDapps`() LongMethod:FlowCookbook.kt$InitiatorFlow$@Suppress("RemoveExplicitTypeArguments") @Suspendable override fun call() - LongMethod:FlowFrameworkPersistenceTests.kt$FlowFrameworkPersistenceTests$@Ignore("Some changes in startup order make this test's assumptions fail.") @Test fun `flow with send will resend on interrupted restart`() - LongMethod:FlowFrameworkTests.kt$FlowFrameworkTests$@Test fun `FlowException thrown on other side`() - LongMethod:FlowFrameworkTests.kt$FlowFrameworkTests$@Test fun `non-FlowException thrown on other side`() - LongMethod:FlowFrameworkTripartyTests.kt$FlowFrameworkTripartyTests$@Test fun `FlowException thrown and there is a 3rd unrelated party flow`() - LongMethod:FlowFrameworkTripartyTests.kt$FlowFrameworkTripartyTests$@Test fun `receiving from multiple parties`() - LongMethod:FlowFrameworkTripartyTests.kt$FlowFrameworkTripartyTests$@Test fun `sending to multiple parties`() - LongMethod:FlowManager.kt$NodeFlowManager$@Synchronized override fun <F : FlowLogic<*>> registerInitiatedFlow(initiator: Class<out FlowLogic<*>>, responder: Class<F>) - LongMethod:FlowMessaging.kt$FlowMessagingImpl$@Suspendable override fun sendSessionMessage(destination: Destination, message: SessionMessage, deduplicationId: SenderDeduplicationId) - LongMethod:FlowRetryTest.kt$InitiatorFlow$@Suspendable override fun call(): Any - LongMethod:FlowStackSnapshot.kt$FlowStackSnapshotFactoryImpl$private fun extractStackSnapshotFromFiber(fiber: Fiber<*>, stackTrace: List<StackTraceElement>, flowClass: Class<out FlowLogic<*>>): FlowStackSnapshot - LongMethod:FlowStackSnapshotTest.kt$FlowStackSnapshotTest$@Test fun `persistFlowStackSnapshot stack traces are aligned with stack objects`() - LongMethod:FlowStateMachineImpl.kt$FlowStateMachineImpl$ @Suspendable private fun processEventsUntilFlowIsResumed(isDbTransactionOpenOnEntry: Boolean, isDbTransactionOpenOnExit: Boolean): Any? - LongMethod:FlowStateMachineImpl.kt$FlowStateMachineImpl$@Suspendable override fun <R : Any> suspend(ioRequest: FlowIORequest<R>, maySkipCheckpoint: Boolean): R - LongMethod:FlowStateMachineImpl.kt$FlowStateMachineImpl$@Suspendable override fun <R> subFlow(subFlow: FlowLogic<R>): R - LongMethod:FlowStateMachineImpl.kt$FlowStateMachineImpl$@Suspendable override fun run() - LongMethod:FlowStateMachineImpl.kt$FlowStateMachineImpl$private fun Throwable.fillInLocalStackTrace(): Throwable - LongMethod:FlowWatchPrintingSubscriber.kt$FlowWatchPrintingSubscriber$// TODO Add progress tracker? private fun createStateMachinesRow(smmUpdate: StateMachineUpdate) - LongMethod:FxTransactionBuildTutorial.kt$ForeignExchangeFlow$@Suspendable override fun call(): SecureHash - LongMethod:FxTransactionBuildTutorial.kt$ForeignExchangeRemoteFlow$@Suspendable override fun call() - LongMethod:FxTransactionBuildTutorialTest.kt$FxTransactionBuildTutorialTest$@Test fun `Run ForeignExchangeFlow to completion`() - LongMethod:GenerateRpcSslCertsCli.kt$GenerateRpcSslCerts$private fun generateRpcSslCertificates(conf: NodeConfiguration) - LongMethod:Generator.kt$Generator.Companion$ fun <A> frequency(generators: List<Pair<Double, Generator<A>>>): Generator<A> - LongMethod:Generator.kt$Generator.Companion$fun <A> pickN(number: Int, list: List<A>) - LongMethod:Generator.kt$Generator.Companion$fun <A> replicatePoisson(meanSize: Double, generator: Generator<A>, atLeastOne: Boolean = false) - LongMethod:GenericsTests.kt$GenericsTests$// // If this doesn't blow up all is fine private fun fingerprintingDiffersStrip(state: Any) - LongMethod:GenericsTests.kt$GenericsTests$@Test fun nestedGenericsReferencesByteArrayViaSerializedBytes() - LongMethod:GenericsTests.kt$GenericsTests$@Test fun nestedSerializationInMultipleContextsDoesntColideGenericTypes() - LongMethod:GenericsTests.kt$GenericsTests$@Test fun nestedSerializationOfGenerics() - LongMethod:GenericsTests.kt$GenericsTests$@Test fun nestedSerializationWhereGenericDoesntImpactFingerprint() - LongMethod:HTTPNetworkRegistrationService.kt$HTTPNetworkRegistrationService$@Throws(CertificateRequestException::class) override fun retrieveCertificates(requestId: String): CertificateResponse - LongMethod:HardRestartTest.kt$HardRestartTest$@Test fun restartLongPingPongFlowRandomly() - LongMethod:HardRestartTest.kt$HardRestartTest$@Test fun restartRecursiveFlowRandomly() - LongMethod:HardRestartTest.kt$HardRestartTest$@Test fun restartShortPingPongFlowRandomly() - LongMethod:HardRestartTest.kt$HardRestartTest$@Test fun softRestartLongPingPongFlowRandomly() - LongMethod:HardRestartTest.kt$HardRestartTest.RecursiveA$@Suspendable override fun call(): String - LongMethod:HibernateColumnConverterTests.kt$HibernateColumnConverterTests$// AbstractPartyToX500NameAsStringConverter could cause circular flush of Hibernate session because it is invoked during flush, and a // cache miss was doing a flush. This also checks that loading during flush does actually work. @Test fun `issue some cash on a notary that exists only in the database to check cache loading works in our identity column converters during flush of vault update`() - LongMethod:HibernateConfiguration.kt$HibernateConfiguration$private fun makeSessionFactoryForSchemas(schemas: Set<MappedSchema>): SessionFactory - LongMethod:HibernateConfigurationTest.kt$HibernateConfigurationTest$ @Test fun `composite or query across VaultStates, VaultLinearStates and DummyLinearStates`() - LongMethod:HibernateConfigurationTest.kt$HibernateConfigurationTest$ @Test fun `query fungible states by owner party`() - LongMethod:HibernateConfigurationTest.kt$HibernateConfigurationTest$ @Test fun `query fungible states by participants`() - LongMethod:HibernateConfigurationTest.kt$HibernateConfigurationTest$ @Test fun `select by composite primary between VaultStates, VaultLinearStates and DummyLinearStates`() - LongMethod:HibernateConfigurationTest.kt$HibernateConfigurationTest$ @Test fun `three way join by composite primary between VaultStates, VaultLinearStates and DummyLinearStates`() - LongMethod:HibernateConfigurationTest.kt$HibernateConfigurationTest$ @Test fun `with sorting on attribute from common table`() - LongMethod:HibernateConfigurationTest.kt$HibernateConfigurationTest$ @Test fun `with sorting on attribute from custom table`() - LongMethod:HibernateConfigurationTest.kt$HibernateConfigurationTest$@Before fun setUp() - LongMethod:HibernateConfigurationTest.kt$HibernateConfigurationTest$@Test fun `calculate and order by cash balance for owner and currency`() - LongMethod:HibernateConfigurationTest.kt$HibernateConfigurationTest$@Test fun `calculate cash balances`() - LongMethod:HibernateQueryCriteriaParser.kt$AbstractQueryCriteriaParser$private fun collectionComparisonToPredicate(column: Path<out Any?>, columnPredicate: CollectionExpression<*>): Predicate - LongMethod:HibernateQueryCriteriaParser.kt$HibernateAttachmentQueryCriteriaParser$override fun parseCriteria(criteria: AttachmentQueryCriteria.AttachmentsQueryCriteria): Collection<Predicate> - LongMethod:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$override fun <L : StatePersistable> parseCriteria(criteria: QueryCriteria.VaultCustomQueryCriteria<L>): Collection<Predicate> - LongMethod:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$override fun parseCriteria(criteria: CommonQueryCriteria): Collection<Predicate> - LongMethod:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$override fun parseCriteria(criteria: QueryCriteria.FungibleAssetQueryCriteria): Collection<Predicate> - LongMethod:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$override fun parseCriteria(criteria: QueryCriteria.LinearStateQueryCriteria): Collection<Predicate> - LongMethod:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$override fun parseCriteria(criteria: QueryCriteria.VaultQueryCriteria): Collection<Predicate> - LongMethod:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$private fun <O, R> parseAggregateFunction(root: Root<O>, expression: CriteriaExpression.AggregateFunctionExpression<O, R>): Expression<out Any?>? - LongMethod:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$private fun parse(sorting: Sort) - LongMethod:HospitalisingInterceptor.kt$HospitalisingInterceptor$@Suspendable override fun executeTransition( fiber: FlowFiber, previousState: StateMachineState, event: Event, transition: TransitionResult, actionExecutor: ActionExecutor ): Pair<FlowContinuation, StateMachineState> - LongMethod:IRS.kt$IRS$@Test fun `first fixing`() - LongMethod:IRS.kt$InterestRateSwap$ fun generateAgreement(floatingLeg: FloatingLeg, fixedLeg: FixedLeg, calculation: Calculation, common: Common, oracle: Party, notary: Party): TransactionBuilder - LongMethod:IRS.kt$InterestRateSwap$override fun verify(tx: LedgerTransaction) - LongMethod:IRS.kt$InterestRateSwap$private fun verifyFixCommand(inputs: List<State>, outputs: List<State>, command: CommandWithParties<Commands.Refix>) - LongMethod:IRS.kt$InterestRateSwap.FloatingLeg$fun copy(floatingRatePayer: AbstractParty = this.floatingRatePayer, notional: Amount<Currency> = this.notional, paymentFrequency: Frequency = this.paymentFrequency, effectiveDate: LocalDate = this.effectiveDate, effectiveDateAdjustment: DateRollConvention? = this.effectiveDateAdjustment, terminationDate: LocalDate = this.terminationDate, terminationDateAdjustment: DateRollConvention? = this.terminationDateAdjustment, dayCountBasisDay: DayCountBasisDay = this.dayCountBasisDay, dayCountBasisYear: DayCountBasisYear = this.dayCountBasisYear, dayInMonth: Int = this.dayInMonth, paymentRule: PaymentRule = this.paymentRule, paymentDelay: Int = this.paymentDelay, paymentCalendar: BusinessCalendar = this.paymentCalendar, interestPeriodAdjustment: AccrualAdjustment = this.interestPeriodAdjustment, rollConvention: DateRollConvention = this.rollConvention, fixingRollConvention: DateRollConvention = this.fixingRollConvention, resetDayInMonth: Int = this.resetDayInMonth, fixingPeriod: Int = this.fixingPeriodOffset, resetRule: PaymentRule = this.resetRule, fixingsPerPayment: Frequency = this.fixingsPerPayment, fixingCalendar: BusinessCalendar = this.fixingCalendar, index: String = this.index, indexSource: String = this.indexSource, indexTenor: Tenor = this.indexTenor ) - LongMethod:IRSDemoTest.kt$IRSDemoTest$@Test fun `runs IRS demo`() - LongMethod:IRSTests.kt$IRSTests$ @Test fun generateIRSandFixSome() - LongMethod:IRSTests.kt$IRSTests$ fun trade(): LedgerDSL<TestTransactionDSLInterpreter, TestLedgerDSLInterpreter> - LongMethod:IRSTests.kt$IRSTests$ fun tradegroups(): LedgerDSL<TestTransactionDSLInterpreter, TestLedgerDSLInterpreter> - LongMethod:IRSTests.kt$IRSTests$@Test fun `ensure trade date and termination date checks are done pt1`() - LongMethod:IRSTests.kt$IRSTests$@Test fun `ensure trade date and termination date checks are done pt2`() - LongMethod:IRSTests.kt$IRSTests$@Test fun `expression calculation testing`() - LongMethod:IRSTests.kt$IRSTests$@Test fun `various fixing tests`() LongMethod:IRSTests.kt$fun createDummyIRS(irsSelect: Int): InterestRateSwap.State - LongMethod:IdenticonRenderer.kt$IdenticonRenderer$ private fun render(code: Int, patchSize: Double, backgroundColor: Color = Color.WHITE): Image - LongMethod:IdenticonRenderer.kt$IdenticonRenderer$private fun drawPatch(g: GraphicsContext, x: Double, y: Double, patchIndex: Int, turn: Int, patchSize: Double, _invert: Boolean, color: PatchColor) - LongMethod:IdentityServiceInternal.kt$IdentityServiceInternal$ @Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) fun verifyAndRegisterIdentity(trustAnchor: TrustAnchor, identity: PartyAndCertificate, isNewRandomIdentity: Boolean = false): PartyAndCertificate? - LongMethod:IdentityServiceToStringShortMigrationTest.kt$IdentityServiceToStringShortMigrationTest$@Test fun `it should be possible to migrate all existing identities to new hash function`() - LongMethod:IdentitySyncFlowTests.kt$IdentitySyncFlowTests$@Test fun `don't offer other's identities confidential identities`() - LongMethod:IdentitySyncFlowTests.kt$IdentitySyncFlowTests$@Test fun `sync confidential identities`() - LongMethod:InMemoryIdentityService.kt$InMemoryIdentityService$@Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) private fun verifyAndRegisterIdentity(trustAnchor: TrustAnchor, identity: PartyAndCertificate): PartyAndCertificate? - LongMethod:InMemoryIdentityServiceTests.kt$InMemoryIdentityServiceTests$ @Test fun `assert ownership`() - LongMethod:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest$@Test fun `fourth get outside first transaction from empty cache with invalidate in the middle returns result of third loader`() - LongMethod:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest$@Test fun `fourth get outside first transaction from empty cache with nested invalidate in the middle returns result of third loader`() - LongMethod:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest$@Test fun `other thread get outside first transaction with invalidate in the middle returns result of other thread`() - LongMethod:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest$@Test fun `transaction started before invalidating thread commits does not cache until after the other thread commits`() - LongMethod:Injectors.kt$fun startPublishingFixedRateInjector( metricRegistry: MetricRegistry, parallelism: Int, overallDuration: Duration, injectionRate: Rate, queueSizeMetricName: String = "QueueSize", workDurationMetricName: String = "WorkDuration", work: () -> Unit ) - LongMethod:Injectors.kt$fun startTightLoopInjector( parallelism: Int, numberOfInjections: Int, queueBound: Int, work: () -> Unit ) - LongMethod:InstallShellExtensionsParser.kt$ShellExtensionsGenerator$fun installShellExtensions(): Int - LongMethod:InteractiveShell.kt$InteractiveShell$ @JvmStatic fun runFlowByNameFragment(nameFragment: String, inputData: String, output: RenderPrintWriter, rpcOps: CordaRPCOps, ansiProgressRenderer: ANSIProgressRenderer, inputObjectMapper: ObjectMapper = createYamlInputMapper(rpcOps)) - LongMethod:InteractiveShell.kt$InteractiveShell$ @Throws(NoApplicableConstructor::class) fun <T> runFlowFromString(invoke: (Class<out FlowLogic<T>>, Array<out Any?>) -> FlowProgressHandle<T>, inputData: String, clazz: Class<out FlowLogic<T>>, om: ObjectMapper): FlowProgressHandle<T> - LongMethod:InteractiveShell.kt$InteractiveShell$// TODO Filtering on error/success when we will have some sort of flow auditing, for now it doesn't make much sense. @JvmStatic fun runStateMachinesView(out: RenderPrintWriter, rpcOps: CordaRPCOps): Any? - LongMethod:InteractiveShell.kt$InteractiveShell$@JvmStatic fun gracefulShutdown(userSessionOut: RenderPrintWriter, cordaRPCOps: CordaRPCOps) - LongMethod:InteractiveShell.kt$InteractiveShell$@JvmStatic fun killFlowById(id: String, output: RenderPrintWriter, rpcOps: CordaRPCOps, inputObjectMapper: ObjectMapper = createYamlInputMapper(rpcOps)) - LongMethod:InteractiveShell.kt$InteractiveShell$@JvmStatic fun runRPCFromString(input: List<String>, out: RenderPrintWriter, context: InvocationContext<out Any>, cordaRPCOps: InternalCordaRPCOps, inputObjectMapper: ObjectMapper): Any? - LongMethod:InteractiveShell.kt$InteractiveShell$fun runLocalShell(onExit: () -> Unit = {}) - LongMethod:InteractiveShell.kt$InteractiveShell$fun startShell(configuration: ShellConfiguration, classLoader: ClassLoader? = null, standalone: Boolean = false) - LongMethod:InteractiveShell.kt$InteractiveShell$private fun <T> getMatchingConstructorParamsAndTypes(parser: StringToMethodCallParser<FlowLogic<T>>, inputData: String, clazz: Class<out FlowLogic<T>>) : List<Pair<String, Type>> - LongMethod:InteractiveShell.kt$InteractiveShell$private fun _startShell(configuration: ShellConfiguration, classLoader: ClassLoader? = null) - LongMethod:InteractiveShell.kt$InteractiveShell.ShellLifecycle$fun start(config: Properties, localUserName: String = "", localUserPassword: String = ""): Shell - LongMethod:InteractiveShellIntegrationTest.kt$InteractiveShellIntegrationTest$@Ignore @Test fun `ssh run flows via standalone shell over ssl to node`() - LongMethod:InteractiveShellIntegrationTest.kt$InteractiveShellIntegrationTest$@Ignore @Test fun `ssh runs flows via standalone shell`() - LongMethod:InteractiveShellIntegrationTest.kt$InteractiveShellIntegrationTest$@Test fun `dumpCheckpoints creates zip with json file for suspended flow`() - LongMethod:InteractiveShellTest.kt$InteractiveShellTest$@Test fun niceTypeNamesInErrors() - LongMethod:InternalMockNetwork.kt$InternalMockNetwork$private fun createNodeImpl(parameters: InternalMockNodeParameters, nodeFactory: (MockNodeArgs) -> MockNode, start: Boolean): MockNode - LongMethod:InternalMockNetwork.kt$private fun mockNodeConfiguration(certificatesDirectory: Path): NodeConfiguration - LongMethod:InternalMockNetworkTests.kt$InternalMockNetworkTests$ @Test fun `skip unhandled messages`() - LongMethod:InternalUtils.kt$// TODO: Add inline back when a new Kotlin version is released and check if the java.lang.VerifyError // returns in the IRSSimulationTest. If not, commit the inline back. @DeleteForDJVM fun <T> logElapsedTime(label: String, logger: Logger? = null, body: () -> T): T - LongMethod:Interpolators.kt$CubicSplineInterpolator$private fun computeSplineFunction(): SplineFunction - LongMethod:IssueCash.kt$IssueCash$@JvmStatic fun main(args: Array<String>) - LongMethod:JacksonSupport.kt$JacksonSupport.X509CertificateSerializer$override fun serialize(value: X509Certificate, gen: JsonGenerator, serializers: SerializerProvider) - LongMethod:JacksonSupportTest.kt$JacksonSupportTest$@Test fun TransactionSignature() - LongMethod:JacksonSupportTest.kt$JacksonSupportTest$@Test fun `NodeInfo serialization`() - LongMethod:JacksonSupportTest.kt$JacksonSupportTest$@Test fun `SignedTransaction (WireTransaction)`() - LongMethod:JarScanningCordappLoader.kt$JarScanningCordappLoader$private fun RestrictedScanResult.toCordapp(url: RestrictedURL): CordappImpl - LongMethod:JarScanningCordappLoader.kt$JarScanningCordappLoader$private fun loadCordapps(): List<CordappImpl> - LongMethod:JarScanningCordappLoader.kt$JarScanningCordappLoader$private fun parseCordappInfo(manifest: Manifest?, defaultName: String): Cordapp.Info - LongMethod:JarSignatureTestUtils.kt$JarSignatureTestUtils$fun Path.addManifest(fileName: String, vararg entry: Pair<Attributes.Name, String>) - LongMethod:KMSUtils.kt$ fun freshCertificate(identityService: IdentityService, subjectPublicKey: PublicKey, issuer: PartyAndCertificate, issuerSigner: ContentSigner): PartyAndCertificate - LongMethod:KeyStoreGenerator.kt$KeyStoreGenerator$fun writeKeyStore(output: OutputStream, alias: String, password: CharArray) - LongMethod:KotlinIntegrationTestingTutorial.kt$KotlinIntegrationTestingTutorial$@Test fun `alice bob cash exchange example`() - LongMethod:Kryo.kt$ImmutableClassSerializer$override fun read(kryo: Kryo, input: Input, type: Class<T>): T - LongMethod:Kryo.kt$ImmutableClassSerializer$override fun write(kryo: Kryo, output: Output, obj: T) - LongMethod:KryoCheckpointSerializer.kt$KryoCheckpointSerializer$override fun <T : Any> deserialize(byteSequence: ByteSequence, clazz: Class<T>, context: CheckpointSerializationContext): T - LongMethod:KryoStreamsTest.kt$KryoStreamsTest$@Test fun `ByteBufferOutputStream works`() - LongMethod:KryoTests.kt$KryoTests$@Test fun rxSubscriptionsAreNotSerialized() - LongMethod:LargeTransactionsTest.kt$LargeTransactionsTest$@Test fun checkCanSendLargeTransactions() - LongMethod:LedgerDSLInterpreter.kt$Verifies$ fun failsWith(expectedMessage: String?): EnforceVerifyOrFail - LongMethod:LedgerTransaction.kt$LedgerTransaction$ private fun createLtxForVerification(): LedgerTransaction - LongMethod:LedgerTransaction.kt$LedgerTransaction$@Deprecated("LedgerTransactions should not be created directly, use WireTransaction.toLedgerTransaction instead.") fun copy(inputs: List<StateAndRef<ContractState>> = this.inputs, outputs: List<TransactionState<ContractState>> = this.outputs, commands: List<CommandWithParties<CommandData>> = this.commands, attachments: List<Attachment> = this.attachments, id: SecureHash = this.id, notary: Party? = this.notary, timeWindow: TimeWindow? = this.timeWindow, privacySalt: PrivacySalt = this.privacySalt, networkParameters: NetworkParameters? = this.networkParameters ): LedgerTransaction - LongMethod:LedgerTransaction.kt$LedgerTransaction$@Deprecated("LedgerTransactions should not be created directly, use WireTransaction.toLedgerTransaction instead.") fun copy(inputs: List<StateAndRef<ContractState>>, outputs: List<TransactionState<ContractState>>, commands: List<CommandWithParties<CommandData>>, attachments: List<Attachment>, id: SecureHash, notary: Party?, timeWindow: TimeWindow?, privacySalt: PrivacySalt ): LedgerTransaction - LongMethod:LedgerTransaction.kt$LedgerTransaction.Companion$@CordaInternal internal fun create( inputs: List<StateAndRef<ContractState>>, outputs: List<TransactionState<ContractState>>, commands: List<CommandWithParties<CommandData>>, attachments: List<Attachment>, id: SecureHash, notary: Party?, timeWindow: TimeWindow?, privacySalt: PrivacySalt, networkParameters: NetworkParameters, references: List<StateAndRef<ContractState>>, componentGroups: List<ComponentGroup>? = null, serializedInputs: List<SerializedStateAndRef>? = null, serializedReferences: List<SerializedStateAndRef>? = null, isAttachmentTrusted: (Attachment) -> Boolean ): LedgerTransaction - LongMethod:LeftOuterJoinedMapTest.kt$LeftOuterJoinedMapTest$// TODO perhaps these are too brittle because they test indices that are not stable. Use Expect dsl? @Test fun addWorks() - LongMethod:LeftOuterJoinedMapTest.kt$LeftOuterJoinedMapTest$@Test fun removeWorks() - LongMethod:LoadTest.kt$ fun runLoadTests(configuration: LoadTestConfiguration, tests: List<Pair<LoadTest<*, *>, LoadTest.RunParameters>>) - LongMethod:LoadTest.kt$LoadTest$fun run(nodes: Nodes, parameters: RunParameters, random: SplittableRandom) - LongMethod:LocalTypeInformationBuilder.kt$ private fun constructorForDeserialization(type: Type): KFunction<Any>? - LongMethod:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$ private fun buildNonAtomic(rawType: Class<*>, type: Type, typeIdentifier: TypeIdentifier, typeParameterInformation: List<LocalTypeInformation>): LocalTypeInformation - LongMethod:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$private fun buildForClass(type: Class<*>, typeIdentifier: TypeIdentifier, isOpaque: Boolean): LocalTypeInformation - LongMethod:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$private fun buildForParameterised( rawType: Class<*>, type: ParameterizedType, typeIdentifier: TypeIdentifier.Parameterised, isOpaque: Boolean): LocalTypeInformation - LongMethod:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$private fun makeConstructorPairedProperty(constructorIndex: Int, descriptor: PropertyDescriptor, constructorInformation: LocalConstructorInformation): LocalPropertyInformation? - LongMethod:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$private fun missingMandatoryConstructorProperties( constructorInformation: LocalConstructorInformation, properties: Map<PropertyName, LocalPropertyInformation> ): List<LocalConstructorParameterInformation> - LongMethod:LocalTypeModelTests.kt$LocalTypeModelTests$@Test fun `Primitives and collections`() - LongMethod:LocalTypeModelTests.kt$LocalTypeModelTests$@Test fun `transitive types are non-composable creates non-composable type`() - LongMethod:LoginView.kt$LoginView$tailrec fun login(): NodeMonitorModel? - LongMethod:MQSecurityAsNodeTest.kt$MQSecurityAsNodeTest$@Test fun `login with invalid certificate chain`() - LongMethod:Main.kt$Main$override fun start(stage: Stage) - LongMethod:Main.kt$Node$fun avalancheLoop() - LongMethod:Main.kt$fun main(args: Array<String>) - LongMethod:Main.kt$private fun runLoadTest(loadTestConfiguration: LoadTestConfiguration) - LongMethod:Main.kt$private fun runStabilityTest(loadTestConfiguration: LoadTestConfiguration) - LongMethod:MappedList.kt$MappedList$override fun sourceChanged(change: ListChangeListener.Change<out A>) - LongMethod:MatcherTests.kt$MatcherTests$@Test fun `nested items indent`() - LongMethod:MaxTransactionSizeTests.kt$MaxTransactionSizeTests$@Test fun `check transaction will fail when exceed max transaction size limit`() - LongMethod:MerkleTransaction.kt$FilteredTransaction.Companion$fun <T : Any> filter(t: T, componentGroupIndex: Int, internalIndex: Int) - LongMethod:MockAttachmentStorage.kt$MockAttachmentStorage$private fun importAttachmentInternal(jar: InputStream, uploader: String, contractClassNames: List<ContractClassName>? = null, attachmentId: AttachmentId? = null, signers: List<PublicKey> = emptyList()): AttachmentId - LongMethod:MockCordappProvider.kt$MockCordappProvider$fun addMockCordapp( contractClassName: ContractClassName, attachments: MockAttachmentStorage, contractHash: AttachmentId? = null, signers: List<PublicKey> = emptyList(), jarManifestAttributes: Map<String,String> = emptyMap() ): AttachmentId - LongMethod:MockNodeMessagingService.kt$MockNodeMessagingService$ fun start(network: InMemoryMessagingNetwork, manuallyPumped: Boolean, id: Int, notaryService: PartyAndCertificate?) - LongMethod:MockNodeMessagingService.kt$MockNodeMessagingService$ private fun getNextQueue(q: LinkedBlockingQueue<InMemoryMessagingNetwork.MessageTransfer>, block: Boolean): Pair<InMemoryMessagingNetwork.MessageTransfer, List<Handler>>? - LongMethod:MockNodeMessagingService.kt$MockNodeMessagingService$private fun pumpReceiveInternal(block: Boolean): InMemoryMessagingNetwork.MessageTransfer? - LongMethod:MockServices.kt$MockServices.Companion$ @JvmStatic @JvmOverloads fun makeTestDatabaseAndMockServices(cordappPackages: List<String>, identityService: IdentityService, initialIdentity: TestIdentity, networkParameters: NetworkParameters = testNetworkParameters(modifiedTime = Instant.MIN), vararg moreKeys: KeyPair): Pair<CordaPersistence, MockServices> - LongMethod:MockServices.kt$MockServices.Companion$ @JvmStatic @JvmOverloads fun makeTestDatabaseAndPersistentServices( cordappPackages: List<String>, initialIdentity: TestIdentity, networkParameters: NetworkParameters = testNetworkParameters(modifiedTime = Instant.MIN), moreKeys: Set<KeyPair>, moreIdentities: Set<PartyAndCertificate> ): Pair<CordaPersistence, MockServices> - LongMethod:MultiMemberCompositeSchemaToClassCarpenterTests.kt$MultiMemberCompositeSchemaToClassCarpenterTests$@Test fun calculatedValues() - LongMethod:NetParams.kt$NetParamsSigner$override fun runProgram(): Int - LongMethod:Network.kt$Network$private fun NodeInfo.render(): MapViewComponents - LongMethod:Network.kt$Network$private fun NodeInfo.renderButton(mapLabel: Label): Button - LongMethod:Network.kt$Network$private fun fireBulletBetweenNodes(senderParty: Party, destParty: Party, startType: String, endType: String) - LongMethod:NetworkBootstrapper.kt$NetworkBootstrapper$private fun bootstrap( directory: Path, cordappJars: List<Path>, copyCordapps: CopyCordapps, fromCordform: Boolean, networkParametersOverrides: NetworkParametersOverrides = NetworkParametersOverrides() ) - LongMethod:NetworkBootstrapper.kt$NetworkBootstrapper$private fun createNodeDirectoriesIfNeeded(directory: Path, fromCordform: Boolean): Boolean - LongMethod:NetworkBootstrapper.kt$NetworkBootstrapper$private fun installNetworkParameters( notaryInfos: List<NotaryInfo>, whitelist: Map<String, List<AttachmentId>>, existingNetParams: NetworkParameters?, nodeDirs: List<Path>, networkParametersOverrides: NetworkParametersOverrides ): NetworkParameters - LongMethod:NetworkBootstrapper.kt$NetworkBootstrapper$private fun loadNetworkParameters(nodeDirs: List<Path>): NetworkParameters? - LongMethod:NetworkBootstrapper.kt$NetworkBootstrapper.Companion$private fun generateNodeInfo(nodeDir: Path): Path - LongMethod:NetworkBuilder.kt$NetworkBuilderImpl$override fun build(): CompletableFuture<Pair<List<NodeInstance>, Context>> - LongMethod:NetworkMapServer.kt$NetworkMapServer.InMemoryNetworkMapService$@POST @Path("publish") @Consumes(MediaType.APPLICATION_OCTET_STREAM) fun publishNodeInfo(input: InputStream): Response - LongMethod:NetworkMapTest.kt$NetworkMapTest$@Test fun `parameters update test`() - LongMethod:NetworkMapTest.kt$NetworkMapTest$@Test fun `test node heartbeat`() - LongMethod:NetworkMapTest.kt$NetworkMapTest.Companion$@JvmStatic @Parameterized.Parameters(name = "{0}") fun runParams() - LongMethod:NetworkMapUpdater.kt$NetworkMapUpdater$fun start(trustRoot: X509Certificate, currentParametersHash: SecureHash, ourNodeInfo: SignedNodeInfo, networkParameters: NetworkParameters, keyManagementService: KeyManagementService, networkParameterAcceptanceSettings: NetworkParameterAcceptanceSettings) - LongMethod:NetworkMapUpdater.kt$NetworkMapUpdater$fun updateNetworkMapCache(): Duration - LongMethod:NetworkMapUpdater.kt$NetworkMapUpdater$private fun handleUpdateNetworkParameters(networkMapClient: NetworkMapClient, update: ParametersUpdate) - LongMethod:NetworkMapUpdater.kt$NetworkMapUpdater$private fun watchForNodeInfoFiles(): Subscription - LongMethod:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$@Test fun `auto acceptance checks are correct`() - LongMethod:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$@Test fun `emit new parameters update info on parameters update from network map`() - LongMethod:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$@Test fun `process add node updates from network map, with additional node infos from dir`() - LongMethod:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$@Test fun `process remove node updates from network map, with additional node infos from dir`() - LongMethod:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$@Test fun `remove node from filesystem deletes it from network map cache`() - LongMethod:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$@Test fun `remove node info file, but node in network map server`() - LongMethod:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$private fun createMockNetworkMapCache(): NetworkMapCacheInternal - LongMethod:NetworkParameterOverridesSpec.kt$NetworkParameterOverridesSpec.PackageOwnershipSpec$override fun parseValid(configuration: Config): Validated<PackageOwner, Configuration.Validation.Error> - LongMethod:NetworkParameters.kt$NetworkParameters$ fun copy(minimumPlatformVersion: Int = this.minimumPlatformVersion, notaries: List<NotaryInfo> = this.notaries, maxMessageSize: Int = this.maxMessageSize, maxTransactionSize: Int = this.maxTransactionSize, modifiedTime: Instant = this.modifiedTime, epoch: Int = this.epoch, whitelistedContractImplementations: Map<String, List<AttachmentId>> = this.whitelistedContractImplementations ): NetworkParameters - LongMethod:NetworkParameters.kt$NetworkParameters$ fun copy(minimumPlatformVersion: Int = this.minimumPlatformVersion, notaries: List<NotaryInfo> = this.notaries, maxMessageSize: Int = this.maxMessageSize, maxTransactionSize: Int = this.maxTransactionSize, modifiedTime: Instant = this.modifiedTime, epoch: Int = this.epoch, whitelistedContractImplementations: Map<String, List<AttachmentId>> = this.whitelistedContractImplementations, eventHorizon: Duration = this.eventHorizon ): NetworkParameters - LongMethod:NetworkParametersReader.kt$NetworkParametersReader$fun read(): NetworkParametersAndSigned - LongMethod:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$// This function is resolving and signing WireTransaction with special parameters. private fun TransactionBuilder.toSignedTransactionWithParameters(parameters: NetworkParameters?, services: ServiceHub): SignedTransaction - LongMethod:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$@Test fun `incorrect triangle of transactions`() - LongMethod:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$@Test fun `request parameters that are not in the storage`() - LongMethod:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$@Test fun `transaction chain out of order parameters`() - LongMethod:NetworkParametersTest.kt$NetworkParametersTest$@Test fun `package ownership checks are correct`() - LongMethod:NetworkParametersTest.kt$NetworkParametersTest$@Test fun `that we can copy while preserving the event horizon`() - LongMethod:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$ fun generateKeysAndRegister() - LongMethod:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$ private fun pollServerForCertificates(requestId: String): List<X509Certificate> - LongMethod:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$ private fun submitOrResumeCertificateSigningRequest(publicKey: PublicKey, contentSigner: ContentSigner): String - LongMethod:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$private fun validateCertificates(registeringPublicKey: PublicKey, certificates: List<X509Certificate>) - LongMethod:NetworkRegistrationHelper.kt$NodeRegistrationHelper$private fun createSSLKeystore(nodeCaPublicKey: PublicKey, nodeCaContentSigner: ContentSigner, nodeCaCertificateChain: List<X509Certificate>, tlsCertCrlIssuer: X500Name?) - LongMethod:NetworkRegistrationHelperTest.kt$NetworkRegistrationHelperTest$@Test fun `successful registration`() - LongMethod:NetworkRegistrationHelperTest.kt$NetworkRegistrationHelperTest$private fun createRegistrationHelper(certRole: CertRole = CertRole.NODE_CA, dynamicResponse: (JcaPKCS10CertificationRequest) -> List<X509Certificate>): NetworkRegistrationHelper - LongMethod:NewTransaction.kt$NewTransaction$fun show(window: Window) - LongMethod:NewTransaction.kt$NewTransaction$private fun newTransactionDialog(window: Window) - LongMethod:Node.kt$Node$ override fun startDatabase() - LongMethod:Node.kt$Node$ private fun tryDetectIfNotPublicHost(host: String): String? - LongMethod:Node.kt$Node$override fun startMessagingService(rpcOps: RPCOps, nodeInfo: NodeInfo, myNotaryIdentity: PartyAndCertificate?, networkParameters: NetworkParameters) - LongMethod:NodeAttachmentService.kt$NodeAttachmentService$// TODO: PLT-147: The attachment should be randomised to prevent brute force guessing and thus privacy leaks. private fun import(jar: InputStream, uploader: String?, filename: String?): AttachmentId - LongMethod:NodeAttachmentService.kt$NodeAttachmentService.Companion$// Just iterate over the entries with verification enabled: should be good enough to catch mistakes. // Note that JarInputStream won't throw any kind of error at all if the file stream is in fact not // a ZIP! It'll just pretend it's an empty archive, which is kind of stupid but that's how it works. // So we have to check to ensure we found at least one item. // // For signed Jars add additional checks to close security holes left by the default jarSigner verifier: // - All entries listed in the Manifest are in the JAR file. // - No extra files in the JAR that were not listed in the Manifest. // Together with the check that all entries need to be signed by the same signers that is performed when the signers are read, // it should close any possibility of foul play. internal fun checkIsAValidJAR(stream: InputStream) - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `The strict JAR verification function fails signed JARs with removed or extra files that are valid according to the usual jarsigner`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `all non contract jars not trusted if all are uploaded by non trusted uploaders`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `attachments can be queried by providing a intersection of signers using an EQUAL statement - EQUAL containing a single public key`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `attachments can be queried by providing a intersection of signers using an EQUAL statement - EQUAL containing multiple public keys`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `contract class, versioning and signing metadata can be used to search`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `corrupt entry throws exception`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `development mode - retrieve latest versions of signed contracts - multiple versions of same version id exist in store`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `jar not trusted if different key but same contract`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `jar trusted if the signing keys are an intersection of an existing trusted jar's signers`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `jar with inherited trust does not grant trust to other jars (no chain of trust)`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `missing is not cached`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `non contract jar trusted if trusted jar with same key present`() - LongMethod:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `sorting and compound conditions work`() - LongMethod:NodeBasedTest.kt$NodeBasedTest$@JvmOverloads fun startNode(legalName: CordaX500Name, platformVersion: Int = PLATFORM_VERSION, rpcUsers: List<User> = emptyList(), configOverrides: Map<String, Any> = emptyMap(), flowManager: FlowManager = NodeFlowManager(FlowOverrideConfig())): NodeWithInfo - LongMethod:NodeConfigTest.kt$NodeConfigTest$@Test fun `reading node configuration allows systemProperties and custom`() - LongMethod:NodeConfigTest.kt$NodeConfigTest$@Test fun `reading node configuration`() - LongMethod:NodeConfigTest.kt$NodeConfigTest$@Test fun `reading webserver configuration`() - LongMethod:NodeConfigTest.kt$NodeConfigTest$private fun createConfig( legalName: CordaX500Name = CordaX500Name(organisation = "Unknown", locality = "Nowhere", country = "GB"), p2pPort: Int = -1, rpcPort: Int = -1, rpcAdminPort: Int = -1, webPort: Int = -1, h2port: Int = -1, notary: NotaryService?, users: List<User> = listOf(user("guest")), issuableCurrencies: List<String> = emptyList() ): NodeConfig - LongMethod:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$private fun testNodeConfiguration(): NodeConfigurationImpl - LongMethod:NodeController.kt$NodeController$ fun validate(nodeData: NodeData): NodeConfigWrapper? - LongMethod:NodeController.kt$NodeController$fun runCorda(pty: R3Pty, config: NodeConfigWrapper): Boolean - LongMethod:NodeControllerTest.kt$NodeControllerTest$private fun createConfig( organisation: String = "Unknown", p2pPort: Int = 0, rpcPort: Int = 0, rpcAdminPort: Int = 0, webPort: Int = 0, h2port: Int = 0, notary: NotaryService? = null, users: List<User> = listOf(user("guest")) ): NodeConfigWrapper - LongMethod:NodeCopier.kt$NodeCopier$fun copyBootstrapperFiles(nodeCacheDir: File) - LongMethod:NodeCopier.kt$NodeCopier$internal fun mergeConfigs(configInCacheDir: File, rpcSettings: ConfigValue, sshSettings: ConfigValue, mergeMode: Mode = Mode.NODE) - LongMethod:NodeInfo.kt$NodeInfoSigner$override fun runProgram(): Int - LongMethod:NodeInfoFilesCopier.kt$NodeInfoFilesCopier$private fun atomicCopy(source: Path, destination: Path) - LongMethod:NodeInfoWatcher.kt$NodeInfoWatcher$private fun pollDirectory(): List<NodeInfoUpdate> - LongMethod:NodeKeystoreCheckTest.kt$NodeKeystoreCheckTest$@Test fun `node should throw exception if cert path does not chain to the trust root`() - LongMethod:NodeMonitorModel.kt$NodeMonitorModel$ fun register(nodeHostAndPort: NetworkHostAndPort, username: String, password: String) - LongMethod:NodeNamedCache.kt$DefaultNamedCacheFactory$open protected fun <K, V> configuredForNamed(caffeine: Caffeine<K, V>, name: String): Caffeine<K, V> - LongMethod:NodePerformanceTests.kt$NodePerformanceTests$@Test fun `empty flow per second`() - LongMethod:NodePerformanceTests.kt$NodePerformanceTests$@Test fun `self pay rate`() - LongMethod:NodeProcess.kt$NodeProcess.Factory$private fun waitForNode(process: Process, config: NodeConfig, client: CordaRPCClient) - LongMethod:NodeRPCTests.kt$NodeRPCTests$@Test fun `run nodeDiagnosticInfo`() - LongMethod:NodeSchedulerService.kt$NodeSchedulerService$private fun getFlow(scheduledState: ScheduledStateRef): FlowLogic<*>? - LongMethod:NodeSchedulerService.kt$NodeSchedulerService$private fun runLoopFunction() - LongMethod:NodeSchedulerService.kt$NodeSchedulerService.Companion$ // We should try to make the Clock used in our code injectable (for tests etc) and to use the extension below // to wait in our code, rather than <code>Thread.sleep()</code> or other time-based pauses. @Suspendable @VisibleForTesting // We specify full classpath on SettableFuture to differentiate it from the Quasar class of the same name fun awaitWithDeadline(clock: CordaClock, deadline: Instant, future: Future<*> = GuavaSettableFuture.create<Any>()): Boolean - LongMethod:NodeSchedulerServiceTest.kt$NodeSchedulerPersistenceTest$@Ignore("Temporarily") @Test fun `test that if schedule is updated then the flow is invoked on the correct schedule`() - LongMethod:NodeSchedulerServiceTest.kt$NodeSchedulerPersistenceTest$@Test fun `test that schedule is persisted`() - LongMethod:NodeStartup.kt$NodeStartup$fun initialiseAndRun(cmdLineOptions: SharedNodeCmdLineOptions, afterNodeInitialisation: RunAfterNodeInitialisation, requireCertificates: Boolean = false): Int - LongMethod:NodeStartup.kt$NodeStartup$fun isNodeRunningAt(baseDirectory: Path): Boolean - LongMethod:NodeStartup.kt$NodeStartup$fun startNode(node: Node, startTime: Long) - LongMethod:NodeStartup.kt$NodeStartup$open fun drawBanner(versionInfo: VersionInfo) - LongMethod:NodeStartup.kt$NodeStartup$private fun lookupMachineNameAndMaybeWarn(): String - LongMethod:NodeStartup.kt$NodeStartup$protected open fun logStartupInfo(versionInfo: VersionInfo, conf: NodeConfiguration) - LongMethod:NodeStartup.kt$NodeStartupCli$override fun runProgram(): Int - LongMethod:NodeStartup.kt$fun CliWrapperBase.initLogging(baseDirectory: Path): Boolean - LongMethod:NodeStatePersistenceTests.kt$NodeStatePersistenceTests$@Test fun `persistent state survives node restart without reinitialising database schema`() - LongMethod:NodeStatePersistenceTests.kt$NodeStatePersistenceTests$@Test fun `persistent state survives node restart`() - LongMethod:NodeTabView.kt$NodeTabView$private fun Pane.nearestCityField(): ComboBox<WorldMapLocation> - LongMethod:NodeTabView.kt$NodeTabView$private fun launchNode(config: NodeConfigWrapper) - LongMethod:NodeTerminalView.kt$NodeTerminalView$/* * We only want to run one web server for each node. * So disable the "launch" button when we have * launched the web server and only reenable it when * the web server has exited. */ private fun configureWebButton(config: NodeConfigWrapper) - LongMethod:NodeTerminalView.kt$NodeTerminalView$@Suppress("DEPRECATION") private fun initialise(config: NodeConfigWrapper, ops: CordaRPCOps) - LongMethod:NodeTerminalView.kt$NodeTerminalView$fun open(config: NodeConfigWrapper, onExit: (Int) -> Unit) - LongMethod:NodeTest.kt$NodeTest$@Test fun `Node can start with multiple keypairs for its identity`() - LongMethod:NodeTest.kt$NodeTest$@Test fun `clear network map cache works`() - LongMethod:NodeTest.kt$NodeTest$private fun createConfig(nodeName: CordaX500Name): NodeConfigurationImpl - LongMethod:NodeVaultService.kt$NodeVaultService$ private fun bootstrapContractStateTypes() - LongMethod:NodeVaultService.kt$NodeVaultService$@Suspendable @Throws(StatesNotAvailableException::class) override fun <T : FungibleState<*>> tryLockFungibleStatesForSpending( lockId: UUID, eligibleStatesQuery: QueryCriteria, amount: Amount<*>, contractStateType: Class<out T> ): List<StateAndRef<T>> - LongMethod:NodeVaultService.kt$NodeVaultService$@Throws(StatesNotAvailableException::class) override fun softLockReserve(lockId: UUID, stateRefs: NonEmptySet<StateRef>) - LongMethod:NodeVaultService.kt$NodeVaultService$@Throws(VaultQueryException::class) private fun <T : ContractState> _queryBy(criteria: QueryCriteria, paging_: PageSpecification, sorting: Sort, contractStateType: Class<out T>, skipPagingChecks: Boolean): Vault.Page<T> - LongMethod:NodeVaultService.kt$NodeVaultService$fun makeUpdate(tx: WireTransaction): Vault.Update<ContractState>? - LongMethod:NodeVaultService.kt$NodeVaultService$fun resolveAndMakeUpdate(tx: CoreTransaction): Vault.Update<ContractState>? - LongMethod:NodeVaultService.kt$NodeVaultService$override fun softLockRelease(lockId: UUID, stateRefs: NonEmptySet<StateRef>?) - LongMethod:NodeVaultService.kt$NodeVaultService$private fun processAndNotify(updates: List<Vault.Update<ContractState>>, previouslySeen: Boolean) - LongMethod:NodeVaultService.kt$NodeVaultService$private fun recordUpdate(update: Vault.Update<ContractState>, previouslySeen: Boolean): Vault.Update<ContractState> - LongMethod:NodeVaultService.kt$NodeVaultService$private fun saveStates(session: Session, states: Map<StateRef, StateAndRef<ContractState>>) - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$// TODO: Unit test linear state relevancy checks @Test fun `correct updates are generated for general transactions`() - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$@Test @Ignore fun `trackByCriteria filters updates and snapshots`() - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$@Test fun `attempt to lock states already soft locked by me`() - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$@Test fun `correct updates are generated when changing notaries`() - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$@Test fun `fungible state selection test`() - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$@Test fun `lock additional states to some already soft locked by me`() - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$@Test fun `soft locking attempt concurrent reserve`() - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$@Test fun `soft locking partial reserve states fails`() - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$@Test fun `states soft locking query granularity`() - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$@Test fun `states soft locking reserve and release`() - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$@Test fun `unconsumedStatesForSpending from specific issuer party and refs`() - LongMethod:NodeVaultServiceTest.kt$NodeVaultServiceTest$@Test fun addNoteToTransaction() - LongMethod:NodeWebServer.kt$NodeWebServer$private fun buildServletContextHandler(localRpc: CordaRPCOps): ServletContextHandler - LongMethod:NodeWebServer.kt$NodeWebServer$private fun initWebServer(localRpc: CordaRPCOps): Server - LongMethod:NonValidatingNotaryFlow.kt$NonValidatingNotaryFlow$override fun verifyTransaction(requestPayload: NotarisationPayload) - LongMethod:NonValidatingNotaryServiceTests.kt$NonValidatingNotaryServiceTests$@Test fun `should re-sign a transaction with an expired time-window`() - LongMethod:NonValidatingNotaryServiceTests.kt$NonValidatingNotaryServiceTests$@Test fun `should report conflict when inputs are reused across transactions`() - LongMethod:NonValidatingNotaryServiceTests.kt$NonValidatingNotaryServiceTests$@Test fun `should sign identical transaction multiple times (notarisation is idempotent)`() - LongMethod:NotaryChangeTests.kt$NotaryChangeTests$@Test fun `should not break encumbrance links`() - LongMethod:NotaryCopier.kt$NotaryCopier$private fun copyNotaryBootstrapperFiles(nodeCacheDir: File) - LongMethod:NotaryServiceFlow.kt$NotaryServiceFlow$@Suspendable override fun call(): Void? - LongMethod:NotaryWhitelistTests.kt$NotaryWhitelistTests$ @Test fun `can't perform a regular transaction on a de-listed notary`() - LongMethod:NotaryWhitelistTests.kt$NotaryWhitelistTests$@Test fun `should reject transaction when a dependency does not contain notary in whitelist`() - LongMethod:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$// obtains the data and calculates the grid of results private fun calculate(runner: CalculationRunner) - LongMethod:OGSwapPricingExample.kt$SwapPricingExample$// Create a fixed vs libor 3m swap private fun createStub3mFixedVsLibor3mSwap(): Trade - LongMethod:OGSwapPricingExample.kt$SwapPricingExample$// Create an overnight averaged vs libor 3m swap with spread private fun createOvernightAveragedWithSpreadVsLibor3mSwap(): Trade - LongMethod:OGSwapPricingExample.kt$SwapPricingExample$// create a libor 3m vs libor 6m basis swap with spread private fun createBasisLibor3mVsLibor6mWithSpreadSwap(): Trade - LongMethod:OGSwapPricingExample.kt$SwapPricingExample$// obtains the data and calculates the grid of results private fun calculate(runner: CalculationRunner) - LongMethod:OGTrade.kt$OGTrade$override fun verify(tx: LedgerTransaction) - LongMethod:ObjectDiffer.kt$ObjectDiffer$fun diff(a: Any?, b: Any?): DiffTree? - LongMethod:ObjectSerializer.kt$EvolutionObjectSerializer.Companion$fun make(localTypeInformation: LocalTypeInformation.Composable, remoteTypeInformation: RemoteTypeInformation.Composable, constructor: LocalConstructorInformation, properties: Map<String, LocalPropertyInformation>, classLoader: ClassLoader, mustPreserveData: Boolean): EvolutionObjectSerializer - LongMethod:ObjectSerializer.kt$ObjectSerializer.Companion$private fun makeForComposable(typeInformation: LocalTypeInformation.Composable, typeNotation: CompositeType, typeDescriptor: Symbol, factory: LocalSerializerFactory): ComposableObjectSerializer - LongMethod:Obligation.kt$ fun <P : AbstractParty, T : Any> sumAmountsDue(balances: Map<Pair<P, P>, Amount<T>>): Map<P, Long> - LongMethod:Obligation.kt$Obligation$ @VisibleForTesting private fun verifySetLifecycleCommand(inputs: List<FungibleAsset<Terms<P>>>, outputs: List<FungibleAsset<Terms<P>>>, tx: LedgerTransaction, setLifecycleCommand: CommandWithParties<Commands.SetLifecycle>) - LongMethod:Obligation.kt$Obligation$override fun verify(tx: LedgerTransaction) - LongMethod:Obligation.kt$Obligation$private fun verifyNetCommand(tx: LedgerTransaction, command: CommandWithParties<NetCommand>) - LongMethod:Obligation.kt$Obligation$private fun verifySettleCommand(tx: LedgerTransaction, inputs: List<FungibleAsset<Terms<P>>>, outputs: List<FungibleAsset<Terms<P>>>, command: CommandWithParties<Commands.Settle<P>>, groupingKey: Issued<Terms<P>>) - LongMethod:ObligationTests.kt$ObligationTests$ @Test fun `generate set lifecycle`() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun `cash settlement`() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun `close-out netting`() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun `commodity settlement`() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun `exit single product obligation`() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun `issue debt`() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun `nettability of settlement contracts`() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun `payment default`() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun `payment netting`() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun multiIssuer() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun testMergeSplit() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun trivial() - LongMethod:ObligationTests.kt$ObligationTests$@Test fun trivialMismatches() - LongMethod:ObligationUtils.kt$ObligationUtils$ @JvmStatic fun <P : Any> generateSetLifecycle(tx: TransactionBuilder, statesAndRefs: List<StateAndRef<Obligation.State<P>>>, lifecycle: Obligation.Lifecycle, notary: Party) - LongMethod:ObligationUtils.kt$ObligationUtils$ @JvmStatic fun <P : Any> generateSettle(tx: TransactionBuilder, statesAndRefs: Iterable<StateAndRef<Obligation.State<P>>>, assetStatesAndRefs: Iterable<StateAndRef<FungibleAsset<P>>>, moveCommand: MoveCommand, notary: Party) - LongMethod:ObligationUtils.kt$ObligationUtils$@JvmStatic fun <P : Any> generatePaymentNetting(tx: TransactionBuilder, issued: Issued<Obligation.Terms<P>>, notary: Party, vararg inputs: StateAndRef<Obligation.State<P>>) - LongMethod:ObservablesTests.kt$ObservablesTests$@Test fun `bufferUntilDatabaseCommit delays until transaction closed repeatable`() - LongMethod:ObservablesTests.kt$ObservablesTests$@Test fun `bufferUntilDatabaseCommit delays until transaction closed`() - LongMethod:ObservablesTests.kt$ObservablesTests$@Test fun `bufferUntilDatabaseCommit propagates error if transaction rolled back`() - LongMethod:ObservablesTests.kt$ObservablesTests$@Test fun `bufferUntilDatabaseCommit swallows if transaction rolled back`() - LongMethod:ObservablesTests.kt$ObservablesTests$@Test fun `check wrapping in db tx restarts if we pass through zero subscribers`() - LongMethod:ObservablesTests.kt$ObservablesTests$@Test fun `combine tee and bufferUntilDatabaseCommit`() - LongMethod:ObservablesTests.kt$ObservablesTests$@Test fun `new transaction open in observer when wrapped`() - LongMethod:ObservablesTests.kt$ObservablesTests$@Test fun `tee correctly copies observations to multiple observers`() - LongMethod:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.SplitMessagesFlow$@Suspendable override fun call(): SignedTransaction - LongMethod:OnLedgerAsset.kt$OnLedgerAsset.Companion$ @Throws(InsufficientBalanceException::class) @JvmStatic fun <S : FungibleAsset<T>, T : Any> generateExit(tx: TransactionBuilder, amountIssued: Amount<Issued<T>>, assetStates: List<StateAndRef<S>>, payChangeTo: AbstractParty, deriveState: (TransactionState<S>, Amount<Issued<T>>, AbstractParty) -> TransactionState<S>, generateMoveCommand: () -> CommandData, generateExitCommand: (Amount<Issued<T>>) -> CommandData): Set<PublicKey> - LongMethod:OnLedgerAsset.kt$OnLedgerAsset.Companion$ @Throws(InsufficientBalanceException::class) @JvmStatic fun <S : FungibleAsset<T>, T : Any> generateSpend(tx: TransactionBuilder, payments: List<PartyAndAmount<T>>, acceptableStates: List<StateAndRef<S>>, payChangeTo: AbstractParty, deriveState: (TransactionState<S>, Amount<Issued<T>>, AbstractParty) -> TransactionState<S>, generateMoveCommand: () -> CommandData): Pair<TransactionBuilder, List<PublicKey>> - LongMethod:P2PFlowsDrainingModeTest.kt$P2PFlowsDrainingModeTest$@Test fun `flows draining mode suspends consumption of initial session messages`() - LongMethod:P2PMessagingClient.kt$P2PMessagingClient$ fun run() - LongMethod:P2PMessagingClient.kt$P2PMessagingClient$ fun start(myIdentity: PublicKey, serviceIdentity: PublicKey?, maxMessageSize: Int, advertisedAddress: NetworkHostAndPort = serverAddress) - LongMethod:P2PMessagingClient.kt$P2PMessagingClient$ fun stop() - LongMethod:P2PMessagingClient.kt$P2PMessagingClient$private fun InnerState.registerBridgeControl(session: ClientSession, inboxes: List<String>) - LongMethod:P2PMessagingClient.kt$P2PMessagingConsumer$override fun start() - LongMethod:ParametersUtilities.kt$@JvmOverloads fun testNetworkParameters( notaries: List<NotaryInfo> = emptyList(), minimumPlatformVersion: Int = 1, modifiedTime: Instant = Instant.now(), maxMessageSize: Int = 10485760, // TODO: Make this configurable and consistence across driver, bootstrapper, demobench and NetworkMapServer maxTransactionSize: Int = maxMessageSize * 50, whitelistedContractImplementations: Map<String, List<AttachmentId>> = emptyMap(), epoch: Int = 1, eventHorizon: Duration = 30.days, packageOwnership: Map<String, PublicKey> = emptyMap() ): NetworkParameters - LongMethod:PartialMerkleTree.kt$PartialMerkleTree.Companion$ private fun buildPartialTree( root: MerkleTree, includeHashes: List<SecureHash>, usedHashes: MutableList<SecureHash> ): Pair<Boolean, PartialTree> - LongMethod:PartialMerkleTreeTest.kt$PartialMerkleTreeTest$@Before fun init() - LongMethod:PartialMerkleTreeTest.kt$PartialMerkleTreeTest$@Test fun `Find leaf index`() - LongMethod:PartyAndCertificate.kt$PartyAndCertificate$ fun verify(trustAnchor: TrustAnchor): PKIXCertPathValidatorResult - LongMethod:PersistentIdentityMigrationNewTableTest.kt$PersistentIdentityMigrationNewTableTest$@Before fun setUp() - LongMethod:PersistentIdentityMigrationNewTableTest.kt$PersistentIdentityMigrationNewTableTest$private fun addNetworkParameters() - LongMethod:PersistentIdentityService.kt$PersistentIdentityService$ @Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) private fun verifyAndRegisterIdentity(trustAnchor: TrustAnchor, identity: PartyAndCertificate): PartyAndCertificate? - LongMethod:PersistentIdentityServiceTests.kt$PersistentIdentityServiceTests$ @Test fun `assert ownership`() - LongMethod:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$override fun addNodes(nodes: List<NodeInfo>) - LongMethod:PersistentScheduledFlowRepositoryTest.kt$PersistentScheduledFlowRepositoryTest$@Test fun `test that item is rescheduled`() - LongMethod:PersistentStateServiceTests.kt$PersistentStateServiceTests$@Test fun `test child objects are persisted`() - LongMethod:PersistentUniquenessProvider.kt$PersistentUniquenessProvider$private fun commitOne( states: List<StateRef>, txId: SecureHash, callerIdentity: Party, requestSignature: NotarisationRequestSignature, timeWindow: TimeWindow?, references: List<StateRef> ) - LongMethod:PersistentUniquenessProvider.kt$PersistentUniquenessProvider.Companion$fun createMap(cacheFactory: NamedCacheFactory): AppendOnlyPersistentMap<StateRef, SecureHash, CommittedState, PersistentStateRef> - LongMethod:PortAllocationTest.kt$PortAllocationTest$@Test(timeout = 120_000) fun `should support multiprocess port allocation`() - LongMethod:PortfolioApi.kt$PortfolioApi$ @GET @Path("{party}/portfolio/history/aggregated") @Produces(MediaType.APPLICATION_JSON) fun getPartyPortfolioHistoryAggregated(@PathParam("party") partyName: String): Response - LongMethod:PortfolioApi.kt$PortfolioApi$ @GET @Path("{party}/trades") @Produces(MediaType.APPLICATION_JSON) fun getPartyTrades(@PathParam("party") partyName: String): Response - LongMethod:PortfolioApiUtils.kt$PortfolioApiUtils$fun createTradeView(rpc: CordaRPCOps, state: IRSState): TradeView - LongMethod:PortfolioApiUtils.kt$PortfolioApiUtils$fun createValuations(state: PortfolioState, portfolio: Portfolio): ValuationsView - LongMethod:PortfolioSwap.kt$PortfolioSwap$override fun verify(tx: LedgerTransaction) - LongMethod:PrettyPrint.kt$PrettyPrint$fun prettyPrint(arr: Arrangement) - LongMethod:PrettyPrint.kt$PrettyPrint$fun prettyPrintBigDecimal(per: Perceivable<BigDecimal>) - LongMethod:PrettyPrint.kt$PrettyPrint$fun prettyPrintBoolean(per: Perceivable<Boolean>) - LongMethod:ProcessUtilities.kt$ProcessUtilities$fun startJavaProcess( className: String, arguments: List<String>, classPath: List<String> = defaultClassPath, workingDirectory: Path? = null, jdwpPort: Int? = null, extraJvmArguments: List<String> = emptyList(), maximumHeapSize: String? = null ): Process - LongMethod:ProfileController.kt$ProfileController$ @Throws(IOException::class) fun openProfile(): List<InstallConfig>? - LongMethod:ProfileController.kt$ProfileController$ @Throws(IOException::class) fun saveProfile(): Boolean - LongMethod:ProgressTrackerTest.kt$ProgressTrackerTest$@Test fun `steps tree index counts children steps`() - LongMethod:ProgressTrackerTest.kt$ProgressTrackerTest$@Test fun `steps tree index counts two levels of children steps`() - LongMethod:ProgressTrackerTest.kt$ProgressTrackerTest$@Test fun `structure changes are pushed down when progress trackers are added`() - LongMethod:ProgressTrackerTest.kt$ProgressTrackerTest$@Test fun `structure changes are pushed down when progress trackers are removed`() - LongMethod:PropertyDescriptor.kt$PropertyDescriptor$ fun validate() - LongMethod:ProtonWrapperTests.kt$ProtonWrapperTests$@Test fun `Client Failover for multiple IP`() - LongMethod:ProtonWrapperTests.kt$ProtonWrapperTests$@Test fun `Message sent from AMQP to non-existent Artemis inbox is rejected and client disconnects`() - LongMethod:ProtonWrapperTests.kt$ProtonWrapperTests$@Test fun `Send a message from AMQP to Artemis inbox`() - LongMethod:ProtonWrapperTests.kt$ProtonWrapperTests$@Test fun `Send a message larger then maxMessageSize from AMQP to Artemis inbox`() - LongMethod:ProtonWrapperTests.kt$ProtonWrapperTests$@Test fun `Simple AMPQ Client to Server`() - LongMethod:ProtonWrapperTests.kt$ProtonWrapperTests$@Test fun `Test AMQP Client with invalid root certificate`() - LongMethod:ProtonWrapperTests.kt$ProtonWrapperTests$@Test fun `shared AMQPClient threadpool tests`() - LongMethod:ProtonWrapperTests.kt$ProtonWrapperTests$private fun createArtemisServerAndClient(maxMessageSize: Int = MAX_MESSAGE_SIZE): Pair<ArtemisMessagingServer, ArtemisMessagingClient> - LongMethod:ProtonWrapperTests.kt$ProtonWrapperTests$private fun createClient(maxMessageSize: Int = MAX_MESSAGE_SIZE): AMQPClient - LongMethod:ProtonWrapperTests.kt$ProtonWrapperTests$private fun createServer(port: Int, name: CordaX500Name = ALICE_NAME, maxMessageSize: Int = MAX_MESSAGE_SIZE, crlCheckSoftFail: Boolean = true): AMQPServer - LongMethod:ProtonWrapperTests.kt$ProtonWrapperTests$private fun createSharedThreadsClient(sharedEventGroup: EventLoopGroup, id: Int, maxMessageSize: Int = MAX_MESSAGE_SIZE): AMQPClient - LongMethod:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$ override operator fun get(key: PublicKey): KeyOwningIdentity? - LongMethod:QuasarInstrumentationHook.kt$ fun recordUsedInstrumentedCallStack() - LongMethod:QuasarInstrumentationHook.kt$PackageTree$ fun toGlobs(excludeTree: PackageTree): List<Glob> - LongMethod:QuasarInstrumentationHook.kt$QuasarInstrumentationHook$override fun transform( loader: ClassLoader?, className: String, classBeingRedefined: Class<*>?, protectionDomain: ProtectionDomain?, classfileBuffer: ByteArray ): ByteArray - LongMethod:QuasarInstrumentationHook.kt$QuasarInstrumentationHookAgent.Companion$@JvmStatic fun premain(argumentsString: String?, instrumentation: Instrumentation) - LongMethod:QueryCriteria.kt$QueryCriteria.FungibleAssetQueryCriteria$fun copy( participants: List<AbstractParty>? = this.participants, owner: List<AbstractParty>? = this.owner, quantity: ColumnPredicate<Long>? = this.quantity, issuer: List<AbstractParty>? = this.issuer, issuerRef: List<OpaqueBytes>? = this.issuerRef, status: Vault.StateStatus = this.status, contractStateTypes: Set<Class<out ContractState>>? = this.contractStateTypes ): FungibleAssetQueryCriteria - LongMethod:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$fun copy( status: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, contractStateTypes: Set<Class<out ContractState>>? = null, stateRefs: List<StateRef>? = null, notary: List<AbstractParty>? = null, softLockingCondition: SoftLockingCondition? = null, timeCondition: TimeCondition? = null, relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, constraintTypes: Set<Vault.ConstraintInfo.Type> = emptySet(), constraints: Set<Vault.ConstraintInfo> = emptySet(), participants: List<AbstractParty>? = null ): VaultQueryCriteria - LongMethod:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$fun copy( status: Vault.StateStatus = this.status, contractStateTypes: Set<Class<out ContractState>>? = this.contractStateTypes, stateRefs: List<StateRef>? = this.stateRefs, notary: List<AbstractParty>? = this.notary, softLockingCondition: SoftLockingCondition? = this.softLockingCondition, timeCondition: TimeCondition? = this.timeCondition ): VaultQueryCriteria - LongMethod:RPCApi.kt$RPCApi.ClientToServer.Companion$fun fromClientMessage(message: ClientMessage): ClientToServer - LongMethod:RPCApi.kt$RPCApi.ServerToClient.Companion$fun fromClientMessage(context: SerializationContext, message: ClientMessage): ServerToClient - LongMethod:RPCClient.kt$RPCClient$fun start( rpcOpsClass: Class<I>, username: String, password: String, externalTrace: Trace? = null, impersonatedActor: Actor? = null, targetLegalIdentity: CordaX500Name? = null ): RPCConnection<I> - LongMethod:RPCClientProxyHandler.kt$RPCClientProxyHandler$ fun start() - LongMethod:RPCClientProxyHandler.kt$RPCClientProxyHandler$ private fun close(notify: Boolean = true) - LongMethod:RPCClientProxyHandler.kt$RPCClientProxyHandler$// The handler for Artemis messages. private fun artemisMessageHandler(message: ClientMessage) - LongMethod:RPCClientProxyHandler.kt$RPCClientProxyHandler$// This is the general function that transforms a client side RPC to internal Artemis messages. override fun invoke(proxy: Any, method: Method, arguments: Array<out Any?>?): Any? - LongMethod:RPCClientProxyHandler.kt$RPCClientProxyHandler$private fun attemptReconnect() - LongMethod:RPCClientProxyHandler.kt$RPCClientProxyHandler$private fun cleanUpOnConnectionLoss() - LongMethod:RPCDriver.kt$RPCDriverDSL$fun <I : RPCOps> startRpcServerWithBrokerRunning( rpcUser: User = rpcTestUser, nodeLegalName: CordaX500Name = fakeNodeLegalName, configuration: RPCServerConfiguration = RPCServerConfiguration.DEFAULT, ops: I, brokerHandle: RpcBrokerHandle, queueDrainTimeout: Duration = 5.seconds ): RpcServerHandle - LongMethod:RPCDriver.kt$RPCDriverDSL$fun startRpcBroker( serverName: String = "driver-rpc-server-${random63BitValue()}", rpcUser: User = rpcTestUser, maxFileSize: Int = MAX_MESSAGE_SIZE, maxBufferedBytesPerClient: Long = 10L * MAX_MESSAGE_SIZE, customPort: NetworkHostAndPort? = null ): CordaFuture<RpcBrokerHandle> - LongMethod:RPCDriver.kt$RPCDriverDSL$private fun startInVmRpcBroker( rpcUser: User = rpcTestUser, maxFileSize: Int = MAX_MESSAGE_SIZE, maxBufferedBytesPerClient: Long = 10L * MAX_MESSAGE_SIZE ): CordaFuture<RpcBrokerHandle> - LongMethod:RPCDriver.kt$RPCDriverDSL.Companion$private fun ConfigurationImpl.configureCommonSettings(maxFileSize: Int, maxBufferedBytesPerClient: Long) - LongMethod:RPCDriver.kt$RandomRpcUser.Companion$@JvmStatic fun main(args: Array<String>) - LongMethod:RPCDriver.kt$fun <A> rpcDriver( isDebug: Boolean = false, driverDirectory: Path = Paths.get("build") / "rpc-driver" / getTimestampAsDirectoryName(), portAllocation: PortAllocation = globalPortAllocation, debugPortAllocation: PortAllocation = globalDebugPortAllocation, systemProperties: Map<String, String> = emptyMap(), useTestClock: Boolean = false, startNodesInProcess: Boolean = false, waitForNodesToFinish: Boolean = false, extraCordappPackagesToScan: List<String> = emptyList(), notarySpecs: List<NotarySpec> = emptyList(), externalTrace: Trace? = null, @Suppress("DEPRECATION") jmxPolicy: JmxPolicy = JmxPolicy(), networkParameters: NetworkParameters = testNetworkParameters(), notaryCustomOverrides: Map<String, Any?> = emptyMap(), inMemoryDB: Boolean = true, cordappsForAllNodes: Collection<TestCordappInternal>? = null, dsl: RPCDriverDSL.() -> A ): A - LongMethod:RPCPerformanceTests.kt$RPCPerformanceTests$ @Test fun `consumption rate`() - LongMethod:RPCPerformanceTests.kt$RPCPerformanceTests$@Test fun `big messages`() - LongMethod:RPCPerformanceTests.kt$RPCPerformanceTests$@Test fun `measure Megabytes per second for simple RPCs`() - LongMethod:RPCPermissionsTests.kt$RPCPermissionsTests$@Test fun `joe user can call different methods matching to a wildcard`() - LongMethod:RPCSecurityManagerImpl.kt$RPCPermissionResolver$override fun resolvePermission(representation: String): Permission - LongMethod:RPCSecurityManagerImpl.kt$RPCSecurityManagerImpl.Companion$// Build internal Shiro securityManager instance private fun buildImpl(config: AuthServiceConfig, cacheFactory: NamedCacheFactory): DefaultSecurityManager - LongMethod:RPCSecurityManagerTest.kt$RPCSecurityManagerTest$private fun checkUserActions(permissions: Set<String>, permitted: Set<List<String>>) - LongMethod:RPCServer.kt$RPCServer$fun start(activeMqServerControl: ActiveMQServerControl) - LongMethod:RPCServer.kt$RPCServer$private fun clientArtemisMessageHandler(artemisMessage: ClientMessage) - LongMethod:RPCStabilityTests.kt$RPCStabilityTests$ @Test fun `server cleans up queues after disconnected clients`() - LongMethod:RPCStabilityTests.kt$RPCStabilityTests$@Test @Ignore // TODO: This is ignored because Artemis slow consumers are broken. I'm not deleting it in case we can get the feature fixed. fun `slow consumers are kicked`() - LongMethod:RPCStabilityTests.kt$RPCStabilityTests$@Test fun `3 server failover`() - LongMethod:RPCStabilityTests.kt$RPCStabilityTests$@Test fun `client cleans up leaked observables`() - LongMethod:RPCStabilityTests.kt$RPCStabilityTests$@Test fun `client reconnects to rebooted server`() - LongMethod:RPCStabilityTests.kt$RPCStabilityTests$@Test fun `connection failover fails, rpc calls throw`() - LongMethod:RPCStabilityTests.kt$RPCStabilityTests$@Test fun `deduplication in the client`() - LongMethod:RPCStabilityTests.kt$RPCStabilityTests$@Test fun `deduplication in the server`() - LongMethod:RPCStabilityTests.kt$RPCStabilityTests$@Test fun `observables error when connection breaks`() - LongMethod:RaftNotaryServiceTests.kt$RaftNotaryServiceTests$@Test fun `detect double spend`() - LongMethod:RaftTransactionCommitLog.kt$RaftTransactionCommitLog$ fun commitTransaction(raftCommit: Commit<Commands.CommitTransaction>): NotaryError? - LongMethod:RaftTransactionCommitLog.kt$RaftTransactionCommitLog$ override fun install(reader: SnapshotReader) - LongMethod:RaftTransactionCommitLog.kt$RaftTransactionCommitLog$ override fun snapshot(writer: SnapshotWriter) - LongMethod:RaftTransactionCommitLogTests.kt$RaftTransactionCommitLogTests$@Test fun `transactions can be re-notarised outside their time window`() - LongMethod:RaftTransactionCommitLogTests.kt$RaftTransactionCommitLogTests$private fun createReplica(myAddress: NetworkHostAndPort, clusterAddress: NetworkHostAndPort? = null): CompletableFuture<Member> - LongMethod:RaftUniquenessProvider.kt$RaftUniquenessProvider$fun start() - LongMethod:RaftUniquenessProvider.kt$RaftUniquenessProvider$override fun commit( states: List<StateRef>, txId: SecureHash, callerIdentity: Party, requestSignature: NotarisationRequestSignature, timeWindow: TimeWindow?, references: List<StateRef> ): CordaFuture<UniquenessProvider.Result> - LongMethod:RaftUniquenessProvider.kt$RaftUniquenessProvider.Companion$fun createMap(cacheFactory: NamedCacheFactory): AppendOnlyPersistentMap<StateRef, Pair<Long, SecureHash>, CommittedState, String> - LongMethod:ReceiveFinalityFlowTest.kt$ReceiveFinalityFlowTest$@Test fun `sent to flow hospital on error and retry on node restart`() - LongMethod:ReceiveTransactionFlow.kt$ReceiveTransactionFlow$@Suppress("KDocMissingDocumentation") @Suspendable @Throws(SignatureException::class, AttachmentResolutionException::class, TransactionResolutionException::class, TransactionVerificationException::class) override fun call(): SignedTransaction - LongMethod:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps.ErrorInterceptingHandler$override fun invoke(proxy: Any, method: Method, args: Array<out Any>?): Any? - LongMethod:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps.ReconnectingRPCConnection$private tailrec fun establishConnectionWithRetry(retryInterval: Duration = 1.seconds, roundRobinIndex: Int = 0): CordaRPCConnection - LongMethod:ReferenceInputStateTests.kt$ReferenceStateTests$@Test fun `Can't use old reference states`() - LongMethod:ReferenceInputStateTests.kt$ReferenceStateTests$@Test fun `create a reference state then refer to it multiple times`() - LongMethod:ReferenceInputStateTests.kt$ReferenceStateTests.ExampleContract$override fun verify(tx: LedgerTransaction) - LongMethod:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$@Test fun `check old ref state is consumed when update used in tx with relevant states`() - LongMethod:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$@Test fun `check ref state is persisted when used in tx with relevant states`() - LongMethod:RemoteSerializerFactory.kt$DefaultRemoteSerializerFactory$private fun getUncached( remoteTypeInformation: RemoteTypeInformation, localTypeInformation: LocalTypeInformation ): AMQPSerializer<Any> - LongMethod:ReplayedList.kt$ReplayedList$override fun sourceChanged(c: ListChangeListener.Change<out A>) - LongMethod:ReplayedListTest.kt$ReplayedListTest$@Test fun addWorks() - LongMethod:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$// DOCSTART 2 private fun makeTransactions(signFirstTX: Boolean = true, withAttachment: SecureHash? = null): Pair<SignedTransaction, SignedTransaction> - LongMethod:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$@Test fun `triangle of transactions resolves fine`() - LongMethod:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$private fun contractUpgradeChain(): SignedTransaction - LongMethod:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$private fun makeLargeTransactionChain(chainLength: Int): SignedTransaction - LongMethod:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$private fun notaryChangeChain(): SignedTransaction - LongMethod:RetryFlowMockTest.kt$RetryFlowMockTest$@Test fun `Restart does not set senderUUID`() - LongMethod:RoundTripObservableSerializerTests.kt$RoundTripObservableSerializerTests$@Test fun roundTripTest1() - LongMethod:RoundTripTests.kt$RoundTripTests$@Test fun canSerializeClassesWithUntypedProperties() - LongMethod:RpcClientObservableDeSerializer.kt$RpcClientObservableDeSerializer$ override fun readObject(obj: Any, schemas: SerializationSchemas, input: DeserializationInput, context: SerializationContext ): Observable<*> - LongMethod:RpcExceptionHandlingTest.kt$RpcExceptionHandlingTest$@Test fun `FlowException is received by the RPC client only if in devMode`() LongMethod:RpcReconnectTests.kt$RpcReconnectTests$ @Test fun `test that the RPC client is able to reconnect and proceed after node failure, restart, or connection reset`() - LongMethod:RpcServerObservableSerializer.kt$RpcServerObservableSerializer$override fun writeDescribedObject( obj: Observable<*>, data: Data, type: Type, output: SerializationOutput, context: SerializationContext ) - LongMethod:RpcSslTest.kt$RpcSslTest$@Test fun `RPC client using ssl is able to run a command`() - LongMethod:RpcSslTest.kt$RpcSslTest$@Test fun `RPC client using ssl will fail if connecting to a node that cannot present a matching certificate`() - LongMethod:RpcSslTest.kt$RpcSslTest$@Test fun `The system RPC user can not connect to the rpc broker without the node's key`() - LongMethod:SSHServerTest.kt$SSHServerTest$@Ignore @Test fun `ssh runs flows`() - LongMethod:SSHServerTest.kt$SSHServerTest$@Test fun `ssh respects permissions`() - LongMethod:SSLHelper.kt$LoggingTrustManagerWrapper$private fun certPathToString(certPath: Array<out X509Certificate>?): String - LongMethod:SSLHelper.kt$internal fun createClientSslHelper(target: NetworkHostAndPort, expectedRemoteLegalNames: Set<CordaX500Name>, keyManagerFactory: KeyManagerFactory, trustManagerFactory: TrustManagerFactory): SslHandler - LongMethod:ScheduledFlowIntegrationTests.kt$ScheduledFlowIntegrationTests$@Test fun `test that when states are being spent at the same time that schedules trigger everything is processed`() - LongMethod:ScheduledFlowTests.kt$ScheduledFlowTests$@Test fun `create and run scheduled flow then wait for result`() - LongMethod:ScheduledFlowTests.kt$ScheduledFlowTests$@Test fun `run a whole batch of scheduled flows`() - LongMethod:ScheduledFlowsDrainingModeTest.kt$ScheduledFlowsDrainingModeTest$@Test fun `flows draining mode ignores scheduled flows until unset`() - LongMethod:SchemaMigration.kt$SchemaMigration$ private fun migrateOlderDatabaseToUseLiquibase(existingCheckpoints: Boolean): Boolean - LongMethod:SchemaMigration.kt$SchemaMigration$private fun doRunMigration(run: Boolean, check: Boolean, existingCheckpoints: Boolean? = null) - LongMethod:SchemaTest.kt$SchemaTest$@Test fun describe_with_nested_properties_does_not_show_sensitive_values() - LongMethod:SchemaTest.kt$SchemaTest$@Test fun describe_with_nested_properties_list_does_not_show_sensitive_values() - LongMethod:SchemaTest.kt$SchemaTest$@Test fun validation_with_nested_properties() - LongMethod:SchemaTest.kt$SchemaTest$@Test fun validation_with_unknown_properties() - LongMethod:SchemaTest.kt$SchemaTest$@Test fun validation_with_wrong_nested_properties() - LongMethod:SendTransactionFlow.kt$DataVendingFlow$@Suspendable override fun call(): Void? - LongMethod:SerializationOutput.kt$SerializationOutput$internal fun <T : Any> _serialize(obj: T, context: SerializationContext): SerializedBytes<T> - LongMethod:SerializationOutputTests.kt$SerializationOutputTests$@Test fun `class constructor is invoked on deserialisation`() - LongMethod:SerializationOutputTests.kt$SerializationOutputTests$@Test fun `test complex throwables serialize`() - LongMethod:SerializationOutputTests.kt$SerializationOutputTests$@Test fun `test suppressed throwables serialize`() - LongMethod:SerializationOutputTests.kt$SerializationOutputTests$@Test fun `test transaction state`() - LongMethod:SerializationOutputTests.kt$SerializationOutputTests$@Test fun isPrimitive() - LongMethod:SerializationOutputTests.kt$SerializationOutputTests$private inline fun <reified T : Any> serdes(obj: T, factory: SerializerFactory = defaultFactory(), freshDeserializationFactory: SerializerFactory = defaultFactory(), expectedEqual: Boolean = true, expectDeserializedEqual: Boolean = true): T - LongMethod:SerializationPropertyOrdering.kt$SerializationPropertyOrdering$@Suppress("UNCHECKED_CAST") @Test fun randomOrderSetter() - LongMethod:SerializationPropertyOrdering.kt$SerializationPropertyOrdering$@Test fun randomOrder() - LongMethod:SerializerFactoryBuilder.kt$SerializerFactoryBuilder$@JvmStatic @DeleteForDJVM fun build( whitelist: ClassWhitelist, carpenterClassLoader: ClassLoader, lenientCarpenterEnabled: Boolean = false, descriptorBasedSerializerRegistry: DescriptorBasedSerializerRegistry = DefaultDescriptorBasedSerializerRegistry(), allowEvolution: Boolean = true, overrideFingerPrinter: FingerPrinter? = null, onlyCustomSerializers: Boolean = false, mustPreserveDataWhenEvolving: Boolean = false): SerializerFactory - LongMethod:SerializerFactoryBuilder.kt$SerializerFactoryBuilder$@JvmStatic @DeleteForDJVM fun build( whitelist: ClassWhitelist, classCarpenter: ClassCarpenter, descriptorBasedSerializerRegistry: DescriptorBasedSerializerRegistry = DefaultDescriptorBasedSerializerRegistry(), allowEvolution: Boolean = true, overrideFingerPrinter: FingerPrinter? = null, onlyCustomSerializers: Boolean = false, mustPreserveDataWhenEvolving: Boolean = false): SerializerFactory - LongMethod:SerializerFactoryBuilder.kt$SerializerFactoryBuilder$private fun makeFactory(whitelist: ClassWhitelist, classCarpenter: ClassCarpenter, descriptorBasedSerializerRegistry: DescriptorBasedSerializerRegistry, allowEvolution: Boolean, overrideFingerPrinter: FingerPrinter?, onlyCustomSerializers: Boolean, mustPreserveDataWhenEvolving: Boolean): SerializerFactory - LongMethod:ServiceHubConcurrentUsageTest.kt$ServiceHubConcurrentUsageTest$@Test fun `operations requiring a transaction work from another thread`() - LongMethod:ServiceHubInternal.kt$ServiceHubInternal.Companion$fun recordTransactions(statesToRecord: StatesToRecord, txs: Collection<SignedTransaction>, validatedTransactions: WritableTransactionStorage, stateMachineRecordedTransactionMapping: StateMachineRecordedTransactionMappingStorage, vaultService: VaultServiceInternal, database: CordaPersistence) - LongMethod:ServicesForResolutionImpl.kt$ServicesForResolutionImpl$// We may need to recursively chase transactions if there are notary changes. fun inner(stateRef: StateRef, forContractClassName: String?): Attachment - LongMethod:SettingsModelTest.kt$SettingsModelTest$@Test fun `test save config and rollback`() - LongMethod:SharedMemoryIncremental.kt$SharedMemoryIncremental$override fun nextPort(): Int - LongMethod:ShutdownManager.kt$ShutdownManager$fun shutdown() - LongMethod:SignatureConstraintMigrationFromHashConstraintsTests.kt$SignatureConstraintMigrationFromHashConstraintsTests$@Test fun `HashConstraint cannot be migrated to SignatureConstraint if a HashConstraint is specified for one state and another uses an AutomaticPlaceholderConstraint`() - LongMethod:SignatureConstraintMigrationFromHashConstraintsTests.kt$SignatureConstraintMigrationFromHashConstraintsTests$@Test fun `can evolve from lower contract class version to higher one`() - LongMethod:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$SignatureConstraintMigrationFromWhitelistConstraintTests$@Test fun `WhitelistConstraint cannot be migrated to SignatureConstraint if platform version is not 4 or greater`() - LongMethod:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$SignatureConstraintMigrationFromWhitelistConstraintTests$@Test fun `auto migration from WhitelistConstraint to SignatureConstraint will only transition states that do not have a constraint specified`() - LongMethod:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$SignatureConstraintMigrationFromWhitelistConstraintTests$@Test fun `auto migration from WhitelistConstraint to SignatureConstraint`() - LongMethod:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$SignatureConstraintMigrationFromWhitelistConstraintTests$@Test fun `can evolve from lower contract class version to higher one`() - LongMethod:SignatureConstraintVersioningTests.kt$ConsumeMessage$@Suspendable override fun call(): SignedTransaction - LongMethod:SignatureConstraintVersioningTests.kt$SignatureConstraintVersioningTests$ fun upgradeCorDappBetweenTransactions( cordapp: CustomCordapp, newCordapp: CustomCordapp, whiteListedCordapps: Map<ContractClassName, List<CustomCordapp>>, systemProperties: Map<String, String>, startNodesInProcess: Boolean, minimumPlatformVersion: Int = 4, specifyExistingConstraint: Boolean = false, addAnotherAutomaticConstraintState: Boolean = false ): Pair<CoreTransaction, CoreTransaction> - LongMethod:SignatureConstraintVersioningTests.kt$SignatureConstraintVersioningTests$private fun DriverDSL.createConsumingTransaction( nodeName: CordaX500Name, cordapp: CustomCordapp, specifyExistingConstraint: Boolean, addAnotherAutomaticConstraintState: Boolean ): SignedTransaction - LongMethod:SignedNodeInfo.kt$SignedNodeInfo$// TODO Add root cert param (or TrustAnchor) to make sure all the identities belong to the same root fun verified(): NodeInfo - LongMethod:SignedNodeInfoTest.kt$SignedNodeInfoTest$private fun createNodeInfoWithSingleIdentity(name: CordaX500Name, nodeKeyPair: KeyPair, identityCertPublicKey: PublicKey): NodeInfo - LongMethod:SignedTransaction.kt$SignedTransaction$// TODO: Verify contract constraints here as well as in LedgerTransaction to ensure that anything being deserialised // from the attachment is trusted. This will require some partial serialisation work to not load the ContractState // objects from the TransactionState. @DeleteForDJVM private fun verifyRegularTransaction(services: ServiceHub, checkSufficientSignatures: Boolean) - LongMethod:SimmFlow.kt$SimmFlow.Receiver$ @Suspendable private fun agreeValuation(portfolio: Portfolio, asOf: LocalDate, valuer: Party): PortfolioValuation - LongMethod:SimmFlow.kt$SimmFlow.Requester$@Suspendable private fun agreeValuation(portfolio: Portfolio, asOf: LocalDate, valuer: Party): PortfolioValuation - LongMethod:SimmValuationTest.kt$SimmValuationTest$@Test fun `runs SIMM valuation demo`() - LongMethod:SinglePartyNotaryService.kt$SinglePartyNotaryService$ @Suspendable open fun commitInputStates( inputs: List<StateRef>, txId: SecureHash, caller: Party, requestSignature: NotarisationRequestSignature, timeWindow: TimeWindow?, references: List<StateRef> ) - LongMethod:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$// The flow's event queue may be non-empty in case it shut down abruptly. We handle outstanding events here. private fun drainFlowEventQueue(flow: Flow) - LongMethod:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$override fun killFlow(id: StateMachineRunId): Boolean - LongMethod:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$override fun retryFlowFromSafePoint(currentState: StateMachineState) - LongMethod:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$override fun start(tokenizableServices: List<Any>) - LongMethod:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$private fun <A> startFlowInternal( invocationContext: InvocationContext, flowLogic: FlowLogic<A>, flowStart: FlowStart, ourIdentity: Party, deduplicationHandler: DeduplicationHandler?, isStartIdempotent: Boolean ): CordaFuture<FlowStateMachine<A>> - LongMethod:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$private fun addAndStartFlow(id: StateMachineRunId, flow: Flow) - LongMethod:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$private fun createFlowFromCheckpoint( id: StateMachineRunId, checkpoint: Checkpoint, isAnyCheckpointPersisted: Boolean, isStartIdempotent: Boolean, initialDeduplicationHandler: DeduplicationHandler? ): Flow - LongMethod:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$private fun onExistingSessionMessage(sessionMessage: ExistingSessionMessage, deduplicationHandler: DeduplicationHandler, sender: Party) - LongMethod:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$private fun onSessionInit(sessionMessage: InitialSessionMessage, sender: Party, event: ExternalEvent.ExternalMessageEvent) - LongMethod:StabilityTest.kt$StabilityTest$fun crossCashTest(replication: Int) - LongMethod:StabilityTest.kt$StabilityTest$fun selfIssueTest(replication: Int) - LongMethod:StaffedFlowHospital.kt$StaffedFlowHospital$ fun flowErrored(flowFiber: FlowFiber, currentState: StateMachineState, errors: List<Throwable>) - LongMethod:StaffedFlowHospital.kt$StaffedFlowHospital$ fun sessionInitErrored(sessionMessage: InitialSessionMessage, sender: Party, event: ExternalEvent.ExternalMessageEvent, error: Throwable) - LongMethod:StandaloneShell.kt$StandaloneShell$override fun runProgram(): Int - LongMethod:StandaloneShellArgsParserTest.kt$StandaloneShellArgsParserTest$@Test fun args_to_config() - LongMethod:StandaloneShellArgsParserTest.kt$StandaloneShellArgsParserTest$@Test fun cmd_options_override_config_from_file() - LongMethod:StandaloneShellArgsParserTest.kt$StandaloneShellArgsParserTest$@Test fun cmd_options_to_config_from_file() - LongMethod:StartedFlowTransition.kt$StartedFlowTransition$override fun transition(): TransitionResult - LongMethod:StartedFlowTransition.kt$StartedFlowTransition$private fun TransitionBuilder.sendInitialSessionMessagesIfNeeded(sourceSessions: Set<SessionId>) - LongMethod:StartedFlowTransition.kt$StartedFlowTransition$private fun TransitionBuilder.sendToSessionsTransition(sourceSessionIdToMessage: Map<SessionId, SerializedBytes<Any>>) - LongMethod:StartedFlowTransition.kt$StartedFlowTransition$private fun collectEndedEmptySessionErrors(sessionIds: Collection<SessionId>, checkpoint: Checkpoint): List<Throwable> - LongMethod:StartedFlowTransition.kt$StartedFlowTransition$private fun collectRelevantErrorsToThrow(flowIORequest: FlowIORequest<*>, checkpoint: Checkpoint): List<Throwable> - LongMethod:StartedFlowTransition.kt$StartedFlowTransition$private fun pollSessionMessages(sessions: SessionMap, sessionIds: Set<SessionId>): PollResult? - LongMethod:StartedFlowTransition.kt$StartedFlowTransition$private fun sendAndReceiveTransition(flowIORequest: FlowIORequest.SendAndReceive): TransitionResult - LongMethod:StateMachineState.kt$Checkpoint.Companion$fun create( invocationContext: InvocationContext, flowStart: FlowStart, flowLogicClass: Class<FlowLogic<*>>, frozenFlowLogic: SerializedBytes<FlowLogic<*>>, ourIdentity: Party, subFlowVersion: SubFlowVersion, isEnabledTimedFlow: Boolean ): Try<Checkpoint> - LongMethod:StatusTransitions.kt$StatusTransitions$ fun verify(tx: LedgerTransaction) - LongMethod:StatusTransitionsTest.kt$StatusTransitionsTest$@Test fun `basic correct cases`() - LongMethod:StatusTransitionsTest.kt$StatusTransitionsTest$@Test fun `role change signer correct`() - LongMethod:StringToMethodCallParser.kt$StringToMethodCallParser$ @Throws(UnparseableCallException::class) fun parse(target: T?, command: String): ParsedMethodCall - LongMethod:StringToMethodCallParser.kt$StringToMethodCallParser$ @Throws(UnparseableCallException::class) fun parseArguments(methodNameHint: String, parameters: List<Pair<String, Type>>, args: String): Array<Any?> - LongMethod:StructuresTests.kt$AttachmentTest$@Test fun `openAsJAR does not leak file handle if attachment has corrupted manifest`() - LongMethod:SwapDataView.kt$fun SwapData.toView(viewingParty: Party, portfolio: Portfolio? = null, presentValue: MultiCurrencyAmount? = null, IM: InitialMarginTriple? = null): SwapDataView - LongMethod:SwapExample.kt$SwapExample$fun main(@Suppress("UNUSED_PARAMETER") args: Array<String>) - LongMethod:SwapExample.kt$SwapExample$fun testingEqualitymain(@Suppress("UNUSED_PARAMETER") args: Array<String>) - LongMethod:SwapIdentitiesFlow.kt$SwapIdentitiesFlow$@Suspendable override fun call(): LinkedHashMap<Party, AnonymousParty> - LongMethod:SwapIdentitiesFlowTests.kt$SwapIdentitiesFlowTests$@Test fun `issue key`() - LongMethod:TLSAuthenticationTests.kt$TLSAuthenticationTests$private fun buildTLSFactories( rootCAScheme: SignatureScheme, intermediateCAScheme: SignatureScheme, client1CAScheme: SignatureScheme, client1TLSScheme: SignatureScheme, client2CAScheme: SignatureScheme, client2TLSScheme: SignatureScheme ): Pair<SSLServerSocketFactory, SSLSocketFactory> - LongMethod:TLSAuthenticationTests.kt$TLSAuthenticationTests$private fun buildTLSSockets( serverSocketFactory: SSLServerSocketFactory, clientSocketFactory: SSLSocketFactory, serverPort: Int = 0, // Use 0 to get first free socket. clientPort: Int = 0, // Use 0 to get first free socket. cipherSuitesServer: Array<String> = CORDA_TLS_CIPHER_SUITES, cipherSuitesClient: Array<String> = CORDA_TLS_CIPHER_SUITES ): Pair<SSLServerSocket, SSLSocket> - LongMethod:TLSAuthenticationTests.kt$TLSAuthenticationTests$private fun testConnect(serverSocket: ServerSocket, clientSocket: SSLSocket, expectedCipherSuite: String) - LongMethod:TestCommsFlow.kt$TestCommsFlowInitiator$@Suspendable override fun call(): List<String> - LongMethod:TestDSL.kt$TestLedgerDSLInterpreter$override fun verifies(): EnforceVerifyOrFail - LongMethod:TestDSL.kt$TestLedgerDSLInterpreter$private fun <R> recordTransactionWithTransactionMap( transactionLabel: String?, transactionBuilder: TransactionBuilder, dsl: TestTransactionDSLInterpreter.() -> R, transactionMap: HashMap<SecureHash, WireTransactionWithLocation> = HashMap(), /** If set to true, will add dummy components to [transactionBuilder] to make it valid. */ fillTransaction: Boolean ): WireTransaction - LongMethod:TestNotaryFlow.kt$TestNotaryFlow$@Suspendable override fun call(): String - LongMethod:ThrowableSerializer.kt$ThrowableSerializer$override fun fromProxy(proxy: ThrowableProxy): Throwable - LongMethod:TimedFlowTests.kt$TimedFlowTests$@Test fun `timed flow can update its ETA`() - LongMethod:TimedFlowTests.kt$TimedFlowTests$@Test fun `timed flow cannot update its ETA to less than default`() - LongMethod:TimedFlowTests.kt$TimedFlowTests.Companion$private fun startClusterAndNode(mockNet: InternalMockNetwork): Triple<Party, TestStartedNode, TestStartedNode> - LongMethod:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest$@Test fun testClientServerTlsExchange() - LongMethod:ToggleFieldTest.kt$ToggleFieldTest$ @Test fun `leaked thread propagates holder to non-global thread, with warning`() - LongMethod:ToggleFieldTest.kt$ToggleFieldTest$@Test fun `inherited values are poisoned on clear`() - LongMethod:TopLevelTransition.kt$TopLevelTransition$private fun enterSubFlowTransition(event: Event.EnterSubFlow): TransitionResult - LongMethod:TopLevelTransition.kt$TopLevelTransition$private fun flowFinishTransition(event: Event.FlowFinish): TransitionResult - LongMethod:TopLevelTransition.kt$TopLevelTransition$private fun leaveSubFlowTransition(): TransitionResult - LongMethod:TopLevelTransition.kt$TopLevelTransition$private fun suspendTransition(event: Event.Suspend): TransitionResult - LongMethod:TraderDemo.kt$TraderDemo$fun main(args: Array<String>) - LongMethod:TraderDemoClientApi.kt$TraderDemoClientApi$fun runIssuer(amount: Amount<Currency>, buyerName: CordaX500Name, sellerName: CordaX500Name) - LongMethod:TraderDemoTest.kt$TraderDemoTest$@Test fun `Test restart node during flow works properly`() - LongMethod:TraderDemoTest.kt$TraderDemoTest$@Test fun `runs trader demo`() - LongMethod:TransactionBuilder.kt$TransactionBuilder$ private fun addMissingDependency(services: ServicesForResolution, wireTx: WireTransaction): Boolean - LongMethod:TransactionBuilder.kt$TransactionBuilder$ private fun handleContract( contractClassName: ContractClassName, inputStates: List<TransactionState<ContractState>>?, outputStates: List<TransactionState<ContractState>>?, explicitContractAttachment: AttachmentId?, services: ServicesForResolution ): Pair<AttachmentId, List<TransactionState<ContractState>>?> - LongMethod:TransactionBuilder.kt$TransactionBuilder$ private fun resolveStatePointers(transactionState: TransactionState<*>) - LongMethod:TransactionBuilder.kt$TransactionBuilder$ private fun selectAttachmentConstraint( contractClassName: ContractClassName, inputStates: List<TransactionState<ContractState>>?, attachmentToUse: ContractAttachment, services: ServicesForResolution): AttachmentConstraint - LongMethod:TransactionBuilder.kt$TransactionBuilder$ private fun selectContractAttachmentsAndOutputStateConstraints( services: ServicesForResolution, serializationContext: SerializationContext?): Pair<Collection<SecureHash>, List<TransactionState<ContractState>>> - LongMethod:TransactionBuilder.kt$TransactionBuilder$@CordaInternal internal fun toWireTransactionWithContext(services: ServicesForResolution, serializationContext: SerializationContext? = null): WireTransaction - LongMethod:TransactionBuilder.kt$TransactionBuilder$private fun addMissingAttachment(missingClass: String, services: ServicesForResolution, originalException: Throwable): Boolean - LongMethod:TransactionBuilderTest.kt$TransactionBuilderTest$@Before fun setup() - LongMethod:TransactionBuilderTest.kt$TransactionBuilderTest$@Test fun `automatic signature constraint`() - LongMethod:TransactionDataModel.kt$PartiallyResolvedTransaction.Companion$fun fromSignedTransaction( transaction: SignedTransaction, inputTransactions: Map<StateRef, SignedTransaction?> ): PartiallyResolvedTransaction - LongMethod:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$@Test fun `correct encumbrance state must be provided`() - LongMethod:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$@Test fun `encumbered states cannot be assigned to different notaries`() - LongMethod:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$@Test fun `non bi-directional encumbrance will fail`() - LongMethod:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$@Test fun `states must be bi-directionally encumbered`() - LongMethod:TransactionGenerator.kt$TransactionGenerator$fun writeFailure(output: OutputStream) - LongMethod:TransactionGenerator.kt$TransactionGenerator$fun writeSuccess(output: OutputStream) - LongMethod:TransactionOrderingTests.kt$TransactionOrderingTests$@Test fun `Out of order transactions are recorded in vault correctly`() - LongMethod:TransactionSignatureTest.kt$TransactionSignatureTest$@Test fun `Verify multi-tx signature`() - LongMethod:TransactionTests.kt$TransactionTests$@Test fun `general transactions cannot change notary`() - LongMethod:TransactionTests.kt$TransactionTests$@Test fun `signed transaction missing signatures - CompositeKey`() - LongMethod:TransactionTests.kt$TransactionTests$@Test fun `signed transaction missing signatures`() - LongMethod:TransactionTests.kt$TransactionTests$@Test fun `transactions with no inputs can have any notary`() - LongMethod:TransactionUtils.kt$ fun <T : Any> deserialiseComponentGroup(componentGroups: List<ComponentGroup>, clazz: KClass<T>, groupEnum: ComponentGroupEnum, forceDeserialize: Boolean = false, factory: SerializationFactory = SerializationFactory.defaultFactory, context: SerializationContext = factory.defaultContext): List<T> - LongMethod:TransactionUtils.kt$ fun createComponentGroups(inputs: List<StateRef>, outputs: List<TransactionState<ContractState>>, commands: List<Command<*>>, attachments: List<SecureHash>, notary: Party?, timeWindow: TimeWindow?, references: List<StateRef>, networkParametersHash: SecureHash?): List<ComponentGroup> - LongMethod:TransactionUtils.kt$ fun deserialiseCommands(componentGroups: List<ComponentGroup>, forceDeserialize: Boolean = false, factory: SerializationFactory = SerializationFactory.defaultFactory, context: SerializationContext = factory.defaultContext): List<Command<*>> - LongMethod:TransactionUtils.kt$ fun isAttachmentTrusted(attachment: Attachment, service: AttachmentStorage?): Boolean - LongMethod:TransactionVerifierServiceInternal.kt$Verifier$ private fun verifyConstraintsValidity(contractAttachmentsByContract: Map<ContractClassName, ContractAttachment>) - LongMethod:TransactionVerifierServiceInternal.kt$Verifier$ private fun verifyContracts() - LongMethod:TransactionVerifierServiceInternal.kt$Verifier$// Using basic graph theory, a full cycle of encumbered (co-dependent) states should exist to achieve bi-directional // encumbrances. This property is important to ensure that no states involved in an encumbrance-relationship // can be spent on their own. Briefly, if any of the states is having more than one encumbrance references by // other states, a full cycle detection will fail. As a result, all of the encumbered states must be present // as "from" and "to" only once (or zero times if no encumbrance takes place). For instance, // a -> b // c -> b and a -> b // b -> a b -> c // do not satisfy the bi-directionality (full cycle) property. // // In the first example "b" appears twice in encumbrance ("to") list and "c" exists in the encumbered ("from") list only. // Due the above, one could consume "a" and "b" in the same transaction and then, because "b" is already consumed, "c" cannot be spent. // // Similarly, the second example does not form a full cycle because "a" and "c" exist in one of the lists only. // As a result, one can consume "b" and "c" in the same transactions, which will make "a" impossible to be spent. // // On other hand the following are valid constructions: // a -> b a -> c // b -> c and c -> b // c -> a b -> a // and form a full cycle, meaning that the bi-directionality property is satisfied. private fun checkBidirectionalOutputEncumbrances(statesAndEncumbrance: List<Pair<Int, Int>>) - LongMethod:TransactionViewer.kt$TransactionViewer.ContractStatesView$private fun getCell(contractState: StateAndRef<ContractState>): Node - LongMethod:TransformsSchema.kt$TransformsSchema$@Suppress("NAME_SHADOWING") override fun toString(): String - LongMethod:TransformsSchema.kt$TransformsSchema.Companion$ override fun newInstance(described: Any?): TransformsSchema - LongMethod:TransitionDiagnosticRecord.kt$TransitionDiagnosticRecord$override fun toString(): String - LongMethod:TransitionExecutorImpl.kt$TransitionExecutorImpl$@Suspendable override fun executeTransition( fiber: FlowFiber, previousState: StateMachineState, event: Event, transition: TransitionResult, actionExecutor: ActionExecutor ): Pair<FlowContinuation, StateMachineState> - LongMethod:TutorialContract.kt$CommercialPaper$// DOCSTART 3 override fun verify(tx: LedgerTransaction) - LongMethod:TutorialTestDSL.kt$TutorialTestDSL$// DOCSTART 10 @Test fun `chain commercial tweak`() - LongMethod:TutorialTestDSL.kt$TutorialTestDSL$// DOCSTART 8 @Test fun `chain commercial paper`() - LongMethod:TutorialTestDSL.kt$TutorialTestDSL$// DOCSTART 9 @Test fun `chain commercial paper double spend`() - LongMethod:TwoPartyDealFlow.kt$TwoPartyDealFlow.Secondary$@Suspendable override fun call(): SignedTransaction - LongMethod:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$@Test fun `check dependencies of sale asset are resolved`() - LongMethod:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$@Test fun `shutdown and restore`() - LongMethod:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$@Test fun `track works`() - LongMethod:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$@Test fun `trade cash for commercial paper`() - LongMethod:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$@Test(expected = InsufficientBalanceException::class) fun `trade cash for commercial paper fails using soft locking`() - LongMethod:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$private fun LedgerDSL<TestTransactionDSLInterpreter, TestLedgerDSLInterpreter>.fillUpForBuyerAndInsertFakeTransactions( withError: Boolean, issuer: PartyAndReference, owner: AbstractParty, notary: Party, node: TestStartedNode, identity: Party, notaryNode: TestStartedNode, vararg extraSigningNodes: TestStartedNode ): Triple<Vault<ContractState>, List<WireTransaction>, Map<SecureHash,SignedTransaction>> - LongMethod:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$private fun LedgerDSL<TestTransactionDSLInterpreter, TestLedgerDSLInterpreter>.fillUpForSeller( withError: Boolean, issuer: PartyAndReference, owner: AbstractParty, amount: Amount<Issued<Currency>>, attachmentID: SecureHash?, notary: Party): Pair<Vault<ContractState>, List<WireTransaction>> - LongMethod:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$private fun LedgerDSL<TestTransactionDSLInterpreter, TestLedgerDSLInterpreter>.runWithError( bobError: Boolean, aliceError: Boolean, expectedMessageSubstring: String ) - LongMethod:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$private fun insertFakeTransactions( wtxToSign: List<WireTransaction>, node: TestStartedNode, identity: Party, notaryNode: TestStartedNode, vararg extraSigningNodes: TestStartedNode): Map<SecureHash, SignedTransaction> - LongMethod:TypeLoader.kt$ClassCarpentingTypeLoader$override fun load( remoteTypeInformation: Collection<RemoteTypeInformation>, context: SerializationContext ): Map<TypeIdentifier, Type> - LongMethod:TypeModellingFingerPrinter.kt$FingerPrintingState$// For a type we haven't seen before, determine the correct path depending on the type of type it is. private fun fingerprintNewType(type: LocalTypeInformation) - LongMethod:TypeParameterUtils.kt$ private fun inferTypeVariables(actualClass: Class<*>, declaredClass: Class<*>, declaredType: ParameterizedType): Type? - LongMethod:UniversalContract.kt$UniversalContract$fun evalBigDecimal(tx: LedgerTransaction, expr: Perceivable<BigDecimal>): BigDecimal - LongMethod:UniversalContract.kt$UniversalContract$override fun verify(tx: LedgerTransaction) - LongMethod:UnstartedFlowTransition.kt$UnstartedFlowTransition$// Initialise initiated session, store initial payload, send confirmation back. private fun TransitionBuilder.initialiseInitiatedSession(flowStart: FlowStart.Initiated) - LongMethod:Util.kt$fun <T> debugCompare(perLeft: Perceivable<T>, perRight: Perceivable<T>) - LongMethod:Util.kt$fun debugCompare(arrLeft: Arrangement, arrRight: Arrangement) - LongMethod:V1NodeConfigurationSpec.kt$V1NodeConfigurationSpec$override fun parseValid(configuration: Config): Validated<NodeConfiguration, Configuration.Validation.Error> - LongMethod:ValidatingNotaryServiceTests.kt$ValidatingNotaryServiceTests$@Test fun `should re-sign a transaction with an expired time-window`() - LongMethod:ValidatingNotaryServiceTests.kt$ValidatingNotaryServiceTests$@Test fun `should reject transaction without network parameters`() - LongMethod:ValidatingNotaryServiceTests.kt$ValidatingNotaryServiceTests$@Test fun `should report conflict when inputs are reused across transactions`() - LongMethod:ValidatingNotaryServiceTests.kt$ValidatingNotaryServiceTests$@Test fun `should sign identical transaction multiple times (notarisation is idempotent)`() - LongMethod:VaultFiller.kt$VaultFiller$ fun fillWithSomeTestCash(howMuch: Amount<Currency>, issuerServices: ServiceHub, atLeastThisManyStates: Int, atMostThisManyStates: Int, issuedBy: PartyAndReference, owner: AbstractParty? = null, rng: Random? = null, statesToRecord: StatesToRecord = StatesToRecord.ONLY_RELEVANT): Vault<Cash.State> - LongMethod:VaultFiller.kt$VaultFiller$@JvmOverloads fun fillWithSomeTestDeals(dealIds: List<String>, issuerServices: ServiceHub = services, participants: List<AbstractParty> = emptyList(), includeMe: Boolean = true): Vault<DealState> - LongMethod:VaultFiller.kt$VaultFiller$@JvmOverloads fun fillWithSomeTestLinearAndDealStates(numberToCreate: Int, externalId: String? = null, participants: List<AbstractParty> = emptyList(), linearString: String = "", linearNumber: Long = 0L, linearBoolean: Boolean = false, linearTimestamp: Instant = now()): Vault<LinearState> - LongMethod:VaultFiller.kt$VaultFiller$@JvmOverloads fun fillWithSomeTestLinearStates(numberToCreate: Int, externalId: String? = null, participants: List<AbstractParty> = emptyList(), uniqueIdentifier: UniqueIdentifier? = null, linearString: String = "", linearNumber: Long = 0L, linearBoolean: Boolean = false, linearTimestamp: Instant = now(), constraint: AttachmentConstraint = AutomaticPlaceholderConstraint, includeMe: Boolean = true): Vault<LinearState> - LongMethod:VaultFiller.kt$VaultFiller.Companion$fun calculateRandomlySizedAmounts(howMuch: Amount<Currency>, min: Int, max: Int, rng: Random): LongArray - LongMethod:VaultQueryTests.kt$VaultQueryTests$ @Test fun trackCashStates_unconsumed() - LongMethod:VaultQueryTests.kt$VaultQueryTests$@Test fun `track by of contract state interface returns updates of all states`() - LongMethod:VaultQueryTests.kt$VaultQueryTests$@Test fun `track by of super class only returns updates of sub classes of tracked type`() - LongMethod:VaultQueryTests.kt$VaultQueryTests$@Test fun `track by only returns updates of tracked type`() - LongMethod:VaultQueryTests.kt$VaultQueryTests$@Test fun trackCashStates_all() - LongMethod:VaultQueryTests.kt$VaultQueryTests$@Test fun trackCashStates_consumed() - LongMethod:VaultQueryTests.kt$VaultQueryTests$@Test fun trackDealStates() - LongMethod:VaultQueryTests.kt$VaultQueryTests$@Test fun trackLinearStates() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$ // specifying Query on Commercial Paper contract state attributes @Test fun `custom query using JPA - commercial paper schema V1 single attribute`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$// specifying Query on Commercial Paper contract state attributes @Test fun `custom query using JPA - commercial paper schema V1 - multiple attributes`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$// specifying Query on Linear state attributes @Test fun `unconsumed linear heads for linearId between two timestamps for a given external id`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$// test paging with aggregate function and group by clause @Test fun `test paging with aggregate function and group by clause`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `aggregate functions count by contract type and state status`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `aggregate functions sum by issuer and currency and sort by aggregate sum`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `aggregate functions with single group clause`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `aggregate functions without group clause`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `composite query for fungible and linear states for multiple participants`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `composite query for fungible and linear states`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `query by contract states constraint type and data`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `query by contract states constraint type`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `query with sort criteria works even when multiple pages have the same value for the sort criteria field`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `query with sort criteria works with pagination`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `state relevancy queries`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `unconsumed cash states sorted by state ref txnId and index`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `unconsumed cash states sorted by state ref`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `unconsumed fungible assets for selected issuer parties`() - LongMethod:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `unconsumed states with soft locking`() - LongMethod:VaultRestartTest.kt$VaultRestartTest$@Test fun `restart and query vault after adding some cash states`() - LongMethod:VaultStateMigration.kt$VaultStateMigration$override fun execute(database: Database?) - LongMethod:VaultStateMigrationTest.kt$VaultStateMigrationTest$// Used to generate a persistent database for further testing. @Test @Ignore fun `Create persistent DB`() - LongMethod:VaultStateMigrationTest.kt$VaultStateMigrationTest$@Test fun `Check state fields are correct`() - LongMethod:VaultStateMigrationTest.kt$VaultStateMigrationTest$@Test fun `State with non-owning key for our name marked as relevant`() - LongMethod:VaultStateMigrationTest.kt$VaultStateMigrationTest$private fun addNetworkParameters() - LongMethod:VaultWithCashTest.kt$VaultWithCashTest$@Test fun `consuming multiple contract state types`() - LongMethod:VaultWithCashTest.kt$VaultWithCashTest$@Test fun `issue and attempt double spend`() - LongMethod:VaultWithCashTest.kt$VaultWithCashTest$@Test fun `issue and spend total correctly and irrelevant ignored`() - LongMethod:VaultWithCashTest.kt$VaultWithCashTest$@Test fun `sequencing LinearStates works`() - LongMethod:VaultWithCashTest.kt$VaultWithCashTest$@Test fun `spending cash in vault of mixed state types works`() - LongMethod:VirtualCordapps.kt$VirtualCordapp$ fun generateBFTSmartNotary(versionInfo: VersionInfo): CordappImpl - LongMethod:VirtualCordapps.kt$VirtualCordapp$ fun generateCore(versionInfo: VersionInfo): CordappImpl - LongMethod:VirtualCordapps.kt$VirtualCordapp$ fun generateRaftNotary(versionInfo: VersionInfo): CordappImpl - LongMethod:VirtualCordapps.kt$VirtualCordapp$ fun generateSimpleNotary(versionInfo: VersionInfo): CordappImpl - LongMethod:WebServer.kt$WebServer$@Throws(IOException::class) fun open(config: NodeConfigWrapper): CordaFuture<URI> - LongMethod:WebServer.kt$fun main(args: Array<String>) - LongMethod:WhitelistGenerator.kt$fun generateWhitelist(networkParameters: NetworkParameters?, excludeContracts: List<ContractClassName>, cordappJars: List<ContractsJar>, includeContracts: List<ContractClassName>, optionalCordappJars: List<ContractsJar>): Map<ContractClassName, List<AttachmentId>> - LongMethod:WireTransaction.kt$WireTransaction$@DeleteForDJVM override fun toString(): String - LongMethod:WireTransaction.kt$WireTransaction$private fun toLedgerTransactionInternal( resolveIdentity: (PublicKey) -> Party?, resolveAttachment: (SecureHash) -> Attachment?, resolveStateRefAsSerialized: (StateRef) -> SerializedBytes<TransactionState<ContractState>>?, resolveParameters: (SecureHash?) -> NetworkParameters?, resolveContractAttachment: (StateRef) -> Attachment, isAttachmentTrusted: (Attachment) -> Boolean ): LedgerTransaction - LongMethod:WireTransaction.kt$WireTransaction.Companion$ @CordaInternal fun resolveStateRefBinaryComponent(stateRef: StateRef, services: ServicesForResolution): SerializedBytes<TransactionState<ContractState>>? - LongMethod:WithReferencedStatesFlow.kt$WithReferencedStatesFlow$@Suspendable override fun call(): T - LongMethod:WorkflowTransactionBuildTutorial.kt$RecordCompletionFlow$@Suspendable override fun call() - LongMethod:WorkflowTransactionBuildTutorial.kt$SubmitCompletionFlow$@Suspendable override fun call(): StateAndRef<TradeApprovalContract.State> - LongMethod:WorkflowTransactionBuildTutorial.kt$TradeApprovalContract$ override fun verify(tx: LedgerTransaction) - LongMethod:WorkflowTransactionBuildTutorialTest.kt$WorkflowTransactionBuildTutorialTest$@Test fun `Run workflow to completion`() - LongMethod:X509NameConstraintsTest.kt$X509NameConstraintsTest$@Test fun `illegal common name`() - LongMethod:X509NameConstraintsTest.kt$X509NameConstraintsTest$@Test fun `x500 name with correct cn and extra attribute`() - LongMethod:X509NameConstraintsTest.kt$X509NameConstraintsTest$private fun makeKeyStores(subjectName: X500Name, nameConstraints: NameConstraints): Pair<X509KeyStore, X509KeyStore> - LongMethod:X509Utilities.kt$X509Utilities$ @JvmStatic fun createCertificate(certificateType: CertificateType, issuerCertificate: X509Certificate, issuerKeyPair: KeyPair, subject: X500Principal, subjectPublicKey: PublicKey, validityWindow: Pair<Duration, Duration> = DEFAULT_VALIDITY_WINDOW, nameConstraints: NameConstraints? = null, crlDistPoint: String? = null, crlIssuer: X500Name? = null): X509Certificate - LongMethod:X509Utilities.kt$X509Utilities$ fun createCertificate(certificateType: CertificateType, issuer: X500Principal, issuerKeyPair: KeyPair, subject: X500Principal, subjectPublicKey: PublicKey, validityWindow: Pair<Date, Date>, nameConstraints: NameConstraints? = null, crlDistPoint: String? = null, crlIssuer: X500Name? = null): X509Certificate - LongMethod:X509Utilities.kt$X509Utilities$ fun createPartialCertificate(certificateType: CertificateType, issuer: X500Principal, issuerPublicKey: PublicKey, subject: X500Principal, subjectPublicKey: PublicKey, validityWindow: Pair<Date, Date>, nameConstraints: NameConstraints? = null, crlDistPoint: String? = null, crlIssuer: X500Name? = null): X509v3CertificateBuilder - LongMethod:X509UtilitiesTest.kt$X509UtilitiesTest$@Test fun `create server cert and use in SSL socket`() - LongMethod:X509UtilitiesTest.kt$X509UtilitiesTest$@Test fun `create server certificate in keystore for SSL`() - LongMethod:X509UtilitiesTest.kt$X509UtilitiesTest$private fun createValidServerCertIncludeCRL(signatureSchemeRoot: SignatureScheme, signatureSchemeChild: SignatureScheme) - LongMethod:ZeroCouponBond.kt$ZeroCouponBond$@Test fun move() LongParameterList:AMQPSerializer.kt$AMQPSerializer$(obj: Any, data: Data, type: Type, output: SerializationOutput, context: SerializationContext, debugIndent: Int = 0) LongParameterList:AbstractCashSelection.kt$AbstractCashSelection$(connection: Connection, amount: Amount<Currency>, lockId: UUID, notary: Party?, onlyFromIssuerParties: Set<AbstractParty>, withIssuerRefs: Set<OpaqueBytes>, withResultSet: (ResultSet) -> Boolean) LongParameterList:AbstractCashSelection.kt$AbstractCashSelection$(services: ServiceHub, amount: Amount<Currency>, lockId: UUID, notary: Party?, onlyFromIssuerParties: Set<AbstractParty>, withIssuerRefs: Set<OpaqueBytes>, stateAndRefs: MutableList<StateAndRef<Cash.State>>) @@ -1915,7 +810,7 @@ LongParameterList:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$(port: Int, name: CordaX500Name = ALICE_NAME, crlCheckSoftFail: Boolean, nodeCrlDistPoint: String = "http://${server.hostAndPort}/crl/node.crl", tlsCrlDistPoint: String? = "http://${server.hostAndPort}/crl/empty.crl", maxMessageSize: Int = MAX_MESSAGE_SIZE) LongParameterList:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests.Companion$(clrServer: CrlServer, signatureAlgorithm: String, caCertificate: X509Certificate, caPrivateKey: PrivateKey, endpoint: String, indirect: Boolean, vararg serialNumbers: BigInteger) LongParameterList:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$(baseDirectory: Path, certificatesDirectoryName: String = DEFAULT_CERTIFICATES_DIRECTORY_NAME, keyStoreFileName: String = KeyStore.DEFAULT_STORE_FILE_NAME, keyStorePassword: String = KeyStore.DEFAULT_STORE_PASSWORD, keyPassword: String = keyStorePassword, trustStoreFileName: String = TrustStore.DEFAULT_STORE_FILE_NAME, trustStorePassword: String = TrustStore.DEFAULT_STORE_PASSWORD) - LongParameterList:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$(certificatesDirectory: Path, keyStoreFileName: String = KeyStore.DEFAULT_STORE_FILE_NAME, keyStorePassword: String = KeyStore.DEFAULT_STORE_PASSWORD, keyPassword: String = keyStorePassword, trustStoreFileName: String = TrustStore.DEFAULT_STORE_FILE_NAME, trustStorePassword: String = TrustStore.DEFAULT_STORE_PASSWORD, trustStoreKeyPassword: String = TrustStore.DEFAULT_KEY_PASSWORD, useOpenSsl: Boolean = false) + LongParameterList:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$(certificatesDirectory: Path, keyStoreFileName: String = KeyStore.DEFAULT_STORE_FILE_NAME, keyStorePassword: String = KeyStore.DEFAULT_STORE_PASSWORD, keyPassword: String = keyStorePassword, trustStoreFileName: String = TrustStore.DEFAULT_STORE_FILE_NAME, trustStorePassword: String = TrustStore.DEFAULT_STORE_PASSWORD, trustStoreKeyPassword: String = TrustStore.DEFAULT_KEY_PASSWORD, @Suppress("UNUSED_PARAMETER") useOpenSsl: Boolean = false) LongParameterList:ContractAttachment.kt$ContractAttachment.Companion$(attachment: Attachment, contract: ContractClassName, additionalContracts: Set<ContractClassName> = emptySet(), uploader: String? = null, signerKeys: List<PublicKey> = emptyList(), version: Int = DEFAULT_CORDAPP_VERSION) LongParameterList:ContractFunctions.kt$(expiry: String, notional: BigDecimal, strike: BigDecimal, foreignCurrency: Currency, domesticCurrency: Currency, partyA: Party, partyB: Party) LongParameterList:ContractFunctions.kt$(expiry: String, notional: Long, strike: Double, foreignCurrency: Currency, domesticCurrency: Currency, partyA: Party, partyB: Party) @@ -1923,7 +818,7 @@ LongParameterList:ContractJarTestUtils.kt$ContractJarTestUtils$(workingDir: Path, contractNames: List<String>, signed: Boolean = false, version: Int = 1, generateManifest: Boolean = true, jarFileName : String? = null) LongParameterList:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction$( inputs: List<StateAndRef<ContractState>> = this.inputs, notary: Party = this.notary, legacyContractAttachment: Attachment = this.legacyContractAttachment, upgradedContractClassName: ContractClassName = this.upgradedContract::class.java.name, upgradedContractAttachment: Attachment = this.upgradedContractAttachment, id: SecureHash = this.id, privacySalt: PrivacySalt = this.privacySalt, sigs: List<TransactionSignature> = this.sigs, networkParameters: NetworkParameters = this.networkParameters ) LongParameterList:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction.Companion$( inputs: List<StateAndRef<ContractState>>, notary: Party, legacyContractAttachment: Attachment, upgradedContractAttachment: Attachment, id: SecureHash, privacySalt: PrivacySalt, sigs: List<TransactionSignature>, networkParameters: NetworkParameters, upgradedContract: UpgradedContract<ContractState, *> ) - LongParameterList:CordaRPCClient.kt$CordaRPCClient$(username: String, password: String, externalTrace: Trace?, impersonatedActor: Actor?, targetLegalIdentity: CordaX500Name?, gracefulReconnect: Boolean = false) + LongParameterList:CordaRPCClient.kt$CordaRPCClient$(username: String, password: String, externalTrace: Trace?, impersonatedActor: Actor?, targetLegalIdentity: CordaX500Name?, gracefulReconnect: GracefulReconnect? = null) LongParameterList:CordaRPCClient.kt$CordaRPCClientConfiguration$( connectionMaxRetryInterval: Duration = this.connectionMaxRetryInterval, minimumServerProtocolVersion: Int = this.minimumServerProtocolVersion, trackRpcCallSites: Boolean = this.trackRpcCallSites, reapInterval: Duration = this.reapInterval, observationExecutorPoolSize: Int = this.observationExecutorPoolSize, cacheConcurrencyLevel: Int = this.cacheConcurrencyLevel, connectionRetryInterval: Duration = this.connectionRetryInterval, connectionRetryIntervalMultiplier: Double = this.connectionRetryIntervalMultiplier, maxReconnectAttempts: Int = this.maxReconnectAttempts, maxFileSize: Int = this.maxFileSize, deduplicationCacheExpiry: Duration = this.deduplicationCacheExpiry ) LongParameterList:CordaRPCOps.kt$( @Suppress("UNUSED_PARAMETER") flowConstructor: (A, B, C, D, E) -> R, arg0: A, arg1: B, arg2: C, arg3: D, arg4: E ) LongParameterList:CordaRPCOps.kt$( @Suppress("UNUSED_PARAMETER") flowConstructor: (A, B, C, D, E, F) -> R, arg0: A, arg1: B, arg2: C, arg3: D, arg4: E, arg5: F ) @@ -1933,7 +828,7 @@ LongParameterList:Driver.kt$DriverParameters$( isDebug: Boolean, driverDirectory: Path, portAllocation: PortAllocation, debugPortAllocation: PortAllocation, systemProperties: Map<String, String>, useTestClock: Boolean, startNodesInProcess: Boolean, waitForAllNodesToFinish: Boolean, notarySpecs: List<NotarySpec>, extraCordappPackagesToScan: List<String>, jmxPolicy: JmxPolicy, networkParameters: NetworkParameters, cordappsForAllNodes: Set<TestCordapp>? ) LongParameterList:DriverDSL.kt$DriverDSL$( defaultParameters: NodeParameters = NodeParameters(), providedName: CordaX500Name? = defaultParameters.providedName, rpcUsers: List<User> = defaultParameters.rpcUsers, verifierType: VerifierType = defaultParameters.verifierType, customOverrides: Map<String, Any?> = defaultParameters.customOverrides, startInSameProcess: Boolean? = defaultParameters.startInSameProcess, maximumHeapSize: String = defaultParameters.maximumHeapSize ) LongParameterList:DriverDSL.kt$DriverDSL$( defaultParameters: NodeParameters = NodeParameters(), providedName: CordaX500Name? = defaultParameters.providedName, rpcUsers: List<User> = defaultParameters.rpcUsers, verifierType: VerifierType = defaultParameters.verifierType, customOverrides: Map<String, Any?> = defaultParameters.customOverrides, startInSameProcess: Boolean? = defaultParameters.startInSameProcess, maximumHeapSize: String = defaultParameters.maximumHeapSize, logLevelOverride: String? = defaultParameters.logLevelOverride ) - LongParameterList:DriverDSLImpl.kt$( isDebug: Boolean = DriverParameters().isDebug, driverDirectory: Path = DriverParameters().driverDirectory, portAllocation: PortAllocation = DriverParameters().portAllocation, debugPortAllocation: PortAllocation = DriverParameters().debugPortAllocation, systemProperties: Map<String, String> = DriverParameters().systemProperties, useTestClock: Boolean = DriverParameters().useTestClock, startNodesInProcess: Boolean = DriverParameters().startNodesInProcess, extraCordappPackagesToScan: List<String> = DriverParameters().extraCordappPackagesToScan, waitForAllNodesToFinish: Boolean = DriverParameters().waitForAllNodesToFinish, notarySpecs: List<NotarySpec> = DriverParameters().notarySpecs, jmxPolicy: JmxPolicy = DriverParameters().jmxPolicy, networkParameters: NetworkParameters = DriverParameters().networkParameters, compatibilityZone: CompatibilityZoneParams? = null, notaryCustomOverrides: Map<String, Any?> = DriverParameters().notaryCustomOverrides, inMemoryDB: Boolean = DriverParameters().inMemoryDB, cordappsForAllNodes: Collection<TestCordappInternal>? = null, dsl: DriverDSLImpl.() -> A ) + LongParameterList:DriverDSLImpl.kt$( isDebug: Boolean = DriverParameters().isDebug, driverDirectory: Path = DriverParameters().driverDirectory, portAllocation: PortAllocation = DriverParameters().portAllocation, debugPortAllocation: PortAllocation = DriverParameters().debugPortAllocation, systemProperties: Map<String, String> = DriverParameters().systemProperties, useTestClock: Boolean = DriverParameters().useTestClock, startNodesInProcess: Boolean = DriverParameters().startNodesInProcess, extraCordappPackagesToScan: List<String> = @Suppress("DEPRECATION") DriverParameters().extraCordappPackagesToScan, waitForAllNodesToFinish: Boolean = DriverParameters().waitForAllNodesToFinish, notarySpecs: List<NotarySpec> = DriverParameters().notarySpecs, jmxPolicy: JmxPolicy = DriverParameters().jmxPolicy, networkParameters: NetworkParameters = DriverParameters().networkParameters, compatibilityZone: CompatibilityZoneParams? = null, notaryCustomOverrides: Map<String, Any?> = DriverParameters().notaryCustomOverrides, inMemoryDB: Boolean = DriverParameters().inMemoryDB, cordappsForAllNodes: Collection<TestCordappInternal>? = null, dsl: DriverDSLImpl.() -> A ) LongParameterList:DriverDSLImpl.kt$DriverDSLImpl.Companion$( config: NodeConfig, quasarJarPath: String, debugPort: Int?, overriddenSystemProperties: Map<String, String>, maximumHeapSize: String, logLevelOverride: String?, vararg extraCmdLineFlag: String ) LongParameterList:DummyFungibleContract.kt$DummyFungibleContract$(inputs: List<State>, outputs: List<State>, tx: LedgerTransaction, issueCommand: CommandWithParties<Commands.Issue>, currency: Currency, issuer: PartyAndReference) LongParameterList:IRS.kt$FloatingRatePaymentEvent$(date: LocalDate = this.date, accrualStartDate: LocalDate = this.accrualStartDate, accrualEndDate: LocalDate = this.accrualEndDate, dayCountBasisDay: DayCountBasisDay = this.dayCountBasisDay, dayCountBasisYear: DayCountBasisYear = this.dayCountBasisYear, fixingDate: LocalDate = this.fixingDate, notional: Amount<Currency> = this.notional, rate: Rate = this.rate) @@ -1959,7 +854,7 @@ LongParameterList:NodeParameters.kt$NodeParameters$( providedName: CordaX500Name?, rpcUsers: List<User>, verifierType: VerifierType, customOverrides: Map<String, Any?>, startInSameProcess: Boolean?, maximumHeapSize: String ) LongParameterList:NodeParameters.kt$NodeParameters$( providedName: CordaX500Name?, rpcUsers: List<User>, verifierType: VerifierType, customOverrides: Map<String, Any?>, startInSameProcess: Boolean?, maximumHeapSize: String, additionalCordapps: Collection<TestCordapp> = emptySet(), flowOverrides: Map<out Class<out FlowLogic<*>>, Class<out FlowLogic<*>>> ) LongParameterList:NotaryChangeTransactions.kt$NotaryChangeLedgerTransaction.Companion$(inputs: List<StateAndRef<ContractState>>, notary: Party, newNotary: Party, id: SecureHash, sigs: List<TransactionSignature>, networkParameters: NetworkParameters) - LongParameterList:ObjectSerializer.kt$ComposableObjectWriter$(obj: Any, data: Data, type: Type, output: SerializationOutput, context: SerializationContext, debugIndent: Int) + LongParameterList:ObjectSerializer.kt$ComposableObjectWriter$( obj: Any, data: Data, @Suppress("UNUSED_PARAMETER") type: Type, output: SerializationOutput, context: SerializationContext, debugIndent: Int ) LongParameterList:ObjectSerializer.kt$EvolutionObjectSerializer.Companion$(localTypeInformation: LocalTypeInformation.Composable, remoteTypeInformation: RemoteTypeInformation.Composable, constructor: LocalConstructorInformation, properties: Map<String, LocalPropertyInformation>, classLoader: ClassLoader, mustPreserveData: Boolean) LongParameterList:ObligationUtils.kt$ObligationUtils$(tx: TransactionBuilder, obligor: AbstractParty, acceptableContract: SecureHash, amount: Amount<Issued<Currency>>, dueBefore: Instant, beneficiary: AbstractParty, notary: Party) LongParameterList:ObligationUtils.kt$ObligationUtils$(tx: TransactionBuilder, obligor: AbstractParty, issuanceDef: Obligation.Terms<P>, pennies: Long, beneficiary: AbstractParty, notary: Party) @@ -2005,7 +900,6 @@ LongParameterList:VaultFiller.kt$VaultFiller$(numberToCreate: Int, externalId: String? = null, participants: List<AbstractParty> = emptyList(), uniqueIdentifier: UniqueIdentifier? = null, linearString: String = "", linearNumber: Long = 0L, linearBoolean: Boolean = false, linearTimestamp: Instant = now(), constraint: AttachmentConstraint = AutomaticPlaceholderConstraint, includeMe: Boolean = true) LongParameterList:VaultService.kt$Vault.StateMetadata$( ref: StateRef = this.ref, contractStateClassName: String = this.contractStateClassName, recordedTime: Instant = this.recordedTime, consumedTime: Instant? = this.consumedTime, status: Vault.StateStatus = this.status, notary: AbstractParty? = this.notary, lockId: String? = this.lockId, lockUpdateTime: Instant? = this.lockUpdateTime ) LongParameterList:VaultService.kt$Vault.StateMetadata$( ref: StateRef = this.ref, contractStateClassName: String = this.contractStateClassName, recordedTime: Instant = this.recordedTime, consumedTime: Instant? = this.consumedTime, status: Vault.StateStatus = this.status, notary: AbstractParty? = this.notary, lockId: String? = this.lockId, lockUpdateTime: Instant? = this.lockUpdateTime, relevancyStatus: Vault.RelevancyStatus? ) - LongParameterList:WireTransaction.kt$WireTransaction$( resolveIdentity: (PublicKey) -> Party?, resolveAttachment: (SecureHash) -> Attachment?, resolveStateRefAsSerialized: (StateRef) -> SerializedBytes<TransactionState<ContractState>>?, resolveParameters: (SecureHash?) -> NetworkParameters?, resolveContractAttachment: (StateRef) -> Attachment, isAttachmentTrusted: (Attachment) -> Boolean ) LongParameterList:WireTransaction.kt$WireTransaction.Companion$(inputs: List<StateRef>, outputs: List<TransactionState<ContractState>>, commands: List<Command<*>>, attachments: List<SecureHash>, notary: Party?, timeWindow: TimeWindow?) LongParameterList:X509Utilities.kt$X509Utilities$(certificateType: CertificateType, issuer: X500Principal, issuerKeyPair: KeyPair, subject: X500Principal, subjectPublicKey: PublicKey, validityWindow: Pair<Date, Date>, nameConstraints: NameConstraints? = null, crlDistPoint: String? = null, crlIssuer: X500Name? = null) LongParameterList:X509Utilities.kt$X509Utilities$(certificateType: CertificateType, issuer: X500Principal, issuerPublicKey: PublicKey, issuerSigner: ContentSigner, subject: X500Principal, subjectPublicKey: PublicKey, validityWindow: Pair<Date, Date>, nameConstraints: NameConstraints? = null, crlDistPoint: String? = null, crlIssuer: X500Name? = null) @@ -2094,6 +988,7 @@ MagicNumber:AttachmentDemo.kt$10010 MagicNumber:AttachmentDemoTest.kt$AttachmentDemoTest$10_000_000 MagicNumber:AttachmentLoadingTests.kt$AttachmentLoadingTests$1234 + MagicNumber:AttachmentTrustTable.kt$AttachmentTrustTable$3 MagicNumber:AttachmentsClassLoader.kt$AttachmentsClassLoader$4 MagicNumber:AttachmentsClassLoaderSerializationTests.kt$AttachmentsClassLoaderSerializationTests$20 MagicNumber:AttachmentsClassLoaderSerializationTests.kt$AttachmentsClassLoaderSerializationTests$3 @@ -2214,7 +1109,6 @@ MagicNumber:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$3 MagicNumber:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$5 MagicNumber:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests.Companion$10 - MagicNumber:CheatingSecurityProvider.kt$CheatingSecurityProvider$1.8 MagicNumber:CityDatabaseTest.kt$CityDatabaseTest$0.12 MagicNumber:CityDatabaseTest.kt$CityDatabaseTest$51.5 MagicNumber:ClassCarpenter.kt$ClassCarpenterImpl$3 @@ -2326,6 +1220,7 @@ MagicNumber:CordaRPCClient.kt$CordaRPCClientConfiguration$31 MagicNumber:CordaRPCClient.kt$CordaRPCClientConfiguration$5 MagicNumber:CordaRPCClientReconnectionTest.kt$CordaRPCClientReconnectionTest$10 + MagicNumber:CordaRPCClientReconnectionTest.kt$CordaRPCClientReconnectionTest$20 MagicNumber:CordaRPCClientReconnectionTest.kt$CordaRPCClientReconnectionTest$4 MagicNumber:CordaRPCClientTest.kt$CordaRPCClientTest$10 MagicNumber:CordaRPCClientTest.kt$CordaRPCClientTest$100 @@ -2820,6 +1715,7 @@ MagicNumber:KryoTests.kt$KryoTests$19 MagicNumber:KryoTests.kt$KryoTests$20 MagicNumber:KryoTests.kt$KryoTests$20000 + MagicNumber:KryoTests.kt$KryoTests$20172 MagicNumber:KryoTests.kt$KryoTests$20222 MagicNumber:KryoTests.kt$KryoTests$21 MagicNumber:KryoTests.kt$KryoTests$22 @@ -3060,6 +1956,7 @@ MagicNumber:NodeVaultServiceTest.kt$NodeVaultServiceTest$200 MagicNumber:NodeVaultServiceTest.kt$NodeVaultServiceTest$3 MagicNumber:NodeVaultServiceTest.kt$NodeVaultServiceTest$30 + MagicNumber:NodeVaultServiceTest.kt$NodeVaultServiceTest$32 MagicNumber:NodeVaultServiceTest.kt$NodeVaultServiceTest$4 MagicNumber:NodeVaultServiceTest.kt$NodeVaultServiceTest$5 MagicNumber:NodeVaultServiceTest.kt$NodeVaultServiceTest$6 @@ -3171,7 +2068,6 @@ MagicNumber:PartyTest.kt$PartyTest$20170207L MagicNumber:PartyTest.kt$PartyTest$7201702L MagicNumber:Password.kt$Password$5 - MagicNumber:PersistentIdentityMigrationNewTable.kt$PersistentIdentityMigrationNewTable$70 MagicNumber:PersistentNetworkMapCacheTest.kt$PersistentNetworkMapCacheTest$1000 MagicNumber:PersistentScheduledFlowRepositoryTest.kt$PersistentScheduledFlowRepositoryTest$5 MagicNumber:PersistentTypes.kt$MappedSchema$31 @@ -3422,7 +2318,6 @@ MagicNumber:SerializationPropertyOrdering.kt$SerializationPropertyOrdering$500 MagicNumber:SerializationTokenTest.kt$SerializationTokenTest.LargeTokenizable$1024 MagicNumber:ServiceHubConcurrentUsageTest.kt$ServiceHubConcurrentUsageTest.TestFlow$10 - MagicNumber:SharedMemoryIncremental.kt$SharedMemoryIncremental$16 MagicNumber:ShutdownManager.kt$ShutdownManager$5 MagicNumber:ShutdownManager.kt$ShutdownManager$60 MagicNumber:SignedNodeInfoTest.kt$SignedNodeInfoTest$1234 @@ -3520,7 +2415,6 @@ MagicNumber:TransactionSignatureTest.kt$TransactionSignatureTest$3 MagicNumber:TransactionSignatureTest.kt$TransactionSignatureTest$4 MagicNumber:TransactionTests.kt$TransactionTests.<no name provided>$1234 - MagicNumber:TransactionUtils.kt$100 MagicNumber:TransactionUtils.kt$4 MagicNumber:TransactionVerificationExceptionSerialisationTests.kt$TransactionVerificationExceptionSerialisationTests$12 MagicNumber:TransactionVerificationExceptionSerialisationTests.kt$TransactionVerificationExceptionSerialisationTests$20 @@ -3680,7 +2574,6 @@ MagicNumber:WireTransaction.kt$WireTransaction$4 MagicNumber:WorkflowTransactionBuildTutorial.kt$SubmitCompletionFlow$60 MagicNumber:WorkflowTransactionBuildTutorial.kt$SubmitTradeApprovalFlow$60 - MagicNumber:X509EdDSAEngineTest.kt$X509EdDSAEngineTest.Companion$8 MagicNumber:X509Utilities.kt$X509Utilities$3650 MagicNumber:X509UtilitiesTest.kt$X509UtilitiesTest$10 MagicNumber:X509UtilitiesTest.kt$X509UtilitiesTest$1000 @@ -3708,6 +2601,7 @@ MatchingDeclarationName:FlowsExecutionModeRpcTest.kt$net.corda.client.rpc.FlowsExecutionModeRpcTest.kt MatchingDeclarationName:IRSDemo.kt$net.corda.irs.web.demo.IRSDemo.kt MatchingDeclarationName:InterestSwapRestAPI.kt$net.corda.irs.web.api.InterestSwapRestAPI.kt + MatchingDeclarationName:InternalAccessTestHelpers.kt$net.corda.serialization.internal.InternalAccessTestHelpers.kt MatchingDeclarationName:InternalTestUtils.kt$net.corda.testing.node.internal.InternalTestUtils.kt MatchingDeclarationName:IrsDemoClientApi.kt$net.corda.irs.web.demo.IrsDemoClientApi.kt MatchingDeclarationName:KeyStoreConfigHelpers.kt$net.corda.nodeapi.internal.KeyStoreConfigHelpers.kt @@ -3739,29 +2633,13 @@ MatchingDeclarationName:TutorialFlowStateMachines.kt$net.corda.docs.kotlin.tutorial.flowstatemachines.TutorialFlowStateMachines.kt MatchingDeclarationName:Utils.kt$io.cryptoblk.core.Utils.kt MatchingDeclarationName:VirtualCordapps.kt$net.corda.node.internal.cordapp.VirtualCordapps.kt - MaxLineLength:AMQPBridgeManager.kt$AMQPBridgeManager : BridgeManager - MaxLineLength:AMQPBridgeManager.kt$AMQPBridgeManager$AMQPBridge MaxLineLength:AMQPBridgeManager.kt$AMQPBridgeManager$crlCheckSoftFail: Boolean - MaxLineLength:AMQPBridgeManager.kt$AMQPBridgeManager$val newBridge = AMQPBridge(queueName, targets, legalNames, amqpConfig, sharedEventLoopGroup!!, artemis!!, bridgeMetricsService) - MaxLineLength:AMQPBridgeManager.kt$AMQPBridgeManager.AMQPBridge$logDebugWithMDC { "Bridged Send to ${legalNames.first()} uuid: ${artemisMessage.getObjectProperty("_AMQ_DUPL_ID")}" } - MaxLineLength:AMQPBridgeManager.kt$AMQPBridgeManager.AMQPBridge$logInfoWithMDC("Rollback rejected message uuid: ${artemisMessage.getObjectProperty("_AMQ_DUPL_ID")}") MaxLineLength:AMQPBridgeManager.kt$AMQPBridgeManager.AMQPBridge$val msg = "Message exceeds maxMessageSize network parameter, maxMessageSize: [${amqpConfig.maxMessageSize}], message size: [${artemisMessage.bodySize}], " + "dropping message, uuid: ${artemisMessage.getObjectProperty("_AMQ_DUPL_ID")}" MaxLineLength:AMQPBridgeManager.kt$AMQPBridgeManager.AMQPBridge$val session = sessionFactory.createSession(NODE_P2P_USER, NODE_P2P_USER, false, true, true, false, DEFAULT_ACK_BATCH_SIZE) MaxLineLength:AMQPBridgeManager.kt$AMQPBridgeManager.AMQPConfigurationImpl$constructor(config: MutualSslConfiguration, maxMessageSize: Int, crlCheckSoftFail: Boolean) : this(config.keyStore.get(), config.trustStore.get(), maxMessageSize, crlCheckSoftFail) - MaxLineLength:AMQPBridgeManager.kt$AMQPBridgeManager.AMQPConfigurationImpl$override val crlCheckSoftFail: Boolean - MaxLineLength:AMQPBridgeManager.kt$import net.corda.nodeapi.internal.ArtemisMessagingComponent.RemoteInboxAddress.Companion.translateLocalQueueToInboxAddress MaxLineLength:AMQPBridgeTest.kt$AMQPBridgeTest$private - MaxLineLength:AMQPBridgeTest.kt$AMQPBridgeTest$val artemisServer = ArtemisMessagingServer(artemisConfig, artemisAddress.copy(host = "0.0.0.0"), MAX_MESSAGE_SIZE) - MaxLineLength:AMQPBridgeTest.kt$AMQPBridgeTest$val bridgeManager = AMQPBridgeManager(artemisConfig.p2pSslOptions, artemisAddress, MAX_MESSAGE_SIZE, artemisConfig.crlCheckSoftFail) - MaxLineLength:AMQPBridgeTest.kt$AMQPBridgeTest${ // Note that the opposite of this test (that a connection is established if strict checking is disabled) is carried out by the // ack/nack test above. "Strict CRL checking" means that soft fail mode is disabled. val sourceQueueName = "internal.peers." + BOB.publicKey.toStringShort() val (artemisServer, artemisClient, bridge) = createArtemis(sourceQueueName, crlCheckSoftFail = false) createAMQPServer().use { val connectedFuture = it.onConnection.toFuture() it.start() val connectedResult = connectedFuture.get() assertEquals(false, connectedResult.connected) } bridge.stop() artemisClient.stop() artemisServer.stop() } - MaxLineLength:AMQPChannelHandler.kt$AMQPChannelHandler$"Message for incorrect legal identity ${msg.destinationLegalName} expected ${remoteCert!!.subjectX500Principal}" MaxLineLength:AMQPChannelHandler.kt$AMQPChannelHandler$eventProcessor = EventProcessor(ch, serverMode, localCert!!.subjectX500Principal.toString(), remoteCert!!.subjectX500Principal.toString(), userName, password) - MaxLineLength:AMQPChannelHandler.kt$AMQPChannelHandler$logErrorWithMDC("Provided certificate subject $remoteX500Name not in expected set $allowedRemoteLegalNames") - MaxLineLength:AMQPChannelHandler.kt$AMQPChannelHandler$require MaxLineLength:AMQPChannelHandler.kt$AMQPChannelHandler${ logWarnWithMDC("SSL Handshake closed early.") } - MaxLineLength:AMQPClient.kt$AMQPClient.ClientChannelInitializer$log.error("Blocking future connection attempts to $target due to bad certificate on endpoint") - MaxLineLength:AMQPClient.kt$AMQPClient.ClientChannelInitializer$val handler = createClientSslHelper(target, parent.allowedRemoteLegalNames, keyManagerFactory, trustManagerFactory) - MaxLineLength:AMQPClientSerializationScheme.kt$AMQPClientSerializationScheme$( cordappCustomSerializers: Set<SerializationCustomSerializer<*,*>>, cordappSerializationWhitelists: Set<SerializationWhitelist>, serializerFactoriesForContexts: MutableMap<SerializationFactoryCacheKey, SerializerFactory> ) MaxLineLength:AMQPClientSerializationScheme.kt$AMQPClientSerializationScheme$@Suppress("UNUSED") constructor() : this(emptySet(), emptySet(), AccessOrderLinkedHashMap<SerializationFactoryCacheKey, SerializerFactory>(128).toSynchronised()) MaxLineLength:AMQPClientSerializationScheme.kt$AMQPClientSerializationScheme$constructor(cordapps: List<Cordapp>) : this(cordapps.customSerializers, cordapps.serializationWhitelists, AccessOrderLinkedHashMap<SerializationFactoryCacheKey, SerializerFactory>(128).toSynchronised()) MaxLineLength:AMQPClientSerializationScheme.kt$AMQPClientSerializationScheme$constructor(cordapps: List<Cordapp>, serializerFactoriesForContexts: MutableMap<SerializationFactoryCacheKey, SerializerFactory>) : this(cordapps.customSerializers, cordapps.serializationWhitelists, serializerFactoriesForContexts) @@ -3769,282 +2647,123 @@ MaxLineLength:AMQPClientSerializationScheme.kt$AMQPClientSerializationScheme.Companion$ fun initialiseSerialization(classLoader: ClassLoader? = null, customSerializers: Set<SerializationCustomSerializer<*, *>> = emptySet(), serializationWhitelists: Set<SerializationWhitelist> = emptySet(), serializerFactoriesForContexts: MutableMap<SerializationFactoryCacheKey, SerializerFactory> = AccessOrderLinkedHashMap<SerializationFactoryCacheKey, SerializerFactory>(128).toSynchronised()) MaxLineLength:AMQPClientSerializationScheme.kt$AMQPClientSerializationScheme.Companion$fun createSerializationEnv(classLoader: ClassLoader? = null, customSerializers: Set<SerializationCustomSerializer<*, *>> = emptySet(), serializationWhitelists: Set<SerializationWhitelist> = emptySet(), serializerFactoriesForContexts: MutableMap<SerializationFactoryCacheKey, SerializerFactory> = AccessOrderLinkedHashMap<SerializationFactoryCacheKey, SerializerFactory>(128).toSynchronised()): SerializationEnvironment MaxLineLength:AMQPClientSerializationScheme.kt$AMQPClientSerializationScheme.Companion$nodeSerializationEnv = createSerializationEnv(classLoader, customSerializers, serializationWhitelists, serializerFactoriesForContexts) - MaxLineLength:AMQPClientSerializationScheme.kt$AMQPClientSerializationScheme.Companion$p2pContext = if (classLoader != null) AMQP_P2P_CONTEXT.withClassLoader(classLoader) else AMQP_P2P_CONTEXT MaxLineLength:AMQPClientSerializationScheme.kt$AMQPClientSerializationScheme.Companion$registerScheme(AMQPClientSerializationScheme(customSerializers, serializationWhitelists, serializerFactoriesForContexts)) - MaxLineLength:AMQPConfiguration.kt$AMQPConfiguration$/** * Enables full debug tracing of all netty and AMQP level packets. This logs aat very high volume and is only for developers. */ @JvmDefault val trace: Boolean get() = false - MaxLineLength:AMQPConfiguration.kt$AMQPConfiguration$/** * Setting crlCheckSoftFail to true allows certificate paths where some leaf certificates do not contain cRLDistributionPoints * and also allows validation to continue if the CRL distribution server is not contactable. */ @JvmDefault val crlCheckSoftFail: Boolean get() = true - MaxLineLength:AMQPConfiguration.kt$AMQPConfiguration$/** * The maximum allowed size for packets, which will be dropped ahead of send. In future may also be enforced on receive, * but currently that is deferred to Artemis and the bridge code. */ val maxMessageSize: Int - MaxLineLength:AMQPRemoteTypeModel.kt$AMQPRemoteTypeModel$cache.getOrPut(typeDescriptor) { interpretationState.run { typeNotation.name.typeIdentifier.interpretIdentifier() } } - MaxLineLength:AMQPRemoteTypeModel.kt$AMQPRemoteTypeModel$throw NotSerializableException("Cannot resolve cyclic reference to ${typeInformation.typeIdentifier}") - MaxLineLength:AMQPRemoteTypeModel.kt$AMQPRemoteTypeModel.InterpretationState$ fun TypeIdentifier.interpretIdentifier(): RemoteTypeInformation - MaxLineLength:AMQPRemoteTypeModel.kt$AMQPRemoteTypeModel.InterpretationState$ private fun TypeIdentifier.interpretNoNotation(): RemoteTypeInformation - MaxLineLength:AMQPRemoteTypeModel.kt$AMQPRemoteTypeModel.InterpretationState$ private fun TypeNotation.interpretNotation(identifier: TypeIdentifier): RemoteTypeInformation - MaxLineLength:AMQPRemoteTypeModel.kt$AMQPRemoteTypeModel.InterpretationState$private - MaxLineLength:AMQPRemoteTypeModel.kt$AMQPRemoteTypeModel.InterpretationState$return if (isInterface) RemoteTypeInformation.AnInterface(typeDescriptor, identifier, properties, interfaces, typeParameters) else RemoteTypeInformation.Composable(typeDescriptor, identifier, properties, interfaces, typeParameters) - MaxLineLength:AMQPRemoteTypeModel.kt$AMQPRemoteTypeModel.InterpretationState$val constants = choices.asSequence().mapIndexed { index, choice -> choice.name to index }.toMap(LinkedHashMap()) - MaxLineLength:AMQPRemoteTypeModelTests.kt$AMQPRemoteTypeModelTests$C<V> : Superclass - MaxLineLength:AMQPRemoteTypeModelTests.kt$AMQPRemoteTypeModelTests.Superclass$open MaxLineLength:AMQPSerializationScheme.kt$AbstractAMQPSerializationScheme$@DeleteForDJVM constructor(cordapps: List<Cordapp>) : this(cordapps.customSerializers, cordapps.serializationWhitelists, AccessOrderLinkedHashMap<SerializationFactoryCacheKey, SerializerFactory>(128).toSynchronised()) MaxLineLength:AMQPSerializationScheme.kt$AbstractAMQPSerializationScheme$private MaxLineLength:AMQPSerializationScheme.kt$AbstractAMQPSerializationScheme$val key = SerializationFactoryCacheKey(context.whitelist, context.deserializationClassLoader, context.preventDataLoss, context.customSerializers) MaxLineLength:AMQPSerializationScheme.kt$AbstractAMQPSerializationScheme${ // This is a hack introduced in version 3 to fix a spring boot issue - CORDA-1747. // It breaks the shell because it overwrites the CordappClassloader with the system classloader that doesn't know about any CorDapps. // In case a spring boot serialization issue with generics is found, a better solution needs to be found to address it. // var contextToUse = context // if (context.useCase == SerializationContext.UseCase.RPCClient) { // contextToUse = context.withClassLoader(getContextClassLoader()) // } val serializerFactory = getSerializerFactory(context) return DeserializationInput(serializerFactory).deserialize(byteSequence, clazz, context) } MaxLineLength:AMQPSerializationScheme.kt$AbstractAMQPSerializationScheme${ with(factory) { register(publicKeySerializer) register(net.corda.serialization.internal.amqp.custom.PrivateKeySerializer) register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(this)) register(net.corda.serialization.internal.amqp.custom.BigDecimalSerializer) register(net.corda.serialization.internal.amqp.custom.BigIntegerSerializer) register(net.corda.serialization.internal.amqp.custom.CurrencySerializer) register(net.corda.serialization.internal.amqp.custom.OpaqueBytesSubSequenceSerializer(this)) register(net.corda.serialization.internal.amqp.custom.InstantSerializer(this)) register(net.corda.serialization.internal.amqp.custom.DurationSerializer(this)) register(net.corda.serialization.internal.amqp.custom.LocalDateSerializer(this)) register(net.corda.serialization.internal.amqp.custom.LocalDateTimeSerializer(this)) register(net.corda.serialization.internal.amqp.custom.LocalTimeSerializer(this)) register(net.corda.serialization.internal.amqp.custom.ZonedDateTimeSerializer(this)) register(net.corda.serialization.internal.amqp.custom.ZoneIdSerializer(this)) register(net.corda.serialization.internal.amqp.custom.OffsetTimeSerializer(this)) register(net.corda.serialization.internal.amqp.custom.OffsetDateTimeSerializer(this)) register(net.corda.serialization.internal.amqp.custom.OptionalSerializer(this)) register(net.corda.serialization.internal.amqp.custom.YearSerializer(this)) register(net.corda.serialization.internal.amqp.custom.YearMonthSerializer(this)) register(net.corda.serialization.internal.amqp.custom.MonthDaySerializer(this)) register(net.corda.serialization.internal.amqp.custom.PeriodSerializer(this)) register(net.corda.serialization.internal.amqp.custom.ClassSerializer(this)) register(net.corda.serialization.internal.amqp.custom.X509CertificateSerializer) register(net.corda.serialization.internal.amqp.custom.X509CRLSerializer) register(net.corda.serialization.internal.amqp.custom.CertPathSerializer(this)) register(net.corda.serialization.internal.amqp.custom.StringBufferSerializer) register(net.corda.serialization.internal.amqp.custom.InputStreamSerializer) register(net.corda.serialization.internal.amqp.custom.BitSetSerializer(this)) register(net.corda.serialization.internal.amqp.custom.EnumSetSerializer(this)) register(net.corda.serialization.internal.amqp.custom.ContractAttachmentSerializer(this)) registerNonDeterministicSerializers(factory) } // This step is registering custom serializers, which have been added after node initialisation (i.e. via attachments during transaction verification). // Note: the order between the registration of customSerializers and cordappCustomSerializers must be preserved as-is. The reason is the following: // Currently, the serialization infrastructure does not support multiple versions of a class (the first one that is registered dominates). // As a result, when inside a context with attachments class loader, we prioritize serializers loaded on-demand from attachments to serializers that had been // loaded during node initialisation, by scanning the cordapps folder. context.customSerializers.forEach { customSerializer -> factory.registerExternal(CorDappCustomSerializer(customSerializer, factory)) } cordappCustomSerializers.forEach { customSerializer -> factory.registerExternal(CorDappCustomSerializer(customSerializer, factory)) } context.properties[ContextPropertyKeys.SERIALIZERS]?.apply { uncheckedCast<Any, List<CustomSerializer<out Any>>>(this).forEach { factory.register(it) } } } - MaxLineLength:AMQPSerializer.kt$AMQPSerializer$ fun readObject(obj: Any, schemas: SerializationSchemas, input: DeserializationInput, context: SerializationContext): T - MaxLineLength:AMQPSerializer.kt$AMQPSerializer$ fun writeClassInfo(output: SerializationOutput) - MaxLineLength:AMQPSerializer.kt$AMQPSerializer$/** * Textual unique representation of the JVM type this represents. Will be encoded into the AMQP stream and * will appear in the schema. * * This should be unique enough that we can use one global cache of [AMQPSerializer]s and use this as the look up key. */ val typeDescriptor: Symbol MaxLineLength:AMQPSerializerFactories.kt$ fun createClassCarpenter(context: SerializationContext): ClassCarpenter MaxLineLength:AMQPServer.kt$AMQPServer$server.group(bossGroup, workerGroup).channel(NioServerSocketChannel::class.java).option(ChannelOption.SO_BACKLOG, 100).handler(LoggingHandler(LogLevel.INFO)).childHandler(ServerChannelInitializer(this)) MaxLineLength:AMQPServer.kt$AMQPServer$val channelFuture = server.bind(hostName, port).sync() // block/throw here as better to know we failed to claim port than carry on - MaxLineLength:AMQPServerSerializationScheme.kt$AMQPServerSerializationScheme$( cordappCustomSerializers: Set<SerializationCustomSerializer<*, *>>, cordappSerializationWhitelists: Set<SerializationWhitelist>, serializerFactoriesForContexts: MutableMap<SerializationFactoryCacheKey, SerializerFactory> ) MaxLineLength:AMQPServerSerializationScheme.kt$AMQPServerSerializationScheme$constructor() : this(emptySet(), emptySet(), AccessOrderLinkedHashMap<SerializationFactoryCacheKey, SerializerFactory>(128).toSynchronised() ) MaxLineLength:AMQPServerSerializationScheme.kt$AMQPServerSerializationScheme$constructor(cordapps: List<Cordapp>) : this(cordapps.customSerializers, cordapps.serializationWhitelists, AccessOrderLinkedHashMap<SerializationFactoryCacheKey, SerializerFactory>(128).toSynchronised()) MaxLineLength:AMQPServerSerializationScheme.kt$AMQPServerSerializationScheme$constructor(cordapps: List<Cordapp>, serializerFactoriesForContexts: MutableMap<SerializationFactoryCacheKey, SerializerFactory>) : this(cordapps.customSerializers, cordapps.serializationWhitelists, serializerFactoriesForContexts) MaxLineLength:AMQPServerSerializationScheme.kt$AMQPServerSerializationScheme$return SerializerFactoryBuilder.build(context.whitelist, context.deserializationClassLoader, context.lenientCarpenterEnabled).apply { register(RpcServerObservableSerializer()) register(RpcServerCordaFutureSerializer(this)) register(RxNotificationSerializer(this)) } - MaxLineLength:AMQPTestUtils.kt$val dir = ProjectStructure.projectRootDir / "serialization" / "src" / "test" / "resources" / javaClass.packageName.replace('.', separatorChar) - MaxLineLength:AMQPTypeIdentifierParser.kt$AMQPTypeIdentifierParser$else -> throw IllegalTypeNameParserStateException("Type name '$typeString' contains illegal character '$c'") - MaxLineLength:AMQPTypeIdentifierParser.kt$AMQPTypeIdentifierParser$throw IllegalTypeNameParserStateException("Nested depth of type parameters exceeds maximum of $MAX_TYPE_PARAM_DEPTH") - MaxLineLength:AMQPTypeIdentifierParser.kt$AMQPTypeIdentifierParser.ParseState.ParsingArray$data + MaxLineLength:AMQPTestUtils.kt$val dir = ProjectStructure.projectRootDir / "serialization" / "src" / "test" / "resources" / javaClass.packageName_.replace('.', separatorChar) MaxLineLength:AMQPTypeIdentifierParser.kt$AMQPTypeIdentifierParser.ParseState.ParsingParameterList$data MaxLineLength:AMQPTypeIdentifierParser.kt$AMQPTypeIdentifierParser.ParseState.ParsingRawType$data - MaxLineLength:AMQPTypeIdentifierParserTests.kt$AMQPTypeIdentifierParserTests$assertParsesCompatibly<WithParameters<IntArray, WithParameter<Array<WithParameters<Array<Array<Date>>, UUID>>>>>() MaxLineLength:AMQPTypeIdentifierParserTests.kt$AMQPTypeIdentifierParserTests$verify(" java.util.Map < java.util.Map< java.lang.String, java.lang.Integer >, java.util.Map < java.lang.Long , java.lang.String > >") - MaxLineLength:AMQPTypeIdentifierParserTests.kt$AMQPTypeIdentifierParserTests$verify("java.util.List<net.corda.core.contracts.Command<net.corda.core.contracts.Command<net.corda.core.contracts.CommandData>>>") - MaxLineLength:AMQPTypeIdentifiers.kt$AMQPTypeIdentifiers$is TypeIdentifier.Parameterised - MaxLineLength:AMQPTypeIdentifiers.kt$AMQPTypeIdentifiers$private val primitiveByteArrayType = TypeIdentifier.ArrayOf(TypeIdentifier.forClass(Byte::class.javaPrimitiveType!!)) - MaxLineLength:ANSIProgressRenderer.kt$ANSIProgressRenderer$// Create a new tree of steps that also holds a reference to the parent of each step. This is required to uniquely identify each step // (assuming that each step label is unique at a given level). private fun transformTree(inputTree: List<InputTreeStep>): List<ProgressStep> MaxLineLength:ANSIProgressRenderer.kt$ANSIProgressRenderer$ansi.a("${IntStream.range(indent, indent).mapToObj { "\t" }.toList().joinToString(separator = "") { s -> s }} $errorIcon ${error.message}") - MaxLineLength:ANSIProgressRenderer.kt$ANSIProgressRenderer$updatesSubscription - MaxLineLength:ANSIProgressRenderer.kt$ANSIProgressRenderer$val newTree = transformTree(it.first.map { elem -> InputTreeStep(elem.first, elem.second) }) // Process indices first, as if the tree has changed the associated index with this update is for the old tree. Note // that the one case where this isn't true is the very first update, but in this case the index should be 0 (as this // update is for the initial state). The remapping on a new tree assumes the step at index 0 is always at least current, // so this case is handled there. treeIndex = it.second treeIndexProcessed.add(it.second) if (newTree != tree) { remapIndices(newTree) tree = newTree } draw(true) - MaxLineLength:ANSIProgressRenderer.kt$ANSIProgressRenderer${ // By combining the two observables, a race condition where both emit items at roughly the same time is avoided. This could // result in steps being incorrectly marked as skipped. Instead, whenever either observable emits an item, a pair of the // last index and last tree is returned, which ensures that updates to either are processed in series. updatesSubscription = combineLatest(treeUpdates, indexUpdates) { tree, index -> Pair(tree, index) }.subscribe( { val newTree = transformTree(it.first.map { elem -> InputTreeStep(elem.first, elem.second) }) // Process indices first, as if the tree has changed the associated index with this update is for the old tree. Note // that the one case where this isn't true is the very first update, but in this case the index should be 0 (as this // update is for the initial state). The remapping on a new tree assumes the step at index 0 is always at least current, // so this case is handled there. treeIndex = it.second treeIndexProcessed.add(it.second) if (newTree != tree) { remapIndices(newTree) tree = newTree } draw(true) }, { done(it) }, { done(null) } ) } - MaxLineLength:ANSIProgressRenderer.kt$ANSIProgressRenderer${ // If some steps were removed from the progress tracker, we don't want to leave junk hanging around below. val linesToClear = prevLinesDrawn - newLinesDrawn repeat(linesToClear) { ansi.eraseLine() ansi.newline() } ansi.cursorUp(linesToClear) } - MaxLineLength:ANSIProgressRenderer.kt$ANSIProgressRenderer${ // If there is nothing on the stack at any point, it implies that this step is at the top level and has no parent. null } - MaxLineLength:ANSIProgressRenderer.kt$ANSIProgressRenderer${ // The top of the stack is at the same or lower level than the current step. Remove items from the top until the topmost // item is at a higher level - this is the parent step. repeat(levelDifference + 1) { stack.pop() } } - MaxLineLength:ANSIProgressRenderer.kt$StdoutANSIProgressRenderer : ANSIProgressRenderer - MaxLineLength:ANSIProgressRenderer.kt$StdoutANSIProgressRenderer$appenderRefs.forEach { config.addAppender(manager.configuration.appenders[it.ref], it.level, it.filter) } - MaxLineLength:ANSIProgressRenderer.kt$StdoutANSIProgressRenderer$loggerFor<StdoutANSIProgressRenderer>().warn("Cannot find console appender - progress tracking may not work as expected") MaxLineLength:ANSIProgressRenderer.kt$StdoutANSIProgressRenderer$val consoleAppender = manager.configuration.appenders.values.filterIsInstance<ConsoleAppender>().singleOrNull { it.name == "Console-Selector" } - MaxLineLength:ANSIProgressRendererTest.kt$ANSIProgressRendererTest$checkTrackingState(captor, 2, listOf(stepSuccess(STEP_1_LABEL), stepSkipped(STEP_2_LABEL), stepActive(STEP_3_LABEL))) - MaxLineLength:ANSIProgressRendererTest.kt$ANSIProgressRendererTest$checkTrackingState(captor, 3, listOf(stepSuccess(STEP_1_LABEL), stepSuccess(STEP_2_LABEL), stepActive(STEP_3_LABEL))) - MaxLineLength:ANSIProgressRendererTest.kt$ANSIProgressRendererTest$checkTrackingState(captor, 4, listOf(stepActive(STEP_1_LABEL), stepNotRun(STEP_4_LABEL), stepNotRun(STEP_5_LABEL))) MaxLineLength:ANSIProgressRendererTest.kt$ANSIProgressRendererTest$checkTrackingState(captor, 5, listOf(stepSuccess(STEP_1_LABEL), stepSuccess(STEP_3_LABEL), stepSuccess(STEP_2_LABEL), stepActive(STEP_3_LABEL))) MaxLineLength:ANSIProgressRendererTest.kt$ANSIProgressRendererTest$checkTrackingState(captor, 6, listOf(stepSuccess(STEP_1_LABEL), stepSuccess(STEP_3_LABEL), stepSuccess(STEP_2_LABEL), stepActive(STEP_3_LABEL), stepNotRun(STEP_4_LABEL))) MaxLineLength:ANSIProgressRendererTest.kt$ANSIProgressRendererTest$feedSubject.onNext(listOf(Pair(0, STEP_1_LABEL), Pair(1, STEP_2_LABEL), Pair(1, STEP_3_LABEL), Pair(0, STEP_4_LABEL), Pair(0, STEP_5_LABEL))) - MaxLineLength:ANSIProgressRendererTest.kt$ANSIProgressRendererTest$feedSubject.onNext(listOf(Pair(0, STEP_1_LABEL), Pair(1, STEP_3_LABEL), Pair(0, STEP_2_LABEL), Pair(1, STEP_3_LABEL))) MaxLineLength:ANSIProgressRendererTest.kt$ANSIProgressRendererTest$feedSubject.onNext(listOf(Pair(0, STEP_1_LABEL), Pair(1, STEP_3_LABEL), Pair(0, STEP_2_LABEL), Pair(1, STEP_3_LABEL), Pair(2, STEP_4_LABEL))) MaxLineLength:ANSIProgressRendererTest.kt$ANSIProgressRendererTest$flowProgressHandle = FlowProgressHandleImpl(StateMachineRunId.createRandom(), openFuture<String>(), Observable.empty(), stepsTreeIndexFeed, stepsTreeFeed) - MaxLineLength:APIServer.kt$APIServer MaxLineLength:AbstractAMQPSerializationSchemeTest.kt$AbstractAMQPSerializationSchemeTest$ByteSequence.of(byteArrayOf('c'.toByte(), 'o'.toByte(), 'r'.toByte(), 'd'.toByte(), 'a'.toByte(), 0.toByte(), 0.toByte(), 1.toByte())) - MaxLineLength:AbstractAMQPSerializationSchemeTest.kt$AbstractAMQPSerializationSchemeTest$val backingMap = AccessOrderLinkedHashMap<SerializationFactoryCacheKey, SerializerFactory>({ maxFactories }).toSynchronised() MaxLineLength:AbstractAMQPSerializationSchemeTest.kt$AbstractAMQPSerializationSchemeTest$val deserialized = serialized.deserialize(context = context, serializationFactory = serializationEnvironment.serializationFactory) - MaxLineLength:AbstractAMQPSerializationSchemeTest.kt$AbstractAMQPSerializationSchemeTest$val factory = SerializerFactoryBuilder.build(TESTING_CONTEXT.whitelist, TESTING_CONTEXT.deserializationClassLoader) - MaxLineLength:AbstractAMQPSerializationSchemeTest.kt$AbstractAMQPSerializationSchemeTest$val scheme = object : AbstractAMQPSerializationScheme(emptySet(), emptySet(), backingMap, createSerializerFactoryFactory()) { override fun rpcClientSerializerFactory(context: SerializationContext): SerializerFactory { return factory } override fun rpcServerSerializerFactory(context: SerializationContext): SerializerFactory { return factory } override fun canDeserializeVersion(magic: CordaSerializationMagic, target: SerializationContext.UseCase): Boolean { return true } } - MaxLineLength:AbstractAMQPSerializationSchemeTest.kt$AbstractAMQPSerializationSchemeTest.<no name provided>$override - MaxLineLength:AbstractAttachment.kt$// We whitelist sources of transaction JARs for now as a temporary state until the DJVM and other security sandboxes // have been integrated, at which point we'll be able to run untrusted code downloaded over the network and this mechanism // can be removed. Because we ARE downloading attachments over the P2P network in anticipation of this upgrade, we // track the source of each attachment in our store. TestDSL is used by LedgerDSLInterpreter when custom attachments // are added in unit test code. val TRUSTED_UPLOADERS = listOf(DEPLOYED_CORDAPP_UPLOADER, RPC_UPLOADER, TESTDSL_UPLOADER) MaxLineLength:AbstractAttachment.kt$AbstractAttachment.Companion$ @DeleteForDJVM fun SerializeAsTokenContext.attachmentDataLoader(id: SecureHash): () -> ByteArray - MaxLineLength:AbstractCashFlow.kt$AbstractCashFlow$@Suspendable protected MaxLineLength:AbstractCashFlow.kt$CashException : FlowException - MaxLineLength:AbstractCashSelection.kt$AbstractCashSelection - MaxLineLength:AbstractCashSelection.kt$AbstractCashSelection$ @Suspendable fun unconsumedCashStatesForSpending(services: ServiceHub, amount: Amount<Currency>, onlyFromIssuerParties: Set<AbstractParty> = emptySet(), notary: Party? = null, lockId: UUID, withIssuerRefs: Set<OpaqueBytes> = emptySet()): List<StateAndRef<Cash.State>> MaxLineLength:AbstractCashSelection.kt$AbstractCashSelection$ protected abstract fun executeQuery(connection: Connection, amount: Amount<Currency>, lockId: UUID, notary: Party?, onlyFromIssuerParties: Set<AbstractParty>, withIssuerRefs: Set<OpaqueBytes>, withResultSet: (ResultSet) -> Boolean): Boolean MaxLineLength:AbstractCashSelection.kt$AbstractCashSelection$log.trace("Coin selection for $amount retrieved ${stateAndRefs.count()} states totalling $totalPennies pennies: $stateAndRefs") MaxLineLength:AbstractCashSelection.kt$AbstractCashSelection$log.trace("Coin selection requested $amount but retrieved $totalPennies pennies with state refs: ${stateAndRefs.map { it.ref }}") MaxLineLength:AbstractCashSelection.kt$AbstractCashSelection$onlyFromIssuerParties: Set<AbstractParty> MaxLineLength:AbstractCashSelection.kt$AbstractCashSelection$private - MaxLineLength:AbstractCashSelection.kt$AbstractCashSelection$val durationMillis = (minOf(retrySleep.shl(retryCount), retryCap / 2) * (1.0 + Math.random())).toInt() - MaxLineLength:AbstractCashSelection.kt$AbstractCashSelection.Companion$"\nPlease specify an implementation in META-INF/services/${AbstractCashSelection::class.qualifiedName}." - MaxLineLength:AbstractCashSelection.kt$AbstractCashSelection.Companion$val cashSelectionAlgos = ServiceLoader.load(AbstractCashSelection::class.java, this::class.java.classLoader).toList() MaxLineLength:AbstractCashSelection.kt$AbstractCashSelection.Companion${ instance.set(cashSelectionAlgo) cashSelectionAlgo } + MaxLineLength:AbstractConcatenatedList.kt$AbstractConcatenatedList$abstract + MaxLineLength:AbstractFlattenedList.kt$AbstractFlattenedList$abstract MaxLineLength:AbstractNode.kt$AbstractNode$" for it exists in the database. This suggests the identity for this node has been lost. Shutting down to prevent network map issues." MaxLineLength:AbstractNode.kt$AbstractNode$"Private key for the node legal identity not found (alias $legalIdentityPrivateKeyAlias) but the corresponding public key" - MaxLineLength:AbstractNode.kt$AbstractNode$"match what's in the key store: $subject. You might need to adjust the configuration of `notary.serviceLegalName`." - MaxLineLength:AbstractNode.kt$AbstractNode$"or if you don't have one yet, fill out the config file and run corda.jar initial-registration. " - MaxLineLength:AbstractNode.kt$AbstractNode$( CertificateType.LEGAL_IDENTITY, nodeCaCert.subjectX500Principal, nodeCaCert.publicKey, cryptoService.getSigner(X509Utilities.CORDA_CLIENT_CA), nodeCaCert.subjectX500Principal, legalIdentityPublicKey, // TODO this might be smaller than DEFAULT_VALIDITY_WINDOW, shall we strictly apply DEFAULT_VALIDITY_WINDOW? X509Utilities.getCertificateValidityWindow( DEFAULT_VALIDITY_WINDOW.first, DEFAULT_VALIDITY_WINDOW.second, nodeCaCert) ) - MaxLineLength:AbstractNode.kt$AbstractNode$/** * Should be [rx.schedulers.Schedulers.io] for production, * or [rx.internal.schedulers.CachedThreadScheduler] (with shutdown registered with [runOnStop]) for shared-JVM testing. */ protected abstract val rxIoScheduler: Scheduler MaxLineLength:AbstractNode.kt$AbstractNode$// Ideally we should be disabling the FinalityHandler if it's not needed, to prevent any party from submitting transactions to us without // us checking. Previously this was gated on app target version and if there were no apps with target version <= 3 then the handler would // be disabled. However this prevents seemless rolling-upgrades and so it was removed until a better solution comes along. private fun installFinalityHandler() - MaxLineLength:AbstractNode.kt$AbstractNode$// TODO Cancelling parameters updates - if we do that, how we ensure that no one uses cancelled parameters in the transactions? val networkMapUpdater = NetworkMapUpdater( networkMapCache, NodeInfoWatcher( configuration.baseDirectory, @Suppress("LeakingThis") rxIoScheduler, Duration.ofMillis(configuration.additionalNodeInfoPollingFrequencyMsec) ), networkMapClient, configuration.baseDirectory, configuration.extraNetworkMapKeys, networkParametersStorage ).closeOnStop() MaxLineLength:AbstractNode.kt$AbstractNode$// There is already a party in the identity store for this node, but the key has been lost. If this node starts up, it will // publish it's new key to the network map, which Corda cannot currently handle. To prevent this, stop the node from starting. "Private key for the node legal identity not found (alias $legalIdentityPrivateKeyAlias) but the corresponding public key" + " for it exists in the database. This suggests the identity for this node has been lost. Shutting down to prevent network map issues." MaxLineLength:AbstractNode.kt$AbstractNode$AllCertificateStores MaxLineLength:AbstractNode.kt$AbstractNode$CheckpointVerifier.verifyCheckpointsCompatible(checkpointStorage, cordappProvider.cordapps, versionInfo.platformVersion, services, tokenizableServices) - MaxLineLength:AbstractNode.kt$AbstractNode$ServiceInstantiationException : CordaException - MaxLineLength:AbstractNode.kt$AbstractNode$cordapp.initiatedFlows.groupBy { it.requireAnnotation<InitiatedBy>().value.java } MaxLineLength:AbstractNode.kt$AbstractNode$database.startHikariPool(props, configuration.database, schemaService.internalSchemas(), metricRegistry, this.cordappLoader, configuration.baseDirectory, configuration.myLegalName) MaxLineLength:AbstractNode.kt$AbstractNode$flowManager.registerInitiatedCoreFlowFactory(ContractUpgradeFlow.Initiate::class, NotaryChangeHandler::class, ::ContractUpgradeHandler) - MaxLineLength:AbstractNode.kt$AbstractNode$flowManager.registerInitiatedCoreFlowFactory(NotaryChangeFlow::class, NotaryChangeHandler::class, ::NotaryChangeHandler) - MaxLineLength:AbstractNode.kt$AbstractNode$flowManager.registerInitiatedCoreFlowFactory(SwapIdentitiesFlow::class, SwapIdentitiesHandler::class, ::SwapIdentitiesHandler) - MaxLineLength:AbstractNode.kt$AbstractNode$if (!cryptoService.containsKey(legalIdentityPrivateKeyAlias) && !signingCertificateStore.contains(legalIdentityPrivateKeyAlias)) { // Directly use the X500 name to public key map, as the identity service requires the node identity to start correctly. database.transaction { val x500Map = PersistentIdentityService.createX500ToKeyMap(cacheFactory) require(configuration.myLegalName !in x500Map) { // There is already a party in the identity store for this node, but the key has been lost. If this node starts up, it will // publish it's new key to the network map, which Corda cannot currently handle. To prevent this, stop the node from starting. "Private key for the node legal identity not found (alias $legalIdentityPrivateKeyAlias) but the corresponding public key" + " for it exists in the database. This suggests the identity for this node has been lost. Shutting down to prevent network map issues." } } log.info("$legalIdentityPrivateKeyAlias not found in key store, generating fresh key!") createAndStoreLegalIdentity(legalIdentityPrivateKeyAlias) signingCertificateStore = configuration.signingCertificateStore.get() // We need to resync after [createAndStoreLegalIdentity]. } else { checkAliasMismatch(legalIdentityPrivateKeyAlias, signingCertificateStore) } - MaxLineLength:AbstractNode.kt$AbstractNode$log - MaxLineLength:AbstractNode.kt$AbstractNode$log.error("Corda service ${it.name} failed to instantiate. Reason was: ${e.cause?.rootMessage}", e.cause) - MaxLineLength:AbstractNode.kt$AbstractNode$log.error("Error while adding key fingerprint $it to cordappSignerKeyFingerprintBlacklist due to ${e.message}", e) MaxLineLength:AbstractNode.kt$AbstractNode$log.warn("Found more than one node registration with our legal name, this is only expected if our keypair has been regenerated") - MaxLineLength:AbstractNode.kt$AbstractNode$networkParametersStorage.setCurrentParameters(signedNetParams, trustRoot) identityService.loadIdentities(nodeInfo.legalIdentitiesAndCerts) attachments.start() cordappProvider.start() nodeProperties.start() // Place the long term identity key in the KMS. Eventually, this is likely going to be separated again because // the KMS is meant for derived temporary keys used in transactions, and we're not supposed to sign things with // the identity key. But the infrastructure to make that easy isn't here yet. keyManagementService.start(keyPairs) val notaryService = maybeStartNotaryService(myNotaryIdentity) installCordaServices() contractUpgradeService.start() vaultService.start() ScheduledActivityObserver.install(vaultService, schedulerService, flowLogicRefFactory) val frozenTokenizableServices = tokenizableServices!! tokenizableServices = null verifyCheckpointsCompatible(frozenTokenizableServices) checkpointDumper.start(frozenTokenizableServices) smm.start(frozenTokenizableServices) // Shut down the SMM so no Fibers are scheduled. runOnStop += { smm.stop(acceptableLiveFiberCountOnStop()) } (smm as? StateMachineManagerInternal)?.let { val flowMonitor = FlowMonitor({ smm.snapshot().filter { flow -> flow !in smm.flowHospital }.toSet() }, configuration.flowMonitorPeriodMillis, configuration.flowMonitorSuspensionLoggingThresholdMillis) runOnStop += flowMonitor::stop flowMonitor.start() } schedulerService.start() createStartedNode(nodeInfo, rpcOps, notaryService).also { _started = it } + MaxLineLength:AbstractNode.kt$AbstractNode$parseSecureHashConfiguration(configuration.blacklistedAttachmentSigningKeys) { "Error while adding signing key $it to blacklistedAttachmentSigningKeys" } + MaxLineLength:AbstractNode.kt$AbstractNode$parseSecureHashConfiguration(configuration.cordappSignerKeyFingerprintBlacklist) { "Error while adding key fingerprint $it to blacklistedAttachmentSigningKeys" } MaxLineLength:AbstractNode.kt$AbstractNode$private - MaxLineLength:AbstractNode.kt$AbstractNode$protected open - MaxLineLength:AbstractNode.kt$AbstractNode$protected open fun generateKeyPair(alias: String) - MaxLineLength:AbstractNode.kt$AbstractNode$protected val cacheFactory = cacheFactoryPrototype.bindWithConfig(configuration).bindWithMetrics(metricRegistry).tokenize() - MaxLineLength:AbstractNode.kt$AbstractNode$return NodeVaultService(platformClock, keyManagementService, services, database, schemaService, cordappLoader.appClassLoader) - MaxLineLength:AbstractNode.kt$AbstractNode$signingCertificateStore = configuration.signingCertificateStore.get() MaxLineLength:AbstractNode.kt$AbstractNode$throw ConfigurationException("The name '$legalName' for $NODE_IDENTITY_ALIAS_PREFIX doesn't match what's in the key store: $subject") MaxLineLength:AbstractNode.kt$AbstractNode$throw ConfigurationException("The name of the notary service '$serviceLegalName' for $DISTRIBUTED_NOTARY_ALIAS_PREFIX doesn't " + "match what's in the key store: $subject. You might need to adjust the configuration of `notary.serviceLegalName`.") - MaxLineLength:AbstractNode.kt$AbstractNode$throw IllegalArgumentException("At least one of the keystores or truststore passwords does not match configuration.") MaxLineLength:AbstractNode.kt$AbstractNode$throw IllegalStateException("CryptoService and signingCertificateStore are not aligned, the entry for key-alias: $alias is only found in $keyExistsIn") - MaxLineLength:AbstractNode.kt$AbstractNode$val (netParams, signedNetParams) = NetworkParametersReader(trustRoot, networkMapClient, configuration.baseDirectory).read() - MaxLineLength:AbstractNode.kt$AbstractNode$val certificates = if (cryptoService.containsKey(compositeKeyAlias) && signingCertificateStore.contains(compositeKeyAlias)) { val certificate = signingCertificateStore[compositeKeyAlias] // We have to create the certificate chain for the composite key manually, this is because we don't have a keystore // provider that understand compositeKey-privateKey combo. The cert chain is created using the composite key certificate + // the tail of the private key certificates, as they are both signed by the same certificate chain. listOf(certificate) + privateKeyAliasCertChain.drop(1) } else { checkAliasMismatch(compositeKeyAlias, signingCertificateStore) // If [compositeKeyAlias] does not exist, we assume the notary is CFT, and each cluster member shares the same notary key pair. privateKeyAliasCertChain } - MaxLineLength:AbstractNode.kt$AbstractNode$val certificates: List<X509Certificate> = signingCertificateStore.query { getCertificateChain(legalIdentityPrivateKeyAlias) } - MaxLineLength:AbstractNode.kt$AbstractNode$val checkpointDumper = CheckpointDumper(checkpointStorage, database, services, services.configuration.baseDirectory) MaxLineLength:AbstractNode.kt$AbstractNode$val cordappProvider = CordappProviderImpl(cordappLoader, CordappConfigFileProvider(configuration.cordappDirectories), attachments).tokenize() - MaxLineLength:AbstractNode.kt$AbstractNode$val extendedServiceConstructor = serviceClass.getDeclaredConstructor(AppServiceHub::class.java).apply { isAccessible = true } - MaxLineLength:AbstractNode.kt$AbstractNode$val keyExistsIn: String = if (cryptoService.containsKey(alias)) "CryptoService" else "signingCertificateStore" - MaxLineLength:AbstractNode.kt$AbstractNode$val networkMapClient: NetworkMapClient? = configuration.networkServices?.let { NetworkMapClient(it.networkMapURL, versionInfo) } MaxLineLength:AbstractNode.kt$AbstractNode$val servicesForResolution = ServicesForResolutionImpl(identityService, attachments, cordappProvider, networkParametersStorage, transactionStorage).also { attachments.servicesForResolution = it } - MaxLineLength:AbstractNode.kt$AbstractNode${ // Directly use the X500 name to public key map, as the identity service requires the node identity to start correctly. database.transaction { val x500Map = PersistentIdentityService.createX500ToKeyMap(cacheFactory) require(configuration.myLegalName !in x500Map) { // There is already a party in the identity store for this node, but the key has been lost. If this node starts up, it will // publish it's new key to the network map, which Corda cannot currently handle. To prevent this, stop the node from starting. "Private key for the node legal identity not found (alias $legalIdentityPrivateKeyAlias) but the corresponding public key" + " for it exists in the database. This suggests the identity for this node has been lost. Shutting down to prevent network map issues." } } log.info("$legalIdentityPrivateKeyAlias not found in key store, generating fresh key!") createAndStoreLegalIdentity(legalIdentityPrivateKeyAlias) signingCertificateStore = configuration.signingCertificateStore.get() // We need to resync after [createAndStoreLegalIdentity]. } - MaxLineLength:AbstractNode.kt$AbstractNode${ // The following will throw IOException if key file not found or KeyStoreException if keystore password is incorrect. val sslKeyStore = configuration.p2pSslOptions.keyStore.get() val signingCertificateStore = configuration.signingCertificateStore.get() val trustStore = configuration.p2pSslOptions.trustStore.get() AllCertificateStores(trustStore, sslKeyStore, signingCertificateStore) } - MaxLineLength:AbstractNode.kt$AbstractNode${ checkAliasMismatch(compositeKeyAlias, signingCertificateStore) // If [compositeKeyAlias] does not exist, we assume the notary is CFT, and each cluster member shares the same notary key pair. privateKeyAliasCertChain } - MaxLineLength:AbstractNode.kt$AbstractNode${ val certificate = signingCertificateStore[compositeKeyAlias] // We have to create the certificate chain for the composite key manually, this is because we don't have a keystore // provider that understand compositeKey-privateKey combo. The cert chain is created using the composite key certificate + // the tail of the private key certificates, as they are both signed by the same certificate chain. listOf(certificate) + privateKeyAliasCertChain.drop(1) } - MaxLineLength:AbstractNode.kt$AbstractNode${ val loadedServices = cordappLoader.cordapps.flatMap { it.services } // This sets the Cordapp classloader on the contextClassLoader of the current thread, prior to initializing services // Needed because of bug CORDA-2653 - some Corda services can utilise third-party libraries that require access to // the Thread context class loader val oldContextClassLoader: ClassLoader? = Thread.currentThread().contextClassLoader try { Thread.currentThread().contextClassLoader = cordappLoader.appClassLoader loadedServices.forEach { try { installCordaService(it) } catch (e: NoSuchMethodException) { log.error("${it.name}, as a Corda service, must have a constructor with a single parameter of type " + ServiceHub::class.java.name) } catch (e: ServiceInstantiationException) { if (e.cause != null) { log.error("Corda service ${it.name} failed to instantiate. Reason was: ${e.cause?.rootMessage}", e.cause) } else { log.error("Corda service ${it.name} failed to instantiate", e) } } catch (e: Exception) { log.error("Unable to install Corda service ${it.name}", e) } } } finally { Thread.currentThread().contextClassLoader = oldContextClassLoader } } MaxLineLength:AbstractNode.kt$AbstractNode.AppServiceHubImpl$private MaxLineLength:AbstractNode.kt$AbstractNode.AppServiceHubImpl$require(logicType.isAnnotationPresent(StartableByService::class.java)) { "${logicType.name} was not designed for starting by a CordaService" } - MaxLineLength:AbstractNode.kt$AbstractNode.ServiceHubInternalImpl$inner - MaxLineLength:AbstractNode.kt$AbstractNode.ServiceHubInternalImpl$override val networkParametersService: NetworkParametersStorage get() = this@AbstractNode.networkParametersStorage - MaxLineLength:AbstractNode.kt$AbstractNode.ServiceHubInternalImpl$override val transactionVerifierService: TransactionVerifierService get() = this@AbstractNode.transactionVerifierService - MaxLineLength:AbstractNode.kt$AbstractNode<S> : SingletonSerializeAsToken - MaxLineLength:AbstractNode.kt$FlowStarterImpl : FlowStarter - MaxLineLength:AbstractNode.kt$JavaTypeDescriptorRegistry.INSTANCE.addDescriptor(AbstractPartyDescriptor(wellKnownPartyFromX500Name, wellKnownPartyFromAnonymous)) MaxLineLength:AbstractNode.kt$ex is HikariPool.PoolInitializationException -> throw CouldNotCreateDataSourceException("Could not connect to the database. Please check your JDBC connection URL, or the connectivity to the database.", ex) MaxLineLength:AbstractNode.kt$ex.cause is ClassNotFoundException -> throw CouldNotCreateDataSourceException("Could not find the database driver class. Please add it to the 'drivers' folder. See: https://docs.corda.net/corda-configuration-file.html") MaxLineLength:AbstractNode.kt$fun CordaPersistence.startHikariPool(hikariProperties: Properties, databaseConfig: DatabaseConfig, schemas: Set<MappedSchema>, metricRegistry: MetricRegistry? = null, cordappLoader: CordappLoader? = null, currentDir: Path? = null, ourName: CordaX500Name) + MaxLineLength:AbstractNode.kt$org.hibernate.type.descriptor.java.JavaTypeDescriptorRegistry.INSTANCE.addDescriptor(AbstractPartyDescriptor(wellKnownPartyFromX500Name, wellKnownPartyFromAnonymous)) MaxLineLength:AbstractNode.kt$return ClientRpcSslOptions(trustStorePath = nodeRpcOptions.sslConfig!!.keyStorePath, trustStorePassword = nodeRpcOptions.sslConfig!!.keyStorePassword) - MaxLineLength:AbstractNode.kt$return CordaPersistence(databaseConfig, schemaService.schemaOptions.keys, jdbcUrl, cacheFactory, attributeConverters, customClassLoader) MaxLineLength:AbstractNode.kt$val attributeConverters = listOf(PublicKeyToTextConverter(), AbstractPartyToX500NameAsStringConverter(wellKnownPartyFromX500Name, wellKnownPartyFromAnonymous)) - MaxLineLength:AbstractNodeTests.kt$AbstractNodeTests$return "jdbc:h2:file:$baseDir/persistence;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;WRITE_DELAY=100;AUTO_SERVER_PORT=0" - MaxLineLength:AbstractNodeTests.kt$AbstractNodeTests${ // Note this test also covers a transaction that CordaPersistence does while it's instantiating: val database = configureDatabase(hikariProperties(freshURL()), DatabaseConfig(), { null }, { null }) val log = mock<Logger>() // Don't care what happens here. // Actually 10 is enough to reproduce old code hang, as pool size is 10 and we leaked 9 connections and 1 is in flight: repeat(100) { logVendorString(database, log) } } - MaxLineLength:AbstractParty.kt$AbstractParty$ override fun equals(other: Any?): Boolean MaxLineLength:AbstractPartyDescriptor.kt$AbstractPartyDescriptor$private val wellKnownPartyFromAnonymous: (AbstractParty) -> Party? MaxLineLength:AbstractPartyToX500NameAsStringConverter.kt$AbstractPartyToX500NameAsStringConverter$private val wellKnownPartyFromAnonymous: (AbstractParty) -> Party? MaxLineLength:AbstractRPCTest.kt$AbstractRPCTest$startInVmRpcServer(ops = ops, rpcUser = rpcUser, configuration = serverConfiguration, queueDrainTimeout = queueDrainTimeout) - MaxLineLength:AbstractRPCTest.kt$AbstractRPCTest$startRpcClient<I>(broker.hostAndPort!!, rpcUser.username, rpcUser.password, clientConfiguration) MaxLineLength:AbstractStateReplacementFlow.kt$AbstractStateReplacementFlow$Acceptor<in T> : FlowLogic MaxLineLength:AbstractStateReplacementFlow.kt$AbstractStateReplacementFlow$Instigator<out S : ContractState, out T : ContractState, out M> : FlowLogic - MaxLineLength:AbstractStateReplacementFlow.kt$AbstractStateReplacementFlow$Proposal<out M> - MaxLineLength:AbstractStateReplacementFlow.kt$AbstractStateReplacementFlow.Acceptor$ @Throws(StateReplacementException::class) protected abstract fun verifyProposal(stx: SignedTransaction, proposal: Proposal<T>) - MaxLineLength:AbstractStateReplacementFlow.kt$AbstractStateReplacementFlow.Acceptor$override val progressTracker: ProgressTracker = Acceptor.tracker() - MaxLineLength:AbstractStateReplacementFlow.kt$AbstractStateReplacementFlow.Acceptor$require(myKey in requiredKeys) { "Party is not a participant for any of the input states of transaction ${stx.id}" } MaxLineLength:AbstractStateReplacementFlow.kt$AbstractStateReplacementFlow.Instigator$@Suspendable private MaxLineLength:AbstractStateReplacementFlow.kt$AbstractStateReplacementFlow.Instigator$return excludeHostNode(serviceHub, groupAbstractPartyByWellKnownParty(serviceHub, originalState.state.data.participants)).map { initiateFlow(it.key) to it.value } - MaxLineLength:Action.kt$Action$RetryFlowFromSafePoint : Action - MaxLineLength:Action.kt$Action$ScheduleFlowTimeout : Action - MaxLineLength:Action.kt$Action.PersistCheckpoint$data - MaxLineLength:Action.kt$FlowRemovalReason${ data class OrderlyFinish(val flowReturnValue: Any?) : FlowRemovalReason() data class ErrorFinish(val flowErrors: List<FlowError>) : FlowRemovalReason() object SoftShutdown : FlowRemovalReason() { override fun toString() = "SoftShutdown" } // TODO Should we remove errored flows? How will the flow hospital work? Perhaps keep them in memory for a while, flush // them after a timeout, reload them on flow hospital request. In any case if we ever want to remove them // (e.g. temporarily) then add a case for that here. } MaxLineLength:ActionExecutorImpl.kt$ActionExecutorImpl$flowMessaging.sendSessionMessage(sessionState.peerParty, existingMessage, SenderDeduplicationId(deduplicationId, action.senderUUID)) MaxLineLength:ActionExecutorImpl.kt$ActionExecutorImpl$private val checkpointBandwidth = metrics.register("Flows.CheckpointVolumeBytesPerSecondCurrent", LatchedGauge(checkpointSizesThisSecond)) MaxLineLength:ActionExecutorImpl.kt$ActionExecutorImpl$private val checkpointBandwidthHist = metrics.register("Flows.CheckpointVolumeBytesPerSecondHist", Histogram(SlidingTimeWindowArrayReservoir(1, TimeUnit.DAYS))) - MaxLineLength:AdditionP2PAddressModeTest.kt$AdditionP2PAddressModeTest$driver - MaxLineLength:AdditionP2PAddressModeTest.kt$AdditionP2PAddressModeTest$haConfig["additionalP2PAddresses"] = ConfigValueFactory.fromIterable(listOf(altAddress)) - MaxLineLength:AdditionP2PAddressModeTest.kt$AdditionP2PAddressModeTest$startNode(providedName = DUMMY_BANK_A_NAME, rpcUsers = listOf(testUser), customOverrides = haConfig) MaxLineLength:AdditionP2PAddressModeTest.kt$AdditionP2PAddressModeTest$startNode(providedName = DUMMY_BANK_B_NAME, rpcUsers = listOf(testUser), customOverrides = mapOf("p2pAddress" to portAllocation.nextHostAndPort().toString())) - MaxLineLength:Address.kt$Address.Companion$return Validated.invalid(sequenceOf("Value format is \"<host(String)>:<port:(Int)>\"").map(mapError).toSet()) MaxLineLength:AddressBindingFailureTests.kt$AddressBindingFailureTests$@Test fun `H2 address`() - MaxLineLength:AddressBindingFailureTests.kt$AddressBindingFailureTests$@Test fun `rpc address`() MaxLineLength:AddressBindingFailureTests.kt$AddressBindingFailureTests$@Test fun `rpc admin address`() MaxLineLength:AddressBindingFailureTests.kt$AddressBindingFailureTests$assertThat(exception.addresses).contains(address).withFailMessage("Expected addresses to contain $address but was ${exception.addresses}.") MaxLineLength:AddressBindingFailureTests.kt$AddressBindingFailureTests$assertThatThrownBy { startNode(customOverrides = overrides(address)).getOrThrow() } MaxLineLength:AddressBindingFailureTests.kt$AddressBindingFailureTests$driver - MaxLineLength:AffinityExecutor.kt$AffinityExecutor$ fun executeASAP(runnable: () -> Unit) - MaxLineLength:AggregatedList.kt$AggregatedList<A, E : Any, K : Any> : TransformationList MaxLineLength:AliasPrivateKeyTest.kt$AliasPrivateKeyTest$signingCertStore.query { setPrivateKey(alias, aliasPrivateKey, listOf(NOT_YET_REGISTERED_MARKER_KEYS_AND_CERTS.ECDSAR1_CERT), "entrypassword") } MaxLineLength:AliasPrivateKeyTest.kt$AliasPrivateKeyTest$val signingCertStore = CertificateStoreStubs.Signing.withCertificatesDirectory(certificatesDirectory, "keystorepass").get(createNew = true) MaxLineLength:AliasPrivateKeyTest.kt$AliasPrivateKeyTest${ val alias = "01234567890" val aliasPrivateKey = AliasPrivateKey(alias) val certificatesDirectory = tempFolder.root.toPath() val signingCertStore = CertificateStoreStubs.Signing.withCertificatesDirectory(certificatesDirectory, "keystorepass").get(createNew = true) signingCertStore.query { setPrivateKey(alias, aliasPrivateKey, listOf(NOT_YET_REGISTERED_MARKER_KEYS_AND_CERTS.ECDSAR1_CERT), "entrypassword") } // We can retrieve the certificate. assertTrue { signingCertStore.contains(alias) } // We can retrieve the certificate. assertEquals(NOT_YET_REGISTERED_MARKER_KEYS_AND_CERTS.ECDSAR1_CERT, signingCertStore[alias]) // Although we can store an AliasPrivateKey, we cannot retrieve it. But, it's fine as we use certStore for storing/handling certs only. assertThatIllegalArgumentException().isThrownBy { signingCertStore.query { getPrivateKey(alias, "entrypassword") } }.withMessage("Unrecognised algorithm: 1.3.6.1.4.1.50530.1.2") } - MaxLineLength:AllButBlacklisted.kt$AllButBlacklisted : ClassWhitelist - MaxLineLength:AllButBlacklisted.kt$AllButBlacklisted$ override fun hasListed(type: Class<*>): Boolean MaxLineLength:AllButBlacklisted.kt$AllButBlacklisted$throw IllegalStateException("The $matchType $aMatch of ${type.name} is blacklisted, so it cannot be used in serialization.") - MaxLineLength:AllButBlacklisted.kt$AllButBlacklisted${ // TODO: blacklistedClasses += type.name // add it, so checking is faster next time we encounter this class. val matchType = if (Class.forName(aMatch).isInterface) "superinterface" else "superclass" throw IllegalStateException("The $matchType $aMatch of ${type.name} is blacklisted, so it cannot be used in serialization.") } - MaxLineLength:Amount.kt$Amount$Companion - MaxLineLength:Amount.kt$Amount$operator - MaxLineLength:Amount.kt$Amount$require(other.displayTokenSize == displayTokenSize) { "Token size mismatch: ${other.displayTokenSize} vs $displayTokenSize" } - MaxLineLength:Amount.kt$Amount${ // Amount represents a static balance of physical assets as managed by the distributed ledger and is not allowed // to become negative a rule further maintained by the Contract verify method. // N.B. If concepts such as an account overdraft are required this should be modelled separately via Obligations, // or similar second order smart contract concepts. require(quantity >= 0) { "Negative amounts are not allowed: $quantity" } } - MaxLineLength:Amount.kt$Amount.Companion$ @JvmStatic @JvmOverloads fun <T : Any> fromDecimal(displayQuantity: BigDecimal, token: T, rounding: RoundingMode = RoundingMode.FLOOR): Amount<T> - MaxLineLength:Amount.kt$Amount.Companion$ @JvmStatic fun <T : Any> Iterable<Amount<T>>.sumOrZero(token: T) MaxLineLength:Amount.kt$Amount<T : Any> : Comparable - MaxLineLength:Amount.kt$AmountTransfer$ @Suppress("UNUSED") fun novate(centralParty: P): List<AmountTransfer<T, P>> - MaxLineLength:Amount.kt$AmountTransfer$ fun apply(balances: List<SourceAndAmount<T, P>>, newRef: Any? = null): List<SourceAndAmount<T, P>> - MaxLineLength:Amount.kt$AmountTransfer$destination: P = this.destination MaxLineLength:Amount.kt$AmountTransfer$remaining = SourceAndAmount(payer, balance.amount.copy(quantity = Math.subtractExact(balance.amount.quantity, residual)), newRef) MaxLineLength:Amount.kt$AmountTransfer$result = 31 * result + (source.hashCode() xor destination.hashCode()) - MaxLineLength:Amount.kt$AmountTransfer.Companion$ @JvmStatic @JvmOverloads fun <T : Any, P : Any> fromDecimal(displayQuantityDelta: BigDecimal, token: T, source: P, destination: P, rounding: RoundingMode = RoundingMode.DOWN): AmountTransfer<T, P> - MaxLineLength:Amount.kt$AmountTransfer.Companion$destination: P - MaxLineLength:Amount.kt$AmountTransfer<T : Any, P : Any> MaxLineLength:Amount.kt$TokenizableAssetInfo$/** The nominal display unit size of a single token, potentially with trailing decimal display places if the scale parameter is non-zero. */ val displayTokenSize: BigDecimal - MaxLineLength:AmountTest.kt$AmountTest$assertThat(yamlMapper.valueToTree<TextNode>(Amount.parseCurrency("$250000"))).isEqualTo(TextNode("250000.00 USD")) - MaxLineLength:AmountTest.kt$AmountTest$assertThat(yamlMapper.valueToTree<TextNode>(Amount.parseCurrency("£25000000"))).isEqualTo(TextNode("25000000.00 GBP")) MaxLineLength:AmountTests.kt$AmountTests$val collector = Collectors.toMap<SourceAndAmount<Currency, String>, Pair<String, Currency>, BigDecimal>({ Pair(it.source, it.amount.token) }, { it.amount.toDecimal() }, { x, y -> x + y }) - MaxLineLength:AnalyticsEngine.kt$AnalyticsEngine$ratesProvider: ImmutableRatesProvider MaxLineLength:AnalyticsEngine.kt$OGSIMMAnalyticsEngine$ override fun calculateSensitivitiesBatch(trades: List<ResolvedSwapTrade>, pricer: DiscountingSwapProductPricer, ratesProvider: ImmutableRatesProvider): Map<ResolvedSwapTrade, CurrencyAmount> MaxLineLength:AnalyticsEngine.kt$OGSIMMAnalyticsEngine$override - MaxLineLength:AnalyticsEngine.kt$OGSIMMAnalyticsEngine$portfolioMargin: InitialMarginTriple - MaxLineLength:AnalyticsEngine.kt$OGSIMMAnalyticsEngine$ratesProvider: ImmutableRatesProvider - MaxLineLength:AnalyticsEngine.kt$OGSIMMAnalyticsEngine$val calculatorTotal = RwamBimmNotProductClassesCalculator(fxRateProvider, Currency.EUR, IsdaConfiguration.INSTANCE) MaxLineLength:AnalyticsEngine.kt$OGSIMMAnalyticsEngine$val t = BimmAnalysisUtils.computeMargin(combinedRatesProvider, normalizer, calculatorTotal, it.value.currencyParameterSensitivities, it.value.multiCurrencyAmount) MaxLineLength:AnonymousParty.kt$AnonymousParty : DestinationAbstractParty MaxLineLength:AnotherDummyContract.kt$AnotherDummyContract$return TransactionBuilder(notary).withItems(StateAndContract(state, ANOTHER_DUMMY_PROGRAM_ID), Command(Commands.Create(), owner.party.owningKey)) - MaxLineLength:AppServiceHub.kt$AppServiceHub : ServiceHub - MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase$ fun addOrUpdate(key: K, value: V, updateFn: (K, V) -> Boolean): Boolean - MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase$ fun addWithDuplicatesAllowed(key: K, value: V, logWarning: Boolean = true): Boolean MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase$ operator fun set(key: K, value: V) - MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase$Transactional.InFlight(this, key, _readerValueLoader = { loadValue(key) }).apply { alsoWrite(value) } MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase$log.warn("Double insert in ${this.javaClass.name} for entity class $persistentEntityClass key $key, not inserting the second time") MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase$oldValueInCache MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase${ // IMPORTANT: The flush is needed because detach() makes the queue of unflushed entries invalid w.r.t. Hibernate internal state if the found entity is unflushed. // We want the detach() so that we rely on our cache memory management and don't retain strong references in the Hibernate session. session.flush() } - MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase${ // If someone is writing (but not us) // For those not writing, they need to re-load the value from the database (which their database transaction MIGHT see). // For those writing, they need to re-load the value from the database (which their database transaction CAN see). Transactional.InFlight(this, key, { loadValue(key) }, { loadValue(key)!! }) } - MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase${ // If we found a value already in the database, and we were not already writing, then it's already committed but got evicted. Transactional.Committed(oldValue) } MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase${ // Some database transactions, including us, writing, with readers seeing whatever is in the database and writers seeing the (in memory) value. Transactional.InFlight(this, key, _readerValueLoader = { loadValue(key) }).apply { alsoWrite(value) } } - MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase${ // Someone else is writing, so store away! val retainedValueFromDB = store(key, value) wasWritten = (retainedValueFromDB == null) // If the store function claims the value is new in the DB, then either the value is brand new or updated. In this case, // update the old value in the cache with the new value. Otherwise, leave it as it was before. if (wasWritten) { oldValueInCache.apply { alsoWrite(value) } } else { oldValueInCache } } - MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase${ val retainedValueFromDB = store(key, value) wasWritten = (retainedValueFromDB == null) // If the value has been updated, then isUnique will be true. In this case, the Committed value needs to be replaced // with InFlight to indicate that this transaction has changed the value associated with this key. Note that this allows // for cases where the value passed to set differs from that in the cache, but an update function has decided that this // differing value should not be written to the database. if (wasWritten) { Transactional.InFlight(this, key, _readerValueLoader = { loadValue(key) }).apply { alsoWrite(value) } } else { oldValueInCache } } - MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase.Transactional$InFlight<K, T> : Transactional - MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase.Transactional.InFlight$// The value from the perspective of the eviction algorithm of the cache. i.e. we want to reveal memory footprint to it etc. override val peekableValue: T? get() = if (writerValueLoader.get() != _writerValueLoader) writerValueLoader.get()() else if (readerValueLoader.get() != _readerValueLoader) readerValueLoader.get()() else null MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase.Transactional.InFlight$get() = if (isPresentAsWriter) loadAsWriter() else if (isPresentAsReader) loadAsReader()!! else throw NoSuchElementException("Not present") MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase.Transactional.InFlight$get() = if (writerValueLoader.get() != _writerValueLoader) writerValueLoader.get()() else if (readerValueLoader.get() != _readerValueLoader) readerValueLoader.get()() else null MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase.Transactional.InFlight$private val _writerValueLoader: () -> T = { throw IllegalAccessException("No value loader provided") } MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase.Transactional.InFlight${ // Make the lazy loader the writers see actually just return the value that has been set. writerValueLoader.set { _value } // We make all these vals so that the lambdas do not need a reference to this, and so the onCommit only has a weak ref to the value. // We want this so that the cache could evict the value (due to memory constraints etc) without the onCommit callback // retaining what could be a large memory footprint object. val tx = contextTransaction val strongKey = key val strongMap = map if (map.addPendingKey(key, tx)) { // If the transaction commits, update cache to make globally visible if we're first for this key, // and then stop saying the transaction is writing the key. tx.onCommit { strongMap.cache.asMap().computeIfPresent(strongKey) { _, transactional: Transactional<T> -> if (transactional is Transactional.InFlight<*, T>) { transactional.committed.set(true) val value = transactional.peekableValue if (value != null) { Transactional.Committed(value) } else { transactional } } else { transactional } } strongMap.removePendingKey(strongKey, tx) } // If the transaction rolls back, stop saying this transaction is writing the key. tx.onRollback { strongMap.removePendingKey(strongKey, tx) } } } - MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase.Transactional.Unknown$val readValue = _valueLoader() // We re-write the value into the cache so that any weigher can re-assess the weight based on the loaded value. map.cache.asMap().compute(key) { _, oldValue -> if (oldValue === this@Unknown) { if (readValue == null) Missing() else Committed(readValue) } else oldValue } readValue - MaxLineLength:AppendOnlyPersistentMap.kt$AppendOnlyPersistentMapBase<K, V, E, out EK> MaxLineLength:AppendOnlyPersistentMapNonConcurrentTest.kt$AppendOnlyPersistentMapNonConcurrentTest$NodeSchemaService(setOf(MappedSchema(AppendOnlyPersistentMapTest::class.java, 1, listOf(AppendOnlyPersistentMapNonConcurrentTest.PersistentMapEntry::class.java)))) - MaxLineLength:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest$NodeSchemaService(setOf(MappedSchema(AppendOnlyPersistentMapTest::class.java, 1, listOf(PersistentMapEntry::class.java)))) MaxLineLength:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest$Scenario(true, ReadOrWrite.Write, ReadOrWrite.Read, Outcome.SuccessButErrorOnCommit, Outcome.Success) to Scenario(true, ReadOrWrite.Write, ReadOrWrite.Read, Outcome.SuccessButErrorOnCommit, Outcome.SuccessButErrorOnCommit) MaxLineLength:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest$val remapped = mapOf(Scenario(true, ReadOrWrite.Read, ReadOrWrite.Write, Outcome.Success, Outcome.Fail) to Scenario(true, ReadOrWrite.Read, ReadOrWrite.Write, Outcome.Success, Outcome.SuccessButErrorOnCommit)) MaxLineLength:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest$val remapped = mapOf(Scenario(true, ReadOrWrite.Read, ReadOrWrite.Write, Outcome.Success, Outcome.Fail) to Scenario(true, ReadOrWrite.Read, ReadOrWrite.Write, Outcome.SuccessButErrorOnCommit, Outcome.SuccessButErrorOnCommit), Scenario(true, ReadOrWrite.Write, ReadOrWrite.Read, Outcome.SuccessButErrorOnCommit, Outcome.Success) to Scenario(true, ReadOrWrite.Write, ReadOrWrite.Read, Outcome.SuccessButErrorOnCommit, Outcome.SuccessButErrorOnCommit)) MaxLineLength:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest${ // Writes intentionally do not check the database first, so purging between read and write changes behaviour // Also, a purge after write causes the subsequent read to flush to the database, causing the read to generate a constraint violation when single threaded (in same database transaction). val remapped = mapOf(Scenario(true, ReadOrWrite.Read, ReadOrWrite.Write, Outcome.Success, Outcome.Fail) to Scenario(true, ReadOrWrite.Read, ReadOrWrite.Write, Outcome.SuccessButErrorOnCommit, Outcome.SuccessButErrorOnCommit), Scenario(true, ReadOrWrite.Write, ReadOrWrite.Read, Outcome.SuccessButErrorOnCommit, Outcome.Success) to Scenario(true, ReadOrWrite.Write, ReadOrWrite.Read, Outcome.SuccessButErrorOnCommit, Outcome.SuccessButErrorOnCommit)) scenario = remapped[scenario] ?: scenario prepopulateIfRequired() val map = createMap() val a = TestThread("A", map, true).apply { phase1.countDown() phase3.countDown() } val b = TestThread("B", map, true).apply { phase1.countDown() phase3.countDown() } try { database.transaction { a.run() map.invalidate() b.run() } } catch (t: PersistenceException) { // This only helps if thrown on commit, otherwise other latches not counted down. assertEquals(t.message, Outcome.SuccessButErrorOnCommit, a.outcome) } a.await(a::phase4) b.await(b::phase4) assertTrue(map.pendingKeysIsEmpty()) } - MaxLineLength:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest.Companion$Scenario(false, ReadOrWrite.WriteDuplicateAllowed, ReadOrWrite.Read, Outcome.Success, Outcome.Fail, Outcome.Success) MaxLineLength:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest.Companion$Scenario(false, ReadOrWrite.WriteDuplicateAllowed, ReadOrWrite.WriteDuplicateAllowed, Outcome.Success, Outcome.SuccessButErrorOnCommit, Outcome.Fail) - MaxLineLength:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest.Companion$Scenario(true, ReadOrWrite.Write, ReadOrWrite.Write, Outcome.SuccessButErrorOnCommit, Outcome.SuccessButErrorOnCommit) - MaxLineLength:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest.Companion$Scenario(true, ReadOrWrite.WriteDuplicateAllowed, ReadOrWrite.WriteDuplicateAllowed, Outcome.Fail, Outcome.Fail) MaxLineLength:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest.TestThread$inner MaxLineLength:AppendOnlyPersistentMapTest.kt$AppendOnlyPersistentMapTest.TestThread$val outcome = if (name == "A") scenario.aExpected else if (singleThreaded) scenario.bExpectedIfSingleThreaded else scenario.bExpected - MaxLineLength:Arrangement.kt$And : Arrangement - MaxLineLength:Arrangement.kt$Obligation$data - MaxLineLength:Arrangement.kt$RollOut$data - MaxLineLength:ArraySerializer.kt$PrimBooleanArraySerializer : PrimArraySerializer MaxLineLength:ArtemisBroker.kt$fun java.io.IOException.isBindingError() - MaxLineLength:ArtemisMessagingClient.kt$ArtemisMessagingClient$private val failoverCallback: ((FailoverEventType) -> Unit)? = null - MaxLineLength:ArtemisMessagingClient.kt$ArtemisMessagingClient$val session = sessionFactory!!.createSession(NODE_P2P_USER, NODE_P2P_USER, false, true, true, false, DEFAULT_ACK_BATCH_SIZE) - MaxLineLength:ArtemisMessagingComponent.kt$ArtemisMessagingComponent.Companion$const val PEERS_PREFIX = "${INTERNAL_PREFIX}peers." //TODO Come up with better name for common peers/services queue - MaxLineLength:ArtemisMessagingComponent.kt$ArtemisMessagingComponent.Companion.P2PMessagingHeaders$/** * In the operation mode where we have an out of process bridge we cannot correctly populate the Artemis validated user header * as the TLS does not terminate directly onto Artemis. We therefore use this internal only header to forward * the equivalent information from the Float. */ val bridgedCertificateSubject = SimpleString("sender-subject-name") MaxLineLength:ArtemisMessagingComponent.kt$ArtemisMessagingComponent.RemoteInboxAddress.Companion$require(address.startsWith(PEERS_PREFIX)) { "Failed to map address: $address to a remote topic as it is not in the $PEERS_PREFIX namespace" } - MaxLineLength:ArtemisMessagingServer.kt$ArtemisMessagingServer$ private fun ConfigurationImpl.configureAddressSecurity(): Configuration MaxLineLength:ArtemisMessagingServer.kt$ArtemisMessagingServer$acceptorConfigurations = mutableSetOf(p2pAcceptorTcpTransport(NetworkHostAndPort(messagingServerAddress.host, messagingServerAddress.port), config.p2pSslOptions)) MaxLineLength:ArtemisMessagingServer.kt$ArtemisMessagingServer$deleteNonDurableQueue - MaxLineLength:ArtemisMessagingServer.kt$ArtemisMessagingServer$deleteNonDurableQueue: Boolean = false MaxLineLength:ArtemisMessagingServer.kt$ArtemisMessagingServer$journalBufferSize_AIO = maxMessageSize + JOURNAL_HEADER_SIZE MaxLineLength:ArtemisMessagingServer.kt$ArtemisMessagingServer$journalBufferSize_NIO = maxMessageSize + JOURNAL_HEADER_SIZE - MaxLineLength:ArtemisMessagingServer.kt$ArtemisMessagingServer$journalFileSize = maxMessageSize + JOURNAL_HEADER_SIZE - MaxLineLength:ArtemisMessagingServer.kt$ArtemisMessagingServer$private - MaxLineLength:ArtemisMessagingServer.kt$ArtemisMessagingServer$securityRoles["$INTERNAL_PREFIX#"] = setOf(nodeInternalRole) - MaxLineLength:ArtemisMessagingTest.kt$ArtemisMessagingTest$handle.afterDatabaseTransaction() - MaxLineLength:ArtemisMessagingTest.kt$ArtemisMessagingTest$networkMapCache = PersistentNetworkMapCache(TestingNamedCacheFactory(), database, rigorousMock()).apply { start(emptyList()) } MaxLineLength:ArtemisMessagingTest.kt$ArtemisMessagingTest$private MaxLineLength:ArtemisMessagingTest.kt$ArtemisMessagingTest$val (messagingClient, receivedMessages) = createAndStartClientAndServer(clientMaxMessageSize = 100_000, serverMaxMessageSize = 50_000) - MaxLineLength:ArtemisMessagingTest.kt$ArtemisMessagingTest${ val receivedMessages = LinkedBlockingQueue<ReceivedMessage>() createMessagingServer(maxMessageSize = serverMaxMessageSize).start() val messagingClient = createMessagingClient(platformVersion = platformVersion) messagingClient.addMessageHandler(TOPIC) { message, _, handle -> database.transaction { handle.insideDatabaseTransaction() } handle.afterDatabaseTransaction() // We ACK first so that if it fails we won't get a duplicate in [receivedMessages] receivedMessages.add(message) } startNodeMessagingClient(maxMessageSize = clientMaxMessageSize) // Run after the handlers are added, otherwise (some of) the messages get delivered and discarded / dead-lettered. thread(isDaemon = true) { messagingClient.run() } return Pair(messagingClient, receivedMessages) } - MaxLineLength:ArtemisRpcBroker.kt$ArtemisRpcBroker$throw AddressBindingException(adminAddressOptional?.let { setOf(it, addresses.primary) } ?: setOf(addresses.primary)) MaxLineLength:ArtemisRpcBroker.kt$ArtemisRpcBroker$val serverConfiguration = RpcBrokerConfiguration(baseDirectory, maxMessageSize, jmxEnabled, addresses.primary, adminAddressOptional, sslOptions, useSsl, nodeConfiguration, shouldStartLocalShell) - MaxLineLength:ArtemisRpcBroker.kt$ArtemisRpcBroker.<no name provided>$return arrayOf(AppConfigurationEntry(name, AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options)) MaxLineLength:ArtemisRpcBroker.kt$ArtemisRpcBroker.Companion$fun withSsl(configuration: MutualSslConfiguration, address: NetworkHostAndPort, adminAddress: NetworkHostAndPort, sslOptions: BrokerRpcSslOptions, securityManager: RPCSecurityManager, maxMessageSize: Int, jmxEnabled: Boolean, baseDirectory: Path, shouldStartLocalShell: Boolean): ArtemisBroker MaxLineLength:ArtemisRpcBroker.kt$ArtemisRpcBroker.Companion$fun withoutSsl(configuration: MutualSslConfiguration, address: NetworkHostAndPort, adminAddress: NetworkHostAndPort, securityManager: RPCSecurityManager, maxMessageSize: Int, jmxEnabled: Boolean, baseDirectory: Path, shouldStartLocalShell: Boolean): ArtemisBroker MaxLineLength:ArtemisRpcBroker.kt$ArtemisRpcBroker.Companion$return ArtemisRpcBroker(address, adminAddress, null, false, securityManager, maxMessageSize, jmxEnabled, baseDirectory, configuration, shouldStartLocalShell) @@ -4053,8 +2772,6 @@ MaxLineLength:ArtemisRpcTests.kt$ArtemisRpcTests$ArtemisRpcBroker.withoutSsl(nodeSSlconfig, address, adminAddress, securityManager, maxMessageSize, jmxEnabled, baseDirectory, false) MaxLineLength:ArtemisRpcTests.kt$ArtemisRpcTests$InternalRPCMessagingClient(nodeSSlconfig, adminAddress, maxMessageSize, CordaX500Name("MegaCorp", "London", "GB"), RPCServerConfiguration.DEFAULT) MaxLineLength:ArtemisRpcTests.kt$ArtemisRpcTests$private - MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport - MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$( // Basic TCP target details. TransportConstants.HOST_PROP_NAME to hostAndPort.host, TransportConstants.PORT_PROP_NAME to hostAndPort.port, // Turn on AMQP support, which needs the protocol jar on the classpath. // Unfortunately we cannot disable core protocol as artemis only uses AMQP for interop. // It does not use AMQP messages for its own messages e.g. topology and heartbeats. // TODO further investigate how to ensure we use a well defined wire level protocol for Node to Node communications. TransportConstants.PROTOCOLS_PROP_NAME to "CORE,AMQP", TransportConstants.USE_GLOBAL_WORKER_POOL_PROP_NAME to (nodeSerializationEnv != null), TransportConstants.REMOTING_THREADS_PROPNAME to (if (nodeSerializationEnv != null) -1 else 1), // turn off direct delivery in Artemis - this is latency optimisation that can lead to //hick-ups under high load (CORDA-1336) TransportConstants.DIRECT_DELIVER to false) MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$fun p2pAcceptorTcpTransport(hostAndPort: NetworkHostAndPort, config: MutualSslConfiguration?, enableSSL: Boolean = true): TransportConfiguration MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$fun p2pAcceptorTcpTransport(hostAndPort: NetworkHostAndPort, keyStore: FileBasedCertificateStoreSupplier?, trustStore: FileBasedCertificateStoreSupplier?, enableSSL: Boolean = true): TransportConfiguration MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$fun p2pConnectorTcpTransport(hostAndPort: NetworkHostAndPort, config: MutualSslConfiguration?, enableSSL: Boolean = true): TransportConfiguration @@ -4062,253 +2779,120 @@ MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$fun rpcAcceptorTcpTransport(hostAndPort: NetworkHostAndPort, config: BrokerRpcSslOptions?, enableSSL: Boolean = true): TransportConfiguration MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$fun rpcConnectorTcpTransport(hostAndPort: NetworkHostAndPort, config: ClientRpcSslOptions?, enableSSL: Boolean = true): TransportConfiguration MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$fun rpcConnectorTcpTransportsFromList(hostAndPortList: List<NetworkHostAndPort>, config: ClientRpcSslOptions?, enableSSL: Boolean = true): List<TransportConfiguration> - MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$fun rpcInternalAcceptorTcpTransport(hostAndPort: NetworkHostAndPort, config: SslConfiguration): TransportConfiguration - MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$fun rpcInternalClientTcpTransport(hostAndPort: NetworkHostAndPort, config: SslConfiguration): TransportConfiguration - MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$internal val acceptorFactoryClassName = "org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptorFactory" MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$options[TransportConstants.HANDSHAKE_TIMEOUT] = 0 MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$private MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$return TransportConfiguration(acceptorFactoryClassName, defaultArtemisOptions(hostAndPort) + defaultSSLOptions + config.toTransportOptions() + (TransportConstants.HANDSHAKE_TIMEOUT to 0)) MaxLineLength:ArtemisTcpTransport.kt$ArtemisTcpTransport.Companion$return TransportConfiguration(connectorFactoryClassName, defaultArtemisOptions(hostAndPort) + defaultSSLOptions + config.toTransportOptions()) MaxLineLength:ArtemisUtils.kt$require(messageSize <= limit) { "Message exceeds maxMessageSize network parameter, maxMessageSize: [$limit], message size: [$messageSize]" } - MaxLineLength:AssociatedList.kt$AssociatedList<K, out A, B> : ReadOnlyBackedObservableMapBase MaxLineLength:AsyncLoggerContextSelectorNoThreadLocal.kt$AsyncLoggerContextSelectorNoThreadLocal.Companion$return AsyncLoggerContextSelectorNoThreadLocal::class.java.name == PropertiesUtil.getProperties().getStringProperty(Constants.LOG4J_CONTEXT_SELECTOR) MaxLineLength:Attachment.kt$Attachment$/** * The parties that have correctly signed the whole attachment. * Even though this returns a list of party objects, it is not required that these parties exist on the network, but rather they are a mapping from the signing key to the X.500 name. * * Note: Anyone can sign attachments, not only Corda parties. It's recommended to use [signerKeys]. */ @Deprecated("Use signerKeys. There is no requirement that attachment signers are Corda parties.") val signers: List<Party> - MaxLineLength:AttachmentConstraint.kt$AttachmentConstraint$ fun isSatisfiedBy(attachment: Attachment): Boolean - MaxLineLength:AttachmentConstraint.kt$AutomaticPlaceholderConstraint : AttachmentConstraint - MaxLineLength:AttachmentConstraint.kt$AutomaticPlaceholderConstraint$throw UnsupportedOperationException("Contracts cannot be satisfied by an AutomaticPlaceholderConstraint placeholder.") MaxLineLength:AttachmentConstraint.kt$HashAttachmentConstraint$log.warn("Hash constraint check failed: $attachmentId does not match contract attachment JAR ${attachment.id} or contract attachment JAR is untrusted") - MaxLineLength:AttachmentConstraint.kt$NoConstraintPropagation - MaxLineLength:AttachmentConstraint.kt$SignatureAttachmentConstraint$log.debug("Checking signature constraints: verifying $key in contract attachment signer keys: ${attachment.signerKeys}") - MaxLineLength:AttachmentContract.kt$AttachmentContract$require(tx.attachments.any { it.id == state.hash }) {"At least one attachment in transaction must match hash ${state.hash}"} - MaxLineLength:AttachmentDemo.kt$require - MaxLineLength:AttachmentDemo.kt$require(connection.contentType == APPLICATION_OCTET_STREAM) { "Content-Type header was ${connection.contentType}" } - MaxLineLength:AttachmentDemo.kt$val bankBParty = rpc.partiesFromName("Bank B", false).firstOrNull() ?: throw IllegalArgumentException("Couldn't find Bank B party") - MaxLineLength:AttachmentDemo.kt$val connection = URL("http://localhost:$webPort/attachments/${state.hash}").openConnection() as HttpURLConnection - MaxLineLength:AttachmentDemo.kt$val notaryParty = rpc.partiesFromName("Notary", false).firstOrNull() ?: throw IllegalArgumentException("Couldn't find notary party") - MaxLineLength:AttachmentDemoTest.kt$AttachmentDemoTest$// run with a 10,000,000 bytes in-memory zip file. In practice, a slightly bigger file will be used (~10,002,000 bytes). @Test fun `attachment demo using a 10MB zip file`() MaxLineLength:AttachmentDemoTest.kt$AttachmentDemoTest$cordappsForAllNodes = listOf(findCordapp("net.corda.attachmentdemo.contracts"), findCordapp("net.corda.attachmentdemo.workflows")) - MaxLineLength:AttachmentDownloadServlet.kt$AttachmentDownloadServlet$log.warn("404 Not Found whilst trying to handle attachment download request for ${servletContext.contextPath}/$reqPath") - MaxLineLength:AttachmentLoadingTests.kt$AttachmentLoadingTests$alice.rpc.startFlow(::ConsumeAndBroadcastFlow, stateRef, bob.nodeInfo.singleIdentity()).returnValue.getOrThrow() MaxLineLength:AttachmentLoadingTests.kt$AttachmentLoadingTests$assertThatThrownBy { alice.rpc.startFlow(::ConsumeAndBroadcastFlow, stateRef, bob.nodeInfo.singleIdentity()).returnValue.getOrThrow() } - MaxLineLength:AttachmentLoadingTests.kt$AttachmentLoadingTests$assertThatThrownBy { alice.rpc.startFlow(::ConsumeAndBroadcastFlow, stateRef, bob.nodeInfo.singleIdentity()).returnValue.getOrThrow() } // ConsumeAndBroadcastResponderFlow re-throws any non-FlowExceptions with just their class name in the message so that // we can verify here Bob threw the correct exception .hasMessage(TransactionVerificationException.UntrustedAttachmentsException::class.java.name) - MaxLineLength:AttachmentLoadingTests.kt$AttachmentLoadingTests.Companion$"contaminate the tests. This is a known issue with the driver and we must work around it until it's fixed." - MaxLineLength:AttachmentLoadingTests.kt$AttachmentLoadingTests.Companion$"isolated module cannot be on the classpath as otherwise it will be pulled into the nodes the driver creates and " MaxLineLength:AttachmentLoadingTests.kt$AttachmentLoadingTests.Companion$val issuanceFlowClass: Class<FlowLogic<StateRef>> = uncheckedCast(loadFromIsolated("net.corda.isolated.workflows.IsolatedIssuanceFlow")) - MaxLineLength:AttachmentLoadingTests.kt$AttachmentLoadingTests.ConsumeAndBroadcastFlow${ val notary = serviceHub.networkMapCache.notaryIdentities[0] val stateAndRef = serviceHub.toStateAndRef<ContractState>(stateRef) val stx = serviceHub.signInitialTransaction( TransactionBuilder(notary) .addInputState(stateAndRef) .addOutputState(ConsumeContract.State()) .addCommand(Command(ConsumeContract.Cmd, ourIdentity.owningKey)) ) stx.verify(serviceHub, checkSufficientSignatures = false) val session = initiateFlow(otherSide) subFlow(FinalityFlow(stx, session)) // It's important we wait on this dummy receive, as otherwise it's possible we miss any errors the other side throws session.receive<String>().unwrap { require(it == "OK") { "Not OK: $it"} } } - MaxLineLength:AttachmentSerializationTest.kt$Attachment - MaxLineLength:AttachmentSerializationTest.kt$AttachmentSerializationTest$assertEquals("hacked", rebootClientAndGetAttachmentContent(false)) MaxLineLength:AttachmentSerializationTest.kt$AttachmentSerializationTest$client.hackAttachment(attachmentId, "hacked") MaxLineLength:AttachmentSerializationTest.kt$AttachmentSerializationTest$client.internals.disableDBCloseOnStop() MaxLineLength:AttachmentSerializationTest.kt$AttachmentSerializationTest$return (client.smm.allStateMachines[0].stateMachine.resultFuture.apply { mockNet.runNetwork() }.getOrThrow() as ClientResult).attachmentContent - MaxLineLength:AttachmentSerializationTest.kt$AttachmentSerializationTest.<no name provided>$override fun start() MaxLineLength:AttachmentSerializationTest.kt$AttachmentSerializationTest.CustomAttachmentLogic$private - MaxLineLength:AttachmentSerializationTest.kt$AttachmentSerializationTest.FetchAttachmentLogic$private - MaxLineLength:AttachmentSerializationTest.kt$AttachmentSerializationTest.OpenAttachmentLogic$private - MaxLineLength:AttachmentSerializationTest.kt$AttachmentSerializationTest.ServerLogic$private MaxLineLength:AttachmentSerializationTest.kt$val attachment = session.get<NodeAttachmentService.DBAttachment>(NodeAttachmentService.DBAttachment::class.java, attachmentId.toString()) - MaxLineLength:AttachmentStorage.kt$AttachmentStorage$ @Deprecated("More attachment information is required", replaceWith = ReplaceWith("importAttachment(jar, uploader, filename)")) @Throws(FileAlreadyExistsException::class, IOException::class) fun importAttachment(jar: InputStream): AttachmentId - MaxLineLength:AttachmentStorage.kt$AttachmentStorage$ fun getLatestContractAttachments(contractClassName: String, minContractVersion: Int = DEFAULT_CORDAPP_VERSION): List<AttachmentId> - MaxLineLength:AttachmentStorage.kt$AttachmentStorage$@Deprecated("More attachment information is required", replaceWith = ReplaceWith("importAttachment(jar, uploader, filename)")) - MaxLineLength:AttachmentStorageInternal.kt$AttachmentStorageInternal$ fun privilegedImportAttachment(jar: InputStream, uploader: String, filename: String?): AttachmentId - MaxLineLength:AttachmentTests.kt$AttachmentTests$private + MaxLineLength:AttachmentStorageInternal.kt$AttachmentStorageInternal$ fun getAllAttachmentsByCriteria(criteria: AttachmentQueryCriteria = AttachmentQueryCriteria.AttachmentsQueryCriteria()): Stream<Pair<String?, Attachment>> MaxLineLength:AttachmentTests.kt$AttachmentTests$val corruptAttachment = NodeAttachmentService.DBAttachment(attId = id.toString(), content = attachment, version = DEFAULT_CORDAPP_VERSION) MaxLineLength:AttachmentTests.kt$AttachmentTests.InitiatingFetchAttachmentsFlow$@InitiatingFlow private + MaxLineLength:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest$assertFalse(attachmentTrustCalculator.calculate(storage.openAttachment(attachmentB)!!), "Contract $attachmentB should not be trusted") + MaxLineLength:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest$assertFalse(attachmentTrustCalculator.calculate(storage.openAttachment(attachmentC)!!), "Contract $attachmentC should not be trusted (no chain of trust)") + MaxLineLength:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest$assertFalse(attachmentTrustCalculator.calculate(storage.openAttachment(v1Id)!!), "Initial attachment $v1Id should not be trusted") + MaxLineLength:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest$assertFalse(attachmentTrustCalculator.calculate(storage.openAttachment(v2Id)!!), "Upgraded contract $v2Id should not be trusted") + MaxLineLength:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest$assertTrue(attachmentTrustCalculator.calculate(storage.openAttachment(attachmentA)!!), "Contract $attachmentA should be trusted") + MaxLineLength:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest$assertTrue(attachmentTrustCalculator.calculate(storage.openAttachment(attachmentB)!!), "Contract $attachmentB should inherit trust") + MaxLineLength:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest$assertTrue(attachmentTrustCalculator.calculate(storage.openAttachment(attachmentId)!!), "Attachment $attachmentId should be trusted but isn't") + MaxLineLength:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest$assertTrue(attachmentTrustCalculator.calculate(storage.openAttachment(signedId)!!), "Signed contract $signedId should be trusted but isn't") + MaxLineLength:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest$assertTrue(attachmentTrustCalculator.calculate(storage.openAttachment(unsignedId)!!), "Unsigned contract $unsignedId should be trusted but isn't") + MaxLineLength:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest$assertTrue(attachmentTrustCalculator.calculate(storage.openAttachment(v1Id)!!), "Initial attachment $v1Id should not be trusted") MaxLineLength:AttachmentVersionNumberMigration.kt$AttachmentVersionNumberMigration$logger.error("$msg skipped, network parameters not retrieved, could not determine node base directory due to system property $NODE_BASE_DIR_KEY being not set.") - MaxLineLength:AttachmentVersionNumberMigration.kt$AttachmentVersionNumberMigration$logger.info("$msg skipped, network parameters not found in $path, but there are no available attachments to migrate.") MaxLineLength:AttachmentVersionNumberMigration.kt$AttachmentVersionNumberMigration$logger.info("$msg using network parameters from $path, whitelistedContractImplementations: ${networkParameters.whitelistedContractImplementations}.") - MaxLineLength:AttachmentVersionNumberMigration.kt$AttachmentVersionNumberMigration$logger.warn("Several versions based on whitelistedContractImplementations position are available: ${versions.toSet()}. $msg") - MaxLineLength:AttachmentVersionNumberMigration.kt$AttachmentVersionNumberMigration$val versions = networkParameters?.whitelistedContractImplementations?.values.mapNotNull { it.indexOfFirst { it.toString() == attachmentId } }.filter { it >= 0 } + MaxLineLength:AttachmentVersionNumberMigration.kt$AttachmentVersionNumberMigration$logger.warn("Several versions based on whitelistedContractImplementations position are available: ${versions.toSet()}. $updateVersionMsg") + MaxLineLength:AttachmentVersionNumberMigration.kt$AttachmentVersionNumberMigration$val versions = networkParameters.whitelistedContractImplementations.values.map { it.indexOfFirst { aid -> aid.toString() == attachmentId } }.filter { it >= 0 } MaxLineLength:AttachmentWithContext.kt$AttachmentWithContext$"This AttachmentWithContext was not initialised properly. Please ensure all Corda contracts extending existing Corda contracts also implement the Contract base class." - MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader : URLClassLoader MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader$"Please follow the operational steps outlined in https://docs.corda.net/cordapp-build-systems.html#cordapp-contract-attachments to learn more and continue." MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader$(path == "meta-inf/services/net.corda.core.serialization.serializationwhitelist") -> false - MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader$// This calculates the hash of the current entry because the JarInputStream returns only the current entry. fun entryHash() - MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader$currentHash == previousFileHash -> log.debug { "Duplicate entry $path has same content hash $currentHash" } MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader$else -> false - MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader$if (!isZipOrJar(attachment)) throw TransactionVerificationException.InvalidAttachmentException(sampleTxId, attachment.id) - MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader$log MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader$path.startsWith("meta-inf/services") -> true MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader$targetPlatformVersion < 4 && ignoreDirectories.any { path.startsWith(it) } -> false MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader${ // Make some preliminary checks to ensure that we're not loading invalid attachments. // All attachments need to be valid JAR or ZIP files. for (attachment in attachments) { if (!isZipOrJar(attachment)) throw TransactionVerificationException.InvalidAttachmentException(sampleTxId, attachment.id) } // Until we have a sandbox to run untrusted code we need to make sure that any loaded class file was whitelisted by the node administrator. val untrusted = attachments .filter(::containsClasses) .filterNot(isAttachmentTrusted) .map(Attachment::id) if (untrusted.isNotEmpty()) { log.warn("Cannot verify transaction $sampleTxId as the following attachment IDs are untrusted: $untrusted." + "You will need to manually install the CorDapp to whitelist it for use. " + "Please follow the operational steps outlined in https://docs.corda.net/cordapp-build-systems.html#cordapp-contract-attachments to learn more and continue.") throw TransactionVerificationException.UntrustedAttachmentsException(sampleTxId, untrusted) } // Enforce the no-overlap and package ownership rules. checkAttachments(attachments) } - MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader${ val entry = jar.nextJarEntry ?: break if (entry.isDirectory) continue // We already verified that paths are not strange/game playing when we inserted the attachment // into the storage service. So we don't need to repeat it here. // // We forbid files that differ only in case, or path separator to avoid issues for Windows/Mac developers where the // filesystem tries to be case insensitive. This may break developers who attempt to use ProGuard. // // Also convert to Unix path separators as all resource/class lookups will expect this. val path = entry.name.toLowerCase(Locale.US).replace('\\', '/') // Namespace ownership. We only check class files: resources are loaded relative to a JAR anyway. if (path.endsWith(".class")) { // Get the package name from the file name. Inner classes separate their names with $ not / // in file names so they are not a problem. val pkgName = path .dropLast(".class".length) .replace('/', '.') .split('.') .dropLast(1) .joinToString(".") for ((namespace, pubkey) in params.packageOwnership) { // Note that due to the toLowerCase() call above, we'll be comparing against a lowercased // version of the ownership claim. val ns = namespace.toLowerCase(Locale.US) // We need an additional . to avoid matching com.foo.Widget against com.foobar.Zap if (pkgName == ns || pkgName.startsWith("$ns.")) { if (pubkey !in signers) throw PackageOwnershipException(sampleTxId, attachment.id, path, pkgName) } } } // Some files don't need overlap checking because they don't affect the way the code runs. if (!shouldCheckForNoOverlap(path, targetPlatformVersion)) continue // This calculates the hash of the current entry because the JarInputStream returns only the current entry. fun entryHash() = ByteArrayOutputStream().use { jar.copyTo(it) it.toByteArray() }.sha256() // If 2 entries are identical, it means the same file is present in both attachments, so that is ok. val currentHash = entryHash() val previousFileHash = classLoaderEntries[path] when { previousFileHash == null -> { log.debug { "Adding new entry for $path" } classLoaderEntries[path] = currentHash } currentHash == previousFileHash -> log.debug { "Duplicate entry $path has same content hash $currentHash" } else -> { log.debug { "Content hash differs for $path" } throw OverlappingAttachmentsException(sampleTxId, path) } } } - MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoader.Companion$log.warn("The URLStreamHandlerFactory was already set in the JVM. Please be aware that this is not recommended.") MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoaderBuilder$ fun <T> withAttachmentsClassloaderContext(attachments: List<Attachment>, params: NetworkParameters, txId: SecureHash, isAttachmentTrusted: (Attachment) -> Boolean, parent: ClassLoader = ClassLoader.getSystemClassLoader(), block: (ClassLoader) -> T): T - MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoaderBuilder$private - MaxLineLength:AttachmentsClassLoader.kt$AttachmentsClassLoaderBuilder$val serializers = createInstancesOfClassesImplementing(transactionClassLoader, SerializationCustomSerializer::class.java) - MaxLineLength:AttachmentsClassLoaderSerializationTests.kt$AttachmentsClassLoaderSerializationTests$val att2 = storage.importAttachment(fakeAttachment("file2.txt", "some other data").inputStream(), "app", "file2.jar") - MaxLineLength:AttachmentsClassLoaderSerializationTests.kt$AttachmentsClassLoaderSerializationTests$val state = (contract as DummyContractBackdoor).generateInitial(MEGA_CORP.ref(1), 1, DUMMY_NOTARY).outputStates().first() - MaxLineLength:AttachmentsClassLoaderSerializationTests.kt$AttachmentsClassLoaderSerializationTests.Companion$val ISOLATED_CONTRACTS_JAR_PATH: URL = AttachmentsClassLoaderSerializationTests::class.java.getResource("/isolated.jar") - MaxLineLength:AttachmentsClassLoaderStaticContractTests.kt$AttachmentsClassLoaderStaticContractTests$doReturn(it.cordappProvider.getContractAttachmentID(AttachmentDummyContract.ATTACHMENT_PROGRAM_ID)).whenever(attachment).id - MaxLineLength:AttachmentsClassLoaderStaticContractTests.kt$AttachmentsClassLoaderStaticContractTests$return JarScanningCordappLoader.fromJarUrls(listOf(cordappWithPackages(*packages.toTypedArray()).jarFile.toUri().toURL())) MaxLineLength:AttachmentsClassLoaderStaticContractTests.kt$AttachmentsClassLoaderStaticContractTests$val cordappProviderImpl = CordappProviderImpl(cordappLoaderForPackages(listOf("net.corda.nodeapi.internal")), MockCordappConfigProvider(), MockAttachmentStorage()) - MaxLineLength:AttachmentsClassLoaderStaticContractTests.kt$AttachmentsClassLoaderStaticContractTests.AttachmentDummyContract$TransactionBuilder(notary) .withItems(StateAndContract(state, ATTACHMENT_PROGRAM_ID), Command(Commands.Create(), owner.party.owningKey)) MaxLineLength:AttachmentsClassLoaderStaticContractTests.kt$AttachmentsClassLoaderStaticContractTests.AttachmentDummyContract.Companion$const val ATTACHMENT_PROGRAM_ID = "net.corda.nodeapi.internal.AttachmentsClassLoaderStaticContractTests\$AttachmentDummyContract" - MaxLineLength:AttachmentsClassLoaderStaticContractTests.kt$import net.corda.nodeapi.internal.AttachmentsClassLoaderStaticContractTests.AttachmentDummyContract.Companion.ATTACHMENT_PROGRAM_ID MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$@Test fun `Allow loading an untrusted contract jar if another attachment exists that was signed by a trusted uploader - intersection of keys match existing attachment`() MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$@Test fun `Allow loading an untrusted contract jar if another attachment exists that was signed with the same keys and uploaded by a trusted uploader`() + MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$@Test fun `Cannot load an untrusted contract jar if it is signed by a blacklisted key even if there is another attachment signed by the same keys that is trusted`() MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$@Test fun `Cannot load an untrusted contract jar if no other attachment exists that was signed with the same keys and uploaded by a trusted uploader`() - MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$make(arrayOf(trustedResourceJar, untrustedResourceJar, trustedClassJar, untrustedClassJar).map { storage.openAttachment(it)!! }) - MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val att1 = importAttachment(fakeAttachment("/folder1/foldera/file1.txt", "some data").inputStream(), "app", "file1.jar") MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val att1 = importAttachment(fakeAttachment("file1.txt", "same data", "file2.txt", "same other data").inputStream(), "app", "file1.jar") MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val att1 = importAttachment(fakeAttachment("meta-inf/services/com.example.something", "some data").inputStream(), "app", "file1.jar") MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val att1 = importAttachment(fakeAttachment("meta-inf/services/net.corda.core.serialization.SerializationWhitelist", "some data").inputStream(), "app", "file1.jar") - MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val att2 = importAttachment(fakeAttachment("\\folder1\\folderb\\file2.txt", "some other data").inputStream(), "app", "file2.jar") MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val att2 = importAttachment(fakeAttachment("file1.txt", "same data", "file3.txt", "same totally different").inputStream(), "app", "file2.jar") MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val att2 = importAttachment(fakeAttachment("meta-inf/services/com.example.something", "some other data").inputStream(), "app", "file2.jar") MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val att2 = importAttachment(fakeAttachment("meta-inf/services/net.corda.core.serialization.SerializationWhitelist", "some other data").inputStream(), "app", "file2.jar") MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val att2 = importAttachment(fakeAttachment("net/corda/finance/contracts/isolated/AnotherDummyContract\$State.class", "some attackdata").inputStream(), "app", "file2.jar") - MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val att2 = storage.importAttachment(fakeAttachment("file1.txt", "some other data").inputStream(), "app", "file2.jar") - MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val isolatedSignedId = importAttachment(signedJar.first.toUri().toURL().openStream(), "app", "isolated-signed.jar") MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val trustedClassJar = importAttachment(fakeAttachment("/com/example/something/VirtuousClass.class", "some other data").inputStream(), "app", "file3.jar") - MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val trustedResourceJar = importAttachment(fakeAttachment("file1.txt", "some data").inputStream(), "app", "file0.jar") MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val untrustedClassJar = importAttachment(fakeAttachment("/com/example/something/MaliciousClass.class", "some malicious data").inputStream(), "untrusted", "file2.jar") MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests$val untrustedResourceJar = importAttachment(fakeAttachment("file2.txt", "some malicious data").inputStream(), "untrusted", "file1.jar") - MaxLineLength:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests.Companion$val ISOLATED_CONTRACTS_JAR_PATH_V4: URL = AttachmentsClassLoaderTests::class.java.getResource("isolated-4.0.jar") - MaxLineLength:AuditService.kt$AuditEvent - MaxLineLength:AuditService.kt$FlowPermissionAuditEvent : AuditEventFlowAuditInfo - MaxLineLength:AuthDBTests.kt$"bar" to "\$shiro1\$SHA-256$500000\$Q6dmdY1uVMm0LYAWaOHtCA==\$u7NbFaj9tHf2RTW54jedLPiOiGjJv0RVEPIjVquJuYY=" - MaxLineLength:AuthDBTests.kt$"foo" to "\$shiro1\$SHA-256$500000\$WSiEVj6q8d02sFcCk1dkoA==\$MBkU/ghdD9ovoDerdzNfkXdP9Bdhmok7tidvVIqGzcA=" - MaxLineLength:AuthDBTests.kt$"test" to "\$shiro1\$SHA-256$500000\$F6CWSFDDxGTlzvREwih8Gw==\$DQhyAPoUw3RdvNYJ1aubCnzEIXm+szGQ3HplaG+euz8=" - MaxLineLength:AuthDBTests.kt$PasswordEncryption.SHIRO_1_CRYPT -> hashedPasswords[format]!![s] ?: DefaultPasswordService().encryptPassword(s.toCharArray()) MaxLineLength:AuthDBTests.kt$UsersDB$private - MaxLineLength:AuthenticatedRpcOpsProxy.kt$AuthenticatedRpcOpsProxy$/** * Returns the RPC protocol version, which is the same the node's Platform Version. Exists since version 1 so guaranteed * to be present. * * TODO: Why is this logic duplicated vs the actual implementation? */ override val protocolVersion: Int get() = delegate.nodeInfo().platformVersion - MaxLineLength:AuthenticatedRpcOpsProxy.kt$AuthenticatedRpcOpsProxy$internal MaxLineLength:AuthenticatedRpcOpsProxy.kt$AuthenticatedRpcOpsProxy$override MaxLineLength:AuthenticatedRpcOpsProxy.kt$AuthenticatedRpcOpsProxy.Companion$return Proxy.newProxyInstance(delegate::class.java.classLoader, arrayOf(InternalCordaRPCOps::class.java), handler) as InternalCordaRPCOps MaxLineLength:AuthenticatedRpcOpsProxy.kt$AuthenticatedRpcOpsProxy.PermissionsEnforcingInvocationHandler$override fun invoke(proxy: Any, method: Method, arguments: Array<out Any?>?) MaxLineLength:AuthenticatedRpcOpsProxy.kt$AuthenticatedRpcOpsProxy.PermissionsEnforcingInvocationHandler$private - MaxLineLength:AuthenticatedRpcOpsProxy.kt$private MaxLineLength:AuthenticatedRpcOpsProxy.kt$private fun <RESULT> guard(methodName: String, context: () -> RpcAuthContext, action: () -> RESULT) - MaxLineLength:AutoAcceptable.kt$AutoAcceptable - MaxLineLength:AutoOfferFlow.kt$AutoOfferFlow$ReportToRegulatorFlow : FlowLogic MaxLineLength:AutoOfferFlow.kt$AutoOfferFlow.Requester$val notary = serviceHub.networkMapCache.notaryIdentities.first() // TODO We should pass the notary as a parameter to the flow, not leave it to random choice. MaxLineLength:AutoOfferFlow.kt$AutoOfferFlow.Requester$val otherParty = excludeHostNode(serviceHub, groupAbstractPartyByWellKnownParty(serviceHub, dealToBeOffered.participants)).keys.single() - MaxLineLength:AutoOfferFlow.kt$AutoOfferFlow.Requester.Companion$// We vend a progress tracker that already knows there's going to be a TwoPartyTradingFlow involved at some // point: by setting up the tracker in advance, the user can see what's coming in more detail, instead of being // surprised when it appears as a new set of tasks below the current one. fun tracker() - MaxLineLength:AzureBackend.kt$AzureBackend.Companion$azure.resourceGroups().define(resourceGroupName).withRegion(context.extraParams[Constants.REGION_ARG_NAME]).create() - MaxLineLength:AzureBackend.kt$AzureBackend.Companion$val azureInstantiatorFuture = azureNetworkStore.thenCombine(registryLocatorFuture) { azureVolume, registryLocator -> AzureInstantiator(azure, registryLocator.registry, azureVolume, resourceGroup) } - MaxLineLength:AzureBackend.kt$AzureBackend.Companion$val resourceGroupName = context.networkName.replace(Constants.ALPHA_NUMERIC_DOT_AND_UNDERSCORE_ONLY_REGEX, "") - MaxLineLength:AzureInstantiator.kt$AzureInstantiator.<no name provided>$LOG.info("Completed instantiation: $instanceName is running at $fqdn with port(s) $portsToOpen exposed") - MaxLineLength:AzureRegistryLocator.kt$RegistryLocator$LOG.info("Did not find existing container registry - creating new registry with name ${resourceGroup.restFriendlyName()}") - MaxLineLength:AzureRegistryLocator.kt$RegistryLocator$val found = azure.containerRegistries().getByResourceGroup(resourceGroup.name(), resourceGroup.restFriendlyName()) - MaxLineLength:AzureSmbVolume.kt$AzureSmbVolume$networkParamsFile.uploadFromByteArray(networkParameters.signWithCert(keyPair.private, networkMapCert).serialize().bytes) MaxLineLength:BCCryptoService.kt$BCCryptoService : CryptoService - MaxLineLength:BCCryptoService.kt$BCCryptoService$certificateStore.query { setPrivateKey(alias, keyPair.private, listOf(cert), certificateStore.entryPassword) } - MaxLineLength:BCCryptoService.kt$BCCryptoService$null -> Crypto.doSign(certificateStore.query { getPrivateKey(alias, certificateStore.entryPassword) }, data) MaxLineLength:BCCryptoService.kt$BCCryptoService$return ContentSignerBuilder.build(signatureScheme, privateKey, Crypto.findProvider(signatureScheme.providerName), newSecureRandom()) MaxLineLength:BCCryptoService.kt$BCCryptoService$throw CryptoServiceException("Cannot generate key for alias $alias and signature scheme ${scheme.schemeCodeName} (id ${scheme.schemeNumberID})", e) - MaxLineLength:BCCryptoService.kt$BCCryptoService$throw CryptoServiceException("Cannot sign using the key with alias $alias. SHA256 of data to be signed: ${data.sha256()}", e) - MaxLineLength:BCCryptoService.kt$BCCryptoService${ // Store a self-signed certificate, as Keystore requires to store certificates instead of public keys. // We could probably add a null cert, but we store a self-signed cert that will be used to retrieve the public key. val cert = X509Utilities.createSelfSignedCACertificate(legalName, keyPair) certificateStore.query { setPrivateKey(alias, keyPair.private, listOf(cert), certificateStore.entryPassword) } } - MaxLineLength:BCCryptoServiceTests.kt$BCCryptoServiceTests$Crypto.supportedSignatureSchemes().filter { it != Crypto.COMPOSITE_KEY }.forEach { generateKeyAndSignForScheme(cryptoService, it) } - MaxLineLength:BCCryptoServiceTests.kt$BCCryptoServiceTests$private MaxLineLength:BFTNotaryServiceTests.kt$BFTNotaryServiceTests$addOutputState(DummyContract.SingleOwnerState(owner = info.singleIdentity()), DummyContract.PROGRAM_ID, AlwaysAcceptAttachmentConstraint) - MaxLineLength:BFTNotaryServiceTests.kt$BFTNotaryServiceTests$private MaxLineLength:BFTNotaryServiceTests.kt$BFTNotaryServiceTests.Companion$fun startBftClusterAndNode(clusterSize: Int, mockNet: InternalMockNetwork, exposeRaces: Boolean = false): Pair<Party, TestStartedNode> - MaxLineLength:BFTNotaryServiceTests.kt$BFTNotaryServiceTests.Companion$val networkParameters = NetworkParametersCopier(testNetworkParameters(listOf(NotaryInfo(notaryIdentity, false)))) - MaxLineLength:BFTNotaryServiceTests.kt$BFTNotaryServiceTests.Companion${ (Paths.get("config") / "currentView").deleteIfExists() // XXX: Make config object warn if this exists? val replicaIds = (0 until clusterSize) val serviceLegalName = CordaX500Name("BFT", "Zurich", "CH") val notaryIdentity = DevIdentityGenerator.generateDistributedNotaryCompositeIdentity( replicaIds.map { mockNet.baseDirectory(mockNet.nextNodeId + it) }, serviceLegalName) val networkParameters = NetworkParametersCopier(testNetworkParameters(listOf(NotaryInfo(notaryIdentity, false)))) val clusterAddresses = replicaIds.map { NetworkHostAndPort("localhost", 11000 + it * 10) } val nodes = replicaIds.map { replicaId -> mockNet.createUnstartedNode(InternalMockNodeParameters(configOverrides = { val notary = NotaryConfig( validating = false, bftSMaRt = BFTSmartConfig(replicaId, clusterAddresses, exposeRaces = exposeRaces), serviceLegalName = serviceLegalName ) doReturn(notary).whenever(it).notary })) } + mockNet.createUnstartedNode() // MockNetwork doesn't support BFT clusters, so we create all the nodes we need unstarted, and then install the // network-parameters in their directories before they're started. val node = nodes.map { node -> networkParameters.install(mockNet.baseDirectory(node.id)) node.start() }.last() return Pair(notaryIdentity, node) } - MaxLineLength:BFTSmart.kt$BFTSmart MaxLineLength:BFTSmart.kt$BFTSmart$Client : SingletonSerializeAsToken - MaxLineLength:BFTSmart.kt$BFTSmart$ClusterResponse - MaxLineLength:BFTSmart.kt$BFTSmart.Client$ private fun buildExtractor(): Extractor - MaxLineLength:BFTSmart.kt$BFTSmart.Client$log.debug { "BFT Client $clientId: number of replicas accepted the commit: ${accepted.size}, rejected: ${rejected.size}" } MaxLineLength:BFTSmart.kt$BFTSmart.Client$private val sessionTable = (proxy.communicationSystem as NettyClientServerCommunicationSystemClientSide).declaredField<Map<Int, NettyClientServerSession>>("sessionTable").value MaxLineLength:BFTSmart.kt$BFTSmart.Client${ // TODO: Hopefully we only need to wait for the client's initial connection to the cluster, and this method can be moved to some startup code. // TODO: Investigate ConcurrentModificationException in this method. while (true) { val inactive = sessionTable.entries.mapNotNull { if (it.value.channel.isActive) null else it.key } if (inactive.isEmpty()) break log.info("Client-replica channels not yet active: $clientId to $inactive") Thread.sleep((inactive.size * 100).toLong()) } } MaxLineLength:BFTSmart.kt$BFTSmart.CordaServiceReplica$private - MaxLineLength:BFTSmart.kt$BFTSmart.Replica$checkConflict(conflictingStates, references, StateConsumptionDetails.ConsumedStateType.REFERENCE_INPUT_STATE) - MaxLineLength:BFTSmart.kt$BFTSmart.Replica$private MaxLineLength:BFTSmart.kt$BFTSmart.Replica$val (committedStates, requests) = bytes.deserialize<Pair<LinkedHashMap<StateRef, SecureHash>, List<PersistentUniquenessProvider.Request>>>() - MaxLineLength:BFTSmart.kt$BFTSmart.Replica$val criteriaQuery = session.criteriaBuilder.createQuery(PersistentUniquenessProvider.Request::class.java) - MaxLineLength:BFTSmart.kt$BFTSmart.Replica$val deleteQuery = session.criteriaBuilder.createCriteriaDelete(PersistentUniquenessProvider.Request::class.java) MaxLineLength:BFTSmart.kt$BFTSmart.Replica$val signableData = SignableData(txId, SignatureMetadata(services.myInfo.platformVersion, Crypto.findSignatureScheme(notaryIdentityKey).schemeNumberID)) MaxLineLength:BFTSmart.kt$BFTSmart.Replica.<no name provided>$if (exposeStartupRace) Thread.sleep(20000) MaxLineLength:BFTSmartConfigInternal.kt$BFTSmartConfigInternal : PathManager MaxLineLength:BFTSmartConfigInternal.kt$BFTSmartConfigInternal$val systemConfig = String.format(javaClass.getResource("system.config.printf").readText(), n, maxFaultyReplicas(n), if (debug) 1 else 0, (0 until n).joinToString(",")) - MaxLineLength:BFTSmartConfigTests.kt$BFTSmartConfigTests$assertThatThrownBy { config(11001, 11000).use {} } .isInstanceOf(IllegalArgumentException::class.java) .hasMessage(portIsClaimedFormat.format("localhost:11001", setOf("localhost:11001", "localhost:11002", "localhost:11000"))) - MaxLineLength:BFTSmartConfigTests.kt$BFTSmartConfigTests$fun config(vararg ports: Int) MaxLineLength:BFTSmartNotaryService.kt$BFTSmartNotaryService$?: MaxLineLength:BFTSmartNotaryService.kt$BFTSmartNotaryService$CommittedState : BaseComittedState - MaxLineLength:BFTSmartNotaryService.kt$BFTSmartNotaryService$client - MaxLineLength:BFTSmartNotaryService.kt$BFTSmartNotaryService$override fun createServiceFlow(otherPartySession: FlowSession): FlowLogic<Void?> - MaxLineLength:BFTSmartNotaryService.kt$BFTSmartNotaryService.<no name provided>$log.warn("A BFT replica may still be initializing, in which case the upcoming consensus change may cause it to spin.") - MaxLineLength:BFTSmartNotaryService.kt$BFTSmartNotaryService.Replica$createMap: () -> AppendOnlyPersistentMap<StateRef, SecureHash, CommittedState, PersistentStateRef> - MaxLineLength:BFTSmartNotaryService.kt$BFTSmartNotaryService.Replica$notaryIdentityKey: PublicKey MaxLineLength:BFTSmartNotaryService.kt$BFTSmartNotaryService.Replica$private MaxLineLength:BFTSmartNotaryService.kt$BFTSmartNotaryService.Replica$val response = verifyAndCommitTx(commitRequest.payload.coreTransaction, commitRequest.callerIdentity, commitRequest.payload.requestSignature) - MaxLineLength:BFTSmartNotaryService.kt$BFTSmartNotaryService.ServiceFlow$private - MaxLineLength:BFTSmartNotaryService.kt$BFTSmartNotaryService.ServiceFlow${ // TODO: here we assume that all error will be the same, but there might be invalid onces from mailicious nodes val responseError = response.errors.first().verified() throw NotaryException(responseError, payload.coreTransaction.id) } MaxLineLength:BackpressureAwareTimedFlow.kt$BackpressureAwareTimedFlow$else -> throw throw IllegalArgumentException("We were expecting a ${ReceiveType::class.java.name} or WaitTimeUpdate but we instead got a ${unwrapped.javaClass.name} ($unwrapped)") - MaxLineLength:BackpressureAwareTimedFlow.kt$BackpressureAwareTimedFlow$is ReceiveType MaxLineLength:BackpressureAwareTimedFlow.kt$BackpressureAwareTimedFlow$logger.info("Counterparty [${session.counterparty}] is busy - TimedFlow $runId has been asked to wait for an additional ${unwrapped.waitTime} seconds for completion.") - MaxLineLength:BackpressureAwareTimedFlow.kt$BackpressureAwareTimedFlow<ResultType> : FlowLogicTimedFlow MaxLineLength:BankOfCordaClientApi.kt$BankOfCordaClientApi$ fun requestRPCIssue(rpcAddress: NetworkHostAndPort, params: IssueRequestParams): SignedTransaction - MaxLineLength:BankOfCordaClientApi.kt$BankOfCordaClientApi$ fun requestRPCIssueHA(availableRpcServers: List<NetworkHostAndPort>, params: IssueRequestParams): SignedTransaction - MaxLineLength:BankOfCordaClientApi.kt$BankOfCordaClientApi$return rpc.startFlow(::CashIssueAndPaymentFlow, params.amount, issuerBankPartyRef, issueToParty, anonymous, notaryLegalIdentity) .returnValue.getOrThrow().stx MaxLineLength:BankOfCordaWebApi.kt$BankOfCordaWebApi$?: MaxLineLength:BankOfCordaWebApi.kt$BankOfCordaWebApi$rpc.startFlow(::CashIssueAndPaymentFlow, params.amount, issuerBankPartyRef, issueToParty, anonymous, notaryParty).returnValue.getOrThrow() MaxLineLength:BankOfCordaWebApi.kt$BankOfCordaWebApi$rpc.wellKnownPartyFromX500Name(params.issuerBankName) ?: return Response.status(Response.Status.FORBIDDEN).entity("Unable to locate ${params.issuerBankName} in identity service").build() - MaxLineLength:BaseTransaction.kt$BaseTransaction$ fun <T : ContractState> filterOutRefs(clazz: Class<T>, predicate: Predicate<T>): List<StateAndRef<T>> - MaxLineLength:BaseTransaction.kt$BaseTransaction$ fun <T : ContractState> filterOutputs(clazz: Class<T>, predicate: Predicate<T>): List<T> - MaxLineLength:BaseTransaction.kt$BaseTransaction$ fun <T : ContractState> outRef(index: Int): StateAndRef<T> - MaxLineLength:BaseTransaction.kt$BaseTransaction$ fun <T : ContractState> outputsOfType(clazz: Class<T>): List<T> - MaxLineLength:BaseTransaction.kt$BaseTransaction$/** * Helper property to return a list of [ContractState] objects, rather than the often less convenient [TransactionState] */ val outputStates: List<ContractState> get() = outputs.map { it.data } - MaxLineLength:BaseTransactions.kt$CoreTransaction$/** * Hash of the network parameters that were in force when the transaction was notarised. Null means, that the transaction * was created on older version of Corda (before 4), resolution will default to initial parameters. */ abstract val networkParametersHash: SecureHash? MaxLineLength:BaseTransactions.kt$FullTransaction$"Notary ($notaryParty) specified by the transaction is not on the network parameter whitelist: [${notaryWhitelist.joinToString()}]" MaxLineLength:BaseTransactions.kt$FullTransaction$/** * Network parameters that were in force when this transaction was created. Resolved from the hash of network parameters on the corresponding * wire transaction. */ abstract val networkParameters: NetworkParameters? - MaxLineLength:BaseTransactions.kt$FullTransaction$// Network parameters will never be null if the transaction is resolved from a CoreTransaction rather than constructed directly. networkParameters?.let { parameters -> val notaryWhitelist = parameters.notaries.map { it.identity } check(notaryParty in notaryWhitelist) { "Notary ($notaryParty) specified by the transaction is not on the network parameter whitelist: [${notaryWhitelist.joinToString()}]" } } - MaxLineLength:BaseTransactions.kt$FullTransaction$check(notaries.single() == notary) { "The specified notary must be the one specified by all inputs and input references" } - MaxLineLength:BasicHSMKeyManagementService.kt$BasicHSMKeyManagementService$"Metadata schemeCodeName: ${sigMetaData.schemeCodeName} is not aligned with the key type: ${sigKey.schemeCodeName}." - MaxLineLength:BasicHSMKeyManagementService.kt$BasicHSMKeyManagementService$// Get [KeyPair] for the input [publicKey]. This is used for fresh keys, in which we have access to the private key material. private fun getSigningKeyPair(publicKey: PublicKey): KeyPair - MaxLineLength:BasicHSMKeyManagementService.kt$BasicHSMKeyManagementService$private val pkToIdCache: WritablePublicKeyToOwningIdentityCache MaxLineLength:BasicHSMKeyManagementService.kt$BasicHSMKeyManagementService$require(it.private is AliasPrivateKey) { "${this.javaClass.name} supports AliasPrivateKeys only, but ${it.private.algorithm} key was found" } - MaxLineLength:BasicHSMKeyManagementService.kt$BasicHSMKeyManagementService.Companion$fun createKeyMap(cacheFactory: NamedCacheFactory): AppendOnlyPersistentMap<PublicKey, PrivateKey, PersistentKey, String> MaxLineLength:BitSetSerializer.kt$BitSetSerializer : Proxy - MaxLineLength:BlobInspector.kt$BlobInspector$?: MaxLineLength:BlobInspector.kt$BlobInspector$@Option(names = ["--input-format"], paramLabel = "type", description = ["Input format. If the file can't be decoded with the given value it's auto-detected, so you should never normally need to specify this. Possible values: [BINARY, HEX, BASE64]"]) - MaxLineLength:BlobInspector.kt$BlobInspector$@Parameters(index = "0", paramLabel = "SOURCE", description = ["URL or file path to the blob"], converter = [SourceConverter::class]) - MaxLineLength:BlobInspector.kt$BlobInspector$description = ["Display the owningKey and certPath properties of Party and PartyAndReference objects respectively"] - MaxLineLength:BlobInspector.kt$BlobInspector$val envelope = DeserializationInput.getEnvelope(bytes.sequence(), SerializationDefaults.STORAGE_CONTEXT.encodingWhitelist) - MaxLineLength:BlobInspectorTest.kt$BlobInspectorTest$assertThat(output) .startsWith(SignedDataWithCert::class.java.name) .contains(NetworkParameters::class.java.name) .contains(CordaX500Name("Notary Service", "Zurich", "CH").toString()) - MaxLineLength:BlobWriter.kt$File("../cpp-serializer/bin/blob-inspector/test/_i_is__").writeBytes(_i_is__(1, _is_ (2, "three")).serialize().bytes) - MaxLineLength:BootTests.kt$BootTests$assertThatThrownBy { devModeNode.attemptJavaDeserialization() }.isInstanceOf(CordaRuntimeException::class.java) - MaxLineLength:BootTests.kt$BootTests$val alice = startNode(providedName = ALICE_NAME).getOrThrow() val aliceCertDir = alice.baseDirectory / "certificates" (aliceCertDir / "nodekeystore.jks").delete() val cert = CertificateStoreStubs.Signing.withCertificatesDirectory(aliceCertDir).get(true) // Creating a new certificate store does not populate that store with the node certificate path. If the node certificate path is // missing, the node will fail to start but not because the legal identity is missing. To test that a missing legal identity // prevents the node from starting, the node certificate path must be installed. cert.installDevNodeCaCertPath(ALICE_NAME) alice.stop() // The node shouldn't start, and the logs should indicate that the failure is due to a missing identity key assertThatThrownBy { startNode(providedName = ALICE_NAME).getOrThrow() } val logFolder = alice.baseDirectory / NodeStartup.LOGS_DIRECTORY_NAME val logFile = logFolder.list { it.filter { a -> a.isRegularFile() && a.fileName.toString().startsWith("node") }.findFirst().get() } val lines = logFile.readLines { lines -> lines.filter { "$NODE_IDENTITY_ALIAS_PREFIX-private-key" in it }.toArray() } assertTrue(lines.count() > 0) - MaxLineLength:BootTests.kt$BootTests$val lines = logFile.readLines { lines -> lines.filter { "$NODE_IDENTITY_ALIAS_PREFIX-private-key" in it }.toArray() } MaxLineLength:BootTests.kt$BootTests$val logFile = logFolder.list { it.filter { a -> a.isRegularFile() && a.fileName.toString().startsWith("node") }.findFirst().get() } - MaxLineLength:BootTests.kt$BootTests$val numberOfNodesThatLogged = logFile.readLines { it.filter { NodeStartup.LOGS_CAN_BE_FOUND_IN_STRING in it }.count() } - MaxLineLength:BootTests.kt$ObjectInputStreamFlow$val data = ByteArrayOutputStream().apply { ObjectOutputStream(this).use { it.writeObject(object : Serializable {}) } }.toByteArray() - MaxLineLength:BootstrapperView.kt$BootstrapperView$nodeAdder.addNode(context, nodeToAdd, x500ToUse?.let { CordaX500Name.parse(it) }) MaxLineLength:BootstrapperView.kt$BootstrapperView$return Pair(mapOf(Constants.REGION_ARG_NAME to ChoiceDialog<Region>(Region.EUROPE_WEST, Region.values().toList().sortedBy { it.name() }).showAndWait().get().name()), networkName1) - MaxLineLength:BootstrapperView.kt$BootstrapperView.State$var hasNodesOrNotaries = Bindings.size(foundNotaries).greaterThan(0).or(Bindings.size(foundNotaries).greaterThan(0)) MaxLineLength:BridgeControlListener.kt$BridgeControlListener$bridgeManager.deployBridge(controlMessage.bridgeInfo.queueName, controlMessage.bridgeInfo.targets, controlMessage.bridgeInfo.legalNames.toSet()) - MaxLineLength:BridgeControlListener.kt$BridgeControlListener$return queueName.startsWith(P2P_PREFIX) && artemis!!.started!!.session.queueQuery(SimpleString(queueName)).isExists - MaxLineLength:BridgeControlListener.kt$BridgeControlListener$return queueName.startsWith(PEERS_PREFIX) && artemis!!.started!!.session.queueQuery(SimpleString(queueName)).isExists MaxLineLength:BridgeControlListener.kt$BridgeControlListener$val startupMessage = BridgeControl.BridgeToNodeSnapshotRequest(bridgeId).serialize(context = SerializationDefaults.P2P_CONTEXT).bytes - MaxLineLength:BridgeControlMessages.kt$BridgeControl$Create : BridgeControl MaxLineLength:BridgeControlMessages.kt$BridgeControl$Delete : BridgeControl MaxLineLength:BridgeControlMessages.kt$BridgeControl$NodeToBridgeSnapshot : BridgeControl MaxLineLength:BridgeControlMessages.kt$BridgeControl.NodeToBridgeSnapshot$@CordaSerializable data MaxLineLength:BridgeControlMessages.kt$BridgeEntry - MaxLineLength:BridgeControlMessages.kt$BridgeEntry$@CordaSerializable data - MaxLineLength:BrokerJaasLoginModule.kt$BaseBrokerJaasLoginModule$override MaxLineLength:BrokerJaasLoginModule.kt$BrokerJaasLoginModule : BaseBrokerJaasLoginModule + MaxLineLength:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$@Suppress("DEPRECATION") // should use java.security.cert.X509Certificate private MaxLineLength:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$CertificateChainCheckPolicy.LeafMustMatch.createCheck(nodeJaasConfig.keyStore, nodeJaasConfig.trustStore).checkCertificateChain(certificates!!) MaxLineLength:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$CertificateChainCheckPolicy.RootMustMatch.createCheck(p2pJaasConfig!!.keyStore, p2pJaasConfig!!.trustStore).checkCertificateChain(certificates!!) - MaxLineLength:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$Pair(username, listOf(RolePrincipal(RPC_ROLE), RolePrincipal("${RPCApi.RPC_CLIENT_QUEUE_NAME_PREFIX}.$username"))) - MaxLineLength:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$fun requireTls(certificates: Array<X509Certificate>?) + MaxLineLength:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$fun requireTls(certificates: Array<javax.security.cert.X509Certificate>?) MaxLineLength:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$if (e is IllegalArgumentException && e.stackTrace.any { it.className == "org.apache.activemq.artemis.protocol.amqp.sasl.PlainSASL" }) { log.trace("SASL Login failed.") } else { log.warn("Login failed: ${e.message}") } - MaxLineLength:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$override - MaxLineLength:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$private MaxLineLength:BrokerJaasLoginModule.kt$BrokerJaasLoginModule${ // This is a known problem, so we swallow this exception. A peer will attempt to connect without presenting client certificates during SASL if (e is IllegalArgumentException && e.stackTrace.any { it.className == "org.apache.activemq.artemis.protocol.amqp.sasl.PlainSASL" }) { log.trace("SASL Login failed.") } else { log.warn("Login failed: ${e.message}") } if (e is LoginException) { throw e } else { throw FailedLoginException(e.message) } } - MaxLineLength:BrokerJaasLoginModule.kt$RPCJaasConfig$val loginListener: LoginListener - MaxLineLength:BuiltNode.kt$BuiltNode$return PushedNode(configFile, baseDirectory, copiedNodeConfig, copiedNodeDir, nodeConfig, localImageId, remoteImageName) MaxLineLength:BuiltNode.kt$BuiltNode$val nodeConfig: NodeConfiguration - MaxLineLength:BusinessCalendar.kt$BusinessCalendar$operator fun plus(other: BusinessCalendar): BusinessCalendar MaxLineLength:BusinessCalendar.kt$BusinessCalendar.Companion$dcbDay == DayCountBasisDay.D30 && dcbYear == DayCountBasisYear.Y360 -> ((endDate.year - startDate.year) * 360.0 + (endDate.monthValue - startDate.monthValue) * 30.0 + endDate.dayOfMonth - startDate.dayOfMonth).toInt() - MaxLineLength:ByteArrays.kt$ByteSequence$ @Suppress("MemberVisibilityCanBePrivate") fun subSequence(offset: Int, size: Int): ByteSequence - MaxLineLength:ByteArrays.kt$ByteSequence$ fun slice(start: Int = 0, end: Int = size): ByteBuffer MaxLineLength:ByteArrays.kt$OpaqueBytes$/** * The bytes are always cloned so that this object becomes immutable. This has been done * to prevent tampering with entities such as [net.corda.core.crypto.SecureHash] and [net.corda.core.contracts.PrivacySalt], as well as * preserve the integrity of our hash constants [net.corda.core.crypto.SecureHash.zeroHash] and [net.corda.core.crypto.SecureHash.allOnesHash]. * * Cloning like this may become a performance issue, depending on whether or not the JIT * compiler is ever able to optimise away the clone. In which case we may need to revisit * this later. */ final override val bytes: ByteArray = bytes get() = field.clone() - MaxLineLength:ByteArrays.kt$OpaqueBytesSubSequence : ByteSequence MaxLineLength:ByteArrays.kt$OpaqueBytesSubSequence$require(offset >= 0 && offset < bytes.size) { "Offset must be greater than or equal to 0, and less than the size of the backing array" } MaxLineLength:ByteArrays.kt$OpaqueBytesSubSequence$require(size >= 0 && offset + size <= bytes.size) { "Sub-sequence size must be greater than or equal to 0, and less than the size of the backing array" } - MaxLineLength:ByteBufferStreams.kt$ByteBufferOutputStream.Companion$private MaxLineLength:Cap.kt$Cap$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBOR", BusinessCalendar.parseDateFromString("2017-03-01"), Tenor("3M")), 1.0.bd)))) MaxLineLength:Cap.kt$Cap$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBOR", BusinessCalendar.parseDateFromString("2017-03-01"), Tenor("3M")), 1.5.bd)))) MaxLineLength:Cap.kt$Cap$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBOR", BusinessCalendar.parseDateFromString("2017-03-01"), Tenor("9M")), 1.0.bd)))) @@ -4319,117 +2903,53 @@ MaxLineLength:Cap.kt$Cap$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBOR", tradeDate.plusYears(1), Tenor("3M")), 1.0.bd)))) MaxLineLength:Cap.kt$Cap$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBORx", BusinessCalendar.parseDateFromString("2017-03-01"), Tenor("3M")), 1.0.bd)))) MaxLineLength:Cap.kt$Cap$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBORx", tradeDate, Tenor("3M")), 1.0.bd)))) - MaxLineLength:Cap.kt$Cap$val floating = interest(notional, "act/365", fix("LIBOR", start, Tenor("3M")), start, end) MaxLineLength:Caplet.kt$Caplet$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBOR", tradeDate, Tenor("3M")), 1.0.bd)))) MaxLineLength:Caplet.kt$Caplet$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBOR", tradeDate, Tenor("6M")), 1.0.bd)))) MaxLineLength:Caplet.kt$Caplet$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBOR", tradeDate, Tenor("6M")), 1.5.bd)))) MaxLineLength:Caplet.kt$Caplet$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBOR", tradeDate.plusYears(1), Tenor("6M")), 1.0.bd)))) MaxLineLength:Caplet.kt$Caplet$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBORx", tradeDate, Tenor("6M")), 1.0.bd)))) - MaxLineLength:Caplet.kt$Caplet$val floating = interest(notional, "act/365", fix("LIBOR", tradeDate, Tenor("6M")), "2016-04-01", "2016-10-01") - MaxLineLength:CarpentryDependencyGraph.kt$CarpentryDependencyGraph$/** * A map of inbound edges by node. * * A [RemoteTypeInformation] map key is a type that requires other types to have been constructed before it can be * constructed. * * Each [RemoteTypeInformation] in the corresponding [Set] map value is one of the types that the key-type depends on. * * No key ever maps to an empty set: types with no dependencies are not included in this map. */ private val dependencies = mutableMapOf<RemoteTypeInformation, MutableSet<RemoteTypeInformation>>() - MaxLineLength:CarpentryDependencyGraph.kt$CarpentryDependencyGraph$if (dependencies.isEmpty()) newlyIndependent.asSequence() else topologicalSort(remaining, newlyIndependent) - MaxLineLength:CarpentryDependencyGraph.kt$CarpentryDependencyGraph${ // Types which still have dependencies. val remaining = dependencies.keys.toSet() // Remove the types which have no dependencies from the dependencies of the remaining types, and identify // those types which have no dependencies left after we've done this. val newlyIndependent = dependencies.asSequence().mapNotNull { (dependent, dependees) -> dependees.removeAll(noDependencies) if (dependees.isEmpty()) dependent else null }.toSet() // If there are still types with dependencies, and we have no dependencies we can remove, then we can't continue. if (newlyIndependent.isEmpty() && dependencies.isNotEmpty()) { throw NotSerializableException( "Cannot build dependencies for " + dependencies.keys.map { it.typeIdentifier.prettyPrint(false) }) } // Remove the types which have no dependencies remaining, maintaining the invariant that no key maps to an // empty set. dependencies.keys.removeAll(newlyIndependent) // Return the types that had no dependencies, then recurse to process the remainder. return noDependencies.asSequence() + if (dependencies.isEmpty()) newlyIndependent.asSequence() else topologicalSort(remaining, newlyIndependent) } MaxLineLength:Cash.kt$ @Throws(IllegalArgumentException::class) internal inline fun <reified T : MoveCommand> verifyFlattenedMoveCommand(inputs: List<OwnableState>, commands: List<CommandWithParties<CommandData>>) : MoveCommand - MaxLineLength:Cash.kt$Cash$ fun generateIssue(tx: TransactionBuilder, tokenDef: Issued<Currency>, pennies: Long, owner: AbstractParty, notary: Party) MaxLineLength:Cash.kt$Cash$"for reference ${issuer.reference} at issuer ${issuer.party} the amounts balance: ${inputAmount.quantity} - ${amountExitingLedger.quantity} != ${outputAmount.quantity}" - MaxLineLength:Cash.kt$Cash$override MaxLineLength:Cash.kt$Cash$val exitCommand = tx.commands.select<Commands.Exit>(parties = null, signers = exitKeys).singleOrNull { it.value.amount.token == key } MaxLineLength:Cash.kt$Cash$val inputAmount = inputs.sumCashOrNull() ?: throw IllegalArgumentException("there is at least one cash input for this group") - MaxLineLength:Cash.kt$Cash${ val inputAmount = inputs.sumCashOrNull() ?: throw IllegalArgumentException("there is at least one cash input for this group") val outputAmount = outputs.sumCashOrZero(Issued(issuer, currency)) // If we want to remove cash from the ledger, that must be signed for by the issuer. // A mis-signed or duplicated exit command will just be ignored here and result in the exit amount being zero. val exitKeys: Set<PublicKey> = inputs.flatMap { it.exitKeys }.toSet() val exitCommand = tx.commands.select<Commands.Exit>(parties = null, signers = exitKeys).singleOrNull { it.value.amount.token == key } val amountExitingLedger = exitCommand?.value?.amount ?: Amount(0, Issued(issuer, currency)) requireThat { "there are no zero sized inputs" using inputs.none { it.amount.quantity == 0L } "for reference ${issuer.reference} at issuer ${issuer.party} the amounts balance: ${inputAmount.quantity} - ${amountExitingLedger.quantity} != ${outputAmount.quantity}" using (inputAmount == outputAmount + amountExitingLedger) } verifyFlattenedMoveCommand<Commands.Move>(inputs, tx.commands) } - MaxLineLength:Cash.kt$Cash.State$infix fun issuedBy(deposit: PartyAndReference) MaxLineLength:Cash.kt$Cash.State$infix fun issuedBy(party: AbstractParty) MaxLineLength:Cash.kt$Cash.State$infix fun withDeposit(deposit: PartyAndReference): Cash.State - MaxLineLength:Cash.kt$Cash.State$override - MaxLineLength:Cash.kt$commands: List<CommandWithParties<CommandData>> MaxLineLength:Cash.kt$internal - MaxLineLength:Cash.kt$internal inline - MaxLineLength:CashConfigDataFlowTest.kt$CashConfigDataFlowTest$additionalCordapps = listOf(FINANCE_WORKFLOWS_CORDAPP.withConfig(mapOf("issuableCurrencies" to listOf("EUR", "USD")))) - MaxLineLength:CashExceptionSerialisationTest.kt$CashExceptionSerialisationTest$val action = { node.rpc.startFlow(CashExceptionSerialisationTest::CashExceptionThrowingFlow).returnValue.getOrThrow() } MaxLineLength:CashExitFlow.kt$CashExitFlow$AbstractCashSelection .getInstance { serviceHub.jdbcSession().metaData } .unconsumedCashStatesForSpending(serviceHub, amount, setOf(issuer.party), builder.notary, builder.lockId, setOf(issuer.reference)) MaxLineLength:CashExitFlow.kt$CashExitFlow$val changeOwner = exitStates.asSequence().map { it.state.data.owner }.toSet().firstOrNull() ?: throw InsufficientBalanceException(amount) - MaxLineLength:CashExitFlow.kt$CashExitFlow$val inputStates = serviceHub.vaultService.queryBy<Cash.State>(VaultQueryCriteria(stateRefs = builder.inputStates()), PageSpecification(pageNumber = DEFAULT_PAGE_NUM, pageSize = builder.inputStates().size)).states - MaxLineLength:CashExitFlow.kt$CashExitFlow${ progressTracker.currentStep = GENERATING_TX val builder = TransactionBuilder(notary = null) val issuer = ourIdentity.ref(issuerRef) val exitStates = AbstractCashSelection .getInstance { serviceHub.jdbcSession().metaData } .unconsumedCashStatesForSpending(serviceHub, amount, setOf(issuer.party), builder.notary, builder.lockId, setOf(issuer.reference)) val signers = try { val changeOwner = exitStates.asSequence().map { it.state.data.owner }.toSet().firstOrNull() ?: throw InsufficientBalanceException(amount) Cash().generateExit( builder, amount.issuedBy(issuer), exitStates, changeOwner) } catch (e: InsufficientBalanceException) { throw CashException("Exiting more cash than exists", e) } // Work out who the owners of the burnt states were (specify page size so we don't silently drop any if > DEFAULT_PAGE_SIZE) val inputStates = serviceHub.vaultService.queryBy<Cash.State>(VaultQueryCriteria(stateRefs = builder.inputStates()), PageSpecification(pageNumber = DEFAULT_PAGE_NUM, pageSize = builder.inputStates().size)).states val participantSessions = inputStates .asSequence() .mapNotNull { serviceHub.identityService.wellKnownPartyFromAnonymous(it.state.data.owner) } .filterNot(serviceHub.myInfo::isLegalIdentity) .distinct() .map(::initiateFlow) .toList() // Sign transaction progressTracker.currentStep = SIGNING_TX val tx = serviceHub.signInitialTransaction(builder, signers) // Commit the transaction progressTracker.currentStep = FINALISING_TX val notarised = finaliseTx(tx, participantSessions, "Unable to notarise exit") return Result(notarised, null) } - MaxLineLength:CashExitFlowTests.kt$CashExitFlowTests$mockNet = MockNetwork(MockNetworkParameters(servicePeerAllocationStrategy = RoundRobin(), cordappsForAllNodes = FINANCE_CORDAPPS)) MaxLineLength:CashIssueAndPaymentFlow.kt$CashIssueAndPaymentFlow$constructor(request: IssueAndPaymentRequest) : this(request.amount, request.issueRef, request.recipient, request.anonymous, request.notary, tracker()) - MaxLineLength:CashIssueAndPaymentFlow.kt$CashIssueAndPaymentFlow$progressTracker: ProgressTracker - MaxLineLength:CashIssueFlowTests.kt$CashIssueFlowTests$mockNet = MockNetwork(MockNetworkParameters(servicePeerAllocationStrategy = RoundRobin(), cordappsForAllNodes = FINANCE_CORDAPPS)) - MaxLineLength:CashPaymentFlow.kt$CashPaymentFlow$/** A straightforward constructor that constructs spends using cash states of any issuer. */ constructor(amount: Amount<Currency>, recipient: Party, anonymous: Boolean) : this(amount, recipient, anonymous, tracker()) MaxLineLength:CashPaymentFlow.kt$CashPaymentFlow$constructor(amount: Amount<Currency>, recipient: Party, anonymous: Boolean, notary: Party) : this(amount, recipient, anonymous, tracker(), notary = notary) MaxLineLength:CashPaymentFlow.kt$CashPaymentFlow$constructor(request: PaymentRequest) : this(request.amount, request.recipient, request.anonymous, tracker(), request.issuerConstraint, request.notary) - MaxLineLength:CashPaymentFlow.kt$CashPaymentFlow$val sessionsForFinality = if (serviceHub.myInfo.isLegalIdentity(recipient)) emptyList() else listOf(recipientSession) - MaxLineLength:CashPaymentFlowTests.kt$CashPaymentFlowTests$mockNet = MockNetwork(MockNetworkParameters(servicePeerAllocationStrategy = RoundRobin(), cordappsForAllNodes = FINANCE_CORDAPPS)) MaxLineLength:CashSchemaV1.kt$CashSchemaV1 : MappedSchema MaxLineLength:CashSchemaV1.kt$CashSchemaV1.PersistentCashState$@Table(name = "contract_cash_states", indexes = [Index(name = "ccy_code_idx", columnList = "ccy_code"), Index(name = "pennies_idx", columnList = "pennies")]) - MaxLineLength:CashSelectionH2Impl.kt$CashSelectionH2Impl$ SELECT vs.transaction_id, vs.output_index, ccs.pennies, SET(@t, ifnull(@t,0)+ccs.pennies) total_pennies, vs.lock_id - MaxLineLength:CashSelectionH2Impl.kt$CashSelectionH2Impl$// We are using an H2 specific means of selecting a minimum set of rows that match a request amount of coins: // 1) There is no standard SQL mechanism of calculating a cumulative total on a field and restricting row selection on the // running total of such an accumulator // 2) H2 uses session variables to perform this accumulator function: // http://www.h2database.com/html/functions.html#set // 3) H2 does not support JOIN's in FOR UPDATE (hence we are forced to execute 2 queries) override fun executeQuery(connection: Connection, amount: Amount<Currency>, lockId: UUID, notary: Party?, onlyFromIssuerParties: Set<AbstractParty>, withIssuerRefs: Set<OpaqueBytes>, withResultSet: (ResultSet) -> Boolean): Boolean MaxLineLength:CashSelectionH2Impl.kt$CashSelectionH2Impl$override - MaxLineLength:CashSelectionH2Impl.kt$CashSelectionH2Impl${ connection.createStatement().use { it.execute("CALL SET(@t, CAST(0 AS BIGINT));") } // state_status = 0 -> UNCONSUMED. // is_relevant = 0 -> RELEVANT. val selectJoin = """ SELECT vs.transaction_id, vs.output_index, ccs.pennies, SET(@t, ifnull(@t,0)+ccs.pennies) total_pennies, vs.lock_id FROM vault_states AS vs, contract_cash_states AS ccs WHERE vs.transaction_id = ccs.transaction_id AND vs.output_index = ccs.output_index AND vs.state_status = 0 AND vs.relevancy_status = 0 AND ccs.ccy_code = ? and @t < ? AND (vs.lock_id = ? OR vs.lock_id is null) """ + (if (notary != null) " AND vs.notary_name = ?" else "") + (if (onlyFromIssuerParties.isNotEmpty()) { val repeats = generateSequence { "?" }.take(onlyFromIssuerParties.size).joinToString(",") " AND ccs.issuer_key_hash IN ($repeats)" } else "") + (if (withIssuerRefs.isNotEmpty()) { val repeats = generateSequence { "?" }.take(withIssuerRefs.size).joinToString(",") " AND ccs.issuer_ref IN ($repeats)" } else "") // Use prepared statement for protection against SQL Injection (http://www.h2database.com/html/advanced.html#sql_injection) connection.prepareStatement(selectJoin).use { psSelectJoin -> var pIndex = 0 psSelectJoin.setString(++pIndex, amount.token.currencyCode) psSelectJoin.setLong(++pIndex, amount.quantity) psSelectJoin.setString(++pIndex, lockId.toString()) if (notary != null) psSelectJoin.setString(++pIndex, notary.name.toString()) onlyFromIssuerParties.forEach { psSelectJoin.setString(++pIndex, it.owningKey.toStringShort()) } withIssuerRefs.forEach { psSelectJoin.setBytes(++pIndex, it.bytes) } log.debug { psSelectJoin.toString() } psSelectJoin.executeQuery().use { rs -> return withResultSet(rs) } } } - MaxLineLength:CashSelectionH2ImplTest.kt$CashSelectionH2ImplTest$( // Tweak connections to be minimal to make this easier (1 results in a hung node during start up, so use 2 connections). configOverrides = MockNodeConfigOverrides(extraDataSourceProperties = mapOf("maximumPoolSize" to "2")) ) - MaxLineLength:CashSelectionH2ImplTest.kt$CashSelectionH2ImplTest$private val mockNet = MockNetwork(MockNetworkParameters(threadPerNode = true, cordappsForAllNodes = FINANCE_CORDAPPS)) - MaxLineLength:CashSelectionH2ImplTest.kt$CashSelectionH2ImplTest$val paymentResult = node.startFlow(CashPaymentFlow(999.POUNDS, node.info.legalIdentities[0], false)).getOrThrow() MaxLineLength:CashSelectionH2ImplTest.kt$CashSelectionH2ImplTest$val request = CashPaymentFlow.PaymentRequest(1.POUNDS, node.info.legalIdentities[0], true, setOf(node.info.legalIdentities[0], mockNet.defaultNotaryIdentity)) - MaxLineLength:CashSelectionH2ImplTest.kt$CashSelectionH2ImplTest${ val bankA = mockNet.createNode(MockNodeParameters( // Tweak connections to be minimal to make this easier (1 results in a hung node during start up, so use 2 connections). configOverrides = MockNodeConfigOverrides(extraDataSourceProperties = mapOf("maximumPoolSize" to "2")) )) val notary = mockNet.defaultNotaryIdentity // Start more cash spends than we have connections. If spend leaks a connection on retry, we will run out of connections. val flow1 = bankA.startFlow(CashPaymentFlow(amount = 100.DOLLARS, anonymous = false, recipient = notary)) val flow2 = bankA.startFlow(CashPaymentFlow(amount = 100.DOLLARS, anonymous = false, recipient = notary)) val flow3 = bankA.startFlow(CashPaymentFlow(amount = 100.DOLLARS, anonymous = false, recipient = notary)) assertThatThrownBy { flow1.getOrThrow() }.isInstanceOf(CashException::class.java) assertThatThrownBy { flow2.getOrThrow() }.isInstanceOf(CashException::class.java) assertThatThrownBy { flow3.getOrThrow() }.isInstanceOf(CashException::class.java) } - MaxLineLength:CashSelectionH2ImplTest.kt$CashSelectionH2ImplTest${ val node = mockNet.createNode() // The amount has to split across at least two states, probably to trigger the H2 accumulator variable during the // spend operation below. // Issuing Integer.MAX_VALUE will not cause an exception since PersistentCashState.pennies is a long nCopies(2, Integer.MAX_VALUE).map { issueAmount -> node.startFlow(CashIssueFlow(issueAmount.POUNDS, OpaqueBytes.of(1), mockNet.defaultNotaryIdentity)) }.transpose().getOrThrow() // The spend must be more than the size of a single cash state to force the accumulator onto the second state. node.startFlow(CashPaymentFlow((Integer.MAX_VALUE + 1L).POUNDS, node.info.legalIdentities[0])).getOrThrow() } - MaxLineLength:CashSelectionPostgreSQLImpl.kt$CashSelectionPostgreSQLImpl$ coalesce((SUM(ccs.pennies) OVER (PARTITION BY 1 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)), 0) - MaxLineLength:CashSelectionPostgreSQLImpl.kt$CashSelectionPostgreSQLImpl$// This is using PostgreSQL window functions for selecting a minimum set of rows that match a request amount of coins: // 1) This may also be possible with user-defined functions (e.g. using PL/pgSQL) // 2) The window function accumulated column (`total`) does not include the current row (starts from 0) and cannot // appear in the WHERE clause, hence restricting row selection and adjusting the returned total in the outer query. // 3) Currently (version 9.6), FOR UPDATE cannot be specified with window functions override fun executeQuery(connection: Connection, amount: Amount<Currency>, lockId: UUID, notary: Party?, onlyFromIssuerParties: Set<AbstractParty>, withIssuerRefs: Set<OpaqueBytes>, withResultSet: (ResultSet) -> Boolean): Boolean MaxLineLength:CashSelectionPostgreSQLImpl.kt$CashSelectionPostgreSQLImpl$override MaxLineLength:CashSelectionSQLServerImpl.kt$CashSelectionSQLServerImpl$override MaxLineLength:CashSelectionTest.kt$CashSelectionTest$AbstractCashSelection .getInstance { node.services.jdbcSession().metaData } .unconsumedCashStatesForSpending(node.services, exitedAmount, setOf(issuer.party), builder.notary, builder.lockId, setOf(issuer.reference)) - MaxLineLength:CashSelectionTest.kt$CashSelectionTest$issuance.addOutputState(TransactionState(Cash.State(coin, nodeIdentity), Cash.PROGRAM_ID, mockNet.defaultNotaryIdentity)) MaxLineLength:CashSelectionTest.kt$CashSelectionTest$issuance.addOutputState(TransactionState(Cash.State(it, nodeIdentity), "net.corda.finance.contracts.asset.Cash", mockNet.defaultNotaryIdentity)) - MaxLineLength:CashSelectionTest.kt$CashSelectionTest$node.services.startFlow(CashIssueFlow(issuedAmount, issuerRef, mockNet.defaultNotaryIdentity)).resultFuture.getOrThrow() - MaxLineLength:CashTests.kt$CashTests$Cash().generateExit(tx, Amount(amount.quantity, Issued(issuer.ref(depositRef), amount.token)), cashStates, payChangeTo) - MaxLineLength:CashTests.kt$CashTests$Cash().generateIssue(ptx, 100.DOLLARS `issued by` miniCorp.ref(12, 34), owner = miniCorp.party, notary = dummyNotary.party) MaxLineLength:CashTests.kt$CashTests$Cash().generateIssue(this, 100.DOLLARS `issued by` miniCorp.ref(12, 34), owner = AnonymousParty(alice.publicKey), notary = dummyNotary.party) MaxLineLength:CashTests.kt$CashTests$CashUtils.generateSpend(ourServices, tx, 80.DOLLARS, ourServices.myInfo.singleIdentityAndCert(), alice.party, setOf(miniCorp.party)) MaxLineLength:CashTests.kt$CashTests$TransactionState(Cash.State(amount `issued by` issuer.ref(depositRef), ourIdentity), Cash.PROGRAM_ID, dummyNotary.party, constraint = AlwaysAcceptAttachmentConstraint) - MaxLineLength:CashTests.kt$CashTests$amount = Amount(amount.quantity, token = amount.token.copy(amount.token.issuer.copy(reference = OpaqueBytes.of(ref)))) MaxLineLength:CashTests.kt$CashTests$assertEquals(vaultState.state.data.copy(owner = miniCorpAnonymised, amount = 10.DOLLARS `issued by` defaultIssuer), wtx.outputs[0].data) MaxLineLength:CashTests.kt$CashTests$assertEquals(vaultState0.state.data.copy(owner = miniCorpAnonymised, amount = 500.DOLLARS `issued by` defaultIssuer), wtx.getOutput(0)) MaxLineLength:CashTests.kt$CashTests$assertEquals(vaultState0.state.data.copy(owner = miniCorpAnonymised, amount = 500.DOLLARS `issued by` defaultIssuer), wtx.outputs[1].data) - MaxLineLength:CashTests.kt$CashTests$assertNotEquals((fiveThousandDollarsFromMega withDeposit defaultIssuer).amount.token, fiveThousandDollarsFromMega.amount.token) - MaxLineLength:CashTests.kt$CashTests$assertNotEquals(fiveThousandDollarsFromMega.amount.token, (fiveThousandDollarsFromMega withDeposit defaultIssuer).amount.token) MaxLineLength:CashTests.kt$CashTests$makeTestIdentityService(megaCorp.identity, miniCorp.identity, dummyCashIssuer.identity, dummyNotary.identity, myself.identity) MaxLineLength:CashTests.kt$CashTests$output(Cash.PROGRAM_ID, "MEGA_CORP cash 2", "MEGA_CORP cash".output<Cash.State>().copy(owner = AnonymousParty(alice.publicKey))) - MaxLineLength:CashTests.kt$CashTests$output(Cash.PROGRAM_ID, "MEGA_CORP cash 3", "MEGA_CORP cash".output<Cash.State>().copy(owner = alice.party)) MaxLineLength:CashTests.kt$CashTests$output(Cash.PROGRAM_ID, inState.copy(owner = AnonymousParty(bob.publicKey), amount = 2000.DOLLARS `issued by` defaultIssuer)) MaxLineLength:CashTests.kt$CashTests$output(Cash.PROGRAM_ID, issuerInState.copy(amount = issuerInState.amount - (200.DOLLARS `issued by` defaultIssuer)) issuedBy miniCorp.party) - MaxLineLength:CashTests.kt$CashTests$output(Cash.PROGRAM_ID, issuerInState.copy(amount = issuerInState.amount - (200.DOLLARS `issued by` defaultIssuer))) MaxLineLength:CashTests.kt$CashTests$output(Cash.PROGRAM_ID, issuerInState.copy(owner = miniCorp.party, amount = issuerInState.amount - (200.DOLLARS `issued by` defaultIssuer))) - MaxLineLength:CashTests.kt$CashTests$private MaxLineLength:CashTests.kt$CashTests$val expectedChange = cashStates[0].state.data.copy(amount = cashStates[0].state.data.amount.copy(quantity = expectedChangeAmount), owner = actualChange.owner) MaxLineLength:CashUtils.kt$CashUtils$@Deprecated("Our identity should be specified", replaceWith = ReplaceWith("generateSpend(services, tx, amount, to, ourIdentity, onlyFromParties)")) MaxLineLength:CashUtils.kt$CashUtils$fun deriveState(txState: TransactionState<Cash.State>, amt: Amount<Issued<Currency>>, owner: AbstractParty): TransactionState<Cash.State> MaxLineLength:CashUtils.kt$CashUtils$return generateSpend(services, tx, listOf(PartyAndAmount(to, amount)), services.myInfo.legalIdentitiesAndCerts.single(), onlyFromParties) - MaxLineLength:CashUtils.kt$CashUtils$val acceptableCoins = cashSelection.unconsumedCashStatesForSpending(services, totalAmount, onlyFromParties, tx.notary, tx.lockId) MaxLineLength:CashUtils.kt$CashUtils$val changeIdentity: AbstractParty = if (anonymous) services.keyManagementService.freshKeyAndCert(ourIdentity, revocationEnabled).party.anonymise() else ourIdentity.party - MaxLineLength:CashUtils.kt$CashUtils${ fun deriveState(txState: TransactionState<Cash.State>, amt: Amount<Issued<Currency>>, owner: AbstractParty): TransactionState<Cash.State> { return txState.copy(data = txState.data.copy(amount = amt, owner = owner)) } // Retrieve unspent and unlocked cash states that meet our spending criteria. val totalAmount = payments.map { it.amount }.sumOrThrow() val cashSelection = AbstractCashSelection.getInstance { services.jdbcSession().metaData } val acceptableCoins = cashSelection.unconsumedCashStatesForSpending(services, totalAmount, onlyFromParties, tx.notary, tx.lockId) val revocationEnabled = false // Revocation is currently unsupported // If anonymous is true, generate a new identity that change will be sent to for confidentiality purposes. This means that a // third party with a copy of the transaction (such as the notary) cannot identify who the change was // sent to val changeIdentity: AbstractParty = if (anonymous) services.keyManagementService.freshKeyAndCert(ourIdentity, revocationEnabled).party.anonymise() else ourIdentity.party return OnLedgerAsset.generateSpend( tx, payments, acceptableCoins, changeIdentity, ::deriveState, Cash()::generateMoveCommand ) } - MaxLineLength:CashViewer.kt$CashViewer$"Issuer" to { state, text -> state.resolveIssuer().value?.name?.organisation?.contains(text, true) == true } MaxLineLength:CashViewer.kt$CashViewer$/** * Assemble the Issuer node. */ val treeItem = TreeItem(ViewerNode.IssuerNode(issuer.owningKey.toKnownParty().value ?: issuer, equivSumAmount, memberStates)) MaxLineLength:CashViewer.kt$CashViewer$/** * Next we create subgroups based on currency. [memberStates] here is all states holding currency [currency] issued by [issuer] above. * Note that these states will not be displayed in the TreeTable, but rather in the side pane if the user clicks on the row. */ val currencyNodes = AggregatedList(memberStates, { it.state.data.amount.token.product }) { currency, groupedMemberStates -> /** * We sum the states in the subgroup, to be displayed in the "Local Currency" column */ val amounts = groupedMemberStates.map { it.state.data.amount.withoutIssuer() } val sumAmount = amounts.foldObservable(Amount(0, currency), Amount<Currency>::plus) /** * We exchange the sum to the reporting currency, to be displayed in the "<currency> Equiv" column. */ val equivSumAmount = EasyBind.combine(sumAmount, reportingExchange) { sum, exchange -> exchange.second(sum) } /** * Finally assemble the actual TreeTable Currency node. */ TreeItem(ViewerNode.CurrencyNode(sumAmount, equivSumAmount, groupedMemberStates)) } - MaxLineLength:CashViewer.kt$CashViewer$/** * Next we create subgroups based on currency. [memberStates] here is all states holding currency [currency] issued by [issuer] above. * Note that these states will not be displayed in the TreeTable, but rather in the side pane if the user clicks on the row. */ val currencyNodes = AggregatedList(memberStates, { it.state.data.amount.token.product }) { currency, groupedMemberStates -> /** * We sum the states in the subgroup, to be displayed in the "Local Currency" column */ val amounts = groupedMemberStates.map { it.state.data.amount.withoutIssuer() } val sumAmount = amounts.foldObservable(Amount(0, currency), Amount<Currency>::plus) /** * We exchange the sum to the reporting currency, to be displayed in the "<currency> Equiv" column. */ val equivSumAmount = EasyBind.combine(sumAmount, reportingExchange) { sum, exchange -> exchange.second(sum) } /** * Finally assemble the actual TreeTable Currency node. */ TreeItem(ViewerNode.CurrencyNode(sumAmount, equivSumAmount, groupedMemberStates)) } /** * Now that we have all nodes per currency, we sum the exchanged amounts, to be displayed in the * "<currency> Equiv" column, this time on the issuer level. */ val equivAmounts = currencyNodes.map { it.value.equivAmount }.flatten() val equivSumAmount = reportingCurrency.bind { currency -> equivAmounts.foldObservable(Amount(0, currency), Amount<Currency>::plus) } /** * Assemble the Issuer node. */ val treeItem = TreeItem(ViewerNode.IssuerNode(issuer.owningKey.toKnownParty().value ?: issuer, equivSumAmount, memberStates)) /** * Bind the children in the TreeTable structure. * * TODO Perhaps we shouldn't do this here, but rather have a generic way of binding nodes to the treetable once. */ treeItem.isExpanded = true val children: List<TreeItem<out ViewerNode.IssuerNode>> = treeItem.children Bindings.bindContent(children, currencyNodes) treeItem - MaxLineLength:CashViewer.kt$CashViewer$/** * This is where we aggregate the list of cash states into the TreeTable structure. */ val cashViewerIssueNodes: ObservableList<TreeItem<out ViewerNode.IssuerNode>> = /** * First we group the states based on the issuer. [memberStates] is all states holding currency issued by [issuer] */ AggregatedList(searchField.filteredData, { it.state.data.amount.token.issuer.party }) { issuer, memberStates -> /** * Next we create subgroups based on currency. [memberStates] here is all states holding currency [currency] issued by [issuer] above. * Note that these states will not be displayed in the TreeTable, but rather in the side pane if the user clicks on the row. */ val currencyNodes = AggregatedList(memberStates, { it.state.data.amount.token.product }) { currency, groupedMemberStates -> /** * We sum the states in the subgroup, to be displayed in the "Local Currency" column */ val amounts = groupedMemberStates.map { it.state.data.amount.withoutIssuer() } val sumAmount = amounts.foldObservable(Amount(0, currency), Amount<Currency>::plus) /** * We exchange the sum to the reporting currency, to be displayed in the "<currency> Equiv" column. */ val equivSumAmount = EasyBind.combine(sumAmount, reportingExchange) { sum, exchange -> exchange.second(sum) } /** * Finally assemble the actual TreeTable Currency node. */ TreeItem(ViewerNode.CurrencyNode(sumAmount, equivSumAmount, groupedMemberStates)) } /** * Now that we have all nodes per currency, we sum the exchanged amounts, to be displayed in the * "<currency> Equiv" column, this time on the issuer level. */ val equivAmounts = currencyNodes.map { it.value.equivAmount }.flatten() val equivSumAmount = reportingCurrency.bind { currency -> equivAmounts.foldObservable(Amount(0, currency), Amount<Currency>::plus) } /** * Assemble the Issuer node. */ val treeItem = TreeItem(ViewerNode.IssuerNode(issuer.owningKey.toKnownParty().value ?: issuer, equivSumAmount, memberStates)) /** * Bind the children in the TreeTable structure. * * TODO Perhaps we shouldn't do this here, but rather have a generic way of binding nodes to the treetable once. */ treeItem.isExpanded = true val children: List<TreeItem<out ViewerNode.IssuerNode>> = treeItem.children Bindings.bindContent(children, currencyNodes) treeItem } - MaxLineLength:CashViewer.kt$CashViewer$/** * We allow filtering by both issuer and currency. We do this by filtering by both at the same time and picking the * one which produces more results, which seems to work, as the set of currency strings don't really overlap with * issuer strings. */ val searchField = SearchField(cashStates, "Currency" to { state, text -> state.state.data.amount.token.product.toString().contains(text, true) }, "Issuer" to { state, text -> state.resolveIssuer().value?.name?.organisation?.contains(text, true) == true } ) - MaxLineLength:CashViewer.kt$CashViewer$/** * We exchange the sum to the reporting currency, to be displayed in the "<currency> Equiv" column. */ val equivSumAmount = EasyBind.combine(sumAmount, reportingExchange) { sum, exchange -> exchange.second(sum) } - MaxLineLength:CashViewer.kt$CashViewer$AggregatedList MaxLineLength:CashViewer.kt$CashViewer$is ViewerNode.IssuerNode -> SimpleStringProperty(node.issuer.nameOrNull()?.let { PartyNameFormatter.short.format(it) } ?: "Anonymous") - MaxLineLength:CashViewer.kt$CashViewer$itemsProperty().bind(selectedNode.map { it?.states?.map { StateRow(LocalDateTime.now(), it) } ?: ObservableListWrapper(emptyList()) }) - MaxLineLength:CashViewer.kt$CashViewer$setCellValueFactory { val node = it.value.value when (node) { is ViewerNode.IssuerNode -> null.lift() is ViewerNode.CurrencyNode -> node.amount.map { it } } } cellFactory = currencyCellFactory /** * We must set this, otherwise on sort an exception will be thrown, as it will try to compare Amounts of differing currency */ isSortable = false - MaxLineLength:CashViewer.kt$CashViewer.CashWidget$if(lastTimeStamp != null && currentTimeStamp - lastTimeStamp.toLong() < 1.seconds.toMillis()) { data.safelyTransition { remove(size - 1, size) } } - MaxLineLength:CashViewer.kt$CashViewer.CashWidget$private + MaxLineLength:CashViewer.kt$CashViewer$itemsProperty().bind(selectedNode.map { it?.states?.map { StateRow(LocalDateTime.now(), it) } ?: FXCollections.emptyObservableList() }) MaxLineLength:CashViewer.kt$CashViewer.CashWidget${ // If update arrived in very close succession to the previous one - kill the last point received to eliminate un-necessary noise on the graph. if(lastTimeStamp != null && currentTimeStamp - lastTimeStamp.toLong() < 1.seconds.toMillis()) { data.safelyTransition { remove(size - 1, size) } } // Add a new data point. data(currentTimeStamp, currAmount) // Limit population of data points to make graph painting faster. data.safelyTransition { if (size > 300) remove(0, 1) } } - MaxLineLength:CashViewer.kt$CashViewer.StateRowGraphic$issuerValueLabel.apply { tooltip(resolvedIssuer.nameOrNull()?.let { PartyNameFormatter.full.format(it) } ?: "Anonymous") } MaxLineLength:CashViewer.kt$CashViewer.StateRowGraphic$val resolvedIssuer: AbstractParty = stateRow.stateAndRef.resolveIssuer().value ?: stateRow.stateAndRef.state.data.amount.token.issuer.party - MaxLineLength:CertPathSerializer.kt$CertPathSerializer : Proxy - MaxLineLength:CertRole.kt$CertRole : ASN1Encodable - MaxLineLength:CertRole.kt$CertRole$enum - MaxLineLength:CertRoleTests.kt$CertRoleTests$assertFalse { confidentialCertRole.isValidParent(doormanCertRole) } - MaxLineLength:CertRoleTests.kt$CertRoleTests$assertFalse { confidentialCertRole.isValidParent(nodeCACertRole) } - MaxLineLength:CertRoleTests.kt$CertRoleTests$assertFalse { legalIDCertFromDoormanRole.isValidParent(tlsCertFromDoormanRole) } - MaxLineLength:CertRoleTests.kt$CertRoleTests$assertFalse { tlsCertFromNodeCARole.isValidParent(legalIDCertFromNodeCARole) } - MaxLineLength:CertRoleTests.kt$CertRoleTests$assertTrue { confidentialCertRole.isValidParent(legalIDCertFromNodeCARole) } - MaxLineLength:CertRoleTests.kt$CertRoleTests$assertTrue { doormanCertRole.isValidParent(intermediateRootCertRole) } - MaxLineLength:CertRoleTests.kt$CertRoleTests$assertTrue { legalIDCertFromDoormanRole.isValidParent(doormanCertRole) } MaxLineLength:CertRoleTests.kt$CertRoleTests$val confidentialCert = X509Utilities.createCertificate(CertificateType.CONFIDENTIAL_LEGAL_IDENTITY, legalIDCertFromNodeCA, legalIDKeyPairFromNodeCA, nodeSubject, confidentialKeyPair.public) MaxLineLength:CertRoleTests.kt$CertRoleTests$val doormanCert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, intermediateRootCert, intermediateRootKeyPair, doormanSubject, doormanKeyPair.public) MaxLineLength:CertRoleTests.kt$CertRoleTests$val intermediateRootCert = X509Utilities.createCertificate(CertificateType.ROOT_CA, rootCert, rootKeyPair, intermediateRootSubject, intermediateRootKeyPair.public) @@ -4438,299 +2958,119 @@ MaxLineLength:CertRoleTests.kt$CertRoleTests$val nodeCACert = X509Utilities.createCertificate(CertificateType.NODE_CA, doormanCert, doormanKeyPair, nodeSubject, nodeCAKeyPair.public) MaxLineLength:CertRoleTests.kt$CertRoleTests$val tlsCertFromDoorman = X509Utilities.createCertificate(CertificateType.TLS, doormanCert, doormanKeyPair, nodeSubject, tlsKeyPairFromDoorman.public) MaxLineLength:CertRoleTests.kt$CertRoleTests$val tlsCertFromNodeCA = X509Utilities.createCertificate(CertificateType.TLS, nodeCACert, nodeCAKeyPair, nodeSubject, tlsKeyPairFromNodeCA.public) - MaxLineLength:CertRoleTests.kt$CertRoleTests${ // Testing for various certificate hierarchies (with or without NodeCA). // ROOT -> Intermediate Root -> Doorman -> NodeCA -> Legal Identity cert -> Confidential key cert // -> NodeCA -> TLS // -> Legal Identity cert -> Confidential key cert // -> TLS val rootSubject = X500Principal("CN=Root,O=R3 Ltd,L=London,C=GB") val intermediateRootSubject = X500Principal("CN=Intermediate Root,O=R3 Ltd,L=London,C=GB") val doormanSubject = X500Principal("CN=Doorman,O=R3 Ltd,L=London,C=GB") val nodeSubject = X500Principal("CN=Node,O=R3 Ltd,L=London,C=GB") val rootKeyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) val rootCert = X509Utilities.createSelfSignedCACertificate(rootSubject, rootKeyPair) val rootCertRole = CertRole.extract(rootCert) val intermediateRootKeyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) // Note that [CertificateType.ROOT_CA] is used for both root and intermediate root. val intermediateRootCert = X509Utilities.createCertificate(CertificateType.ROOT_CA, rootCert, rootKeyPair, intermediateRootSubject, intermediateRootKeyPair.public) val intermediateRootCertRole = CertRole.extract(intermediateRootCert) val doormanKeyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) // Note that [CertificateType.INTERMEDIATE_CA] has actually role = CertRole.DOORMAN_CA, see [CertificateType] in [X509Utilities]. val doormanCert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, intermediateRootCert, intermediateRootKeyPair, doormanSubject, doormanKeyPair.public) val doormanCertRole = CertRole.extract(doormanCert)!! val nodeCAKeyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) val nodeCACert = X509Utilities.createCertificate(CertificateType.NODE_CA, doormanCert, doormanKeyPair, nodeSubject, nodeCAKeyPair.public) val nodeCACertRole = CertRole.extract(nodeCACert)!! val tlsKeyPairFromNodeCA = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) val tlsCertFromNodeCA = X509Utilities.createCertificate(CertificateType.TLS, nodeCACert, nodeCAKeyPair, nodeSubject, tlsKeyPairFromNodeCA.public) val tlsCertFromNodeCARole = CertRole.extract(tlsCertFromNodeCA)!! val tlsKeyPairFromDoorman = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) val tlsCertFromDoorman = X509Utilities.createCertificate(CertificateType.TLS, doormanCert, doormanKeyPair, nodeSubject, tlsKeyPairFromDoorman.public) val tlsCertFromDoormanRole = CertRole.extract(tlsCertFromDoorman)!! val legalIDKeyPairFromNodeCA = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) val legalIDCertFromNodeCA = X509Utilities.createCertificate(CertificateType.LEGAL_IDENTITY, nodeCACert, nodeCAKeyPair, nodeSubject, legalIDKeyPairFromNodeCA.public) val legalIDCertFromNodeCARole = CertRole.extract(legalIDCertFromNodeCA)!! val legalIDKeyPairFromDoorman = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) val legalIDCertFromDoorman = X509Utilities.createCertificate(CertificateType.LEGAL_IDENTITY, doormanCert, doormanKeyPair, nodeSubject, legalIDKeyPairFromDoorman.public) val legalIDCertFromDoormanRole = CertRole.extract(legalIDCertFromDoorman)!! val confidentialKeyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) val confidentialCert = X509Utilities.createCertificate(CertificateType.CONFIDENTIAL_LEGAL_IDENTITY, legalIDCertFromNodeCA, legalIDKeyPairFromNodeCA, nodeSubject, confidentialKeyPair.public) val confidentialCertRole = CertRole.extract(confidentialCert)!! assertNull(rootCertRole) assertNull(intermediateRootCertRole) assertEquals(tlsCertFromNodeCARole, tlsCertFromDoormanRole) assertEquals(legalIDCertFromNodeCARole, legalIDCertFromDoormanRole) assertTrue { doormanCertRole.isValidParent(intermediateRootCertRole) } // Doorman is signed by Intermediate Root. assertTrue { nodeCACertRole.isValidParent(doormanCertRole) } // NodeCA is signed by Doorman. assertTrue { tlsCertFromNodeCARole.isValidParent(nodeCACertRole) } // TLS is signed by NodeCA. assertTrue { tlsCertFromDoormanRole.isValidParent(doormanCertRole) } // TLS can also be signed by Doorman. assertTrue { legalIDCertFromNodeCARole.isValidParent(nodeCACertRole) } // Legal Identity is signed by NodeCA. assertTrue { legalIDCertFromDoormanRole.isValidParent(doormanCertRole) } // Legal Identity can also be signed by Doorman. assertTrue { confidentialCertRole.isValidParent(legalIDCertFromNodeCARole) } // Confidential key cert is signed by Legal Identity. assertFalse { legalIDCertFromDoormanRole.isValidParent(tlsCertFromDoormanRole) } // Legal Identity cannot be signed by TLS. assertFalse { tlsCertFromNodeCARole.isValidParent(legalIDCertFromNodeCARole) } // TLS cannot be signed by Legal Identity. assertFalse { confidentialCertRole.isValidParent(nodeCACertRole) } // Confidential key cert cannot be signed by NodeCA. assertFalse { confidentialCertRole.isValidParent(doormanCertRole) } // Confidential key cert cannot be signed by Doorman. } - MaxLineLength:CertificateChainCheckPolicy.kt$CertificateChainCheckPolicy.UsernameMustMatchCommonNameCheck$if (!theirChain.any { certificate -> CordaX500Name.parse(certificate.subjectDN.name).commonName == username }) { throw CertificateException("Client certificate does not match login username.") } - MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$Pair(Date(System.currentTimeMillis() - 5.minutes.toMillis()), Date(System.currentTimeMillis() + 10.days.toMillis())) MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$private MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$val (nodeCert, nodeKeys) = nodeKeyStore.query { getCertificateAndKeyPair(X509Utilities.CORDA_CLIENT_CA, nodeKeyStore.entryPassword) } - MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$val (tlsCert, tlsKeys) = sslKeyStore.query { getCertificateAndKeyPair(X509Utilities.CORDA_CLIENT_TLS, sslKeyStore.entryPassword) } - MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$val distPointName = DistributionPointName(GeneralNames(GeneralName(GeneralName.uniformResourceIdentifier, it))) - MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$val newNodeCert = replaceCrlDistPointCaCertificate(nodeCert, CertificateType.NODE_CA, INTERMEDIATE_CA.keyPair, nodeCaCrlDistPoint) MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$val newTlsCert = replaceCrlDistPointCaCertificate(tlsCert, CertificateType.TLS, nodeKeys, tlsCrlDistPoint, X500Name.getInstance(ROOT_CA.certificate.subjectX500Principal.encoded)) - MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$val nodeCert = (signingCertificateStore to p2pSslConfiguration).recreateNodeCaAndTlsCertificates(nodeCrlDistPoint, tlsCrlDistPoint) MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$val nodeCertChain = listOf(newNodeCert, INTERMEDIATE_CA.certificate, *nodeKeyStore.query { getCertificateChain(X509Utilities.CORDA_CLIENT_CA) }.drop(2).toTypedArray()) MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$val sslCertChain = listOf(newTlsCert, newNodeCert, INTERMEDIATE_CA.certificate, *sslKeyStore.query { getCertificateChain(X509Utilities.CORDA_CLIENT_TLS) }.drop(3).toTypedArray()) - MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests.Companion$builder.addCRLEntry(it, Date(System.currentTimeMillis() - 10.minutes.toMillis()), ReasonFlags.certificateHold) - MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests.Companion$val builder = JcaX509v2CRLBuilder(caCertificate.subjectX500Principal, Date(System.currentTimeMillis() - 1.minutes.toMillis())) - MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests.Companion$val issuingDistPoint = IssuingDistributionPoint(DistributionPointName(GeneralNames(issuingDistPointName)), indirect, false) - MaxLineLength:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests.Companion$val signer = JcaContentSignerBuilder(signatureAlgorithm).setProvider(Crypto.findProvider("BC")).build(caPrivateKey) - MaxLineLength:CertificateStore.kt$CertificateStore$ operator fun get(alias: String): X509Certificate MaxLineLength:CertificateStore.kt$CertificateStore.Companion$fun fromFile(storePath: Path, password: String, entryPassword: String, createNew: Boolean): CertificateStore MaxLineLength:CertificateStore.kt$CertificateStore.Companion$fun fromInputStream(stream: InputStream, password: String, entryPassword: String): CertificateStore MaxLineLength:CertificateStore.kt$CertificateStore.Companion$fun fromResource(storeResourceName: String, password: String, entryPassword: String, classLoader: ClassLoader = Thread.currentThread().contextClassLoader): CertificateStore MaxLineLength:CertificateStore.kt$CertificateStore.Companion$fun of(store: X509KeyStore, password: String, entryPassword: String): CertificateStore MaxLineLength:CertificateStore.kt$DelegatingCertificateStore : CertificateStore - MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$@JvmStatic fun withBaseDirectory(baseDirectory: Path, certificatesDirectoryName: String = DEFAULT_CERTIFICATES_DIRECTORY_NAME, keyStoreFileName: String = KeyStore.DEFAULT_STORE_FILE_NAME, keyStorePassword: String = KeyStore.DEFAULT_STORE_PASSWORD, keyPassword: String = keyStorePassword, trustStoreFileName: String = TrustStore.DEFAULT_STORE_FILE_NAME, trustStorePassword: String = TrustStore.DEFAULT_STORE_PASSWORD): MutualSslConfiguration - MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$@JvmStatic fun withCertificatesDirectory(certificatesDirectory: Path, keyStoreFileName: String = KeyStore.DEFAULT_STORE_FILE_NAME, keyStorePassword: String = KeyStore.DEFAULT_STORE_PASSWORD, keyPassword: String = keyStorePassword, trustStoreFileName: String = TrustStore.DEFAULT_STORE_FILE_NAME, trustStorePassword: String = TrustStore.DEFAULT_STORE_PASSWORD, trustStoreKeyPassword: String = TrustStore.DEFAULT_KEY_PASSWORD, useOpenSsl: Boolean = false): MutualSslConfiguration - MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$keyPassword: String = keyStorePassword MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$keyStoreFileName: String = KeyStore.DEFAULT_STORE_FILE_NAME MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$keyStorePassword: String = KeyStore.DEFAULT_STORE_PASSWORD MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$return withCertificatesDirectory(baseDirectory / certificatesDirectoryName, keyStoreFileName, keyStorePassword, keyPassword, trustStoreFileName, trustStorePassword) MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$trustStoreFileName: String = TrustStore.DEFAULT_STORE_FILE_NAME - MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$trustStorePassword: String = TrustStore.DEFAULT_STORE_PASSWORD - MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$val keyStore = FileBasedCertificateStoreSupplier(certificatesDirectory / keyStoreFileName, keyStorePassword, keyPassword) MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.Companion$val trustStore = FileBasedCertificateStoreSupplier(certificatesDirectory / trustStoreFileName, trustStorePassword, trustStoreKeyPassword) - MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.KeyStore.Companion$@JvmStatic fun withBaseDirectory(baseDirectory: Path, password: String = DEFAULT_STORE_PASSWORD, keyPassword: String = password, certificatesDirectoryName: String = DEFAULT_CERTIFICATES_DIRECTORY_NAME, certificateStoreFileName: String = DEFAULT_STORE_FILE_NAME): FileBasedCertificateStoreSupplier MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.KeyStore.Companion$@JvmStatic fun withCertificatesDirectory(certificatesDirectory: Path, password: String = DEFAULT_STORE_PASSWORD, keyPassword: String = password, certificateStoreFileName: String = DEFAULT_STORE_FILE_NAME): FileBasedCertificateStoreSupplier MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.KeyStore.Companion$certificateStoreFileName: String = DEFAULT_STORE_FILE_NAME MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.KeyStore.Companion$certificatesDirectoryName: String = DEFAULT_CERTIFICATES_DIRECTORY_NAME MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.KeyStore.Companion$return FileBasedCertificateStoreSupplier(baseDirectory / certificatesDirectoryName / certificateStoreFileName, password, keyPassword) - MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.KeyStore.Companion$return FileBasedCertificateStoreSupplier(certificatesDirectory / certificateStoreFileName, password, keyPassword) MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.TrustStore.Companion$@JvmStatic fun withBaseDirectory(baseDirectory: Path, password: String = DEFAULT_STORE_PASSWORD, keyPassword: String = DEFAULT_KEY_PASSWORD, certificatesDirectoryName: String = DEFAULT_CERTIFICATES_DIRECTORY_NAME, certificateStoreFileName: String = DEFAULT_STORE_FILE_NAME): FileBasedCertificateStoreSupplier MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.TrustStore.Companion$certificatesDirectoryName: String = DEFAULT_CERTIFICATES_DIRECTORY_NAME MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.TrustStore.Companion$keyPassword: String = DEFAULT_KEY_PASSWORD MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.TrustStore.Companion$return FileBasedCertificateStoreSupplier(baseDirectory / certificatesDirectoryName / certificateStoreFileName, password, keyPassword) - MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.P2P.TrustStore.Companion$return FileBasedCertificateStoreSupplier(certificatesDirectory / certificateStoreFileName, password, keyPassword) - MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.Signing.Companion$@JvmStatic fun withBaseDirectory(baseDirectory: Path, password: String = DEFAULT_STORE_PASSWORD, keyPassword: String = password, certificatesDirectoryName: String = DEFAULT_CERTIFICATES_DIRECTORY_NAME, certificateStoreFileName: String = DEFAULT_STORE_FILE_NAME): FileBasedCertificateStoreSupplier MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.Signing.Companion$certificatesDirectoryName: String = DEFAULT_CERTIFICATES_DIRECTORY_NAME MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.Signing.Companion$keyPassword: String = password MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.Signing.Companion$return FileBasedCertificateStoreSupplier(baseDirectory / certificatesDirectoryName / certificateStoreFileName, password, keyPassword) - MaxLineLength:CertificateStoreStubs.kt$CertificateStoreStubs.Signing.Companion$return FileBasedCertificateStoreSupplier(certificatesDirectory / certificateStoreFileName, password, keyPassword) MaxLineLength:CertificateStoreSupplier.kt$FileBasedCertificateStoreSupplier : CertificateStoreSupplier MaxLineLength:CertificatesUtils.kt$fun saveToKeyStore(keyStorePath: Path, rpcKeyPair: KeyPair, selfSignCert: X509Certificate, password: String = "password", alias: String = "Key"): Path - MaxLineLength:CertificatesUtils.kt$fun saveToTrustStore(trustStorePath: Path, selfSignCert: X509Certificate, password: String = "password", alias: String = "Key"): Path - MaxLineLength:CertificatesUtils.kt$validityWindow: Pair<Duration, Duration> = X509Utilities.DEFAULT_VALIDITY_WINDOW - MaxLineLength:CheatingSecurityProvider.kt$CheatingSecurityProvider : ProviderAutoCloseable - MaxLineLength:CheatingSecurityProvider.kt$CheatingSecurityProvider$CheatingSecureRandomService : Service MaxLineLength:CheckpointAgent.kt$CheckpointAgent.Companion$println("Running Checkpoint agent with following arguments: instrumentClassname=$instrumentClassname, instrumentType=$instrumentType, minimumSize=$minimumSize, maximumSize=$maximumSize, graphDepth=$graphDepth, printOnce=$printOnce\n") - MaxLineLength:CheckpointAgent.kt$CheckpointHook : ClassFileTransformer - MaxLineLength:CheckpointAgent.kt$CheckpointHook$builder.append("${statsTree.className} (hash:${statsTree.value?.hashCode()}) (count:${identityInfo.refCount})") MaxLineLength:CheckpointAgent.kt$CheckpointHook$if (parameterTypeNames == listOf("com.esotericsoftware.kryo.Kryo", "com.esotericsoftware.kryo.io.Input", "java.lang.Class")) { if (method.isEmpty) continue log.debug { "Instrumenting on read: ${clazz.name}" } method.insertBefore("$hookClassName.${this::readEnter.name}($2, $3);") method.insertAfter("$hookClassName.${this::readExit.name}($2, $3, (java.lang.Object)\$_);") return clazz } else if (parameterTypeNames == listOf("com.esotericsoftware.kryo.io.Input", "java.lang.Object")) { if (method.isEmpty) continue log.debug { "Instrumenting on field read: ${clazz.name}" } method.insertBefore("$hookClassName.${this::readFieldEnter.name}((java.lang.Object)this);") method.insertAfter("$hookClassName.${this::readFieldExit.name}($2, (java.lang.Object)this);") return clazz } MaxLineLength:CheckpointAgent.kt$CheckpointHook$if (parameterTypeNames == listOf("com.esotericsoftware.kryo.Kryo", "com.esotericsoftware.kryo.io.Output", "java.lang.Object")) { if (method.isEmpty) continue log.debug { "Instrumenting on write: ${clazz.name}" } method.insertBefore("$hookClassName.${this::writeEnter.name}($2, $3);") method.insertAfter("$hookClassName.${this::writeExit.name}($2, $3);") return clazz } - MaxLineLength:CheckpointAgent.kt$CheckpointHook$log.debug { "readFieldExit basic type value: ${that.field.name}:${that.field.type} = ${arrayValue ?: value}" } - MaxLineLength:CheckpointAgent.kt$CheckpointHook$log.debug { "writeEnter: adding event for clazz: ${obj.javaClass.name} (strandId: ${Strand.currentStrand().id})" } - MaxLineLength:CheckpointAgent.kt$CheckpointHook$log.debug { "writeExit: clazz[${obj.javaClass.name}], strandId[${Strand.currentStrand().id}], eventCount[$count]" } - MaxLineLength:CheckpointAgent.kt$CheckpointHook$log.debug { "writeExit: clearing event for clazz: ${obj.javaClass.name} (strandId: ${Strand.currentStrand().id})" } - MaxLineLength:CheckpointAgent.kt$fun readTree(events: List<StatsEvent>, index: Int, idMap: IdentityHashMap<Any, IdentityInfo> = IdentityHashMap()): Pair<Int, IdentityInfo> MaxLineLength:CheckpointAgent.kt$fun readTrees(events: List<StatsEvent>, index: Int, idMap: IdentityHashMap<Any, IdentityInfo>): Pair<Int, List<Pair<StatsInfo, IdentityInfo>>> MaxLineLength:CheckpointAgent.kt$log.debug { "Skipping repeated StatsEvent.Enter: ${exit.value} (hashcode:${exit.value!!.hashCode()}) (count:${idMap[exit.value]?.refCount})" } MaxLineLength:CheckpointAgent.kt$log.debug { "Skipping repeated StatsEvent.Exit: ${event.value} (hashcode:${event.value!!.hashCode()}) (count:${idMap[event.value]?.refCount})" } - MaxLineLength:CheckpointAgent.kt$log.debug { "Skipping repeated StatsEvent.ObjectField: ${event.value} (hashcode:${event.value!!.hashCode()}) (count:${idMap[event.value]?.refCount})" } - MaxLineLength:CheckpointAgent.kt$trees += StatsInfo(event.fieldName, event.fieldType) to IdentityInfo(StatsTree.BasicType(event.fieldValue), 1) + MaxLineLength:CheckpointAgent.kt$log.debug { "Skipping repeated StatsEvent.ObjectField: ${event.value} (hashcode:${event.value.hashCode()}) (count:${idMap[event.value]?.refCount})" } MaxLineLength:CheckpointDumper.kt$CheckpointDumper - MaxLineLength:CheckpointDumper.kt$CheckpointDumper$is WaitForStateConsumption -> SuspendedOn(waitForStateConsumption = (operation as WaitForStateConsumption).stateRefs) - MaxLineLength:CheckpointDumper.kt$CheckpointDumper$it.secondsSpentWaiting = TimeUnit.MILLISECONDS.toSeconds(Duration.between(suspendedTimestamp, now).toMillis()) - MaxLineLength:CheckpointDumper.kt$CheckpointDumper$serialisedCheckpoint.checkpointDeserialize(context = checkpointSerializationContext) - MaxLineLength:CheckpointDumper.kt$CheckpointDumper$val file = baseDirectory / NodeStartup.LOGS_DIRECTORY_NAME / "checkpoints_dump-${TIME_FORMATTER.format(now)}.zip" - MaxLineLength:CheckpointDumper.kt$CheckpointDumper${ // Poke into Quasar's stack and find the object references to the sub-flows so that we can correctly get the current progress // step for each sub-call. val stackObjects = fiber.getQuasarStack() subFlowStack.map { it.toJson(stackObjects) } } - MaxLineLength:CheckpointDumper.kt$CheckpointDumper.AttachmentSerializer$override fun serialize(value: Attachment, gen: JsonGenerator, serializers: SerializerProvider) - MaxLineLength:CheckpointDumper.kt$CheckpointDumper.CheckpointDumperBeanModifier$beanProperties: MutableList<BeanPropertyWriter> MaxLineLength:CheckpointDumper.kt$CheckpointDumper.CheckpointDumperBeanModifier$it.type.isTypeOrSubTypeOf(ProgressTracker::class.java) || it.name == "_stateMachine" || it.name == "deprecatedPartySessionMap" - MaxLineLength:CheckpointDumper.kt$CheckpointDumper.CheckpointDumperBeanModifier${ // Do not serialise node singletons // TODO This will cause the singleton to appear as an empty object. Ideally we don't want it to appear at all but this will // have to do for now. beanProperties.clear() } - MaxLineLength:CheckpointDumper.kt$CheckpointDumper.FlowLogicMixin$@JsonAutoDetect(getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, fieldVisibility = Visibility.ANY) MaxLineLength:CheckpointDumperTest.kt$CheckpointDumperTest$val checkpoint = Checkpoint.create(InvocationContext.shell(), FlowStart.Explicit, logic.javaClass, frozenLogic, myself.identity.party, SubFlowVersion.CoreFlow(version), false) .getOrThrow() - MaxLineLength:CheckpointSerializationAPI.kt$CheckpointSerializationContext$/** * A whitelist that determines (mostly for security purposes) whether a particular encoding may be used when deserializing. */ val encodingWhitelist: EncodingWhitelist - MaxLineLength:CheckpointSerializationScheme.kt$CheckpointSerializationContextImpl$override fun withEncodingWhitelist(encodingWhitelist: EncodingWhitelist) MaxLineLength:CheckpointSerializationScheme.kt$CheckpointSerializationContextImpl$override val encodingWhitelist: EncodingWhitelist = NullEncodingWhitelist - MaxLineLength:CheckpointSerializationTestHelpers.kt$CheckpointSerializationEnvironmentRule.Companion$Executors.newCachedThreadPool(testThreadFactory(true)) // Close enough to what InVMConnector makes normally. - MaxLineLength:CheckpointSerializationTestHelpers.kt$CheckpointSerializationEnvironmentRule.Companion$InVMConnector::class.staticField<ExecutorService>("threadPoolExecutor").value MaxLineLength:CheckpointVerifier.kt$CheckpointIncompatibleException$FlowVersionIncompatibleException : CheckpointIncompatibleException MaxLineLength:CheckpointVerifier.kt$CheckpointIncompatibleException$SubFlowCoreVersionIncompatibleException : CheckpointIncompatibleException MaxLineLength:CheckpointVerifier.kt$CheckpointIncompatibleException.CannotBeDeserialisedException$"Found checkpoint that cannot be deserialised using the current Corda version. Please revert to the previous version of Corda, " - MaxLineLength:CheckpointVerifier.kt$CheckpointIncompatibleException.CannotBeDeserialisedException$"drain your node (see https://docs.corda.net/upgrading-cordapps.html#flow-drains), and try again. Cause: ${e.message}" MaxLineLength:CheckpointVerifier.kt$CheckpointIncompatibleException.CordappNotInstalledException$"Found checkpoint for CorDapp that is no longer installed. Specifically, could not find class $classNotFound. Please install the " - MaxLineLength:CheckpointVerifier.kt$CheckpointIncompatibleException.CordappNotInstalledException$"missing CorDapp, drain your node (see https://docs.corda.net/upgrading-cordapps.html#flow-drains), and try again." - MaxLineLength:CheckpointVerifier.kt$CheckpointIncompatibleException.FlowVersionIncompatibleException$"Found checkpoint for flow: $flowClass that is incompatible with the current installed version of ${cordapp.name}. " - MaxLineLength:CheckpointVerifier.kt$CheckpointIncompatibleException.SubFlowCoreVersionIncompatibleException$"Found checkpoint for flow: $flowClass that is incompatible with the current Corda platform. Please revert to the previous " MaxLineLength:CheckpointVerifier.kt$CheckpointIncompatibleException.SubFlowCoreVersionIncompatibleException$"version of Corda (version $oldVersion), drain your node (see https://docs.corda.net/upgrading-cordapps.html#flow-drains), and try again." - MaxLineLength:CheckpointVerifier.kt$CheckpointVerifier$private MaxLineLength:CheckpointVerifier.kt$CheckpointVerifier$throw CheckpointIncompatibleException.FlowVersionIncompatibleException(subFlow.flowClass, matchingCordapp, subFlowVersion.corDappHash) - MaxLineLength:CheckpointVerifier.kt$CheckpointVerifier$throw CheckpointIncompatibleException.SubFlowCoreVersionIncompatibleException(subFlow.flowClass, subFlowVersion.platformVersion) - MaxLineLength:CheckpointVerifier.kt$CheckpointVerifier${ // If we don't then see if the flow exists in any of the CorDapps so that we can give the user a more useful error message val matchingCordapp = currentCordappsByHash.values.find { subFlow.flowClass in it.allFlows } if (matchingCordapp != null) { throw CheckpointIncompatibleException.FlowVersionIncompatibleException(subFlow.flowClass, matchingCordapp, subFlowVersion.corDappHash) } else { throw CheckpointIncompatibleException.CordappNotInstalledException(subFlow.flowClass.name) } } - MaxLineLength:ChosenList.kt$ChosenList<E> : ObservableListBase - MaxLineLength:ClassCarpenter.kt$ClassCarpenterImpl$/** Returns a snapshot of the currently loaded classes as a map of full class name (package names+dots) -> class object */ val loaded: Map<String, Class<*>> = HashMap(_loaded) - MaxLineLength:ClassCarpenter.kt$ClassCarpenterImpl$if (fieldNameFromItf.isEmpty() && SimpleFieldAccess::class.java in schema.interfaces) continue@methodLoop - MaxLineLength:ClassCarpenter.kt$ClassCarpenterImpl$visitMethodInsn(INVOKEVIRTUAL, toStringHelper, "add", "(L$jlString;${field.type})L$toStringHelper;", false) - MaxLineLength:ClassCarpenter.kt$InterfaceMismatchMissingAMQPFieldException$"Interface ${clazz.name} requires a field named $field but that isn't found in the schema or any superclass schemas" MaxLineLength:ClassCarpenterTest.kt$ClassCarpenterTest$ @Test fun `superclasses with double-size primitive constructor parameters`() - MaxLineLength:ClassCarpenterTestUtils.kt$AmqpCarpenterBase$properties = properties.mapValues { (_, property) -> property.copy(type = property.type.rename(from, to)) } - MaxLineLength:ClassCarpenterTestUtils.kt$AmqpCarpenterBase$protected - MaxLineLength:ClassCarpentingTypeLoaderTests.kt$ClassCarpentingTypeLoaderTests$is TypeIdentifier.Unparameterised -> RemoteTypeInformation.Unparameterised(typeIdentifier.prettyPrint(), typeIdentifier) - MaxLineLength:ClassGraphUtils.kt$ fun ClassGraph.pooledScan(): ScanResult - MaxLineLength:ClassLoadingUtils.kt$ @StubOutForDJVM fun <T: Any> createInstancesOfClassesImplementing(classloader: ClassLoader, clazz: Class<T>): Set<T> - MaxLineLength:ClassLoadingUtilsTest.kt$ClassLoadingUtilsTest$val classes = createInstancesOfClassesImplementing(BaseInterface::class.java.classLoader, BaseInterface2::class.java) - MaxLineLength:ClassLoadingUtilsTest.kt$ClassLoadingUtilsTest$val classes = createInstancesOfClassesImplementing(BaseInterface::class.java.classLoader, BaseInterface::class.java) + MaxLineLength:ClassLoadingUtils.kt$ fun <T: Any> createInstancesOfClassesImplementing(@Suppress("UNUSED_PARAMETER") classloader: ClassLoader, @Suppress("UNUSED_PARAMETER") clazz: Class<T>): Set<T> MaxLineLength:ClassWhitelists.kt$AbstractMutableClassWhitelist$sealed - MaxLineLength:ClassWhitelists.kt$AbstractMutableClassWhitelist${ /** * There are certain delegates like [net.corda.serialization.internal.AllButBlacklisted] * which may throw when asked whether the type is listed. * In such situations - it may be a good idea to ask [delegate] first before making a check against own [whitelist]. */ return delegate.hasListed(type) || (type.name in whitelist) } MaxLineLength:ClassWhitelists.kt$TransientClassWhiteList : AbstractMutableClassWhitelist MaxLineLength:ClearNetworkCacheCli.kt$ClearNetworkCacheCli : NodeCliCommand - MaxLineLength:ClientCacheFactory.kt$ClientCacheFactory$override MaxLineLength:ClientRPCInfrastructureTests.kt$ClientRPCInfrastructureTests$assertEquals("Quote by Mark Twain: Clothes make the man. Naked people have little or no influence on society.", clientQuotes.take()) - MaxLineLength:ClientRPCInfrastructureTests.kt$ClientRPCInfrastructureTests$assertEquals("Quote by Mark Twain: I have never let my schooling interfere with my education.", clientQuotes.take()) - MaxLineLength:ClientRPCInfrastructureTests.kt$ClientRPCInfrastructureTests$assertEquals("Quote by Oscar Wilde: Always forgive your enemies - nothing annoys them so much.", clientQuotes.take()) - MaxLineLength:ClientRPCInfrastructureTests.kt$ClientRPCInfrastructureTests$assertThat(clientQuotes.take()).isEqualTo("Quote by Mark Twain: I have never let my schooling interfere with my education.") - MaxLineLength:ClientRelevantException.kt$ClientRelevantException : CordaRuntimeExceptionClientRelevantError - MaxLineLength:ClientRpcSslOptions.kt$ClientRpcSslOptions - MaxLineLength:ClientRpcSslOptions.kt$ClientRpcSslOptions$data - MaxLineLength:ClientRpcTutorial.kt$PrintOrVisualise - MaxLineLength:ClientRpcTutorial.kt$driver MaxLineLength:ClientRpcTutorial.kt$val (transactions: List<SignedTransaction>, futureTransactions: Observable<SignedTransaction>) = proxy.internalVerifiedTransactionsFeed() - MaxLineLength:ClockUtilsTest.kt$ClockUtilsTest$assertFalse(NodeSchedulerService.awaitWithDeadline(stoppedClock, stoppedClock.instant()), "Should have reached deadline") - MaxLineLength:ClockUtilsTest.kt$ClockUtilsTest$assertFalse(NodeSchedulerService.awaitWithDeadline(stoppedClock, stoppedClock.instant(), future), "Should have reached deadline") MaxLineLength:ClockUtilsTest.kt$ClockUtilsTest$assertFalse(NodeSchedulerService.awaitWithDeadline(stoppedClock, stoppedClock.instant().minus(1.hours)), "Should have reached deadline") MaxLineLength:ClockUtilsTest.kt$ClockUtilsTest$assertFalse(NodeSchedulerService.awaitWithDeadline(stoppedClock, stoppedClock.instant().minus(1.hours), future), "Should have reached deadline") - MaxLineLength:ClockUtilsTest.kt$ClockUtilsTest$assertFalse(NodeSchedulerService.awaitWithDeadline(testClock, advancedClock.instant()), "Should have reached deadline") - MaxLineLength:ClockUtilsTest.kt$ClockUtilsTest$assertFalse(NodeSchedulerService.awaitWithDeadline(testClock, advancedClock.instant(), future), "Should have reached deadline") MaxLineLength:ClockUtilsTest.kt$ClockUtilsTest$assertTrue(NodeSchedulerService.awaitWithDeadline(stoppedClock, advancedClock.instant(), future), "Should not have reached deadline") - MaxLineLength:ClockUtilsTest.kt$ClockUtilsTest$assertTrue(NodeSchedulerService.awaitWithDeadline(testClock, advancedClock.instant(), future), "Should not have reached deadline") MaxLineLength:CollectSignaturesFlow.kt$CollectSignatureFlow : FlowLogic - MaxLineLength:CollectSignaturesFlow.kt$CollectSignaturesFlow : FlowLogic MaxLineLength:CollectSignaturesFlow.kt$CollectSignaturesFlow$else -> throw IllegalArgumentException("Signatures can only be collected from Party or AnonymousParty, not $destination") MaxLineLength:CollectSignaturesFlow.kt$CollectSignaturesFlow$override val progressTracker: ProgressTracker = CollectSignaturesFlow.tracker() - MaxLineLength:CollectSignaturesFlow.kt$CollectSignaturesFlow$require(it.value.size == 1) { "There are multiple sessions initiated for party key ${it.key.toStringShort()}" } MaxLineLength:CollectSignaturesFlow.kt$CollectSignaturesFlow$val wellKnownParty = checkNotNull(keyToSigningParty[it]) { "Could not find a session or wellKnown party for key ${it.toStringShort()}" } - MaxLineLength:CollectSignaturesFlow.kt$CollectSignaturesFlow${ // setOfAllSessionKeys has already checked for valid destination types so we can safely cast to AnonoymousParty here. // This session was not initiated by a wellKnownParty so must directly exist in the unsigned. (it.destination as AnonymousParty).owningKey in unsigned } MaxLineLength:CollectSignaturesFlow.kt$SignTransactionFlow$override val progressTracker: ProgressTracker = SignTransactionFlow.tracker() - MaxLineLength:CollectSignaturesFlow.kt$SignTransactionFlow${ progressTracker.currentStep = RECEIVING // Receive transaction and resolve dependencies, check sufficient signatures is disabled as we don't have all signatures. val stx = subFlow(ReceiveTransactionFlow(otherSideSession, checkSufficientSignatures = false)) // Receive the signing key that the party requesting the signature expects us to sign with. Having this provided // means we only have to check we own that one key, rather than matching all keys in the transaction against all // keys we own. val signingKeys = otherSideSession.receive<List<PublicKey>>().unwrap { keys -> // TODO: We should have a faster way of verifying we own a single key serviceHub.keyManagementService.filterMyKeys(keys) } progressTracker.currentStep = VERIFYING // Check that the Responder actually needs to sign. checkMySignaturesRequired(stx, signingKeys) // Check the signatures which have already been provided. Usually the Initiators and possibly an Oracle's. checkSignatures(stx) stx.tx.toLedgerTransaction(serviceHub).verify() // Perform some custom verification over the transaction. try { checkTransaction(stx) } catch (e: Exception) { if (e is IllegalStateException || e is IllegalArgumentException || e is AssertionError) throw FlowException(e) else throw e } // Sign and send back our signature to the Initiator. progressTracker.currentStep = SIGNING val mySignatures = signingKeys.map { key -> serviceHub.createSignature(stx, key) } otherSideSession.send(mySignatures) // Return the additionally signed transaction. return stx + mySignatures } - MaxLineLength:CollectSignaturesFlowTests.kt$AnonymousSessionTestFlow$val sessionsToCollectFrom = cis.filter { it.name != ourIdentity.name }.map { initiateFlow(AnonymousParty(it.owningKey)) } - MaxLineLength:CollectSignaturesFlowTests.kt$CollectSignaturesFlowTests$val future = aliceNode.startFlow(MixAndMatchAnonymousSessionTestFlow(owners, keysToLookup.toSet(), keysToKeepAnonymous.toSet())) .resultFuture - MaxLineLength:CollectSignaturesFlowTests.kt$CollectSignaturesFlowTests$val keysToLookup = listOf(bConfidentialIdentity1.owningKey, bConfidentialIdentity2.owningKey, cConfidentialIdentity1.owningKey) - MaxLineLength:CollectSignaturesFlowTests.kt$CollectSignaturesFlowTests$val owners = listOf(aConfidentialIdentity1, bConfidentialIdentity1, bConfidentialIdentity2, cConfidentialIdentity1) - MaxLineLength:CollectSignaturesFlowTests.kt$CollectSignaturesFlowTests.Companion$private val classMockNet = InternalMockNetwork(cordappsForAllNodes = listOf(DUMMY_CONTRACTS_CORDAPP, enclosedCordapp())) - MaxLineLength:CollectSignaturesFlowTests.kt$CollectSignaturesFlowTests.Companion$private val miniCorpServices = MockServices(listOf("net.corda.testing.contracts"), miniCorp, rigorousMock<IdentityService>()) - MaxLineLength:CollectSignaturesFlowTests.kt$CollectSignaturesFlowTests.TestFlow$Initiator : FlowLogic - MaxLineLength:CollectSignaturesFlowTests.kt$CollectSignaturesFlowTests.TestFlow.Initiator$val builder = TransactionBuilder(notary).withItems(StateAndContract(state, DummyContract.PROGRAM_ID), command) MaxLineLength:CollectSignaturesFlowTests.kt$CollectSignaturesFlowTests.TestFlow.Initiator$val sessions = excludeHostNode(serviceHub, groupAbstractPartyByWellKnownParty(serviceHub, state.owners)).map { initiateFlow(it.key) } - MaxLineLength:CollectSignaturesFlowTests.kt$MixAndMatchAnonymousSessionTestFlow$private val keysToKeepAnonymous: Set<PublicKey> - MaxLineLength:CollectSignaturesFlowTests.kt$MixAndMatchAnonymousSessionTestFlow$val resolvedParties = keysToLookUp.map { serviceHub.identityService.wellKnownPartyFromAnonymous(AnonymousParty(it))!! }.toSet() - MaxLineLength:CollectionSerializer.kt$CollectionSerializer : AMQPSerializer MaxLineLength:CollectionSerializer.kt$CollectionSerializer$private val typeNotation: TypeNotation = RestrictedType(AMQPTypeIdentifiers.nameForType(declaredType), null, emptyList(), "list", Descriptor(typeDescriptor), emptyList()) - MaxLineLength:CollectionSerializer.kt$CollectionSerializer.Companion$ fun resolveDeclared(declaredTypeInformation: LocalTypeInformation.ACollection): LocalTypeInformation.ACollection MaxLineLength:CollectionSerializer.kt$CollectionSerializer.Companion$fun resolveActual(actualClass: Class<*>, declaredTypeInformation: LocalTypeInformation.ACollection): LocalTypeInformation.ACollection - MaxLineLength:CollectionSerializer.kt$CollectionSerializer.Companion$is TypeIdentifier.Parameterised -> erasedInformation.withElementType(declaredTypeInformation.elementType) - MaxLineLength:CollectionSerializer.kt$CollectionSerializer.Companion$private - MaxLineLength:CollectionSerializer.kt$CollectionSerializer.Companion$private val supportedTypeIdentifiers = supportedTypes.keys.asSequence().map { TypeIdentifier.forClass(it) }.toSet() - MaxLineLength:CommandLineCompatibilityCheckerTest.kt$CommandLineCompatibilityCheckerTest$val breaks = CommandLineCompatibilityChecker().checkBackwardsCompatibility(CommandLine(Dummy()), CommandLine(Dummy2())) - MaxLineLength:CommandLineCompatibilityCheckerTest.kt$CommandLineCompatibilityCheckerTest$val breaks = CommandLineCompatibilityChecker().checkBackwardsCompatibility(CommandLine(value1), CommandLine(value2)) MaxLineLength:CommandLineCompatibilityUtils.kt$CommandDescription - MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$?: MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$EnumOptionsChangedError(it.key + " on command ${old.commandName} previously accepted: $oldEnums, and now is missing $toPrint}") MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$PositionalArgumentsChangedError("Positional Parameter [ ${it.parameterName} ] has been removed from subcommand: ${old.commandName}") MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$fun checkAllCommandsArePresent(old: List<CommandDescription>, new: List<CommandDescription>): List<CliBackwardsCompatibilityValidationCheck> - MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$fun checkAllOptionsArePresent(old: CommandDescription, new: CommandDescription): List<CliBackwardsCompatibilityValidationCheck> - MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$fun checkAllParamsAreOfTheSameType(old: CommandDescription, new: CommandDescription): List<CliBackwardsCompatibilityValidationCheck> MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$fun checkAllPositionalCharactersArePresent(old: CommandDescription, new: CommandDescription): List<CliBackwardsCompatibilityValidationCheck> - MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$fun checkBackwardsCompatibility(old: CommandLine, new: CommandLine): List<CliBackwardsCompatibilityValidationCheck> - MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$fun checkCommandLineIsBackwardsCompatible(commandLineToCheck: Class<*>): List<CliBackwardsCompatibilityValidationCheck> MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$private - MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$return objectMapper.readValue<List<CommandDescription>>(inputStream, object : TypeReference<List<CommandDescription>>() {}) MaxLineLength:CommandLineCompatibilityUtils.kt$CommandLineCompatibilityChecker$val potentiallyChanged = oldAcceptableTypes.filter { newAcceptableTypes[it.key] != null && newAcceptableTypes[it.key]!!.toSet() != it.value.toSet() } MaxLineLength:CommandLineCompatibilityUtils.kt$ParameterDescription - MaxLineLength:CommandLineInterface.kt$CommandLineInterface$"${instance.reachableAddress} {ssh:${instance.portMapping[Constants.NODE_SSHD_PORT]}, " - MaxLineLength:CommandLineInterface.kt$CommandLineInterface$NetworkBuilder.instance() .withBasedir(baseDir) .withNetworkName(networkName) .onNodeBuild { builtNode -> println("Built node: ${builtNode.name} to image: ${builtNode.localImageId}") } - MaxLineLength:CommandLineInterface.kt$CommandLineInterface$NetworkBuilder.instance() .withBasedir(baseDir) .withNetworkName(networkName) .onNodeBuild { builtNode -> println("Built node: ${builtNode.name} to image: ${builtNode.localImageId}") } .onNodePushed { pushedNode -> println("Pushed node: ${pushedNode.name} to: ${pushedNode.remoteImageName}") } MaxLineLength:CommandLineInterface.kt$CommandLineInterface$nodeAdder.addNode(context, Constants.ALPHA_NUMERIC_ONLY_REGEX.replace(it.key.toLowerCase(), ""), CordaX500Name.parse(it.value)) MaxLineLength:CommandParsers.kt$CliParser$@Option(names = ["--add"], split = ":", description = ["The node to add. Format is <Name>:<X500>. Eg; \"Node1:O=Bank A, L=New York, C=US, OU=Org Unit, CN=Service Name\""]) MaxLineLength:CommandParsers.kt$CliParser$@Option(names = ["-b", "--backend"], description = ["The backend to use when instantiating nodes. Valid values: LOCAL_DOCKER and AZURE."]) - MaxLineLength:CommercialPaper.kt$CommercialPaper : Contract - MaxLineLength:CommercialPaper.kt$CommercialPaper$"the transaction is signed by the owner of the CP" using (input.owner.owningKey in command.signers) - MaxLineLength:CommercialPaper.kt$CommercialPaper$val time = timeWindow?.fromTime ?: throw IllegalArgumentException("Redemptions must have a time-window") - MaxLineLength:CommercialPaper.kt$CommercialPaper.Commands$Issue : TypeOnlyCommandDataCommands MaxLineLength:CommercialPaper.kt$CommercialPaper.State$// Although kotlin is smart enough not to need these, as we are using the ICommercialPaperState, we need to declare them explicitly for use later, override fun withOwner(newOwner: AbstractParty): ICommercialPaperState MaxLineLength:CommercialPaper.kt$CommercialPaper.State$override fun toString() - MaxLineLength:CommercialPaper.kt$CommercialPaper.State$override fun withFaceValue(newFaceValue: Amount<Issued<Currency>>): ICommercialPaperState - MaxLineLength:CommercialPaper.kt$CommercialPaper.State$override fun withMaturityDate(newMaturityDate: Instant): ICommercialPaperState MaxLineLength:CommercialPaperIssueFlow.kt$CommercialPaperIssueFlow$constructor(amount: Amount<Currency>, issueRef: OpaqueBytes, recipient: Party, notary: Party) : this(amount, issueRef, recipient, notary, tracker()) - MaxLineLength:CommercialPaperIssueFlow.kt$CommercialPaperIssueFlow$val tx = CommercialPaperUtils.generateIssue(ourIdentity.ref(issueRef), amount `issued by` ourIdentity.ref(issueRef), Instant.now() + 10.days, notary) MaxLineLength:CommercialPaperSchemaV1.kt$CommercialPaperSchemaV1 : MappedSchema MaxLineLength:CommercialPaperSchemaV1.kt$CommercialPaperSchemaV1.PersistentCommercialPaperState$@Table(name = "cp_states", indexes = [Index(name = "ccy_code_index", columnList = "ccy_code"), Index(name = "maturity_index", columnList = "maturity_instant"), Index(name = "face_value_index", columnList = "face_value")]) - MaxLineLength:CommercialPaperTests.kt$CommercialPaperTestsGeneric$CashUtils.generateSpend(aliceServices, builder, 9000.DOLLARS, alice.identity, AnonymousParty(megaCorp.publicKey)) MaxLineLength:CommercialPaperTests.kt$CommercialPaperTestsGeneric$CommercialPaperUtils.generateRedeem(builder, moveTX.tx.outRef(1), megaCorpServices, megaCorpServices.myInfo.singleIdentityAndCert()) - MaxLineLength:CommercialPaperTests.kt$CommercialPaperTestsGeneric$VaultFiller(aliceServices, dummyNotary).fillWithSomeTestCash(9000.DOLLARS, issuerServices, 1, dummyCashIssuer.ref(1)) - MaxLineLength:CommercialPaperTests.kt$CommercialPaperTestsGeneric$VaultFiller(megaCorpServices, dummyNotary).fillWithSomeTestCash(13000.DOLLARS, issuerServices, 1, dummyCashIssuer.ref(1)) - MaxLineLength:CommercialPaperTests.kt$CommercialPaperTestsGeneric$aliceServices.recordTransactions(bigCorpCash.states.map { megaCorpServices.validatedTransactions.getTransaction(it.ref.txhash)!! }) - MaxLineLength:CommercialPaperTests.kt$CommercialPaperTestsGeneric$megaCorpServices.recordTransactions(aliceCash.states.map { aliceServices.validatedTransactions.getTransaction(it.ref.txhash)!! }) - MaxLineLength:CommercialPaperTests.kt$CommercialPaperTestsGeneric$output(thisTest.getContract(), "alice's paper", "paper".output<ICommercialPaperState>().withOwner(alice.party)) - MaxLineLength:CommercialPaperTests.kt$CommercialPaperTestsGeneric$val issueBuilder = CommercialPaperUtils.generateIssue(issuance, faceValue, TEST_TX_TIME + 30.days, dummyNotary.party) MaxLineLength:CommercialPaperTests.kt$CommercialPaperTestsGeneric.<no name provided>$override fun loadState(stateRef: StateRef): TransactionState<*> MaxLineLength:CommercialPaperUtils.kt$CommercialPaperUtils$ @JvmStatic fun generateIssue(issuance: PartyAndReference, faceValue: Amount<Issued<Currency>>, maturityDate: Instant, notary: Party): TransactionBuilder MaxLineLength:CommercialPaperUtils.kt$CommercialPaperUtils$ @Throws(InsufficientBalanceException::class) @JvmStatic @Suspendable fun generateRedeem(tx: TransactionBuilder, paper: StateAndRef<CommercialPaper.State>, services: ServiceHub, ourIdentity: PartyAndCertificate) - MaxLineLength:CommercialPaperUtils.kt$CommercialPaperUtils$CashUtils.generateSpend(services, tx, paper.state.data.faceValue.withoutIssuer(), ourIdentity, paper.state.data.owner) - MaxLineLength:CommonSerializationTestHelpers.kt$fun <T> SerializationEnvironment.asContextEnv(inheritable: Boolean = false, callable: (SerializationEnvironment) -> T): T - MaxLineLength:CompatibilityTest.kt$CompatibilityTest$fail - MaxLineLength:CompatibilityTest.kt$CompatibilityTest$val (serializedBytes, schema) = output.serializeAndReturnSchema(transaction, SerializationDefaults.STORAGE_CONTEXT) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$ComponentGroup(SIGNERS_GROUP.ordinal, twoCommandsforKey1.map { it.signers.serialize() }.subList(0, 1)) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$allCommandsNoKey1Ftx.checkCommandVisibility(DUMMY_KEY_1.public) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(1, ftxInputs.filteredComponentGroups.size) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(1, ftxOneInput.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.components.size) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(1, ftxOneInput.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.nonces.size) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(1, ftxOneInput.filteredComponentGroups.size) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(3, ftxCompatible.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.components.size) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(3, ftxCompatible.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.nonces.size) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(3, ftxInputs.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.components.size) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(3, ftxInputs.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.nonces.size) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(wireTransactionA, WireTransaction(componentGroups = shuffledComponentGroupsA, privacySalt = privacySalt)) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(wireTransactionA.accessGroupMerkleRoots()[NOTARY_GROUP.ordinal], wireTransaction1ShuffledInputs.accessGroupMerkleRoots()[NOTARY_GROUP.ordinal]) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(wireTransactionA.accessGroupMerkleRoots()[OUTPUTS_GROUP.ordinal], wireTransaction1ShuffledInputs.accessGroupMerkleRoots()[OUTPUTS_GROUP.ordinal]) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(wireTransactionA.merkleTree.hash, MerkleTree.getMerkleTree(wireTransactionA.accessGroupHashes()).hash) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(wireTransactionCompatibleA.availableComponentGroups, wireTransactionA.availableComponentGroups) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(wireTransactionCompatibleA.componentGroups.map { it.groupIndex }.max()!!, ftxCompatibleNoInputs.groupHashes.size - 1) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertEquals(wireTransactionCompatibleA.componentGroups.size - 1, ftxCompatibleNoInputs.filteredComponentGroups.size) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertFails { ftxConstructor.call(key1CommandsFtx.id, updatedFilteredComponentsNoSignersKey1SamePMT, key1CommandsFtx.groupHashes) } - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertFailsWith<ComponentVisibilityException> { ftxNoLastCommandAndSigners.checkCommandVisibility(DUMMY_KEY_1.public) } MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertFailsWith<ComponentVisibilityException> { noCommandsFtx.checkAllComponentsVisible(SIGNERS_GROUP) } - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertFailsWith<IllegalStateException> { WireTransaction(componentGroups = componentGroupsCompatible, privacySalt = PrivacySalt()) } MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertFailsWith<IllegalStateException> { WireTransaction(componentGroups = componentGroupsLessSigners, privacySalt = PrivacySalt()) } MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertNotEquals(wireTransactionA.accessGroupMerkleRoots()[INPUTS_GROUP.ordinal], wireTransaction1ShuffledInputs.accessGroupMerkleRoots()[INPUTS_GROUP.ordinal]) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertNotEquals(wireTransactionCompatibleA, wireTransactionA) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertNotNull(ftxCompatible.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.partialMerkleTree) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertNotNull(ftxInputs.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.partialMerkleTree) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$assertNotNull(ftxOneInput.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.partialMerkleTree) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$is Command<*> -> elem.signers.size == 1 - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$key1CommandsFtx.checkAllComponentsVisible(SIGNERS_GROUP) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$key1CommandsFtx.filteredComponentGroups[1].partialMerkleTree - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$oneKey1CommandFtxA.checkAllComponentsVisible(SIGNERS_GROUP) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$oneKey1CommandFtxB.checkAllComponentsVisible(SIGNERS_GROUP) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$private val attachmentGroup by lazy { ComponentGroup(ATTACHMENTS_GROUP.ordinal, attachments.map { it.serialize() }) } // The list is empty. - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$private val newUnknownComponentGroup = ComponentGroup(100, listOf(OpaqueBytes(secureRandomBytes(4)), OpaqueBytes(secureRandomBytes(8)))) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$private val wireTransactionA by lazy { WireTransaction(componentGroups = componentGroupsA, privacySalt = privacySalt) } MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val alterSignerComponents = signerComponents.subList(0, 2) + signerComponents[1] // Third one is removed and the 2nd command is added twice. MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val alterSignersHashes = wtx.accessAvailableComponentHashes()[ComponentGroupEnum.SIGNERS_GROUP.ordinal]!!.subList(0, 2) + componentHash(key1CommandsFtx.filteredComponentGroups[1].nonces[2], alterSignerComponents[2]) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val attachments = ComponentGroup(ATTACHMENTS_GROUP.ordinal, listOf(paramsHash.serialize())) // Same hash as network parameters - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val ftxAlterSigner = ftxConstructor.call(key1CommandsFtx.id, alterFilteredComponents, key1CommandsFtx.groupHashes) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val ftxAlterSignerB = ftxConstructor.call(key1CommandsFtx.id, alterFilteredComponents, key1CommandsFtx.groupHashes.subList(0, 6) + alterMTree.hash) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val ftxCompatibleAll = wireTransactionCompatibleA.buildFilteredTransaction(Predicate { true }) // All filtered, including the unknown component. MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val ftxNoLastCommandAndSigners = ftxConstructor.call(key1CommandsFtx.id, updatedFilteredComponentsNoLastCommandAndSigners, key1CommandsFtx.groupHashes) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val ftxNoLastSigner = ftxConstructor.call(key2CommandsFtx.id, updatedFilteredComponentsNoSignersKey2SamePMT, key2CommandsFtx.groupHashes) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val ftxNoLastSignerB = ftxConstructor.call(key2CommandsFtx.id, updatedFilteredComponentsNoSignersKey2, key2CommandsFtx.groupHashes) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val ftxOneInput = wireTransactionA.buildFilteredTransaction(Predicate(::filteringOneInput)) // First input only filtered. - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val groups = createComponentGroups(inputs, outputs, commands, attachments, notary, timeWindow, emptyList(), null) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val twoCommandsforKey1 = listOf(dummyCommand(DUMMY_KEY_1.public, DUMMY_KEY_2.public), dummyCommand(DUMMY_KEY_2.public), dummyCommand(DUMMY_KEY_1.public)) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val updatedFilteredComponentsNoSignersKey1SamePMT = listOf(key1CommandsFtx.filteredComponentGroups[0], noLastSignerGroupSamePartialTree) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val updatedFilteredComponentsNoSignersKey2 = listOf(key2CommandsFtx.filteredComponentGroups[0], noLastSignerGroup) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val updatedFilteredComponentsNoSignersKey2SamePMT = listOf(key2CommandsFtx.filteredComponentGroups[0], noLastSignerGroupSamePartialTree) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val wireTransaction1ShuffledInputs = WireTransaction(componentGroups = componentGroupsB, privacySalt = privacySalt) - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests$val wireTransactionOtherPrivacySalt = WireTransaction(componentGroups = componentGroupsA, privacySalt = PrivacySalt()) MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests${ // Filter out all of the components. val ftxNothing = wireTransactionA.buildFilteredTransaction(Predicate { false }) // Nothing filtered. // Although nothing filtered, we still receive the group hashes for the top level Merkle tree. // Note that attachments are not sent, but group hashes include the allOnesHash flag for the attachment group hash; that's why we expect +1 group hashes. assertEquals(wireTransactionA.componentGroups.size + 1, ftxNothing.groupHashes.size) ftxNothing.verify() // Include all of the components. val ftxAll = wireTransactionA.buildFilteredTransaction(Predicate { true }) // All filtered. ftxAll.verify() ftxAll.checkAllComponentsVisible(INPUTS_GROUP) ftxAll.checkAllComponentsVisible(OUTPUTS_GROUP) ftxAll.checkAllComponentsVisible(COMMANDS_GROUP) ftxAll.checkAllComponentsVisible(ATTACHMENTS_GROUP) ftxAll.checkAllComponentsVisible(NOTARY_GROUP) ftxAll.checkAllComponentsVisible(TIMEWINDOW_GROUP) ftxAll.checkAllComponentsVisible(SIGNERS_GROUP) ftxAll.checkAllComponentsVisible(PARAMETERS_GROUP) // Filter inputs only. fun filtering(elem: Any): Boolean { return when (elem) { is StateRef -> true else -> false } } val ftxInputs = wireTransactionA.buildFilteredTransaction(Predicate(::filtering)) // Inputs only filtered. ftxInputs.verify() ftxInputs.checkAllComponentsVisible(INPUTS_GROUP) assertEquals(1, ftxInputs.filteredComponentGroups.size) // We only add component groups that are not empty, thus in this case: the inputs only. assertEquals(3, ftxInputs.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.components.size) // All 3 inputs are present. assertEquals(3, ftxInputs.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.nonces.size) // And their corresponding nonces. assertNotNull(ftxInputs.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.partialMerkleTree) // And the Merkle tree. // Filter one input only. fun filteringOneInput(elem: Any) = elem == inputs[0] val ftxOneInput = wireTransactionA.buildFilteredTransaction(Predicate(::filteringOneInput)) // First input only filtered. ftxOneInput.verify() assertFailsWith<ComponentVisibilityException> { ftxOneInput.checkAllComponentsVisible(INPUTS_GROUP) } assertEquals(1, ftxOneInput.filteredComponentGroups.size) // We only add component groups that are not empty, thus in this case: the inputs only. assertEquals(1, ftxOneInput.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.components.size) // 1 input is present. assertEquals(1, ftxOneInput.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.nonces.size) // And its corresponding nonce. assertNotNull(ftxOneInput.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.partialMerkleTree) // And the Merkle tree. // The old client (receiving more component types than expected) is still compatible. val componentGroupsCompatibleA = listOf( inputGroup, outputGroup, commandGroup, notaryGroup, timeWindowGroup, signersGroup, newUnknownComponentGroup // A new unknown component with ordinal 100 that we cannot process. ) val wireTransactionCompatibleA = WireTransaction(componentGroupsCompatibleA, privacySalt) val ftxCompatible = wireTransactionCompatibleA.buildFilteredTransaction(Predicate(::filtering)) ftxCompatible.verify() assertEquals(ftxInputs.inputs, ftxCompatible.inputs) assertEquals(wireTransactionCompatibleA.id, ftxCompatible.id) assertEquals(1, ftxCompatible.filteredComponentGroups.size) assertEquals(3, ftxCompatible.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.components.size) assertEquals(3, ftxCompatible.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.nonces.size) assertNotNull(ftxCompatible.filteredComponentGroups.firstOrNull { it.groupIndex == INPUTS_GROUP.ordinal }!!.partialMerkleTree) assertNull(wireTransactionCompatibleA.networkParametersHash) assertNull(ftxCompatible.networkParametersHash) // Now, let's allow everything, including the new component type that we cannot process. val ftxCompatibleAll = wireTransactionCompatibleA.buildFilteredTransaction(Predicate { true }) // All filtered, including the unknown component. ftxCompatibleAll.verify() assertEquals(wireTransactionCompatibleA.id, ftxCompatibleAll.id) // Check we received the last element that we cannot process (backwards compatibility). assertEquals(wireTransactionCompatibleA.componentGroups.size, ftxCompatibleAll.filteredComponentGroups.size) // Hide one component group only. // Filter inputs only. fun filterOutInputs(elem: Any): Boolean { return when (elem) { is StateRef -> false else -> true } } val ftxCompatibleNoInputs = wireTransactionCompatibleA.buildFilteredTransaction(Predicate(::filterOutInputs)) ftxCompatibleNoInputs.verify() assertFailsWith<ComponentVisibilityException> { ftxCompatibleNoInputs.checkAllComponentsVisible(INPUTS_GROUP) } assertEquals(wireTransactionCompatibleA.componentGroups.size - 1, ftxCompatibleNoInputs.filteredComponentGroups.size) assertEquals(wireTransactionCompatibleA.componentGroups.map { it.groupIndex }.max()!!, ftxCompatibleNoInputs.groupHashes.size - 1) } - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests${ // Merkle tree computation is deterministic if the same salt and ordering are used. val wireTransactionB = WireTransaction(componentGroups = componentGroupsA, privacySalt = privacySalt) assertEquals(wireTransactionA, wireTransactionB) // Merkle tree computation will change if privacy salt changes. val wireTransactionOtherPrivacySalt = WireTransaction(componentGroups = componentGroupsA, privacySalt = PrivacySalt()) assertNotEquals(wireTransactionA, wireTransactionOtherPrivacySalt) // Full Merkle root is computed from the list of Merkle roots of each component group. assertEquals(wireTransactionA.merkleTree.hash, MerkleTree.getMerkleTree(wireTransactionA.accessGroupHashes()).hash) // Trying to add an empty component group (not allowed), e.g. the empty attachmentGroup. val componentGroupsEmptyAttachment = listOf( inputGroup, outputGroup, commandGroup, attachmentGroup, notaryGroup, timeWindowGroup, signersGroup ) assertFails { WireTransaction(componentGroups = componentGroupsEmptyAttachment, privacySalt = privacySalt) } // Ordering inside a component group matters. val inputsShuffled = listOf(stateRef2, stateRef1, stateRef3) val inputShuffledGroup = ComponentGroup(INPUTS_GROUP.ordinal, inputsShuffled.map { it -> it.serialize() }) val componentGroupsB = listOf( inputShuffledGroup, outputGroup, commandGroup, notaryGroup, timeWindowGroup, signersGroup ) val wireTransaction1ShuffledInputs = WireTransaction(componentGroups = componentGroupsB, privacySalt = privacySalt) // The ID has changed due to change of the internal ordering in inputs. assertNotEquals(wireTransaction1ShuffledInputs, wireTransactionA) // Inputs group Merkle roots are not equal. assertNotEquals(wireTransactionA.accessGroupMerkleRoots()[INPUTS_GROUP.ordinal], wireTransaction1ShuffledInputs.accessGroupMerkleRoots()[INPUTS_GROUP.ordinal]) // But outputs group Merkle leaf (and the rest) remained the same. assertEquals(wireTransactionA.accessGroupMerkleRoots()[OUTPUTS_GROUP.ordinal], wireTransaction1ShuffledInputs.accessGroupMerkleRoots()[OUTPUTS_GROUP.ordinal]) assertEquals(wireTransactionA.accessGroupMerkleRoots()[NOTARY_GROUP.ordinal], wireTransaction1ShuffledInputs.accessGroupMerkleRoots()[NOTARY_GROUP.ordinal]) assertNull(wireTransactionA.accessGroupMerkleRoots()[ATTACHMENTS_GROUP.ordinal]) assertNull(wireTransaction1ShuffledInputs.accessGroupMerkleRoots()[ATTACHMENTS_GROUP.ordinal]) // Group leaves (components) ordering does not affect the id. In this case, we added outputs group before inputs. val shuffledComponentGroupsA = listOf( outputGroup, inputGroup, commandGroup, notaryGroup, timeWindowGroup, signersGroup ) assertEquals(wireTransactionA, WireTransaction(componentGroups = shuffledComponentGroupsA, privacySalt = privacySalt)) } - MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests${ // Required to call the private constructor. val ftxConstructor = FilteredTransaction::class.constructors.first() // 1st and 3rd commands require a signature from KEY_1. val twoCommandsforKey1 = listOf(dummyCommand(DUMMY_KEY_1.public, DUMMY_KEY_2.public), dummyCommand(DUMMY_KEY_2.public), dummyCommand(DUMMY_KEY_1.public)) val componentGroups = listOf( inputGroup, outputGroup, ComponentGroup(COMMANDS_GROUP.ordinal, twoCommandsforKey1.map { it.value.serialize() }), notaryGroup, timeWindowGroup, ComponentGroup(SIGNERS_GROUP.ordinal, twoCommandsforKey1.map { it.signers.serialize() }) ) val wtx = WireTransaction(componentGroups = componentGroups, privacySalt = PrivacySalt()) // Filter KEY_1 commands (commands 1 and 3). fun filterKEY1Commands(elem: Any): Boolean { return when (elem) { is Command<*> -> DUMMY_KEY_1.public in elem.signers else -> false } } // Filter KEY_2 commands (commands 1 and 2). fun filterKEY2Commands(elem: Any): Boolean { return when (elem) { is Command<*> -> DUMMY_KEY_2.public in elem.signers else -> false } } val key1CommandsFtx = wtx.buildFilteredTransaction(Predicate(::filterKEY1Commands)) val key2CommandsFtx = wtx.buildFilteredTransaction(Predicate(::filterKEY2Commands)) // val commandDataComponents = key1CommandsFtx.filteredComponentGroups[0].components val commandDataHashes = wtx.accessAvailableComponentHashes()[ComponentGroupEnum.COMMANDS_GROUP.ordinal]!! val noLastCommandDataPMT = PartialMerkleTree.build( MerkleTree.getMerkleTree(commandDataHashes), commandDataHashes.subList(0, 1) ) val noLastCommandDataComponents = key1CommandsFtx.filteredComponentGroups[0].components.subList(0, 1) val noLastCommandDataNonces = key1CommandsFtx.filteredComponentGroups[0].nonces.subList(0, 1) val noLastCommandDataGroup = FilteredComponentGroup( COMMANDS_GROUP.ordinal, noLastCommandDataComponents, noLastCommandDataNonces, noLastCommandDataPMT ) val signerComponents = key1CommandsFtx.filteredComponentGroups[1].components val signerHashes = wtx.accessAvailableComponentHashes()[ComponentGroupEnum.SIGNERS_GROUP.ordinal]!! val noLastSignerPMT = PartialMerkleTree.build( MerkleTree.getMerkleTree(signerHashes), signerHashes.subList(0, 2) ) val noLastSignerComponents = key1CommandsFtx.filteredComponentGroups[1].components.subList(0, 2) val noLastSignerNonces = key1CommandsFtx.filteredComponentGroups[1].nonces.subList(0, 2) val noLastSignerGroup = FilteredComponentGroup( SIGNERS_GROUP.ordinal, noLastSignerComponents, noLastSignerNonces, noLastSignerPMT ) val noLastSignerGroupSamePartialTree = FilteredComponentGroup( SIGNERS_GROUP.ordinal, noLastSignerComponents, noLastSignerNonces, key1CommandsFtx.filteredComponentGroups[1].partialMerkleTree) // We don't update that, so we can catch the index mismatch. val updatedFilteredComponentsNoSignersKey2 = listOf(key2CommandsFtx.filteredComponentGroups[0], noLastSignerGroup) val updatedFilteredComponentsNoSignersKey2SamePMT = listOf(key2CommandsFtx.filteredComponentGroups[0], noLastSignerGroupSamePartialTree) // There are only two components in key1CommandsFtx (commandData and signers). assertEquals(2, key1CommandsFtx.componentGroups.size) // Remove last signer for which there is a pointer from a visible commandData. This is the case of Key1. // This will result to an invalid transaction. // A command with no corresponding signer detected // because the pointer of CommandData (3rd leaf) cannot find a corresponding (3rd) signer. val updatedFilteredComponentsNoSignersKey1SamePMT = listOf(key1CommandsFtx.filteredComponentGroups[0], noLastSignerGroupSamePartialTree) assertFails { ftxConstructor.call(key1CommandsFtx.id, updatedFilteredComponentsNoSignersKey1SamePMT, key1CommandsFtx.groupHashes) } // Remove both last signer (KEY1) and related command. // Update partial Merkle tree for signers. val updatedFilteredComponentsNoLastCommandAndSigners = listOf(noLastCommandDataGroup, noLastSignerGroup) val ftxNoLastCommandAndSigners = ftxConstructor.call(key1CommandsFtx.id, updatedFilteredComponentsNoLastCommandAndSigners, key1CommandsFtx.groupHashes) // verify() will pass as the transaction is well-formed. ftxNoLastCommandAndSigners.verify() // checkCommandVisibility() will not pass, because checkAllComponentsVisible(ComponentGroupEnum.SIGNERS_GROUP) will fail. assertFailsWith<ComponentVisibilityException> { ftxNoLastCommandAndSigners.checkCommandVisibility(DUMMY_KEY_1.public) } // Remove last signer for which there is no pointer from a visible commandData. This is the case of Key2. // Do not change partial Merkle tree for signers. // This time the object can be constructed as there is no pointer mismatch. val ftxNoLastSigner = ftxConstructor.call(key2CommandsFtx.id, updatedFilteredComponentsNoSignersKey2SamePMT, key2CommandsFtx.groupHashes) // verify() will fail as we didn't change the partial Merkle tree. assertFailsWith<FilteredTransactionVerificationException> { ftxNoLastSigner.verify() } // checkCommandVisibility() will not pass. assertFailsWith<ComponentVisibilityException> { ftxNoLastSigner.checkCommandVisibility(DUMMY_KEY_2.public) } // Remove last signer for which there is no pointer from a visible commandData. This is the case of Key2. // Update partial Merkle tree for signers. val ftxNoLastSignerB = ftxConstructor.call(key2CommandsFtx.id, updatedFilteredComponentsNoSignersKey2, key2CommandsFtx.groupHashes) // verify() will pass, the transaction is well-formed. ftxNoLastSignerB.verify() // But, checkAllComponentsVisible() will not pass. assertFailsWith<ComponentVisibilityException> { ftxNoLastSignerB.checkCommandVisibility(DUMMY_KEY_2.public) } // Modify last signer (we have a pointer from commandData). // Update partial Merkle tree for signers. val alterSignerComponents = signerComponents.subList(0, 2) + signerComponents[1] // Third one is removed and the 2nd command is added twice. val alterSignersHashes = wtx.accessAvailableComponentHashes()[ComponentGroupEnum.SIGNERS_GROUP.ordinal]!!.subList(0, 2) + componentHash(key1CommandsFtx.filteredComponentGroups[1].nonces[2], alterSignerComponents[2]) val alterMTree = MerkleTree.getMerkleTree(alterSignersHashes) val alterSignerPMTK = PartialMerkleTree.build( alterMTree, alterSignersHashes ) val alterSignerGroup = FilteredComponentGroup( SIGNERS_GROUP.ordinal, alterSignerComponents, key1CommandsFtx.filteredComponentGroups[1].nonces, alterSignerPMTK ) val alterFilteredComponents = listOf(key1CommandsFtx.filteredComponentGroups[0], alterSignerGroup) // Do not update groupHashes. val ftxAlterSigner = ftxConstructor.call(key1CommandsFtx.id, alterFilteredComponents, key1CommandsFtx.groupHashes) // Visible components in signers group cannot be verified against their partial Merkle tree. assertFailsWith<FilteredTransactionVerificationException> { ftxAlterSigner.verify() } // Also, checkAllComponentsVisible() will not pass (groupHash matching will fail). assertFailsWith<ComponentVisibilityException> { ftxAlterSigner.checkCommandVisibility(DUMMY_KEY_1.public) } // Update groupHashes. val ftxAlterSignerB = ftxConstructor.call(key1CommandsFtx.id, alterFilteredComponents, key1CommandsFtx.groupHashes.subList(0, 6) + alterMTree.hash) // Visible components in signers group cannot be verified against their partial Merkle tree. assertFailsWith<FilteredTransactionVerificationException> { ftxAlterSignerB.verify() } // Also, checkAllComponentsVisible() will not pass (top level Merkle tree cannot be verified against transaction's id). assertFailsWith<ComponentVisibilityException> { ftxAlterSignerB.checkCommandVisibility(DUMMY_KEY_1.public) } } MaxLineLength:CompatibleTransactionTests.kt$CompatibleTransactionTests${ val groups = createComponentGroups(inputs, outputs, commands, attachments, notary, timeWindow, emptyList(), null) val wireTransactionOldConstructor = WireTransaction(groups, privacySalt) assertEquals(wireTransactionA, wireTransactionOldConstructor) // Malformed tx - attachments is not List<SecureHash>. For this example, we mistakenly added input-state (StateRef) serialised objects with ATTACHMENTS_GROUP.ordinal. val componentGroupsB = listOf( inputGroup, outputGroup, commandGroup, ComponentGroup(ATTACHMENTS_GROUP.ordinal, inputGroup.components), notaryGroup, timeWindowGroup, signersGroup ) assertFails { WireTransaction(componentGroupsB, privacySalt).attachments.toList() } // Malformed tx - duplicated component group detected. val componentGroupsDuplicatedCommands = listOf( inputGroup, outputGroup, commandGroup, // First commandsGroup. commandGroup, // Second commandsGroup. notaryGroup, timeWindowGroup, signersGroup ) assertFails { WireTransaction(componentGroupsDuplicatedCommands, privacySalt) } // Malformed tx - inputs is not a serialised object at all. val componentGroupsC = listOf( ComponentGroup(INPUTS_GROUP.ordinal, listOf(OpaqueBytes(ByteArray(8)))), outputGroup, commandGroup, notaryGroup, timeWindowGroup, signersGroup ) assertFails { WireTransaction(componentGroupsC, privacySalt) } val componentGroupsCompatibleA = listOf( inputGroup, outputGroup, commandGroup, notaryGroup, timeWindowGroup, signersGroup, newUnknownComponentGroup // A new unknown component with ordinal 100 that we cannot process. ) // The old client (receiving more component types than expected) is still compatible. val wireTransactionCompatibleA = WireTransaction(componentGroupsCompatibleA, privacySalt) assertEquals(wireTransactionCompatibleA.availableComponentGroups, wireTransactionA.availableComponentGroups) // The known components are the same. assertNotEquals(wireTransactionCompatibleA, wireTransactionA) // But obviously, its Merkle root has changed Vs wireTransactionA (which doesn't include this extra component). // The old client will throw if receiving an empty component (even if this is unknown). val componentGroupsCompatibleEmptyNew = listOf( inputGroup, outputGroup, commandGroup, notaryGroup, timeWindowGroup, signersGroup, newUnknownComponentEmptyGroup // A new unknown component with ordinal 101 that we cannot process. ) assertFails { WireTransaction(componentGroupsCompatibleEmptyNew, privacySalt) } } - MaxLineLength:ComposableTypePropertySerializer.kt$AMQPPropertyReadStrategy$override - MaxLineLength:ComposableTypePropertySerializer.kt$ComposableTypePropertySerializer.Companion$ fun make(name: String, propertyInformation: LocalPropertyInformation, factory: LocalSerializerFactory): PropertySerializer - MaxLineLength:ComposableTypePropertySerializer.kt$ComposableTypePropertySerializer.Companion$ fun makeForEvolution(name: String, isCalculated: Boolean, typeIdentifier: TypeIdentifier, type: Type): PropertySerializer - MaxLineLength:ComposableTypePropertySerializer.kt$ComposableTypePropertySerializer.Companion$PropertyReadStrategy.make(name, propertyInformation.type.typeIdentifier, propertyInformation.type.observedType) - MaxLineLength:ComposableTypePropertySerializer.kt$DescribedTypeReadStrategy : PropertyReadStrategy - MaxLineLength:ComposableTypePropertySerializer.kt$DescribedTypeReadStrategy$override - MaxLineLength:ComposableTypePropertySerializer.kt$EvolutionPropertyWriteStrategy$override - MaxLineLength:ComposableTypePropertySerializer.kt$PropertyReadStrategy$ fun readProperty(obj: Any?, schemas: SerializationSchemas, input: DeserializationInput, context: SerializationContext): Any? - MaxLineLength:ComposableTypePropertySerializer.kt$PropertyReader - MaxLineLength:ComposableTypePropertySerializer.kt$PropertyReader.Companion$is LocalPropertyInformation.PrivateConstructorPairedProperty -> FieldReader(propertyInformation.observedField) - MaxLineLength:ComposableTypePropertySerializer.kt$PropertyWriteStrategy$ fun writeProperty(obj: Any?, data: Data, output: SerializationOutput, context: SerializationContext, debugIndent: Int) - MaxLineLength:ComposableTypePropertySerializer.kt$PropertyWriteStrategy.Companion$ fun make(name: String, propertyInformation: LocalPropertyInformation, factory: LocalSerializerFactory): PropertyWriteStrategy - MaxLineLength:CompositeKey.kt$CompositeKey$ fun isFulfilledBy(keysToCheck: Iterable<PublicKey>): Boolean - MaxLineLength:CompositeKey.kt$CompositeKey$return SubjectPublicKeyInfo(AlgorithmIdentifier(CordaObjectIdentifier.COMPOSITE_KEY), DERSequence(keyVector)).encoded - MaxLineLength:CompositeKey.kt$CompositeKey.Builder$ fun build(threshold: Int? = null): PublicKey - MaxLineLength:CompositeKey.kt$CompositeKey.Builder$require(threshold == null || threshold > 0) { "Threshold must not be specified or its value must be greater than zero" } - MaxLineLength:CompositeKey.kt$CompositeKey.Builder${ "Trying to build invalid CompositeKey, threshold value different than weight of single child node." } - MaxLineLength:CompositeKey.kt$CompositeKey.Builder${ require(threshold == null || threshold == children.first().weight) { "Trying to build invalid CompositeKey, threshold value different than weight of single child node." } // Returning the only child node which is [PublicKey] itself. We need to avoid single-key [CompositeKey] instances, // as there are scenarios where developers expected the underlying key and its composite versions to be equivalent. children.first().node } - MaxLineLength:CompositeKey.kt$CompositeKey.NodeAndWeight$if (weight == other.weight) // TODO: this might be expensive, consider a faster deterministic compareTo implementation when weights are equal. node.encoded.sequence().compareTo(other.node.encoded.sequence()) else weight.compareTo(other.weight) - MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$// By lazy is required so that the serialisers are configured before vals initialisation takes place (they internally invoke serialise). private val aliceSignature by lazy { aliceKey.sign(SignableData(secureHash, SignatureMetadata(1, Crypto.findSignatureScheme(alicePublicKey).schemeNumberID))) } MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$@Test() fun `composite key validation with graph cycle detection`() - MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$assertFalse { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, brokenBobSignature)).serialize().bytes) } - MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, bobSignature)).serialize().bytes) } - MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, bobSignature, charlieSignature)).serialize().bytes) } - MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, charlieSignature)).serialize().bytes) } - MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(bobSignature, charlieSignature)).serialize().bytes) } MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$private MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$private val bobSignature by lazy { bobKey.sign(SignableData(secureHash, SignatureMetadata(1, Crypto.findSignatureScheme(bobPublicKey).schemeNumberID))) } MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$private val charlieSignature by lazy { charlieKey.sign(SignableData(secureHash, SignatureMetadata(1, Crypto.findSignatureScheme(charliePublicKey).schemeNumberID))) } @@ -4740,101 +3080,52 @@ MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$val RSASignature = keyPairRSA.sign(SignableData(secureHash, SignatureMetadata(1, Crypto.findSignatureScheme(keyPairRSA.public).schemeNumberID))) MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$val SPSignature = keyPairSP.sign(SignableData(secureHash, SignatureMetadata(1, Crypto.findSignatureScheme(keyPairSP.public).schemeNumberID))) MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$val brokenBobSignature = TransactionSignature(aliceSignature.bytes, bobSignature.by, SignatureMetadata(1, Crypto.findSignatureScheme(bobSignature.by).schemeNumberID)) - MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$val composite1 = CompositeKey.Builder().addKeys(pub1, pub2, pub3, pub4, pub5, pub6, pub7).build() as CompositeKey - MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$val composite2 = CompositeKey.Builder().addKeys(pub7, pub6, pub5, pub4, pub3, pub2, pub1).build() as CompositeKey MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$val compositeKey = CompositeKey.Builder().addKeys(keyPairRSA.public, keyPairK1.public, keyPairR1.public, keyPairEd.public, keyPairSP.public).build() as CompositeKey - MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$val compositeKeyCert = X509Utilities.createCertificate(CertificateType.LEGAL_IDENTITY, ca, caKeyPair, caName, compositeKey) - MaxLineLength:CompositeKeyTests.kt$CompositeKeyTests$val twoOfThree = CompositeKey.Builder().addKeys(alicePublicKey, bobPublicKey, charliePublicKey).build(threshold = 2) - MaxLineLength:CompositeMemberCompositeSchemaToClassCarpenterTests.kt$CompositeMembers$val mangledMap = envelope.typeInformation.values.find { it.typeIdentifier.name == "java.util.Map" }!!.mangle<C>() MaxLineLength:CompositeSignature.kt$CompositeSignature$throw InvalidKeyException("Composite signatures must be assembled independently from signatures provided by the component private keys") MaxLineLength:CompositeSignature.kt$CompositeSignature$throw SignatureException("Composite signatures must be assembled independently from signatures provided by the component private keys") MaxLineLength:CompositeSignature.kt$CompositeSignature.Companion$@JvmStatic fun getService(provider: Provider) - MaxLineLength:CompositeSignaturesWithKeys.kt$CompositeSignaturesWithKeys - MaxLineLength:ConcatenatedList.kt$ConcatenatedList$val permutedOffset = (if (permutedListIndex == 0) 0 else newSubNestedIndexOffsets[permutedListIndex - 1]) - MaxLineLength:ConcatenatedList.kt$ConcatenatedList${ // If a nested element is updated we simply propagate the update by offsetting the nested element index // by the startingOffsetOf the nested list. val listIndex = indexMap[wrapped]!!.first val startingOffset = startingOffsetOf(listIndex) for (i in change.from until change.to) { nextUpdate(startingOffset + i) } } - MaxLineLength:ConcatenatedList.kt$ConcatenatedList<A> : TransformationList - MaxLineLength:ConcatenatedListTest.kt$ConcatenatedListTest$sourceList = FXCollections.observableArrayList<ObservableList<String>>(FXCollections.observableArrayList("hello")) - MaxLineLength:ConcurrencyUtils.kt$ fun <V, W> firstOf(vararg futures: CordaFuture<out V>, handler: (CordaFuture<out V>) -> W) - MaxLineLength:ConcurrencyUtils.kt$internal - MaxLineLength:ConfigExporter.kt$ConfigExporter$fileWriter.write(configToWrite.root().render(ConfigRenderOptions.concise().setFormatted(true).setJson(false))) - MaxLineLength:ConfigExporter.kt$ConfigExporter$ourParsedConfig = ourParsedConfig.withValue("keyStorePassword", testNetParsedConfig.getValue("keyStorePassword")) - MaxLineLength:ConfigExporter.kt$ConfigExporter$ourParsedConfig = ourParsedConfig.withValue("trustStorePassword", testNetParsedConfig.getValue("trustStorePassword")) MaxLineLength:ConfigParsingTest.kt$ConfigParsingTest$assertThatThrownBy { configuration.parseAs<TypedConfiguration>() } - MaxLineLength:ConfigParsingTest.kt$ConfigParsingTest$private inline - MaxLineLength:ConfigParsingTest.kt$ConfigParsingTest$testPropertyType<InstantData, InstantListData, Instant>(Instant.now(), Instant.now().plusMillis(100), valuesToString = true) - MaxLineLength:ConfigParsingTest.kt$ConfigParsingTest$testPropertyType<LocalDateData, LocalDateListData, LocalDate>(LocalDate.now(), LocalDate.now().plusDays(1), valuesToString = true) - MaxLineLength:ConfigParsingTest.kt$ConfigParsingTest$testPropertyType<URLData, URLListData, URL>(URL("http://localhost:1234"), URL("http://localhost:1235"), valuesToString = true) MaxLineLength:ConfigParsingTest.kt$ConfigParsingTest$testPropertyType<X500PrincipalData, X500PrincipalListData, X500Principal>(X500Principal("C=US, L=New York, CN=Corda Root CA, OU=Corda, O=R3 HoldCo LLC"), X500Principal("O=Bank A,L=London,C=GB"), valuesToString = true) MaxLineLength:ConfigSections.kt$BFTSmartConfigSpec$return valid(BFTSmartConfig(configuration[replicaId], configuration[clusterAddresses], configuration[debug], configuration[exposeRaces])) - MaxLineLength:ConfigSections.kt$CertChainPolicyConfigSpec$@Suppress("DEPRECATION") internal - MaxLineLength:ConfigSections.kt$CertChainPolicyConfigSpec$return valid(CertChainPolicyConfig(configuration[role], configuration[policy], configuration[trustedAliases].toSet())) - MaxLineLength:ConfigSections.kt$DatabaseConfigSpec$private val exportHibernateJMXStatistics by boolean().optional().withDefaultValue(DatabaseConfig.Defaults.exportHibernateJMXStatistics) MaxLineLength:ConfigSections.kt$DatabaseConfigSpec$private val initialiseAppSchema by enum(SchemaInitializationType::class).optional().withDefaultValue(DatabaseConfig.Defaults.initialiseAppSchema) - MaxLineLength:ConfigSections.kt$DatabaseConfigSpec$private val mappedSchemaCacheSize by long().optional().withDefaultValue(DatabaseConfig.Defaults.mappedSchemaCacheSize) MaxLineLength:ConfigSections.kt$DatabaseConfigSpec$private val transactionIsolationLevel by enum(TransactionIsolationLevel::class).optional().withDefaultValue(DatabaseConfig.Defaults.transactionIsolationLevel) MaxLineLength:ConfigSections.kt$DatabaseConfigSpec$return valid(DatabaseConfig(configuration[initialiseSchema], configuration[initialiseAppSchema], configuration[transactionIsolationLevel], configuration[exportHibernateJMXStatistics], configuration[mappedSchemaCacheSize])) - MaxLineLength:ConfigSections.kt$DevModeOptionsSpec$private val allowCompatibilityZone by boolean().optional().withDefaultValue(DevModeOptions.Defaults.allowCompatibilityZone) - MaxLineLength:ConfigSections.kt$DevModeOptionsSpec$private val disableCheckpointChecker by boolean().optional().withDefaultValue(DevModeOptions.Defaults.disableCheckpointChecker) - MaxLineLength:ConfigSections.kt$FlowTimeoutConfigurationSpec$internal - MaxLineLength:ConfigSections.kt$FlowTimeoutConfigurationSpec$return valid(FlowTimeoutConfiguration(configuration[timeout], configuration[maxRestartCount], configuration[backoffBase])) - MaxLineLength:ConfigSections.kt$NetworkServicesConfigSpec$internal MaxLineLength:ConfigSections.kt$NetworkServicesConfigSpec$return valid(NetworkServicesConfig(configuration[doormanURL], configuration[networkMapURL], configuration[pnm], configuration[inferred])) MaxLineLength:ConfigSections.kt$NodeRpcSettingsSpec$return valid(NodeRpcSettings(configuration[address], configuration[adminAddress], configuration[standAloneBroker], configuration[useSsl], configuration[ssl])) - MaxLineLength:ConfigSections.kt$NotaryConfigSpec$private val etaMessageThresholdSeconds by int().optional().withDefaultValue(NotaryServiceFlow.defaultEstimatedWaitTime.seconds.toInt()) MaxLineLength:ConfigSections.kt$NotaryConfigSpec$return valid(NotaryConfig(configuration[validating], configuration[serviceLegalName], configuration[className], configuration[etaMessageThresholdSeconds], configuration[extraConfig], configuration[raft], configuration[bftSMaRt])) MaxLineLength:ConfigSections.kt$SSHDConfigurationSpec$override fun parseValid(configuration: Config): Valid<SSHDConfiguration> - MaxLineLength:ConfigSections.kt$SecurityConfigurationSpec$internal MaxLineLength:ConfigSections.kt$SecurityConfigurationSpec.AuthServiceSpec$dataSource.type == AuthDataSourceType.INMEMORY && options?.cache != null -> badValue("no cache supported for \"INMEMORY\" data provider") - MaxLineLength:ConfigSections.kt$SecurityConfigurationSpec.AuthServiceSpec.DataSourceSpec$else -> valid(SecurityConfiguration.AuthService.DataSource(type, passwordEncryption, connection, users)) - MaxLineLength:ConfigSections.kt$SecurityConfigurationSpec.AuthServiceSpec.DataSourceSpec$private MaxLineLength:ConfigSections.kt$SecurityConfigurationSpec.AuthServiceSpec.DataSourceSpec$private val passwordEncryption by enum(PasswordEncryption::class).optional().withDefaultValue(SecurityConfiguration.AuthService.DataSource.Defaults.passwordEncryption) MaxLineLength:ConfigSections.kt$SecurityConfigurationSpec.AuthServiceSpec.DataSourceSpec$type == AuthDataSourceType.DB && (users != null || connection == null) -> badValue("\"DB\" data source type requires \"connection\" and cannot specify \"users\"") MaxLineLength:ConfigSections.kt$SecurityConfigurationSpec.AuthServiceSpec.DataSourceSpec$type == AuthDataSourceType.INMEMORY && (users == null || connection != null) -> badValue("\"INMEMORY\" data source type requires \"users\" and cannot specify \"connection\"") - MaxLineLength:ConfigSections.kt$SecurityConfigurationSpec.AuthServiceSpec.OptionsSpec.CacheSpec$private MaxLineLength:ConfigSections.kt$SecurityConfigurationSpec.AuthServiceSpec.OptionsSpec.CacheSpec$private val expireAfterSecs by long().mapValid { value -> if (value >= 0) validValue(value) else badValue("cannot be less than 0'") } MaxLineLength:ConfigSections.kt$SecurityConfigurationSpec.AuthServiceSpec.OptionsSpec.CacheSpec$private val maxEntries by long().mapValid { value -> if (value >= 0) validValue(value) else badValue("cannot be less than 0'") } - MaxLineLength:ConfigSections.kt$SecurityConfigurationSpec.AuthServiceSpec.OptionsSpec.CacheSpec$return valid(SecurityConfiguration.AuthService.Options.Cache(configuration[expireAfterSecs], configuration[maxEntries])) MaxLineLength:ConfigUtilities.kt$ // TODO Move this to KeyStoreConfigHelpers. fun NodeConfiguration.configureWithDevSSLCertificate(cryptoService: CryptoService? = null) MaxLineLength:ConfigUtilities.kt$// Problems: // - Forces you to have a primary constructor with all fields of name and type matching the configuration file structure. // - Encourages weak bean-like types. // - Cannot support a many-to-one relationship between configuration file structures and configuration domain type. This is essential for versioning of the configuration files. // - It's complicated and based on reflection, meaning problems with it are typically found at runtime. // - It doesn't support validation errors in a structured way. If something goes wrong, it throws exceptions, which doesn't support good usability practices like displaying all the errors at once. fun <T : Any> Config.parseAs(clazz: KClass<T>, onUnknownKeys: ((Set<String>, logger: Logger) -> Unit) = UnknownConfigKeysPolicy.FAIL::handle, nestedPath: String? = null, baseDirectory: Path? = null): T MaxLineLength:ConfigUtilities.kt$// TODO Move this to KeyStoreConfigHelpers. fun MutualSslConfiguration.configureDevKeyAndTrustStores(myLegalName: CordaX500Name, signingCertificateStore: FileBasedCertificateStoreSupplier, certificatesDirectory: Path, cryptoService: CryptoService? = null) - MaxLineLength:ConfigUtilities.kt$ConfigHelper$configOf( // Add substitution values here "baseDirectory" to baseDirectory.toString()) .withFallback(configOverrides) .withFallback(systemOverrides) .withFallback(environmentOverrides) .withFallback(appConfig) .withFallback(devModeConfig) MaxLineLength:ConfigUtilities.kt$ConfigHelper$return ConfigFactory.parseMap(toProperties().filterKeys { (it as String).startsWith(CORDA_PROPERTY_PREFIX) }.mapKeys { (it.key as String).removePrefix(CORDA_PROPERTY_PREFIX) }) MaxLineLength:ConfigUtilities.kt$ConfigHelper$val smartDevMode = CordaSystemUtils.isOsMac() || (CordaSystemUtils.isOsWindows() && !CordaSystemUtils.getOsName().toLowerCase().contains("server")) - MaxLineLength:ConfigUtilities.kt$ConfigHelper${ val parseOptions = ConfigParseOptions.defaults() val defaultConfig = ConfigFactory.parseResources("reference.conf", parseOptions.setAllowMissing(false)) val appConfig = ConfigFactory.parseFile(configFile.toFile(), parseOptions.setAllowMissing(allowMissingConfig)) // Detect the underlying OS. If mac or windows non-server then we assume we're running in devMode. Unless specified otherwise. val smartDevMode = CordaSystemUtils.isOsMac() || (CordaSystemUtils.isOsWindows() && !CordaSystemUtils.getOsName().toLowerCase().contains("server")) val devModeConfig = ConfigFactory.parseMap(mapOf("devMode" to smartDevMode)) val systemOverrides = ConfigFactory.systemProperties().cordaEntriesOnly() val environmentOverrides = ConfigFactory.systemEnvironment().cordaEntriesOnly() val finalConfig = configOf( // Add substitution values here "baseDirectory" to baseDirectory.toString()) .withFallback(configOverrides) .withFallback(systemOverrides) .withFallback(environmentOverrides) .withFallback(appConfig) .withFallback(devModeConfig) // this needs to be after the appConfig, so it doesn't override the configured devMode .withFallback(defaultConfig) .resolve() val entrySet = finalConfig.entrySet().filter { entry -> entry.key.contains("\"") } for ((key) in entrySet) { log.error("Config files should not contain \" in property names. Please fix: $key") } return finalConfig } - MaxLineLength:ConfigUtilities.kt$UnknownConfigurationKeysException : IllegalArgumentException - MaxLineLength:ConfigUtilities.kt$UnknownConfigurationKeysException$require(unknownKeys.isNotEmpty()) { "Absence of unknown keys should not raise UnknownConfigurationKeysException." } - MaxLineLength:ConfigUtilities.kt$UnknownConfigurationKeysException.Companion$fun of(offendingKeys: Set<String>): UnknownConfigurationKeysException - MaxLineLength:ConfigUtilities.kt$UnknownConfigurationKeysException.Companion$private fun message(offendingKeys: Set<String>) MaxLineLength:ConfigUtilities.kt$fun Any?.toConfigValue(): ConfigValue - MaxLineLength:ConfigUtilities.kt$getConfig(path).parseAs(typeClass, onUnknownKeys, nestedPath?.let { "$it.$path" } ?: path, baseDirectory = baseDirectory) MaxLineLength:ConfigUtilities.kt$inline fun <reified T : Any> Config.parseAs(noinline onUnknownKeys: ((Set<String>, logger: Logger) -> Unit) = UnknownConfigKeysPolicy.FAIL::handle): T MaxLineLength:ConfigUtilities.kt$private - MaxLineLength:ConfigUtilities.kt$private fun parseEnum(enumType: Class<*>, name: String): Enum<*> MaxLineLength:ConfigUtilities.kt$require(clazz.isData) { "Only Kotlin data classes or class annotated with CustomConfigParser can be parsed. Offending: ${clazz.qualifiedName}" } MaxLineLength:ConfigUtilities.kt$return getValueInternal(metadata.name, metadata.returnType, UnknownConfigKeysPolicy.IGNORE::handle, nestedPath = null, baseDirectory = null) MaxLineLength:ConfigUtilities.kt$return uncheckedCast(if (type.arguments.isEmpty()) getSingleValue(path, type, onUnknownKeys, nestedPath, baseDirectory) else getCollectionValue(path, type, onUnknownKeys, nestedPath, baseDirectory)) MaxLineLength:ConfigUtilities.kt$setPrivateKey(it, serviceKeystore.getPrivateKey(it, DEV_CA_KEY_STORE_PASS), serviceKeystore.getCertificateChain(it), signingKeyStore.entryPassword) - MaxLineLength:ConfigUtilities.kt$val elementClass = type.arguments[0].type?.jvmErasure ?: throw IllegalArgumentException("Cannot work with star projection: $type") MaxLineLength:ConfigUtilities.kt$val signingKeyStore = FileBasedCertificateStoreSupplier(signingCertificateStore.path, signingCertificateStore.storePassword, signingCertificateStore.entryPassword).get(true) .also { it.installDevNodeCaCertPath(myLegalName) } MaxLineLength:ConfigUtilities.kt${ // These types are supported by Config as use as is value } - MaxLineLength:ConfigUtilities.kt${ // These types make sense to be represented as Strings and the exact inverse parsing function for use in parseAs value.toString() } MaxLineLength:ConfigUtilities.kt${ // if baseDirectory been specified try resolving path against it. Note if `pathFromConfig` is an absolute path - this instruction has no effect. baseDirectory.resolve(path) } - MaxLineLength:ConfigUtilities.kt${ val signingKeyStore = FileBasedCertificateStoreSupplier(signingCertificateStore.path, signingCertificateStore.storePassword, signingCertificateStore.entryPassword).get(true) .also { it.installDevNodeCaCertPath(myLegalName) } // Move distributed service composite key (generated by IdentityGenerator.generateToDisk) to keystore if exists. val distributedServiceKeystore = certificatesDirectory / "distributedService.jks" if (distributedServiceKeystore.exists()) { val serviceKeystore = X509KeyStore.fromFile(distributedServiceKeystore, DEV_CA_KEY_STORE_PASS) signingKeyStore.update { serviceKeystore.aliases().forEach { if (serviceKeystore.internal.isKeyEntry(it)) { setPrivateKey(it, serviceKeystore.getPrivateKey(it, DEV_CA_KEY_STORE_PASS), serviceKeystore.getCertificateChain(it), signingKeyStore.entryPassword) } else { setCertificate(it, serviceKeystore.getCertificate(it)) } } } } } MaxLineLength:Configuration.kt$Configuration$Describer MaxLineLength:Configuration.kt$Configuration$Schema : ValidatorDescriber MaxLineLength:Configuration.kt$Configuration$Specification<VALUE> : SchemaParser MaxLineLength:Configuration.kt$Configuration$Validator : Validator MaxLineLength:Configuration.kt$Configuration.Describer$ fun describe(configuration: Config, serialiseValue: (Any?) -> ConfigValue = { value -> ConfigValueFactory.fromAnyRef(value.toString()) }): ConfigValue? MaxLineLength:Configuration.kt$Configuration.Property$Definition<TYPE> : MetadataValidatorExtractorDescriberParser - MaxLineLength:Configuration.kt$Configuration.Property$Metadata MaxLineLength:Configuration.kt$Configuration.Property.Definition$Single<TYPE> : Definition - MaxLineLength:Configuration.kt$Configuration.Property.Definition$override MaxLineLength:Configuration.kt$Configuration.Property.Definition.Companion$ fun <ENUM : Enum<ENUM>> enum(key: String, enumClass: KClass<ENUM>, sensitive: Boolean = false): Standard<ENUM> MaxLineLength:Configuration.kt$Configuration.Property.Definition.Companion$ fun boolean(key: String, sensitive: Boolean = false): Standard<Boolean> MaxLineLength:Configuration.kt$Configuration.Property.Definition.Companion$ fun double(key: String, sensitive: Boolean = false): Standard<Double> MaxLineLength:Configuration.kt$Configuration.Property.Definition.Companion$ fun duration(key: String, sensitive: Boolean = false): Standard<Duration> - MaxLineLength:Configuration.kt$Configuration.Property.Definition.Companion$ fun float(key: String, sensitive: Boolean = false): Standard<Float> - MaxLineLength:Configuration.kt$Configuration.Property.Definition.Companion$ fun int(key: String, sensitive: Boolean = false): Standard<Int> MaxLineLength:Configuration.kt$Configuration.Property.Definition.Companion$ fun nestedObject(key: String, schema: Schema? = null, sensitive: Boolean = false): Standard<ConfigObject> MaxLineLength:Configuration.kt$Configuration.Property.Definition.Companion$ fun string(key: String, sensitive: Boolean = false): Standard<String> MaxLineLength:Configuration.kt$Configuration.Property.Definition.Companion$invalid<Float, Configuration.Validation.Error>(Configuration.Validation.Error.BadValue.of(key, Float::class.javaObjectType.simpleName, "Provided value exceeds Float range.")) @@ -4842,9 +3133,7 @@ MaxLineLength:Configuration.kt$Configuration.Property.Definition.RequiredList$ fun <MAPPED> map(mappedTypeName: String, convert: (List<TYPE>) -> MAPPED): Required<MAPPED> MaxLineLength:Configuration.kt$Configuration.Property.Definition.RequiredList$ fun <MAPPED> mapValid(mappedTypeName: String, convert: (List<TYPE>) -> Validated<MAPPED, Validation.Error>): Required<MAPPED> MaxLineLength:Configuration.kt$Configuration.Property.Definition.Standard$ fun <MAPPED> map(mappedTypeName: String, convert: (TYPE) -> MAPPED): Standard<MAPPED> - MaxLineLength:Configuration.kt$Configuration.Property.Definition.Standard$ fun <MAPPED> mapValid(mappedTypeName: String, convert: (TYPE) -> Validated<MAPPED, Validation.Error>): Standard<MAPPED> MaxLineLength:Configuration.kt$Configuration.Schema.Companion$ fun withProperties(name: String? = null, builder: Property.Definition.Companion.() -> Iterable<Property.Definition<*>>): Schema - MaxLineLength:Configuration.kt$Configuration.Schema.Companion$ fun withProperties(name: String? = null, properties: Iterable<Property.Definition<*>>): Schema MaxLineLength:Configuration.kt$Configuration.Schema.Companion$ fun withProperties(vararg properties: Property.Definition<*>, name: String? = null): Schema MaxLineLength:Configuration.kt$Configuration.Specification$ fun <ENUM : Enum<ENUM>> enum(enumClass: KClass<ENUM>, sensitive: Boolean = false): PropertyDelegate.Standard<ENUM> MaxLineLength:Configuration.kt$Configuration.Specification$ fun <ENUM : Enum<ENUM>> enum(key: String? = null, enumClass: KClass<ENUM>, sensitive: Boolean = false): PropertyDelegate.Standard<ENUM> @@ -4859,7 +3148,6 @@ MaxLineLength:Configuration.kt$Configuration.Specification$ protected abstract fun parseValid(configuration: Config): Valid<VALUE> MaxLineLength:Configuration.kt$Configuration.Specification$abstract MaxLineLength:Configuration.kt$Configuration.Specification$final override fun parse(configuration: Config, options: Configuration.Validation.Options): Valid<VALUE> - MaxLineLength:Configuration.kt$Configuration.Specification$override fun describe(configuration: Config, serialiseValue: (Any?) -> ConfigValue) MaxLineLength:Configuration.kt$Configuration.Validation.Error$BadPath : Error MaxLineLength:Configuration.kt$Configuration.Validation.Error$BadValue : Error MaxLineLength:Configuration.kt$Configuration.Validation.Error$MalformedStructure : Error @@ -4870,10 +3158,8 @@ MaxLineLength:Configuration.kt$Configuration.Validation.Error$internal abstract fun with(keyName: String = this.keyName ?: UNKNOWN, typeName: String = this.typeName ?: UNKNOWN): Configuration.Validation.Error MaxLineLength:Configuration.kt$Configuration.Validation.Error$internal fun withContainingPathPrefix(vararg containingPath: String): Error MaxLineLength:Configuration.kt$Configuration.Validation.Error$sealed - MaxLineLength:Configuration.kt$Configuration.Validation.Error.BadPath$override fun with(keyName: String, typeName: String): BadPath MaxLineLength:Configuration.kt$Configuration.Validation.Error.BadPath$override fun withContainingPath(vararg containingPath: String) MaxLineLength:Configuration.kt$Configuration.Validation.Error.BadPath.Companion$fun of(message: String, keyName: String? = null, typeName: String = UNKNOWN, containingPath: List<String> = emptyList()): BadPath - MaxLineLength:Configuration.kt$Configuration.Validation.Error.BadValue$override fun with(keyName: String, typeName: String): BadValue MaxLineLength:Configuration.kt$Configuration.Validation.Error.BadValue$override fun withContainingPath(vararg containingPath: String) MaxLineLength:Configuration.kt$Configuration.Validation.Error.BadValue.Companion$fun of(message: String, keyName: String? = null, typeName: String = UNKNOWN, containingPath: List<String> = emptyList()): BadValue MaxLineLength:Configuration.kt$Configuration.Validation.Error.MalformedStructure$override fun with(keyName: String, typeName: String): MalformedStructure @@ -4881,12 +3167,8 @@ MaxLineLength:Configuration.kt$Configuration.Validation.Error.MalformedStructure.Companion$fun of(message: String, keyName: String? = null, typeName: String = UNKNOWN, containingPath: List<String> = emptyList()): MalformedStructure MaxLineLength:Configuration.kt$Configuration.Validation.Error.MissingValue$override fun with(keyName: String, typeName: String): MissingValue MaxLineLength:Configuration.kt$Configuration.Validation.Error.MissingValue$override fun withContainingPath(vararg containingPath: String) - MaxLineLength:Configuration.kt$Configuration.Validation.Error.MissingValue.Companion$fun forKey(keyName: String): MissingValue MaxLineLength:Configuration.kt$Configuration.Validation.Error.MissingValue.Companion$fun of(message: String, keyName: String? = null, typeName: String = UNKNOWN, containingPath: List<String> = emptyList()): MissingValue - MaxLineLength:Configuration.kt$Configuration.Validation.Error.Unknown$override fun withContainingPath(vararg containingPath: String) MaxLineLength:Configuration.kt$Configuration.Validation.Error.Unknown.Companion$fun of(keyName: String = UNKNOWN, containingPath: List<String> = emptyList()): Unknown - MaxLineLength:Configuration.kt$Configuration.Validation.Error.UnsupportedVersion$override fun withContainingPath(vararg containingPath: String) - MaxLineLength:Configuration.kt$Configuration.Validation.Error.WrongType$override fun with(keyName: String, typeName: String): WrongType MaxLineLength:Configuration.kt$Configuration.Validation.Error.WrongType$override fun withContainingPath(vararg containingPath: String) MaxLineLength:Configuration.kt$Configuration.Validation.Error.WrongType.Companion$fun forKey(keyName: String, expectedTypeName: String, actualTypeName: String): WrongType MaxLineLength:Configuration.kt$Configuration.Validation.Error.WrongType.Companion$fun of(message: String, keyName: String? = null, typeName: String = UNKNOWN, containingPath: List<String> = emptyList()): WrongType @@ -4899,36 +3181,18 @@ MaxLineLength:ConnectionChange.kt$ConnectionChange$return "ConnectionChange remoteAddress: $remoteAddress connected state: $connected cert subject: ${remoteCert?.subjectDN} cert ok: ${!badCert}" MaxLineLength:ConnectionManager.kt$ fun <A> connectToNodes(remoteNodes: List<RemoteNode>, tunnelPortAllocation: PortAllocation, withConnections: (List<NodeConnection>) -> A): A MaxLineLength:ConnectionStateMachine.kt$ConnectionStateMachine$logDebugWithMDC { "Put tag ${javax.xml.bind.DatatypeConverter.printHexBinary(delivery.tag)} on wire uuid: ${nextMessage.applicationProperties["_AMQ_DUPL_ID"]}" } - MaxLineLength:ConnectionStateMachine.kt$ConnectionStateMachine$logDebugWithMDC { "Sender delivery confirmed tag ${javax.xml.bind.DatatypeConverter.printHexBinary(delivery.tag)}" } - MaxLineLength:ConnectionStateMachine.kt$ConnectionStateMachine$sender.send(messageBuf.array(), messageBuf.arrayOffset() + messageBuf.readerIndex(), messageBuf.readableBytes()) - MaxLineLength:ConnectionStateMachine.kt$ConnectionStateMachine$val pending = transport.pending() // Note this drives frame generation, which the susbsequent writes push to the socket - MaxLineLength:Constants.kt$/** * constants in this file are generated by gradle * to change this file, edit src/main/template/kotlin/net/corda/common/logging/Constants.kt * the generated file does not need to be committed to source control (originally added to source control for ease of use) */ internal const val CURRENT_MAJOR_RELEASE = "4.3-SNAPSHOT" - MaxLineLength:Constants.kt$/** * constants in this file are generated by gradle * to change this file, edit src/main/template/kotlin/net/corda/common/logging/Constants.kt * the generated file does not need to be committed to source control (originally added to source control for ease of use) */ internal const val CURRENT_MAJOR_RELEASE = "@corda_release_version@" - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$@Test fun `Fail early in the TransactionBuilder when attempting to change the hash of the HashConstraint on the spending transaction`() MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$@Test fun `On contract annotated with NoConstraintPropagation there is no platform check for propagation, but the transaction builder can't use the AutomaticPlaceholderConstraint`() MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$@Test fun `Switching from the WhitelistConstraint to the Signature Constraint fails if the signature constraint does not inherit all jar signatures`() MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$@Test fun `Switching from the WhitelistConstraint to the Signature Constraint is possible if the attachment satisfies both constraints, and the signature constraint inherits all jar signatures`() - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$@Test fun `When the constraint of the output state is a valid transition from the input state, transaction validation works`() - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$SignableData(wireTransaction.id, SignatureMetadata(4, Crypto.findSignatureScheme(nodeKey).schemeNumberID)) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFailsWith<IllegalArgumentException> { AutomaticPlaceholderConstraint.canBeTransitionedFrom(AutomaticPlaceholderConstraint, attachment) } - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(AlwaysAcceptAttachmentConstraint.canBeTransitionedFrom(HashAttachmentConstraint(SecureHash.randomSHA256()), attachment)) - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(AlwaysAcceptAttachmentConstraint.canBeTransitionedFrom(SignatureAttachmentConstraint(ALICE_PUBKEY), attachment)) - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(AlwaysAcceptAttachmentConstraint.canBeTransitionedFrom(WhitelistedByZoneAttachmentConstraint, attachment)) - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(HashAttachmentConstraint(SecureHash.randomSHA256()).canBeTransitionedFrom(AlwaysAcceptAttachmentConstraint, attachment)) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(HashAttachmentConstraint(SecureHash.randomSHA256()).canBeTransitionedFrom(HashAttachmentConstraint(SecureHash.randomSHA256()), attachment)) - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(SignatureAttachmentConstraint(ALICE_PUBKEY).canBeTransitionedFrom(AlwaysAcceptAttachmentConstraint, attachment)) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(SignatureAttachmentConstraint(ALICE_PUBKEY).canBeTransitionedFrom(HashAttachmentConstraint(SecureHash.randomSHA256()), attachment)) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(SignatureAttachmentConstraint(ALICE_PUBKEY).canBeTransitionedFrom(HashAttachmentConstraint(allOnesHash), attachmentSigned)) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(SignatureAttachmentConstraint(BOB_PUBKEY).canBeTransitionedFrom(SignatureAttachmentConstraint(ALICE_PUBKEY), attachment)) - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(SignatureAttachmentConstraint(BOB_PUBKEY).canBeTransitionedFrom(WhitelistedByZoneAttachmentConstraint, attachment)) - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(WhitelistedByZoneAttachmentConstraint.canBeTransitionedFrom(AlwaysAcceptAttachmentConstraint, attachment)) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(WhitelistedByZoneAttachmentConstraint.canBeTransitionedFrom(HashAttachmentConstraint(SecureHash.randomSHA256()), attachment)) - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertFalse(WhitelistedByZoneAttachmentConstraint.canBeTransitionedFrom(SignatureAttachmentConstraint(ALICE_PUBKEY), attachment)) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertTrue(HashAttachmentConstraint(SecureHash.randomSHA256()).canBeTransitionedFrom(SignatureAttachmentConstraint(ALICE_PUBKEY), attachment)) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertTrue(HashAttachmentConstraint(SecureHash.randomSHA256()).canBeTransitionedFrom(WhitelistedByZoneAttachmentConstraint, attachment)) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertTrue(SignatureAttachmentConstraint(ALICE_PUBKEY).canBeTransitionedFrom(SignatureAttachmentConstraint(ALICE_PUBKEY), attachment)) - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertTrue(SignatureAttachmentConstraint(ALICE_PUBKEY).canBeTransitionedFrom(WhitelistedByZoneAttachmentConstraint, attachment)) - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$assertTrue(WhitelistedByZoneAttachmentConstraint.canBeTransitionedFrom(WhitelistedByZoneAttachmentConstraint, attachment)) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$attachment(Cash.PROGRAM_ID, SecureHash.allOnesHash, listOf(hashToSignatureConstraintsKey), mapOf(Attributes.Name.IMPLEMENTATION_VERSION.toString() to "1")) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$attachment(Cash.PROGRAM_ID, SecureHash.allOnesHash, listOf(hashToSignatureConstraintsKey), mapOf(Attributes.Name.IMPLEMENTATION_VERSION.toString() to "2")) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$attachment(Cash.PROGRAM_ID, SecureHash.allOnesHash, listOf(hashToSignatureConstraintsKey), mapOf(Attributes.Name.IMPLEMENTATION_VERSION.toString() to "3")) @@ -4957,82 +3221,41 @@ MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$output(noPropagationContractClassName, "c2", DUMMY_NOTARY, null, WhitelistedByZoneAttachmentConstraint, NoPropagationContractState()) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$output(noPropagationContractClassName, "c3", DUMMY_NOTARY, null, AutomaticPlaceholderConstraint, NoPropagationContractState()) MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests$val jarAndSigner = ContractJarTestUtils.signContractJar(cordapp.jarPath, copyFirst = true, keyStoreDir = keyStoreDir.path) - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests.<no name provided>$override fun loadContractAttachment(stateRef: StateRef) - MaxLineLength:ConstraintsPropagationTests.kt$ConstraintsPropagationTests.Companion$hashToSignatureConstraintsKey = keyStoreDir.path.generateKey("testAlias", "testPassword", ALICE_NAME.toString()) MaxLineLength:ConstraintsUtils.kt$ fun AttachmentConstraint.canBeTransitionedFrom(input: AttachmentConstraint, attachment: ContractAttachment): Boolean MaxLineLength:ConstraintsUtils.kt$ internal fun ContractClassName.contractHasAutomaticConstraintPropagation(classLoader: ClassLoader? = null): Boolean MaxLineLength:ConstraintsUtils.kt$HashAttachmentConstraint.disableHashConstraints && input is HashAttachmentConstraint && output is SignatureAttachmentConstraint -> true - MaxLineLength:ConstraintsUtils.kt$input is AutomaticHashConstraint || output is AutomaticHashConstraint -> throw IllegalArgumentException("Illegal constraint: AutomaticHashConstraint.") MaxLineLength:ConstraintsUtils.kt$input is AutomaticPlaceholderConstraint || output is AutomaticPlaceholderConstraint -> throw IllegalArgumentException("Illegal constraint: AutomaticPlaceholderConstraint.") - MaxLineLength:ConstraintsUtils.kt$log.warnOnce("Found state ${state.contract} that is constrained by the insecure: AlwaysAcceptAttachmentConstraint.") - MaxLineLength:ConstraintsUtils.kt$require(state.constraint::class in validConstraints) { "Found state ${state.contract} with an illegal constraint: ${state.constraint}" } - MaxLineLength:ConstraintsUtils.kt$val Attachment.contractVersion: Version get() = if (this is ContractAttachment) version else CordappImpl.DEFAULT_CORDAPP_VERSION - MaxLineLength:ConstraintsUtils.kt$when { // These branches should not happen, as this has been already checked. input is AutomaticPlaceholderConstraint || output is AutomaticPlaceholderConstraint -> throw IllegalArgumentException("Illegal constraint: AutomaticPlaceholderConstraint.") input is AutomaticHashConstraint || output is AutomaticHashConstraint -> throw IllegalArgumentException("Illegal constraint: AutomaticHashConstraint.") // Transition to the same constraint. input == output -> true // You can't transition from the AlwaysAcceptAttachmentConstraint to anything else, as it could hide something illegal. input is AlwaysAcceptAttachmentConstraint && output !is AlwaysAcceptAttachmentConstraint -> false // Nothing can be migrated from the HashConstraint except a HashConstraint with the same Hash. (This check is redundant, but added for clarity) input is HashAttachmentConstraint && output is HashAttachmentConstraint -> input == output // Anything (except the AlwaysAcceptAttachmentConstraint) can be transformed to a HashAttachmentConstraint. input !is HashAttachmentConstraint && output is HashAttachmentConstraint -> true // The SignatureAttachmentConstraint allows migration from a Signature constraint with the same key. // TODO - we don't support currently third party signers. When we do, the output key will have to be stronger then the input key. input is SignatureAttachmentConstraint && output is SignatureAttachmentConstraint -> input.key == output.key // HashAttachmentConstraint can be transformed to a SignatureAttachmentConstraint when hash constraint verification checking disabled. HashAttachmentConstraint.disableHashConstraints && input is HashAttachmentConstraint && output is SignatureAttachmentConstraint -> true // You can transition from the WhitelistConstraint to the SignatureConstraint only if all signers of the JAR are required to sign in the future. input is WhitelistedByZoneAttachmentConstraint && output is SignatureAttachmentConstraint -> attachment.signerKeys.isNotEmpty() && output.key.keys.containsAll(attachment.signerKeys) else -> false } - MaxLineLength:ContentSignerBuilder.kt$ContentSignerBuilder$fun build(signatureScheme: SignatureScheme, privateKey: PrivateKey, provider: Provider, random: SecureRandom? = null): ContentSigner - MaxLineLength:Context.kt$Context - MaxLineLength:ContractAttachment.kt$ContractAttachment : Attachment + MaxLineLength:ConstraintsUtils.kt$input.isAutomaticHashConstraint() || output.isAutomaticHashConstraint() -> throw IllegalArgumentException("Illegal constraint: AutomaticHashConstraint.") + MaxLineLength:ConstraintsUtils.kt$when { // These branches should not happen, as this has been already checked. input is AutomaticPlaceholderConstraint || output is AutomaticPlaceholderConstraint -> throw IllegalArgumentException("Illegal constraint: AutomaticPlaceholderConstraint.") input.isAutomaticHashConstraint() || output.isAutomaticHashConstraint() -> throw IllegalArgumentException("Illegal constraint: AutomaticHashConstraint.") // Transition to the same constraint. input == output -> true // You can't transition from the AlwaysAcceptAttachmentConstraint to anything else, as it could hide something illegal. input is AlwaysAcceptAttachmentConstraint && output !is AlwaysAcceptAttachmentConstraint -> false // Nothing can be migrated from the HashConstraint except a HashConstraint with the same Hash. (This check is redundant, but added for clarity) input is HashAttachmentConstraint && output is HashAttachmentConstraint -> input == output // Anything (except the AlwaysAcceptAttachmentConstraint) can be transformed to a HashAttachmentConstraint. input !is HashAttachmentConstraint && output is HashAttachmentConstraint -> true // The SignatureAttachmentConstraint allows migration from a Signature constraint with the same key. // TODO - we don't support currently third party signers. When we do, the output key will have to be stronger then the input key. input is SignatureAttachmentConstraint && output is SignatureAttachmentConstraint -> input.key == output.key // HashAttachmentConstraint can be transformed to a SignatureAttachmentConstraint when hash constraint verification checking disabled. HashAttachmentConstraint.disableHashConstraints && input is HashAttachmentConstraint && output is SignatureAttachmentConstraint -> true // You can transition from the WhitelistConstraint to the SignatureConstraint only if all signers of the JAR are required to sign in the future. input is WhitelistedByZoneAttachmentConstraint && output is SignatureAttachmentConstraint -> attachment.signerKeys.isNotEmpty() && output.key.keys.containsAll(attachment.signerKeys) else -> false } MaxLineLength:ContractAttachment.kt$ContractAttachment$return "ContractAttachment(attachment=${attachment.id}, contracts='$allContracts', uploader='$uploader', signed='$isSigned', version='$version')" - MaxLineLength:ContractAttachment.kt$ContractAttachment$uploader: String? = null - MaxLineLength:ContractAttachmentSerializer.kt$ContractAttachmentSerializer$return ContractAttachment.create(proxy.attachment, proxy.contract, proxy.contracts, proxy.uploader, proxy.signers, proxy.version) MaxLineLength:ContractAttachmentSerializer.kt$ContractAttachmentSerializer$return ContractAttachmentProxy(GeneratedAttachment(bytes, obj.uploader), obj.contract, obj.additionalContracts, obj.uploader, obj.signerKeys, obj.version) MaxLineLength:ContractAttachmentSerializer.kt$ContractAttachmentSerializer.ContractAttachmentProxy$@KeepForDJVM data - MaxLineLength:ContractAttachmentSerializerTest.kt$ContractAttachmentSerializerTest$val contractAttachment = ContractAttachment(GeneratedAttachment(EMPTY_BYTE_ARRAY, "test"), DummyContract.PROGRAM_ID) - MaxLineLength:ContractFunctions.kt$fun swap(partyA: Party, amountA: BigDecimal, currencyA: Currency, partyB: Party, amountB: BigDecimal, currencyB: Currency) - MaxLineLength:ContractFunctions.kt$swap(partyA, BigDecimal(notional * strike), domesticCurrency, partyB, BigDecimal(notional), foreignCurrency) MaxLineLength:ContractHierarchyTest.kt$ContractHierarchyTest$PrepareTransaction : FlowLogic - MaxLineLength:ContractHierarchyTest.kt$ContractHierarchyTest$aliceNode.services.startFlow(PrepareTransaction(bob, notary, IndirectContract.State())).resultFuture.getOrThrow() MaxLineLength:ContractHierarchyTest.kt$ContractHierarchyTest$mockNet = InternalMockNetwork(networkSendManuallyPumped = false, threadPerNode = true, cordappsForAllNodes = listOf(enclosedCordapp())) - MaxLineLength:ContractHierarchyTest.kt$ContractHierarchyTest.PrepareTransaction$val command = Command(IndirectContract.Create(), listOf(serviceHub.myInfo.singleIdentity().owningKey, otherSide.owningKey)) - MaxLineLength:ContractHierarchyTest.kt$ContractHierarchyTest.PrepareTransaction$val txB = TransactionBuilder(notary = notary, outputs = mutableListOf(txState), commands = mutableListOf(command)) - MaxLineLength:ContractJarTestUtils.kt$ContractJarTestUtils$@JvmOverloads fun makeTestContractJar(workingDir: Path, contractName: String, signed: Boolean = false, version: Int = 1, versionSeed: Int = 0): Path MaxLineLength:ContractJarTestUtils.kt$ContractJarTestUtils$@JvmOverloads fun makeTestContractJar(workingDir: Path, contractNames: List<String>, signed: Boolean = false, version: Int = 1, generateManifest: Boolean = true, jarFileName : String? = null): Path - MaxLineLength:ContractJarTestUtils.kt$ContractJarTestUtils$@JvmOverloads fun makeTestSignedContractJar(workingDir: Path, contractName: String, version: Int = 1, versionSeed: Int = 0): Pair<Path, PublicKey> MaxLineLength:ContractJarTestUtils.kt$ContractJarTestUtils$fun signContractJar(jarURL: URL, copyFirst: Boolean, keyStoreDir: Path? = null, alias: String = "testAlias", pwd: String = "testPassword"): Pair<Path, PublicKey> - MaxLineLength:ContractJarTestUtils.kt$ContractJarTestUtils$private - MaxLineLength:ContractJarTestUtils.kt$ContractJarTestUtils$val outFile = fileManager.getFileForInput(StandardLocation.CLASS_OUTPUT, packages.joinToString("."), "$className.class") MaxLineLength:ContractJarTestUtils.kt$ContractJarTestUtils$val source = object : SimpleJavaFileObject(URI.create("string:///${packages.joinToString("/")}/$className.java"), JavaFileObject.Kind.SOURCE) { override fun getCharContent(ignoreEncodingErrors: Boolean): CharSequence { return newClass } } MaxLineLength:ContractStateModel.kt$ContractStateModel$val cashStates: ObservableList<StateAndRef<Cash.State>> = cashStatesDiff.fold(FXCollections.observableArrayList()) { list: MutableList<StateAndRef<Cash.State>>, (added, removed) -> list.removeIf { it in removed } list.addAll(added) }.distinctBy { it.ref } - MaxLineLength:ContractUpgradeFlow.kt$ContractUpgradeFlow$Authorise : FlowLogic MaxLineLength:ContractUpgradeFlow.kt$ContractUpgradeFlow.Initiate$( originalState: StateAndRef<OldState>, newContractClass: Class<out UpgradedContract<OldState, NewState>> ) MaxLineLength:ContractUpgradeFlow.kt$ContractUpgradeFlow.Initiate$val signableData = SignableData(tx.id, SignatureMetadata(serviceHub.myInfo.platformVersion, Crypto.findSignatureScheme(myKey).schemeNumberID)) - MaxLineLength:ContractUpgradeFlowRPCTest.kt$ContractUpgradeFlowRPCTest$has<ContractUpgradeLedgerTransaction, Any>("input data", { it.inputs.single().state.data }, isA<T>(anything)) - MaxLineLength:ContractUpgradeFlowRPCTest.kt$ContractUpgradeFlowRPCTest.Companion$private val classMockNet = InternalMockNetwork(cordappsForAllNodes = listOf(DUMMY_CONTRACTS_CORDAPP, enclosedCordapp())) - MaxLineLength:ContractUpgradeFlowTest.kt$ContractUpgradeFlowTest$and - MaxLineLength:ContractUpgradeFlowTest.kt$ContractUpgradeFlowTest$has<ContractUpgradeLedgerTransaction, Any>("input data", { it.inputs.single().state.data }, isA<T>(anything)) - MaxLineLength:ContractUpgradeFlowTest.kt$ContractUpgradeFlowTest${ // Create dummy contract. val signedByA = aliceNode.signDummyContract(alice.ref(1), 0, bob.ref(1)) val stx = bobNode.addSignatureTo(signedByA) aliceNode.finalise(stx, bob) val aliceTx = aliceNode.getValidatedTransaction(stx) val bobTx = bobNode.getValidatedTransaction(stx) // The request is expected to be rejected because party B hasn't authorised the upgrade yet. assertThat( aliceNode.initiateContractUpgrade(aliceTx, DummyContractV2::class), willThrow<UnexpectedFlowEndException>()) // Party B authorises the contract state upgrade, and immediately de-authorises the same. assertThat(bobNode.authoriseContractUpgrade(bobTx, DummyContractV2::class), willReturn()) assertThat(bobNode.deauthoriseContractUpgrade(bobTx), willReturn()) // The request is expected to be rejected because party B has subsequently de-authorised a previously authorised upgrade. assertThat( aliceNode.initiateContractUpgrade(aliceTx, DummyContractV2::class), willThrow<UnexpectedFlowEndException>()) // Party B authorises the contract state upgrade. assertThat(bobNode.authoriseContractUpgrade(bobTx, DummyContractV2::class), willReturn()) // Party A initiates contract upgrade flow, expected to succeed this time. assertThat( aliceNode.initiateContractUpgrade(aliceTx, DummyContractV2::class), willReturn( aliceNode.hasContractUpgradeTransaction<DummyContract.State, DummyContractV2.State>() and bobNode.hasContractUpgradeTransaction<DummyContract.State, DummyContractV2.State>())) val upgradedState = aliceNode.getStateFromVault(DummyContractV2.State::class) // We now test that the upgraded state can be upgraded further, to V3. // Party B authorises the contract state upgrade. assertThat(bobNode.authoriseContractUpgrade(upgradedState, DummyContractV3::class), willReturn()) // Party A initiates contract upgrade flow which is expected to succeed. assertThat( aliceNode.initiateContractUpgrade(upgradedState, DummyContractV3::class), willReturn( aliceNode.hasContractUpgradeTransaction<DummyContractV2.State, DummyContractV3.State>() and bobNode.hasContractUpgradeTransaction<DummyContractV2.State, DummyContractV3.State>())) } - MaxLineLength:ContractUpgradeFlowTest.kt$ContractUpgradeFlowTest.CashV2.State$@BelongsToContract(CashV2::class) data - MaxLineLength:ContractUpgradeFlowTest.kt$ContractUpgradeFlowTest.CashV2.State$override fun withNewOwner(newOwner: AbstractParty) MaxLineLength:ContractUpgradeFlowTest.kt$ContractUpgradeFlowTest.CashV2.State$override fun withNewOwnerAndAmount(newAmount: Amount<Issued<Currency>>, newOwner: AbstractParty) MaxLineLength:ContractUpgradeFlowTest.kt$ContractUpgradeFlowTest.Companion$private val classMockNet = InternalMockNetwork(cordappsForAllNodes = listOf(FINANCE_CONTRACTS_CORDAPP, DUMMY_CONTRACTS_CORDAPP, enclosedCordapp())) - MaxLineLength:ContractUpgradeServiceImpl.kt$ContractUpgradeServiceImpl : ContractUpgradeServiceSingletonSerializeAsToken - MaxLineLength:ContractUpgradeServiceImpl.kt$ContractUpgradeServiceImpl$override - MaxLineLength:ContractUpgradeServiceImpl.kt$ContractUpgradeServiceImpl.Companion$fun createContractUpgradesMap(cacheFactory: NamedCacheFactory): PersistentMap<String, String, DBContractUpgrade, String> MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeFilteredTransaction : CoreTransaction - MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction$( inputs: List<StateAndRef<ContractState>> = this.inputs, notary: Party = this.notary, legacyContractAttachment: Attachment = this.legacyContractAttachment, upgradedContractClassName: ContractClassName = this.upgradedContract::class.java.name, upgradedContractAttachment: Attachment = this.upgradedContractAttachment, id: SecureHash = this.id, privacySalt: PrivacySalt = this.privacySalt, sigs: List<TransactionSignature> = this.sigs, networkParameters: NetworkParameters = this.networkParameters ) MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction$( inputs: List<StateAndRef<ContractState>>, notary: Party, legacyContractAttachment: Attachment, upgradedContractClassName: ContractClassName, upgradedContractAttachment: Attachment, id: SecureHash, privacySalt: PrivacySalt, sigs: List<TransactionSignature>, networkParameters: NetworkParameters ) MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction$?: - MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction$@Deprecated("ContractUpgradeLedgerTransaction should not be created directly, use ContractUpgradeWireTransaction.resolve instead.") + MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction$ContractUpgradeLedgerTransaction(inputs, notary, legacyContractAttachment, upgradedContractClassName, upgradedContractAttachment, id, privacySalt, sigs, networkParameters) MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction$override - MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction$override fun equals(other: Any?): Boolean MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction$return "ContractUpgradeLedgerTransaction(inputs=$inputs, notary=$notary, legacyContractAttachment=$legacyContractAttachment, upgradedContractAttachment=$upgradedContractAttachment, id=$id, privacySalt=$privacySalt, sigs=$sigs, networkParameters=$networkParameters, upgradedContract=$upgradedContract, references=$references, legacyContractClassName='$legacyContractClassName', outputs=$outputs)" MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction.Companion$@CordaInternal internal MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction.Companion$return ContractUpgradeLedgerTransaction(inputs, notary, legacyContractAttachment, upgradedContractAttachment, id, privacySalt, sigs, networkParameters, upgradedContract) - MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeLedgerTransaction.Companion$val cordappLoader = services.cordappProvider::class.java.getMethod("getCordappLoader").invoke(services.cordappProvider) - MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$ @CordaInternal internal fun resolveOutputComponent(services: ServicesForResolution, stateRef: StateRef, params: NetworkParameters): SerializedBytes<TransactionState<ContractState>> MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$ fun buildFilteredTransaction(): ContractUpgradeFilteredTransaction MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$@CordaInternal internal - MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$PARAMETERS_HASH.ordinal to FilteredComponent(serializedComponents[PARAMETERS_HASH.ordinal], nonces[PARAMETERS_HASH.ordinal]) - MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$classLoader.loadClass(className).asSubclass(UpgradedContract::class.java).newInstance() as UpgradedContract<ContractState, ContractState> + MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$classLoader.loadClass(className).asSubclass(UpgradedContract::class.java).getDeclaredConstructor().newInstance() as UpgradedContract<ContractState, ContractState> MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$private MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$val binaryInput: SerializedBytes<TransactionState<ContractState>> = resolveStateRefBinaryComponent(inputs[stateRef.index], services)!! - MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$val legacyContractAttachmentId: SecureHash by lazy { serializedComponents[LEGACY_ATTACHMENT.ordinal].deserialize<SecureHash>() } - MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$val resolvedNetworkParameters = services.networkParametersService.lookup(hashToResolve) ?: throw TransactionResolutionException(id) - MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$val upgradedContractAttachmentId: SecureHash by lazy { serializedComponents[UPGRADED_ATTACHMENT.ordinal].deserialize<SecureHash>() } MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$val upgradedContractClassName: ContractClassName by lazy { serializedComponents[UPGRADED_CONTRACT.ordinal].deserialize<ContractClassName>() } MaxLineLength:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction.Companion$@CordaInternal internal MaxLineLength:ContractsDSL.kt$inline - MaxLineLength:ContractsDSL.kt$mapNotNull { if (klass.isInstance(it.value)) uncheckedCast<CommandWithParties<CommandData>, CommandWithParties<C>>(it) else null } - MaxLineLength:ContractsDSLTests.kt$RequireSingleCommandTests MaxLineLength:ContractsDSLTests.kt$RequireSingleCommandTests.Companion$arrayOf<Any>({ commands: Collection<CommandWithParties<CommandData>> -> commands.requireSingleCommand(TestCommands::class.java) }, "Interop version") MaxLineLength:ContractsDSLTests.kt$RequireSingleCommandTests.Companion$arrayOf<Any>({ commands: Collection<CommandWithParties<CommandData>> -> commands.requireSingleCommand<TestCommands>() }, "Inline version") MaxLineLength:ContractsDSLTests.kt$SelectWithMultipleInputsTests @@ -5042,17 +3265,11 @@ MaxLineLength:ContractsDSLTests.kt$SelectWithSingleInputsTests.Companion$arrayOf<Any>({ commands: Collection<CommandWithParties<CommandData>>, signer: PublicKey?, party: AbstractParty? -> commands.select(TestCommands::class.java, signer, party) }, "Interop version") MaxLineLength:ContractsDSLTests.kt$SelectWithSingleInputsTests.Companion$arrayOf<Any>({ commands: Collection<CommandWithParties<CommandData>>, signer: PublicKey?, party: AbstractParty? -> commands.select<TestCommands>(signer, party) }, "Inline version") MaxLineLength:ContractsDSLTests.kt$val validCommandOne = CommandWithParties(listOf(megaCorp.publicKey, miniCorp.publicKey), listOf(megaCorp.party, miniCorp.party), TestCommands.CommandOne()) - MaxLineLength:ContractsScanning.kt$// When scanning of the CorDapp Jar is performed without "corda-core.jar" being in the classpath, there is no way to appreciate // relationships between those interfaces, therefore they have to be listed explicitly. val coreContractClasses = setOf(Contract::class, UpgradedContractWithLegacyConstraint::class, UpgradedContract::class) - MaxLineLength:Converters.kt$CordaConverterProvider$override - MaxLineLength:CopiedNode.kt$CopiedNode$return BuiltNode(this.configFile, this.baseDirectory, this.copiedNodeConfig, this.copiedNodeDir, nodeConfig, localImageId) - MaxLineLength:CorDappInfoServlet.kt$CorDappInfoServlet$private MaxLineLength:CordaAuthenticationPlugin.kt$CordaAuthenticationPlugin : CRaSHPluginAuthenticationPlugin MaxLineLength:CordaClassResolver.kt$CordaClassResolver$// We don't allow the annotation for classes in attachments for now. The class will be on the main classpath if we have the CorDapp installed. // We also do not allow extension of KryoSerializable for annotated classes, or combination with @DefaultSerializer for custom serialisation. // TODO: Later we can support annotations on attachment classes and spin up a proxy via bytecode that we know is harmless. private fun checkForAnnotation(type: Class<*>): Boolean MaxLineLength:CordaClassResolver.kt$CordaClassResolver$if (type.isPrimitive || type == Any::class.java || type == String::class.java || (!type.isEnum && isAbstract(type.modifiers))) return null MaxLineLength:CordaClassResolver.kt$CordaClassResolver$kotlin.jvm.internal.Lambda::class.java.isAssignableFrom(targetType) - MaxLineLength:CordaClassResolver.kt$CordaClassResolver$throw KryoException("Class ${Util.className(type)} is not annotated or on the whitelist, so cannot be used in serialization") MaxLineLength:CordaClassResolver.kt$CordaClassResolver${ // If call path has disabled whitelisting (see [CordaKryo.register]), just return without checking. if (!whitelistEnabled) return null // If array, recurse on element type if (type.isArray) return checkClass(type.componentType) // Specialised enum entry, so just resolve the parent Enum type since cannot annotate the specialised entry. if (!type.isEnum && Enum::class.java.isAssignableFrom(type)) return checkClass(type.superclass) // Allow primitives, abstracts and interfaces. Note that we can also create abstract Enum types, // but we don't want to whitelist those here. if (type.isPrimitive || type == Any::class.java || type == String::class.java || (!type.isEnum && isAbstract(type.modifiers))) return null // It's safe to have the Class already, since Kryo loads it with initialisation off. // If we use a whitelist with blacklisting capabilities, whitelist.hasListed(type) may throw an IllegalStateException if input class is blacklisted. // Thus, blacklisting precedes annotation checking. if (!whitelist.hasListed(type) && !checkForAnnotation(type)) { throw KryoException("Class ${Util.className(type)} is not annotated or on the whitelist, so cannot be used in serialization") } return null } - MaxLineLength:CordaClassResolver.kt$CordaClassResolver${ val targetType = typeForSerializationOf(type) val objectInstance = targetType.kotlinObjectInstance // We have to set reference to true, since the flag influences how String fields are treated and we want it to be consistent. val references = kryo.references try { kryo.references = true val serializer = when { objectInstance != null -> KotlinObjectSerializer(objectInstance) kotlin.jvm.internal.Lambda::class.java.isAssignableFrom(targetType) -> // Kotlin lambdas extend this class and any captured variables are stored in synthetic fields FieldSerializer<Any>(kryo, targetType).apply { setIgnoreSyntheticFields(false) } Throwable::class.java.isAssignableFrom(targetType) -> ThrowableSerializer(kryo, targetType) else -> kryo.getDefaultSerializer(targetType) } return register(Registration(targetType, serializer, NAME.toInt())) } finally { kryo.references = references } } MaxLineLength:CordaClassResolverTests.kt$CordaClassResolverTests$expectedEx.expectMessage("The superclass java.util.HashSet of net.corda.serialization.internal.CordaClassResolverTests\$CordaSerializableHashSet is blacklisted, so it cannot be used in serialization.") MaxLineLength:CordaClassResolverTests.kt$CordaClassResolverTests$expectedEx.expectMessage("The superclass java.util.HashSet of net.corda.serialization.internal.CordaClassResolverTests\$SubHashSet is blacklisted, so it cannot be used in serialization.") MaxLineLength:CordaClassResolverTests.kt$CordaClassResolverTests$expectedEx.expectMessage("The superclass java.util.HashSet of net.corda.serialization.internal.CordaClassResolverTests\$SubSubHashSet is blacklisted, so it cannot be used in serialization.") @@ -5061,189 +3278,69 @@ MaxLineLength:CordaClassResolverTests.kt$CordaClassResolverTests$private fun importJar(storage: AttachmentStorage, uploader: String = DEPLOYED_CORDAPP_UPLOADER) MaxLineLength:CordaClassResolverTests.kt$CordaClassResolverTests$private val allButBlacklistedContext: CheckpointSerializationContext = CheckpointSerializationContextImpl(this.javaClass.classLoader, AllButBlacklisted, emptyMap(), true, null) MaxLineLength:CordaClassResolverTests.kt$CordaClassResolverTests$private val emptyWhitelistContext: CheckpointSerializationContext = CheckpointSerializationContextImpl(this.javaClass.classLoader, EmptyWhitelist, emptyMap(), true, null) - MaxLineLength:CordaClassResolverTests.kt$CordaClassResolverTests$val classLoader = AttachmentsClassLoader(arrayOf(attachmentHash).map { storage.openAttachment(it)!! }, testNetworkParameters(), SecureHash.zeroHash, { isAttachmentTrusted(it, storage) }) - MaxLineLength:CordaCliWrapper.kt$CliWrapperBase$// Override this function with the actual method to be run once all the arguments have been parsed. The return number // is the exit code to be returned abstract fun runProgram(): Int - MaxLineLength:CordaCliWrapper.kt$CliWrapperBase$// Raw args are provided for use in logging - this is a lateinit var rather than a constructor parameter as the class // needs to be parameterless for autocomplete to work. lateinit var args: Array<String> - MaxLineLength:CordaCliWrapper.kt$CliWrapperBase$// This needs to be called before loggers (See: NodeStartup.kt:51 logger called by lazy, initLogging happens before). // Node's logging is more rich. In corda configurations two properties, defaultLoggingLevel and consoleLogLevel, are usually used. open fun initLogging(): Boolean - MaxLineLength:CordaCliWrapper.kt$CliWrapperBase$@Option(names = ["-v", "--verbose", "--log-to-console"], description = ["If set, prints logging to the console as well as to a file."]) - MaxLineLength:CordaCliWrapper.kt$CliWrapperBase$System.setProperty("defaultLogLevel", specifiedLogLevel) - MaxLineLength:CordaCliWrapper.kt$CordaCliWrapper : CliWrapperBase - MaxLineLength:CordaCliWrapper.kt$DefaultExceptionHandler<List<Any>>().useErr(System.err).useAnsi(defaultAnsiMode).andExit(ExitCodes.FAILURE) - MaxLineLength:CordaCliWrapper.kt$Validated - MaxLineLength:CordaCliWrapper.kt${ val defaultAnsiMode = if (CordaSystemUtils.isOsWindows()) { Help.Ansi.ON } else { Help.Ansi.AUTO } val results = cmd.parseWithHandlers(RunLast().useOut(System.out).useAnsi(defaultAnsiMode), DefaultExceptionHandler<List<Any>>().useErr(System.err).useAnsi(defaultAnsiMode).andExit(ExitCodes.FAILURE), *args) // If an error code has been returned, use this and exit results?.firstOrNull()?.let { if (it is Int) { exitProcess(it) } else { exitProcess(ExitCodes.FAILURE) } } // If no results returned, picocli ran something without invoking the main program, e.g. --help or --version, so exit successfully exitProcess(ExitCodes.SUCCESS) } - MaxLineLength:CordaClock.kt$CordaClock$@Deprecated("Do not use this. Instead seek to use ZonedDateTime methods.", level = DeprecationLevel.ERROR) override - MaxLineLength:CordaClock.kt$MutableClock$ protected fun notifyMutationObservers() + MaxLineLength:CordaClassResolverTests.kt$CordaClassResolverTests$val classLoader = AttachmentsClassLoader(arrayOf(attachmentHash).map { storage.openAttachment(it)!! }, testNetworkParameters(), SecureHash.zeroHash, { attachmentTrustCalculator.calculate(it) }) MaxLineLength:CordaClosureSerializer.kt$CordaClosureSerializer$const val ERROR_MESSAGE = "Unable to serialize Java Lambda expression, unless explicitly declared e.g., Runnable r = (Runnable & Serializable) () -> System.out.println(\"Hello world!\");" - MaxLineLength:CordaException.kt$CordaException$if (originalMessage == null) "$originalExceptionClassName" else "$originalExceptionClassName: $originalMessage" - MaxLineLength:CordaException.kt$CordaException$private var _cause: Throwable? = null - MaxLineLength:CordaException.kt$CordaRuntimeException$if (originalMessage == null) "$originalExceptionClassName" else "$originalExceptionClassName: $originalMessage" - MaxLineLength:CordaException.kt$CordaRuntimeException$private var _cause: Throwable? - MaxLineLength:CordaExceptionTest.kt$CordaExceptionTest$val ex = assertFailsWith<ConflictingAttachmentsRejection> { throw ConflictingAttachmentsRejection(TX_ID, CONTRACT_CLASS) } - MaxLineLength:CordaExceptionTest.kt$CordaExceptionTest$val ex = assertFailsWith<NotaryChangeInWrongTransactionType> { throw NotaryChangeInWrongTransactionType(TX_ID, ALICE, BOB) } MaxLineLength:CordaFuture.kt$CordaFuture<V> : Future MaxLineLength:CordaFutureImpl.kt$ fun <ELEMENT> CordaFuture<out ELEMENT>.mapError(transform: (Throwable) -> Throwable): CordaFuture<ELEMENT> MaxLineLength:CordaFutureImpl.kt$ fun <RESULT> CordaFuture<out RESULT>.doOnError(accept: (Throwable) -> Unit): CordaFuture<RESULT> - MaxLineLength:CordaFutureImpl.kt$ fun <V, W, X> CordaFuture<out V>.thenMatch(success: (V) -> W, failure: (Throwable) -> X) - MaxLineLength:CordaFutureImpl.kt$ fun <V, W> CordaFuture<out V>.flatMap(transform: (V) -> CordaFuture<out W>): CordaFuture<W> - MaxLineLength:CordaFutureImpl.kt$CordaFutureImpl$@VisibleForTesting internal - MaxLineLength:CordaFutureImpl.kt$internal fun <V> Future<V>.get(timeout: Duration? = null): V - MaxLineLength:CordaInternal.kt$CordaInternal - MaxLineLength:CordaMigration.kt$CordaMigration : CustomTaskChange MaxLineLength:CordaMigration.kt$CordaMigration$_servicesForResolution = MigrationServicesForResolution(identityService, attachmentsService, dbTransactions, cordaDB, cacheFactory) - MaxLineLength:CordaMigration.kt$CordaMigration$return CordaPersistence(configDefaults, schema, jdbcUrl, cacheFactory, attributeConverters, closeConnection = false) - MaxLineLength:CordaMigration.kt$CordaMigration${ val configDefaults = DatabaseConfig() val attributeConverters = listOf( PublicKeyToTextConverter(), AbstractPartyToX500NameAsStringConverter( identityService::wellKnownPartyFromX500Name, identityService::wellKnownPartyFromAnonymous) ) // Liquibase handles closing the database connection when migrations are finished. If the connection is closed here, then further // migrations may fail. return CordaPersistence(configDefaults, schema, jdbcUrl, cacheFactory, attributeConverters, closeConnection = false) } MaxLineLength:CordaModule.kt$AmountBeanDeserializerModifier$override MaxLineLength:CordaModule.kt$CordaModule${ super.setupModule(context) // For classes which are annotated with CordaSerializable we want to use the same set of properties as the Corda serilasation scheme. // To do that we use CordaSerializableClassIntrospector to first turn on field visibility for these classes (the Jackson default is // private fields are not included) and then we use CordaSerializableBeanSerializerModifier to remove any extra properties that Jackson // might pick up. context.setClassIntrospector(CordaSerializableClassIntrospector(context)) context.addBeanSerializerModifier(CordaSerializableBeanSerializerModifier()) context.addBeanDeserializerModifier(AmountBeanDeserializerModifier()) context.setMixInAnnotations(PartyAndCertificate::class.java, PartyAndCertificateMixin::class.java) context.setMixInAnnotations(NetworkHostAndPort::class.java, NetworkHostAndPortMixin::class.java) context.setMixInAnnotations(CordaX500Name::class.java, CordaX500NameMixin::class.java) context.setMixInAnnotations(Amount::class.java, AmountMixin::class.java) context.setMixInAnnotations(AbstractParty::class.java, AbstractPartyMixin::class.java) context.setMixInAnnotations(AnonymousParty::class.java, AnonymousPartyMixin::class.java) context.setMixInAnnotations(Party::class.java, PartyMixin::class.java) context.setMixInAnnotations(PublicKey::class.java, PublicKeyMixin::class.java) context.setMixInAnnotations(ByteSequence::class.java, ByteSequenceMixin::class.java) context.setMixInAnnotations(SecureHash.SHA256::class.java, SecureHashSHA256Mixin::class.java) context.setMixInAnnotations(SecureHash::class.java, SecureHashSHA256Mixin::class.java) context.setMixInAnnotations(SerializedBytes::class.java, SerializedBytesMixin::class.java) context.setMixInAnnotations(DigitalSignature.WithKey::class.java, ByteSequenceWithPropertiesMixin::class.java) context.setMixInAnnotations(DigitalSignatureWithCert::class.java, ByteSequenceWithPropertiesMixin::class.java) context.setMixInAnnotations(TransactionSignature::class.java, ByteSequenceWithPropertiesMixin::class.java) context.setMixInAnnotations(SignedTransaction::class.java, SignedTransactionMixin::class.java) context.setMixInAnnotations(WireTransaction::class.java, WireTransactionMixin::class.java) context.setMixInAnnotations(TransactionState::class.java, TransactionStateMixin::class.java) context.setMixInAnnotations(Command::class.java, CommandMixin::class.java) context.setMixInAnnotations(TimeWindow::class.java, TimeWindowMixin::class.java) context.setMixInAnnotations(PrivacySalt::class.java, PrivacySaltMixin::class.java) context.setMixInAnnotations(SignatureScheme::class.java, SignatureSchemeMixin::class.java) context.setMixInAnnotations(SignatureMetadata::class.java, SignatureMetadataMixin::class.java) context.setMixInAnnotations(PartialTree::class.java, PartialTreeMixin::class.java) context.setMixInAnnotations(NodeInfo::class.java, NodeInfoMixin::class.java) context.setMixInAnnotations(StateMachineRunId::class.java, StateMachineRunIdMixin::class.java) } - MaxLineLength:CordaModule.kt$CordaSerializableBeanSerializerModifier$// We need to pass in a SerializerFactory when scanning for properties, but don't actually do any serialisation so any will do. private val serializerFactory = SerializerFactoryBuilder.build(AllWhitelist, javaClass.classLoader) - MaxLineLength:CordaModule.kt$CordaSerializableBeanSerializerModifier$val propertyNames = typeInformation.propertiesOrEmptyMap.mapNotNull { if (it.value.isCalculated) null else it.key } - MaxLineLength:CordaModule.kt$CordaSerializableClassIntrospector$context.configOverride(type.rawClass).visibility = Value.defaultVisibility().withFieldVisibility(Visibility.ANY) - MaxLineLength:CordaModule.kt$NetworkHostAndPortDeserializer : SimpleDeserializer - MaxLineLength:CordaModule.kt$SignatureSchemeDeserializer$signatureSchemesByNumberID[parser.intValue] ?: throw JsonParseException(parser, "Unable to find SignatureScheme ${parser.text}") - MaxLineLength:CordaModule.kt$SignedTransactionDeserializer$val core = wrapper.run { wire ?: filtered ?: notaryChangeWire ?: contractUpgradeWire ?: contractUpgradeFiltered!! } MaxLineLength:CordaModule.kt$StxJson$val count = Booleans.countTrue(wire != null, filtered != null, notaryChangeWire != null, contractUpgradeWire != null, contractUpgradeFiltered != null) - MaxLineLength:CordaPersistence.kt$// Add the subscriber to the wrapping subscriber, which will invoke the original subscribers together inside a database transaction. wrappingSubscriber.delegates.add(toBeWrappedInDbTx) // If we are the first subscriber, return the shared subscriber, otherwise return a subscriber that does nothing. if (wrappingSubscriber.delegates.size == 1) wrappingSubscriber else NoOpSubscriber(toBeWrappedInDbTx) // Clean up the shared list of subscribers when they unsubscribe. - MaxLineLength:CordaPersistence.kt$CordaPersistence$ fun <T> transaction(isolationLevel: TransactionIsolationLevel, recoverableFailureTolerance: Int, recoverAnyNestedSQLException: Boolean, statement: DatabaseTransaction.() -> T): T - MaxLineLength:CordaPersistence.kt$CordaPersistence$ fun <T> transaction(recoverableFailureTolerance: Int, statement: DatabaseTransaction.() -> T): T - MaxLineLength:CordaPersistence.kt$CordaPersistence$HibernateConfiguration(schemas, databaseConfig, attributeConverters, jdbcUrl, cacheFactory, customClassLoader) + MaxLineLength:CordaPersistence.kt$CordaPersistence$@Suppress("UNCHECKED_CAST") val connectionBag: ConcurrentBag<ConcurrentBag.IConcurrentBagEntry> = connectionBagField.get(pool) as ConcurrentBag<ConcurrentBag.IConcurrentBagEntry> MaxLineLength:CordaPersistence.kt$CordaPersistence$error("Was not expecting to find existing database transaction on current strand when setting database: ${Strand.currentStrand()}, $it") MaxLineLength:CordaPersistence.kt$CordaPersistence$is SchemaManagementException -> throw HibernateSchemaChangeException("Incompatible schema change detected. Please run the node with database.initialiseSchema=true. Reason: ${e.message}", e) - MaxLineLength:CordaPersistence.kt$CordaPersistence$recoverAnyNestedSQLException: Boolean - MaxLineLength:CordaPersistence.kt$CordaPersistence$val connectionBag: ConcurrentBag<ConcurrentBag.IConcurrentBagEntry> = connectionBagField.get(pool) as ConcurrentBag<ConcurrentBag.IConcurrentBagEntry> MaxLineLength:CordaPersistence.kt$CordaPersistence$val transaction = contextDatabase.currentOrNew(isolationLevel) // XXX: Does this code really support statement changing the contextDatabase? - MaxLineLength:CordaPersistence.kt$CordaPersistence${ // DataSource doesn't implement AutoCloseable so we just have to hope that the implementation does so that we can close it (_dataSource as? AutoCloseable)?.close() } - MaxLineLength:CordaPersistence.kt$CordaPersistence${ // We need to set the database for the current [Thread] or [Fiber] here as some tests share threads across databases. _contextDatabase.set(this) currentDBSession().flush() return contextTransaction.connection } - MaxLineLength:CordaPersistence.kt$CordaPersistence${ // We need to set the database for the current [Thread] or [Fiber] here as some tests share threads across databases. _contextDatabase.set(this) return currentOrNew(isolationLevel) } - MaxLineLength:CordaPersistence.kt$CouldNotCreateDataSourceException : Exception - MaxLineLength:CordaPersistence.kt$currentTx.boundary.filter { !it.success }.subscribe { this.onError(DatabaseTransactionRolledBackException(it.txId)) } - MaxLineLength:CordaPersistence.kt$return _contextDatabase.get() ?: error("Was expecting to find CordaPersistence set on current thread: ${Strand.currentStrand()}") - MaxLineLength:CordaPersistence.kt${ var wrappingSubscriber = DatabaseTransactionWrappingSubscriber<T>(db) // Use lift to add subscribers to a special subscriber that wraps a database transaction around observations. // Each subscriber will be passed to this lambda when they subscribe, at which point we add them to wrapping subscriber. return this.lift { toBeWrappedInDbTx: Subscriber<in T> -> // Add the subscriber to the wrapping subscriber, which will invoke the original subscribers together inside a database transaction. wrappingSubscriber.delegates.add(toBeWrappedInDbTx) // If we are the first subscriber, return the shared subscriber, otherwise return a subscriber that does nothing. if (wrappingSubscriber.delegates.size == 1) wrappingSubscriber else NoOpSubscriber(toBeWrappedInDbTx) // Clean up the shared list of subscribers when they unsubscribe. }.doOnUnsubscribe { wrappingSubscriber.cleanUp() // If cleanup removed the last subscriber reset the system, as future subscribers might need the stream again if (wrappingSubscriber.delegates.isEmpty()) { wrappingSubscriber = DatabaseTransactionWrappingSubscriber(db) } } } MaxLineLength:CordaRPCClient.kt$CordaRPCClient - MaxLineLength:CordaRPCClient.kt$CordaRPCClient$ @JvmOverloads fun start(username: String, password: String, externalTrace: Trace?, impersonatedActor: Actor?, gracefulReconnect: Boolean = false): CordaRPCConnection - MaxLineLength:CordaRPCClient.kt$CordaRPCClient$ @JvmOverloads fun start(username: String, password: String, externalTrace: Trace?, impersonatedActor: Actor?, targetLegalIdentity: CordaX500Name?, gracefulReconnect: Boolean = false): CordaRPCConnection - MaxLineLength:CordaRPCClient.kt$CordaRPCClient$ @JvmOverloads fun start(username: String, password: String, gracefulReconnect: Boolean = false): CordaRPCConnection - MaxLineLength:CordaRPCClient.kt$CordaRPCClient$ @JvmOverloads fun start(username: String, password: String, targetLegalIdentity: CordaX500Name, gracefulReconnect: Boolean = false): CordaRPCConnection + MaxLineLength:CordaRPCClient.kt$CordaRPCClient$ @JvmOverloads fun start(username: String, password: String, externalTrace: Trace?, impersonatedActor: Actor?, gracefulReconnect: GracefulReconnect? = null): CordaRPCConnection + MaxLineLength:CordaRPCClient.kt$CordaRPCClient$ @JvmOverloads fun start(username: String, password: String, externalTrace: Trace?, impersonatedActor: Actor?, targetLegalIdentity: CordaX500Name?, gracefulReconnect: GracefulReconnect? = null): CordaRPCConnection + MaxLineLength:CordaRPCClient.kt$CordaRPCClient$ @JvmOverloads fun start(username: String, password: String, targetLegalIdentity: CordaX500Name, gracefulReconnect: GracefulReconnect? = null): CordaRPCConnection MaxLineLength:CordaRPCClient.kt$CordaRPCClient$( haAddressPool: List<NetworkHostAndPort>, configuration: CordaRPCClientConfiguration = CordaRPCClientConfiguration.DEFAULT, sslConfiguration: ClientRpcSslOptions? = null, classLoader: ClassLoader? = null ) MaxLineLength:CordaRPCClient.kt$CordaRPCClient$( hostAndPort: NetworkHostAndPort, configuration: CordaRPCClientConfiguration, sslConfiguration: ClientRpcSslOptions?, classLoader: ClassLoader? = null ) - MaxLineLength:CordaRPCClient.kt$CordaRPCClient$( hostAndPort: NetworkHostAndPort, sslConfiguration: ClientRpcSslOptions? = null, classLoader: ClassLoader? = null ) - MaxLineLength:CordaRPCClient.kt$CordaRPCClient$@JvmOverloads constructor(hostAndPort: NetworkHostAndPort, configuration: CordaRPCClientConfiguration = CordaRPCClientConfiguration.DEFAULT) : this( hostAndPort = hostAndPort, haAddressPool = emptyList(), configuration = configuration ) MaxLineLength:CordaRPCClient.kt$CordaRPCClient$AMQPClientSerializationScheme.initialiseSerialization(serializationClassLoader, customSerializers, serializationWhitelists, cache) MaxLineLength:CordaRPCClient.kt$CordaRPCClient$CordaRPCConnection(getRpcClient().start(InternalCordaRPCOps::class.java, username, password, externalTrace, impersonatedActor, targetLegalIdentity)) - MaxLineLength:CordaRPCClient.kt$CordaRPCClient$if (classLoader != null) AMQP_RPC_CLIENT_CONTEXT.withClassLoader(classLoader) else AMQP_RPC_CLIENT_CONTEXT - MaxLineLength:CordaRPCClient.kt$CordaRPCClient$val cache = Caffeine.newBuilder().maximumSize(128).build<SerializationFactoryCacheKey, SerializerFactory>().asMap() MaxLineLength:CordaRPCClient.kt$CordaRPCClient$val customSerializers = createInstancesOfClassesImplementing(serializationClassLoader, SerializationCustomSerializer::class.java) - MaxLineLength:CordaRPCClient.kt$CordaRPCClient$val serializationWhitelists = ServiceLoader.load(SerializationWhitelist::class.java, serializationClassLoader).toSet() MaxLineLength:CordaRPCClient.kt$CordaRPCClient${ val cache = Caffeine.newBuilder().maximumSize(128).build<SerializationFactoryCacheKey, SerializerFactory>().asMap() // If the client has explicitly provided a classloader use this one to scan for custom serializers, otherwise use the current one. val serializationClassLoader = this.classLoader ?: this.javaClass.classLoader val customSerializers = createInstancesOfClassesImplementing(serializationClassLoader, SerializationCustomSerializer::class.java) val serializationWhitelists = ServiceLoader.load(SerializationWhitelist::class.java, serializationClassLoader).toSet() AMQPClientSerializationScheme.initialiseSerialization(serializationClassLoader, customSerializers, serializationWhitelists, cache) } - MaxLineLength:CordaRPCClient.kt$CordaRPCClientConfiguration$/** * The interval of unused observable reaping. Leaked Observables (unused ones) are detected using weak references * and are cleaned up in batches in this interval. If set too large it will waste server side resources for this * duration. If set too low it wastes client side cycles. The default is to check once per second. */ open val reapInterval: Duration = 1.seconds - MaxLineLength:CordaRPCClient.kt$CordaRPCConnection.Companion$@CordaInternal internal - MaxLineLength:CordaRPCClientReconnectionTest.kt$CordaRPCClientReconnectionTest$(client.start(rpcUser.username, rpcUser.password, gracefulReconnect = true).proxy as ReconnectingCordaRPCOps) - MaxLineLength:CordaRPCClientReconnectionTest.kt$CordaRPCClientReconnectionTest$driver - MaxLineLength:CordaRPCClientReconnectionTest.kt$CordaRPCClientReconnectionTest$rpcOps.startTrackedFlow(::CashIssueFlow, 10.DOLLARS, OpaqueBytes.of(0), defaultNotaryIdentity).returnValue.get() MaxLineLength:CordaRPCClientReconnectionTest.kt$CordaRPCClientReconnectionTest$val addresses = listOf(NetworkHostAndPort("localhost", portAllocator.nextPort()), NetworkHostAndPort("localhost", portAllocator.nextPort())) - MaxLineLength:CordaRPCClientTest.kt$CordaRPCClientTest$// WireTransaction stores its components as blobs which are deserialised in its constructor. This test makes sure // the extra class loader given to the CordaRPCClient is used in this deserialisation, as otherwise any WireTransaction // containing Cash.State objects are not receivable by the client. // // We run the client in a separate process, without the finance module on its system classpath to ensure that the // additional class loader that we give it is used. Cash.State objects are used as they can't be synthesised fully // by the carpenter, and thus avoiding any false-positive results. @Test fun `additional class loader used by WireTransaction when it deserialises its components`() - MaxLineLength:CordaRPCClientTest.kt$CordaRPCClientTest$checkRpcNotification(update.stateMachineInfo, rpcUser.username, historicalIds, externalTrace, impersonatedActor) MaxLineLength:CordaRPCClientTest.kt$CordaRPCClientTest$node.services.startFlow(CashIssueFlow(100.POUNDS, OpaqueBytes.of(1), identity), InvocationContext.shell()).flatMap { it.resultFuture }.getOrThrow() MaxLineLength:CordaRPCClientTest.kt$CordaRPCClientTest$node.services.startFlow(CashIssueFlow(2000.DOLLARS, OpaqueBytes.of(0), identity), InvocationContext.shell()).flatMap { it.resultFuture }.getOrThrow() - MaxLineLength:CordaRPCClientTest.kt$CordaRPCClientTest$poll(scheduler, pollName = "node's started state", check = { if (node.node.started == null) true else null }) - MaxLineLength:CordaRPCClientTest.kt$CordaRPCClientTest$private - MaxLineLength:CordaRPCClientTest.kt$CordaRPCClientTest$proxy.startFlowDynamic(CashIssueFlow::class.java, 1000.DOLLARS, OpaqueBytes.of(0), identity).returnValue.getOrThrow() - MaxLineLength:CordaRPCClientTest.kt$CordaRPCClientTest.CloseableExecutor$private MaxLineLength:CordaRPCOps.kt$ @Deprecated("For automated upgrades, consider using the `gracefulShutdown` command in an SSH session instead.") fun CordaRPCOps.pendingFlowsCount(): DataFeed<Int, Pair<Int, Int>> - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ // DOCSTART VaultQueryByAPI @RPCReturnsObservables fun <T : ContractState> vaultQueryBy(criteria: QueryCriteria, paging: PageSpecification, sorting: Sort, contractStateType: Class<out T>): Vault.Page<T> - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ // DOCSTART VaultTrackByAPI @RPCReturnsObservables fun <T : ContractState> vaultTrackBy(criteria: QueryCriteria, paging: PageSpecification, sorting: Sort, contractStateType: Class<out T>): DataFeed<Vault.Page<T>, Vault.Update<T>> - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ // TODO This operation should be restricted to just node admins. @RPCReturnsObservables fun networkParametersFeed(): DataFeed<ParametersUpdateInfo?, ParametersUpdateInfo> MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ // TODO This operation should be restricted to just node admins. fun acceptNewNetworkParameters(parametersHash: SecureHash) MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ @CordaInternal @Deprecated("This method is intended only for internal use and will be removed from the public API soon.") fun internalFindVerifiedTransaction(txnId: SecureHash): SignedTransaction? MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ @Deprecated("This method is intended only for internal use and will be removed from the public API soon.") @RPCReturnsObservables fun internalVerifiedTransactionsFeed(): DataFeed<List<SignedTransaction>, SignedTransaction> MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ @Deprecated("This method is intended only for internal use and will be removed from the public API soon.") fun internalVerifiedTransactionsSnapshot(): List<SignedTransaction> - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ @RPCReturnsObservables fun stateMachineRecordedTransactionMappingFeed(): DataFeed<List<StateMachineTransactionMapping>, StateMachineTransactionMapping> - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ fun clearNetworkMapCache() - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ fun killFlow(id: StateMachineRunId): Boolean - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ fun nodeDiagnosticInfo(): NodeDiagnosticInfo - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ fun nodeInfoFromParty(party: AbstractParty): NodeInfo? - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ fun notaryIdentities(): List<Party> - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ fun refreshNetworkMapCache() - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ fun setFlowsDrainingModeEnabled(enabled: Boolean) MaxLineLength:CordaRPCOps.kt$CordaRPCOps$ fun terminate(drainPendingFlows: Boolean = false) - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$fun <T : ContractState> vaultQueryByCriteria(criteria: QueryCriteria, contractStateType: Class<out T>): Vault.Page<T> MaxLineLength:CordaRPCOps.kt$CordaRPCOps$fun <T : ContractState> vaultQueryByWithPagingSpec(contractStateType: Class<out T>, criteria: QueryCriteria, paging: PageSpecification): Vault.Page<T> - MaxLineLength:CordaRPCOps.kt$CordaRPCOps$fun <T : ContractState> vaultQueryByWithSorting(contractStateType: Class<out T>, criteria: QueryCriteria, sorting: Sort): Vault.Page<T> MaxLineLength:CordaRPCOps.kt$CordaRPCOps$fun <T : ContractState> vaultTrackByCriteria(contractStateType: Class<out T>, criteria: QueryCriteria): DataFeed<Vault.Page<T>, Vault.Update<T>> MaxLineLength:CordaRPCOps.kt$CordaRPCOps$fun <T : ContractState> vaultTrackByWithPagingSpec(contractStateType: Class<out T>, criteria: QueryCriteria, paging: PageSpecification): DataFeed<Vault.Page<T>, Vault.Update<T>> MaxLineLength:CordaRPCOps.kt$CordaRPCOps$fun <T : ContractState> vaultTrackByWithSorting(contractStateType: Class<out T>, criteria: QueryCriteria, sorting: Sort): DataFeed<Vault.Page<T>, Vault.Update<T>> - MaxLineLength:CordaRPCOps.kt$ParametersUpdateInfo - MaxLineLength:CordaRPCOps.kt$StateMachineInfo$progressTrackerStepAndUpdates: DataFeed<String, String>? = this.progressTrackerStepAndUpdates MaxLineLength:CordaRPCOps.kt$StateMachineInfo$return copy(id = id, flowLogicClassName = flowLogicClassName, initiator = initiator, progressTrackerStepAndUpdates = progressTrackerStepAndUpdates, invocationContext = invocationContext) - MaxLineLength:CordaRPCOps.kt$inline MaxLineLength:CordaRPCOps.kt$sorting: Sort = Sort(emptySet()) - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$/** * Returns the RPC protocol version, which is the same the node's platform Version. Exists since version 1 so guaranteed * to be present. */ override val protocolVersion: Int get() = nodeInfo().platformVersion - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$?: - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$contractStateType: Class<out T> - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$hash.serialize().sign { services.keyManagementService.sign(it.bytes, services.myInfo.legalIdentities[0].owningKey) } MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$is ConnectException -> throw CordaRuntimeException("There is connection problem to network map. The possible causes are incorrect configuration or network map service being down") - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$is InvocationOrigin.Scheduled -> FlowInitiator.Scheduled((origin as InvocationOrigin.Scheduled).scheduledState) MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$override MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$override fun internalFindVerifiedTransaction(txnId: SecureHash): SignedTransaction? - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$override fun killFlow(id: StateMachineRunId): Boolean - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$override fun registeredFlows(): List<String> - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$override fun setFlowsDrainingModeEnabled(enabled: Boolean) - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$pendingFlowsCount() .updates .doOnNext { (completed, total) -> logger.info("Pending flows progress before shutdown: $completed / $total.") } - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$progress = stateMachine.logic.track()?.updates?.filter { !it.startsWith(STRUCTURAL_STEP_PREFIX) } ?: Observable.empty() MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$return StateMachineInfo(flowLogic.runId, flowLogic.javaClass.name, flowLogic.stateMachine.context.toFlowInitiator(), flowLogic.track(), flowLogic.stateMachine.context) - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$return vaultQueryBy(QueryCriteria.VaultQueryCriteria(), PageSpecification(), Sort(emptySet()), contractStateType) - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$return vaultTrackBy(QueryCriteria.VaultQueryCriteria(), PageSpecification(), Sort(emptySet()), contractStateType) - MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$val wellKnownParty = services.identityService.wellKnownPartyFromX500Name((origin as InvocationOrigin.Peer).party) MaxLineLength:CordaRPCOpsImpl.kt$CordaRPCOpsImpl${ error -> logger.error("Error while waiting for pending flows to drain in preparation for shutdown. Cause was: ${error.message}", error) } - MaxLineLength:CordaRPCOpsImplTest.kt$CordaRPCOpsImplTest$CURRENT_RPC_CONTEXT.set(RpcAuthContext(InvocationContext.rpc(testActor()), buildSubject("TEST_USER", emptySet()))) MaxLineLength:CordaRPCOpsImplTest.kt$CordaRPCOpsImplTest$assertThatCode { rpc.startFlow(::SoftLock, cash.ref, Duration.ofSeconds(1)).returnValue.getOrThrow() }.doesNotThrowAnyException() - MaxLineLength:CordaRPCOpsImplTest.kt$CordaRPCOpsImplTest$require(aliceNode.services.keyManagementService.filterMyKeys(signaturePubKeys).toList().isNotEmpty()) MaxLineLength:CordaRPCOpsImplTest.kt$CordaRPCOpsImplTest$val cash = rpc.startFlow(::CashIssueFlow, 10.DOLLARS, issuerRef, notary).returnValue.getOrThrow().stx.tx.outRefsOfType<Cash.State>().single() - MaxLineLength:CordaRPCOpsImplTest.kt$CordaRPCOpsImplTest$withPermissions MaxLineLength:CordaSSHAuthInfo.kt$CordaSSHAuthInfo : AuthInfo - MaxLineLength:CordaService.kt$CordaService - MaxLineLength:CordaServiceTest.kt$CordaServiceTest$CordaServiceThatRequiresThreadContextClassLoader : SingletonSerializeAsToken MaxLineLength:CordaServiceTest.kt$CordaServiceTest$mockNet = MockNetwork(MockNetworkParameters(threadPerNode = true, cordappsForAllNodes = listOf(FINANCE_CONTRACTS_CORDAPP, enclosedCordapp()))) MaxLineLength:CordaServiceTest.kt$CordaServiceTest.CordaServiceThatRequiresThreadContextClassLoader$assertNotNull(Thread.currentThread().contextClassLoader, "thread context classloader should not be null during service initialisation") - MaxLineLength:CordaUtils.kt$ @DeleteForDJVM fun TransactionBuilder.toLedgerTransaction(services: ServicesForResolution, serializationContext: SerializationContext): LedgerTransaction - MaxLineLength:CordaUtils.kt$ @DeleteForDJVM fun TransactionBuilder.toWireTransaction(services: ServicesForResolution, serializationContext: SerializationContext): WireTransaction MaxLineLength:CordaUtils.kt$ private fun owns(packageName: String, fullClassName: String): Boolean - MaxLineLength:CordaUtils.kt$"$requiredMinPlatformVersion. The current zone is only enforcing a minimum platform version of " MaxLineLength:CordaUtils.kt$AttachmentSort(listOf(AttachmentSort.AttachmentSortColumn(AttachmentSort.AttachmentSortAttribute.VERSION, Sort.Direction.DESC))) - MaxLineLength:CordaUtils.kt$Character.isJavaIdentifierStart(token[0]) && token.toCharArray().drop(1).all { Character.isJavaIdentifierPart(it) } - MaxLineLength:CordaUtils.kt$private - MaxLineLength:CordaVersion.kt$CordaVersion$arrayOf("Version: $releaseVersion", "Revision: $revision", "Platform Version: $platformVersion", "Vendor: $vendor") - MaxLineLength:CordaVersion.kt$CordaVersion.Companion$internal val semanticVersion: String by lazy { if(releaseVersion == UNKNOWN) CURRENT_MAJOR_RELEASE else releaseVersion } - MaxLineLength:CordaVersionProvider.kt$CordaVersionProvider : IVersionProvider MaxLineLength:CordaViewModel.kt$CordaView : View - MaxLineLength:CordaX500Name.kt$CordaX500Name$/** * @param organisation name of the organisation. * @param locality locality of the organisation, typically nearest major city. * @param country country the organisation is in, as an ISO 3166-1 2-letter country code. */ constructor(organisation: String, locality: String, country: String) : this(null, null, organisation, locality, null, country) - MaxLineLength:CordaX500Name.kt$CordaX500Name$require(locality.length < MAX_LENGTH_LOCALITY) { "Locality attribute (L) must contain less then $MAX_LENGTH_LOCALITY characters." } - MaxLineLength:CordaX500Name.kt$CordaX500Name$state?.let { require(it.length < MAX_LENGTH_STATE) { "State attribute (ST) must contain less then $MAX_LENGTH_STATE characters." } } MaxLineLength:CordaX500Name.kt$CordaX500Name$this(commonName = commonName, organisationUnit = null, organisation = organisation, locality = locality, state = null, country = country) - MaxLineLength:Cordapp.kt$Cordapp - MaxLineLength:Cordapp.kt$Cordapp$Info - MaxLineLength:Cordapp.kt$Cordapp.Info$ContractAndWorkflow : Info MaxLineLength:Cordapp.kt$Cordapp.Info$Workflow : Info MaxLineLength:Cordapp.kt$Cordapp.Info.Contract$data - MaxLineLength:Cordapp.kt$Cordapp.Info.Contract$override fun toString() MaxLineLength:Cordapp.kt$Cordapp.Info.Default$data MaxLineLength:Cordapp.kt$Cordapp.Info.Workflow$data - MaxLineLength:Cordapp.kt$Cordapp.Info.Workflow$override fun toString() - MaxLineLength:CordappConfigFileProviderTests.kt$CordappConfigFileProviderTests$private - MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$assertThat(aliceQuery.statesMetadata[0].constraintInfo!!.type()).isEqualTo(Vault.ConstraintInfo.Type.SIGNATURE) MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$assertThat(allStates[0].state.constraint).isInstanceOfAny(HashAttachmentConstraint::class.java, SignatureAttachmentConstraint::class.java) - MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$assertThat(bobQuery.statesMetadata[0].constraintInfo!!.type()).isEqualTo(Vault.ConstraintInfo.Type.SIGNATURE) - MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$val aliceQuery = alice.rpc.vaultQueryBy<Cash.State>(QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.CONSUMED)) MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$val aliceQuery = restartedAlice.rpc.vaultQueryBy<Cash.State>(QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.CONSUMED)) MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$val issueTx = alice.rpc.startFlow(::CashIssueFlow, 1000.DOLLARS, OpaqueBytes.of(1), defaultNotaryIdentity).returnValue.getOrThrow() - MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$val issueTx = alice.rpc.startFlow(::CashIssueFlow, expected, ref, defaultNotaryIdentity).returnValue.getOrThrow() - MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$val issueTx2 = restartedNode.rpc.startFlow(::CashIssueFlow, expected, ref, defaultNotaryIdentity).returnValue.getOrThrow() - MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$val parameters = NetworkParametersReader(DEV_ROOT_CA.certificate, null, notary.baseDirectory).read().networkParameters MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$val transferTx = alice.rpc.startFlow(::CashPaymentFlow, 1000.DOLLARS, bobParty, true, defaultNotaryIdentity).returnValue.getOrThrow() MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$val transferTxn = restartedAlice.rpc.startFlow(::CashPaymentFlow, 1000.DOLLARS, bobParty, true, defaultNotaryIdentity).returnValue.getOrThrow() MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$val vaultUpdatesBob = bob.rpc.vaultTrackByCriteria(Cash.State::class.java, QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.ALL)).updates MaxLineLength:CordappConstraintsTests.kt$CordappConstraintsTests$val vaultUpdatesBob = restartedBob.rpc.vaultTrackByCriteria(Cash.State::class.java, QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.ALL)).updates - MaxLineLength:CordappContext.kt$CordappContext - MaxLineLength:CordappContext.kt$CordappContext.Companion$@CordaInternal fun create(cordapp: Cordapp, attachmentId: SecureHash?, classLoader: ClassLoader, config: CordappConfig): CordappContext - MaxLineLength:CordappContext.kt$CordappContext.EmptyCordappConfig$override fun get(path: String) MaxLineLength:CordappContext.kt$CordappContext.EmptyCordappConfig$override fun getBoolean(path: String) MaxLineLength:CordappContext.kt$CordappContext.EmptyCordappConfig$override fun getDouble(path: String) MaxLineLength:CordappContext.kt$CordappContext.EmptyCordappConfig$override fun getFloat(path: String) @@ -5251,716 +3348,222 @@ MaxLineLength:CordappContext.kt$CordappContext.EmptyCordappConfig$override fun getLong(path: String) MaxLineLength:CordappContext.kt$CordappContext.EmptyCordappConfig$override fun getNumber(path: String) MaxLineLength:CordappContext.kt$CordappContext.EmptyCordappConfig$override fun getString(path: String) - MaxLineLength:CordappImpl.kt$CordappImpl$val classList = rpcFlows + initiatedFlows + services + serializationWhitelists.flatMap { it.whitelist } + notaryService - MaxLineLength:CordappProvider.kt$CordappProvider$ fun getAppContext(): CordappContext - MaxLineLength:CordappProviderImpl.kt$CordappProviderImpl$private val attachmentStorage: AttachmentStorage - MaxLineLength:CordappResolver.kt$CordappResolver$ @Synchronized @VisibleForTesting fun <T> withCordapp(minimumPlatformVersion: Int = 1, targetPlatformVersion: Int = PLATFORM_VERSION, block: () -> T): T - MaxLineLength:CordappResolver.kt$CordappResolver$CordappImpl.TEST_INSTANCE.copy(minimumPlatformVersion = minimumPlatformVersion, targetPlatformVersion = targetPlatformVersion) - MaxLineLength:CordappResolver.kt$CordappResolver$Exception().stackTrace .mapNotNull { cordappClasses[it.className] } // in case there are multiple classes matched, we select the first one having a single CorDapp registered against it. .firstOrNull { it.size == 1 } + MaxLineLength:CordappResolver.kt$CordappResolver$logger.error("ATTENTION: More than one CorDapp installed on the node for contract $className. Please remove the previous version when upgrading to a new version.") MaxLineLength:CordappResolverTest.kt$CordappResolverTest$@Test fun `when the same cordapp is registered for the same class multiple times, the resolver deduplicates and returns it as the current one`() MaxLineLength:CordappSmokeTest.kt$CordappSmokeTest$(additionalNodeInfoDir / "nodeInfo-41408E093F95EAD51F6892C34DEB65AE1A3569A4B0E5744769A1B485AF8E04B5").write(signedNodeInfo.serialize().bytes) - MaxLineLength:CordappSmokeTest.kt$CordappSmokeTest$private - MaxLineLength:CordappSmokeTest.kt$CordappSmokeTest$val future = connectionToAlice.proxy.startFlow(CordappSmokeTest::GatherContextsFlow, aliceIdentity).returnValue MaxLineLength:CordappSmokeTest.kt$CordappSmokeTest$val nodeInfo = createNodeInfoWithSingleIdentity(CordaX500Name(organisation = "Bob Corp", locality = "Madrid", country = "ES"), dummyKeyPair, dummyKeyPair.public) - MaxLineLength:CordappSmokeTest.kt$CordappSmokeTest${ val baseDir = factory.baseDirectory(aliceConfig) val cordappsDir = (baseDir / CORDAPPS_DIR_NAME).createDirectories() // Find the jar file for the smoke tests of this module val selfCordapp = Paths.get("build", "libs").list { it.filter { "-smokeTests" in it.toString() }.toList().single() } selfCordapp.copyToDirectory(cordappsDir) // The `nodeReadyFuture` in the persistent network map cache will not complete unless there is at least one other // node in the network. We work around this limitation by putting another node info file in the additional-node-info // folder. // TODO clean this up after we refactor the persistent network map cache / network map updater val additionalNodeInfoDir = (baseDir / "additional-node-infos").createDirectories() createDummyNodeInfo(additionalNodeInfoDir) factory.create(aliceConfig).use { alice -> alice.connect(superUser).use { connectionToAlice -> val aliceIdentity = connectionToAlice.proxy.nodeInfo().legalIdentitiesAndCerts.first().party val future = connectionToAlice.proxy.startFlow(CordappSmokeTest::GatherContextsFlow, aliceIdentity).returnValue val (sessionInitContext, sessionConfirmContext) = future.getOrThrow() val selfCordappName = selfCordapp.fileName.toString().removeSuffix(".jar") assertThat(sessionInitContext.appName).isEqualTo(selfCordappName) assertThat(sessionConfirmContext.appName).isEqualTo(selfCordappName) } } } MaxLineLength:CoreFlowHandlers.kt$ContractUpgradeHandler : Acceptor - MaxLineLength:CoreFlowHandlers.kt$ContractUpgradeHandler$"The instigator is one of the participants" using (initiatingSession.counterparty in oldStateAndRef.state.data.participants) MaxLineLength:CoreFlowHandlers.kt$ContractUpgradeHandler$"The proposed upgrade ${proposal.modification.javaClass} is a trusted upgrade path" using (proposal.modification.name == authorisedUpgrade) MaxLineLength:CoreFlowHandlers.kt$ContractUpgradeHandler$@Suspendable override - MaxLineLength:CoreFlowHandlers.kt$ContractUpgradeHandler$val authorisedUpgrade = checkNotNull(serviceHub.contractUpgradeService.getAuthorisedContractUpgrade(oldStateAndRef.ref)) { "Contract state upgrade is unauthorised. State hash : ${oldStateAndRef.ref}" } - MaxLineLength:CoreFlowHandlers.kt$ContractUpgradeHandler$val expectedTx = ContractUpgradeUtils.assembleUpgradeTx(oldStateAndRef, proposal.modification, proposedTx.privacySalt, serviceHub) - MaxLineLength:CoreFlowHandlers.kt$ContractUpgradeHandler${ // Retrieve signed transaction from our side, we will apply the upgrade logic to the transaction on our side, and // verify outputs matches the proposed upgrade. val ourSTX = requireNotNull(serviceHub.validatedTransactions.getTransaction(proposal.stateRef.txhash)) { "We don't have a copy of the referenced state" } val oldStateAndRef = ourSTX.resolveBaseTransaction(serviceHub).outRef<ContractState>(proposal.stateRef.index) val authorisedUpgrade = checkNotNull(serviceHub.contractUpgradeService.getAuthorisedContractUpgrade(oldStateAndRef.ref)) { "Contract state upgrade is unauthorised. State hash : ${oldStateAndRef.ref}" } val proposedTx = stx.coreTransaction as ContractUpgradeWireTransaction val expectedTx = ContractUpgradeUtils.assembleUpgradeTx(oldStateAndRef, proposal.modification, proposedTx.privacySalt, serviceHub) requireThat { "The instigator is one of the participants" using (initiatingSession.counterparty in oldStateAndRef.state.data.participants) "The proposed upgrade ${proposal.modification.javaClass} is a trusted upgrade path" using (proposal.modification.name == authorisedUpgrade) "The proposed tx matches the expected tx for this upgrade" using (proposedTx == expectedTx) } proposedTx.resolve(serviceHub, stx.sigs) } MaxLineLength:CoreFlowHandlers.kt$FinalityHandler$logger.warnOnce("Insecure API to record finalised transaction was used by ${sender.counterparty} (${sender.getCounterpartyFlowInfo()})") - MaxLineLength:CoreFlowHandlers.kt$NotaryChangeHandler : Acceptor - MaxLineLength:CoreFlowHandlers.kt$NotaryChangeHandler${ val state = proposal.stateRef val proposedTx = stx.resolveNotaryChangeTransaction(serviceHub) // TODO: Right now all nodes will automatically approve the notary change. We need to figure out if stricter controls are necessary. if (state !in proposedTx.inputs.map { it.ref }) { throw StateReplacementException("The proposed state $state is not in the proposed transaction inputs") } val newNotary = proposal.modification val isNotary = serviceHub.networkMapCache.isNotary(newNotary) if (!isNotary) { throw StateReplacementException("The proposed node $newNotary does not run a Notary service") } } MaxLineLength:CouldNotStartFlowException.kt$CouldNotStartFlowException : RPCException - MaxLineLength:CrossCashTest.kt$"Divergence detected, the remote state doesn't match any of our possible predictions." - MaxLineLength:CrossCashTest.kt$fun searchForStateHelper(state: Map<A, Long>, diffIx: Int, consumedTxs: HashMap<A, Int>, matched: ArrayList<Map<A, Int>>) - MaxLineLength:CrossCashTest.kt$is IssueAndPaymentRequest -> command.node.proxy.startFlow(::CashIssueAndPaymentFlow, request).returnValue - MaxLineLength:CrossCashTest.kt$it.value.toDouble() / 1000 to generateMove(it.value, USD, node.mainIdentity, possibleRecipients) - MaxLineLength:CrossCashTest.kt$listOf(1.0 to generateIssue(10000, USD, notaryIdentity, possibleRecipients)) + moves + exits - MaxLineLength:CrossCashTest.kt$val minimumMatches = matches.fold<Map<AbstractParty, Int>, HashMap<AbstractParty, Int>?>(null) { minimum, next -> if (minimum == null) { HashMap(next) } else { next.forEach { minimum.merge(it.key, it.value, Math::min) } minimum } }!! MaxLineLength:CrossCashTest.kt${ log.warn( "Divergence detected, the remote state doesn't match any of our possible predictions." + "\nPredicted state/queues:\n$previousState" + "\nActual gathered state:\n${CrossCashState(currentNodeVaults, mapOf())}" ) // TODO We should terminate here with an exception, we cannot carry on as we have an inconsistent model. We carry on currently because we always diverge due to notarisation failures return@LoadTest CrossCashState(currentNodeVaults, mapOf()) } - MaxLineLength:Crypto.kt$Crypto$ @DeleteForDJVM @JvmOverloads @JvmStatic fun generateKeyPair(signatureScheme: SignatureScheme = DEFAULT_SIGNATURE_SCHEME): KeyPair - MaxLineLength:Crypto.kt$Crypto$ @DeleteForDJVM @JvmStatic @Throws(InvalidKeyException::class, SignatureException::class) fun doSign(privateKey: PrivateKey, clearData: ByteArray): ByteArray MaxLineLength:Crypto.kt$Crypto$ @DeleteForDJVM @JvmStatic fun generateKeyPair(schemeCodeName: String): KeyPair MaxLineLength:Crypto.kt$Crypto$ @JvmStatic @Throws(InvalidKeyException::class, SignatureException::class) fun doVerify(publicKey: PublicKey, signatureData: ByteArray, clearData: ByteArray): Boolean - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic @Throws(InvalidKeyException::class, SignatureException::class) fun doVerify(schemeCodeName: String, publicKey: PublicKey, signatureData: ByteArray, clearData: ByteArray): Boolean - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic @Throws(InvalidKeyException::class, SignatureException::class) fun doVerify(signatureScheme: SignatureScheme, publicKey: PublicKey, signatureData: ByteArray, clearData: ByteArray): Boolean - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic @Throws(InvalidKeyException::class, SignatureException::class) fun doVerify(txId: SecureHash, transactionSignature: TransactionSignature): Boolean - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic @Throws(InvalidKeySpecException::class) fun decodePrivateKey(schemeCodeName: String, encodedKey: ByteArray): PrivateKey - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic @Throws(InvalidKeySpecException::class) fun decodePublicKey(schemeCodeName: String, encodedKey: ByteArray): PublicKey - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic @Throws(SignatureException::class) fun isValid(publicKey: PublicKey, signatureData: ByteArray, clearData: ByteArray): Boolean - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic @Throws(SignatureException::class) fun isValid(signatureScheme: SignatureScheme, publicKey: PublicKey, signatureData: ByteArray, clearData: ByteArray): Boolean - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic @Throws(SignatureException::class) fun isValid(txId: SecureHash, transactionSignature: TransactionSignature): Boolean - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic fun deriveKeyPair(privateKey: PrivateKey, seed: ByteArray): KeyPair - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic fun deriveKeyPair(signatureScheme: SignatureScheme, privateKey: PrivateKey, seed: ByteArray): KeyPair - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic fun deriveKeyPairFromEntropy(entropy: BigInteger): KeyPair - MaxLineLength:Crypto.kt$Crypto$ @JvmStatic fun deriveKeyPairFromEntropy(signatureScheme: SignatureScheme, entropy: BigInteger): KeyPair MaxLineLength:Crypto.kt$Crypto$ @JvmStatic fun findSignatureScheme(schemeCodeName: String): SignatureScheme MaxLineLength:Crypto.kt$Crypto$ @JvmStatic fun publicKeyOnCurve(signatureScheme: SignatureScheme, publicKey: PublicKey): Boolean - MaxLineLength:Crypto.kt$Crypto$"Metadata schemeCodeName: ${sigMetaData.schemeCodeName} is not aligned with the key type: ${sigKey.schemeCodeName}." - MaxLineLength:Crypto.kt$Crypto$// Check if a public key satisfies algorithm specs (for ECC: key should lie on the curve and not being point-at-infinity). private fun validatePublicKey(signatureScheme: SignatureScheme, key: PublicKey): Boolean - MaxLineLength:Crypto.kt$Crypto$AlgorithmIdentifier(BCObjectIdentifiers.sphincs256_with_SHA512, DLSequence(arrayOf(ASN1Integer(0), SHA512_256))) MaxLineLength:Crypto.kt$Crypto$ECDSA_SECP256R1_SHA256, ECDSA_SECP256K1_SHA256 -> deriveKeyPairECDSA(signatureScheme.algSpec as ECParameterSpec, privateKey, seed) - MaxLineLength:Crypto.kt$Crypto$else -> throw InvalidKeyException("Key type ${privateKey.algorithm} is not supported for deterministic key derivation") - MaxLineLength:Crypto.kt$Crypto$else -> throw UnsupportedOperationException("Although supported for signing, deterministic key derivation is " + "not currently implemented for ${signatureScheme.schemeCodeName}") - MaxLineLength:Crypto.kt$Crypto$is BCECPublicKey -> publicKey.parameters == signatureScheme.algSpec && !publicKey.q.isInfinity && publicKey.q.isValid MaxLineLength:Crypto.kt$Crypto$is BCRSAPrivateKey, is BCSphincs256PrivateKey -> true MaxLineLength:Crypto.kt$Crypto$is BCRSAPublicKey -> key.modulus.bitLength() >= 2048 - MaxLineLength:Crypto.kt$Crypto$is EdDSAPublicKey -> publicKey.params == signatureScheme.algSpec && !isEdDSAPointAtInfinity(publicKey) && publicKey.a.isOnCurve - MaxLineLength:Crypto.kt$Crypto$listOf(AlgorithmIdentifier(BCObjectIdentifiers.sphincs256, DLSequence(arrayOf(ASN1Integer(0), SHA512_256)))) - MaxLineLength:Crypto.kt$Crypto$private - MaxLineLength:Crypto.kt$Crypto$require(txId.sha256() in usedHashes) { "Transaction with id:$txId is not a leaf in the provided partial Merkle tree" } - MaxLineLength:Crypto.kt$Crypto$return publicKey.a.toP3() == (EDDSA_ED25519_SHA512.algSpec as EdDSANamedCurveSpec).curve.getZero(GroupElement.Representation.P3) - MaxLineLength:Crypto.kt$Crypto$throw InvalidKeySpecException("This private key cannot be decoded, please ensure it is PKCS8 encoded and that " + "it corresponds to the input scheme's code name.", ikse) - MaxLineLength:Crypto.kt$Crypto$throw throw InvalidKeySpecException("This public key cannot be decoded, please ensure it is X509 encoded and " + "that it corresponds to the input scheme's code name.", ikse) - MaxLineLength:Crypto.kt$Crypto$val bytes = entropy.toByteArray().copyOf(params.curve.field.getb() / 8) // Need to pad the entropy to the valid seed length. - MaxLineLength:Crypto.kt$Crypto$val keyPairGenerator = KeyPairGenerator.getInstance(signatureScheme.algorithmName, providerMap[signatureScheme.providerName]) MaxLineLength:Crypto.kt$Crypto$val signableData = SignableData(originalSignedHash(txId, transactionSignature.partialMerkleTree), transactionSignature.signatureMetadata) - MaxLineLength:Crypto.kt$Crypto$val signature = Instances.getSignatureInstance(signatureScheme.signatureName, providerMap[signatureScheme.providerName]) - MaxLineLength:Crypto.kt$Crypto${ // Compute HMAC(privateKey, seed). val macBytes = deriveHMAC(privateKey, seed) // Get the first EC curve fieldSized-bytes from macBytes. // According to recommendations from the deterministic ECDSA rfc, see https://tools.ietf.org/html/rfc6979 // performing a simple modular reduction would induce biases that would be detrimental to security. // Thus, the result is not reduced modulo q and similarly to BIP32, EC curve fieldSized-bytes are utilised. val fieldSizeMacBytes = macBytes.copyOf(parameterSpec.curve.fieldSize / 8) // Calculate value d for private key. val deterministicD = BigInteger(1, fieldSizeMacBytes) // Key generation checks follow the BC logic found in // https://github.com/bcgit/bc-java/blob/master/core/src/main/java/org/bouncycastle/crypto/generators/ECKeyPairGenerator.java // There is also an extra check to align with the BIP32 protocol, according to which // if deterministicD >= order_of_the_curve the resulted key is invalid and we should proceed with another seed. // TODO: We currently use SHA256(seed) when retrying, but BIP32 just skips a counter (i) that results to an invalid key. // Although our hashing approach seems reasonable, we should check if there are alternatives, // especially if we use counters as well. if (deterministicD < ECConstants.TWO || WNafUtil.getNafWeight(deterministicD) < parameterSpec.n.bitLength().ushr(2) || deterministicD >= parameterSpec.n) { // Instead of throwing an exception, we retry with SHA256(seed). return deriveKeyPairECDSA(parameterSpec, privateKey, seed.sha256().bytes) } val privateKeySpec = ECPrivateKeySpec(deterministicD, parameterSpec) val privateKeyD = BCECPrivateKey(privateKey.algorithm, privateKeySpec, BouncyCastleProvider.CONFIGURATION) // Compute the public key by scalar multiplication. // Note that BIP32 uses masterKey + mac_derived_key as the final private key and it consequently // requires an extra point addition: master_public + mac_derived_public for the public part. // In our model, the mac_derived_output, deterministicD, is not currently added to the masterKey and it // it forms, by itself, the new private key, which in turn is used to compute the new public key. val pointQ = FixedPointCombMultiplier().multiply(parameterSpec.g, deterministicD) // This is unlikely to happen, but we should check for point at infinity. if (pointQ.isInfinity) { // Instead of throwing an exception, we retry with SHA256(seed). return deriveKeyPairECDSA(parameterSpec, privateKey, seed.sha256().bytes) } val publicKeySpec = ECPublicKeySpec(pointQ, parameterSpec) val publicKeyD = BCECPublicKey(privateKey.algorithm, publicKeySpec, BouncyCastleProvider.CONFIGURATION) return KeyPair(publicKeyD, privateKeyD) } - MaxLineLength:Crypto.kt$Crypto${ val sigKey: SignatureScheme = Crypto.findSignatureScheme(keyPair.private) val sigMetaData: SignatureScheme = Crypto.findSignatureScheme(signableData.signatureMetadata.schemeNumberID) // Special handling if the advertised SignatureScheme is CompositeKey. // TODO fix notaries that advertise [CompositeKey] in their signature Metadata. Currently, clustered notary nodes // mention Crypto.COMPOSITE_KEY in their SignatureMetadata, but they are actually signing with a leaf-key // (and if they refer to it as a Composite key, then we lose info about the actual type of their signing key). // In short, their metadata should be the leaf key-type, until we support CompositeKey signatures. require(sigKey == sigMetaData || sigMetaData == Crypto.COMPOSITE_KEY) { "Metadata schemeCodeName: ${sigMetaData.schemeCodeName} is not aligned with the key type: ${sigKey.schemeCodeName}." } val signatureBytes = doSign(sigKey.schemeCodeName, keyPair.private, signableData.serialize().bytes) return TransactionSignature(signatureBytes, keyPair.public, signableData.signatureMetadata) } - MaxLineLength:CryptoService.kt$SignOnlyCryptoService$ fun defaultIdentitySignatureScheme(): SignatureScheme - MaxLineLength:CryptoService.kt$SignOnlyCryptoService$ fun defaultTLSSignatureScheme(): SignatureScheme MaxLineLength:CryptoServiceFactory.kt$CryptoServiceFactory.Companion$throw IllegalArgumentException("Currently only BouncyCastle is used as a crypto service. A valid signing certificate store is required.") - MaxLineLength:CryptoSignUtils.kt$CryptoSignUtils - MaxLineLength:CryptoSignUtils.kt$CryptoSignUtils$"Metadata schemeCodeName: ${sigMetaData.schemeCodeName} is not aligned with the key type: ${sigKey.schemeCodeName}." - MaxLineLength:CryptoUtils.kt$ // TODO: SignatureException should be used only for a damaged signature, as per `java.security.Signature.verify()`. @Throws(SignatureException::class, InvalidKeyException::class) fun PublicKey.verify(content: ByteArray, signature: DigitalSignature) MaxLineLength:CryptoUtils.kt$ @DeleteForDJVM @Throws(NoSuchAlgorithmException::class) fun newSecureRandom(): SecureRandom MaxLineLength:CryptoUtils.kt$ @DeleteForDJVM @Throws(NoSuchAlgorithmException::class) fun secureRandomBytes(numOfBytes: Int): ByteArray - MaxLineLength:CryptoUtils.kt$ @DeleteForDJVM fun random63BitValue(): Long MaxLineLength:CryptoUtils.kt$ @Throws(InvalidKeyException::class, SignatureException::class) fun KeyPair.verify(signatureData: ByteArray, clearData: ByteArray): Boolean MaxLineLength:CryptoUtils.kt$ @Throws(InvalidKeyException::class, SignatureException::class) fun PublicKey.verify(signatureData: ByteArray, clearData: ByteArray): Boolean - MaxLineLength:CryptoUtils.kt$ @Throws(SignatureException::class, InvalidKeyException::class) fun PublicKey.isValid(content: ByteArray, signature: DigitalSignature): Boolean - MaxLineLength:CryptoUtils.kt$ fun <T : Any> serializedHash(x: T): SecureHash MaxLineLength:CryptoUtils.kt$ fun PublicKey.isFulfilledBy(otherKeys: Iterable<PublicKey>): Boolean - MaxLineLength:CryptoUtils.kt$ fun componentHash(nonce: SecureHash, opaqueBytes: OpaqueBytes): SecureHash - MaxLineLength:CryptoUtils.kt$ fun componentHash(opaqueBytes: OpaqueBytes, privacySalt: PrivacySalt, componentGroupIndex: Int, internalIndex: Int): SecureHash MaxLineLength:CryptoUtils.kt$ fun computeNonce(privacySalt: PrivacySalt, groupIndex: Int, internalIndex: Int) MaxLineLength:CryptoUtils.kt$throw IllegalStateException("Verification of CompositeKey signatures currently not supported.") - MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$assertEquals("DL9yJfiNGqteRrKPjGUkRQkeqzuQ4kwcYQWMCi5YKuUHrk", keyPairBiggerThan256bitsV2.public.toStringShort()) - MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$assertEquals("DLANmjhGSVdLyghxcPHrn3KuGatscf6LtvqifUDxw7SGU8", keyPairBiggerThan256bitsV2.public.toStringShort()) - MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$assertEquals("DLB9K1UiBrWonn481z6NzkqoWHjMBXpfDeaet3wiwRNWSU", keyPairBiggerThan256bitsV2.public.toStringShort()) MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val expectedAlgSet = setOf("RSA_SHA256", "ECDSA_SECP256K1_SHA256", "ECDSA_SECP256R1_SHA256", "EDDSA_ED25519_SHA512", "SPHINCS-256_SHA512", "COMPOSITE") MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan256bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("2").pow(258).minus(BigInteger.TEN)) MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan256bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("2").pow(258).minus(BigInteger.TEN)) - MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan256bits = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("2").pow(258).minus(BigInteger.TEN)) MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan256bitsV2 = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("2").pow(258).minus(BigInteger("50"))) MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan256bitsV2 = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("2").pow(258).minus(BigInteger("50"))) MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan256bitsV2 = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("2").pow(258).minus(BigInteger("50"))) MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan258bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("2").pow(259).plus(BigInteger.ONE)) MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan258bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("2").pow(259).plus(BigInteger.ONE)) - MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan258bits = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("2").pow(259).plus(BigInteger.ONE)) MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan512bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("2").pow(514).minus(BigInteger.TEN)) MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan512bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("2").pow(514).minus(BigInteger.TEN)) - MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val keyPairBiggerThan512bits = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("2").pow(514).minus(BigInteger.TEN)) MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest$val pubKeySpec = EdDSAPublicKeySpec((EDDSA_ED25519_SHA512.algSpec as EdDSANamedCurveSpec).curve.getZero(GroupElement.Representation.P3), EDDSA_ED25519_SHA512.algSpec as EdDSANamedCurveSpec) - MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest${ val keyPairPositive = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("10")) assertEquals("DL6pYKUgH17az8MLdonvvUtUPN8TqwpCGcdgLr7vg3skCU", keyPairPositive.public.toStringShort()) // The underlying implementation uses the hash of entropy if it is out of range 2 <= entropy < N, where N the order of the group. val keyPairNegative = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("-10")) assertEquals("DLnpXhxece69Nyqgm3pPt3yV7ESQYDJKoYxs1hKgfBAEu", keyPairNegative.public.toStringShort()) val keyPairZero = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("0")) assertEquals("DLBC28e18T6KsYwjTFfUWJfhvHjvYVapyVf6antnqUkbgd", keyPairZero.public.toStringShort()) // BigIntenger.Zero is out or range, so 1 and hash(1.toByteArray) would have the same impact. val zeroHashed = BigInteger(1, BigInteger("0").toByteArray().sha256().bytes) // Check oneHashed < N (order of the group), otherwise we would need an extra hash. assertEquals(-1, zeroHashed.compareTo((ECDSA_SECP256K1_SHA256.algSpec as ECNamedCurveParameterSpec).n)) val keyPairZeroHashed = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, zeroHashed) assertEquals("DLBC28e18T6KsYwjTFfUWJfhvHjvYVapyVf6antnqUkbgd", keyPairZeroHashed.public.toStringShort()) val keyPairOne = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("1")) assertEquals("DLBimRXdEQhJUTpL6f9ri9woNdsze6mwkRrhsML13Eh7ET", keyPairOne.public.toStringShort()) // BigIntenger.ONE is out or range, so 1 and hash(1.toByteArray) would have the same impact. val oneHashed = BigInteger(1, BigInteger("1").toByteArray().sha256().bytes) // Check oneHashed < N (order of the group), otherwise we would need an extra hash. assertEquals(-1, oneHashed.compareTo((ECDSA_SECP256K1_SHA256.algSpec as ECNamedCurveParameterSpec).n)) val keyPairOneHashed = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, oneHashed) assertEquals("DLBimRXdEQhJUTpL6f9ri9woNdsze6mwkRrhsML13Eh7ET", keyPairOneHashed.public.toStringShort()) // 2 is in the range. val keyPairTwo = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("2")) assertEquals("DLG32UWaevGw9YY7w1Rf9mmK88biavgpDnJA9bG4GapVPs", keyPairTwo.public.toStringShort()) // Try big numbers that are out of range. val keyPairBiggerThan256bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("2").pow(258).minus(BigInteger.TEN)) assertEquals("DLGHsdv2xeAuM7n3sBc6mFfiphXe6VSf3YxqvviKDU6Vbd", keyPairBiggerThan256bits.public.toStringShort()) val keyPairBiggerThan256bitsV2 = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("2").pow(258).minus(BigInteger("50"))) assertEquals("DL9yJfiNGqteRrKPjGUkRQkeqzuQ4kwcYQWMCi5YKuUHrk", keyPairBiggerThan256bitsV2.public.toStringShort()) val keyPairBiggerThan512bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("2").pow(514).minus(BigInteger.TEN)) assertEquals("DL3Wr5EQGrMTaKBy5XMvG8rvSfKX1AYZLCRU8kixGbxt1E", keyPairBiggerThan512bits.public.toStringShort()) val keyPairBiggerThan258bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256K1_SHA256, BigInteger("2").pow(259).plus(BigInteger.ONE)) assertEquals("DL7NbssqvuuJ4cqFkkaVYu9j1MsVswESGgCfbqBS9ULwuM", keyPairBiggerThan258bits.public.toStringShort()) } - MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest${ val keyPairPositive = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("10")) assertEquals("DLHDcxuSt9J3cbjd2Dsx4rAgYYA7BAP7A8VLrFiq1tH9yy", keyPairPositive.public.toStringShort()) // The underlying implementation uses the hash of entropy if it is out of range 2 < entropy < N, where N the order of the group. val keyPairNegative = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("-10")) assertEquals("DLBASmjiMZuu1g3EtdHJxfSueXE8PRoUWbkdU61Qcnpamt", keyPairNegative.public.toStringShort()) val keyPairZero = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("0")) assertEquals("DLH2FEHEnsT3MpCJt2gfyNjpqRqcBxeupK4YRPXvDsVEkb", keyPairZero.public.toStringShort()) // BigIntenger.Zero is out or range, so 1 and hash(1.toByteArray) would have the same impact. val zeroHashed = BigInteger(1, BigInteger("0").toByteArray().sha256().bytes) // Check oneHashed < N (order of the group), otherwise we would need an extra hash. assertEquals(-1, zeroHashed.compareTo((ECDSA_SECP256R1_SHA256.algSpec as ECNamedCurveParameterSpec).n)) val keyPairZeroHashed = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, zeroHashed) assertEquals("DLH2FEHEnsT3MpCJt2gfyNjpqRqcBxeupK4YRPXvDsVEkb", keyPairZeroHashed.public.toStringShort()) val keyPairOne = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("1")) assertEquals("DLHrtKwjv6onq9HcrQDJPs8Cgtai5mZU5ZU6sb1ivJjx3z", keyPairOne.public.toStringShort()) // BigIntenger.ONE is out or range, so 1 and hash(1.toByteArray) would have the same impact. val oneHashed = BigInteger(1, BigInteger("1").toByteArray().sha256().bytes) // Check oneHashed < N (order of the group), otherwise we would need an extra hash. assertEquals(-1, oneHashed.compareTo((ECDSA_SECP256R1_SHA256.algSpec as ECNamedCurveParameterSpec).n)) val keyPairOneHashed = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, oneHashed) assertEquals("DLHrtKwjv6onq9HcrQDJPs8Cgtai5mZU5ZU6sb1ivJjx3z", keyPairOneHashed.public.toStringShort()) // 2 is in the range. val keyPairTwo = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("2")) assertEquals("DLFoz6txJ3vHcKNSM1vFxHJUoEQ69PorBwW64dHsAnEoZB", keyPairTwo.public.toStringShort()) // Try big numbers that are out of range. val keyPairBiggerThan256bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("2").pow(258).minus(BigInteger.TEN)) assertEquals("DLBv6fZqaCTbE4L7sgjbt19biXHMgU9CzR5s8g8XBJjZ11", keyPairBiggerThan256bits.public.toStringShort()) val keyPairBiggerThan256bitsV2 = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("2").pow(258).minus(BigInteger("50"))) assertEquals("DLANmjhGSVdLyghxcPHrn3KuGatscf6LtvqifUDxw7SGU8", keyPairBiggerThan256bitsV2.public.toStringShort()) val keyPairBiggerThan512bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("2").pow(514).minus(BigInteger.TEN)) assertEquals("DL9sKwMExBTD3MnJN6LWGqo496Erkebs9fxZtXLVJUBY9Z", keyPairBiggerThan512bits.public.toStringShort()) val keyPairBiggerThan258bits = Crypto.deriveKeyPairFromEntropy(ECDSA_SECP256R1_SHA256, BigInteger("2").pow(259).plus(BigInteger.ONE)) assertEquals("DLBwjWwPJSF9E7b1NWaSbEJ4oK8CF7RDGWd648TiBhZoL1", keyPairBiggerThan258bits.public.toStringShort()) } MaxLineLength:CryptoUtilsTest.kt$CryptoUtilsTest${ val keyPairPositive = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("10")) assertEquals("DLBL3iHCp9uRReWhhCGfCsrxZZpfAm9h9GLbfN8ijqXTq", keyPairPositive.public.toStringShort()) val keyPairNegative = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("-10")) assertEquals("DLC5HXnYsJAFqmM9hgPj5G8whQ4TpyE9WMBssqCayLBwA2", keyPairNegative.public.toStringShort()) val keyPairZero = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("0")) assertEquals("DL4UVhGh4tqu1G86UVoGNaDDNCMsBtNHzE6BSZuNNJN7W2", keyPairZero.public.toStringShort()) val keyPairOne = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("1")) assertEquals("DL8EZUdHixovcCynKMQzrMWBnXQAcbVDHi6ArPphqwJVzq", keyPairOne.public.toStringShort()) val keyPairBiggerThan256bits = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("2").pow(258).minus(BigInteger.TEN)) assertEquals("DLB9K1UiBrWonn481z6NzkqoWHjMBXpfDeaet3wiwRNWSU", keyPairBiggerThan256bits.public.toStringShort()) // The underlying implementation uses the first 256 bytes of the entropy. Thus, 2^258-10 and 2^258-50 and 2^514-10 have the same impact. val keyPairBiggerThan256bitsV2 = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("2").pow(258).minus(BigInteger("50"))) assertEquals("DLB9K1UiBrWonn481z6NzkqoWHjMBXpfDeaet3wiwRNWSU", keyPairBiggerThan256bitsV2.public.toStringShort()) val keyPairBiggerThan512bits = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("2").pow(514).minus(BigInteger.TEN)) assertEquals("DLB9K1UiBrWonn481z6NzkqoWHjMBXpfDeaet3wiwRNWSU", keyPairBiggerThan512bits.public.toStringShort()) // Try another big number. val keyPairBiggerThan258bits = Crypto.deriveKeyPairFromEntropy(EDDSA_ED25519_SHA512, BigInteger("2").pow(259).plus(BigInteger.ONE)) assertEquals("DL5tEFVMXMGrzwjfCAW34JjkhsRkPfFyJ38iEnmpB6L2Z9", keyPairBiggerThan258bits.public.toStringShort()) } - MaxLineLength:Currencies.kt$infix fun Amount<Currency>.issuedBy(deposit: PartyAndReference) - MaxLineLength:CurrencyParameterSensitivitiesSerializer.kt$CurrencyParameterSensitivitiesSerializer$override fun fromProxy(proxy: Proxy): CurrencyParameterSensitivities MaxLineLength:CurrencyParameterSensitivitySerialiser.kt$CurrencyParameterSensitivitySerializer$override fun toProxy(obj: CurrencyParameterSensitivity) - MaxLineLength:CustomCordapp.kt$CustomCordapp : TestCordappInternal - MaxLineLength:CustomCordapp.kt$CustomCordapp$jos.addEntry(testEntry(JarFile.MANIFEST_NAME)) { createTestManifest(name, versionId, targetPlatformVersion).write(jos) } // The same resource may be found in different locations (this will happen when running from gradle) so just // pick the first one found. scanResult.allResources.asMap().forEach { path, resourceList -> jos.addEntry(testEntry(path), resourceList[0].open()) } - MaxLineLength:CustomCordapp.kt$CustomCordapp$return ZipEntry(name).setCreationTime(epochFileTime).setLastAccessTime(epochFileTime).setLastModifiedTime(epochFileTime) - MaxLineLength:CustomCordapp.kt$CustomCordapp.Companion$val filename = it.run { "${name.replace(whitespace, "-")}_${versionId}_${targetPlatformVersion}_${UUID.randomUUID()}.jar" } - MaxLineLength:CustomCordappTest.kt$CustomCordappTest$val cordapp = cordappWithPackages("net.corda.testing.node.internal").copy(targetPlatformVersion = 123, name = "CustomCordappTest") - MaxLineLength:CustomNotaryTest.kt$CustomNotaryTest$CustomNotaryService : NotaryService - MaxLineLength:CustomSerializer.kt$CustomSerializer$/** * This exists purely for documentation and cross-platform purposes. It is not used by our serialization / deserialization * code path. */ abstract val schemaForDocumentation: Schema - MaxLineLength:CustomSerializer.kt$CustomSerializer$Implements<T : Any> : CustomSerializerImp - MaxLineLength:CustomSerializer.kt$CustomSerializer$Proxy<T : Any, P : Any> : CustomSerializerImp - MaxLineLength:CustomSerializer.kt$CustomSerializer$SubClass<T : Any> : CustomSerializer MaxLineLength:CustomSerializer.kt$CustomSerializer.CustomSerializerImp$abstract MaxLineLength:CustomSerializer.kt$CustomSerializer.CustomSerializerImp$override fun isSerializerFor(clazz: Class<*>): Boolean MaxLineLength:CustomSerializer.kt$CustomSerializer.Proxy$override fun isSerializerFor(clazz: Class<*>): Boolean - MaxLineLength:CustomSerializer.kt$CustomSerializer.Proxy$private val proxySerializer: ObjectSerializer by lazy { ObjectSerializer.make(factory.getTypeInformation(proxyClass), factory) } - MaxLineLength:CustomSerializer.kt$CustomSerializer.Proxy$withInheritance: Boolean = true - MaxLineLength:CustomSerializer.kt$CustomSerializer.ToString$listOf - MaxLineLength:CustomSerializer.kt$CustomSerializer.ToString$private - MaxLineLength:CustomSerializerRegistry.kt$CachingCustomSerializerRegistry$CustomSerializerIdentifier - MaxLineLength:CustomSerializerRegistry.kt$CachingCustomSerializerRegistry$constructor(descriptorBasedSerializerRegistry: DescriptorBasedSerializerRegistry) : this(descriptorBasedSerializerRegistry, emptySet()) - MaxLineLength:CustomSerializerRegistry.kt$CachingCustomSerializerRegistry$logger.warn("Duplicate custom serializers detected for $clazz: ${declaredSerializers.map { it::class.qualifiedName }}") - MaxLineLength:CustomSerializerRegistry.kt$CachingCustomSerializerRegistry$logger.warn("Illegal custom serializer detected for $clazz: ${declaredSerializers.first()::class.qualifiedName}") MaxLineLength:CustomSerializerRegistry.kt$CachingCustomSerializerRegistry$private val customSerializersCache: MutableMap<CustomSerializerIdentifier, CustomSerializerLookupResult> = DefaultCacheProvider.createCache() - MaxLineLength:CustomSerializerRegistry.kt$CachingCustomSerializerRegistry.CustomSerializerLookupResult$CustomSerializerFound : CustomSerializerLookupResult - MaxLineLength:CustomSerializerRegistry.kt$DuplicateCustomSerializerException : Exception - MaxLineLength:CustomSerializerRegistryTests.kt$CustomSerializerRegistryTests$TestCustomSerializer : CustomSerializer - MaxLineLength:CustomSerializerRegistryTests.kt$CustomSerializerRegistryTests$private fun CustomSerializerRegistry.find(clazz: Class<*>): AMQPSerializer<Any> - MaxLineLength:CustomSerializerRegistryTests.kt$CustomSerializerRegistryTests.TestCustomSerializer$override - MaxLineLength:CustomVaultQuery.kt$TopupIssuerFlow.TopupIssuanceRequester$return initiateFlow(issuerBankParty).sendAndReceive<List<AbstractCashFlow.Result>>(topupRequest).unwrap { it } - MaxLineLength:CustomVaultQuery.kt$TopupIssuerFlow.TopupIssuer$val txn = issueCashTo(amount, topupRequest.issueToParty, topupRequest.issuerPartyRef, topupRequest.notaryParty) - MaxLineLength:CustomVaultQuery.kt$TopupIssuerFlow.TopupIssuer${ // invoke Cash subflow to issue Asset progressTracker.currentStep = ISSUING val issueCashFlow = CashIssueFlow(amount, issuerPartyRef, notaryParty) val issueTx = subFlow(issueCashFlow) // NOTE: issueCashFlow performs a Broadcast (which stores a local copy of the txn to the ledger) // short-circuit when issuing to self if (serviceHub.myInfo.isLegalIdentity(issueTo)) return issueTx // now invoke Cash subflow to Move issued assetType to issue requester progressTracker.currentStep = TRANSFERRING val moveCashFlow = CashPaymentFlow(amount, issueTo, anonymous = false) // NOTE: CashFlow PayCash calls FinalityFlow which performs a Broadcast (which stores a local copy of the txn to the ledger) return subFlow(moveCashFlow) } - MaxLineLength:CustomVaultQueryTest.kt$CustomVaultQueryTest$mockNet = MockNetwork(threadPerNode = true, cordappPackages = listOf("net.corda.finance", IOUFlow::class.packageName, javaClass.packageName, "com.template")) - MaxLineLength:DBCheckpointStorageTests.kt$DBCheckpointStorageTests$CheckpointVerifier.verifyCheckpointsCompatible(checkpointStorage, emptyList(), 1, mockServices, emptyList()) + MaxLineLength:CustomVaultQueryTest.kt$CustomVaultQueryTest$mockNet = MockNetwork(threadPerNode = true, cordappPackages = listOf("net.corda.finance", IOUFlow::class.packageName, javaClass.packageName_, "com.template")) MaxLineLength:DBCheckpointStorageTests.kt$DBCheckpointStorageTests$val checkpoint = Checkpoint.create(InvocationContext.shell(), FlowStart.Explicit, logic.javaClass, frozenLogic, ALICE, SubFlowVersion.CoreFlow(version), false) .getOrThrow() - MaxLineLength:DBNetworkParametersStorage.kt$DBNetworkParametersStorage$log.warn("Tried to download historical network parameters with hash $parametersHash, but network map url isn't configured") - MaxLineLength:DBNetworkParametersStorage.kt$DBNetworkParametersStorage$override MaxLineLength:DBNetworkParametersStorage.kt$DBNetworkParametersStorage.Companion$PersistentNetworkParameters MaxLineLength:DBNetworkParametersStorage.kt$DBNetworkParametersStorage.Companion$fun createParametersMap(cacheFactory: NamedCacheFactory): AppendOnlyPersistentMap<SecureHash, SignedDataWithCert<NetworkParameters>, PersistentNetworkParameters, String> - MaxLineLength:DBNetworkParametersStorage.kt$DBNetworkParametersStorage.PersistentNetworkParameters$( @Id @Column(name = "hash", length = MAX_HASH_HEX_SIZE, nullable = false) val hash: String = "", @Column(name = "epoch", nullable = false) val epoch: Int = 0, // Stored as serialized bytes because network parameters structure evolves over time. @Lob @Column(name = "parameters_bytes", nullable = false) val networkParametersBytes: ByteArray = ArrayUtils.EMPTY_BYTE_ARRAY, @Lob @Column(name = "signature_bytes", nullable = false) private val signature: ByteArray = ArrayUtils.EMPTY_BYTE_ARRAY, // First certificate in the certificate chain. @Lob @Column(name = "cert", nullable = false) private val certificate: ByteArray = ArrayUtils.EMPTY_BYTE_ARRAY, // Parent certificate path (the first one is stored separately), so node is agnostic to certificate hierarchy. @Lob @Column(name = "parent_cert_path", nullable = false) private val certPath: ByteArray = ArrayUtils.EMPTY_BYTE_ARRAY ) MaxLineLength:DBNetworkParametersStorage.kt$DBNetworkParametersStorage.PersistentNetworkParameters$val signWithCert = DigitalSignatureWithCert(X509CertificateFactory().generateCertificate(certificate.inputStream()), certChain, signature) - MaxLineLength:DBNetworkParametersStorageTest.kt$DBNetworkParametersStorageTest$incorrectParams = createDevNetworkMapCa(DEV_INTERMEDIATE_CA).sign(testNetworkParameters(minimumPlatformVersion = 3)) - MaxLineLength:DBNetworkParametersStorageTest.kt$DBNetworkParametersStorageTest$it.contains("Caused by: java.security.cert.CertPathValidatorException: subject/issuer name chaining check failed") - MaxLineLength:DBNetworkParametersStorageTest.kt$DBNetworkParametersStorageTest$networkParametersService MaxLineLength:DBRunnerExtension.kt$DBRunnerExtension : ExtensionBeforeAllCallbackAfterAllCallbackBeforeEachCallbackAfterEachCallback - MaxLineLength:DBRunnerExtension.kt$DBRunnerExtension$if (annotationClass.isAssignableFrom(annotation::class.java)) sequenceOf(annotationClass.cast(annotation)) else annotation.annotationClass.java.findAnnotations(annotationClass) - MaxLineLength:DBRunnerExtension.kt$DBRunnerExtension$private - MaxLineLength:DBRunnerExtension.kt$DBRunnerExtension$private val AnnotatedElement.requiredSql: List<String> get() = findAnnotations(RequiresSql::class.java).map { it.name }.toList() - MaxLineLength:DBRunnerExtension.kt$DBRunnerExtension$val store = rootContext.getStore(ExtensionContext.Namespace.create(DBRunnerExtension::class.java.simpleName, groupName)) - MaxLineLength:DBTransactionMappingStorage.kt$DBTransactionMappingStorage : StateMachineRecordedTransactionMappingStorage MaxLineLength:DBTransactionMappingStorage.kt$DBTransactionMappingStorage$cq.multiselect(from.get<String>(DBTransactionStorage.DBTransaction::stateMachineRunId.name), from.get<String>(DBTransactionStorage.DBTransaction::txId.name)) - MaxLineLength:DBTransactionMappingStorage.kt$DBTransactionMappingStorage$override MaxLineLength:DBTransactionMappingStorage.kt$DBTransactionMappingStorage$val flowIds = session.createQuery(cq).resultList.map { StateMachineTransactionMapping(StateMachineRunId(UUID.fromString(it[0] as String)), SecureHash.parse(it[1] as String)) } MaxLineLength:DBTransactionStorage.kt$DBTransactionStorage : WritableTransactionStorageSingletonSerializeAsToken - MaxLineLength:DBTransactionStorage.kt$DBTransactionStorage$criteriaBuilder.equal(updateRoot.get<TransactionStatus>(DBTransaction::status.name), TransactionStatus.UNVERIFIED) - MaxLineLength:DBTransactionStorage.kt$DBTransactionStorage$logger.debug { "Transaction ${transaction.id} is already recorded as verified, so no need to re-record" } - MaxLineLength:DBTransactionStorage.kt$DBTransactionStorage.Companion$return if (effectiveSerializationEnv.serializationFactory.currentContext?.useCase == SerializationContext.UseCase.Storage) { effectiveSerializationEnv.serializationFactory.currentContext!! } else { SerializationDefaults.STORAGE_CONTEXT } - MaxLineLength:DBTransactionStorage.kt$DBTransactionStorage.Companion$transaction = value.toSignedTx().serialize(context = contextToUse().withEncoding(SNAPPY)).bytes MaxLineLength:DBTransactionStorage.kt$DBTransactionStorage.TransactionStatus$UnexpectedStatusValueException : Exception MaxLineLength:DBTransactionStorageTests.kt$DBTransactionStorageTests$listOf(TransactionSignature(ByteArray(1), ALICE_PUBKEY, SignatureMetadata(1, Crypto.findSignatureScheme(ALICE_PUBKEY).schemeNumberID))) - MaxLineLength:DataSourceFactory.kt$DataSourceFactory$fun createDataSource(hikariProperties: Properties, pool: Boolean = true, metricRegistry: MetricRegistry? = null): DataSource - MaxLineLength:DatabaseTransaction.kt$get() = contextTransactionOrNull ?: error("Was expecting to find transaction set on current strand: ${Strand.currentStrand()}") MaxLineLength:DatabaseTransaction.kt$get() = if (_prohibitDatabaseAccess.get() == true) throw IllegalAccessException("Database access is disabled in this context.") else _contextTransaction.get() - MaxLineLength:DbExceptionHandler.kt$DbExceptionHandler : UncaughtExceptionHandler - MaxLineLength:DbExceptionHandler.kt$DbExceptionHandler$errorAndTerminate("Thread ${t!!.name} failed due to database connection error. This is unrecoverable, terminating node.", e) - MaxLineLength:DbMapDeadlockTest.kt$DbMapDeadlockTest$// First clean up any remains from previous test runs persistence.transaction { session.createNativeQuery("delete from locktestobjects").executeUpdate() session.createNativeQuery("delete from otherlockobjects").executeUpdate() } // Prepare a few rows for reading in table 1 val prepMap = AppendOnlyPersistentMap<TestKey, Int, MyPersistenceClass, Int>( cacheFactory, "myTestCache", { k -> k.value }, { e -> Pair(TestKey(e.key), e.value) }, { k, v -> MyPersistenceClass(k.value, v) }, MyPersistenceClass::class.java ) persistence.transaction { prepMap.set(TestKey(1), 1) prepMap.set(TestKey(2), 2) prepMap.set(TestKey(10), 10) } // the map that will read from the prepared table val testMap = AppendOnlyPersistentMap<TestKey, Int, MyPersistenceClass, Int>( cacheFactory, "myTestCache", { k -> k.value }, { e -> Pair(TestKey(e.key), e.value) }, { k, v -> MyPersistenceClass(k.value, v) }, MyPersistenceClass::class.java ) // a second map that writes to another (unrelated table) val otherMap = AppendOnlyPersistentMap<TestKey, Int, SecondPersistenceClass, Int>( cacheFactory, "myTestCache", { k -> k.value }, { e -> Pair(TestKey(e.key), e.value) }, { k, v -> SecondPersistenceClass(k.value, v) }, SecondPersistenceClass::class.java ) val latch1 = CyclicBarrier(2) val latch2 = CountDownLatch(1) val latch3 = CyclicBarrier(2) val otherThreadException = AtomicReference<Exception?>(null) // This thread will wait for the main thread to do a few things. Then it will starting to read key 2, and write a key to // the second table. This read will be buffered (not flushed) at first. The subsequent access to read value 10 fromt the // first table will cause the previous write to flush. As the row this will be writing to should be locked from the main // thread, it will wait for the main thread's db transaction to commit or rollback before proceeding with the read. val otherThread = thread(name = "testThread2") { try { log.info("Thread2 waiting") latch1.await() latch2.await() log.info("Thread2 starting transaction") persistence.transaction { log.info("Thread2 getting key 2") testMap.get(TestKey(2)) log.info("Thread2 set other value 100") otherMap.set(TestKey(100), 100) latch3.await() log.info("Thread2 getting value 10") val v = testMap.get(TestKey(10)) assertEquals(10, v) } log.info("Thread2 done") } catch (e: Exception) { log.info("Thread2 threw") // Don't log the exception though, since we expect it and check in the assertions what it is. otherThreadException.set(e) } } log.info("MainThread waiting for Thread2 to start waiting") latch1.await() // The main thread will write to the same key in the second table, and then read key 1 from the read table. As it will do that // before triggering the run on thread 2, it will get the row lock in the second table when flushing before the read, then // read and carry on. log.info("MainThread starting transaction") persistence.transaction { log.info("MainThread getting key 2") testMap.get(TestKey(2)) log.info("MainThread set other key 100") otherMap.set(TestKey(100), 100) log.info("MainThread getting key 1") testMap.get(TestKey(1)) // Then it will trigger the start of the second thread (see above) and then sleep for a bit to make sure the other // thread actually runs and beats this thread to the get(10). The test will still pass if it doesn't. log.info("MainThread signal") latch2.countDown() log.info("MainThread wait for Thread2 to be getting the same key") latch3.await() log.info("MainThread sleep for 2 seconds so ideally Thread2 reaches the get first") sleep(2000) // finally it will try to get the same value from the read table that the other thread is trying to read. // If access to reading this value from the DB is guarded by a lock, the other thread will be holding this lock // which means the threads are now deadlocked. log.info("MainThread get value 10") try { assertEquals(10, testMap.get(TestKey(10))) } catch (e: Exception) { checkException(e) } } log.info("MainThread joining with Thread2") otherThread.join() assertNotNull(otherThreadException.get()) checkException(otherThreadException.get()) log.info("MainThread done") - MaxLineLength:DbMapDeadlockTest.kt$DbMapDeadlockTest$// We have to catch any exception thrown and check what they are - primary key constraint violations are fine, we are trying // to insert the same key twice after all. Any deadlock time outs or similar are completely not fine and should be a test failure. private fun checkException(exception: Exception?) - MaxLineLength:DbMapDeadlockTest.kt$DbMapDeadlockTest$createCordaPersistence(dbConfig, { null }, { null }, schemaService, hikariProperties, cacheFactory, null) MaxLineLength:DbMapDeadlockTest.kt$DbMapDeadlockTest$it.setProperty("dataSource.url", "jdbc:h2:file:${temporaryFolder.root}/persistence;DB_CLOSE_ON_EXIT=FALSE;WRITE_DELAY=0;LOCK_TIMEOUT=10000") - MaxLineLength:DbMapDeadlockTest.kt$DbMapDeadlockTest$log.info("MainThread getting key 2") testMap.get(TestKey(2)) log.info("MainThread set other key 100") otherMap.set(TestKey(100), 100) log.info("MainThread getting key 1") testMap.get(TestKey(1)) // Then it will trigger the start of the second thread (see above) and then sleep for a bit to make sure the other // thread actually runs and beats this thread to the get(10). The test will still pass if it doesn't. log.info("MainThread signal") latch2.countDown() log.info("MainThread wait for Thread2 to be getting the same key") latch3.await() log.info("MainThread sleep for 2 seconds so ideally Thread2 reaches the get first") sleep(2000) // finally it will try to get the same value from the read table that the other thread is trying to read. // If access to reading this value from the DB is guarded by a lock, the other thread will be holding this lock // which means the threads are now deadlocked. log.info("MainThread get value 10") try { assertEquals(10, testMap.get(TestKey(10))) } catch (e: Exception) { checkException(e) } - MaxLineLength:DbMapDeadlockTest.kt$DbMapDeadlockTest$log.info("Thread2 threw") - MaxLineLength:DbMapDeadlockTest.kt$DbMapDeadlockTest$startHikariPool(hikariProperties, dbConfig, schemaService.schemaOptions.keys, ourName = TestIdentity(ALICE_NAME, 70).name) - MaxLineLength:DbMapDeadlockTest.kt$DbMapDeadlockTest$val dbConfig = DatabaseConfig(initialiseSchema = true, transactionIsolationLevel = TransactionIsolationLevel.READ_COMMITTED) MaxLineLength:DbMapDeadlockTest.kt$LockDbSchemaV2 : MappedSchema MaxLineLength:DbTransactionsResolver.kt$DbTransactionsResolver$TopologicalSort - MaxLineLength:DbTransactionsResolver.kt$DbTransactionsResolver$logger.debug { "Downloaded ${sortedDependencies?.size} dependencies from remote peer for transactions ${flow.txHashes}" } MaxLineLength:DbTransactionsResolver.kt$DbTransactionsResolver$val (existingTxIds, downloadedTxs) = fetchRequiredTransactions(Collections.singleton(nextRequests.first())) // Fetch first item only - MaxLineLength:DbTransactionsResolver.kt$DbTransactionsResolver$val nextRequests = LinkedHashSet<SecureHash>(flow.txHashes) // Keep things unique but ordered, for unit test stability. - MaxLineLength:DbTransactionsResolver.kt$DbTransactionsResolver${ // Don't re-download the same tx when we haven't verified it yet but it's referenced multiple times in the // graph we're traversing. nextRequests.removeAll(topologicalSort.transactionIds) if (nextRequests.isEmpty()) { // Done early. break } // Request the standalone transaction data (which may refer to things we don't yet have). val (existingTxIds, downloadedTxs) = fetchRequiredTransactions(Collections.singleton(nextRequests.first())) // Fetch first item only for (tx in downloadedTxs) { val dependencies = tx.dependencies topologicalSort.add(tx.id, dependencies) } var suspended = true for (downloaded in downloadedTxs) { suspended = false val dependencies = downloaded.dependencies // Do not keep in memory as this bloats the checkpoint. Write each item to the database. transactionStorage.addUnverifiedTransaction(downloaded) // The write locks are only released over a suspend, so need to keep track of whether the flow has been suspended to ensure // that locks are not held beyond each while loop iteration (as doing this would result in a deadlock due to claiming locks // in the wrong order) val suspendedViaAttachments = flow.fetchMissingAttachments(downloaded) val suspendedViaParams = flow.fetchMissingNetworkParameters(downloaded) suspended = suspended || suspendedViaAttachments || suspendedViaParams // Add all input states and reference input states to the work queue. nextRequests.addAll(dependencies) } // If the flow did not suspend on the last iteration of the downloaded loop above, perform a suspend here to ensure no write // locks are held going into the next while loop iteration. if (!suspended) { FlowLogic.sleep(0.seconds) } // It's possible that the node has a transaction in storage already. Dependencies should also be present for this transaction, // so just remove these IDs from the set of next requests. nextRequests.removeAll(existingTxIds) } - MaxLineLength:DbTransactionsResolver.kt$DbTransactionsResolver${ suspended = false val dependencies = downloaded.dependencies // Do not keep in memory as this bloats the checkpoint. Write each item to the database. transactionStorage.addUnverifiedTransaction(downloaded) // The write locks are only released over a suspend, so need to keep track of whether the flow has been suspended to ensure // that locks are not held beyond each while loop iteration (as doing this would result in a deadlock due to claiming locks // in the wrong order) val suspendedViaAttachments = flow.fetchMissingAttachments(downloaded) val suspendedViaParams = flow.fetchMissingNetworkParameters(downloaded) suspended = suspended || suspendedViaAttachments || suspendedViaParams // Add all input states and reference input states to the work queue. nextRequests.addAll(dependencies) } - MaxLineLength:DbTransactionsResolver.kt$DbTransactionsResolver.TopologicalSort$// Note that we use a LinkedHashSet here to make the traversal deterministic (as long as the input list is). val deDupeIt = dedupe(it) forwardGraph.computeIfAbsent(deDupeIt) { LinkedHashSet() }.add(txId) - MaxLineLength:DeduplicationChecker.kt$DeduplicationChecker - MaxLineLength:DeduplicationId.kt$SenderDeduplicationId - MaxLineLength:DefaultKryoCustomizer.kt$DefaultKryoCustomizer$// Store a little schema of field names in the stream the first time a class is used which increases tolerance // for change to a class. setDefaultSerializer(CompatibleFieldSerializer::class.java) // Take the safest route here and allow subclasses to have fields named the same as super classes. fieldSerializerConfig.cachedFieldNameStrategy = FieldSerializer.CachedFieldNameStrategy.EXTENDED instantiatorStrategy = CustomInstantiatorStrategy() // Required for HashCheckingStream (de)serialization. // Note that return type should be specifically set to InputStream, otherwise it may not work, i.e. val aStream : InputStream = HashCheckingStream(...). addDefaultSerializer(InputStream::class.java, InputStreamSerializer) addDefaultSerializer(SerializeAsToken::class.java, SerializeAsTokenSerializer<SerializeAsToken>()) addDefaultSerializer(Logger::class.java, LoggerSerializer) addDefaultSerializer(X509Certificate::class.java, X509CertificateSerializer) // WARNING: reordering the registrations here will cause a change in the serialized form, since classes // with custom serializers get written as registration ids. This will break backwards-compatibility. // Please add any new registrations to the end. // TODO: re-organise registrations into logical groups before v1.0 register(Arrays.asList("").javaClass, ArraysAsListSerializer()) register(LazyMappedList::class.java, LazyMappedListSerializer) register(SignedTransaction::class.java, SignedTransactionSerializer) register(WireTransaction::class.java, WireTransactionSerializer) register(SerializedBytes::class.java, SerializedBytesSerializer) UnmodifiableCollectionsSerializer.registerSerializers(this) ImmutableListSerializer.registerSerializers(this) ImmutableSetSerializer.registerSerializers(this) ImmutableSortedSetSerializer.registerSerializers(this) ImmutableMapSerializer.registerSerializers(this) ImmutableMultimapSerializer.registerSerializers(this) // InputStream subclasses whitelisting, required for attachments. register(BufferedInputStream::class.java, InputStreamSerializer) register(Class.forName("sun.net.www.protocol.jar.JarURLConnection\$JarURLInputStream"), InputStreamSerializer) noReferencesWithin<WireTransaction>() register(ECPublicKeyImpl::class.java, publicKeySerializer) register(EdDSAPublicKey::class.java, publicKeySerializer) register(EdDSAPrivateKey::class.java, PrivateKeySerializer) register(CompositeKey::class.java, publicKeySerializer) // Using a custom serializer for compactness // Exceptions. We don't bother sending the stack traces as the client will fill in its own anyway. register(Array<StackTraceElement>::class, read = { _, _ -> emptyArray() }, write = { _, _, _ -> }) // This ensures a NonEmptySetSerializer is constructed with an initial value. register(NonEmptySet::class.java, NonEmptySetSerializer) register(BitSet::class.java, BitSetSerializer()) register(Class::class.java, ClassSerializer) register(FileInputStream::class.java, InputStreamSerializer) register(CertPath::class.java, CertPathSerializer) register(X509CertPath::class.java, CertPathSerializer) register(BCECPrivateKey::class.java, PrivateKeySerializer) register(BCECPublicKey::class.java, publicKeySerializer) register(BCRSAPrivateCrtKey::class.java, PrivateKeySerializer) register(BCRSAPublicKey::class.java, publicKeySerializer) register(BCSphincs256PrivateKey::class.java, PrivateKeySerializer) register(BCSphincs256PublicKey::class.java, publicKeySerializer) register(NotaryChangeWireTransaction::class.java, NotaryChangeWireTransactionSerializer) register(PartyAndCertificate::class.java, PartyAndCertificateSerializer) // Don't deserialize PrivacySalt via its default constructor. register(PrivacySalt::class.java, PrivacySaltSerializer) // Used by the remote verifier, and will possibly be removed in future. register(ContractAttachment::class.java, ContractAttachmentSerializer) register(java.lang.invoke.SerializedLambda::class.java) register(ClosureSerializer.Closure::class.java, CordaClosureBlacklistSerializer) register(ContractUpgradeWireTransaction::class.java, ContractUpgradeWireTransactionSerializer) register(ContractUpgradeFilteredTransaction::class.java, ContractUpgradeFilteredTransactionSerializer) for (whitelistProvider in serializationWhitelists) { val types = whitelistProvider.whitelist require(types.toSet().size == types.size) { val duplicates = types.toMutableList() types.toSet().forEach { duplicates -= it } "Cannot add duplicate classes to the whitelist ($duplicates)." } for (type in types) { ((kryo.classResolver as? CordaClassResolver)?.whitelist as? MutableClassWhitelist)?.add(type) } } - MaxLineLength:DefaultKryoCustomizer.kt$DefaultKryoCustomizer$register(Class.forName("sun.net.www.protocol.jar.JarURLConnection\$JarURLInputStream"), InputStreamSerializer) - MaxLineLength:DefaultKryoCustomizer.kt$DefaultKryoCustomizer.ContractAttachmentSerializer$return ContractAttachment.create(lazyAttachment, contract, additionalContracts, uploader, signers, version) - MaxLineLength:DefaultKryoCustomizer.kt$DefaultKryoCustomizer.CustomInstantiatorStrategy$val strat = if (type.name.startsWith("java.") && !isPublic(type.modifiers)) fallbackStrategy else defaultStrategy + MaxLineLength:DefaultKryoCustomizer.kt$DefaultKryoCustomizer$// Store a little schema of field names in the stream the first time a class is used which increases tolerance // for change to a class. setDefaultSerializer(CompatibleFieldSerializer::class.java) // Take the safest route here and allow subclasses to have fields named the same as super classes. fieldSerializerConfig.cachedFieldNameStrategy = FieldSerializer.CachedFieldNameStrategy.EXTENDED instantiatorStrategy = CustomInstantiatorStrategy() // Required for HashCheckingStream (de)serialization. // Note that return type should be specifically set to InputStream, otherwise it may not work, i.e. val aStream : InputStream = HashCheckingStream(...). addDefaultSerializer(InputStream::class.java, InputStreamSerializer) addDefaultSerializer(SerializeAsToken::class.java, SerializeAsTokenSerializer<SerializeAsToken>()) addDefaultSerializer(Logger::class.java, LoggerSerializer) addDefaultSerializer(X509Certificate::class.java, X509CertificateSerializer) // WARNING: reordering the registrations here will cause a change in the serialized form, since classes // with custom serializers get written as registration ids. This will break backwards-compatibility. // Please add any new registrations to the end. // TODO: re-organise registrations into logical groups before v1.0 register(Arrays.asList("").javaClass, ArraysAsListSerializer()) register(LazyMappedList::class.java, LazyMappedListSerializer) register(SignedTransaction::class.java, SignedTransactionSerializer) register(WireTransaction::class.java, WireTransactionSerializer) register(SerializedBytes::class.java, SerializedBytesSerializer) UnmodifiableCollectionsSerializer.registerSerializers(this) ImmutableListSerializer.registerSerializers(this) ImmutableSetSerializer.registerSerializers(this) ImmutableSortedSetSerializer.registerSerializers(this) ImmutableMapSerializer.registerSerializers(this) ImmutableMultimapSerializer.registerSerializers(this) // InputStream subclasses whitelisting, required for attachments. register(BufferedInputStream::class.java, InputStreamSerializer) register(Class.forName("sun.net.www.protocol.jar.JarURLConnection\$JarURLInputStream"), InputStreamSerializer) noReferencesWithin<WireTransaction>() register(PublicKey::class.java, publicKeySerializer) register(PrivateKey::class.java, PrivateKeySerializer) register(EdDSAPublicKey::class.java, publicKeySerializer) register(EdDSAPrivateKey::class.java, PrivateKeySerializer) register(CompositeKey::class.java, publicKeySerializer) // Using a custom serializer for compactness // Exceptions. We don't bother sending the stack traces as the client will fill in its own anyway. register(Array<StackTraceElement>::class, read = { _, _ -> emptyArray() }, write = { _, _, _ -> }) // This ensures a NonEmptySetSerializer is constructed with an initial value. register(NonEmptySet::class.java, NonEmptySetSerializer) register(BitSet::class.java, BitSetSerializer()) register(Class::class.java, ClassSerializer) register(FileInputStream::class.java, InputStreamSerializer) register(CertPath::class.java, CertPathSerializer) register(BCECPrivateKey::class.java, PrivateKeySerializer) register(BCECPublicKey::class.java, publicKeySerializer) register(BCRSAPrivateCrtKey::class.java, PrivateKeySerializer) register(BCRSAPublicKey::class.java, publicKeySerializer) register(BCSphincs256PrivateKey::class.java, PrivateKeySerializer) register(BCSphincs256PublicKey::class.java, publicKeySerializer) register(NotaryChangeWireTransaction::class.java, NotaryChangeWireTransactionSerializer) register(PartyAndCertificate::class.java, PartyAndCertificateSerializer) // Don't deserialize PrivacySalt via its default constructor. register(PrivacySalt::class.java, PrivacySaltSerializer) // Used by the remote verifier, and will possibly be removed in future. register(ContractAttachment::class.java, ContractAttachmentSerializer) register(java.lang.invoke.SerializedLambda::class.java) register(ClosureSerializer.Closure::class.java, CordaClosureBlacklistSerializer) register(ContractUpgradeWireTransaction::class.java, ContractUpgradeWireTransactionSerializer) register(ContractUpgradeFilteredTransaction::class.java, ContractUpgradeFilteredTransactionSerializer) for (whitelistProvider in serializationWhitelists) { val types = whitelistProvider.whitelist require(types.toSet().size == types.size) { val duplicates = types.toMutableList() types.toSet().forEach { duplicates -= it } "Cannot add duplicate classes to the whitelist ($duplicates)." } for (type in types) { ((kryo.classResolver as? CordaClassResolver)?.whitelist as? MutableClassWhitelist)?.add(type) } } MaxLineLength:DeliverSessionMessageTransition.kt$DeliverSessionMessageTransition$Action.SendExisting(initiatedSession.peerParty, existingMessage, SenderDeduplicationId(deduplicationId, startingState.senderUUID)) - MaxLineLength:DeliverSessionMessageTransition.kt$DeliverSessionMessageTransition$is FlowException -> DeclaredField<Party?>(FlowException::class.java, "peer", exception).value = sessionState.peerParty - MaxLineLength:DeliverSessionMessageTransition.kt$DeliverSessionMessageTransition$pendingDeduplicationHandlers = currentState.pendingDeduplicationHandlers + event.deduplicationHandler - MaxLineLength:DeliverSessionMessageTransition.kt$DeliverSessionMessageTransition$sessions = checkpoint.sessions + (sessionId to sessionState.copy(rejectionError = flowError)) - MaxLineLength:DeliverSessionMessageTransition.kt$DeliverSessionMessageTransition$sessions = currentState.checkpoint.sessions + (event.sessionMessage.recipientSessionId to initiatedSession) - MaxLineLength:DeliverSessionMessageTransition.kt$DeliverSessionMessageTransition$sessions = startingState.checkpoint.sessions + (event.sessionMessage.recipientSessionId to newSessionState) - MaxLineLength:DeserializationInput.kt$DeserializationInput$"Existing reference type mismatch. Expected: '$type', found: '${objectRetrieved::class.java}' " - MaxLineLength:DeserializationInput.kt$DeserializationInput$@VisibleForTesting @Throws(AMQPNoTypeNotSerializableException::class) fun getEnvelope(byteSequence: ByteSequence, context: SerializationContext) - MaxLineLength:DeserializationInput.kt$DeserializationInput$clazz - MaxLineLength:DeserializationInput.kt$DeserializationInput$if (type != TypeIdentifier.UnknownType.getLocalType() && serializer.type != type && with(serializer.type) { !isSubClassOf(type) && !materiallyEquivalentTo(type) } ) { throw AMQPNotSerializableException( type, "Described type with descriptor ${obj.descriptor} was " + "expected to be of type $type but was ${serializer.type}") } - MaxLineLength:DeserializationInput.kt$DeserializationInput$throw NotSerializableException("Internal deserialization failure: ${e.javaClass.name}: ${e.message}").apply { initCause(e) } - MaxLineLength:DeserializationInput.kt$DeserializationInput${ // It must be a reference to an instance that has already been read, cheaply and quickly returning it by reference. val objectIndex = (obj.described as UnsignedInteger).toInt() if (objectIndex >= objectHistory.size) throw AMQPNotSerializableException( type, "Retrieval of existing reference failed. Requested index $objectIndex " + "is outside of the bounds for the list of size: ${objectHistory.size}") val objectRetrieved = objectHistory[objectIndex] if (!objectRetrieved::class.java.isSubClassOf(type.asClass())) { throw AMQPNotSerializableException( type, "Existing reference type mismatch. Expected: '$type', found: '${objectRetrieved::class.java}' " + "@ $objectIndex") } objectRetrieved } - MaxLineLength:DeserializationInput.kt$DeserializationInput.Companion$@Throws(AMQPNoTypeNotSerializableException::class) fun getEnvelope(byteSequence: ByteSequence, encodingWhitelist: EncodingWhitelist = NullEncodingWhitelist): Envelope - MaxLineLength:DeserializationInput.kt$DeserializationInput.Companion$throw AMQPNoTypeNotSerializableException(encodingNotPermittedFormat.format(encoding)) - MaxLineLength:DeserializeAndReturnEnvelopeTests.kt$DeserializeAndReturnEnvelopeTests$assertEquals(null, obj.envelope.schema.types.find { it.name == "java.lang.Comparable<${classTestName("Foo")}>" }) MaxLineLength:DeserializeMapTests.kt$DeserializeMapTests$Assertions.assertThatThrownBy { TestSerializationOutput(VERBOSE, sf).serialize(c) } .isInstanceOf(IllegalArgumentException::class.java) - MaxLineLength:DeserializeNeedingCarpentryTests.kt$DeserializeNeedingCarpentryTests$val classInstance = outerClass.constructors.first().newInstance(nestedClass.constructors.first().newInstance("name")) - MaxLineLength:DeserializeNeedingCarpentryTests.kt$DeserializeNeedingCarpentryTests${ val testVal = 10 val clazz = ClassCarpenterImpl(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf("a" to NonNullableField(Int::class.java)))) val classInstance = clazz.constructors[0].newInstance(testVal) val serialisedBytes = TestSerializationOutput(VERBOSE, sf1).serialize(classInstance) val deserializedObj1 = DeserializationInput(sf1).deserialize(serialisedBytes) assertEquals(clazz, deserializedObj1::class.java) assertEquals(testVal, deserializedObj1::class.java.getMethod("getA").invoke(deserializedObj1)) val deserializedObj2 = DeserializationInput(sf1).deserialize(serialisedBytes) assertEquals(clazz, deserializedObj2::class.java) assertEquals(deserializedObj1::class.java, deserializedObj2::class.java) assertEquals(testVal, deserializedObj2::class.java.getMethod("getA").invoke(deserializedObj2)) val deserializedObj3 = DeserializationInput(sf2).deserializeWithoutAndWithCarpenter(serialisedBytes) assertNotEquals(clazz, deserializedObj3::class.java) assertNotEquals(deserializedObj1::class.java, deserializedObj3::class.java) assertNotEquals(deserializedObj2::class.java, deserializedObj3::class.java) assertEquals(testVal, deserializedObj3::class.java.getMethod("getA").invoke(deserializedObj3)) // NOTE: There is no point attempting this without the carepenter a second time as having carpented things up once // it will, of course, just succeed even with the carpenter disabled val deserializedObj4 = DeserializationInput(sf2).deserialize(serialisedBytes) assertNotEquals(clazz, deserializedObj4::class.java) assertNotEquals(deserializedObj1::class.java, deserializedObj4::class.java) assertNotEquals(deserializedObj2::class.java, deserializedObj4::class.java) assertEquals(deserializedObj3::class.java, deserializedObj4::class.java) assertEquals(testVal, deserializedObj4::class.java.getMethod("getA").invoke(deserializedObj4)) } MaxLineLength:DeserializeQueryableStateTest.kt$DeserializeQueryableStateTest$val clientContext = AMQP_RPC_CLIENT_CONTEXT.copy(whitelist = AllWhitelist, deserializationClassLoader = ClassLoaderWithoutTestState(ClassLoader.getSystemClassLoader())) - MaxLineLength:DeserializeSimpleTypesTests.kt$DeserializeSimpleTypesTests$garbo [class MaxLineLength:DevCertificatesTest.kt$DevCertificatesTest$val oldNodeCaKeyStore = loadKeyStore(javaClass.classLoader.getResourceAsStream("regression-test/$OLD_NODE_DEV_KEYSTORE_FILE_NAME"), OLD_DEV_KEYSTORE_PASS) - MaxLineLength:DevIdentityGenerator.kt$DevIdentityGenerator$ fun generateDistributedNotaryCompositeIdentity(dirs: List<Path>, notaryName: CordaX500Name, threshold: Int = 1): Party MaxLineLength:DevIdentityGenerator.kt$DevIdentityGenerator$DEV_CA_KEY_STORE_PASS MaxLineLength:DevIdentityGenerator.kt$DevIdentityGenerator$val p2pKeyStore = FileBasedCertificateStoreSupplier(certificatesDirectory / "sslkeystore.jks", DEV_CA_KEY_STORE_PASS, DEV_CA_KEY_STORE_PASS) MaxLineLength:DevIdentityGenerator.kt$DevIdentityGenerator$val p2pTrustStore = FileBasedCertificateStoreSupplier(certificatesDirectory / "truststore.jks", DEV_CA_TRUST_STORE_PASS, DEV_CA_TRUST_STORE_PRIVATE_KEY_PASS) MaxLineLength:DevIdentityGenerator.kt$DevIdentityGenerator$val signingCertStore = FileBasedCertificateStoreSupplier(certificatesDirectory / "nodekeystore.jks", DEV_CA_KEY_STORE_PASS, DEV_CA_KEY_STORE_PASS) MaxLineLength:DigitalSignatureWithCert.kt$DigitalSignatureWithCert : DigitalSignature - MaxLineLength:DigitalSignatureWithCert.kt$DigitalSignatureWithCert$val parameters = PKIXParameters(setOf(TrustAnchor(parentCertsChain.last(), null))).apply { isRevocationEnabled = false } - MaxLineLength:DigitalSignatureWithCert.kt$SignedDataWithCert<T : Any> : NamedByHash - MaxLineLength:DigitalSignatureWithCert.kt$net.corda.core.internal.DigitalSignatureWithCert.kt - MaxLineLength:Disruption.kt$connection.runShellCommandGetOutput("sudo rm ${connection.remoteNode.nodeDirectory}/persistence.mv.db").getResultOrThrow() MaxLineLength:Disruption.kt$val shell = "for c in {1..$parallelism} ; do openssl enc -aes-128-cbc -in /dev/urandom -pass pass: -e > /dev/null & done && JOBS=\$(jobs -p) && (sleep $durationSeconds && kill \$JOBS) & wait" - MaxLineLength:DistributedServiceTests.kt$DistributedServiceTests$// TODO Use a dummy distributed service rather than a Raft Notary Service as this test is only about Artemis' ability // to handle distributed services @Test fun `requests are distributed evenly amongst the nodes`() - MaxLineLength:DistributedServiceTests.kt$DistributedServiceTests$assertThat(notaryNodes.flatMap { it.nodeInfo.legalIdentities - raftNotaryIdentity }.toSet()).hasSameSizeAs(notaryNodes) - MaxLineLength:DistributedServiceTests.kt$DistributedServiceTests$proxy.stateMachinesFeed().updates.map { Pair(proxy.nodeInfo().legalIdentitiesAndCerts.first().party, it) } MaxLineLength:DockerContainerPusher.kt$DockerContainerPusher$override - MaxLineLength:DockerUtils.kt$DockerUtils$private - MaxLineLength:Driver.kt$ fun <A> driver(defaultParameters: DriverParameters = DriverParameters(), dsl: DriverDSL.() -> A): A - MaxLineLength:Driver.kt$DriverParameters - MaxLineLength:Driver.kt$DriverParameters$@Deprecated("extraCordappPackagesToScan does not preserve the original CorDapp's versioning and metadata, which may lead to " + "misleading results in tests. Use cordappsForAllNodes instead.") - MaxLineLength:Driver.kt$DriverParameters$@Deprecated("extraCordappPackagesToScan does not preserve the original CorDapp's versioning and metadata, which may lead to " + "misleading results in tests. Use withCordappsForAllNodes instead.") MaxLineLength:Driver.kt$DriverParameters$@Deprecated("extraCordappPackagesToScan does not preserve the original CorDapp's versioning and metadata, which may lead to " + "misleading results in tests. Use withCordappsForAllNodes instead.") fun withExtraCordappPackagesToScan(extraCordappPackagesToScan: List<String>): DriverParameters - MaxLineLength:Driver.kt$DriverParameters$constructor(cordappsForAllNodes: Collection<TestCordapp>) : this(isDebug = false, cordappsForAllNodes = cordappsForAllNodes) MaxLineLength:Driver.kt$DriverParameters$fun withCordappsForAllNodes(cordappsForAllNodes: Collection<TestCordapp>?): DriverParameters - MaxLineLength:Driver.kt$DriverParameters$fun withDebugPortAllocation(debugPortAllocation: PortAllocation): DriverParameters - MaxLineLength:Driver.kt$DriverParameters$fun withNetworkParameters(networkParameters: NetworkParameters): DriverParameters MaxLineLength:Driver.kt$DriverParameters$fun withNotaryCustomOverrides(notaryCustomOverrides: Map<String, Any?>): DriverParameters - MaxLineLength:Driver.kt$DriverParameters$fun withStartNodesInProcess(startNodesInProcess: Boolean): DriverParameters - MaxLineLength:Driver.kt$DriverParameters$fun withSystemProperties(systemProperties: Map<String, String>): DriverParameters MaxLineLength:Driver.kt$DriverParameters$fun withWaitForAllNodesToFinish(waitForAllNodesToFinish: Boolean): DriverParameters MaxLineLength:Driver.kt$InProcess$ fun <T> startFlow(logic: FlowLogic<T>): CordaFuture<T> - MaxLineLength:Driver.kt$JmxPolicy MaxLineLength:Driver.kt$JmxPolicy$@Deprecated("The default constructor does not turn on monitoring. Simply leave the jmxPolicy parameter unspecified if you wish to not " + "have monitoring turned on.") MaxLineLength:Driver.kt$PortAllocation.Incremental$@Deprecated("This has been superseded by net.corda.testing.driver.SharedMemoryIncremental.INSTANCE", ReplaceWith("SharedMemoryIncremental.INSTANCE")) MaxLineLength:Driver.kt$PortAllocation.Incremental$@Deprecated("This has been superseded by net.corda.testing.driver.SharedMemoryIncremental.INSTANCE", ReplaceWith("net.corda.testing.driver.DriverDSL.nextPort()")) - MaxLineLength:DriverDSL.kt$DriverDSL$ @Suppress("DEPRECATION") fun startWebserver(handle: NodeHandle): CordaFuture<WebserverHandle> - MaxLineLength:DriverDSL.kt$DriverDSL$ fun startNode( defaultParameters: NodeParameters = NodeParameters(), providedName: CordaX500Name? = defaultParameters.providedName, rpcUsers: List<User> = defaultParameters.rpcUsers, verifierType: VerifierType = defaultParameters.verifierType, customOverrides: Map<String, Any?> = defaultParameters.customOverrides, startInSameProcess: Boolean? = defaultParameters.startInSameProcess, maximumHeapSize: String = defaultParameters.maximumHeapSize ): CordaFuture<NodeHandle> - MaxLineLength:DriverDSL.kt$DriverDSL$ fun startNode( defaultParameters: NodeParameters = NodeParameters(), providedName: CordaX500Name? = defaultParameters.providedName, rpcUsers: List<User> = defaultParameters.rpcUsers, verifierType: VerifierType = defaultParameters.verifierType, customOverrides: Map<String, Any?> = defaultParameters.customOverrides, startInSameProcess: Boolean? = defaultParameters.startInSameProcess, maximumHeapSize: String = defaultParameters.maximumHeapSize, logLevelOverride: String? = defaultParameters.logLevelOverride ): CordaFuture<NodeHandle> - MaxLineLength:DriverDSLImpl.kt$CompatibilityZoneParams - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$ private fun startOutOfProcessMiniNode(config: NodeConfig, vararg extraCmdLineFlag: String): CordaFuture<Unit> - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$/** * Future which completes when the network map infrastructure is available, whether a local one or one from the CZ. * This future acts as a gate to prevent nodes from starting too early. The value of the future is a [LocalNetworkMap] * object, which is null if the network map is being provided by the CZ. */ private lateinit var networkMapAvailability: CordaFuture<LocalNetworkMap?> - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$LocalNetworkMap - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$NodeConfig MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$NodeConfiguration::rpcUsers.name to if (users.isEmpty()) defaultRpcUserList else users.map { it.toConfig().root().unwrapped() } MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$NodeParameters(rpcUsers = spec.rpcUsers, verifierType = spec.verifierType, customOverrides = notaryConfig + customOverrides, maximumHeapSize = spec.maximumHeapSize) - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$NodeParameters(rpcUsers = spec.rpcUsers, verifierType = spec.verifierType, customOverrides = notaryConfig(clusterAddress)) MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$NodeParameters(rpcUsers = spec.rpcUsers, verifierType = spec.verifierType, customOverrides = notaryConfig(nodeAddress, clusterAddress)) - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$OutOfProcessImpl(rpc.nodeInfo(), rpc, config.corda, webAddress, useHTTPS, debugPort, process, onNodeExit) - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$_executorService = Executors.newScheduledThreadPool(2, ThreadFactoryBuilder().setNameFormat("driver-pool-thread-%d").build()) MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$_notaries.map { notary -> notary.map { handle -> handle.nodeHandles } }.getOrThrow(notaryHandleTimeout).forEach { future -> future.getOrThrow(notaryHandleTimeout) } - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$fun notaryConfig(nodeAddress: NetworkHostAndPort, clusterAddress: NetworkHostAndPort? = null): Map<String, Any> - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$override - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$p2pAddress: NetworkHostAndPort = portAllocation.nextHostAndPort() - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$paths.filter { it.fileName.toString().startsWith(NodeInfoFilesCopier.NODE_INFO_FILE_NAME_PREFIX) }.findFirst().get() MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$private - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$return (0 until spec.cluster!!.clusterSize).map { spec.name.copy(organisation = "${spec.name.organisation}-$it") } - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$startNodeRegistration(name, compatibilityZone.rootCert, compatibilityZone.config(), parameters.customOverrides) - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$val client = OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build() MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$val flowOverrideConfig = FlowOverrideConfig(parameters.flowOverrides.map { FlowOverride(it.key.canonicalName, it.value.canonicalName) }) MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$val jdbcUrl = "jdbc:h2:mem:persistence${inMemoryCounter.getAndIncrement()};DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;WRITE_DELAY=100" - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$val name = parameters.providedName ?: CordaX500Name("${oneOf(names).organisation}-${p2pAddress.port}", "London", "GB") - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$val nodeInfo = Node(config.corda, MOCK_VERSION_INFO, initialiseSerialization = false).generateAndSaveNodeInfo() MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$val process = startOutOfProcessNode(config, quasarJarPath, debugPort, systemProperties, parameters.maximumHeapSize, parameters.logLevelOverride) - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl$val processDeathFuture = poll(executorService, "process death while waiting for RPC (${config.corda.myLegalName})") { if (process.isAlive) null else process } - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl${ // If no CZ is specified then the driver does the generation of the network parameters and the copying of the // node info files. startNotaryIdentityGeneration().map { notaryInfos -> Pair(notaryInfos, LocalNetworkMap(notaryInfos)) } } - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl${ // In this case we're dealing with the the RPCDriver or one of it's cousins which are internal and we don't care about them emptyList() } - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl${ // Otherwise it's the CZ's job to distribute thse via the HTTP network map, as that is what the nodes will be expecting. val notaryInfosFuture = if (compatibilityZone.rootCert == null) { // No root cert specified so we use the dev root cert to generate the notary identities. startNotaryIdentityGeneration() } else { // With a root cert specified we delegate generation of the notary identities to the CZ. startAllNotaryRegistrations(compatibilityZone.rootCert, compatibilityZone) } notaryInfosFuture.map { notaryInfos -> compatibilityZone.publishNotaries(notaryInfos) Pair(notaryInfos, null) } } - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$ private fun Map<String, Any>.removeResolvedClasspath(): Map<String, Any> - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$"com.fasterxml**;com.google**;com.ibm**;com.intellij**;com.jcabi**;com.nhaarman**;com.opengamma**;" - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$"com.lmax**;picocli**;liquibase**;com.github.benmanes**;org.json**;org.postgresql**;nonapi.io.github.classgraph**;)" - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$"com.typesafe**;com.zaxxer**;de.javakaffee**;groovy**;groovyjarjarantlr**;groovyjarjarasm**;io.atomix**;" - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$"io.github**;io.netty**;jdk**;joptsimple**;junit**;kotlin**;net.bytebuddy**;net.i2p**;org.apache**;" - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$"org.assertj**;org.bouncycastle**;org.codehaus**;org.crsh**;org.dom4j**;org.fusesource**;org.h2**;" - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$"org.hamcrest**;org.hibernate**;org.jboss**;org.jcp**;org.joda**;org.junit**;org.mockito**;org.objectweb**;" - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$/** * A sub-set of permissions that grant most of the essential operations used in the unit/integration tests as well as * in demo application like NodeExplorer. */ @Suppress("DEPRECATION") private val DRIVER_REQUIRED_PERMISSIONS = setOf( Permissions.invokeRpc(CordaRPCOps::nodeInfo), Permissions.invokeRpc(CordaRPCOps::networkMapFeed), Permissions.invokeRpc(CordaRPCOps::networkMapSnapshot), Permissions.invokeRpc(CordaRPCOps::notaryIdentities), Permissions.invokeRpc(CordaRPCOps::stateMachinesFeed), Permissions.invokeRpc(CordaRPCOps::stateMachineRecordedTransactionMappingFeed), Permissions.invokeRpc(CordaRPCOps::nodeInfoFromParty), Permissions.invokeRpc(CordaRPCOps::internalVerifiedTransactionsFeed), Permissions.invokeRpc(CordaRPCOps::internalFindVerifiedTransaction), Permissions.invokeRpc("vaultQueryBy"), Permissions.invokeRpc("vaultTrackBy"), Permissions.invokeRpc(CordaRPCOps::registeredFlows), Permissions.invokeRpc(CordaRPCOps::killFlow) ) - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$exclude.any { token -> cpEntry.contains("${File.separatorChar}$token") } || cpEntry.endsWith("-tests.jar") - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$log.info("Starting out-of-process Node ${config.corda.myLegalName.organisation}, debug port is " + (debugPort ?: "not enabled")) MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$private operator fun Config.plus(property: Pair<String, Any>) - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$private val defaultRpcUserList = listOf(InternalUser("default", "default", setOf("ALL")).toConfig().root().unwrapped()) - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$throw IllegalStateException("No quasar agent: -javaagent:lib/quasar.jar and working directory project root might fix") - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion$val excludePattern = "x(antlr**;bftsmart**;ch**;co.paralleluniverse**;com.codahale**;com.esotericsoftware**;" + "com.fasterxml**;com.google**;com.ibm**;com.intellij**;com.jcabi**;com.nhaarman**;com.opengamma**;" + "com.typesafe**;com.zaxxer**;de.javakaffee**;groovy**;groovyjarjarantlr**;groovyjarjarasm**;io.atomix**;" + "io.github**;io.netty**;jdk**;joptsimple**;junit**;kotlin**;net.bytebuddy**;net.i2p**;org.apache**;" + "org.assertj**;org.bouncycastle**;org.codehaus**;org.crsh**;org.dom4j**;org.fusesource**;org.h2**;" + "org.hamcrest**;org.hibernate**;org.jboss**;org.jcp**;org.joda**;org.junit**;org.mockito**;org.objectweb**;" + "org.objenesis**;org.slf4j**;org.w3c**;org.xml**;org.yaml**;reflectasm**;rx**;org.jolokia**;" + "com.lmax**;picocli**;liquibase**;com.github.benmanes**;org.json**;org.postgresql**;nonapi.io.github.classgraph**;)" MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.Companion${ log.info("Starting out-of-process Node ${config.corda.myLegalName.organisation}, debug port is " + (debugPort ?: "not enabled")) // Write node.conf writeConfig(config.corda.baseDirectory, "node.conf", config.typesafe.toNodeOnly()) val systemProperties = mutableMapOf( "name" to config.corda.myLegalName, "visualvm.display.name" to "corda-${config.corda.myLegalName}" ) debugPort?.let { systemProperties += "log4j2.level" to "debug" systemProperties += "log4j2.debug" to "true" } systemProperties += inheritFromParentProcess() systemProperties += overriddenSystemProperties // See experimental/quasar-hook/README.md for how to generate. val excludePattern = "x(antlr**;bftsmart**;ch**;co.paralleluniverse**;com.codahale**;com.esotericsoftware**;" + "com.fasterxml**;com.google**;com.ibm**;com.intellij**;com.jcabi**;com.nhaarman**;com.opengamma**;" + "com.typesafe**;com.zaxxer**;de.javakaffee**;groovy**;groovyjarjarantlr**;groovyjarjarasm**;io.atomix**;" + "io.github**;io.netty**;jdk**;joptsimple**;junit**;kotlin**;net.bytebuddy**;net.i2p**;org.apache**;" + "org.assertj**;org.bouncycastle**;org.codehaus**;org.crsh**;org.dom4j**;org.fusesource**;org.h2**;" + "org.hamcrest**;org.hibernate**;org.jboss**;org.jcp**;org.joda**;org.junit**;org.mockito**;org.objectweb**;" + "org.objenesis**;org.slf4j**;org.w3c**;org.xml**;org.yaml**;reflectasm**;rx**;org.jolokia**;" + "com.lmax**;picocli**;liquibase**;com.github.benmanes**;org.json**;org.postgresql**;nonapi.io.github.classgraph**;)" val extraJvmArguments = systemProperties.removeResolvedClasspath().map { "-D${it.key}=${it.value}" } + "-javaagent:$quasarJarPath=$excludePattern" val loggingLevel = when { logLevelOverride != null -> logLevelOverride debugPort == null -> "INFO" else -> "DEBUG" } val arguments = mutableListOf( "--base-directory=${config.corda.baseDirectory}", "--logging-level=$loggingLevel", "--no-local-shell").also { it += extraCmdLineFlag }.toList() // The following dependencies are excluded from the classpath of the created JVM, so that the environment resembles a real one as close as possible. // These are either classes that will be added as attachments to the node (i.e. samples, finance, opengamma etc.) or irrelevant testing libraries (test, corda-mock etc.). // TODO: There is pending work to fix this issue without custom blacklisting. See: https://r3-cev.atlassian.net/browse/CORDA-2164. val exclude = listOf("samples", "finance", "integrationTest", "test", "corda-mock", "com.opengamma.strata") val cp = ProcessUtilities.defaultClassPath.filterNot { cpEntry -> exclude.any { token -> cpEntry.contains("${File.separatorChar}$token") } || cpEntry.endsWith("-tests.jar") } return ProcessUtilities.startJavaProcess( className = "net.corda.node.Corda", // cannot directly get class for this, so just use string arguments = arguments, jdwpPort = debugPort, extraJvmArguments = extraJvmArguments, workingDirectory = config.corda.baseDirectory, maximumHeapSize = maximumHeapSize, classPath = cp ) } - MaxLineLength:DriverDSLImpl.kt$DriverDSLImpl.LocalNetworkMap$// TODO: this object will copy NodeInfo files from started nodes to other nodes additional-node-infos/ // This uses the FileSystem and adds a delay (~5 seconds) given by the time we wait before polling the file system. // Investigate whether we can avoid that. val nodeInfosCopier = NodeInfoFilesCopier().also { shutdownManager.registerShutdown(it::close) } MaxLineLength:DriverDSLImpl.kt$InternalDriverDSL$ fun <A> pollUntilNonNull(pollName: String, pollInterval: Duration = DEFAULT_POLL_INTERVAL, warnCount: Int = DEFAULT_WARN_COUNT, check: () -> A?): CordaFuture<A> MaxLineLength:DriverDSLImpl.kt$InternalDriverDSL$ fun pollUntilTrue(pollName: String, pollInterval: Duration = DEFAULT_POLL_INTERVAL, warnCount: Int = DEFAULT_WARN_COUNT, check: () -> Boolean): CordaFuture<Unit> MaxLineLength:DriverDSLImpl.kt$fun DriverDSL.startNode(providedName: CordaX500Name, devMode: Boolean, parameters: NodeParameters = NodeParameters()): CordaFuture<NodeHandle> - MaxLineLength:DriverInternal.kt$NodeHandleInternal$override val jmxAddress: NetworkHostAndPort? get() = configuration.jmxMonitoringHttpPort?.let { NetworkHostAndPort("localhost", it) } - MaxLineLength:DriverTests.kt$DriverTests$driver - MaxLineLength:DriverTests.kt$DriverTests$newNode(CordaX500Name(commonName = "Notary", organisation = "R3CEV", locality = "New York", country = "US"))().getOrThrow() MaxLineLength:DriverTests.kt$DriverTests$newNode(CordaX500Name(commonName = "Regulator", organisation = "R3CEV", locality = "New York", country = "US"))().getOrThrow() MaxLineLength:DriverTests.kt$DriverTests$val logFile = (baseDirectory / NodeStartup.LOGS_DIRECTORY_NAME).list { it.filter { a -> a.isRegularFile() && a.fileName.toString().startsWith("node") }.findFirst().get() } - MaxLineLength:DriverTests.kt$DriverTests${ // Based on local testing, running this 3 times gives us a high confidence that we'll spot if the feature is not working repeat(3) { driver(DriverParameters(startNodesInProcess = true)) { val bob = startNode(providedName = BOB_NAME).getOrThrow() assertThat(bob.rpc.networkMapSnapshot().flatMap { it.legalIdentities }).contains(defaultNotaryIdentity) } } } MaxLineLength:DummyContract.kt$DummyContract.Companion$ @JvmStatic fun generateInitial(magicNumber: Int, notary: Party, owner: PartyAndReference, vararg otherOwners: PartyAndReference): TransactionBuilder MaxLineLength:DummyContract.kt$DummyContract.Companion$StateAndContract(SingleOwnerState(magicNumber, owners.first().party), PROGRAM_ID) MaxLineLength:DummyContract.kt$DummyContract.Companion$TransactionBuilder(notary).withItems(StateAndContract(state, PROGRAM_ID), Command(Commands.Create(), owners.map { it.party.owningKey })) MaxLineLength:DummyContract.kt$DummyContract.Companion$val items = arrayOf(StateAndContract(SingleOwnerState(magicNumber, owners.first().party), PROGRAM_ID), Command(Commands.Create(), owners.first().party.owningKey), StateAndContract(SingleOwnerState(magicNumber, owners.first().party), PROGRAM_ID), Command(Commands.Create(), owners.first().party.owningKey)) - MaxLineLength:DummyContract.kt$DummyContract.SingleOwnerState$data MaxLineLength:DummyDealStateSchemaV1.kt$DummyDealStateSchemaV1 : MappedSchema MaxLineLength:DummyDealStateSchemaV1.kt$DummyDealStateSchemaV1.PersistentDummyDealState$@CollectionTable(name = "dummy_deal_states_parts", joinColumns = [(JoinColumn(name = "output_index", referencedColumnName = "output_index")), (JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"))]) MaxLineLength:DummyFungibleContract.kt$DummyFungibleContract$"for reference ${issuer.reference} at issuer ${issuer.party} the amounts balance: ${inputAmount.quantity} - ${amountExitingLedger.quantity} != ${outputAmount.quantity}" - MaxLineLength:DummyFungibleContract.kt$DummyFungibleContract$override MaxLineLength:DummyFungibleContract.kt$DummyFungibleContract$val exitCommand = tx.commands.select<Commands.Exit>(parties = null, signers = exitKeys).singleOrNull { it.value.amount.token == key } - MaxLineLength:DummyFungibleContract.kt$DummyFungibleContract$val inputAmount = inputs.sumCashOrNull() ?: throw IllegalArgumentException("there is at least one input for this group") - MaxLineLength:DummyFungibleContract.kt$DummyFungibleContract.State$override MaxLineLength:DummyIssueAndMove.kt$DummyIssueAndMove : FlowLogic - MaxLineLength:DummyLinearContract.kt$DummyLinearContract.State$override fun supportedSchemas(): Iterable<MappedSchema> MaxLineLength:DummyLinearStateSchemaV1.kt$DummyLinearStateSchemaV1 : MappedSchema MaxLineLength:DummyLinearStateSchemaV1.kt$DummyLinearStateSchemaV1.PersistentDummyLinearState$@Table(name = "dummy_linear_states", indexes = [Index(name = "external_id_idx", columnList = "external_id"), Index(name = "uuid_idx", columnList = "uuid")]) MaxLineLength:DummyLinearStateSchemaV2.kt$DummyLinearStateSchemaV2.PersistentDummyLinearState$@CollectionTable(name = "dummy_linear_states_v2_parts", joinColumns = [(JoinColumn(name = "output_index", referencedColumnName = "output_index")), (JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"))]) - MaxLineLength:DumpHistoryOnErrorInterceptor.kt$DumpHistoryOnErrorInterceptor$val (continuation, nextState) = delegate.executeTransition(fiber, previousState, event, transition, actionExecutor) MaxLineLength:DumpHistoryOnErrorInterceptor.kt$DumpHistoryOnErrorInterceptor$val transitionRecord = TransitionDiagnosticRecord(Instant.now(), fiber.id, previousState, nextState, event, transition, continuation) - MaxLineLength:DumpHistoryOnErrorInterceptor.kt$DumpHistoryOnErrorInterceptor${ val (continuation, nextState) = delegate.executeTransition(fiber, previousState, event, transition, actionExecutor) val transitionRecord = TransitionDiagnosticRecord(Instant.now(), fiber.id, previousState, nextState, event, transition, continuation) val record = records.compute(fiber.id) { _, record -> (record ?: ArrayList()).apply { add(transitionRecord) } } // Just if we decide to propagate, and not if just on the way to the hospital. Only log at debug level here - the flow transition // information is often unhelpful in the logs, and the actual cause of the problem will be logged elsewhere. if (nextState.checkpoint.errorState is ErrorState.Errored && nextState.checkpoint.errorState.propagating) { log.warn("Flow ${fiber.id} errored, dumping all transitions:\n${record!!.joinToString("\n")}") for (error in nextState.checkpoint.errorState.errors) { log.warn("Flow ${fiber.id} error", error.exception) } } if (nextState.isRemoved) { records.remove(fiber.id) } return Pair(continuation, nextState) } MaxLineLength:DurationSerializer.kt$DurationSerializer : Proxy MaxLineLength:E2ETestKeyManagementService.kt$E2ETestKeyManagementService : SingletonSerializeAsTokenKeyManagementServiceInternal - MaxLineLength:E2ETestKeyManagementService.kt$E2ETestKeyManagementService$getPrivateKey((privateKey as AliasPrivateKey).alias, cryptoService.certificateStore.entryPassword) - MaxLineLength:E2ETestKeyManagementService.kt$E2ETestKeyManagementService$throw UnsupportedOperationException("This operation is only supported by persistent key management service variants.") - MaxLineLength:EdDSATests.kt$EdDSATests$// Required to implement a custom doSign function, because Corda's Crypto.doSign does not allow empty messages (testVector1). private fun doSign(privateKey: PrivateKey, clearData: ByteArray): ByteArray - MaxLineLength:EdDSATests.kt$EdDSATests$assertEquals(it.signatureOutputHex, doSign(privateKey, it.messageToSignHex.hexToByteArray()).toHex().toLowerCase()) MaxLineLength:EdDSATests.kt$EdDSATests$assertNotEquals(testVectorEd25519ctx.signatureOutputHex, doSign(privateKey, testVectorEd25519ctx.messageToSignHex.hexToByteArray()).toHex().toLowerCase()) - MaxLineLength:EdDSATests.kt$EdDSATests$val privateKey = EdDSAPrivateKey(EdDSAPrivateKeySpec(testVectorEd25519ctx.privateKeyHex.hexToByteArray(), edParams)) - MaxLineLength:EncodingUtils.kt$ fun parsePublicKeyBase58(base58String: String): PublicKey - MaxLineLength:EncodingUtils.kt$net.corda.core.utilities.EncodingUtils.kt MaxLineLength:EnumEvolutionSerializer.kt$EnumEvolutionSerializer$val converted = conversions[enumName] ?: throw AMQPNotSerializableException(type, "No rule to evolve enum constant $type::$enumName") - MaxLineLength:EnumEvolutionSerializer.kt$EnumEvolutionSerializer$val ordinal = ordinals[converted] ?: throw AMQPNotSerializableException(type, "Ordinal not found for enum value $type::$converted") MaxLineLength:EnumEvolvabilityTests.kt$EnumEvolvabilityTests$assertThatThrownBy { SerializationOutput(sf).serialize(C(RejectMultipleRenameFrom.A)) }.isInstanceOf(NotSerializableException::class.java) .hasToString("Unable to serialize/deserialize net.corda.serialization.internal.amqp.EnumEvolvabilityTests\$RejectMultipleRenameFrom: " + "There are multiple transformations from D, which is not allowed") - MaxLineLength:EnumEvolvabilityTests.kt$EnumEvolvabilityTests$assertTrue(envelope.transformsSchema.types[WithUnknownTest::class.java.name]!!.containsKey(TransformTypes.Unknown)) - MaxLineLength:EnumEvolvabilityTests.kt$EnumEvolvabilityTests$val envelope = DeserializationInput(sf).deserializeAndReturnEnvelope(SerializedBytes<WrapsUnknown>(sb1)).envelope - MaxLineLength:EnumSerializer.kt$EnumSerializer : AMQPSerializer MaxLineLength:EnumSetSerializer.kt$EnumSetSerializer : Proxy - MaxLineLength:EnumSetSerializer.kt$EnumSetSerializer$EnumSet.complementOf(uncheckedCast<EnumSet<*>, EnumSet<MapSerializer.EnumJustUsedForCasting>>(set)).first().javaClass - MaxLineLength:EnumTransforms.kt$EnumTransforms$ private fun validateNoCycles(constants: Map<String, Int>) - MaxLineLength:EnumTransforms.kt$EnumTransforms$"Rename chain from $chainStart to $chainEnd does not end with a known constant in ${constants.keys}" - MaxLineLength:EnumTransforms.kt$EnumTransforms$throw InvalidEnumTransformsException("Rename from $from to $to would rename existing constant in $constants.keys") - MaxLineLength:EnumTransforms.kt$EnumTransforms${ if (from in constants) { throw InvalidEnumTransformsException("Rename from $from to $to would rename existing constant in $constants.keys") } // If there is an existing chain, starting at the "to" node of this edge, then there is a chain from this edge's // "from" to that chain's end. val newEnd = chainStartsToEnds[to] ?: to // If there is an existing chain, ending at the "from" node of this edge, then there is a chain from that chain's start // to this edge's "to". val newStart = chainEndsToStarts[from] ?: from // If either chain ends where it begins, we have closed a loop, and detected a cycle. if (newEnd == from || newStart == to) { throw InvalidEnumTransformsException("Rename cycle detected in rename map starting from $newStart") } // Either update, or create, the chains in both directions. chainStartsToEnds[newStart] = newEnd chainEndsToStarts[newEnd] = newStart } MaxLineLength:ErrorCodeLoggingTests.kt$ErrorCodeLoggingTests$val linesWithErrorCode = logFile.useLines { lines -> lines.filter { line -> line.contains("[errorCode=") }.filter { line -> line.contains("moreInformationAt=https://errors.corda.net/") }.toList() } MaxLineLength:ErrorCodeLoggingTests.kt$fun NodeHandle.logFile(): File - MaxLineLength:ErrorCodeRewritePolicy.kt$ErrorCodeRewritePolicy$@Plugin(name = "ErrorCodeRewritePolicy", category = Core.CATEGORY_NAME, elementType = "rewritePolicy", printObject = false) MaxLineLength:ErrorFlowTransition.kt$ErrorFlowTransition$val (initiatedSessions, newSessions) = bufferErrorMessagesInInitiatingSessions(startingState.checkpoint.sessions, errorMessages) - MaxLineLength:ErrorMessagesTests.kt$ErrorMessagesTests$"Property '$property' or its getter is non public, this renders class 'class $testname\$C' unserializable -> class $testname\$C" MaxLineLength:ErrorMessagesTests.kt$ErrorMessagesTests$@Ignore("Current behaviour allows for the serialization of objects with private members, this will be disallowed at some point in the future") - MaxLineLength:Event.kt$Event$GeneratedByExternalEvent - MaxLineLength:Event.kt$Event$RetryFlowFromSafePoint : Event MaxLineLength:Event.kt$Event.EnterSubFlow$data MaxLineLength:EventGenerator.kt$ErrorFlowsEventGenerator : EventGenerator MaxLineLength:EventGenerator.kt$ErrorFlowsEventGenerator$private - MaxLineLength:EventGenerator.kt$EventGenerator$open MaxLineLength:EventGenerator.kt$EventGenerator$protected MaxLineLength:EventGenerator.kt$EventGenerator$protected val currencyMap: MutableMap<Currency, Long> = mutableMapOf(USD to 0L, GBP to 0L) // Used for estimation of how much money we have in general. - MaxLineLength:EventProcessor.kt$EventProcessor$val status: DeliveryState = if (completer.status == MessageStatus.Acknowledged) Accepted.getInstance() else Rejected() - MaxLineLength:Eventually.kt$ inline fun <R> eventually( duration: Duration = Duration.ofSeconds(5), waitBetween: Duration = Duration.ofMillis(100), waitBefore: Duration = waitBetween, test: () -> R): R - MaxLineLength:EvolutionSerializerFactory.kt$DefaultEvolutionSerializerFactory$private - MaxLineLength:EvolutionSerializerFactory.kt$DefaultEvolutionSerializerFactory$properties.asSequence().zip(localTypeInformation.properties.values.asSequence()) - MaxLineLength:EvolutionSerializerFactory.kt$DefaultEvolutionSerializerFactory$properties: Map<String, RemotePropertyInformation> - MaxLineLength:EvolutionSerializerFactory.kt$DefaultEvolutionSerializerFactory$return EnumEvolutionSerializer(localTypeInformation.observedType, localSerializerFactory, conversions, localOrdinals) - MaxLineLength:EvolutionSerializerFactory.kt$DefaultEvolutionSerializerFactory$val bestMatchEvolutionConstructor = findEvolverConstructor(localTypeInformation.evolutionConstructors, properties) - MaxLineLength:EvolutionSerializerFactory.kt$DefaultEvolutionSerializerFactory$val convertedOrdinals = remoteOrdinals.asSequence().map { (member, ord) -> ord to conversions[member]!! }.toMap() - MaxLineLength:EvolutionSerializerFactory.kt$DefaultEvolutionSerializerFactory$val localOrdinals = localTypeInformation.members.asSequence().mapIndexed { ord, member -> member to ord }.toMap() - MaxLineLength:EvolutionSerializerFactory.kt$DefaultEvolutionSerializerFactory$val propertyTypes = properties.mapValues { (_, info) -> info.type.typeIdentifier.getLocalType(classLoader).asClass() } - MaxLineLength:EvolutionSerializerFactory.kt$DefaultEvolutionSerializerFactory${ // The no-op case: although the fingerprints don't match for some reason, we have compatible signatures. // This might happen because of inconsistent type erasure, changes to the behaviour of the fingerprinter, // or changes to the type itself - such as adding an interface - that do not change its serialisation/deserialisation // signature. if (propertyNamesMatch(localTypeInformation)) { // Make sure types are assignment-compatible, and return the local serializer for the type. validateCompatibility(localTypeInformation) return null } // Failing that, we have to create an evolution serializer. val bestMatchEvolutionConstructor = findEvolverConstructor(localTypeInformation.evolutionConstructors, properties) val constructorForEvolution = bestMatchEvolutionConstructor?.constructor ?: localTypeInformation.constructor val evolverProperties = bestMatchEvolutionConstructor?.properties ?: localTypeInformation.properties validateEvolvability(evolverProperties) return buildComposableEvolutionSerializer(localTypeInformation, constructorForEvolution, evolverProperties) } - MaxLineLength:EvolutionSerializerFactory.kt$EvolutionSerializerFactory$ fun getEvolutionSerializer( remote: RemoteTypeInformation, local: LocalTypeInformation): AMQPSerializer<Any>? - MaxLineLength:EvolutionSerializerFactoryTests.kt$EvolutionSerializerFactoryTests$val withNonNullTarget = DeserializationInput(nonStrictFactory).deserialize(SerializedBytes<C>(withoutNullUrl.readBytes())) - MaxLineLength:EvolutionSerializerFactoryTests.kt$EvolutionSerializerFactoryTests$val withNullTarget = DeserializationInput(strictFactory).deserialize(SerializedBytes<C>(withNullUrl.readBytes())) - MaxLineLength:EvolvabilityTests.kt$EvolvabilityTests${ val resource = "EvolvabilityTests.evolutionWithCarpentry" val sf = testDefaultFactory() // Uncomment to recreate // File(URI("$localPath/$resource")).writeBytes(SerializationOutput(sf).serialize(Evolved("dronf", NewEnum.BUCKLE_MY_SHOE)).bytes) val url = EvolvabilityTests::class.java.getResource(resource) val sc2 = url.readBytes() val deserialized = DeserializationInput(sf).deserialize(SerializedBytes<Evolved>(sc2)) assertEquals("dronf", deserialized.fnord) } MaxLineLength:EvolvabilityTests.kt$EvolvabilityTests${ val resource = "EvolvabilityTests.evolutionWithPrimitives" val sf = testDefaultFactory() // Uncomment to recreate // File(URI("$localPath/$resource")).writeBytes(SerializationOutput(sf).serialize(ParameterizedContainer(Parameterized(10, setOf(20)))).bytes) val url = EvolvabilityTests::class.java.getResource(resource) val sc2 = url.readBytes() val deserialized = DeserializationInput(sf).deserialize(SerializedBytes<ParameterizedContainer>(sc2)) assertEquals(10, deserialized.parameterized?.a) } - MaxLineLength:EvolvabilityTests.kt$EvolvabilityTests${ val sf = testDefaultFactory() val resource = "EvolvabilityTests.removeParameterWithCalculatedParameter" // Original version of the class as it was serialised // data class CC(val a: Int, val b: String, val c: String, val d: Int) { // @get:SerializableCalculatedProperty // val e: String get() = "$b $c" // } // File(URI("$localPath/$resource")).writeBytes(SerializationOutput(sf).serialize(CC(1, "hello", "world", 2)).bytes) data class CC(val b: String, val d: Int) { @get:SerializableCalculatedProperty val e: String get() = "$b sailor" } val url = EvolvabilityTests::class.java.getResource(resource) val sc2 = url.readBytes() val deserializedCC = DeserializationInput(sf).deserialize(SerializedBytes<CC>(sc2)) assertEquals("hello", deserializedCC.b) assertEquals(2, deserializedCC.d) assertEquals("hello sailor", deserializedCC.e) } - MaxLineLength:ExampleConfigTest.kt$ExampleConfigTest$assertThat(ConfigHelper.loadConfig(baseDirectory = baseDirectory, configFile = it).parseAsNodeConfiguration().isValid).isTrue() - MaxLineLength:Examples.kt$Examples$// maybe in the presence of negative interest rates you would want other side of contract to be able to take initiative as well val zero_coupon_bond_2 = arrange { actions { (acmeCorp or highStreetBank) may { "execute".givenThat(after("2017-09-01")) { highStreetBank.owes(acmeCorp, 1.M, USD) } } } } - MaxLineLength:ExceptionMaskingRpcOpsProxy.kt$ExceptionMaskingRpcOpsProxy$internal - MaxLineLength:ExceptionMaskingRpcOpsProxy.kt$ExceptionMaskingRpcOpsProxy.Companion$return newProxyInstance(delegate::class.java.classLoader, arrayOf(InternalCordaRPCOps::class.java), handler) as InternalCordaRPCOps - MaxLineLength:ExceptionMaskingRpcOpsProxy.kt$ExceptionMaskingRpcOpsProxy.ErrorObfuscatingInvocationHandler$private - MaxLineLength:ExceptionMaskingRpcOpsProxy.kt$ExceptionMaskingRpcOpsProxy.ErrorObfuscatingInvocationHandler$val exposed = if (error.isWhitelisted()) error else InternalNodeException((error as? IdentifiableException)?.errorId) - MaxLineLength:ExceptionSerialisingRpcOpsProxy.kt$ExceptionSerialisingRpcOpsProxy$internal - MaxLineLength:ExceptionSerialisingRpcOpsProxy.kt$ExceptionSerialisingRpcOpsProxy.Companion$return newProxyInstance(delegate::class.java.classLoader, arrayOf(InternalCordaRPCOps::class.java), handler) as InternalCordaRPCOps - MaxLineLength:ExceptionSerialisingRpcOpsProxy.kt$ExceptionSerialisingRpcOpsProxy.ErrorSerialisingInvocationHandler$private - MaxLineLength:ExceptionSerialisingRpcOpsProxy.kt$ExceptionSerialisingRpcOpsProxy.ErrorSerialisingInvocationHandler$val serialisable = (superclasses(error::class.java) + error::class.java).any { it.isAnnotationPresent(CordaSerializable::class.java) || it.interfaces.any { it.isAnnotationPresent(CordaSerializable::class.java) } } + MaxLineLength:EvolvabilityTests.kt$EvolvabilityTests.Companion$private val DUMMY_NOTARY_PARTY = Party(DUMMY_NOTARY_NAME, Crypto.deriveKeyPairFromEntropy(Crypto.DEFAULT_SIGNATURE_SCHEME, BigInteger.valueOf(20)).public) MaxLineLength:ExceptionsErrorCodeFunctions.kt$CompositeMessage$private - MaxLineLength:ExceptionsErrorCodeFunctions.kt$cause != null && !visited.contains(cause) -> Objects.hash(*fields, cause.staticLocationBasedHash(hashedFields, visited + cause)) MaxLineLength:ExceptionsErrorCodeFunctions.kt$error != null && level.isInRange(Level.FATAL, Level.WARN) -> CompositeMessage("$formattedMessage [errorCode=${error.errorCode()}, moreInformationAt=${error.errorCodeLocationUrl()}]", format, parameters, throwable) MaxLineLength:ExceptionsErrorCodeFunctions.kt$fun Throwable.errorCodeLocationUrl() MaxLineLength:ExceptionsErrorCodeFunctions.kt$private - MaxLineLength:ExceptionsSerializationTest.kt$ExceptionsSerializationTest - MaxLineLength:ExchangeRateModel.kt$ExchangeRate$ fun exchangeAmount(amount: Amount<Currency>, to: Currency) - MaxLineLength:Expect.kt$ fun <E> parallel(expectations: List<ExpectCompose<E>>): ExpectCompose<E> - MaxLineLength:Expect.kt$ fun <E> parallel(vararg expectations: ExpectCompose<E>): ExpectCompose<E> - MaxLineLength:Expect.kt$ fun <E> sequence(vararg expectations: ExpectCompose<E>): ExpectCompose<E> - MaxLineLength:Expect.kt$/** * Internally we create a "lazy" state automaton. The outgoing edges are state.getExpectedEvents() modulo additional * matching logic. When an event comes we extract the first edge that matches using state.nextState(event), which * returns the next state and the piece of dsl to be run on the event. If nextState() returns null it means the event * didn't match at all, in this case we either fail (if isStrict=true) or carry on with the same state (if isStrict=false) * * TODO Think about pre-compiling the state automaton, possibly introducing regexp constructs. This requires some * thinking, as the [parallel] construct blows up the state space factorially, so we need some clever lazy expansion * of states. */ var state = ExpectComposeState.fromExpectCompose(expectCompose()) - MaxLineLength:Expect.kt$/** * This file defines a simple DSL for testing non-deterministic sequence of events arriving on an [Observable]. * * [sequence] is used to impose ordering invariants on the stream, whereas [parallel] allows events to arrive in any order. * * The only restriction on [parallel] is that we should be able to discriminate which branch to take based on the * arrived event's type and optionally custom matching logic. If this is ambiguous the first matching piece of DSL will * be run. * * [sequence]s and [parallel]s can be nested arbitrarily * * Example usage: * * val stream: Observable<SomeEvent> = (..) * stream.expectEvents { * sequence( * expect { event: SomeEvent.A -> require(event.isOk()) }, * parallel( * expect { event.SomeEvent.B -> }, * expect { event.SomeEvent.C -> } * ) * ) * } * * The above will test our expectation that the stream should first emit an A, and then a B and C in unspecified order. */ private val log: Logger = LoggerFactory.getLogger("Expect") - MaxLineLength:Expect.kt$log.info("$event :: ${expectedStates.map { it.simpleName }} -> ${next?.second?.getExpectedEvents()?.map { it.simpleName }}") - MaxLineLength:Explorer.kt$Explorer${ // Make sure that the explorer has cordapps on its class path. This is only necessary because currently apps // require the original class files to deserialise states: Kryo serialisation doesn't let us write generic // tools that work with serialised data structures. But the AMQP serialisation revamp will fix this by // integrating the class carpenter, so, we can eventually get rid of this function. // // Note: does not copy dependencies because we should soon be making all apps fat jars and dependencies implicit. // // TODO: Remove this code when serialisation has been upgraded. val cordappsDir = config.explorerDir / NodeConfig.CORDAPP_DIR_NAME cordappsDir.createDirectories() config.cordappsDir.list { it.forEachOrdered { path -> val destPath = cordappsDir / path.fileName.toString() try { // Try making a symlink to make things faster and use less disk space. Files.createSymbolicLink(destPath, path) } catch (e: UnsupportedOperationException) { // OS doesn't support symbolic links? path.copyTo(destPath, REPLACE_EXISTING) } catch (e: java.nio.file.FileAlreadyExistsException) { // OK, don't care ... } catch (e: IOException) { // Windows 10 might not allow this user to create a symlink log.warn("Failed to create symlink '{}' for '{}': {}", destPath, path, e.message) path.copyTo(destPath, REPLACE_EXISTING) } } } } - MaxLineLength:ExposeJpaToFlowsTests.kt$ExposeJpaToFlowsTests$FooSchemaV1 : MappedSchema - MaxLineLength:ExposeJpaToFlowsTests.kt$ExposeJpaToFlowsTests.FooSchemaV1$PersistentFoo : Serializable - MaxLineLength:ExternalIdMappingTest.kt$ExternalIdMappingTest$vaultService.queryBy<DummyState>(QueryCriteria.VaultQueryCriteria(externalIds = listOf(UUID.randomUUID()))).states - MaxLineLength:FastThreadLocalTest.kt$FastThreadLocalTest$private - MaxLineLength:FetchDataFlow.kt$FetchAttachmentsFlow$otherSide: FlowSession - MaxLineLength:FetchDataFlow.kt$FetchAttachmentsFlow${ // This can happen when another transaction will insert the same attachment during this transaction. // The outcome is the same (the attachment is imported), so we can ignore this exception. logger.debug { "Attachment ${attachment.id} already inserted." } } MaxLineLength:FetchDataFlow.kt$FetchAttachmentsFlow.FetchedAttachment$private - MaxLineLength:FetchDataFlow.kt$FetchAttachmentsFlow.FetchedAttachment.Token$override fun fromToken(context: SerializeAsTokenContext) MaxLineLength:FetchDataFlow.kt$FetchDataFlow$IllegalTransactionRequest : FlowException - MaxLineLength:FetchDataFlow.kt$FetchDataFlow$MissingNetworkParameters : FlowException - MaxLineLength:FetchDataFlow.kt$FetchDataFlow$if (stx == null) toFetch += txid else // Although the full object is loaded here, only return the id. This prevents the full set of objects already present from // being checkpointed every time a request is made to download an object the node does not yet have. fromDisk += txid - MaxLineLength:FetchDataFlow.kt$FetchDataFlow$logger.debug { "Requesting ${toFetch.size} dependency(s) for verification from ${otherSideSession.counterparty.name}" } - MaxLineLength:FetchDataFlow.kt$FetchDataFlow$maybeItems += otherSideSession.sendAndReceive<List<W>>(Request.Data(NonEmptySet.of(hash), dataType)).unwrap { it } - MaxLineLength:FetchDataFlow.kt$FetchDataFlow${ // We skip the validation here (with unwrap { it }) because we will do it below in validateFetchResponse. // The only thing checked is the object type. It is a protocol violation to send results out of order. // TODO We need to page here after large messages will work. maybeItems += otherSideSession.sendAndReceive<List<W>>(Request.Data(NonEmptySet.of(hash), dataType)).unwrap { it } } - MaxLineLength:FetchDataFlow.kt$FetchDataFlow${ logger.debug { "Requesting ${toFetch.size} dependency(s) for verification from ${otherSideSession.counterparty.name}" } // TODO: Support "large message" response streaming so response sizes are not limited by RAM. // We can then switch to requesting items in large batches to minimise the latency penalty. // This is blocked by bugs ARTEMIS-1278 and ARTEMIS-1279. For now we limit attachments and txns to 10mb each // and don't request items in batch, which is a performance loss, but works around the issue. We have // configured Artemis to not fragment messages up to 10mb so we can send 10mb messages without problems. // Above that, we start losing authentication data on the message fragments and take exceptions in the // network layer. val maybeItems = ArrayList<W>(toFetch.size) for (hash in toFetch) { // We skip the validation here (with unwrap { it }) because we will do it below in validateFetchResponse. // The only thing checked is the object type. It is a protocol violation to send results out of order. // TODO We need to page here after large messages will work. maybeItems += otherSideSession.sendAndReceive<List<W>>(Request.Data(NonEmptySet.of(hash), dataType)).unwrap { it } } // Check for a buggy/malicious peer answering with something that we didn't ask for. val downloaded = validateFetchResponse(UntrustworthyData(maybeItems), toFetch) logger.debug { "Fetched ${downloaded.size} elements from ${otherSideSession.counterparty.name}" } maybeWriteToDisk(downloaded) // Re-load items already present before the download procedure. This ensures these objects are not unnecessarily checkpointed. val loadedFromDisk = loadExpected(fromDisk) Result(loadedFromDisk, downloaded) } - MaxLineLength:FetchDataFlow.kt$FetchNetworkParametersFlow : FetchDataFlow MaxLineLength:FetchDataFlow.kt$FetchNetworkParametersFlow$otherSide: FlowSession MaxLineLength:FetchDataFlow.kt$FetchTransactionsFlow : FetchDataFlow - MaxLineLength:FiberDeserializationCheckingInterceptor.kt$FiberDeserializationCheckingInterceptor$val (continuation, nextState) = delegate.executeTransition(fiber, previousState, event, transition, actionExecutor) MaxLineLength:FiberUtils.kt$// TODO: This method uses a built-in Quasar function to make a map of all ThreadLocals. This is probably inefficient, but the only API readily available. fun <V, T> Fiber<V>.swappedOutThreadLocalValue(threadLocal: ThreadLocal<T>): T? - MaxLineLength:FiberUtils.kt$private val fiberThreadLocalsField: Field = Fiber::class.java.getDeclaredField("fiberLocals").apply { this.isAccessible = true } - MaxLineLength:FinalityFlow.kt$FinalityFlow : FlowLogic - MaxLineLength:FinalityFlow.kt$FinalityFlow$"${session.counterparty} has finished prematurely and we're trying to send them the finalised transaction. " - MaxLineLength:FinalityFlow.kt$FinalityFlow$"Do not provide flow sessions for the local node. FinalityFlow will record the notarised transaction locally." - MaxLineLength:FinalityFlow.kt$FinalityFlow$/** * Notarise the given transaction and broadcast it to all the participants. * * @param transaction What to commit. * @param sessions A collection of [FlowSession]s for each non-local participant of the transaction. Sessions to non-participants can * also be provided. */ @JvmOverloads constructor( transaction: SignedTransaction, sessions: Collection<FlowSession>, progressTracker: ProgressTracker = tracker() ) : this(transaction, emptyList(), progressTracker, sessions, true) - MaxLineLength:FinalityFlow.kt$FinalityFlow$/** * Notarise the given transaction and broadcast it to all the participants. * * @param transaction What to commit. * @param sessions A collection of [FlowSession]s for each non-local participant. * @param oldParticipants An **optional** collection of parties for participants who are still using the old API. * * You will only need to use this parameter if you have upgraded your CorDapp from the V3 FinalityFlow API but are required to provide * backwards compatibility with participants running V3 nodes. If you're writing a new CorDapp then this does not apply and this * parameter should be ignored. */ @Deprecated(DEPRECATION_MSG) constructor( transaction: SignedTransaction, sessions: Collection<FlowSession>, oldParticipants: Collection<Party>, progressTracker: ProgressTracker ) : this(transaction, oldParticipants, progressTracker, sessions, true) MaxLineLength:FinalityFlow.kt$FinalityFlow$@Deprecated(DEPRECATION_MSG) constructor(transaction: SignedTransaction, extraRecipients: Set<Party>) : this(transaction, extraRecipients, tracker(), emptyList(), false) MaxLineLength:FinalityFlow.kt$FinalityFlow$@Deprecated(DEPRECATION_MSG) constructor(transaction: SignedTransaction, progressTracker: ProgressTracker) : this(transaction, emptySet(), progressTracker, emptyList(), false) - MaxLineLength:FinalityFlow.kt$FinalityFlow$if (notary != null) transaction.verifySignaturesExcept(notary.owningKey) else transaction.verifyRequiredSignatures() - MaxLineLength:FinalityFlow.kt$FinalityFlow$logger - MaxLineLength:FinalityFlow.kt$FinalityFlow$require(it.isEmpty()) { "The following parties are specified both in flow sessions and in the oldParticipants list: $it" } - MaxLineLength:FinalityFlow.kt$FinalityFlow$val commandDataTypes = transaction.tx.commands.asSequence().mapNotNull { it.value::class.qualifiedName }.distinct() - MaxLineLength:FinalityFlow.kt$FinalityFlow.Companion$"accept notarised transactions without first checking their relevancy. Instead, use one of the constructors " - MaxLineLength:FinalityFlow.kt$FinalityFlow.Companion$private const - MaxLineLength:FinalityFlow.kt$ReceiveFinalityFlow : FlowLogic MaxLineLength:FinalityFlow.kt$ReceiveFinalityFlow$private val statesToRecord: StatesToRecord = ONLY_RELEVANT MaxLineLength:FinalityFlow.kt$ReceiveFinalityFlow$return subFlow(object : ReceiveTransactionFlow(otherSideSession, checkSufficientSignatures = true, statesToRecord = statesToRecord) { override fun checkBeforeRecording(stx: SignedTransaction) { require(expectedTxId == null || expectedTxId == stx.id) { "We expected to receive transaction with ID $expectedTxId but instead got ${stx.id}. Transaction was" + "not recorded and nor its states sent to the vault." } } }) - MaxLineLength:FinalityFlow.kt$ReceiveFinalityFlow.<no name provided>$"We expected to receive transaction with ID $expectedTxId but instead got ${stx.id}. Transaction was" - MaxLineLength:FinalityFlowMigration.kt$ExistingInitiatingFlow : FlowLogic - MaxLineLength:FinalityFlowMigration.kt$ExistingInitiatingFlow${ // Otherwise they're at least on version 2 and so we can send the finalised transaction on the existing session. subFlow(FinalityFlow(fullySignedTx, session)) } - MaxLineLength:FinalityFlowMigration.kt$ExistingResponderFlow${ // The other side is not using the old CorDapp so call ReceiveFinalityFlow to record the finalised transaction. // If SignTransactionFlow is used then we can verify the tranaction we receive for recording is the same one // that was just signed. subFlow(ReceiveFinalityFlow(otherSide, expectedTxId = txWeJustSigned.id)) } - MaxLineLength:FinalityFlowTests.kt$FinalityFlowTests$override val mockNet = InternalMockNetwork(cordappsForAllNodes = listOf(FINANCE_CONTRACTS_CORDAPP, enclosedCordapp())) - MaxLineLength:FinalityHandlerTest.kt$FinalityHandlerTest$( legalName = BOB_NAME, // The node disables the FinalityHandler completely if there are no old CorDapps loaded, so we need to add // a token old CorDapp to keep the handler running. additionalCordapps = setOf(DUMMY_CONTRACTS_CORDAPP.copy(targetPlatformVersion = 3)) ) - MaxLineLength:FinalityHandlerTest.kt$FinalityHandlerTest$val alice = mockNet.createNode(InternalMockNodeParameters(legalName = ALICE_NAME, additionalCordapps = FINANCE_CORDAPPS)) - MaxLineLength:FinalityHandlerTest.kt$FinalityHandlerTest${ // Setup a network where only Alice has the finance CorDapp and it sends a cash tx to Bob who doesn't have the // CorDapp. Bob's FinalityHandler will error when validating the tx. val alice = mockNet.createNode(InternalMockNodeParameters(legalName = ALICE_NAME, additionalCordapps = FINANCE_CORDAPPS)) var bob = mockNet.createNode(InternalMockNodeParameters( legalName = BOB_NAME, // The node disables the FinalityHandler completely if there are no old CorDapps loaded, so we need to add // a token old CorDapp to keep the handler running. additionalCordapps = setOf(DUMMY_CONTRACTS_CORDAPP.copy(targetPlatformVersion = 3)) )) val stx = alice.issueCashTo(bob) val finalityHandlerId = bob.trackFinalityHandlerId().run { alice.finaliseWithOldApi(stx) getOrThrow() } bob.assertFlowSentForObservationDueToConstraintError(finalityHandlerId) assertThat(bob.getTransaction(stx.id)).isNull() bob = mockNet.restartNode(bob) // Since we've not done anything to fix the orignal error, we expect the finality handler to be sent to the hospital // again on restart bob.assertFlowSentForObservationDueToConstraintError(finalityHandlerId) assertThat(bob.getTransaction(stx.id)).isNull() } MaxLineLength:FinanceJSONSupport.kt$CalendarDeserializer$StringArrayDeserializer.instance.deserialize(parser, context).fold(BusinessCalendar.EMPTY) { acc, name -> acc + loadTestCalendar(name) } - MaxLineLength:FinanceJSONSupport.kt$ExpressionSerializer$override fun serialize(expr: Expression, generator: JsonGenerator, provider: SerializerProvider) - MaxLineLength:FinanceTypes.kt$DateRollConvention - MaxLineLength:FinanceTypes.kt$DealState$ fun generateAgreement(notary: Party): TransactionBuilder - MaxLineLength:FinanceTypes.kt$Tenor$return BusinessCalendar.calculateDaysBetween(startDate, adjustedMaturityDate, DayCountBasisYear.Y360, DayCountBasisDay.DActual) - MaxLineLength:FinanceTypes.kt$Tenor$val match = regex.matchEntire(name)?.groupValues ?: throw IllegalArgumentException("Unrecognised tenor name: $name") - MaxLineLength:FinanceTypesTest.kt$FinanceTypesTest$exampleTenors.all { Tenor(it).name.isNotEmpty() } MaxLineLength:FinanceTypesTest.kt$FinanceTypesTest$val ret = BusinessCalendar.createGenericSchedule(startDate = LocalDate.of(2014, 11, 25), period = Frequency.Monthly, noOfAdditionalPeriods = 3) - MaxLineLength:FinanceWorkflowsUtils.kt$BusinessCalendar(stream.reader().readText().split(",").map { BusinessCalendar.parseDateFromString(it) }.toSortedSet()) MaxLineLength:FinanceWorkflowsUtils.kt$val stream = UnknownCalendar::class.java.getResourceAsStream("/net/corda/finance/workflows/utils/${name}HolidayCalendar.txt") ?: throw UnknownCalendar(name) - MaxLineLength:FingerPrinterTesting.kt$FingerPrinterTestingTests$val customSerializerRegistry: CustomSerializerRegistry = CachingCustomSerializerRegistry(descriptorBasedSerializerRegistry) - MaxLineLength:FingerPrinterTesting.kt$FingerPrinterTestingTests$val typeModel = ConfigurableLocalTypeModel(WhitelistBasedTypeModelConfiguration(AllWhitelist, customSerializerRegistry)) MaxLineLength:FixingFlow.kt$FixingFlow.Fixer$@Suspendable override - MaxLineLength:FixingFlow.kt$FixingFlow.Fixer$override - MaxLineLength:FixingFlow.kt$FixingFlow.Fixer$val addFixing = object : RatesFixFlow(ptx, handshake.payload.oracle, fixOf, BigDecimal.ZERO, BigDecimal.ONE) { @Suspendable override fun beforeSigning(fix: Fix) { newDeal.generateFix(ptx, StateAndRef(txState, handshake.payload.ref), fix) // We set the transaction's time-window: it may be that none of the contracts need this! // But it can't hurt to have one. ptx.setTimeWindow(serviceHub.clock.instant(), 30.seconds) } @Suspendable override fun filtering(elem: Any): Boolean { return when (elem) { // Only expose Fix commands in which the oracle is on the list of requested signers // to the oracle node, to avoid leaking privacy is Command<*> -> handshake.payload.oracle.owningKey in elem.signers && elem.value is Fix else -> false } } } MaxLineLength:FixingFlow.kt$FixingFlow.FixingRoleDecider$val counterparty = serviceHub.identityService.wellKnownPartyFromAnonymous(parties[1]) ?: throw IllegalStateException("Cannot resolve floater party") - MaxLineLength:FixingFlow.kt$FixingFlow.Floater$override val progressTracker: ProgressTracker = TwoPartyDealFlow.Primary.tracker() - MaxLineLength:FlattenedList.kt$FlattenedList${ // TODO this assumes that if wasAdded() == true then we are adding elements to the getFrom() position val removeStart = c.from val removeRange = c.removed.size val removeEnd = c.from + removeRange val iterator = indexMap.iterator() for (entry in iterator) { val (wrapped, pair) = entry val (index, listener) = pair if (index >= removeStart) { if (index < removeEnd) { wrapped.observableValue.removeListener(listener) iterator.remove() } else { // Shift indices entry.setValue(Pair(index - removeRange, listener)) } } } nextRemove(removeStart, removed.map { it.value }) } - MaxLineLength:FlattenedList.kt$FlattenedList<A> : TransformationList - MaxLineLength:FlowAsyncOperationTests.kt$FlowAsyncOperationTests.WorkerServiceTask$private MaxLineLength:FlowCheckpointCordapp.kt$SendMessageFlow : FlowLogic - MaxLineLength:FlowCheckpointCordapp.kt$SendMessageFlow$val txBuilder = TransactionBuilder(notary).withItems(StateAndContract(messageState, MESSAGE_CONTRACT_PROGRAM_ID), txCommand) - MaxLineLength:FlowCheckpointCordapp.kt$SendMessageFlow.Companion$fun tracker() - MaxLineLength:FlowCheckpointVersionNodeStartupCheckTest.kt$FlowCheckpointVersionNodeStartupCheckTest$( // The part of the log message generated by CheckpointIncompatibleException.FlowVersionIncompatibleException "that is incompatible with the current installed version of" ) - MaxLineLength:FlowCheckpointVersionNodeStartupCheckTest.kt$FlowCheckpointVersionNodeStartupCheckTest$assertThat(defaultCordapp.jarFile.hash).isNotEqualTo(modifiedCordapp.jarFile.hash) - MaxLineLength:FlowCheckpointVersionNodeStartupCheckTest.kt$FlowCheckpointVersionNodeStartupCheckTest$bob.rpc.stateMachinesFeed().let { it.updates.map { it.id }.startWith(it.snapshot.map { it.id }) }.toBlocking().first() - MaxLineLength:FlowCookbook.kt$InitiatorFlow : FlowLogic MaxLineLength:FlowCookbook.kt$InitiatorFlow$val fullySignedTx: SignedTransaction = subFlow(CollectSignaturesFlow(twiceSignedTx, setOf(counterpartySession, regulatorSession), SIGS_GATHERING.childProgressTracker())) MaxLineLength:FlowCookbook.kt$InitiatorFlow$val notarisedTx1: SignedTransaction = subFlow(FinalityFlow(fullySignedTx, listOf(counterpartySession), FINALISATION.childProgressTracker())) - MaxLineLength:FlowCookbook.kt$InitiatorFlow$val notarisedTx2: SignedTransaction = subFlow(FinalityFlow(fullySignedTx, partySessions, FINALISATION.childProgressTracker())) - MaxLineLength:FlowCookbook.kt$InitiatorFlow$val otherIdentity2: PartyAndCertificate = serviceHub.keyManagementService.freshKeyAndCert(ourIdentityAndCert, false) - MaxLineLength:FlowCookbook.kt$InitiatorFlow$val otherIdentity: PartyAndCertificate = serviceHub.keyManagementService.freshKeyAndCert(ourIdentityAndCert, false) - MaxLineLength:FlowCookbook.kt$InitiatorFlow$val packet2: UntrustworthyData<Boolean> = counterpartySession.sendAndReceive<Boolean>("You can send and receive any class!") - MaxLineLength:FlowCookbook.kt$InitiatorFlow$val txState: TransactionState<DummyState> = TransactionState(ourOutputState, DummyContract.PROGRAM_ID, specificNotary) - MaxLineLength:FlowCookbook.kt$ResponderFlow${ // The ``ResponderFlow` has all the same APIs available. It looks // up network information, sends and receives data, and constructs // transactions in exactly the same way. /**----------------------------- * SENDING AND RECEIVING DATA * -----------------------------**/ progressTracker.currentStep = RECEIVING_AND_SENDING_DATA // We need to respond to the messages sent by the initiator: // 1. They sent us an ``Any`` instance // 2. They waited to receive an ``Integer`` instance back // 3. They sent a ``String`` instance and waited to receive a // ``Boolean`` instance back // Our side of the flow must mirror these calls. // DOCSTART 08 val any: Any = counterpartySession.receive<Any>().unwrap { data -> data } val string: String = counterpartySession.sendAndReceive<String>(99).unwrap { data -> data } counterpartySession.send(true) // DOCEND 08 /**---------------------------------------- * RESPONDING TO COLLECT_SIGNATURES_FLOW * ----------------------------------------**/ progressTracker.currentStep = SIGNING // The responder will often need to respond to a call to // ``CollectSignaturesFlow``. It does so my invoking its own // ``SignTransactionFlow`` subclass. // DOCSTART 16 val signTransactionFlow: SignTransactionFlow = object : SignTransactionFlow(counterpartySession) { override fun checkTransaction(stx: SignedTransaction) = requireThat { // Any additional checking we see fit... val outputState = stx.tx.outputsOfType<DummyState>().single() require(outputState.magicNumber == 777) } } val idOfTxWeSigned = subFlow(signTransactionFlow).id // DOCEND 16 /**----------------------------- * FINALISING THE TRANSACTION * -----------------------------**/ progressTracker.currentStep = FINALISATION // As the final step the responder waits to receive the notarised transaction from the sending party // Since it knows the ID of the transaction it just signed, the transaction ID is specified to ensure the correct // transaction is received and recorded. // DOCSTART ReceiveFinalityFlow subFlow(ReceiveFinalityFlow(counterpartySession, expectedTxId = idOfTxWeSigned)) // DOCEND ReceiveFinalityFlow } - MaxLineLength:FlowException.kt$FlowException : CordaExceptionIdentifiableException - MaxLineLength:FlowFrameworkPersistenceTests.kt$FlowFrameworkPersistenceTests$aliceNode = mockNet.createNode(InternalMockNodeParameters(legalName = ALICE_NAME, flowManager = aliceFlowManager)) MaxLineLength:FlowFrameworkPersistenceTests.kt$FlowFrameworkPersistenceTests$assertEquals(0, charlieNode.internals.checkpointStorage.checkpoints().size, "Checkpoints left after restored flow should have ended") - MaxLineLength:FlowFrameworkPersistenceTests.kt$FlowFrameworkPersistenceTests$assertEquals(0, node2b.internals.checkpointStorage.checkpoints().size, "Checkpoints left after restored flow should have ended") MaxLineLength:FlowFrameworkPersistenceTests.kt$FlowFrameworkPersistenceTests$assertEquals(payload + 1, secondFlow.getOrThrow().receivedPayload2, "Received payload does not match the expected second value on Node 2") MaxLineLength:FlowFrameworkPersistenceTests.kt$FlowFrameworkPersistenceTests$assertEquals(payload, secondFlow.getOrThrow().receivedPayload, "Received payload does not match the (restarted) first value on Node 2") - MaxLineLength:FlowFrameworkPersistenceTests.kt$FlowFrameworkPersistenceTests$assertEquals(payload2 + 1, firstAgain.receivedPayload2, "Received payload does not match the expected second value on Node 3") - MaxLineLength:FlowFrameworkPersistenceTests.kt$FlowFrameworkPersistenceTests$mockNet.messagingNetwork.sentMessages.toSessionTransfers().filter { it.isPayloadTransfer }.forEach { sentCount++ } - MaxLineLength:FlowFrameworkPersistenceTests.kt$FlowFrameworkPersistenceTests${ val payload = random63BitValue() val payload2 = random63BitValue() var sentCount = 0 mockNet.messagingNetwork.sentMessages.toSessionTransfers().filter { it.isPayloadTransfer }.forEach { sentCount++ } val charlieNode = mockNet.createNode(InternalMockNodeParameters(legalName = CHARLIE_NAME)) val secondFlow = charlieNode.registerCordappFlowFactory(PingPongFlow::class) { PingPongFlow(it, payload2) } mockNet.runNetwork() val charlie = charlieNode.info.singleIdentity() // Kick off first send and receive bobNode.services.startFlow(PingPongFlow(charlie, payload)) bobNode.database.transaction { assertEquals(1, bobNode.internals.checkpointStorage.checkpoints().size) } // Make sure the add() has finished initial processing. bobNode.internals.disableDBCloseOnStop() // Restart node and thus reload the checkpoint and resend the message with same UUID bobNode.dispose() bobNode.database.transaction { assertEquals(1, bobNode.internals.checkpointStorage.checkpoints().size) // confirm checkpoint bobNode.services.networkMapCache.clearNetworkMapCache() } val node2b = mockNet.createNode(InternalMockNodeParameters(bobNode.internals.id)) bobNode.internals.manuallyCloseDB() val (firstAgain, fut1) = node2b.getSingleFlow<PingPongFlow>() // Run the network which will also fire up the second flow. First message should get deduped. So message data stays in sync. mockNet.runNetwork() fut1.getOrThrow() val receivedCount = receivedSessionMessages.count { it.isPayloadTransfer } // Check flows completed cleanly and didn't get out of phase assertEquals(4, receivedCount, "Flow should have exchanged 4 unique messages")// Two messages each way // can't give a precise value as every addMessageHandler re-runs the undelivered messages assertTrue(sentCount > receivedCount, "Node restart should have retransmitted messages") node2b.database.transaction { assertEquals(0, node2b.internals.checkpointStorage.checkpoints().size, "Checkpoints left after restored flow should have ended") } charlieNode.database.transaction { assertEquals(0, charlieNode.internals.checkpointStorage.checkpoints().size, "Checkpoints left after restored flow should have ended") } assertEquals(payload2, firstAgain.receivedPayload, "Received payload does not match the first value on Node 3") assertEquals(payload2 + 1, firstAgain.receivedPayload2, "Received payload does not match the expected second value on Node 3") assertEquals(payload, secondFlow.getOrThrow().receivedPayload, "Received payload does not match the (restarted) first value on Node 2") assertEquals(payload + 1, secondFlow.getOrThrow().receivedPayload2, "Received payload does not match the expected second value on Node 2") } - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$CommitReceiverFlow : FlowLogic - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$CommitterFlow : FlowLogic - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$SuspendThrowingActionExecutor : ActionExecutor - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$WaitForLedgerCommitFlow : FlowLogic - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$aliceNode.registerCordappFlowFactory(WaitForLedgerCommitFlow::class) { ExceptionFlow { throw Exception("Error") } } - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$aliceNode.sendSessionMessage(InitialSessionMessage(SessionId(random63BitValue()), 0, "not.a.real.Class", 1, "", null), bob) - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$aliceNode.sendSessionMessage(InitialSessionMessage(SessionId(random63BitValue()), 0, String::class.java.name, 1, "", null), bob) - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$assertThat((lastMessage.payload as RejectSessionMessage).message).isEqualTo("${String::class.java.name} is not a flow") - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$assertThat(committerStx.getOrThrow()).isEqualTo(waiterStx.getOrThrow()).isEqualTo(commitReceiverStx.getOrThrow()) MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$assertThat(receivedSessionMessages).hasSize(1) - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$assertThatExceptionOfType(MyFlowException::class.java) .isThrownBy { receivingFiber.resultFuture.getOrThrow() } .withMessage("Nothing useful") .withStackTraceContaining(ReceiveFlow::class.java.name) - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$assertThatExceptionOfType(MyPeerFlowException::class.java) .isThrownBy { receivingFiber.resultFuture.getOrThrow() } .has(Condition(Predicate<MyPeerFlowException> { it.peer == alice }, "subclassed peer field has original value")) - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$bobNode.registerCordappFlowFactory(UpgradedFlow::class, initiatedFlowVersion = 1) { InitiatedSendFlow("Old initiated", it) } - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$bobNode.smm.flowHospital.dropSessionInit(sessionInitRecord.id) - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$fiber.transientValues = TransientReference(fiber.transientValues!!.value.copy(actionExecutor = throwingActionExecutor)) - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$val anonymousBob = bobNode.services.keyManagementService.freshKeyAndCert(bobNode.info.legalIdentitiesAndCerts.single(), false) - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$val anonymousBob = bobNode.services.keyManagementService.freshKeyAndCert(bobNode.info.legalIdentitiesAndCerts.single(), false) .party.anonymise() - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$val bobResponderFlow = bobNode.registerCordappFlowFactory(SendAndReceiveFlow::class) { SingleInlinedSubFlow(it) } - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$val result = aliceNode.services.startFlow(SendAndReceiveFlow(anonymousBob.party.anonymise(), "Hello")).resultFuture - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests$val throwingActionExecutor = SuspendThrowingActionExecutor(exceptionDuringSuspend, fiber.transientValues!!.value.actionExecutor) - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests.ConditionalExceptionFlow$private - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests.IncorrectCustomSendFlow$@InitiatingFlow private - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests.UpgradedFlow$@InitiatingFlow(version = 2) private - MaxLineLength:FlowFrameworkTests.kt$FlowFrameworkTests.WaitForOtherSideEndBeforeSendAndReceive$@Transient val receivedOtherFlowEnd: Semaphore - MaxLineLength:FlowFrameworkTests.kt$InitiatedSendFlow$internal open MaxLineLength:FlowFrameworkTests.kt$PingPongFlow$@InitiatingFlow internal - MaxLineLength:FlowFrameworkTests.kt$PingPongFlow$constructor(otherPartySession: FlowSession, payload: Long) : this(otherPartySession.counterparty, payload, otherPartySession) MaxLineLength:FlowFrameworkTests.kt$SendAndReceiveFlow$@InitiatingFlow internal - MaxLineLength:FlowFrameworkTests.kt$SendAndReceiveFlow$constructor(otherPartySession: FlowSession, payload: Any) : this(otherPartySession.counterparty, payload, otherPartySession) - MaxLineLength:FlowFrameworkTests.kt$internal MaxLineLength:FlowFrameworkTests.kt$internal fun errorMessage(errorResponse: FlowException? = null) MaxLineLength:FlowFrameworkTests.kt$internal fun sessionConfirm(flowVersion: Int = 1) MaxLineLength:FlowFrameworkTests.kt$internal infix fun Pair<Int, SessionMessage>.to(node: TestStartedNode): SessionTransfer - MaxLineLength:FlowFrameworkTests.kt$internal infix fun TestStartedNode.sent(message: SessionMessage): Pair<Int, SessionMessage> - MaxLineLength:FlowFrameworkTripartyTests.kt$FlowFrameworkTripartyTests$charlieNode.registerCordappFlowFactory(ReceiveFlow::class) { ExceptionFlow { MyFlowException("Nothing useful") } } - MaxLineLength:FlowFrameworkTripartyTests.kt$FlowFrameworkTripartyTests$val actualForNode = receivedSessionMessages.filter { it.from == node.internals.id || it.to == node.network.myAddress } - MaxLineLength:FlowHandle.kt$FlowProgressHandle<A> : FlowHandle - MaxLineLength:FlowHandle.kt$FlowProgressHandleImpl$// For API compatibility fun copy(id: StateMachineRunId, returnValue: CordaFuture<A>, progress: Observable<String>): FlowProgressHandleImpl<A> - MaxLineLength:FlowHandle.kt$FlowProgressHandleImpl$override val stepsTreeFeed: DataFeed<List<Pair<Int, String>>, List<Pair<Int, String>>>? = null - MaxLineLength:FlowHandle.kt$FlowProgressHandleImpl$return copy(id = id, returnValue = returnValue, progress = progress, stepsTreeFeed = null, stepsTreeIndexFeed = null) - MaxLineLength:FlowInitiator.kt$FlowInitiator : Principal - MaxLineLength:FlowInitiator.kt$FlowInitiator$/** * Returns an [InvocationContext], which is equivalent to this object but expressed using the successor to this * class hierarchy (which is now deprecated). The returned object has less information than it could have, so * prefer to use fetch an invocation context directly if you can (e.g. in [net.corda.core.messaging.StateMachineInfo]) */ val invocationContext: InvocationContext get() { val unknownName = CordaX500Name("UNKNOWN", "UNKNOWN", "GB") var actor: Actor? = null val origin: InvocationOrigin when (this) { is FlowInitiator.RPC -> { actor = Actor(Actor.Id(this.username), AuthServiceId("UNKNOWN"), unknownName) origin = InvocationOrigin.RPC(actor) } is FlowInitiator.Peer -> origin = InvocationOrigin.Peer(this.party.name) is FlowInitiator.Service -> origin = InvocationOrigin.Service(this.serviceClassName, unknownName) FlowInitiator.Shell -> origin = InvocationOrigin.Shell is FlowInitiator.Scheduled -> origin = InvocationOrigin.Scheduled(this.scheduledState) } return InvocationContext.newInstance(origin = origin, actor = actor) } - MaxLineLength:FlowLogic.kt$FlowLogic$ @Deprecated("Use FlowSession.getCounterpartyFlowInfo()", level = DeprecationLevel.WARNING) @Suspendable fun getFlowInfo(otherParty: Party): FlowInfo - MaxLineLength:FlowLogic.kt$FlowLogic$ @Deprecated("Use FlowSession.sendAndReceive()", level = DeprecationLevel.WARNING) @Suspendable open fun <R : Any> sendAndReceive(receiveType: Class<R>, otherParty: Party, payload: Any): UntrustworthyData<R> MaxLineLength:FlowLogic.kt$FlowLogic$ @Suspendable @JvmOverloads open fun <R : Any> receiveAll(receiveType: Class<R>, sessions: List<FlowSession>, maySkipCheckpoint: Boolean = false): List<UntrustworthyData<R>> MaxLineLength:FlowLogic.kt$FlowLogic$ @Suspendable @JvmOverloads open fun receiveAllMap(sessions: Map<FlowSession, Class<out Any>>, maySkipCheckpoint: Boolean = false): Map<FlowSession, UntrustworthyData<Any>> - MaxLineLength:FlowLogic.kt$FlowLogic$ @Suspendable fun initiateFlow(destination: Destination): FlowSession - MaxLineLength:FlowLogic.kt$FlowLogic$ @Suspendable fun waitForStateConsumption(stateRefs: Set<StateRef>) - MaxLineLength:FlowLogic.kt$FlowLogic$ @Throws(FlowException::class) fun checkFlowPermission(permissionName: String, extraAuditData: Map<String, String>) - MaxLineLength:FlowLogic.kt$FlowLogic$ fun recordAuditEvent(eventType: String, comment: String, extraAuditData: Map<String, String>) - MaxLineLength:FlowLogic.kt$FlowLogic$ fun trackStepsTree(): DataFeed<List<Pair<Int, String>>, List<Pair<Int, String>>>? - MaxLineLength:FlowLogic.kt$FlowLogic$ fun trackStepsTreeIndex(): DataFeed<Int, Int>? - MaxLineLength:FlowLogic.kt$FlowLogic$/** * @suppress * Internal only. Reference to the [co.paralleluniverse.fibers.Fiber] instance that is the top level controller for * the entire flow. When inside a flow this is equivalent to [co.paralleluniverse.strands.Strand.currentStrand]. This * is public only because it must be accessed across module boundaries. */ var stateMachine: FlowStateMachine<*> @CordaInternal get() = _stateMachine ?: throw IllegalStateException( "You cannot access the flow's state machine until the flow has been started.") @CordaInternal set(value) { _stateMachine = value } - MaxLineLength:FlowLogic.kt$FlowLogic$/** * Override this to provide a [ProgressTracker]. If one is provided and stepped, the framework will do something * helpful with the progress reports e.g record to the audit service. If this flow is invoked as a subflow of another, * then the tracker will be made a child of the current step in the parent. If it's null, this flow doesn't track * progress. * * Note that this has to return a tracker before the flow is invoked. You can't change your mind half way * through. */ open val progressTracker: ProgressTracker? = DEFAULT_TRACKER() - MaxLineLength:FlowLogic.kt$FlowLogic$/** * Specifies the identity to use for this flow. This will be one of the multiple identities that belong to this node. * This is the same as calling `ourIdentityAndCert.party`. * @see NodeInfo.legalIdentities * * Note: The current implementation returns the single identity of the node. This will change once multiple identities * is implemented. */ val ourIdentity: Party get() = stateMachine.ourIdentity - MaxLineLength:FlowLogic.kt$FlowLogic$/** * Specifies the identity, with certificate, to use for this flow. This will be one of the multiple identities that * belong to this node. * @see NodeInfo.legalIdentitiesAndCerts * * Note: The current implementation returns the single identity of the node. This will change once multiple identities * is implemented. */ val ourIdentityAndCert: PartyAndCertificate get() { return serviceHub.myInfo.legalIdentitiesAndCerts.find { it.party == stateMachine.ourIdentity } ?: throw IllegalStateException("Identity specified by ${stateMachine.id} (${stateMachine.ourIdentity}) is not one of ours!") } MaxLineLength:FlowLogic.kt$FlowLogic$?: MaxLineLength:FlowLogic.kt$FlowLogic$@Suspendable @JvmOverloads open - MaxLineLength:FlowLogic.kt$FlowLogic$@Suspendable internal - MaxLineLength:FlowLogic.kt$FlowLogic$private - MaxLineLength:FlowLogic.kt$FlowLogic.Companion$throw FlowException("Attempt to sleep for longer than 5 minutes is not supported. Consider using SchedulableState.") - MaxLineLength:FlowLogicRef.kt$FlowLogicRef - MaxLineLength:FlowLogicRefFactoryImpl.kt$FlowLogicRefFactoryImpl : SingletonSerializeAsTokenFlowLogicRefFactory MaxLineLength:FlowLogicRefFactoryImpl.kt$FlowLogicRefFactoryImpl$if (ref !is FlowLogicRefImpl) throw IllegalFlowLogicException(ref.javaClass, "FlowLogicRef was not created via correct FlowLogicRefFactory interface") - MaxLineLength:FlowLogicRefFactoryImpl.kt$FlowLogicRefFactoryImpl$open - MaxLineLength:FlowLogicRefFactoryImpl.kt$FlowLogicRefFactoryImpl$private - MaxLineLength:FlowLogicRefFactoryImpl.kt$FlowLogicRefFactoryImpl$protected open - MaxLineLength:FlowLogicRefFactoryImpl.kt$FlowLogicRefFactoryImpl$return (value is Any && parameterAssignableFrom(parameter.type.javaType, value)) || parameter.type.isMarkedNullable - MaxLineLength:FlowLogicRefFactoryImpl.kt$FlowLogicRefImpl$@CordaSerializable data MaxLineLength:FlowManager.kt$FlowManager - MaxLineLength:FlowManager.kt$FlowManager$fun registerInitiatedCoreFlowFactory(initiatingFlowClass: KClass<out FlowLogic<*>>, flowFactory: (FlowSession) -> FlowLogic<*>) MaxLineLength:FlowManager.kt$FlowManager$fun registerInitiatedCoreFlowFactory(initiatingFlowClass: KClass<out FlowLogic<*>>, initiatedFlowClass: KClass<out FlowLogic<*>>?, flowFactory: (FlowSession) -> FlowLogic<*>) MaxLineLength:FlowManager.kt$FlowManager$fun registerInitiatedCoreFlowFactory(initiatingFlowClass: KClass<out FlowLogic<*>>, initiatedFlowClass: KClass<out FlowLogic<*>>?, flowFactory: InitiatedFlowFactory.Core<FlowLogic<*>>) - MaxLineLength:FlowManager.kt$NodeFlowManager$"${InitiatingFlow::class.java.name}.version not applicable for core flows; their version is the node's platform version" - MaxLineLength:FlowManager.kt$NodeFlowManager$// To verify the integrity of the current state, it is important that the tip of the responders is a unique weight // if there are multiple flows with the same weight as the tip, it means that it is impossible to reliably pick one as the responder private fun validateInvariants(toValidate: List<RegisteredFlowContainer>) MaxLineLength:FlowManager.kt$NodeFlowManager$@Synchronized override MaxLineLength:FlowManager.kt$NodeFlowManager$FlowWeightComparator : Comparator - MaxLineLength:FlowManager.kt$NodeFlowManager$log MaxLineLength:FlowManager.kt$NodeFlowManager$log.warn("Multiple flows are registered for InitiatingFlow: $initiatingFlowClass, currently using: ${listOfFlowsForInitiator.first().initiatedFlowClass}") - MaxLineLength:FlowManager.kt$NodeFlowManager$registerInitiatedCoreFlowFactory(initiatingFlowClass, initiatedFlowClass, InitiatedFlowFactory.Core(flowFactory)) - MaxLineLength:FlowManager.kt$NodeFlowManager$throw IllegalArgumentException("$responder must have a constructor accepting a ${FlowSession::class.java.name}") MaxLineLength:FlowManager.kt$NodeFlowManager$val equalWeightAsCurrentTip = toValidate.map { flowWeightComparator.compare(currentTip, it) to it }.filter { it.first == 0 }.map { it.second } - MaxLineLength:FlowManager.kt$NodeFlowManager$val flowToAdd = RegisteredFlowContainer(initiatingFlowClass, initiatedFlowClass, flowFactory, FlowType.CORDAPP) MaxLineLength:FlowManager.kt$NodeFlowManager$val message = "Unable to determine which flow to use when responding to: ${currentTip.initiatingFlowClass.canonicalName}. ${equalWeightAsCurrentTip.map { it.initiatedFlowClass!!.canonicalName }} are all registered with equal weight." - MaxLineLength:FlowManager.kt$NodeFlowManager.FlowWeightComparator$override MaxLineLength:FlowManager.kt$NodeFlowManager.FlowWeightComparator$private open - MaxLineLength:FlowMessaging.kt$FlowMessagingImpl$@Suspendable override MaxLineLength:FlowMessaging.kt$FlowMessagingImpl$val mightDeadlockDrainingTarget = FlowStateMachineImpl.currentStateMachine()?.context?.origin.let { it is InvocationOrigin.Peer && it.party == target.name } MaxLineLength:FlowMessaging.kt$FlowMessagingImpl$val networkMessage = serviceHub.networkService.createMessage(sessionTopic, serializeSessionMessage(message).bytes, deduplicationId, message.additionalHeaders(party)) - MaxLineLength:FlowMessaging.kt$FlowMessagingImpl$val wellKnown = requireNotNull(serviceHub.identityService.wellKnownPartyFromAnonymous(destination as AnonymousParty)) { "We do not know who $destination belongs to" } MaxLineLength:FlowMessaging.kt$FlowMessagingImpl${ // Handling Kryo and AMQP serialization problems. Unfortunately the two exception types do not share much of a common exception interface. if ((exception is KryoException || exception is NotSerializableException) && message is ExistingSessionMessage && message.payload is ErrorSessionMessage) { val error = message.payload.flowException val rewrappedError = FlowException(error?.message) message.copy(payload = message.payload.copy(flowException = rewrappedError)).serialize() } else { throw exception } } - MaxLineLength:FlowMessaging.kt$FlowMessagingImpl${ // This prevents a "deadlock" in case an initiated flow tries to start a session against a draining node that is also the initiator. // It does not help in case more than 2 nodes are involved in a circle, so the kill switch via RPC should be used in that case. val mightDeadlockDrainingTarget = FlowStateMachineImpl.currentStateMachine()?.context?.origin.let { it is InvocationOrigin.Peer && it.party == target.name } return when { this !is InitialSessionMessage || mightDeadlockDrainingTarget -> emptyMap() else -> mapOf(P2PMessagingHeaders.Type.KEY to P2PMessagingHeaders.Type.SESSION_INIT_VALUE) } } - MaxLineLength:FlowMonitor.kt$FlowMonitor$flow.ioRequest()?.let { request -> warningMessageForFlowWaitingOnIo(request, flow, now) }?.let(logger::info) MaxLineLength:FlowMonitor.kt$FlowMonitor$is FlowIORequest.ExecuteAsyncOperation -> "for asynchronous operation of type ${request.operation::javaClass} to complete" - MaxLineLength:FlowMonitor.kt$FlowMonitor$is FlowIORequest.GetFlowInfo -> "to get flow information from parties ${request.sessions.partiesInvolved()}" - MaxLineLength:FlowMonitor.kt$FlowMonitor$is FlowIORequest.Send -> "to send a message to parties ${request.sessionToMessage.keys.partiesInvolved()}" MaxLineLength:FlowMonitor.kt$FlowMonitor$is FlowIORequest.SendAndReceive -> "to send and receive messages from parties ${request.sessionToMessage.keys.partiesInvolved()}" MaxLineLength:FlowMonitor.kt$FlowMonitor$is FlowIORequest.Sleep -> "to wake up from sleep ending at ${LocalDateTime.ofInstant(request.wakeUpAfter, ZoneId.systemDefault())}" - MaxLineLength:FlowMonitor.kt$FlowMonitor$is FlowIORequest.WaitForLedgerCommit -> "for the ledger to commit transaction with hash ${request.hash}" - MaxLineLength:FlowMonitor.kt$FlowMonitor$private - MaxLineLength:FlowMonitor.kt$FlowMonitor$private fun FlowStateMachineImpl<*>.ioRequest() MaxLineLength:FlowMonitor.kt$FlowMonitor$scheduler!!.scheduleAtFixedRate({ logFlowsWaitingForParty(suspensionLoggingThreshold) }, 0, monitoringPeriod.toMillis(), TimeUnit.MILLISECONDS) MaxLineLength:FlowMonitor.kt$FlowMonitor$val message = StringBuilder("Flow with id ${flow.id.uuid} has been waiting for ${flow.ongoingDuration(now).toMillis() / 1000} seconds ") - MaxLineLength:FlowOverrideTests.kt$FlowOverrideTests$assertThat(nodeB.rpc.startFlow(::Ping, nodeA.nodeInfo.singleIdentity()).returnValue.getOrThrow(), `is`(Pong.PONG)) - MaxLineLength:FlowOverrideTests.kt$FlowOverrideTests$assertThat(nodeB.rpc.startFlow(::Ping, nodeA.nodeInfo.singleIdentity()).returnValue.getOrThrow(), `is`(Pongiest.GORGONZOLA)) - MaxLineLength:FlowRetryTest.kt$FlowRetryTest$@Test fun `SQLTransientConnectionExceptions thrown by hikari are retried 3 times and then kept in the checkpoints table`() - MaxLineLength:FlowRetryTest.kt$FlowRetryTest$it.proxy.startFlow(::GeneralExternalFailureFlow, nodeBHandle.nodeInfo.singleIdentity()).returnValue.getOrThrow() MaxLineLength:FlowRetryTest.kt$FlowRetryTest$it.proxy.startFlow(::InitiatorFlow, numSessions, numIterations, nodeBHandle.nodeInfo.singleIdentity()).returnValue.getOrThrow() - MaxLineLength:FlowRetryTest.kt$InitiatorFlow : FlowLogic - MaxLineLength:FlowRetryTest.kt$Step MaxLineLength:FlowRetryTest.kt$WrappedTransientConnectionFailureFlow$throw IllegalStateException("wrapped error message", IllegalStateException("another layer deep", SQLTransientConnectionException("Connection is not available")/*.fillInStackTrace()*/)) - MaxLineLength:FlowSession.kt$Destination - MaxLineLength:FlowSession.kt$FlowSession$/** * If the destination on the other side of this session is a [Party] then returns that, otherwise throws [IllegalStateException]. * * Only use this method if it's known the other side is a [Party], otherwise use [destination]. * * @throws IllegalStateException if the other side is not a [Party]. * @see destination */ abstract val counterparty: Party - MaxLineLength:FlowSession.kt$FlowSession$/** * The [Destination] on the other side of this session. In the case of a session created by [FlowLogic.initiateFlow] this is the same * destination as the one passed to that function. */ abstract val destination: Destination MaxLineLength:FlowSessionImpl.kt$FlowSessionImpl$@Suspendable override - MaxLineLength:FlowSessionImpl.kt$FlowSessionImpl$override fun equals(other: Any?): Boolean - MaxLineLength:FlowSessionImpl.kt$FlowSessionImpl$val responseValues: Map<FlowSession, SerializedBytes<Any>> = flowStateMachine.suspend(request, maySkipCheckpoint) - MaxLineLength:FlowStackSnapshot.kt$FlowStackSnapshotFactoryImpl$if (it != null && (it is FlowLogic<*> || it is FlowStateMachine<*> || it is Fiber<*> || it is SerializeAsToken)) { StackFrameDataToken(it::class.java.name) } else { it } MaxLineLength:FlowStackSnapshot.kt$FlowStackSnapshotFactoryImpl$private - MaxLineLength:FlowStackSnapshot.kt$FlowStackSnapshotFactoryImpl$val stackObjects = if (frameObjectsIterator.hasNext() && (annotation == null || !annotation.methodOptimized)) { frameObjectsIterator.next() } else { emptyList() } - MaxLineLength:FlowStackSnapshotTest.kt$FlowStackSnapshotTest$"criteria (specifically: extra objects are introduced to the quasar stack by th Jacoco agent). You can however " - MaxLineLength:FlowStackSnapshotTest.kt$FlowStackSnapshotTest$@Ignore("When running via gradle the Jacoco agent interferes with the quasar instrumentation process and violates tested" + "criteria (specifically: extra objects are introduced to the quasar stack by th Jacoco agent). You can however " + "run these tests via an IDE.") MaxLineLength:FlowStackSnapshotTest.kt$FlowStackSnapshotTest$val a = startNode(rpcUsers = listOf(User(Constants.USER, Constants.PASSWORD, setOf(startFlow<MultiplePersistingSideEffectFlow>())))).get() - MaxLineLength:FlowStackSnapshotTest.kt$FlowStackSnapshotTest$val a = startNode(rpcUsers = listOf(User(Constants.USER, Constants.PASSWORD, setOf(startFlow<NoSideEffectFlow>())))).get() MaxLineLength:FlowStackSnapshotTest.kt$FlowStackSnapshotTest$val a = startNode(rpcUsers = listOf(User(Constants.USER, Constants.PASSWORD, setOf(startFlow<PersistingNoSideEffectFlow>())))).get() MaxLineLength:FlowStackSnapshotTest.kt$FlowStackSnapshotTest$val a = startNode(rpcUsers = listOf(User(Constants.USER, Constants.PASSWORD, setOf(startFlow<PersistingSideEffectFlow>())))).get() - MaxLineLength:FlowStackSnapshotTest.kt$FlowStackSnapshotTest$val a = startNode(rpcUsers = listOf(User(Constants.USER, Constants.PASSWORD, setOf(startFlow<SideEffectFlow>())))).get() - MaxLineLength:FlowStackSnapshotTest.kt$StackSnapshotFrame$@CordaSerializable data - MaxLineLength:FlowStateMachine.kt$FlowStateMachine$@Suspendable fun <SUSPENDRETURN : Any> suspend(ioRequest: FlowIORequest<SUSPENDRETURN>, maySkipCheckpoint: Boolean): SUSPENDRETURN - MaxLineLength:FlowStateMachineImpl.kt$"${InitiatingFlow::class.java.name}. See https://docs.corda.net/api-flows.html#flowlogic-annotations." - MaxLineLength:FlowStateMachineImpl.kt$?: - MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl$"Transaction context is missing. This might happen if a suspendable method is not annotated with @Suspendable annotation." - MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl$/** * Return the logger for this state machine. The logger name incorporates [id] and so including it in the log message * is not necessary. */ override val logger = log - MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl$@Suspendable private - MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl$Thread.currentThread().contextClassLoader = (serviceHub.cordappProvider as CordappProviderImpl).cordappLoader.appClassLoader MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl$errorAndTerminate("Caught unrecoverable error from flow. Forcibly terminating the JVM, this might leave resources open, and most likely will.", t) MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl$require(continuation == FlowContinuation.ProcessEvents) { "Expected a continuation of type ${FlowContinuation.ProcessEvents}, found $continuation " } - MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl$require(destination is Party || destination is AnonymousParty) { "Unsupported destination type ${destination.javaClass.name}" } - MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl$throw FlowPermissionException("User ${context.principal()} not permissioned for $permissionName on flow $id") - MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl$val (continuation, newState) = transitionExecutor.executeTransition(this, oldState, event, transition, actionExecutor) - MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl$val permissionGranted = true // TODO define permission control service on ServiceHubInternal and actually check authorization. - MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl$val serializationContext = TransientReference(getTransientField(TransientValues::checkpointSerializationContext)) MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl${ // This sets the Cordapp classloader on the contextClassLoader of the current thread. // Needed because in previous versions of the finance app we used Thread.contextClassLoader to resolve services defined in cordapps. Thread.currentThread().contextClassLoader = (serviceHub.cordappProvider as CordappProviderImpl).cordappLoader.appClassLoader val result = logic.call() suspend(FlowIORequest.WaitForSessionConfirmations, maySkipCheckpoint = true) Try.Success(result) } - MaxLineLength:FlowStateMachineImpl.kt$FlowStateMachineImpl.Companion$private val SERIALIZER_BLOCKER = Fiber::class.java.getDeclaredField("SERIALIZER_BLOCKER").apply { isAccessible = true }.get(null) - MaxLineLength:FlowStateMachineImpl.kt$if (found != null) throw IllegalArgumentException("${InitiatingFlow::class.java.name} can only be annotated once") MaxLineLength:FlowTestsUtils.kt$ @Suspendable fun <R : Any> FlowLogic<*>.receiveAll(receiveType: Class<R>, session: FlowSession, vararg sessions: FlowSession): List<UntrustworthyData<R>> MaxLineLength:FlowTestsUtils.kt$ @Suspendable fun FlowLogic<*>.receiveAll(session: Pair<FlowSession, Class<out Any>>, vararg sessions: Pair<FlowSession, Class<out Any>>): Map<FlowSession, UntrustworthyData<Any>> MaxLineLength:FlowTestsUtils.kt$ @Suspendable inline fun <reified R : Any> FlowLogic<*>.receiveAll(session: FlowSession, vararg sessions: FlowSession): List<UntrustworthyData<R>> - MaxLineLength:FlowTestsUtils.kt$@Suppress("UNCHECKED_CAST") infix MaxLineLength:FlowTestsUtils.kt$@Suspendable inline - MaxLineLength:FlowTestsUtils.kt$flowFactory: (FlowSession) -> T MaxLineLength:FlowTestsUtils.kt$return this.internals.registerInitiatedFlowFactory(initiatingFlowClass, initiatedFlowClass, InitiatedFlowFactory.Core(flowFactory), track) - MaxLineLength:FlowWatchPrintingSubscriber.kt$FlowWatchPrintingSubscriber$val header = RowElement(true).add("Id", "Flow name", "Initiator", "Status").style(Decoration.bold.fg(Color.black).bg(Color.white)) MaxLineLength:FlowsDrainingModeContentionTest.kt$FlowsDrainingModeContentionTest$val flow = nodeA.rpc.startFlow(::ProposeTransactionAndWaitForCommit, message, nodeARpcInfo, nodeB.nodeInfo.singleIdentity(), defaultNotaryIdentity) MaxLineLength:FlowsExecutionModeRpcTest.kt$FlowsExecutionModeRpcTest$val user = User("mark", "dadada", setOf(Permissions.invokeRpc("setFlowsDrainingModeEnabled"), Permissions.invokeRpc("isFlowsDrainingModeEnabled"))) MaxLineLength:FlowsExecutionModeRpcTest.kt$FlowsExecutionModeTests$private - MaxLineLength:FoundNode.kt$FoundNode$val name: String = configFile.parentFile.name.toLowerCase().replace(Constants.ALPHA_NUMERIC_ONLY_REGEX, "") - MaxLineLength:FungibleAsset.kt$InsufficientBalanceException : FlowException - MaxLineLength:FxTransactionBuildTutorial.kt$ForeignExchangeFlow$val sum = it.filter { it.owner.let { it is Party && serviceHub.myInfo.isLegalIdentity(it) } }.map { it.amount.quantity }.sum() MaxLineLength:FxTransactionBuildTutorial.kt$ForeignExchangeRemoteFlow$val ourKey = serviceHub.keyManagementService.filterMyKeys(ourInputState.flatMap { it.state.data.participants }.map { it.owningKey }).single() MaxLineLength:FxTransactionBuildTutorial.kt$private MaxLineLength:FxTransactionBuildTutorial.kt$val eligibleStates = serviceHub.vaultService.tryLockFungibleStatesForSpending(lockId, fullCriteria, amountRequired.withoutIssuer(), Cash.State::class.java) - MaxLineLength:FxTransactionBuildTutorial.kt$val logicalExpression = builder { CashSchemaV1.PersistentCashState::currency.equal(amountRequired.token.product.currencyCode) } MaxLineLength:FxTransactionBuildTutorial.kt$val ourParties = ourKeys.map { serviceHub.identityService.partyFromKey(it) ?: throw IllegalStateException("Unable to resolve party from key") } - MaxLineLength:GenerateHelpers.kt$return generateAmount(1, max, Generator.pure(Issued(PartyAndReference(issuer, OpaqueBytes.of(0)), currency))).combine( Generator.pickOne(possibleRecipients) ) { amount, recipient -> PaymentRequest(amount.withoutIssuer(), recipient, true, setOf(issuer)) } MaxLineLength:GenerateNodeInfoCli.kt$GenerateNodeInfoCli : NodeCliCommand - MaxLineLength:GenerateRpcSslCertsCli.kt$GenerateRpcSslCerts$println("You need to distribute this file along with the password in a secure way to all RPC clients.") MaxLineLength:GenerateRpcSslCertsCli.kt$GenerateRpcSslCertsCli : NodeCliCommand MaxLineLength:Generator.kt$Generator$fun <B, C, D, E, R> combine(other1: Generator<B>, other2: Generator<C>, other3: Generator<D>, other4: Generator<E>, function: (A, B, C, D, E) -> R) - MaxLineLength:Generator.kt$Generator$fun <B, C, D, R> combine(other1: Generator<B>, other2: Generator<C>, other3: Generator<D>, function: (A, B, C, D) -> R) MaxLineLength:Generator.kt$Generator$product<R>(other1.product(other2.product(other3.product(other4.product(pure({ e -> { d -> { c -> { b -> { a -> function(a, b, c, d, e) } } } } })))))) - MaxLineLength:Generator.kt$Generator$product<R>(other1.product(other2.product(other3.product(pure({ d -> { c -> { b -> { a -> function(a, b, c, d) } } } }))))) - MaxLineLength:Generator.kt$Generator.Companion$fun <A> replicatePoisson(meanSize: Double, generator: Generator<A>, atLeastOne: Boolean = false) - MaxLineLength:Generator.kt$Generator<out A> - MaxLineLength:GenericsTests.kt$GenericsTests$LTransactionState<T1, T2, T3 : BaseState<T1, T2>, out T4: BaseState<T1, T2>> - MaxLineLength:GenericsTests.kt$GenericsTests$StateWrapper<T1, T2, T3 : BaseState<T1, T2>, out T4: BaseState<T1, T2>> - MaxLineLength:GenericsTests.kt$GenericsTests$val bytes = SerializationOutput(factory).serializeAndReturnSchema(Wrapper(1, G1("hi"), G2("poop"))).apply { printSchema() } - MaxLineLength:GetBalances.kt$CashSchemaV1.PersistentCashState::pennies - MaxLineLength:GetBalances.kt$require(rows.otherResults[1] == currency.currencyCode){"Currency on rows returned by query does not match expected"} - MaxLineLength:GetBalances.kt$val sum = builder { CashSchemaV1.PersistentCashState::pennies.sum(groupByColumns = listOf(CashSchemaV1.PersistentCashState::currency)) } - MaxLineLength:GetBalances.kt${ val sum = builder { CashSchemaV1.PersistentCashState::pennies.sum(groupByColumns = listOf(CashSchemaV1.PersistentCashState::currency)) } val sumCriteria = QueryCriteria.VaultCustomQueryCriteria(sum) val ccyIndex = builder { CashSchemaV1.PersistentCashState::currency.equal(currency.currencyCode) } // This query should only return cash states the calling node is a participant of (meaning they can be modified/spent). val ccyCriteria = QueryCriteria.VaultCustomQueryCriteria(ccyIndex, relevancyStatus = Vault.RelevancyStatus.RELEVANT) return sumCriteria.and(ccyCriteria) } - MaxLineLength:GetBalances.kt${ val sum = builder { CashSchemaV1.PersistentCashState::pennies.sum(groupByColumns = listOf(CashSchemaV1.PersistentCashState::currency), orderBy = Sort.Direction.DESC) } // This query should only return cash states the calling node is a participant of (meaning they can be modified/spent). return QueryCriteria.VaultCustomQueryCriteria(sum, relevancyStatus = Vault.RelevancyStatus.RELEVANT) } - MaxLineLength:GroupATests.kt$GroupATests$"forClassGroupATests-setup" - MaxLineLength:GroupBTests.kt$GroupBTests$"forClassGroupBTests-setup" - MaxLineLength:GuiUtilities.kt$ fun <T> stringConverter(fromStringFunction: ((String?) -> T)? = null, toStringFunction: (T) -> String): StringConverter<T> + MaxLineLength:GenericsTests.kt$GenericsTests.Companion$private val MINI_CORP_PARTY = Party(MINI_CORP_NAME, Crypto.deriveKeyPairFromEntropy(Crypto.DEFAULT_SIGNATURE_SCHEME, BigInteger.valueOf(20)).public) MaxLineLength:GuiUtilities.kt$// TODO: This is a temporary fix for the UI to show the correct issuer identity, this will break when we start randomizing keys. More work is needed here when the identity work is done. fun StateAndRef<Cash.State>.resolveIssuer(): ObservableValue<Party?> MaxLineLength:GuiUtilities.kt$fun PublicKey.toKnownParty() - MaxLineLength:H2SecurityTests.kt$H2SecurityTests$driver - MaxLineLength:H2SecurityTests.kt$H2SecurityTests$startNode MaxLineLength:H2SecurityTests.kt$H2SecurityTests$startNode(customOverrides = mapOf(h2AddressKey to "${InetAddress.getLocalHost().hostAddress}:${getFreePort()}")).getOrThrow() - MaxLineLength:H2SecurityTests.kt$H2SecurityTests$startNode(customOverrides = mapOf(h2AddressKey to "${InetAddress.getLocalHost().hostName}:${getFreePort()}")).getOrThrow() - MaxLineLength:H2SecurityTests.kt$H2SecurityTests$val nodeHandle = startNode(rpcUsers = listOf(user), customOverrides = mapOf(h2AddressKey to "localhost:$port", dbPasswordKey to "x")).getOrThrow() - MaxLineLength:HTTPNetworkRegistrationService.kt$HTTPNetworkRegistrationService$HTTP_UNAUTHORIZED -> throw CertificateRequestException("Certificate signing request has been rejected: ${conn.errorMessage}") - MaxLineLength:HTTPNetworkRegistrationService.kt$HTTPNetworkRegistrationService$else -> throw IOException("Error while connecting to the Doorman. Http response status code was ${conn.responseCode}.") MaxLineLength:HTTPNetworkRegistrationService.kt$HTTPNetworkRegistrationService$in TRANSIENT_ERROR_STATUS_CODES -> throw ServiceUnavailableException("Could not connect with Doorman. Http response status code was ${conn.responseCode}.") MaxLineLength:HardRestartTest.kt$HardRestartTest$val rpc = tlRpc.get() ?: CordaRPCClient(a.rpcAddress).start(demoUser.username, demoUser.password).proxy.also { tlRpc.set(it) } - MaxLineLength:HardRestartTest.kt$HardRestartTest$val string = rpc.startFlow(::RecursiveA, b.nodeInfo.singleIdentity(), 10).returnValue.getOrThrow() - MaxLineLength:HashLookupCommandTest.kt$HashLookupCommandTest$testCommand(session, command = "hashLookup ${SecureHash.randomSHA256()}", expected = "No matching transaction found") - MaxLineLength:HashLookupCommandTest.kt$HashLookupCommandTest$testCommand(session, command = "hashLookup ${txId.sha256()}", expected = "Found a matching transaction with Id: $txId") MaxLineLength:HibernateColumnConverterTests.kt$HibernateColumnConverterTests$// AbstractPartyToX500NameAsStringConverter could cause circular flush of Hibernate session because it is invoked during flush, and a // cache miss was doing a flush. This also checks that loading during flush does actually work. @Test fun `issue some cash on a notary that exists only in the database to check cache loading works in our identity column converters during flush of vault update`() - MaxLineLength:HibernateColumnConverterTests.kt$HibernateColumnConverterTests${ val expected = 500.DOLLARS val ref = OpaqueBytes.of(0x01) // Create parallel set of key and identity services so that the values are not cached, forcing the node caches to do a lookup. val identityService = PersistentIdentityService(TestingNamedCacheFactory()) val originalIdentityService: PersistentIdentityService = services.identityService as PersistentIdentityService identityService.database = originalIdentityService.database identityService.start(originalIdentityService.trustRoot) val keyService = E2ETestKeyManagementService(identityService) keyService.start(setOf(myself.keyPair)) // New identity for a notary (doesn't matter that it's for Bank Of Corda... since not going to use it as an actual notary etc). val newKeyAndCert = keyService.freshKeyAndCert(services.myInfo.legalIdentitiesAndCerts[0], false) val randomNotary = Party(myself.name, newKeyAndCert.owningKey) val ourIdentity = services.myInfo.legalIdentities.first() val builder = TransactionBuilder(notary.party) val issuer = services.myInfo.legalIdentities.first().ref(ref) val signers = Cash().generateIssue(builder, expected.issuedBy(issuer), ourIdentity, randomNotary) val tx: SignedTransaction = services.signInitialTransaction(builder, signers) services.recordTransactions(tx) val output = tx.tx.outputsOfType<Cash.State>().single() assertEquals(expected.`issued by`(ourIdentity.ref(ref)), output.amount) } - MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration$ fun sessionFactoryForSchemas(key: Set<MappedSchema>): SessionFactory - MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration$// TODO: require mechanism to set schemaOptions (databaseSchema, tablePrefix) which are not global to session schema.mappedTypes.forEach { config.addAnnotatedClass(it) } - MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration$Configuration(metadataSources).setProperty("hibernate.connection.provider_class", NodeDatabaseConnectionProvider::class.java.name) .setProperty("hibernate.format_sql", "true") .setProperty("hibernate.hbm2ddl.auto", hbm2dll) .setProperty("javax.persistence.validation.mode", "none") .setProperty("hibernate.connection.isolation", databaseConfig.transactionIsolationLevel.jdbcValue.toString()) MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration$CordaMaterializedBlobType : AbstractSingleColumnStandardBasicType - MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration$CordaPrimitiveByteArrayTypeDescriptor : PrimitiveByteArrayTypeDescriptor MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration$CordaWrapperBinaryType : AbstractSingleColumnStandardBasicType MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration$MapBlobToPostgresByteA : AbstractSingleColumnStandardBasicType MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration$private MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration$private val sessionFactories = cacheFactory.buildNamed<Set<MappedSchema>, SessionFactory>(Caffeine.newBuilder(), "HibernateConfiguration_sessionFactories") MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration$val config = Configuration(metadataSources).setProperty("hibernate.connection.provider_class", NodeDatabaseConnectionProvider::class.java.name) .setProperty("hibernate.format_sql", "true") .setProperty("hibernate.hbm2ddl.auto", hbm2dll) .setProperty("javax.persistence.validation.mode", "none") .setProperty("hibernate.connection.isolation", databaseConfig.transactionIsolationLevel.jdbcValue.toString()) - MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration${ "update" } - MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration${ logger.info("Creating session factory for schemas: $schemas") val serviceRegistry = BootstrapServiceRegistryBuilder().build() val metadataSources = MetadataSources(serviceRegistry) val hbm2dll: String = if(databaseConfig.initialiseSchema && databaseConfig.initialiseAppSchema == SchemaInitializationType.UPDATE) { "update" } else if((!databaseConfig.initialiseSchema && databaseConfig.initialiseAppSchema == SchemaInitializationType.UPDATE) || databaseConfig.initialiseAppSchema == SchemaInitializationType.VALIDATE) { "validate" } else { "none" } // We set a connection provider as the auto schema generation requires it. The auto schema generation will not // necessarily remain and would likely be replaced by something like Liquibase. For now it is very convenient though. val config = Configuration(metadataSources).setProperty("hibernate.connection.provider_class", NodeDatabaseConnectionProvider::class.java.name) .setProperty("hibernate.format_sql", "true") .setProperty("hibernate.hbm2ddl.auto", hbm2dll) .setProperty("javax.persistence.validation.mode", "none") .setProperty("hibernate.connection.isolation", databaseConfig.transactionIsolationLevel.jdbcValue.toString()) schemas.forEach { schema -> // TODO: require mechanism to set schemaOptions (databaseSchema, tablePrefix) which are not global to session schema.mappedTypes.forEach { config.addAnnotatedClass(it) } } val sessionFactory = buildSessionFactory(config, metadataSources, customClassLoader) logger.info("Created session factory for schemas: $schemas") // export Hibernate JMX statistics if (databaseConfig.exportHibernateJMXStatistics) initStatistics(sessionFactory) return sessionFactory } MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration.Companion$// register custom converters fun buildHibernateMetadata(metadataBuilder: MetadataBuilder, jdbcUrl:String, attributeConverters: Collection<AttributeConverter<*, *>>): Metadata - MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration.Companion$attributeConverters.forEach { applyAttributeConverter(it) } // Register a tweaked version of `org.hibernate.type.MaterializedBlobType` that truncates logged messages. // to avoid OOM when large blobs might get logged. applyBasicType(CordaMaterializedBlobType, CordaMaterializedBlobType.name) applyBasicType(CordaWrapperBinaryType, CordaWrapperBinaryType.name) // Create a custom type that will map a blob to byteA in postgres and as a normal blob for all other dbms. // This is required for the Checkpoints as a workaround for the issue that postgres has on azure. if (jdbcUrl.contains(":postgresql:", ignoreCase = true)) { applyBasicType(MapBlobToPostgresByteA, MapBlobToPostgresByteA.name) } else { applyBasicType(MapBlobToNormalBlob, MapBlobToNormalBlob.name) } return build() - MaxLineLength:HibernateConfiguration.kt$HibernateConfiguration.NodeDatabaseConnectionProvider$override fun isUnwrappableAs(unwrapType: Class<*>?): Boolean MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$cashStates = vaultFiller.fillWithSomeTestCash(100.DOLLARS, issuerServices, numStates, issuer.ref(1), rng = Random(0L)).states.toList() MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$criteriaQuery.where(criteriaBuilder.equal(vaultStates.get<PersistentStateRef>("stateRef"), vaultCashStates.get<PersistentStateRef>("stateRef"))) MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$criteriaQuery.where(criteriaBuilder.equal(vaultStates.get<PersistentStateRef>("stateRef"), vaultLinearStates.get<PersistentStateRef>("stateRef"))) @@ -5968,37 +3571,21 @@ MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$database = configureDatabase(dataSourceProps, DatabaseConfig(initialiseSchema = initialiseSchema), identityService::wellKnownPartyFromX500Name, identityService::wellKnownPartyFromAnonymous, schemaService) MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$println("${it.stateRef} with owner ${cashState.owner.owningKey.toBase58String()} and participants ${cashState.participants.map { it.owningKey.toBase58String() }}") MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$println("${vaultState.stateRef} : [${_dummyLinearStates.externalId} ${_dummyLinearStates.uuid}] : [${_vaultLinearStates.externalId} ${_vaultLinearStates.uuid}]") - MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$private fun sessionFactoryForSchemas(vararg schemas: MappedSchema) MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val andDummyLinearStatesPredicate = criteriaBuilder.and(andDummyLinearStatesPredicate1, criteriaBuilder.and(andDummyLinearStatesPredicate2, andDummyLinearStatesPredicate3)) MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val andDummyLinearStatesPredicate1 = criteriaBuilder.and(criteriaBuilder.equal(dummyLinearStates.get<String>("linearString"), "123")) - MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val andDummyLinearStatesPredicate2 = criteriaBuilder.and(criteriaBuilder.equal(dummyLinearStates.get<Long>("linearNumber"), 123L)) MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val andDummyLinearStatesPredicate3 = criteriaBuilder.and(criteriaBuilder.equal(dummyLinearStates.get<Boolean>("linearBoolean"), true)) MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val andLinearStatesPredicate1 = criteriaBuilder.and(criteriaBuilder.equal(vaultLinearStates.get<String>("externalId"), uniqueID456.externalId)) - MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val andLinearStatesPredicate2 = criteriaBuilder.and(criteriaBuilder.equal(vaultLinearStates.get<UUID>("uuid"), uniqueID456.id)) MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val cashStates = vaultFiller.fillWithSomeTestCash(100.DOLLARS, issuerServices, 2, issuer.ref(1), ALICE, Random(0L)).states - MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val cordappPackages = listOf("net.corda.testing.internal.vault", "net.corda.finance.contracts.asset", "net.corda.finance.schemas") - MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val joinCashStateToParty = cashStatesSchema.joinSet<SampleCashSchemaV3.PersistentCashState, String>("participants") MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val joinPredicate = criteriaBuilder.equal(vaultStates.get<PersistentStateRef>("stateRef"), vaultLinearStates.get<PersistentStateRef>("stateRef")) MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val joinPredicate1 = criteriaBuilder.equal(vaultStates.get<PersistentStateRef>("stateRef"), vaultLinearStates.get<PersistentStateRef>("stateRef")) MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val joinPredicate2 = criteriaBuilder.and(criteriaBuilder.equal(vaultStates.get<PersistentStateRef>("stateRef"), dummyLinearStates.get<PersistentStateRef>("stateRef"))) MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val joinVaultStatesToCash = criteriaBuilder.equal(vaultStates.get<PersistentStateRef>("stateRef"), cashStatesSchema.get<PersistentStateRef>("stateRef")) - MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val moreCash = vaultFiller.fillWithSomeTestCash(100.DOLLARS, services, 2, identity.ref(0), identity, Random(0L)).states MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$val schemaService = NodeSchemaService(extraSchemas = setOf(CashSchemaV1, SampleCashSchemaV1, SampleCashSchemaV2, SampleCashSchemaV3, DummyLinearStateSchemaV1, DummyLinearStateSchemaV2, DummyDealStateSchemaV1)) - MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest$vaultFiller.fillWithSomeTestLinearStates(1, externalId = "123", linearString = "123", linearNumber = 123, linearBoolean = true) MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest.<no name provided>$override val vaultService = NodeVaultService(Clock.systemUTC(), keyManagementService, servicesForResolution, database, schemaService, cordappClassloader).apply { start() } - MaxLineLength:HibernateConfigurationTest.kt$HibernateConfigurationTest.<no name provided>${ for (stx in txs) { (validatedTransactions as WritableTransactionStorage).addTransaction(stx) } // Refactored to use notifyAll() as we have no other unit test for that method with multiple transactions. vaultService.notifyAll(statesToRecord, txs.map { it.tx }) } - MaxLineLength:HibernateQueryCriteriaParser.kt$AbstractQueryCriteriaParser$LIKE_IGNORE_CASE -> criteriaBuilder.like(criteriaBuilder.upper(column), columnPredicate.rightLiteral.toUpperCase()) - MaxLineLength:HibernateQueryCriteriaParser.kt$AbstractQueryCriteriaParser$NOT_IN_IGNORE_CASE -> criteriaBuilder.not(criteriaBuilder.upper(column).`in`(literal.map { it.toUpperCase() })) - MaxLineLength:HibernateQueryCriteriaParser.kt$AbstractQueryCriteriaParser$NOT_LIKE_IGNORE_CASE -> criteriaBuilder.notLike(criteriaBuilder.upper(column), columnPredicate.rightLiteral.toUpperCase()) MaxLineLength:HibernateQueryCriteriaParser.kt$AbstractQueryCriteriaParser$abstract - MaxLineLength:HibernateQueryCriteriaParser.kt$AbstractQueryCriteriaParser$private MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateAttachmentQueryCriteriaParser$AbstractQueryCriteriaParser<AttachmentQueryCriteria, AttachmentsQueryCriteriaParser, AttachmentSort>(), AttachmentsQueryCriteriaParser - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateAttachmentQueryCriteriaParser$Sort.Direction.DESC -> orderCriteria.add(criteriaBuilder.desc(root.get<String>(sortAttribute.columnName))) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateAttachmentQueryCriteriaParser$private val criteriaQuery: CriteriaQuery<NodeAttachmentService.DBAttachment> MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateAttachmentQueryCriteriaParser$val joinDBAttachmentToContractClassNames = root.joinList<NodeAttachmentService.DBAttachment, ContractClassName>("contractClassNames") - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$Sort.Direction.ASC -> criteriaBuilder.asc(criteriaBuilder.literal<Int>(orderByColumnPosition - shiftLeft)) - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$Sort.Direction.DESC -> criteriaBuilder.desc(criteriaBuilder.literal<Int>(orderByColumnPosition - shiftLeft)) - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$Triple(VaultSchemaV1.VaultStates::class.java, sortAttribute.attributeParent, sortAttribute.attributeChild) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$commonPredicates.replace(predicateID, criteriaBuilder.and(vaultStates.get<String>(VaultSchemaV1.VaultStates::contractStateClassName.name).`in`(contractStateTypes.plus(existingTypes)))) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$commonPredicates.replace(predicateID, criteriaBuilder.and(vaultStates.get<Vault.ConstraintInfo.Type>(VaultSchemaV1.VaultStates::constraintType.name).`in`(criteria.constraintTypes.plus(existingTypes)))) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$commonPredicates.replace(predicateID, criteriaBuilder.equal(vaultStates.get<Vault.RelevancyStatus>(VaultSchemaV1.VaultStates::relevancyStatus.name), criteria.relevancyStatus)) @@ -6008,44 +3595,28 @@ MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$commonPredicates[predicateID] = criteriaBuilder.equal(vaultStates.get<Vault.RelevancyStatus>(VaultSchemaV1.VaultStates::relevancyStatus.name), criteria.relevancyStatus) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$commonPredicates[predicateID] = criteriaBuilder.equal(vaultStates.get<Vault.StateStatus>(VaultSchemaV1.VaultStates::stateStatus.name), criteria.status) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$criteriaBuilder.equal(vaultStates.get<PersistentStateRef>("stateRef"), entityRoot.get<IndirectStatePersistable<*>>("compositeKey").get<PersistentStateRef>("stateRef")) - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$criteriaBuilder.equal(vaultStates.get<PersistentStateRef>("stateRef"), entityRoot.get<PersistentStateRef>("stateRef")) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$elem MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$if (path is SingularAttributePath) //remove the same columns from different joins to match the single column in 'group by' only (from the last join) aggregateExpressions.removeAll { elem -> if (elem is SingularAttributePath) elem.attribute.javaMember == path.attribute.javaMember else false } - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$is SortAttribute.Custom -> Triple(sortAttribute.entityStateClass, sortAttribute.entityStateColumnName, null) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$log.warn("Enriching previous attribute [${VaultSchemaV1.VaultStates::constraintType.name}] values [$existingTypes] with [${criteria.constraintTypes}]") MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$log.warn("Enriching previous attribute [${VaultSchemaV1.VaultStates::contractStateClassName.name}] values [$existingTypes] with [$contractStateTypes]") MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$log.warn("Overriding previous attribute [${VaultSchemaV1.VaultStates::relevancyStatus.name}] value $existingStatus with ${criteria.status}") MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$log.warn("Overriding previous attribute [${VaultSchemaV1.VaultStates::stateStatus.name}] value $existingStatus with ${criteria.status}") MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$orderCriteria.add(criteriaBuilder.asc(sortEntityRoot.get<String>(entityStateAttributeParent).get<String>(entityStateAttributeChild))) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$orderCriteria.add(criteriaBuilder.desc(sortEntityRoot.get<String>(entityStateAttributeParent).get<String>(entityStateAttributeChild))) - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$override - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$predicateSet.add(criteriaBuilder.and(vaultStates.get<String>("lockId").`in`(softLocking.lockIds.map { it.toString() }))) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$private - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$private val commonPredicates = mutableMapOf<Pair<String, Operator>, Predicate>() // schema attribute Name, operator -> predicate MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$shiftLeft += columnNumberBeforeRemoval - aggregateExpressions.size MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$sorting.copy(columns = sorting.columns + Sort.SortColumn(SortAttribute.Standard(Sort.CommonStateAttribute.STATE_REF), Sort.Direction.ASC)) - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val actualSorting = if (sorting.columns.none { it.sortAttribute == SortAttribute.Standard(Sort.CommonStateAttribute.STATE_REF) }) { sorting.copy(columns = sorting.columns + Sort.SortColumn(SortAttribute.Standard(Sort.CommonStateAttribute.STATE_REF), Sort.Direction.ASC)) } else { sorting } - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val combinedPredicates = commonPredicates.values.plus(predicateSet).plus(constraintPredicates).plus(joinPredicates) - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val existingStatus = ((commonPredicates[predicateID] as ComparisonPredicate).rightHandOperand as LiteralExpression).literal MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val existingTypes = (commonPredicates[predicateID]!!.expressions[0] as InPredicate<*>).values.map { (it as LiteralExpression).literal }.toSet() MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val externalIdJoin = criteriaBuilder.equal(vaultStates.get<VaultSchemaV1.VaultStates>("stateRef"), entityRoot.get<VaultSchemaV1.StateToExternalId>("compositeKey").get<PersistentStateRef>("stateRef")) - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val externalIdPredicate = criteriaBuilder.and(entityRoot.get<VaultSchemaV1.StateToExternalId>("externalId").`in`(ids)) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val joinPredicate = criteriaBuilder.equal(vaultStates.get<PersistentStateRef>("stateRef"), entityRoot.get<PersistentStateRef>("stateRef")) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val joinPredicate = criteriaBuilder.equal(vaultStates.get<PersistentStateRef>("stateRef"), vaultFungibleStates.get<PersistentStateRef>("stateRef")) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val joinPredicate = criteriaBuilder.equal(vaultStates.get<PersistentStateRef>("stateRef"), vaultLinearStates.get<PersistentStateRef>("stateRef")) - MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val participantsPredicate = criteriaBuilder.and(entityRoot.get<VaultSchemaV1.PersistentParty>("x500Name").`in`(participants)) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val predicateConstraintData = criteriaBuilder.equal(vaultStates.get<Vault.ConstraintInfo>(VaultSchemaV1.VaultStates::constraintData.name), constraint.data()) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val predicateConstraintType = criteriaBuilder.equal(vaultStates.get<Vault.ConstraintInfo>(VaultSchemaV1.VaultStates::constraintType.name), constraint.type()) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val statePartyJoin = criteriaBuilder.equal(vaultStates.get<VaultSchemaV1.VaultStates>("stateRef"), entityRoot.get<VaultSchemaV1.PersistentParty>("compositeKey").get<PersistentStateRef>("stateRef")) MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$val vaultStates: Root<VaultSchemaV1.VaultStates> MaxLineLength:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser${ @Suppress("UNCHECKED_CAST") column as Path<Long?>? val aggregateExpression = when (columnPredicate.type) { AggregateFunctionType.SUM -> criteriaBuilder.sum(column) AggregateFunctionType.AVG -> criteriaBuilder.avg(column) AggregateFunctionType.COUNT -> criteriaBuilder.count(column) AggregateFunctionType.MAX -> criteriaBuilder.max(column) AggregateFunctionType.MIN -> criteriaBuilder.min(column) } //TODO investigate possibility to avoid producing redundant joins in SQL for multiple aggregate functions against the same table aggregateExpressions.add(aggregateExpression) // Some databases may not support aggregate expression in 'group by' clause e.g. 'group by sum(col)', // Hibernate Criteria Builder can't produce alias 'group by col_alias', and the only solution is to use a positional parameter 'group by 1' val orderByColumnPosition = aggregateExpressions.size var shiftLeft = 0 // add optional group by clauses expression.groupByColumns?.let { columns -> val groupByExpressions = columns.map { _column -> val path = root.get<Any?>(getColumnName(_column)) val columnNumberBeforeRemoval = aggregateExpressions.size if (path is SingularAttributePath) //remove the same columns from different joins to match the single column in 'group by' only (from the last join) aggregateExpressions.removeAll { elem -> if (elem is SingularAttributePath) elem.attribute.javaMember == path.attribute.javaMember else false } shiftLeft += columnNumberBeforeRemoval - aggregateExpressions.size //record how many times a duplicated column was removed (from the previous 'parseAggregateFunction' run) aggregateExpressions.add(path) path } criteriaQuery.groupBy(groupByExpressions) } // optionally order by this aggregate function expression.orderBy?.let { val orderCriteria = when (expression.orderBy!!) { // when adding column position of 'group by' shift in case columns were removed Sort.Direction.ASC -> criteriaBuilder.asc(criteriaBuilder.literal<Int>(orderByColumnPosition - shiftLeft)) Sort.Direction.DESC -> criteriaBuilder.desc(criteriaBuilder.literal<Int>(orderByColumnPosition - shiftLeft)) } criteriaQuery.orderBy(orderCriteria) } return aggregateExpression } - MaxLineLength:HospitalisingInterceptor.kt$HospitalisingInterceptor : TransitionExecutor - MaxLineLength:HospitalisingInterceptor.kt$HospitalisingInterceptor$val (continuation, nextState) = delegate.executeTransition(fiber, previousState, event, transition, actionExecutor) MaxLineLength:HttpApi.kt$HttpApi.Companion$fun fromHostAndPort(hostAndPort: NetworkHostAndPort, base: String, protocol: String = "http", mapper: ObjectMapper = defaultMapper): HttpApi - MaxLineLength:HttpUtils.kt$HttpUtils$inline - MaxLineLength:HttpUtils.kt$HttpUtils$throw IOException("${request.method()} to ${request.url()} returned a ${response.code()}: ${response.body()?.string()}") - MaxLineLength:IOUFlow.kt$IOUFlow$val fullySignedTx = subFlow(CollectSignaturesFlow(signedTx, listOf(otherPartySession), CollectSignaturesFlow.tracker())) - MaxLineLength:IRS.kt$FixedRatePaymentEvent$"FixedRatePaymentEvent $accrualStartDate -> $accrualEndDate : $dayCountFactor : $days : $date : $notional : $rate : $flow" MaxLineLength:IRS.kt$FixedRatePaymentEvent$override val flow: Amount<Currency> get() = Amount(dayCountFactor.times(BigDecimal(notional.quantity)).times(rate.ratioUnit!!.value).toLong(), notional.token) MaxLineLength:IRS.kt$FloatingRatePaymentEvent$override fun asCSV(): String MaxLineLength:IRS.kt$FloatingRatePaymentEvent$override fun toString(): String @@ -6056,110 +3627,49 @@ MaxLineLength:IRS.kt$IRS$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBOR", tradeDate, Tenor("9M")), 1.0.bd)))) MaxLineLength:IRS.kt$IRS$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBOR", tradeDate.plusYears(1), Tenor("3M")), 1.0.bd)))) MaxLineLength:IRS.kt$IRS$command(highStreetBank.owningKey, UniversalContract.Commands.Fix(listOf(net.corda.finance.contracts.Fix(FixOf("LIBORx", tradeDate, Tenor("3M")), 1.0.bd)))) - MaxLineLength:IRS.kt$IRS$val nextFloating = interest(notional, "act/365", fix("LIBOR", start, Tenor("3M")), start, end) MaxLineLength:IRS.kt$InterestRateSwap : Contract - MaxLineLength:IRS.kt$InterestRateSwap$ private fun getFloatingLegPaymentsDifferences(payments1: Map<LocalDate, Event>, payments2: Map<LocalDate, Event>): List<Pair<LocalDate, Pair<FloatingRatePaymentEvent, FloatingRatePaymentEvent>>> - MaxLineLength:IRS.kt$InterestRateSwap$"All notionals must be non zero" using (irs.fixedLeg.notional.quantity > 0 && irs.floatingLeg.notional.quantity > 0) - MaxLineLength:IRS.kt$InterestRateSwap$"The changed payments dates are aligned" using (oldFloatingRatePaymentEvent.date == newFixedRatePaymentEvent.date) - MaxLineLength:IRS.kt$InterestRateSwap$"The currency of the notionals must be the same" using (irs.fixedLeg.notional.token == irs.floatingLeg.notional.token) MaxLineLength:IRS.kt$InterestRateSwap$"The effective date is before the termination date for the fixed leg" using (irs.fixedLeg.effectiveDate < irs.fixedLeg.terminationDate) MaxLineLength:IRS.kt$InterestRateSwap$"The effective date is before the termination date for the floating leg" using (irs.floatingLeg.effectiveDate < irs.floatingLeg.terminationDate) MaxLineLength:IRS.kt$InterestRateSwap$"The fix payment has the same currency as the notional" using (newFixedRatePaymentEvent.flow.token == irs.floatingLeg.notional.token) MaxLineLength:IRS.kt$InterestRateSwap$"The fixed leg parties are constant" using (irs.fixedLeg.fixedRatePayer == prevIrs.fixedLeg.fixedRatePayer) MaxLineLength:IRS.kt$InterestRateSwap$"The fixed leg payment schedule is constant" using (irs.calculation.fixedLegPaymentSchedule == prevIrs.calculation.fixedLegPaymentSchedule) - MaxLineLength:IRS.kt$InterestRateSwap$"The fixing is for the next required date" using (prevIrs.calculation.nextFixingDate() == fixValue.of.forDay) - MaxLineLength:IRS.kt$InterestRateSwap$"The new payment has the correct rate" using (newFixedRatePaymentEvent.rate.ratioUnit!!.value == fixValue.value) - MaxLineLength:IRS.kt$InterestRateSwap$"There is at least one difference in the IRS floating leg payment schedules" using !paymentDifferences.isEmpty() - MaxLineLength:IRS.kt$InterestRateSwap$Calculation MaxLineLength:IRS.kt$InterestRateSwap$TransactionBuilder(notary) .addCommand(Command(Commands.Agree(), listOf(state.floatingLeg.floatingRatePayer.owningKey, state.fixedLeg.fixedRatePayer.owningKey))) MaxLineLength:IRS.kt$InterestRateSwap$private MaxLineLength:IRS.kt$InterestRateSwap$tx.addCommand(Commands.Refix(fixing), listOf(irs.state.data.floatingLeg.floatingRatePayer.owningKey, irs.state.data.fixedLeg.fixedRatePayer.owningKey)) MaxLineLength:IRS.kt$InterestRateSwap$val (oldFloatingRatePaymentEvent, newFixedRatePaymentEvent) = paymentDifferences.single().second // Ignore the date of the changed rate (we checked that earlier). - MaxLineLength:IRS.kt$InterestRateSwap$val groups: List<LedgerTransaction.InOutGroup<State, UniqueIdentifier>> = tx.groupStates { state -> state.linearId } MaxLineLength:IRS.kt$InterestRateSwap$val paymentDifferences = getFloatingLegPaymentsDifferences(prevIrs.calculation.floatingLegPaymentSchedule, irs.calculation.floatingLegPaymentSchedule) MaxLineLength:IRS.kt$InterestRateSwap.Calculation$return floatingLegPaymentSchedule.filter { it.value.rate is ReferenceRate }.// TODO - a better way to determine what fixings remain to be fixed minBy { it.value.fixingDate.toEpochDay() }?.value?.fixingDate - MaxLineLength:IRS.kt$InterestRateSwap.Commands$Mature : TypeOnlyCommandDataCommands MaxLineLength:IRS.kt$InterestRateSwap.Common$val valuationDateDescription: String MaxLineLength:IRS.kt$InterestRateSwap.CommonLeg$"PaymentRule=$paymentRule,PaymentDelay=$paymentDelay,PaymentCalendar=$paymentCalendar,InterestPeriodAdjustment=$interestPeriodAdjustment" MaxLineLength:IRS.kt$InterestRateSwap.CommonLeg$"TerminationDateAdjustment=$terminationDateAdjustment,DayCountBasis=$dayCountBasisDay/$dayCountBasisYear,DayInMonth=$dayInMonth," - MaxLineLength:IRS.kt$InterestRateSwap.CommonLeg$dayCountBasisDay - MaxLineLength:IRS.kt$InterestRateSwap.CommonLeg$effectiveDateAdjustment MaxLineLength:IRS.kt$InterestRateSwap.CommonLeg$return "Notional=$notional,PaymentFrequency=$paymentFrequency,EffectiveDate=$effectiveDate,EffectiveDateAdjustment:$effectiveDateAdjustment,TerminatationDate=$terminationDate," + "TerminationDateAdjustment=$terminationDateAdjustment,DayCountBasis=$dayCountBasisDay/$dayCountBasisYear,DayInMonth=$dayInMonth," + "PaymentRule=$paymentRule,PaymentDelay=$paymentDelay,PaymentCalendar=$paymentCalendar,InterestPeriodAdjustment=$interestPeriodAdjustment" - MaxLineLength:IRS.kt$InterestRateSwap.FixedLeg$dayCountBasisDay - MaxLineLength:IRS.kt$InterestRateSwap.FixedLeg$override MaxLineLength:IRS.kt$InterestRateSwap.FloatingLeg$"FixingPeriondOffset=$fixingPeriodOffset,ResetRule=$resetRule,FixingsPerPayment=$fixingsPerPayment,FixingCalendar=$fixingCalendar," - MaxLineLength:IRS.kt$InterestRateSwap.FloatingLeg$"rollConvention=$rollConvention,FixingRollConvention=$fixingRollConvention,ResetDayInMonth=$resetDayInMonth" - MaxLineLength:IRS.kt$InterestRateSwap.FloatingLeg$( var floatingRatePayer: AbstractParty, notional: Amount<Currency>, paymentFrequency: Frequency, effectiveDate: LocalDate, effectiveDateAdjustment: DateRollConvention?, terminationDate: LocalDate, terminationDateAdjustment: DateRollConvention?, dayCountBasisDay: DayCountBasisDay, dayCountBasisYear: DayCountBasisYear, dayInMonth: Int, paymentRule: PaymentRule, paymentDelay: Int, paymentCalendar: BusinessCalendar, interestPeriodAdjustment: AccrualAdjustment, var rollConvention: DateRollConvention, var fixingRollConvention: DateRollConvention, var resetDayInMonth: Int, var fixingPeriodOffset: Int, var resetRule: PaymentRule, var fixingsPerPayment: Frequency, var fixingCalendar: BusinessCalendar, var index: String, var indexSource: String, var indexTenor: Tenor ) - MaxLineLength:IRS.kt$InterestRateSwap.FloatingLeg$dayCountBasisDay MaxLineLength:IRS.kt$InterestRateSwap.State$InterestRateSwap().generateFix(ptx, StateAndRef(TransactionState(this, IRS_PROGRAM_ID, oldState.state.notary, constraint = AlwaysAcceptAttachmentConstraint), oldState.ref), fix) - MaxLineLength:IRS.kt$InterestRateSwap.State$override - MaxLineLength:IRS.kt$InterestRateSwap.State$return ScheduledActivity(flowLogicRefFactory.create("net.corda.irs.flows.FixingFlow\$FixingRoleDecider", thisStateRef), instant) MaxLineLength:IRS.kt$InterestRateSwap.State$val instant = suggestInterestRateAnnouncementTimeWindow(index = nextFixingOf.name, source = floatingLeg.indexSource, date = nextFixingOf.forDay).fromTime!! MaxLineLength:IRS.kt$InterestRateSwap.State${ val nextFixingOf = nextFixingOf() ?: return null // This is perhaps not how we should determine the time point in the business day, but instead expect the schedule to detail some of these aspects val instant = suggestInterestRateAnnouncementTimeWindow(index = nextFixingOf.name, source = floatingLeg.indexSource, date = nextFixingOf.forDay).fromTime!! return ScheduledActivity(flowLogicRefFactory.create("net.corda.irs.flows.FixingFlow\$FixingRoleDecider", thisStateRef), instant) } - MaxLineLength:IRS.kt$PaymentEvent : Event MaxLineLength:IRS.kt$RatePaymentEvent$// TODO : Fix below (use daycount convention for division, not hardcoded 360 etc) val dayCountFactor: BigDecimal get() = (BigDecimal(days).divide(BigDecimal(360.0), 8, RoundingMode.HALF_UP)).setScale(4, RoundingMode.HALF_UP) - MaxLineLength:IRS.kt$RatePaymentEvent$open fun asCSV() - MaxLineLength:IRS.kt$RatePaymentEvent$val days: Int get() = BusinessCalendar.calculateDaysBetween(accrualStartDate, accrualEndDate, dayCountBasisYear, dayCountBasisDay) - MaxLineLength:IRS.kt$UnknownType MaxLineLength:IRSDemo.kt$Role.Trade -> IRSDemoClientApi(NetworkHostAndPort("localhost", 10007)).runTrade(value, CordaX500Name.parse("O=Notary Service,L=Zurich,C=CH")) MaxLineLength:IRSDemoDockerTest.kt$IRSDemoDockerTest.Companion$DockerComposeRule.builder() .files(DockerComposeFiles.from( System.getProperty("CORDAPP_DOCKER_COMPOSE"), System.getProperty("WEB_DOCKER_COMPOSE"))) .waitingForService("web-a", HealthChecks.toRespondOverHttp(8080, { port -> port.inFormat("http://\$HOST:\$EXTERNAL_PORT") })) - MaxLineLength:IRSDemoDockerTest.kt$IRSDemoDockerTest.Companion$throw IllegalStateException("System property $property not set. Please refer to README file for proper setup instructions.") - MaxLineLength:IRSDemoTest.kt$IRSDemoTest$InterestRateSwapStateDeserializer : JsonDeserializer - MaxLineLength:IRSDemoTest.kt$IRSDemoTest$return IOUtils.toString(Thread.currentThread().contextClassLoader.getResourceAsStream(filename), Charsets.UTF_8.name()) MaxLineLength:IRSDemoTest.kt$IRSDemoTest$val (controllerApi, nodeAApi, nodeBApi) = listOf(controller, nodeA, nodeB).zip(listOf(controllerAddr, nodeAAddr, nodeBAddr)).map { val mapper = JacksonSupport.createDefaultMapper(it.first.rpc) registerFinanceJSONMappers(mapper) registerIRSModule(mapper) HttpApi.fromHostAndPort(it.second, "api/irs", mapper = mapper) } MaxLineLength:IRSDemoTest.kt$IRSDemoTest.InterestRateSwapStateDeserializer$InterestRateSwap.State(fixedLeg = fixedLeg, floatingLeg = floatingLeg, calculation = calculation, common = common, linearId = linearId, oracle = oracle) - MaxLineLength:IRSExport.kt$this.calculation.floatingLegPaymentSchedule.toSortedMap().values.joinToString("\n") { it.asCSV() } - MaxLineLength:IRSState.kt$IRSState$override val linearId: UniqueIdentifier = UniqueIdentifier(swap.id.first + swap.id.second) MaxLineLength:IRSState.kt$IRSState$return TransactionBuilder(notary).withItems(StateAndContract(state, IRS_PROGRAM_ID), Command(OGTrade.Commands.Agree(), participants.map { it.owningKey })) MaxLineLength:IRSTests.kt$"(floatingLeg.notional.pennies * (calculation.fixingSchedule.get(context.getDate('currentDate')).rate.ratioUnit.value))" MaxLineLength:IRSTests.kt$( // TODO: this seems to fail quite dramatically //expression = "fixedLeg.notional * fixedLeg.fixedRate", // TODO: How I want it to look //expression = "( fixedLeg.notional * (fixedLeg.fixedRate)) - (floatingLeg.notional * (rateSchedule.get(context.getDate('currentDate'))))", // How it's ended up looking, which I think is now broken but it's a WIP. expression = Expression("( fixedLeg.notional.pennies * (fixedLeg.fixedRate.ratioUnit.value)) -" + "(floatingLeg.notional.pennies * (calculation.fixingSchedule.get(context.getDate('currentDate')).rate.ratioUnit.value))"), floatingLegPaymentSchedule = mutableMapOf(), fixedLegPaymentSchedule = mutableMapOf() ) - MaxLineLength:IRSTests.kt$IRSTests$ fun tradegroups(): LedgerDSL<TestTransactionDSLInterpreter, TestLedgerDSLInterpreter> MaxLineLength:IRSTests.kt$IRSTests$( "fixedLeg.notional.quantity", "fixedLeg.fixedRate.ratioUnit", "fixedLeg.fixedRate.ratioUnit.value", "floatingLeg.notional.quantity", "fixedLeg.fixedRate", "currentBusinessDate", "calculation.floatingLegPaymentSchedule.get(currentBusinessDate)", "fixedLeg.notional.token.currencyCode", "fixedLeg.notional.quantity * 10", "fixedLeg.notional.quantity * fixedLeg.fixedRate.ratioUnit.value", "(fixedLeg.notional.token.currencyCode.equals('GBP')) ? 365 : 360 ", "(fixedLeg.notional.quantity * (fixedLeg.fixedRate.ratioUnit.value))" // "calculation.floatingLegPaymentSchedule.get(context.getDate('currentDate')).rate" // "calculation.floatingLegPaymentSchedule.get(context.getDate('currentDate')).rate.ratioUnit.value", //"( fixedLeg.notional.pennies * (fixedLeg.fixedRate.ratioUnit.value)) - (floatingLeg.notional.pennies * (calculation.fixingSchedule.get(context.getDate('currentDate')).rate.ratioUnit.value))", // "( fixedLeg.notional * fixedLeg.fixedRate )" ) - MaxLineLength:IRSTests.kt$IRSTests$attachments(IRS_PROGRAM_ID) input(IRS_PROGRAM_ID, oldIRS) // Templated tweak for reference. A corrent fixing applied should be ok tweak { command(ORACLE_PUBKEY, InterestRateSwap.Commands.Refix(Fix(FixOf("ICE LIBOR", ld, Tenor("3M")), bd))) timeWindow(TEST_TX_TIME) output(IRS_PROGRAM_ID, newIRS) this.verifies() } // This test makes sure that verify confirms the fixing was applied and there is a difference in the old and new tweak { command(ORACLE_PUBKEY, InterestRateSwap.Commands.Refix(Fix(FixOf("ICE LIBOR", ld, Tenor("3M")), bd))) timeWindow(TEST_TX_TIME) output(IRS_PROGRAM_ID, oldIRS) this `fails with` "There is at least one difference in the IRS floating leg payment schedules" } // This tests tries to sneak in a change to another fixing (which may or may not be the latest one) tweak { command(ORACLE_PUBKEY, InterestRateSwap.Commands.Refix(Fix(FixOf("ICE LIBOR", ld, Tenor("3M")), bd))) timeWindow(TEST_TX_TIME) val firstResetKey = newIRS.calculation.floatingLegPaymentSchedule.keys.toList()[1] val firstResetValue = newIRS.calculation.floatingLegPaymentSchedule[firstResetKey] val modifiedFirstResetValue = firstResetValue!!.copy(notional = Amount(firstResetValue.notional.quantity, Currency.getInstance("JPY"))) output(IRS_PROGRAM_ID, newIRS.copy( newIRS.fixedLeg, newIRS.floatingLeg, newIRS.calculation.copy(floatingLegPaymentSchedule = newIRS.calculation.floatingLegPaymentSchedule.plus( Pair(firstResetKey, modifiedFirstResetValue))), newIRS.common)) this `fails with` "There is only one change in the IRS floating leg payment schedule" } // This tests modifies the payment currency for the fixing tweak { command(ORACLE_PUBKEY, InterestRateSwap.Commands.Refix(Fix(FixOf("ICE LIBOR", ld, Tenor("3M")), bd))) timeWindow(TEST_TX_TIME) val latestReset = newIRS.calculation.floatingLegPaymentSchedule.filter { it.value.rate is FixedRate }.maxBy { it.key } val modifiedLatestResetValue = latestReset!!.value.copy(notional = Amount(latestReset.value.notional.quantity, Currency.getInstance("JPY"))) output(IRS_PROGRAM_ID, newIRS.copy( newIRS.fixedLeg, newIRS.floatingLeg, newIRS.calculation.copy(floatingLegPaymentSchedule = newIRS.calculation.floatingLegPaymentSchedule.plus( Pair(latestReset.key, modifiedLatestResetValue))), newIRS.common)) this `fails with` "The fix payment has the same currency as the notional" } - MaxLineLength:IRSTests.kt$IRSTests$newIRS.calculation - MaxLineLength:IRSTests.kt$IRSTests$output(IRS_PROGRAM_ID, irs.copy(calculation = irs.calculation.copy(fixedLegPaymentSchedule = emptySchedule))) - MaxLineLength:IRSTests.kt$IRSTests$output(IRS_PROGRAM_ID, irs.copy(calculation = irs.calculation.copy(floatingLegPaymentSchedule = emptySchedule))) - MaxLineLength:IRSTests.kt$IRSTests$private val notaryServices = MockServices(cordappPackages, dummyNotary, mock(), networkParameters, dummyNotary.keyPair) - MaxLineLength:IRSTests.kt$IRSTests$val latestReset = newIRS.calculation.floatingLegPaymentSchedule.filter { it.value.rate is FixedRate }.maxBy { it.key } MaxLineLength:IRSTests.kt$IRSTests$val modifiedFirstResetValue = firstResetValue!!.copy(notional = Amount(firstResetValue.notional.quantity, Currency.getInstance("JPY"))) MaxLineLength:IRSTests.kt$IRSTests$val modifiedIRS = irs.copy(fixedLeg = irs.fixedLeg.copy(notional = Amount(irs.fixedLeg.notional.quantity, Currency.getInstance("JPY")))) MaxLineLength:IRSTests.kt$IRSTests$val modifiedIRS = irs.copy(fixedLeg = irs.fixedLeg.copy(notional = Amount(irs.floatingLeg.notional.quantity + 1, irs.floatingLeg.notional.token))) - MaxLineLength:IRSTests.kt$IRSTests$val modifiedIRS1 = irs.copy(fixedLeg = irs.fixedLeg.copy(terminationDate = irs.fixedLeg.effectiveDate.minusDays(1))) - MaxLineLength:IRSTests.kt$IRSTests$val modifiedIRS2 = irs.copy(floatingLeg = irs.floatingLeg.copy(terminationDate = irs.floatingLeg.effectiveDate.minusDays(1))) - MaxLineLength:IRSTests.kt$IRSTests$val modifiedIRS3 = irs.copy(floatingLeg = irs.floatingLeg.copy(terminationDate = irs.fixedLeg.terminationDate.minusDays(1))) - MaxLineLength:IRSTests.kt$IRSTests$val modifiedIRS4 = irs.copy(floatingLeg = irs.floatingLeg.copy(effectiveDate = irs.fixedLeg.effectiveDate.minusDays(1))) MaxLineLength:IRSTests.kt$IRSTests$val modifiedLatestResetValue = latestReset!!.value.copy(notional = Amount(latestReset.value.notional.quantity, Currency.getInstance("JPY"))) - MaxLineLength:IRSTests.kt$IRSTests${ val dummyIRS = singleIRS() val stuffToPrint: ArrayList<String> = arrayListOf( "fixedLeg.notional.quantity", "fixedLeg.fixedRate.ratioUnit", "fixedLeg.fixedRate.ratioUnit.value", "floatingLeg.notional.quantity", "fixedLeg.fixedRate", "currentBusinessDate", "calculation.floatingLegPaymentSchedule.get(currentBusinessDate)", "fixedLeg.notional.token.currencyCode", "fixedLeg.notional.quantity * 10", "fixedLeg.notional.quantity * fixedLeg.fixedRate.ratioUnit.value", "(fixedLeg.notional.token.currencyCode.equals('GBP')) ? 365 : 360 ", "(fixedLeg.notional.quantity * (fixedLeg.fixedRate.ratioUnit.value))" // "calculation.floatingLegPaymentSchedule.get(context.getDate('currentDate')).rate" // "calculation.floatingLegPaymentSchedule.get(context.getDate('currentDate')).rate.ratioUnit.value", //"( fixedLeg.notional.pennies * (fixedLeg.fixedRate.ratioUnit.value)) - (floatingLeg.notional.pennies * (calculation.fixingSchedule.get(context.getDate('currentDate')).rate.ratioUnit.value))", // "( fixedLeg.notional * fixedLeg.fixedRate )" ) for (i in stuffToPrint) { println(i) val z = dummyIRS.evaluateCalculation(LocalDate.of(2016, 9, 15), Expression(i)) println(z.javaClass) println(z) println("-----------") } // This does not throw an exception in the test itself; it evaluates the above and they will throw if they do not pass. } MaxLineLength:IRSTests.kt$InterestRateSwap.State(fixedLeg = fixedLeg, floatingLeg = floatingLeg, calculation = calculation, common = common, oracle = DUMMY_PARTY) MaxLineLength:IRSTests.kt$dailyInterestAmount = Expression("(CashAmount * InterestRate ) / (fixedLeg.notional.currency.currencyCode.equals('GBP')) ? 365 : 360") - MaxLineLength:IRSTests.kt$resolutionTime = "2:00pm London time on the first LocalBusiness Day following the date on which the notice is given " MaxLineLength:IRSTests.kt$return InterestRateSwap.State(fixedLeg = fixedLeg, floatingLeg = floatingLeg, calculation = calculation, common = common, oracle = DUMMY_PARTY) MaxLineLength:IRSTests.kt${ // 10y swap, we pay 1.3% fixed 30/360 semi, rec 3m usd libor act/360 Q on 25m notional (mod foll/adj on both sides) // I did a mock up start date 10/03/2015 – 10/03/2025 so you have 5 cashflows on float side that have been preset the rest are unknown val fixedLeg = InterestRateSwap.FixedLeg( fixedRatePayer = MEGA_CORP, notional = 25000000.DOLLARS, paymentFrequency = Frequency.SemiAnnual, effectiveDate = LocalDate.of(2015, 3, 10), effectiveDateAdjustment = null, terminationDate = LocalDate.of(2025, 3, 10), terminationDateAdjustment = null, fixedRate = FixedRate(PercentageRatioUnit("1.3")), dayCountBasisDay = DayCountBasisDay.D30, dayCountBasisYear = DayCountBasisYear.Y360, rollConvention = DateRollConvention.ModifiedFollowing, dayInMonth = 10, paymentRule = PaymentRule.InArrears, paymentDelay = 0, paymentCalendar = BusinessCalendar.EMPTY, interestPeriodAdjustment = AccrualAdjustment.Adjusted ) val floatingLeg = InterestRateSwap.FloatingLeg( floatingRatePayer = MINI_CORP, notional = 25000000.DOLLARS, paymentFrequency = Frequency.Quarterly, effectiveDate = LocalDate.of(2015, 3, 10), effectiveDateAdjustment = null, terminationDate = LocalDate.of(2025, 3, 10), terminationDateAdjustment = null, dayCountBasisDay = DayCountBasisDay.DActual, dayCountBasisYear = DayCountBasisYear.Y360, rollConvention = DateRollConvention.ModifiedFollowing, fixingRollConvention = DateRollConvention.ModifiedFollowing, dayInMonth = 10, resetDayInMonth = 10, paymentRule = PaymentRule.InArrears, paymentDelay = 0, paymentCalendar = BusinessCalendar.EMPTY, interestPeriodAdjustment = AccrualAdjustment.Adjusted, fixingPeriodOffset = 2, resetRule = PaymentRule.InAdvance, fixingsPerPayment = Frequency.Quarterly, fixingCalendar = BusinessCalendar.EMPTY, index = "USD LIBOR", indexSource = "TEL3750", indexTenor = Tenor("3M") ) val calculation = InterestRateSwap.Calculation( // TODO: this seems to fail quite dramatically //expression = "fixedLeg.notional * fixedLeg.fixedRate", // TODO: How I want it to look //expression = "( fixedLeg.notional * (fixedLeg.fixedRate)) - (floatingLeg.notional * (rateSchedule.get(context.getDate('currentDate'))))", // How it's ended up looking, which I think is now broken but it's a WIP. expression = Expression("( fixedLeg.notional.pennies * (fixedLeg.fixedRate.ratioUnit.value)) -" + "(floatingLeg.notional.pennies * (calculation.fixingSchedule.get(context.getDate('currentDate')).rate.ratioUnit.value))"), floatingLegPaymentSchedule = mutableMapOf(), fixedLegPaymentSchedule = mutableMapOf() ) val common = InterestRateSwap.Common( baseCurrency = EUR, eligibleCurrency = EUR, eligibleCreditSupport = "Cash in an Eligible Currency", independentAmounts = Amount(0, EUR), threshold = Amount(0, EUR), minimumTransferAmount = Amount(250000 * 100, EUR), rounding = Amount(10000 * 100, EUR), valuationDateDescription = "Every Local Business Day", notificationTime = "2:00pm London", resolutionTime = "2:00pm London time on the first LocalBusiness Day following the date on which the notice is given ", interestRate = ReferenceRate("T3270", Tenor("6M"), "EONIA"), addressForTransfers = "", exposure = UnknownType(), localBusinessDay = loadTestCalendar("London"), tradeID = "trade2", hashLegalDocs = "put hash here", dailyInterestAmount = Expression("(CashAmount * InterestRate ) / (fixedLeg.notional.currency.currencyCode.equals('GBP')) ? 365 : 360") ) return InterestRateSwap.State(fixedLeg = fixedLeg, floatingLeg = floatingLeg, calculation = calculation, common = common, oracle = DUMMY_PARTY) } MaxLineLength:IRSTradeFlow.kt$IRSTradeFlow.Requester$val notary = serviceHub.networkMapCache.notaryIdentities.first() // TODO We should pass the notary as a parameter to the flow, not leave it to random choice. - MaxLineLength:IRSUtils.kt$PercentageRatioUnit$open MaxLineLength:IRSUtils.kt$net.corda.irs.contract.IRSUtils.kt MaxLineLength:IRSUtils.kt$operator - MaxLineLength:IRSUtils.kt$operator fun kotlin.Int.times(other: FixedRate): Int - MaxLineLength:Id.kt$Id.Companion$ @DeleteForDJVM @JvmStatic fun <V : Any> newInstance(value: V, entityType: String? = null, timestamp: Instant = now()) - MaxLineLength:IdempotentFlowTests.kt$IdempotentFlowTests.TimedSubflow$subFlowExecutionCounter.incrementAndGet() MaxLineLength:IdenticonRenderer.kt$IdenticonRenderer$private MaxLineLength:IdenticonRenderer.kt$IdenticonRenderer$private val patchFlags = byteArrayOf(PATCH_SYMMETRIC, 0, 0, 0, PATCH_SYMMETRIC, 0, 0, 0, PATCH_SYMMETRIC, 0, 0, 0, 0, 0, 0, (PATCH_SYMMETRIC + PATCH_INVERTED).toByte()) - MaxLineLength:IdenticonRenderer.kt$IdenticonRenderer.Patch$return byteArray.map(Byte::toInt).map { it % PATCH_GRIDS * (patchSize / PATCH_CELLS) - patchSize / 2 }.toDoubleArray() - MaxLineLength:IdenticonRenderer.kt$IdenticonRenderer.Patch$return byteArray.map(Byte::toInt).map { it / PATCH_GRIDS * (patchSize / PATCH_CELLS) - patchSize / 2 }.toDoubleArray() - MaxLineLength:IdenticonRenderer.kt$IdenticonRenderer.PatchColor$private - MaxLineLength:IdentityService.kt$IdentityService$ @Throws(IllegalArgumentException::class) fun registerKeyToParty(key: PublicKey, party: Party) - MaxLineLength:IdentityService.kt$IdentityService$ fun wellKnownPartyFromX500Name(name: CordaX500Name): Party? - MaxLineLength:IdentityService.kt$IdentityService$@Deprecated("This method has been deprecated in favour of using a new way to generate and use confidential identities. See the new " + "confidential identities repository.") - MaxLineLength:IdentityService.kt$IdentityService$@Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) - MaxLineLength:IdentityService.kt$IdentityService${ // The original version of this would return the party as-is if it was a Party (rather than AnonymousParty), // however that means that we don't verify that we know who owns the key. As such as now enforce turning the key // into a party, and from there figure out the well known party. log.debug("Attempting to find wellKnownParty for: ${party.owningKey.hash}") val candidate = partyFromKey(party.owningKey) // TODO: This should be done via the network map cache, which is the authoritative source of well known identities return if (candidate != null) { require(party.nameOrNull() == null || party.nameOrNull() == candidate.name) { "Candidate party $candidate does not match expected $party" } wellKnownPartyFromX500Name(candidate.name) } else { null } } - MaxLineLength:IdentityServiceInternal.kt$IdentityServiceInternal$ @Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) fun verifyAndRegisterIdentity(identity: PartyAndCertificate, isNewRandomIdentity: Boolean): PartyAndCertificate? - MaxLineLength:IdentityServiceInternal.kt$IdentityServiceInternal$ @Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) fun verifyAndRegisterIdentity(trustAnchor: TrustAnchor, identity: PartyAndCertificate, isNewRandomIdentity: Boolean = false): PartyAndCertificate? - MaxLineLength:IdentityServiceInternal.kt$IdentityServiceInternal$ fun justVerifyAndRegisterIdentity(identity: PartyAndCertificate, isNewRandomIdentity: Boolean = false) - MaxLineLength:IdentityServiceInternal.kt$IdentityServiceInternal$@Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) - MaxLineLength:IdentityServiceInternal.kt$IdentityServiceInternal$log.warn("Certificate validation failed for ${identity.name} against trusted root ${trustAnchor.trustedCert.subjectX500Principal}.") - MaxLineLength:IdentityServiceInternal.kt$IdentityServiceInternal$val components = listOfNotNull(x500name.commonName, x500name.organisationUnit, x500name.organisation, x500name.locality, x500name.state, x500name.country) - MaxLineLength:IdentityServiceInternal.kt$IdentityServiceInternal${ private companion object { val log = contextLogger() } /** This method exists so it can be mocked with doNothing, rather than having to make up a possibly invalid return value. */ fun justVerifyAndRegisterIdentity(identity: PartyAndCertificate, isNewRandomIdentity: Boolean = false) { verifyAndRegisterIdentity(identity, isNewRandomIdentity) } /** * Verify and then store an identity. * * @param identity a party and the certificate path linking them to the network trust root. * @param isNewRandomIdentity true if the identity will not have been registered before (e.g. because it is randomly generated by ourselves). * @return the issuing entity, if known. * @throws IllegalArgumentException if the certificate path is invalid. */ @Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) fun verifyAndRegisterIdentity(identity: PartyAndCertificate, isNewRandomIdentity: Boolean): PartyAndCertificate? // We can imagine this being a query over a lucene index in future. // // Kostas says: When exactMatch = false, we can easily use the Jaro-Winkler distance metric as it is best suited for short // strings such as entity/company names, and to detect small typos. We can also apply it for city // or any keyword related search in lists of records (not raw text - for raw text we need indexing) // and we can return results in hierarchical order (based on normalised String similarity 0.0-1.0). /** Check if [x500name] matches the [query]. */ fun x500Matches(query: String, exactMatch: Boolean, x500name: CordaX500Name): Boolean { val components = listOfNotNull(x500name.commonName, x500name.organisationUnit, x500name.organisation, x500name.locality, x500name.state, x500name.country) return components.any { (exactMatch && it == query) || (!exactMatch && it.contains(query, ignoreCase = true)) } } /** * Verifies that an identity is valid. * * @param trustAnchor The trust anchor that will verify the identity's validity * @param identity The identity to verify * @param isNewRandomIdentity true if the identity will not have been registered before (e.g. because it is randomly generated by ourselves). */ @Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) fun verifyAndRegisterIdentity(trustAnchor: TrustAnchor, identity: PartyAndCertificate, isNewRandomIdentity: Boolean = false): PartyAndCertificate? { // Validate the chain first, before we do anything clever with it val identityCertChain = identity.certPath.x509Certificates try { identity.verify(trustAnchor) } catch (e: CertPathValidatorException) { log.warn("Certificate validation failed for ${identity.name} against trusted root ${trustAnchor.trustedCert.subjectX500Principal}.") log.warn("Certificate path :") identityCertChain.reversed().forEachIndexed { index, certificate -> val space = (0 until index).joinToString("") { " " } log.warn("$space${certificate.subjectX500Principal}") } throw e } // Ensure we record the first identity of the same name, first val wellKnownCert = identityCertChain.single { CertRole.extract(it)?.isWellKnown ?: false } if (wellKnownCert != identity.certificate && !isNewRandomIdentity) { val idx = identityCertChain.lastIndexOf(wellKnownCert) val firstPath = X509Utilities.buildCertPath(identityCertChain.slice(idx until identityCertChain.size)) verifyAndRegisterIdentity(trustAnchor, PartyAndCertificate(firstPath)) } return registerIdentity(identity, isNewRandomIdentity) } fun registerIdentity(identity: PartyAndCertificate, isNewRandomIdentity: Boolean = false): PartyAndCertificate? } - MaxLineLength:IdentityServiceToStringShortMigrationTest.kt$IdentityServiceToStringShortMigrationTest$//the only time an identity name does not have a PK_HASH is if there are multiple identities associated with that name Assert.assertThat(groupedByNameIdentities[it]?.size, `is`(greaterThan(1))) + MaxLineLength:IdentityService.kt$IdentityService$ @Suspendable fun externalIdForPublicKey(publicKey: PublicKey): UUID? MaxLineLength:IdentityServiceToStringShortMigrationTest.kt$IdentityServiceToStringShortMigrationTest$Assert.assertThat(nameToHashResultSet.getString(1), `is`(anyOf(groupedByNameIdentities.getValue(it.name).map<PartyAndCertificate, Matcher<String>?> { identity -> CoreMatchers.equalTo(identity.name.toString()) }))) MaxLineLength:IdentityServiceToStringShortMigrationTest.kt$IdentityServiceToStringShortMigrationTest$val hashToIdentityStatement = database.dataSource.connection.prepareStatement("SELECT ${PersistentIdentityService.PK_HASH_COLUMN_NAME} FROM ${PersistentIdentityService.HASH_TO_IDENTITY_TABLE_NAME} WHERE pk_hash=?") MaxLineLength:IdentityServiceToStringShortMigrationTest.kt$IdentityServiceToStringShortMigrationTest$val hashToIdentityStatement = database.dataSource.connection.prepareStatement("SELECT ${PersistentIdentityService.PK_HASH_COLUMN_NAME} FROM ${PersistentIdentityService.HASH_TO_IDENTITY_TABLE_NAME} WHERE pk_hash=?") hashToIdentityStatement.setString(1, it.owningKey.toStringShort()) val hashToIdentityResultSet = hashToIdentityStatement.executeQuery() //check that there is a row for every "new" hash Assert.assertThat(hashToIdentityResultSet.next(), `is`(true)) //check that the pk_hash actually matches what we expect (kinda redundant, but deserializing the whole PartyAndCertificate feels like overkill) Assert.assertThat(hashToIdentityResultSet.getString(1), `is`(it.owningKey.toStringShort())) val nameToHashStatement = connection.prepareStatement("SELECT ${PersistentIdentityService.NAME_COLUMN_NAME} FROM ${PersistentIdentityService.NAME_TO_HASH_TABLE_NAME} WHERE pk_hash=?") nameToHashStatement.setString(1, it.owningKey.toStringShort()) val nameToHashResultSet = nameToHashStatement.executeQuery() //if there is no result for this key, this means its an identity that is not stored in the DB (IE, it's been seen after another identity has already been mapped to it) if (nameToHashResultSet.next()) { Assert.assertThat(nameToHashResultSet.getString(1), `is`(anyOf(groupedByNameIdentities.getValue(it.name).map<PartyAndCertificate, Matcher<String>?> { identity -> CoreMatchers.equalTo(identity.name.toString()) }))) } else { logger.warn("did not find a PK_HASH for ${it.name}") listOfNamesWithoutPkHash.add(it.name) } @@ -6167,20 +3677,12 @@ MaxLineLength:IdentityServiceToStringShortMigrationTest.kt$IdentityServiceToStringShortMigrationTest$val persistentIDs = certs.map { PersistentIdentityService.PersistentPublicKeyHashToCertificate(it.owningKey.hash.toString(), it.certPath.encoded) } MaxLineLength:IdentityServiceToStringShortMigrationTest.kt$IdentityServiceToStringShortMigrationTest$val persistentName = PersistentIdentityService.PersistentPartyToPublicKeyHash(name.toString(), certs.first().owningKey.hash.toString()) MaxLineLength:IdentitySyncFlow.kt$IdentitySyncFlow.Receive$// Store the received confidential identities in the identity service so we have a record of which well known identity they map to. serviceHub.identityService.verifyAndRegisterIdentity(identity) - MaxLineLength:IdentitySyncFlow.kt$IdentitySyncFlow.Receive$val unknownIdentities = allIdentities.filter { serviceHub.identityService.wellKnownPartyFromAnonymous(it) == null } - MaxLineLength:IdentitySyncFlow.kt$IdentitySyncFlow.Receive${ progressTracker.currentStep = RECEIVING_IDENTITIES val allIdentities = otherSideSession.receive<List<AbstractParty>>().unwrap { it } val unknownIdentities = allIdentities.filter { serviceHub.identityService.wellKnownPartyFromAnonymous(it) == null } progressTracker.currentStep = RECEIVING_CERTIFICATES val missingIdentities = otherSideSession.sendAndReceive<List<PartyAndCertificate>>(unknownIdentities) // Batch verify the identities we've received, so we know they're all correct before we start storing them in // the identity service missingIdentities.unwrap { identities -> identities.forEach { it.verify(serviceHub.identityService.trustAnchor) } identities }.forEach { identity -> // Store the received confidential identities in the identity service so we have a record of which well known identity they map to. serviceHub.identityService.verifyAndRegisterIdentity(identity) } } - MaxLineLength:IdentitySyncFlow.kt$IdentitySyncFlow.Send$confidentialIdentities .map { Pair(it, serviceHub.identityService.certificateFromKey(it.owningKey)) } // Filter down to confidential identities of our well known identity // TODO: Consider if this too restrictive - we perhaps should be checking the name on the signing certificate in the certificate path instead .filter { it.second?.name == ourIdentity.name } + MaxLineLength:IdentitySyncFlow.kt$IdentitySyncFlow.Send$confidentialIdentities .map { @Suppress("DEPRECATION") Pair(it, serviceHub.identityService.certificateFromKey(it.owningKey)) } // Filter down to confidential identities of our well known identity // TODO: Consider if this too restrictive - we perhaps should be checking the name on the signing certificate in the certificate path instead .filter { it.second?.name == ourIdentity.name } MaxLineLength:IdentitySyncFlow.kt$IdentitySyncFlow.Send$require(req.all { it in identityCertificates.keys }) { "${otherSideSession.counterparty} requested a confidential identity not part of transaction: ${tx.id}" } MaxLineLength:IdentitySyncFlow.kt$IdentitySyncFlow.Send$throw IllegalStateException("Counterparty requested a confidential identity for which we do not have the certificate path: ${tx.id}") MaxLineLength:IdentitySyncFlow.kt$IdentitySyncFlow.Send$val requestedIdentities: List<AbstractParty> = otherSideSession.sendAndReceive<List<AbstractParty>>(identityCertificates.keys.toList()).unwrap { req -> require(req.all { it in identityCertificates.keys }) { "${otherSideSession.counterparty} requested a confidential identity not part of transaction: ${tx.id}" } req } - MaxLineLength:IdentitySyncFlowTests.kt$IdentitySyncFlowTests$aliceNode.database.transaction { aliceNode.services.identityService.verifyAndRegisterIdentity(confidentialIdentCert) } MaxLineLength:IdentitySyncFlowTests.kt$IdentitySyncFlowTests$assertNotNull(aliceNode.database.transaction { aliceNode.services.identityService.wellKnownPartyFromAnonymous(confidentialIdentity) }) - MaxLineLength:IdentitySyncFlowTests.kt$IdentitySyncFlowTests$assertNull(bobNode.database.transaction { bobNode.services.identityService.wellKnownPartyFromAnonymous(confidentialIdentity) }) - MaxLineLength:IdentitySyncFlowTests.kt$IdentitySyncFlowTests$val confidentialIdentCert = charlieNode.services.identityService.certificateFromKey(confidentialIdentity.owningKey)!! - MaxLineLength:IdentitySyncFlowTests.kt$IdentitySyncFlowTests$val issueFlow = aliceNode.services.startFlow(CashIssueAndPaymentFlow(1000.DOLLARS, ref, alice, anonymous, notary)).resultFuture - MaxLineLength:IdentitySyncFlowTests.kt$IdentitySyncFlowTests$val issueFlow = charlieNode.services.startFlow(CashIssueAndPaymentFlow(1000.DOLLARS, ref, charlie, anonymous, notary)) - MaxLineLength:IdentitySyncFlowTests.kt$IdentitySyncFlowTests$val payTx = charlieNode.services.startFlow(CashPaymentFlow(1000.DOLLARS, alice, anonymous)).resultFuture.getOrThrow().stx - MaxLineLength:IdentityUtils.kt$ // Cannot use @JvmOverloads in interface @Throws(IllegalArgumentException::class) fun groupAbstractPartyByWellKnownParty(serviceHub: ServiceHub, parties: Collection<AbstractParty>): Map<Party, List<AbstractParty>> + MaxLineLength:IdentitySyncFlowTests.kt$IdentitySyncFlowTests$val confidentialIdentCert = @Suppress("DEPRECATION") charlieNode.services.identityService.certificateFromKey(confidentialIdentity.owningKey)!! MaxLineLength:IdentityUtils.kt$ // Cannot use @JvmOverloads in interface @Throws(IllegalArgumentException::class) fun groupPublicKeysByWellKnownParty(serviceHub: ServiceHub, publicKeys: Collection<PublicKey>): Map<Party, List<PublicKey>> MaxLineLength:IdentityUtils.kt$ @Throws(IllegalArgumentException::class) fun groupAbstractPartyByWellKnownParty(serviceHub: ServiceHub, parties: Collection<AbstractParty>, ignoreUnrecognisedParties: Boolean): Map<Party, List<AbstractParty>> MaxLineLength:IdentityUtils.kt$ @Throws(IllegalArgumentException::class) fun groupPublicKeysByWellKnownParty(serviceHub: ServiceHub, publicKeys: Collection<PublicKey>, ignoreUnrecognisedParties: Boolean): Map<Party, List<PublicKey>> @@ -6188,159 +3690,71 @@ MaxLineLength:IdentityUtils.kt$(serviceHub.identityService.wellKnownPartyFromAnonymous(it) ?: if (ignoreUnrecognisedParties) return@mapNotNull null else throw IllegalArgumentException("Could not find Party for $it")) to it MaxLineLength:IdentityUtils.kt$groupAbstractPartyByWellKnownParty(serviceHub, publicKeys.map { AnonymousParty(it) }, ignoreUnrecognisedParties).mapValues { it.value.map { it.owningKey } } MaxLineLength:IdentityUtils.kt$val components = listOfNotNull(x500name.commonName, x500name.organisationUnit, x500name.organisation, x500name.locality, x500name.state, x500name.country) - MaxLineLength:InMemoryIdentityService.kt$InMemoryIdentityService$@Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) - MaxLineLength:InMemoryIdentityService.kt$InMemoryIdentityService$@Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) private MaxLineLength:InMemoryIdentityService.kt$InMemoryIdentityService$log.warn("Certificate validation failed for ${identity.name} against trusted root ${trustAnchor.trustedCert.subjectX500Principal}.") - MaxLineLength:InMemoryIdentityService.kt$InMemoryIdentityService$override MaxLineLength:InMemoryIdentityService.kt$InMemoryIdentityService$results += keyToPartyAndCerts[key]?.party ?: throw IllegalArgumentException("Could not find an entry in the database for the public key $key.") - MaxLineLength:InMemoryIdentityServiceTests.kt$InMemoryIdentityServiceTests$ @Test fun `assert ownership`() - MaxLineLength:InMemoryIdentityServiceTests.kt$InMemoryIdentityServiceTests$ @Test fun `get anonymous identity by key`() + MaxLineLength:InMemoryIdentityService.kt$InMemoryIdentityService$throw NotImplementedError("This method is not implemented in the InMemoryIdentityService at it requires access to CordaPersistence.") MaxLineLength:InMemoryIdentityServiceTests.kt$InMemoryIdentityServiceTests$listOf("Org A", "Org B", "Org C") .map { getTestPartyAndCertificate(CordaX500Name(organisation = it, locality = "London", country = "GB"), generateKeyPair().public) } MaxLineLength:InMemoryIdentityServiceTests.kt$InMemoryIdentityServiceTests$val alicente = getTestPartyAndCertificate(CordaX500Name(organisation = "Alicente Worldwide", locality = "London", country = "GB"), generateKeyPair().public) - MaxLineLength:InMemoryIdentityServiceTests.kt$InMemoryIdentityServiceTests.Companion$fun createService(vararg identities: PartyAndCertificate) - MaxLineLength:InMemoryMessagingNetwork.kt$InMemoryMessagingNetwork$@Synchronized private - MaxLineLength:InMemoryMessagingNetwork.kt$InMemoryMessagingNetwork$DistributedServiceHandle : MessageRecipientGroup - MaxLineLength:InMemoryMessagingNetwork.kt$InMemoryMessagingNetwork$MessageTransfer - MaxLineLength:InMemoryMessagingNetwork.kt$InMemoryMessagingNetwork$ServicePeerAllocationStrategy MaxLineLength:InMemoryMessagingNetwork.kt$InMemoryMessagingNetwork$peersMapping[messagingService.myAddress.name] = messagingService.myAddress MaxLineLength:InMemoryMessagingNetwork.kt$InMemoryMessagingNetwork$private val servicePeerAllocationStrategy: ServicePeerAllocationStrategy = InMemoryMessagingNetwork.ServicePeerAllocationStrategy.Random() MaxLineLength:InMemoryMessagingNetwork.kt$InMemoryMessagingNetwork.Companion$servicePeerAllocationStrategy: ServicePeerAllocationStrategy = InMemoryMessagingNetwork.ServicePeerAllocationStrategy.Random() - MaxLineLength:InMemoryMessagingNetwork.kt$InMemoryMessagingNetwork.MessageTransfer.Companion$internal MaxLineLength:InMemoryTransactionVerifierService.kt$InMemoryTransactionVerifierService : SingletonSerializeAsTokenTransactionVerifierServiceTransactionVerifierServiceInternalAutoCloseable - MaxLineLength:InfrequentlyMutatedCache.kt$InfrequentlyMutatedCache$ fun get(key: K, valueGetter: (K) -> V): V - MaxLineLength:InfrequentlyMutatedCache.kt$InfrequentlyMutatedCache$// This protects against the cache purging something that is marked as invalid and thus we "forget" it shouldn't be cached. private val currentlyInvalid = ConcurrentHashMap<K, Wrapper.Invalidated<V>>() - MaxLineLength:InfrequentlyMutatedCache.kt$InfrequentlyMutatedCache<K : Any, V : Any> - MaxLineLength:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest$// This should not get cached, as the transaction that invalidated it in the other thread has completed but we might // not see the new value in our transaction since it started first. val result1 = cache.get("foo") { 1 } assertEquals(1, result1) val result2 = cache.get("foo") { 3 } assertEquals(3, result2) // Now allow other thread to commit transaction phaser.arriveAndAwaitAdvance() // and wait for commit to be complete phaser.arriveAndAwaitAdvance() // This should get cached, as the transaction that invalidated it in the other thread has completed but we might // not see the new value in our transaction since it started first. val result3 = cache.get("foo") { 3 } assertEquals(3, result3) val result4 = cache.get("foo") { 4 } assertEquals(4, result4) - MaxLineLength:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest$// This will cache "2" cache.get("foo") { 2 } invalidateInOtherThread("foo") // This should not get cached, as the transaction that invalidated it in the other thread has completed but we might // not see the new value in our transaction since it started first. val result = cache.get("foo") { 1 } assertEquals(1, result) MaxLineLength:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest$@Test fun `fourth get outside first transaction from empty cache with invalidate in other thread in the middle returns result of second loader`() - MaxLineLength:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest$@Test fun `fourth get outside first transaction from empty cache with invalidate in the middle returns result of third loader`() - MaxLineLength:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest$@Test fun `fourth get outside first transaction from empty cache with nested invalidate in the middle returns result of third loader`() - MaxLineLength:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest$@Test fun `getIfPresent outside first transaction from empty cache with invalidate in the middle returns result of third loader`() - MaxLineLength:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest$@Test fun `third get outside first transaction from empty cache with invalidate in the middle returns result of third loader`() MaxLineLength:InitialRegistrationCli.kt$InitialRegistration : RunAfterNodeInitialisationNodeStartupLogging - MaxLineLength:InitialRegistrationCli.kt$InitialRegistration$e.logAsUnexpected( "Could not delete the marker file that was created for `initial-registration`.", print = logger::warn) MaxLineLength:InitialRegistrationCli.kt$InitialRegistration$println("Node was started before with `--initial-registration`, but the registration was not completed.\nResuming registration.") MaxLineLength:InitialRegistrationCli.kt$InitialRegistration$println("Successfully registered Corda node with compatibility zone, node identity keys and certificates are stored in '${conf.certificatesDirectory}', it is advised to backup the private keys and certificates.") - MaxLineLength:InitialRegistrationCli.kt$InitialRegistration$require(networkRootTrustStorePath.exists()) { "Network root trust store path: '$networkRootTrustStorePath' doesn't exist" } MaxLineLength:InitialRegistrationCli.kt$InitialRegistration${ // Null checks for [compatibilityZoneURL], [rootTruststorePath] and [rootTruststorePassword] has been done in [CmdLineOptions.loadConfig] attempt { registerWithNetwork(config) }.doOnFailure(Consumer(this::handleRegistrationError)) as Try.Success // At this point the node registration was successful. We can delete the marker file. deleteNodeRegistrationMarker(baseDirectory) } MaxLineLength:InitialRegistrationCli.kt$InitialRegistrationCli : CliWrapperBase MaxLineLength:InitialRegistrationCli.kt$InitialRegistrationCli$@Option(names = ["-p", "--network-root-truststore-password"], description = ["Network root trust store password obtained from network operator."], required = true) - MaxLineLength:InitialRegistrationCli.kt$InitialRegistrationCli$@Option(names = ["-t", "--network-root-truststore"], description = ["Network root trust store obtained from network operator."]) MaxLineLength:InitialRegistrationCli.kt$InitialRegistrationCli$return startup.initialiseAndRun(cmdLineOptions, InitialRegistration(cmdLineOptions.baseDirectory, networkRootTrustStorePath, networkRootTrustStorePassword, startup)) MaxLineLength:InitialRegistrationCli.kt$InitialRegistrationCli$val networkRootTrustStorePath: Path = networkRootTrustStorePathParameter ?: cmdLineOptions.baseDirectory / "certificates" / "network-root-truststore.jks" - MaxLineLength:InitiatedBy.kt$InitiatedBy - MaxLineLength:InitiatingFlow.kt$InitiatingFlow MaxLineLength:InstallShellExtensionsParser.kt$InstallShellExtensionsParser : CliWrapperBase - MaxLineLength:InstallShellExtensionsParser.kt$ShellExtensionsGenerator$// If on Windows, Path.toString() returns a path with \ instead of /, but for bash Windows users we want to convert those back to /'s private fun Path.toStringWithDeWindowsfication(): String - MaxLineLength:InstallShellExtensionsParser.kt$ShellExtensionsGenerator$loggerFor<InstallShellExtensionsParser>().warn("Failed to run command: ${commandAndArgs.joinToString(" ")}; $exception") MaxLineLength:InstallShellExtensionsParser.kt$ShellExtensionsGenerator$printWarning("Cannot install shell extension for bash major version earlier than $minSupportedBashVersion. Please upgrade your bash version. Aliases should still work.") MaxLineLength:InstallShellExtensionsParser.kt$ShellExtensionsGenerator$println("Installation complete, ${parent.alias} is available in bash, but autocompletion was not installed because of an old version of bash.") - MaxLineLength:InstallShellExtensionsParser.kt$ShellExtensionsGenerator$println("Restart bash for this to take effect, or run `. ~/.bashrc` in bash or `. ~/.zshrc` in zsh to re-initialise your shell now") - MaxLineLength:InstallShellExtensionsParser.kt$ShellExtensionsGenerator$private fun jarVersion(alias: String) - MaxLineLength:InstallShellExtensionsParser.kt$ShellExtensionsGenerator.SettingsFile$println("Updating settings in ${filePath.fileName} - existing settings file has been backed up to $backupFilePath") - MaxLineLength:Instances.kt$Instances MaxLineLength:InstantSerializer.kt$InstantSerializer : Proxy - MaxLineLength:InstantSerializer.kt$InstantSerializer$override fun fromProxy(proxy: InstantProxy): Instant - MaxLineLength:InteractiveShell.kt$InteractiveShell$@JvmStatic fun runRPCFromString(input: List<String>, out: RenderPrintWriter, context: InvocationContext<out Any>, cordaRPCOps: InternalCordaRPCOps, inputObjectMapper: ObjectMapper): Any? + MaxLineLength:InteractiveShell.kt$InteractiveShell$ExternalResolver.INSTANCE.addCommand("attachments", "Commands to extract information about attachments stored within the node", AttachmentShellCommand::class.java) + MaxLineLength:InteractiveShell.kt$InteractiveShell$ExternalResolver.INSTANCE.addCommand("checkpoints", "Commands to extract information about checkpoints stored within the node", CheckpointShellCommand::class.java) MaxLineLength:InteractiveShell.kt$InteractiveShell$ExternalResolver.INSTANCE.addCommand("flow", "Commands to work with flows. Flows are how you can change the ledger.", FlowShellCommand::class.java) MaxLineLength:InteractiveShell.kt$InteractiveShell$ExternalResolver.INSTANCE.addCommand("hashLookup", "Checks if a transaction with matching Id hash exists.", HashLookupShellCommand::class.java) MaxLineLength:InteractiveShell.kt$InteractiveShell$ExternalResolver.INSTANCE.addCommand("output-format", "Commands to inspect and update the output format.", OutputFormatCommand::class.java) MaxLineLength:InteractiveShell.kt$InteractiveShell$ExternalResolver.INSTANCE.addCommand("run", "Runs a method from the CordaRPCOps interface on the node.", RunShellCommand::class.java) - MaxLineLength:InteractiveShell.kt$InteractiveShell$ReconnectingCordaRPCOps(configuration.hostAndPort, username, password, configuration.ssl, classLoader) - MaxLineLength:InteractiveShell.kt$InteractiveShell$out.println("Please use the 'flow' command to interact with flows rather than the 'run' command.", Color.yellow) - MaxLineLength:InteractiveShell.kt$InteractiveShell$private - MaxLineLength:InteractiveShell.kt$InteractiveShell$rpcConn.close() // This will only show up in the standalone Shell, because the embedded one is killed as part of a node's shutdown. display { println("...done, quitting the shell now.") } onExit.invoke() - MaxLineLength:InteractiveShell.kt$InteractiveShell$shell = ShellLifecycle(configuration.commandsDirectory).start(config, configuration.user, configuration.password) - MaxLineLength:InteractiveShell.kt$InteractiveShell$val mapElement: (Any?) -> String = { element -> outputMapper.writerWithDefaultPrettyPrinter().writeValueAsString(element) } + MaxLineLength:InteractiveShell.kt$InteractiveShell$ReconnectingCordaRPCOps(configuration.hostAndPort, username, password, CordaRPCClientConfiguration.DEFAULT, configuration.ssl, classLoader) MaxLineLength:InteractiveShell.kt$InteractiveShell$val stateObservable = runFlowFromString({ clazz, args -> rpcOps.startTrackedFlowDynamic(clazz, *args) }, inputData, flowClazz, inputObjectMapper) - MaxLineLength:InteractiveShell.kt$InteractiveShell${ private val log = LoggerFactory.getLogger(javaClass) private lateinit var rpcOps: (username: String, password: String) -> InternalCordaRPCOps private lateinit var ops: InternalCordaRPCOps private lateinit var rpcConn: AutoCloseable private var shell: Shell? = null private var classLoader: ClassLoader? = null private lateinit var shellConfiguration: ShellConfiguration private var onExit: () -> Unit = {} @JvmStatic fun getCordappsClassloader() = classLoader enum class OutputFormat { JSON, YAML } fun startShell(configuration: ShellConfiguration, classLoader: ClassLoader? = null, standalone: Boolean = false) { rpcOps = { username: String, password: String -> if (standalone) { ReconnectingCordaRPCOps(configuration.hostAndPort, username, password, configuration.ssl, classLoader).also { rpcConn = it } } else { val client = CordaRPCClient(hostAndPort = configuration.hostAndPort, configuration = CordaRPCClientConfiguration.DEFAULT.copy( maxReconnectAttempts = 1 ), sslConfiguration = configuration.ssl, classLoader = classLoader) val connection = client.start(username, password) rpcConn = connection connection.proxy as InternalCordaRPCOps } } _startShell(configuration, classLoader) } private fun _startShell(configuration: ShellConfiguration, classLoader: ClassLoader? = null) { shellConfiguration = configuration InteractiveShell.classLoader = classLoader val runSshDaemon = configuration.sshdPort != null val config = Properties() if (runSshDaemon) { // Enable SSH access. Note: these have to be strings, even though raw object assignments also work. config["crash.ssh.port"] = configuration.sshdPort?.toString() config["crash.auth"] = "corda" configuration.sshHostKeyDirectory?.apply { val sshKeysDir = configuration.sshHostKeyDirectory.createDirectories() config["crash.ssh.keypath"] = (sshKeysDir / "hostkey.pem").toString() config["crash.ssh.keygen"] = "true" } } ExternalResolver.INSTANCE.addCommand("output-format", "Commands to inspect and update the output format.", OutputFormatCommand::class.java) ExternalResolver.INSTANCE.addCommand("run", "Runs a method from the CordaRPCOps interface on the node.", RunShellCommand::class.java) ExternalResolver.INSTANCE.addCommand("flow", "Commands to work with flows. Flows are how you can change the ledger.", FlowShellCommand::class.java) ExternalResolver.INSTANCE.addCommand("start", "An alias for 'flow start'", StartShellCommand::class.java) ExternalResolver.INSTANCE.addCommand("hashLookup", "Checks if a transaction with matching Id hash exists.", HashLookupShellCommand::class.java) shell = ShellLifecycle(configuration.commandsDirectory).start(config, configuration.user, configuration.password) } fun runLocalShell(onExit: () -> Unit = {}) { this.onExit = onExit val terminal = TerminalFactory.create() val consoleReader = ConsoleReader("Corda", FileInputStream(FileDescriptor.`in`), System.out, terminal) val jlineProcessor = JLineProcessor(terminal.isAnsiSupported, shell, consoleReader, System.out) InterruptHandler { jlineProcessor.interrupt() }.install() thread(name = "Command line shell processor", isDaemon = true) { Emoji.renderIfSupported { try { jlineProcessor.run() } catch (e: IndexOutOfBoundsException) { log.warn("Cannot parse malformed command.") } } } thread(name = "Command line shell terminator", isDaemon = true) { // Wait for the shell to finish. jlineProcessor.closed() log.info("Command shell has exited") terminal.restore() onExit.invoke() } } class ShellLifecycle(private val shellCommands: Path) : PluginLifeCycle() { fun start(config: Properties, localUserName: String = "", localUserPassword: String = ""): Shell { val classLoader = this.javaClass.classLoader val classpathDriver = ClassPathMountFactory(classLoader) val fileDriver = FileMountFactory(Utils.getCurrentDirectory()) val extraCommandsPath = shellCommands.toAbsolutePath().createDirectories() val commandsFS = FS.Builder() .register("file", fileDriver) .mount("file:$extraCommandsPath") .register("classpath", classpathDriver) .mount("classpath:/net/corda/tools/shell/") .mount("classpath:/crash/commands/") .build() val confFS = FS.Builder() .register("classpath", classpathDriver) .mount("classpath:/crash") .build() val discovery = object : ServiceLoaderDiscovery(classLoader) { override fun getPlugins(): Iterable<CRaSHPlugin<*>> { // Don't use the Java language plugin (we may not have tools.jar available at runtime), this // will cause any commands using JIT Java compilation to be suppressed. In CRaSH upstream that // is only the 'jmx' command. return super.getPlugins().filterNot { it is JavaLanguage } + CordaAuthenticationPlugin(rpcOps) } } val attributes = emptyMap<String, Any>() val context = PluginContext(discovery, attributes, commandsFS, confFS, classLoader) context.refresh() this.config = config start(context) ops = makeRPCOps(rpcOps, localUserName, localUserPassword) return context.getPlugin(ShellFactory::class.java).create(null, CordaSSHAuthInfo(false, ops, StdoutANSIProgressRenderer)) } } fun nodeInfo() = try { ops.nodeInfo() } catch (e: UndeclaredThrowableException) { throw e.cause ?: e } @JvmStatic fun setOutputFormat(outputFormat: OutputFormat) { this.outputFormat = outputFormat } @JvmStatic fun getOutputFormat(): OutputFormat { return outputFormat } fun createYamlInputMapper(rpcOps: CordaRPCOps): ObjectMapper { // Return a standard Corda Jackson object mapper, configured to use YAML by default and with extra // serializers. return JacksonSupport.createDefaultMapper(rpcOps, YAMLFactory(), true).apply { val rpcModule = SimpleModule().apply { addDeserializer(InputStream::class.java, InputStreamDeserializer) addDeserializer(UniqueIdentifier::class.java, UniqueIdentifierDeserializer) } registerModule(rpcModule) } } private fun createOutputMapper(outputFormat: OutputFormat): ObjectMapper { val factory = when(outputFormat) { OutputFormat.JSON -> JsonFactory() OutputFormat.YAML -> YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER) } return JacksonSupport.createNonRpcMapper(factory).apply { // Register serializers for stateful objects from libraries that are special to the RPC system and don't // make sense to print out to the screen. For classes we own, annotations can be used instead. val rpcModule = SimpleModule().apply { addSerializer(Observable::class.java, ObservableSerializer) addSerializer(InputStream::class.java, InputStreamSerializer) } registerModule(rpcModule) disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) enable(SerializationFeature.INDENT_OUTPUT) } } // TODO: A default renderer could be used, instead of an object mapper. See: http://www.crashub.org/1.3/reference.html#_renderers private var outputFormat = OutputFormat.YAML @VisibleForTesting lateinit var latch: CountDownLatch private set /** * Called from the 'flow' shell command. Takes a name fragment and finds a matching flow, or prints out * the list of options if the request is ambiguous. Then parses [inputData] as constructor arguments using * the [runFlowFromString] method and starts the requested flow. Ctrl-C can be used to cancel. */ @JvmStatic fun runFlowByNameFragment(nameFragment: String, inputData: String, output: RenderPrintWriter, rpcOps: CordaRPCOps, ansiProgressRenderer: ANSIProgressRenderer, inputObjectMapper: ObjectMapper = createYamlInputMapper(rpcOps)) { val matches = try { rpcOps.registeredFlows().filter { nameFragment in it } } catch (e: PermissionException) { output.println(e.message ?: "Access denied", Color.red) return } if (matches.isEmpty()) { output.println("No matching flow found, run 'flow list' to see your options.", Color.red) return } else if (matches.size > 1 && matches.find { it.endsWith(nameFragment)} == null) { output.println("Ambiguous name provided, please be more specific. Your options are:") matches.forEachIndexed { i, s -> output.println("${i + 1}. $s", Color.yellow) } return } val flowName = matches.find { it.endsWith(nameFragment)} ?: matches.single() val flowClazz: Class<FlowLogic<*>> = if (classLoader != null) { uncheckedCast(Class.forName(flowName, true, classLoader)) } else { uncheckedCast(Class.forName(flowName)) } try { // Show the progress tracker on the console until the flow completes or is interrupted with a // Ctrl-C keypress. val stateObservable = runFlowFromString({ clazz, args -> rpcOps.startTrackedFlowDynamic(clazz, *args) }, inputData, flowClazz, inputObjectMapper) latch = CountDownLatch(1) ansiProgressRenderer.render(stateObservable, latch::countDown) // Wait for the flow to end and the progress tracker to notice. By the time the latch is released // the tracker is done with the screen. while (!Thread.currentThread().isInterrupted) { try { latch.await() break } catch (e: InterruptedException) { try { rpcOps.killFlow(stateObservable.id) } finally { Thread.currentThread().interrupt() break } } } output.println("Flow completed with result: ${stateObservable.returnValue.get()}") } catch (e: NoApplicableConstructor) { output.println("No matching constructor found:", Color.red) e.errors.forEach { output.println("- $it", Color.red) } } catch (e: PermissionException) { output.println(e.message ?: "Access denied", Color.red) } catch (e: ExecutionException) { // ignoring it as already logged by the progress handler subscriber } finally { InputStreamDeserializer.closeAll() } } class NoApplicableConstructor(val errors: List<String>) : CordaException(this.toString()) { override fun toString() = (listOf("No applicable constructor for flow. Problems were:") + errors).joinToString(System.lineSeparator()) } /** * Tidies up a possibly generic type name by chopping off the package names of classes in a hard-coded set of * hierarchies that are known to be widely used and recognised, and also not have (m)any ambiguous names in them. * * This is used for printing error messages when something doesn't match. */ private fun maybeAbbreviateGenericType(type: Type, extraRecognisedPackage: String): String { val packagesToAbbreviate = listOf("java.", "net.corda.core.", "kotlin.", extraRecognisedPackage) fun shouldAbbreviate(typeName: String) = packagesToAbbreviate.any { typeName.startsWith(it) } fun abbreviated(typeName: String) = if (shouldAbbreviate(typeName)) typeName.split('.').last() else typeName fun innerLoop(type: Type): String = when (type) { is ParameterizedType -> { val args: List<String> = type.actualTypeArguments.map(::innerLoop) abbreviated(type.rawType.typeName) + '<' + args.joinToString(", ") + '>' } is GenericArrayType -> { innerLoop(type.genericComponentType) + "[]" } is Class<*> -> { if (type.isArray) abbreviated(type.simpleName) else abbreviated(type.name).replace('$', '.') } else -> type.toString() } return innerLoop(type) } @JvmStatic fun killFlowById(id: String, output: RenderPrintWriter, rpcOps: CordaRPCOps, inputObjectMapper: ObjectMapper = createYamlInputMapper(rpcOps)) { try { val runId = try { inputObjectMapper.readValue(id, StateMachineRunId::class.java) } catch (e: JsonMappingException) { output.println("Cannot parse flow ID of '$id' - expecting a UUID.", Color.red) log.error("Failed to parse flow ID", e) return } if (rpcOps.killFlow(runId)) { output.println("Killed flow $runId", Color.yellow) } else { output.println("Failed to kill flow $runId", Color.red) } } finally { output.flush() } } // TODO: This utility is generally useful and might be better moved to the node class, or an RPC, if we can commit to making it stable API. /** * Given a [FlowLogic] class and a string in one-line Yaml form, finds an applicable constructor and starts * the flow, returning the created flow logic. Useful for lightweight invocation where text is preferable * to statically typed, compiled code. * * See the [StringToMethodCallParser] class to learn more about limitations and acceptable syntax. * * @throws NoApplicableConstructor if no constructor could be found for the given set of types. */ @Throws(NoApplicableConstructor::class) fun <T> runFlowFromString(invoke: (Class<out FlowLogic<T>>, Array<out Any?>) -> FlowProgressHandle<T>, inputData: String, clazz: Class<out FlowLogic<T>>, om: ObjectMapper): FlowProgressHandle<T> { val errors = ArrayList<String>() val parser = StringToMethodCallParser(clazz, om) val nameTypeList = getMatchingConstructorParamsAndTypes(parser, inputData, clazz) try { val args = parser.parseArguments(clazz.name, nameTypeList, inputData) return invoke(clazz, args) } catch (e: StringToMethodCallParser.UnparseableCallException.ReflectionDataMissing) { val argTypes = nameTypeList.map { (_, type) -> type } errors.add("$argTypes: <constructor missing parameter reflection data>") } catch (e: StringToMethodCallParser.UnparseableCallException) { val argTypes = nameTypeList.map { (_, type) -> type } errors.add("$argTypes: ${e.message}") } throw NoApplicableConstructor(errors) } private fun <T> getMatchingConstructorParamsAndTypes(parser: StringToMethodCallParser<FlowLogic<T>>, inputData: String, clazz: Class<out FlowLogic<T>>) : List<Pair<String, Type>> { val errors = ArrayList<String>() val classPackage = clazz.packageName lateinit var paramNamesFromConstructor: List<String> for (ctor in clazz.constructors) { // Attempt construction with the given arguments. fun getPrototype(): List<String> { val argTypes = ctor.genericParameterTypes.map { // If the type name is in the net.corda.core or java namespaces, chop off the package name // because these hierarchies don't have (m)any ambiguous names and the extra detail is just noise. maybeAbbreviateGenericType(it, classPackage) } return paramNamesFromConstructor.zip(argTypes).map { (name, type) -> "$name: $type" } } try { paramNamesFromConstructor = parser.paramNamesFromConstructor(ctor) val nameTypeList = paramNamesFromConstructor.zip(ctor.genericParameterTypes) parser.validateIsMatchingCtor(clazz.name, nameTypeList, inputData) return nameTypeList } catch (e: StringToMethodCallParser.UnparseableCallException.MissingParameter) { errors.add("${getPrototype()}: missing parameter ${e.paramName}") } catch (e: StringToMethodCallParser.UnparseableCallException.TooManyParameters) { errors.add("${getPrototype()}: too many parameters") } catch (e: StringToMethodCallParser.UnparseableCallException.ReflectionDataMissing) { val argTypes = ctor.genericParameterTypes.map { it.typeName } errors.add("$argTypes: <constructor missing parameter reflection data>") } catch (e: StringToMethodCallParser.UnparseableCallException) { val argTypes = ctor.genericParameterTypes.map { it.typeName } errors.add("$argTypes: ${e.message}") } } throw NoApplicableConstructor(errors) } // TODO Filtering on error/success when we will have some sort of flow auditing, for now it doesn't make much sense. @JvmStatic fun runStateMachinesView(out: RenderPrintWriter, rpcOps: CordaRPCOps): Any? { val proxy = rpcOps val (stateMachines, stateMachineUpdates) = proxy.stateMachinesFeed() val currentStateMachines = stateMachines.map { StateMachineUpdate.Added(it) } val subscriber = FlowWatchPrintingSubscriber(out) stateMachineUpdates.startWith(currentStateMachines).subscribe(subscriber) var result: Any? = subscriber.future if (result is Future<*>) { if (!result.isDone) { out.cls() out.println("Waiting for completion or Ctrl-C ... ") out.flush() } try { result = result.get() } catch (e: InterruptedException) { Thread.currentThread().interrupt() } catch (e: ExecutionException) { throw e.rootCause } catch (e: InvocationTargetException) { throw e.rootCause } } return result } @JvmStatic fun runRPCFromString(input: List<String>, out: RenderPrintWriter, context: InvocationContext<out Any>, cordaRPCOps: InternalCordaRPCOps, inputObjectMapper: ObjectMapper): Any? { val cmd = input.joinToString(" ").trim { it <= ' ' } if (cmd.startsWith("startflow", ignoreCase = true)) { // The flow command provides better support and startFlow requires special handling anyway due to // the generic startFlow RPC interface which offers no type information with which to parse the // string form of the command. out.println("Please use the 'flow' command to interact with flows rather than the 'run' command.", Color.yellow) return null } else if (cmd.substringAfter(" ").trim().equals("gracefulShutdown", ignoreCase = true)) { return InteractiveShell.gracefulShutdown(out, cordaRPCOps) } var result: Any? = null try { InputStreamSerializer.invokeContext = context val parser = StringToMethodCallParser(InternalCordaRPCOps::class.java, inputObjectMapper) val call = parser.parse(cordaRPCOps, cmd) result = call.call() if (result != null && result !== kotlin.Unit && result !is Void) { result = printAndFollowRPCResponse(result, out, outputFormat) } if (result is Future<*>) { if (!result.isDone) { out.println("Waiting for completion or Ctrl-C ... ") out.flush() } try { result = result.get() } catch (e: InterruptedException) { Thread.currentThread().interrupt() } catch (e: ExecutionException) { throw e.rootCause } catch (e: InvocationTargetException) { throw e.rootCause } } } catch (e: StringToMethodCallParser.UnparseableCallException) { out.println(e.message, Color.red) if (e !is StringToMethodCallParser.UnparseableCallException.NoSuchFile) { out.println("Please try 'man run' to learn what syntax is acceptable") } } catch (e: Exception) { out.println("RPC failed: ${e.rootCause}", Color.red) } finally { InputStreamSerializer.invokeContext = null InputStreamDeserializer.closeAll() } return result } @JvmStatic fun gracefulShutdown(userSessionOut: RenderPrintWriter, cordaRPCOps: CordaRPCOps) { fun display(statements: RenderPrintWriter.() -> Unit) { statements.invoke(userSessionOut) userSessionOut.flush() } var isShuttingDown = false try { display { println("Orchestrating a clean shutdown, press CTRL+C to cancel...") } isShuttingDown = true display { println("...enabling draining mode") println("...waiting for in-flight flows to be completed") } cordaRPCOps.terminate(true) val latch = CountDownLatch(1) cordaRPCOps.pendingFlowsCount().updates.doOnError { error -> log.error(error.message) throw error }.doAfterTerminate(latch::countDown).subscribe( // For each update. { (first, second) -> display { println("...remaining: $first / $second") } }, // On error. { error -> if (!isShuttingDown) { display { println("RPC failed: ${error.rootCause}", Color.red) } } }, // When completed. { rpcConn.close() // This will only show up in the standalone Shell, because the embedded one is killed as part of a node's shutdown. display { println("...done, quitting the shell now.") } onExit.invoke() }) while (!Thread.currentThread().isInterrupted) { try { latch.await() break } catch (e: InterruptedException) { try { cordaRPCOps.setFlowsDrainingModeEnabled(false) display { println("...cancelled clean shutdown.") } } finally { Thread.currentThread().interrupt() break } } } } catch (e: StringToMethodCallParser.UnparseableCallException) { display { println(e.message, Color.red) println("Please try 'man run' to learn what syntax is acceptable") } } catch (e: Exception) { if (!isShuttingDown) { display { println("RPC failed: ${e.rootCause}", Color.red) } } } finally { InputStreamSerializer.invokeContext = null InputStreamDeserializer.closeAll() } } private fun printAndFollowRPCResponse(response: Any?, out: PrintWriter, outputFormat: OutputFormat): CordaFuture<Unit> { val outputMapper = createOutputMapper(outputFormat) val mapElement: (Any?) -> String = { element -> outputMapper.writerWithDefaultPrettyPrinter().writeValueAsString(element) } return maybeFollow(response, mapElement, out) } private class PrintingSubscriber(private val printerFun: (Any?) -> String, private val toStream: PrintWriter) : Subscriber<Any>() { private var count = 0 val future = openFuture<Unit>() init { // The future is public and can be completed by something else to indicate we don't wish to follow // anymore (e.g. the user pressing Ctrl-C). future.then { unsubscribe() } } @Synchronized override fun onCompleted() { toStream.println("Observable has completed") future.set(Unit) } @Synchronized override fun onNext(t: Any?) { count++ toStream.println("Observation $count: " + printerFun(t)) toStream.flush() } @Synchronized override fun onError(e: Throwable) { toStream.println("Observable completed with an error") e.printStackTrace(toStream) future.setException(e) } } private fun maybeFollow(response: Any?, printerFun: (Any?) -> String, out: PrintWriter): CordaFuture<Unit> { // Match on a couple of common patterns for "important" observables. It's tough to do this in a generic // way because observables can be embedded anywhere in the object graph, and can emit other arbitrary // object graphs that contain yet more observables. So we just look for top level responses that follow // the standard "track" pattern, and print them until the user presses Ctrl-C if (response == null) return doneFuture(Unit) if (response is DataFeed<*, *>) { out.println("Snapshot:") out.println(printerFun(response.snapshot)) out.flush() out.println("Updates:") return printNextElements(response.updates, printerFun, out) } if (response is Observable<*>) { return printNextElements(response, printerFun, out) } out.println(printerFun(response)) return doneFuture(Unit) } private fun printNextElements(elements: Observable<*>, printerFun: (Any?) -> String, out: PrintWriter): CordaFuture<Unit> { val subscriber = PrintingSubscriber(printerFun, out) uncheckedCast(elements).subscribe(subscriber) return subscriber.future } } + MaxLineLength:InteractiveShell.kt$InteractiveShell${ private val log = LoggerFactory.getLogger(javaClass) private lateinit var rpcOps: (username: String, password: String) -> InternalCordaRPCOps private lateinit var ops: InternalCordaRPCOps private lateinit var rpcConn: AutoCloseable private var shell: Shell? = null private var classLoader: ClassLoader? = null private lateinit var shellConfiguration: ShellConfiguration private var onExit: () -> Unit = {} @JvmStatic fun getCordappsClassloader() = classLoader enum class OutputFormat { JSON, YAML } fun startShell(configuration: ShellConfiguration, classLoader: ClassLoader? = null, standalone: Boolean = false) { rpcOps = { username: String, password: String -> if (standalone) { ReconnectingCordaRPCOps(configuration.hostAndPort, username, password, CordaRPCClientConfiguration.DEFAULT, configuration.ssl, classLoader).also { rpcConn = it } } else { val client = CordaRPCClient(hostAndPort = configuration.hostAndPort, configuration = CordaRPCClientConfiguration.DEFAULT.copy( maxReconnectAttempts = 1 ), sslConfiguration = configuration.ssl, classLoader = classLoader) val connection = client.start(username, password) rpcConn = connection connection.proxy as InternalCordaRPCOps } } _startShell(configuration, classLoader) } private fun _startShell(configuration: ShellConfiguration, classLoader: ClassLoader? = null) { shellConfiguration = configuration InteractiveShell.classLoader = classLoader val runSshDaemon = configuration.sshdPort != null val config = Properties() if (runSshDaemon) { // Enable SSH access. Note: these have to be strings, even though raw object assignments also work. config["crash.ssh.port"] = configuration.sshdPort?.toString() config["crash.auth"] = "corda" configuration.sshHostKeyDirectory?.apply { val sshKeysDir = configuration.sshHostKeyDirectory.createDirectories() config["crash.ssh.keypath"] = (sshKeysDir / "hostkey.pem").toString() config["crash.ssh.keygen"] = "true" } } ExternalResolver.INSTANCE.addCommand("output-format", "Commands to inspect and update the output format.", OutputFormatCommand::class.java) ExternalResolver.INSTANCE.addCommand("run", "Runs a method from the CordaRPCOps interface on the node.", RunShellCommand::class.java) ExternalResolver.INSTANCE.addCommand("flow", "Commands to work with flows. Flows are how you can change the ledger.", FlowShellCommand::class.java) ExternalResolver.INSTANCE.addCommand("start", "An alias for 'flow start'", StartShellCommand::class.java) ExternalResolver.INSTANCE.addCommand("hashLookup", "Checks if a transaction with matching Id hash exists.", HashLookupShellCommand::class.java) ExternalResolver.INSTANCE.addCommand("attachments", "Commands to extract information about attachments stored within the node", AttachmentShellCommand::class.java) ExternalResolver.INSTANCE.addCommand("checkpoints", "Commands to extract information about checkpoints stored within the node", CheckpointShellCommand::class.java) shell = ShellLifecycle(configuration.commandsDirectory).start(config, configuration.user, configuration.password) } fun runLocalShell(onExit: () -> Unit = {}) { this.onExit = onExit val terminal = TerminalFactory.create() val consoleReader = ConsoleReader("Corda", FileInputStream(FileDescriptor.`in`), System.out, terminal) val jlineProcessor = JLineProcessor(terminal.isAnsiSupported, shell, consoleReader, System.out) InterruptHandler { jlineProcessor.interrupt() }.install() thread(name = "Command line shell processor", isDaemon = true) { Emoji.renderIfSupported { try { jlineProcessor.run() } catch (e: IndexOutOfBoundsException) { log.warn("Cannot parse malformed command.") } } } thread(name = "Command line shell terminator", isDaemon = true) { // Wait for the shell to finish. jlineProcessor.closed() log.info("Command shell has exited") terminal.restore() onExit.invoke() } } class ShellLifecycle(private val shellCommands: Path) : PluginLifeCycle() { fun start(config: Properties, localUserName: String = "", localUserPassword: String = ""): Shell { val classLoader = this.javaClass.classLoader val classpathDriver = ClassPathMountFactory(classLoader) val fileDriver = FileMountFactory(Utils.getCurrentDirectory()) val extraCommandsPath = shellCommands.toAbsolutePath().createDirectories() val commandsFS = FS.Builder() .register("file", fileDriver) .mount("file:$extraCommandsPath") .register("classpath", classpathDriver) .mount("classpath:/net/corda/tools/shell/") .mount("classpath:/crash/commands/") .build() val confFS = FS.Builder() .register("classpath", classpathDriver) .mount("classpath:/crash") .build() val discovery = object : ServiceLoaderDiscovery(classLoader) { override fun getPlugins(): Iterable<CRaSHPlugin<*>> { // Don't use the Java language plugin (we may not have tools.jar available at runtime), this // will cause any commands using JIT Java compilation to be suppressed. In CRaSH upstream that // is only the 'jmx' command. return super.getPlugins().filterNot { it is JavaLanguage } + CordaAuthenticationPlugin(rpcOps) } } val attributes = emptyMap<String, Any>() val context = PluginContext(discovery, attributes, commandsFS, confFS, classLoader) context.refresh() this.config = config start(context) ops = makeRPCOps(rpcOps, localUserName, localUserPassword) return context.getPlugin(ShellFactory::class.java).create(null, CordaSSHAuthInfo(false, ops, StdoutANSIProgressRenderer)) } } fun nodeInfo() = try { ops.nodeInfo() } catch (e: UndeclaredThrowableException) { throw e.cause ?: e } @JvmStatic fun setOutputFormat(outputFormat: OutputFormat) { this.outputFormat = outputFormat } @JvmStatic fun getOutputFormat(): OutputFormat { return outputFormat } fun createYamlInputMapper(rpcOps: CordaRPCOps): ObjectMapper { // Return a standard Corda Jackson object mapper, configured to use YAML by default and with extra // serializers. return JacksonSupport.createDefaultMapper(rpcOps, YAMLFactory(), true).apply { val rpcModule = SimpleModule().apply { addDeserializer(InputStream::class.java, InputStreamDeserializer) addDeserializer(UniqueIdentifier::class.java, UniqueIdentifierDeserializer) } registerModule(rpcModule) } } private fun createOutputMapper(outputFormat: OutputFormat): ObjectMapper { val factory = when(outputFormat) { OutputFormat.JSON -> JsonFactory() OutputFormat.YAML -> YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER) } return JacksonSupport.createNonRpcMapper(factory).apply { // Register serializers for stateful objects from libraries that are special to the RPC system and don't // make sense to print out to the screen. For classes we own, annotations can be used instead. val rpcModule = SimpleModule().apply { addSerializer(Observable::class.java, ObservableSerializer) addSerializer(InputStream::class.java, InputStreamSerializer) } registerModule(rpcModule) disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) enable(SerializationFeature.INDENT_OUTPUT) } } // TODO: A default renderer could be used, instead of an object mapper. See: http://www.crashub.org/1.3/reference.html#_renderers private var outputFormat = OutputFormat.YAML @VisibleForTesting lateinit var latch: CountDownLatch private set /** * Called from the 'flow' shell command. Takes a name fragment and finds a matching flow, or prints out * the list of options if the request is ambiguous. Then parses [inputData] as constructor arguments using * the [runFlowFromString] method and starts the requested flow. Ctrl-C can be used to cancel. */ @JvmStatic fun runFlowByNameFragment(nameFragment: String, inputData: String, output: RenderPrintWriter, rpcOps: CordaRPCOps, ansiProgressRenderer: ANSIProgressRenderer, inputObjectMapper: ObjectMapper = createYamlInputMapper(rpcOps)) { val matches = try { rpcOps.registeredFlows().filter { nameFragment in it } } catch (e: PermissionException) { output.println(e.message ?: "Access denied", Color.red) return } if (matches.isEmpty()) { output.println("No matching flow found, run 'flow list' to see your options.", Color.red) return } else if (matches.size > 1 && matches.find { it.endsWith(nameFragment)} == null) { output.println("Ambiguous name provided, please be more specific. Your options are:") matches.forEachIndexed { i, s -> output.println("${i + 1}. $s", Color.yellow) } return } val flowName = matches.find { it.endsWith(nameFragment)} ?: matches.single() val flowClazz: Class<FlowLogic<*>> = if (classLoader != null) { uncheckedCast(Class.forName(flowName, true, classLoader)) } else { uncheckedCast(Class.forName(flowName)) } try { // Show the progress tracker on the console until the flow completes or is interrupted with a // Ctrl-C keypress. val stateObservable = runFlowFromString({ clazz, args -> rpcOps.startTrackedFlowDynamic(clazz, *args) }, inputData, flowClazz, inputObjectMapper) latch = CountDownLatch(1) ansiProgressRenderer.render(stateObservable, latch::countDown) // Wait for the flow to end and the progress tracker to notice. By the time the latch is released // the tracker is done with the screen. while (!Thread.currentThread().isInterrupted) { try { latch.await() break } catch (e: InterruptedException) { try { rpcOps.killFlow(stateObservable.id) } finally { Thread.currentThread().interrupt() break } } } output.println("Flow completed with result: ${stateObservable.returnValue.get()}") } catch (e: NoApplicableConstructor) { output.println("No matching constructor found:", Color.red) e.errors.forEach { output.println("- $it", Color.red) } } catch (e: PermissionException) { output.println(e.message ?: "Access denied", Color.red) } catch (e: ExecutionException) { // ignoring it as already logged by the progress handler subscriber } finally { InputStreamDeserializer.closeAll() } } class NoApplicableConstructor(val errors: List<String>) : CordaException(this.toString()) { override fun toString() = (listOf("No applicable constructor for flow. Problems were:") + errors).joinToString(System.lineSeparator()) } /** * Tidies up a possibly generic type name by chopping off the package names of classes in a hard-coded set of * hierarchies that are known to be widely used and recognised, and also not have (m)any ambiguous names in them. * * This is used for printing error messages when something doesn't match. */ private fun maybeAbbreviateGenericType(type: Type, extraRecognisedPackage: String): String { val packagesToAbbreviate = listOf("java.", "net.corda.core.", "kotlin.", extraRecognisedPackage) fun shouldAbbreviate(typeName: String) = packagesToAbbreviate.any { typeName.startsWith(it) } fun abbreviated(typeName: String) = if (shouldAbbreviate(typeName)) typeName.split('.').last() else typeName fun innerLoop(type: Type): String = when (type) { is ParameterizedType -> { val args: List<String> = type.actualTypeArguments.map(::innerLoop) abbreviated(type.rawType.typeName) + '<' + args.joinToString(", ") + '>' } is GenericArrayType -> { innerLoop(type.genericComponentType) + "[]" } is Class<*> -> { if (type.isArray) abbreviated(type.simpleName) else abbreviated(type.name).replace('$', '.') } else -> type.toString() } return innerLoop(type) } @JvmStatic fun killFlowById(id: String, output: RenderPrintWriter, rpcOps: CordaRPCOps, inputObjectMapper: ObjectMapper = createYamlInputMapper(rpcOps)) { try { val runId = try { inputObjectMapper.readValue(id, StateMachineRunId::class.java) } catch (e: JsonMappingException) { output.println("Cannot parse flow ID of '$id' - expecting a UUID.", Color.red) log.error("Failed to parse flow ID", e) return } if (rpcOps.killFlow(runId)) { output.println("Killed flow $runId", Color.yellow) } else { output.println("Failed to kill flow $runId", Color.red) } } finally { output.flush() } } // TODO: This utility is generally useful and might be better moved to the node class, or an RPC, if we can commit to making it stable API. /** * Given a [FlowLogic] class and a string in one-line Yaml form, finds an applicable constructor and starts * the flow, returning the created flow logic. Useful for lightweight invocation where text is preferable * to statically typed, compiled code. * * See the [StringToMethodCallParser] class to learn more about limitations and acceptable syntax. * * @throws NoApplicableConstructor if no constructor could be found for the given set of types. */ @Throws(NoApplicableConstructor::class) fun <T> runFlowFromString(invoke: (Class<out FlowLogic<T>>, Array<out Any?>) -> FlowProgressHandle<T>, inputData: String, clazz: Class<out FlowLogic<T>>, om: ObjectMapper): FlowProgressHandle<T> { val errors = ArrayList<String>() val parser = StringToMethodCallParser(clazz, om) val nameTypeList = getMatchingConstructorParamsAndTypes(parser, inputData, clazz) try { val args = parser.parseArguments(clazz.name, nameTypeList, inputData) return invoke(clazz, args) } catch (e: StringToMethodCallParser.UnparseableCallException.ReflectionDataMissing) { val argTypes = nameTypeList.map { (_, type) -> type } errors.add("$argTypes: <constructor missing parameter reflection data>") } catch (e: StringToMethodCallParser.UnparseableCallException) { val argTypes = nameTypeList.map { (_, type) -> type } errors.add("$argTypes: ${e.message}") } throw NoApplicableConstructor(errors) } private fun <T> getMatchingConstructorParamsAndTypes(parser: StringToMethodCallParser<FlowLogic<T>>, inputData: String, clazz: Class<out FlowLogic<T>>) : List<Pair<String, Type>> { val errors = ArrayList<String>() val classPackage = clazz.packageName_ lateinit var paramNamesFromConstructor: List<String> for (ctor in clazz.constructors) { // Attempt construction with the given arguments. fun getPrototype(): List<String> { val argTypes = ctor.genericParameterTypes.map { // If the type name is in the net.corda.core or java namespaces, chop off the package name // because these hierarchies don't have (m)any ambiguous names and the extra detail is just noise. maybeAbbreviateGenericType(it, classPackage) } return paramNamesFromConstructor.zip(argTypes).map { (name, type) -> "$name: $type" } } try { paramNamesFromConstructor = parser.paramNamesFromConstructor(ctor) val nameTypeList = paramNamesFromConstructor.zip(ctor.genericParameterTypes) parser.validateIsMatchingCtor(clazz.name, nameTypeList, inputData) return nameTypeList } catch (e: StringToMethodCallParser.UnparseableCallException.MissingParameter) { errors.add("${getPrototype()}: missing parameter ${e.paramName}") } catch (e: StringToMethodCallParser.UnparseableCallException.TooManyParameters) { errors.add("${getPrototype()}: too many parameters") } catch (e: StringToMethodCallParser.UnparseableCallException.ReflectionDataMissing) { val argTypes = ctor.genericParameterTypes.map { it.typeName } errors.add("$argTypes: <constructor missing parameter reflection data>") } catch (e: StringToMethodCallParser.UnparseableCallException) { val argTypes = ctor.genericParameterTypes.map { it.typeName } errors.add("$argTypes: ${e.message}") } } throw NoApplicableConstructor(errors) } // TODO Filtering on error/success when we will have some sort of flow auditing, for now it doesn't make much sense. @JvmStatic fun runStateMachinesView(out: RenderPrintWriter, rpcOps: CordaRPCOps): Any? { val proxy = rpcOps val (stateMachines, stateMachineUpdates) = proxy.stateMachinesFeed() val currentStateMachines = stateMachines.map { StateMachineUpdate.Added(it) } val subscriber = FlowWatchPrintingSubscriber(out) stateMachineUpdates.startWith(currentStateMachines).subscribe(subscriber) var result: Any? = subscriber.future if (result is Future<*>) { if (!result.isDone) { out.cls() out.println("Waiting for completion or Ctrl-C ... ") out.flush() } try { result = result.get() } catch (e: InterruptedException) { subscriber.unsubscribe() Thread.currentThread().interrupt() } catch (e: ExecutionException) { throw e.rootCause } catch (e: InvocationTargetException) { throw e.rootCause } } return result } @JvmStatic fun runAttachmentTrustInfoView( out: RenderPrintWriter, rpcOps: InternalCordaRPCOps ): Any { return AttachmentTrustTable(out, rpcOps.attachmentTrustInfos) } @JvmStatic fun runDumpCheckpoints(rpcOps: InternalCordaRPCOps) { rpcOps.dumpCheckpoints() } @JvmStatic fun runRPCFromString(input: List<String>, out: RenderPrintWriter, context: InvocationContext<out Any>, cordaRPCOps: CordaRPCOps, inputObjectMapper: ObjectMapper): Any? { val cmd = input.joinToString(" ").trim { it <= ' ' } if (cmd.startsWith("startflow", ignoreCase = true)) { // The flow command provides better support and startFlow requires special handling anyway due to // the generic startFlow RPC interface which offers no type information with which to parse the // string form of the command. out.println("Please use the 'flow' command to interact with flows rather than the 'run' command.", Color.yellow) return null } else if (cmd.substringAfter(" ").trim().equals("gracefulShutdown", ignoreCase = true)) { return InteractiveShell.gracefulShutdown(out, cordaRPCOps) } var result: Any? = null try { InputStreamSerializer.invokeContext = context val parser = StringToMethodCallParser(CordaRPCOps::class.java, inputObjectMapper) val call = parser.parse(cordaRPCOps, cmd) result = call.call() if (result != null && result !== kotlin.Unit && result !is Void) { result = printAndFollowRPCResponse(result, out, outputFormat) } if (result is Future<*>) { if (!result.isDone) { out.println("Waiting for completion or Ctrl-C ... ") out.flush() } try { result = result.get() } catch (e: InterruptedException) { Thread.currentThread().interrupt() } catch (e: ExecutionException) { throw e.rootCause } catch (e: InvocationTargetException) { throw e.rootCause } } } catch (e: StringToMethodCallParser.UnparseableCallException) { out.println(e.message, Color.red) if (e !is StringToMethodCallParser.UnparseableCallException.NoSuchFile) { out.println("Please try 'man run' to learn what syntax is acceptable") } } catch (e: Exception) { out.println("RPC failed: ${e.rootCause}", Color.red) } finally { InputStreamSerializer.invokeContext = null InputStreamDeserializer.closeAll() } return result } @JvmStatic fun gracefulShutdown(userSessionOut: RenderPrintWriter, cordaRPCOps: CordaRPCOps) { fun display(statements: RenderPrintWriter.() -> Unit) { statements.invoke(userSessionOut) userSessionOut.flush() } var isShuttingDown = false try { display { println("Orchestrating a clean shutdown, press CTRL+C to cancel...") } isShuttingDown = true display { println("...enabling draining mode") println("...waiting for in-flight flows to be completed") } cordaRPCOps.terminate(true) val latch = CountDownLatch(1) @Suppress("DEPRECATION") cordaRPCOps.pendingFlowsCount().updates.doOnError { error -> log.error(error.message) throw error }.doAfterTerminate(latch::countDown).subscribe( // For each update. { (first, second) -> display { println("...remaining: $first / $second") } }, // On error. { error -> if (!isShuttingDown) { display { println("RPC failed: ${error.rootCause}", Color.red) } } }, // When completed. { rpcConn.close() // This will only show up in the standalone Shell, because the embedded one is killed as part of a node's shutdown. display { println("...done, quitting the shell now.") } onExit.invoke() }) while (!Thread.currentThread().isInterrupted) { try { latch.await() break } catch (e: InterruptedException) { try { cordaRPCOps.setFlowsDrainingModeEnabled(false) display { println("...cancelled clean shutdown.") } } finally { Thread.currentThread().interrupt() break } } } } catch (e: StringToMethodCallParser.UnparseableCallException) { display { println(e.message, Color.red) println("Please try 'man run' to learn what syntax is acceptable") } } catch (e: Exception) { if (!isShuttingDown) { display { println("RPC failed: ${e.rootCause}", Color.red) } } } finally { InputStreamSerializer.invokeContext = null InputStreamDeserializer.closeAll() } } private fun printAndFollowRPCResponse(response: Any?, out: PrintWriter, outputFormat: OutputFormat): CordaFuture<Unit> { val outputMapper = createOutputMapper(outputFormat) val mapElement: (Any?) -> String = { element -> outputMapper.writerWithDefaultPrettyPrinter().writeValueAsString(element) } return maybeFollow(response, mapElement, out) } private class PrintingSubscriber(private val printerFun: (Any?) -> String, private val toStream: PrintWriter) : Subscriber<Any>() { private var count = 0 val future = openFuture<Unit>() init { // The future is public and can be completed by something else to indicate we don't wish to follow // anymore (e.g. the user pressing Ctrl-C). future.then { unsubscribe() } } @Synchronized override fun onCompleted() { toStream.println("Observable has completed") future.set(Unit) } @Synchronized override fun onNext(t: Any?) { count++ toStream.println("Observation $count: " + printerFun(t)) toStream.flush() } @Synchronized override fun onError(e: Throwable) { toStream.println("Observable completed with an error") e.printStackTrace(toStream) future.setException(e) } } private fun maybeFollow(response: Any?, printerFun: (Any?) -> String, out: PrintWriter): CordaFuture<Unit> { // Match on a couple of common patterns for "important" observables. It's tough to do this in a generic // way because observables can be embedded anywhere in the object graph, and can emit other arbitrary // object graphs that contain yet more observables. So we just look for top level responses that follow // the standard "track" pattern, and print them until the user presses Ctrl-C if (response == null) return doneFuture(Unit) if (response is DataFeed<*, *>) { out.println("Snapshot:") out.println(printerFun(response.snapshot)) out.flush() out.println("Updates:") return printNextElements(response.updates, printerFun, out) } if (response is Observable<*>) { return printNextElements(response, printerFun, out) } out.println(printerFun(response)) return doneFuture(Unit) } private fun printNextElements(elements: Observable<*>, printerFun: (Any?) -> String, out: PrintWriter): CordaFuture<Unit> { val subscriber = PrintingSubscriber(printerFun, out) uncheckedCast(elements).subscribe(subscriber) return subscriber.future } } MaxLineLength:InteractiveShell.kt$InteractiveShell.NoApplicableConstructor$override fun toString() - MaxLineLength:InteractiveShell.kt$InteractiveShell.PrintingSubscriber$private - MaxLineLength:InteractiveShell.kt$InteractiveShell.ShellLifecycle$return context.getPlugin(ShellFactory::class.java).create(null, CordaSSHAuthInfo(false, ops, StdoutANSIProgressRenderer)) - MaxLineLength:InteractiveShellIntegrationTest.kt$InteractiveShellIntegrationTest$InteractiveShell.runFlowByNameFragment(NoOpFlow::class.java.name, "", output, node.rpc, mockAnsiProgressRenderer()) - MaxLineLength:InteractiveShellIntegrationTest.kt$InteractiveShellIntegrationTest$InteractiveShell.runRPCFromString(listOf("dumpCheckpoints"), output, mock(), aliceNode.rpc as InternalCordaRPCOps, inputObjectMapper) MaxLineLength:InteractiveShellIntegrationTest.kt$InteractiveShellIntegrationTest$private - MaxLineLength:InteractiveShellIntegrationTest.kt$InteractiveShellIntegrationTest$startNode(rpcUsers = listOf(user), customOverrides = brokerSslOptions.useSslRpcOverrides()).getOrThrow() - MaxLineLength:InteractiveShellIntegrationTest.kt$InteractiveShellIntegrationTest$val node = startNode(rpcUsers = listOf(user), customOverrides = brokerSslOptions.useSslRpcOverrides()).getOrThrow() - MaxLineLength:InteractiveShellIntegrationTest.kt$InteractiveShellIntegrationTest$val zipFile = (aliceNode.baseDirectory / NodeStartup.LOGS_DIRECTORY_NAME).list().first { "checkpoints_dump-" in it.toString() } - MaxLineLength:InteractiveShellTest.kt$FlowA$constructor(amounts: Array<Amount<UserValue>>) : this(amounts.joinToString("++", transform = Amount<UserValue>::toString)) - MaxLineLength:InteractiveShellTest.kt$InteractiveShellTest$input = """amounts: [ { "quantity": 10, "token": { "label": "(1)" } }, { "quantity": 200, "token": { "label": "(2)" } } ]""" - MaxLineLength:InteractiveShellTest.kt$InteractiveShellTest$input = "pair: { first: $100.12, second: df489807f81c8c8829e509e1bcb92e6692b9dd9d624b7456435cb2f51dc82587 }" - MaxLineLength:InteractiveShellTest.kt$InteractiveShellTest$val instance = clazz.getConstructor(*args.map { it!!::class.java }.toTypedArray()).newInstance(*args) as FlowA MaxLineLength:InterestSwapRestAPI.kt$InterestRateSwapAPI - MaxLineLength:InterestSwapRestAPI.kt$InterestRateSwapAPI$val states = vault.filterStatesOfType<InterestRateSwap.State>().filter { it.state.data.linearId.externalId == ref } + MaxLineLength:InternalAccessTestHelpers.kt$fun <T> ifThrowsAppend(strToAppendFn: () -> String, block: () -> T): T + MaxLineLength:InternalAccessTestHelpers.kt$fun Class<out Any?>.accessPropertyDescriptors(validateProperties: Boolean = true): Map<String, PropertyDescriptor> MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$ fun createNode(parameters: InternalMockNodeParameters = InternalMockNodeParameters(), nodeFactory: (MockNodeArgs) -> MockNode): TestStartedNode - MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$"You can use MockNetwork.waitQuiescent() to wait for all the nodes to process all the messages on their queues instead." - MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$/** * Returns the list of nodes started by the network. Each notary specified when the network is constructed ([notarySpecs] * parameter) maps 1:1 to the notaries returned by this list. */ val notaryNodes: List<TestStartedNode> MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$?: - MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$TestCordappInternal.installCordapps(baseDirectory, parameters.additionalCordapps.toSet(), combinedCordappsForAllNodes) - MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$configOverrides = { doReturn(NotaryConfig(spec.validating, className = spec.className)).whenever(it).notary } MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$fun createUnstartedNode(parameters: InternalMockNodeParameters = InternalMockNodeParameters(), nodeFactory: (MockNodeArgs) -> MockNode): MockNode - MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$private MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$private val serializationEnv = checkNotNull(setDriverSerialization()) { "Using more than one mock network simultaneously is not supported." } MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$servicePeerAllocationStrategy: InMemoryMessagingNetwork.ServicePeerAllocationStrategy = defaultParameters.servicePeerAllocationStrategy - MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$val messagingNetwork = InMemoryMessagingNetwork.create(networkSendManuallyPumped, servicePeerAllocationStrategy, busyLatch) MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$val node = nodeFactory(MockNodeArgs(config, this, id, parameters.entropyRoot, parameters.version, flowManager = parameters.flowManager)) - MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork$val testDirectory: Path = Paths.get("build") / "mock-network" / getTimestampAsDirectoryName() - MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork.MockNode$(network as MockNodeMessagingService).start(mockNet.messagingNetwork, !mockNet.threadPerNode, id, myNotaryIdentity) MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork.MockNode$fun <T : FlowLogic<*>> registerInitiatedFlowFactory(initiatingFlowClass: Class<out FlowLogic<*>>, initiatedFlowClass: Class<T>, factory: InitiatedFlowFactory<T>, track: Boolean): Observable<T> MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork.MockNode$open - MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork.MockNode$override MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork.MockNode$require(cryptoService is BCCryptoService) { "MockNode supports BCCryptoService only, but it is ${cryptoService.javaClass.name}" } MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork.MockNode${ require(cryptoService is BCCryptoService) { "MockNode supports BCCryptoService only, but it is ${cryptoService.javaClass.name}" } counter = counter.add(BigInteger.ONE) // The StartedMockNode specifically uses EdDSA keys as they are fixed and stored in json files for some tests (e.g IRSSimulation). val keyPair = Crypto.deriveKeyPairFromEntropy(Crypto.EDDSA_ED25519_SHA512, counter) (cryptoService as BCCryptoService).importKey(alias, keyPair) return keyPair.public } MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork.MockNode.TestStartedNodeImpl$override - MaxLineLength:InternalMockNetwork.kt$InternalMockNetwork.MockNode.TestStartedNodeImpl$return smm.changes.filter { it is StateMachineManager.Change.Add }.map { it.logic }.ofType(initiatedFlowClass) - MaxLineLength:InternalMockNetwork.kt$MessagingServiceSpy$val messagingService: MessagingService get() = checkNotNull(_messagingService) { "Spy has not been attached to a node" } - MaxLineLength:InternalMockNetwork.kt$MockNodeFlowManager$override - MaxLineLength:InternalMockNetwork.kt$TestStartedNode$ fun setMessagingServiceSpy(spy: MessagingServiceSpy) MaxLineLength:InternalMockNetwork.kt$TestStartedNode$fun <T : FlowLogic<*>> registerInitiatedFlow(initiatingFlowClass: Class<out FlowLogic<*>>, initiatedFlowClass: Class<T>, track: Boolean = false): Observable<T> MaxLineLength:InternalMockNetworkConfigOverrides.kt$return NotaryConfig(validating = this.validating, extraConfig = this.extraConfig, serviceLegalName = this.serviceLegalName, className = this.className) MaxLineLength:InternalMockNetworkConfigOverrides.kt$this.flowTimeout?.also { fto -> doReturn(FlowTimeoutConfiguration(fto.timeout, fto.maxRestartCount, fto.backoffBase)).whenever(config).flowTimeout } MaxLineLength:InternalMockNetworkIntegrationTests.kt$InternalMockNetworkIntegrationTests$assertEquals(0, startJavaProcess<InternalMockNetworkIntegrationTests>(emptyList(), extraJvmArguments = listOf("-javaagent:$quasar")).waitFor()) - MaxLineLength:InternalMockNetworkTests.kt$InternalMockNetworkTests$node1.network.send(node2.network.createMessage("test.topic", data = bits), rigorousMock<AllPossibleRecipients>()) MaxLineLength:InternalRPCMessagingClient.kt$InternalRPCMessagingClient : SingletonSerializeAsTokenAutoCloseable - MaxLineLength:InternalRPCMessagingClient.kt$InternalRPCMessagingClient$fun init(rpcOps: RPCOps, securityManager: RPCSecurityManager, cacheFactory: NamedCacheFactory) MaxLineLength:InternalRPCMessagingClient.kt$InternalRPCMessagingClient$rpcServer = RPCServer(rpcOps, NODE_RPC_USER, NODE_RPC_USER, locator!!, securityManager, nodeName, rpcServerConfiguration, cacheFactory) - MaxLineLength:InternalSerializationTestHelpers.kt$fun <T> SerializationEnvironment.asTestContextEnv(inheritable: Boolean = false, callable: (SerializationEnvironment) -> T): T - MaxLineLength:InternalTestUtils.kt$ // TODO Rename to cordappWithClasses fun cordappForClasses(vararg classes: Class<*>): CustomCordapp - MaxLineLength:InternalTestUtils.kt$ fun JarOutputStream.addEntry(entry: ZipEntry, input: InputStream) - MaxLineLength:InternalTestUtils.kt$ fun NodeInfo.chooseIdentity(): Party - MaxLineLength:InternalTestUtils.kt$ fun addressMustBeBound(executorService: ScheduledExecutorService, hostAndPort: NetworkHostAndPort, listenProcess: Process? = null) MaxLineLength:InternalTestUtils.kt$ fun cordappWithPackages(vararg packageNames: String): CustomCordapp - MaxLineLength:InternalTestUtils.kt$ fun createDevNodeCaCertPath( legalName: CordaX500Name, nodeKeyPair: KeyPair = generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME), rootCaName: X500Principal = defaultRootCaName, intermediateCaName: X500Principal = defaultIntermediateCaName ): Triple<CertificateAndKeyPair, CertificateAndKeyPair, CertificateAndKeyPair> - MaxLineLength:InternalTestUtils.kt$ fun findCordapp(scanPackage: String): TestCordappImpl - MaxLineLength:InternalTestUtils.kt$/* * The default timeout value of 40 seconds have been chosen based on previous node shutdown time estimate. * It's been observed that nodes can take up to 30 seconds to shut down, so just to stay on the safe side the 60 seconds * timeout has been chosen. */ fun addressMustNotBeBound(executorService: ScheduledExecutorService, hostAndPort: NetworkHostAndPort, timeout: Duration = 40.seconds) MaxLineLength:InternalTestUtils.kt$/** * *Custom* CorDapp containing the contents of the `net.corda.testing.contracts` package, i.e. the dummy contracts. This is not a real CorDapp * in the way that [FINANCE_CONTRACTS_CORDAPP] and [FINANCE_WORKFLOWS_CORDAPP] are. */ @JvmField val DUMMY_CONTRACTS_CORDAPP: CustomCordapp = cordappWithPackages("net.corda.testing.contracts") MaxLineLength:InternalTestUtils.kt$/** * Reference to the finance-contracts CorDapp in this repo. The metadata is taken directly from finance/contracts/build.gradle, including the * fact that the jar is signed. If you need an unsigned jar then use `cordappWithPackages("net.corda.finance.contracts")`. * * You will probably need to use [FINANCE_CORDAPPS] instead to get access to the flows as well. */ @JvmField val FINANCE_CONTRACTS_CORDAPP: TestCordappImpl = findCordapp("net.corda.finance.contracts") MaxLineLength:InternalTestUtils.kt$/** * Reference to the finance-workflows CorDapp in this repo. The metadata is taken directly from finance/workflows/build.gradle, including the * fact that the jar is signed. If you need an unsigned jar then use `cordappWithPackages("net.corda.finance.flows")`. * * You will probably need to use [FINANCE_CORDAPPS] instead to get access to the contract classes as well. */ @JvmField val FINANCE_WORKFLOWS_CORDAPP: TestCordappImpl = findCordapp("net.corda.finance.workflows") - MaxLineLength:InternalTestUtils.kt$ListenProcessDeathException$CordaException("The process that was expected to listen on $hostAndPort has died with status: ${listenProcess.exitValue()}") - MaxLineLength:InternalTestUtils.kt$RPCSecurityManagerImpl(SecurityConfiguration.AuthService.fromUsers(users).copy(id = id), TestingNamedCacheFactory()) - MaxLineLength:InternalTestUtils.kt$fun <T> StartedNodeServices.startFlow(logic: FlowLogic<T>): FlowStateMachine<T> MaxLineLength:InternalTestUtils.kt$fun addressMustBeBoundFuture(executorService: ScheduledExecutorService, hostAndPort: NetworkHostAndPort, listenProcess: Process? = null): CordaFuture<Unit> - MaxLineLength:InternalTestUtils.kt$fun addressMustNotBeBoundFuture(executorService: ScheduledExecutorService, hostAndPort: NetworkHostAndPort): CordaFuture<Unit> MaxLineLength:InternalTestUtils.kt$fun fakeAttachment(filePath1: String, content1: String, filePath2: String, content2: String, manifestAttributes: Map<String, String> = emptyMap()): ByteArray - MaxLineLength:InternalTestUtils.kt$manifestAttributes.forEach { manifest[it.key] = it.value } - MaxLineLength:InternalTestUtils.kt$require(classes.isNotEmpty()) { "${receiverClass.name} does not contain any enclosed classes to build a CorDapp out of" } - MaxLineLength:InternalTestUtils.kt$val componentGroups = createComponentGroups(inputs, outputs, commands, attachments, notary, timeWindow, emptyList(), null) MaxLineLength:InternalTestUtils.kt$val persistence = createCordaPersistence(databaseConfig, wellKnownPartyFromX500Name, wellKnownPartyFromAnonymous, schemaService, hikariProperties, cacheFactory, null) - MaxLineLength:InternalTestUtilsTest.kt$InternalTestUtilsTest$assertThat(simplifyScanPackages(listOf("com.foobar", "com.foo"))).containsExactlyInAnyOrder("com.foobar", "com.foo") - MaxLineLength:InternalTestUtilsTest.kt$InternalTestUtilsTest$assertThat(simplifyScanPackages(listOf("com.foobar", "com.foo.bar"))).containsExactlyInAnyOrder("com.foobar", "com.foo.bar") - MaxLineLength:InternalUtils.kt$ @DeleteForDJVM fun <T> Any.declaredField(clazz: Class<*>, name: String): DeclaredField<T> - MaxLineLength:InternalUtils.kt$ @DeleteForDJVM fun <T> Any.declaredField(clazz: KClass<*>, name: String): DeclaredField<T> - MaxLineLength:InternalUtils.kt$ @DeleteForDJVM fun <T> Any.declaredField(name: String): DeclaredField<T> - MaxLineLength:InternalUtils.kt$ @DeleteForDJVM fun <T> KClass<*>.staticField(name: String): DeclaredField<T> MaxLineLength:InternalUtils.kt$ fun <T, U> List<T>.lazyMapped(transform: (T, Int) -> U): List<U> MaxLineLength:InternalUtils.kt$// TODO: Currently the certificate revocation status is not handled here. Nowhere in the code the second parameter is used. Consider adding the support in the future. fun CertPath.validate(trustAnchor: TrustAnchor, checkRevocation: Boolean = false): PKIXCertPathValidatorResult MaxLineLength:InternalUtils.kt$?: - MaxLineLength:InternalUtils.kt$@DeleteForDJVM fun InputStream.copyTo(target: Path, vararg options: CopyOption): Long - MaxLineLength:InternalUtils.kt$DeclaredField<T> - MaxLineLength:InternalUtils.kt$LazyMappedList<T, U> : AbstractList - MaxLineLength:InternalUtils.kt$if (predicate(iterator.next())) throw IllegalArgumentException("Collection contains more than one matching element.") - MaxLineLength:InternalUtils.kt$val Class<*>.packageNameOrNull: String? // This intentionally does not go via `package` as that code path is slow and contended and just ends up doing this. get() { val name = this.getName() val i = name.lastIndexOf('.') if (i != -1) { return name.substring(0, i) } else { return null } } - MaxLineLength:Interpolators.kt$CubicSplineInterpolator : Interpolator - MaxLineLength:Interpolators.kt$Polynomial + MaxLineLength:InternalUtils.kt$val Class<*>.packageNameOrNull: String? // This intentionally does not go via `package` as that code path is slow and contended and just ends up doing this. get() { val name = this.name val i = name.lastIndexOf('.') return if (i != -1) { name.substring(0, i) } else { null } } MaxLineLength:InvocationContext.kt$Actor.Companion$@JvmStatic fun service(serviceClassName: String, owningLegalIdentity: CordaX500Name): Actor - MaxLineLength:InvocationContext.kt$InvocationContext MaxLineLength:InvocationContext.kt$InvocationContext$@CordaSerializable data MaxLineLength:InvocationContext.kt$InvocationContext.Companion$ @DeleteForDJVM @JvmStatic fun newInstance(origin: InvocationOrigin, trace: Trace = Trace.newInstance(), actor: Actor? = null, externalTrace: Trace? = null, impersonatedActor: Actor? = null) MaxLineLength:InvocationContext.kt$InvocationContext.Companion$ @DeleteForDJVM @JvmStatic fun peer(party: CordaX500Name, trace: Trace = Trace.newInstance(), externalTrace: Trace? = null, impersonatedActor: Actor? = null): InvocationContext @@ -6350,408 +3764,144 @@ MaxLineLength:InvocationContext.kt$InvocationContext.Companion$ @DeleteForDJVM @JvmStatic fun shell(trace: Trace = Trace.newInstance(), externalTrace: Trace? = null): InvocationContext MaxLineLength:IrsDemoClientApi.kt$IRSDemoClientApi$val fileContents = IOUtils.toString(Thread.currentThread().contextClassLoader.getResourceAsStream("net/corda/irs/simulation/example.rates.txt"), Charsets.UTF_8.name()) MaxLineLength:IrsDemoClientApi.kt$IRSDemoClientApi$val fileContents = IOUtils.toString(javaClass.classLoader.getResourceAsStream("net/corda/irs/web/simulation/example-irs-trade.json"), Charsets.UTF_8.name()) - MaxLineLength:IssueCash.kt$IssueCash$BankOfCordaClientApi.requestWebIssue(NetworkHostAndPort("localhost", BOC_WEB_PORT), createParams(amount, NOTARY_NAME)) - MaxLineLength:IssueCash.kt$IssueCash$private - MaxLineLength:IssueCash.kt$IssueCash$return BankOfCordaClientApi.requestRPCIssue(NetworkHostAndPort("localhost", BOC_RPC_PORT), createParams(amount, NOTARY_NAME)) - MaxLineLength:IssueCash.kt$IssueCash$val currency = parser.accepts("currency").withOptionalArg().ofType(String::class.java).describedAs("[GBP|USD|CHF|EUR]") MaxLineLength:IssueCash.kt$IssueCash$val roleArg = parser.accepts("role").withRequiredArg().ofType(Role::class.java).describedAs("[ISSUER|ISSUE_CASH_RPC|ISSUE_CASH_WEB]") - MaxLineLength:IssueCashLoggingTests.kt$IssueCashLoggingTests$nodeA.rpc.startFlow(::CashIssueAndPaymentFlow, amount, ref, recipient, false, defaultNotaryIdentity).returnValue.getOrThrow() MaxLineLength:IssueCashLoggingTests.kt$IssueCashLoggingTests$val linesWithDuplicateInsertionWarningsInA = nodeA.logFile().useLines { lines -> lines.filter(String::containsDuplicateInsertWarning).toList() } MaxLineLength:IssueCashLoggingTests.kt$IssueCashLoggingTests$val linesWithDuplicateInsertionWarningsInB = nodeB.logFile().useLines { lines -> lines.filter(String::containsDuplicateInsertWarning).toList() } MaxLineLength:IssueCashLoggingTests.kt$fun NodeHandle.logFile(): File - MaxLineLength:IssueCashLoggingTests.kt$private fun String.containsDuplicateInsertWarning(): Boolean MaxLineLength:IssuerModel.kt$IssuerModel$val currencyTypes = ChosenList(cashAppConfiguration.map { it?.issuableCurrencies?.observable() ?: FXCollections.emptyObservableList() }, "currencyTypes") MaxLineLength:IssuerModel.kt$IssuerModel$val supportedCurrencies = ChosenList(cashAppConfiguration.map { it?.supportedCurrencies?.observable() ?: FXCollections.singletonObservableList(defaultCurrency) }, "supportedCurrencies") - MaxLineLength:JacksonSupport.kt$JacksonSupport$ @JvmStatic @JvmOverloads fun createDefaultMapper(rpc: CordaRPCOps, factory: JsonFactory = JsonFactory(), fuzzyIdentityMatch: Boolean = false, fullParties: Boolean = false): ObjectMapper - MaxLineLength:JacksonSupport.kt$JacksonSupport$ @JvmStatic @JvmOverloads fun createInMemoryMapper(identityService: IdentityService, factory: JsonFactory = JsonFactory(), fuzzyIdentityMatch: Boolean = false, fullParties: Boolean = false): ObjectMapper - MaxLineLength:JacksonSupport.kt$JacksonSupport$ @JvmStatic @JvmOverloads fun createNonRpcMapper(factory: JsonFactory = JsonFactory(), fullParties: Boolean = false): ObjectMapper - MaxLineLength:JacksonSupport.kt$JacksonSupport$@CordaInternal @VisibleForTesting internal - MaxLineLength:JacksonSupport.kt$JacksonSupport$@Deprecated("Do not use this as it's not thread safe. Instead get a ObjectMapper instance with one of the create*Mapper methods.") - MaxLineLength:JacksonSupport.kt$JacksonSupport.IdentityObjectMapper$override fun wellKnownPartyFromX500Name(name: CordaX500Name): Party? - MaxLineLength:JacksonSupport.kt$JacksonSupport.PartyDeserializer$?: MaxLineLength:JacksonSupport.kt$JacksonSupport.PartyDeserializer$mapper.wellKnownPartyFromX500Name(principal) ?: throw JsonParseException(parser, "Could not find a Party with name $principal") MaxLineLength:JacksonSupport.kt$JacksonSupport.PartyDeserializer$throw JsonParseException(parser, "No matching Party found, then tried to directly deserialise ${parser.text} as a PublicKey with no success", e) - MaxLineLength:JacksonSupport.kt$JacksonSupport.RpcObjectMapper$@Deprecated("This is an internal class, do not use", replaceWith = ReplaceWith("JacksonSupport.createDefaultMapper")) - MaxLineLength:JacksonSupport.kt$JacksonSupport.X509CertificateSerializer$writeObjectField("keyUsage", value.keyUsage?.asList()?.mapIndexedNotNull { i, flag -> if (flag) keyUsages[i] else null }) - MaxLineLength:JacksonSupport.kt$JacksonSupport.X509CertificateSerializer$writeObjectField("pathLength", value.basicConstraints.let { if (it != Int.MAX_VALUE) it else null }) MaxLineLength:JacksonSupportTest.kt$JacksonSupportTest$TransactionSignature(ByteArray(1), ALICE_PUBKEY, SignatureMetadata(1, Crypto.findSignatureScheme(ALICE_PUBKEY).schemeNumberID), partialMerkleTree) - MaxLineLength:JacksonSupportTest.kt$JacksonSupportTest$TransactionSignature(ByteArray(1), BOB_PUBKEY, SignatureMetadata(1, Crypto.findSignatureScheme(BOB_PUBKEY).schemeNumberID)) - MaxLineLength:JacksonSupportTest.kt$JacksonSupportTest$assertThat(json["class"].textValue()).isEqualTo("net.corda.client.jackson.JacksonSupportTest\$ClassNotOnClasspath") - MaxLineLength:JacksonSupportTest.kt$JacksonSupportTest$assertThat(mapper.convertValue<OpaqueBytes>(BinaryNode(byteArrayOf(1, 2, 3, 4)))).isEqualTo(OpaqueBytes.of(1, 2, 3, 4)) - MaxLineLength:JacksonSupportTest.kt$JacksonSupportTest$assertThat(mapper.convertValue<SerializedBytes<*>>(BinaryNode(serializedBytes.bytes))).isEqualTo(serializedBytes) - MaxLineLength:JacksonSupportTest.kt$JacksonSupportTest$assertThat(mapper.convertValue<SignatureScheme>(TextNode("EDDSA_ED25519_SHA512"))).isSameAs(Crypto.EDDSA_ED25519_SHA512) - MaxLineLength:JacksonSupportTest.kt$JacksonSupportTest$assertThat(mapper.valueToTree<TextNode>(Amount.parseCurrency("£25000000")).textValue()).isEqualTo("25000000.00 GBP") - MaxLineLength:JacksonSupportTest.kt$JacksonSupportTest$fun convertToNodeInfo() - MaxLineLength:JacksonSupportTest.kt$JacksonSupportTest$val transactionSignature = TransactionSignature(secureRandomBytes(128), BOB_PUBKEY, signatureMetadata, partialMerkleTree) MaxLineLength:JacksonSupportTest.kt$JacksonSupportTest$val wtxFields = wtxJson.assertHasOnlyFields("id", "notary", "inputs", "attachments", "outputs", "commands", "timeWindow", "references", "privacySalt", "networkParametersHash") MaxLineLength:JacksonSupportTest.kt$JacksonSupportTest${ val cert: X509Certificate = MINI_CORP.identity.certificate val json = mapper.valueToTree<ObjectNode>(cert) println(mapper.writeValueAsString(json)) assertThat(json["serialNumber"].bigIntegerValue()).isEqualTo(cert.serialNumber) assertThat(json["issuer"].valueAs<X500Principal>(mapper)).isEqualTo(cert.issuerX500Principal) assertThat(json["subject"].valueAs<X500Principal>(mapper)).isEqualTo(cert.subjectX500Principal) // cert.publicKey should be converted to a supported format (this is required because [Certificate] returns keys as SUN EC keys, not BC). assertThat(json["publicKey"].valueAs<PublicKey>(mapper)).isEqualTo(Crypto.toSupportedPublicKey(cert.publicKey)) assertThat(json["notAfter"].valueAs<Date>(mapper)).isEqualTo(cert.notAfter) assertThat(json["notBefore"].valueAs<Date>(mapper)).isEqualTo(cert.notBefore) assertThat(json["encoded"].binaryValue()).isEqualTo(cert.encoded) } - MaxLineLength:JarScanningCordappLoader.kt$CordappLoaderTemplate$"${entry.value.first().first.name}: [ ${entry.value.joinToString { it.second.jarPath.toString() }} ]." - MaxLineLength:JarScanningCordappLoader.kt$CordappLoaderTemplate$throw MultipleCordappsForFlowException("There are multiple CorDapp JARs on the classpath for flow " + "${entry.value.first().first.name}: [ ${entry.value.joinToString { it.second.jarPath.toString() }} ].") MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$"platform version ${it.minimumPlatformVersion} (This node is running version ${versionInfo.platformVersion})." MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$?: - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$RestrictedURL - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$contractInfo != null && workflowInfo != null -> return Cordapp.Info.ContractAndWorkflow(contractInfo, workflowInfo) - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$it.javaClass.location == cordappJarPath.url && it.javaClass.name.startsWith(cordappJarPath.qualifiedNamePrefix) MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$logger MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$override val appClassLoader: URLClassLoader = URLClassLoader(cordappJarPaths.stream().map { it.url }.toTypedArray(), javaClass.classLoader) MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$private val signerKeyFingerprintBlacklist: List<SecureHash.SHA256> = emptyList() - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$return Modifier.isPublic(modifiers) && !isLocalClass && !isAnonymousClass && (!isMemberClass || Modifier.isStatic(modifiers)) - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$return scanResult.getClassesWithAnnotation(FlowLogic::class, StartableByRPC::class).filter { it.isUserInvokable() } - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$throw CordappInvalidVersionException("Target versionId ($versionStr) for attribute $attributeName must not be smaller than 1.") MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$throw CordappInvalidVersionException("Target versionId attribute $attributeName not specified. Please specify a whole number starting from 1.") - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$val blockedCertificates = certificates.filter { it.publicKey.hash.sha256() in signerKeyFingerprintBlacklist } - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$val certificates = it.jarPath.openStream().let(::JarInputStream).use(JarSignatureCollector::collectCertificates) - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$val scanResult = ClassGraph().addClassLoader(appClassLoader).overrideClasspath(cordappJarPath.url).enableAllInfo().pooledScan() - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$val targetPlatformVersion = manifest?.get(CordappImpl.TARGET_PLATFORM_VERSION)?.toIntOrNull() ?: minPlatformVersion - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$versionId = parseVersion(manifest[CordappImpl.CORDAPP_CONTRACT_VERSION], CordappImpl.CORDAPP_CONTRACT_VERSION) - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader$versionId = parseVersion(manifest[CordappImpl.CORDAPP_WORKFLOW_VERSION], CordappImpl.CORDAPP_WORKFLOW_VERSION) - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader.Companion$ fun fromJarUrls(scanJars: List<URL>, versionInfo: VersionInfo = VersionInfo.UNKNOWN, extraCordapps: List<CordappImpl> = emptyList(), cordappsSignerKeyFingerprintBlacklist: List<SecureHash.SHA256> = emptyList()): JarScanningCordappLoader - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader.Companion$cordappsSignerKeyFingerprintBlacklist: List<SecureHash.SHA256> = emptyList() - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader.Companion$signerKeyFingerprintBlacklist: List<SecureHash.SHA256> = emptyList() - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader.RestrictedScanResult$fun <T : Any> getClassesWithAnnotation(type: KClass<T>, annotation: KClass<out Annotation>): List<Class<out T>> - MaxLineLength:JarScanningCordappLoader.kt$JarScanningCordappLoader.RestrictedScanResult$private inner - MaxLineLength:JarScanningCordappLoaderTest.kt$JarScanningCordappLoaderTest$@Test fun `cordapp classloader does not load apps when their min platform version is greater than the node platform version`() MaxLineLength:JarScanningCordappLoaderTest.kt$JarScanningCordappLoaderTest$assertThat(actualCordapp.serializationWhitelists.first().javaClass.name).isEqualTo("net.corda.serialization.internal.DefaultWhitelist") - MaxLineLength:JarScanningCordappLoaderTest.kt$JarScanningCordappLoaderTest$val loader = JarScanningCordappLoader.fromJarUrls(listOf(jar), cordappsSignerKeyFingerprintBlacklist = DEV_PUB_KEY_HASHES) - MaxLineLength:JarScanningCordappLoaderTest.kt$JarScanningCordappLoaderTest$val loader = JarScanningCordappLoader.fromJarUrls(listOf(jar), cordappsSignerKeyFingerprintBlacklist = emptyList()) - MaxLineLength:JarScanningCordappLoaderTest.kt$JarScanningCordappLoaderTest$val serializationWhitelistedClasses = actualCordapp.serializationWhitelists.flatMap { it.whitelist }.map { it.name } - MaxLineLength:JarSignatureCollector.kt$JarSignatureCollector$ fun collectCertificates(jar: JarInputStream): List<X509Certificate> - MaxLineLength:JarSignatureCollector.kt$JarSignatureCollector$/** * @see <https://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Signed_JAR_File> * Additionally accepting *.EC as its valid for [java.util.jar.JarVerifier] and jarsigner @see https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jarsigner.html, * temporally treating META-INF/INDEX.LIST as unsignable entry because [java.util.jar.JarVerifier] doesn't load its signers. */ private val unsignableEntryName = "META-INF/(?:(?:.*[.](?:SF|DSA|RSA|EC)|SIG-.*)|INDEX\\.LIST)".toRegex() MaxLineLength:JarSignatureCollectorTest.kt$JarSignatureCollectorTest$// Signing with EC algorithm produces META-INF/*.EC file name not compatible with JAR File Spec however it's compatible with java.util.JarVerifier // and our JarSignatureCollector @Test fun `one signer with EC algorithm`() - MaxLineLength:JarSignatureCollectorTest.kt$JarSignatureCollectorTest$assertEquals(listOf(key), dir.getJarSigners(FILENAME)) - MaxLineLength:JarSignatureCollectorTest.kt$JarSignatureCollectorTest${ (dir / "volatile").writeLines(listOf("volatile")) dir.createJar(FILENAME, "volatile") val key1 = signAsAlice() assertEquals(listOf(key1), dir.getJarSigners(FILENAME)) (dir / "volatile").writeLines(listOf("garbage")) dir.updateJar(FILENAME, "volatile", "_signable1") // ALICE's signature on volatile is now bad. signAsBob() // The JDK doesn't care that BOB has correctly signed the whole thing, it won't let us process the entry with ALICE's bad signature: assertFailsWith<SecurityException> { dir.getJarSigners(FILENAME) } } - MaxLineLength:JarSignatureTestUtils.kt$JarSignatureTestUtils$executeProcess("jarsigner", "-keystore", "_teststore", "-storepass", storePassword, "-keypass", keyPassword, fileName, alias) MaxLineLength:JarSignatureTestUtils.kt$JarSignatureTestUtils$executeProcess("keytool", "-genkeypair", "-keystore", storeName, "-storepass", storePassword, "-keyalg", keyalg, "-alias", alias, "-keypass", keyPassword, "-dname", name) MaxLineLength:JarSignatureTestUtils.kt$JarSignatureTestUtils$fun Path.generateKey(alias: String = "Test", storePassword: String = "secret!", name: String = CODE_SIGNER.toString(), keyalg: String = "RSA", keyPassword: String = storePassword, storeName: String = "_teststore") : PublicKey - MaxLineLength:JarSignatureTestUtils.kt$JarSignatureTestUtils$fun Path.signJar(fileName: String, alias: String, storePassword: String, keyPassword: String = storePassword): PublicKey MaxLineLength:KMSUtils.kt$require(issuerRole == CertRole.LEGAL_IDENTITY) { "Confidential identities can only be issued from well known identities, provided issuer ${issuer.name} has role $issuerRole" } - MaxLineLength:KeyManagementService.kt$KeyManagementService$ @Suspendable fun externalIdForPublicKey(publicKey: PublicKey): UUID? - MaxLineLength:KeyManagementService.kt$KeyManagementService$ @Suspendable fun freshKey(externalId: UUID): PublicKey - MaxLineLength:KeyManagementService.kt$KeyManagementService$ @Suspendable fun freshKeyAndCert(identity: PartyAndCertificate, revocationEnabled: Boolean): PartyAndCertificate - MaxLineLength:KeyManagementService.kt$KeyManagementService$ @Suspendable fun freshKeyAndCert(identity: PartyAndCertificate, revocationEnabled: Boolean, externalId: UUID): PartyAndCertificate - MaxLineLength:KeyManagementService.kt$KeyManagementService$ @Suspendable fun sign(bytes: ByteArray, publicKey: PublicKey): DigitalSignature.WithKey - MaxLineLength:KeyManagementService.kt$KeyManagementService$ @Suspendable fun sign(signableData: SignableData, publicKey: PublicKey): TransactionSignature - MaxLineLength:KeyManagementServiceInternal.kt$KeyManagementServiceInternal$override - MaxLineLength:KeyOwningIdentity.kt$KeyOwningIdentity - MaxLineLength:KeyOwningIdentity.kt$KeyOwningIdentity$MappedIdentity : KeyOwningIdentity - MaxLineLength:KeyOwningIdentity.kt$KeyOwningIdentity$UnmappedIdentity : KeyOwningIdentity - MaxLineLength:KeyStoreConfigHelpers.kt$"certificates/$DEV_CA_TRUST_STORE_FILE" MaxLineLength:KeyStoreConfigHelpers.kt$// A code signing policy is currently under design. // The following interim key represents a self-signed certificate produced using the Java keytool and located in the gradle cordapp plugins resources key store: // https://github.com/corda/corda-gradle-plugins/blob/master/cordapp/src/main/resources/certificates/cordadevcodesign.jks const val DEV_CORDAPP_CODE_SIGNING_STR = "AA59D829F2CA8FDDF5ABEA40D815F937E3E54E572B65B93B5C216AE6594E7D6B" - MaxLineLength:KeyStoreConfigHelpers.kt$devNodeCa: CertificateAndKeyPair = createDevNodeCa(intermediateCa, legalName) - MaxLineLength:KeyStoreConfigHelpers.kt$fun CertificateStore.storeLegalIdentity(alias: String, keyPair: KeyPair = Crypto.generateKeyPair()): PartyAndCertificate - MaxLineLength:KeyStoreConfigHelpers.kt$fun loadDevCaKeyStore(classLoader: ClassLoader = DevCaHelper::class.java.classLoader): CertificateStore - MaxLineLength:KeyStoreConfigHelpers.kt$fun loadDevCaTrustStore(classLoader: ClassLoader = DevCaHelper::class.java.classLoader): CertificateStore - MaxLineLength:KeyStoreConfigHelpers.kt$nodeKeyPair: KeyPair = generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) MaxLineLength:KeyStoreConfigHelpers.kt$setPrivateKey MaxLineLength:KeyStoreConfigHelpers.kt$val DEV_PUB_KEY_HASHES: List<SecureHash.SHA256> get() = listOf(DEV_INTERMEDIATE_CA.certificate, DEV_ROOT_CA.certificate).map { it.publicKey.hash.sha256() } + SecureHash.parse(DEV_CORDAPP_CODE_SIGNING_STR).sha256() MaxLineLength:KeyStoreConfigHelpers.kt$val identityCert = X509Utilities.createCertificate(CertificateType.LEGAL_IDENTITY, nodeCaCertAndKeyPair.certificate, nodeCaCertAndKeyPair.keyPair, nodeCaCertAndKeyPair.certificate.subjectX500Principal, keyPair.public) MaxLineLength:KeyStoreConfigHelpers.kt$val nameConstraints = NameConstraints(arrayOf(GeneralSubtree(GeneralName(GeneralName.directoryName, legalName.toX500Name()))), arrayOf()) - MaxLineLength:KeyStoreConfigHelpers.kt$val nodeCaCertAndKeyPair = getCertificateAndKeyPair(X509Utilities.CORDA_CLIENT_CA, this@storeLegalIdentity.entryPassword) MaxLineLength:KeyStoreConfigHelpers.kt$val tlsCert = X509Utilities.createCertificate(CertificateType.TLS, devNodeCa.certificate, devNodeCa.keyPair, legalName.x500Principal, tlsKeyPair.public) - MaxLineLength:KeyStoreUtilities.kt$ fun KeyStore.addOrReplaceKey(alias: String, key: Key, password: CharArray, chain: Array<out Certificate>) - MaxLineLength:KeyStoreUtilities.kt$ fun KeyStore.getSupportedKey(alias: String, keyPassword: String): PrivateKey - MaxLineLength:KeyStoreUtilities.kt$ fun KeyStore.save(keyStoreFilePath: Path, storePassword: String) MaxLineLength:KeyStoreUtilities.kt$return certificate as? X509Certificate ?: throw IllegalStateException("Certificate under alias \"$alias\" is not an X.509 certificate: $certificate") - MaxLineLength:KotlinIntegrationTestingTutorial.kt$KotlinIntegrationTestingTutorial$bobProxy.startFlow(::CashPaymentFlow, 1000.DOLLARS, alice.nodeInfo.singleIdentity()).returnValue.getOrThrow() - MaxLineLength:KotlinUtilsTest.kt$KotlinUtilsTest$original.checkpointSerialize(context = KRYO_CHECKPOINT_CONTEXT).checkpointDeserialize(context = KRYO_CHECKPOINT_NOWHITELIST_CONTEXT) - MaxLineLength:KotlinUtilsTest.kt$KotlinUtilsTest$val copy = original.checkpointSerialize(context = KRYO_CHECKPOINT_CONTEXT).checkpointDeserialize(context = KRYO_CHECKPOINT_CONTEXT) - MaxLineLength:Kryo.kt$ContractUpgradeFilteredTransactionSerializer$override MaxLineLength:Kryo.kt$ContractUpgradeFilteredTransactionSerializer$val visibleComponents: Map<Int, ContractUpgradeFilteredTransaction.FilteredComponent> = uncheckedCast(kryo.readClassAndObject(input)) - MaxLineLength:Kryo.kt$ContractUpgradeWireTransactionSerializer$override MaxLineLength:Kryo.kt$ImmutableClassSerializer$throw KryoException("Hashcode mismatch for parameter types for ${klass.qualifiedName}: unsupported type evolution has happened.") - MaxLineLength:Kryo.kt$PublicKeySerializer${ // TODO: Instead of encoding to the default X509 format, we could have a custom per key type (space-efficient) serialiser. output.writeBytesWithLength(obj.encoded) } MaxLineLength:Kryo.kt$ThrowableSerializer$private val delegate: Serializer<Throwable> = uncheckedCast(ReflectionSerializerFactory.makeSerializer(kryo, FieldSerializer::class.java, type)) - MaxLineLength:Kryo.kt$X509CertificateSerializer$return CertificateFactory.getInstance("X.509").generateCertificate(input.readBytesWithLength().inputStream()) as X509Certificate - MaxLineLength:Kryo.kt$fun Kryo.serializationContext(): SerializeAsTokenContext? - MaxLineLength:Kryo.kt$if (elemCount < minLen) throw KryoException("Cannot deserialize list, too little elements. Minimum required: $minLen, got: $elemCount") - MaxLineLength:KryoCheckpointSerializer.kt$AutoCloseableSerialisationDetector$override fun read(kryo: Kryo, input: Input, type: Class<AutoCloseable>) - MaxLineLength:KryoCheckpointSerializer.kt$AutoCloseableSerialisationDetector$val message = "${closeable.javaClass.name}, which is a closeable resource, has been detected during flow checkpointing. " + "Restoring such resources across node restarts is not supported. Make sure code accessing it is " + "confined to a private method or the reference is nulled out." MaxLineLength:KryoCheckpointSerializer.kt$KryoCheckpointSerializer$context.encodingWhitelist.acceptEncoding(encoding) || throw KryoException(encodingNotPermittedFormat.format(encoding)) - MaxLineLength:KryoCheckpointSerializer.kt$KryoCheckpointSerializer$override - MaxLineLength:KryoCheckpointSerializer.kt$KryoCheckpointSerializer$val serializer = Fiber.getFiberSerializer(false) as KryoSerializer val classResolver = CordaClassResolver(context).apply { setKryo(serializer.kryo) } // TODO The ClassResolver can only be set in the Kryo constructor and Quasar doesn't provide us with a way of doing that val field = Kryo::class.java.getDeclaredField("classResolver").apply { isAccessible = true } serializer.kryo.apply { field.set(this, classResolver) // don't allow overriding the public key serializer for checkpointing DefaultKryoCustomizer.customize(this) addDefaultSerializer(AutoCloseable::class.java, AutoCloseableSerialisationDetector) register(ClosureSerializer.Closure::class.java, CordaClosureSerializer) classLoader = it.second } - MaxLineLength:KryoTests.kt$KryoTests$@Test fun `serialised form is stable when the same object instance occurs more than once, and using java serialisation`() MaxLineLength:KryoTests.kt$KryoTests$assertThat(deserialisedList.checkpointSerialize(noReferencesContext)).isEqualTo(originalList.checkpointSerialize(noReferencesContext)) MaxLineLength:KryoTests.kt$KryoTests$assertThat(listWithSameInstances.checkpointSerialize(noReferencesContext)).isEqualTo(listWithCopies.checkpointSerialize(noReferencesContext)) - MaxLineLength:KryoTests.kt$KryoTests$val deserialisedList = originalList.checkpointSerialize(noReferencesContext).checkpointDeserialize(noReferencesContext) - MaxLineLength:KryoTests.kt$KryoTests$val deserialisedMap: Map<Int, Int> = emptyMap<Int, Int>().checkpointSerialize(context).checkpointDeserialize(context) - MaxLineLength:KryoTests.kt$KryoTests$val meta = SignableData(testBytes.sha256(), SignatureMetadata(1, Crypto.findSignatureScheme(ALICE_PUBKEY).schemeNumberID)) - MaxLineLength:KryoTests.kt$KryoTests$val readRubbishStream: InputStream = rubbish.inputStream().checkpointSerialize(context).checkpointDeserialize(context) - MaxLineLength:KryoTests.kt$KryoTests$val streams = byteArrays.map { it.inputStream() }.checkpointSerialize(context).checkpointDeserialize(context).iterator() - MaxLineLength:LargeTransactionsTest.kt$LargeTransactionsTest$networkParameters = testNetworkParameters(maxMessageSize = 15.MB.toInt(), maxTransactionSize = 13.MB.toInt()) MaxLineLength:LargeTransactionsTest.kt$LargeTransactionsTest$val (alice, _) = listOf(ALICE_NAME, BOB_NAME).map { startNode(providedName = it, rpcUsers = listOf(rpcUser)) }.transpose().getOrThrow() - MaxLineLength:LazyPool.kt$LazyPool<A> MaxLineLength:LazyStickyPool.kt$LazyStickyPool<A : Any> - MaxLineLength:LedgerDSLInterpreter.kt$LedgerDSL$ @JvmOverloads fun unverifiedTransaction(label: String? = null, transactionBuilder: TransactionBuilder = TransactionBuilder(notary = notary), dsl: TransactionDSL<TransactionDSLInterpreter>.() -> Unit) - MaxLineLength:LedgerDSLInterpreter.kt$LedgerDSL<out T : TransactionDSLInterpreter, out L : LedgerDSLInterpreter<T>> : LedgerDSLInterpreter MaxLineLength:LedgerTransaction.kt$LedgerTransaction : FullTransaction - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$ @Throws(TransactionVerificationException::class) fun verify() - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$ fun <T : CommandData> commandsOfType(clazz: Class<T>): List<Command<T>> - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$ fun <T : CommandData> filterCommands(clazz: Class<T>, predicate: Predicate<T>): List<Command<T>> - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$ fun <T : CommandData> findCommand(clazz: Class<T>, predicate: Predicate<T>): Command<T> - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$ fun <T : CommandData> getCommand(index: Int): Command<T> - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$ fun <T : ContractState> filterInRefs(clazz: Class<T>, predicate: Predicate<T>): List<StateAndRef<T>> - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$ fun <T : ContractState> filterInputs(clazz: Class<T>, predicate: Predicate<T>): List<T> - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$ fun <T : ContractState> filterReferenceInputRefs(clazz: Class<T>, predicate: Predicate<T>): List<StateAndRef<T>> - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$ fun <T : ContractState> filterReferenceInputs(clazz: Class<T>, predicate: Predicate<T>): List<T> - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$ fun <T : ContractState> inputsOfType(clazz: Class<T>): List<T> - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$ fun <T : ContractState> referenceInputsOfType(clazz: Class<T>): List<T> - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$"Use WireTransaction.toLedgerTransaction instead. The result of the verify method would not be accurate." - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$( inputs: List<StateAndRef<ContractState>>, outputs: List<TransactionState<ContractState>>, commands: List<CommandWithParties<CommandData>>, attachments: List<Attachment>, id: SecureHash, notary: Party?, timeWindow: TimeWindow?, privacySalt: PrivacySalt, networkParameters: NetworkParameters ) - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$/** * Network parameters that were in force when the transaction was constructed. This is nullable only for backwards * compatibility for serialized transactions. In reality this field will always be set when on the normal codepaths. */ override val networkParameters: NetworkParameters? - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$/** A list of [Attachment] objects identified by the transaction that are needed for this transaction to verify. */ val attachments: List<Attachment> MaxLineLength:LedgerTransaction.kt$LedgerTransaction$/** Random data used to make the transaction hash unpredictable even if the contents can be predicted; needed to avoid some obscure attacks. */ val privacySalt: PrivacySalt - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$/** The notary that the tx uses, this must be the same as the notary of all the inputs, or null if there are no inputs. */ override val notary: Party? - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$// Create a copy of the outer LedgerTransaction which deserializes all fields inside the [transactionClassLoader]. // Only the copy will be used for verification, and the outer shell will be discarded. // This artifice is required to preserve backwards compatibility. Verifier(createLtxForVerification(), transactionClassLoader) - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$inline - MaxLineLength:LedgerTransaction.kt$LedgerTransaction$inline fun <reified T : ContractState> referenceInputRefsOfType(): List<StateAndRef<T>> MaxLineLength:LedgerTransaction.kt$LedgerTransaction$logger MaxLineLength:LedgerTransaction.kt$LedgerTransaction$return inputs.mapNotNull { if (clazz.isInstance(it.state.data)) uncheckedCast<StateAndRef<ContractState>, StateAndRef<T>>(it) else null } MaxLineLength:LedgerTransaction.kt$LedgerTransaction$return references.mapNotNull { if (clazz.isInstance(it.state.data)) uncheckedCast<StateAndRef<ContractState>, StateAndRef<T>>(it) else null } MaxLineLength:LedgerTransaction.kt$LedgerTransaction$throw UnsupportedOperationException("Cannot verify a LedgerTransaction created using deprecated constructors outside of flow context.") MaxLineLength:LedgerTransaction.kt$LedgerTransaction$val deserializedOutputs = deserialiseComponentGroup(componentGroups, TransactionState::class, ComponentGroupEnum.OUTPUTS_GROUP, forceDeserialize = true) - MaxLineLength:LedgerTransaction.kt$LedgerTransaction${ // Switch thread local deserialization context to using a cached attachments classloader. This classloader enforces various rules // like no-overlap, package namespace ownership and (in future) deterministic Java. return AttachmentsClassLoaderBuilder.withAttachmentsClassloaderContext( this.attachments + extraAttachments, getParamsWithGoo(), id, isAttachmentTrusted = isAttachmentTrusted) { transactionClassLoader -> // Create a copy of the outer LedgerTransaction which deserializes all fields inside the [transactionClassLoader]. // Only the copy will be used for verification, and the outer shell will be discarded. // This artifice is required to preserve backwards compatibility. Verifier(createLtxForVerification(), transactionClassLoader) } } - MaxLineLength:LedgerTransaction.kt$LedgerTransaction${ // This path is triggered if someone used old constructors that were accidentally exposed; darn Kotlin's lack of package-private // visibility! We did originally try to maintain verification codepaths that supported lack of network parameters, but, it // got too convoluted and people kept just !! asserting the nullity away because on normal codepaths this is always set. logger.warn("Network parameters on the LedgerTransaction with id: $id are null. Please don't use deprecated constructors of the LedgerTransaction. " + "Use WireTransaction.toLedgerTransaction instead. The result of the verify method would not be accurate.") // Roll the dice - we're probably in flow context if we got here at all, which means we can fish the current params out. try { params = getParamsFromFlowLogic() } catch (e: UnsupportedOperationException) { // Inside DJVM, ignore. } if (params == null) throw UnsupportedOperationException("Cannot verify a LedgerTransaction created using deprecated constructors outside of flow context.") } MaxLineLength:LedgerTransaction.kt$LedgerTransaction.Companion$return LedgerTransaction(inputs, outputs, commands, attachments, id, notary, timeWindow, privacySalt, networkParameters, references).apply { this.componentGroups = componentGroups this.serializedInputs = serializedInputs this.serializedReferences = serializedReferences this.isAttachmentTrusted = isAttachmentTrusted } - MaxLineLength:LedgerTransaction.kt$LedgerTransaction.InOutGroup$@KeepForDJVM data MaxLineLength:LedgerTransactionQueryTests.kt$LedgerTransactionQueryTests$return StateAndRef(TransactionState(dummyState, DummyContract.PROGRAM_ID, DUMMY_NOTARY, constraint = AlwaysAcceptAttachmentConstraint), dummyStateRef) - MaxLineLength:LegalNameValidator.kt$LegalNameValidator$ fun validateNameAttribute(normalizedNameAttribute: String, validation: Validation) - MaxLineLength:LegalNameValidator.kt$LegalNameValidator$ fun validateOrganization(normalizedOrganization: String, validation: Validation) - MaxLineLength:LegalNameValidator.kt$LegalNameValidator$@Deprecated("Use validateOrganization instead", replaceWith = ReplaceWith("validateOrganization(normalizedLegalName)")) - MaxLineLength:LegalNameValidator.kt$LegalNameValidator.Rule.CapitalLetterRule$require(legalName == capitalizedLegalName) { "Legal name should be capitalized. i.e. '$capitalizedLegalName'" } MaxLineLength:LegalNameValidator.kt$LegalNameValidator.Rule.MustHaveAtLeastTwoLettersRule$require(legalName.count { it.isLetter() } >= 2) { "Illegal input legal name '$legalName'. Legal name must have at least two letters" } MaxLineLength:LegalNameValidator.kt$LegalNameValidator.Rule.UnicodeNormalizationRule$require(legalName == normalize(legalName)) { "Legal name must be normalized. Please use 'normalize' to normalize the legal name before validation." } - MaxLineLength:LegalNameValidator.kt$LegalNameValidator.Rule.UnicodeRangeRule$val illegalChars = legalName.toCharArray().filter { Character.UnicodeBlock.of(it) !in supportScriptsSet }.size MaxLineLength:LegalNameValidatorTest.kt$LegalNameValidatorTest$LegalNameValidator.validateNameAttribute("The quick brown fox jumped over the lazy dog.1234567890", LegalNameValidator.Validation.FULL) - MaxLineLength:LegalNameValidatorTest.kt$LegalNameValidatorTest$LegalNameValidator.validateOrganization("Legal Name With\n\rLine\nBreaks", LegalNameValidator.Validation.FULL) MaxLineLength:LegalNameValidatorTest.kt$LegalNameValidatorTest$LegalNameValidator.validateOrganization("Legal Name\u2004With\u0009Unicode\u0020Whitespaces", LegalNameValidator.Validation.FULL) MaxLineLength:LegalNameValidatorTest.kt$LegalNameValidatorTest$LegalNameValidator.validateOrganization("The quick brown fox jumped over the lazy dog.1234567890", LegalNameValidator.Validation.FULL) - MaxLineLength:LegalNameValidatorTest.kt$LegalNameValidatorTest$LegalNameValidator.validateOrganization(LegalNameValidator.normalize("Test Legal Name"), LegalNameValidator.Validation.FULL) - MaxLineLength:LegalNameValidatorTest.kt$LegalNameValidatorTest$LegalNameValidator.validateOrganization(longLegalName.append("A").toString(), LegalNameValidator.Validation.FULL) MaxLineLength:LegalNameValidatorTest.kt$LegalNameValidatorTest$assertEquals("Legal Name With Unicode Whitespaces", LegalNameValidator.normalize("Legal Name\u2004With\u0009Unicode\u0020Whitespaces")) - MaxLineLength:ListsSerializationTest.kt$ListsSerializationTest$Assertions.assertThatThrownBy { wrongPayloadType.serialize() } .isInstanceOf(NotSerializableException::class.java) MaxLineLength:ListsSerializationTest.kt$ListsSerializationTest.Companion$val envelope = DeserializationInput(SerializerFactoryBuilder.build(context.whitelist, context.deserializationClassLoader)).getEnvelope(serBytes, context) MaxLineLength:ListsSerializationTest.kt$internal inline - MaxLineLength:Literal.kt$ContractBuilder$@Suppress("UNUSED_PARAMETER") p3: kotlin.Pair<Parameter<T3>, Perceivable<T3>> - MaxLineLength:Literal.kt$ContractBuilder$fun <T> rollOut(startDate: LocalDate, endDate: LocalDate, frequency: Frequency, vars: T, init: RollOutBuilder<T>.() -> Unit): RollOut - MaxLineLength:Literal.kt$ContractBuilder$fun rollOut(startDate: LocalDate, endDate: LocalDate, frequency: Frequency, init: RollOutBuilder<Dummy>.() -> Unit): RollOut - MaxLineLength:Literal.kt$RollOutBuilder<T> : ContractBuilder - MaxLineLength:LoadTest.kt$LoadTest<T, S> - MaxLineLength:LoadTest.kt$RemoteNode(hostname, it.remoteSystemdServiceName, it.sshUser, it.rpcUser, it.rpcPort, it.remoteNodeDirectory) - MaxLineLength:LoadTest.kt$it.legalIdentitiesAndCerts.fold("") { acc, elem -> acc + "\n" + elem.name + ": " + elem.owningKey.toBase58String() } - MaxLineLength:LoadTest.kt$simpleNodes = hostNodeMap.values.filter { it.info.legalIdentitiesAndCerts.size == 1 } MaxLineLength:LoadTestConfiguration.kt$RemoteNode MaxLineLength:LocalDateSerializer.kt$LocalDateSerializer : Proxy - MaxLineLength:LocalDateSerializer.kt$LocalDateSerializer$override fun fromProxy(proxy: LocalDateProxy): LocalDate - MaxLineLength:LocalDateSerializer.kt$LocalDateSerializer$override fun toProxy(obj: LocalDate): LocalDateProxy MaxLineLength:LocalDateTimeSerializer.kt$LocalDateTimeSerializer : Proxy - MaxLineLength:LocalDateTimeSerializer.kt$LocalDateTimeSerializer$override fun toProxy(obj: LocalDateTime): LocalDateTimeProxy MaxLineLength:LocalDateTimeSerializer.kt$LocalDateTimeSerializer$override val additionalSerializers: Iterable<CustomSerializer<out Any>> = listOf(LocalDateSerializer(factory), LocalTimeSerializer(factory)) - MaxLineLength:LocalPropertyInformation.kt$LocalPropertyInformation$ConstructorPairedProperty : LocalPropertyInformation - MaxLineLength:LocalPropertyInformation.kt$LocalPropertyInformation$GetterSetterProperty : LocalPropertyInformation - MaxLineLength:LocalPropertyInformation.kt$LocalPropertyInformation$PrivateConstructorPairedProperty : LocalPropertyInformation - MaxLineLength:LocalPropertyInformation.kt$LocalPropertyInformation$ReadOnlyProperty : LocalPropertyInformation MaxLineLength:LocalPropertyInformation.kt$LocalPropertyInformation.CalculatedProperty$data MaxLineLength:LocalPropertyInformation.kt$LocalPropertyInformation.ConstructorPairedProperty$data MaxLineLength:LocalPropertyInformation.kt$LocalPropertyInformation.GetterSetterProperty$data MaxLineLength:LocalPropertyInformation.kt$LocalPropertyInformation.PrivateConstructorPairedProperty$data MaxLineLength:LocalPropertyInformation.kt$LocalPropertyInformation.ReadOnlyProperty$data - MaxLineLength:LocalSerializationRule.kt$LocalSerializationRule.AMQPSerializationScheme$( cordappCustomSerializers: Set<SerializationCustomSerializer<*, *>>, cordappSerializationWhitelists: Set<SerializationWhitelist>, serializerFactoriesForContexts: AccessOrderLinkedHashMap<SerializationFactoryCacheKey, SerializerFactory> ) - MaxLineLength:LocalSerializationRule.kt$LocalSerializationRule.AMQPSerializationScheme$override - MaxLineLength:LocalSerializerFactory.kt$DefaultLocalSerializerFactory : LocalSerializerFactory - MaxLineLength:LocalSerializerFactory.kt$DefaultLocalSerializerFactory$clazz.isSynthetic MaxLineLength:LocalSerializerFactory.kt$DefaultLocalSerializerFactory$is LocalTypeInformation.ACollection MaxLineLength:LocalSerializerFactory.kt$DefaultLocalSerializerFactory$is LocalTypeInformation.AMap MaxLineLength:LocalSerializerFactory.kt$DefaultLocalSerializerFactory$private MaxLineLength:LocalSerializerFactory.kt$DefaultLocalSerializerFactory$private val serializersByActualAndDeclaredType: MutableMap<ActualAndDeclaredType, AMQPSerializer<Any>> = DefaultCacheProvider.createCache() - MaxLineLength:LocalSerializerFactory.kt$DefaultLocalSerializerFactory$private val serializersByTypeId: MutableMap<TypeIdentifier, AMQPSerializer<Any>> = DefaultCacheProvider.createCache() - MaxLineLength:LocalSerializerFactory.kt$DefaultLocalSerializerFactory$val declaredGenericType = if (declaredType !is ParameterizedType && localTypeInformation.typeIdentifier is Parameterised) { localTypeInformation.typeIdentifier.getLocalType(classLoaderFor(declaredClass)) } else { declaredType } - MaxLineLength:LocalSerializerFactory.kt$LocalSerializerFactory - MaxLineLength:LocalSerializerFactory.kt$LocalSerializerFactory$ fun getTypeInformation(typeName: String): LocalTypeInformation? - MaxLineLength:LocalSerializerFactory.kt$LocalSerializerFactory$/** * The [ClassWhitelist] used by this factory. Classes must be whitelisted for serialization, because they are expected * to be written in a secure manner. */ val whitelist: ClassWhitelist MaxLineLength:LocalTimeSerializer.kt$LocalTimeSerializer : Proxy MaxLineLength:LocalTimeSerializer.kt$LocalTimeSerializer$override fun fromProxy(proxy: LocalTimeProxy): LocalTime MaxLineLength:LocalTimeSerializer.kt$LocalTimeSerializer$override fun toProxy(obj: LocalTime): LocalTimeProxy - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation$ fun prettyPrint(simplifyClassNames: Boolean = true): String - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation$Abstract : LocalTypeInformation - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation$AnArray : LocalTypeInformation - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation$AnInterface : LocalTypeInformation MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation.ACollection$data - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation.AMap$fun withParameters(keyType: LocalTypeInformation, valueType: LocalTypeInformation): AMap - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation.AMap$val reparameterizedType = typeIdentifier.copy(parameters = listOf(keyType.typeIdentifier, valueType.typeIdentifier)) - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation.AMap$val unerasedType = typeIdentifier.toParameterized(listOf(keyType.typeIdentifier, valueType.typeIdentifier)) MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation.AnArray$data - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation.Atomic$data - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation.Companion$ fun forType(type: Type, typeIdentifier: TypeIdentifier, lookup: LocalTypeLookup): LocalTypeInformation - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation.Companion$throw IllegalStateException("Should not be attempting to build new type information when populating a cycle") MaxLineLength:LocalTypeInformation.kt$LocalTypeInformation.Singleton$data - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformationPrettyPrinter$private - MaxLineLength:LocalTypeInformation.kt$LocalTypeInformationPrettyPrinter$private data - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$ private fun buildNonAtomic(rawType: Class<*>, type: Type, typeIdentifier: TypeIdentifier, typeParameterInformation: List<LocalTypeInformation>): LocalTypeInformation - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$ private inline fun <T> suppressValidation(block: LocalTypeInformationBuilder.() -> T): T MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$!EnumSet::class.java.isAssignableFrom(type) MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$Map::class.java.isAssignableFrom(type) -> LocalTypeInformation.AMap(type, typeIdentifier, LocalTypeInformation.Unknown, LocalTypeInformation.Unknown) - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$constructorInformation.parameters[index].isMandatory && index !in indicesAddressedByProperties -> parameter - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$constructorInformation: LocalConstructorInformation - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$is TypeIdentifier.Parameterised -> buildForParameterised(rawType, type as ParameterizedType, typeIdentifier, isOpaque) - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$it.name ?: throw IllegalStateException("Unnamed parameter in constructor $observedConstructor") - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$name to LocalPropertyInformation.ReadOnlyProperty(descriptor.getter, paramTypeInformation, isMandatory) MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$private - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$reason = "Mandatory constructor parameters $missingParameters are missing from the readable properties ${properties.keys}" MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$remedy = "Either annotate a constructor for this type with @ConstructorForDeserialization, or provide a custom serializer for it" MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$remedy = "Either ensure that the properties ${nonComposableProperties.keys} are serializable, or provide a custom serializer for this type" - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$remedy = "Either provide getters or readable fields for $missingParameters, or provide a custom serializer for this type" - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$return LocalTypeInformation.Composable(type, typeIdentifier, constructorInformation, evolutionConstructors, properties, superclassInformation, interfaceInformation, typeParameterInformation) - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$suppressValidation { buildNonAtomic(rawType, type, typeIdentifier, buildTypeParameterInformation(type)) } - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$throw NotSerializableException("Type '${type.typeName} has synthetic fields and is likely a nested inner class.") - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$val constants = type.enumConstants.asSequence().mapIndexed { index, constant -> constant.toString() to index }.toMap() - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$val constructorParameterIndices = constructorInformation.parameters.asSequence().mapIndexed { index, parameter -> parameter.name to index }.toMap() - MaxLineLength:LocalTypeInformationBuilder.kt$LocalTypeInformationBuilder$val missingParameters = missingMandatoryConstructorProperties(constructorInformation, properties).map { it.name } - MaxLineLength:LocalTypeModel.kt$ConfigurableLocalTypeModel : LocalTypeModel MaxLineLength:LocalTypeModel.kt$ConfigurableLocalTypeModel.BuilderLookup$override - MaxLineLength:LocalTypeModel.kt$LocalTypeLookup - MaxLineLength:LocalTypeModel.kt$LocalTypeLookup$ fun findOrBuild(type: Type, typeIdentifier: TypeIdentifier, builder: (Boolean) -> LocalTypeInformation): LocalTypeInformation - MaxLineLength:LocalTypeModel.kt$LocalTypeModel$ fun inspect(type: Type): LocalTypeInformation MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$ Concrete(a: Integer[], b: double, c: List<Integer[]>, d: int): Abstract<Integer>, Super<Integer[]>, SuperSuper<Integer[], Double> MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$ StringCollectionHolder(list: List<String>, map: Map<String, String>, array: List<String>[]): StringKeyedCollectionHolder<String>, CollectionHolder<String, String> MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$ StringKeyedCollectionHolder<Integer>(list: List<Integer>, map: Map<String, Integer>, array: List<Integer>[]): CollectionHolder<String, Integer> MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$ c [ MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$ collectionHolder (optional): StringKeyedCollectionHolder<Integer>(list: List<Integer>, map: Map<String, Integer>, array: List<Integer>[]): CollectionHolder<String, Integer> - MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$ d [ - MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$ g [ - MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$"Either annotate a constructor for this type with @ConstructorForDeserialization, or provide a custom serializer for it" - MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$"Either ensure that the properties [b, c, d] are serializable, or provide a custom serializer for this type" - MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$AliasingOldStylePojoImpl : OldStylePojo MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$StringCollectionHolder : StringKeyedCollectionHolder MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$StringKeyedCollectionHolder<T> : CollectionHolder - MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$private val customSerializerRegistry: CustomSerializerRegistry = CachingCustomSerializerRegistry(descriptorBasedSerializerRegistry) - MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$private val model = ConfigurableLocalTypeModel(WhitelistBasedTypeModelConfiguration(AllWhitelist, customSerializerRegistry)) MaxLineLength:LocalTypeModelTests.kt$LocalTypeModelTests$private val modelWithoutOpacity = ConfigurableLocalTypeModel(WhitelistBasedTypeModelConfiguration(AllWhitelist, emptyCustomSerializerRegistry)) - MaxLineLength:LocalVolume.kt$LocalVolume$networkParamsFile.outputStream() .use { networkParameters.signWithCert(Volume.keyPair.private, Volume.networkMapCert).serialize().writeTo(it) } - MaxLineLength:LoginView.kt$LoginView$nodeModel = login(hostTextField.text, portProperty.value, usernameTextField.text, passwordTextField.text) - MaxLineLength:LoginView.kt$LoginView$val button = Alert(Alert.AlertType.CONFIRMATION, "Are you sure you want to exit Corda Explorer?").apply { initOwner(root.scene.window) }.showAndWait().get() - MaxLineLength:MQSecurityAsNodeTest.kt$MQSecurityAsNodeTest$attacker.start(ActiveMQDefaultConfiguration.getDefaultClusterUser(), ActiveMQDefaultConfiguration.getDefaultClusterPassword()) MaxLineLength:MQSecurityAsNodeTest.kt$MQSecurityAsNodeTest$setPrivateKey(X509Utilities.CORDA_CLIENT_CA, clientKeyPair.private, listOf(clientCACert, DEV_INTERMEDIATE_CA.certificate, DEV_ROOT_CA.certificate), signingCertStore.entryPassword) MaxLineLength:MQSecurityAsNodeTest.kt$MQSecurityAsNodeTest$setPrivateKey(X509Utilities.CORDA_CLIENT_TLS, tlsKeyPair.private, listOf(clientTLSCert, clientCACert, DEV_INTERMEDIATE_CA.certificate, DEV_ROOT_CA.certificate), p2pSslConfig.keyStore.entryPassword) MaxLineLength:MQSecurityAsNodeTest.kt$MQSecurityAsNodeTest$val clientCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, DEV_INTERMEDIATE_CA.certificate, DEV_INTERMEDIATE_CA.keyPair, legalName.x500Principal, clientKeyPair.public, nameConstraints = nameConstraints) MaxLineLength:MQSecurityAsNodeTest.kt$MQSecurityAsNodeTest$val clientTLSCert = X509Utilities.createCertificate(CertificateType.TLS, clientCACert, clientKeyPair, CordaX500Name("MiniCorp", "London", "GB").x500Principal, tlsKeyPair.public) MaxLineLength:MQSecurityAsNodeTest.kt$MQSecurityAsNodeTest$val nameConstraints = NameConstraints(arrayOf(GeneralSubtree(GeneralName(GeneralName.directoryName, legalName.toX500Name()))), arrayOf()) MaxLineLength:MQSecurityTest.kt$MQSecurityTest$fun clientTo(target: NetworkHostAndPort, sslConfiguration: MutualSslConfiguration? = configureTestSSL(CordaX500Name("MegaCorp", "London", "GB"))): SimpleMQClient - MaxLineLength:Main.kt$ fun main(args: Array<String>) MaxLineLength:Main.kt$Main$// TODO : This could block the UI thread when number of views increase, maybe we can make this async and display a loading screen. // Stock Views. registerView<Dashboard>() registerView<TransactionViewer>() // CordApps Views. registerView<CashViewer>() // Tools. registerView<Network>() registerView<Settings>() // Default view to Dashboard. selectedView.set(find<Dashboard>()) MaxLineLength:Main.kt$NetworkBootstrapperRunner : CordaCliWrapper MaxLineLength:Main.kt$NetworkBootstrapperRunner$@Option(names = ["--copy-cordapps"], description = ["Whether or not to copy the CorDapp JARs into the nodes' 'cordapps' directory. \${COMPLETION-CANDIDATES}"]) - MaxLineLength:Main.kt$NetworkBootstrapperRunner$@Option(names = ["--event-horizon"], description = ["The event horizon to use in the network-parameters. Default is 30 days."]) MaxLineLength:Main.kt$NetworkBootstrapperRunner$@Option(names = ["--max-message-size"], description = ["The maximum message size to use in the network-parameters, in bytes. Current default is $DEFAULT_MAX_MESSAGE_SIZE."]) MaxLineLength:Main.kt$NetworkBootstrapperRunner$@Option(names = ["--max-transaction-size"], description = ["The maximum transaction size to use in the network-parameters, in bytes. Current default is $DEFAULT_MAX_TRANSACTION_SIZE."]) MaxLineLength:Main.kt$NetworkBootstrapperRunner$@Option(names = ["--minimum-platform-version"], description = ["The minimum platform version to use in the network-parameters. Current default is $PLATFORM_VERSION."]) MaxLineLength:Main.kt$NetworkBootstrapperRunner$@Option(names = ["--network-parameter-overrides", "-n"], description = ["Overrides the default network parameters with those in the given file."]) MaxLineLength:Main.kt$NetworkBootstrapperRunner$@Option(names = ["--no-copy"], hidden = true, description = ["""DEPRECATED. Don't copy the CorDapp JARs into the nodes' "cordapps" directories."""]) - MaxLineLength:Main.kt$NetworkBootstrapperRunner$description MaxLineLength:Main.kt$NetworkBootstrapperRunner$if (networkParametersFile?.exists() != true) throw FileNotFoundException("Unable to find specified network parameters config file at $networkParametersFile") - MaxLineLength:Main.kt$NetworkBootstrapperRunner$overrides += minimumPlatformVersion?.let { mapOf("minimumPlatformVersion" to minimumPlatformVersion!!) } ?: mutableMapOf() - MaxLineLength:Main.kt$NetworkBootstrapperRunner$printError("Error${errors.pluralise()} found parsing the network parameter overrides file at $networkParametersFile:") - MaxLineLength:Main.kt$NetworkBootstrapperRunner$printWarning("The --no-copy parameter has been deprecated and been replaced with the --copy-cordapps parameter.") - MaxLineLength:Main.kt$NetworkBootstrapperRunner$require(eventHorizon == null || eventHorizon?.isNegative == false) { "The --event-horizon parameter must be a positive value" } - MaxLineLength:Main.kt$NetworkBootstrapperRunner$require(maxMessageSize == null || maxMessageSize ?: 0 > 0) { "The --max-message-size parameter must be at least 1" } - MaxLineLength:Main.kt$NetworkBootstrapperRunner$require(maxTransactionSize == null || maxTransactionSize ?: 0 > 0) { "The --max-transaction-size parameter must be at least 1" } MaxLineLength:Main.kt$NetworkBootstrapperRunner$require(minimumPlatformVersion == null || minimumPlatformVersion ?: 0 > 0) { "The --minimum-platform-version parameter must be at least 1" } - MaxLineLength:Main.kt$NetworkBootstrapperRunner$val networkParameterOverrides = getNetworkParametersOverrides().doOnErrors(::reportErrors).optional ?: return ExitCodes.FAILURE MaxLineLength:Main.kt$Node$if (transactions.size == 1) listOf(genesisTx) else transactions.values.reversed().take(10).filter { !isAccepted(it) && conflicts[it.data]!!.size == 1 }.shuffled(network.rng).take(3) MaxLineLength:Main.kt$Transaction$return "T(id=${id.toString().take(5)}, data=$data, parents=[${parents.map {it.toString().take(5) }}, chit=$chit, confidence=$confidence)" - MaxLineLength:Main.kt$nodeFilter = isNotary - MaxLineLength:Main.kt$require(acceptance.filter { it }.size < 2) { "More than one transaction of the conflict set of $v got accepted." } - MaxLineLength:Main.kt$val defaultConfig = ConfigFactory.parseResources("loadtest-reference.conf", ConfigParseOptions.defaults().setAllowMissing(false)) - MaxLineLength:MainView.kt$MainView$contentDisplayProperty().bind(smallIconProperty.map { if (it) ContentDisplay.TOP else ContentDisplay.LEFT }) - MaxLineLength:MainView.kt$MainView$if (selected == it) listOf(menuItemCSS, menuItemSelectedCSS).observable() else listOf(menuItemCSS).observable() - MaxLineLength:MainView.kt$MainView$textAlignmentProperty().bind(smallIconProperty.map { if (it) TextAlignment.CENTER else TextAlignment.LEFT }) - MaxLineLength:MapSerializer.kt$MapSerializer : AMQPSerializer MaxLineLength:MapSerializer.kt$MapSerializer$private val typeNotation: TypeNotation = RestrictedType(AMQPTypeIdentifiers.nameForType(declaredType), null, emptyList(), "map", Descriptor(typeDescriptor), emptyList()) - MaxLineLength:MapSerializer.kt$MapSerializer.Companion$fun resolveActual(actualClass: Class<*>, declaredTypeInformation: LocalTypeInformation.AMap): LocalTypeInformation.AMap - MaxLineLength:MapSerializer.kt$MapSerializer.Companion$private - MaxLineLength:MapValuesList.kt$MapValuesList.Companion$val backingList = FXCollections.observableArrayList<Map.Entry<K, A>>(sourceMap.entries.sortedBy { it.key!!.hashCode() }) - MaxLineLength:MappedList.kt$MappedList<A, B> : TransformationList - MaxLineLength:MappedSchemasCrossReferenceDetectionTests.kt$MappedSchemasCrossReferenceDetectionTests$BadSchema : MappedSchema - MaxLineLength:MappedSchemasCrossReferenceDetectionTests.kt$MappedSchemasCrossReferenceDetectionTests$GoodSchema : MappedSchema MaxLineLength:MappedSchemasCrossReferenceDetectionTests.kt$MappedSchemasCrossReferenceDetectionTests$PoliteSchema : MappedSchema MaxLineLength:MappedSchemasCrossReferenceDetectionTests.kt$MappedSchemasCrossReferenceDetectionTests$TrickySchema : MappedSchema - MaxLineLength:MappedSchemasCrossReferenceDetectionTests.kt$MappedSchemasCrossReferenceDetectionTests.TrickySchema.State$( @Column var id: String, //the field is a cross-reference to other MappedSchema however the field is not persistent (no JPA annotation) var other: GoodSchema.State ) - MaxLineLength:MapsSerializationTest.kt$MapsSerializationTest$"Map type class java.util.HashMap is unstable under iteration. Suggested fix: use java.util.LinkedHashMap instead." - MaxLineLength:MapsSerializationTest.kt$MapsSerializationTest$@Test fun `check EmptyMap serialization`() - MaxLineLength:MaxTransactionSizeTests.kt$MaxTransactionSizeTests$assertThatThrownBy { future.getOrThrow() }.hasMessageContaining("Transaction exceeded network's maximum transaction size limit") - MaxLineLength:MaxTransactionSizeTests.kt$MaxTransactionSizeTests${ // These 4 attachments yield a transaction that's got ~ 4mb, which will exceed the 3mb max transaction size limit val bigFile1 = InputStreamAndHash.createInMemoryTestZip(1024 * 1024, 0, "a") val bigFile2 = InputStreamAndHash.createInMemoryTestZip(1024 * 1024, 1, "b") val bigFile3 = InputStreamAndHash.createInMemoryTestZip(1024 * 1024, 2, "c") val bigFile4 = InputStreamAndHash.createInMemoryTestZip(1024 * 1024, 3, "c") val flow = aliceNode.transaction { val hash1 = aliceNode.importAttachment(bigFile1.inputStream) val hash2 = aliceNode.importAttachment(bigFile2.inputStream) val hash3 = aliceNode.importAttachment(bigFile3.inputStream) val hash4 = aliceNode.importAttachment(bigFile4.inputStream) assertEquals(hash1, bigFile1.sha256) SendLargeTransactionFlow(notary, bob, hash1, hash2, hash3, hash4, verify = false) } val future = aliceNode.startFlow(flow) mockNet.runNetwork() assertThatThrownBy { future.getOrThrow() }.hasMessageContaining("Transaction exceeded network's maximum transaction size limit") } - MaxLineLength:MaxTransactionSizeTests.kt$MaxTransactionSizeTests${ // These 4 attachments yield a transaction that's got ~ 4mb, which will exceed the 3mb max transaction size limit val bigFile1 = InputStreamAndHash.createInMemoryTestZip(1024 * 1024, 0, "a") val bigFile2 = InputStreamAndHash.createInMemoryTestZip(1024 * 1024, 1, "b") val bigFile3 = InputStreamAndHash.createInMemoryTestZip(1024 * 1024, 2, "c") val bigFile4 = InputStreamAndHash.createInMemoryTestZip(1024 * 1024, 3, "d") val flow = aliceNode.transaction { val hash1 = aliceNode.importAttachment(bigFile1.inputStream) val hash2 = aliceNode.importAttachment(bigFile2.inputStream) val hash3 = aliceNode.importAttachment(bigFile3.inputStream) val hash4 = aliceNode.importAttachment(bigFile4.inputStream) assertEquals(hash1, bigFile1.sha256) SendLargeTransactionFlow(notary, bob, hash1, hash2, hash3, hash4) } val exception = assertFailsWith<IllegalArgumentException> { val future = aliceNode.startFlow(flow) mockNet.runNetwork() future.getOrThrow() } assertThat(exception).hasMessageContaining("Transaction exceeded network's maximum transaction size limit") } - MaxLineLength:Measure.kt$fun <A : Any, B : Any, C : Any, D : Any, R> measure(a: Iterable<A>, b: Iterable<B>, c: Iterable<C>, d: Iterable<D>, f: (A, B, C, D) -> R) MaxLineLength:Measure.kt$measure(listOf(a, b, c, d), f.reflect()!!) { f(uncheckedCast(it[0]), uncheckedCast(it[1]), uncheckedCast(it[2]), uncheckedCast(it[3])) } MaxLineLength:Measure.kt$private MaxLineLength:MerkleTransaction.kt$ComponentVisibilityException : CordaException - MaxLineLength:MerkleTransaction.kt$FilteredComponentGroup : ComponentGroup - MaxLineLength:MerkleTransaction.kt$FilteredTransaction : TraversableTransaction MaxLineLength:MerkleTransaction.kt$FilteredTransaction$ @Throws(ComponentVisibilityException::class) fun checkAllComponentsVisible(componentGroupEnum: ComponentGroupEnum) - MaxLineLength:MerkleTransaction.kt$FilteredTransaction$ @Throws(ComponentVisibilityException::class) fun checkCommandVisibility(publicKey: PublicKey) - MaxLineLength:MerkleTransaction.kt$FilteredTransaction$ fun checkWithFun(checkingFun: (Any) -> Boolean): Boolean MaxLineLength:MerkleTransaction.kt$FilteredTransaction$"Did not receive components for group ${componentGroupEnum.ordinal} and cannot verify they didn't exist in the original wire transaction" - MaxLineLength:MerkleTransaction.kt$FilteredTransaction$"Partial Merkle tree root and advertised full Merkle tree root for component group $groupIndex do not match" MaxLineLength:MerkleTransaction.kt$FilteredTransaction$val groupFullRoot = MerkleTree.getMerkleTree(group.components.mapIndexed { index, component -> componentHash(group.nonces[index], component) }).hash MaxLineLength:MerkleTransaction.kt$FilteredTransaction$verificationCheck - MaxLineLength:MerkleTransaction.kt$FilteredTransaction$verificationCheck(groupIndex < groupHashes.size) { "There is no matching component group hash for group $groupIndex" } MaxLineLength:MerkleTransaction.kt$FilteredTransaction$visibilityCheck MaxLineLength:MerkleTransaction.kt$FilteredTransaction$visibilityCheck(group.groupIndex < groupHashes.size) { "There is no matching component group hash for group ${group.groupIndex}" } - MaxLineLength:MerkleTransaction.kt$FilteredTransaction$visibilityCheck(groupPartialRoot == groupFullRoot) { "Some components for group ${group.groupIndex} are not visible" } MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$filteredComponentGroups.add(FilteredComponentGroup(groupIndex, value, filteredComponentNonces[groupIndex]!!, createPartialMerkleTree(groupIndex))) MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$filteredComponentHashes[componentGroupIndex] = mutableListOf(wtx.availableComponentHashes[componentGroupIndex]!![internalIndex]) - MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$filteredComponentHashes[componentGroupIndex]!!.add(wtx.availableComponentHashes[componentGroupIndex]!![internalIndex]) - MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$filteredComponentHashes[signersGroupIndex] = wtx.availableComponentHashes[signersGroupIndex]!!.toMutableList() MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$filteredComponentNonces[componentGroupIndex] = mutableListOf(wtx.availableComponentNonces[componentGroupIndex]!![internalIndex]) - MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$filteredComponentNonces[componentGroupIndex]!!.add(wtx.availableComponentNonces[componentGroupIndex]!![internalIndex]) - MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$filteredComponentNonces[signersGroupIndex] = wtx.availableComponentNonces[signersGroupIndex]!!.toMutableList() MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$val filteredComponentHashes: MutableMap<Int, MutableList<SecureHash>> = hashMapOf() // Required for partial Merkle tree generation. - MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$val serialisedComponent = wtx.componentGroups.first { it.groupIndex == componentGroupIndex }.components[internalIndex] - MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$wtx.attachments.forEachIndexed { internalIndex, it -> filter(it, ATTACHMENTS_GROUP.ordinal, internalIndex) } MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$wtx.componentGroups .filter { it.groupIndex >= values().size } .forEach { componentGroup -> componentGroup.components.forEachIndexed { internalIndex, component -> filter(component, componentGroup.groupIndex, internalIndex) } } MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion$wtx.references.forEachIndexed { internalIndex, it -> filter(ReferenceStateRef(it), REFERENCES_GROUP.ordinal, internalIndex) } - MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion${ group.add(serialisedComponent) // If the group[componentGroupIndex] existed, then we guarantee that // filteredComponentNonces[componentGroupIndex] and filteredComponentHashes[componentGroupIndex] are not null. filteredComponentNonces[componentGroupIndex]!!.add(wtx.availableComponentNonces[componentGroupIndex]!![internalIndex]) filteredComponentHashes[componentGroupIndex]!!.add(wtx.availableComponentHashes[componentGroupIndex]!![internalIndex]) } - MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion${ if (!filtering.test(t)) return val group = filteredSerialisedComponents[componentGroupIndex] // Because the filter passed, we know there is a match. We also use first Vs single as the init function // of WireTransaction ensures there are no duplicated groups. val serialisedComponent = wtx.componentGroups.first { it.groupIndex == componentGroupIndex }.components[internalIndex] if (group == null) { // As all of the helper Map structures, like availableComponentNonces, availableComponentHashes // and groupsMerkleRoots, are computed lazily via componentGroups.forEach, there should always be // a match on Map.get ensuring it will never return null. filteredSerialisedComponents[componentGroupIndex] = mutableListOf(serialisedComponent) filteredComponentNonces[componentGroupIndex] = mutableListOf(wtx.availableComponentNonces[componentGroupIndex]!![internalIndex]) filteredComponentHashes[componentGroupIndex] = mutableListOf(wtx.availableComponentHashes[componentGroupIndex]!![internalIndex]) } else { group.add(serialisedComponent) // If the group[componentGroupIndex] existed, then we guarantee that // filteredComponentNonces[componentGroupIndex] and filteredComponentHashes[componentGroupIndex] are not null. filteredComponentNonces[componentGroupIndex]!!.add(wtx.availableComponentNonces[componentGroupIndex]!![internalIndex]) filteredComponentHashes[componentGroupIndex]!!.add(wtx.availableComponentHashes[componentGroupIndex]!![internalIndex]) } // If at least one command is visible, then all command-signers should be visible as well. // This is required for visibility purposes, see FilteredTransaction.checkAllCommandsVisible() for more details. if (componentGroupIndex == COMMANDS_GROUP.ordinal && !signersIncluded) { signersIncluded = true val signersGroupIndex = SIGNERS_GROUP.ordinal // There exist commands, thus the signers group is not empty. val signersGroupComponents = wtx.componentGroups.first { it.groupIndex == signersGroupIndex } filteredSerialisedComponents[signersGroupIndex] = signersGroupComponents.components.toMutableList() filteredComponentNonces[signersGroupIndex] = wtx.availableComponentNonces[signersGroupIndex]!!.toMutableList() filteredComponentHashes[signersGroupIndex] = wtx.availableComponentHashes[signersGroupIndex]!!.toMutableList() } } MaxLineLength:MerkleTransaction.kt$FilteredTransaction.Companion${ wtx.inputs.forEachIndexed { internalIndex, it -> filter(it, INPUTS_GROUP.ordinal, internalIndex) } wtx.outputs.forEachIndexed { internalIndex, it -> filter(it, OUTPUTS_GROUP.ordinal, internalIndex) } wtx.commands.forEachIndexed { internalIndex, it -> filter(it, COMMANDS_GROUP.ordinal, internalIndex) } wtx.attachments.forEachIndexed { internalIndex, it -> filter(it, ATTACHMENTS_GROUP.ordinal, internalIndex) } if (wtx.notary != null) filter(wtx.notary, NOTARY_GROUP.ordinal, 0) if (wtx.timeWindow != null) filter(wtx.timeWindow, TIMEWINDOW_GROUP.ordinal, 0) // Note that because [inputs] and [references] share the same type [StateRef], we use a wrapper for references [ReferenceStateRef], // when filtering. Thus, to filter-in all [references] based on type, one should use the wrapper type [ReferenceStateRef] and not [StateRef]. // Similar situation is for network parameters hash and attachments, one should use wrapper [NetworkParametersHash] and not [SecureHash]. wtx.references.forEachIndexed { internalIndex, it -> filter(ReferenceStateRef(it), REFERENCES_GROUP.ordinal, internalIndex) } wtx.networkParametersHash?.let { filter(NetworkParametersHash(it), PARAMETERS_GROUP.ordinal, 0) } // It is highlighted that because there is no a signers property in TraversableTransaction, // one cannot specifically filter them in or out. // The above is very important to ensure someone won't filter out the signers component group if at least one // command is included in a FilteredTransaction. // It's sometimes possible that when we receive a WireTransaction for which there is a new or more unknown component groups, // we decide to filter and attach this field to a FilteredTransaction. // An example would be to redact certain contract state types, but otherwise leave a transaction alone, // including the unknown new components. wtx.componentGroups .filter { it.groupIndex >= values().size } .forEach { componentGroup -> componentGroup.components.forEachIndexed { internalIndex, component -> filter(component, componentGroup.groupIndex, internalIndex) } } } MaxLineLength:MerkleTransaction.kt$FilteredTransactionVerificationException : CordaException - MaxLineLength:MerkleTransaction.kt$TraversableTransaction$override MaxLineLength:MerkleTransaction.kt$TraversableTransaction$override val outputs: List<TransactionState<ContractState>> = deserialiseComponentGroup(componentGroups, TransactionState::class, OUTPUTS_GROUP) - MaxLineLength:MerkleTransaction.kt$TraversableTransaction$val timeWindows: List<TimeWindow> = deserialiseComponentGroup(componentGroups, TimeWindow::class, TIMEWINDOW_GROUP) - MaxLineLength:MerkleTree.kt$MerkleTree$Node : MerkleTree MaxLineLength:MessageChainState.kt$MessageChainState$@BelongsToContract(MessageChainContract::class) data - MaxLineLength:MessageSizeChecksInterceptor.kt$AmqpMessageSizeChecksInterceptor : MessageSizeChecksInterceptorAmqpInterceptor - MaxLineLength:MessageSizeChecksInterceptor.kt$ArtemisMessageSizeChecksInterceptor : MessageSizeChecksInterceptorInterceptor - MaxLineLength:MessageSizeChecksInterceptor.kt$ArtemisMessageSizeChecksInterceptor$is MessagePacket -> (packet.message.persistentSize - packet.message.headersAndPropertiesEncodeSize - 4).toInt() MaxLineLength:MessageSizeChecksInterceptor.kt$MessageSizeChecksInterceptor$logger MaxLineLength:MessageState.kt$MessageState$@BelongsToContract(MessageContract::class) data - MaxLineLength:Messaging.kt$DeduplicationHandler - MaxLineLength:Messaging.kt$MessagingService$ fun addMessageHandler(topic: String, callback: MessageHandler): MessageHandlerRegistration MaxLineLength:Messaging.kt$MessagingService$ fun createMessage(topic: String, data: ByteArray, deduplicationId: SenderDeduplicationId = SenderDeduplicationId(DeduplicationId.createRandom(newSecureRandom()), ourSenderUUID), additionalHeaders: Map<String, String> = emptyMap()): Message - MaxLineLength:Messaging.kt$MessagingService$/** * A unique identifier for this sender that changes whenever a node restarts. This is used in conjunction with a sequence * number for message de-duplication at the recipient. */ val ourSenderUUID: String - MaxLineLength:Messaging.kt$ReceivedMessage : Message MaxLineLength:Messaging.kt$fun MessagingService.send(topicSession: String, payload: Any, to: MessageRecipients, deduplicationId: SenderDeduplicationId = SenderDeduplicationId(DeduplicationId.createRandom(newSecureRandom()), ourSenderUUID), additionalHeaders: Map<String, String> = emptyMap()) MaxLineLength:MessagingExecutor.kt$MessagingExecutor$putLongProperty(org.apache.activemq.artemis.api.core.Message.HDR_SCHEDULED_DELIVERY_TIME, System.currentTimeMillis() + amqDelayMillis) - MaxLineLength:MessagingExecutor.kt$MessagingExecutor$putStringProperty(P2PMessagingHeaders.cordaVendorProperty, cordaVendor) putStringProperty(P2PMessagingHeaders.releaseVersionProperty, releaseVersion) putIntProperty(P2PMessagingHeaders.platformVersionProperty, versionInfo.platformVersion) putStringProperty(P2PMessagingHeaders.topicProperty, SimpleString(message.topic)) writeBodyBufferBytes(message.data.bytes) // Use the magic deduplication property built into Artemis as our message identity too putStringProperty(org.apache.activemq.artemis.api.core.Message.HDR_DUPLICATE_DETECTION_ID, SimpleString(message.uniqueMessageId.toString)) // If we are the sender (ie. we are not going through recovery of some sort), use sequence number short cut. if (ourSenderUUID == message.senderUUID) { putStringProperty(P2PMessagingHeaders.senderUUID, SimpleString(ourSenderUUID)) putLongProperty(P2PMessagingHeaders.senderSeqNo, ourSenderSeqNo.getAndIncrement()) } // For demo purposes - if set then add a delay to messages in order to demonstrate that the flows are doing as intended if (amqDelayMillis > 0 && message.topic == FlowMessagingImpl.sessionTopic) { putLongProperty(org.apache.activemq.artemis.api.core.Message.HDR_SCHEDULED_DELIVERY_TIME, System.currentTimeMillis() + amqDelayMillis) } message.additionalHeaders.forEach { key, value -> putStringProperty(key, value) } MaxLineLength:MessagingExecutor.kt$MessagingExecutor$putStringProperty(org.apache.activemq.artemis.api.core.Message.HDR_DUPLICATE_DETECTION_ID, SimpleString(message.uniqueMessageId.toString)) MaxLineLength:MetricInterceptor.kt$MetricInterceptor$@Suspendable override - MaxLineLength:MigrationNamedCacheFactory.kt$MigrationNamedCacheFactory : BindableNamedCacheFactorySingletonSerializeAsToken - MaxLineLength:MigrationNamedCacheFactory.kt$MigrationNamedCacheFactory$override - MaxLineLength:MigrationNamedCacheFactory.kt$MigrationNamedCacheFactory$override fun bindWithConfig(nodeConfiguration: NodeConfiguration) - MaxLineLength:MigrationNamedCacheFactory.kt$MigrationNamedCacheFactory$override fun bindWithMetrics(metricRegistry: MetricRegistry) MaxLineLength:MigrationNamedCacheFactory.kt$MigrationNamedCacheFactory$private val nodeConfiguration: NodeConfiguration? MaxLineLength:MigrationServicesForResolution.kt$MigrationServicesForResolution$deserialiseComponentGroup(tx.componentGroups, TransactionState::class, ComponentGroupEnum.OUTPUTS_GROUP, forceDeserialize = true) - MaxLineLength:MigrationServicesForResolution.kt$MigrationServicesForResolution$else -> throw MigrationException("Unknown transaction type ${baseTx::class.qualifiedName} found when loading a state") - MaxLineLength:MigrationServicesForResolution.kt$MigrationServicesForResolution$is ContractUpgradeLedgerTransaction -> it.value.map { stateRef -> StateAndRef(baseTx.outputs[stateRef.index], stateRef) } - MaxLineLength:MigrationServicesForResolution.kt$MigrationServicesForResolution$is NotaryChangeLedgerTransaction -> it.value.map { stateRef -> StateAndRef(baseTx.outputs[stateRef.index], stateRef) } - MaxLineLength:MigrationServicesForResolution.kt$MigrationServicesForResolution$logger.info("Couldn't find network parameters file: ${e.message}. This is expected if the node is starting for the first time.") - MaxLineLength:MigrationServicesForResolution.kt$MigrationServicesForResolution$override - MaxLineLength:MigrationServicesForResolution.kt$MigrationServicesForResolution$private - MaxLineLength:MigrationServicesForResolution.kt$MigrationServicesForResolution${ // If there is no attachment that allows the state class to be deserialised correctly, then carpent a state class anyway. It // might still be possible to access the participants depending on how the state class was serialised. logger.debug("Could not use attachments to deserialise transaction output states for transaction ${tx.id}") tx.outputs.filterIndexed { index, _ -> stateIndices.contains(index)} } - MaxLineLength:MigrationServicesForResolution.kt$MigrationServicesForResolution.<no name provided>${ // Note that the parameters in any file shouldn't be put into the database - this will be done by the node on startup. return if (hash == filedParams?.raw?.hash) { filedParams.raw.deserialize() } else { cordaDB.transaction { storage[hash]?.verified() } } } - MaxLineLength:MissingAttachmentsException.kt$MissingAttachmentsException : CordaException MaxLineLength:MissingContractAttachments.kt$MissingContractAttachments$"${contractsClassName ?: states.map { it.contract }.distinct()}${minimumRequiredContractClassVersion?.let { ", minimum required contract class version $minimumRequiredContractClassVersion"}}. " MaxLineLength:MissingContractAttachments.kt$MissingContractAttachments$@JvmOverloads constructor(val states: List<TransactionState<ContractState>>, contractsClassName: String? = null, minimumRequiredContractClassVersion: Version? = null) - MaxLineLength:MockAttachmentStorage.kt$MockAttachmentStorage$// This function only covers those possibilities currently used within tests. Each ColumnPredicate type can have multiple operators, // and not all predicate types are covered here. private fun <C> criteriaFilter(metadata: C, predicate: ColumnPredicate<C>?): Boolean MaxLineLength:MockAttachmentStorage.kt$MockAttachmentStorage$@JvmOverloads fun importContractAttachment(contractClassNames: List<ContractClassName>, uploader: String, jar: InputStream, attachmentId: AttachmentId? = null, signers: List<PublicKey> = emptyList()): AttachmentId MaxLineLength:MockAttachmentStorage.kt$MockAttachmentStorage$ContractAttachment.create(baseAttachment, contractClassNames.first(), contractClassNames.toSet(), uploader, signers, version) MaxLineLength:MockAttachmentStorage.kt$MockAttachmentStorage$ContractAttachmentMetadata @@ -6762,593 +3912,225 @@ MaxLineLength:MockAttachmentStorage.kt$MockAttachmentStorage$val attachmentSort = AttachmentSort(listOf(AttachmentSort.AttachmentSortColumn(AttachmentSort.AttachmentSortAttribute.VERSION, Sort.Direction.DESC))) MaxLineLength:MockAttachmentStorage.kt$MockAttachmentStorage$val contractClassMetadata = ContractAttachmentMetadata(contractClassName, version, signers.isNotEmpty(), signers, uploader) MaxLineLength:MockAttachmentStorage.kt$MockAttachmentStorage$val version = try { Integer.parseInt(baseAttachment.openAsJAR().manifest?.mainAttributes?.getValue(Attributes.Name.IMPLEMENTATION_VERSION)) } catch (e: Exception) { DEFAULT_CORDAPP_VERSION } - MaxLineLength:MockAttachmentStorage.kt$MockAttachmentStorage$versionCondition = Builder.greaterThanOrEqual(minContractVersion) MaxLineLength:MockContractAttachment.kt$// A valid zip file with 1 entry. val simpleZip = byteArrayOf(80, 75, 3, 4, 20, 0, 8, 8, 8, 0, 15, 113, 79, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 0, 47, 97, -2, -54, 0, 0, 75, 4, 0, 80, 75, 7, 8, 67, -66, -73, -24, 3, 0, 0, 0, 1, 0, 0, 0, 80, 75, 1, 2, 20, 0, 20, 0, 8, 8, 8, 0, 15, 113, 79, 78, 67, -66, -73, -24, 3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 97, -2, -54, 0, 0, 80, 75, 5, 6, 0, 0, 0, 0, 1, 0, 1, 0, 52, 0, 0, 0, 55, 0, 0, 0, 0, 0) - MaxLineLength:MockCordappProvider.kt$MockCordappProvider$attachments.importContractAttachment(contractClassNames, DEPLOYED_CORDAPP_UPLOADER, data.inputStream(), contractHash, signers) - MaxLineLength:MockCordappProvider.kt$MockCordappProvider$fakeAttachment(contractClass.replace('.', '/') + ".class", "fake class file for $contractClass", manifestAttributes) - MaxLineLength:MockCordappProvider.kt$MockCordappProvider$if (cordappRegistry.none { it.first.contractClassNames.contains(contractClassName) && it.second == contractHash }) { cordappRegistry.add(Pair( cordapp, findOrImportAttachment( listOf(contractClassName), fakeAttachmentCached(contractClassName, jarManifestAttributesWithObligatoryElement), attachments, contractHash, signers ) )) } - MaxLineLength:MockCordappProvider.kt$MockCordappProvider$private MaxLineLength:MockCryptoService.kt$MockCryptoService$return ContentSignerBuilder.build(signatureScheme, privateKey, Crypto.findProvider(signatureScheme.providerName), newSecureRandom()) - MaxLineLength:MockCryptoService.kt$MockCryptoService$throw CryptoServiceException("Cannot sign using the key with alias $alias. SHA256 of data to be signed: ${data.sha256()}", e) - MaxLineLength:MockKeyManagementService.kt$MockKeyManagementService$override fun filterMyKeys(candidateKeys: Iterable<PublicKey>): Iterable<PublicKey> - MaxLineLength:MockKeyManagementService.kt$MockKeyManagementService$override fun getSigner(publicKey: PublicKey): ContentSigner - MaxLineLength:MockKeyManagementService.kt$MockKeyManagementService$private val keyStore: MutableMap<PublicKey, PrivateKey> = initialKeys.associateByTo(HashMap(), { it.public }, { it.private }) - MaxLineLength:MockKeyManagementService.kt$MockKeyManagementService$private val pkToIdCache: WritablePublicKeyToOwningIdentityCache - MaxLineLength:MockNetwork.kt$MockNetwork MaxLineLength:MockNetwork.kt$MockNetwork$ fun createPartyNode(legalName: CordaX500Name? = null): StartedMockNode - MaxLineLength:MockNetwork.kt$MockNetwork$/** In a mock network, nodes have an incrementing integer ID. Real networks do not have this. Returns the next ID that will be used. */ val nextNodeId get(): Int = internalMockNetwork.nextNodeId - MaxLineLength:MockNetwork.kt$MockNetwork$@Deprecated("cordappPackages does not preserve the original CorDapp's versioning and metadata, which may lead to " + "misleading results in tests. Use MockNetworkParameters.cordappsForAllNodes instead.") MaxLineLength:MockNetwork.kt$MockNetwork$val servicePeerAllocationStrategy: InMemoryMessagingNetwork.ServicePeerAllocationStrategy = defaultParameters.servicePeerAllocationStrategy - MaxLineLength:MockNetwork.kt$MockNetworkParameters - MaxLineLength:MockNetwork.kt$MockNetworkParameters$(networkSendManuallyPumped: Boolean, threadPerNode: Boolean, servicePeerAllocationStrategy: InMemoryMessagingNetwork.ServicePeerAllocationStrategy, notarySpecs: List<MockNetworkNotarySpec>, networkParameters: NetworkParameters ) - MaxLineLength:MockNetwork.kt$MockNetworkParameters$constructor(cordappsForAllNodes: Collection<TestCordapp>) : this(threadPerNode = false, cordappsForAllNodes = cordappsForAllNodes) MaxLineLength:MockNetwork.kt$MockNetworkParameters$fun withCordappsForAllNodes(cordappsForAllNodes: Collection<TestCordapp>): MockNetworkParameters - MaxLineLength:MockNetwork.kt$MockNetworkParameters$fun withNetworkParameters(networkParameters: NetworkParameters): MockNetworkParameters MaxLineLength:MockNetwork.kt$MockNetworkParameters$fun withNetworkSendManuallyPumped(networkSendManuallyPumped: Boolean): MockNetworkParameters - MaxLineLength:MockNetwork.kt$MockNetworkParameters$fun withNotarySpecs(notarySpecs: List<MockNetworkNotarySpec>): MockNetworkParameters MaxLineLength:MockNetwork.kt$MockNetworkParameters$fun withServicePeerAllocationStrategy(servicePeerAllocationStrategy: InMemoryMessagingNetwork.ServicePeerAllocationStrategy): MockNetworkParameters MaxLineLength:MockNetwork.kt$MockNetworkParameters$return MockNetworkParameters(networkSendManuallyPumped, threadPerNode, servicePeerAllocationStrategy, notarySpecs, networkParameters, emptyList()) MaxLineLength:MockNetwork.kt$MockNetworkParameters$val servicePeerAllocationStrategy: InMemoryMessagingNetwork.ServicePeerAllocationStrategy = InMemoryMessagingNetwork.ServicePeerAllocationStrategy.Random() MaxLineLength:MockNetwork.kt$MockNodeParameters MaxLineLength:MockNetwork.kt$MockNodeParameters$fun copy(forcedID: Int?, legalName: CordaX500Name?, entropyRoot: BigInteger, configOverrides: MockNodeConfigOverrides): MockNodeParameters MaxLineLength:MockNetwork.kt$MockNodeParameters$fun withAdditionalCordapps(additionalCordapps: Collection<TestCordapp>): MockNodeParameters - MaxLineLength:MockNetwork.kt$MockNodeParameters$fun withConfigOverrides(configOverrides: MockNodeConfigOverrides): MockNodeParameters - MaxLineLength:MockNetwork.kt$StartedMockNode$ fun <F : FlowLogic<*>> findStateMachines(flowClass: Class<F>): List<Pair<F, CordaFuture<*>>> MaxLineLength:MockNetwork.kt$StartedMockNode$ fun <F : FlowLogic<*>> registerInitiatedFlow(initiatedFlowClass: Class<F>): Observable<F> MaxLineLength:MockNetwork.kt$StartedMockNode$ fun <F : FlowLogic<*>> registerInitiatedFlow(initiatingFlowClass: Class<out FlowLogic<*>>, initiatedFlowClass: Class<F>): Observable<F> MaxLineLength:MockNetwork.kt$StartedMockNode$ fun <T> startFlow(logic: FlowLogic<T>): CordaFuture<T> - MaxLineLength:MockNetwork.kt$UnstartedMockNode$ fun <T : SerializeAsToken> installCordaService(serviceClass: Class<T>): T MaxLineLength:MockNetworkIntegrationTests.kt$MockNetworkIntegrationTests$assertEquals(0, startJavaProcess<MockNetworkIntegrationTests>(emptyList(), extraJvmArguments = listOf("-javaagent:$quasar")).waitFor()) MaxLineLength:MockNetworkParametersService.kt$MockNetworkParametersStorage : NetworkParametersStorage - MaxLineLength:MockNetworkParametersService.kt$MockNetworkParametersStorage$override - MaxLineLength:MockNodeMessagingService.kt$MockNodeMessagingService$ fun start(network: InMemoryMessagingNetwork, manuallyPumped: Boolean, id: Int, notaryService: PartyAndCertificate?) - MaxLineLength:MockNodeMessagingService.kt$MockNodeMessagingService$ private fun unPopMessages(transfers: Collection<InMemoryMessagingNetwork.MessageTransfer>) - MaxLineLength:MockNodeMessagingService.kt$MockNodeMessagingService$OpaqueBytes(message.data.bytes.copyOf()) - MaxLineLength:MockNodeMessagingService.kt$MockNodeMessagingService$handler.callback(receivedMessage, handler, InMemoryDeduplicationHandler(receivedMessage, transfer)) MaxLineLength:MockNodeMessagingService.kt$MockNodeMessagingService$override MaxLineLength:MockNodeMessagingService.kt$MockNodeMessagingService$private - MaxLineLength:MockNodeMessagingService.kt$MockNodeMessagingService$return InMemoryMessage(topic, OpaqueBytes(data), deduplicationId.deduplicationId, senderUUID = deduplicationId.senderUUID) - MaxLineLength:MockNodeMessagingService.kt$MockNodeMessagingService$val matchingHandlers = handlers.filter { it.topicSession.isBlank() || transfer.message.topic == it.topicSession } - MaxLineLength:MockNodeMessagingService.kt$MockNodeMessagingService${ // Got no handlers for this message yet. Keep the message around and attempt redelivery after a new // handler has been registered. The purpose of this path is to make unit tests that have multi-threading // reliable, as a sender may attempt to send a message to a receiver that hasn't finished setting // up a handler for yet. Most unit tests don't run threaded, but we want to test true parallelism at // least sometimes. log.warn("Message to ${transfer.message.topic} could not be delivered") pendingRedelivery.add(transfer) null } MaxLineLength:MockNodeMessagingService.kt$MockNodeMessagingService.InMemoryDeduplicationHandler$private inner MaxLineLength:MockPublicKeyToOwningIdentityCache.kt$MockPublicKeyToOwningIdentityCache : WritablePublicKeyToOwningIdentityCache - MaxLineLength:MockPublicKeyToOwningIdentityCache.kt$MockPublicKeyToOwningIdentityCache$private val cache: MutableMap<PublicKey, KeyOwningIdentity> = mutableMapOf<PublicKey, KeyOwningIdentity>().toSynchronised() - MaxLineLength:MockServices.kt$ fun <T : SerializeAsToken> createMockCordaService(serviceHub: MockServices, serviceConstructor: (AppServiceHub) -> T): T MaxLineLength:MockServices.kt$MockAppServiceHubImpl<out T : SerializeAsToken> : AppServiceHubServiceHub - MaxLineLength:MockServices.kt$MockServices$ fun addMockCordapp(contractClassName: ContractClassName) - MaxLineLength:MockServices.kt$MockServices$ override fun loadContractAttachment(stateRef: StateRef) MaxLineLength:MockServices.kt$MockServices$/** * Create a mock [ServiceHub] that can't load CorDapp code, and which uses a default service identity. */ constructor(cordappPackages: Iterable<String>) : this(cordappPackages, CordaX500Name("TestIdentity", "", "GB"), makeTestIdentityService()) MaxLineLength:MockServices.kt$MockServices$/** * Create a mock [ServiceHub] that can't load CorDapp code, which uses the provided identity service * (you can get one from [makeTestIdentityService]) and which represents the given identity. */ @JvmOverloads constructor(cordappPackages: Iterable<String>, initialIdentityName: CordaX500Name, identityService: IdentityService = makeTestIdentityService()) : this(cordappPackages, TestIdentity(initialIdentityName), identityService) MaxLineLength:MockServices.kt$MockServices$/** * Create a mock [ServiceHub] that looks for app code in the given package names, uses the provided identity service * (you can get one from [makeTestIdentityService]) and represents the given identity. */ @JvmOverloads constructor(cordappPackages: Iterable<String>, initialIdentityName: CordaX500Name, identityService: IdentityService = makeTestIdentityService(), key: KeyPair, vararg moreKeys: KeyPair) : this(cordappPackages, TestIdentity(initialIdentityName, key), identityService, *moreKeys) MaxLineLength:MockServices.kt$MockServices$/** * Create a mock [ServiceHub] which uses the package of the caller to find CorDapp code. It uses a default service * identity. */ constructor() : this(listOf(getCallerPackage(MockServices::class)!!), CordaX500Name("TestIdentity", "", "GB"), makeTestIdentityService()) MaxLineLength:MockServices.kt$MockServices$/** * Create a mock [ServiceHub] which uses the package of the caller to find CorDapp code. It uses the provided identity service * (you can get one from [makeTestIdentityService]) and which represents the given identity. */ @JvmOverloads constructor(initialIdentityName: CordaX500Name, identityService: IdentityService = makeTestIdentityService(), key: KeyPair, vararg moreKeys: KeyPair) : this(listOf(getCallerPackage(MockServices::class)!!), TestIdentity(initialIdentityName, key), identityService, *moreKeys) - MaxLineLength:MockServices.kt$MockServices$/** * Create a mock [ServiceHub] which uses the package of the caller to find CorDapp code. It uses the provided identity service * (you can get one from [makeTestIdentityService]) and which represents the given identity. It has no keys. */ @JvmOverloads constructor(initialIdentityName: CordaX500Name, identityService: IdentityService = makeTestIdentityService()) : this(listOf(getCallerPackage(MockServices::class)!!), TestIdentity(initialIdentityName), identityService) MaxLineLength:MockServices.kt$MockServices$constructor(cordappPackages: List<String>, firstIdentity: TestIdentity, networkParameters: NetworkParameters, vararg moreIdentities: TestIdentity) : this( cordappPackages, firstIdentity, makeTestIdentityService(*listOf(firstIdentity, *moreIdentities).map { it.identity }.toTypedArray()), networkParameters, firstIdentity.keyPair ) MaxLineLength:MockServices.kt$MockServices$constructor(cordappPackages: List<String>, initialIdentityName: CordaX500Name, identityService: IdentityService, networkParameters: NetworkParameters) : this(cordappPackages, TestIdentity(initialIdentityName), identityService, networkParameters) MaxLineLength:MockServices.kt$MockServices$constructor(cordappPackages: List<String>, initialIdentityName: CordaX500Name, identityService: IdentityService, networkParameters: NetworkParameters, key: KeyPair) : this(cordappPackages, TestIdentity(initialIdentityName, key), identityService, networkParameters) - MaxLineLength:MockServices.kt$MockServices$constructor(firstIdentity: TestIdentity, networkParameters: NetworkParameters, vararg moreIdentities: TestIdentity) : this( listOf(getCallerPackage(MockServices::class)!!), firstIdentity, networkParameters, *moreIdentities ) - MaxLineLength:MockServices.kt$MockServices$get() = ServicesForResolutionImpl(identityService, attachments, cordappProvider, networkParametersService, validatedTransactions) - MaxLineLength:MockServices.kt$MockServices$initialIdentity: TestIdentity MaxLineLength:MockServices.kt$MockServices$internal - MaxLineLength:MockServices.kt$MockServices$override var networkParametersService: NetworkParametersService = MockNetworkParametersStorage(initialNetworkParameters) - MaxLineLength:MockServices.kt$MockServices$private MaxLineLength:MockServices.kt$MockServices$private constructor(cordappLoader: CordappLoader, identityService: IdentityService, networkParameters: NetworkParameters, initialIdentity: TestIdentity, moreKeys: Array<out KeyPair>, keyManagementService: KeyManagementService) : this(cordappLoader, MockTransactionStorage(), identityService, networkParameters, initialIdentity, moreKeys, keyManagementService) - MaxLineLength:MockServices.kt$MockServices$return NodeInfo(listOf(NetworkHostAndPort("mock.node.services", 10000)), listOf(initialIdentity.identity), 1, serial = 1L) MaxLineLength:MockServices.kt$MockServices$return NodeVaultService(clock, keyManagementService, servicesForResolution, database, schemaService, cordappLoader.appClassLoader).apply { start() } - MaxLineLength:MockServices.kt$MockServices$this(cordappLoaderForPackages(cordappPackages), identityService, networkParameters, initialIdentity, moreKeys) MaxLineLength:MockServices.kt$MockServices$this(cordappLoaderForPackages(cordappPackages), identityService, networkParameters, initialIdentity, moreKeys, keyManagementService) MaxLineLength:MockServices.kt$MockServices$this(cordappLoaderForPackages(cordappPackages), identityService, testNetworkParameters(modifiedTime = Instant.MIN), initialIdentity, moreKeys) MaxLineLength:MockServices.kt$MockServices.Companion$ @JvmStatic @JvmOverloads fun makeTestDatabaseAndMockServices(cordappPackages: List<String>, identityService: IdentityService, initialIdentity: TestIdentity, networkParameters: NetworkParameters = testNetworkParameters(modifiedTime = Instant.MIN), vararg moreKeys: KeyPair): Pair<CordaPersistence, MockServices> MaxLineLength:MockServices.kt$MockServices.Companion$ @JvmStatic @JvmOverloads fun makeTestDatabaseAndPersistentServices( cordappPackages: List<String>, initialIdentity: TestIdentity, networkParameters: NetworkParameters = testNetworkParameters(modifiedTime = Instant.MIN), moreKeys: Set<KeyPair>, moreIdentities: Set<PartyAndCertificate> ): Pair<CordaPersistence, MockServices> MaxLineLength:MockServices.kt$MockServices.Companion$makeMockMockServices(cordappLoader, identityService, networkParameters, initialIdentity, moreKeys, keyManagementService, schemaService, persistence) MaxLineLength:MockServices.kt$MockServices.Companion$makeMockMockServices(cordappLoader, identityService, networkParameters, initialIdentity, moreKeys.toSet(), keyManagementService, schemaService, database) - MaxLineLength:MockServices.kt$MockServices.Companion$networkParameters: NetworkParameters = testNetworkParameters(modifiedTime = Instant.MIN) - MaxLineLength:MockServices.kt$MockServices.Companion$private - MaxLineLength:MockServices.kt$MockServices.Companion$props.setProperty("dataSource.url", "jdbc:h2:mem:${nodeName}_persistence;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE") - MaxLineLength:MockServices.kt$MockServices.Companion$return JarScanningCordappLoader.fromJarUrls(cordappsForPackages(packages).map { it.jarFile.toUri().toURL() }, versionInfo) MaxLineLength:MockServices.kt$MockServices.Companion$return object : MockServices(cordappLoader, identityService, networkParameters, initialIdentity, moreKeys.toTypedArray(), keyManagementService) { override var networkParametersService: NetworkParametersService = MockNetworkParametersStorage(networkParameters) override val vaultService: VaultService = makeVaultService(schemaService, persistence, cordappLoader) override fun recordTransactions(statesToRecord: StatesToRecord, txs: Iterable<SignedTransaction>) { ServiceHubInternal.recordTransactions( statesToRecord, txs as? Collection ?: txs.toList(), validatedTransactions as WritableTransactionStorage, mockStateMachineRecordedTransactionMappingStorage, vaultService as VaultServiceInternal, persistence ) } override fun jdbcSession(): Connection = persistence.createSession() override fun <T : Any?> withEntityManager(block: EntityManager.() -> T): T { return block(contextTransaction.restrictedEntityManager) } override fun withEntityManager(block: Consumer<EntityManager>) { return block.accept(contextTransaction.restrictedEntityManager) } } MaxLineLength:MockServices.kt$MockServices.Companion$val database = configureDatabase(dataSourceProps, DatabaseConfig(), identityService::wellKnownPartyFromX500Name, identityService::wellKnownPartyFromAnonymous, schemaService, schemaService.internalSchemas()) - MaxLineLength:MockServices.kt$MockServices.Companion$val persistence = configureDatabase(dataSourceProps, DatabaseConfig(), identityService::wellKnownPartyFromX500Name, identityService::wellKnownPartyFromAnonymous, schemaService, schemaService.internalSchemas()) - MaxLineLength:MockServices.kt$MockServices.Companion${ val cordappLoader = cordappLoaderForPackages(cordappPackages) val dataSourceProps = makeTestDataSourceProperties() val schemaService = NodeSchemaService(cordappLoader.cordappSchemas) val identityService = PersistentIdentityService(TestingNamedCacheFactory()) val persistence = configureDatabase(dataSourceProps, DatabaseConfig(), identityService::wellKnownPartyFromX500Name, identityService::wellKnownPartyFromAnonymous, schemaService, schemaService.internalSchemas()) // Create a persistent identity service and add all the supplied identities. identityService.apply { ourNames = setOf(initialIdentity.name) database = persistence start(DEV_ROOT_CA.certificate) persistence.transaction { identityService.loadIdentities(moreIdentities + initialIdentity.identity) } } // Create a persistent key management service and add the key pair which was created for the TestIdentity. // We only add the keypair for the initial identity and any other keys which this node may control. Note: We don't add the keys // for the other identities. val pkToIdCache = PublicKeyToOwningIdentityCacheImpl(persistence, TestingNamedCacheFactory()) val aliasKeyMap = mutableMapOf<String, KeyPair>() val aliasedMoreKeys = moreKeys.mapIndexed { index, keyPair -> val alias = "Extra key $index" aliasKeyMap[alias] = keyPair KeyPair(keyPair.public, AliasPrivateKey(alias)) }.toSet() val identityAlias = "${initialIdentity.name} private key" aliasKeyMap[identityAlias] = initialIdentity.keyPair val aliasedIdentityKey = KeyPair(initialIdentity.publicKey, AliasPrivateKey(identityAlias)) val keyManagementService = BasicHSMKeyManagementService( TestingNamedCacheFactory(), identityService, persistence, MockCryptoService(aliasKeyMap), pkToIdCache ) persistence.transaction { keyManagementService.start(aliasedMoreKeys + aliasedIdentityKey) } val mockService = persistence.transaction { makeMockMockServices(cordappLoader, identityService, networkParameters, initialIdentity, moreKeys, keyManagementService, schemaService, persistence) } return Pair(persistence, mockService) } - MaxLineLength:MockServices.kt$MockServices.Companion.<no name provided>$override var networkParametersService: NetworkParametersService = MockNetworkParametersStorage(networkParameters) - MaxLineLength:MockTransactionStorage.kt$MockTransactionStorage$override fun getTransaction(id: SecureHash): SignedTransaction? - MaxLineLength:MockTransactionStorage.kt$MockTransactionStorage$override fun getTransactionInternal(id: SecureHash): Pair<SignedTransaction, Boolean>? - MaxLineLength:Models.kt$Models MaxLineLength:MyCustomNotaryService.kt$MyCustomValidatingNotaryService : SinglePartyNotaryService - MaxLineLength:MyCustomNotaryService.kt$MyCustomValidatingNotaryService$override fun createServiceFlow(otherPartySession: FlowSession): FlowLogic<Void?> - MaxLineLength:MyCustomNotaryService.kt$MyCustomValidatingNotaryService$override val uniquenessProvider = PersistentUniquenessProvider(services.clock, services.database, services.cacheFactory) - MaxLineLength:MyCustomNotaryService.kt$MyValidatingNotaryFlow : ValidatingNotaryFlow - MaxLineLength:NOT_YET_REGISTERED_MARKER_KEYS_AND_CERTS.kt$NOT_YET_REGISTERED_MARKER_KEYS_AND_CERTS$val ECDSAR1_KEYPAIR by lazy { Crypto.deriveKeyPairFromEntropy(Crypto.ECDSA_SECP256R1_SHA256, BigInteger.valueOf(0)) } - MaxLineLength:NamedCacheTest.kt$NamedCacheTest$override - MaxLineLength:NetParams.kt$ fun main(args: Array<String>) - MaxLineLength:NetParams.kt$NetParamsSigner$CertificatePathAndKeyPair - MaxLineLength:NetParams.kt$NetParamsSigner.AMQPInspectorSerializationScheme$override - MaxLineLength:Network.kt$Network$centralLabel = mapLabels.firstOrDefault(SimpleObjectProperty(myLabel), { centralPeer?.contains(it.text, true) == true }) - MaxLineLength:Network.kt$Network$if (it is WireTransaction) it.outputStates.observable().getParties() // For ContractUpgradeWireTransaction and NotaryChangeWireTransaction the output parties are the same as input parties else inputParties - MaxLineLength:Network.kt$Network$label(PartyNameFormatter.short.format(identities[0].name)) { font = Font.font(font.family, FontWeight.BOLD, 15.0) } - MaxLineLength:Network.kt$Network$mapScrollPane.hvalue = (valX + adjustment.x) / (mapImageView.layoutBounds.width - mapScrollPane.viewportBounds.width) - MaxLineLength:Network.kt$Network$mapScrollPane.vvalue = (valY + adjustment.y) / (mapImageView.layoutBounds.height - mapScrollPane.viewportBounds.height) MaxLineLength:Network.kt$Network$node.getWorldMapLocation()?.coordinate?.project(mapPane.width, mapPane.height, 85.0511, -85.0511, -180.0, 180.0) ?: ScreenCoordinate(0.0, 0.0) - MaxLineLength:Network.kt$Network$private MaxLineLength:Network.kt$Network$private val peerButtons = peerComponents.filtered { myIdentity.value !in it.nodeInfo.legalIdentitiesAndCerts.map { it.party } }.map { it.button } MaxLineLength:Network.kt$Network$val inputParties = it.inputs.sequence() .map { it as? PartiallyResolvedTransaction.InputResolution.Resolved } .filterNotNull() .map { it.stateAndRef.state.data }.getParties() val outputParties = it.transaction.coreTransaction.let { if (it is WireTransaction) it.outputStates.observable().getParties() // For ContractUpgradeWireTransaction and NotaryChangeWireTransaction the output parties are the same as input parties else inputParties } val signingParties = it.transaction.sigs.map { it.by.toKnownParty() } // Input parties fire a bullets to all output parties, and to the signing parties. !! This is a rough guess of how the message moves in the network. // TODO : Expose artemis queue to get real message information. inputParties.cross(outputParties) + inputParties.cross(signingParties) MaxLineLength:Network.kt$Network$val mapLabel = label(PartyNameFormatter.short.format(identities.first().name)) // We choose the first one for the name of the node on the map. - MaxLineLength:Network.kt$Network$val newHeight = Math.min(Math.max(mapImageView.prefHeight(-1.0) * zoomFactor, mapOriginalHeight), mapOriginalHeight * 10) - MaxLineLength:Network.kt$Network$val receiver = destNode.label.boundsInParentProperty().map { Point2D(it.width / 2 + it.minX, it.height / 4 - 2.5 + it.minY) } - MaxLineLength:Network.kt$Network$val sender = senderNode.label.boundsInParentProperty().map { Point2D(it.width / 2 + it.minX, it.height / 4 - 2.5 + it.minY) } MaxLineLength:Network.kt$Network${ // It has to be a copy if we want to have notary both in notaries list and in identity (if we are looking at that particular notary node). myIdentityPane.apply { center = node.renderButton(mapLabel) } myLabel = mapLabel } - MaxLineLength:Network.kt$Network${ val node = this val identities = node.legalIdentitiesAndCerts.sortedBy { it.owningKey.toBase58String() } val mapLabel = label(PartyNameFormatter.short.format(identities.first().name)) // We choose the first one for the name of the node on the map. mapPane.add(mapLabel) // applyCss: This method does not normally need to be invoked directly but may be used in conjunction with Parent.layout() // to size a Node before the next pulse, or if the Scene is not in a Stage. // It's needed to properly add node label to the map (before that width and height are 0 which results in wrong placement of // nodes rendered after initial map rendering). mapPane.applyCss() mapPane.layout() mapLabel.apply { graphic = FontAwesomeIconView(FontAwesomeIcon.DOT_CIRCLE_ALT) contentDisplay = ContentDisplay.TOP val coordinate = Bindings.createObjectBinding({ // These coordinates are obtained when we generate the map using TileMill. node.getWorldMapLocation()?.coordinate?.project(mapPane.width, mapPane.height, 85.0511, -85.0511, -180.0, 180.0) ?: ScreenCoordinate(0.0, 0.0) }, arrayOf(mapPane.widthProperty(), mapPane.heightProperty())) // Center point of the label. layoutXProperty().bind(coordinate.map { it.screenX - width / 2 }) layoutYProperty().bind(coordinate.map { it.screenY - height / 4 }) } val button = node.renderButton(mapLabel) if (myIdentity.value in node.legalIdentitiesAndCerts.map { it.party }) { // It has to be a copy if we want to have notary both in notaries list and in identity (if we are looking at that particular notary node). myIdentityPane.apply { center = node.renderButton(mapLabel) } myLabel = mapLabel } return MapViewComponents(this, button, mapLabel) } - MaxLineLength:NetworkBootstrapper.kt$CopyCordapps$println("WARNING: ${it.fileName} already exists in $cordappsDir, ignoring and leaving existing CorDapp untouched") - MaxLineLength:NetworkBootstrapper.kt$CopyCordapps$protected abstract fun copyTo(cordappJars: List<Path>, nodeDirs: List<Path>, networkAlreadyExists: Boolean, fromCordform: Boolean) - MaxLineLength:NetworkBootstrapper.kt$CopyCordapps.FirstRunOnly$override MaxLineLength:NetworkBootstrapper.kt$CopyCordapps.FirstRunOnly$println("Not copying CorDapp JARs as --copy-cordapps is set to FirstRunOnly, and it looks like this network has already been bootstrapped.") - MaxLineLength:NetworkBootstrapper.kt$CopyCordapps.No$override MaxLineLength:NetworkBootstrapper.kt$CopyCordapps.Yes$override fun copyTo(cordappJars: List<Path>, nodeDirs: List<Path>, networkAlreadyExists: Boolean, fromCordform: Boolean) - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$1 -> return netParamsFilesGrouped.keys.first().deserialize().verifiedNetworkParametersCert(DEV_ROOT_CA.certificate) - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$bootstrap(directory, cordappJars, CopyCordapps.No, fromCordform = true, networkParametersOverrides = networkParametersOverrides) - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$bootstrap(directory, cordappJars, copyCordapps, fromCordform = false, networkParametersOverrides = networkParameterOverrides) - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$is NotaryCluster.CFT -> DevIdentityGenerator.generateDistributedNotarySingularIdentity(directories, cluster.name) - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$listOf(CordaX500Name.parse(config.getString("notary.serviceLegalName")) to DirectoryAndConfig(path, config)) - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$override MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$paths.filter { it.toString().endsWith(".jar") && !it.isSameAs(bootstrapperJar) && !jarsThatArentCordapps.contains(it.fileName.toString().toLowerCase()) } - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$private val contractsJarConverter: (Path) -> ContractsJar MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$require(networkParameterOverrides.minimumPlatformVersion == null || networkParameterOverrides.minimumPlatformVersion <= PLATFORM_VERSION) { "Minimum platform version cannot be greater than $PLATFORM_VERSION" } MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$val configuration = ConfigFactory.parseString(extraConfigurations).resolve().getObject("networkParameterOverrides").toConfig().parseAsNetworkParametersConfiguration() - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$val msg = StringBuilder("Differing sets of network parameters were found. Make sure all the nodes have the same " + "network parameters by copying the correct $NETWORK_PARAMS_FILE_NAME file across.\n\n") MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$val networkParametersOverrides = configuration.doOnErrors(::reportErrors).optional ?: throw IllegalStateException("Invalid configuration passed.") - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$val newNetParams = installNetworkParameters(notaryInfos, newWhitelist, existingNetParams, nodeDirs, networkParametersOverrides) MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$val newWhitelist = generateWhitelist(existingNetParams, readExcludeWhitelist(directory), unsignedJars.map(contractsJarConverter), readIncludeWhitelist(directory), signedJars.map(contractsJarConverter)) - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$val nodeDirs = directory.list { subDir -> subDir.filter { (it / "node.conf").exists() && !(it / "corda.jar").exists() }.toList() } MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$val signedJars = cordappJars.filter { isSigned(it) } // signed JARs are excluded by default, optionally include them in order to transition states from CZ whitelist to signature constraint - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$webServerConfFiles.firstOrNull { directory.relativize(it).toString().removeSuffix("_web-server.conf") == nodeName } - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper$when (legalIdentities.size) { // Single node notaries have just one identity like all other nodes. This identity is the notary identity 1 -> legalIdentities[0] // Nodes which are part of a distributed notary have a second identity which is the composite identity of the // cluster and is shared by all the other members. This is the notary identity. 2 -> legalIdentities[1] else -> throw IllegalArgumentException("Not sure how to get the notary identity in this scenario: $this") } - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper.AMQPParametersSerializationScheme$override - MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapper.Companion$val timePerNode = 40.seconds // On the test machine, generating the node info takes 7 seconds for a single node. MaxLineLength:NetworkBootstrapper.kt$NetworkBootstrapperWithOverridableParameters$fun bootstrap(directory: Path, copyCordapps: CopyCordapps, networkParameterOverrides: NetworkParametersOverrides = NetworkParametersOverrides()) - MaxLineLength:NetworkBootstrapperRunnerTests.kt$NetworkBootstrapperRunnerTests$@Test fun `test when a package is specified in the network parameters file it is passed through to the bootstrapper DSA`() - MaxLineLength:NetworkBootstrapperRunnerTests.kt$NetworkBootstrapperRunnerTests$@Test fun `test when a package is specified in the network parameters file it is passed through to the bootstrapper EC`() MaxLineLength:NetworkBootstrapperRunnerTests.kt$NetworkBootstrapperRunnerTests$verify(mockBootstrapper) MaxLineLength:NetworkBootstrapperRunnerTests.kt$NetworkBootstrapperRunnerTests$verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides()) MaxLineLength:NetworkBootstrapperRunnerTests.kt$NetworkBootstrapperRunnerTests$verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(eventHorizon = 7.days)) MaxLineLength:NetworkBootstrapperRunnerTests.kt$NetworkBootstrapperRunnerTests$verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(maxMessageSize = 1)) MaxLineLength:NetworkBootstrapperRunnerTests.kt$NetworkBootstrapperRunnerTests$verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(maxTransactionSize = 1)) MaxLineLength:NetworkBootstrapperRunnerTests.kt$NetworkBootstrapperRunnerTests$verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(minimumPlatformVersion = 1)) - MaxLineLength:NetworkBootstrapperRunnerTests.kt$NetworkBootstrapperRunnerTests$verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.No, NetworkParametersOverrides()) MaxLineLength:NetworkBootstrapperRunnerTests.kt$NetworkBootstrapperRunnerTests$verify(mockBootstrapper).bootstrap(tempDir.toPath().toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides()) - MaxLineLength:NetworkBootstrapperTest.kt$NetworkBootstrapperTest$assertContainsPackageOwner("bob", mapOf(Pair(alicePackageName, ALICE.publicKey), Pair(bobPackageName, BOB.publicKey))) - MaxLineLength:NetworkBootstrapperTest.kt$NetworkBootstrapperTest$bootstrap(packageOwnership = mapOf(Pair(alicePackageName, ALICE.publicKey), Pair(bobPackageName, BOB.publicKey))) - MaxLineLength:NetworkBootstrapperTest.kt$NetworkBootstrapperTest$private - MaxLineLength:NetworkBootstrapperTest.kt$NetworkBootstrapperTest$return list { it.filter { it.fileName.toString().startsWith(NODE_INFO_FILE_NAME_PREFIX) }.toList() }.single() - MaxLineLength:NetworkBootstrapperTest.kt$NetworkBootstrapperTest$val networkParameters = assertBootstrappedNetwork(fakeEmbeddedCorda, "alice" to aliceConfig, "notary" to notaryConfig) - MaxLineLength:NetworkBootstrapperTest.kt$NetworkBootstrapperTest$val networkParameters2 = assertBootstrappedNetwork(fakeEmbeddedCorda, "alice" to aliceConfig, "bob" to bobConfig) - MaxLineLength:NetworkBuilder.kt$NetworkBuilderImpl$nodeInstantiator.createInstanceRequest(it).also { onNodeInstanceRequestedCallback(listOf(it)) } - MaxLineLength:NetworkBuilder.kt$NetworkBuilderImpl$nodeInstantiator.instantiateNotaryInstance(request).thenApply { it.also(onNodeInstanceCallback) } MaxLineLength:NetworkHostAndPort.kt$NetworkHostAndPort.Companion$ @JvmStatic fun parse(str: String): NetworkHostAndPort - MaxLineLength:NetworkHostAndPortTest.kt$NetworkHostAndPortTest${ NetworkHostAndPort("example.com", it) } - MaxLineLength:NetworkHostAndPortTest.kt$NetworkHostAndPortTest${ NetworkHostAndPort.parse(it) } - MaxLineLength:NetworkIdentityModel.kt$NetworkIdentityModel$val notaries = ChosenList(rpcProxy.map { FXCollections.observableList(it?.notaryIdentities() ?: emptyList()) }, "notaries") - MaxLineLength:NetworkMap.kt$ParametersUpdate - MaxLineLength:NetworkMapCache.kt$NetworkMapCache$ fun getNodeByLegalIdentity(party: AbstractParty): NodeInfo? - MaxLineLength:NetworkMapCache.kt$NetworkMapCacheBase$ fun getNodeByLegalName(name: CordaX500Name): NodeInfo? - MaxLineLength:NetworkMapCache.kt$NetworkMapCacheBase$ fun getNodesByLegalName(name: CordaX500Name): List<NodeInfo> - MaxLineLength:NetworkMapCache.kt$NetworkMapCacheBase$ fun track(): DataFeed<List<NodeInfo>, NetworkMapCache.MapChange> - MaxLineLength:NetworkMapCache.kt$NetworkMapCacheBase$/** * A list of notary services available on the network. * * Note that the identities are sorted based on legal name, and the ordering might change once new notaries are introduced. */ val notaryIdentities: List<Party> - MaxLineLength:NetworkMapCacheTest.kt$NetworkMapCacheTest$assertEquals(aliceNode.info, bobCache.getNodesByLegalIdentityKey(aliceNode.info.singleIdentity().owningKey).single()) - MaxLineLength:NetworkMapCacheTest.kt$NetworkMapCacheTest$assertEquals(aliceNode.services.networkMapCache.getNodesByLegalIdentityKey(alice.owningKey).singleOrNull(), aliceNode.info) - MaxLineLength:NetworkMapCacheTest.kt$NetworkMapCacheTest$assertEquals(aliceNode.services.networkMapCache.getNodesByLegalIdentityKey(alice.owningKey).singleOrNull(), bobNode.info) - MaxLineLength:NetworkMapClient.kt$NetworkMapClient$logger.trace { "Fetched network parameters: '$networkParameterHash' successfully. Network Parameters: $networkParameter" } - MaxLineLength:NetworkMapClient.kt$NetworkMapClient$logger.trace { "Sending network parameters with hash ${signedParametersHash.raw.deserialize()} approval to $ackURL." } - MaxLineLength:NetworkMapClientTest.kt$NetworkMapClientTest$assertEquals(networkMapClient.getNetworkParameters(originalNetworkParameterHash).verified(), server.networkParameters) MaxLineLength:NetworkMapServer.kt$NetworkMapServer$val jerseyServlet = ServletHolder(ServletContainer(resourceConfig)).apply { initOrder = 0 } // Initialise at server start MaxLineLength:NetworkMapServer.kt$NetworkMapServer.InMemoryNetworkMapService$nodeInfoMap.filter { it.value.verified().legalIdentities.first().name == signedNodeInfo.verified().legalIdentities.first().name } - MaxLineLength:NetworkMapServer.kt$NetworkMapServer.InMemoryNetworkMapService$return Response.ok(signedNetworkMap.serialize().bytes).header("Cache-Control", "max-age=${pollInterval.seconds}").build() - MaxLineLength:NetworkMapTest.kt$NetworkMapTest$@Test fun `nodes process additions and removals from the network map correctly (and also download the network parameters)`() - MaxLineLength:NetworkMapTest.kt$NetworkMapTest$assertEquals(laterHash, networkMapServer.latestParametersAccepted(alice.nodeInfo.legalIdentities.first().owningKey)) MaxLineLength:NetworkMapTest.kt$NetworkMapTest$assertThat(nodeInfosDir.list().single().readObject<SignedNodeInfo>().verified().legalIdentities.first(), `is`( this.nodeInfo.legalIdentities.first())) MaxLineLength:NetworkMapTest.kt$NetworkMapTest$assertThatThrownBy { alice.rpc.acceptNewNetworkParameters(nextHash) }.hasMessageContaining("Refused to accept parameters with hash") - MaxLineLength:NetworkMapTest.kt$NetworkMapTest$networkMapServer.scheduleParametersUpdate(laterParams, "Another update", Instant.ofEpochMilli(random63BitValue())) - MaxLineLength:NetworkMapTest.kt$NetworkMapTest$networkMapServer.scheduleParametersUpdate(nextParams, "Next parameters", Instant.ofEpochMilli(random63BitValue())) - MaxLineLength:NetworkMapTest.kt$NetworkMapTest$val aliceNode = startNode(providedName = ALICE_NAME, devMode = false).getOrThrow() val aliceNodeInfo = aliceNode.nodeInfo.serialize().hash assertThat(networkMapServer.networkMapHashes()).contains(aliceNodeInfo) networkMapServer.removeNodeInfo(aliceNode.nodeInfo) var maxRemoveRetries = 5 // Try to remove multiple times in case the network map republishes just in between the removal and the check. while (aliceNodeInfo in networkMapServer.networkMapHashes()) { networkMapServer.removeNodeInfo(aliceNode.nodeInfo) if (maxRemoveRetries-- == 0) { throw AssertionError("Could not remove Node info.") } } // Wait until the node info is republished. Thread.sleep(2000) assertThat(networkMapServer.networkMapHashes()).contains(aliceNodeInfo) MaxLineLength:NetworkMapTest.kt$NetworkMapTest.Companion$nms.networkParameters = testNetworkParameters(it, modifiedTime = Instant.ofEpochMilli(random63BitValue()), epoch = 2) - MaxLineLength:NetworkMapUpdater.kt$@VisibleForTesting internal MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$"""Node is using network parameters with hash $currentParametersHash but the network map is advertising ${networkMap.networkParameterHash}. To resolve this mismatch, and move to the current parameters, delete the $NETWORK_PARAMS_FILE_NAME file from the node's directory and restart. The node will shutdown now.""" MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$// Add new node info to the network map cache, these could be new node info or modification of node info for existing nodes. networkMapCache.addNodes(retrievedNodeInfos) - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$?: - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$ParametersUpdateInfo(it.first.newParametersHash, it.second.verified(), it.first.description, it.first.updateDeadline) MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$To resolve this mismatch, and move to the current parameters, delete the - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$hash.serialize().sign { keyManagementService.sign(it.bytes, ourNodeInfo.verified().legalIdentities[0].owningKey) } - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$if (autoAcceptNetworkParameters && networkParameters.canAutoAccept(newNetParams, excludedAutoAcceptNetworkParameters)) { logger.info("Auto-accepting network parameter update ${update.newParametersHash}") acceptNewNetworkParameters(update.newParametersHash) { hash -> hash.serialize().sign { keyManagementService.sign(it.bytes, ourNodeInfo.verified().legalIdentities[0].owningKey) } } } else { parametersUpdatesTrack.onNext(updateInfo) } - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$logger.info("Auto-accept enabled for network parameter changes which modify only: $autoAcceptNetworkParametersNames") MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$logger.info("Fetched: ${hashesToFetch.size} using $threadsToUseForNetworkMapDownload Threads in ${System.currentTimeMillis() - networkMapDownloadStartTime}ms") - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$logger.warn("Error encountered when downloading node info '$nodeInfo', skipping...", e) - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$private - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$this.excludedAutoAcceptNetworkParameters = networkParameterAcceptanceSettings.excludedAutoAcceptableParameters - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$throw CordaRuntimeException("Network map cache can be updated only if network map/compatibility zone URL is specified") MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$val (update, signedNewNetParams) = requireNotNull(newNetworkParameters) { "Couldn't find parameters update for the hash: $parametersHash" } - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$val acceptedHash = if (updatesFile.exists()) updatesFile.readObject<SignedNetworkParameters>().raw.hash else null MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$val executorToUseForDownloadingNodeInfos = Executors.newFixedThreadPool(threadsToUseForNetworkMapDownload, NamedThreadFactory("NetworkMapUpdaterNodeInfoDownloadThread")) - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$val executorToUseForInsertionIntoDB = Executors.newSingleThreadExecutor(NamedThreadFactory("NetworkMapUpdateDBInsertThread")) - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater$val networkMapDownloadFutures = hashesToFetch.chunked(max(hashesToFetch.size / threadsToUseForNetworkMapDownload, 1)) .map { nodeInfosToGet -> //for a set of chunked hashes, get the nodeInfo for each hash CompletableFuture.supplyAsync(Supplier<List<NodeInfo>> { nodeInfosToGet.mapNotNull { nodeInfo -> try { networkMapClient.getNodeInfo(nodeInfo) } catch (e: Exception) { // Failure to retrieve one node info shouldn't stop the whole update, log and return null instead. logger.warn("Error encountered when downloading node info '$nodeInfo', skipping...", e) null } } }, executorToUseForDownloadingNodeInfos).thenAcceptAsync(Consumer { retrievedNodeInfos -> // Add new node info to the network map cache, these could be new node info or modification of node info for existing nodes. networkMapCache.addNodes(retrievedNodeInfos) }, executorToUseForInsertionIntoDB) }.toTypedArray() - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater${ // Failure to retrieve one node info shouldn't stop the whole update, log and return null instead. logger.warn("Error encountered when downloading node info '$nodeInfo', skipping...", e) null } - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater${ if (networkMapClient == null) { throw CordaRuntimeException("Network map cache can be updated only if network map/compatibility zone URL is specified") } val (globalNetworkMap, cacheTimeout) = networkMapClient.getNetworkMap() globalNetworkMap.parametersUpdate?.let { handleUpdateNetworkParameters(networkMapClient, it) } val additionalHashes = extraNetworkMapKeys.flatMap { try { networkMapClient.getNetworkMap(it).payload.nodeInfoHashes } catch (e: Exception) { // Failure to retrieve one network map using UUID shouldn't stop the whole update. logger.warn("Error encountered when downloading network map with uuid '$it', skipping...", e) emptyList<SecureHash>() } } val allHashesFromNetworkMap = (globalNetworkMap.nodeInfoHashes + additionalHashes).toSet() if (currentParametersHash != globalNetworkMap.networkParameterHash) { exitOnParametersMismatch(globalNetworkMap) } val currentNodeHashes = networkMapCache.allNodeHashes // Remove node info from network map. (currentNodeHashes - allHashesFromNetworkMap - nodeInfoWatcher.processedNodeInfoHashes) .mapNotNull { if (it != ourNodeInfoHash) networkMapCache.getNodeByHash(it) else null } .forEach(networkMapCache::removeNode) //at the moment we use a blocking HTTP library - but under the covers, the OS will interleave threads waiting for IO //as HTTP GET is mostly IO bound, use more threads than CPU's //maximum threads to use = 24, as if we did not limit this on large machines it could result in 100's of concurrent requests val threadsToUseForNetworkMapDownload = min(Runtime.getRuntime().availableProcessors() * 4, 24) val executorToUseForDownloadingNodeInfos = Executors.newFixedThreadPool(threadsToUseForNetworkMapDownload, NamedThreadFactory("NetworkMapUpdaterNodeInfoDownloadThread")) //DB insert is single threaded - use a single threaded executor for it. val executorToUseForInsertionIntoDB = Executors.newSingleThreadExecutor(NamedThreadFactory("NetworkMapUpdateDBInsertThread")) val hashesToFetch = (allHashesFromNetworkMap - currentNodeHashes) val networkMapDownloadStartTime = System.currentTimeMillis() if (hashesToFetch.isNotEmpty()) { val networkMapDownloadFutures = hashesToFetch.chunked(max(hashesToFetch.size / threadsToUseForNetworkMapDownload, 1)) .map { nodeInfosToGet -> //for a set of chunked hashes, get the nodeInfo for each hash CompletableFuture.supplyAsync(Supplier<List<NodeInfo>> { nodeInfosToGet.mapNotNull { nodeInfo -> try { networkMapClient.getNodeInfo(nodeInfo) } catch (e: Exception) { // Failure to retrieve one node info shouldn't stop the whole update, log and return null instead. logger.warn("Error encountered when downloading node info '$nodeInfo', skipping...", e) null } } }, executorToUseForDownloadingNodeInfos).thenAcceptAsync(Consumer { retrievedNodeInfos -> // Add new node info to the network map cache, these could be new node info or modification of node info for existing nodes. networkMapCache.addNodes(retrievedNodeInfos) }, executorToUseForInsertionIntoDB) }.toTypedArray() //wait for all the futures to complete val waitForAllHashes = CompletableFuture.allOf(*networkMapDownloadFutures) waitForAllHashes.thenRunAsync { logger.info("Fetched: ${hashesToFetch.size} using $threadsToUseForNetworkMapDownload Threads in ${System.currentTimeMillis() - networkMapDownloadStartTime}ms") executorToUseForDownloadingNodeInfos.shutdown() executorToUseForInsertionIntoDB.shutdown() }.getOrThrow() } // Mark the network map cache as ready on a successful poll of the HTTP network map, even on the odd chance that // it's empty networkMapCache.nodeReady.set(null) return cacheTimeout } - MaxLineLength:NetworkMapUpdater.kt$NetworkMapUpdater${ networkMapClient ?: throw IllegalStateException("Network parameters updates are not supported without compatibility zone configured") // TODO This scenario will happen if node was restarted and didn't download parameters yet, but we accepted them. // Add persisting of newest parameters from update. val (update, signedNewNetParams) = requireNotNull(newNetworkParameters) { "Couldn't find parameters update for the hash: $parametersHash" } // We should check that we sign the right data structure hash. val newNetParams = signedNewNetParams.verifiedNetworkParametersCert(trustRoot) val newParametersHash = signedNewNetParams.raw.hash if (parametersHash == newParametersHash) { // The latest parameters have priority. signedNewNetParams.serialize() .open() .copyTo(baseDirectory / NETWORK_PARAMS_UPDATE_FILE_NAME, StandardCopyOption.REPLACE_EXISTING) networkMapClient.ackNetworkParametersUpdate(sign(parametersHash)) logger.info("Accepted network parameter update $update: $newNetParams") } else { throw OutdatedNetworkParameterHashException(parametersHash, newParametersHash) } } - MaxLineLength:NetworkMapUpdater.kt$autoAcceptableNamesAndGetters.none { it.key in excludedParameterNames && valueChanged(newNetworkParameters, it.value) } - MaxLineLength:NetworkMapUpdater.kt$private fun KProperty1<out NetworkParameters, Any?>.isAutoAcceptable(): Boolean - MaxLineLength:NetworkMapUpdater.kt$private val memberPropertyPartition = NetworkParameters::class.declaredMemberProperties.partition { it.isAutoAcceptable() } - MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$//Test fix for ENT-1882 //This scenario can happen when signing of network map server is performed much longer after the node joined the network. //Network map will advertise hashes without that node. @Test fun `not remove own node info when it is not in network map yet`() - MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$@Test fun `network parameters not auto-accepted when update only changes whitelist but auto accept configured to be false`() - MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$@Test fun `network parameters not auto-accepted when update only changes whitelist but parameter included in exclusion`() MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$Assert.assertThat(networkMapCache.allNodeHashes, IsIterableContainingInAnyOrder.containsInAnyOrder(signedNodeInfo1.raw.hash, signedNodeInfo2.raw.hash)) - MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$MockKeyManagementService(makeTestIdentityService(), ourKeyPair, pkToIdCache = MockPublicKeyToOwningIdentityCache()) MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$assertFalse(netParams.canAutoAccept(netParamsAutoAcceptable, setOf("whitelistedContractImplementations")), "not auto-acceptable if only AutoAcceptable params have changed but one has been added to the exclusion set") MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$assertFalse(netParams.canAutoAccept(netParamsNotAutoAcceptable, emptySet()), "not auto-acceptable if non-AutoAcceptable param has changed") MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$assertThat(networkMapCache.allNodeHashes).containsExactlyInAnyOrder(fileNodeInfoAndSigned1.signed.raw.hash, fileNodeInfoAndSigned2.signed.raw.hash) - MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$assertThat(networkMapCache.allNodeHashes).containsExactlyInAnyOrder(signedMyInfo.raw.hash, signedOtherInfo.raw.hash) - MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$assertTrue(netParams.canAutoAccept(netParams, autoAcceptablePropertyNames), "auto acceptable if identical regardless of exclusions") MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$assertTrue(netParams.canAutoAccept(netParamsAutoAcceptable, emptySet()), "auto-acceptable if only AutoAcceptable params have changed") MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$assertTrue(netParams.canAutoAccept(netParamsAutoAcceptable, setOf("modifiedTime")), "auto-acceptable if only AutoAcceptable params have changed and excluded param has not changed") - MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$on { getNodeByHash(any()) }.then { mock -> data.values.singleOrNull { it.serialize().hash == mock.arguments[0] } } MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$private - MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$updater = NetworkMapUpdater(networkMapCache, fileWatcher, netMapClient, baseDir, extraNetworkMapKeys, networkParametersStorage) - MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$val fileName = "${NodeInfoFilesCopier.NODE_INFO_FILE_NAME_PREFIX}${localNodeInfo.legalIdentities[0].name.serialize().hash}" MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest$val fileName1 = "${NodeInfoFilesCopier.NODE_INFO_FILE_NAME_PREFIX}${fileNodeInfoAndSigned1.nodeInfo.legalIdentities[0].name.serialize().hash}" - MaxLineLength:NetworkMapUpdaterTest.kt$NetworkMapUpdaterTest${ setUpdater() val nodeInfoBuilder = TestNodeInfoBuilder() val (_, key) = nodeInfoBuilder.addLegalIdentity(CordaX500Name("Info", "London", "GB")) val (serverNodeInfo, serverSignedNodeInfo) = nodeInfoBuilder.buildWithSigned(1, 1) //Construct node for exactly same identity, but different serial. This one will go to additional-node-infos only. val localNodeInfo = serverNodeInfo.copy(serial = 17) val localSignedNodeInfo = NodeInfoAndSigned(localNodeInfo) { _, serialised -> key.sign(serialised.bytes) } //The one with higher serial goes to additional-node-infos. NodeInfoWatcher.saveToFile(nodeInfoDir, localSignedNodeInfo) //Publish to network map the one with lower serial. networkMapClient.publish(serverSignedNodeInfo) startUpdater() advanceTime() verify(networkMapCache, times(1)).addNode(localNodeInfo) Thread.sleep(2L * cacheExpiryMs) //Node from file has higher serial than the one from NetworkMapServer assertThat(networkMapCache.allNodeHashes).containsOnly(localSignedNodeInfo.signed.raw.hash) val fileName = "${NodeInfoFilesCopier.NODE_INFO_FILE_NAME_PREFIX}${localNodeInfo.legalIdentities[0].name.serialize().hash}" (nodeInfoDir / fileName).delete() advanceTime() verify(networkMapCache, times(1)).removeNode(any()) verify(networkMapCache).removeNode(localNodeInfo) Thread.sleep(2L * cacheExpiryMs) //Instead of node from file we should have now the one from NetworkMapServer assertThat(networkMapCache.allNodeHashes).containsOnly(serverSignedNodeInfo.raw.hash) } - MaxLineLength:NetworkParameterOverridesSpec.kt$NetworkParameterOverridesSpec$internal - MaxLineLength:NetworkParameterOverridesSpec.kt$NetworkParameterOverridesSpec.PackageOwnershipSpec$badValue("Error reading the key store from the file for keyStoreFilePath: $suppliedKeystorePath ${e.message}.") - MaxLineLength:NetworkParameterOverridesSpec.kt$NetworkParameterOverridesSpec.PackageOwnershipSpec$badValue("Password is incorrect or the key store is damaged for keyStoreFilePath: $suppliedKeystorePath.") MaxLineLength:NetworkParameterOverridesSpec.kt$fun Config.parseAsNetworkParametersConfiguration(options: Configuration.Validation.Options = Configuration.Validation.Options(strict = false)): Valid<NetworkParametersOverrides> - MaxLineLength:NetworkParameterOverridesSpec.kt$internal fun <T> badValue(msg: String): Valid<T> MaxLineLength:NetworkParameters.kt$NetworkParameters - MaxLineLength:NetworkParameters.kt$NetworkParameters$whitelistedContractImplementations: Map<String, List<AttachmentId>> = this.whitelistedContractImplementations MaxLineLength:NetworkParametersCopier.kt$NetworkParametersCopier$private val serialisedSignedNetParams: SerializedBytes<SignedDataWithCert<NetworkParameters>> = signingCertAndKeyPair.sign(networkParameters).serialize() - MaxLineLength:NetworkParametersReader.kt$NetworkParametersReader$logger.info("No network-parameters file found. Expecting network parameters to be available from the network map.") - MaxLineLength:NetworkParametersReader.kt$NetworkParametersReader$private - MaxLineLength:NetworkParametersReader.kt$NetworkParametersReader${ // Node joins for the first time. downloadParameters(advertisedParametersHash) } MaxLineLength:NetworkParametersReader.kt$NetworkParametersReader${ // TODO On one hand we have node starting without parameters and just accepting them by default, // on the other we have parameters update process - it needs to be unified. Say you start the node, you don't have matching parameters, // you get them from network map, but you have to run the approval step. if (signedParametersFromFile == null) { // Node joins for the first time. downloadParameters(advertisedParametersHash) } else if (signedParametersFromFile.raw.hash == advertisedParametersHash) { // Restarted with the same parameters. signedParametersFromFile } else { // Update case. readParametersUpdate(advertisedParametersHash, signedParametersFromFile.raw.hash) } } - MaxLineLength:NetworkParametersReader.kt$NetworkParametersReader${ logger.info("Unable to download network map", e) // If NetworkMap is down while restarting the node, we should be still able to continue with parameters from file null } MaxLineLength:NetworkParametersReader.kt$NetworkParametersReader.Error$NetworkMapNotConfigured : Error - MaxLineLength:NetworkParametersReader.kt$NetworkParametersReader.Error$ParamsNotConfigured : Error - MaxLineLength:NetworkParametersReader.kt$NetworkParametersReader.Error.OldParamsAndUpdate$"parameters advertised by network map. Please update node to use correct network parameters file." - MaxLineLength:NetworkParametersReaderTest.kt$NetworkParametersReaderTest$NetworkParametersCopier(server.networkParameters, update = true).install(baseDirectory) - MaxLineLength:NetworkParametersReaderTest.kt$NetworkParametersReaderTest$val parameters = NetworkParametersReader(DEV_ROOT_CA.certificate, networkMapClient, baseDirectory).read().networkParameters - MaxLineLength:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$(megaCorpNode.services.networkParametersService as NetworkParametersStorage).saveParameters(certKeyPair.sign(defaultParams)) - MaxLineLength:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$(megaCorpNode.services.networkParametersService as NetworkParametersStorage).saveParameters(certKeyPair.sign(params3)) - MaxLineLength:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$assertThatExceptionOfType(TransactionVerificationException.TransactionNetworkParameterOrderingException::class.java) MaxLineLength:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$cordappsForAllNodes = listOf(DUMMY_CONTRACTS_CORDAPP, cordappForClasses(ResolveTransactionsFlowTest.TestFlow::class.java, ResolveTransactionsFlowTest.TestResponseFlow::class.java)) - MaxLineLength:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$params2 = testNetworkParameters(epoch = 2, minimumPlatformVersion = 3, notaries = listOf((NotaryInfo(notaryParty, true)))) - MaxLineLength:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$params3 = testNetworkParameters(epoch = 3, minimumPlatformVersion = 4, notaries = listOf((NotaryInfo(notaryParty, true)))) MaxLineLength:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$private - MaxLineLength:NetworkParametersResolutionTest.kt$NetworkParametersResolutionTest$val signatureMetadata = SignatureMetadata(services.myInfo.platformVersion, Crypto.findSignatureScheme(publicKey).schemeNumberID) - MaxLineLength:NetworkParametersService.kt$NetworkParametersService$/** * For backwards compatibility, this parameters hash will be used for resolving historical transactions in the chain. */ val defaultHash: SecureHash MaxLineLength:NetworkParametersServiceInternal.kt$NetworkParametersStorage$ fun getEpochFromHash(hash: SecureHash): Int? - MaxLineLength:NetworkParametersServiceInternal.kt$NetworkParametersStorage$ fun getHistoricNotary(party: Party): NotaryInfo? - MaxLineLength:NetworkParametersServiceInternal.kt$NetworkParametersStorage$ fun lookupSigned(hash: SecureHash): SignedDataWithCert<NetworkParameters>? - MaxLineLength:NetworkParametersTest.kt$NetworkParametersTest$alice.services.startFlow(CashIssueFlow(500.DOLLARS, OpaqueBytes.of(0x01), fakeNotaryId)).resultFuture.getOrThrow() MaxLineLength:NetworkParametersTest.kt$NetworkParametersTest$val alice = mockNet.createUnstartedNode(InternalMockNodeParameters(legalName = ALICE_NAME, forcedID = 100, version = MOCK_VERSION_INFO.copy(platformVersion = 1))) MaxLineLength:NetworkParametersTest.kt$NetworkParametersTest$val alice = mockNet.createUnstartedNode(InternalMockNodeParameters(legalName = ALICE_NAME, forcedID = 100, version = MOCK_VERSION_INFO.copy(platformVersion = 2))) - MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$ fun generateKeysAndRegister() MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$ | Please make sure the config is correct or that the correct certificate for the CRL issuer is added to the node's trust store. - MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$"$networkRootTrustStorePath does not exist. This file must contain the root CA cert of your compatibility zone. " MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$certStore.query { setPrivateKey(SELF_SIGNED_PRIVATE_KEY, AliasPrivateKey(SELF_SIGNED_PRIVATE_KEY), listOf(NOT_YET_REGISTERED_MARKER_KEYS_AND_CERTS.ECDSAR1_CERT), certificateStore.entryPassword) } - MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$if (Crypto.toSupportedPublicKey(certificates.first().publicKey) != Crypto.toSupportedPublicKey(registeringPublicKey)) { throw CertificateRequestException("Received certificate contains incorrect public key, expected '$registeringPublicKey', got '${certificates.first().publicKey}'.") } MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$logError MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$logProgress("Certificate signing request with the following information will be submitted to the Corda certificate signing server.") - MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$logProgress("Successfully submitted request to Corda certificate signing server, request ID: $requestId.") MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$onSuccess(nodeCaPublicKey, cryptoService.getSigner(nodeCaKeyAlias), nodeCaCertificates, tlsCrlIssuerCert?.subjectX500Principal?.toX500Name()) - MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$private val nextIdleDuration: (Duration?) -> Duration? = FixedPeriodLimitedRetrialStrategy(10, Duration.ofMinutes(1)) MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$protected open fun onSuccess(publicKey: PublicKey, contentSigner: ContentSigner, certificates: List<X509Certificate>, tlsCrlCertificateIssuer: X500Name?) MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$throw CertificateRequestException("Received certificate contains incorrect public key, expected '$registeringPublicKey', got '${certificates.first().publicKey}'.") MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$throw CertificateRequestException("Received certificate contains invalid cert role, expected '$certRole', got '$nodeCaCertRole'.") - MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$throw CertificateRequestException("Subject of received node CA cert doesn't match with node legal name: $nodeCaSubject") - MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$throw NodeRegistrationException("Compatibility Zone registration service is currently unavailable, " + "try again later!.", e) - MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$val certStore: CertificateStore = if (cryptoService is BCCryptoService) cryptoService.certificateStore else certificateStore MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$val request = X509Utilities.createCertificateSigningRequest(myLegalName.x500Principal, emailAddress, publicKey, contentSigner, certRole) - MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$val requestId = submitOrResumeCertificateSigningRequest(nodeCaPublicKey, cryptoService.getSigner(nodeCaKeyAlias)) - MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper${ // Create or load self signed keypair from the key store. // We use the self sign certificate to store the key temporarily in the keystore while waiting for the request approval. if (alias !in this) { // NODE_CA should be TLS compatible due to the cert hierarchy structure. val keyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) val selfSignCert = X509Utilities.createSelfSignedCACertificate(myLegalName.x500Principal, keyPair) // Save to the key store. with(value) { setPrivateKey(alias, keyPair.private, listOf(selfSignCert), keyPassword = entryPassword) save() } } return query { getCertificateAndKeyPair(alias, entryPassword) }.keyPair } - MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper${ certificatesDirectory.createDirectories() // We need this in case cryptoService and certificateStore share the same KeyStore (for backwards compatibility purposes). // If we didn't, then an update to cryptoService wouldn't be reflected to certificateStore that is already loaded in memory. val certStore: CertificateStore = if (cryptoService is BCCryptoService) cryptoService.certificateStore else certificateStore // SELF_SIGNED_PRIVATE_KEY is used as progress indicator. if (certStore.contains(nodeCaKeyAlias) && !certStore.contains(SELF_SIGNED_PRIVATE_KEY)) { logProgress("Certificate already exists, Corda node will now terminate...") return } val tlsCrlIssuerCert = getTlsCrlIssuerCert() // We use SELF_SIGNED_PRIVATE_KEY as progress indicator so we just store a dummy key and cert. // When registration succeeds, this entry should be deleted. certStore.query { setPrivateKey(SELF_SIGNED_PRIVATE_KEY, AliasPrivateKey(SELF_SIGNED_PRIVATE_KEY), listOf(NOT_YET_REGISTERED_MARKER_KEYS_AND_CERTS.ECDSAR1_CERT), certificateStore.entryPassword) } val nodeCaPublicKey = loadOrGenerateKeyPair() val requestId = submitOrResumeCertificateSigningRequest(nodeCaPublicKey, cryptoService.getSigner(nodeCaKeyAlias)) val nodeCaCertificates = pollServerForCertificates(requestId) validateCertificates(nodeCaPublicKey, nodeCaCertificates) certStore.setCertPathOnly(nodeCaKeyAlias, nodeCaCertificates) certStore.value.internal.deleteEntry(SELF_SIGNED_PRIVATE_KEY) certStore.value.save() logProgress("Private key '$nodeCaKeyAlias' and its certificate-chain stored successfully.") onSuccess(nodeCaPublicKey, cryptoService.getSigner(nodeCaKeyAlias), nodeCaCertificates, tlsCrlIssuerCert?.subjectX500Principal?.toX500Name()) // All done, clean up temp files. requestIdStore.deleteIfExists() } MaxLineLength:NetworkRegistrationHelper.kt$NetworkRegistrationHelper${ val nodeCACertificate = certificates.first() val nodeCaSubject = try { CordaX500Name.build(nodeCACertificate.subjectX500Principal) } catch (e: IllegalArgumentException) { throw CertificateRequestException("Received node CA cert has invalid subject name: ${e.message}") } if (nodeCaSubject != myLegalName) { throw CertificateRequestException("Subject of received node CA cert doesn't match with node legal name: $nodeCaSubject") } val nodeCaCertRole = try { CertRole.extract(nodeCACertificate) } catch (e: IllegalArgumentException) { throw CertificateRequestException("Unable to extract cert role from received node CA cert: ${e.message}") } if (certRole != nodeCaCertRole) { throw CertificateRequestException("Received certificate contains invalid cert role, expected '$certRole', got '$nodeCaCertRole'.") } // Validate returned certificate is for the correct public key. if (Crypto.toSupportedPublicKey(certificates.first().publicKey) != Crypto.toSupportedPublicKey(registeringPublicKey)) { throw CertificateRequestException("Received certificate contains incorrect public key, expected '$registeringPublicKey', got '${certificates.first().publicKey}'.") } // Validate certificate chain returned from the doorman with the root cert obtained via out-of-band process, to prevent MITM attack on doorman server. X509Utilities.validateCertificateChain(rootCert, certificates) logProgress("Certificate signing request approved, storing private key with the certificate chain.") } MaxLineLength:NetworkRegistrationHelper.kt$NodeRegistrationConfiguration$cryptoService = CryptoServiceFactory.makeCryptoService(SupportedCryptoServices.BC_SIMPLE, config.myLegalName, config.signingCertificateStore) MaxLineLength:NetworkRegistrationHelper.kt$NodeRegistrationHelper$computeNextIdleDoormanConnectionPollInterval: (Duration?) -> Duration? = FixedPeriodLimitedRetrialStrategy(10, Duration.ofMinutes(1)) - MaxLineLength:NetworkRegistrationHelper.kt$NodeRegistrationHelper$logger.info("Copying trusted certificate to the node's trust store: Alias: $it, Certificate: $certificate") MaxLineLength:NetworkRegistrationHelper.kt$NodeRegistrationHelper$logger.warn("The node's trust store already exists. The following certificates will be overridden: ${this.aliases().asSequence()}") MaxLineLength:NetworkRegistrationHelper.kt$NodeRegistrationHelper$override MaxLineLength:NetworkRegistrationHelper.kt$NodeRegistrationHelper$private MaxLineLength:NetworkRegistrationHelper.kt$NodeRegistrationHelper$val validityWindow = X509Utilities.getCertificateValidityWindow(DEFAULT_VALIDITY_WINDOW.first, DEFAULT_VALIDITY_WINDOW.second, issuerCertificate) MaxLineLength:NetworkRegistrationHelperTest.kt$NetworkRegistrationHelperTest$CertRole.NODE_CA -> NodeRegistrationHelper(NodeRegistrationConfiguration(config), certService, NodeRegistrationOption(config.certificatesDirectory / networkRootTrustStoreFileName, networkRootTrustStorePassword)) - MaxLineLength:NetworkRegistrationHelperTest.kt$NetworkRegistrationHelperTest$NameConstraints(arrayOf(GeneralSubtree(GeneralName(GeneralName.directoryName, legalName.toX500Name()))), arrayOf()) - MaxLineLength:NetworkRegistrationHelperTest.kt$NetworkRegistrationHelperTest$doReturn(CertificateStoreStubs.P2P.withCertificatesDirectory(certificatesDirectory)).whenever(it).p2pSslOptions - MaxLineLength:NetworkRegistrationHelperTest.kt$NetworkRegistrationHelperTest$doReturn(CertificateStoreStubs.Signing.withCertificatesDirectory(certificatesDirectory)).whenever(it).signingCertificateStore MaxLineLength:NetworkRegistrationHelperTest.kt$NetworkRegistrationHelperTest$private - MaxLineLength:NetworkRegistrationHelperTest.kt$NetworkRegistrationHelperTest$publicKey: PublicKey = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME).public MaxLineLength:NetworkRegistrationHelperTest.kt$NetworkRegistrationHelperTest$rootAndIntermediateCA: Pair<CertificateAndKeyPair, CertificateAndKeyPair> = createDevIntermediateCaCertPath() - MaxLineLength:NetworkRegistrationHelperTest.kt$NetworkRegistrationHelperTest$val rootAndIntermediateCA = createDevIntermediateCaCertPath().also { saveNetworkTrustStore(CORDA_ROOT_CA to it.first.certificate) } - MaxLineLength:NetworkRegistrationHelperTest.kt$NetworkRegistrationHelperTest${ createFixedResponseRegistrationHelper(nodeCaCertPath) } - MaxLineLength:NetworkRegistrationService.kt$NetworkRegistrationService$ @Throws(CertificateRequestException::class) fun retrieveCertificates(requestId: String): CertificateResponse - MaxLineLength:NewTransaction.kt$NewTransaction$CashTransaction.Exit -> ExitRequest(Amount.fromDecimal(amount.value, currencyChoiceBox.value), issueRef) MaxLineLength:NewTransaction.kt$NewTransaction$CashTransaction.Issue -> IssueAndPaymentRequest(Amount.fromDecimal(amount.value, currencyChoiceBox.value), issueRef, partyBChoiceBox.value.party, selectNotary(), anonymous) MaxLineLength:NewTransaction.kt$NewTransaction$CashTransaction.Pay -> PaymentRequest(Amount.fromDecimal(amount.value, currencyChoiceBox.value), partyBChoiceBox.value.party, anonymous = anonymous, notary = selectNotary()) MaxLineLength:NewTransaction.kt$NewTransaction$issueRefLabel.visibleProperty().bind(transactionTypeCB.valueProperty().map { it == CashTransaction.Issue || it == CashTransaction.Exit }) MaxLineLength:NewTransaction.kt$NewTransaction$issuer.isNotNull.and(currencyChoiceBox.valueProperty().isNotNull).and(transactionTypeCB.valueProperty().booleanBinding(transactionTypeCB.valueProperty()) { it != CashTransaction.Issue }) - MaxLineLength:NewTransaction.kt$NewTransaction$partyATextField.textProperty().bind(myIdentity.map { it?.let { PartyNameFormatter.short.format(it.name) } ?: "" }) MaxLineLength:NewTransaction.kt$NewTransaction$val filteredCash = cash.filtered { it.token.issuer.party == issuer.value && it.token.product == currencyChoiceBox.value } .map { it.withoutIssuer() }.sumOrNull() MaxLineLength:NewTransaction.kt$NewTransaction$val issuer = Bindings.createObjectBinding({ if (issuerChoiceBox.isVisible) issuerChoiceBox.value else myIdentity.value }, arrayOf(myIdentity, issuerChoiceBox.visibleProperty(), issuerChoiceBox.valueProperty())) - MaxLineLength:NewTransaction.kt$NewTransaction$visibleProperty().bind(transactionTypeCB.valueProperty().map { it == CashTransaction.Issue || it == CashTransaction.Exit }) - MaxLineLength:Node.kt$Node$ override fun startDatabase() - MaxLineLength:Node.kt$Node$ private fun registerDefaultExceptionHandler() MaxLineLength:Node.kt$Node$"To disable autodetect set detectPublicIp = false in the node.conf, or consider using messagingServerAddress and messagingServerExternal" MaxLineLength:Node.kt$Node$ArtemisRpcBroker.withSsl(configuration.p2pSslOptions, this.address, adminAddress, sslConfig!!, securityManager, MAX_RPC_MESSAGE_SIZE, jmxMonitoringHttpPort != null, rpcBrokerDirectory, shouldStartLocalShell()) MaxLineLength:Node.kt$Node$ArtemisRpcBroker.withoutSsl(configuration.p2pSslOptions, this.address, adminAddress, securityManager, MAX_RPC_MESSAGE_SIZE, jmxMonitoringHttpPort != null, rpcBrokerDirectory, shouldStartLocalShell()) - MaxLineLength:Node.kt$Node$ObjectName("$domain:type=$category,${if (component.isNotEmpty()) "component=$component," else ""}name=$subName") MaxLineLength:Node.kt$Node$System.setProperty("h2.allowedClasses", "org.h2.mvstore.db.MVTableEngine,org.locationtech.jts.geom.Geometry,org.h2.server.TcpServer") - MaxLineLength:Node.kt$Node$System.setProperty("io.netty.allocator.numHeapArenas", min(memBasedArenas, NettyRuntime.availableProcessors() * 2L).toString()) MaxLineLength:Node.kt$Node$if (configuration.shouldStartLocalShell()) RPCSecurityManagerWithAdditionalUser(this, User(INTERNAL_SHELL_USER, INTERNAL_SHELL_USER, setOf(Permissions.all()))) else this MaxLineLength:Node.kt$Node$internalRpcMessagingClient = InternalRPCMessagingClient(configuration.p2pSslOptions, it.admin, MAX_RPC_MESSAGE_SIZE, CordaX500Name.build(configuration.p2pSslOptions.keyStore.get()[X509Utilities.CORDA_CLIENT_TLS].subjectX500Principal), rpcServerConfiguration) - MaxLineLength:Node.kt$Node$log MaxLineLength:Node.kt$Node$log.info("Detected public IP: ${foundPublicIP.hostAddress}. This will be used instead of the provided \"$host\" as the advertised address.") MaxLineLength:Node.kt$Node$log.info("Retrieved public IP from Network Map Service: $this. This will be used instead of the provided \"$host\" as the advertised address.") MaxLineLength:Node.kt$Node$override - MaxLineLength:Node.kt$Node$override fun myAddresses(): List<NetworkHostAndPort> - MaxLineLength:Node.kt$Node$private MaxLineLength:Node.kt$Node$registerScheme(AMQPClientSerializationScheme(cordappLoader.cordapps, Caffeine.newBuilder().maximumSize(128).build<SerializationFactoryCacheKey, SerializerFactory>().asMap())) MaxLineLength:Node.kt$Node$registerScheme(AMQPServerSerializationScheme(cordappLoader.cordapps, Caffeine.newBuilder().maximumSize(128).build<SerializationFactoryCacheKey, SerializerFactory>().asMap())) - MaxLineLength:Node.kt$Node$require(nodeInfo.legalIdentities.size in 1..2) { "Currently nodes must have a primary address and optionally one serviced address" } MaxLineLength:Node.kt$Node$return BridgeControlListener(configuration.p2pSslOptions, networkParameters.maxMessageSize, configuration.crlCheckSoftFail, artemisMessagingClientFactory) MaxLineLength:Node.kt$Node$rpcClientContext = if (configuration.shouldInitCrashShell()) AMQP_RPC_CLIENT_CONTEXT.withClassLoader(classloader) else null - MaxLineLength:Node.kt$Node$serviceIdentity = if (nodeInfo.legalIdentities.size == 1) null else nodeInfo.legalIdentities[1].owningKey MaxLineLength:Node.kt$Node$throw CouldNotCreateDataSourceException("Database password is required for H2 server listening on ${InetAddress.getByName(effectiveH2Settings.address.host)}.") - MaxLineLength:Node.kt$Node${ // Netty arenas are approx 16MB each when max'd out. Set arenas based on memory, not core count, unless memory is abundant. val memBasedArenas = max(Runtime.getRuntime().maxMemory() / 256.MB, 1L) // We set the min of the above and the default. System.setProperty("io.netty.allocator.numHeapArenas", min(memBasedArenas, NettyRuntime.availableProcessors() * 2L).toString()) } - MaxLineLength:Node.kt$Node${ check(!serverThread.isOnThread) synchronized(this) { if (shutdown) return shutdown = true // Unregister shutdown hook to prevent any unnecessary second calls to stop shutdownHook?.cancel() shutdownHook = null } printBasicNodeInfo("Shutting down ...") // All the Node started subsystems were registered with the runOnStop list at creation. // So now simply call the parent to stop everything in reverse order. // In particular this prevents premature shutdown of the Database by AbstractNode whilst the serverThread is active super.stop() shutdown = false log.info("Shutdown complete") } - MaxLineLength:Node.kt$Node${ override fun createStartedNode(nodeInfo: NodeInfo, rpcOps: CordaRPCOps, notaryService: NotaryService?): NodeInfo = nodeInfo companion object { private val staticLog = contextLogger() var renderBasicInfoToConsole = true /** Used for useful info that we always want to show, even when not logging to the console */ fun printBasicNodeInfo(description: String, info: String? = null) { val msg = if (info == null) description else "${description.padEnd(40)}: $info" val loggerName = if (renderBasicInfoToConsole) "BasicInfo" else "Main" LoggerFactory.getLogger(loggerName).info(msg) } fun printInRed(message: String) { println("${ShellConstants.RED}$message${ShellConstants.RESET}") } fun printWarning(message: String) { Emoji.renderIfSupported { printInRed("${Emoji.warningSign} ATTENTION: $message") } staticLog.warn(message) } internal fun failStartUp(message: String): Nothing { println(message) println("Corda will now exit...") exitProcess(1) } private fun createClock(configuration: NodeConfiguration): CordaClock { return (if (configuration.useTestClock) ::DemoClock else ::SimpleClock)(Clock.systemUTC()) } private val sameVmNodeCounter = AtomicInteger() // TODO: make this configurable. const val MAX_RPC_MESSAGE_SIZE = 10485760 fun isInvalidJavaVersion(): Boolean { if (!hasMinimumJavaVersion()) { println("You are using a version of Java that is not supported (${SystemUtils.JAVA_VERSION}). Please upgrade to the latest version of Java 8.") println("Corda will now exit...") return true } return false } private fun hasMinimumJavaVersion(): Boolean { // when the ext.java8_minUpdateVersion gradle constant changes, so must this check return try { val update = getJavaUpdateVersion(SystemUtils.JAVA_VERSION) // To filter out cases like 1.8.0_202-ea SystemUtils.IS_JAVA_1_8 && update >= 171 } catch (e: NumberFormatException) { // custom JDKs may not have the update version (e.g. 1.8.0-adoptopenjdk) false } } } override val log: Logger get() = staticLog override val transactionVerifierWorkerCount: Int get() = 4 private var internalRpcMessagingClient: InternalRPCMessagingClient? = null private var rpcBroker: ArtemisBroker? = null private var shutdownHook: ShutdownHook? = null // DISCUSSION // // We use a single server thread for now, which means all message handling is serialized. // // Writing thread safe code is hard. In this project we are writing most node services and code to be thread safe, but // the possibility of mistakes is always present. Thus we make a deliberate decision here to trade off some multi-core // scalability in order to gain developer productivity by setting the size of the serverThread pool to one, which will // reduce the number of threading bugs we will need to tackle. // // This leaves us with four possibilities in future: // // (1) We discover that processing messages is fast and that our eventual use cases do not need very high // processing rates. We have benefited from the higher productivity and not lost anything. // // (2) We discover that we need greater multi-core scalability, but that the bulk of our time goes into particular CPU // hotspots that are easily multi-threaded e.g. signature checking. We successfully multi-thread those hotspots // and find that our software now scales sufficiently well to satisfy our user's needs. // // (3) We discover that it wasn't enough, but that we only need to run some messages in parallel and that the bulk of // the work can stay single threaded. For example perhaps we find that latency sensitive UI requests must be handled // on a separate thread pool where long blocking operations are not allowed, but that the bulk of the heavy lifting // can stay single threaded. In this case we would need a separate thread pool, but we still minimise the amount of // thread safe code we need to write and test. // // (4) None of the above are sufficient and we need to run all messages in parallel to get maximum (single machine) // scalability and fully saturate all cores. In that case we can go fully free-threaded, e.g. change the number '1' // below to some multiple of the core count. Alternatively by using the ForkJoinPool and let it figure out the right // number of threads by itself. This will require some investment in stress testing to build confidence that we // haven't made any mistakes, but it will only be necessary if eventual deployment scenarios demand it. // // Note that the messaging subsystem schedules work onto this thread in a blocking manner. That means if the server // thread becomes too slow and a backlog of work starts to builds up it propagates back through into the messaging // layer, which can then react to the backpressure. Artemis MQ in particular knows how to do flow control by paging // messages to disk rather than letting us run out of RAM. // // The primary work done by the server thread is execution of flow logics, and related // serialisation/deserialisation work. override fun makeMessagingService(): MessagingService { return P2PMessagingClient( config = configuration, versionInfo = versionInfo, serverAddress = configuration.messagingServerAddress ?: NetworkHostAndPort("localhost", configuration.p2pAddress.port), nodeExecutor = serverThread, database = database, networkMap = networkMapCache, isDrainingModeOn = nodeProperties.flowsDrainingMode::isEnabled, drainingModeWasChangedEvents = nodeProperties.flowsDrainingMode.values, metricRegistry = metricRegistry, cacheFactory = cacheFactory ) } override fun startMessagingService(rpcOps: RPCOps, nodeInfo: NodeInfo, myNotaryIdentity: PartyAndCertificate?, networkParameters: NetworkParameters) { require(nodeInfo.legalIdentities.size in 1..2) { "Currently nodes must have a primary address and optionally one serviced address" } network as P2PMessagingClient if (System.getProperty("io.netty.allocator.numHeapArenas").isNullOrBlank()) { // Netty arenas are approx 16MB each when max'd out. Set arenas based on memory, not core count, unless memory is abundant. val memBasedArenas = max(Runtime.getRuntime().maxMemory() / 256.MB, 1L) // We set the min of the above and the default. System.setProperty("io.netty.allocator.numHeapArenas", min(memBasedArenas, NettyRuntime.availableProcessors() * 2L).toString()) } // Construct security manager reading users data either from the 'security' config section // if present or from rpcUsers list if the former is missing from config. val securityManagerConfig = configuration.security?.authService ?: SecurityConfiguration.AuthService.fromUsers(configuration.rpcUsers) val securityManager = with(RPCSecurityManagerImpl(securityManagerConfig, cacheFactory)) { if (configuration.shouldStartLocalShell()) RPCSecurityManagerWithAdditionalUser(this, User(INTERNAL_SHELL_USER, INTERNAL_SHELL_USER, setOf(Permissions.all()))) else this } val messageBroker = if (!configuration.messagingServerExternal) { val brokerBindAddress = configuration.messagingServerAddress ?: NetworkHostAndPort("0.0.0.0", configuration.p2pAddress.port) ArtemisMessagingServer(configuration, brokerBindAddress, networkParameters.maxMessageSize) } else { null } val rpcServerAddresses = if (configuration.rpcOptions.standAloneBroker) { BrokerAddresses(configuration.rpcOptions.address, configuration.rpcOptions.adminAddress) } else { startLocalRpcBroker(securityManager) } val bridgeControlListener = makeBridgeControlListener(network.serverAddress, networkParameters) printBasicNodeInfo("Advertised P2P messaging addresses", nodeInfo.addresses.joinToString()) val rpcServerConfiguration = RPCServerConfiguration.DEFAULT rpcServerAddresses?.let { internalRpcMessagingClient = InternalRPCMessagingClient(configuration.p2pSslOptions, it.admin, MAX_RPC_MESSAGE_SIZE, CordaX500Name.build(configuration.p2pSslOptions.keyStore.get()[X509Utilities.CORDA_CLIENT_TLS].subjectX500Principal), rpcServerConfiguration) printBasicNodeInfo("RPC connection address", it.primary.toString()) printBasicNodeInfo("RPC admin connection address", it.admin.toString()) } // Start up the embedded MQ server messageBroker?.apply { closeOnStop() start() } rpcBroker?.apply { closeOnStop() start() } // Start P2P bridge service bridgeControlListener.apply { closeOnStop() start() } // Start up the MQ clients. internalRpcMessagingClient?.run { closeOnStop() init(rpcOps, securityManager, cacheFactory) } network.closeOnStop() network.start( myIdentity = nodeInfo.legalIdentities[0].owningKey, serviceIdentity = if (nodeInfo.legalIdentities.size == 1) null else nodeInfo.legalIdentities[1].owningKey, advertisedAddress = nodeInfo.addresses[0], maxMessageSize = networkParameters.maxMessageSize ) } private fun makeBridgeControlListener(serverAddress: NetworkHostAndPort, networkParameters: NetworkParameters): BridgeControlListener { val artemisMessagingClientFactory = { ArtemisMessagingClient( configuration.p2pSslOptions, serverAddress, networkParameters.maxMessageSize, failoverCallback = { errorAndTerminate("ArtemisMessagingClient failed. Shutting down.", null) } ) } return BridgeControlListener(configuration.p2pSslOptions, networkParameters.maxMessageSize, configuration.crlCheckSoftFail, artemisMessagingClientFactory) } private fun startLocalRpcBroker(securityManager: RPCSecurityManager): BrokerAddresses? { return with(configuration) { rpcOptions.address.let { val rpcBrokerDirectory: Path = baseDirectory / "brokers" / "rpc" with(rpcOptions) { rpcBroker = if (useSsl) { ArtemisRpcBroker.withSsl(configuration.p2pSslOptions, this.address, adminAddress, sslConfig!!, securityManager, MAX_RPC_MESSAGE_SIZE, jmxMonitoringHttpPort != null, rpcBrokerDirectory, shouldStartLocalShell()) } else { ArtemisRpcBroker.withoutSsl(configuration.p2pSslOptions, this.address, adminAddress, securityManager, MAX_RPC_MESSAGE_SIZE, jmxMonitoringHttpPort != null, rpcBrokerDirectory, shouldStartLocalShell()) } } rpcBroker!!.addresses } } } override fun myAddresses(): List<NetworkHostAndPort> = listOf(getAdvertisedAddress()) + configuration.additionalP2PAddresses private fun getAdvertisedAddress(): NetworkHostAndPort { return with(configuration) { require(p2pAddress.host != "0.0.0.0") { "Invalid p2pAddress: $p2pAddress contains 0.0.0.0 which is not suitable as an advertised node address" } val host = if (detectPublicIp) { tryDetectIfNotPublicHost(p2pAddress.host) ?: p2pAddress.host } else { p2pAddress.host } NetworkHostAndPort(host, p2pAddress.port) } } /** * Checks whether the specified [host] is a public IP address or hostname. If not, tries to discover the current * machine's public IP address to be used instead by looking through the network interfaces. */ private fun tryDetectIfNotPublicHost(host: String): String? { return if (host.toLowerCase() == "localhost") { log.warn("p2pAddress specified as localhost. Trying to autodetect a suitable public address to advertise in network map." + "To disable autodetect set detectPublicIp = false in the node.conf, or consider using messagingServerAddress and messagingServerExternal") val foundPublicIP = AddressUtils.tryDetectPublicIP() if (foundPublicIP == null) { try { val retrievedHostName = networkMapClient?.myPublicHostname() if (retrievedHostName != null) { log.info("Retrieved public IP from Network Map Service: $this. This will be used instead of the provided \"$host\" as the advertised address.") } retrievedHostName } catch (ignore: Exception) { // Cannot reach the network map service, ignore the exception and use provided P2P address instead. log.warn("Cannot connect to the network map service for public IP detection.") null } } else { log.info("Detected public IP: ${foundPublicIP.hostAddress}. This will be used instead of the provided \"$host\" as the advertised address.") foundPublicIP.hostAddress } } else { null } } /** * If the node is persisting to an embedded H2 database, then expose this via TCP with a DB URL of the form: * jdbc:h2:tcp://<host>:<port>/node * with username and password as per the DataSource connection details. The key element to enabling this support is to * ensure that you specify a DB connection URL of the form jdbc:h2:file: in the node config and that you include * the H2 option AUTO_SERVER_PORT set to the port you desire to use (0 will give a dynamically allocated port number) * but exclude the H2 option AUTO_SERVER=TRUE. * This is not using the H2 "automatic mixed mode" directly but leans on many of the underpinnings. For more details * on H2 URLs and configuration see: http://www.h2database.com/html/features.html#database_url */ override fun startDatabase() { val databaseUrl = configuration.dataSourceProperties.getProperty("dataSource.url") val h2Prefix = "jdbc:h2:file:" if (databaseUrl != null && databaseUrl.startsWith(h2Prefix)) { val effectiveH2Settings = configuration.effectiveH2Settings //forbid execution of arbitrary code via SQL except those classes required by H2 itself System.setProperty("h2.allowedClasses", "org.h2.mvstore.db.MVTableEngine,org.locationtech.jts.geom.Geometry,org.h2.server.TcpServer") if (effectiveH2Settings?.address != null) { if (!InetAddress.getByName(effectiveH2Settings.address.host).isLoopbackAddress && configuration.dataSourceProperties.getProperty("dataSource.password").isBlank()) { throw CouldNotCreateDataSourceException("Database password is required for H2 server listening on ${InetAddress.getByName(effectiveH2Settings.address.host)}.") } val databaseName = databaseUrl.removePrefix(h2Prefix).substringBefore(';') val baseDir = Paths.get(databaseName).parent.toString() val server = org.h2.tools.Server.createTcpServer( "-tcpPort", effectiveH2Settings.address.port.toString(), "-tcpAllowOthers", "-tcpDaemon", "-baseDir", baseDir, "-key", "node", databaseName) // override interface that createTcpServer listens on (which is always 0.0.0.0) System.setProperty("h2.bindAddress", effectiveH2Settings.address.host) runOnStop += server::stop val url = try { server.start().url } catch (e: JdbcSQLNonTransientConnectionException) { if (e.cause is BindException) { throw AddressBindingException(effectiveH2Settings.address) } else { throw e } } printBasicNodeInfo("Database connection url is", "jdbc:h2:$url/node") } } super.startDatabase() database.closeOnStop() } private val _startupComplete = openFuture<Unit>() val startupComplete: CordaFuture<Unit> get() = _startupComplete override fun generateAndSaveNodeInfo(): NodeInfo { initialiseSerialization() return super.generateAndSaveNodeInfo() } override fun start(): NodeInfo { registerDefaultExceptionHandler() initialiseSerialization() val nodeInfo: NodeInfo = super.start() nodeReadyFuture.thenMatch({ serverThread.execute { registerJmxReporter(services.monitoringService.metrics) _startupComplete.set(Unit) } }, { th -> staticLog.error("Unexpected exception", th) } // XXX: Why not use log? ) shutdownHook = addShutdownHook { stop() } return nodeInfo } /** * Register a default exception handler for all threads that terminates the process if the database connection goes away and * cannot be recovered. */ private fun registerDefaultExceptionHandler() { Thread.setDefaultUncaughtExceptionHandler(DbExceptionHandler(Thread.getDefaultUncaughtExceptionHandler())) } /** * A hook to allow configuration override of the JmxReporter being used. */ fun registerJmxReporter(metrics: MetricRegistry) { log.info("Registering JMX reporter:") when (configuration.jmxReporterType) { JmxReporterType.JOLOKIA -> registerJolokiaReporter(metrics) JmxReporterType.NEW_RELIC -> registerNewRelicReporter(metrics) } } private fun registerJolokiaReporter(registry: MetricRegistry) { log.info("Registering Jolokia JMX reporter:") // Begin exporting our own metrics via JMX. These can be monitored using any agent, e.g. Jolokia: // // https://jolokia.org/agent/jvm.html JmxReporter.forRegistry(registry).inDomain("net.corda").createsObjectNamesWith { _, domain, name -> // Make the JMX hierarchy a bit better organised. val category = name.substringBefore('.').substringBeforeLast('/') val component = name.substringBefore('.').substringAfterLast('/', "") val subName = name.substringAfter('.', "") (if (subName == "") ObjectName("$domain:name=$category${if (component.isNotEmpty()) ",component=$component," else ""}") else ObjectName("$domain:type=$category,${if (component.isNotEmpty()) "component=$component," else ""}name=$subName")) }.build().start() } private fun registerNewRelicReporter(registry: MetricRegistry) { log.info("Registering New Relic JMX Reporter:") val reporter = NewRelicReporter.forRegistry(registry) .name("New Relic Reporter") .filter(MetricFilter.ALL) .attributeFilter(AllEnabledMetricAttributeFilter()) .rateUnit(TimeUnit.SECONDS) .durationUnit(TimeUnit.MILLISECONDS) .metricNamePrefix("corda/") .build() reporter.start(1, TimeUnit.MINUTES) } override val rxIoScheduler: Scheduler get() = Schedulers.io() private fun initialiseSerialization() { if (!initialiseSerialization) return val classloader = cordappLoader.appClassLoader nodeSerializationEnv = SerializationEnvironment.with( SerializationFactoryImpl().apply { registerScheme(AMQPServerSerializationScheme(cordappLoader.cordapps, Caffeine.newBuilder().maximumSize(128).build<SerializationFactoryCacheKey, SerializerFactory>().asMap())) registerScheme(AMQPClientSerializationScheme(cordappLoader.cordapps, Caffeine.newBuilder().maximumSize(128).build<SerializationFactoryCacheKey, SerializerFactory>().asMap())) }, p2pContext = AMQP_P2P_CONTEXT.withClassLoader(classloader), rpcServerContext = AMQP_RPC_SERVER_CONTEXT.withClassLoader(classloader), rpcClientContext = if (configuration.shouldInitCrashShell()) AMQP_RPC_CLIENT_CONTEXT.withClassLoader(classloader) else null, //even Shell embeded in the node connects via RPC to the node storageContext = AMQP_STORAGE_CONTEXT.withClassLoader(classloader), checkpointSerializer = KryoCheckpointSerializer, checkpointContext = KRYO_CHECKPOINT_CONTEXT.withClassLoader(classloader) ) } /** Starts a blocking event loop for message dispatch. */ fun run() { internalRpcMessagingClient?.start(rpcBroker!!.serverControl) (network as P2PMessagingClient).run() } private var shutdown = false override fun stop() { check(!serverThread.isOnThread) synchronized(this) { if (shutdown) return shutdown = true // Unregister shutdown hook to prevent any unnecessary second calls to stop shutdownHook?.cancel() shutdownHook = null } printBasicNodeInfo("Shutting down ...") // All the Node started subsystems were registered with the runOnStop list at creation. // So now simply call the parent to stop everything in reverse order. // In particular this prevents premature shutdown of the Database by AbstractNode whilst the serverThread is active super.stop() shutdown = false log.info("Shutdown complete") } fun <T : FlowLogic<*>> registerInitiatedFlow(smm: StateMachineManager, initiatedFlowClass: Class<T>) { this.flowManager.registerInitiatedFlow(initiatedFlowClass) } } MaxLineLength:Node.kt$Node.Companion$println("You are using a version of Java that is not supported (${SystemUtils.JAVA_VERSION}). Please upgrade to the latest version of Java 8.") - MaxLineLength:Node.kt$Node.Companion${ val update = getJavaUpdateVersion(SystemUtils.JAVA_VERSION) // To filter out cases like 1.8.0_202-ea SystemUtils.IS_JAVA_1_8 && update >= 171 } - MaxLineLength:Node.kt$NodeWithInfo$fun <T : FlowLogic<*>> registerInitiatedFlow(initiatedFlowClass: Class<T>) + MaxLineLength:Node.kt$Node.Companion${ // JDK 11: review naming convention and checking of 'minUpdateVersion' and 'distributionType` (OpenJDK, Oracle, Zulu, AdoptOpenJDK, Cornetto) return try { if (SystemUtils.IS_JAVA_11) return true else { val update = getJavaUpdateVersion(SystemUtils.JAVA_VERSION) // To filter out cases like 1.8.0_202-ea (SystemUtils.IS_JAVA_1_8 && update >= 171) } } catch (e: NumberFormatException) { // custom JDKs may not have the update version (e.g. 1.8.0-adoptopenjdk) false } } MaxLineLength:Node.kt$NodeWithInfo$val services: StartedNodeServices = object : StartedNodeServices, ServiceHubInternal by node.services, FlowStarter by node.flowStarter {} - MaxLineLength:NodeAdder.kt$NodeAdder$?: MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$/** * This caches contract attachment versions by contract class name. For each version, we support one signed and one unsigned attachment, since that is allowed. * * It is correctly invalidated as new attachments are uploaded. */ private val contractsCache = InfrequentlyMutatedCache<ContractClassName, NavigableMap<Version, AttachmentIds>>("NodeAttachmentService_contractAttachmentVersions", cacheFactory) - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$AttachmentSort.AttachmentSortColumn(AttachmentSort.AttachmentSortAttribute.INSERTION_DATE, Sort.Direction.DESC) - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$ContractAttachment - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$HashCheckingStream : FilterInputStream MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$HashMismatchException : CordaRuntimeException MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$log.warn("(Dev Mode) Multiple signed attachments ${signed.map { it.toString() }} for contract $contractClassName version '${it.key}'.") MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$log.warn("Selecting attachment ${unsigned.first()} from duplicated, unsigned attachments ${unsigned.map { it.toString() }} for contract $contractClassName version '${it.key}'.") MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$log.warn("Several versions based on whitelistedContractImplementations position are available: ${versions.toSet()}. $msg") MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$private - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$require(inputStream !is JarInputStream) { "Input stream must not be a JarInputStream" } // Read the file into RAM and then calculate its hash. The attachment must fit into memory. // TODO: Switch to a two-phase insert so we can handle attachments larger than RAM. // To do this we must pipe stream into the database without knowing its hash, which we will learn only once // the insert/upload is complete. We can then query to see if it's a duplicate and if so, erase, and if not // set the hash field of the new attachment record. val bytes = inputStream.readFully() val id = bytes.sha256() if (!hasAttachment(id)) { checkIsAValidJAR(bytes.inputStream()) val jarSigners = getSigners(bytes) val contractVersion = increaseDefaultVersionIfWhitelistedAttachment(contractClassNames, getVersion(bytes), id) val session = currentDBSession() val attachment = NodeAttachmentService.DBAttachment( attId = id.toString(), content = bytes, uploader = uploader, filename = filename, contractClassNames = contractClassNames, signers = jarSigners, version = contractVersion ) session.save(attachment) attachmentCount.inc() log.info("Stored new attachment: id=$id uploader=$uploader filename=$filename") contractClassNames.forEach { contractsCache.invalidate(it) } return@withContractsInJar id } if (isUploaderTrusted(uploader)) { val session = currentDBSession() val attachment = session.get(NodeAttachmentService.DBAttachment::class.java, id.toString()) // update the `uploader` field (as the existing attachment may have been resolved from a peer) if (attachment.uploader != uploader) { attachment.uploader = uploader log.info("Updated attachment $id with uploader $uploader") contractClassNames.forEach { contractsCache.invalidate(it) } loadAttachmentContent(id)?.let { attachmentAndContent -> // TODO: this is racey. ENT-2870 attachmentContentCache.put(id, Optional.of(attachmentAndContent)) attachmentCache.put(id, Optional.of(attachmentAndContent.first)) } return@withContractsInJar id } // If the uploader is the same, throw the exception because the attachment cannot be overridden by the same uploader. } throw DuplicateAttachmentException(id.toString()) - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$val attachmentImpl = AttachmentImpl(id, { attachment.content }, checkAttachmentsOnLoad, attachment.uploader).let { val contracts = attachment.contractClassNames if (contracts != null && contracts.isNotEmpty()) { ContractAttachment.create(it, contracts.first(), contracts.drop(1).toSet(), attachment.uploader, attachment.signers?.toList() ?: emptyList(), attachment.version) } else { it } } - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$val attachmentQueryCriteria = AttachmentQueryCriteria.AttachmentsQueryCriteria(contractClassNamesCondition = Builder.equal(listOf(name)), versionCondition = Builder.greaterThanOrEqual(0), uploaderCondition = Builder.`in`(TRUSTED_UPLOADERS)) - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$val attachmentSort = AttachmentSort(listOf(AttachmentSort.AttachmentSortColumn(AttachmentSort.AttachmentSortAttribute.VERSION, Sort.Direction.DESC), AttachmentSort.AttachmentSortColumn(AttachmentSort.AttachmentSortAttribute.INSERTION_DATE, Sort.Direction.DESC))) - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$val contractVersion = increaseDefaultVersionIfWhitelistedAttachment(contractClassNames, getVersion(bytes), id) MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$val versions = contractClassNames.mapNotNull { servicesForResolution.networkParameters.whitelistedContractImplementations[it]?.indexOf(attachmentId) } .filter { it >= 0 }.map { it + 1 } // +1 as versions starts from 1 not 0 MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService$weigher = Weigher<SecureHash, Optional<Pair<Attachment, ByteArray>>> { key, value -> key.size + if (value.isPresent) value.get().second.size else 0 } - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService${ val session = currentDBSession() val attachment = session.get(NodeAttachmentService.DBAttachment::class.java, id.toString()) // update the `uploader` field (as the existing attachment may have been resolved from a peer) if (attachment.uploader != uploader) { attachment.uploader = uploader log.info("Updated attachment $id with uploader $uploader") contractClassNames.forEach { contractsCache.invalidate(it) } loadAttachmentContent(id)?.let { attachmentAndContent -> // TODO: this is racey. ENT-2870 attachmentContentCache.put(id, Optional.of(attachmentAndContent)) attachmentCache.put(id, Optional.of(attachmentAndContent.first)) } return@withContractsInJar id } // If the uploader is the same, throw the exception because the attachment cannot be overridden by the same uploader. } - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.AttachmentImpl$private - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.AttachmentImpl$return if (checkOnLoad && id is SecureHash.SHA256) HashCheckingStream(id, attachmentData.size, stream) else stream - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.AttachmentImpl.Token$override fun fromToken(context: SerializeAsTokenContext) - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.AttachmentImpl.Token$private - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.Companion$// Just iterate over the entries with verification enabled: should be good enough to catch mistakes. // Note that JarInputStream won't throw any kind of error at all if the file stream is in fact not // a ZIP! It'll just pretend it's an empty archive, which is kind of stupid but that's how it works. // So we have to check to ensure we found at least one item. // // For signed Jars add additional checks to close security holes left by the default jarSigner verifier: // - All entries listed in the Manifest are in the JAR file. // - No extra files in the JAR that were not listed in the Manifest. // Together with the check that all entries need to be signed by the same signers that is performed when the signers are read, // it should close any possibility of foul play. internal fun checkIsAValidJAR(stream: InputStream) - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.Companion$if (manifestHasEntries && !allManifestEntries!!.remove(cursor.name)) extraFilesNotFoundInEntries.add(cursor) - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.Companion$private val PRIVILEGED_UPLOADERS = listOf(DEPLOYED_CORDAPP_UPLOADER, RPC_UPLOADER, P2P_UPLOADER, UNKNOWN_UPLOADER) - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.Companion$require(!('\\' in cursor.name || cursor.name == "." || cursor.name == "..")) { "Bad character in $entryPath" } - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.Companion$throw SecurityException("Signed jar has been tampered with. Files ${allManifestEntries} have been removed.") - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.Companion$throw SecurityException("Signed jar has been tampered with. Files ${extraSignableFiles} have been added to the JAR.") - MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.Companion$val extraSignableFiles = extraFilesNotFoundInEntries.filterNot { JarSignatureCollector.isNotSignable(it) } MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.DBAttachment$( @Id @Column(name = "att_id", nullable = false) var attId: String, @Column(name = "content", nullable = false) @Lob var content: ByteArray, @Column(name = "insertion_date", nullable = false, updatable = false) var insertionDate: Instant = Instant.now(), @Column(name = "uploader", nullable = true) var uploader: String? = null, @Column(name = "filename", updatable = false, nullable = true) var filename: String? = null, @ElementCollection @Column(name = "contract_class_name", nullable = false) @CollectionTable(name = "${NODE_DATABASE_PREFIX}attachments_contracts", joinColumns = [(JoinColumn(name = "att_id", referencedColumnName = "att_id"))], foreignKey = ForeignKey(name = "FK__ctr_class__attachments")) var contractClassNames: List<ContractClassName>? = null, @ElementCollection(targetClass = PublicKey::class, fetch = FetchType.EAGER) @Column(name = "signer", nullable = false) @CollectionTable(name = "${NODE_DATABASE_PREFIX}attachments_signers", joinColumns = [(JoinColumn(name = "att_id", referencedColumnName = "att_id"))], foreignKey = ForeignKey(name = "FK__signers__attachments")) var signers: List<PublicKey>? = null, // Assumption: only Contract Attachments are versioned, version unknown or value for other attachments other than Contract Attachment defaults to 1 @Column(name = "version", nullable = false) var version: Int = DEFAULT_CORDAPP_VERSION ) MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.DBAttachment$@CollectionTable(name = "${NODE_DATABASE_PREFIX}attachments_contracts", joinColumns = [(JoinColumn(name = "att_id", referencedColumnName = "att_id"))], foreignKey = ForeignKey(name = "FK__ctr_class__attachments")) MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.DBAttachment$@CollectionTable(name = "${NODE_DATABASE_PREFIX}attachments_signers", joinColumns = [(JoinColumn(name = "att_id", referencedColumnName = "att_id"))], foreignKey = ForeignKey(name = "FK__signers__attachments")) MaxLineLength:NodeAttachmentService.kt$NodeAttachmentService.HashCheckingStream$private val stream: HashingInputStream = HashingInputStream(Hashing.sha256(), counter) - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$(uploaderCondition("complexB").and(filenamerCondition("archiveB.zip"))).or(filenamerCondition("archiveC.zip")) MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `The strict JAR verification function fails signed JARs with removed or extra files that are valid according to the usual jarsigner`() MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `attachments can be queried by providing a intersection of signers using an EQUAL statement - EQUAL containing a single public key`() MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `attachments can be queried by providing a intersection of signers using an EQUAL statement - EQUAL containing multiple public keys`() - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `can import duplicated contract class and version from signed attachment if an unsigned attachment already exists`() - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `can import duplicated contract class and version from unsigned attachment if a signed attachment already exists`() - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `can import jar with duplicated contract class, version and signers - when one uploader is trusted and other isnt`() - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `can promote to trusted uploader if other trusted attachment already has duplicated contract class, version and signers`() - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$@Test fun `development mode - retrieve latest versions of signed contracts - multiple versions of same version id exist in store`() - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$AttachmentSort(listOf(AttachmentSort.AttachmentSortColumn(AttachmentSort.AttachmentSortAttribute.VERSION))) - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertEquals(listOf(jarAndSigner.second.hash), storage.openAttachment(attachmentId)!!.signerKeys.map { it.hash }) - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertFalse(isAttachmentTrusted(storage.openAttachment(attachmentC)!!, storage), "Contract $attachmentC should not be trusted (no chain of trust)") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertFalse(isAttachmentTrusted(storage.openAttachment(v1Id)!!, storage), "Initial attachment $v1Id should not be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertFalse(isAttachmentTrusted(storage.openAttachment(v1Id)!!, storage), "Initial contract $v1Id should not be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertFalse(isAttachmentTrusted(storage.openAttachment(v2Id)!!, storage), "Other attachment $v2Id should not be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertFalse(isAttachmentTrusted(storage.openAttachment(v2Id)!!, storage), "Upgraded contract $v2Id should not be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertThat((storage.openAttachment(expectedAttachmentId) as ContractAttachment).uploader).isEqualTo(initialUploader) - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertThat((storage.openAttachment(expectedAttachmentId) as ContractAttachment).uploader).isEqualTo(trustedUploader) MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertThatThrownBy { attachment.read { storage.privilegedImportAttachment(it, untrustedUploader, null) } }.isInstanceOf(DuplicateAttachmentException::class.java) - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertTrue(isAttachmentTrusted(storage.openAttachment(attachmentA)!!, storage), "Contract $attachmentA should be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertTrue(isAttachmentTrusted(storage.openAttachment(attachmentB)!!, storage), "Contract $attachmentB should inherit trust") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertTrue(isAttachmentTrusted(storage.openAttachment(attachmentId)!!, storage), "Attachment $attachmentId should be trusted but isn't") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertTrue(isAttachmentTrusted(storage.openAttachment(signedId)!!, storage), "Signed contract $signedId should be trusted but isn't") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertTrue(isAttachmentTrusted(storage.openAttachment(unsignedId)!!, storage), "Unsigned contract $unsignedId should be trusted but isn't") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertTrue(isAttachmentTrusted(storage.openAttachment(v1Id)!!, storage), "Initial attachment $v1Id should be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertTrue(isAttachmentTrusted(storage.openAttachment(v1Id)!!, storage), "Initial attachment $v1Id should not be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertTrue(isAttachmentTrusted(storage.openAttachment(v1Id)!!, storage), "Initial contract $v1Id should be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertTrue(isAttachmentTrusted(storage.openAttachment(v2Id)!!, storage), "Other attachment $v2Id should be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$assertTrue(isAttachmentTrusted(storage.openAttachment(v2Id)!!, storage), "Upgraded contract $v2Id should be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$contractClassNamesCondition = Builder.equal(listOf("com.example.MyContract", "com.example.AnotherContract")) - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$contractJarV2.read { attachmentIdV2Unsigned = storage.privilegedImportAttachment(it, "app", "contract-V2.jar") } MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$fun filenameSort(direction: Sort.Direction) - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$signedContractJar.read { attachmentIdV1Signed = storage.privilegedImportAttachment(it, "app", "contract-signed.jar") } MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$signedContractJarSameVersion.read { attachmentIdSameVersionLatest = devModeStorage.privilegedImportAttachment(it, "app", "contract-signed-same-version.jar") } - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$signedContractJarV2.read { attachmentIdV2Signed = storage.privilegedImportAttachment(it, "app", "contract-signed-V2.jar") } MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$storage.queryAttachments(AttachmentsQueryCriteria(contractClassNamesCondition = Builder.equal(listOf("com.example.MyContract")))).size - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$storage.queryAttachments(AttachmentsQueryCriteria(signersCondition = Builder.equal(listOf(publicKey)))).size MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val (signedContractJarSameVersion, _) = makeTestSignedContractJar(file.path,"com.example.MyContract", versionSeed = Random().nextInt()) - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val alias = "testAlias" val password = "testPassword" // Directly use the ContractJarTestUtils version of makeTestJar to ensure jars are created in the right place, in order to sign // them. var counter = 0 val jarV1 = file.path / "$counter.jar" ContractJarTestUtils.makeTestJar(jarV1.outputStream()) counter++ val jarV2 = file.path / "$counter.jar" // Ensure that the first and second jars do not have the same hash ContractJarTestUtils.makeTestJar(jarV2.outputStream(), entries = listOf(Pair("foo", "bar"))) file.path.generateKey(alias, password) val key1 = file.path.signJar(jarV1.toAbsolutePath().toString(), alias, password) val key2 = file.path.signJar(jarV2.toAbsolutePath().toString(), alias, password) val v1Id = jarV1.read { storage.privilegedImportAttachment(it, "app", "dummy-attachment.jar") } val v2Id = jarV2.read { storage.privilegedImportAttachment(it, "untrusted", "dummy-attachment-2.jar") } // Sanity check. assertEquals(key1, key2, "Different public keys used to sign jars") assertTrue(isAttachmentTrusted(storage.openAttachment(v1Id)!!, storage), "Initial attachment $v1Id should be trusted") assertTrue(isAttachmentTrusted(storage.openAttachment(v2Id)!!, storage), "Other attachment $v2Id should be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val alias = "testAlias" val password = "testPassword" // Directly use the ContractJarTestUtils version of makeTestJar to ensure jars are created in the right place, in order to sign // them. var counter = 0 val jarV1 = file.path / "$counter.jar" ContractJarTestUtils.makeTestJar(jarV1.outputStream()) counter++ val jarV2 = file.path / "$counter.jar" // Ensure that the first and second jars do not have the same hash ContractJarTestUtils.makeTestJar(jarV2.outputStream(), entries = listOf(Pair("foo", "bar"))) file.path.generateKey(alias, password) val key1 = file.path.signJar(jarV1.toAbsolutePath().toString(), alias, password) val key2 = file.path.signJar(jarV2.toAbsolutePath().toString(), alias, password) val v1Id = jarV1.read { storage.privilegedImportAttachment(it, "untrusted", "dummy-attachment.jar") } val v2Id = jarV2.read { storage.privilegedImportAttachment(it, "untrusted", "dummy-attachment-2.jar") } // Sanity check. assertEquals(key1, key2, "Different public keys used to sign jars") assertFalse(isAttachmentTrusted(storage.openAttachment(v1Id)!!, storage), "Initial attachment $v1Id should not be trusted") assertFalse(isAttachmentTrusted(storage.openAttachment(v2Id)!!, storage), "Other attachment $v2Id should not be trusted") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val anotherAttachmentId = anotherContractJar.read { storage.privilegedImportAttachment(it, "app", "another-sample.jar") } MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val anotherContractJar = makeTestContractJar(file.path, listOf( "com.example.MyContract", "com.example.AnotherContract"), generateManifest = false, jarFileName = "another-sample.jar") MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val anotherContractJar = makeTestContractJar(file.path, listOf( "com.example.MyContract", "com.example.AnotherContract"), true, generateManifest = false, jarFileName = "another-sample.jar") - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val attachmentB = jarSignedByAB.read { storage.privilegedImportAttachment(it, "untrusted", "dummy-contract.jar") } - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val attachmentC = jarSignedByBC.read { storage.privilegedImportAttachment(it, "untrusted", "dummy-contract.jar") } MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val attachments = storage.queryAttachments(AttachmentsQueryCriteria(contractClassNamesCondition = Builder.equal(listOf("com.example.MyContract")))) MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val corruptAttachment = NodeAttachmentService.DBAttachment(attId = id.toString(), content = bytes, version = DEFAULT_CORDAPP_VERSION) - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val overriddenAttachmentId = attachment.read { storage.privilegedImportAttachment(it, trustedUploader, null) } - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val reimportedAttachmentId = contractJar.read { storage.privilegedImportAttachment(it, "app", "sample.jar") } - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val signedAttachments = storage.queryAttachments(AttachmentsQueryCriteria(isSignedCondition = Builder.equal(true))) - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest$val unsignedAttachments = storage.queryAttachments(AttachmentsQueryCriteria(isSignedCondition = Builder.equal(false))) - MaxLineLength:NodeAttachmentServiceTest.kt$NodeAttachmentServiceTest.FetchAttachmentsFlow$serviceHub.attachments.importAttachment(baos.toByteArray().inputStream(), "$P2P_UPLOADER:${ourIdentity.name}", null) MaxLineLength:NodeBasedTest.kt$InProcessNode : Node MaxLineLength:NodeBasedTest.kt$InProcessNode$assertFalse(isInvalidJavaVersion(), "You are using a version of Java that is not supported (${SystemUtils.JAVA_VERSION}). Please upgrade to the latest version of Java 8.") - MaxLineLength:NodeBasedTest.kt$NodeBasedTest - MaxLineLength:NodeBasedTest.kt$NodeBasedTest$@JvmOverloads constructor(private val cordappPackages: List<String> = emptyList(), private val notaries: List<CordaX500Name> = emptyList()) - MaxLineLength:NodeBasedTest.kt$NodeBasedTest$val customCordapps = cordappsForPackages(getCallerPackage(NodeBasedTest::class)?.let { cordappPackages + it } ?: cordappPackages) - MaxLineLength:NodeBasedTest.kt$NodeBasedTest$val node = InProcessNode(parsedConfig, MOCK_VERSION_INFO.copy(platformVersion = platformVersion), flowManager = flowManager) - MaxLineLength:NodeBuilder.kt$NodeBuilder$localDockerClient.buildImageCmd() .withDockerfile(File(nodeDir, "Dockerfile")) .withBaseDirectory(nodeDir) MaxLineLength:NodeBuilder.kt$NodeBuilder.<no name provided>$future.completeExceptionally(IllegalStateException("Could not build image for: $nodeDir, reason: ${result?.errorDetail}")) - MaxLineLength:NodeBuilder.kt$NodeBuilder.<no name provided>$val config = nodeConfig.parseAsNodeConfigWithFallback(ConfigFactory.parseFile(copiedNode.configFile)).value() - MaxLineLength:NodeBuilder.kt$fun Config.parseAsNodeConfigWithFallback(preCopyConfig: Config): Validated<NodeConfiguration, Configuration.Validation.Error> - MaxLineLength:NodeCmdLineOptions.kt$InitialRegistrationCmdLineOptions$"Cannot perform initial registration when 'devMode' is true, unless 'devModeOptions.allowCompatibilityZone' is also true." - MaxLineLength:NodeCmdLineOptions.kt$InitialRegistrationCmdLineOptions$"compatibilityZoneURL or networkServices must be present in the node configuration file in registration mode." - MaxLineLength:NodeCmdLineOptions.kt$NodeCmdLineOptions$"compatibilityZoneURL or networkServices must be present in the node configuration file in registration mode." - MaxLineLength:NodeCmdLineOptions.kt$NodeCmdLineOptions$description = ["DEPRECATED. Clears local copy of network map, on node startup it will be restored from server or file system."] MaxLineLength:NodeCmdLineOptions.kt$NodeCmdLineOptions$description = ["DEPRECATED. Performs the node start-up tasks necessary to generate the nodeInfo file, saves it to disk, then exits."] MaxLineLength:NodeCmdLineOptions.kt$NodeCmdLineOptions$description = ["DEPRECATED. Starts initial node registration with Corda network to obtain certificate from the permissioning server."] - MaxLineLength:NodeCmdLineOptions.kt$NodeCmdLineOptions$valid(ConfigHelper.loadConfig(baseDirectory, configFile, configOverrides = ConfigFactory.parseMap(configOverrides))) - MaxLineLength:NodeConfig.kt$NodeConfig$@VisibleForTesting internal MaxLineLength:NodeConfig.kt$NodeConfig$return NodeConfigurationData(myLegalName, p2pAddress, this.rpcSettings.address, notary, h2port, rpcUsers, useTestClock, detectPublicIp, devMode) .toConfig() .withoutPath("rpcAddress") .withoutPath("rpcAdminAddress") .withValue("rpcSettings", rpcSettings) - MaxLineLength:NodeConfiguration.kt$CertChainPolicyConfig$@Deprecated("Do not use") data MaxLineLength:NodeConfiguration.kt$DevModeOptions$data - MaxLineLength:NodeConfiguration.kt$NetworkParameterAcceptanceSettings - MaxLineLength:NodeConfiguration.kt$NodeConfiguration$@Deprecated(message = "Use of single compatibility zone URL is deprecated", replaceWith = ReplaceWith("networkServices.networkMapURL")) - MaxLineLength:NodeConfiguration.kt$NodeConfiguration$val flowMonitorSuspensionLoggingThresholdMillis: Duration get() = DEFAULT_FLOW_MONITOR_SUSPENSION_LOGGING_THRESHOLD_MILLIS MaxLineLength:NodeConfiguration.kt$SecurityConfiguration.AuthService.DataSource$AuthDataSourceType.DB -> require(users == null && connection != null) { "Database-backed authentication must not specify a user list, and must configure a database" } MaxLineLength:NodeConfiguration.kt$SecurityConfiguration.AuthService.DataSource$AuthDataSourceType.INMEMORY -> require(users != null && connection == null) { "In-memory authentication must specify a user list, and must not configure a database" } MaxLineLength:NodeConfiguration.kt$fun Config.parseAsNodeConfiguration(options: Configuration.Validation.Options = Configuration.Validation.Options(strict = true)): Valid<NodeConfiguration> MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$// TODO: There are two implications here: // 1. "signingCertificateStore" and "p2pKeyStore" have the same passwords. In the future we should re-visit this "rule" and see of they can be made different; // 2. The passwords for store and for keys in this store are the same, this is due to limitations of Artemis. override val signingCertificateStore = FileBasedCertificateStoreSupplier(signingCertificateStorePath, keyStorePassword, keyStorePassword) - MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$@Suppress("DEPRECATION") @Deprecated("Do not configure") override MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$logger - MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$logger.warn("Top-level declaration of property 'rpcAddress' is deprecated. Please use 'rpcSettings.address' instead.") MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$override - MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$override val flowMonitorSuspensionLoggingThresholdMillis: Duration = Defaults.flowMonitorSuspensionLoggingThresholdMillis - MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$override val networkParameterAcceptanceSettings: NetworkParameterAcceptanceSettings = Defaults.networkParameterAcceptanceSettings - MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$private val p2pTrustStore = FileBasedCertificateStoreSupplier(p2pTrustStoreFilePath, trustStorePassword, trustStorePassword) - MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$require(h2port == null || h2Settings == null) { "Cannot specify both 'h2port' and 'h2Settings' in configuration" } MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$require(rpcSettings.address == null) { "Can't provide top-level rpcAddress and rpcSettings.address (they control the same property)." } MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$return listOf("cannot specify 'compatibilityZoneURL' when 'devMode' is true, unless 'devModeOptions.allowCompatibilityZone' is also true") MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl$return listOf("cannot specify 'networkServices' when 'devMode' is true, unless 'devModeOptions.allowCompatibilityZone' is also true") - MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl.Defaults$initialiseAppSchema = if(devMode) SchemaInitializationType.UPDATE else SchemaInitializationType.VALIDATE MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl.Defaults$val flowMonitorSuspensionLoggingThresholdMillis: Duration = NodeConfiguration.DEFAULT_FLOW_MONITOR_SUSPENSION_LOGGING_THRESHOLD_MILLIS - MaxLineLength:NodeConfigurationImpl.kt$NodeConfigurationImpl.Defaults$val networkParameterAcceptanceSettings: NetworkParameterAcceptanceSettings = NetworkParameterAcceptanceSettings() MaxLineLength:NodeConfigurationImpl.kt$NodeRpcSettings.<no name provided>$return "address: $address, adminAddress: $adminAddress, standAloneBroker: $standAloneBroker, useSsl: $useSsl, sslConfig: $sslConfig" - MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$@Test fun `validation succeeds when compatibilityZoneURL is present and devMode is true and allowCompatibilityZoneURL is set`() - MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertEquals(listOf(baseDirPath / "./myCorDapps1", baseDirPath / "./myCorDapps2"), nodeConfiguration.value().cordappDirectories) MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertFalse(getConfig("test-config-DevMode.conf", ConfigFactory.parseMap(mapOf("devMode" to false))).getBooleanCaseInsensitive("devMode")) MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertFalse(getConfig("test-config-empty.conf", ConfigFactory.parseMap(mapOf("devMode" to false))).getBooleanCaseInsensitive("devMode")) MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertFalse(getConfig("test-config-noDevMode.conf", ConfigFactory.parseMap(mapOf("devMode" to false))).getBooleanCaseInsensitive("devMode")) MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertThat(config.errors.asSequence().map(Configuration.Validation.Error::message).filter { it.contains("rpcSettings.adminAddress") }.toList()).isNotEmpty - MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertThat(errors).hasOnlyOneElementSatisfying { error -> error.contains("compatibilityZoneURL") && error.contains("devMode") } - MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertThat(errors).hasOnlyOneElementSatisfying { error -> error.contains("networkServices") && error.contains("devMode") } MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertThat(rawConfig.parseAsNodeConfiguration().errors.single()) - MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertThatThrownBy { configDebugOptions(false, debugOptions) }.hasMessageMatching("Cannot use devModeOptions outside of dev mode") MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertTrue(getConfig("test-config-DevMode.conf", ConfigFactory.parseMap(mapOf("devMode" to true))).getBooleanCaseInsensitive("devMode")) MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertTrue(getConfig("test-config-empty.conf", ConfigFactory.parseMap(mapOf("devMode" to true))).getBooleanCaseInsensitive("devMode")) MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$assertTrue(getConfig("test-config-noDevMode.conf", ConfigFactory.parseMap(mapOf("devMode" to true))).getBooleanCaseInsensitive("devMode")) MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$private MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$return testConfiguration.copy(tlsCertCrlDistPoint = tlsCertCrlDistPoint, tlsCertCrlIssuer = tlsCertCrlIssuer?.let { X500Principal(it) }, crlCheckSoftFail = crlCheckSoftFail) MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$val configValidationResult = configTlsCertCrlOptions(null, "C=US, L=New York, OU=Corda, O=R3 HoldCo LLC, CN=Corda Root CA").validate() - MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$val rawConfig = ConfigFactory.parseResources("working-config.conf", ConfigParseOptions.defaults().setAllowMissing(false)) - MaxLineLength:NodeConfigurationImplTest.kt$NodeConfigurationImplTest$var rawConfig = ConfigFactory.parseResources("working-config.conf", ConfigParseOptions.defaults().setAllowMissing(false)) MaxLineLength:NodeConnection.kt$NodeConnection : Closeable - MaxLineLength:NodeConnection.kt$NodeConnection$fun clearDb() MaxLineLength:NodeConnection.kt$NodeConnection$return runShellCommandGetOutput("sudo netstat -tlpn | grep ${remoteNode.rpcPort} | awk '{print $7}' | grep -oE '[0-9]+'").getResultOrThrow().replace("\n", "") - MaxLineLength:NodeConnection.kt$NodeConnection$runShellCommandGetOutput("until sudo netstat -tlpn | grep ${remoteNode.rpcPort} > /dev/null ; do sleep 1 ; done") - MaxLineLength:NodeConnection.kt$NodeConnection$val proxy: CordaRPCOps get() = rpcConnection?.proxy ?: throw IllegalStateException("proxy requested, but the client is not running") - MaxLineLength:NodeConnection.kt$NodeConnection.ShellCommandOutput$data MaxLineLength:NodeController.kt$NodeController$(cordappConfigDir / "${CordappController.FINANCE_WORKFLOWS_CORDAPP_FILENAME}.conf").writeText(config.nodeConfig.toFinanceConfText()) - MaxLineLength:NodeController.kt$NodeController$issuableCurrencies = nodeData.extraServices.filterIsInstance<CurrencyIssuer>().map { it.currency.toString() } - MaxLineLength:NodeController.kt$NodeController$require((config.nodeConfig.notary != null).xor(notaryIdentity != null)) { "There must be exactly one notary in the network" } MaxLineLength:NodeController.kt$NodeController$val nextPort = 1 + arrayOf(config.p2pAddress.port, config.rpcSettings.address.port, config.webAddress.port, config.h2port).max() as Int - MaxLineLength:NodeData.kt$SuggestedDetails$( // Mike: Rome? Why Rome? // Roger: Notaries public (also called "notaries", "notarial officers", or "public notaries") hold an office // which can trace its origins back to the ancient Roman Republic, when they were called scribae ("scribes"), // tabelliones forenses, or personae publicae.[4] // Mike: Can't argue with that. It's even got a citation. "Notary" to "Rome", "Bank of Breakfast Tea" to "Liverpool", "Bank of Big Apples" to "New York", "Bank of Baguettes" to "Paris", "Bank of Fondue" to "Geneve", "Bank of Maple Syrup" to "Toronto", "Bank of Golden Gates" to "San Francisco" ) MaxLineLength:NodeFlowManagerTest.kt$NodeFlowManagerTest$val nodeFlowManager = NodeFlowManager(FlowOverrideConfig(listOf(FlowOverride(Init::class.qualifiedName!!, Resp::class.qualifiedName!!)))) - MaxLineLength:NodeInfo.kt$NodeInfo MaxLineLength:NodeInfo.kt$NodeInfoSigner$@Option(names = ["--address"], paramLabel = "host:port", description = ["Public address of node"], converter = [NetworkHostAndPortConverter::class]) - MaxLineLength:NodeInfo.kt$NodeInfoSigner$@Option(names = ["--platform-version"], paramLabel = "int", description = ["Platform version that this node supports"]) - MaxLineLength:NodeInfo.kt$NodeInfoSigner$require(keyStorePath != null && keyAlias != null) { "The --keystore and --keyalias parameters must be specified" } - MaxLineLength:NodeInfo.kt$NodeInfoSigner.AMQPInspectorSerializationScheme$override - MaxLineLength:NodeInfoFilesCopier.kt$NodeInfoFilesCopier$atomicCopy(previouslySeenFile, newNodeFile.additionalNodeInfoDirectory.resolve(previouslySeenFile.fileName)) - MaxLineLength:NodeInfoFilesCopier.kt$NodeInfoFilesCopier$for (destination in this.values.filter { it.nodeDir != nodeData.nodeDir }.map { it.additionalNodeInfoDirectory }) { val fullDestinationPath = destination.resolve(path.fileName) atomicCopy(path, fullDestinationPath) } - MaxLineLength:NodeInfoFilesCopier.kt$NodeInfoFilesCopier$private fun allPreviouslySeenFiles() MaxLineLength:NodeInfoSchema.kt$NodeInfoSchemaV1$mappedTypes = listOf(PersistentNodeInfo::class.java, DBPartyAndCertificate::class.java, DBHostAndPort::class.java, NodePropertiesPersistentStore.DBNodeProperty::class.java) - MaxLineLength:NodeInfoSchema.kt$NodeInfoSchemaV1.DBPartyAndCertificate$@ManyToMany(mappedBy = "legalIdentitiesAndCerts", cascade = [(CascadeType.ALL)]) MaxLineLength:NodeInfoSchema.kt$NodeInfoSchemaV1.PersistentNodeInfo$(this.legalIdentitiesAndCerts.filter { it.isMain } + this.legalIdentitiesAndCerts.filter { !it.isMain }).map { it.toLegalIdentityAndCert() } - MaxLineLength:NodeInfoSchema.kt$NodeInfoSchemaV1.PersistentNodeInfo$inverseJoinColumns = [(JoinColumn(name = "party_name", foreignKey = ForeignKey(name = "FK__link_ni_p__info_p_cert")))] - MaxLineLength:NodeInfoSchema.kt$NodeInfoSchemaV1.PersistentNodeInfo$joinColumns = [(JoinColumn(name = "node_info_id", foreignKey = ForeignKey(name = "FK__link_nodeinfo_party__infos")))] - MaxLineLength:NodeInfoWatcher.kt$NodeInfoWatcher$ fun nodeInfoUpdates(): Observable<List<NodeInfoUpdate>> - MaxLineLength:NodeInfoWatcher.kt$NodeInfoWatcher$nodeInfoFilesMap[file] = NodeInfoFromFile(nodeInfoSigned.signed.raw.hash, file.lastModifiedTime()) - MaxLineLength:NodeInfoWatcher.kt$NodeInfoWatcher$val newOrChangedFile = previousLastModifiedTime == null || lastModifiedTime > previousLastModifiedTime - MaxLineLength:NodeInfoWatcher.kt$NodeInfoWatcher.Companion${ // By using the hash of the node's first name we ensure: // 1) node info files for the same node map to the same filename and thus avoid having duplicate files for // the same node // 2) avoid having to deal with characters in the X.500 name which are incompatible with the local filesystem val fileNameHash = nodeInfoAndSigned.nodeInfo.legalIdentities[0].name.serialize().hash nodeInfoAndSigned .signed .serialize() .open() .copyTo(path / "${NodeInfoFilesCopier.NODE_INFO_FILE_NAME_PREFIX}$fileNameHash", REPLACE_EXISTING) } - MaxLineLength:NodeInfoWatcherTest.kt$NodeInfoWatcherTest$keyManagementService = MockKeyManagementService(identityService, pkToIdCache = MockPublicKeyToOwningIdentityCache()) - MaxLineLength:NodeInfoWatcherTest.kt$NodeInfoWatcherTest$val nodeInfoFiles = tempFolder.root.list().filter { it.startsWith(NodeInfoFilesCopier.NODE_INFO_FILE_NAME_PREFIX) } - MaxLineLength:NodeInstanceRequest.kt$NodeInstanceRequest$localImageId MaxLineLength:NodeInstanceRequest.kt$NodeInstanceRequest$return "NodeInstanceRequest(nodeInstanceName='$nodeInstanceName', actualX500='$actualX500', expectedFqName='$expectedFqName') ${super.toString()}" - MaxLineLength:NodeInstantiator.kt$NodeInstantiator$return instantiateNodeInstance(request.remoteImageName, request.instanceName, request.fqdn, request.instanceX500).thenApplyAsync { InstanceInfo(request.groupName, request.instanceName, request.fqdn, it.first, it.second) } - MaxLineLength:NodeInstantiator.kt$NodeInstantiator$return instantiateNodeInstance(request.remoteImageName, request.nodeInstanceName, request.expectedFqName, request.actualX500) .thenApplyAsync { (reachableName, portMapping) -> request.toNodeInstance(reachableName, portMapping) } - MaxLineLength:NodeInterestRates.kt$NodeInterestRates.Oracle$// TODO There is security problem with that. What if transaction contains several commands of the same type, but // Oracle gets signing request for only some of them with a valid partial tree? We sign over a whole transaction. // It will be fixed by adding partial signatures later. // DOCSTART 1 fun sign(ftx: FilteredTransaction): TransactionSignature MaxLineLength:NodeInterestRates.kt$NodeInterestRates.Oracle$knownFixes = parseFile(IOUtils.toString(this::class.java.classLoader.getResourceAsStream("net/corda/irs/simulation/example.rates.txt"), Charsets.UTF_8.name())) - MaxLineLength:NodeInterestRatesTest.kt$NodeInterestRatesTest$TransactionState(1000.DOLLARS.CASH issuedBy dummyCashIssuer.party ownedBy ALICE, Cash.PROGRAM_ID, DUMMY_NOTARY) MaxLineLength:NodeInterestRatesTest.kt$NodeInterestRatesTest$assertFailsWith<IllegalArgumentException> { oracle.sign(ftx) } - MaxLineLength:NodeInterestRatesTest.kt$NodeInterestRatesTest$private val services = MockServices(listOf("net.corda.finance.contracts.asset"), dummyCashIssuer, rigorousMock(), MEGA_CORP_KEY) MaxLineLength:NodeKeystoreCheckTest.kt$NodeKeystoreCheckTest$setPrivateKey(X509Utilities.CORDA_CLIENT_CA, nodeCA.keyPair.private, listOf(badNodeCACert, badRoot), signingCertStore.entryPassword) MaxLineLength:NodeKeystoreCheckTest.kt$NodeKeystoreCheckTest$val badNodeCACert = X509Utilities.createCertificate(CertificateType.NODE_CA, badRoot, badRootKeyPair, ALICE_NAME.x500Principal, nodeCA.keyPair.public) - MaxLineLength:NodeKeystoreCheckTest.kt$NodeKeystoreCheckTest$val badRoot = X509Utilities.createSelfSignedCACertificate(X500Principal("O=Bad Root,L=Lodnon,C=GB"), badRootKeyPair) MaxLineLength:NodeKeystoreCheckTest.kt$NodeKeystoreCheckTest$val p2pSslConfig = CertificateStoreStubs.P2P.withCertificatesDirectory(certificatesDirectory, keyStorePassword = keystorePassword, trustStorePassword = keystorePassword) - MaxLineLength:NodeKeystoreCheckTest.kt$NodeKeystoreCheckTest$val signingCertStore = CertificateStoreStubs.Signing.withCertificatesDirectory(certificatesDirectory, keystorePassword) - MaxLineLength:NodeMonitorModel.kt$NodeMonitorModel$futureProgressTrackerUpdates.startWith(currentProgressTrackerUpdates).flatMap { it }.retry().subscribe(progressTrackingSubject) - MaxLineLength:NodeMonitorModel.kt$NodeMonitorModel$val (statesSnapshot, vaultUpdates) = rpc.vaultTrackBy<ContractState>(QueryCriteria.VaultQueryCriteria(Vault.StateStatus.ALL), PageSpecification(DEFAULT_PAGE_NUM, MAX_PAGE_SIZE)) - MaxLineLength:NodeMonitorModel.kt$NodeMonitorModel$val stateMachineTransactionMapping: Observable<StateMachineTransactionMapping> = stateMachineTransactionMappingSubject - MaxLineLength:NodeMonitorModel.kt$NodeMonitorModel${ rpc = ReconnectingCordaRPCOps(nodeHostAndPort, username, password) proxyObservable.value = rpc // Vault snapshot (force single page load with MAX_PAGE_SIZE) + updates val (statesSnapshot, vaultUpdates) = rpc.vaultTrackBy<ContractState>(QueryCriteria.VaultQueryCriteria(Vault.StateStatus.ALL), PageSpecification(DEFAULT_PAGE_NUM, MAX_PAGE_SIZE)) val unconsumedStates = statesSnapshot.states.filterIndexed { index, _ -> statesSnapshot.statesMetadata[index].status == Vault.StateStatus.UNCONSUMED }.toSet() val consumedStates = statesSnapshot.states.toSet() - unconsumedStates val initialVaultUpdate = Vault.Update(consumedStates, unconsumedStates, references = emptySet()) vaultUpdates.startWith(initialVaultUpdate).subscribe(vaultUpdatesSubject::onNext) // Transactions val (transactions, newTransactions) = rpc.internalVerifiedTransactionsFeed() newTransactions.startWith(transactions).subscribe(transactionsSubject::onNext) // SM -> TX mapping val (smTxMappings, futureSmTxMappings) = rpc.stateMachineRecordedTransactionMappingFeed() futureSmTxMappings.startWith(smTxMappings).subscribe(stateMachineTransactionMappingSubject::onNext) // Parties on network val (parties, futurePartyUpdate) = rpc.networkMapFeed() futurePartyUpdate.startWith(parties.map(MapChange::Added)).subscribe(networkMapSubject::onNext) val stateMachines = rpc.stateMachinesSnapshot() notaryIdentities = rpc.notaryIdentities() // Extract the flow tracking stream // TODO is there a nicer way of doing this? Stream of streams in general results in code like this... // TODO `progressTrackingSubject` doesn't seem to be used anymore - should it be removed? val currentProgressTrackerUpdates = stateMachines.mapNotNull { stateMachine -> ProgressTrackingEvent.createStreamFromStateMachineInfo(stateMachine) } val futureProgressTrackerUpdates = stateMachineUpdatesSubject.map { stateMachineUpdate -> if (stateMachineUpdate is StateMachineUpdate.Added) { ProgressTrackingEvent.createStreamFromStateMachineInfo(stateMachineUpdate.stateMachineInfo) ?: Observable.empty<ProgressTrackingEvent>() } else { Observable.empty<ProgressTrackingEvent>() } } // We need to retry, because when flow errors, we unsubscribe from progressTrackingSubject. So we end up with stream of state machine updates and no progress trackers. futureProgressTrackerUpdates.startWith(currentProgressTrackerUpdates).flatMap { it }.retry().subscribe(progressTrackingSubject) } - MaxLineLength:NodeMonitorModel.kt$ProgressTrackingEvent.Companion$future.map { ProgressTrackingEvent(stateMachine.id, it) }.startWith(ProgressTrackingEvent(stateMachine.id, current)) - MaxLineLength:NodeNamedCache.kt$DefaultNamedCacheFactory$name == "HibernateConfiguration_sessionFactories" -> caffeine.maximumSize(database.mappedSchemaCacheSize) - MaxLineLength:NodeNamedCache.kt$DefaultNamedCacheFactory$name == "NodeAttachmentService_attachmentContent" -> caffeine.maximumWeight(attachmentContentCacheSizeBytes) + MaxLineLength:NodeMonitorModel.kt$NodeMonitorModel${ rpc = ReconnectingCordaRPCOps(nodeHostAndPort, username, password, CordaRPCClientConfiguration.DEFAULT) proxyObservable.value = rpc // Vault snapshot (force single page load with MAX_PAGE_SIZE) + updates val (statesSnapshot, vaultUpdates) = rpc.vaultTrackBy<ContractState>(QueryCriteria.VaultQueryCriteria(Vault.StateStatus.ALL), PageSpecification(DEFAULT_PAGE_NUM, MAX_PAGE_SIZE)) val unconsumedStates = statesSnapshot.states.filterIndexed { index, _ -> statesSnapshot.statesMetadata[index].status == Vault.StateStatus.UNCONSUMED }.toSet() val consumedStates = statesSnapshot.states.toSet() - unconsumedStates val initialVaultUpdate = Vault.Update(consumedStates, unconsumedStates, references = emptySet()) vaultUpdates.startWith(initialVaultUpdate).subscribe(vaultUpdatesSubject::onNext) // Transactions val (transactions, newTransactions) = @Suppress("DEPRECATION") rpc.internalVerifiedTransactionsFeed() newTransactions.startWith(transactions).subscribe(transactionsSubject::onNext) // SM -> TX mapping val (smTxMappings, futureSmTxMappings) = rpc.stateMachineRecordedTransactionMappingFeed() futureSmTxMappings.startWith(smTxMappings).subscribe(stateMachineTransactionMappingSubject::onNext) // Parties on network val (parties, futurePartyUpdate) = rpc.networkMapFeed() futurePartyUpdate.startWith(parties.map(MapChange::Added)).subscribe(networkMapSubject::onNext) val stateMachines = rpc.stateMachinesSnapshot() notaryIdentities = rpc.notaryIdentities() // Extract the flow tracking stream // TODO is there a nicer way of doing this? Stream of streams in general results in code like this... // TODO `progressTrackingSubject` doesn't seem to be used anymore - should it be removed? val currentProgressTrackerUpdates = stateMachines.mapNotNull { stateMachine -> ProgressTrackingEvent.createStreamFromStateMachineInfo(stateMachine) } val futureProgressTrackerUpdates = stateMachineUpdatesSubject.map { stateMachineUpdate -> if (stateMachineUpdate is StateMachineUpdate.Added) { ProgressTrackingEvent.createStreamFromStateMachineInfo(stateMachineUpdate.stateMachineInfo) ?: Observable.empty<ProgressTrackingEvent>() } else { Observable.empty<ProgressTrackingEvent>() } } // We need to retry, because when flow errors, we unsubscribe from progressTrackingSubject. So we end up with stream of state machine updates and no progress trackers. futureProgressTrackerUpdates.startWith(currentProgressTrackerUpdates).flatMap { it }.retry().subscribe(progressTrackingSubject) } MaxLineLength:NodeNamedCache.kt$DefaultNamedCacheFactory$name.startsWith("RPCSecurityManagerShiroCache_") -> with(security?.authService?.options?.cache!!) { caffeine.maximumSize(maxEntries).expireAfterWrite(expireAfterSecs, TimeUnit.SECONDS) } MaxLineLength:NodeNamedCache.kt$DefaultNamedCacheFactory$open - MaxLineLength:NodeNamedCache.kt$DefaultNamedCacheFactory$override MaxLineLength:NodeNamedCache.kt$DefaultNamedCacheFactory$override fun bindWithConfig(nodeConfiguration: NodeConfiguration): BindableNamedCacheFactory MaxLineLength:NodeNamedCache.kt$DefaultNamedCacheFactory$override fun bindWithMetrics(metricRegistry: MetricRegistry): BindableNamedCacheFactory MaxLineLength:NodeParameters.kt$NodeParameters - MaxLineLength:NodeParameters.kt$NodeParameters$/** * Create a new node parameters object with default values. Each parameter can be specified with its wither method which returns a copy * with that value. */ constructor() : this(providedName = null) - MaxLineLength:NodeParameters.kt$NodeParameters$fun withAdditionalCordapps(additionalCordapps: Set<TestCordapp>): NodeParameters - MaxLineLength:NodeParameters.kt$NodeParameters$fun withCustomOverrides(customOverrides: Map<String, Any?>): NodeParameters MaxLineLength:NodeParameters.kt$NodeParameters$fun withFlowOverrides(flowOverrides: Map<Class<out FlowLogic<*>>, Class<out FlowLogic<*>>>): NodeParameters - MaxLineLength:NodeParameters.kt$NodeParameters$fun withStartInSameProcess(startInSameProcess: Boolean?): NodeParameters - MaxLineLength:NodePerformanceTests.kt$NodePerformanceTests$connection.proxy.startFlow(::CashIssueFlow, 1.DOLLARS, OpaqueBytes.of(0), defaultNotaryIdentity).returnValue - MaxLineLength:NodeProcess.kt$NodeProcess$Factory - MaxLineLength:NodeProcess.kt$NodeProcess.Factory$networkParametersCopier = NetworkParametersCopier(testNetworkParameters(notaries = listOf(notaryInfo))) - MaxLineLength:NodeProcess.kt$NodeProcess.Factory.Companion$val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss.SSS").withZone(systemDefault()) MaxLineLength:NodePropertiesPersistentStore.kt$FlowsDrainingModeOperationsImpl : FlowsDrainingModeOperations MaxLineLength:NodePropertiesPersistentStore.kt$NodePropertiesPersistentStore : NodePropertiesStore - MaxLineLength:NodeRPC.kt$NodeRPC : AutoCloseable - MaxLineLength:NodeRPCTests.kt$NodeRPCTests$driver - MaxLineLength:NodeRegistrationTest.kt$RegistrationHandler$require(!name.organisation.contains("\\s".toRegex())) { "Whitespace in the organisation name not supported" } - MaxLineLength:NodeSchedulerService.kt$NodeSchedulerService : SchedulerServiceAutoCloseableSingletonSerializeAsToken - MaxLineLength:NodeSchedulerService.kt$NodeSchedulerService$nextScheduledAction = schedulerRepo.getLatest(deduplicate.size + 1).firstOrNull { !deduplicate.contains(it.second) }?.second - MaxLineLength:NodeSchedulerService.kt$NodeSchedulerService$private val schedulerRepo: ScheduledFlowRepository = PersistentScheduledFlowRepository(database) - MaxLineLength:NodeSchedulerService.kt$NodeSchedulerService$val deduplicate = HashSet(startingStateRefs) // Take an immutable copy to remove races with afterDatabaseCommit. - MaxLineLength:NodeSchedulerService.kt$NodeSchedulerService${ // We are earliest rescheduleWakeUp() } - MaxLineLength:NodeSchedulerService.kt$NodeSchedulerService${ log.trace { "Scheduler starting FlowLogic $flowLogic" } //Add this to the in memory list of starting refs so it is not picked up on the next rescheduleWakeUp() startingStateRefs.add(scheduledState) flowLogic } - MaxLineLength:NodeSchedulerService.kt$NodeSchedulerService.Companion$ // We should try to make the Clock used in our code injectable (for tests etc) and to use the extension below // to wait in our code, rather than <code>Thread.sleep()</code> or other time-based pauses. @Suspendable @VisibleForTesting // We specify full classpath on SettableFuture to differentiate it from the Quasar class of the same name fun awaitWithDeadline(clock: CordaClock, deadline: Instant, future: Future<*> = GuavaSettableFuture.create<Any>()): Boolean - MaxLineLength:NodeSchedulerService.kt$NodeSchedulerService.Companion$ private fun <T : Any> makeStrandFriendlySettableFuture(future: Future<T>) - MaxLineLength:NodeSchedulerService.kt$NodeSchedulerService.Companion$private - MaxLineLength:NodeSchedulerService.kt$NodeSchedulerService.Companion${ // This will return when it times out, or when the clock mutates or when when the original future completes. originalFutureCompleted.get(nanos, TimeUnit.NANOSECONDS) } MaxLineLength:NodeSchedulerService.kt$NodeSchedulerService.FlowStartDeduplicationHandler$private inner - MaxLineLength:NodeSchedulerServiceTest.kt$NodeSchedulerServiceTest$private val database = configureDatabase(MockServices.makeTestDataSourceProperties(), DatabaseConfig(), { null }, { null }) - MaxLineLength:NodeSchedulerServiceTest.kt$NodeSchedulerServiceTestBase$verify(flowStarter, timeout(5000)).startFlow(argForWhich<ExternalEvent.ExternalStartFlowEvent<*>> { this.flowLogic == flowLogic }) - MaxLineLength:NodeSchemaService.kt$NodeSchemaService : SchemaServiceSingletonSerializeAsToken MaxLineLength:NodeSchemaService.kt$NodeSchemaService$fun internalSchemas() MaxLineLength:NodeSchemaService.kt$NodeSchemaService$override val schemaOptions: Map<MappedSchema, SchemaService.SchemaOptions> = requiredSchemas + extraSchemas.associateBy({ it }, { SchemaOptions() }) - MaxLineLength:NodeSchemaService.kt$NodeSchemaService$return VaultSchemaV1.VaultFungibleStates(owner = null, quantity = state.amount.quantity, issuer = null, issuerRef = null) MaxLineLength:NodeSchemaService.kt$NodeSchemaService$return VaultSchemaV1.VaultFungibleStates(state.owner, state.amount.quantity, state.amount.token.issuer.party, state.amount.token.issuer.reference) - MaxLineLength:NodeSchemaServiceTest.kt$NodeSchemaServiceTest$val mockNet = InternalMockNetwork(cordappsForAllNodes = cordappsForPackages(DummyLinearStateSchemaV1::class.packageName)) MaxLineLength:NodeSchemaServiceTest.kt$TestSchema.Child$@JoinColumns(JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"), JoinColumn(name = "output_index", referencedColumnName = "output_index")) MaxLineLength:NodeSchemaServiceTest.kt$TestSchema.Parent$@JoinColumns(JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"), JoinColumn(name = "output_index", referencedColumnName = "output_index")) MaxLineLength:NodeStartup.kt$NodeCliCommand$abstract MaxLineLength:NodeStartup.kt$NodeStartup$"""\____/ /_/ \__,_/\__,_/""" - MaxLineLength:NodeStartup.kt$NodeStartup$"Check your contracts carefully. The fine print\nis usually a clause for suspicion ${Emoji.santaClaus}" - MaxLineLength:NodeStartup.kt$NodeStartup$"How did my parents fight boredom before the internet?\nI asked my 17 siblings and they didn't know either." - MaxLineLength:NodeStartup.kt$NodeStartup$"My boss asked me who is the stupid one, me or him?\nI said everyone knows he doesn't hire stupid people." - MaxLineLength:NodeStartup.kt$NodeStartup$"Please see https://docs.corda.net/troubleshooting.html#slow-localhost-resolution for information on how to fix this. " - MaxLineLength:NodeStartup.kt$NodeStartup$"The good thing about lending out your time machine\nis that you basically get it back immediately." MaxLineLength:NodeStartup.kt$NodeStartup$"Your computer took over a second to resolve localhost due an incorrect configuration. Corda will work but start very slowly until this is fixed. " MaxLineLength:NodeStartup.kt$NodeStartup$Node.printWarning("This node is running in development mode! ${Emoji.developer} This is not safe for production deployment.") MaxLineLength:NodeStartup.kt$NodeStartup$fun initialiseAndRun(cmdLineOptions: SharedNodeCmdLineOptions, afterNodeInitialisation: RunAfterNodeInitialisation, requireCertificates: Boolean = false): Int @@ -7356,230 +4138,119 @@ MaxLineLength:NodeStartup.kt$NodeStartup$if (attempt { preNetworkRegistration(configuration) }.doOnFailure(Consumer(::handleRegistrationError)) !is Try.Success) return ExitCodes.FAILURE MaxLineLength:NodeStartup.kt$NodeStartup$if (requireCertificates && !canReadCertificatesDirectory(configuration.certificatesDirectory, configuration.devMode)) return ExitCodes.FAILURE MaxLineLength:NodeStartup.kt$NodeStartup$logger.info("The Corda node is running in production mode. If this is a developer environment you can set 'devMode=true' in the node.conf file.") - MaxLineLength:NodeStartup.kt$NodeStartup$logger.warn("${it.info} will be unable to run on Corda in the future due to missing entries in JAR's manifest file.") MaxLineLength:NodeStartup.kt$NodeStartup$nodeStartedMessage = "$nodeStartedMessage with additional Network Map keys ${conf.extraNetworkMapKeys.joinToString(prefix = "[", postfix = "]", separator = ", ")}" MaxLineLength:NodeStartup.kt$NodeStartup$printError("Unable to access certificates directory ${certDirectory}. This could be because the node has not been registered with the Identity Operator.") - MaxLineLength:NodeStartup.kt$NodeStartup$println("Application user '$appUser' does not have necessary permissions for Node base directory '$baseDirectory'.") - MaxLineLength:NodeStartup.kt$NodeStartup$println("Corda Node process in now exiting. Please check directory permissions and try starting the Node again.") MaxLineLength:NodeStartup.kt$NodeStartup$val configuration = cmdLineOptions.parseConfiguration(rawConfig).doIfValid { logRawConfig(rawConfig) }.doOnErrors(::logConfigurationErrors).optional ?: return ExitCodes.FAILURE - MaxLineLength:NodeStartup.kt$NodeStartup.Companion$private val logger by lazy { loggerFor<Node>() } // I guess this is lazy to allow for logging init, but why Node? MaxLineLength:NodeStartup.kt$NodeStartupCli$Node.printWarning("The --clear-network-map-cache flag has been deprecated and will be removed in a future version. Use the clear-network-cache command instead.") MaxLineLength:NodeStartup.kt$NodeStartupCli$Node.printWarning("The --initial-registration flag has been deprecated and will be removed in a future version. Use the initial-registration command instead.") MaxLineLength:NodeStartup.kt$NodeStartupCli$Node.printWarning("The --just-generate-node-info flag has been deprecated and will be removed in a future version. Use the generate-node-info command instead.") MaxLineLength:NodeStartup.kt$NodeStartupCli$Node.printWarning("The --just-generate-rpc-ssl-settings flag has been deprecated and will be removed in a future version. Use the generate-rpc-ssl-settings command instead.") - MaxLineLength:NodeStartup.kt$NodeStartupCli$initialRegistrationCli.networkRootTrustStorePathParameter = cmdLineOptions.networkRootTrustStorePathParameter MaxLineLength:NodeStartup.kt$NodeStartupCli$override fun additionalSubCommands() MaxLineLength:NodeStartup.kt$NodeStartupCli$println("Node was started before in `initial-registration` mode, but the registration was not completed.\nResuming registration.") MaxLineLength:NodeStartup.kt$NodeStartupCli$requireNotNull(cmdLineOptions.networkRootTrustStorePassword) { "Network root trust store password must be provided in registration mode using --network-root-truststore-password." } MaxLineLength:NodeStartup.kt$NodeStartupLogging$error is Errors.NativeIoException && error.message?.contains("Address already in use") == true -> error.logAsExpected("One of the ports required by the Corda node is already in use.") MaxLineLength:NodeStartup.kt$NodeStartupLogging$error is Errors.NativeIoException && error.message?.contains("Can't assign requested address") == true -> error.logAsExpected("Exception during node startup. Check that addresses in node config resolve correctly.") MaxLineLength:NodeStartup.kt$NodeStartupLogging$error is UnresolvedAddressException -> error.logAsExpected("Exception during node startup. Check that addresses in node config resolve correctly.") + MaxLineLength:NodeStartup.kt$NodeStartupLogging$error is java.nio.file.AccessDeniedException -> error.logAsExpected("Exception during node startup. Corda started with insufficient privileges to access ${error.file}") + MaxLineLength:NodeStartup.kt$NodeStartupLogging$error is java.nio.file.NoSuchFileException -> error.logAsExpected("Exception during node startup. Corda cannot find file ${error.file}") MaxLineLength:NodeStartup.kt$NodeStartupLogging$error.isOpenJdkKnownIssue() -> error.logAsExpected("Exception during node startup - ${error.message}. This is a known OpenJDK issue on some Linux distributions, please use OpenJDK from zulu.org or Oracle JDK.") - MaxLineLength:NodeStartup.kt$NodeStartupLogging$fun Throwable.logAsExpected(message: String? = this.message, print: (String?) -> Unit = logger::error) MaxLineLength:NodeStartup.kt$NodeStartupLogging$fun Throwable.logAsUnexpected(message: String? = this.message, error: Throwable = this, print: (String?, Throwable) -> Unit = logger::error) MaxLineLength:NodeStartup.kt$NodeStartupLogging.Companion$val startupErrors = setOf(MultipleCordappsForFlowException::class, CheckpointIncompatibleException::class, AddressBindingException::class, NetworkParametersReader::class, DatabaseIncompatibleException::class) - MaxLineLength:NodeStartup.kt$System.setProperty("defaultLogLevel", specifiedLogLevel) - MaxLineLength:NodeStartupCliTest.kt$NodeStartupCliTest$Assertions.assertThat(startup.cmdLineOptions.configFile).isEqualTo(workingDirectory / "another-base-dir" / "node.conf") - MaxLineLength:NodeStartupCliTest.kt$NodeStartupCliTest$CommandLine.populateCommand(startup, CommonCliConstants.BASE_DIR, (workingDirectory / "another-base-dir").toString()) - MaxLineLength:NodeStartupPerformanceTests.kt$NodeStartupPerformanceTests$// Measure the startup time of nodes. Note that this includes an RPC roundtrip, which causes e.g. Kryo initialisation. @Test fun `single node startup time`() MaxLineLength:NodeStatePersistenceTests.kt$NodeStatePersistenceTests$val nodeHandle = startNode(providedName = nodeName, rpcUsers = listOf(user), customOverrides = mapOf("devMode" to "false")).getOrThrow() - MaxLineLength:NodeStatePersistenceTests.kt$NodeStatePersistenceTests$val user = User("mark", "dadada", setOf(Permissions.startFlow<SendMessageFlow>(), Permissions.invokeRpc("vaultQuery"))) - MaxLineLength:NodeStatePersistenceTests.kt$SendMessageFlow$val txBuilder = TransactionBuilder(notary).withItems(StateAndContract(messageState, MESSAGE_CONTRACT_PROGRAM_ID), txCommand) - MaxLineLength:NodeStatePersistenceTests.kt$SendMessageFlow.Companion$fun tracker() MaxLineLength:NodeTabView.kt$NodeTabView$CityDatabase.cityMap.values.map { it.countryCode }.toSet().map { it to Image(resources["/net/corda/demobench/flags/$it.png"]) }.toMap() - MaxLineLength:NodeTabView.kt$NodeTabView$notaryTypeToggleGroup.selectedValueProperty<NotaryService>() MaxLineLength:NodeTerminalView.kt$NodeTerminalView${ // TODO: Remove this special case once Rick's serialisation work means we can deserialise states that weren't on our own classpath. } - MaxLineLength:NodeTest.kt$NodeTest$assertEquals(node.generateNodeInfo(), node.generateNodeInfo()) MaxLineLength:NodeTestUtils.kt$ fun testActor(owningLegalIdentity: CordaX500Name = CordaX500Name("Test Company Inc.", "London", "GB")) MaxLineLength:NodeTestUtils.kt$ fun testContext(owningLegalIdentity: CordaX500Name = CordaX500Name("Test Company Inc.", "London", "GB")) MaxLineLength:NodeUnloadHandlerTests.kt$NodeUnloadHandlerTests$assertTrue("Timed out waiting for AbstractNode to invoke the test service shutdown callback", shutdownLatch.await(30, TimeUnit.SECONDS)) - MaxLineLength:NodeUnloadHandlerTests.kt$NodeUnloadHandlerTests$private val mockNet = InternalMockNetwork(cordappsForAllNodes = listOf(enclosedCordapp()), notarySpecs = emptyList()) MaxLineLength:NodeVaultService.kt$NodeVaultService$ @Throws(VaultQueryException::class) override fun <T : ContractState> _trackBy(criteria: QueryCriteria, paging: PageSpecification, sorting: Sort, contractStateType: Class<out T>): DataFeed<Vault.Page<T>, Vault.Update<T>> MaxLineLength:NodeVaultService.kt$NodeVaultService$ private fun <T: ContractState> hasBeenSeen(update: Vault.Update<T>, snapshotStatesRefs: Set<StateRef>, snapshotConsumedStatesRefs: Set<StateRef>): Boolean - MaxLineLength:NodeVaultService.kt$NodeVaultService$// Only update the state if it has not previously been consumed (this could have happened if the transaction is being // re-recorded. if (stateStatus != Vault.StateStatus.CONSUMED) { stateStatus = Vault.StateStatus.CONSUMED consumedTime = clock.instant() // remove lock (if held) if (lockId != null) { lockId = null lockUpdateTime = clock.instant() log.trace("Releasing soft lock on consumed state: $stateRef") } session.save(state) } MaxLineLength:NodeVaultService.kt$NodeVaultService$// Returns only output states that can be deserialised successfully. fun WireTransaction.deserializableOutputStates(): Map<Int, TransactionState<ContractState>> MaxLineLength:NodeVaultService.kt$NodeVaultService$// Returns only reference states that can be deserialised successfully. fun LedgerTransaction.deserializableRefStates(): Map<Int, StateAndRef<ContractState>> MaxLineLength:NodeVaultService.kt$NodeVaultService$@Throws(VaultQueryException::class) override MaxLineLength:NodeVaultService.kt$NodeVaultService$@Throws(VaultQueryException::class) private MaxLineLength:NodeVaultService.kt$NodeVaultService$Vault.Page(states = statesAndRefs, statesMetadata = statesMeta, stateTypes = criteriaParser.stateTypes, totalStatesAvailable = totalStates, otherResults = otherResults) - MaxLineLength:NodeVaultService.kt$NodeVaultService$fun <T> withValidDeserialization(list: List<T>, txId: SecureHash): Map<Int, T> MaxLineLength:NodeVaultService.kt$NodeVaultService$fun execute(configure: Root<*>.(CriteriaUpdate<*>, Array<Predicate>) -> Any?) MaxLineLength:NodeVaultService.kt$NodeVaultService$if (paging.pageNumber < DEFAULT_PAGE_NUM) throw VaultQueryException("Page specification: invalid page number ${paging.pageNumber} [page numbers start from $DEFAULT_PAGE_NUM]") MaxLineLength:NodeVaultService.kt$NodeVaultService$if (paging.pageSize < 1) throw VaultQueryException("Page specification: invalid page size ${paging.pageSize} [minimum is 1]") MaxLineLength:NodeVaultService.kt$NodeVaultService$if (paging.pageSize > MAX_PAGE_SIZE) throw VaultQueryException("Page specification: invalid page size ${paging.pageSize} [maximum is $MAX_PAGE_SIZE]") MaxLineLength:NodeVaultService.kt$NodeVaultService$isRelevant(value.data, keyManagementService.filterMyKeys(outputs.values.flatMap { it.data.participants.map { it.owningKey } }).toSet()) - MaxLineLength:NodeVaultService.kt$NodeVaultService$log.debug { "Vault Query for contract type: $contractStateType, criteria: $criteria, pagination: $paging, sorting: $sorting" } MaxLineLength:NodeVaultService.kt$NodeVaultService$log.trace { "Removing $consumedStateRefs consumed contract states and adding $producedStateRefs produced contract states to the database." } MaxLineLength:NodeVaultService.kt$NodeVaultService$log.warn("There are unknown contract state types in the vault, which will prevent these states from being used. The relevant CorDapps must be loaded for these states to be used. The types not on the classpath are ${unknownTypes.joinToString(", ", "[", "]")}.") MaxLineLength:NodeVaultService.kt$NodeVaultService$log.warn("trackBy is called with an already existing, open DB transaction. As a result, there might be states missing from both the snapshot and observable, included in the returned data feed, because of race conditions.") - MaxLineLength:NodeVaultService.kt$NodeVaultService$override MaxLineLength:NodeVaultService.kt$NodeVaultService$private - MaxLineLength:NodeVaultService.kt$NodeVaultService$private val criteriaBuilder: CriteriaBuilder by lazy { database.hibernateConfig.sessionFactoryForRegisteredSchemas.criteriaBuilder } - MaxLineLength:NodeVaultService.kt$NodeVaultService$query.maxResults = if (pageSize > 0) pageSize else Integer.MAX_VALUE - MaxLineLength:NodeVaultService.kt$NodeVaultService$relevancyStatus = if (isRelevant) Vault.RelevancyStatus.RELEVANT else Vault.RelevancyStatus.NOT_RELEVANT - MaxLineLength:NodeVaultService.kt$NodeVaultService$return Vault.Update(consumedStateAndRefs.toSet(), producedStateAndRefs.toSet(), null, updateType, referenceStateAndRefs.toSet()) - MaxLineLength:NodeVaultService.kt$NodeVaultService$return Vault.Update(consumedStates.toSet(), ourNewStates.toSet(), references = newReferenceStateAndRefs.toSet()) - MaxLineLength:NodeVaultService.kt$NodeVaultService$return snapshotStatesRefs.containsAll(updateProducedStatesRefs) && snapshotConsumedStatesRefs.containsAll(updateConsumedStatesRefs) MaxLineLength:NodeVaultService.kt$NodeVaultService$softLockingCondition = QueryCriteria.SoftLockingCondition(QueryCriteria.SoftLockingType.UNLOCKED_AND_SPECIFIED, listOf(lockId)) - MaxLineLength:NodeVaultService.kt$NodeVaultService$throw StatesNotAvailableException("Attempted to reserve $stateRefs for $lockId but only $updatedRows rows available") MaxLineLength:NodeVaultService.kt$NodeVaultService$throw VaultQueryException("There are ${results.size} results, which exceeds the limit of $DEFAULT_PAGE_SIZE for queries that do not specify paging. In order to retrieve these results, provide a `PageSpecification(pageNumber, pageSize)` to the method invoked.") - MaxLineLength:NodeVaultService.kt$NodeVaultService$update.set(get<String>(VaultSchemaV1.VaultStates::lockId.name), criteriaBuilder.nullLiteral(String::class.java)) - MaxLineLength:NodeVaultService.kt$NodeVaultService$update.set<String>(get<String>(VaultSchemaV1.VaultStates::lockId.name), criteriaBuilder.nullLiteral(String::class.java)) MaxLineLength:NodeVaultService.kt$NodeVaultService$val criteriaParser = HibernateQueryCriteriaParser(contractStateType, contractStateTypeMappings, criteriaBuilder, criteriaQuery, queryRootVaultStates) - MaxLineLength:NodeVaultService.kt$NodeVaultService$val lockIdPredicate = criteriaBuilder.equal(get<String>(VaultSchemaV1.VaultStates::lockId.name), lockId.toString()) MaxLineLength:NodeVaultService.kt$NodeVaultService$val lockUpdateTime = criteriaBuilder.equal(get<Instant>(VaultSchemaV1.VaultStates::lockUpdateTime.name), softLockTimestamp) - MaxLineLength:NodeVaultService.kt$NodeVaultService$val myKeys by lazy { keyManagementService.filterMyKeys(ltx.outputs.flatMap { it.data.participants.map { it.owningKey } }) } - MaxLineLength:NodeVaultService.kt$NodeVaultService$val persistentStateRefs = stateRefs.map { PersistentStateRef(it.txhash.bytes.toHexString(), it.index) } MaxLineLength:NodeVaultService.kt$NodeVaultService$val results = _queryBy(criteria.and(countCriteria), PageSpecification(), Sort(emptyList()), contractStateType, true) // only skip pagination checks for total results count query - MaxLineLength:NodeVaultService.kt$NodeVaultService$val state = session.get<VaultSchemaV1.VaultStates>(VaultSchemaV1.VaultStates::class.java, PersistentStateRef(stateRef)) - MaxLineLength:NodeVaultService.kt$NodeVaultService$val stateOnly = stateAndRef.value.state.data // TODO: Optimise this. // // For EVERY state to be committed to the vault, this checks whether it is spendable by the recording // node. The behaviour is as follows: // // 1) All vault updates marked as RELEVANT will, of course, all have relevancy_status = 1 in the // "vault_states" table. // 2) For ALL_VISIBLE updates, those which are not relevant according to the relevancy rules will have // relevancy_status = 0 in the "vault_states" table. // // This is useful when it comes to querying for fungible states, when we do not want irrelevant states // included in the result. // // The same functionality could be obtained by passing in a list of participants to the vault query, // however this: // // * requires a join on the participants table which results in slow queries // * states may flip from being non-relevant to relevant // * it's more complicated for CorDapp developers // // Adding a new column in the "VaultStates" table was considered the best approach. val keys = stateOnly.participants.map { it.owningKey } val persistentStateRef = PersistentStateRef(stateAndRef.key) // This check is done to set the "relevancyStatus". When one performs a vault query, it is possible to return ALL states, ONLY // RELEVANT states or NOT relevant states. val isRelevant = isRelevant(stateOnly, keyManagementService.filterMyKeys(keys).toSet()) val constraintInfo = Vault.ConstraintInfo(stateAndRef.value.state.constraint) // Save a row for each party in the state_party table. // TODO: Perhaps these can be stored in a batch? stateOnly.participants.groupBy { it.owningKey }.forEach { participants -> val persistentParty = VaultSchemaV1.PersistentParty(persistentStateRef, participants.value.first()) session.save(persistentParty) } val stateToAdd = VaultSchemaV1.VaultStates( notary = stateAndRef.value.state.notary, contractStateClassName = stateAndRef.value.state.data.javaClass.name, stateStatus = Vault.StateStatus.UNCONSUMED, recordedTime = clock.instant(), relevancyStatus = if (isRelevant) Vault.RelevancyStatus.RELEVANT else Vault.RelevancyStatus.NOT_RELEVANT, constraintType = constraintInfo.type(), constraintData = constraintInfo.data() ) stateToAdd.stateRef = persistentStateRef session.save(stateToAdd) - MaxLineLength:NodeVaultService.kt$NodeVaultService$val stateRef = StateRef(SecureHash.parse(vaultState.stateRef!!.txId), vaultState.stateRef!!.index) MaxLineLength:NodeVaultService.kt$NodeVaultService$val stateStatusPredication = criteriaBuilder.equal(get<Vault.StateStatus>(VaultSchemaV1.VaultStates::stateStatus.name), Vault.StateStatus.UNCONSUMED) MaxLineLength:NodeVaultService.kt$NodeVaultService$val txIdPredicate = criteriaBuilder.equal(vaultStates.get<Vault.StateStatus>(VaultSchemaV1.VaultTxnNote::txId.name), txnId.toString()) - MaxLineLength:NodeVaultService.kt$NodeVaultService${ // For transactions being re-recorded, the node must check its vault to find out what states it has already seen. Note // that some of the outputs previously seen may have been consumed in the meantime, so the check must look for all state // statuses. val outputRefs = tx.outRefsOfType<ContractState>().map { it.ref } val seenRefs = loadStates(outputRefs).map { it.ref } val unseenRefs = outputRefs - seenRefs val unseenOutputIdxs = unseenRefs.map { it.index }.toSet() outputs.filter { it.key in unseenOutputIdxs } } - MaxLineLength:NodeVaultService.kt$NodeVaultService${ // We decrement by one if the client requests MAX_PAGE_SIZE, assuming they can not notice this because they don't have enough memory // to request `MAX_PAGE_SIZE` states at once. val paging = if (paging_.pageSize == Integer.MAX_VALUE) { paging_.copy(pageSize = Integer.MAX_VALUE - 1) } else { paging_ } log.debug { "Vault Query for contract type: $contractStateType, criteria: $criteria, pagination: $paging, sorting: $sorting" } return database.transaction { // calculate total results where a page specification has been defined var totalStates = -1L if (!skipPagingChecks && !paging.isDefault) { val count = builder { VaultSchemaV1.VaultStates::recordedTime.count() } val countCriteria = QueryCriteria.VaultCustomQueryCriteria(count, Vault.StateStatus.ALL) val results = _queryBy(criteria.and(countCriteria), PageSpecification(), Sort(emptyList()), contractStateType, true) // only skip pagination checks for total results count query totalStates = results.otherResults.last() as Long } val session = getSession() val criteriaQuery = criteriaBuilder.createQuery(Tuple::class.java) val queryRootVaultStates = criteriaQuery.from(VaultSchemaV1.VaultStates::class.java) // TODO: revisit (use single instance of parser for all queries) val criteriaParser = HibernateQueryCriteriaParser(contractStateType, contractStateTypeMappings, criteriaBuilder, criteriaQuery, queryRootVaultStates) // parse criteria and build where predicates criteriaParser.parse(criteria, sorting) // prepare query for execution val query = session.createQuery(criteriaQuery) // pagination checks if (!skipPagingChecks && !paging.isDefault) { // pagination if (paging.pageNumber < DEFAULT_PAGE_NUM) throw VaultQueryException("Page specification: invalid page number ${paging.pageNumber} [page numbers start from $DEFAULT_PAGE_NUM]") if (paging.pageSize < 1) throw VaultQueryException("Page specification: invalid page size ${paging.pageSize} [minimum is 1]") if (paging.pageSize > MAX_PAGE_SIZE) throw VaultQueryException("Page specification: invalid page size ${paging.pageSize} [maximum is $MAX_PAGE_SIZE]") } // For both SQLServer and PostgresSQL, firstResult must be >= 0. So we set a floor at 0. // TODO: This is a catch-all solution. But why is the default pageNumber set to be -1 in the first place? // Even if we set the default pageNumber to be 1 instead, that may not cover the non-default cases. // So the floor may be necessary anyway. query.firstResult = maxOf(0, (paging.pageNumber - 1) * paging.pageSize) val pageSize = paging.pageSize + 1 query.maxResults = if (pageSize > 0) pageSize else Integer.MAX_VALUE // detection too many results, protected against overflow // execution val results = query.resultList // final pagination check (fail-fast on too many results when no pagination specified) if (!skipPagingChecks && paging.isDefault && results.size > DEFAULT_PAGE_SIZE) { throw VaultQueryException("There are ${results.size} results, which exceeds the limit of $DEFAULT_PAGE_SIZE for queries that do not specify paging. In order to retrieve these results, provide a `PageSpecification(pageNumber, pageSize)` to the method invoked.") } val statesAndRefs: MutableList<StateAndRef<T>> = mutableListOf() val statesMeta: MutableList<Vault.StateMetadata> = mutableListOf() val otherResults: MutableList<Any> = mutableListOf() val stateRefs = mutableSetOf<StateRef>() results.asSequence() .forEachIndexed { index, result -> if (result[0] is VaultSchemaV1.VaultStates) { if (!paging.isDefault && index == paging.pageSize) // skip last result if paged return@forEachIndexed val vaultState = result[0] as VaultSchemaV1.VaultStates val stateRef = StateRef(SecureHash.parse(vaultState.stateRef!!.txId), vaultState.stateRef!!.index) stateRefs.add(stateRef) statesMeta.add(Vault.StateMetadata(stateRef, vaultState.contractStateClassName, vaultState.recordedTime, vaultState.consumedTime, vaultState.stateStatus, vaultState.notary, vaultState.lockId, vaultState.lockUpdateTime, vaultState.relevancyStatus, constraintInfo(vaultState.constraintType, vaultState.constraintData) )) } else { // TODO: improve typing of returned other results log.debug { "OtherResults: ${Arrays.toString(result.toArray())}" } otherResults.addAll(result.toArray().asList()) } } if (stateRefs.isNotEmpty()) statesAndRefs.addAll(uncheckedCast(servicesForResolution.loadStates(stateRefs))) Vault.Page(states = statesAndRefs, statesMetadata = statesMeta, stateTypes = criteriaParser.stateTypes, totalStatesAvailable = totalStates, otherResults = otherResults) } } - MaxLineLength:NodeVaultService.kt$NodeVaultService${ // When resolving transaction dependencies we might encounter contracts we haven't installed locally. // This will cause a failure as we can't deserialize such states in the context of the `appClassloader`. // For now we ignore these states. // In the future we will use the AttachmentsClassloader to correctly deserialize and asses the relevancy. log.debug { "Could not deserialize state $idx from transaction $txId. Cause: $e" } null } - MaxLineLength:NodeVaultService.kt$NodeVaultService${ val outputs: Map<Int, TransactionState<ContractState>> = tx.deserializableOutputStates() val ourNewStates = when (statesToRecord) { StatesToRecord.NONE -> throw AssertionError("Should not reach here") StatesToRecord.ONLY_RELEVANT -> outputs.filter { (_, value) -> isRelevant(value.data, keyManagementService.filterMyKeys(outputs.values.flatMap { it.data.participants.map { it.owningKey } }).toSet()) } StatesToRecord.ALL_VISIBLE -> if (previouslySeen) { // For transactions being re-recorded, the node must check its vault to find out what states it has already seen. Note // that some of the outputs previously seen may have been consumed in the meantime, so the check must look for all state // statuses. val outputRefs = tx.outRefsOfType<ContractState>().map { it.ref } val seenRefs = loadStates(outputRefs).map { it.ref } val unseenRefs = outputRefs - seenRefs val unseenOutputIdxs = unseenRefs.map { it.index }.toSet() outputs.filter { it.key in unseenOutputIdxs } } else { outputs } }.map { (idx, _) -> tx.outRef<ContractState>(idx) } // Retrieve all unconsumed states for this transaction's inputs. val consumedStates = loadStates(tx.inputs) // Is transaction irrelevant? If so, then we don't care about the reference states either. if (consumedStates.isEmpty() && ourNewStates.isEmpty()) { log.trace { "tx ${tx.id} was irrelevant to this vault, ignoring" } return null } // This list should only contain NEW states which we have not seen before as an output in another transaction. If we can't // obtain the references from the vault then the reference must be a state we have not seen before, therefore we should store it // in the vault. If StateToRecord is set to ALL_VISIBLE or ONLY_RELEVANT then we should store all of the previously unseen // states in the reference list. The assumption is that we might need to inspect them at some point if they were referred to // in the contracts of the input or output states. If states to record is none then we shouldn't record any reference states. val newReferenceStateAndRefs = if (tx.references.isEmpty()) { emptyList() } else { when (statesToRecord) { StatesToRecord.NONE -> throw AssertionError("Should not reach here") StatesToRecord.ALL_VISIBLE, StatesToRecord.ONLY_RELEVANT -> { val notSeenReferences = tx.references - loadStates(tx.references).map { it.ref } // TODO: This is expensive - is there another way? tx.toLedgerTransaction(servicesForResolution).deserializableRefStates() .filter { (_, stateAndRef) -> stateAndRef.ref in notSeenReferences } .values } } } return Vault.Update(consumedStates.toSet(), ourNewStates.toSet(), references = newReferenceStateAndRefs.toSet()) } - MaxLineLength:NodeVaultService.kt$NodeVaultService.Companion$ fun isRelevant(state: ContractState, myKeys: Set<PublicKey>): Boolean MaxLineLength:NodeVaultService.kt$NodeVaultService.InnerState$// For use during publishing only. val updatesPublisher: rx.Observer<Vault.Update<ContractState>> get() = _updatesPublisher.bufferUntilDatabaseCommit().tee(_rawUpdatesPublisher) MaxLineLength:NodeVaultService.kt$private MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$(services.validatedTransactions as WritableTransactionStorage).addTransaction(SignedTransaction(changeNotaryTx, listOf(NullKeys.NULL_SIGNATURE))) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$Cash().generateIssue(this, 100.DOLLARS `issued by` MEGA_CORP.ref(1), AnonymousParty(freshKey), DUMMY_NOTARY) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$Cash().generateIssue(this, 200.POUNDS `issued by` MEGA_CORP.ref(1), AnonymousParty(freshKey), DUMMY_NOTARY) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$CashUtils.generateSpend(services, this, Amount(amount.quantity, GBP), identity, thirdPartyIdentity.party.anonymise()) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$FungibleFoo : FungibleState - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$addOutputState(DummyDealContract.State(listOf(megaCorp.party), "Dummy linear id"), DUMMY_DEAL_PROGRAM_ID) + MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$TransactionState(Cash.State(amount `issued by` issuer.ref(depositRef), identity.party), Cash.PROGRAM_ID, DUMMY_NOTARY, constraint = AlwaysAcceptAttachmentConstraint) MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$addOutputState(UniqueDummyFungibleContract.State(10.DOLLARS `issued by` DUMMY_CASH_ISSUER, megaCorp.party), UNIQUE_DUMMY_FUNGIBLE_CONTRACT_PROGRAM_ID) MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$addOutputState(UniqueDummyLinearContract.State(listOf(megaCorp.party), "Dummy linear id"), UNIQUE_DUMMY_LINEAR_CONTRACT_PROGRAM_ID) MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$assertThat(spendableStatesUSD[0].state.data.amount.token.issuer).isNotEqualTo(spendableStatesUSD[1].state.data.amount.token.issuer) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$assertThat(spendableStatesUSD[0].state.data.amount.token.issuer.reference).isIn(BOC.ref(1).reference, BOC.ref(2).reference) MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$assertThat(spendableStatesUSD[0].state.data.amount.token.issuer.reference).isNotEqualTo(spendableStatesUSD[1].state.data.amount.token.issuer.reference) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$assertThat(spendableStatesUSD[1].state.data.amount.token.issuer.reference).isIn(BOC.ref(1).reference, BOC.ref(2).reference) MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$cash.generateIssue(issuance, Amount(howMuch.quantity, Issued(DUMMY_CASH_ISSUER, howMuch.token)), services.myInfo.singleIdentity(), dummyNotary.party) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$makeTestIdentityService(MEGA_CORP_IDENTITY, MINI_CORP_IDENTITY, DUMMY_CASH_ISSUER_IDENTITY, DUMMY_NOTARY_IDENTITY) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$private - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$services.recordTransactions(StatesToRecord.ALL_VISIBLE, listOf(createTx(6, megaCorp.party, bankOfCorda.party))) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$services.recordTransactions(StatesToRecord.ONLY_RELEVANT, listOf(createTx(3, miniCorp.party, megaCorp.party))) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val cashStateWithNewNotary = StateAndRef(initialCashState.state.copy(notary = newNotary), StateRef(changeNotaryTx.id, 0)) MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val changeNotaryTx = NotaryChangeTransactionBuilder(listOf(initialCashState.ref), issueStx.notary!!, newNotary, services.networkParametersService.currentHash).build() MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val criteriaByLockId = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.SPECIFIED, listOf(softLockId))) MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val criteriaByLockId1 = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.SPECIFIED, listOf(softLockId1))) MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val criteriaByLockId2 = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.SPECIFIED, listOf(softLockId2))) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val criteriaLocked = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.LOCKED_ONLY)) MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val criteriaLocked = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.SPECIFIED, listOf(lockId))) MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val expectedNotaryChangeUpdate = Vault.Update(setOf(initialCashState), setOf(cashStateWithNewNotary), null, Vault.UpdateType.NOTARY_CHANGE) - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val myKeys = services.keyManagementService.filterMyKeys(listOf(identity.owningKey, myAnonymousIdentity.owningKey)).toSet() - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val states = vaultService.queryBy<Cash.State>(VaultQueryCriteria(stateRefs = listOf(w1[1].ref, w1[2].ref))).states MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val thirdPartyIdentity = thirdPartyServices.keyManagementService.freshKeyAndCert(thirdPartyServices.myInfo.singleIdentityAndCert(), false) MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val unlockedStates = vaultService.queryBy<Cash.State>(VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.UNLOCKED_ONLY))).states MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val unlockedStates1 = vaultService.queryBy<Cash.State>(VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.UNLOCKED_ONLY))).states MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val unlockedStates2 = vaultService.queryBy<Cash.State>(VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.UNLOCKED_ONLY))).states - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$val w1 = vaultService.queryBy<Cash.State>(PageSpecification(pageNumber = 1, pageSize = Integer.MAX_VALUE)).states MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$vaultService.queryBy(Cash.State::class.java, QueryCriteria.VaultQueryCriteria(relevancyStatus = Vault.RelevancyStatus.ALL), PageSpecification(1)).totalStatesAvailable - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest$withIssuerRefs: Set<OpaqueBytes>? = null - MaxLineLength:NodeVaultServiceTest.kt$NodeVaultServiceTest.Companion$val cordappPackages = listOf("net.corda.finance.contracts.asset", CashSchemaV1::class.packageName, "net.corda.testing.contracts", "net.corda.testing.internal.vault") - MaxLineLength:NodeVersioningTest.kt$NodeVersioningTest$assertThat(rpc.startFlow(NodeVersioningTest::GetPlatformVersionFlow).returnValue.getOrThrow()).isEqualTo(PLATFORM_VERSION) MaxLineLength:NodeWebServer.kt$NodeWebServer$/** Fetch WebServerPluginRegistry classes registered in META-INF/services/net.corda.webserver.services.WebServerPluginRegistry files that exist in the classpath */ val pluginRegistries: List<WebServerPluginRegistry> by lazy { ServiceLoader.load(WebServerPluginRegistry::class.java).toList() } - MaxLineLength:NodeWebServer.kt$NodeWebServer$if (e is BindException || e is Errors.NativeIoException && e.message?.contains("Address already in use") == true) { throw AddressBindingException(address) } else { throw e } MaxLineLength:NodeWebServer.kt$NodeWebServer$private fun reconnectingCordaRPCOps() MaxLineLength:NodeWebServer.kt$NodeWebServer$val sslConnector = ServerConnector(server, SslConnectionFactory(sslContextFactory, "http/1.1"), HttpConnectionFactory(httpsConfiguration)) - MaxLineLength:NodeWebServer.kt$NodeWebServer.<no name provided>$@Throws(IOException::class) override - MaxLineLength:NonEmptySet.kt$NonEmptySet.Companion$elements.forEach { copy += it } - MaxLineLength:NonInvalidatingCache.kt$NonInvalidatingCache.Companion$private MaxLineLength:NonInvalidatingCache.kt$NonInvalidatingWeightBasedCache.Companion$private MaxLineLength:NonInvalidatingUnboundCache.kt$NonInvalidatingUnboundCache$constructor(name: String, cacheFactory: NamedCacheFactory, loadFunction: (K) -> V, removalListener: RemovalListener<K, V> = RemovalListener { _, _, _ -> }, keysToPreload: () -> Iterable<K> = { emptyList() }) : this(buildCache(name, cacheFactory, loadFunction, removalListener, keysToPreload)) MaxLineLength:NonInvalidatingUnboundCache.kt$NonInvalidatingUnboundCache.Companion$private - MaxLineLength:NonInvalidatingUnboundCache.kt$NonInvalidatingUnboundCache.Companion$val builder = Caffeine.newBuilder().removalListener(removalListener).executor(SameThreadExecutor.getExecutor()) MaxLineLength:NonValidatingNotaryFlow.kt$NonValidatingNotaryFlow : NotaryServiceFlow - MaxLineLength:NonValidatingNotaryFlow.kt$NonValidatingNotaryFlow$"Notary specified by the transaction ($notary) is not on the network parameter whitelist: ${notaryWhitelist.joinToString()}" - MaxLineLength:NonValidatingNotaryFlow.kt$NonValidatingNotaryFlow$"expected either ${FilteredTransaction::class.java.simpleName} or ${NotaryChangeWireTransaction::class.java.simpleName}" MaxLineLength:NonValidatingNotaryFlow.kt$NonValidatingNotaryFlow$?: MaxLineLength:NonValidatingNotaryFlow.kt$NonValidatingNotaryFlow$is FilteredTransaction -> TransactionParts(tx.id, tx.inputs, tx.timeWindow, tx.notary, tx.references, networkParametersHash = tx.networkParametersHash) MaxLineLength:NonValidatingNotaryFlow.kt$NonValidatingNotaryFlow$is NotaryChangeWireTransaction - MaxLineLength:NonValidatingNotaryServiceTests.kt$NonValidatingNotaryServiceTests$private - MaxLineLength:NonValidatingNotaryServiceTests.kt$NonValidatingNotaryServiceTests$val modifiedSignature = NotarisationRequestSignature(randomKeyPair.sign(bytesToSign), aliceNode.services.myInfo.platformVersion) MaxLineLength:NonValidatingNotaryServiceTests.kt$NonValidatingNotaryServiceTests.<no name provided>$val alteredMessage = InMemoryMessage(message.topic, OpaqueBytes(alteredMessageData.serialize().bytes), message.uniqueMessageId) MaxLineLength:Notarise.kt$NotaryDemoClientApi$rpc.startFlow(::RPCStartableNotaryFlowClient, it).returnValue.toCompletableFuture().thenApply { it.map { it.by.toStringShort() } } MaxLineLength:NotaryChangeFlow.kt$NotaryChangeFlow$val signableData = SignableData(tx.id, SignatureMetadata(serviceHub.myInfo.platformVersion, Crypto.findSignatureScheme(myKey).schemeNumberID)) MaxLineLength:NotaryChangeTests.kt$NotaryChangeTests$assertTrue { originalLinkedStates.size == notaryChangeLinkedStates.size && originalLinkedStates.containsAll(notaryChangeLinkedStates) } - MaxLineLength:NotaryChangeTests.kt$NotaryChangeTests$clientNodeB.services.recordTransactions(clientNodeA.services.validatedTransactions.getTransaction(issued.ref.txhash)!!) MaxLineLength:NotaryChangeTests.kt$NotaryChangeTests$private - MaxLineLength:NotaryChangeTests.kt$fun issueInvalidState(services: ServiceHub, identity: Party, notary: Party): StateAndRef<DummyContract.SingleOwnerState> MaxLineLength:NotaryChangeTests.kt$fun issueMultiPartyState(nodeA: StartedMockNode, nodeB: StartedMockNode, notaryNode: StartedMockNode, notaryIdentity: Party): StateAndRef<DummyContract.MultiOwnerState> - MaxLineLength:NotaryChangeTests.kt$fun issueState(services: ServiceHub, nodeIdentity: Party, notaryIdentity: Party): StateAndRef<DummyContract.SingleOwnerState> - MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeLedgerTransaction$ private fun checkNewNotaryWhitelisted() - MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeLedgerTransaction$?: - MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeLedgerTransaction$@Deprecated("NotaryChangeLedgerTransaction should not be created directly, use NotaryChangeWireTransaction.resolve instead.") - MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeLedgerTransaction$override fun equals(other: Any?): Boolean - MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeLedgerTransaction$val inputPositionIndex: Map<StateRef, Int> = inputs.mapIndexed { index, stateAndRef -> stateAndRef.ref to index }.toMap() - MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeWireTransaction$ @CordaInternal internal fun resolveOutputComponent(services: ServicesForResolution, stateRef: StateRef, params: NetworkParameters): SerializedBytes<TransactionState<ContractState>> - MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeWireTransaction$ @DeleteForDJVM fun resolve(services: ServiceHub, sigs: List<TransactionSignature>) - MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeWireTransaction$@CordaInternal internal + MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeWireTransaction$ @CordaInternal internal fun resolveOutputComponent( services: ServicesForResolution, stateRef: StateRef, @Suppress("UNUSED_PARAMETER") params: NetworkParameters ): SerializedBytes<TransactionState<ContractState>> MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeWireTransaction$@Deprecated("Required only for backwards compatibility purposes. This type of transaction should not be constructed outside Corda code.", ReplaceWith("NotaryChangeTransactionBuilder"), DeprecationLevel.WARNING) - MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeWireTransaction$@Deprecated("Required only for backwards compatibility purposes. This type of transaction should not be constructed outside Corda code.", ReplaceWith("NotaryChangeTransactionBuilder"), DeprecationLevel.WARNING) constructor(inputs: List<StateRef>, notary: Party, newNotary: Party) : this(listOf(inputs, notary, newNotary).map { it.serialize() }) - MaxLineLength:NotaryChangeTransactions.kt$NotaryChangeWireTransaction$return NotaryChangeLedgerTransaction.create(resolvedInputs, notary, newNotary, id, sigs, resolvedNetworkParameters) - MaxLineLength:NotaryError.kt$NotaryError.Conflict$"${consumedStates.asSequence().joinToString(",\n", limit = 5) { it.key.toString() + " -> " + it.value }}.\n" MaxLineLength:NotaryError.kt$NotaryError.Conflict$"To find out if any of the conflicting transactions have been generated by this node you can use the hashLookup Corda shell command." MaxLineLength:NotaryError.kt$NotaryError.Conflict$override - MaxLineLength:NotaryError.kt$NotaryError.TimeWindowInvalid$override fun toString() MaxLineLength:NotaryError.kt$NotaryError.WrongNotary$@Deprecated("Deprecated since platform version 4. This object is no longer used, [TransactionInvalid] will be reported in case of notary mismatch") - MaxLineLength:NotaryError.kt$NotaryException$/** Id of the transaction to be notarised. Can be _null_ if an error occurred before the id could be resolved. */ val txId: SecureHash? = null - MaxLineLength:NotaryError.kt$StateConsumptionDetails$fun copy(hashOfTransactionId: SecureHash): StateConsumptionDetails - MaxLineLength:NotaryFlow.kt$NotaryFlow.Client$ private fun generateRequestSignature(): NotarisationRequestSignature MaxLineLength:NotaryFlow.kt$NotaryFlow.Client$"Notary $notaryParty is not on the network parameter whitelist. A non-whitelisted notary can only be used for notary change transactions" MaxLineLength:NotaryFlow.kt$NotaryFlow.Client$?: MaxLineLength:NotaryFlow.kt$NotaryFlow.Client$@Suspendable private - MaxLineLength:NotaryFlow.kt$NotaryFlow.Client$NotarySendTransactionFlow : DataVendingFlow - MaxLineLength:NotaryFlow.kt$NotaryFlow.Client$check - MaxLineLength:NotaryFlow.kt$NotaryFlow.Client$it is StateRef || it is ReferenceStateRef || it is TimeWindow || it == notaryParty || it is NetworkParametersHash - MaxLineLength:NotaryFlow.kt$NotaryFlow.Client$protected - MaxLineLength:NotaryFlow.kt$NotaryFlow.Client$val historicNotary = (serviceHub.networkParametersService as NetworkParametersStorage).getHistoricNotary(notaryParty) ?: throw IllegalStateException("The notary party $notaryParty specified by transaction ${stx.id}, is not recognised as a current or historic notary.") MaxLineLength:NotaryFlow.kt$NotaryFlow.Client$val notarisationRequest = NotarisationRequest(stx.inputs.map { it.copy(txhash = SecureHash.parse(it.txhash.toString())) }, stx.id) MaxLineLength:NotaryFlow.kt$NotaryFlow.Client.NotarySendTransactionFlow$@Suspendable override MaxLineLength:NotaryFlow.kt$NotaryFlow.Client.NotarySendTransactionFlow$private MaxLineLength:NotaryFlow.kt$net.corda.core.flows.NotaryFlow.kt - MaxLineLength:NotaryLoader.kt$NotaryLoader$ private fun maybeInstallSerializationFilter(serviceClass: Class<out NotaryService>) - MaxLineLength:NotaryLoader.kt$NotaryLoader$ private fun scanCorDapps(cordappLoader: CordappLoader): Class<out NotaryService> MaxLineLength:NotaryLoader.kt$NotaryLoader$ private fun validateNotaryType(myNotaryIdentity: PartyAndCertificate?, services: ServiceHubInternal) MaxLineLength:NotaryLoader.kt$NotaryLoader$+ MaxLineLength:NotaryLoader.kt$NotaryLoader$?: - MaxLineLength:NotaryLoader.kt$NotaryLoader$fun loadService(myNotaryIdentity: PartyAndCertificate?, services: ServiceHubInternal, cordappLoader: CordappLoader): NotaryService MaxLineLength:NotaryLoader.kt$NotaryLoader$throw IllegalStateException("There is a discrepancy in the configured notary type and the one advertised in the network parameters - shutting down. " + "Configured as validating: ${configuredAsValidatingNotary}. Advertised as validating: ${validatingNotaryInNetworkMapCache}") - MaxLineLength:NotaryLoader.kt$NotaryLoader$val notaryParty = myNotaryIdentity?.party ?: throw IllegalStateException("Could not establish notary identity of this node") - MaxLineLength:NotaryServiceFlow.kt$NotaryServiceFlow : FlowLogic - MaxLineLength:NotaryServiceFlow.kt$NotaryServiceFlow$ @Suspendable abstract fun verifyTransaction(requestPayload: NotarisationPayload) MaxLineLength:NotaryServiceFlow.kt$NotaryServiceFlow$"The notary specified on the transaction: [$notary] does not match the notary service's identity: [${service.notaryIdentityKey}] " MaxLineLength:NotaryServiceFlow.kt$NotaryServiceFlow$@Suspendable private MaxLineLength:NotaryServiceFlow.kt$NotaryServiceFlow$abstract - MaxLineLength:NotaryServiceTests.kt$NotaryServiceTests$assertThat(notaryError.cause).hasMessageContaining("Transaction for notarisation contains unknown parameters hash: $hash") - MaxLineLength:NotaryServiceTests.kt$NotaryServiceTests$assertThat(notaryError.cause).hasMessageContaining("Transaction for notarisation doesn't contain network parameters hash.") - MaxLineLength:NotaryServiceTests.kt$NotaryServiceTests.Companion$ fun notariseWithTooManyInputs(node: TestStartedNode, party: Party, notary: Party, network: InternalMockNetwork) MaxLineLength:NotaryServiceTests.kt$NotaryServiceTests.Companion$val signableData = SignableData(tx.id, SignatureMetadata(myInfo.platformVersion, Crypto.findSignatureScheme(myKey).schemeNumberID)) - MaxLineLength:NotarySpec.kt$NotarySpec - MaxLineLength:NotarySpec.kt$NotarySpec$// These extra fields are handled this way to preserve Kotlin wire compatibility wrt additional parameters with default values. constructor(name: CordaX500Name, validating: Boolean = true, rpcUsers: List<User> = emptyList(), verifierType: VerifierType = VerifierType.InMemory, cluster: ClusterSpec? = null, maximumHeapSize: String = "512m"): this(name, validating, rpcUsers, verifierType, cluster) { this.maximumHeapSize = maximumHeapSize } - MaxLineLength:NotaryUtils.kt$"Expected a signature by ${intendedSigner.owningKey.toBase58String()}, but received by ${signature.by.toBase58String()}}" - MaxLineLength:NotaryUtils.kt$require(notary.owningKey.isFulfilledBy(signingKeys)) { "Insufficient signatures to fulfill the notary signing requirement for $notary" } MaxLineLength:NotaryWhitelistTests.kt$NotaryWhitelistTests$ @Test fun `can perform notary change on a de-listed notary`() - MaxLineLength:NotaryWhitelistTests.kt$NotaryWhitelistTests$ @Test fun `can't perform a regular transaction on a de-listed notary`() MaxLineLength:NotaryWhitelistTests.kt$NotaryWhitelistTests$notarySpecs = listOf(MockNetworkNotarySpec(oldNotaryName, validating = isValidating), MockNetworkNotarySpec(newNotaryName, validating = isValidating)) MaxLineLength:NotaryWhitelistTests.kt$NotaryWhitelistTests$private MaxLineLength:NotaryWhitelistTests.kt$NotaryWhitelistTests${ // Issue a state using the old notary. It is currently whitelisted. val stateFakeNotary = issueStateOnOldNotary(oldNotary) // Remove old notary from the whitelist val parameters = aliceNode.services.networkParameters val newParameters = removeOldNotary(parameters) mockNet.nodes.forEach { (it.networkParametersStorage as MockNetworkParametersStorage).setCurrentParametersUnverified(newParameters) } // Re-point the state to the remaining whitelisted notary. The transaction itself should be considered valid, even though the old notary is not whitelisted. val futureChange = aliceNode.services.startFlow(NotaryChangeFlow(stateFakeNotary, newNotary)).resultFuture mockNet.runNetwork() val newSTate = futureChange.getOrThrow() // Create a valid transaction consuming the re-pointed state. val validTxBuilder = TransactionBuilder(newNotary) .addInputState(newSTate) .addCommand(dummyCommand(alice.owningKey)) val validStx = aliceNode.services.signInitialTransaction(validTxBuilder) // The transaction verifies. validStx.verify(aliceNode.services, false) // Notarisation should succeed. val future = runNotaryClient(validStx) future.getOrThrow() } MaxLineLength:NotaryWhitelistTests.kt$NotaryWhitelistTests${ Assume.assumeTrue(isValidating) // Skip the test for non-validating notaries val fakeNotaryKeyPair = generateKeyPair() val fakeNotaryParty = Party(DUMMY_NOTARY_NAME.copy(organisation = "Fake notary"), fakeNotaryKeyPair.public) // Issue a state using an unlisted notary. This transaction should not verify when checked by counterparties. val stateFakeNotary = issueStateWithFakeNotary(fakeNotaryParty, fakeNotaryKeyPair) // Re-point the state to the whitelisted notary. The transaction itself should be considered valid, even though the old notary is not whitelisted. val notaryChangeLtx = changeNotary(stateFakeNotary, fakeNotaryParty, fakeNotaryKeyPair) // Create a valid transaction consuming the re-pointed state. val inputStateValidNotary = notaryChangeLtx.outRef<DummyContract.State>(0) val validTxBuilder = TransactionBuilder(oldNotary) .addInputState(inputStateValidNotary) .addCommand(dummyCommand(alice.owningKey)) val validStx = aliceNode.services.signInitialTransaction(validTxBuilder) // The transaction itself verifies, as no resolution is done here. validStx.verify(aliceNode.services, false) val future = runNotaryClient(validStx) // The notary should reject this transaction – the issue transaction in the dependencies should not verify. val ex = assertFailsWith(NotaryException::class) { future.getOrThrow() } assert(ex.error is NotaryError.TransactionInvalid) assertEquals(validStx.id, ex.txId) } - MaxLineLength:NotaryWhitelistTests.kt$NotaryWhitelistTests${ val notaryChangeTx = NotaryChangeTransactionBuilder( listOf(inputState.ref), fakeNotaryParty, oldNotary, aliceNode.services.networkParametersService.currentHash ).build() val notaryChangeAliceSig = getAliceSig(notaryChangeTx) val notaryChangeNotarySig = run { val metadata = SignatureMetadata(4, Crypto.findSignatureScheme(fakeNotaryParty.owningKey).schemeNumberID) val data = SignableData(notaryChangeTx.id, metadata) fakeNotaryKeyPair.sign(data) } val notaryChangeStx = SignedTransaction(notaryChangeTx, listOf(notaryChangeAliceSig, notaryChangeNotarySig)) aliceNode.services.validatedTransactions.addTransaction(notaryChangeStx) // Resolving the ledger transaction verifies the whitelist checking logic – for notary change transactions the old notary // does not need to be whitelisted. val notaryChangeLtx = notaryChangeStx.resolveNotaryChangeTransaction(aliceNode.services) notaryChangeLtx.verifyRequiredSignatures() return notaryChangeLtx } - MaxLineLength:NotaryWireFormat.kt$NotarisationPayload - MaxLineLength:NotaryWireFormat.kt$NotarisationRequest - MaxLineLength:NotaryWireFormat.kt$NotarisationRequest$/** States this request specifies to be consumed. Sorted to ensure the serialized form does not get affected by the state order. */ val statesToConsume: List<StateRef> get() = _statesToConsumeSorted // Getter required for AMQP serialization - MaxLineLength:NullKeys.kt$NullKeys$/** A signature with a key and value of zero. Useful when you want a signature object that you know won't ever be used. */ val NULL_SIGNATURE = TransactionSignature(ByteArray(32), NullPublicKey, SignatureMetadata(1, -1)) - MaxLineLength:OGStub.kt$BimmAnalysisUtils$first: CurrencyParameterSensitivities MaxLineLength:OGStub.kt$BimmAnalysisUtils$fun computeMargin(combinedRatesProvider: ImmutableRatesProvider?, normalizer: PortfolioNormalizer, calculatorTotal: RwamBimmNotProductClassesCalculator, first: CurrencyParameterSensitivities, second: MultiCurrencyAmount): Triple<Double, Double, Double> - MaxLineLength:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$val defnsCcp1 = RatesCalibrationCsvLoader.load(GROUPS_RESOURCE_CCP1, SETTINGS_RESOURCE_CCP1, CALIBRATION_RESOURCE_CCP1) - MaxLineLength:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$val defnsCcp2 = RatesCalibrationCsvLoader.load(GROUPS_RESOURCE_CCP2, SETTINGS_RESOURCE_CCP2, CALIBRATION_RESOURCE_CCP2) MaxLineLength:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$val marketData = ImmutableMarketData.builder(VAL_DATE).addValueMap(quotesCcp1).addValueMap(quotesCcp2).addTimeSeriesMap(fixings).build() MaxLineLength:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$val marketDataConfig = MarketDataConfig.builder().add(CURVE_GROUP_NAME_CCP1, curveGroupDefinitionCcp1).add(CURVE_GROUP_NAME_CCP2, curveGroupDefinitionCcp2).build() MaxLineLength:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$val tradeInfo = TradeInfo.builder().id(StandardId.of("example", "1")).addAttribute(TradeAttributeType.DESCRIPTION, "Fixed vs Libor 3m").counterparty(ctptyId).settlementDate(LocalDate.of(2014, 9, 12)).build() - MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$PeriodicSchedule.builder() .startDate(LocalDate.of(2014, 9, 12)) .endDate(LocalDate.of(2016, 6, 12)) .frequency(Frequency.P3M) .businessDayAdjustment(BusinessDayAdjustment.of(MODIFIED_FOLLOWING, HolidayCalendarIds.USNY)) MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$PeriodicSchedule.builder() .startDate(LocalDate.of(2014, 9, 12)) .endDate(LocalDate.of(2016, 6, 12)) .stubConvention(StubConvention.SHORT_INITIAL) .frequency(Frequency.P6M) - MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$PeriodicSchedule.builder() .startDate(LocalDate.of(2014, 9, 12)) .endDate(LocalDate.of(2020, 9, 12)) .frequency(Frequency.P3M) .businessDayAdjustment(BusinessDayAdjustment.of(MODIFIED_FOLLOWING, HolidayCalendarIds.USNY)) MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$return SwapTrade.builder().product(Swap.of(payLeg, receiveLeg)).info(TradeInfo.builder().id(StandardId.of("example", "10")).addAttribute(TradeAttributeType.DESCRIPTION, "Zero-coupon fixed vs libor 3m").counterparty(StandardId.of("example", "A")).settlementDate(LocalDate.of(2014, 9, 12)).build()).build() MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$return SwapTrade.builder().product(Swap.of(payLeg, receiveLeg)).info(TradeInfo.builder().id(StandardId.of("example", "11")).addAttribute(TradeAttributeType.DESCRIPTION, "Compounding fixed vs fed funds").counterparty(StandardId.of("example", "A")).settlementDate(LocalDate.of(2014, 2, 5)).build()).build() MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$return SwapTrade.builder().product(Swap.of(payLeg, receiveLeg)).info(TradeInfo.builder().id(StandardId.of("example", "12")).addAttribute(TradeAttributeType.DESCRIPTION, "Compounding fed funds vs libor 3m").counterparty(StandardId.of("example", "A")).settlementDate(LocalDate.of(2014, 9, 12)).build()).build() @@ -7591,7 +4262,6 @@ MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$return SwapTrade.builder().product(Swap.of(payLeg, receiveLeg)).info(TradeInfo.builder().id(StandardId.of("example", "8")).addAttribute(TradeAttributeType.DESCRIPTION, "Fixed vs Libor 6m (interpolated 3m short initial stub)").counterparty(StandardId.of("example", "A")).settlementDate(LocalDate.of(2014, 9, 12)).build()).build() MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$return SwapTrade.builder().product(Swap.of(payLeg, receiveLeg)).info(TradeInfo.builder().id(StandardId.of("example", "9")).addAttribute(TradeAttributeType.DESCRIPTION, "Fixed vs Libor 6m (interpolated 4m short initial stub)").counterparty(StandardId.of("example", "A")).settlementDate(LocalDate.of(2014, 9, 12)).build()).build() MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$return SwapTrade.builder().product(Swap.of(receiveLeg, payLeg)).info(TradeInfo.builder().id(StandardId.of("example", "14")).addAttribute(TradeAttributeType.DESCRIPTION, "GBP Libor 3m vs USD Libor 3m").counterparty(StandardId.of("example", "A")).settlementDate(LocalDate.of(2014, 1, 24)).build()).build() - MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$val calculationResults = ReportCalculationResults.of(valuationDate, trades, columns, results, functions, refData) MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$val payLeg = RateCalculationSwapLeg.builder().payReceive(PayReceive.PAY).accrualSchedule(PeriodicSchedule.builder().startDate(LocalDate.of(2014, 1, 24)).endDate(LocalDate.of(2021, 1, 24)).frequency(Frequency.P3M).businessDayAdjustment(BusinessDayAdjustment.of(MODIFIED_FOLLOWING, HolidayCalendarIds.GBLO)).build()).paymentSchedule(PaymentSchedule.builder().paymentFrequency(Frequency.P3M).paymentDateOffset(DaysAdjustment.NONE).build()).notionalSchedule(NotionalSchedule.of(Currency.GBP, 61600000.0)).calculation(IborRateCalculation.of(IborIndices.GBP_LIBOR_3M)).build() MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$val payLeg = RateCalculationSwapLeg.builder().payReceive(PayReceive.PAY).accrualSchedule(PeriodicSchedule.builder().startDate(LocalDate.of(2014, 1, 24)).endDate(LocalDate.of(2021, 1, 24)).frequency(Frequency.P6M).businessDayAdjustment(BusinessDayAdjustment.of(MODIFIED_FOLLOWING, HolidayCalendarIds.GBLO)).build()).paymentSchedule(PaymentSchedule.builder().paymentFrequency(Frequency.P6M).paymentDateOffset(DaysAdjustment.NONE).build()).notionalSchedule(NotionalSchedule.builder().currency(Currency.USD).amount(ValueSchedule.of(100000000.0)).initialExchange(true).finalExchange(true).build()).calculation(FixedRateCalculation.of(0.03, DayCounts.THIRTY_U_360)).build() MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$val payLeg = RateCalculationSwapLeg.builder().payReceive(PayReceive.PAY).accrualSchedule(PeriodicSchedule.builder().startDate(LocalDate.of(2014, 1, 24)).endDate(LocalDate.of(2021, 1, 24)).frequency(Frequency.P6M).businessDayAdjustment(BusinessDayAdjustment.of(MODIFIED_FOLLOWING, HolidayCalendarIds.GBLO)).build()).paymentSchedule(PaymentSchedule.builder().paymentFrequency(Frequency.P6M).paymentDateOffset(DaysAdjustment.NONE).build()).notionalSchedule(NotionalSchedule.of(Currency.USD, 100000000.0)).calculation(FixedRateCalculation.of(0.03, DayCounts.THIRTY_U_360)).build() @@ -7611,349 +4281,136 @@ MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$val receiveLeg = RateCalculationSwapLeg.builder().payReceive(PayReceive.RECEIVE).accrualSchedule(PeriodicSchedule.builder().startDate(LocalDate.of(2014, 9, 12)).endDate(LocalDate.of(2016, 7, 12)).stubConvention(StubConvention.SHORT_INITIAL).frequency(Frequency.P6M).businessDayAdjustment(BusinessDayAdjustment.of(MODIFIED_FOLLOWING, HolidayCalendarIds.USNY)).build()).paymentSchedule(PaymentSchedule.builder().paymentFrequency(Frequency.P6M).paymentDateOffset(DaysAdjustment.NONE).build()).notionalSchedule(notional).calculation(FixedRateCalculation.of(0.01, DayCounts.THIRTY_U_360)).build() MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$val receiveLeg = RateCalculationSwapLeg.builder().payReceive(PayReceive.RECEIVE).accrualSchedule(PeriodicSchedule.builder().startDate(LocalDate.of(2014, 9, 12)).endDate(LocalDate.of(2020, 9, 12)).frequency(Frequency.P3M).businessDayAdjustment(BusinessDayAdjustment.of(MODIFIED_FOLLOWING, HolidayCalendarIds.USNY)).build()).paymentSchedule(PaymentSchedule.builder().paymentFrequency(Frequency.P3M).paymentDateOffset(DaysAdjustment.NONE).build()).notionalSchedule(notional).calculation(OvernightRateCalculation.builder().index(OvernightIndices.USD_FED_FUND).accrualMethod(OvernightAccrualMethod.AVERAGED).build()).build() MaxLineLength:OGSwapPricingExample.kt$SwapPricingExample$val receiveLeg = RateCalculationSwapLeg.builder().payReceive(PayReceive.RECEIVE).accrualSchedule(PeriodicSchedule.builder().startDate(LocalDate.of(2014, 9, 12)).endDate(LocalDate.of(2021, 9, 12)).frequency(Frequency.P3M).businessDayAdjustment(BusinessDayAdjustment.of(MODIFIED_FOLLOWING, HolidayCalendarIds.USNY)).build()).paymentSchedule(PaymentSchedule.builder().paymentFrequency(Frequency.TERM).paymentDateOffset(DaysAdjustment.NONE).compoundingMethod(CompoundingMethod.STRAIGHT).build()).notionalSchedule(notional).calculation(IborRateCalculation.of(IborIndices.USD_LIBOR_3M)).build() - MaxLineLength:OGTrade.kt$OGTrade$val groups: List<LedgerTransaction.InOutGroup<IRSState, UniqueIdentifier>> = tx.groupStates { state -> state.linearId } - MaxLineLength:ObjectBuilder.kt$ConstructorCaller$"Constructor for ${javaConstructor.declaringClass} (isAccessible=${javaConstructor.isAccessible}) " - MaxLineLength:ObjectBuilder.kt$EvolutionObjectBuilder.Companion$ fun makeProvider(typeIdentifier: TypeIdentifier, constructor: LocalConstructorInformation, localProperties: Map<String, LocalPropertyInformation>, remoteTypeInformation: RemoteTypeInformation.Composable, mustPreserveData: Boolean): () -> ObjectBuilder - MaxLineLength:ObjectBuilder.kt$ObjectBuilder.Companion$ConstructorBasedObjectBuilder(ConstructorCaller(constructor.observedMethod), constructorIndices.values.toIntArray()) - MaxLineLength:ObjectBuilder.kt$ObjectBuilder.Companion$is LocalPropertyInformation.PrivateConstructorPairedProperty -> property.constructorSlot.parameterIndex MaxLineLength:ObjectBuilder.kt$ObjectBuilder.Companion$private - MaxLineLength:ObjectBuilder.kt$ObjectBuilderProvider : - MaxLineLength:ObjectDiffer.kt$DiffTree$is Step -> branches.flatMap { (step, tree) -> tree.toPaths().map { it.copy(path = listOf(step) + it.path) } } - MaxLineLength:ObjectDiffer.kt$ObjectDiffer$val branches = aFields.mapNotNull { field -> diff(field.get(a), field.get(b))?.let { field.name to it } } MaxLineLength:ObjectSerializer.kt$AbstractObjectSerializer$override - MaxLineLength:ObjectSerializer.kt$ComposableObjectReader$"${propertySerializers.size} properties in described type ${typeIdentifier.prettyPrint(false)}" - MaxLineLength:ObjectSerializer.kt$ComposableObjectReader$fun readObject(obj: Any, schemas: SerializationSchemas, input: DeserializationInput, context: SerializationContext): Any MaxLineLength:ObjectSerializer.kt$ComposableObjectSerializer$override - MaxLineLength:ObjectSerializer.kt$ComposableObjectWriter$fun writeObject(obj: Any, data: Data, type: Type, output: SerializationOutput, context: SerializationContext, debugIndent: Int) MaxLineLength:ObjectSerializer.kt$EvolutionObjectSerializer$override - MaxLineLength:ObjectSerializer.kt$EvolutionObjectSerializer.Companion$ComposableTypePropertySerializer.makeForEvolution(name, isCalculated, property.type.typeIdentifier, type) - MaxLineLength:ObjectSerializer.kt$EvolutionObjectSerializer.Companion$val type = localProperty?.type?.observedType ?: property.type.typeIdentifier.getLocalType(classLoader) - MaxLineLength:ObjectSerializer.kt$ObjectSerializer.Companion$serializers.isNotEmpty() -> "Registered custom serializers:\n ${serializers.joinToString("\n ")}" - MaxLineLength:ObjectSerializer.kt$ObjectSerializer.Companion$val writer = ComposableObjectWriter(typeNotation, typeInformation.interfacesOrEmptyList, propertySerializers) - MaxLineLength:Obligation.kt$ fun <P : AbstractParty, T : Any> sumAmountsDue(balances: Map<Pair<P, P>, Amount<T>>): Map<P, Long> MaxLineLength:Obligation.kt$ fun <P : Any> extractAmountsDue(product: Obligation.Terms<P>, states: Iterable<Obligation.State<P>>): Map<Pair<AbstractParty, AbstractParty>, Amount<Obligation.Terms<P>>> MaxLineLength:Obligation.kt$Obligation$"amount in settle command ${command.value.amount} matches settled total $totalAmountSettled" using (command.value.amount == totalAmountSettled) - MaxLineLength:Obligation.kt$Obligation$"amounts paid must match recipients to settle" using inputs.map { it.owner }.containsAll(amountReceivedByOwner.keys) - MaxLineLength:Obligation.kt$Obligation$"output state corresponds exactly to input state, with lifecycle changed" using (expectedOutput == actualOutput) - MaxLineLength:Obligation.kt$Obligation$// Insist that we can be the only contract consuming inputs, to ensure no other contract can think it's being // settled as well "all move commands relate to this contract" using (moveCommands.map { it.value.contract } .all { it == null || it == this@Obligation.javaClass }) // Settle commands exclude all other commands, so we don't need to check for contracts moving at the same // time. "amounts paid must match recipients to settle" using inputs.map { it.owner }.containsAll(amountReceivedByOwner.keys) "amount in settle command ${command.value.amount} matches settled total $totalAmountSettled" using (command.value.amount == totalAmountSettled) "signatures are present from all obligors" using command.signers.containsAll(requiredSigners) "there are no zero sized inputs" using inputs.none { it.amount.quantity == 0L } "at obligor $obligor the obligations after settlement balance" using (inputAmount == outputAmount + Amount(totalPenniesSettled, groupingKey)) - MaxLineLength:Obligation.kt$Obligation$NetType.CLOSE_OUT -> require(command.signers.intersect(involvedParties).isNotEmpty()) { "any involved party has signed" } - MaxLineLength:Obligation.kt$Obligation$NetType.PAYMENT -> require(command.signers.containsAll(involvedParties)) { "all involved parties have signed" } MaxLineLength:Obligation.kt$Obligation$val exitCommand = tx.commands.select<Commands.Exit<P>>(parties = null, signers = exitKeys).singleOrNull { it.value.amount.token == key } MaxLineLength:Obligation.kt$Obligation$val inputAmount = inputs.sumObligationsOrNull<P>() ?: throw IllegalArgumentException("there is at least one obligation input for this group") MaxLineLength:Obligation.kt$Obligation$val inputAmount: Amount<Issued<Terms<P>>> = inputs.sumObligationsOrNull() ?: throw IllegalArgumentException("there is at least one obligation input for this group") MaxLineLength:Obligation.kt$Obligation$val involvedParties: Set<PublicKey> = groupInputs.map { it.beneficiary.owningKey }.union(groupInputs.map { it.obligor.owningKey }).toSet() - MaxLineLength:Obligation.kt$Obligation${ val template = key.template // Create two maps of balances from obligors to beneficiaries, one for input states, the other for output states. val inputBalances = extractAmountsDue(template, groupInputs) val outputBalances = extractAmountsDue(template, groupOutputs) // Sum the columns of the matrices. This will yield the net amount payable to/from each party to/from all other participants. // The two summaries must match, reflecting that the amounts owed match on both input and output. requireThat { "all input states use the same template" using (groupInputs.all { it.template == template }) "all output states use the same template" using (groupOutputs.all { it.template == template }) "amounts owed on input and output must match" using (sumAmountsDue(inputBalances) == sumAmountsDue (outputBalances)) } // TODO: Handle proxies nominated by parties, i.e. a central clearing service val involvedParties: Set<PublicKey> = groupInputs.map { it.beneficiary.owningKey }.union(groupInputs.map { it.obligor.owningKey }).toSet() when (command.value.type) { // For close-out netting, allow any involved party to sign NetType.CLOSE_OUT -> require(command.signers.intersect(involvedParties).isNotEmpty()) { "any involved party has signed" } // Require signatures from all parties (this constraint can be changed for other contracts, and is used as a // placeholder while exact requirements are established), or fail the transaction. NetType.PAYMENT -> require(command.signers.containsAll(involvedParties)) { "all involved parties have signed" } } } - MaxLineLength:Obligation.kt$Obligation.Commands$SetLifecycle : CommandData - MaxLineLength:Obligation.kt$Obligation.State$override fun withNewOwner(newOwner: AbstractParty) MaxLineLength:Obligation.kt$infix fun <T : Any> Obligation.State<T>.between(parties: Pair<AbstractParty, AbstractParty>) - MaxLineLength:ObligationTests.kt$ObligationTests$ @Test fun `generate close-out net transaction with remainder`() - MaxLineLength:ObligationTests.kt$ObligationTests$ @Test fun `generate payment net transaction with remainder`() MaxLineLength:ObligationTests.kt$ObligationTests$ObligationUtils.generatePaymentNetting(this, obligationAliceToBob.state.data.amount.token, DUMMY_NOTARY, obligationAliceToBob, obligationBobToAlice) MaxLineLength:ObligationTests.kt$ObligationTests$ObligationUtils.generatePaymentNetting(this, obligationAliceToBobState.amount.token, DUMMY_NOTARY, obligationAliceToBob, obligationBobToAlice) MaxLineLength:ObligationTests.kt$ObligationTests$ObligationUtils.generateSettle(this, listOf(obligationTx.outRef<Obligation.State<Currency>>(0)), listOf(cashTx.outRef(0)), Cash.Commands.Move(), DUMMY_NOTARY) MaxLineLength:ObligationTests.kt$ObligationTests$assertNotEquals(oneKDollarsFromMiniToMega.bilateralNetState, oneKDollarsFromMiniToMega.copy(template = megaCorpPoundSettlement).bilateralNetState) - MaxLineLength:ObligationTests.kt$ObligationTests$command(ALICE_PUBKEY, Obligation.Commands.Settle(Amount(oneMillionDollars.quantity / 2, inState.amount.token))) - MaxLineLength:ObligationTests.kt$ObligationTests$command(ALICE_PUBKEY, Obligation.Commands.Settle(Amount(oneMillionDollars.quantity, inState.amount.token))) - MaxLineLength:ObligationTests.kt$ObligationTests$command(ALICE_PUBKEY, Obligation.Commands.Settle(Amount(oneUnitFcoj.quantity, oneUnitFcojObligation.amount.token))) MaxLineLength:ObligationTests.kt$ObligationTests$command(CHARLIE.owningKey, Obligation.Commands.Exit(Amount(200.DOLLARS.quantity, inState.amount.token.copy(product = megaCorpDollarSettlement)))) MaxLineLength:ObligationTests.kt$ObligationTests$command(CHARLIE.owningKey, Obligation.Commands.Exit(Amount(200.POUNDS.quantity, inState.amount.token.copy(product = megaCorpPoundSettlement)))) MaxLineLength:ObligationTests.kt$ObligationTests$fiveKDollarsFromMegaToMega.copy(template = megaCorpDollarSettlement.copy(acceptableContracts = NonEmptySet.of(SecureHash.randomSHA256()))).bilateralNetState MaxLineLength:ObligationTests.kt$ObligationTests$fiveKDollarsFromMegaToMega.copy(template = megaCorpDollarSettlement.copy(acceptableIssuedProducts = miniCorpIssuer)).bilateralNetState - MaxLineLength:ObligationTests.kt$ObligationTests$fiveKDollarsFromMegaToMega.copy(template = megaCorpDollarSettlement.copy(dueBefore = sixPm)).bilateralNetState - MaxLineLength:ObligationTests.kt$ObligationTests$fiveKDollarsFromMegaToMini - MaxLineLength:ObligationTests.kt$ObligationTests$get() = Obligation.State(Obligation.Lifecycle.NORMAL, DUMMY_OBLIGATION_ISSUER, token.OBLIGATION_DEF, quantity, NULL_PARTY) - MaxLineLength:ObligationTests.kt$ObligationTests$get() = Obligation.Terms(NonEmptySet.of(cashContractBytes.sha256() as SecureHash), NonEmptySet.of(this), TEST_TX_TIME) - MaxLineLength:ObligationTests.kt$ObligationTests$input(Obligation.PROGRAM_ID, inState.copy(template = inState.template.copy(acceptableIssuedProducts = megaIssuedDollars))) - MaxLineLength:ObligationTests.kt$ObligationTests$input(Obligation.PROGRAM_ID, inState.copy(template = inState.template.copy(acceptableIssuedProducts = megaIssuedPounds))) - MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, "Alice's $1,000,000 obligation to Bob", oneMillionDollars.OBLIGATION between Pair(ALICE, BOB)) - MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, "Alice's $500,000 obligation to Bob", halfAMillionDollars.OBLIGATION between Pair(ALICE, BOB)) - MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, "Alice's 1 FCOJ obligation to Bob", oneUnitFcojObligation between Pair(ALICE, BOB)) MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, "Alice's defaulted $1,000,000 obligation to Bob", (oneMillionDollars.OBLIGATION between Pair(ALICE, BOB) at futureTestTime).copy(lifecycle = Lifecycle.DEFAULTED)) MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, "Alice's defaulted $1,000,000 obligation to Bob", (oneMillionDollars.OBLIGATION between Pair(ALICE, BOB) at pastTestTime).copy(lifecycle = Lifecycle.DEFAULTED)) MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, "Alice's defaulted $1,000,000 obligation to Bob", (oneMillionDollars.OBLIGATION between Pair(ALICE, BOB)).copy(lifecycle = Lifecycle.DEFAULTED)) - MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, "Bob's $1,000,000 obligation to Alice", oneMillionDollars.OBLIGATION between Pair(BOB, ALICE)) MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, "MegaCorp's $1,000,000 obligation to Alice", oneMillionDollars.OBLIGATION between Pair(MEGA_CORP, ALICE)) MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, "MegaCorp's $1,000,000 obligation to Bob", oneMillionDollars.OBLIGATION between Pair(MEGA_CORP, BOB)) - MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, "change", oneMillionDollars.splitEvenly(2).first().OBLIGATION between Pair(ALICE, BOB)) - MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, inState.copy(beneficiary = AnonymousParty(BOB_PUBKEY), quantity = 200000L)) MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, inState.copy(template = inState.template.copy(acceptableIssuedProducts = megaIssuedDollars), quantity = inState.quantity - 200.DOLLARS.quantity)) MaxLineLength:ObligationTests.kt$ObligationTests$output(Obligation.PROGRAM_ID, inState.copy(template = inState.template.copy(acceptableIssuedProducts = megaIssuedPounds), quantity = inState.quantity - 200.POUNDS.quantity)) - MaxLineLength:ObligationTests.kt$ObligationTests$private - MaxLineLength:ObligationTests.kt$ObligationTests$private inline - MaxLineLength:ObligationTests.kt$ObligationTests$private val cashContractBytes = fakeAttachment("file1.txt", "https://www.big-book-of-banking-law.gov/cash-claims.html") MaxLineLength:ObligationTests.kt$ObligationTests$private val ledgerServices get() = MockServices(listOf("net.corda.finance.contracts.asset", "net.corda.testing.contracts"), MEGA_CORP.name, identityService) - MaxLineLength:ObligationTests.kt$ObligationTests$val commodityContractBytes = fakeAttachment("file1.txt", "https://www.big-book-of-banking-law.gov/commodity-claims.html") MaxLineLength:ObligationTests.kt$ObligationTests$val defaultedObligation: Obligation.State<Currency> = (oneMillionDollars.OBLIGATION between Pair(ALICE, BOB)).copy(lifecycle = Lifecycle.DEFAULTED) - MaxLineLength:ObligationTests.kt$ObligationTests$val expected = obligationBobToAliceState.copy(quantity = obligationBobToAliceState.quantity - obligationAliceToBobState.quantity) - MaxLineLength:ObligationTests.kt$ObligationTests$val expected: Map<Pair<AbstractParty, AbstractParty>, Amount<Currency>> = emptyMap() // Zero balances are stripped before returning MaxLineLength:ObligationTests.kt$ObligationTests$val expected: Map<Pair<AbstractParty, AbstractParty>, Amount<Obligation.Terms<Currency>>> = mapOf(Pair(Pair(MEGA_CORP, MINI_CORP), Amount(amount.quantity, amount.token.product))) MaxLineLength:ObligationTests.kt$ObligationTests$val obligationAliceToBob = getStateAndRef((2000000.DOLLARS `issued by` defaultIssuer).OBLIGATION between Pair(ALICE, BOB), Obligation.PROGRAM_ID) - MaxLineLength:ObligationTests.kt$ObligationTests$val obligationAliceToBob = getStateAndRef(oneMillionDollars.OBLIGATION between Pair(ALICE, BOB), Obligation.PROGRAM_ID) MaxLineLength:ObligationTests.kt$ObligationTests$val obligationBobToAlice = getStateAndRef((2000000.DOLLARS `issued by` defaultIssuer).OBLIGATION between Pair(BOB, ALICE), Obligation.PROGRAM_ID) - MaxLineLength:ObligationTests.kt$ObligationTests$val obligationBobToAlice = getStateAndRef(oneMillionDollars.OBLIGATION between Pair(BOB, ALICE), Obligation.PROGRAM_ID) MaxLineLength:ObligationTests.kt$ObligationTests$val obligationDef = Obligation.Terms(NonEmptySet.of(commodityContractBytes.sha256() as SecureHash), NonEmptySet.of(defaultFcoj), TEST_TX_TIME) MaxLineLength:ObligationTests.kt$ObligationTests$val pounds = Obligation.State(Lifecycle.NORMAL, MINI_CORP, megaCorpPoundSettlement, 658.POUNDS.quantity, AnonymousParty(BOB_PUBKEY)) - MaxLineLength:ObligationTests.kt$ObligationTests$val simple: Map<Pair<AbstractParty, AbstractParty>, Amount<Currency>> = mapOf(Pair(Pair(ALICE, BOB), Amount(100000000, GBP))) - MaxLineLength:ObligationTests.kt$ObligationTests$val txState = TransactionState(state, contractClassName, DUMMY_NOTARY, constraint = AlwaysAcceptAttachmentConstraint) MaxLineLength:ObligationTests.kt$ObligationTests.<no name provided>$override fun loadState(stateRef: StateRef): TransactionState<*> - MaxLineLength:ObligationUtils.kt$ObligationUtils$ @JvmStatic fun <P : Any> generateCloseOutNetting(tx: TransactionBuilder, signer: AbstractParty, vararg inputs: StateAndRef<Obligation.State<P>>) MaxLineLength:ObligationUtils.kt$ObligationUtils$"all obligation states are in the normal state" using (statesAndRefs.all { it.state.data.lifecycle == Obligation.Lifecycle.NORMAL }) - MaxLineLength:ObligationUtils.kt$ObligationUtils$"all obligation states have the same beneficiary" using (statesAndRefs.all { it.state.data.beneficiary == obligationOwner }) - MaxLineLength:ObligationUtils.kt$ObligationUtils$"all obligation states have the same obligor" using (statesAndRefs.all { it.state.data.obligor == obligationIssuer }) - MaxLineLength:ObligationUtils.kt$ObligationUtils$"all states are in the normal lifecycle state " using (states.all { it.lifecycle == Obligation.Lifecycle.NORMAL }) - MaxLineLength:ObligationUtils.kt$ObligationUtils$Obligation.State(Obligation.Lifecycle.NORMAL, obligor, issuanceDef, amount.quantity, beneficiary) - MaxLineLength:ObligationUtils.kt$ObligationUtils$deriveState = { state, amount, owner -> state.copy(data = state.data.withNewOwnerAndAmount(amount, owner)) } - MaxLineLength:ObligationUtils.kt$ObligationUtils$private - MaxLineLength:ObligationUtils.kt$ObligationUtils$require(states.all { it.lifecycle == existingLifecycle }) { "initial lifecycle must be $existingLifecycle for all input states" } MaxLineLength:ObligationUtils.kt$ObligationUtils$tx.addCommand(Obligation.Commands.Settle(Amount((obligationTotal - obligationRemaining).quantity, issuanceDef)), obligationIssuer.owningKey) MaxLineLength:ObligationUtils.kt$ObligationUtils$tx.addOutputState(Obligation.State(Obligation.Lifecycle.NORMAL, obligationIssuer, template, obligationRemaining.quantity, obligationOwner), Obligation.PROGRAM_ID, notary) MaxLineLength:ObligationUtils.kt$ObligationUtils$tx.addOutputState(assetState.withNewOwnerAndAmount(assetState.amount - change, assetState.owner), Obligation.PROGRAM_ID, notary) - MaxLineLength:ObligationUtils.kt$ObligationUtils$tx.addOutputState(assetState.withNewOwnerAndAmount(assetState.amount, obligationOwner), Obligation.PROGRAM_ID, notary) - MaxLineLength:ObligationUtils.kt$ObligationUtils$tx.addOutputState(assetState.withNewOwnerAndAmount(change, obligationOwner), Obligation.PROGRAM_ID, notary) - MaxLineLength:ObligationUtils.kt$ObligationUtils$val changeOwner = assetStates.map { it.state.data.owner }.toSet().firstOrNull() ?: throw InsufficientBalanceException(amountIssued) - MaxLineLength:ObligationUtils.kt$ObligationUtils${ val states = statesAndRefs.map { it.state } val obligationIssuer = states.first().data.obligor val obligationOwner = states.first().data.beneficiary requireThat { "all fungible asset states use the same notary" using (assetStatesAndRefs.all { it.state.notary == notary }) "all obligation states are in the normal state" using (statesAndRefs.all { it.state.data.lifecycle == Obligation.Lifecycle.NORMAL }) "all obligation states use the same notary" using (statesAndRefs.all { it.state.notary == notary }) "all obligation states have the same obligor" using (statesAndRefs.all { it.state.data.obligor == obligationIssuer }) "all obligation states have the same beneficiary" using (statesAndRefs.all { it.state.data.beneficiary == obligationOwner }) } // TODO: A much better (but more complex) solution would be to have two iterators, one for obligations, // one for the assets, and step through each in a semi-synced manner. For now however we just bundle all the states // on each side together val issuanceDef = getIssuanceDefinitionOrThrow(statesAndRefs.map { it.state.data }) val template: Obligation.Terms<P> = issuanceDef.product val obligationTotal: Amount<P> = Amount(states.map { it.data }.sumObligations<P>().quantity, template.product) var obligationRemaining: Amount<P> = obligationTotal val assetSigners = HashSet<AbstractParty>() statesAndRefs.forEach { tx.addInputState(it) } // Move the assets to the new beneficiary assetStatesAndRefs.forEach { ref -> if (obligationRemaining.quantity > 0L) { tx.addInputState(ref) val assetState = ref.state.data val amount = Amount(assetState.amount.quantity, assetState.amount.token.product) obligationRemaining -= if (obligationRemaining >= amount) { tx.addOutputState(assetState.withNewOwnerAndAmount(assetState.amount, obligationOwner), Obligation.PROGRAM_ID, notary) amount } else { val change = Amount(obligationRemaining.quantity, assetState.amount.token) // Split the state in two, sending the change back to the previous beneficiary tx.addOutputState(assetState.withNewOwnerAndAmount(change, obligationOwner), Obligation.PROGRAM_ID, notary) tx.addOutputState(assetState.withNewOwnerAndAmount(assetState.amount - change, assetState.owner), Obligation.PROGRAM_ID, notary) Amount(0L, obligationRemaining.token) } assetSigners.add(assetState.owner) } } // If we haven't cleared the full obligation, add the remainder as an output if (obligationRemaining.quantity > 0L) { tx.addOutputState(Obligation.State(Obligation.Lifecycle.NORMAL, obligationIssuer, template, obligationRemaining.quantity, obligationOwner), Obligation.PROGRAM_ID, notary) } else { // Destroy all of the states } // Add the asset move command and obligation settle tx.addCommand(moveCommand, assetSigners.map { it.owningKey }) tx.addCommand(Obligation.Commands.Settle(Amount((obligationTotal - obligationRemaining).quantity, issuanceDef)), obligationIssuer.owningKey) } MaxLineLength:ObservableFold.kt$ fun <A, K> Observable<A>.recordAsAssociation(toKey: (A) -> K, merge: (K, oldValue: A, newValue: A) -> A = { _, _, newValue -> newValue }): ObservableMap<K, A> - MaxLineLength:ObservableFold.kt$ fun <T, R> Observable<T>.fold(accumulator: R, folderFun: (R, T) -> Unit): R - MaxLineLength:ObservableUtilities.kt$ fun <A> Collection<ObservableValue<out A>>.sequence(): ObservableList<A> - MaxLineLength:ObservableUtilities.kt$ fun <K : Any, A : Any, B> ObservableList<out A>.associateByAggregation(toKey: (A) -> K, assemble: (K, A) -> B): ObservableMap<K, ObservableList<B>> - MaxLineLength:ObservableUtilities.kt$ fun <K : Any, A : Any> ObservableList<out A>.associateByAggregation(toKey: (A) -> K): ObservableMap<K, ObservableList<A>> - MaxLineLength:ObservableUtilities.kt$Pair(left, ChosenList(rightValue.map { it ?: FXCollections.emptyObservableList() }, "ChosenList from leftOuterJoin")) - MaxLineLength:ObservableUtilities.kt$net.corda.client.jfx.utils.ObservableUtilities.kt - MaxLineLength:ObservableUtilities.kt$return AssociatedList(AggregatedList(this, toKey) { key, members -> Pair(key, members) }, { it.first }) { key, pair -> pair.second.map { assemble(key, it) } } + MaxLineLength:ObservableUtilities.kt$ @Suppress("UNCHECKED_CAST") fun <A> Collection<ObservableValue<out A>>.sequence(): ObservableList<A> + MaxLineLength:ObservableUtilities.kt$ @Suppress("UNCHECKED_CAST") fun <K : Any, A : Any, B> ObservableList<out A>.associateByAggregation(toKey: (A) -> K, assemble: (K, A) -> B): ObservableMap<K, ObservableList<B>> MaxLineLength:ObservableUtilities.kt${ //TODO This is a tactical work round for an issue with SAM conversion (https://youtrack.jetbrains.com/issue/ALL-1552) so that the M10 explorer works. return uncheckedCast(uncheckedCast<Any, ObservableList<A?>>(this).filtered { t -> t != null }) } - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests$StartMessageChainFlow : FlowLogic - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests$alice.services.startFlow(SplitMessagesFlow(message, bob.info.singleIdentity(), notary)).resultFuture.getOrThrow() - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests$node.services.startFlow(SendTransaction(regulator.info.singleIdentity(), transactionList[transactionIdx])).resultFuture.getOrThrow() - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.ContinueMessageChainFlow$val txCommand = Command(MessageChainContract.Commands.Send(), messageState.participants.map { it.owningKey }) - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.ContinueMessageChainFlow.Companion$FINALISING_TRANSACTION : Step - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.ContinueMessageChainFlow.Companion$fun tracker() - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.SplitMessagesFlow$val txCommand = Command(MessageChainContract.Commands.Split(), listOf(ourIdentity.owningKey, counterparty.owningKey)) - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.SplitMessagesFlow.Companion$FINALISING_TRANSACTION : Step - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.SplitMessagesFlow.Companion$fun tracker() MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.StartMessageChainFlow$val txBuilder = TransactionBuilder(notary).withItems(StateAndContract(messageState, MESSAGE_CHAIN_CONTRACT_PROGRAM_ID), txCommand) - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.StartMessageChainFlow$val txCommand = Command(MessageChainContract.Commands.Send(), messageState.participants.map { it.owningKey }) - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.StartMessageChainFlow.Companion$FINALISING_TRANSACTION : Step - MaxLineLength:ObserverNodeTransactionTests.kt$ObserverNodeTransactionTests.StartMessageChainFlow.Companion$fun tracker() MaxLineLength:OffsetDateTimeSerializer.kt$OffsetDateTimeSerializer : Proxy - MaxLineLength:OffsetDateTimeSerializer.kt$OffsetDateTimeSerializer$override fun toProxy(obj: OffsetDateTime): OffsetDateTimeProxy MaxLineLength:OffsetDateTimeSerializer.kt$OffsetDateTimeSerializer$override val additionalSerializers: Iterable<CustomSerializer<out Any>> = listOf(LocalDateTimeSerializer(factory), ZoneIdSerializer(factory)) MaxLineLength:OffsetTimeSerializer.kt$OffsetTimeSerializer : Proxy MaxLineLength:OffsetTimeSerializer.kt$OffsetTimeSerializer$override val additionalSerializers: Iterable<CustomSerializer<out Any>> = listOf(LocalTimeSerializer(factory), ZoneIdSerializer(factory)) - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset$abstract - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset$abstract fun extractCommands(commands: Collection<CommandWithParties<CommandData>>): Collection<CommandWithParties<C>> - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset$val changeOwner = assetStates.map { it.state.data.owner }.toSet().firstOrNull() ?: throw InsufficientBalanceException(amountIssued) - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion$ @Throws(InsufficientBalanceException::class) @JvmStatic @Deprecated("Replaced with generateExit() which takes in a party to pay change to") fun <S : FungibleAsset<T>, T : Any> generateExit(tx: TransactionBuilder, amountIssued: Amount<Issued<T>>, assetStates: List<StateAndRef<S>>, deriveState: (TransactionState<S>, Amount<Issued<T>>, AbstractParty) -> TransactionState<S>, generateMoveCommand: () -> CommandData, generateExitCommand: (Amount<Issued<T>>) -> CommandData): Set<PublicKey> - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion$ @Throws(InsufficientBalanceException::class) @JvmStatic fun <S : FungibleAsset<T>, T : Any> generateExit(tx: TransactionBuilder, amountIssued: Amount<Issued<T>>, assetStates: List<StateAndRef<S>>, payChangeTo: AbstractParty, deriveState: (TransactionState<S>, Amount<Issued<T>>, AbstractParty) -> TransactionState<S>, generateMoveCommand: () -> CommandData, generateExitCommand: (Amount<Issued<T>>) -> CommandData): Set<PublicKey> - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion$amount: Amount<T> MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion$deriveState: (TransactionState<S>, Amount<Issued<T>>, AbstractParty) -> TransactionState<S> - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion$generateExitCommand: (Amount<Issued<T>>) -> CommandData MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion$generateMoveCommand: () -> CommandData - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion$log.trace { "Gathered coins: requested $amount, available $gatheredAmount, change: ${gatheredAmount - amount}" } - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion$remainingFromEachIssuer[remainingFromEachIssuer.lastIndex] = Pair(token, Amount(delta, token)) - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion$return generateExit(tx, amountIssued, assetStates, owner, deriveState, generateMoveCommand, generateExitCommand) - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion$return generateSpend(tx, listOf(PartyAndAmount(to, amount)), acceptableStates, payChangeTo, deriveState, generateMoveCommand) - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion$val owner = assetStates.map { it.state.data.owner }.toSet().firstOrNull() ?: throw InsufficientBalanceException(amountIssued) - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion${ // Discussion // // This code is analogous to the Wallet.send() set of methods in bitcoinj, and has the same general outline. // // First we must select a set of asset states (which for convenience we will call 'coins' here, as in bitcoinj). // The input states can be considered our "vault", and may consist of different products, and with different // issuers and deposits. // // Coin selection is a complex problem all by itself and many different approaches can be used. It is easily // possible for different actors to use different algorithms and approaches that, for example, compete on // privacy vs efficiency (number of states created). Some spends may be artificial just for the purposes of // obfuscation and so on. // // Having selected input states of the correct asset, we must craft output states for the amount we're sending and // the "change", which goes back to us. The change is required to make the amounts balance. We may need more // than one change output in order to avoid merging assets from different deposits. The point of this design // is to ensure that ledger entries are immutable and globally identifiable. // // Finally, we add the states to the provided partial transaction. // TODO: We should be prepared to produce multiple transactions spending inputs from // different notaries, or at least group states by notary and take the set with the // highest total value. // TODO: Check that re-running this on the same transaction multiple times does the right thing. // The notary may be associated with a locked state only. tx.notary = acceptableStates.firstOrNull()?.state?.notary // Calculate the total amount we're sending (they must be all of a compatible token). val totalSendAmount = payments.map { it.amount }.sumOrThrow() // Select a subset of the available states we were given that sums up to >= totalSendAmount. val (gathered, gatheredAmount) = gatherCoins(acceptableStates, totalSendAmount) check(gatheredAmount >= totalSendAmount) val keysUsed = gathered.map { it.state.data.owner.owningKey } // Now calculate the output states. This is complicated by the fact that a single payment may require // multiple output states, due to the need to keep states separated by issuer. We start by figuring out // how much we've gathered for each issuer: this map will keep track of how much we've used from each // as we work our way through the payments. val statesGroupedByIssuer = gathered.groupBy { it.state.data.amount.token } val remainingFromEachIssuer = statesGroupedByIssuer .mapValues { it.value.map { it.state.data.amount }.sumOrThrow() }.toList().toMutableList() val outputStates = mutableListOf<TransactionState<S>>() for ((party, paymentAmount) in payments) { var remainingToPay = paymentAmount.quantity while (remainingToPay > 0) { val (token, remainingFromCurrentIssuer) = remainingFromEachIssuer.last() val templateState = statesGroupedByIssuer[token]!!.first().state val delta = remainingFromCurrentIssuer.quantity - remainingToPay when { delta > 0 -> { // The states from the current issuer more than covers this payment. outputStates += deriveState(templateState, Amount(remainingToPay, token), party) remainingFromEachIssuer[remainingFromEachIssuer.lastIndex] = Pair(token, Amount(delta, token)) remainingToPay = 0 } delta == 0L -> { // The states from the current issuer exactly covers this payment. outputStates += deriveState(templateState, Amount(remainingToPay, token), party) remainingFromEachIssuer.removeAt(remainingFromEachIssuer.lastIndex) remainingToPay = 0 } delta < 0 -> { // The states from the current issuer don't cover this payment, so we'll have to use >1 output // state to cover this payment. outputStates += deriveState(templateState, remainingFromCurrentIssuer, party) remainingFromEachIssuer.removeAt(remainingFromEachIssuer.lastIndex) remainingToPay -= remainingFromCurrentIssuer.quantity } } } } // Whatever values we have left over for each issuer must become change outputs. for ((token, amount) in remainingFromEachIssuer) { val templateState = statesGroupedByIssuer[token]!!.first().state outputStates += deriveState(templateState, amount, payChangeTo) } for (state in gathered) tx.addInputState(state) for (state in outputStates) tx.addOutputState(state) // What if we already have a move command with the right keys? Filter it out here or in platform code? tx.addCommand(generateMoveCommand(), keysUsed) return Pair(tx, keysUsed) } - MaxLineLength:OnLedgerAsset.kt$OnLedgerAsset.Companion${ // The states from the current issuer don't cover this payment, so we'll have to use >1 output // state to cover this payment. outputStates += deriveState(templateState, remainingFromCurrentIssuer, party) remainingFromEachIssuer.removeAt(remainingFromEachIssuer.lastIndex) remainingToPay -= remainingFromCurrentIssuer.quantity } - MaxLineLength:OpaqueBytesSubSequenceSerializer.kt$OpaqueBytesSubSequenceSerializer$CustomSerializer.Proxy<OpaqueBytesSubSequence, OpaqueBytes>(OpaqueBytesSubSequence::class.java, OpaqueBytes::class.java, factory) - MaxLineLength:OpaqueBytesSubSequenceSerializer.kt$OpaqueBytesSubSequenceSerializer$override fun fromProxy(proxy: OpaqueBytes): OpaqueBytesSubSequence MaxLineLength:OpenGammaCordaUtils.kt$ fun InitialMarginTriple.toCordaCompatible() MaxLineLength:OpenGammaCordaUtils.kt$return MultiCurrencyAmount.of(this.amounts.map { CurrencyAmount.of(Currency.of(it.currency.code).serialize().deserialize(), twoDecimalPlaces((it.amount))) }) MaxLineLength:OptionalSerializer.kt$OptionalSerializer : Proxy MaxLineLength:OracleNodeTearOffTests.kt$OracleNodeTearOffTests$TransactionBuilder(DUMMY_NOTARY) .withItems(TransactionState(1000.DOLLARS.CASH issuedBy dummyCashIssuer.party ownedBy alice.party, Cash.PROGRAM_ID, DUMMY_NOTARY)) - MaxLineLength:OracleNodeTearOffTests.kt$OracleNodeTearOffTests$TransactionState(1000.DOLLARS.CASH issuedBy dummyCashIssuer.party ownedBy alice.party, Cash.PROGRAM_ID, DUMMY_NOTARY) - MaxLineLength:OverridePKSerializerTest.kt$OverridePKSerializerTest.TestPublicKeySerializer$get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. - MaxLineLength:P2PFlowsDrainingModeTest.kt$P2PFlowsDrainingModeTest$driver MaxLineLength:P2PFlowsDrainingModeTest.kt$P2PFlowsDrainingModeTest$nodeA.rpc.hasCancelledDrainingShutdown().doOnError(Throwable::printStackTrace).doOnError { successful = false }.doOnCompleted { successful = true }.doAfterTerminate(latch::countDown).subscribe() MaxLineLength:P2PFlowsDrainingModeTest.kt$P2PFlowsDrainingModeTest$nodeA.rpc.waitForShutdown().doOnError(Throwable::printStackTrace).doOnError { successful = false }.doOnCompleted(nodeA::stop) MaxLineLength:P2PFlowsDrainingModeTest.kt$P2PFlowsDrainingModeTest$nodeA.waitForShutdown().doOnError(Throwable::printStackTrace).doAfterTerminate { successful = false }.doAfterTerminate(latch::countDown).subscribe() MaxLineLength:P2PFlowsDrainingModeTest.kt$P2PFlowsDrainingModeTest$nodeA.waitForShutdown().doOnError(Throwable::printStackTrace).doOnError { successful = false }.doOnCompleted { successful = true }.doAfterTerminate(latch::countDown).subscribe() MaxLineLength:P2PFlowsDrainingModeTest.kt$P2PFlowsDrainingModeTest$val nodeA = startNode(providedName = ALICE_NAME, rpcUsers = users).getOrThrow() var successful = false val latch = CountDownLatch(1) // This would not be needed, as `terminate(true)` sets draining mode anyway, but it's here to ensure that it removes the persistent value anyway. nodeA.rpc.setFlowsDrainingModeEnabled(true) nodeA.rpc.waitForShutdown().doOnError(Throwable::printStackTrace).doOnError { successful = false }.doOnCompleted(nodeA::stop).doOnCompleted { val nodeARestarted = startNode(providedName = ALICE_NAME, rpcUsers = users).getOrThrow() successful = !nodeARestarted.rpc.isFlowsDrainingModeEnabled() }.doAfterTerminate(latch::countDown).subscribe() nodeA.rpc.terminate(true) latch.await() assertThat(successful).isTrue() - MaxLineLength:P2PMessageDeduplicator.kt$P2PMessageDeduplicator$fromPersistentEntity = { Pair(DeduplicationId(it.id), MessageMeta(it.insertionTime, it.hash, it.seqNo)) } MaxLineLength:P2PMessageDeduplicator.kt$P2PMessageDeduplicator$private - MaxLineLength:P2PMessageDeduplicator.kt$P2PMessageDeduplicator$private fun isDuplicateInDatabase(msg: ReceivedMessage): Boolean MaxLineLength:P2PMessageDeduplicator.kt$P2PMessageDeduplicator$val senderHash: String? = if (receivedSenderUUID != null && receivedSenderSeqNo != null) senderHash(SenderKey(receivedSenderUUID, msg.peer, msg.isSessionInit)) else null - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient : SingletonSerializeAsTokenMessagingServiceAddressToArtemisQueueResolver MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$ fun start(myIdentity: PublicKey, serviceIdentity: PublicKey?, maxMessageSize: Int, advertisedAddress: NetworkHostAndPort = serverAddress) - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$// Never time out on our loopback Artemis connections. If we switch back to using the InVM transport this // would be the default and the two lines below can be deleted. connectionTTL = 60000 clientFailureCheckPeriod = 30000 minLargeMessageSize = maxMessageSize + JOURNAL_HEADER_SIZE isUseGlobalPools = nodeSerializationEnv != null - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$deliverTo(msg, HandlerRegistration(msg.topic, deliverTo), MessageDeduplicationHandler(artemisMessage, msg)) MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$log.trace { "Received message from: ${message.address} user: $user topic: $topic id: $uniqueMessageId senderUUID: $receivedSenderUUID senderSeqNo: $receivedSenderSeqNo isSessionInit: $isSessionInit" } - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$log.warn("Received message ${msg.uniqueMessageId} for ${msg.topic} that doesn't have any registered handlers yet") MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$override - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$p2pConsumer = P2PMessagingConsumer(inboxes, createNewSession, isDrainingModeOn, drainingModeWasChangedEvents, metricRegistry) - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$p2pConsumer!!.messages // this `run()` method is semantically meant to block until the message consumption runs, hence the latch here .doOnCompleted(latch::countDown) MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$return ArtemisReceivedMessage(topic, CordaX500Name.parse(user), platformVersion, uniqueMessageId, receivedSenderUUID, receivedSenderSeqNo, isSessionInit, message) - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$return NodeClientMessage(topic, OpaqueBytes(data), deduplicationId.deduplicationId, deduplicationId.senderUUID, additionalHeaders) - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$throw IllegalStateException("Cannot add another acking handler for $topic, there is already an acking one") MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$val createNewSession = { sessionFactory!!.createSession(ArtemisMessagingComponent.NODE_P2P_USER, ArtemisMessagingComponent.NODE_P2P_USER, false, true, true, false, ActiveMQClient.DEFAULT_ACK_BATCH_SIZE) } - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$val isSessionInit = message.getStringProperty(P2PMessagingHeaders.Type.KEY) == P2PMessagingHeaders.Type.SESSION_INIT_VALUE MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$val receivedSenderSeqNo = if (message.containsProperty(P2PMessagingHeaders.senderSeqNo)) message.getLongProperty(P2PMessagingHeaders.senderSeqNo) else null - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient$val uniqueMessageId = message.required(HDR_DUPLICATE_DETECTION_ID) { DeduplicationId(message.getStringProperty(it)) } - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient${ val running = state.locked { // We allow stop() to be called without a run() in between, but it must have at least been started. check(started) val prevRunning = running running = false networkChangeSubscription?.unsubscribe() require(p2pConsumer != null, { "stop can't be called twice" }) require(producer != null, { "stop can't be called twice" }) close(p2pConsumer) p2pConsumer = null close(producer) producer = null producerSession!!.commit() close(executorProducer) executorProducer = null executorSession!!.commit() close(bridgeNotifyConsumer) knownQueues.clear() eventsSubscription?.unsubscribe() eventsSubscription = null prevRunning } synchronized(handlersChangedSignal) { handlersChangedSignal.notifyAll() } if (running && !nodeExecutor.isOnThread) { // Wait for the main loop to notice the consumer has gone and finish up. shutdownLatch.await() } // Only first caller to gets running true to protect against double stop, which seems to happen in some integration tests. state.locked { locator?.close() } } - MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient.ArtemisReceivedMessage$override val data: ByteSequence by lazy { OpaqueBytes(ByteArray(message.bodySize).apply { message.bodyBuffer.readBytes(this) }) } MaxLineLength:P2PMessagingClient.kt$P2PMessagingClient.MessageDeduplicationHandler$private inner MaxLineLength:P2PMessagingClient.kt$P2PMessagingConsumer$logger.warn("Node is currently in draining mode, new flows will not be processed! Flows in flight: ${metricsRegistry.gauges["Flows.InFlight"]?.value}") - MaxLineLength:P2PMessagingClient.kt$P2PMessagingConsumer.Companion$private const val initialSessionMessages = "${P2PMessagingHeaders.Type.KEY}<>'${P2PMessagingHeaders.Type.SESSION_INIT_VALUE}'" - MaxLineLength:P2PMessagingTest.kt$P2PMessagingTest$ inline fun MessagingService.runOnNextMessage(topic: String, crossinline callback: (ReceivedMessage) -> Unit) - MaxLineLength:P2PMessagingTest.kt$P2PMessagingTest$internalServices.networkService.send("test.request", TestRequest(replyTo = internalServices.networkService.myAddress), target) - MaxLineLength:P2PMessagingTest.kt$P2PMessagingTest$private - MaxLineLength:P2PMessagingTest.kt$P2PMessagingTest${ // Setup each node in the distributed service to return back it's NodeInfo so that we can know which node is being used participatingServiceNodes.forEach { node -> node.respondWith(node.services.myInfo) } val serviceAddress = originatingNode.services.networkMapCache.run { originatingNode.internalServices.networkService.getAddressOfParty(getPartyInfo(getNotary(serviceName)!!)!!) } val participatingNodes = HashSet<Any>() // Try several times so that we can be fairly sure that any node not participating is not due to Artemis' selection // strategy. 3 attempts for each node seems to be sufficient. // This is not testing the distribution of the requests - DistributedServiceTests already does that for (it in 1..participatingServiceNodes.size * 3) { participatingNodes += originatingNode.receiveFrom(serviceAddress).getOrThrow(10.seconds) if (participatingNodes.size == participatingServiceNodes.size) { break } } assertThat(participatingNodes).containsOnlyElementsOf(participatingServiceNodes.map { it.services.myInfo }) } - MaxLineLength:PackageOwnershipVerificationTests.kt$PackageOwnershipVerificationTests$output(DUMMY_CONTRACT, "c1", DUMMY_NOTARY, null, HashAttachmentConstraint(SecureHash.allOnesHash), DummyContractState()) - MaxLineLength:Parameters.kt$Parameters$@CommandLine.Option(names = ["-d", "--double-spend-ratio"], description = ["The double spend ratio (default: 0.02)"]) - MaxLineLength:Parameters.kt$Parameters$@CommandLine.Option(names = ["-n", "--num-transactions"], description = ["How many transactions to generate (default: 20)"]) - MaxLineLength:ParametersUtilities.kt$ fun NetworkParameters.addNotary(party: Party, validating: Boolean = true): NetworkParameters - MaxLineLength:PartialMerkleTree.kt$PartialMerkleTree - MaxLineLength:PartialMerkleTree.kt$PartialMerkleTree$PartialTree - MaxLineLength:PartialMerkleTree.kt$PartialMerkleTree$if (!leafIndexHelper(leaf, this.root, flagPath)) throw MerkleTreeException("The provided hash $leaf is not in the tree.") MaxLineLength:PartialMerkleTree.kt$PartialMerkleTree.Companion$ fun rootAndUsedHashes(node: PartialTree, usedHashes: MutableList<SecureHash>): SecureHash - MaxLineLength:PartialMerkleTree.kt$PartialMerkleTree.Companion$// Check if a MerkleTree is full binary tree. Returns the height of the tree if full, otherwise throws exception. private fun checkFull(tree: MerkleTree, level: Int = 0): Int - MaxLineLength:PartialMerkleTreeTest.kt$PartialMerkleTreeTest$assertFailsWith<MerkleTreeException> { PartialMerkleTree.build(merkleTree, listOf<SecureHash>(SecureHash.sha256("20"))) } MaxLineLength:PartialMerkleTreeTest.kt$PartialMerkleTreeTest$assertFailsWith<MerkleTreeException> { PartialMerkleTree.build(merkleTree, listOf<SecureHash>(SecureHash.sha256("20"), SecureHash.sha256("1"), SecureHash.sha256("5"))) } - MaxLineLength:PartialMerkleTreeTest.kt$PartialMerkleTreeTest$networkParameters = testNetworkParameters(minimumPlatformVersion = 4, notaries = listOf(NotaryInfo(DUMMY_NOTARY, true))) MaxLineLength:PartialMerkleTreeTest.kt$PartialMerkleTreeTest$val pmt = PartialMerkleTree.build(merkleTree, listOf<SecureHash>(SecureHash.sha256("1"), SecureHash.sha256("5"), SecureHash.sha256("0"), SecureHash.sha256("19"))) - MaxLineLength:PartialMerkleTreeTest.kt$PartialMerkleTreeTest${ // We even use the same privacySalt, and thus the only difference between the two transactions is the notary party. val privacySalt = PrivacySalt() val wtx1 = makeSimpleCashWtx(DUMMY_NOTARY, privacySalt) val wtx2 = makeSimpleCashWtx(MEGA_CORP, privacySalt) assertEquals(wtx1.privacySalt, wtx2.privacySalt) assertNotEquals(wtx1.id, wtx2.id) } - MaxLineLength:Party.kt$Party : DestinationAbstractParty - MaxLineLength:Party.kt$Party$constructor(certificate: X509Certificate) : this(CordaX500Name.build(certificate.subjectX500Principal), Crypto.toSupportedPublicKey(certificate.publicKey)) - MaxLineLength:PartyAndCertificate.kt$PartyAndCertificate MaxLineLength:PartyAndCertificate.kt$PartyAndCertificate$require(role?.isIdentity ?: false) { "Party certificate ${certificate.subjectDN} does not have a well known or confidential identity role. Found: $role" } - MaxLineLength:PartyAndCertificate.kt$PartyAndCertificate$throw CertPathValidatorException("Child certificate whose issuer includes a Corda role, must also specify Corda role") MaxLineLength:PartyAndCertificate.kt$PartyAndCertificate$throw CertPathValidatorException("The issuing certificate for $certificateString has role $parentRole, expected one of ${role.validParents}") - MaxLineLength:PathManager.kt$PathManager<T : PathManager<T>> : Closeable - MaxLineLength:PathManagerTests.kt$PathManagerTests$MyPathManager : PathManager - MaxLineLength:PathUtils.kt$ fun Path.attributes(vararg options: LinkOption): BasicFileAttributes - MaxLineLength:PathUtils.kt$inline MaxLineLength:Perceivable.kt$@Suppress("UNUSED_PARAMETER") start: Perceivable<Instant> MaxLineLength:Perceivable.kt$@Suppress("UNUSED_PARAMETER") start: String MaxLineLength:Perceivable.kt$Interest$val interest: Perceivable<BigDecimal> - MaxLineLength:Perceivable.kt$Interest(Const(amount), dayCountConvention, interest, const(parseDate(start).toInstant()), const(parseDate(end).toInstant())) MaxLineLength:Perceivable.kt$PerceivableComparison<T> : Perceivable - MaxLineLength:Perceivable.kt$PerceivableOperation<T> : Perceivable - MaxLineLength:Perceivable.kt$fun fix(source: String, date: LocalDate, tenor: Tenor): Perceivable<BigDecimal> MaxLineLength:Perceivable.kt$fun interest(@Suppress("UNUSED_PARAMETER") amount: BigDecimal, @Suppress("UNUSED_PARAMETER") dayCountConvention: String, @Suppress("UNUSED_PARAMETER") interest: BigDecimal /* todo - appropriate type */, @Suppress("UNUSED_PARAMETER") start: Perceivable<Instant>, @Suppress("UNUSED_PARAMETER") end: Perceivable<Instant>): Perceivable<BigDecimal> MaxLineLength:Perceivable.kt$fun interest(@Suppress("UNUSED_PARAMETER") amount: BigDecimal, @Suppress("UNUSED_PARAMETER") dayCountConvention: String, @Suppress("UNUSED_PARAMETER") interest: BigDecimal /* todo - appropriate type */, @Suppress("UNUSED_PARAMETER") start: String, @Suppress("UNUSED_PARAMETER") end: String): Perceivable<BigDecimal> MaxLineLength:Perceivable.kt$fun interest(@Suppress("UNUSED_PARAMETER") amount: BigDecimal, @Suppress("UNUSED_PARAMETER") dayCountConvention: String, @Suppress("UNUSED_PARAMETER") interest: Perceivable<BigDecimal> /* todo - appropriate type */, @Suppress("UNUSED_PARAMETER") start: Perceivable<Instant>, @Suppress("UNUSED_PARAMETER") end: Perceivable<Instant>): Perceivable<BigDecimal> MaxLineLength:Perceivable.kt$fun interest(@Suppress("UNUSED_PARAMETER") amount: BigDecimal, @Suppress("UNUSED_PARAMETER") dayCountConvention: String, @Suppress("UNUSED_PARAMETER") interest: Perceivable<BigDecimal> /* todo - appropriate type */, @Suppress("UNUSED_PARAMETER") start: String, @Suppress("UNUSED_PARAMETER") end: String): Perceivable<BigDecimal> - MaxLineLength:Perceivable.kt$operator fun Perceivable<BigDecimal>.minus(n: Double) - MaxLineLength:Perceivable.kt$operator fun Perceivable<BigDecimal>.times(n: Double) MaxLineLength:PeriodSerializer.kt$PeriodSerializer : Proxy - MaxLineLength:PersistentIdentityMigration.kt$PersistentIdentityMigration$generatedStatements.addAll(MigrationData(oldPkHash, partyAndCertificate).let { listOf(updateHashToIdentityRow(it, dataSource), updateNameToHashRow(it, dataSource)) }) - MaxLineLength:PersistentIdentityMigration.kt$PersistentIdentityMigration$return UpdateStatement(dataSource.connection.catalog, dataSource.connection.schema, PUB_KEY_HASH_TO_PARTY_AND_CERT_TABLE) .setWhereClause("pk_hash=?") .addNewColumnValue("pk_hash", migrationData.newPkHash) .addWhereParameter(migrationData.oldPkHash) - MaxLineLength:PersistentIdentityMigration.kt$PersistentIdentityMigration$return UpdateStatement(dataSource.connection.catalog, dataSource.connection.schema, X500_NAME_TO_PUB_KEY_HASH_TABLE) .setWhereClause("pk_hash=? AND name=?") .addNewColumnValue("pk_hash", migrationData.newPkHash) .addWhereParameters(migrationData.oldPkHash, migrationData.x500.toString()) - MaxLineLength:PersistentIdentityMigration.kt$PersistentIdentityMigration$val partyAndCertificate = PartyAndCertificate(X509CertificateFactory().delegate.generateCertPath(identityBytes.inputStream())) - MaxLineLength:PersistentIdentityMigrationNewTable.kt$PersistentIdentitiesMigrationSchema - MaxLineLength:PersistentIdentityMigrationNewTable.kt$PersistentIdentitiesMigrationSchemaV1 : MappedSchema MaxLineLength:PersistentIdentityMigrationNewTable.kt$PersistentIdentityMigrationNewTable : CordaMigration - MaxLineLength:PersistentIdentityMigrationNewTable.kt$PersistentIdentityMigrationNewTable$logger.info("Migrating persistent identities with certificates table into persistent table with no certificate data.") - MaxLineLength:PersistentIdentityMigrationNewTable.kt$PersistentIdentityMigrationNewTable$throw PersistentIdentitiesMigrationException("Cannot migrate persistent states as liquibase failed to provide a suitable database connection") - MaxLineLength:PersistentIdentityMigrationNewTable.kt$PersistentIdentityMigrationNewTable$val name = PartyAndCertificate(X509CertificateFactory().delegate.generateCertPath(partyBytes.inputStream())).party.name - MaxLineLength:PersistentIdentityMigrationNewTable.kt$TestIdentity - MaxLineLength:PersistentIdentityMigrationNewTableTest.kt$PersistentIdentityMigrationNewTableTest$notaryServices = MockServices(listOf("net.corda.finance.contracts"), dummyNotary, identityService, dummyCashIssuer.keyPair, BOC_KEY) + MaxLineLength:PersistentIdentityMigrationNewTable.kt$PersistentIdentityMigrationNewTable$throw PersistentIdentitiesMigrationException("Cannot migrate persistent identities as liquibase failed to provide a suitable database connection") MaxLineLength:PersistentIdentityMigrationNewTableTest.kt$PersistentIdentityMigrationNewTableTest$session.save(PersistentIdentityService.PersistentPublicKeyHashToCertificate(it.owningKey.hash.toString(), it.certPath.encoded)) MaxLineLength:PersistentIdentityMigrationNewTableTest.kt$PersistentIdentityMigrationNewTableTest$val identityService = makeTestIdentityService(PersistentIdentityMigrationNewTableTest.dummyNotary.identity, BOB_IDENTITY, ALICE_IDENTITY) - MaxLineLength:PersistentIdentityMigrationNewTableTest.kt$PersistentIdentityMigrationNewTableTest${ /** * TODO - We have to mock every statement/ result to test this properly. * * The workaround for now is the [PersistentIdentitiesMigration.addTestMapping] and * [PersistentIdentitiesMigration.deleteTestMapping] methods that allow us to see the migration occur properly during debugging. * * Since [PersistentIdentitiesMigration] implements [CordaMigration] the migration will run when the DB is setup. */ PersistentIdentityMigrationNewTable() } MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$ @Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) private fun verifyAndRegisterIdentity(trustAnchor: TrustAnchor, identity: PartyAndCertificate): PartyAndCertificate? - MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$/** Stores notary identities obtained from the network parameters, for which we don't need to perform a database lookup. */ private val notaryIdentityCache = HashSet<Party>() MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$// Allows us to eliminate keys we know belong to others by using the cache contents that might have been seen during other identity activity. // Concentrating activity on the identity cache works better than spreading checking across identity and key management, because we cache misses too. fun stripNotOurKeys(keys: Iterable<PublicKey>): Iterable<PublicKey> - MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$@Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) - MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$@Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) private MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$@Throws(UnknownAnonymousPartyException::class) override - MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$_caCertStore = CertStore.getInstance("Collection", CollectionCertStoreParameters(caCertificates.toSet() + trustRoot)) MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$fun loadIdentities(identities: Collection<PartyAndCertificate> = emptySet(), confidentialIdentities: Collection<PartyAndCertificate> = emptySet()) - MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$fun start(trustRoot: X509Certificate, caCertificates: List<X509Certificate> = emptyList(), notaryIdentities: List<Party> = emptyList()) - MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$it.filter { x500Matches(query, exactMatch, it.first) }.map { keyToPartyAndCert[it.second]!!.party }.toSet() MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$log.warn("Certificate validation failed for ${identity.name} against trusted root ${trustAnchor.trustedCert.subjectX500Principal}.") - MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService$throw IllegalArgumentException("The public key ${key.hash} is already assigned to a different party than the supplied .") - MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService${ // If there is no entry in the legal keyToPartyAndCert table then the party must be a confidential identity so we perform // a lookup in the keyToName table. If an entry for that public key exists, then we attempt val name = keyToName[party.owningKey.toStringShort()] if (name != null) { wellKnownPartyFromX500Name(name) } else { null } } - MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService${ // Skip database lookup if the party is a notary identity. // This also prevents an issue where the notary identity can't be resolved if it's not in the network map cache. The node obtains // a trusted list of notary identities from the network parameters automatically. return if (party is Party && party in notaryIdentityCache) { party } else { database.transaction { // Try and resolve the party from the table to public keys to party and certificates // If we cannot find it then we perform a lookup on the public key to X500 name table val legalIdentity = super.wellKnownPartyFromAnonymous(party) if (legalIdentity == null) { // If there is no entry in the legal keyToPartyAndCert table then the party must be a confidential identity so we perform // a lookup in the keyToName table. If an entry for that public key exists, then we attempt val name = keyToName[party.owningKey.toStringShort()] if (name != null) { wellKnownPartyFromX500Name(name) } else { null } } else { legalIdentity } } } } - MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService.Companion$PartyAndCertificate(X509CertificateFactory().delegate.generateCertPath(it.identity.inputStream())) + MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService${ // If there is no entry in the legal keyToPartyAndCert table then the party must be a confidential identity so we perform // a lookup in the keyToName table. If an entry for that public key exists, then we attempt look up the associated node's // PartyAndCertificate. val name = keyToName[party.owningKey.toStringShort()] if (name != null) { // This should never return null as this node would not be able to communicate with the node providing a confidential // identity unless its NodeInfo/PartyAndCertificate were available. wellKnownPartyFromX500Name(name) } else { null } } + MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService${ // This should never return null as this node would not be able to communicate with the node providing a confidential // identity unless its NodeInfo/PartyAndCertificate were available. wellKnownPartyFromX500Name(name) } + MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService${ // Update the three tables as necessary. We definitely store the public key and map it to a party and we optionally update // the public key to external ID mapping table. This block will only ever be reached when registering keys generated on // other because when a node generates its own keys "registerKeyToParty" is automatically called by KeyManagementService.freshKey. registerKeyToParty(publicKey, party) hashToKey[publicKeyHash] = publicKey if (externalId != null) { registerKeyToExternalId(publicKey, externalId) } } + MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService.Companion$fun createHashToKeyMap(cacheFactory: NamedCacheFactory): AppendOnlyPersistentMap<String, PublicKey, PersistentHashToPublicKey, String> MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService.Companion$fun createKeyToPartyAndCertMap(cacheFactory: NamedCacheFactory): AppendOnlyPersistentMap<String, PartyAndCertificate, PersistentPublicKeyHashToCertificate, String> MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService.Companion$fun createKeyToX500Map(cacheFactory: NamedCacheFactory): AppendOnlyPersistentMap<String, CordaX500Name, PersistentPublicKeyHashToParty, String> MaxLineLength:PersistentIdentityService.kt$PersistentIdentityService.Companion$fun createX500ToKeyMap(cacheFactory: NamedCacheFactory): AppendOnlyPersistentMap<CordaX500Name, String, PersistentPartyToPublicKeyHash, String> - MaxLineLength:PersistentIdentityServiceTests.kt$PersistentIdentityServiceTests$ @Test fun `assert ownership`() - MaxLineLength:PersistentIdentityServiceTests.kt$PersistentIdentityServiceTests$ @Test fun `get anonymous identity by key`() MaxLineLength:PersistentIdentityServiceTests.kt$PersistentIdentityServiceTests$listOf("Organisation A", "Organisation B", "Organisation C") .map { getTestPartyAndCertificate(CordaX500Name(organisation = it, locality = "London", country = "GB"), generateKeyPair().public) } MaxLineLength:PersistentIdentityServiceTests.kt$PersistentIdentityServiceTests$val alicente = getTestPartyAndCertificate(CordaX500Name(organisation = "Alicente Worldwide", locality = "London", country = "GB"), generateKeyPair().public) MaxLineLength:PersistentMap.kt$PersistentMap$ExplicitRemoval<K, V, E, EK> : RemovalListener - MaxLineLength:PersistentMap.kt$PersistentMap$cache.getAll(session.createQuery(criteriaQuery).resultList.map { e -> fromPersistentEntity(e as E).first }.asIterable()) - MaxLineLength:PersistentMap.kt$PersistentMap${ // This happens when the key was queried before with no value associated. We invalidate the cached null // value and recursively call set again. This is to avoid race conditions where another thread queries after // the invalidate but before the set. cache.invalidate(key) return set(key, value) } MaxLineLength:PersistentMap.kt$PersistentMap.NotReallyMutableEntry$private MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$"SELECT DISTINCT l FROM ${NodeInfoSchemaV1.PersistentNodeInfo::class.java.name} n JOIN n.legalIdentitiesAndCerts l WHERE l.name = :name" MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$"SELECT n FROM ${NodeInfoSchemaV1.PersistentNodeInfo::class.java.name} n JOIN n.addresses a WHERE a.host = :host AND a.port = :port" MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$"SELECT n FROM ${NodeInfoSchemaV1.PersistentNodeInfo::class.java.name} n JOIN n.legalIdentitiesAndCerts l WHERE l.name = :name" MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$"SELECT n FROM ${NodeInfoSchemaV1.PersistentNodeInfo::class.java.name} n JOIN n.legalIdentitiesAndCerts l WHERE l.owningKeyHash = :owningKeyHash" - MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$logger.info("Previous node was found for ${node.legalIdentities.first().name} as: $previousNode") - MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$private - MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$private val identityService: IdentityService - MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$val failures = node.legalIdentitiesAndCerts.mapNotNull { Try.on { it.verify(identityService.trustAnchor) } as? Try.Failure } MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$val info = findByIdentityKey(session, nodeInfo.legalIdentitiesAndCerts.first().owningKey).singleOrNull { it.serial == nodeInfo.serial } - MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache$where(builder.equal(get<String>(NodeInfoSchemaV1.PersistentNodeInfo::hash.name), nodeHash.toString())) - MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache${ // TODO For now the main legal identity is left in NodeInfo, this should be set comparision/come up with index for NodeInfo? val info = findByIdentityKey(session, nodeInfo.legalIdentitiesAndCerts.first().owningKey) val nodeInfoEntry = generateMappedObject(nodeInfo) if (info.isNotEmpty()) { nodeInfoEntry.id = info.first().id } session.merge(nodeInfoEntry) // invalidate cache last - this way, we might serve up the wrong info for a short time, but it will get refreshed // on the next load invalidateCaches(nodeInfo) } - MaxLineLength:PersistentNetworkMapCache.kt$PersistentNetworkMapCache${ // findByIdentityKey might returns multiple node info with the same key, need to pick the right one by comparing serial. val info = findByIdentityKey(session, nodeInfo.legalIdentitiesAndCerts.first().owningKey).singleOrNull { it.serial == nodeInfo.serial } info?.let { session.remove(it) } // invalidate cache last - this way, we might serve up the wrong info for a short time, but it will get refreshed // on the next load invalidateCaches(nodeInfo) } - MaxLineLength:PersistentNetworkMapCacheTest.kt$PersistentNetworkMapCacheTest$assertThat(charlieNetMapCache.getNodesByLegalName(DUMMY_NOTARY_NAME)).containsOnlyElementsOf(distServiceNodeInfos) MaxLineLength:PersistentNetworkMapCacheTest.kt$PersistentNetworkMapCacheTest$private val charlieNetMapCache = PersistentNetworkMapCache(TestingNamedCacheFactory(), database, InMemoryIdentityService(trustRoot = DEV_ROOT_CA.certificate)) - MaxLineLength:PersistentScheduledFlowRepository.kt$PersistentScheduledFlowRepository$criteriaQuery.orderBy(session.criteriaBuilder.asc(shed.get<NodeSchedulerService.PersistentScheduledState>("scheduledAt"))) MaxLineLength:PersistentScheduledFlowRepository.kt$PersistentScheduledFlowRepository$private MaxLineLength:PersistentScheduledFlowRepository.kt$PersistentScheduledFlowRepository$return Pair(StateRef(SecureHash.parse(txId), index), ScheduledStateRef(StateRef(SecureHash.parse(txId), index), scheduledStateRecord.scheduledAt)) - MaxLineLength:PersistentScheduledFlowRepository.kt$PersistentScheduledFlowRepository$val criteriaQuery = session.criteriaBuilder.createQuery(NodeSchedulerService.PersistentScheduledState::class.java) - MaxLineLength:PersistentScheduledFlowRepository.kt$PersistentScheduledFlowRepository$val elem = session.find(NodeSchedulerService.PersistentScheduledState::class.java, toPersistentEntityKey(key)) - MaxLineLength:PersistentScheduledFlowRepository.kt$PersistentScheduledFlowRepository$val existingEntry = session.find(NodeSchedulerService.PersistentScheduledState::class.java, toPersistentEntityKey(value.ref)) - MaxLineLength:PersistentStateService.kt$PersistentStateService MaxLineLength:PersistentStateServiceTests.kt$PersistentStateServiceTests$persistentStateService.persist(setOf(StateAndRef(TransactionState(TestState(), DummyContract.PROGRAM_ID, MEGA_CORP, constraint = AlwaysAcceptAttachmentConstraint), StateRef(SecureHash.sha256("dummy"), 0)))) - MaxLineLength:PersistentStateServiceTests.kt$PersistentStateServiceTests$val database = configureDatabase(makeTestDataSourceProperties(), DatabaseConfig(), rigorousMock(), rigorousMock(), schemaService) - MaxLineLength:PersistentStateServiceTests.kt$PersistentStateServiceTests.<no name provided>$override val schemaOptions: Map<MappedSchema, SchemaService.SchemaOptions> = mapOf(testSchema to SchemaService.SchemaOptions()) - MaxLineLength:PersistentTypes.kt$DirectStatePersistable : StatePersistable MaxLineLength:PersistentTypes.kt$IndirectStatePersistable<T : DirectStatePersistable> : StatePersistable - MaxLineLength:PersistentTypes.kt$MappedSchemaValidator$SchemaCrossReferenceReport MaxLineLength:PersistentTypes.kt$MappedSchemaValidator$annotations.any { annotation -> annotation.toString().startsWith("@javax.persistence.") && annotation !is javax.persistence.Transient } MaxLineLength:PersistentTypes.kt$MappedSchemaValidator${ field -> field.type.enclosingClass != null && MappedSchema::class.java.isAssignableFrom(field.type.enclosingClass) && hasJpaAnnotation(field.declaredAnnotations) && field.type.enclosingClass != schema.javaClass } MaxLineLength:PersistentTypes.kt$MappedSchemaValidator${ method -> method.returnType.enclosingClass != null && MappedSchema::class.java.isAssignableFrom(method.returnType.enclosingClass) && method.returnType.enclosingClass != schema.javaClass && hasJpaAnnotation(method.declaredAnnotations) } MaxLineLength:PersistentTypes.kt$MappedSchemaValidator.SchemaCrossReferenceReport$"MappedSchema '${schema.substringAfterLast(".")}' entity '$entity' field '$fieldOrMethod' is of type '$fieldOrMethodType' " - MaxLineLength:PersistentTypes.kt$PersistentState : DirectStatePersistable MaxLineLength:PersistentUniquenessProvider.kt$PersistentUniquenessProvider : UniquenessProviderSingletonSerializeAsToken MaxLineLength:PersistentUniquenessProvider.kt$PersistentUniquenessProvider$commitOne(request.states, request.txId, request.callerIdentity, request.requestSignature, request.timeWindow, request.references) - MaxLineLength:PersistentUniquenessProvider.kt$PersistentUniquenessProvider$if (consumingTx != null) conflictingStates[stateRef] = StateConsumptionDetails(consumingTx.sha256(), type) MaxLineLength:PersistentUniquenessProvider.kt$PersistentUniquenessProvider$private - MaxLineLength:PersistentUniquenessProvider.kt$PersistentUniquenessProvider$request.future.setException(NotaryInternalException(NotaryError.General(Exception("Internal service error.")))) - MaxLineLength:PersistentUniquenessProvider.kt$PersistentUniquenessProvider.Companion$fun createMap(cacheFactory: NamedCacheFactory): AppendOnlyPersistentMap<StateRef, SecureHash, CommittedState, PersistentStateRef> - MaxLineLength:PhysicalLocationStructures.kt$WorldCoordinate$fun latitudeToScreenY(lat: Double) - MaxLineLength:PhysicalLocationStructures.kt$WorldCoordinate$require(longitude in leftLongitude..rightLongitude){"Longitude must be between $leftLongitude and $rightLongitude"} - MaxLineLength:PortAllocationTest.kt$PortAllocationTest$val iterCount = 8_000 // Default port range 10000-30000 since we will have 2 processes we want to make sure there is enough leg room - MaxLineLength:PortAllocationTest.kt$PortAllocationTest$val terminationStatuses = processes.parallelStream().map { if (it.waitFor(1, TimeUnit.MINUTES)) "OK" else "STILL RUNNING" }.toList() - MaxLineLength:PortAllocationTest.kt$PortAllocationTest$while (spinnerBuffer.getShort(1) != 10.toShort() && spinnerBuffer.getShort(2) != 10.toShort() && timeWaited < 60_000) { logger.info("Waiting to childProcesses to report back. waited ${timeWaited}ms") Thread.sleep(1000) timeWaited += 1000 } - MaxLineLength:PortAllocationTest.kt$PortAllocationTest${ assumeFalse(System.getProperty("os.name").toLowerCase().contains("windows")) logger.info("Starting multiprocess port allocation test") val spinnerFile = Files.newTemporaryFile().also { it.deleteOnExit() }.absolutePath val iterCount = 8_000 // Default port range 10000-30000 since we will have 2 processes we want to make sure there is enough leg room // If we rollover, we may well receive the ports that were already given to a different process val process1 = buildJvmProcess(spinnerFile, 1, iterCount) val process2 = buildJvmProcess(spinnerFile, 2, iterCount) logger.info("Started child processes") val processes = listOf(process1, process2) val spinnerBackingFile = RandomAccessFile(spinnerFile, "rw") logger.info("Mapped spinner file at: $spinnerFile") val spinnerBuffer = spinnerBackingFile.channel.map(FileChannel.MapMode.READ_WRITE, 0, 512) logger.info("Created spinner buffer") var timeWaited = 0L while (spinnerBuffer.getShort(1) != 10.toShort() && spinnerBuffer.getShort(2) != 10.toShort() && timeWaited < 60_000) { logger.info("Waiting to childProcesses to report back. waited ${timeWaited}ms") Thread.sleep(1000) timeWaited += 1000 } //GO! logger.info("Instructing child processes to start allocating ports") spinnerBuffer.putShort(0, 8) logger.info("Waiting for child processes to terminate") val terminationStatuses = processes.parallelStream().map { if (it.waitFor(1, TimeUnit.MINUTES)) "OK" else "STILL RUNNING" }.toList() logger.info("child processes terminated: $terminationStatuses") fun List<String>.setOfPorts(): Set<Int> { // May include warnings when ports are busy return map { Try.on { Integer.parseInt(it) } }.filter { it.isSuccess }.map { it.getOrThrow() }.toSet() } val lines1 = process1.inputStream.reader().readLines() val portsAllocated1 = lines1.setOfPorts() val lines2 = process2.inputStream.reader().readLines() val portsAllocated2 = lines2.setOfPorts() logger.info("child process out captured") Assert.assertThat(lines1.joinToString(), portsAllocated1.size, `is`(iterCount)) Assert.assertThat(lines2.joinToString(), portsAllocated2.size, `is`(iterCount)) //there should be no overlap between the outputs as each process should have been allocated a unique set of ports val intersect = portsAllocated1.intersect(portsAllocated2) Assert.assertThat(intersect.joinToString(), intersect, `is`(emptySet())) } MaxLineLength:PortfolioApi.kt$PortfolioApi$ @POST @Path("{party}/portfolio/valuations/calculate") @Produces(MediaType.APPLICATION_JSON) fun startPortfolioCalculations(params: ValuationCreationParams = ValuationCreationParams(LocalDate.of(2016, 6, 6)), @PathParam("party") partyName: String): Response MaxLineLength:PortfolioApi.kt$PortfolioApi$counterparties = counterParties.flatMap { it.legalIdentitiesAndCerts.map { ApiParty(it.owningKey.toBase58String(), it.name) } } - MaxLineLength:PortfolioApi.kt$PortfolioApi$rpc.startFlow(SimmRevaluation::Initiator, getPortfolioStateAndRefWith(otherParty).ref, params.valuationDate) MaxLineLength:PortfolioApi.kt$PortfolioApi$val history = AggregatedHistoryView(state.valuation!!.trades, notional.toDouble(), LocalDate.now(), state.valuation!!.margin.first, mtm) - MaxLineLength:PortfolioApi.kt$PortfolioApi.AggregatedHistoryView$data - MaxLineLength:PortfolioApiUtils.kt$PortfolioApiUtils$"fixedRatePayer" to (fixedRatePayer.nameOrNull()?.organisation ?: fixedRatePayer.owningKey.toBase58String()) MaxLineLength:PortfolioApiUtils.kt$PortfolioApiUtils$"floatingRatePayer" to (floatingRatePayer.nameOrNull()?.organisation ?: floatingRatePayer.owningKey.toBase58String()) MaxLineLength:PortfolioApiUtils.kt$PortfolioApiUtils$InitialMarginView - MaxLineLength:PortfolioApiUtils.kt$PortfolioApiUtils$val completeSubgroups = subgroups.mapValues { it.value.mapValues { it.value[0].third.toDouble() }.toSortedMap() } MaxLineLength:PortfolioApiUtils.kt$PortfolioApiUtils$val processedSensitivities = valuation.totalSensivities.sensitivities.map { it.marketDataName to it.parameterMetadata.map { it.label }.zip(it.sensitivity.toList()).toMap() }.toMap() - MaxLineLength:PortfolioApiUtils.kt$PortfolioApiUtils$val trade = if (state.buyer == ownParty as AbstractParty) state.swap.toFloatingLeg() else state.swap.toFloatingLeg() MaxLineLength:PortfolioApiUtils.kt$PortfolioApiUtils$val yieldCurveCurrenciesValues = marketData.filter { !it.key.contains("/") }.map { it -> Triple(it.key.split("-")[0], it.key.split("-", limit = 2)[1], it.value) } - MaxLineLength:PortfolioState.kt$PortfolioState$override - MaxLineLength:PortfolioState.kt$PortfolioState$return ScheduledActivity(flow, LocalDate.now().plus(1, ChronoUnit.DAYS).atStartOfDay().toInstant(ZoneOffset.UTC)) MaxLineLength:PortfolioState.kt$PortfolioState$return TransactionBuilder(notary).withItems(StateAndContract(copy(), PORTFOLIO_SWAP_PROGRAM_ID), Command(PortfolioSwap.Commands.Agree(), participants.map { it.owningKey })) - MaxLineLength:PortfolioState.kt$PortfolioState$val flow = flowLogicRefFactory.create("net.corda.vega.flows.SimmRevaluation\$Initiator", thisStateRef, LocalDate.now()) - MaxLineLength:PortfolioSwap.kt$PortfolioSwap$val groups: List<LedgerTransaction.InOutGroup<PortfolioState, UniqueIdentifier>> = tx.groupStates { state -> state.linearId } - MaxLineLength:PrettyPrint.kt$PrettyPrint$println("val ${createPartyName(it)} = Party(\"${it.name.organisation}\", \"${it.owningKey.toStringShort()}\")") - MaxLineLength:PrintingInterceptor.kt$PrintingInterceptor$val (continuation, nextState) = delegate.executeTransition(fiber, previousState, event, transition, actionExecutor) MaxLineLength:PrintingInterceptor.kt$PrintingInterceptor$val transitionRecord = TransitionDiagnosticRecord(Instant.now(), fiber.id, previousState, nextState, event, transition, continuation) - MaxLineLength:PrivateKeySerializationTest.kt$PrivateKeySerializationTest$assertTrue { privateKey.checkpointSerialize(context = CheckpointSerializationDefaults.CHECKPOINT_CONTEXT).bytes.isNotEmpty() } - MaxLineLength:PrivateKeySerializationTest.kt$PrivateKeySerializationTest.Companion$return privateKeys.map { arrayOf<Any>(it, PrivateKeySerializationTest::class.java.simpleName + "-" + it.javaClass.simpleName) } - MaxLineLength:PrivateKeySerializationTest.kt$PrivateKeySerializationTest.Companion$val privateKeys: List<PrivateKey> = Crypto.supportedSignatureSchemes().filterNot { Crypto.COMPOSITE_KEY === it } .map { Crypto.generateKeyPair(it).private } MaxLineLength:PrivateKeySerializer.kt$PrivateKeySerializer$override val schemaForDocumentation = Schema(listOf(RestrictedType(type.toString(), "", listOf(type.toString()), AMQPTypeIdentifiers.primitiveTypeName(ByteArray::class.java), descriptor, emptyList()))) - MaxLineLength:ProcessUtilities.kt$ProcessUtilities$return startJavaProcess(C::class.java.name, arguments, classPath, workingDirectory, jdwpPort, extraJvmArguments, maximumHeapSize) - MaxLineLength:ProfileController.kt$ProfileController$StreamSupport.stream(fs.rootDirectories.spliterator(), false) .flatMap { Files.find(it, 2, BiPredicate { p, attr -> "node.conf" == p?.fileName.toString() && attr.isRegularFile }) } - MaxLineLength:ProfileController.kt$ProfileController$StreamSupport.stream(fs.rootDirectories.spliterator(), false) .flatMap { Files.find(it, 3, BiPredicate { p, attr -> p.inCordappsDir && p.isCordapp && attr.isRegularFile }) } - MaxLineLength:ProgressTracker.kt$ProgressTracker$/** * A list of all steps label in this ProgressTracker and the children, with the indent level provided starting at zero. * Note that UNSTARTED is never counted, and DONE is only counted at the calling level. */ val allStepsLabels: List<Pair<Int, String>> get() = _allStepsLabels() - MaxLineLength:ProgressTracker.kt$ProgressTracker$if (it is Change.Structural || it is Change.Rendering) rebuildStepsTree() else recalculateStepsTreeIndex() MaxLineLength:ProgressTracker.kt$ProgressTracker$log.warnOnce("Found ProgressTracker Step(s) with the same label: ${labels.groupBy { it }.filter { it.value.size > 1 }.map { it.key }}") - MaxLineLength:ProgressTracker.kt$ProgressTracker$private fun _allStepsLabels(level: Int = 0): List<Pair<Int, String>> - MaxLineLength:ProgressTracker.kt$ProgressTracker${ // This gets the index of the current step in the context of this progress tracker, so it will always be at the top level in // the allStepsCache. val index = _allStepsCache.indexOf(Pair(0, currentStep)) return if (index >= 0) index else 0 } - MaxLineLength:ProgressTracker.kt$ProgressTracker${ steps.forEach { configureChildTrackerForStep(it) } // Immediately update the step tree observable to ensure the first update the client receives is the initial state of the progress // tracker. _stepsTreeChanges.onNext(allStepsLabels) this.currentStep = UNSTARTED } MaxLineLength:ProgressTracker.kt$ProgressTracker.Step$private fun definitionLocation(): String MaxLineLength:Properties.kt$DelegatedProperty$private abstract MaxLineLength:Properties.kt$FunctionalListProperty$override fun <MAPPED> mapValid(mappedTypeName: String, convert: (List<TYPE>) -> Validated<MAPPED, Configuration.Validation.Error>): Configuration.Property.Definition.Required<MAPPED> @@ -7961,13 +4418,8 @@ MaxLineLength:Properties.kt$FunctionalListProperty$private MaxLineLength:Properties.kt$FunctionalListProperty$return delegate.schema?.let { schema -> valueDescription(valueIn(configuration).asSequence().map { element -> valueDescription(element, serialiseValue) }.map { it as ConfigObject }.map(ConfigObject::toConfig).map { schema.describe(it, serialiseValue) }.toList(), serialiseValue) } ?: valueDescription(valueIn(configuration), serialiseValue) MaxLineLength:Properties.kt$FunctionalListProperty$val errors = list.asSequence().map { configObject(key to ConfigValueFactory.fromAnyRef(it)) }.mapIndexed { index, value -> delegate.validate(value.toConfig(), options).errors.map { error -> error.withContainingPath(*error.containingPath(index).toTypedArray()) } }.fold(emptyList<Configuration.Validation.Error>()) { one, other -> one + other }.toSet() - MaxLineLength:Properties.kt$FunctionalProperty$errors += convert.invoke(delegate.valueIn(target)).mapErrors { error -> error.with(delegate.key, mappedTypeName) }.errors MaxLineLength:Properties.kt$FunctionalProperty$override fun <M> mapValid(mappedTypeName: String, convert: (MAPPED) -> Valid<M>): Configuration.Property.Definition.Standard<M> - MaxLineLength:Properties.kt$FunctionalProperty$override fun describe(configuration: Config, serialiseValue: (Any?) -> ConfigValue) - MaxLineLength:Properties.kt$FunctionalProperty$override val typeName: String = if (super.typeName == "#$mappedTypeName") super.typeName else "$mappedTypeName(${super.typeName})" MaxLineLength:Properties.kt$FunctionalProperty$private - MaxLineLength:Properties.kt$ListMappingProperty$errors += convert.invoke(delegate.valueIn(target)).mapErrors { error -> error.with(delegate.key, mappedTypeName) }.errors - MaxLineLength:Properties.kt$ListMappingProperty$override MaxLineLength:Properties.kt$ListMappingProperty$override fun describe(configuration: Config, serialiseValue: (Any?) -> ConfigValue): ConfigValue? MaxLineLength:Properties.kt$ListMappingProperty$private MaxLineLength:Properties.kt$ListProperty$errors += valueIn(target).asSequence().map { element -> element as ConfigObject }.map(ConfigObject::toConfig).mapIndexed { index, targetConfig -> schema.validate(targetConfig, options).errors.map { error -> error.withContainingPath(*error.containingPath(index).toTypedArray()) } }.fold(emptyList<Configuration.Validation.Error>()) { one, other -> one + other }.toSet() @@ -7981,245 +4433,105 @@ MaxLineLength:Properties.kt$OptionalDelegatedProperty$private MaxLineLength:Properties.kt$OptionalDelegatedProperty$val missingValueError = errors.asSequence().filterIsInstance<Configuration.Validation.Error.MissingValue>().filter { it.pathAsString == key }.singleOrNull() MaxLineLength:Properties.kt$OptionalPropertyWithDefault$override fun describe(configuration: Config, serialiseValue: (Any?) -> ConfigValue): ConfigValue? - MaxLineLength:Properties.kt$OptionalPropertyWithDefault$override fun validate(target: Config, options: Configuration.Validation.Options): Valid<Config> MaxLineLength:Properties.kt$OptionalPropertyWithDefault$private MaxLineLength:Properties.kt$RequiredDelegatedProperty$private abstract MaxLineLength:Properties.kt$StandardProperty$errors += nestedSchema.validate(nestedConfig, options).errors.map { error -> error.withContainingPathPrefix(*key.split(".").toTypedArray()) } MaxLineLength:Properties.kt$StandardProperty$internal open MaxLineLength:Properties.kt$StandardProperty$override fun <MAPPED> mapValid(mappedTypeName: String, convert: (TYPE) -> Valid<MAPPED>): Configuration.Property.Definition.Standard<MAPPED> - MaxLineLength:Properties.kt$StandardProperty$return schema?.describe(configuration.getConfig(key), serialiseValue) ?: valueDescription(valueIn(configuration), serialiseValue) - MaxLineLength:Properties.kt$private - MaxLineLength:Properties.kt$private fun isErrorExpected(error: ConfigException) MaxLineLength:Properties.kt$private val expectedExceptionTypes = setOf(ConfigException.Missing::class, ConfigException.WrongType::class, ConfigException.BadValue::class, ConfigException.BadPath::class, ConfigException.Parse::class) - MaxLineLength:PropertyDescriptor.kt$// Construct a map of PropertyDescriptors by name, by merging the raw field map with the map of classified property methods private fun Map<String, Map<MethodClassifier, Method>>.toClassProperties(fieldMap: Map<String, Field>): Map<String, PropertyDescriptor> - MaxLineLength:PropertyDescriptor.kt$// Merge the given method into a map of methods by method classifier, picking the least generic method for each classifier. private fun EnumMap<MethodClassifier, Method>.merge(classifier: MethodClassifier, method: Method): EnumMap<MethodClassifier, Method> - MaxLineLength:PropertyDescriptor.kt$?: - MaxLineLength:PropertyDescriptor.kt$private - MaxLineLength:PropertyTest.kt$PropertyTest$val property = Configuration.Property.Definition.long(key).map(::AtomicLong).list().map { list -> list.map(AtomicLong::get).max() } MaxLineLength:PropertyTest.kt$PropertyTest$val property = Configuration.Property.Definition.long(key).map(::AtomicLong).list().map { list -> list.map(AtomicLong::get).max() }.optional() - MaxLineLength:PropertyValidationTest.kt$PropertyValidationTest$assertThat(errors.first()) MaxLineLength:PropertyValidationTest.kt$PropertyValidationTest$return invalid(Configuration.Validation.Error.BadValue.of("Value must be of format \"host(String):port(Int > 0)\" e.g., \"127.0.0.1:8080\"")) - MaxLineLength:PropertyValidationTest.kt$PropertyValidationTest$val nestedPropertySchema = Configuration.Schema.withProperties(Configuration.Property.Definition.long(nestedKey)) - MaxLineLength:ProtonWrapperTests.kt$ProtonWrapperTests$private - MaxLineLength:ProtonWrapperTests.kt$ProtonWrapperTests$serverParams.endpointIdentificationAlgorithm = null - MaxLineLength:ProtonWrapperTests.kt$ProtonWrapperTests$signingCertificateStore.get(true).also { it.installDevNodeCaCertPath(ALICE_NAME, rootCa.certificate, intermediateCa) } - MaxLineLength:ProtonWrapperTests.kt$ProtonWrapperTests$sslConfig.keyStore.get(true).also { it.registerDevP2pCertificates(ALICE_NAME, rootCa.certificate, intermediateCa) } - MaxLineLength:ProtonWrapperTests.kt$ProtonWrapperTests$val client = ArtemisMessagingClient(artemisConfig.p2pSslOptions, NetworkHostAndPort("localhost", artemisPort), maxMessageSize) - MaxLineLength:ProtonWrapperTests.kt$ProtonWrapperTests$val signingCertificateStore = CertificateStoreStubs.Signing.withCertificatesDirectory(certificatesDirectory, "serverstorepass") - MaxLineLength:ProtonWrapperTests.kt$ProtonWrapperTests$val sslConfig = CertificateStoreStubs.P2P.withCertificatesDirectory(certificatesDirectory, keyStorePassword = "serverstorepass") - MaxLineLength:ProtonWrapperTests.kt$ProtonWrapperTests${ val maxMessageSize = 100_000 val (server, artemisClient) = createArtemisServerAndClient(maxMessageSize) val amqpClient = createClient(maxMessageSize) val clientConnected = amqpClient.onConnection.toFuture() amqpClient.start() assertEquals(true, clientConnected.get().connected) assertEquals(CHARLIE_NAME, CordaX500Name.build(clientConnected.get().remoteCert!!.subjectX500Principal)) val artemis = artemisClient.started!! val sendAddress = P2P_PREFIX + "Test" artemis.session.createQueue(sendAddress, RoutingType.ANYCAST, "queue", true) val consumer = artemis.session.createConsumer("queue") val testProperty = mutableMapOf<String, Any?>() testProperty["TestProp"] = "1" // Send normal message. val testData = ByteArray(maxMessageSize) val message = amqpClient.createMessage(testData, sendAddress, CHARLIE_NAME.toString(), testProperty) amqpClient.write(message) assertEquals(MessageStatus.Acknowledged, message.onComplete.get()) val received = consumer.receive() assertEquals("1", received.getStringProperty("TestProp")) assertArrayEquals(testData, ByteArray(received.bodySize).apply { received.bodyBuffer.readBytes(this) }) // Send message larger then max message size. val largeData = ByteArray(maxMessageSize + 1) // Create message will fail. assertThatThrownBy { amqpClient.createMessage(largeData, sendAddress, CHARLIE_NAME.toString(), testProperty) }.hasMessageContaining("Message exceeds maxMessageSize network parameter") // Send normal message again to confirm the large message didn't reach the server and client is not killed by the message. val message2 = amqpClient.createMessage(testData, sendAddress, CHARLIE_NAME.toString(), testProperty) amqpClient.write(message2) assertEquals(MessageStatus.Acknowledged, message2.onComplete.get()) val received2 = consumer.receive() assertEquals("1", received2.getStringProperty("TestProp")) assertArrayEquals(testData, ByteArray(received2.bodySize).apply { received2.bodyBuffer.readBytes(this) }) amqpClient.stop() artemisClient.stop() server.stop() } - MaxLineLength:ProviderMap.kt$// Among the others, we should register [CordaSecurityProvider] as the first provider, to ensure that when invoking [SecureRandom()] // the [platformSecureRandom] is returned (which is registered in CordaSecurityProvider). // Note that internally, [SecureRandom()] will look through all registered providers. // Then it returns the first PRNG algorithm of the first provider that has registered a SecureRandom // implementation (in our case [CordaSecurityProvider]), or null if none of the registered providers supplies // a SecureRandom implementation. Security.insertProviderAt(it, 1) // The position is 1-based. - MaxLineLength:ProviderMap.kt$// This map is required to defend against users that forcibly call Security.addProvider / Security.removeProvider // that could cause unexpected and suspicious behaviour. // i.e. if someone removes a Provider and then he/she adds a new one with the same name. // The val is private to avoid any harmful state changes. val providerMap = listOf(cordaBouncyCastleProvider, cordaSecurityProvider, bouncyCastlePQCProvider).map { it.name to it }.toMap() MaxLineLength:ProviderMap.kt$// This registration is needed for reading back EdDSA key from java keystore. // TODO: Find a way to make JKS work with bouncy castle provider or implement our own provide so we don't have to register bouncy castle provider. Security.addProvider(it) - MaxLineLength:ProviderMap.kt$<no name provided>$override fun generatePublic(keyInfo: SubjectPublicKeyInfo) - MaxLineLength:ProviderMap.kt$@DeleteForDJVM fun platformSecureRandomFactory(): SecureRandom MaxLineLength:PublicKeySerializer.kt$PublicKeySerializer$override val schemaForDocumentation = Schema(listOf(RestrictedType(type.toString(), "", listOf(type.toString()), AMQPTypeIdentifiers.primitiveTypeName(ByteArray::class.java), descriptor, emptyList()))) - MaxLineLength:PublicKeySerializer.kt$PublicKeySerializer${ // TODO: Instead of encoding to the default X509 format, we could have a custom per key type (space-efficient) serialiser. output.writeObject(obj.encoded, data, clazz, context) } - MaxLineLength:PublicKeyToOwningIdentityCache.kt$PublicKeyToOwningIdentityCache - MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl : WritablePublicKeyToOwningIdentityCache - MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$ override operator fun get(key: PublicKey): KeyOwningIdentity? - MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$ override operator fun set(key: PublicKey, value: KeyOwningIdentity) - MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$ private fun isKeyIdentityKey(key: PublicKey): Boolean - MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$ private fun isKeyPartOfNodeKeyPairs(key: PublicKey): Boolean MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$criteriaBuilder.equal(queryRoot.get<String>(BasicHSMKeyManagementService.PersistentKey::publicKeyHash.name), key.toStringShort()) MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$criteriaBuilder.equal(queryRoot.get<String>(PersistentIdentityService.PersistentPublicKeyHashToCertificate::publicKeyHash.name), key.toStringShort()) - MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$criteriaBuilder.equal(queryRoot.get<String>(PublicKeyHashToExternalId::publicKeyHash.name), key.toStringShort()) - MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$log.debug { "Attempted to find owning identity for public key ${key.toStringShort()}, but key is unknown to node" } - MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$log.debug { "Database lookup for public key ${key.toStringShort()}, found signing entity $signingEntity" } - MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$private val cache = cacheFactory.buildNamed<PublicKey, KeyOwningIdentity>(Caffeine.newBuilder(), "PublicKeyToOwningIdentityCache_cache") - MaxLineLength:PublicKeyToOwningIdentityCacheImpl.kt$PublicKeyToOwningIdentityCacheImpl$val queryRoot = criteriaQuery.from(PersistentIdentityService.PersistentPublicKeyHashToCertificate::class.java) - MaxLineLength:PublicKeyToTextConverter.kt$PublicKeyToTextConverter$override fun convertToEntityAttribute(text: String?): PublicKey? - MaxLineLength:PushedNode.kt$PushedNode$fun toNodeInstanceRequest(nodeInstanceName: String, actualX500: String, expectedFqName: String): NodeInstanceRequest MaxLineLength:PushedNode.kt$PushedNode$return NodeInstanceRequest(configFile, baseDirectory, copiedNodeConfig, copiedNodeDir, nodeConfig, localImageId, remoteImageName, nodeInstanceName, actualX500, expectedFqName) - MaxLineLength:QuasarInstrumentationHook.kt$ fun recordUsedInstrumentedCallStack() MaxLineLength:QuasarInstrumentationHook.kt$QuasarInstrumentationHook$val instrumentClassMethods = clazz.methods.filter { it.name == "instrumentClass" } // TODO this is very brittle, we want to match on a specific instrumentClass() function. We could use the function signature, but that may change between versions anyway. Why is this function overloaded?? instrumentClassMethods[0].insertBefore( "$hookClassName.${::recordScannedClass.name}(className);" ) - MaxLineLength:QuasarInstrumentationHook.kt$QuasarInstrumentationHookAgent.Companion$println("Instrumented classes: ${classRecorder.instrumentedClasses.size}") classRecorder.instrumentedClasses.forEach { println(" $it") } println("Used instrumented classes: ${classRecorder.usedInstrumentedClasses.size}") classRecorder.usedInstrumentedClasses.forEach { println(" $it") } println("Scanned classes: ${classRecorder.scannedClasses.size}") classRecorder.scannedClasses.keys.take(20).forEach { println(" $it") } println(" (...)") val scannedTree = PackageTree.fromStrings(classRecorder.scannedClasses.keys.toList(), '/') val instrumentedTree = PackageTree.fromStrings(classRecorder.instrumentedClasses.keys.toList(), '/') val alwaysExclude = arguments.alwaysExcluded?.let { PackageTree.fromStrings(it, arguments.separator) } val alwaysExcludedTree = alwaysExclude?.let { instrumentedTree.truncate(it) } ?: instrumentedTree println("Suggested exclude globs:") val truncate = arguments.truncate?.let { PackageTree.fromStrings(it, arguments.separator) } // The separator append is a hack, it causes a package with an empty name to be added to the exclude tree, // which practically causes that level of the tree to be always expanded in the output globs. val expand = arguments.expand?.let { PackageTree.fromStrings(it.map { "$it${arguments.separator}" }, arguments.separator) } val truncatedTree = truncate?.let { scannedTree.truncate(it) } ?: scannedTree val expandedTree = expand?.let { alwaysExcludedTree.merge(it) } ?: alwaysExcludedTree val globs = truncatedTree.toGlobs(expandedTree) globs.forEach { println(" $it") } println("Quasar exclude expression:") println(" x(${globs.joinToString(";")})") - MaxLineLength:QuasarInstrumentationHook.kt$QuasarInstrumentationHookAgent.Companion$val expand = arguments.expand?.let { PackageTree.fromStrings(it.map { "$it${arguments.separator}" }, arguments.separator) } MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria$@CordaSerializable sealed MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria$AndComposition : AttachmentQueryCriteriaAndVisitor MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria$OrComposition : AttachmentQueryCriteriaOrVisitor MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria.AttachmentsQueryCriteria$@DeprecatedConstructorForDeserialization(version = 2) constructor(uploaderCondition: ColumnPredicate<String>?, filenameCondition: ColumnPredicate<String>?) : this(uploaderCondition, filenameCondition, null) - MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria.AttachmentsQueryCriteria$fun isSigned(isSignedPredicate: ColumnPredicate<Boolean>): AttachmentsQueryCriteria MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria.AttachmentsQueryCriteria$fun withContractClassNames(contractClassNamesPredicate: ColumnPredicate<List<ContractClassName>>): AttachmentsQueryCriteria - MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria.AttachmentsQueryCriteria$fun withFilename(filenamePredicate: ColumnPredicate<String>): AttachmentsQueryCriteria MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria.AttachmentsQueryCriteria$fun withSigners(signersPredicate: ColumnPredicate<List<PublicKey>>): AttachmentsQueryCriteria MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria.AttachmentsQueryCriteria$fun withUploadDate(uploadDatePredicate: ColumnPredicate<Instant>): AttachmentsQueryCriteria - MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria.AttachmentsQueryCriteria$fun withUploader(uploaderPredicate: ColumnPredicate<String>): AttachmentsQueryCriteria - MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria.AttachmentsQueryCriteria$fun withVersion(versionPredicate: ColumnPredicate<Int>): AttachmentsQueryCriteria MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria.AttachmentsQueryCriteria$uploadDateCondition: ColumnPredicate<Instant>? = null - MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria.AttachmentsQueryCriteria$val contractClassNamesCondition: ColumnPredicate<List<ContractClassName>>? = null - MaxLineLength:QueryCriteria.kt$AttachmentQueryCriteria.AttachmentsQueryCriteria$val versionCondition: ColumnPredicate<Int>? = null - MaxLineLength:QueryCriteria.kt$AttachmentsQueryCriteriaParser : BaseQueryCriteriaParser - MaxLineLength:QueryCriteria.kt$BaseQueryCriteriaParser<Q: GenericQueryCriteria<Q, P>, in P: BaseQueryCriteriaParser<Q,P,S>, in S : BaseSort> MaxLineLength:QueryCriteria.kt$GenericQueryCriteria.ChainableQueryCriteria$AndVisitor<Q : GenericQueryCriteria<Q, P>, in P : BaseQueryCriteriaParser<Q, P, S>, in S : BaseSort> : GenericQueryCriteria MaxLineLength:QueryCriteria.kt$GenericQueryCriteria.ChainableQueryCriteria$OrVisitor<Q : GenericQueryCriteria<Q, P>, in P : BaseQueryCriteriaParser<Q, P, S>, in S : BaseSort> : GenericQueryCriteria MaxLineLength:QueryCriteria.kt$QueryCriteria$@CordaSerializable sealed MaxLineLength:QueryCriteria.kt$QueryCriteria$AndComposition : QueryCriteriaAndVisitor MaxLineLength:QueryCriteria.kt$QueryCriteria$OrComposition : QueryCriteriaOrVisitor - MaxLineLength:QueryCriteria.kt$QueryCriteria.FungibleAssetQueryCriteria$( participants: List<AbstractParty>? = null, owner: List<AbstractParty>? = null, quantity: ColumnPredicate<Long>? = null, issuer: List<AbstractParty>? = null, issuerRef: List<OpaqueBytes>? = null, status: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, contractStateTypes: Set<Class<out ContractState>>? = null ) MaxLineLength:QueryCriteria.kt$QueryCriteria.FungibleAssetQueryCriteria$fun withContractStateTypes(contractStateTypes: Set<Class<out ContractState>>): FungibleAssetQueryCriteria - MaxLineLength:QueryCriteria.kt$QueryCriteria.FungibleAssetQueryCriteria$fun withParticipants(participants: List<AbstractParty>): FungibleAssetQueryCriteria MaxLineLength:QueryCriteria.kt$QueryCriteria.FungibleAssetQueryCriteria$fun withRelevancyStatus(relevancyStatus: Vault.RelevancyStatus): FungibleAssetQueryCriteria MaxLineLength:QueryCriteria.kt$QueryCriteria.FungibleStateQueryCriteria$fun withContractStateTypes(contractStateTypes: Set<Class<out ContractState>>): FungibleStateQueryCriteria - MaxLineLength:QueryCriteria.kt$QueryCriteria.FungibleStateQueryCriteria$fun withParticipants(participants: List<AbstractParty>): FungibleStateQueryCriteria MaxLineLength:QueryCriteria.kt$QueryCriteria.FungibleStateQueryCriteria$fun withRelevancyStatus(relevancyStatus: Vault.RelevancyStatus): FungibleStateQueryCriteria - MaxLineLength:QueryCriteria.kt$QueryCriteria.LinearStateQueryCriteria$( participants: List<AbstractParty>? = null, linearId: List<UniqueIdentifier>? = null, status: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, contractStateTypes: Set<Class<out ContractState>>? = null, relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL ) MaxLineLength:QueryCriteria.kt$QueryCriteria.LinearStateQueryCriteria$fun withContractStateTypes(contractStateTypes: Set<Class<out ContractState>>): LinearStateQueryCriteria - MaxLineLength:QueryCriteria.kt$QueryCriteria.LinearStateQueryCriteria$fun withParticipants(participants: List<AbstractParty>): LinearStateQueryCriteria - MaxLineLength:QueryCriteria.kt$QueryCriteria.LinearStateQueryCriteria$fun withRelevancyStatus(relevancyStatus: Vault.RelevancyStatus): LinearStateQueryCriteria MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultCustomQueryCriteria$fun withContractStateTypes(contractStateTypes: Set<Class<out ContractState>>): VaultCustomQueryCriteria<L> - MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultCustomQueryCriteria$fun withExpression(expression: CriteriaExpression<L, Boolean>): VaultCustomQueryCriteria<L> MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultCustomQueryCriteria$fun withRelevancyStatus(relevancyStatus: Vault.RelevancyStatus): VaultCustomQueryCriteria<L> - MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$( status: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, contractStateTypes: Set<Class<out ContractState>>? = null, stateRefs: List<StateRef>? = null, notary: List<AbstractParty>? = null, softLockingCondition: SoftLockingCondition? = null, timeCondition: TimeCondition? = null ) MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$( status: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, contractStateTypes: Set<Class<out ContractState>>? = null, stateRefs: List<StateRef>? = null, notary: List<AbstractParty>? = null, softLockingCondition: SoftLockingCondition? = null, timeCondition: TimeCondition? = null, relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, constraintTypes: Set<Vault.ConstraintInfo.Type> = emptySet(), constraints: Set<Vault.ConstraintInfo> = emptySet(), participants: List<AbstractParty>? = null ) MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$@DeprecatedConstructorForDeserialization(version = 2) constructor(status: Vault.StateStatus, contractStateTypes: Set<Class<out ContractState>>?) : this(status, contractStateTypes, participants = null) - MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$@DeprecatedConstructorForDeserialization(version = 3) constructor(status: Vault.StateStatus, contractStateTypes: Set<Class<out ContractState>>?, stateRefs: List<StateRef>?) : this( status, contractStateTypes, stateRefs, participants = null ) MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$@DeprecatedConstructorForDeserialization(version = 4) constructor(status: Vault.StateStatus, contractStateTypes: Set<Class<out ContractState>>?, stateRefs: List<StateRef>?, notary: List<AbstractParty>?) : this( status, contractStateTypes, stateRefs, notary, participants = null ) MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$@DeprecatedConstructorForDeserialization(version = 5) constructor(status: Vault.StateStatus, contractStateTypes: Set<Class<out ContractState>>?, stateRefs: List<StateRef>?, notary: List<AbstractParty>?, softLockingCondition: SoftLockingCondition?) : this( status, contractStateTypes, stateRefs, notary, softLockingCondition, participants = null ) MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$fun withConstraintTypes(constraintTypes: Set<Vault.ConstraintInfo.Type>): VaultQueryCriteria - MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$fun withConstraints(constraints: Set<Vault.ConstraintInfo>): VaultQueryCriteria MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$fun withContractStateTypes(contractStateTypes: Set<Class<out ContractState>>): VaultQueryCriteria - MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$fun withRelevancyStatus(relevancyStatus: Vault.RelevancyStatus): VaultQueryCriteria MaxLineLength:QueryCriteria.kt$QueryCriteria.VaultQueryCriteria$fun withSoftLockingCondition(softLockingCondition: SoftLockingCondition): VaultQueryCriteria - MaxLineLength:QueryCriteriaUtils.kt$/** * Note: use [PageSpecification] to correctly handle a number of bounded pages of a pre-configured page size. */ // Here we subtract 1 to allow the Vault to figure out whether there are more results and pages by querying for `pageSize + 1`. const val MAX_PAGE_SIZE = Int.MAX_VALUE - 1 - MaxLineLength:QueryCriteriaUtils.kt$Builder$@Deprecated("Does not support fields from a MappedSuperclass. Use equivalent on a FieldInfo.") fun <R : Comparable<R>> Field.comparePredicate(operator: BinaryComparisonOperator, value: R) MaxLineLength:QueryCriteriaUtils.kt$Builder$@Deprecated("Does not support fields from a MappedSuperclass. Use equivalent on a FieldInfo.") fun <R> Field.functionPredicate(predicate: ColumnPredicate<R>, groupByColumns: List<Column<Any, R>>? = null, orderBy: Sort.Direction? = null) MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmOverloads fun <O, R : Comparable<R>> KProperty1<O, R?>.`in`(collection: Collection<R>, exactMatch: Boolean = true) MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmOverloads fun <O, R : Comparable<R>> KProperty1<O, R?>.notIn(collection: Collection<R>, exactMatch: Boolean = true) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmOverloads fun <O, R> KProperty1<O, R?>.equal(value: R, exactMatch: Boolean = true) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmOverloads fun <O, R> KProperty1<O, R?>.notEqual(value: R, exactMatch: Boolean = true) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmOverloads fun <O> KProperty1<O, String?>.like(string: String, exactMatch: Boolean = true) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmOverloads fun <O> KProperty1<O, String?>.notLike(string: String, exactMatch: Boolean = true) MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmOverloads fun <R : Comparable<R>> `in`(collection: Collection<R>, exactMatch: Boolean = true) MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmOverloads fun <R : Comparable<R>> notIn(collection: Collection<R>, exactMatch: Boolean = true) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmOverloads fun <R> equal(value: R, exactMatch: Boolean = true) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmOverloads fun <R> notEqual(value: R, exactMatch: Boolean = true) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmOverloads fun notLike(string: String, exactMatch: Boolean = true) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmStatic @JvmOverloads @Deprecated("Does not support fields from a MappedSuperclass. Use equivalent on a FieldInfo.") fun <R : Comparable<R>> Field.`in`(collection: Collection<R>, exactMatch: Boolean = true) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmStatic @JvmOverloads @Deprecated("Does not support fields from a MappedSuperclass. Use equivalent on a FieldInfo.") fun <R : Comparable<R>> Field.notIn(collection: Collection<R>, exactMatch: Boolean = true) MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmStatic @JvmOverloads @Deprecated("Does not support fields from a MappedSuperclass. Use equivalent on a FieldInfo.") fun <R> Field.avg(groupByColumns: List<Field>? = null, orderBy: Sort.Direction? = null) MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmStatic @JvmOverloads @Deprecated("Does not support fields from a MappedSuperclass. Use equivalent on a FieldInfo.") fun <R> Field.max(groupByColumns: List<Field>? = null, orderBy: Sort.Direction? = null) MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmStatic @JvmOverloads @Deprecated("Does not support fields from a MappedSuperclass. Use equivalent on a FieldInfo.") fun <R> Field.min(groupByColumns: List<Field>? = null, orderBy: Sort.Direction? = null) MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmStatic @JvmOverloads @Deprecated("Does not support fields from a MappedSuperclass. Use equivalent on a FieldInfo.") fun <R> Field.sum(groupByColumns: List<Field>? = null, orderBy: Sort.Direction? = null) MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmStatic @JvmOverloads fun <R : Comparable<R>> FieldInfo.`in`(collection: Collection<R>, exactMatch: Boolean = true) MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmStatic @JvmOverloads fun <R : Comparable<R>> FieldInfo.notIn(collection: Collection<R>, exactMatch: Boolean = true) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmStatic fun <R : Comparable<R>> FieldInfo.greaterThan(value: R) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmStatic fun <R : Comparable<R>> FieldInfo.greaterThanOrEqual(value: R) - MaxLineLength:QueryCriteriaUtils.kt$Builder$@JvmStatic fun <R : Comparable<R>> FieldInfo.lessThanOrEqual(value: R) MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <O, R : Comparable<R>> KProperty1<O, R?>.comparePredicate(operator: BinaryComparisonOperator, value: R) - MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <O, R : Comparable<R>> KProperty1<O, R?>.greaterThan(value: R) MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <O, R : Comparable<R>> KProperty1<O, R?>.greaterThanOrEqual(value: R) - MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <O, R : Comparable<R>> KProperty1<O, R?>.lessThan(value: R) MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <O, R : Comparable<R>> KProperty1<O, R?>.lessThanOrEqual(value: R) - MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <O, R> KProperty1<O, R?>.count() MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <O, R> KProperty1<O, R?>.functionPredicate(predicate: ColumnPredicate<R>, groupByColumns: List<Column<O, R>>? = null, orderBy: Sort.Direction? = null) MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <O, R> KProperty1<O, R?>.predicate(predicate: ColumnPredicate<R>) - MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <R : Comparable<R>> FieldInfo.comparePredicate(operator: BinaryComparisonOperator, value: R) - MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <R : Comparable<R>> compare(operator: BinaryComparisonOperator, value: R) - MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <R : Comparable<R>> greaterThanOrEqual(value: R) MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <R> FieldInfo.functionPredicate(predicate: ColumnPredicate<R>, groupByColumns: List<Column<Any, R>>? = null, orderBy: Sort.Direction? = null) MaxLineLength:QueryCriteriaUtils.kt$Builder$fun <R> FieldInfo.predicate(predicate: ColumnPredicate<R>) - MaxLineLength:QueryCriteriaUtils.kt$Builder$functionPredicate(ColumnPredicate.AggregateFunction(AggregateFunctionType.AVG), groupByColumns?.map { Column(it) }, orderBy) MaxLineLength:QueryCriteriaUtils.kt$Builder$functionPredicate(ColumnPredicate.AggregateFunction(AggregateFunctionType.AVG), groupByColumns?.map { Column<Any, R>(it) }, orderBy) - MaxLineLength:QueryCriteriaUtils.kt$Builder$functionPredicate(ColumnPredicate.AggregateFunction(AggregateFunctionType.MAX), groupByColumns?.map { Column(it) }, orderBy) MaxLineLength:QueryCriteriaUtils.kt$Builder$functionPredicate(ColumnPredicate.AggregateFunction(AggregateFunctionType.MAX), groupByColumns?.map { Column<Any, R>(it) }, orderBy) - MaxLineLength:QueryCriteriaUtils.kt$Builder$functionPredicate(ColumnPredicate.AggregateFunction(AggregateFunctionType.MIN), groupByColumns?.map { Column(it) }, orderBy) MaxLineLength:QueryCriteriaUtils.kt$Builder$functionPredicate(ColumnPredicate.AggregateFunction(AggregateFunctionType.MIN), groupByColumns?.map { Column<Any, R>(it) }, orderBy) - MaxLineLength:QueryCriteriaUtils.kt$Builder$functionPredicate(ColumnPredicate.AggregateFunction(AggregateFunctionType.SUM), groupByColumns?.map { Column(it) }, orderBy) MaxLineLength:QueryCriteriaUtils.kt$Builder$functionPredicate(ColumnPredicate.AggregateFunction(AggregateFunctionType.SUM), groupByColumns?.map { Column<Any, R>(it) }, orderBy) MaxLineLength:QueryCriteriaUtils.kt$Column.Companion$when (property) { // This is to ensure that, for a JPA Entity, a field declared in a MappedSuperclass will not cause Hibernate to reject a query referencing it. // TODO remove the cast and access the owner properly after it will be exposed as Kotlin's public API (https://youtrack.jetbrains.com/issue/KT-24170). is CallableReference -> ((property as CallableReference).owner as KClass<*>).javaObjectType else -> property.javaGetter!!.declaringClass } - MaxLineLength:QueryCriteriaUtils.kt$ColumnPredicate$BinaryComparison<C : Comparable<C>> : ColumnPredicate - MaxLineLength:QueryCriteriaUtils.kt$ColumnPredicate$CollectionExpression<C> : ColumnPredicate - MaxLineLength:QueryCriteriaUtils.kt$ColumnPredicate$EqualityComparison<C> : ColumnPredicate MaxLineLength:QueryCriteriaUtils.kt$CriteriaExpression$BinaryLogical<O> : CriteriaExpression MaxLineLength:QueryCriteriaUtils.kt$CriteriaExpression$ColumnPredicateExpression<O, C> : CriteriaExpression - MaxLineLength:R3Pty.kt$R3Pty : AutoCloseable - MaxLineLength:R3Pty.kt$R3Pty$private MaxLineLength:RPCApi.kt$RPCApi.ServerToClient$FailedToDeserializeReply : RuntimeException MaxLineLength:RPCApi.kt$RPCApi.ServerToClient.Companion$val id = message.invocationId(RPC_ID_FIELD_NAME, RPC_ID_TIMESTAMP_FIELD_NAME) ?: throw IllegalStateException("Cannot parse invocation id from client message.") MaxLineLength:RPCApi.kt$RPCApi.ServerToClient.Companion$val observableId = message.invocationId(OBSERVABLE_ID_FIELD_NAME, OBSERVABLE_ID_TIMESTAMP_FIELD_NAME) ?: throw IllegalStateException("Cannot parse invocation id from client message.") - MaxLineLength:RPCApi.kt$RPCApi.ServerToClient.Companion$val payload = message.getBodyAsByteArray().deserialize<Notification<*>>(context = poolWithIdContext) - MaxLineLength:RPCApi.kt$RPCApi.ServerToClient.Companion${ val id = message.invocationId(RPC_ID_FIELD_NAME, RPC_ID_TIMESTAMP_FIELD_NAME) ?: throw IllegalStateException("Cannot parse invocation id from client message.") val poolWithIdContext = context.withProperty(RpcRequestOrObservableIdKey, id) // The result here is a Try<> that represents the attempt to try the operation on the server side. // If anything goes wrong with deserialisation of the response, we propagate it differently because // we also need to pass through the invocation and dedupe IDs. val result: Try<Any?> = try { message.getBodyAsByteArray().deserialize(context = poolWithIdContext) } catch (e: Exception) { throw FailedToDeserializeReply(id, e) } RpcReply( id = id, deduplicationIdentity = deduplicationIdentity, result = result ) } - MaxLineLength:RPCApi.kt$RPCApi.ServerToClient.Observation$message.bodyBuffer.writeBytes(content.safeSerialize(context) { Notification.createOnError<Void?>(it) }.bytes) - MaxLineLength:RPCApi.kt$net.corda.nodeapi.RPCApi.kt MaxLineLength:RPCApi.kt$private MaxLineLength:RPCApi.kt$private fun ClientMessage.invocationId(valueProperty: String, timestampProperty: String): InvocationId? MaxLineLength:RPCApi.kt$private fun ClientMessage.sessionId(valueProperty: String, timestampProperty: String): SessionId? - MaxLineLength:RPCApi.kt$private fun SessionId.mapTo(message: ClientMessage) MaxLineLength:RPCApi.kt$private fun Trace.mapToExternal(message: ClientMessage) MaxLineLength:RPCApi.kt$return invocationId(RPC_ID_FIELD_NAME, RPC_ID_TIMESTAMP_FIELD_NAME) ?: throw IllegalStateException("Cannot extract reply id from client message.") MaxLineLength:RPCApi.kt$return sessionId(RPC_SESSION_ID_FIELD_NAME, RPC_SESSION_ID_TIMESTAMP_FIELD_NAME) ?: throw IllegalStateException("Cannot extract the session id from client message.") - MaxLineLength:RPCClient.kt$RPCClient$reconnectAttempts = if (haPoolTransportConfigurations.isEmpty()) rpcConfiguration.maxReconnectAttempts else 0 - MaxLineLength:RPCClient.kt$RPCClient$throw RPCException("Requested minimum protocol version (${rpcConfiguration.minimumServerProtocolVersion}) is higher" + " than the server's supported protocol version ($serverProtocolVersion)") - MaxLineLength:RPCClient.kt$RPCClient$val ops: I = uncheckedCast(Proxy.newProxyInstance(rpcOpsClass.classLoader, arrayOf(rpcOpsClass), proxyHandler)) - MaxLineLength:RPCClientProxyHandler.kt$ObservableContext - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler : InvocationHandler - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$ fun notifyServerAndClose() - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$ private fun close(notify: Boolean = true) - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$artemisMessage.putLongProperty(RPCApi.DEDUPLICATION_SEQUENCE_NUMBER_FIELD_NAME, deduplicationSequenceNumber.getAndIncrement()) - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$if (deduplicationChecker.checkDuplicateMessageId(serverToClient.deduplicationIdentity, deduplicationSequenceNumber)) { log.info("Message duplication detected, discarding message") return } - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$log - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$log.debug("Server locator is closed or garbage collected. Proxy may have been closed during reconnect.") - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$log.error("RPC reply arrived to unknown RPC ID ${serverToClient.id}, this indicates an internal RPC error.") MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$private - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$private val deduplicationChecker = DeduplicationChecker(rpcConfiguration.deduplicationCacheExpiry, cacheFactory = cacheFactory) MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$private val serializationContextWithObservableContext = RpcClientObservableDeSerializer.createContext(serializationContext, observableContext) - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$producerSession = sessionFactory!!.createSession(rpcUsername, rpcPassword, false, true, true, false, DEFAULT_ACK_BATCH_SIZE) - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$retryInterval = minOf(maxRetryInterval, retryInterval.times(rpcConfiguration.connectionRetryIntervalMultiplier.toLong())) - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$return "{rpcUsername='$rpcUsername', clientAddress=$clientAddress, sessionId=$sessionId, targetLegalIdentity=$targetLegalIdentity}" MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$return cacheFactory.buildNamed(Caffeine.newBuilder().weakValues().removalListener(onObservableRemove).executor(SameThreadExecutor.getExecutor()), "RpcClientProxyHandler_rpcObservable") MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$throw UnsupportedOperationException("Method $calledMethod was added in RPC protocol version $sinceVersion but the server is running $serverProtocolVersion") - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$val observable: UnicastSubject<Notification<*>>? = observableContext.observableMap.getIfPresent(serverToClient.id) - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$val serialisedArguments = (arguments?.toList() ?: emptyList()).serialize(context = serializationContextWithObservableContext) - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler$var reconnectAttempts = rpcConfiguration.maxReconnectAttempts.times(serverLocator.staticTransportConfigurations.size) - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler${ // Deserialize the reply from the server, both the wrapping metadata and the actual body of the return value. val serverToClient: RPCApi.ServerToClient = try { RPCApi.ServerToClient.fromClientMessage(serializationContextWithObservableContext, message) } catch (e: RPCApi.ServerToClient.FailedToDeserializeReply) { // Might happen if something goes wrong during mapping the response to classes, evolution, class synthesis etc. log.error("Failed to deserialize RPC body", e) completeExceptionally(e.id, e, rpcReplyMap.remove(e.id)) return } val deduplicationSequenceNumber = message.getLongProperty(RPCApi.DEDUPLICATION_SEQUENCE_NUMBER_FIELD_NAME) if (deduplicationChecker.checkDuplicateMessageId(serverToClient.deduplicationIdentity, deduplicationSequenceNumber)) { log.info("Message duplication detected, discarding message") return } log.debug { "Got message from RPC server $serverToClient" } when (serverToClient) { is RPCApi.ServerToClient.RpcReply -> { val replyFuture = rpcReplyMap.remove(serverToClient.id) if (replyFuture == null) { log.error("RPC reply arrived to unknown RPC ID ${serverToClient.id}, this indicates an internal RPC error.") } else { val result: Try<Any?> = serverToClient.result when (result) { is Try.Success -> replyFuture.set(result.value) is Try.Failure -> { completeExceptionally(serverToClient.id, result.exception, replyFuture) } } } } is RPCApi.ServerToClient.Observation -> { val observable: UnicastSubject<Notification<*>>? = observableContext.observableMap.getIfPresent(serverToClient.id) if (observable == null) { log.debug("Observation ${serverToClient.content} arrived to unknown Observable with ID ${serverToClient.id}. " + "This may be due to an observation arriving before the server was " + "notified of observable shutdown") } else { // We schedule the onNext() on an executor sticky-pooled based on the Observable ID. observationExecutorPool.run(serverToClient.id) { executor -> executor.submit { val content = serverToClient.content if (content.isOnCompleted || content.isOnError) { observableContext.observableMap.invalidate(serverToClient.id) } // Add call site information on error if (content.isOnError) { val rpcCallSite = callSiteMap?.get(serverToClient.id) if (rpcCallSite != null) addRpcCallSiteToThrowable(content.throwable, rpcCallSite) } observable.onNext(content) } } } } } } - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler${ // Might happen if something goes wrong during mapping the response to classes, evolution, class synthesis etc. log.error("Failed to deserialize RPC body", e) completeExceptionally(e.id, e, rpcReplyMap.remove(e.id)) return } - MaxLineLength:RPCClientProxyHandler.kt$RPCClientProxyHandler${ // This is going to send remote message, see `org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.doCleanUp()`. sessionFactory?.close() } - MaxLineLength:RPCConcurrencyTests.kt$RPCConcurrencyTests$// We construct a rose tree of immediate Observables and check that parent observations arrive before children. val proxy = testProxy() val treeDepth = 6 val treeBranchingFactor = 3 val remainingLatch = CountDownLatch((intPower(treeBranchingFactor, treeDepth + 1) - 1) / (treeBranchingFactor - 1)) val depthsSeen = Collections.synchronizedSet(HashSet<Int>()) fun ObservableRose<Int>.subscribeToAll() { remainingLatch.countDown() this.branches.subscribe { tree -> (tree.value + 1 until treeDepth).forEach { require(it in depthsSeen) { "Got ${tree.value} before $it" } } depthsSeen.add(tree.value) tree.subscribeToAll() } } proxy.ops.getImmediateObservableTree(treeDepth, treeBranchingFactor).subscribeToAll() remainingLatch.await() - MaxLineLength:RPCConcurrencyTests.kt$RPCConcurrencyTests$val remainingLatch = CountDownLatch((intPower(treeBranchingFactor, treeDepth + 1) - 1) / (treeBranchingFactor - 1)) MaxLineLength:RPCDriver.kt$RPCDriverDSL$val artemisConfig = createRpcServerArtemisConfig(maxFileSize, maxBufferedBytesPerClient, driverDSL.driverDirectory / serverName, hostAndPort) - MaxLineLength:RPCDriver.kt$RPCDriverDSL$val process = ProcessUtilities.startJavaProcess<RandomRpcUser>(listOf(rpcOpsClass.name, rpcAddress.toString(), username, password)) MaxLineLength:RPCDriver.kt$RPCDriverDSL$val rpcSecurityManager = RPCSecurityManagerImpl.fromUserList(users = listOf(InternalUser(rpcUser.username, rpcUser.password, rpcUser.permissions)), id = AuthServiceId("TEST_SECURITY_MANAGER")) - MaxLineLength:RPCDriver.kt$RPCDriverDSL$val session = sessionFactory.createSession(username, password, false, true, true, locator.isPreAcknowledge, DEFAULT_ACK_BATCH_SIZE) MaxLineLength:RPCDriver.kt$RPCDriverDSL.Companion$fun createRpcServerArtemisConfig(maxFileSize: Int, maxBufferedBytesPerClient: Long, baseDirectory: Path, hostAndPort: NetworkHostAndPort): Configuration MaxLineLength:RPCDriver.kt$RandomRpcUser.Companion$private inline fun <reified T> HashMap<Class<*>, Generator<*>>.add(generator: Generator<T>) MaxLineLength:RPCDriver.kt$RandomRpcUser.Companion$val handle = RPCClient<RPCOps>(hostAndPort, null, serializationContext = AMQP_RPC_CLIENT_CONTEXT).start(rpcClass, username, password) MaxLineLength:RPCDriver.kt$SingleUserSecurityManager$override MaxLineLength:RPCDriver.kt$SingleUserSecurityManager$override fun validateUserAndRole(user: String?, password: String?, roles: MutableSet<Role>?, checkType: CheckType?) MaxLineLength:RPCHighThroughputObservableTests.kt$RPCHighThroughputObservableTests$val proxy = testProxy() // This tests that the observations are transmitted correctly, also check that server side doesn't try to serialize the whole lot // till client consumed some of the output produced. val observations = proxy.makeObservable() val observationsList = observations.take(4).toBlocking().toIterable().toList() assertEquals(listOf(1, 2, 3, 4), observationsList) - MaxLineLength:RPCHighThroughputObservableTests.kt$RPCHighThroughputObservableTests.TestOpsImpl$override fun makeObservable(): Observable<Int> MaxLineLength:RPCOpsWithContext.kt$fun makeRPCOps(getCordaRPCOps: (username: String, credential: String) -> InternalCordaRPCOps, username: String, credential: String): InternalCordaRPCOps MaxLineLength:RPCOpsWithContext.kt$return Proxy.newProxyInstance(InternalCordaRPCOps::class.java.classLoader, arrayOf(InternalCordaRPCOps::class.java)) { _, method, args -> try { method.invoke(cordaRPCOps, *(args ?: arrayOf())) } catch (e: InvocationTargetException) { // Unpack exception. throw e.targetException } } as InternalCordaRPCOps - MaxLineLength:RPCPerformanceTests.kt$RPCPerformanceTests$Mbps = bigSize.toDouble() * numberOfMessages.toDouble() / elapsed * (1000000.0 / (1024.0 * 1024.0)) - MaxLineLength:RPCSecurityManagerImpl.kt$RPCPermission$/** * Helper constructor directly setting actions and target field * * @param methods Set of allowed RPC methods * @param target An optional "target" type on which methods act */ constructor(methods: Set<String>, target: String? = null) : super(methods, target?.let { setOf(it.replace(".", ":")) }) - MaxLineLength:RPCSecurityManagerTest.kt$RPCSecurityManagerTest$val userRealms = RPCSecurityManagerImpl(SecurityConfiguration.AuthService.fromUsers(listOf(user)), TestingNamedCacheFactory()) MaxLineLength:RPCSecurityManagerWithAdditionalUser.kt$RPCSecurityManagerWithAdditionalUser : RPCSecurityManager - MaxLineLength:RPCSecurityManagerWithAdditionalUser.kt$RPCSecurityManagerWithAdditionalUser$private - MaxLineLength:RPCServer.kt$// TODO replace this by creating a new CordaRPCImpl for each request, passing the context, after we fix Shell and WebServer @JvmField internal val CURRENT_RPC_CONTEXT: ThreadLocal<RpcAuthContext> = CurrentRpcContext() MaxLineLength:RPCServer.kt$RPCServer$consumerSession = sessionFactory!!.createSession(rpcServerUsername, rpcServerPassword, false, true, true, false, DEFAULT_ACK_BATCH_SIZE) MaxLineLength:RPCServer.kt$RPCServer$private - MaxLineLength:RPCServer.kt$RPCServer$private val deduplicationChecker = DeduplicationChecker(rpcConfiguration.deduplicationCacheExpiry, cacheFactory = cacheFactory) MaxLineLength:RPCServer.kt$RPCServer$producerSession = sessionFactory!!.createSession(rpcServerUsername, rpcServerPassword, false, true, true, false, DEFAULT_ACK_BATCH_SIZE) MaxLineLength:RPCServer.kt$RPCServer$require(notificationType == CoreNotificationType.BINDING_ADDED.name){"Message contained notification type of $notificationType instead of expected ${CoreNotificationType.BINDING_ADDED.name}"} MaxLineLength:RPCServer.kt$RPCServer$require(notificationType == CoreNotificationType.BINDING_REMOVED.name){"Message contained notification type of $notificationType instead of expected ${CoreNotificationType.BINDING_REMOVED.name}"} - MaxLineLength:RPCServer.kt$RPCServer$return Pair(Actor(Id(validatedUser), securityManager.id, targetLegalIdentity), securityManager.buildSubject(validatedUser)) - MaxLineLength:RPCServer.kt$RPCServer$return RpcAuthContext(InvocationContext.rpc(rpcActor.first, trace, externalTrace, impersonatedActor), rpcActor.second) MaxLineLength:RPCServer.kt$RPCServer$return cacheFactory.buildNamed(Caffeine.newBuilder().removalListener(onObservableRemove).executor(SameThreadExecutor.getExecutor()), "RPCServer_observableSubscription") - MaxLineLength:RPCServer.kt$RPCServer$throw RPCException("Received RPC for unknown method $methodName - possible client/server version skew?") - MaxLineLength:RPCServer.kt$RPCServer$val deduplicationSequenceNumber = artemisMessage.getLongProperty(RPCApi.DEDUPLICATION_SEQUENCE_NUMBER_FIELD_NAME) MaxLineLength:RPCServer.kt$RPCServer$val targetLegalIdentity = message.getStringProperty(RPCApi.RPC_TARGET_LEGAL_IDENTITY)?.let(CordaX500Name.Companion::parse) ?: nodeLegalName MaxLineLength:RPCServer.kt$RPCServer$val validatedUser = message.getStringProperty(Message.HDR_VALIDATED_USER) ?: throw IllegalArgumentException("Missing validated user from the Artemis message") - MaxLineLength:RPCServer.kt$RPCServer${ lifeCycle.requireState(State.UNSTARTED) log.info("Starting RPC server with configuration $rpcConfiguration") senderThread = startSenderThread() rpcExecutor = Executors.newScheduledThreadPool( rpcConfiguration.rpcThreadPoolSize, ThreadFactoryBuilder().setNameFormat("rpc-server-handler-pool-%d").build() ) reaperExecutor = Executors.newSingleThreadScheduledExecutor( ThreadFactoryBuilder().setNameFormat("rpc-server-reaper-%d").build() ) reaperScheduledFuture = reaperExecutor!!.scheduleAtFixedRate( this::reapSubscriptions, rpcConfiguration.reapInterval.toMillis(), rpcConfiguration.reapInterval.toMillis(), TimeUnit.MILLISECONDS ) sessionFactory = serverLocator.createSessionFactory() producerSession = sessionFactory!!.createSession(rpcServerUsername, rpcServerPassword, false, true, true, false, DEFAULT_ACK_BATCH_SIZE) createRpcProducer(producerSession!!) consumerSession = sessionFactory!!.createSession(rpcServerUsername, rpcServerPassword, false, true, true, false, DEFAULT_ACK_BATCH_SIZE) createRpcConsumer(consumerSession!!) createNotificationConsumers(consumerSession!!) serverControl = activeMqServerControl deduplicationIdentity = UUID.randomUUID().toString() lifeCycle.transition(State.UNSTARTED, State.STARTED) // We delay the consumer session start because Artemis starts delivering messages immediately, so we need to be // fully initialised. producerSession!!.start() consumerSession!!.start() } MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$"Threads have leaked. New threads created: $newThreads (total before: ${threadsBefore.size}, total after: ${threadsAfter.size})" - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$@Ignore - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$RPCClient<RPCOps>(server.broker.hostAndPort!!).start(RPCOps::class.java, rpcTestUser.username, rpcTestUser.password).close() - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$configuration = CordaRPCClientConfiguration.DEFAULT.copy(minimumServerProtocolVersion = 1000) - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$message.putLongProperty(RPCApi.DEDUPLICATION_SEQUENCE_NUMBER_FIELD_NAME, dedupeId.getAndIncrement()) - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$pollUntilTrue("number of times subscribe() has been called") { trackSubscriberOpsImpl.subscriberCount.get() == 0 }.get() - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$pollUntilTrue("number of times subscribe() has been called") { trackSubscriberOpsImpl.subscriberCount.get() >= 100 }.get() - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$private - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$serialisedArguments = emptyList<Any>().serialize(context = SerializationDefaults.RPC_SERVER_CONTEXT) - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$serialisedArguments = listOf(100.millis, 1234).serialize(context = SerializationDefaults.RPC_SERVER_CONTEXT) MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$val client = startRpcClient<ServerOps>(listOf(NetworkHostAndPort("localhost", 12345), serverAddress, NetworkHostAndPort("localhost", 54321))).getOrThrow() MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$val client = startRpcClient<ServerOps>(listOf(server1.broker.hostAndPort!!, server2.broker.hostAndPort!!, server3.broker.hostAndPort!!)).getOrThrow() MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$val clientConfiguration = CordaRPCClientConfiguration.DEFAULT.copy(connectionRetryInterval = 1.seconds, maxReconnectAttempts = 5) @@ -8227,499 +4539,201 @@ MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$val connection = RPCClient<RPCOps>(server.broker.hostAndPort!!).start(RPCOps::class.java, rpcTestUser.username, rpcTestUser.password) MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$val connection1 = RPCClient<RPCOps>(server.broker.hostAndPort!!).start(RPCOps::class.java, rpcTestUser.username, rpcTestUser.password) MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$val connection2 = RPCClient<RPCOps>(server.broker.hostAndPort!!).start(RPCOps::class.java, rpcTestUser.username, rpcTestUser.password) - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$val server = startRpcServer(maxBufferedBytesPerClient = 10 * 1024 * 1024, ops = SlowConsumerRPCOpsImpl()).get() - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$val server = startRpcServer(maxBufferedBytesPerClient = 10 * 1024 * 1024, ops = SlowConsumerRPCOpsImpl()).get() // Construct an RPC session manually so that we can hang in the message handler val myQueue = "${RPCApi.RPC_CLIENT_QUEUE_NAME_PREFIX}.test.${random63BitValue()}" val session = startArtemisSession(server.broker.hostAndPort!!) session.createTemporaryQueue(myQueue, ActiveMQDefaultConfiguration.getDefaultRoutingType(), myQueue) val consumer = session.createConsumer(myQueue, null, -1, -1, false) consumer.setMessageHandler { Thread.sleep(5000) // Needs to be slower than one per second to get kicked. it.acknowledge() } val producer = session.createProducer(RPCApi.RPC_SERVER_QUEUE_NAME) session.start() pollUntilClientNumber(server, 1) val message = session.createMessage(false) val request = RPCApi.ClientToServer.RpcRequest( clientAddress = SimpleString(myQueue), methodName = SlowConsumerRPCOps::streamAtInterval.name, serialisedArguments = listOf(100.millis, 1234).serialize(context = SerializationDefaults.RPC_SERVER_CONTEXT), replyId = Trace.InvocationId.newInstance(), sessionId = Trace.SessionId.newInstance() ) request.writeToClientMessage(message) message.putLongProperty(RPCApi.DEDUPLICATION_SEQUENCE_NUMBER_FIELD_NAME, 0) producer.send(message) session.commit() // We are consuming slower than the server is producing, so we should be kicked after a while if slow consumers are enabled. pollUntilClientNumber(server, 0) - MaxLineLength:RPCStabilityTests.kt$RPCStabilityTests$val servers = mutableMapOf("server1" to serverFollower1, "server2" to serverFollower2, "server3" to serverFollower3) - MaxLineLength:RPCStabilityTests.kt$val clientAddresses = server.broker.serverControl.addressNames.filter { it.startsWith(RPCApi.RPC_CLIENT_QUEUE_NAME_PREFIX) } - MaxLineLength:RaftNotaryService.kt$RaftNotaryService$?: MaxLineLength:RaftNotaryServiceTests.kt$RaftNotaryServiceTests$val builder = DummyContract.generateInitial(Random().nextInt(), defaultNotaryIdentity, bankA.services.myInfo.singleIdentity().ref(0)) .setTimeWindow(bankA.services.clock.instant(), 30.seconds) - MaxLineLength:RaftNotaryServiceTests.kt$RaftNotaryServiceTests$val builder = DummyContract.generateInitial(Random().nextInt(), notary, nodeHandle.services.myInfo.singleIdentity().ref(0)) - MaxLineLength:RaftTransactionCommitLog.kt$RaftTransactionCommitLog$fun checkConflict(states: List<StateRef>, type: StateConsumptionDetails.ConsumedStateType) - MaxLineLength:RaftTransactionCommitLog.kt$RaftTransactionCommitLog$log.debug("State machine commit: attempting to store entries with keys (${commitCommand.states.joinToString()})") MaxLineLength:RaftTransactionCommitLog.kt$RaftTransactionCommitLog$private - MaxLineLength:RaftTransactionCommitLog.kt$RaftTransactionCommitLog$val deleteQuery = session.criteriaBuilder.createCriteriaDelete(PersistentUniquenessProvider.Request::class.java) - MaxLineLength:RaftTransactionCommitLog.kt$RaftTransactionCommitLog.Companion.CordaKryoSerializer$private val context = CheckpointSerializationDefaults.CHECKPOINT_CONTEXT.withEncoding(CordaSerializationEncoding.SNAPPY) - MaxLineLength:RaftTransactionCommitLogTests.kt$RaftTransactionCommitLogTests$private MaxLineLength:RaftTransactionCommitLogTests.kt$RaftTransactionCommitLogTests$val commitCommand = RaftTransactionCommitLog.Commands.CommitTransaction(states, txId, requestingPartyName.toString(), requestSignature) MaxLineLength:RaftTransactionCommitLogTests.kt$RaftTransactionCommitLogTests$val commitCommandFirst = RaftTransactionCommitLog.Commands.CommitTransaction(states, txIdFirst, requestingPartyName.toString(), requestSignature) MaxLineLength:RaftTransactionCommitLogTests.kt$RaftTransactionCommitLogTests$val commitCommandSecond = RaftTransactionCommitLog.Commands.CommitTransaction(states, txIdSecond, requestingPartyName.toString(), requestSignature) MaxLineLength:RaftTransactionCommitLogTests.kt$RaftTransactionCommitLogTests$val database = configureDatabase(makeTestDataSourceProperties(), DatabaseConfig(), { null }, { null }, NodeSchemaService(extraSchemas = setOf(RaftNotarySchemaV1))) MaxLineLength:RaftTransactionCommitLogTests.kt$RaftTransactionCommitLogTests$val stateMachineFactory = { RaftTransactionCommitLog(database, Clock.systemUTC(), { RaftUniquenessProvider.createMap(TestingNamedCacheFactory()) }) } - MaxLineLength:RaftUniquenessProvider.kt$RaftUniquenessProvider : UniquenessProviderSingletonSerializeAsToken - MaxLineLength:RaftUniquenessProvider.kt$RaftUniquenessProvider.Companion$fun createMap(cacheFactory: NamedCacheFactory): AppendOnlyPersistentMap<StateRef, Pair<Long, SecureHash>, CommittedState, String> - MaxLineLength:RaftUniquenessProvider.kt$RaftUniquenessProvider.Companion$it.value.deserialize<SecureHash>(context = SerializationDefaults.STORAGE_CONTEXT) - MaxLineLength:Rate.kt$Rate$override fun toString(): String - MaxLineLength:RatesFixFlow.kt$RatesFixFlow$ @Suspendable protected open fun filtering(elem: Any): Boolean MaxLineLength:RatesFixFlow.kt$RatesFixFlow$override val progressTracker: ProgressTracker = RatesFixFlow.tracker(fixOf.name) MaxLineLength:ReactiveArtemisConsumer.kt$MultiplexingReactiveArtemisConsumer$private MaxLineLength:ReactiveArtemisConsumer.kt$ReactiveArtemisConsumer.Companion$fun multiplex(createSession: () -> ClientSession, queueName: String, filter: String? = null, vararg queueNames: String): ReactiveArtemisConsumer - MaxLineLength:ReactiveArtemisConsumer.kt$ReactiveArtemisConsumer.Companion$fun multiplex(queueNames: Set<String>, createSession: () -> ClientSession, filter: String? = null): ReactiveArtemisConsumer - MaxLineLength:ReceiveAllFlowTests.kt$ReceiveMultipleFlowTests$ParallelAlgorithmMap : AlgorithmDefinition - MaxLineLength:ReceiveAllFlowTests.kt$ReceiveMultipleFlowTests$nodes[0].startFlowAndRunNetwork(ParallelAlgorithmList(nodes[1].info.singleIdentity(), nodes[2].info.singleIdentity())) - MaxLineLength:ReceiveAllFlowTests.kt$ReceiveMultipleFlowTests$nodes[0].startFlowAndRunNetwork(ParallelAlgorithmMap(nodes[1].info.singleIdentity(), nodes[2].info.singleIdentity())) - MaxLineLength:ReceiveAllFlowTests.kt$ReceiveMultipleFlowTests.AlgorithmDefinition$@InitiatingFlow abstract - MaxLineLength:ReceiveFinalityFlowTest.kt$ReceiveFinalityFlowTest$bob = mockNet.restartNode(bob, parameters = InternalMockNodeParameters(additionalCordapps = listOf(FINANCE_CONTRACTS_CORDAPP))) - MaxLineLength:ReceiveFinalityFlowTest.kt$ReceiveFinalityFlowTest$private val mockNet = InternalMockNetwork(notarySpecs = listOf(MockNetworkNotarySpec(DUMMY_NOTARY_NAME, validating = false))) - MaxLineLength:ReceiveFinalityFlowTest.kt$ReceiveFinalityFlowTest$val alice = mockNet.createNode(InternalMockNodeParameters(legalName = ALICE_NAME, additionalCordapps = FINANCE_CORDAPPS)) - MaxLineLength:ReceiveFinalityFlowTest.kt$ReceiveFinalityFlowTest$val paymentReceiverFuture = bob.smm.track().updates.filter { it.logic is CashPaymentReceiverFlow }.map { it.logic.runId }.toFuture() MaxLineLength:ReceiveFinalityFlowTest.kt$ReceiveFinalityFlowTest$var bob = mockNet.createNode(InternalMockNodeParameters(legalName = BOB_NAME, additionalCordapps = listOf(FINANCE_WORKFLOWS_CORDAPP))) - MaxLineLength:ReceiveFinalityFlowTest.kt$ReceiveFinalityFlowTest${ val alice = mockNet.createNode(InternalMockNodeParameters(legalName = ALICE_NAME, additionalCordapps = FINANCE_CORDAPPS)) // Bob initially does not have the finance contracts CorDapp so that it can throw an exception in ReceiveFinalityFlow when receiving // the payment from Alice var bob = mockNet.createNode(InternalMockNodeParameters(legalName = BOB_NAME, additionalCordapps = listOf(FINANCE_WORKFLOWS_CORDAPP))) val paymentReceiverFuture = bob.smm.track().updates.filter { it.logic is CashPaymentReceiverFlow }.map { it.logic.runId }.toFuture() alice.services.startFlow(CashIssueAndPaymentFlow( 100.POUNDS, OpaqueBytes.of(0), bob.info.singleIdentity(), false, mockNet.defaultNotaryIdentity )) mockNet.runNetwork() val paymentReceiverId = paymentReceiverFuture.getOrThrow() assertThat(bob.services.vaultService.queryBy<FungibleAsset<*>>().states).isEmpty() bob.assertFlowSentForObservationDueToConstraintError(paymentReceiverId) // Restart Bob with the contracts CorDapp so that it can recover from the error bob = mockNet.restartNode(bob, parameters = InternalMockNodeParameters(additionalCordapps = listOf(FINANCE_CONTRACTS_CORDAPP))) mockNet.runNetwork() assertThat(bob.services.getCashBalance(GBP)).isEqualTo(100.POUNDS) } MaxLineLength:ReceiveTransactionFlow.kt$ReceiveStateAndRefFlow<out T : ContractState> : FlowLogic MaxLineLength:ReceiveTransactionFlow.kt$ReceiveTransactionFlow : FlowLogic - MaxLineLength:ReceiveTransactionFlow.kt$ReceiveTransactionFlow$logger.trace { "Receiving a transaction (but without checking the signatures) from ${otherSideSession.counterparty}" } MaxLineLength:ReceiveTransactionFlow.kt$ReceiveTransactionFlow$private val statesToRecord: StatesToRecord = StatesToRecord.NONE MaxLineLength:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps : AutoCloseableInternalCordaRPCOps MaxLineLength:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps$ fun runFlowWithLogicalRetry(runFlow: (CordaRPCOps) -> StateMachineRunId, hasFlowStarted: (CordaRPCOps) -> Boolean, onFlowConfirmed: () -> Unit = {}, timeout: Duration = 4.seconds) - MaxLineLength:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps.Companion$private - MaxLineLength:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps.ErrorInterceptingHandler$log.error("Node is being shutdown. Operation ${method.name} rejected. Retrying when node is up...", e) + MaxLineLength:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps$ReconnectingRPCConnection(nodeHostAndPorts, username, password, rpcConfiguration, sslConfiguration, classLoader, gracefulReconnect) MaxLineLength:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps.ErrorInterceptingHandler$private - MaxLineLength:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps.ReconnectingRPCConnection$CurrentState.CONNECTING, CurrentState.DIED -> throw IllegalArgumentException("Illegal state: $currentState ") MaxLineLength:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps.ReconnectingRPCConnection$attemptedAddress MaxLineLength:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps.ReconnectingRPCConnection$private tailrec - MaxLineLength:ReconnectingObservable.kt$ReconnectingObservable.ReconnectingSubscriber$backingSubscription = dataFeed.updates.subscribe(subscriber::onNext, ::scheduleResubscribe, subscriber::onCompleted) - MaxLineLength:ReferenceInputStateTests.kt$ReferenceStateTests$networkParameters = testNetworkParameters(minimumPlatformVersion = 4, notaries = listOf(NotaryInfo(DUMMY_NOTARY, true))) MaxLineLength:ReferenceInputStateTests.kt$ReferenceStateTests$output(ExampleContract::class.java.typeName, "UPDATED REF DATA", "REF DATA".output<ExampleState>().copy(data = "NEW STUFF!")) MaxLineLength:ReferenceInputStateTests.kt$ReferenceStateTests$val stateAndRef = StateAndRef(TransactionState(state, CONTRACT_ID, DUMMY_NOTARY, constraint = AlwaysAcceptAttachmentConstraint), StateRef(SecureHash.zeroHash, 0)) - MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$UseRefState : FlowLogic MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$assertEquals(2, nodes[2].services.vaultService.queryBy<LinearState>(QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.ALL)).states.size) MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$assertEquals(3, nodes[2].services.vaultService.queryBy<LinearState>(QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.ALL)).states.size) MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$assertEquals(4, nodes[1].services.vaultService.queryBy<LinearState>(QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.ALL)).states.size) - MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$nodes[0].services.startFlow(ReportTransactionFlow(nodes[2].info.legalIdentities.first(), newRefTx)).resultFuture.getOrThrow() - MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$nodes[0].services.startFlow(ReportTransactionFlow(nodes[2].info.legalIdentities.first(), newTx)).resultFuture.getOrThrow() - MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$nodes[0].services.startFlow(ReportTransactionFlow(nodes[2].info.legalIdentities.first(), updatedRefTx)).resultFuture.getOrThrow() - MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$val newTx = nodes[0].services.startFlow(UseRefState(nodes[1].info.legalIdentities.first(), newRefState.state.data.linearId)) .resultFuture.getOrThrow() - MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$val updatedQuery = QueryCriteria.VaultQueryCriteria(stateRefs = listOf(newRefState.ref), status = Vault.StateStatus.ALL) - MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$val updatedTx = nodes[0].services.startFlow(UseRefState(nodes[1].info.legalIdentities.first(), newRefState.state.data.linearId)) .resultFuture.getOrThrow() MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests$val useRefTx = nodes[1].services.startFlow(WithReferencedStatesFlow { UseRefState(nodeOneIdentity, newRefState.state.data.linearId) }) .resultFuture MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests${ // 1. Create a state to be used as a reference state. Don't share it. val newRefTx = nodes[0].services.startFlow(CreateRefState()).resultFuture.getOrThrow() val newRefState = newRefTx.tx.outRefsOfType<RefState.State>().single() // 2. Use the "newRefState" a transaction involving another party (nodes[1]) which creates a new state. They should store the new state and the reference state. val newTx = nodes[0].services.startFlow(UseRefState(nodes[1].info.legalIdentities.first(), newRefState.state.data.linearId)) .resultFuture.getOrThrow() // Wait until node 1 stores the new tx. nodes[1].services.validatedTransactions.trackTransaction(newTx.id).getOrThrow() // Check that nodes[1] has finished recording the transaction (and updating the vault.. hopefully!). // nodes[1] should have two states. The newly created output of type "Regular.State" and the reference state created by nodes[0]. assertEquals(2, nodes[1].services.vaultService.queryBy<LinearState>().states.size) // Now let's find the specific reference state on nodes[1]. val refStateLinearId = newRefState.state.data.linearId val query = QueryCriteria.LinearStateQueryCriteria(linearId = listOf(refStateLinearId)) val theReferencedState = nodes[1].services.vaultService.queryBy<RefState.State>(query) // There should be one result - the reference state. assertEquals(newRefState, theReferencedState.states.single()) println(theReferencedState.statesMetadata.single()) // nodes[0] should also have the same state. val nodeZeroQuery = QueryCriteria.LinearStateQueryCriteria(linearId = listOf(refStateLinearId)) val theReferencedStateOnNodeZero = nodes[0].services.vaultService.queryBy<RefState.State>(nodeZeroQuery) assertEquals(newRefState, theReferencedStateOnNodeZero.states.single()) // nodes[0] sends the tx that created the reference state to nodes[1]. nodes[0].services.startFlow(Initiator(newRefState)).resultFuture.getOrThrow() // Query again. val theReferencedStateAgain = nodes[1].services.vaultService.queryBy<RefState.State>(query) // There should be one result - the reference state. assertEquals(newRefState, theReferencedStateAgain.states.single()) } MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests${ // 1. Create a state to be used as a reference state. Don't share it. val newRefTx = nodes[0].services.startFlow(CreateRefState()).resultFuture.getOrThrow() val newRefState = newRefTx.tx.outRefsOfType<RefState.State>().single() // 2. Use the "newRefState" a transaction involving another party (nodes[1]) which creates a new state. They should store the new state and the reference state. val newTx = nodes[0].services.startFlow(UseRefState(nodes[1].info.legalIdentities.first(), newRefState.state.data.linearId)) .resultFuture.getOrThrow() // Wait until node 1 stores the new tx. nodes[1].services.validatedTransactions.trackTransaction(newTx.id).getOrThrow() // Check that nodes[1] has finished recording the transaction (and updating the vault.. hopefully!). val allRefStates = nodes[1].services.vaultService.queryBy<LinearState>() // nodes[1] should have two states. The newly created output and the reference state created by nodes[0]. assertEquals(2, allRefStates.states.size) } MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests${ // 1. Create a state to be used as a reference state. Don't share it. val newRefTx = nodes[0].services.startFlow(CreateRefState()).resultFuture.getOrThrow() val newRefState = newRefTx.tx.outRefsOfType<RefState.State>().single() // 2. Use the "newRefState" in a transaction involving another party (nodes[1]) which creates a new state. They should store the new state and the reference state. val newTx = nodes[0].services.startFlow(UseRefState(nodes[1].info.legalIdentities.first(), newRefState.state.data.linearId)) .resultFuture.getOrThrow() // Wait until node 1 stores the new tx. nodes[1].services.validatedTransactions.trackTransaction(newTx.id).getOrThrow() // Check that nodes[1] has finished recording the transaction (and updating the vault.. hopefully!). // nodes[1] should have two states. The newly created output of type "Regular.State" and the reference state created by nodes[0]. assertEquals(2, nodes[1].services.vaultService.queryBy<LinearState>().states.size) // 3. Update the reference state but don't share the update. val updatedRefTx = nodes[0].services.startFlow(UpdateRefState(newRefState)).resultFuture.getOrThrow() // 4. Now report the transactions that created the two reference states to a third party. nodes[0].services.startFlow(ReportTransactionFlow(nodes[2].info.legalIdentities.first(), newRefTx)).resultFuture.getOrThrow() nodes[0].services.startFlow(ReportTransactionFlow(nodes[2].info.legalIdentities.first(), updatedRefTx)).resultFuture.getOrThrow() // Check that there are two linear states in the vault (note that one is consumed) assertEquals(2, nodes[2].services.vaultService.queryBy<LinearState>(QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.ALL)).states.size) // 5. Report the transaction that uses the consumed reference state nodes[0].services.startFlow(ReportTransactionFlow(nodes[2].info.legalIdentities.first(), newTx)).resultFuture.getOrThrow() // There should be 3 linear states in the vault assertEquals(3, nodes[2].services.vaultService.queryBy<LinearState>(QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.ALL)).states.size) } MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests${ // 1. Create a state to be used as a reference state. Don't share it. val newRefTx = nodes[0].services.startFlow(CreateRefState()).resultFuture.getOrThrow() val newRefState = newRefTx.tx.outRefsOfType<RefState.State>().single() // 2. Use the "newRefState" in a transaction involving another party (nodes[1]) which creates a new state. They should store the new state and the reference state. val newTx = nodes[0].services.startFlow(UseRefState(nodes[1].info.legalIdentities.first(), newRefState.state.data.linearId)) .resultFuture.getOrThrow() // Wait until node 1 stores the new tx. nodes[1].services.validatedTransactions.trackTransaction(newTx.id).getOrThrow() // Check that nodes[1] has finished recording the transaction (and updating the vault.. hopefully!). // nodes[1] should have two states. The newly created output of type "Regular.State" and the reference state created by nodes[0]. assertEquals(2, nodes[1].services.vaultService.queryBy<LinearState>().states.size) // Now let's find the specific reference state on nodes[1]. val refStateLinearId = newRefState.state.data.linearId val query = QueryCriteria.LinearStateQueryCriteria(linearId = listOf(refStateLinearId)) val theReferencedState = nodes[1].services.vaultService.queryBy<RefState.State>(query) // There should be one result - the reference state. assertEquals(newRefState, theReferencedState.states.single()) // The reference state should not be consumed. assertEquals(Vault.StateStatus.UNCONSUMED, theReferencedState.statesMetadata.single().status) // nodes[0] should also have the same state. val nodeZeroQuery = QueryCriteria.LinearStateQueryCriteria(linearId = listOf(refStateLinearId)) val theReferencedStateOnNodeZero = nodes[0].services.vaultService.queryBy<RefState.State>(nodeZeroQuery) assertEquals(newRefState, theReferencedStateOnNodeZero.states.single()) assertEquals(Vault.StateStatus.UNCONSUMED, theReferencedStateOnNodeZero.statesMetadata.single().status) // 3. Update the reference state but don't share the update. nodes[0].services.startFlow(UpdateRefState(newRefState)).resultFuture.getOrThrow() // 4. Use the evolved state as a reference state. val updatedTx = nodes[0].services.startFlow(UseRefState(nodes[1].info.legalIdentities.first(), newRefState.state.data.linearId)) .resultFuture.getOrThrow() // Wait until node 1 stores the new tx. nodes[1].services.validatedTransactions.trackTransaction(updatedTx.id).getOrThrow() // Check that nodes[1] has finished recording the transaction (and updating the vault.. hopefully!). // nodes[1] should have four states. The originals, plus the newly created output of type "Regular.State" and the reference state created by nodes[0]. assertEquals(4, nodes[1].services.vaultService.queryBy<LinearState>(QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.ALL)).states.size) // Now let's find the original reference state on nodes[1]. val updatedQuery = QueryCriteria.VaultQueryCriteria(stateRefs = listOf(newRefState.ref), status = Vault.StateStatus.ALL) val theOriginalReferencedState = nodes[1].services.vaultService.queryBy<RefState.State>(updatedQuery) // There should be one result - the original reference state. assertEquals(newRefState, theOriginalReferencedState.states.single()) // The reference state should be consumed. assertEquals(Vault.StateStatus.CONSUMED, theOriginalReferencedState.statesMetadata.single().status) // nodes[0] should also have the same state. val theOriginalReferencedStateOnNodeZero = nodes[0].services.vaultService.queryBy<RefState.State>(updatedQuery) assertEquals(newRefState, theOriginalReferencedStateOnNodeZero.states.single()) assertEquals(Vault.StateStatus.CONSUMED, theOriginalReferencedStateOnNodeZero.statesMetadata.single().status) } MaxLineLength:ReferencedStatesFlowTests.kt$ReferencedStatesFlowTests.RefState.State$data - MaxLineLength:RemoteSerializerFactory.kt$DefaultRemoteSerializerFactory : RemoteSerializerFactory - MaxLineLength:RemoteSerializerFactory.kt$DefaultRemoteSerializerFactory$RemoteAndLocalTypeInformation(remoteInformation, localInformationByIdentifier[remoteInformation.typeIdentifier]!!) - MaxLineLength:RemoteSerializerFactory.kt$DefaultRemoteSerializerFactory$logger.trace("get Serializer descriptor=$typeDescriptor") // Interpret all of the types in the schema into RemoteTypeInformation, and reflect that into LocalTypeInformation. val remoteTypeInformationMap = remoteTypeModel.interpret(schema) val reflected = reflect(remoteTypeInformationMap, context) // Get, and record in the registry, serializers for all of the types contained in the schema. // This will save us having to re-interpret the entire schema on re-entry when deserialising individual property values. val serializers = reflected.mapValues { (descriptor, remoteLocalPair) -> descriptorBasedSerializerRegistry.getOrBuild(descriptor) { getUncached(remoteLocalPair.remoteTypeInformation, remoteLocalPair.localTypeInformation) } } // Return the specific serializer the caller asked for. serializers[typeDescriptor] ?: throw NotSerializableException( "Could not find type matching descriptor $typeDescriptor.") - MaxLineLength:RemoteSerializerFactory.kt$DefaultRemoteSerializerFactory$when { // If descriptors match, we can return the local serializer straight away. localDescriptor == remoteDescriptor -> localSerializer // Can we deserialise without evolution, e.g. going from List<Foo> to List<*>? remoteTypeInformation.isDeserialisableWithoutEvolutionTo(localTypeInformation) -> localSerializer // Are the remote/local types evolvable? If so, ask the evolution serializer factory for a serializer, returning // the local serializer if it returns null (i.e. no evolution required). remoteTypeInformation.isEvolvableTo(localTypeInformation) -> evolutionSerializerFactory.getEvolutionSerializer(remoteTypeInformation, localTypeInformation) ?: localSerializer // Descriptors don't match, and something is probably broken, but we let the framework do what it can with the local // serialiser (BlobInspectorTest uniquely breaks if we throw an exception here, and passes if we just warn and continue). else -> { logger.warn(""" Mismatch between type descriptors, but remote type is not evolvable to local type. Remote type (descriptor: $remoteDescriptor) ${remoteTypeInformation.prettyPrint(false)} Local type (descriptor $localDescriptor): ${localTypeInformation.prettyPrint(false)} """) localSerializer } } - MaxLineLength:RemoteSerializerFactory.kt$RemoteSerializerFactory$ @Throws(NotSerializableException::class, ClassNotFoundException::class) fun get(typeDescriptor: TypeDescriptor, schema: SerializationSchemas, context: SerializationContext): AMQPSerializer<Any> - MaxLineLength:RemoteTypeCarpenter.kt$SchemaBuildingRemoteTypeCarpenter$if (typeInformation.typeIdentifier !is TypeIdentifier.Parameterised) typeInformation.carpentComposable() - MaxLineLength:RemoteTypeInformation.kt$RemoteTypeInformation - MaxLineLength:RemoteTypeInformation.kt$RemoteTypeInformation$ fun prettyPrint(simplifyClassNames: Boolean = true): String MaxLineLength:RemoteTypeInformation.kt$RemoteTypeInformation.AnArray$data MaxLineLength:RemoteTypeInformation.kt$RemoteTypeInformation.AnInterface$data MaxLineLength:RemoteTypeInformation.kt$RemoteTypeInformation.Parameterised$data MaxLineLength:RemoteTypeInformation.kt$RemoteTypeInformation.Unparameterised$data - MaxLineLength:RemoteTypeInformation.kt$RemoteTypeInformationPrettyPrinter$private data - MaxLineLength:ReplayedList.kt$ReplayedList<A> : TransformationList - MaxLineLength:Reporter.kt$ObjectName("$domain:type=$category,${if (component.isNotEmpty()) "component=$component," else ""}name=$subName") - MaxLineLength:RequiresDb.kt$RequiresDb MaxLineLength:RequiresDb.kt$RequiresSql - MaxLineLength:ResolveStatePointersTest.kt$ResolveStatePointersTest$networkParameters = testNetworkParameters(minimumPlatformVersion = 4, notaries = listOf(NotaryInfo(notary.party, true))) - MaxLineLength:ResolveStatePointersTest.kt$ResolveStatePointersTest.Foo$@BelongsToContract(DummyContract::class) private data - MaxLineLength:ResolveTransactionsFlow.kt$ResolveTransactionsFlow$ // TODO This can also be done in parallel. See comment to [fetchMissingAttachments] above. @Suspendable fun fetchMissingNetworkParameters(transaction: SignedTransaction): Boolean - MaxLineLength:ResolveTransactionsFlow.kt$ResolveTransactionsFlow$ // TODO: This could be done in parallel with other fetches for extra speed. @Suspendable fun fetchMissingAttachments(transaction: SignedTransaction): Boolean - MaxLineLength:ResolveTransactionsFlow.kt$ResolveTransactionsFlow$/** * Resolves and validates the dependencies of the specified [SignedTransaction]. Fetches the attachments, but does * *not* validate or store the [SignedTransaction] itself. * * @return a list of verified [SignedTransaction] objects, in a depth-first order. */ constructor(transaction: SignedTransaction, otherSide: FlowSession, statesToRecord: StatesToRecord = StatesToRecord.NONE) : this(transaction, transaction.dependencies, otherSide, statesToRecord) MaxLineLength:ResolveTransactionsFlow.kt$ResolveTransactionsFlow$val counterpartyPlatformVersion = checkNotNull(serviceHub.networkMapCache.getNodeByLegalIdentity(otherSide.counterparty)?.platformVersion) { "Couldn't retrieve party's ${otherSide.counterparty} platform version from NetworkMapCache" } - MaxLineLength:ResolveTransactionsFlow.kt$ResolveTransactionsFlow$val usedStatesToRecord = if (statesToRecord == StatesToRecord.NONE) StatesToRecord.ONLY_RELEVANT else statesToRecord - MaxLineLength:ResolveTransactionsFlow.kt$ResolveTransactionsFlow${ // TODO This error should actually cause the flow to be sent to the flow hospital to be retried val counterpartyPlatformVersion = checkNotNull(serviceHub.networkMapCache.getNodeByLegalIdentity(otherSide.counterparty)?.platformVersion) { "Couldn't retrieve party's ${otherSide.counterparty} platform version from NetworkMapCache" } // Fetch missing parameters flow was added in version 4. This check is needed so we don't end up with node V4 sending parameters // request to node V3 that doesn't know about this protocol. fetchNetParamsFromCounterpart = counterpartyPlatformVersion >= 4 if (initialTx != null) { fetchMissingAttachments(initialTx) fetchMissingNetworkParameters(initialTx) } val resolver = (serviceHub as ServiceHubCoreInternal).createTransactionsResolver(this) resolver.downloadDependencies() otherSide.send(FetchDataFlow.Request.End) // Finish fetching data. // If transaction resolution is performed for a transaction where some states are relevant, then those should be // recorded if this has not already occurred. val usedStatesToRecord = if (statesToRecord == StatesToRecord.NONE) StatesToRecord.ONLY_RELEVANT else statesToRecord resolver.recordDependencies(usedStatesToRecord) } - MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$// Used for checking larger chains resolve correctly. Note that this takes a long time to run, and so is not suitable for a CI gate. @Test @Ignore fun `Can resolve large chain of transactions`() - MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$currentTx = createContractUpgradeTransaction(currentTx.tx.outRefsOfType<ContractState>().map { it.ref }, currentTx) MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$private - MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$val ledgerTx = (currentTx.coreTransaction as ContractUpgradeWireTransaction).resolve(megaCorpNode.services, currentTx.sigs) - MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$val ledgerTx = (currentTx.coreTransaction as NotaryChangeWireTransaction).resolve(megaCorpNode.services, currentTx.sigs) MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$val notaryTx = NotaryChangeTransactionBuilder(inputs, notary, newNotary, notaryNode.services.networkParametersService.defaultHash).build() - MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$val signableData = SignableData(contractTx.id, SignatureMetadata(4, Crypto.findSignatureScheme(notaryKey).schemeNumberID)) - MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest$val signableData = SignableData(notaryTx.id, SignatureMetadata(4, Crypto.findSignatureScheme(notaryKey).schemeNumberID)) MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest.TestFlow$@InitiatingFlow open - MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest.TestFlow$constructor(txHashes: Set<SecureHash>, otherSide: Party) : this(otherSide, { ResolveTransactionsFlow(txHashes, it) }) MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest.TestNoRightsVendingFlow$@InitiatingFlow private MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest.TestResponseResolveNoRightsFlow$otherSideSession.sendAndReceive<Any>(FetchDataFlow.Request.Data(NonEmptySet.of(noRightsTx.inputs.first().txhash), FetchDataFlow.DataType.TRANSACTION)) - MaxLineLength:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest.TestResponseResolveTwiceFlow$otherSideSession.sendAndReceive<Any>(FetchDataFlow.Request.Data(NonEmptySet.of(parent1), FetchDataFlow.DataType.TRANSACTION)) MaxLineLength:RetryFlowMockTest.kt$RetryFlowMockTest${ val messagesSent = Collections.synchronizedList(mutableListOf<Message>()) val partyB = nodeB.info.legalIdentities.first() nodeA.setMessagingServiceSpy(object : MessagingServiceSpy() { override fun send(message: Message, target: MessageRecipients, sequenceKey: Any) { messagesSent.add(message) messagingService.send(message, target) } }) val count = 10000 // Lots of iterations so the flow keeps going long enough nodeA.startFlow(KeepSendingFlow(count, partyB)) eventually(duration = Duration.ofSeconds(30), waitBetween = Duration.ofMillis(100)) { assertTrue(messagesSent.isNotEmpty()) assertNotNull(messagesSent.first().senderUUID) } nodeA = mockNet.restartNode(nodeA) // This is a bit racy because restarting the node actually starts it, so we need to make sure there's enough iterations we get here with flow still going. nodeA.setMessagingServiceSpy(object : MessagingServiceSpy() { override fun send(message: Message, target: MessageRecipients, sequenceKey: Any) { messagesSent.add(message) messagingService.send(message, target) } }) // Now short circuit the iterations so the flow finishes soon. KeepSendingFlow.count.set(count - 2) eventually(duration = Duration.ofSeconds(30), waitBetween = Duration.ofMillis(100)) { assertTrue(nodeA.smm.allStateMachines.isEmpty()) } assertNull(messagesSent.last().senderUUID) } - MaxLineLength:RetryFlowMockTest.kt$RetryFlowMockTest.<no name provided>$override - MaxLineLength:RetryFlowMockTest.kt$RetryFlowMockTest.RetryInsertFlow$val tx = DBTransactionStorage.DBTransaction("Foo", null, Utils.EMPTY_BYTES, DBTransactionStorage.TransactionStatus.VERIFIED) - MaxLineLength:RigorousMock.kt$ fun <T> participant(clazz: Class<out T>) - MaxLineLength:RigorousMock.kt$ fun <T> rigorousMock(clazz: Class<out T>) - MaxLineLength:RigorousMock.kt$ fun <T> spectator(clazz: Class<out T>) MaxLineLength:RigorousMock.kt$ParticipantDefaultAnswer$"Please specify what should happen when '${invocation.method}' is called, or don't call it. Args: ${Arrays.toString(invocation.arguments)}" MaxLineLength:RigorousMock.kt$RigorousMockDefaultAnswer$return if (Modifier.isAbstract(invocation.method.modifiers)) ParticipantDefaultAnswer.answerImpl(invocation) else invocation.callRealMethod() MaxLineLength:RigorousMock.kt$SpectatorDefaultAnswer.MethodInfo$private fun newSpectator(invocation: InvocationOnMock) - MaxLineLength:RigorousMock.kt$SpectatorDefaultAnswer.MethodInfo$return context.actualTypeArguments[clazz.typeParameters.indexOf(resolveType(clazz.genericSuperclass, type))] - MaxLineLength:RigorousMock.kt$UndefinedMockBehaviorException : RuntimeException - MaxLineLength:RigorousMockTest.kt$RigorousMockTest$assertSame<Any>(UndefinedMockBehaviorException::class.java, catchThrowable { collaborator.noClearDefault() }.javaClass) - MaxLineLength:RigorousMockTest.kt$RigorousMockTest$assertSame<Any>(UndefinedMockBehaviorException::class.java, catchThrowable { m.a }.javaClass) MaxLineLength:RigorousMockTest.kt$RigorousMockTest$assertSame<Any>(UndefinedMockBehaviorException::class.java, catchThrowable { m.kotlinDefaultFun() }.javaClass) MaxLineLength:RolesAdderOnLogin.kt$RolesAdderOnLogin$internal - MaxLineLength:RoundTripObservableSerializerTests.kt$RoundTripObservableSerializerTests$return Caffeine.newBuilder().weakValues().removalListener(onObservableRemove).executor(SameThreadExecutor.getExecutor()).build() MaxLineLength:RoundTripObservableSerializerTests.kt$RoundTripObservableSerializerTests$serializationContext - MaxLineLength:RoundTripObservableSerializerTests.kt$RoundTripObservableSerializerTests$val subMap: Cache<Trace.InvocationId, ObservableSubscription> = Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES) .maximumSize(100) .build() - MaxLineLength:RpcBrokerConfiguration.kt$RpcBrokerConfiguration$deleteNonDurableQueue: Boolean = false MaxLineLength:RpcBrokerConfiguration.kt$RpcBrokerConfiguration$internal MaxLineLength:RpcBrokerConfiguration.kt$RpcBrokerConfiguration$journalBufferSize_AIO = maxMessageSize MaxLineLength:RpcBrokerConfiguration.kt$RpcBrokerConfiguration$journalBufferSize_NIO = maxMessageSize - MaxLineLength:RpcBrokerConfiguration.kt$RpcBrokerConfiguration$private MaxLineLength:RpcBrokerConfiguration.kt$RpcBrokerConfiguration$return Role(name, send, consume, createDurableQueue, deleteDurableQueue, createNonDurableQueue, deleteNonDurableQueue, manage, browse, createDurableQueue || createNonDurableQueue, deleteDurableQueue || deleteNonDurableQueue) - MaxLineLength:RpcBrokerConfiguration.kt$RpcBrokerConfiguration$securityRoles[RPCApi.RPC_SERVER_QUEUE_NAME] = setOf(nodeInternalRole, restrictedRole(BrokerJaasLoginModule.RPC_ROLE, send = true)) - MaxLineLength:RpcBrokerConfiguration.kt$RpcBrokerConfiguration$val addRPCRoleToUsers = if (shouldStartLocalShell) listOf(ArtemisMessagingComponent.INTERNAL_SHELL_USER) else emptyList() - MaxLineLength:RpcBrokerConfiguration.kt$RpcBrokerConfiguration$val nodeInternalRole = Role(BrokerJaasLoginModule.NODE_RPC_ROLE, true, true, true, true, true, true, true, true, true, true) - MaxLineLength:RpcClientCordaFutureSerializer.kt$RpcClientCordaFutureSerializer$throw NotSerializableException("Failed to deserialize Future from proxy Observable - ${e.message}\n").apply { initCause(e.cause) } - MaxLineLength:RpcClientObservableDeSerializer.kt$RpcClientObservableDeSerializer : Implements - MaxLineLength:RpcClientObservableDeSerializer.kt$RpcClientObservableDeSerializer$private - MaxLineLength:RpcClientObservableDeSerializer.kt$RpcClientObservableDeSerializer$val observableId: Trace.InvocationId = Trace.InvocationId((obj[0] as String), Instant.ofEpochMilli((obj[1] as Long))) - MaxLineLength:RpcExceptionHandlingTest.kt$RpcExceptionHandlingTest$assertEquals((exception.cause as CordaRuntimeException).originalExceptionClassName, SQLException::class.qualifiedName) MaxLineLength:RpcExceptionHandlingTest.kt$RpcExceptionHandlingTest$assertThatThrownBy { devModeNode.throwExceptionFromFlow() } - MaxLineLength:RpcExceptionHandlingTest.kt$RpcExceptionHandlingTest$assertThatThrownBy { node.throwExceptionFromFlow() } MaxLineLength:RpcExceptionHandlingTest.kt$RpcExceptionHandlingTest$assertThatThrownBy { scenario(ALICE_NAME, BOB_NAME,true) } - MaxLineLength:RpcExceptions.kt$DuplicateAttachmentException : FileAlreadyExistsExceptionClientRelevantError - MaxLineLength:RpcExceptions.kt$InternalNodeException : CordaRuntimeExceptionClientRelevantErrorIdentifiableException - MaxLineLength:RpcExceptions.kt$NonRpcFlowException : IllegalArgumentExceptionClientRelevantError - MaxLineLength:RpcExceptions.kt$OutdatedNetworkParameterHashException : CordaRuntimeExceptionClientRelevantError MaxLineLength:RpcExceptions.kt$OutdatedNetworkParameterHashException.Companion$private const val TEMPLATE = "Refused to accept parameters with hash %s because network map advertises update with hash %s. Please check newest version" - MaxLineLength:RpcFlowsDrainingModeTest.kt$RpcFlowsDrainingModeTest$driver - MaxLineLength:RpcHelpers.kt$return Observable.interval(interval, unit).map { isWaitingForShutdown() }.takeFirst { waiting -> waiting == false }.map { Unit } - MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests - MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$assertThat(stateMachineEvents.count { it is StateMachineUpdate.Added }).isGreaterThanOrEqualTo(NUMBER_OF_FLOWS_TO_RUN / 3) - MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$assertThat(stateMachineEvents.count { it is StateMachineUpdate.Removed }).isGreaterThanOrEqualTo(NUMBER_OF_FLOWS_TO_RUN / 3) - MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$assertTrue(missingProgressEvents.isEmpty(), "The flow progress tracker is missing events: $missingProgressEvents") MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$bankAReconnectingRpc .vaultQueryByWithPagingSpec(Cash.State::class.java, QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.CONSUMED), PageSpecification(1, 10000)) - MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$driver MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$fun startBankA(address: NetworkHostAndPort) MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$fun startProxy(addressPair: AddressPair) - MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$log.info("Timed out waiting for confirmation that all flows have started. Remaining flows: ${flowsCountdownLatch.count}") - MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$log.info("vault update produced ${update.produced.map { it.state.data.amount }} consumed ${update.consumed.map { it.ref }}") - MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$val bankAReconnectingRpc = client.start(demoUser.username, demoUser.password, gracefulReconnect = true).proxy as ReconnectingCordaRPCOps + MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$numReconnects++ // We only expect to see a single reconnectOnError in the stack trace. Otherwise we're in danger of stack overflow recursion maxStackOccurrences.set(max(maxStackOccurrences.get(), currentStackTrace().count { it.methodName == "reconnectOnError" })) Unit + MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$val bankAReconnectingRpc = client.start(demoUser.username, demoUser.password, gracefulReconnect = reconnect).proxy as ReconnectingCordaRPCOps MaxLineLength:RpcReconnectTests.kt$RpcReconnectTests$val criteria = QueryCriteria.VaultCustomQueryCriteria(builder { CashSchemaV1.PersistentCashState::pennies.equal(amount.toLong() * 100) }, status = Vault.StateStatus.ALL) - MaxLineLength:RpcServerObservableSerializer.kt$RpcServerObservableSerializer.<no name provided>$observableContext.clientAddressToObservables - MaxLineLength:RpcServerObservableSerializerTests.kt$RpcServerObservableSerializerTests$val subMap: Cache<Trace.InvocationId, ObservableSubscription> = Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES) .maximumSize(100) .build() - MaxLineLength:RpcSslTest.kt$RpcSslTest$val connection = CordaRPCClient(node.rpcAddress, sslConfiguration = clientSslOptions).start(user.username, user.password) - MaxLineLength:RpcSslTest.kt$RpcSslTest$val connection2 = CordaRPCClient(node.rpcAddress, sslConfiguration = clientSslOptions).start(user.username, "wrong") - MaxLineLength:RpcSslTest.kt$RpcSslTest$val node = startNode(rpcUsers = listOf(user), customOverrides = brokerSslOptions.useSslRpcOverrides()).getOrThrow() - MaxLineLength:SSLHelper.kt$// As per Javadoc in: https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/KeyManagerFactory.html `init` method // 2nd parameter `password` - the password for recovering keys in the KeyStore fun KeyManagerFactory.init(keyStore: CertificateStore) - MaxLineLength:SSLHelper.kt$LoggingTrustManagerWrapper$AuthorityKeyIdentifier.getInstance(bcCert.getExtension(Extension.authorityKeyIdentifier).parsedValue).keyIdentifier.toHex() - MaxLineLength:SSLHelper.kt$LoggingTrustManagerWrapper$SubjectKeyIdentifier.getInstance(bcCert.getExtension(Extension.subjectKeyIdentifier).parsedValue).keyIdentifier.toHex() - MaxLineLength:SSLHelper.kt$internal - MaxLineLength:SSLHelper.kt$private const val DEFAULT_SSL_TIMEOUT = 20000 // Aligned with sun.security.provider.certpath.URICertStore.DEFAULT_CRL_CONNECT_TIMEOUT - MaxLineLength:SSLHelper.kt$sslHandler.handshakeTimeoutMillis = Integer.getInteger(SSL_HANDSHAKE_TIMEOUT_PROP_NAME, DEFAULT_SSL_TIMEOUT).toLong() MaxLineLength:SSLHelper.kt$val trustManagers = trustManagerFactory.trustManagers.filterIsInstance(X509ExtendedTrustManager::class.java).map { LoggingTrustManagerWrapper(it) }.toTypedArray() - MaxLineLength:SSLHelper.kt${ val secureHash = SecureHash.sha256(x500Name.toString()) // RFC 1035 specifies a limit 255 bytes for hostnames with each label being 63 bytes or less. Due to this, the string // representation of the SHA256 hash is truncated to 32 characters. return String.format(HOSTNAME_FORMAT, secureHash.toString().take(32).toLowerCase()) } - MaxLineLength:SSLHelperTest.kt$SSLHelperTest$assertEquals("$legalNameHash.corda.net", (sslHandler.engine().sslParameters.serverNames.first() as SNIHostName).asciiName) - MaxLineLength:SSLHelperTest.kt$SSLHelperTest$keyManagerFactory.init(CertificateStore.fromFile(keyStore.path, keyStore.storePassword, keyStore.entryPassword, false)) MaxLineLength:SSLHelperTest.kt$SSLHelperTest$trustManagerFactory.init(initialiseTrustStoreAndEnableCrlChecking(CertificateStore.fromFile(trustStore.path, trustStore.storePassword, trustStore.entryPassword, false), false)) MaxLineLength:SSLHelperTest.kt$SSLHelperTest$val sslHandler = createClientSslHelper(NetworkHostAndPort("localhost", 1234), setOf(legalName), keyManagerFactory, trustManagerFactory) MaxLineLength:SampleCashSchemaV1.kt$SampleCashSchemaV1 : MappedSchema MaxLineLength:SampleCashSchemaV1.kt$SampleCashSchemaV1.PersistentCashState$@Table(name = "contract_cash_states_v1", indexes = [Index(name = "ccy_code_idx1", columnList = "ccy_code"), Index(name = "pennies_idx1", columnList = "pennies")]) MaxLineLength:SampleCashSchemaV2.kt$SampleCashSchemaV2.PersistentCashState$@CollectionTable(name = "cash_states_v2_participants", joinColumns = [JoinColumn(name = "output_index", referencedColumnName = "output_index"), JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id")]) MaxLineLength:ScheduledActivityObserver.kt$ScheduledActivityObserver - MaxLineLength:ScheduledActivityObserver.kt$ScheduledActivityObserver$val scheduledAt = sandbox { producedState.nextScheduledActivity(produced.ref, FlowLogicRefFactory)?.scheduledAt } ?: return - MaxLineLength:ScheduledActivityObserver.kt$ScheduledActivityObserver.Companion$@JvmStatic fun install(vaultService: VaultService, schedulerService: SchedulerService, flowLogicRefFactory: FlowLogicRefFactory) - MaxLineLength:ScheduledActivityObserver.kt$ScheduledActivityObserver.Companion$consumed.forEach { if (it.state.data is SchedulableState) schedulerService.unscheduleStateActivity(it.ref) } - MaxLineLength:ScheduledFlowIntegrationTests.kt$ScheduledFlowIntegrationTests$cordappsForAllNodes = listOf(DUMMY_CONTRACTS_CORDAPP, cordappWithPackages("net.corda.testMessage"), enclosedCordapp()) MaxLineLength:ScheduledFlowIntegrationTests.kt$ScheduledFlowIntegrationTests$val (alice, bob) = listOf(ALICE_NAME, BOB_NAME).map { startNode(providedName = it, rpcUsers = listOf(rpcUser)) }.transpose().getOrThrow() MaxLineLength:ScheduledFlowIntegrationTests.kt$ScheduledFlowIntegrationTests$val N = 23 val rpcUser = User("admin", "admin", setOf("ALL")) val (alice, bob) = listOf(ALICE_NAME, BOB_NAME).map { startNode(providedName = it, rpcUsers = listOf(rpcUser)) }.transpose().getOrThrow() val aliceClient = CordaRPCClient(alice.rpcAddress).start(rpcUser.username, rpcUser.password) val bobClient = CordaRPCClient(bob.rpcAddress).start(rpcUser.username, rpcUser.password) val scheduledFor = Instant.now().plusSeconds(10) val initialiseFutures = mutableListOf<CordaFuture<*>>() for (i in 0 until N) { initialiseFutures.add(aliceClient.proxy.startFlow( ::InsertInitialStateFlow, bob.nodeInfo.legalIdentities.first(), defaultNotaryIdentity, i, scheduledFor ).returnValue) initialiseFutures.add(bobClient.proxy.startFlow( ::InsertInitialStateFlow, alice.nodeInfo.legalIdentities.first(), defaultNotaryIdentity, i + 100, scheduledFor ).returnValue) } initialiseFutures.getOrThrowAll() val spendAttemptFutures = mutableListOf<CordaFuture<*>>() for (i in (0 until N).reversed()) { spendAttemptFutures.add(aliceClient.proxy.startFlow(::AnotherFlow, (i).toString()).returnValue) spendAttemptFutures.add(bobClient.proxy.startFlow(::AnotherFlow, (i + 100).toString()).returnValue) } spendAttemptFutures.getOrThrowAll() // TODO: the queries below are not atomic so we need to allow enough time for the scheduler to finish. Would be better to query scheduler. Thread.sleep(20.seconds.toMillis()) val aliceStates = aliceClient.proxy.vaultQuery(ScheduledState::class.java).states.filter { it.state.data.processed } val aliceSpentStates = aliceClient.proxy.vaultQuery(SpentState::class.java).states val bobStates = bobClient.proxy.vaultQuery(ScheduledState::class.java).states.filter { it.state.data.processed } val bobSpentStates = bobClient.proxy.vaultQuery(SpentState::class.java).states assertEquals(aliceStates.count() + aliceSpentStates.count(), N * 2) assertEquals(bobStates.count() + bobSpentStates.count(), N * 2) assertEquals(aliceSpentStates.count(), bobSpentStates.count()) - MaxLineLength:ScheduledFlowIntegrationTests.kt$ScheduledFlowIntegrationTests$val aliceStates = aliceClient.proxy.vaultQuery(ScheduledState::class.java).states.filter { it.state.data.processed } - MaxLineLength:ScheduledFlowIntegrationTests.kt$ScheduledFlowIntegrationTests$val bobStates = bobClient.proxy.vaultQuery(ScheduledState::class.java).states.filter { it.state.data.processed } MaxLineLength:ScheduledFlowIntegrationTests.kt$ScheduledFlowIntegrationTests.AnotherFlow$val results = serviceHub.vaultService.queryBy<ScheduledState>(QueryCriteria.LinearStateQueryCriteria(externalId = ImmutableList.of(identity))) - MaxLineLength:ScheduledFlowTests.kt$ScheduledFlowTests$mockNet = InternalMockNetwork(cordappsForAllNodes = listOf(DUMMY_CONTRACTS_CORDAPP, enclosedCordapp()), threadPerNode = true) - MaxLineLength:ScheduledFlowTests.kt$ScheduledFlowTests.Companion$val SORTING = Sort(listOf(Sort.SortColumn(SortAttribute.Standard(Sort.CommonStateAttribute.STATE_REF_TXN_ID), Sort.Direction.DESC))) - MaxLineLength:ScheduledFlowTests.kt$ScheduledFlowTests.ScheduledState$override - MaxLineLength:ScheduledFlowTests.kt$ScheduledFlowTests.ScheduledState$override val linearId: UniqueIdentifier = UniqueIdentifier() - MaxLineLength:ScheduledFlowsDrainingModeTest.kt$ScheduledFlowsDrainingModeTest.ScheduledState$override - MaxLineLength:ScheduledFlowsDrainingModeTest.kt$ScheduledFlowsDrainingModeTest.ScheduledState$override val linearId: UniqueIdentifier = UniqueIdentifier() - MaxLineLength:ScheduledState.kt$ScheduledState$override MaxLineLength:ScheduledState.kt$ScheduledState$override val linearId: UniqueIdentifier = UniqueIdentifier(externalId = identity) - MaxLineLength:Schema.kt$ClassSchema$superclass: Schema? = null MaxLineLength:Schema.kt$CompositeType.Companion$return CompositeType(list[0] as String, list[1] as? String, uncheckedCast(list[2]), list[3] as Descriptor, uncheckedCast(list[4])) - MaxLineLength:Schema.kt$CompositeType.Companion$return newInstance(listOf(list[0], list[1], list[2], Descriptor.get(list[3]!!), (list[4] as List<*>).map { Field.get(it!!) })) MaxLineLength:Schema.kt$Field.Companion$return Field(list[0] as String, list[1] as String, uncheckedCast(list[2]), list[3] as? String, list[4] as? String, list[5] as Boolean, list[6] as Boolean) MaxLineLength:Schema.kt$RestrictedType.Companion$return RestrictedType(list[0] as String, list[1] as? String, uncheckedCast(list[2]), list[3] as String, list[4] as Descriptor, uncheckedCast(list[5])) MaxLineLength:Schema.kt$RestrictedType.Companion$return newInstance(listOf(list[0], list[1], list[2], list[3], Descriptor.get(list[4]!!), (list[5] as List<*>).map { Choice.get(it!!) })) MaxLineLength:Schema.kt$Schema$internal MaxLineLength:Schema.kt$Schema$return properties.asSequence().map { it.key to it.describe(configuration, serialiseValue) }.filter { it.second != null }.fold(configObject()) { config, (key, value) -> config.withValue(key, value) } - MaxLineLength:Schema.kt$Schema$throw IllegalArgumentException("More than one property was found for keys ${invalid.keys.joinToString(", ", "[", "]")}.") MaxLineLength:Schema.kt$Schema$val invalid = properties.groupBy(Configuration.Property.Definition<*>::key).mapValues { entry -> entry.value.size }.filterValues { propertiesForKey -> propertiesForKey > 1 } MaxLineLength:Schema.kt$Schema$val nestedProperties = (properties + properties.flatMap { it.schema?.properties ?: emptySet() }).asSequence().distinctBy(Configuration.Property.Definition<*>::schema) MaxLineLength:Schema.kt$Schema$val root = properties.asSequence().map { it.key to ConfigValueFactory.fromAnyRef(it.typeName) }.fold(configObject()) { config, (key, value) -> config.withValue(key, value) } - MaxLineLength:Schema.kt$fun typeDescriptorFor(typeId: TypeIdentifier): Symbol - MaxLineLength:Schema.kt$return if (obj == null || obj is DescribedType || obj is Binary || forGenericType(type).run { isPrimitive(this) || this == TopType }) { obj } else { /** * This must be a primitive [obj] that has a non-primitive [type]. * Rewrap it with the required descriptor for further deserialization. */ RedescribedType(typeDescriptorFor(type), obj) } - MaxLineLength:SchemaMigration.kt$CheckpointsException : DatabaseMigrationException - MaxLineLength:SchemaMigration.kt$CheckpointsException$"This is dangerous because the node might not be able to restore the flows correctly and could consequently fail. " MaxLineLength:SchemaMigration.kt$DatabaseIncompatibleException : DatabaseMigrationException MaxLineLength:SchemaMigration.kt$DatabaseIncompatibleException.Companion$fun errorMessageFor(reason: String): String MaxLineLength:SchemaMigration.kt$MissingMigrationException : DatabaseMigrationException MaxLineLength:SchemaMigration.kt$MissingMigrationException.Companion$fun errorMessageFor(mappedSchema: MappedSchema): String MaxLineLength:SchemaMigration.kt$OutstandingDatabaseChangesException : DatabaseMigrationException - MaxLineLength:SchemaMigration.kt$SchemaMigration MaxLineLength:SchemaMigration.kt$SchemaMigration$ private fun migrateOlderDatabaseToUseLiquibase(existingCheckpoints: Boolean): Boolean MaxLineLength:SchemaMigration.kt$SchemaMigration$(mappedSchema::class.qualifiedName == "net.corda.finance.schemas.CashSchemaV1" || mappedSchema::class.qualifiedName == "net.corda.finance.schemas.CommercialPaperSchemaV1") && mappedSchema.migrationResource == null -> null MaxLineLength:SchemaMigration.kt$SchemaMigration$(run && !check) && (unRunChanges.isNotEmpty() && existingCheckpoints!!) -> throw CheckpointsException() MaxLineLength:SchemaMigration.kt$SchemaMigration$// Collect all changelog file referenced in the included schemas. // For backward compatibility reasons, when failOnMigrationMissing=false, we don't manage CorDapps via Liquibase but use the hibernate hbm2ddl=update. val changelogList = schemas.mapNotNull { mappedSchema -> val resource = getMigrationResource(mappedSchema, classLoader) when { resource != null -> resource // Corda OS FinanceApp in v3 has no Liquibase script, so no error is raised (mappedSchema::class.qualifiedName == "net.corda.finance.schemas.CashSchemaV1" || mappedSchema::class.qualifiedName == "net.corda.finance.schemas.CommercialPaperSchemaV1") && mappedSchema.migrationResource == null -> null else -> throw MissingMigrationException(mappedSchema) } } val path = currentDirectory?.toString() if (path != null) { System.setProperty(NODE_BASE_DIR_KEY, path) // base dir for any custom change set which may need to load a file (currently AttachmentVersionNumberMigration) } System.setProperty(NODE_X500_NAME, ourName.toString()) val customResourceAccessor = CustomResourceAccessor(dynamicInclude, changelogList, classLoader) checkResourcesInClassPath(changelogList) // current version of Liquibase appears to be non-threadsafe // this is apparent when multiple in-process nodes are all running migrations simultaneously mutex.withLock { val liquibase = Liquibase(dynamicInclude, customResourceAccessor, getLiquibaseDatabase(JdbcConnection(connection))) val unRunChanges = liquibase.listUnrunChangeSets(Contexts(), LabelExpression()) when { (run && !check) && (unRunChanges.isNotEmpty() && existingCheckpoints!!) -> throw CheckpointsException() // Do not allow database migration when there are checkpoints run && !check -> liquibase.update(Contexts()) check && !run && unRunChanges.isNotEmpty() -> throw OutstandingDatabaseChangesException(unRunChanges.size) check && !run -> { } // Do nothing will be interpreted as "check succeeded" else -> throw IllegalStateException("Invalid usage.") } } MaxLineLength:SchemaMigration.kt$SchemaMigration$System.setProperty(NODE_BASE_DIR_KEY, path) - MaxLineLength:SchemaMigration.kt$SchemaMigration$check && !run && unRunChanges.isNotEmpty() -> throw OutstandingDatabaseChangesException(unRunChanges.size) MaxLineLength:SchemaMigration.kt$SchemaMigration$it.execute("SELECT COUNT(*) FROM DATABASECHANGELOG WHERE FILENAME IN ('migration/cash.changelog-init.xml','migration/commercial-paper.changelog-init.xml')") MaxLineLength:SchemaMigration.kt$SchemaMigration$private MaxLineLength:SchemaMigration.kt$SchemaMigration$throw DatabaseMigrationException("Could not find Liquibase database migration script $resource. Please ensure the jar file containing it is deployed in the cordapps directory.") - MaxLineLength:SchemaMigration.kt$SchemaMigration$val dynamicInclude = "master.changelog.json" // Virtual file name of the changelog that includes all schemas. MaxLineLength:SchemaMigration.kt$SchemaMigration$val isFinanceAppWithLiquibaseNotMigrated = isFinanceAppWithLiquibase // If Finance App is pre v4.0 then no need to migrate it so no need to check. && existingDatabase && (!hasLiquibase // Migrate as other tables. || (hasLiquibase && it.createStatement().use { noLiquibaseEntryLogForFinanceApp(it) })) // If Liquibase is already in the database check if Finance App schema log is missing. - MaxLineLength:SchemaMigration.kt$SchemaMigration$val liquibase = Liquibase(dynamicInclude, customResourceAccessor, getLiquibaseDatabase(JdbcConnection(connection))) MaxLineLength:SchemaMigration.kt$SchemaMigration$|| MaxLineLength:SchemaMigration.kt$SchemaMigration.CustomResourceAccessor$private MaxLineLength:SchemaMigration.kt$SchemaMigration.CustomResourceAccessor$val includeAllFiles = mapOf("databaseChangeLog" to changelogList.filter { it != null }.map { file -> mapOf("include" to mapOf("file" to file)) }) - MaxLineLength:SchemaTest.kt$SchemaTest$assertThat(descriptionObj.getAnyRef("prop3.prop5")).isEqualTo(Configuration.Property.Definition.SENSITIVE_DATA_PLACEHOLDER) - MaxLineLength:SchemaTest.kt$SchemaTest$assertThat(obj.toConfig().getString("prop5")).isEqualTo(Configuration.Property.Definition.SENSITIVE_DATA_PLACEHOLDER) MaxLineLength:SchemaTest.kt$SchemaTest$val barConfigSchema = Configuration.Schema.withProperties { setOf(string(prop1), long(prop2), nestedObject("prop3", fooConfigSchema)) } MaxLineLength:SchemaTest.kt$SchemaTest$val barConfigSchema = Configuration.Schema.withProperties(name = "Bar") { setOf(string(prop1), long(prop2), nestedObject("prop3", fooConfigSchema)) } MaxLineLength:SchemaTest.kt$SchemaTest$val barConfigSchema = Configuration.Schema.withProperties(name = "Bar") { setOf(string(prop1), long(prop2), nestedObject("prop3", fooConfigSchema).list()) } - MaxLineLength:SchemaTest.kt$SchemaTest$val configuration = configObject(prop1 to prop1Value, prop2 to prop2Value, prop3 to prop3Value, "prop4" to "value4").toConfig() - MaxLineLength:SchemaTest.kt$SchemaTest$val fooConfigSchema = Configuration.Schema.withProperties(name = "Foo") { setOf(boolean("prop4"), double("prop5")) } MaxLineLength:SchemaTest.kt$SchemaTest$val fooConfigSchema = Configuration.Schema.withProperties(name = "Foo") { setOf(boolean("prop4"), string("prop5", sensitive = true)) } MaxLineLength:SchemaTest.kt$SchemaTest$val prop3Value = ConfigValueFactory.fromIterable(listOf(configObject(prop4 to prop4Value, prop5 to prop5Value), configObject(prop4 to prop4Value, prop5 to prop5Value))) - MaxLineLength:SchemaTest.kt$SchemaTest$val strictErrors = barConfigSchema.validate(configuration, Configuration.Validation.Options(strict = true)).errors - MaxLineLength:SearchField.kt$SearchField<T> : UIComponent - MaxLineLength:SecureArtemisConfiguration.kt$SecureArtemisConfiguration${ // Artemis allows multiple servers to be grouped together into a cluster for load balancing purposes. The cluster // user is used for connecting the nodes together. It has super-user privileges and so it's imperative that its // password be changed from the default (as warned in the docs). Since we don't need this feature we turn it off // by having its password be an unknown securely random 128-bit value. clusterPassword = BigInteger(128, newSecureRandom()).toString(16) } MaxLineLength:SecureHash.kt$SecureHash.Companion$ @JvmStatic fun parse(str: String?): SHA256 - MaxLineLength:SecureHash.kt$SecureHash.Companion$else -> throw IllegalArgumentException("Provided string is ${it.size} bytes not 32 bytes in hex: $str") MaxLineLength:SelfIssueTest.kt$diffString += "${node.propertyPath}: simulated[${node.canonicalGet(previousState.vaultsSelfIssued)}], actual[${node.canonicalGet(selfIssueVaults)}]\n" MaxLineLength:SellerFlow.kt$SellerFlow$serviceHub.vaultService.queryBy(CommercialPaper.State::class.java) .states - MaxLineLength:SellerFlow.kt$SellerFlow.Companion$SELF_ISSUING : Step MaxLineLength:SendTransactionFlow.kt$DataVendingFlow$@Suspendable protected open - MaxLineLength:SendTransactionFlow.kt$DataVendingFlow$getInputTransactions(serviceHub.validatedTransactions.getTransaction(stateAndRef.ref.txhash)!!) + stateAndRef.ref.txhash - MaxLineLength:SendTransactionFlow.kt$DataVendingFlow$is NotarisationPayload -> TransactionAuthorisationFilter().addAuthorised(getInputTransactions(payload.signedTransaction)) MaxLineLength:SendTransactionFlow.kt$DataVendingFlow${ // The first payload will be the transaction data, subsequent payload will be the transaction/attachment/network parameters data. var payload = payload // Depending on who called this flow, the type of the initial payload is different. // The authorisation logic is to maintain a dynamic list of transactions that the caller is authorised to make based on the transactions that were made already. // Each time an authorised transaction is requested, the input transactions are added to the list. // Once a transaction has been requested, it will be removed from the authorised list. This means that it is a protocol violation to request a transaction twice. val authorisedTransactions = when (payload) { is NotarisationPayload -> TransactionAuthorisationFilter().addAuthorised(getInputTransactions(payload.signedTransaction)) is SignedTransaction -> TransactionAuthorisationFilter().addAuthorised(getInputTransactions(payload)) is RetrieveAnyTransactionPayload -> TransactionAuthorisationFilter(acceptAll = true) is List<*> -> TransactionAuthorisationFilter().addAuthorised(payload.flatMap { stateAndRef -> if (stateAndRef is StateAndRef<*>) { getInputTransactions(serviceHub.validatedTransactions.getTransaction(stateAndRef.ref.txhash)!!) + stateAndRef.ref.txhash } else { throw Exception("Unknown payload type: ${stateAndRef!!::class.java} ?") } }.toSet()) else -> throw Exception("Unknown payload type: ${payload::class.java} ?") } // This loop will receive [FetchDataFlow.Request] continuously until the `otherSideSession` has all the data they need // to resolve the transaction, a [FetchDataFlow.EndRequest] will be sent from the `otherSideSession` to indicate end of // data request. while (true) { val dataRequest = sendPayloadAndReceiveDataRequest(otherSideSession, payload).unwrap { request -> when (request) { is FetchDataFlow.Request.Data -> { // Security TODO: Check for abnormally large or malformed data requests verifyDataRequest(request) request } FetchDataFlow.Request.End -> return null } } payload = when (dataRequest.dataType) { FetchDataFlow.DataType.TRANSACTION -> dataRequest.hashes.map { txId -> if (!authorisedTransactions.isAuthorised(txId)) { throw FetchDataFlow.IllegalTransactionRequest(txId) } val tx = serviceHub.validatedTransactions.getTransaction(txId) ?: throw FetchDataFlow.HashNotFound(txId) authorisedTransactions.removeAuthorised(tx.id) authorisedTransactions.addAuthorised(getInputTransactions(tx)) tx } FetchDataFlow.DataType.ATTACHMENT -> dataRequest.hashes.map { serviceHub.attachments.openAttachment(it)?.open()?.readFully() ?: throw FetchDataFlow.HashNotFound(it) } FetchDataFlow.DataType.PARAMETERS -> dataRequest.hashes.map { (serviceHub.networkParametersService as NetworkParametersStorage).lookupSigned(it) ?: throw FetchDataFlow.MissingNetworkParameters(it) } } } } MaxLineLength:SendTransactionFlow.kt$DataVendingFlow.TransactionAuthorisationFilter$private - MaxLineLength:SendTransactionFlow.kt$SendStateAndRefFlow : DataVendingFlow MaxLineLength:SendTransactionFlow.kt$SendStateAndRefFlow$open - MaxLineLength:SendTransactionFlow.kt$SendTransactionFlow : DataVendingFlow MaxLineLength:SerDeserCarpentryTest.kt$SerDeserCarpentryTest$val data = readTestResource().deserialize<AInterface>(context = SerializationFactory.defaultFactory.defaultContext.withLenientCarpenter()) - MaxLineLength:SerializationAPI.kt$@DeleteForDJVM inline - MaxLineLength:SerializationAPI.kt$SerializationContext$ fun withPreferredSerializationVersion(magic: SerializationMagic): SerializationContext - MaxLineLength:SerializationAPI.kt$SerializationContext$/** * A whitelist that determines (mostly for security purposes) whether a particular encoding may be used when deserializing. */ val encodingWhitelist: EncodingWhitelist - MaxLineLength:SerializationAPI.kt$SerializationContext$/** * If true the carpenter will happily synthesis classes that implement interfaces containing methods that are not * getters for any AMQP fields. Invoking these methods will throw an [AbstractMethodError]. If false then an exception * will be thrown during deserialization instead. * * The default is false. */ val lenientCarpenterEnabled: Boolean - MaxLineLength:SerializationAPI.kt$SerializationContext$/** * If true the serialization evolver will fail if the binary to be deserialized contains more fields then the current object from * the classpath. * * The default is false. */ val preventDataLoss: Boolean - MaxLineLength:SerializationAPI.kt$SerializationFactory$ abstract fun <T : Any> serialize(obj: T, context: SerializationContext): SerializedBytes<T> - MaxLineLength:SerializationAPI.kt$SerializationFactory$ fun <T> asCurrent(block: SerializationFactory.() -> T): T - MaxLineLength:SerializationAPI.kt$SerializationFactory$/** * A context to use as a default if you do not require a specially configured context. It will be the current context * if the use is somehow nested (see [currentContext]). */ val defaultContext: SerializationContext get() = currentContext ?: effectiveSerializationEnv.p2pContext - MaxLineLength:SerializationAPI.kt$SerializationFactory$/** * If there is a need to nest serialization/deserialization with a modified context during serialization or deserialization, * this will return the current context used to start serialization/deserialization. */ val currentContext: SerializationContext? get() = _currentContext.get() MaxLineLength:SerializationAPI.kt$SerializationFactory$abstract - MaxLineLength:SerializationAPI.kt$SerializationFactory.Companion$/** * A default factory for serialization/deserialization, taking into account the [currentFactory] if set. */ val defaultFactory: SerializationFactory get() = currentFactory ?: effectiveSerializationEnv.serializationFactory - MaxLineLength:SerializationAPI.kt$SerializationFactory.Companion$/** * If there is a need to nest serialization/deserialization with a modified context during serialization or deserialization, * this will return the current factory used to start serialization/deserialization. */ val currentFactory: SerializationFactory? get() = _currentFactory.get() MaxLineLength:SerializationAPI.kt$context: SerializationContext = serializationFactory.defaultContext MaxLineLength:SerializationAPI.kt$inline - MaxLineLength:SerializationAnnotations.kt$CordaSerializable - MaxLineLength:SerializationCompatibilityTests.kt$SerializationCompatibilityTests$assertThat(factory.get(Exception::class.java).typeDescriptor.toString()).isEqualTo("net.corda:ApZ2a/36VVskaoDZMbiZ8A==") MaxLineLength:SerializationEnvironment.kt$"Expected exactly 1 of {${serializationEnvFields.joinToString(", ") { it.name }}} but got: {${it.joinToString(", ") { it.first }}}" - MaxLineLength:SerializationEnvironment.kt$(e.className == "java.util.concurrent.ForkJoinPool\$DefaultForkJoinWorkerThreadFactory" && e.methodName == "newThread") MaxLineLength:SerializationEnvironment.kt$private val serializationEnvFields = listOf(_nodeSerializationEnv, _driverSerializationEnv, _contextSerializationEnv, _inheritableContextSerializationEnv) MaxLineLength:SerializationEnvironment.kt$val _inheritableContextSerializationEnv = InheritableThreadLocalToggleField<SerializationEnvironment>("inheritableContextSerializationEnv") { stack -> stack.fold(false) { isAGlobalThreadBeingCreated, e -> isAGlobalThreadBeingCreated || (e.className == "io.netty.util.concurrent.GlobalEventExecutor" && e.methodName == "startThread") || (e.className == "java.util.concurrent.ForkJoinPool\$DefaultForkJoinWorkerThreadFactory" && e.methodName == "newThread") } } - MaxLineLength:SerializationEnvironmentRule.kt$SerializationEnvironmentRule.Companion$Executors.newCachedThreadPool(testThreadFactory(true)) // Close enough to what InVMConnector makes normally. - MaxLineLength:SerializationEnvironmentRule.kt$SerializationEnvironmentRule.Companion$InVMConnector::class.staticField<ExecutorService>("threadPoolExecutor").value - MaxLineLength:SerializationFactory.kt$SerializationFactory$ abstract fun <T : Any> serialize(obj: T, context: SerializationContext): SerializedBytes<T> - MaxLineLength:SerializationFactory.kt$SerializationFactory$ fun <T> asCurrent(block: SerializationFactory.() -> T): T - MaxLineLength:SerializationFactory.kt$SerializationFactory$/** * A context to use as a default if you do not require a specially configured context. It will be the current context * if the use is somehow nested (see [currentContext]). */ val defaultContext: SerializationContext get() = currentContext ?: effectiveSerializationEnv.p2pContext - MaxLineLength:SerializationFactory.kt$SerializationFactory$/** * If there is a need to nest serialization/deserialization with a modified context during serialization or deserialization, * this will return the current context used to start serialization/deserialization. */ val currentContext: SerializationContext? get() = _currentContext MaxLineLength:SerializationFactory.kt$SerializationFactory$abstract - MaxLineLength:SerializationFactory.kt$SerializationFactory.Companion$/** * A default factory for serialization/deserialization, taking into account the [currentFactory] if set. */ val defaultFactory: SerializationFactory get() = currentFactory ?: effectiveSerializationEnv.serializationFactory - MaxLineLength:SerializationFactory.kt$SerializationFactory.Companion$/** * If there is a need to nest serialization/deserialization with a modified context during serialization or deserialization, * this will return the current factory used to start serialization/deserialization. */ val currentFactory: SerializationFactory? get() = _currentFactory - MaxLineLength:SerializationFormat.kt$FlushAverseOutputStream : OutputStream - MaxLineLength:SerializationFormat.kt$SectionId$DATA_AND_STOP - MaxLineLength:SerializationFormat.kt$SectionId$ENCODING - MaxLineLength:SerializationHelper.kt$CommonPropertyNames - MaxLineLength:SerializationOutput.kt$SerializationOutput$ @Throws(NotSerializableException::class) fun <T : Any> serialize(obj: T, context: SerializationContext): SerializedBytes<T> - MaxLineLength:SerializationOutput.kt$SerializationOutput$writeObject(obj, data, if (type == TypeIdentifier.UnknownType.getLocalType()) obj.javaClass else type, context, debugIndent) - MaxLineLength:SerializationOutput.kt$SerializationOutput${ serializer.writeObject(obj, data, type, this, context, debugIndent) // Important to do it after serialization such that dependent object will have preceding reference numbers // assigned to them first as they will be first read from the stream on receiving end. // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content if (suitableForObjectReference(obj.javaClass)) { objectHistory[obj] = objectHistory.size } } MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests$assertArrayEquals(data, DeserializationInput(factory).deserialize(compressed, testSerializationContext.withEncodingWhitelist(encodingWhitelist))) MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests$assertThat(des.deserialize(OpaqueBytes(copy), NonZeroByte::class.java, testSerializationContext.withEncodingWhitelist(encodingWhitelist)).value).isEqualTo(3) - MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests$catchThrowable { input.deserialize(compressed, testSerializationContext.withEncodingWhitelist(encodingWhitelist)) } - MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests$des.deserialize(OpaqueBytes(copy), NonZeroByte::class.java, testSerializationContext.withEncodingWhitelist(encodingWhitelist)) MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests$private MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests$return SerializationFactory.defaultFactory.asCurrent { withCurrentContext(newContext) { serdes(t, factory, factory2, expectedEqual) } } - MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests$t.suppressed.zip(desThrowable.suppressed).forEach { (before, after) -> assertSerializedThrowableEquivalent(before, after) } MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests$val crlHolder = builder.build(ContentSignerBuilder.build(Crypto.RSA_SHA256, Crypto.generateKeyPair(Crypto.RSA_SHA256).private, provider)) - MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests$val desObj2 = des2.deserialize(ser2.serialize(obj, compression), testSerializationContext.withEncodingWhitelist(encodingWhitelist)) - MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests$val newContext = SerializationFactory.defaultFactory.defaultContext.withProperty(CommonPropertyNames.IncludeInternalInfo, true) - MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests$val obj = WrapFooListArray(arrayOf(listOf(Foo("Fred", 1), Foo("Ginger", 2)), listOf(Foo("Rogers", 3), Foo("Hammerstein", 4)))) - MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests${ val ser = SerializationOutput(SerializerFactoryBuilder.build(AllWhitelist, ClassCarpenterImpl(AllWhitelist, ClassLoader.getSystemClassLoader()) )) val obj = ByteArray(20000) val uncompressedSize = ser.serialize(obj).bytes.size val compressedSize = ser.serialize(obj, CordaSerializationEncoding.SNAPPY).bytes.size // Ordinarily this might be considered high maintenance, but we promised wire compatibility, so they'd better not change! assertEquals(20059, uncompressedSize) assertEquals(1018, compressedSize) } MaxLineLength:SerializationOutputTests.kt$SerializationOutputTests.GenericSubclass$override fun equals(other: Any?): Boolean - MaxLineLength:SerializationScheme.kt$SerializationContextImpl$@KeepForDJVM data - MaxLineLength:SerializationScheme.kt$SerializationContextImpl$override - MaxLineLength:SerializationScheme.kt$SerializationContextImpl$override fun withEncodingWhitelist(encodingWhitelist: EncodingWhitelist) - MaxLineLength:SerializationScheme.kt$SerializationContextImpl$override fun withPreferredSerializationVersion(magic: SerializationMagic) MaxLineLength:SerializationScheme.kt$SerializationContextImpl$override val customSerializers: Set<SerializationCustomSerializer<*, *>> = emptySet() - MaxLineLength:SerializationScheme.kt$SerializationContextImpl$override val encodingWhitelist: EncodingWhitelist = NullEncodingWhitelist MaxLineLength:SerializationScheme.kt$SerializationFactoryImpl$@Throws(NotSerializableException::class) override MaxLineLength:SerializationScheme.kt$SerializationFactoryImpl$private - MaxLineLength:SerializationScheme.kt$SerializationFactoryImpl$private val registeredSchemes: MutableCollection<SerializationScheme> = Collections.synchronizedCollection(mutableListOf()) - MaxLineLength:SerializationScheme.kt$SerializationFactoryImpl$private val schemes: MutableMap<Pair<CordaSerializationMagic, SerializationContext.UseCase>, SerializationScheme> - MaxLineLength:SerializationScheme.kt$SerializationFactoryImpl$registeredSchemes.filter { it.canDeserializeVersion(magic, target) }.forEach { return@computeIfAbsent it } MaxLineLength:SerializationScheme.kt$SerializationFactoryImpl$return asCurrent { withCurrentContext(context) { schemeFor(byteSequence, context.useCase).first.deserialize(byteSequence, clazz, context) } } MaxLineLength:SerializationScheme.kt$SerializationFactoryImpl$return asCurrent { withCurrentContext(context) { schemeFor(context.preferredSerializationVersion, context.useCase).first.serialize(obj, context) } } MaxLineLength:SerializationToken.kt$SingletonSerializationToken$fun registerWithContext(context: SerializeAsTokenContext, toBeTokenized: SerializeAsToken) - MaxLineLength:SerializationToken.kt$SingletonSerializationToken.Companion$fun <T : SerializeAsToken> singletonSerializationToken(toBeTokenized: Class<T>) - MaxLineLength:SerializationToken.kt$SingletonSerializeAsToken : SerializeAsToken - MaxLineLength:SerializationTokenTest.kt$SerializationTokenTest$context = testCheckpointSerialization.checkpointSerializationContext.withWhitelisted(SingletonSerializationToken::class.java) MaxLineLength:SerializationTokenTest.kt$SerializationTokenTest$private fun serializeAsTokenContext(toBeTokenized: Any) - MaxLineLength:SerializationTokenTest.kt$SerializationTokenTest$val serializedBytes = tokenizableBefore.toToken(serializeAsTokenContext(emptyList<Any>())).checkpointSerialize(testContext) - MaxLineLength:SerializationWhitelist.kt$SerializationWhitelist$/** * Optionally whitelist types for use in object serialization, as we lock down the types that can be serialized. * * For example, if you add a new [net.corda.core.contracts.ContractState] it needs to be whitelisted. You can do that * either by adding the [net.corda.core.serialization.CordaSerializable] annotation or via this method. */ val whitelist: List<Class<*>> MaxLineLength:SerializeAsTokenContextImpl.kt$CheckpointSerializeAsTokenContextImpl : SerializeAsTokenContext MaxLineLength:SerializeAsTokenContextImpl.kt$CheckpointSerializeAsTokenContextImpl$constructor(toBeTokenized: Any, serializer: CheckpointSerializer, context: CheckpointSerializationContext, serviceHub: ServiceHub) : this(serviceHub, { serializer.serialize(toBeTokenized, context.withTokenContext(this)) }) MaxLineLength:SerializeAsTokenContextImpl.kt$CheckpointSerializeAsTokenContextImpl$throw UnsupportedOperationException("Attempt to write token for lazy registered $className. All tokens should be registered during context construction.") - MaxLineLength:SerializeAsTokenContextImpl.kt$SerializeAsTokenContextImpl : SerializeAsTokenContext MaxLineLength:SerializeAsTokenContextImpl.kt$SerializeAsTokenContextImpl$constructor(toBeTokenized: Any, serializationFactory: SerializationFactory, context: SerializationContext, serviceHub: ServiceHub) : this(serviceHub, { serializationFactory.serialize(toBeTokenized, context.withTokenContext(this)) }) MaxLineLength:SerializeAsTokenContextImpl.kt$SerializeAsTokenContextImpl$throw UnsupportedOperationException("Attempt to write token for lazy registered $className. All tokens should be registered during context construction.") MaxLineLength:SerializeAsTokenContextImpl.kt$fun CheckpointSerializationContext.withTokenContext(serializationContext: SerializeAsTokenContext): CheckpointSerializationContext MaxLineLength:SerializeAsTokenContextImpl.kt$fun SerializationContext.withTokenContext(serializationContext: SerializeAsTokenContext): SerializationContext MaxLineLength:SerializeAsTokenSerializer.kt$SerializeAsTokenSerializer$?: - MaxLineLength:SerializerFactoryBuilder.kt$NoEvolutionSerializerFactory$override - MaxLineLength:ServiceHub.kt$ServiceHub$ fun addSignature(signedTransaction: SignedTransaction): SignedTransaction - MaxLineLength:ServiceHub.kt$ServiceHub$ fun addSignature(signedTransaction: SignedTransaction, publicKey: PublicKey): SignedTransaction - MaxLineLength:ServiceHub.kt$ServiceHub$ fun createSignature(filteredTransaction: FilteredTransaction): TransactionSignature - MaxLineLength:ServiceHub.kt$ServiceHub$ fun createSignature(filteredTransaction: FilteredTransaction, publicKey: PublicKey) - MaxLineLength:ServiceHub.kt$ServiceHub$ fun createSignature(signedTransaction: SignedTransaction, publicKey: PublicKey) - MaxLineLength:ServiceHub.kt$ServiceHub$ fun signInitialTransaction(builder: TransactionBuilder): SignedTransaction - MaxLineLength:ServiceHub.kt$ServiceHub$ fun signInitialTransaction(builder: TransactionBuilder, publicKey: PublicKey) - MaxLineLength:ServiceHub.kt$ServiceHub$/** * A network map contains lists of nodes on the network along with information about their identity keys, services * they provide and host names or IP addresses where they can be connected to. The cache wraps around a map fetched * from an authoritative service, and adds easy lookup of the data stored within it. Generally it would be initialised * with a specified network map service, which it fetches data from and then subscribes to updates of. */ val networkMapCache: NetworkMapCache MaxLineLength:ServiceHub.kt$ServiceHub$createSignature(filteredTransaction, publicKey, SignatureMetadata(myInfo.platformVersion, Crypto.findSignatureScheme(publicKey).schemeNumberID)) MaxLineLength:ServiceHub.kt$ServiceHub$createSignature(signedTransaction, publicKey, SignatureMetadata(myInfo.platformVersion, Crypto.findSignatureScheme(publicKey).schemeNumberID)) MaxLineLength:ServiceHub.kt$ServiceHub$private MaxLineLength:ServiceHub.kt$ServiceHub$signInitialTransaction(builder, publicKey, SignatureMetadata(myInfo.platformVersion, Crypto.findSignatureScheme(publicKey).schemeNumberID)) - MaxLineLength:ServiceHub.kt$ServiceHub$val stx = validatedTransactions.getTransaction(stateRef.txhash) ?: throw TransactionResolutionException(stateRef.txhash) - MaxLineLength:ServiceHub.kt$ServicesForResolution$ // TODO: future implementation to use a Vault state ref -> contract state BLOB table and perform single query bulk load // as the existing transaction store will become encrypted at some point @Throws(TransactionResolutionException::class) fun loadStates(stateRefs: Set<StateRef>): Set<StateAndRef<ContractState>> - MaxLineLength:ServiceHub.kt$StatesToRecord$ONLY_RELEVANT - MaxLineLength:ServiceHubCoreInternal.kt$ServiceHubCoreInternal : ServiceHub - MaxLineLength:ServiceHubInternal.kt$ServiceHubInternal$TopologicalSort - MaxLineLength:ServiceHubInternal.kt$ServiceHubInternal$override fun createTransactionsResolver(flow: ResolveTransactionsFlow): TransactionsResolver - MaxLineLength:ServiceHubInternal.kt$ServiceHubInternal$txs as? Collection ?: txs.toList() - MaxLineLength:ServiceHubInternal.kt$ServiceHubInternal.Companion$require(txs.isNotEmpty()) { "No transactions passed in for recording" } val orderedTxs = topologicalSort(txs) // Divide transactions into those seen before and those that are new to this node if ALL_VISIBLE states are being recorded. // This allows the node to re-record transactions that have previously only been seen at the ONLY_RELEVANT level. Note that // for transactions being recorded at ONLY_RELEVANT, if this transaction has been seen before its outputs should already // have been recorded at ONLY_RELEVANT, so there shouldn't be anything to re-record here. val (recordedTransactions, previouslySeenTxs) = if (statesToRecord != StatesToRecord.ALL_VISIBLE) { orderedTxs.filter(validatedTransactions::addTransaction) to emptyList() } else { orderedTxs.partition(validatedTransactions::addTransaction) } val stateMachineRunId = FlowStateMachineImpl.currentStateMachine()?.id if (stateMachineRunId != null) { recordedTransactions.forEach { stateMachineRecordedTransactionMapping.addMapping(stateMachineRunId, it.id) } } else { log.warn("Transactions recorded from outside of a state machine") } // When the user has requested StatesToRecord.ALL we may end up recording and relationally mapping states // that do not involve us and that we cannot sign for. This will break coin selection and thus a warning // is present in the documentation for this feature (see the "Observer nodes" tutorial on docs.corda.net). // // The reason for this is three-fold: // // 1) We are putting in place the observer mode feature relatively quickly to meet specific customer // launch target dates. // // 2) The right design for vaults which mix observations and relevant states isn't entirely clear yet. // // 3) If we get the design wrong it could create security problems and business confusions. // // Back in the bitcoinj days I did add support for "watching addresses" to the wallet code, which is the // Bitcoin equivalent of observer nodes: // // https://bitcoinj.github.io/working-with-the-wallet#watching-wallets // // The ability to have a wallet containing both irrelevant and relevant states complicated everything quite // dramatically, even methods as basic as the getBalance() API which required additional modes to let you // query "balance I can spend" vs "balance I am observing". In the end it might have been better to just // require the user to create an entirely separate wallet for observing with. // // In Corda we don't support a single node having multiple vaults (at the time of writing), and it's not // clear that's the right way to go: perhaps adding an "origin" column to the VAULT_STATES table is a better // solution. Then you could select subsets of states depending on where the report came from. // // The risk of doing this is that apps/developers may use 'canned SQL queries' not written by us that forget // to add a WHERE clause for the origin column. Those queries will seem to work most of the time until // they're run on an observer node and mix in irrelevant data. In the worst case this may result in // erroneous data being reported to the user, which could cause security problems. // // Because the primary use case for recording irrelevant states is observer/regulator nodes, who are unlikely // to make writes to the ledger very often or at all, we choose to punt this issue for the time being. vaultService.notifyAll(statesToRecord, recordedTransactions.map { it.coreTransaction }, previouslySeenTxs.map { it.coreTransaction }) MaxLineLength:ServiceHubInternal.kt$ServiceHubInternal.Companion$vaultService.notifyAll(statesToRecord, recordedTransactions.map { it.coreTransaction }, previouslySeenTxs.map { it.coreTransaction }) - MaxLineLength:ServiceHubInternal.kt$ServiceHubInternal.TopologicalSort$// Note that we use a LinkedHashSet here to make the traversal deterministic (as long as the input list is). forwardGraph.computeIfAbsent(it) { LinkedHashSet() }.add(stx) - MaxLineLength:ServiceHubInternal.kt$WritableTransactionStorage$ // TODO: Throw an exception if trying to add a transaction with fewer signatures than an existing entry. fun addTransaction(transaction: SignedTransaction): Boolean - MaxLineLength:ServiceHubInternal.kt$WritableTransactionStorage$ fun getTransactionInternal(id: SecureHash): Pair<SignedTransaction, Boolean>? MaxLineLength:ServicesForResolutionImpl.kt$ServicesForResolutionImpl$else -> throw UnsupportedOperationException("Attempting to resolve attachment for index ${stateRef.index} of a ${ctx.javaClass} transaction. This is not supported.") MaxLineLength:ServicesForResolutionImpl.kt$ServicesForResolutionImpl$if (attachment is ContractAttachment && (forContractClassName ?: transactionState.contract) in attachment.allContracts) { return attachment } - MaxLineLength:ServicesForResolutionImpl.kt$ServicesForResolutionImpl$override MaxLineLength:ServicesForResolutionImpl.kt$ServicesForResolutionImpl$return attachments.openAttachment(ctx.upgradedContractAttachmentId) ?: throw AttachmentResolutionException(stateRef.txhash) MaxLineLength:ServicesForResolutionImpl.kt$ServicesForResolutionImpl$return ctx.inputs.map { inner(it, transactionState.contract) }.firstOrNull() ?: throw AttachmentResolutionException(stateRef.txhash) - MaxLineLength:ServicesForResolutionImpl.kt$ServicesForResolutionImpl$val stx = validatedTransactions.getTransaction(stateRef.txhash) ?: throw TransactionResolutionException(stateRef.txhash) MaxLineLength:ServicesForResolutionImpl.kt$ServicesForResolutionImpl$val transactionState = SerializedStateAndRef(resolveStateRefBinaryComponent(stateRef, this)!!, stateRef).toStateAndRef().state - MaxLineLength:SessionMessage.kt$ErrorSessionMessage : ExistingSessionMessagePayload MaxLineLength:SessionRejectException.kt$SessionRejectException$NotRegistered : SessionRejectException - MaxLineLength:SessionRejectException.kt$SessionRejectException$UnknownClass : SessionRejectException - MaxLineLength:SetsSerializationTest.kt$net.corda.serialization.internal.SetsSerializationTest.kt - MaxLineLength:Settings.kt$Settings$clientPane.disableProperty() .map { if (!it) FontAwesomeIconView(FontAwesomeIcon.TIMES) else FontAwesomeIconView(FontAwesomeIcon.EDIT) } - MaxLineLength:SharedMemoryIncremental.kt$SharedMemoryIncremental$file: File = File(System.getProperty("user.home"), "corda-$startPort-to-$endPort-port-allocator.bin") - MaxLineLength:SharedMemoryIncremental.kt$SharedMemoryIncremental$mb = backingFile.channel.map(FileChannel.MapMode.READ_WRITE, 0, 16) - MaxLineLength:ShellCmdLineOptions.kt$ShellCmdLineOptions$description = ["The path to the directory containing CorDapp JARs, CorDapps are required when starting flows."] - MaxLineLength:ShellCmdLineOptions.kt$ShellCmdLineOptions$description = ["The path to the shell configuration file, used instead of providing the rest of command line options."] MaxLineLength:ShellCmdLineOptions.kt$ShellConfigurationFile.ShellConfigFile$sshHostKeyDirectory = extensions?.sshd?.let { if (it.enabled && it.hostkeypath != null) Paths.get(it.hostkeypath) else null } - MaxLineLength:ShutdownManager.kt$ShutdownManager${ isShutdown = true val result = ArrayList(registeredShutdowns) // It is important to clear `registeredShutdowns` that has been actioned upon as more than 1 driver can be created per test. // Given that `ShutdownManager` is reachable from `ApplicationShutdownHooks`, everything that was scheduled for shutdown // during 1st driver launch will not be eligible for GC during second driver launch therefore retained in memory. registeredShutdowns.clear() result } - MaxLineLength:SignableData.kt$SignableData - MaxLineLength:SignatureConstraintMigrationFromHashConstraintsTests.kt$SignatureConstraintMigrationFromHashConstraintsTests$"The AutomaticPlaceholderConstraint of the second state should become the same HashConstraint used in other state" - MaxLineLength:SignatureConstraintMigrationFromHashConstraintsTests.kt$SignatureConstraintMigrationFromHashConstraintsTests$"The constraint from the issuance transaction should be the same constraint used in the consuming transaction" MaxLineLength:SignatureConstraintMigrationFromHashConstraintsTests.kt$SignatureConstraintMigrationFromHashConstraintsTests$@Test fun `HashConstraint cannot be migrated to SignatureConstraint if a HashConstraint is specified for one state and another uses an AutomaticPlaceholderConstraint`() - MaxLineLength:SignatureConstraintMigrationFromHashConstraintsTests.kt$SignatureConstraintMigrationFromHashConstraintsTests$it.proxy.startFlow(::ConsumeMessage, result!!, defaultNotaryIdentity, false, false).returnValue.getOrThrow() - MaxLineLength:SignatureConstraintMigrationFromHashConstraintsTests.kt$SignatureConstraintMigrationFromHashConstraintsTests$val nodeHandle = startNode(NodeParameters(rpcUsers = listOf(user), additionalCordapps = listOf(oldCordapp))).getOrThrow() - MaxLineLength:SignatureConstraintMigrationFromHashConstraintsTests.kt$SignatureConstraintMigrationFromHashConstraintsTests$var result: StateAndRef<MessageState>? = CordaRPCClient(nodeHandle.rpcAddress).start(user.username, user.password).use { val page = it.proxy.vaultQuery(MessageState::class.java) page.states.singleOrNull() } MaxLineLength:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$SignatureConstraintMigrationFromWhitelistConstraintTests$"The constraint from the issuance transaction should be the same constraint used in the consuming transaction for the first state" MaxLineLength:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$SignatureConstraintMigrationFromWhitelistConstraintTests$@Test fun `auto migration from WhitelistConstraint to SignatureConstraint will only transition states that do not have a constraint specified`() - MaxLineLength:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$SignatureConstraintMigrationFromWhitelistConstraintTests$Assertions.assertThatExceptionOfType(CordaRuntimeException::class.java).isThrownBy { upgradeCorDappBetweenTransactions( cordapp = oldUnsignedCordapp, newCordapp = newCordapp, whiteListedCordapps = mapOf(TEST_MESSAGE_CONTRACT_PROGRAM_ID to emptyList()), systemProperties = emptyMap(), startNodesInProcess = true ) } .withMessageContaining("Selected output constraint: $WhitelistedByZoneAttachmentConstraint not satisfying") - MaxLineLength:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$SignatureConstraintMigrationFromWhitelistConstraintTests$Assume.assumeFalse(System.getProperty("os.name").toLowerCase().startsWith("win")) - MaxLineLength:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$SignatureConstraintMigrationFromWhitelistConstraintTests$it.proxy.startFlow(::ConsumeMessage, result!!, defaultNotaryIdentity, false, false).returnValue.getOrThrow() - MaxLineLength:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$SignatureConstraintMigrationFromWhitelistConstraintTests$val nodeHandle = startNode(NodeParameters(rpcUsers = listOf(user), additionalCordapps = listOf(oldCordapp))).getOrThrow() - MaxLineLength:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$SignatureConstraintMigrationFromWhitelistConstraintTests$var result: StateAndRef<MessageState>? = CordaRPCClient(nodeHandle.rpcAddress).start(user.username, user.password).use { val page = it.proxy.vaultQuery(MessageState::class.java) page.states.singleOrNull() } - MaxLineLength:SignatureConstraintVersioningTests.kt$SignatureConstraintVersioningTests$private - MaxLineLength:SignatureConstraintVersioningTests.kt$SignatureConstraintVersioningTests$private val baseUnsigned = cordappWithPackages(MessageState::class.packageName, DummyMessageContract::class.packageName) - MaxLineLength:SignatureConstraintVersioningTests.kt$SignatureConstraintVersioningTests$val user = User("mark", "dadada", setOf(startFlow<CreateMessage>(), startFlow<ConsumeMessage>(), invokeRpc("vaultQuery"))) - MaxLineLength:SignatureMetadata.kt$SignatureMetadata - MaxLineLength:SignatureScheme.kt$SignatureScheme MaxLineLength:SignedNodeInfo.kt$NodeInfoAndSigned$constructor(nodeInfo: NodeInfo, signer: (PublicKey, SerializedBytes<NodeInfo>) -> DigitalSignature) : this(nodeInfo, nodeInfo.sign(signer)) - MaxLineLength:SignedNodeInfoTest.kt$SignedNodeInfoTest$private MaxLineLength:SignedTransaction.kt$SignedTransaction : TransactionWithSignatures - MaxLineLength:SignedTransaction.kt$SignedTransaction$ @DeleteForDJVM fun resolveNotaryChangeTransaction(services: ServiceHub) - MaxLineLength:SignedTransaction.kt$SignedTransaction$ @DeleteForDJVM private fun verifyContractUpgradeTransaction(services: ServicesForResolution, checkSufficientSignatures: Boolean) - MaxLineLength:SignedTransaction.kt$SignedTransaction$ @DeleteForDJVM private fun verifyNotaryChangeTransaction(services: ServiceHub, checkSufficientSignatures: Boolean) - MaxLineLength:SignedTransaction.kt$SignedTransaction$ private fun copyWithCache(sigList: Iterable<TransactionSignature>): SignedTransaction MaxLineLength:SignedTransaction.kt$SignedTransaction$ |If you wish to verify this transaction, please contact the originator of the transaction and install the provided missing JAR. MaxLineLength:SignedTransaction.kt$SignedTransaction$"""Transaction $ltx is incorrectly formed. Most likely it was created during version 3 of Corda when the verification logic was more lenient. |Attempted to find local dependency for class: $missingClass, but could not find one. |If you wish to verify this transaction, please contact the originator of the transaction and install the provided missing JAR. |You can install it using the RPC command: `uploadAttachment` without restarting the node. |""" - MaxLineLength:SignedTransaction.kt$SignedTransaction$(services.transactionVerifierService as TransactionVerifierServiceInternal).verify(ltx, listOf(attachment)).getOrThrow() - MaxLineLength:SignedTransaction.kt$SignedTransaction$/** Cache the deserialized form of the transaction. This is useful when building a transaction or collecting signatures. */ @Volatile @Transient private var cachedTransaction: CoreTransaction? = null - MaxLineLength:SignedTransaction.kt$SignedTransaction$/** Returns the contained [WireTransaction], or throws if this is a notary change or contract upgrade transaction. */ val tx: WireTransaction get() = coreTransaction as WireTransaction MaxLineLength:SignedTransaction.kt$SignedTransaction$?: MaxLineLength:SignedTransaction.kt$SignedTransaction$@Throws(SignatureException::class, AttachmentResolutionException::class, TransactionResolutionException::class, TransactionVerificationException::class) MaxLineLength:SignedTransaction.kt$SignedTransaction$SignaturesMissingException : NamedByHashSignatureExceptionCordaThrowable - MaxLineLength:SignedTransaction.kt$SignedTransaction$if (e.cause is NotSerializableException && e.cause.cause is ClassNotFoundException && e.cause.cause!!.message != null) { verifyWithExtraDependency(e.cause.cause!!.message!!.replace(".", "/"), ltx, services, e) } else { throw e } - MaxLineLength:SignedTransaction.kt$SignedTransaction$is FilteredTransaction -> throw IllegalStateException("Persistence of filtered transactions is not supported.") - MaxLineLength:SignedTransaction.kt$SignedTransaction$private - MaxLineLength:SignedTransaction.kt$SignedTransaction$require(sigs.isNotEmpty()) { "Tried to instantiate a ${SignedTransaction::class.java.simpleName} without any signatures " } MaxLineLength:SignedTransaction.kt$SignedTransaction$throw TransactionVerificationException.TransactionNetworkParameterOrderingException(id, entry.value.first(), txNetworkParameters, params) - MaxLineLength:SignedTransaction.kt$SignedTransaction${ // If that transaction was created with and after Corda 4 then just fail. // The lenient dependency verification is only supported for Corda 3 transactions. // To detect if the transaction was created before Corda 4 we check if the transaction has the NetworkParameters component group. if (this.networkParametersHash != null) { throw exception } val attachment = requireNotNull(services.attachments.internalFindTrustedAttachmentForClass(missingClass)) { """Transaction $ltx is incorrectly formed. Most likely it was created during version 3 of Corda when the verification logic was more lenient. |Attempted to find local dependency for class: $missingClass, but could not find one. |If you wish to verify this transaction, please contact the originator of the transaction and install the provided missing JAR. |You can install it using the RPC command: `uploadAttachment` without restarting the node. |""".trimMargin() } log.warn("""Detected that transaction ${this.id} does not contain all cordapp dependencies. |This may be the result of a bug in a previous version of Corda. |Attempting to verify using the additional trusted dependency: $attachment for class $missingClass. |Please check with the originator that this is a valid transaction.""".trimMargin()) (services.transactionVerifierService as TransactionVerifierServiceInternal).verify(ltx, listOf(attachment)).getOrThrow() } MaxLineLength:SimmFlow.kt$SimmFlow.Receiver$ @Suspendable private fun agreeValuation(portfolio: Portfolio, asOf: LocalDate, valuer: Party): PortfolioValuation MaxLineLength:SimmFlow.kt$SimmFlow.Receiver$val PVs = OGTrades.map { it.info.id.get().value to pricer.presentValue(it.product, combinedRatesProvider).toCordaCompatible() }.toMap() - MaxLineLength:SimmFlow.kt$SimmFlow.Receiver$val calculatorTotal = RwamBimmNotProductClassesCalculator(fxRateProvider, Currency.EUR, IsdaConfiguration.INSTANCE) - MaxLineLength:SimmFlow.kt$SimmFlow.Receiver$val imBatch = analyticsEngine.calculateMarginBatch(sensBatch, combinedRatesProvider, fxRateProvider, cordaMargin) MaxLineLength:SimmFlow.kt$SimmFlow.Receiver$val margin = BimmAnalysisUtils.computeMargin(combinedRatesProvider, normalizer, calculatorTotal, sensitivities.first, sensitivities.second) MaxLineLength:SimmFlow.kt$SimmFlow.Receiver$val portfolio = serviceHub.vaultService.queryBy<IRSState>(VaultQueryCriteria(stateRefs = stateRef.state.data.portfolio)).states.toPortfolio() MaxLineLength:SimmFlow.kt$SimmFlow.Receiver$val valuer = serviceHub.identityService.wellKnownPartyFromAnonymous(stateRef.state.data.valuer) ?: throw IllegalStateException("Unknown valuer party ${stateRef.state.data.valuer}") MaxLineLength:SimmFlow.kt$SimmFlow.Requester$notary = serviceHub.networkMapCache.notaryIdentities.first() - MaxLineLength:SimmFlow.kt$SimmFlow.Requester$otherPartySession.sendAndReceive<Ack>(OfferMessage(notary, stateAndRef.state.data, existing?.ref, valuationDate)) MaxLineLength:SimmFlow.kt$SimmFlow.Requester$val PVs = OGTrades.map { it.info.id.get().value to pricer.presentValue(it.product, combinedRatesProvider).toCordaCompatible() }.toMap() - MaxLineLength:SimmFlow.kt$SimmFlow.Requester$val calculatorTotal = RwamBimmNotProductClassesCalculator(fxRateProvider, Currency.EUR, IsdaConfiguration.INSTANCE) - MaxLineLength:SimmFlow.kt$SimmFlow.Requester$val imBatch = analyticsEngine.calculateMarginBatch(sensBatch, combinedRatesProvider, fxRateProvider, cordaMargin) MaxLineLength:SimmFlow.kt$SimmFlow.Requester$val margin = BimmAnalysisUtils.computeMargin(combinedRatesProvider, normalizer, calculatorTotal, sensitivities.first, sensitivities.second) - MaxLineLength:SimmFlow.kt$SimmFlow.Requester$val portfolio = serviceHub.vaultService.queryBy<IRSState>(VaultQueryCriteria(stateRefs = state.portfolio)).states.toPortfolio() MaxLineLength:SimmFlow.kt$SimmFlow.Requester.StateRevisionFlowRequester$private MaxLineLength:SimmRevaluation.kt$SimmRevaluation.Initiator$val stateAndRef = serviceHub.vaultService.queryBy<PortfolioState>(VaultQueryCriteria(stateRefs = listOf(curStateRef))).states.single() MaxLineLength:SimmValuationTest.kt$SimmValuationTest$cordappsForAllNodes = listOf(findCordapp("net.corda.vega.flows"), findCordapp("net.corda.vega.contracts"), findCordapp("net.corda.confidential")) + FINANCE_CORDAPPS - MaxLineLength:SimmValuationTest.kt$SimmValuationTest$partyApi.postJson("${counterparty.id}/portfolio/valuations/calculate", PortfolioApi.ValuationCreationParams(valuationDate)) MaxLineLength:SimmValuationTest.kt$SimmValuationTest$startNodesInProcess = false - MaxLineLength:SimmValuationTest.kt$SimmValuationTest$val logConfigFile = projectRootDir / "samples" / "simm-valuation-demo" / "src" / "main" / "resources" / "log4j2.xml" - MaxLineLength:SimmValuationTest.kt$SimmValuationTest$val nodeAApi = HttpApi.fromHostAndPort(nodeAWebServerFuture.getOrThrow().listenAddress, "api/simmvaluationdemo") - MaxLineLength:SimmValuationTest.kt$SimmValuationTest$val nodeBApi = HttpApi.fromHostAndPort(nodeBWebServerFuture.getOrThrow().listenAddress, "api/simmvaluationdemo") - MaxLineLength:SimmValuationTest.kt$SimmValuationTest$valuationDate - MaxLineLength:SimpleMQClient.kt$SimpleMQClient$session = sessionFactory.createSession(username, password, false, true, true, locator.isPreAcknowledge, locator.ackBatchSize) MaxLineLength:SimpleNotaryService.kt$SimpleNotaryService : SinglePartyNotaryService - MaxLineLength:SimpleNotaryService.kt$SimpleNotaryService$?: - MaxLineLength:SimpleNotaryService.kt$SimpleNotaryService$override val uniquenessProvider = PersistentUniquenessProvider(services.clock, services.database, services.cacheFactory) MaxLineLength:SinglePartyNotaryService.kt$SinglePartyNotaryService$val signableData = SignableData(txId, SignatureMetadata(services.myInfo.platformVersion, Crypto.findSignatureScheme(notaryIdentityKey).schemeNumberID)) MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$ #See https://docs.corda.net/head/testing.html#running-tests-in-intellij - 'Fiber classes not instrumented' for more details. - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$ override fun stop(allowedUnsuspendedFiberCount: Int) - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$"""Missing the '-javaagent' JVM argument. Make sure you run the tests with the Quasar java agent attached to your JVM. #See https://docs.corda.net/head/testing.html#running-tests-in-intellij - 'Fiber classes not instrumented' for more details.""" - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$CheckpointSerializeAsTokenContextImpl(tokenizableServices, CheckpointSerializationDefaults.CHECKPOINT_SERIALIZER, CheckpointSerializationDefaults.CHECKPOINT_CONTEXT, serviceHub) MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$DataFeed(flows.values.map { it.fiber.logic }, changesPublisher.bufferUntilSubscribed().wrapWithDatabaseTransaction(database)) - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$changesPublisher.onNext(StateMachineManager.Change.Removed(lastState.flowLogic, Try.Failure<Nothing>(exception))) - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$changesPublisher.onNext(StateMachineManager.Change.Removed(lastState.flowLogic, Try.Success(removalReason.flowReturnValue))) - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$check(!foundUnrestorableFibers) { "Unrestorable checkpoints were created, please check the logs for details." } MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$errorAndTerminate("Caught unrecoverable error from flow. Forcibly terminating the JVM, this might leave resources open, and most likely will.", throwable) - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$is ExistingSessionMessage -> onExistingSessionMessage(sessionMessage, event.deduplicationHandler, sender) - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$is InitiatedFlowFactory.CorDapp -> FlowInfo(initiatedFlowFactory.flowVersion, initiatedFlowFactory.appName) MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$logger.debug { "Ignoring request to set time-out on timed flow $flowId to $timeoutSeconds seconds which is shorter than default of ${serviceHub.configuration.flowTimeout.timeout.seconds} seconds." } - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$logger.debug("Unable to kill a flow unknown to physical node. Might be processed by another physical node.") - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$logger.error("Unable to deserialize database checkpoint for flow $flowId. Something is very wrong. The flow will not retry.") - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$logger.error("Unable to find database checkpoint for flow $flowId. Something is very wrong. The flow will not retry.") MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$private - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$private val fiberDeserializationChecker = if (serviceHub.configuration.shouldCheckCheckpoints()) FiberDeserializationChecker() else null MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$require(lastState.pendingDeduplicationHandlers.isEmpty()) { "Flow cannot be removed until all pending deduplications have completed" } - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$return serviceHub.getFlowFactory(initiatorFlowClass) ?: throw SessionRejectException.NotRegistered(initiatorFlowClass) MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$startInitiatedFlow(flowLogic, event.deduplicationHandler, senderSession, initiatedSessionId, sessionMessage, senderCoreFlowVersion, initiatedFlowInfo) - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$val externalEvents = currentState.pendingDeduplicationHandlers.map { it.externalCause } + unprocessedExternalEvents MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$val flowCorDappVersion = createSubFlowVersion(serviceHub.cordappProvider.getCordappForFlow(flowLogic), serviceHub.myInfo.platformVersion) - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$val flowStart = FlowStart.Initiated(peerSession, initiatedSessionId, initiatingMessage, senderCoreFlowVersion, initiatedFlowInfo) - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$val frozenFlowLogic = (flowLogic as FlowLogic<*>).checkpointSerialize(context = checkpointSerializationContext!!) - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$val future = startFlow(event.flowLogic, event.context, ourIdentity = null, deduplicationHandler = event.deduplicationHandler) - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$val timeoutDelaySeconds = timeout.seconds * Math.pow(backoffBase, min(retryCount, maxRestartCount).toDouble()).toLong() - MaxLineLength:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager${ val flowId = StateMachineRunId.createRandom() // Before we construct the state machine state by freezing the FlowLogic we need to make sure that lazy properties // have access to the fiber (and thereby the service hub) val flowStateMachineImpl = FlowStateMachineImpl(flowId, flowLogic, scheduler) val resultFuture = openFuture<Any?>() flowStateMachineImpl.transientValues = TransientReference(createTransientValues(flowId, resultFuture)) flowLogic.stateMachine = flowStateMachineImpl val frozenFlowLogic = (flowLogic as FlowLogic<*>).checkpointSerialize(context = checkpointSerializationContext!!) val flowCorDappVersion = createSubFlowVersion(serviceHub.cordappProvider.getCordappForFlow(flowLogic), serviceHub.myInfo.platformVersion) val initialCheckpoint = Checkpoint.create( invocationContext, flowStart, flowLogic.javaClass, frozenFlowLogic, ourIdentity, flowCorDappVersion, flowLogic.isEnabledTimedFlow() ).getOrThrow() val startedFuture = openFuture<Unit>() val initialState = StateMachineState( checkpoint = initialCheckpoint, pendingDeduplicationHandlers = deduplicationHandler?.let { listOf(it) } ?: emptyList(), isFlowResumed = false, isTransactionTracked = false, isAnyCheckpointPersisted = false, isStartIdempotent = isStartIdempotent, isRemoved = false, flowLogic = flowLogic, senderUUID = ourSenderUUID ) flowStateMachineImpl.transientState = TransientReference(initialState) mutex.locked { startedFutures[flowId] = startedFuture } totalStartedFlows.inc() addAndStartFlow(flowId, Flow(flowStateMachineImpl, resultFuture)) return startedFuture.map { flowStateMachineImpl as FlowStateMachine<A> } } - MaxLineLength:SingletonSerializer.kt$SingletonSerializer : AMQPSerializer MaxLineLength:SingletonSerializer.kt$SingletonSerializer$internal val typeNotation: TypeNotation = RestrictedType(type.typeName, "Singleton", generateProvides(), "boolean", Descriptor(typeDescriptor), emptyList()) - MaxLineLength:SingletonSerializer.kt$SingletonSerializer$override MaxLineLength:Specification.kt$ListPropertyDelegateImpl$override fun <MAPPED> mapValid(mappedTypeName: String, convert: (List<TYPE>) -> Valid<MAPPED>): PropertyDelegate.Required<MAPPED> MaxLineLength:Specification.kt$ListPropertyDelegateImpl$override fun optional(): PropertyDelegate.Optional<List<TYPE>> MaxLineLength:Specification.kt$ListPropertyDelegateImpl$override operator MaxLineLength:Specification.kt$ListPropertyDelegateImpl$private - MaxLineLength:Specification.kt$ListPropertyDelegateImpl.<no name provided>$override fun getValue(thisRef: Any?, property: KProperty<*>): Configuration.Property.Definition.RequiredList<TYPE> MaxLineLength:Specification.kt$OptionalPropertyDelegateImpl$override fun withDefaultValue(defaultValue: TYPE): PropertyDelegate<TYPE> MaxLineLength:Specification.kt$OptionalPropertyDelegateImpl$override operator MaxLineLength:Specification.kt$OptionalPropertyDelegateImpl$private - MaxLineLength:Specification.kt$OptionalPropertyDelegateImpl.<no name provided>$override fun getValue(thisRef: Any?, property: KProperty<*>): Configuration.Property.Definition.Optional<TYPE> MaxLineLength:Specification.kt$OptionalWithDefaultPropertyDelegateImpl$override operator MaxLineLength:Specification.kt$OptionalWithDefaultPropertyDelegateImpl$private - MaxLineLength:Specification.kt$PropertyDelegate$operator fun provideDelegate(thisRef: Any?, property: KProperty<*>): ReadOnlyProperty<Any?, Configuration.Property.Definition<TYPE>> MaxLineLength:Specification.kt$PropertyDelegate.Companion$internal fun <ENUM : Enum<ENUM>> enum(key: String?, prefix: String?, enumClass: KClass<ENUM>, sensitive: Boolean, addProperty: (Configuration.Property.Definition<*>) -> Unit): Standard<ENUM> MaxLineLength:Specification.kt$PropertyDelegate.Companion$internal fun boolean(key: String?, prefix: String?, sensitive: Boolean, addProperty: (Configuration.Property.Definition<*>) -> Unit): Standard<Boolean> MaxLineLength:Specification.kt$PropertyDelegate.Companion$internal fun double(key: String?, prefix: String?, sensitive: Boolean, addProperty: (Configuration.Property.Definition<*>) -> Unit): Standard<Double> @@ -8741,247 +4755,99 @@ MaxLineLength:Specification.kt$PropertyDelegateImpl$override fun optional(): PropertyDelegate.Optional<TYPE> MaxLineLength:Specification.kt$PropertyDelegateImpl$override operator MaxLineLength:Specification.kt$PropertyDelegateImpl$private - MaxLineLength:Specification.kt$PropertyDelegateImpl.<no name provided>$override fun getValue(thisRef: Any?, property: KProperty<*>): Configuration.Property.Definition.Standard<TYPE> MaxLineLength:Specification.kt$RequiredPropertyDelegateImpl$override fun optional(): PropertyDelegate.Optional<TYPE> MaxLineLength:Specification.kt$RequiredPropertyDelegateImpl$override operator MaxLineLength:Specification.kt$RequiredPropertyDelegateImpl$private - MaxLineLength:Specification.kt$RequiredPropertyDelegateImpl.<no name provided>$override fun getValue(thisRef: Any?, property: KProperty<*>): Configuration.Property.Definition.Required<TYPE> - MaxLineLength:SpecificationTest.kt$SpecificationTest$assertThat(result.errors.first()) - MaxLineLength:SpecificationTest.kt$SpecificationTest$assertThat(rpcSettings.errors.first()) MaxLineLength:SpecificationTest.kt$SpecificationTest$val addressesValue = configObject("principal" to "${principalAddressValue.host}:${principalAddressValue.port}", "admin" to "${adminAddressValue.host}:${adminAddressValue.port}") MaxLineLength:SpecificationTest.kt$SpecificationTest$val addressesValue = configObject("principal" to "${principalAddressValue.host}:-10", "admin" to "${adminAddressValue.host}:${adminAddressValue.port}") MaxLineLength:SpecificationTest.kt$SpecificationTest.RpcSettingsSpec$override fun parseValid(configuration: Config) - MaxLineLength:SpecificationTest.kt$SpecificationTest.RpcSettingsSpec.AddressesSpec$override fun parseValid(configuration: Config) - MaxLineLength:SpecificationTest.kt$SpecificationTest.RpcSettingsSpec.AddressesSpec$return Address.validFromRawValue(rawValue) { error -> Configuration.Validation.Error.BadValue.of(error) } - MaxLineLength:SpringDriver.kt$SpringBootDriverDSL$ fun startSpringBootWebapp(clazz: Class<*>, handle: NodeHandle, checkUrl: String): CordaFuture<WebserverHandle> - MaxLineLength:SpringDriver.kt$SpringBootDriverDSL$val client = OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS).build() - MaxLineLength:SpringDriver.kt$SpringBootDriverDSL$val webReadyFuture = addressMustBeBoundFuture(driverDSL.executorService, (handle as NodeHandleInternal).webAddress, process) MaxLineLength:SslConfiguration.kt$MutualSslOptions : MutualSslConfiguration - MaxLineLength:SslConfiguration.kt$SslConfiguration.Companion$fun mutual(keyStore: FileBasedCertificateStoreSupplier, trustStore: FileBasedCertificateStoreSupplier): MutualSslConfiguration MaxLineLength:StabilityTest.kt$StabilityTest$SelfIssueCommand(IssueAndPaymentRequest(Amount(100000, USD), OpaqueBytes.of(0), issuer.mainIdentity, notaryIdentity, anonymous = true), issuer) - MaxLineLength:StabilityTest.kt$StabilityTest$is IssueAndPaymentRequest -> command.node.proxy.startFlow(::CashIssueAndPaymentFlow, request).returnValue MaxLineLength:StabilityTest.kt$StabilityTest$simpleNodes.flatMap { payer -> simpleNodes.map { payer to it } } .filter { it.first != it.second } .map { (payer, payee) -> CrossCashCommand(PaymentRequest(Amount(1, USD), payee.mainIdentity, anonymous = true), payer) } - MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$ fun dropSessionInit(id: UUID): Boolean MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$ fun sessionInitErrored(sessionMessage: InitialSessionMessage, sender: Party, event: ExternalEvent.ExternalMessageEvent, error: Throwable) - MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$"the UUID $id (from the node shell you can run 'flow kill $id'). BE VERY CAUTIOUS OF THIS SECOND APPROACH AS THE " MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$flowMessaging.sendSessionMessage(sender, replyError, SenderDeduplicationId(DeduplicationId.createRandom(secureRandom), ourSenderUUID)) MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$log MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$log.info("Flow error discharged from hospital (delay ${backOff.seconds}s) by ${report.by} (error was ${report.error.message})") - MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$log.info("Flow error kept for overnight observation by ${report.by} (error was ${report.error.message})") MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$private MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$val diagnoses: Map<Diagnosis, List<Staff>> = staff.groupBy { it.consult(flowFiber, currentState, error, medicalHistory) } - MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$val record = MedicalRecord.Flow(time, flowFiber.id, currentState.checkpoint.numberOfSuspends, errors, report.by, outcome) MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$val record = sessionMessage.run { MedicalRecord.SessionInit(id, time, outcome, initiatorFlowClassName, flowVersion, appName, sender, error) } MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital$val snapshot = (flowPatients.values.flatMap { it.records } + treatableSessionInits.values.map { it.publicRecord }).sortedBy { it.time } - MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital${ log.info("Flow error kept for overnight observation by ${report.by} (error was ${report.error.message})") // We don't schedule a next event for the flow - it will automatically retry from its checkpoint on node restart Triple(Outcome.OVERNIGHT_OBSERVATION, null, 0.seconds) } - MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital${ private companion object { private val log = contextLogger() private val staff = listOf( DeadlockNurse, DuplicateInsertSpecialist, DoctorTimeout, FinalityDoctor, TransientConnectionCardiologist ) } private val mutex = ThreadBox(object { val flowPatients = HashMap<StateMachineRunId, FlowMedicalHistory>() val treatableSessionInits = HashMap<UUID, InternalSessionInitRecord>() val recordsPublisher = PublishSubject.create<MedicalRecord>() }) private val secureRandom = newSecureRandom() private val delayedDischargeTimer = Timer("FlowHospitalDelayedDischargeTimer", true) /** * The node was unable to initiate the [InitialSessionMessage] from [sender]. */ fun sessionInitErrored(sessionMessage: InitialSessionMessage, sender: Party, event: ExternalEvent.ExternalMessageEvent, error: Throwable) { val time = Instant.now() val id = UUID.randomUUID() val outcome = if (error is SessionRejectException.UnknownClass) { // We probably don't have the CorDapp installed so let's pause the message in the hopes that the CorDapp is // installed on restart, at which point the message will be able proceed as normal. If not then it will need // to be dropped manually. Outcome.OVERNIGHT_OBSERVATION } else { Outcome.UNTREATABLE } val record = sessionMessage.run { MedicalRecord.SessionInit(id, time, outcome, initiatorFlowClassName, flowVersion, appName, sender, error) } mutex.locked { if (outcome != Outcome.UNTREATABLE) { treatableSessionInits[id] = InternalSessionInitRecord(sessionMessage, event, record) log.warn("$sender has sent a flow request for an unknown flow ${sessionMessage.initiatorFlowClassName}. Install the missing " + "CorDapp this flow belongs to and restart.") log.warn("If you know it's safe to ignore this flow request then it can be deleted permanently using the killFlow RPC and " + "the UUID $id (from the node shell you can run 'flow kill $id'). BE VERY CAUTIOUS OF THIS SECOND APPROACH AS THE " + "REQUEST MAY CONTAIN A NOTARISED TRANSACTION THAT NEEDS TO BE RECORDED IN YOUR VAULT.") } recordsPublisher.onNext(record) } if (outcome == Outcome.UNTREATABLE) { sendBackError(error, sessionMessage, sender, event) } } private fun sendBackError(error: Throwable, sessionMessage: InitialSessionMessage, sender: Party, event: ExternalEvent.ExternalMessageEvent) { val message = (error as? SessionRejectException)?.message ?: "Unable to establish session" val payload = RejectSessionMessage(message, secureRandom.nextLong()) val replyError = ExistingSessionMessage(sessionMessage.initiatorSessionId, payload) flowMessaging.sendSessionMessage(sender, replyError, SenderDeduplicationId(DeduplicationId.createRandom(secureRandom), ourSenderUUID)) event.deduplicationHandler.afterDatabaseTransaction() } /** * Drop the errored session-init message with the given ID ([MedicalRecord.SessionInit.id]). This will cause the node * to send back the relevant session error to the initiator party and acknowledge its receipt from the message broker * so that it never gets redelivered. */ fun dropSessionInit(id: UUID): Boolean { val (sessionMessage, event, publicRecord) = mutex.locked { treatableSessionInits.remove(id) ?: return false } log.info("Errored session-init permanently dropped: $publicRecord") sendBackError(publicRecord.error, sessionMessage, publicRecord.sender, event) return true } /** * The flow running in [flowFiber] has errored. */ fun flowErrored(flowFiber: FlowFiber, currentState: StateMachineState, errors: List<Throwable>) { val time = Instant.now() log.info("Flow ${flowFiber.id} admitted to hospital in state $currentState") val (event, backOffForChronicCondition) = mutex.locked { val medicalHistory = flowPatients.computeIfAbsent(flowFiber.id) { FlowMedicalHistory() } val report = consultStaff(flowFiber, currentState, errors, medicalHistory) val (outcome, event, backOffForChronicCondition) = when (report.diagnosis) { Diagnosis.DISCHARGE -> { val backOff = calculateBackOffForChronicCondition(report, medicalHistory, currentState) log.info("Flow error discharged from hospital (delay ${backOff.seconds}s) by ${report.by} (error was ${report.error.message})") Triple(Outcome.DISCHARGE, Event.RetryFlowFromSafePoint, backOff) } Diagnosis.OVERNIGHT_OBSERVATION -> { log.info("Flow error kept for overnight observation by ${report.by} (error was ${report.error.message})") // We don't schedule a next event for the flow - it will automatically retry from its checkpoint on node restart Triple(Outcome.OVERNIGHT_OBSERVATION, null, 0.seconds) } Diagnosis.NOT_MY_SPECIALTY -> { // None of the staff care for these errors so we let them propagate log.info("Flow error allowed to propagate", report.error) Triple(Outcome.UNTREATABLE, Event.StartErrorPropagation, 0.seconds) } } val record = MedicalRecord.Flow(time, flowFiber.id, currentState.checkpoint.numberOfSuspends, errors, report.by, outcome) medicalHistory.records += record recordsPublisher.onNext(record) Pair(event, backOffForChronicCondition) } if (event != null) { if (backOffForChronicCondition.isZero) { flowFiber.scheduleEvent(event) } else { delayedDischargeTimer.schedule(object : TimerTask() { override fun run() { flowFiber.scheduleEvent(event) } }, backOffForChronicCondition.toMillis()) } } } private fun calculateBackOffForChronicCondition(report: ConsultationReport, medicalHistory: FlowMedicalHistory, currentState: StateMachineState): Duration { return report.by.firstOrNull { it is Chronic }?.let { chronicStaff -> return medicalHistory.timesDischargedForTheSameThing(chronicStaff, currentState).let { if (it == 0) { 0.seconds } else { maxOf(10, (10 + (Math.random()) * (10 * 1.5.pow(it)) / 2).toInt()).seconds } } } ?: 0.seconds } private fun consultStaff(flowFiber: FlowFiber, currentState: StateMachineState, errors: List<Throwable>, medicalHistory: FlowMedicalHistory): ConsultationReport { return errors .asSequence() .mapIndexed { index, error -> // Rely on the logging context to print details of the flow ID. log.info("Error ${index + 1} of ${errors.size}:", error) val diagnoses: Map<Diagnosis, List<Staff>> = staff.groupBy { it.consult(flowFiber, currentState, error, medicalHistory) } // We're only interested in the highest priority diagnosis for the error val (diagnosis, by) = diagnoses.entries.minBy { it.key }!! ConsultationReport(error, diagnosis, by) } // And we're only interested in the error with the highest priority diagnosis .minBy { it.diagnosis }!! } private data class ConsultationReport(val error: Throwable, val diagnosis: Diagnosis, val by: List<Staff>) /** * The flow has been removed from the state machine. */ fun flowRemoved(flowId: StateMachineRunId) { mutex.locked { flowPatients.remove(flowId) } } // TODO MedicalRecord subtypes can expose the Staff class, something which we probably don't want when wiring this method to RPC /** Returns a stream of medical records as flows pass through the hospital. */ fun track(): DataFeed<List<MedicalRecord>, MedicalRecord> { return mutex.locked { val snapshot = (flowPatients.values.flatMap { it.records } + treatableSessionInits.values.map { it.publicRecord }).sortedBy { it.time } DataFeed(snapshot, recordsPublisher.bufferUntilSubscribed()) } } operator fun contains(flowId: StateMachineRunId) = mutex.locked { flowId in flowPatients } class FlowMedicalHistory { internal val records: MutableList<MedicalRecord.Flow> = mutableListOf() fun notDischargedForTheSameThingMoreThan(max: Int, by: Staff, currentState: StateMachineState): Boolean { return timesDischargedForTheSameThing(by, currentState) <= max } fun timesDischargedForTheSameThing(by: Staff, currentState: StateMachineState): Int { val lastAdmittanceSuspendCount = currentState.checkpoint.numberOfSuspends return records.count { it.outcome == Outcome.DISCHARGE && by in it.by && it.suspendCount == lastAdmittanceSuspendCount } } override fun toString(): String = "${this.javaClass.simpleName}(records = $records)" } private data class InternalSessionInitRecord(val sessionMessage: InitialSessionMessage, val event: ExternalEvent.ExternalMessageEvent, val publicRecord: MedicalRecord.SessionInit) sealed class MedicalRecord { abstract val time: Instant abstract val outcome: Outcome abstract val errors: List<Throwable> /** Medical record for a flow that has errored. */ data class Flow(override val time: Instant, val flowId: StateMachineRunId, val suspendCount: Int, override val errors: List<Throwable>, val by: List<Staff>, override val outcome: Outcome) : MedicalRecord() /** Medical record for a session initiation that was unsuccessful. */ data class SessionInit(val id: UUID, override val time: Instant, override val outcome: Outcome, val initiatorFlowClassName: String, val flowVersion: Int, val appName: String, val sender: Party, val error: Throwable) : MedicalRecord() { override val errors: List<Throwable> get() = listOf(error) } } enum class Outcome { DISCHARGE, OVERNIGHT_OBSERVATION, UNTREATABLE } /** The order of the enum values are in priority order. */ enum class Diagnosis { /** Retry from last safe point. */ DISCHARGE, /** Park and await intervention. */ OVERNIGHT_OBSERVATION, /** Please try another member of staff. */ NOT_MY_SPECIALTY } interface Staff { fun consult(flowFiber: FlowFiber, currentState: StateMachineState, newError: Throwable, history: FlowMedicalHistory): Diagnosis } interface Chronic /** * SQL Deadlock detection. */ object DeadlockNurse : Staff, Chronic { override fun consult(flowFiber: FlowFiber, currentState: StateMachineState, newError: Throwable, history: FlowMedicalHistory): Diagnosis { return if (mentionsDeadlock(newError)) { Diagnosis.DISCHARGE } else { Diagnosis.NOT_MY_SPECIALTY } } private fun mentionsDeadlock(exception: Throwable?): Boolean { return exception.mentionsThrowable(SQLException::class.java, "deadlock") } } /** * Primary key violation detection for duplicate inserts. Will detect other constraint violations too. */ object DuplicateInsertSpecialist : Staff { override fun consult(flowFiber: FlowFiber, currentState: StateMachineState, newError: Throwable, history: FlowMedicalHistory): Diagnosis { return if (newError.mentionsThrowable(ConstraintViolationException::class.java) && history.notDischargedForTheSameThingMoreThan(3, this, currentState)) { Diagnosis.DISCHARGE } else { Diagnosis.NOT_MY_SPECIALTY } } } /** * Restarts [TimedFlow], keeping track of the number of retries and making sure it does not * exceed the limit specified by the [FlowTimeoutException]. */ object DoctorTimeout : Staff { override fun consult(flowFiber: FlowFiber, currentState: StateMachineState, newError: Throwable, history: FlowMedicalHistory): Diagnosis { if (newError is FlowTimeoutException) { return Diagnosis.DISCHARGE } return Diagnosis.NOT_MY_SPECIALTY } } object FinalityDoctor : Staff { override fun consult(flowFiber: FlowFiber, currentState: StateMachineState, newError: Throwable, history: FlowMedicalHistory): Diagnosis { return if (currentState.flowLogic is FinalityHandler || isFromReceiveFinalityFlow(newError)) { log.warn("Flow ${flowFiber.id} failed to be finalised. Manual intervention may be required before retrying " + "the flow by re-starting the node. State machine state: $currentState", newError) Diagnosis.OVERNIGHT_OBSERVATION } else { Diagnosis.NOT_MY_SPECIALTY } } private fun isFromReceiveFinalityFlow(throwable: Throwable): Boolean { return throwable.stackTrace.any { it.className == ReceiveFinalityFlow::class.java.name } } } /** * [SQLTransientConnectionException] detection that arise from failing to connect the underlying database/datasource */ object TransientConnectionCardiologist : Staff { override fun consult(flowFiber: FlowFiber, currentState: StateMachineState, newError: Throwable, history: FlowMedicalHistory): Diagnosis { return if (mentionsTransientConnection(newError)) { if (history.notDischargedForTheSameThingMoreThan(2, this, currentState)) { Diagnosis.DISCHARGE } else { Diagnosis.OVERNIGHT_OBSERVATION } } else { Diagnosis.NOT_MY_SPECIALTY } } private fun mentionsTransientConnection(exception: Throwable?): Boolean { return exception.mentionsThrowable(SQLTransientConnectionException::class.java, "connection is not available") } } } MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital.DeadlockNurse$override MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital.DoctorTimeout$override MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital.DuplicateInsertSpecialist$override MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital.DuplicateInsertSpecialist$return if (newError.mentionsThrowable(ConstraintViolationException::class.java) && history.notDischargedForTheSameThingMoreThan(3, this, currentState)) { Diagnosis.DISCHARGE } else { Diagnosis.NOT_MY_SPECIALTY } - MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital.FinalityDoctor$log MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital.FinalityDoctor$override - MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital.FlowMedicalHistory$return records.count { it.outcome == Outcome.DISCHARGE && by in it.by && it.suspendCount == lastAdmittanceSuspendCount } - MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital.Staff$fun consult(flowFiber: FlowFiber, currentState: StateMachineState, newError: Throwable, history: FlowMedicalHistory): Diagnosis MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital.TransientConnectionCardiologist$override - MaxLineLength:StaffedFlowHospital.kt$StaffedFlowHospital.TransientConnectionCardiologist$return exception.mentionsThrowable(SQLTransientConnectionException::class.java, "connection is not available") - MaxLineLength:StaffedFlowHospital.kt$private - MaxLineLength:StaffedFlowHospital.kt$return (exceptionType.isAssignableFrom(this::class.java) && containsMessage) || cause.mentionsThrowable(exceptionType, errorMessage) - MaxLineLength:StandaloneCordaRPClientTest.kt$StandaloneCordaRPClientTest$rpcProxy.startFlow(::CashPaymentFlow, 100.POUNDS, notaryNodeIdentity, true, notaryNodeIdentity).returnValue.getOrThrow() - MaxLineLength:StandaloneCordaRPClientTest.kt$StandaloneCordaRPClientTest$val sorting = Sort(setOf(Sort.SortColumn(SortAttribute.Standard(Sort.VaultStateAttribute.RECORDED_TIME), Sort.Direction.DESC))) MaxLineLength:StandaloneShell.kt$StandaloneShell$Ansi.ansi().fgBrightRed().a( """ ______ __""").newline().a( """ / ____/ _________/ /___ _""").newline().a( """ / / __ / ___/ __ / __ `/ """).newline().fgBrightRed().a( """/ /___ /_/ / / / /_/ / /_/ /""").newline().fgBrightRed().a( """\____/ /_/ \__,_/\__,_/""").reset().fgBrightDefault().bold() .newline() - MaxLineLength:StandaloneShell.kt$StandaloneShell$if (System.console() != null) System.console().readPassword(format, *args) else this.readLine(format, *args).toCharArray() - MaxLineLength:StandaloneShell.kt$StandaloneShell$it.filter { it.isRegularFile() && it.toString().endsWith(".jar") }.map { it.toUri().toURL() }.toList() MaxLineLength:StandardConfigValueParsers.kt$internal fun <RESULT> badValue(message: String) - MaxLineLength:StandardConfigValueParsers.kt$internal fun toCordaX500Name(rawValue: String) MaxLineLength:StandardConfigValueParsers.kt$internal fun toNetworkHostAndPort(rawValue: String) - MaxLineLength:StandardConfigValueParsers.kt$internal fun toPrincipal(rawValue: String) MaxLineLength:StandardConfigValueParsers.kt$internal inline fun <reified RESULT, reified ERROR : Exception> attempt(action: () -> RESULT) MaxLineLength:StandardConfigValueParsers.kt$private fun Config.toProperties() - MaxLineLength:StandardConfigValueParsers.kt$private inline MaxLineLength:StartedFlowTransition.kt$StartedFlowTransition$actions.add(Action.SendExisting(existingSessionState.peerParty, existingMessage, SenderDeduplicationId(deduplicationId, startingState.senderUUID))) MaxLineLength:StartedFlowTransition.kt$StartedFlowTransition$actions.add(Action.SendInitial(existingSessionState.destination, initialMessage, SenderDeduplicationId(deduplicationId, startingState.senderUUID))) MaxLineLength:StartedFlowTransition.kt$StartedFlowTransition$actions.add(Action.SendInitial(sessionState.destination, initialMessage, SenderDeduplicationId(deduplicationId, startingState.senderUUID))) - MaxLineLength:StartedFlowTransition.kt$StartedFlowTransition$collectErroredSessionErrors(sessionIds, checkpoint) + collectEndedEmptySessionErrors(sessionIds, checkpoint) - MaxLineLength:StartedFlowTransition.kt$StartedFlowTransition$newSessionMessages[sessionId] = sessionState.copy(receivedMessages = messages.subList(1, messages.size).toList()) MaxLineLength:StartedFlowTransition.kt$StartedFlowTransition$private - MaxLineLength:StartedFlowTransition.kt$StartedFlowTransition$return freshErrorTransition(IllegalStateException("Tried to send to ended session $sourceSessionId")) MaxLineLength:StartedFlowTransition.kt$StartedFlowTransition$val initialMessage = createInitialSessionMessage(existingSessionState.initiatingSubFlow, sourceSessionId, existingSessionState.additionalEntropy, message) MaxLineLength:StartedFlowTransition.kt$StartedFlowTransition$val initialMessage = createInitialSessionMessage(sessionState.initiatingSubFlow, sourceSessionId, sessionState.additionalEntropy, null) - MaxLineLength:StartedFlowTransition.kt$StartedFlowTransition$val newBufferedMessages = existingSessionState.bufferedMessages + Pair(deduplicationId, sessionMessage) - MaxLineLength:StateMachineManager.kt$StateMachineManager - MaxLineLength:StateMachineManager.kt$StateMachineManager$ fun deliverExternalEvent(event: ExternalEvent) - MaxLineLength:StateMachineManager.kt$StateMachineManager$ fun killFlow(id: StateMachineRunId): Boolean - MaxLineLength:StateMachineManagerUtils.kt$ //TODO: instead of replacing the progress tracker after constructing the flow logic, we should inject it during fiber deserialization fun StateMachineManagerInternal.injectOldProgressTracker(oldTracker: ProgressTracker?, newFlowLogic: FlowLogic<*>) MaxLineLength:StateMachineState.kt$StateMachineState - MaxLineLength:StateMachineState.kt$SubFlowVersion$CorDappFlow : SubFlowVersion - MaxLineLength:StatePointer.kt$LinearPointer$// Here either one of two things has happened: // 1. The pointed-to state has not been seen by the resolver node. It is unlikely that this is the case. // The state can probably be obtained via subscribing to the data distribution group which created and // and maintains this data. // 2. Uh oh... The pointed-to state has been exited from the ledger! // It is unlikely this would ever happen as most reference data states will be created such that they cannot // be exited from the ledger. At this point there are two options; use an old consumed version of the state, // or don't use it at all. "The LinearState with ID ${pointer.id} is unknown to this node or it has been exited from the ledger." - MaxLineLength:StatePointer.kt$LinearPointer<T : LinearState> : StatePointer - MaxLineLength:StatePointer.kt$StaticPointer<T : ContractState> : StatePointer - MaxLineLength:StateRevisionFlow.kt$StateRevisionFlow.Receiver$open MaxLineLength:StateRevisionFlow.kt$StateRevisionFlow.Requester$updatedData: T MaxLineLength:StateSummingUtilities.kt$ fun <P : Any> Iterable<ContractState>.sumObligations(): Amount<Issued<Obligation.Terms<P>>> MaxLineLength:StateSummingUtilities.kt$ fun <P : Any> Iterable<ContractState>.sumObligationsOrNull(): Amount<Issued<Obligation.Terms<P>>>? MaxLineLength:StateSummingUtilities.kt$ fun <P : Any> Iterable<ContractState>.sumObligationsOrZero(issuanceDef: Issued<Obligation.Terms<P>>): Amount<Issued<Obligation.Terms<P>>> - MaxLineLength:StateSummingUtilities.kt$ fun Iterable<ContractState>.sumCash(): Amount<Issued<Currency>> MaxLineLength:StateSummingUtilities.kt$ fun Iterable<ContractState>.sumCashBy(owner: AbstractParty): Amount<Issued<Currency>> - MaxLineLength:StateSummingUtilities.kt$ fun Iterable<ContractState>.sumCashOrNull(): Amount<Issued<Currency>>? - MaxLineLength:StaticInitialisationOfSerializedObjectTest.kt$StaticInitialisationOfSerializedObjectTest$val url = EvolvabilityTests::class.java.getResource("StaticInitialisationOfSerializedObjectTest.deserializeTest") - MaxLineLength:StaticInitialisationOfSerializedObjectTest.kt$StaticInitialisationOfSerializedObjectTest$val url = EvolvabilityTests::class.java.getResource("StaticInitialisationOfSerializedObjectTest.deserializeTest2") - MaxLineLength:StatusTransitions.kt$StatusTransitions$?: - MaxLineLength:StatusTransitions.kt$StatusTransitions$if (options.isEmpty()) throw IllegalStateException("Transition [$input -(${command.javaClass.simpleName})-> $output] not allowed") - MaxLineLength:StatusTransitions.kt$StatusTransitions$private vararg val ts: TransitionDef<S, R> - MaxLineLength:StatusTransitions.kt$StatusTransitions$require(relevantCmds.isNotEmpty()) { "Transaction must have at least one Command relevant to its defined transitions" } - MaxLineLength:StatusTransitions.kt$StatusTransitions${ // which state determines who is the signer? by default the input, unless it's the initial transition val state = (inp ?: outp)!! val signerParty = state.roleToParty(signer) if (!cmd.signers.contains(signerParty.owningKey)) throw IllegalStateException("Command ${cmd.value.javaClass} must be signed by $signer") } - MaxLineLength:StatusTransitions.kt$StatusTransitions<out S, in R, T : StatusTrackingContractState<S, R>> - MaxLineLength:StatusTransitions.kt$TransitionDef<out S, out R> - MaxLineLength:StringToMethodCallParser.kt$StringToMethodCallParser$/** A map of method name to parameter names for the target type. */ val methodParamNames: Map<String, List<String>> = targetType.declaredMethods.filterNot(Method::isSynthetic).mapNotNull { try { it.name to paramNamesFromMethod(it) } catch (e: KotlinReflectionInternalError) { // Kotlin reflection doesn't support every method that can exist on an object (in particular, reified // inline methods) so we just ignore those here. null } }.toMap() - MaxLineLength:StringToMethodCallParser.kt$StringToMethodCallParser$kf != null -> kf.parameters[index + 1].name ?: throw UnparseableCallException.ReflectionDataMissing(method.name, index) - MaxLineLength:StringToMethodCallParser.kt$StringToMethodCallParser$kf != null -> kf.parameters[index].name ?: throw UnparseableCallException.ReflectionDataMissing("<init>", index) - MaxLineLength:StringToMethodCallParser.kt$StringToMethodCallParser$private - MaxLineLength:StringToMethodCallParser.kt$StringToMethodCallParser$when { param.isNamePresent -> param.name // index + 1 because the first Kotlin reflection param is 'this', but that doesn't match Java reflection. kf != null -> kf.parameters[index + 1].name ?: throw UnparseableCallException.ReflectionDataMissing(method.name, index) else -> throw UnparseableCallException.ReflectionDataMissing(method.name, index) } - MaxLineLength:StringToMethodCallParser.kt$StringToMethodCallParser.Companion$for ((key, value) in clazz.methods.filterNot { it.isSynthetic && it.name !in ignoredNames }.map { it.name to it }) { result.put(key, value) } MaxLineLength:StringToMethodCallParser.kt$StringToMethodCallParser.UnparseableCallException$MissingParameter : UnparseableCallException MaxLineLength:StringToMethodCallParser.kt$StringToMethodCallParser.UnparseableCallException$ReflectionDataMissing : UnparseableCallException MaxLineLength:StringToMethodCallParser.kt$StringToMethodCallParser.UnparseableCallException$TooManyParameters : UnparseableCallException MaxLineLength:StringToMethodCallParser.kt$StringToMethodCallParser.UnparseableCallException$open - MaxLineLength:StringToMethodCallParser.kt$StringToMethodCallParser<in T : Any> MaxLineLength:StringToMethodCallParserTest.kt$StringToMethodCallParserTest$"twoStrings a: Some words, b: ' and some words, like, Kirk, would, speak'" to "Some words and some words, like, Kirk, would, speak" - MaxLineLength:StringToMethodCallParserTest.kt$StringToMethodCallParserTest$val args: Array<Any?> = parser.parseArguments(clazz.name, names.zip(ctor.parameterTypes), "alternativeWord: Foo bar!") MaxLineLength:StringToMethodCallParserTest.kt$StringToMethodCallParserTest$val args: Array<Any?> = parser.parseArguments(clazz.name, names.zip(ctor.parameterTypes), "someWord: Blah blah blah, aDifferentThing: 12") - MaxLineLength:Structures.kt$Command$private fun commandDataToString() MaxLineLength:Structures.kt$CommandWithParties$@Deprecated("Should not be used in contract verification code as it is non-deterministic, will be disabled for some future target platform version onwards and will take effect only for CorDapps targeting those versions.") - MaxLineLength:Structures.kt$Contract - MaxLineLength:Structures.kt$Issued$require(issuer.reference.size <= MAX_ISSUER_REF_SIZE) { "Maximum issuer reference size is $MAX_ISSUER_REF_SIZE." } - MaxLineLength:Structures.kt$OwnableState$ fun withNewOwner(newOwner: AbstractParty): CommandAndState - MaxLineLength:Structures.kt$PrivacySalt : OpaqueBytes - MaxLineLength:Structures.kt$SchedulableState$ @DeleteForDJVM fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity? - MaxLineLength:Structures.kt$UpgradedContract<in OldState : ContractState, out NewState : ContractState> : Contract MaxLineLength:Structures.kt$UpgradedContractWithLegacyConstraint<in OldState : ContractState, out NewState : ContractState> : UpgradedContract MaxLineLength:Structures.kt$return mapNotNull { if (it.state.data is T) StateAndRef(TransactionState(it.state.data, it.state.contract, it.state.notary), it.ref) else null } - MaxLineLength:SubFlow.kt$SubFlow.Companion$Try.Success(Initiating(flowClass, initiatingAnnotation.first, flowContext, subFlowVersion, isEnabledTimedFlow)) - MaxLineLength:SubFlow.kt$SubFlow.Companion$fun create(flowClass: Class<FlowLogic<*>>, subFlowVersion: SubFlowVersion, isEnabledTimedFlow: Boolean): Try<SubFlow> - MaxLineLength:SubFlow.kt$SubFlow.Companion$private MaxLineLength:SubFlow.kt$SubFlow.Inlined$data - MaxLineLength:SupportedTransforms.kt$SupportedTransform MaxLineLength:SwapData.kt$FixedLeg$data MaxLineLength:SwapData.kt$FloatingLeg$data MaxLineLength:SwapData.kt$SwapData$return getSwapConvention(convention).createTrade(startDate, Tenor.TENOR_4Y, buySell, notional.toDouble(), fixedRate.toDouble(), ReferenceData.standard()) .toBuilder() .info(tradeInfo) .build() MaxLineLength:SwapDataModel.kt$SwapDataModel$Pair("swap", id) - MaxLineLength:SwapExample.kt$SwapExample$val resolvedTrades = trades.stream().map({ trade -> trade.resolve(ReferenceData.standard()) }).collect(toList<ResolvedSwapTrade>()) - MaxLineLength:SwapExample.kt$SwapExample$val resolvedTrades = trades1.stream().map({ trade -> trade.resolve(ReferenceData.standard()) }).collect(toList<ResolvedSwapTrade>()) - MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesException : FlowException - MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesFlow : FlowLogic - MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesFlow$@Deprecated("It is unsafe to use this constructor as it requires nodes to automatically vend anonymous identities without first " + "checking if they should. Instead, use the constructor that takes in an existing FlowSession.") - MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesFlow$@Deprecated("It is unsafe to use this constructor as it requires nodes to automatically vend anonymous identities without first " + "checking if they should. Instead, use the constructor that takes in an existing FlowSession.") constructor(otherParty: Party, revocationEnabled: Boolean, progressTracker: ProgressTracker) : this(null, otherParty, progressTracker) - MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesFlow$@JvmOverloads constructor(otherSideSession: FlowSession, progressTracker: ProgressTracker = tracker()) : this(otherSideSession, null, progressTracker) - MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesFlow$logger - MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesFlow$val theirAnonymousIdentity = session.sendAndReceive<IdentityWithSignature>(ourIdentWithSig).unwrap { theirIdentWithSig -> progressTracker.currentStep = VERIFYING_IDENTITY validateAndRegisterIdentity(serviceHub, session.counterparty, theirIdentWithSig.identity.deserialize(), theirIdentWithSig.signature) } + MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesFlow$@Deprecated("It is unsafe to use this constructor as it requires nodes to automatically vend anonymous identities without first " + "checking if they should. Instead, use the constructor that takes in an existing FlowSession.") constructor(otherParty: Party, @Suppress("UNUSED_PARAMETER") revocationEnabled: Boolean, progressTracker: ProgressTracker) : this(null, otherParty, progressTracker) MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesFlow$validateAndRegisterIdentity(serviceHub, session.counterparty, theirIdentWithSig.identity.deserialize(), theirIdentWithSig.signature) - MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesFlow.Companion$@JvmStatic fun tracker(): ProgressTracker - MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesFlow.Companion${ if (theirAnonymousIdentity.name != otherSide.name) { throw SwapIdentitiesException("Certificate subject must match counterparty's well known identity.") } try { theirAnonymousIdentity.owningKey.verify(buildDataToSign(theirAnonymousIdentity), signature) } catch (ex: SignatureException) { throw SwapIdentitiesException("Signature does not match the expected identity ownership assertion.", ex) } // Validate then store their identity so that we can prove the key in the transaction is owned by the counterparty. serviceHub.identityService.verifyAndRegisterIdentity(theirAnonymousIdentity) return theirAnonymousIdentity } - MaxLineLength:SwapIdentitiesFlow.kt$SwapIdentitiesFlow.IdentityWithSignature$@CordaSerializable data - MaxLineLength:SwapIdentitiesFlowTests.kt$SwapIdentitiesFlowTests$private - MaxLineLength:SwapIdentitiesFlowTests.kt$SwapIdentitiesFlowTests.<no name provided>$ is resolved by - MaxLineLength:SwapIdentitiesFlowTests.kt$SwapIdentitiesFlowTests.HoldsOwningKeyMatcher$private data - MaxLineLength:SwapIdentitiesHandler.kt$SwapIdentitiesHandler : FlowLogic MaxLineLength:SwapIdentitiesHandler.kt$SwapIdentitiesHandler$logger.warnOnce("Insecure API to swap anonymous identities was used by ${otherSide.counterparty} (${otherSide.getCounterpartyFlowInfo()})") - MaxLineLength:Swaption.kt$Swaption$val floating = interest(notional, "act/365", fix("LIBOR", start, Tenor("3M")), start, end) - MaxLineLength:TLSAuthenticationTests.kt$TLSAuthenticationTests - MaxLineLength:TLSAuthenticationTests.kt$TLSAuthenticationTests$arrayOf("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256") - MaxLineLength:TLSAuthenticationTests.kt$TLSAuthenticationTests$arrayOf("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256") - MaxLineLength:TLSAuthenticationTests.kt$TLSAuthenticationTests$clientParams.endpointIdentificationAlgorithm = null - MaxLineLength:TLSAuthenticationTests.kt$TLSAuthenticationTests$private - MaxLineLength:TLSAuthenticationTests.kt$TLSAuthenticationTests$serverParams.endpointIdentificationAlgorithm = null MaxLineLength:TLSAuthenticationTests.kt$TLSAuthenticationTests$serverParams.needClientAuth = true - MaxLineLength:TLSAuthenticationTests.kt$TLSAuthenticationTests$testConnect(serverSocket, clientSocket, "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256") - MaxLineLength:TLSAuthenticationTests.kt$TLSAuthenticationTests$testConnect(serverSocket, clientSocket, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256") - MaxLineLength:TLSAuthenticationTests.kt$TLSAuthenticationTests$val serverSocket = serverSocketFactory.createServerSocket(serverPort) as SSLServerSocket // use 0 to get first free socket. - MaxLineLength:TenorDateParameterMetadataSerializer.kt$TenorDateParameterMetadataSerializer$override fun fromProxy(proxy: Proxy): TenorDateParameterMetadata - MaxLineLength:TestClock.kt$TestClock$ @Synchronized fun setTo(newInstant: Instant) MaxLineLength:TestCommonUtils.kt$inline fun <reified TYPE : Throwable> AbstractThrowableAssert<*, *>.isInstanceOf(): AbstractThrowableAssert<*, *> - MaxLineLength:TestCommsFlow.kt$TestCommsFlowInitiator$tx.addOutputState(CommsTestState(responses, serviceHub.myInfo.legalIdentities.first()), CommsTestContract::class.java.name) MaxLineLength:TestConstants.kt$ fun dummyCommand(vararg signers: PublicKey = arrayOf(generateKeyPair().public)) - MaxLineLength:TestCordapp.kt$TestCordapp - MaxLineLength:TestCordapp.kt$TestCordapp.Companion$ @JvmStatic fun findCordapp(scanPackage: String): TestCordapp MaxLineLength:TestCordappImpl.kt$TestCordappImpl : TestCordappInternal MaxLineLength:TestCordappImpl.kt$TestCordappImpl$0 MaxLineLength:TestCordappImpl.kt$TestCordappImpl$else -> throw IllegalArgumentException("There is more than one CorDapp containing the package $scanPackage on the classpath " + "$jars. Specify a package name which is unique to the CorDapp.") MaxLineLength:TestCordappInternal.kt$TestCordappInternal : TestCordapp - MaxLineLength:TestCordappInternal.kt$TestCordappInternal.Companion$cordappsWithoutMeta.forEach { require(it.value.size == 1) { "Conflicting CorDapps specified: ${it.value}" } } - MaxLineLength:TestCordappInternal.kt$TestCordappInternal.Companion$val allCordapps = nodeSpecificCordapps + generalCordapps.filter { it.withOnlyJarContents() !in nodeSpecificCordappsWithoutMeta } - MaxLineLength:TestCordappInternal.kt$TestCordappInternal.Companion${ // Ignore if the node already has the same CorDapp jar. This can happen if the node is being restarted. } - MaxLineLength:TestDSL.kt$AttachmentResolutionException : FlowException - MaxLineLength:TestDSL.kt$DoubleSpentInputs : FlowException - MaxLineLength:TestDSL.kt$TestLedgerDSLInterpreter$( transactionLabel: String?, transactionBuilder: TransactionBuilder, dsl: TestTransactionDSLInterpreter.() -> Unit ) - MaxLineLength:TestDSL.kt$TestLedgerDSLInterpreter$throw IllegalStateException("A transaction-DSL block that is part of a test ledger must return a valid transaction.", e) - MaxLineLength:TestDSL.kt$TestLedgerDSLInterpreter$val transactionsUnverified: List<WireTransaction> get() = nonVerifiedTransactionWithLocations.values.map { it.transaction } MaxLineLength:TestDSL.kt$TestTransactionDSLInterpreter$attachment((services.cordappProvider as MockCordappProvider).addMockCordapp(contractClassName, services.attachments as MockAttachmentStorage)) MaxLineLength:TestDSL.kt$TestTransactionDSLInterpreter$attachment((services.cordappProvider as MockCordappProvider).addMockCordapp(contractClassName, services.attachments as MockAttachmentStorage, attachmentId, signers)) MaxLineLength:TestDSL.kt$TestTransactionDSLInterpreter$attachment((services.cordappProvider as MockCordappProvider).addMockCordapp(contractClassName, services.attachments as MockAttachmentStorage, attachmentId, signers, jarManifestAttributes)) MaxLineLength:TestDSL.kt$TestTransactionDSLInterpreter$override - MaxLineLength:TestDSL.kt$net.corda.testing.dsl.TestDSL.kt - MaxLineLength:TestDatabaseContext.kt$TestDatabaseContext : CloseableResource MaxLineLength:TestDatabaseContext.kt$TestDatabaseContext$ fun afterClass(teardownSql: List<String>) - MaxLineLength:TestDatabaseContext.kt$TestDatabaseContext$ fun afterTest(teardownSql: List<String>) MaxLineLength:TestDatabaseContext.kt$TestDatabaseContext$ fun beforeClass(setupSql: List<String>) - MaxLineLength:TestDatabaseContext.kt$TestDatabaseContext$ fun beforeTest(setupSql: List<String>) - MaxLineLength:TestDatabaseContext.kt$TestDatabaseContext$ fun initialize(groupName: String) - MaxLineLength:TestNoSecurityDataVendingFlow.kt$TestNoSecurityDataVendingFlow : DataVendingFlow - MaxLineLength:TestNoSecurityDataVendingFlow.kt$TestNoSecurityDataVendingFlow$@Suspendable override MaxLineLength:TestNodeInfoBuilder.kt$TestNodeInfoBuilder MaxLineLength:TestNodeInfoBuilder.kt$TestNodeInfoBuilder$fun addServiceIdentity(name: CordaX500Name, nodeKeyPair: KeyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME)): Pair<PartyAndCertificate, PrivateKey> - MaxLineLength:TestNodeInfoBuilder.kt$TestNodeInfoBuilder$listOf(NetworkHostAndPort("my.${identitiesAndPrivateKeys[0].first.party.name.organisation.replace(' ', '-')}.com", 1234)) - MaxLineLength:TestNodeInfoBuilder.kt$fun createNodeInfoAndSigned(vararg names: CordaX500Name, serial: Long = 1, platformVersion: Int = 1): NodeInfoAndSigned - MaxLineLength:TestNotaryFlow.kt$TestNotaryFlow$issueBuilder.addOutputState(NotaryTestState(notary.name.toString(), myIdentity), NotaryTestContract::class.java.name) - MaxLineLength:TestResponseFlowInIsolation.kt$TestResponseFlowInIsolation$private val network: MockNetwork = MockNetwork(MockNetworkParameters(cordappsForAllNodes = cordappsForPackages("com.template"))) - MaxLineLength:TestResponseFlowInIsolation.kt$TestResponseFlowInIsolation$val initiatedResponderFlowFuture = b.registerInitiatedFlow(BadInitiator::class.java, Responder::class.java).toFuture() - MaxLineLength:TestUtils.kt$@Deprecated("Returned port is not guaranteed to be free when used, which can result in flaky tests. Instead use a port " + "range that's unlikely to be used by the rest of the system, such as PortAllocation.Incremental(10000).") - MaxLineLength:TestUtils.kt$TestIdentity$@JvmOverloads - MaxLineLength:TestUtils.kt$TestIdentity.Companion$ @JvmStatic @JvmOverloads fun fresh(organisation: String, signatureScheme: SignatureScheme = Crypto.DEFAULT_SIGNATURE_SCHEME): TestIdentity - MaxLineLength:TestUtils.kt$internal fun <VALUE> extractValueWithErrors(errors: Set<Configuration.Validation.Error>) - MaxLineLength:TestUtils.kt$net.corda.testing.core.TestUtils.kt MaxLineLength:TestingNamedCacheFactory.kt$TestingNamedCacheFactory : BindableNamedCacheFactorySingletonSerializeAsToken - MaxLineLength:TestingNamedCacheFactory.kt$TestingNamedCacheFactory$override MaxLineLength:TestingNamedCacheFactory.kt$TestingNamedCacheFactory$override fun bindWithConfig(nodeConfiguration: NodeConfiguration): BindableNamedCacheFactory MaxLineLength:TestingNamedCacheFactory.kt$TestingNamedCacheFactory$override fun bindWithMetrics(metricRegistry: MetricRegistry): BindableNamedCacheFactory MaxLineLength:ThreadContextAdjustingRpcOpsProxy.kt$ThreadContextAdjustingRpcOpsProxy : InternalCordaRPCOps MaxLineLength:ThreadContextAdjustingRpcOpsProxy.kt$ThreadContextAdjustingRpcOpsProxy$internal MaxLineLength:ThreadContextAdjustingRpcOpsProxy.kt$ThreadContextAdjustingRpcOpsProxy.Companion$return Proxy.newProxyInstance(delegate::class.java.classLoader, arrayOf(InternalCordaRPCOps::class.java), handler) as InternalCordaRPCOps - MaxLineLength:ThreadContextAdjustingRpcOpsProxy.kt$ThreadContextAdjustingRpcOpsProxy.Companion$val handler = ThreadContextAdjustingRpcOpsProxy.ThreadContextAdjustingInvocationHandler(delegate, classLoader) MaxLineLength:ThreadContextAdjustingRpcOpsProxy.kt$ThreadContextAdjustingRpcOpsProxy.ThreadContextAdjustingInvocationHandler$private MaxLineLength:ThrowableSerializer.kt$StackTraceElementSerializer : Proxy MaxLineLength:ThrowableSerializer.kt$StackTraceElementSerializer$override fun fromProxy(proxy: StackTraceElementProxy): StackTraceElement MaxLineLength:ThrowableSerializer.kt$StackTraceElementSerializer$override fun toProxy(obj: StackTraceElement): StackTraceElementProxy - MaxLineLength:ThrowableSerializer.kt$StackTraceElementSerializer.StackTraceElementProxy$@KeepForDJVM data MaxLineLength:ThrowableSerializer.kt$ThrowableSerializer : Proxy - MaxLineLength:ThrowableSerializer.kt$ThrowableSerializer$if (this.javaClass.name != proxy.exceptionClass) this.originalExceptionClassName = proxy.exceptionClass - MaxLineLength:ThrowableSerializer.kt$ThrowableSerializer$logger.warn("Unexpected exception de-serializing throwable: ${proxy.exceptionClass}. Converting to CordaRuntimeException.", e) - MaxLineLength:ThrowableSerializer.kt$ThrowableSerializer$override val additionalSerializers: Iterable<CustomSerializer<out Any>> = listOf(StackTraceElementSerializer(factory)) - MaxLineLength:ThrowableSerializer.kt$ThrowableSerializer$return ThrowableProxy(obj.javaClass.name, message, stackTraceToInclude, obj.cause, obj.suppressed, extraProperties) MaxLineLength:ThrowableSerializer.kt$ThrowableSerializer${ try { // TODO: This will need reworking when we have multiple class loaders val clazz = Class.forName(proxy.exceptionClass, false, factory.classloader) // If it is CordaException or CordaRuntimeException, we can seek any constructor and then set the properties // Otherwise we just make a CordaRuntimeException if (CordaThrowable::class.java.isAssignableFrom(clazz) && Throwable::class.java.isAssignableFrom(clazz)) { val typeInformation = factory.getTypeInformation(clazz) val constructor = typeInformation.constructor val params = constructor.parameters.map { parameter -> proxy.additionalProperties[parameter.name] ?: proxy.additionalProperties[parameter.name.capitalize()] } val throwable = constructor.observedMethod.newInstance(*params.toTypedArray()) (throwable as CordaThrowable).apply { if (this.javaClass.name != proxy.exceptionClass) this.originalExceptionClassName = proxy.exceptionClass this.setMessage(proxy.message) this.setCause(proxy.cause) this.addSuppressed(proxy.suppressed) } return (throwable as Throwable).apply { this.stackTrace = proxy.stackTrace } } } catch (e: Exception) { logger.warn("Unexpected exception de-serializing throwable: ${proxy.exceptionClass}. Converting to CordaRuntimeException.", e) } // If the criteria are not met or we experience an exception constructing the exception, we fall back to our own unchecked exception. return CordaRuntimeException(proxy.exceptionClass, null, null).apply { this.setMessage(proxy.message) this.setCause(proxy.cause) this.stackTrace = proxy.stackTrace this.addSuppressed(proxy.suppressed) } } - MaxLineLength:TimeWindow.kt$TimeWindow.Companion$ @JvmStatic fun fromOnly(fromTime: Instant): TimeWindow - MaxLineLength:TimeWindow.kt$TimeWindow.Companion$ @JvmStatic fun fromStartAndDuration(fromTime: Instant, duration: Duration): TimeWindow - MaxLineLength:TimeWindow.kt$TimeWindow.Companion$ @JvmStatic fun untilOnly(untilTime: Instant): TimeWindow - MaxLineLength:TimedFlowTests.kt$TimedFlowTests$TestNotaryService : SinglePartyNotaryService MaxLineLength:TimedFlowTests.kt$TimedFlowTests$addOutputState(DummyContract.SingleOwnerState(owner = info.singleIdentity()), DummyContract.PROGRAM_ID, AlwaysAcceptAttachmentConstraint) - MaxLineLength:TimedFlowTests.kt$TimedFlowTests$private - MaxLineLength:TimedFlowTests.kt$TimedFlowTests.Companion$/** The notary nodes don't run any consensus protocol, so 2 nodes are sufficient for the purpose of this test. */ private const val CLUSTER_SIZE = 2 MaxLineLength:TimedFlowTests.kt$TimedFlowTests.Companion$defaultParameters = MockNetworkParameters().withServicePeerAllocationStrategy(InMemoryMessagingNetwork.ServicePeerAllocationStrategy.RoundRobin()) - MaxLineLength:TimedFlowTests.kt$TimedFlowTests.Companion$val networkParameters = NetworkParametersCopier(testNetworkParameters(listOf(NotaryInfo(notaryIdentity, false)))) - MaxLineLength:TimedFlowTests.kt$TimedFlowTests.Companion${ val replicaIds = (0 until CLUSTER_SIZE) val serviceLegalName = CordaX500Name("Custom Notary", "Zurich", "CH") val notaryIdentity = DevIdentityGenerator.generateDistributedNotaryCompositeIdentity( replicaIds.map { mockNet.baseDirectory(mockNet.nextNodeId + it) }, serviceLegalName) val networkParameters = NetworkParametersCopier(testNetworkParameters(listOf(NotaryInfo(notaryIdentity, false)))) val notaryConfig = mock<NotaryConfig> { whenever(it.serviceLegalName).thenReturn(serviceLegalName) whenever(it.validating).thenReturn(false) whenever(it.className).thenReturn(TestNotaryService::class.java.name) } val notaryNodes = (0 until CLUSTER_SIZE).map { mockNet.createUnstartedNode(InternalMockNodeParameters(configOverrides = { doReturn(notaryConfig).whenever(it).notary })) } val aliceNode = mockNet.createUnstartedNode( InternalMockNodeParameters( legalName = CordaX500Name("Alice", "AliceCorp", "GB"), configOverrides = { conf: NodeConfiguration -> val retryConfig = FlowTimeoutConfiguration(1.seconds, 3, 1.0) doReturn(retryConfig).whenever(conf).flowTimeout } ) ) val patientNode = mockNet.createUnstartedNode( InternalMockNodeParameters( legalName = CordaX500Name("Bob", "BobCorp", "GB"), configOverrides = { conf: NodeConfiguration -> val retryConfig = FlowTimeoutConfiguration(10.seconds, 3, 1.0) doReturn(retryConfig).whenever(conf).flowTimeout } ) ) // MockNetwork doesn't support notary clusters, so we create all the nodes we need unstarted, and then install the // network-parameters in their directories before they're started. val nodes = (notaryNodes + aliceNode + patientNode).map { node -> networkParameters.install(mockNet.baseDirectory(node.id)) node.start() } return Triple(notaryIdentity, nodes[nodes.lastIndex - 1], nodes.last()) } MaxLineLength:TimedFlowTests.kt$TimedFlowTests.TestNotaryService$@Suspendable override MaxLineLength:TimedFlowTests.kt$TimedFlowTests.TestNotaryService$override fun createServiceFlow(otherPartySession: FlowSession): FlowLogic<Void?> MaxLineLength:TimedFlowTests.kt$TimedFlowTests.TestNotaryService$private MaxLineLength:TimedFlowTests.kt$TimedFlowTests.TestNotaryService.<no name provided>$override - MaxLineLength:TimedFlowUtils.kt$ internal fun FlowLogic<*>.isEnabledTimedFlow(): Boolean - MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest$clientParams.endpointIdentificationAlgorithm = null MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest$logger.info("Testing: ServerAlgo: $serverAlgo, ClientAlgo: $clientAlgo, Suites: $cipherSuites, Server protocols: $serverProtocols, Client protocols: $clientProtocols, Should fail: $shouldFail") - MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest$serverParams.endpointIdentificationAlgorithm = null MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest$val clientKeyStore = CertificateStore.fromResource("net/corda/nodeapi/internal/crypto/keystores/bridge_$clientAlgo.jks", "bridgepass", "bridgepass") - MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest$val clientParams = SSLParameters(cipherSuites.algos, clientProtocols.versions) clientParams.endpointIdentificationAlgorithm = null // Reconfirm default no server name indication, use our own validator. // SNI Client setup clientParams.serverNames = listOf(SNIHostName(sniServerName)) sslParameters = clientParams useClientMode = true // We need to specify this explicitly because by default the client binds to 'localhost' and we want it to bind // to whatever <hostname> resolves to(as that's what the server binds to). In particular on Debian <hostname> // resolves to 127.0.1.1 instead of the external address of the interface, so the ssl handshake fails. bind(InetSocketAddress(InetAddress.getLocalHost(), 0)) MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest$val serverKeyStore = CertificateStore.fromResource("net/corda/nodeapi/internal/crypto/keystores/float_$serverAlgo.jks", "floatpass", "floatpass") - MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest$val trustStore = CertificateStore.fromResource("net/corda/nodeapi/internal/crypto/keystores/trust.jks", "trustpass", "trustpass") MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest.Companion$@Parameterized.Parameters(name = "ServerAlgo: {0}, ClientAlgo: {1}, CipherSuites: {2}, Should fail: {3}, ServerProtocols: {4}, ClientProtocols: {5}") MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest.Companion$arrayOf(serverAlgo, clientAlgo, Companion.CipherSuites.CIPHER_SUITES_ALL, false, Companion.TlsProtocols.BOTH, Companion.TlsProtocols.BOTH) MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest.Companion$arrayOf(serverAlgo, clientAlgo, Companion.CipherSuites.CIPHER_SUITES_ALL, false, Companion.TlsProtocols.BOTH, Companion.TlsProtocols.ONE_2) @@ -8989,60 +4855,33 @@ MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest.Companion$arrayOf(serverAlgo, clientAlgo, Companion.CipherSuites.CIPHER_SUITES_ALL, false, Companion.TlsProtocols.ONE_3, Companion.TlsProtocols.ONE_3) MaxLineLength:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest.Companion$arrayOf(serverAlgo, clientAlgo, Companion.CipherSuites.CIPHER_SUITES_ALL, true, Companion.TlsProtocols.ONE_3, Companion.TlsProtocols.ONE_2) MaxLineLength:ToggleField.kt$InheritableThreadLocalToggleField$private val isAGlobalThreadBeingCreated: (Array<StackTraceElement>) -> Boolean - MaxLineLength:ToggleField.kt$InheritableThreadLocalToggleField.<no name provided>$override MaxLineLength:ToggleField.kt$ThreadLeakException : RuntimeException - MaxLineLength:ToggleFieldTest.kt$ToggleFieldTest$// If ThreadLeakException is seen in practice, these warnings form a trail of where the holder has been: verify(log).warn(argThat { contains(leakedThreadName) && contains("hello") }) val newThreadName = fork { Thread.currentThread().name }.getOrThrow() val future = fork(field::get) assertThatThrownBy { future.getOrThrow() } .isInstanceOf(ThreadLeakException::class.java) .hasMessageContaining(newThreadName) .hasMessageContaining("hello") fork { verifyNoMoreInteractions(log) withSingleThreadExecutor { verify(log).warn(argThat { contains(newThreadName) && contains("hello") }) } }.getOrThrow() - MaxLineLength:ToggleFieldTest.kt$ToggleFieldTest$isAGlobalThreadBeingCreated || (e.className == companionName && e.methodName == "globalThreadCreationMethod") MaxLineLength:ToggleFieldTest.kt$ToggleFieldTest$listOf(SimpleToggleField<String>("simple"), ThreadLocalToggleField<String>("local"), inheritableThreadLocalToggleField()) - MaxLineLength:ToggleFieldTest.kt$ToggleFieldTest$private - MaxLineLength:TopLevelTransition.kt$TopLevelTransition$Action.PersistCheckpoint(context.id, newCheckpoint, isCheckpointUpdate = currentState.isAnyCheckpointPersisted) - MaxLineLength:TopLevelTransition.kt$TopLevelTransition$Action.RemoveFlow(context.id, FlowRemovalReason.OrderlyFinish(event.returnValue), currentState) - MaxLineLength:TopLevelTransition.kt$TopLevelTransition$Action.SendExisting(state.peerParty, message, SenderDeduplicationId(deduplicationId, currentState.senderUUID)) MaxLineLength:TopLevelTransition.kt$TopLevelTransition$freshErrorTransition(IllegalStateException("Tried to initiate in a flow not annotated with @${InitiatingFlow::class.java.simpleName}")) - MaxLineLength:TopLevelTransition.kt$TopLevelTransition$is Event.DeliverSessionMessage -> DeliverSessionMessageTransition(context, startingState, event).transition() MaxLineLength:TopLevelTransition.kt$TopLevelTransition$val newSessions = checkpoint.sessions + (sourceSessionId to SessionState.Uninitiated(event.destination, initiatingSubFlow, sourceSessionId, context.secureRandom.nextLong())) MaxLineLength:Trace.kt$Trace.Companion$ @DeleteForDJVM @JvmStatic fun newInstance(invocationId: InvocationId = InvocationId.newInstance(), sessionId: SessionId = SessionId(invocationId.value, invocationId.timestamp)) MaxLineLength:Trace.kt$Trace.InvocationId.Companion$ @DeleteForDJVM @JvmStatic fun newInstance(value: String = UuidGenerator.next().toString(), timestamp: Instant = Instant.now()) MaxLineLength:Trace.kt$Trace.SessionId.Companion$ @DeleteForDJVM @JvmStatic fun newInstance(value: String = UuidGenerator.next().toString(), timestamp: Instant = Instant.now()) - MaxLineLength:TrackedDelegate.kt$TrackedDelegate$EventSinkDelegate<M : Any, T> : TrackedDelegate - MaxLineLength:TrackedDelegate.kt$TrackedDelegate$EventStreamDelegate<M : Any, T> : TrackedDelegate MaxLineLength:TrackedDelegate.kt$TrackedDelegate$ObjectPropertyDelegate<M : Any, T> : TrackedDelegate - MaxLineLength:TrackedDelegate.kt$TrackedDelegate$ObservableDelegate<M : Any, T> : TrackedDelegate MaxLineLength:TrackedDelegate.kt$TrackedDelegate$ObservableListDelegate<M : Any, T> : TrackedDelegate MaxLineLength:TrackedDelegate.kt$TrackedDelegate$ObservableListReadOnlyDelegate<M : Any, out T> : TrackedDelegate MaxLineLength:TrackedDelegate.kt$TrackedDelegate$ObservableValueDelegate<M : Any, T> : TrackedDelegate - MaxLineLength:TrackedDelegate.kt$TrackedDelegate$ObserverDelegate<M : Any, T> : TrackedDelegate - MaxLineLength:TrackedDelegate.kt$TrackedDelegate$SubjectDelegate<M : Any, T> : TrackedDelegate MaxLineLength:TrackedDelegate.kt$TrackedDelegate$WritableValueDelegate<M : Any, T> : TrackedDelegate - MaxLineLength:TraderDemoClientApi.kt$TraderDemoClientApi$println("Sale completed - we have a happy customer!\n\nFinal transaction is:\n\n${Emoji.renderIfSupported(stx.tx)}") - MaxLineLength:TraderDemoClientApi.kt$TraderDemoClientApi$val otherParty = rpc.wellKnownPartyFromX500Name(buyerName) ?: throw IllegalStateException("Don't know $buyerName") - MaxLineLength:TraderDemoTest.kt$TraderDemoTest$TraderDemoClientApi(bank.rpc).runIssuer(amount = 100.DOLLARS, buyerName = DUMMY_BANK_A_NAME, sellerName = DUMMY_BANK_B_NAME) MaxLineLength:TraderDemoTest.kt$TraderDemoTest$clientBank.runIssuer(amount = 100.DOLLARS, buyerName = nodeA.services.myInfo.singleIdentity().name, sellerName = nodeB.services.myInfo.singleIdentity().name) MaxLineLength:TraderDemoTest.kt$TraderDemoTest$val buyer2 = startNode(providedName = DUMMY_BANK_A_NAME, customOverrides = mapOf("p2pAddress" to buyer.p2pAddress.toString())).getOrThrow() - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$ @BelongsToContract, and does not have an enclosing class which implements Contract. Either annotate MaxLineLength:TransactionBuilder.kt$TransactionBuilder$ @Throws(MissingContractAttachments::class) fun toWireTransaction(services: ServicesForResolution): WireTransaction - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$ Please contact the developer of the CorDapp and install the latest version, as this approach might be insecure. - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$ fun setTimeWindow(time: Instant, timeTolerance: Duration) MaxLineLength:TransactionBuilder.kt$TransactionBuilder$ private fun attachmentConstraintsTransition( constraints: Set<AttachmentConstraint>, attachmentToUse: ContractAttachment, services: ServicesForResolution ): AttachmentConstraint MaxLineLength:TransactionBuilder.kt$TransactionBuilder$ private fun handleContract( contractClassName: ContractClassName, inputStates: List<TransactionState<ContractState>>?, outputStates: List<TransactionState<ContractState>>?, explicitContractAttachment: AttachmentId?, services: ServicesForResolution ): Pair<AttachmentId, List<TransactionState<ContractState>>?> MaxLineLength:TransactionBuilder.kt$TransactionBuilder$ private fun selectAttachmentConstraint( contractClassName: ContractClassName, inputStates: List<TransactionState<ContractState>>?, attachmentToUse: ContractAttachment, services: ServicesForResolution): AttachmentConstraint - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$ private fun selectContractAttachmentsAndOutputStateConstraints( services: ServicesForResolution, serializationContext: SerializationContext?): Pair<Collection<SecureHash>, List<TransactionState<ContractState>>> + MaxLineLength:TransactionBuilder.kt$TransactionBuilder$ private fun selectContractAttachmentsAndOutputStateConstraints( services: ServicesForResolution, @Suppress("UNUSED_PARAMETER") serializationContext: SerializationContext? ): Pair<Collection<SecureHash>, List<TransactionState<ContractState>>> MaxLineLength:TransactionBuilder.kt$TransactionBuilder$"An attachment has been explicitly set for contract $contractClassName in the transaction builder which conflicts with the HashConstraint of a state." MaxLineLength:TransactionBuilder.kt$TransactionBuilder$"Transaction was built with $contractClassName states with multiple HashConstraints. This is illegal, because it makes it impossible to validate with a single version of the contract code." MaxLineLength:TransactionBuilder.kt$TransactionBuilder$(allContractAttachments + attachments).toSortedSet().toList() - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$?: MaxLineLength:TransactionBuilder.kt$TransactionBuilder$@CordaInternal internal - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$@Throws(AttachmentResolutionException::class, TransactionResolutionException::class, TransactionVerificationException::class) - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$checkNotNull(notary) { "Need to specify a notary for the state, or set a default one on TransactionBuilder initialisation" } MaxLineLength:TransactionBuilder.kt$TransactionBuilder$constraints.any { it is WhitelistedByZoneAttachmentConstraint } && attachmentToUse.isSigned && services.networkParameters.minimumPlatformVersion >= 4 -> transitionToSignatureConstraint(constraints, attachmentToUse) - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$handleContract(ctr, inputContractGroups[ctr], outputContractGroups[ctr], explicitAttachmentContractsMap[ctr], services) MaxLineLength:TransactionBuilder.kt$TransactionBuilder$if ((attachment as ContractAttachment).isSigned && (explicitContractAttachment == null || explicitContractAttachment == attachment.id)) { val signatureConstraint = makeSignatureAttachmentConstraint(attachment.signerKeys) require(signatureConstraint.isSatisfiedBy(attachment)) { "Selected output constraint: $signatureConstraint not satisfying ${attachment.id}" } val resolvedOutputStates = outputStates?.map { if (it.constraint in automaticConstraints) { it.copy(constraint = signatureConstraint) } else { it } } return attachment.id to resolvedOutputStates } - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$if (attachment == null || attachment !is ContractAttachment || !isUploaderTrusted(attachment.uploader)) { // This should never happen because these are input states that should have been validated already. throw MissingContractAttachments(listOf(state)) } - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$inputStates != null -> attachmentConstraintsTransition(inputStates.groupBy { it.constraint }.keys, attachmentToUse, services) MaxLineLength:TransactionBuilder.kt$TransactionBuilder$internal MaxLineLength:TransactionBuilder.kt$TransactionBuilder$is CommandData -> throw IllegalArgumentException("You passed an instance of CommandData, but that lacks the pubkey. You need to wrap it in a Command object first.") - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$is ContractState -> throw UnsupportedOperationException("Removed as of V1: please use a StateAndContract instead") - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$log MaxLineLength:TransactionBuilder.kt$TransactionBuilder$log.warnOnce("Signature constraints not available on network requiring a minimum platform version of 4. Current is: ${services.networkParameters.minimumPlatformVersion}.") MaxLineLength:TransactionBuilder.kt$TransactionBuilder$private MaxLineLength:TransactionBuilder.kt$TransactionBuilder$private fun useWhitelistedByZoneAttachmentConstraint(contractClassName: ContractClassName, networkParameters: NetworkParameters) @@ -9050,333 +4889,140 @@ MaxLineLength:TransactionBuilder.kt$TransactionBuilder$require(defaultOutputConstraint.isSatisfiedBy(constraintAttachment)) { "Selected output constraint: $defaultOutputConstraint not satisfying $selectedAttachmentId" } MaxLineLength:TransactionBuilder.kt$TransactionBuilder$require(explicitAttachmentContracts.isEmpty() || explicitAttachmentContracts.groupBy { (ctr, _) -> ctr }.all { (_, groups) -> groups.size == 1 }) { "Multiple attachments set for the same contract." } MaxLineLength:TransactionBuilder.kt$TransactionBuilder$require(outputConstraint.canBeTransitionedFrom(input.constraint, attachmentToUse)) { "Output state constraint $outputConstraint cannot be transitioned from ${input.constraint}" } - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$require(outputConstraint.isSatisfiedBy(constraintAttachment)) { "Output state constraint check fails. $outputConstraint" } MaxLineLength:TransactionBuilder.kt$TransactionBuilder$require(signatureConstraint.isSatisfiedBy(attachment)) { "Selected output constraint: $signatureConstraint not satisfying ${attachment.id}" } - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$rootError is ClassNotFoundException -> addMissingAttachment((rootError.message ?: throw e).replace(".", "/"), services, e) - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$services: ServicesForResolution MaxLineLength:TransactionBuilder.kt$TransactionBuilder$throw IllegalArgumentException("Attempting to create an illegal transaction. Please install the latest signed version for the $attachmentToUse Cordapp.") MaxLineLength:TransactionBuilder.kt$TransactionBuilder$throw IllegalArgumentException("Can't mix the AlwaysAcceptAttachmentConstraint with a secure constraint in the same transaction. This can be used to hide insecure transitions.") - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$throw IllegalArgumentException("Cannot mix SignatureAttachmentConstraints signed by different parties in the same transaction.") - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$useWhitelistedByZoneAttachmentConstraint(contractClassName, services.networkParameters) -> WhitelistedByZoneAttachmentConstraint MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val (allContractAttachments: Collection<SecureHash>, resolvedOutputs: List<TransactionState<ContractState>>) = selectContractAttachmentsAndOutputStateConstraints(services, serializationContext) - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val attachment = services.attachments.openAttachment((state.constraint as HashAttachmentConstraint).attachmentId) - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val attachmentToUse = services.attachments.openAttachment(selectedAttachmentId)?.let { it as ContractAttachment } ?: throw IllegalArgumentException("Contract attachment $selectedAttachmentId for $contractClassName is missing.") MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val attachments: Collection<AttachmentId> = contractAttachmentsAndResolvedOutputStates.map { it.first } + refStateContractAttachments MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val automaticConstraintPropagation = contractClassName.contractHasAutomaticConstraintPropagation(inputsAndOutputs.first().data::class.java.classLoader) MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val constraintAttachment = AttachmentWithContext(attachmentToUse, contractClassName, services.networkParameters.whitelistedContractImplementations) MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val contractAttachmentsAndResolvedOutputStates: List<Pair<AttachmentId, List<TransactionState<ContractState>>?>> = allContracts.toSet() .map { ctr -> handleContract(ctr, inputContractGroups[ctr], outputContractGroups[ctr], explicitAttachmentContractsMap[ctr], services) } - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val defaultOutputConstraint = selectAttachmentConstraint(contractClassName, inputStates, attachmentToUse, services) - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val inputContractGroups: Map<ContractClassName, List<TransactionState<ContractState>>> = inputsWithTransactionState.map { it.state } .groupBy { it.contract } - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val outputContractGroups: Map<ContractClassName, List<TransactionState<ContractState>>> = outputs.groupBy { it.contract } MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val referenceStateGroups: Map<ContractClassName, List<TransactionState<ContractState>>> = referencesWithTransactionState.groupBy { it.contract } MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val resolvedOutputStatesInTheOriginalOrder: List<TransactionState<ContractState>> = outputStates().map { os -> resolvedStates.find { rs -> rs.data == os.data && rs.encumbrance == os.encumbrance }!! } - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val resolvedStates: List<TransactionState<ContractState>> = contractAttachmentsAndResolvedOutputStates.mapNotNull { it.second } .flatten() - MaxLineLength:TransactionBuilder.kt$TransactionBuilder$val signatureConstraint = constraints.singleOrNull { it is SignatureAttachmentConstraint } as? SignatureAttachmentConstraint MaxLineLength:TransactionBuilder.kt$TransactionBuilder$when { // Sanity check. constraints.isEmpty() -> throw IllegalArgumentException("Cannot transition from no constraints.") // Fail when combining the insecure AlwaysAcceptAttachmentConstraint with something else. constraints.size > 1 && constraints.any { it is AlwaysAcceptAttachmentConstraint } -> throw IllegalArgumentException("Can't mix the AlwaysAcceptAttachmentConstraint with a secure constraint in the same transaction. This can be used to hide insecure transitions.") // Multiple states with Hash constraints with different hashes. This should not happen as we checked already. constraints.size > 1 && constraints.all { it is HashAttachmentConstraint } -> throw IllegalArgumentException("Cannot mix HashConstraints with different hashes in the same transaction.") // The HashAttachmentConstraint is the strongest constraint, so it wins when mixed with anything. As long as the actual constraints pass. // Migration from HashAttachmentConstraint to SignatureAttachmentConstraint is handled in [TransactionBuilder.handleContract] // If we have reached this point, then no migration is possible and the existing HashAttachmentConstraint must be used constraints.any { it is HashAttachmentConstraint } -> constraints.find { it is HashAttachmentConstraint }!! // TODO, we don't currently support mixing signature constraints with different signers. This will change once we introduce third party signers. constraints.count { it is SignatureAttachmentConstraint } > 1 -> throw IllegalArgumentException("Cannot mix SignatureAttachmentConstraints signed by different parties in the same transaction.") // This ensures a smooth migration from a Whitelist Constraint to a Signature Constraint constraints.any { it is WhitelistedByZoneAttachmentConstraint } && attachmentToUse.isSigned && services.networkParameters.minimumPlatformVersion >= 4 -> transitionToSignatureConstraint(constraints, attachmentToUse) // This condition is hit when the current node has not installed the latest signed version but has already received states that have been migrated constraints.any { it is SignatureAttachmentConstraint } && !attachmentToUse.isSigned -> throw IllegalArgumentException("Attempting to create an illegal transaction. Please install the latest signed version for the $attachmentToUse Cordapp.") // When all input states have the same constraint. constraints.size == 1 -> constraints.single() else -> throw IllegalArgumentException("Unexpected constraints $constraints.") } MaxLineLength:TransactionBuilder.kt$TransactionBuilder${ // If the constraint on the output state is already set, and is not a valid transition or can't be transitioned, then fail early. inputStates?.forEach { input -> require(outputConstraint.canBeTransitionedFrom(input.constraint, attachmentToUse)) { "Output state constraint $outputConstraint cannot be transitioned from ${input.constraint}" } } require(outputConstraint.isSatisfiedBy(constraintAttachment)) { "Output state constraint check fails. $outputConstraint" } it } - MaxLineLength:TransactionBuilder.kt$TransactionBuilder${ // This should never happen because these are input states that should have been validated already. throw MissingContractAttachments(listOf(state)) } - MaxLineLength:TransactionBuilder.kt$TransactionBuilder${ val inputsAndOutputs = (inputStates ?: emptyList()) + (outputStates ?: emptyList()) fun selectAttachment() = getInstalledContractAttachmentId( contractClassName, inputsAndOutputs.filterNot { it.constraint in automaticConstraints }, services ) /* This block handles the very specific code path where a [HashAttachmentConstraint] can migrate to a [SignatureAttachmentConstraint]. If all the criteria is met, this function will return early as the rest of the logic is no longer required. This can only happen in a private network where all nodes have started with a system parameter that disables the hash constraint check. */ if (canMigrateFromHashToSignatureConstraint(inputStates, outputStates, services)) { val attachmentId = selectAttachment() val attachment = services.attachments.openAttachment(attachmentId) require(attachment != null) { "Contract attachment $attachmentId for $contractClassName is missing." } if ((attachment as ContractAttachment).isSigned && (explicitContractAttachment == null || explicitContractAttachment == attachment.id)) { val signatureConstraint = makeSignatureAttachmentConstraint(attachment.signerKeys) require(signatureConstraint.isSatisfiedBy(attachment)) { "Selected output constraint: $signatureConstraint not satisfying ${attachment.id}" } val resolvedOutputStates = outputStates?.map { if (it.constraint in automaticConstraints) { it.copy(constraint = signatureConstraint) } else { it } } return attachment.id to resolvedOutputStates } } // Determine if there are any HashConstraints that pin the version of a contract. If there are, check if we trust them. val hashAttachments = inputsAndOutputs .filter { it.constraint is HashAttachmentConstraint } .map { state -> val attachment = services.attachments.openAttachment((state.constraint as HashAttachmentConstraint).attachmentId) if (attachment == null || attachment !is ContractAttachment || !isUploaderTrusted(attachment.uploader)) { // This should never happen because these are input states that should have been validated already. throw MissingContractAttachments(listOf(state)) } attachment }.toSet() // Check that states with the HashConstraint don't conflict between themselves or with an explicitly set attachment. require(hashAttachments.size <= 1) { "Transaction was built with $contractClassName states with multiple HashConstraints. This is illegal, because it makes it impossible to validate with a single version of the contract code." } if (explicitContractAttachment != null && hashAttachments.singleOrNull() != null) { require(explicitContractAttachment == (hashAttachments.single() as ContractAttachment).attachment.id) { "An attachment has been explicitly set for contract $contractClassName in the transaction builder which conflicts with the HashConstraint of a state." } } // This will contain the hash of the JAR that *has* to be used by this Transaction, because it is explicit. Or null if none. val forcedAttachmentId = explicitContractAttachment ?: hashAttachments.singleOrNull()?.id // This will contain the hash of the JAR that will be used by this Transaction. val selectedAttachmentId = forcedAttachmentId ?: selectAttachment() val attachmentToUse = services.attachments.openAttachment(selectedAttachmentId)?.let { it as ContractAttachment } ?: throw IllegalArgumentException("Contract attachment $selectedAttachmentId for $contractClassName is missing.") // For Exit transactions (no output states) there is no need to resolve the output constraints. if (outputStates == null) { return Pair(selectedAttachmentId, null) } // If there are no automatic constraints, there is nothing to resolve. if (outputStates.none { it.constraint in automaticConstraints }) { return Pair(selectedAttachmentId, outputStates) } // The final step is to resolve AutomaticPlaceholderConstraint. val automaticConstraintPropagation = contractClassName.contractHasAutomaticConstraintPropagation(inputsAndOutputs.first().data::class.java.classLoader) // When automaticConstraintPropagation is disabled for a contract, output states must an explicit Constraint. require(automaticConstraintPropagation) { "Contract $contractClassName was marked with @NoConstraintPropagation, which means the constraint of the output states has to be set explicitly." } // This is the logic to determine the constraint which will replace the AutomaticPlaceholderConstraint. val defaultOutputConstraint = selectAttachmentConstraint(contractClassName, inputStates, attachmentToUse, services) // Sanity check that the selected attachment actually passes. val constraintAttachment = AttachmentWithContext(attachmentToUse, contractClassName, services.networkParameters.whitelistedContractImplementations) require(defaultOutputConstraint.isSatisfiedBy(constraintAttachment)) { "Selected output constraint: $defaultOutputConstraint not satisfying $selectedAttachmentId" } val resolvedOutputStates = outputStates.map { val outputConstraint = it.constraint if (outputConstraint in automaticConstraints) { it.copy(constraint = defaultOutputConstraint) } else { // If the constraint on the output state is already set, and is not a valid transition or can't be transitioned, then fail early. inputStates?.forEach { input -> require(outputConstraint.canBeTransitionedFrom(input.constraint, attachmentToUse)) { "Output state constraint $outputConstraint cannot be transitioned from ${input.constraint}" } } require(outputConstraint.isSatisfiedBy(constraintAttachment)) { "Output state constraint check fails. $outputConstraint" } it } } return Pair(selectedAttachmentId, resolvedOutputStates) } MaxLineLength:TransactionBuilder.kt$TransactionBuilder${ val signatureConstraint = constraints.singleOrNull { it is SignatureAttachmentConstraint } as? SignatureAttachmentConstraint // If there were states transitioned already used in the current transaction use that signature constraint, otherwise create a new one. return when { signatureConstraint != null -> signatureConstraint else -> makeSignatureAttachmentConstraint(attachmentToUse.signerKeys) } } - MaxLineLength:TransactionBuilderTest.kt$TransactionBuilderTest$assertThat(wtx.outputs).containsOnly(outputState.copy(constraint = HashAttachmentConstraint(contractAttachmentId))) - MaxLineLength:TransactionBuilderTest.kt$TransactionBuilderTest$private - MaxLineLength:TransactionDSLInterpreter.kt$TransactionDSL$ fun input(stateLabel: String) - MaxLineLength:TransactionDSLInterpreter.kt$TransactionDSL$ fun reference(stateLabel: String) MaxLineLength:TransactionDSLInterpreter.kt$TransactionDSL$fun attachment(contractClassName: ContractClassName, attachmentId: AttachmentId) MaxLineLength:TransactionDSLInterpreter.kt$TransactionDSL$fun attachment(contractClassName: ContractClassName, attachmentId: AttachmentId, signers: List<PublicKey>, jarManifestAttributes: Map<String,String> = emptyMap()) MaxLineLength:TransactionDSLInterpreter.kt$TransactionDSL<out T : TransactionDSLInterpreter> : TransactionDSLInterpreter MaxLineLength:TransactionDSLInterpreter.kt$TransactionDSLInterpreter$ fun _attachment(contractClassName: ContractClassName, attachmentId: AttachmentId, signers: List<PublicKey>, jarManifestAttributes: Map<String,String>) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 0, AutomaticPlaceholderConstraint) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 0, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 3, AutomaticPlaceholderConstraint) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 0, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 3, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY2, 2, AutomaticPlaceholderConstraint) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 3, AutomaticPlaceholderConstraint) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 3, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY2, 0, AutomaticPlaceholderConstraint) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 3, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY2, 0, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 2, AutomaticPlaceholderConstraint) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY2, 0, AutomaticPlaceholderConstraint) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$assertThatExceptionOfType(TransactionVerificationException.TransactionNotaryMismatchEncumbranceException::class.java) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$assertThatExceptionOfType(TransactionVerificationException.TransactionNotaryMismatchEncumbranceException::class.java) .isThrownBy { TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 0, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 3, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY2, 2, AutomaticPlaceholderConstraint) .addCommand(Cash.Commands.Issue(), MEGA_CORP.owningKey) .toLedgerTransaction(ledgerServices) .verify() } .withMessageContaining("index 2 is assigned to notary [O=Notary Service, L=Zurich, C=CH], while its encumbrance with " + "index 3 is assigned to notary [O=Notary Service2, L=Zurich, C=CH]") - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$assertThatExceptionOfType(TransactionVerificationException.TransactionNotaryMismatchEncumbranceException::class.java) .isThrownBy { TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 3, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY2, 0, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 2, AutomaticPlaceholderConstraint) .addCommand(Cash.Commands.Issue(), MEGA_CORP.owningKey) .toLedgerTransaction(ledgerServices) .verify() } .withMessageContaining("index 3 is assigned to notary [O=Notary Service, L=Zurich, C=CH], while its encumbrance with " + "index 2 is assigned to notary [O=Notary Service2, L=Zurich, C=CH]") - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by 5pm time-lock A", encumbrance = 2, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by 5pm time-lock A", encumbrance = 3, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by 5pm time-lock B", encumbrance = 3, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by 5pm time-lock B", encumbrance = 4, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by 5pm time-lock C", encumbrance = 5, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by 5pm time-lock", encumbrance = 1, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by itself", encumbrance = 0, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by state 0", encumbrance = 0, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by state 1", encumbrance = 1, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by state 2", encumbrance = 2, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by state 3 again", encumbrance = 3, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(Cash.PROGRAM_ID, "state encumbered by state 3", encumbrance = 3, contractState = stateWithNewOwner) MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests$output(TEST_TIMELOCK_ID, "state encumbered by state 2 which does not exist", encumbrance = 2, contractState = stateWithNewOwner) - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests${ // Single encumbrance with different notaries. assertFailsWith<TransactionVerificationException.TransactionNotaryMismatchEncumbranceException> { TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY2, 0, AutomaticPlaceholderConstraint) .addCommand(Cash.Commands.Issue(), MEGA_CORP.owningKey) .toLedgerTransaction(ledgerServices) .verify() } // More complex encumbrance (full cycle of size 4) where one of the encumbered states is assigned to a different notary. // 0 -> 1, 1 -> 3, 3 -> 2, 2 -> 0 // We expect that state at index 3 cannot be encumbered with the state at index 2, due to mismatched notaries. assertThatExceptionOfType(TransactionVerificationException.TransactionNotaryMismatchEncumbranceException::class.java) .isThrownBy { TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 3, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY2, 0, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 2, AutomaticPlaceholderConstraint) .addCommand(Cash.Commands.Issue(), MEGA_CORP.owningKey) .toLedgerTransaction(ledgerServices) .verify() } .withMessageContaining("index 3 is assigned to notary [O=Notary Service, L=Zurich, C=CH], while its encumbrance with " + "index 2 is assigned to notary [O=Notary Service2, L=Zurich, C=CH]") // Two different encumbrance chains, where only one fails due to mismatched notary. // 0 -> 1, 1 -> 0, 2 -> 3, 3 -> 2 where encumbered states with indices 2 and 3, respectively, are assigned // to different notaries. assertThatExceptionOfType(TransactionVerificationException.TransactionNotaryMismatchEncumbranceException::class.java) .isThrownBy { TransactionBuilder() .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 1, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 0, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY, 3, AutomaticPlaceholderConstraint) .addOutputState(stateWithNewOwner, Cash.PROGRAM_ID, DUMMY_NOTARY2, 2, AutomaticPlaceholderConstraint) .addCommand(Cash.Commands.Issue(), MEGA_CORP.owningKey) .toLedgerTransaction(ledgerServices) .verify() } .withMessageContaining("index 2 is assigned to notary [O=Notary Service, L=Zurich, C=CH], while its encumbrance with " + "index 3 is assigned to notary [O=Notary Service2, L=Zurich, C=CH]") } - MaxLineLength:TransactionEncumbranceTests.kt$TransactionEncumbranceTests.Companion$val DUMMY_NOTARY2 = TestIdentity(DUMMY_NOTARY_NAME.copy(organisation = "${DUMMY_NOTARY_NAME.organisation}2"), 30).party - MaxLineLength:TransactionGenerator.kt$TransactionGenerator$output(PROGRAM_ID, "c1", State(1000.POUNDS `issued by` DUMMY_CASH_ISSUER, AnonymousParty(MEGA_CORP_PUBKEY))) - MaxLineLength:TransactionGenerator.kt$TransactionGenerator$output(PROGRAM_ID, "c2", State(2000.POUNDS `issued by` DUMMY_CASH_ISSUER, AnonymousParty(MEGA_CORP_PUBKEY))) - MaxLineLength:TransactionGenerator.kt$TransactionGenerator$output(PROGRAM_ID, "c3", State(3000.POUNDS `issued by` DUMMY_CASH_ISSUER, AnonymousParty(MINI_CORP_PUBKEY))) MaxLineLength:TransactionGenerator.kt$TransactionGenerator$private val DUMMY_CASH_ISSUER_IDENTITY = getTestPartyAndCertificate(Party(CordaX500Name("Snake Oil Issuer", "London", "GB"), DUMMY_CASH_ISSUER_KEY.public)) MaxLineLength:TransactionGenerator.kt$TransactionGenerator$val contractAttachment = MockContractAttachment(interpreter.services.cordappProvider.getContractAttachmentID(PROGRAM_ID)!!, PROGRAM_ID) - MaxLineLength:TransactionGraphSearch.kt$TransactionGraphSearch$Query MaxLineLength:TransactionGraphSearch.kt$TransactionGraphSearch$val unvisitedInputTxs: Map<SecureHash, SignedTransaction> = inputsLeadingToUnvisitedTx.map { it.txhash }.toHashSet().mapNotNull { transactions.getTransaction(it) }.associateBy { it.id } MaxLineLength:TransactionGraphSearch.kt$TransactionGraphSearch$val unvisitedInputTxsWithInputIndex: Iterable<Pair<SignedTransaction, Int>> = inputsLeadingToUnvisitedTx.filter { it.txhash in unvisitedInputTxs.keys }.map { Pair(unvisitedInputTxs[it.txhash]!!, it.index) } - MaxLineLength:TransactionGraphSearchTests.kt$TransactionGraphSearchTests$GraphTransactionStorage : MockTransactionStorage - MaxLineLength:TransactionGraphSearchTests.kt$TransactionGraphSearchTests$val megaCorpServices = MockServices(listOf("net.corda.testing.contracts"), megaCorp, rigorousMock<IdentityService>()) - MaxLineLength:TransactionGraphSearchTests.kt$TransactionGraphSearchTests$val notaryServices = MockServices(listOf("net.corda.testing.contracts"), dummyNotary, rigorousMock<IdentityService>()) MaxLineLength:TransactionGraphSearchTests.kt$TransactionGraphSearchTests$val search = TransactionGraphSearch(storage, listOf(storage.inputTx.tx), TransactionGraphSearch.Query(DummyContract.Commands.Create::class.java)) MaxLineLength:TransactionSerializationTests.kt$TransactionSerializationTests$inputState = StateAndRef(TransactionState(TestCash.State(depositRef, 100.POUNDS, MEGA_CORP), TEST_CASH_PROGRAM_ID, DUMMY_NOTARY, constraint = AlwaysAcceptAttachmentConstraint), fakeStateRef) MaxLineLength:TransactionSerializationTests.kt$TransactionSerializationTests$tx = TransactionBuilder(DUMMY_NOTARY).withItems(inputState, outputState, changeState, Command(TestCash.Commands.Move(), arrayListOf(MEGA_CORP.owningKey))) - MaxLineLength:TransactionSerializationTests.kt$TransactionSerializationTests$val changeState = TransactionState(TestCash.State(depositRef, 400.POUNDS, MEGA_CORP), TEST_CASH_PROGRAM_ID, DUMMY_NOTARY) MaxLineLength:TransactionSerializationTests.kt$TransactionSerializationTests$val fakeTx = megaCorpServices.signInitialTransaction(TransactionBuilder(DUMMY_NOTARY).withItems(outputState, Command(TestCash.Commands.Issue(), arrayListOf(MEGA_CORP.owningKey)))) MaxLineLength:TransactionSerializationTests.kt$TransactionSerializationTests$val megaCorpServices = object : MockServices(listOf("net.corda.coretests.serialization"), MEGA_CORP.name, mock(), testNetworkParameters(notaries = listOf(NotaryInfo(DUMMY_NOTARY, true))), MEGA_CORP_KEY) { //override mock implementation with a real one override fun loadContractAttachment(stateRef: StateRef): Attachment = servicesForResolution.loadContractAttachment(stateRef) } - MaxLineLength:TransactionSerializationTests.kt$TransactionSerializationTests$val notaryServices = MockServices(listOf("net.corda.coretests.serialization"), DUMMY_NOTARY.name, rigorousMock(), DUMMY_NOTARY_KEY) - MaxLineLength:TransactionSerializationTests.kt$TransactionSerializationTests$val outputState = TransactionState(TestCash.State(depositRef, 600.POUNDS, MEGA_CORP), TEST_CASH_PROGRAM_ID, DUMMY_NOTARY) MaxLineLength:TransactionSerializationTests.kt$TransactionSerializationTests$val signatures = listOf(TransactionSignature(ByteArray(1), MEGA_CORP_KEY.public, SignatureMetadata(1, Crypto.findSignatureScheme(MEGA_CORP_KEY.public).schemeNumberID))) - MaxLineLength:TransactionSerializationTests.kt$TransactionSerializationTests.<no name provided>$override - MaxLineLength:TransactionSerializationTests.kt$TransactionSerializationTests.TestCash.State$override fun withNewOwner(newOwner: AbstractParty) MaxLineLength:TransactionSignature.kt$TransactionSignature : DigitalSignature MaxLineLength:TransactionSignature.kt$TransactionSignature$ @Throws(InvalidKeyException::class, SignatureException::class) fun verify(txId: SecureHash) - MaxLineLength:TransactionSignature.kt$TransactionSignature$/** * Construct a [TransactionSignature] with [partialMerkleTree] set to null. * This is the recommended constructor when signing over a single transaction. * */ constructor(bytes: ByteArray, by: PublicKey, signatureMetadata: SignatureMetadata) : this(bytes, by, signatureMetadata, null) - MaxLineLength:TransactionSignatureTest.kt$TransactionSignatureTest$val signableData = SignableData(testBytes.sha256(), SignatureMetadata(1, Crypto.findSignatureScheme(keyPair.public).schemeNumberID)) - MaxLineLength:TransactionSignatureTest.kt$TransactionSignatureTest$val signableData = SignableData(txId, SignatureMetadata(3, Crypto.findSignatureScheme(keyPair.public).schemeNumberID)) - MaxLineLength:TransactionSignatureTest.kt$TransactionSignatureTest$val txSignatureWithFullTree = TransactionSignature(txSignature.bytes, txSignature.by, txSignature.signatureMetadata, pmtFull) - MaxLineLength:TransactionSignatureTest.kt$TransactionSignatureTest$val txSignatureWithTree = TransactionSignature(txSignature.bytes, txSignature.by, txSignature.signatureMetadata, pmt) - MaxLineLength:TransactionSignatureTest.kt$TransactionSignatureTest${ val keyPair = Crypto.deriveKeyPairFromEntropy(Crypto.EDDSA_ED25519_SHA512, BigInteger.valueOf(1234567890L)) val txId = "aTransaction".toByteArray().sha256() // One-tx signature. val txSignature = signOneTx(txId, keyPair) // partialMerkleTree should be null. assertNull(txSignature.partialMerkleTree) // Verify the corresponding txId with every possible way. assertTrue(Crypto.doVerify(txId, txSignature)) assertTrue(txSignature.verify(txId)) assertTrue(Crypto.isValid(txId, txSignature)) assertTrue(txSignature.isValid(txId)) // We signed the txId itself, not its hash (because it was a signature over one tx only and no partial tree has been received). assertFailsWith<SignatureException> { Crypto.doVerify(txId.sha256(), txSignature) } } - MaxLineLength:TransactionSignatureTest.kt$TransactionSignatureTest${ val txId = "aTransaction".toByteArray().sha256() // One-tx signature. val txSignature = try { signOneTx(txId, keyPair) } catch (e: Throwable) { e.cause?.printStackTrace() throw e } // partialMerkleTree should be null. assertNull(txSignature.partialMerkleTree) // Verify the corresponding txId with every possible way. assertTrue(Crypto.doVerify(txId, txSignature)) assertTrue(txSignature.verify(txId)) assertTrue(Crypto.isValid(txId, txSignature)) assertTrue(txSignature.isValid(txId)) // We signed the txId itself, not its hash (because it was a signature over one tx only and no partial tree has been received). assertFailsWith<SignatureException> { Crypto.doVerify(txId.sha256(), txSignature) } } - MaxLineLength:TransactionState.kt$TransactionState$ @BelongsToContract, and does not have an enclosing class which implements Contract. Either annotate - MaxLineLength:TransactionState.kt$TransactionState$/** * All contract states may be _encumbered_ by up to one other state. * * The encumbrance state, if present, forces additional controls over the encumbered state, since the platform checks * that the encumbrance state is present as an input in the same transaction that consumes the encumbered state, and * the contract code and rules of the encumbrance state will also be verified during the execution of the transaction. * For example, a cash contract state could be encumbered with a time-lock contract state; the cash state is then only * processable in a transaction that verifies that the time specified in the encumbrance time-lock has passed. * * The encumbered state refers to another by index, and the referred encumbrance state * is an output state in a particular position on the same transaction that created the encumbered state. An alternative * implementation would be encumbering by reference to a [StateRef], which would allow the specification of encumbrance * by a state created in a prior transaction. * * Note that an encumbered state that is being consumed must have its encumbrance consumed in the same transaction, * otherwise the transaction is not valid. */ val encumbrance: Int? = null MaxLineLength:TransactionTests.kt$TransactionTests$assertFailsWith<SignedTransaction.SignaturesMissingException> { makeSigned(wtx, DUMMY_CASH_ISSUER_KEY).verifySignaturesExcept(DUMMY_KEY_1.public) }.missing MaxLineLength:TransactionTests.kt$TransactionTests$assertFailsWith<SignedTransaction.SignaturesMissingException> { makeSigned(wtx, DUMMY_KEY_1).verifyRequiredSignatures() }.missing MaxLineLength:TransactionTests.kt$TransactionTests$assertFailsWith<SignedTransaction.SignaturesMissingException> { makeSigned(wtx, DUMMY_KEY_1, ak).verifyRequiredSignatures() }.missing MaxLineLength:TransactionTests.kt$TransactionTests$assertFailsWith<SignedTransaction.SignaturesMissingException> { makeSigned(wtx, DUMMY_KEY_2).verifyRequiredSignatures() }.missing - MaxLineLength:TransactionTests.kt$TransactionTests$assertFailsWith<TransactionVerificationException.NotaryChangeInWrongTransactionType> { buildTransaction().verify() } MaxLineLength:TransactionTests.kt$TransactionTests$keySigs + DUMMY_NOTARY_KEY.sign(SignableData(wtx.id, SignatureMetadata(1, Crypto.findSignatureScheme(DUMMY_NOTARY_KEY.public).schemeNumberID))) - MaxLineLength:TransactionTests.kt$TransactionTests$makeSigned(wtx, DUMMY_KEY_1, ak).verifySignaturesExcept(compKey, DUMMY_KEY_2.public) MaxLineLength:TransactionTests.kt$TransactionTests$val baseOutState = TransactionState(DummyContract.SingleOwnerState(0, ALICE), DummyContract.PROGRAM_ID, DUMMY_NOTARY, constraint = AlwaysAcceptAttachmentConstraint) - MaxLineLength:TransactionTests.kt$TransactionTests$val keySigs = keys.map { it.sign(SignableData(wtx.id, SignatureMetadata(1, Crypto.findSignatureScheme(it.public).schemeNumberID))) } - MaxLineLength:TransactionTests.kt$TransactionTests$val outputState = TransactionState(DummyContract.SingleOwnerState(0, ALICE), DummyContract.PROGRAM_ID, DUMMY_NOTARY) MaxLineLength:TransactionUtils.kt$ fun <T : Any> deserialiseComponentGroup(componentGroups: List<ComponentGroup>, clazz: KClass<T>, groupEnum: ComponentGroupEnum, forceDeserialize: Boolean = false, factory: SerializationFactory = SerializationFactory.defaultFactory, context: SerializationContext = factory.defaultContext): List<T> - MaxLineLength:TransactionUtils.kt$ fun isAttachmentTrusted(attachment: Attachment, service: AttachmentStorage?): Boolean - MaxLineLength:TransactionUtils.kt$"Invalid Transaction. Sizes of CommandData (${commandDataList.size}) and Signers (${signersList.size}) do not match" MaxLineLength:TransactionUtils.kt$ContractUpgradeTransactionBuilder$val components = listOf(inputs, notary, legacyContractAttachmentId, upgradedContractClassName, upgradedContractAttachmentId, networkParametersHash).map { it.serialize() } - MaxLineLength:TransactionUtils.kt$SerializedStateAndRef$@KeepForDJVM data - MaxLineLength:TransactionUtils.kt$check(leafIndices.max()!! < signersList.size) { "Invalid Transaction. A command with no corresponding signer detected" } MaxLineLength:TransactionUtils.kt$if (attachments.isNotEmpty()) componentGroupMap.add(ComponentGroup(ComponentGroupEnum.ATTACHMENTS_GROUP.ordinal, attachments.lazyMapped(serialize))) MaxLineLength:TransactionUtils.kt$if (commands.isNotEmpty()) componentGroupMap.add(ComponentGroup(ComponentGroupEnum.COMMANDS_GROUP.ordinal, commands.map { it.value }.lazyMapped(serialize))) MaxLineLength:TransactionUtils.kt$if (commands.isNotEmpty()) componentGroupMap.add(ComponentGroup(ComponentGroupEnum.SIGNERS_GROUP.ordinal, commands.map { it.signers }.lazyMapped(serialize))) - MaxLineLength:TransactionUtils.kt$if (inputs.isNotEmpty()) componentGroupMap.add(ComponentGroup(ComponentGroupEnum.INPUTS_GROUP.ordinal, inputs.lazyMapped(serialize))) MaxLineLength:TransactionUtils.kt$if (networkParametersHash != null) componentGroupMap.add(ComponentGroup(ComponentGroupEnum.PARAMETERS_GROUP.ordinal, listOf(networkParametersHash.serialize()))) - MaxLineLength:TransactionUtils.kt$if (notary != null) componentGroupMap.add(ComponentGroup(ComponentGroupEnum.NOTARY_GROUP.ordinal, listOf(notary).lazyMapped(serialize))) - MaxLineLength:TransactionUtils.kt$if (outputs.isNotEmpty()) componentGroupMap.add(ComponentGroup(ComponentGroupEnum.OUTPUTS_GROUP.ordinal, outputs.lazyMapped(serialize))) MaxLineLength:TransactionUtils.kt$if (references.isNotEmpty()) componentGroupMap.add(ComponentGroup(ComponentGroupEnum.REFERENCES_GROUP.ordinal, references.lazyMapped(serialize))) MaxLineLength:TransactionUtils.kt$if (timeWindow != null) componentGroupMap.add(ComponentGroup(ComponentGroupEnum.TIMEWINDOW_GROUP.ordinal, listOf(timeWindow).lazyMapped(serialize))) MaxLineLength:TransactionUtils.kt$serviceHub.networkParametersService.lookup(networkParametersHash) ?: throw IllegalArgumentException("Transaction for notarisation contains unknown parameters hash: $networkParametersHash") MaxLineLength:TransactionUtils.kt$val commandDataList: List<CommandData> = deserialiseComponentGroup(componentGroups, CommandData::class, ComponentGroupEnum.COMMANDS_GROUP, forceDeserialize) - MaxLineLength:TransactionUtils.kt$val componentHashes = group.components.mapIndexed { index, component -> componentHash(group.nonces[index], component) } MaxLineLength:TransactionUtils.kt$val signersList: List<List<PublicKey>> = uncheckedCast(deserialiseComponentGroup(componentGroups, List::class, ComponentGroupEnum.SIGNERS_GROUP, forceDeserialize)) - MaxLineLength:TransactionUtils.kt${ // Transactions created on Corda 3.x or below do not contain network parameters, // so no checking is done until the minimum platform version is at least 4. if (networkParametersHash == null) { if (serviceHub.networkParameters.minimumPlatformVersion < 4) return else throw IllegalArgumentException("Transaction for notarisation doesn't contain network parameters hash.") } else { serviceHub.networkParametersService.lookup(networkParametersHash) ?: throw IllegalArgumentException("Transaction for notarisation contains unknown parameters hash: $networkParametersHash") } // TODO: [ENT-2666] Implement network parameters fuzzy checking. By design in Corda network we have propagation time delay. // We will never end up in perfect synchronization with all the nodes. However, network parameters update process // lets us predict what is the reasonable time window for changing parameters on most of the nodes. // For now we don't check whether the attached network parameters match the current ones. } MaxLineLength:TransactionVerificationException.kt$TransactionResolutionException$@KeepForDJVM open MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$ConflictingAttachmentsRejection : TransactionVerificationException MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$ConstraintPropagationRejection : TransactionVerificationException MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$ContractCreationError : TransactionVerificationException MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$ContractRejection : TransactionVerificationException - MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$Direction MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$InvalidAttachmentException : TransactionVerificationException - MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$InvalidNotaryChange : TransactionVerificationException - MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$MissingAttachmentRejection : TransactionVerificationException MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$MissingNetworkParametersException : TransactionVerificationException MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$NotaryChangeInWrongTransactionType : TransactionVerificationException MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$OverlappingAttachmentsException : TransactionVerificationException MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$PackageOwnershipException : TransactionVerificationException MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$SignersMissing : TransactionVerificationException - MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$TransactionContractConflictException : TransactionVerificationException MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$TransactionNetworkParameterOrderingException : TransactionVerificationException MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$TransactionNotaryMismatchEncumbranceException : TransactionVerificationException - MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException$UntrustedAttachmentsException : CordaException - MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException${ /** * Indicates that one of the [Contract.verify] methods selected by the contract constraints and attachments * rejected the transaction by throwing an exception. * * @property contractClass The fully qualified class name of the failing contract. */ @KeepForDJVM class ContractRejection internal constructor(txId: SecureHash, val contractClass: String, cause: Throwable?, message: String) : TransactionVerificationException(txId, "Contract verification failed: $message, contract: $contractClass", cause) { internal constructor(txId: SecureHash, contract: Contract, cause: Throwable) : this(txId, contract.javaClass.name, cause, cause.message ?: "") } /** * This exception happens when a transaction was not built correctly. * When a contract is not annotated with [NoConstraintPropagation], then the platform ensures that the constraints of output states transition correctly from input states. * * @property txId The transaction. * @property contractClass The fully qualified class name of the failing contract. * @property inputConstraint The constraint of the input state. * @property outputConstraint The constraint of the outputs state. */ @KeepForDJVM class ConstraintPropagationRejection(txId: SecureHash, val contractClass: String, inputConstraint: AttachmentConstraint, outputConstraint: AttachmentConstraint) : TransactionVerificationException(txId, "Contract constraints for $contractClass are not propagated correctly. The outputConstraint: $outputConstraint is not a valid transition from the input constraint: $inputConstraint.", null) /** * The transaction attachment that contains the [contractClass] class didn't meet the constraints specified by * the [TransactionState.constraint] object. This usually implies a version mismatch of some kind. * * @property contractClass The fully qualified class name of the failing contract. */ @KeepForDJVM class ContractConstraintRejection(txId: SecureHash, val contractClass: String) : TransactionVerificationException(txId, "Contract constraints failed for $contractClass", null) /** * A state requested a contract class via its [TransactionState.contract] field that didn't appear in any attached * JAR at all. This usually implies the attachments were forgotten or a version mismatch. * * @property contractClass The fully qualified class name of the failing contract. */ @KeepForDJVM class MissingAttachmentRejection(txId: SecureHash, val contractClass: String) : TransactionVerificationException(txId, "Contract constraints failed, could not find attachment for: $contractClass", null) /** * Indicates this transaction violates the "no overlap" rule: two attachments are trying to provide the same file * path. Whereas Java classpaths would normally allow that with the first class taking precedence, this is not * allowed in transactions for security reasons. This usually indicates that two separate apps share a dependency, * in which case you could try 'shading the fat jars' to rename classes of dependencies. Or you could manually * attach dependency JARs when building the transaction. * * @property contractClass The fully qualified class name of the failing contract. */ @KeepForDJVM class ConflictingAttachmentsRejection(txId: SecureHash, val contractClass: String) : TransactionVerificationException(txId, "Contract constraints failed for: $contractClass, because multiple attachments providing this contract were attached.", null) /** * Indicates that the same attachment has been added multiple times to a transaction. */ @KeepForDJVM class DuplicateAttachmentsRejection(txId: SecureHash, val attachmentId: Attachment) : TransactionVerificationException(txId, "The attachment: $attachmentId was added multiple times.", null) /** * A [Contract] class named by a state could not be constructed. Most likely you do not have a no-argument * constructor, or the class doesn't subclass [Contract]. * * @property contractClass The fully qualified class name of the failing contract. */ @KeepForDJVM class ContractCreationError internal constructor(txId: SecureHash, val contractClass: String, cause: Throwable?, message: String) : TransactionVerificationException(txId, "Contract verification failed: $message, could not create contract class: $contractClass", cause) { internal constructor(txId: SecureHash, contractClass: String, cause: Throwable) : this(txId, contractClass, cause, cause.message ?: "") } /** * An output state has a notary that doesn't match the transaction's notary field. It must! * * @property txNotary the [Party] specified by the transaction header. * @property outputNotary the [Party] specified by the errant state. */ @KeepForDJVM class NotaryChangeInWrongTransactionType(txId: SecureHash, val txNotary: Party, val outputNotary: Party) : TransactionVerificationException(txId, "Found unexpected notary change in transaction. Tx notary: $txNotary, found: $outputNotary", null) /** * If a state is encumbered (the [TransactionState.encumbrance] field is set) then its encumbrance must be used * as an input to any transaction that uses it. In this way states can be tied together in chains, thus composing * logic. Note that encumbrances aren't fully supported by all aspects of the platform at this time so if you use * them, you may find transactions created by the platform don't always respect the encumbrance rule. * * @property missing the index of the state missing the encumbrance. * @property inOut whether the issue exists in the input list or output list. */ @KeepForDJVM class TransactionMissingEncumbranceException(txId: SecureHash, val missing: Int, val inOut: Direction) : TransactionVerificationException(txId, "Missing required encumbrance $missing in $inOut", null) /** * If two or more states refer to another state (as their encumbrance), then the bi-directionality property cannot * be satisfied. */ @KeepForDJVM class TransactionDuplicateEncumbranceException(txId: SecureHash, index: Int) : TransactionVerificationException(txId, "The bi-directionality property of encumbered output states " + "is not satisfied. Index $index is referenced more than once", null) /** * An encumbered state should also be referenced as the encumbrance of another state in order to satisfy the * bi-directionality property (a full cycle should be present). */ @KeepForDJVM class TransactionNonMatchingEncumbranceException(txId: SecureHash, nonMatching: Collection<Int>) : TransactionVerificationException(txId, "The bi-directionality property of encumbered output states " + "is not satisfied. Encumbered states should also be referenced as an encumbrance of another state to form " + "a full cycle. Offending indices $nonMatching", null) /** * All encumbered states should be assigned to the same notary. This is due to the fact that multi-notary * transactions are not supported and thus two encumbered states with different notaries cannot be consumed * in the same transaction. */ @KeepForDJVM class TransactionNotaryMismatchEncumbranceException(txId: SecureHash, encumberedIndex: Int, encumbranceIndex: Int, encumberedNotary: Party, encumbranceNotary: Party) : TransactionVerificationException(txId, "Encumbered output states assigned to different notaries found. " + "Output state with index $encumberedIndex is assigned to notary [$encumberedNotary], while its encumbrance with index $encumbranceIndex is assigned to notary [$encumbranceNotary]", null) /** * If a state is identified as belonging to a contract, either because the state class is defined as an inner class * of the contract class or because the state class is annotated with [BelongsToContract], then it must not be * bundled in a [TransactionState] with a different contract. * * @param state The [TransactionState] whose bundled state and contract are in conflict. * @param requiredContractClassName The class name of the contract to which the state belongs. */ @KeepForDJVM class TransactionContractConflictException(txId: SecureHash, state: TransactionState<ContractState>, requiredContractClassName: String) : TransactionVerificationException(txId, """ State of class ${state.data::class.java.typeName} belongs to contract $requiredContractClassName, but is bundled in TransactionState with ${state.contract}. For details see: https://docs.corda.net/api-contract-constraints.html#contract-state-agreement """.trimIndent().replace('\n', ' '), null) // TODO: add reference to documentation @KeepForDJVM class TransactionRequiredContractUnspecifiedException(txId: SecureHash, state: TransactionState<ContractState>) : TransactionVerificationException(txId, """ State of class ${state.data::class.java.typeName} does not have a specified owning contract. Add the @BelongsToContract annotation to this class to ensure that it can only be bundled in a TransactionState with the correct contract. For details see: https://docs.corda.net/api-contract-constraints.html#contract-state-agreement """.trimIndent(), null) /** * If the network parameters associated with an input or reference state in a transaction are more recent than the network parameters of the new transaction itself. */ @KeepForDJVM class TransactionNetworkParameterOrderingException(txId: SecureHash, inputStateRef: StateRef, txnNetworkParameters: NetworkParameters, inputNetworkParameters: NetworkParameters) : TransactionVerificationException(txId, "The network parameters epoch (${txnNetworkParameters.epoch}) of this transaction " + "is older than the epoch (${inputNetworkParameters.epoch}) of input state: $inputStateRef", null) /** * Thrown when the network parameters with hash: missingNetworkParametersHash is not available at this node. Usually all the parameters * that are in the resolution chain for transaction with txId should be fetched from peer via [FetchParametersFlow] or from network map. * * @param txId Id of the transaction that has missing parameters hash in the resolution chain * @param missingNetworkParametersHash Missing hash of the network parameters associated to this transaction */ @KeepForDJVM class MissingNetworkParametersException(txId: SecureHash, missingNetworkParametersHash: SecureHash) : TransactionVerificationException(txId, "Couldn't find network parameters with hash: $missingNetworkParametersHash related to this transaction: $txId", null) /** Whether the inputs or outputs list contains an encumbrance issue, see [TransactionMissingEncumbranceException]. */ @CordaSerializable @KeepForDJVM enum class Direction { /** Issue in the inputs list. */ INPUT, /** Issue in the outputs list. */ OUTPUT } // We could revisit and throw this more appropriate type in a future release that uses targetVersion to // avoid the compatibility break, because IllegalStateException isn't ideal for this. Or we could use this // as a cause. /** @suppress This class is not used: duplicate inputs throw a [IllegalStateException] instead. */ @Deprecated("This class is not used: duplicate inputs throw a [IllegalStateException] instead.") @DeleteForDJVM class DuplicateInputStates(txId: SecureHash, val duplicates: NonEmptySet<StateRef>) : TransactionVerificationException(txId, "Duplicate inputs: ${duplicates.joinToString()}", null) /** @suppress This class is obsolete and nothing has ever used it. */ @Deprecated("This class is obsolete and nothing has ever used it.") @DeleteForDJVM class MoreThanOneNotary(txId: SecureHash) : TransactionVerificationException(txId, "More than one notary", null) /** @suppress This class is obsolete and nothing has ever used it. */ @Deprecated("This class is obsolete and nothing has ever used it.") @DeleteForDJVM class SignersMissing(txId: SecureHash, val missing: List<PublicKey>) : TransactionVerificationException(txId, "Signers missing: ${missing.joinToString()}", null) /** @suppress This class is obsolete and nothing has ever used it. */ @Deprecated("This class is obsolete and nothing has ever used it.") @DeleteForDJVM class InvalidNotaryChange(txId: SecureHash) : TransactionVerificationException(txId, "Detected a notary change. Outputs must use the same notary as inputs", null) /** * Thrown when multiple attachments provide the same file when building the AttachmentsClassloader for a transaction. */ @KeepForDJVM class OverlappingAttachmentsException(txId: SecureHash, val path: String) : TransactionVerificationException(txId, "Multiple attachments define a file at $path.", null) /** * Thrown to indicate that a contract attachment is not signed by the network-wide package owner. Please note that * the [txId] will always be [SecureHash.zeroHash] because package ownership is an error with a particular attachment, * and because attachment classloaders are reused this is independent of any particular transaction. */ class PackageOwnershipException(txId: SecureHash, @Suppress("unused") val attachmentHash: AttachmentId, @Suppress("unused") val invalidClassName: String, val packageName: String) : TransactionVerificationException(txId, """The attachment JAR: $attachmentHash containing the class: $invalidClassName is not signed by the owner of package $packageName specified in the network parameters. Please check the source of this attachment and if it is malicious contact your zone operator to report this incident. For details see: https://docs.corda.net/network-map.html#network-parameters""".trimIndent(), null) class InvalidAttachmentException(txId: SecureHash, @Suppress("unused") val attachmentHash: AttachmentId) : TransactionVerificationException(txId, "The attachment $attachmentHash is not a valid ZIP or JAR file.".trimIndent(), null) // TODO: Make this descend from TransactionVerificationException so that untrusted attachments cause flows to be hospitalized. /** Thrown during classloading upon encountering an untrusted attachment (eg. not in the [TRUSTED_UPLOADERS] list) */ @KeepForDJVM class UntrustedAttachmentsException(val txId: SecureHash, val ids: List<SecureHash>) : CordaException("Attempting to load untrusted transaction attachments: $ids. " + "At this time these are not loadable because the DJVM sandbox has not yet been integrated. " + "You will need to manually install the CorDapp to whitelist it for use. " + "Please follow the operational steps outlined in https://docs.corda.net/cordapp-build-systems.html#cordapp-contract-attachments to learn more and continue.") /* If you add a new class extending [TransactionVerificationException], please add a test in `TransactionVerificationExceptionSerializationTests` proving that it can actually be serialised. As a rule, exceptions intended to be serialised _must_ have a corresponding readable property for every named constructor parameter - so make your constructor parameters `val`s even if nothing other than the serializer is ever going to read them. */ } MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException.ContractCreationError$internal constructor(txId: SecureHash, contractClass: String, cause: Throwable) : this(txId, contractClass, cause, cause.message ?: "") MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException.ContractRejection$internal constructor(txId: SecureHash, contract: Contract, cause: Throwable) : this(txId, contract.javaClass.name, cause, cause.message ?: "") - MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException.PackageOwnershipException$ Please check the source of this attachment and if it is malicious contact your zone operator to report this incident. MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException.PackageOwnershipException$"""The attachment JAR: $attachmentHash containing the class: $invalidClassName is not signed by the owner of package $packageName specified in the network parameters. Please check the source of this attachment and if it is malicious contact your zone operator to report this incident. For details see: https://docs.corda.net/network-map.html#network-parameters""" - MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException.TransactionNonMatchingEncumbranceException$"is not satisfied. Encumbered states should also be referenced as an encumbrance of another state to form " MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException.TransactionNotaryMismatchEncumbranceException$"Output state with index $encumberedIndex is assigned to notary [$encumberedNotary], while its encumbrance with index $encumbranceIndex is assigned to notary [$encumbranceNotary]" - MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException.TransactionRequiredContractUnspecifiedException$ Add the @BelongsToContract annotation to this class to ensure that it can only be bundled in a TransactionState MaxLineLength:TransactionVerificationException.kt$TransactionVerificationException.UntrustedAttachmentsException$"Please follow the operational steps outlined in https://docs.corda.net/cordapp-build-systems.html#cordapp-contract-attachments to learn more and continue." MaxLineLength:TransactionVerificationException.kt$net.corda.core.contracts.TransactionVerificationException.kt - MaxLineLength:TransactionVerificationExceptionSerialisationTests.kt$TransactionVerificationExceptionSerialisationTests$val exception = TransactionVerificationException.NotaryChangeInWrongTransactionType(txid, dummyBankA, dummyNotary) MaxLineLength:TransactionVerificationRequest.kt$TransactionVerificationRequest$@Suppress("MemberVisibilityCanBePrivate") //TODO the use of deprecated toLedgerTransaction need to be revisited as resolveContractAttachment requires attachments of the transactions which created input states... //TODO ...to check contract version non downgrade rule, curretly dummy Attachment if not fund is used which sets contract version to '1' @CordaSerializable - MaxLineLength:TransactionVerificationRequest.kt$TransactionVerificationRequest$attachments .mapNotNull { it as? MockContractAttachment } .associateBy(Attachment::id) { ContractAttachment(it, it.contract, uploader = DEPLOYED_CORDAPP_UPLOADER) } - MaxLineLength:TransactionVerifierService.kt$TransactionVerifierService$ fun verify(transaction: LedgerTransaction): CordaFuture<*> MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier - MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$ State of class MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$ private fun validateStatesAgainstContract() - MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$ private fun verifyConstraints(contractAttachmentsByContract: Map<ContractClassName, ContractAttachment>) MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$ private fun verifyConstraintsValidity(contractAttachmentsByContract: Map<ContractClassName, ContractAttachment>) - MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$// Using basic graph theory, a full cycle of encumbered (co-dependent) states should exist to achieve bi-directional // encumbrances. This property is important to ensure that no states involved in an encumbrance-relationship // can be spent on their own. Briefly, if any of the states is having more than one encumbrance references by // other states, a full cycle detection will fail. As a result, all of the encumbered states must be present // as "from" and "to" only once (or zero times if no encumbrance takes place). For instance, // a -> b // c -> b and a -> b // b -> a b -> c // do not satisfy the bi-directionality (full cycle) property. // // In the first example "b" appears twice in encumbrance ("to") list and "c" exists in the encumbered ("from") list only. // Due the above, one could consume "a" and "b" in the same transaction and then, because "b" is already consumed, "c" cannot be spent. // // Similarly, the second example does not form a full cycle because "a" and "c" exist in one of the lists only. // As a result, one can consume "b" and "c" in the same transactions, which will make "a" impossible to be spent. // // On other hand the following are valid constructions: // a -> b a -> c // b -> c and c -> b // c -> a b -> a // and form a full cycle, meaning that the bi-directionality property is satisfied. private fun checkBidirectionalOutputEncumbrances(statesAndEncumbrance: List<Pair<Int, Int>>) MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$?: - MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$checkMinimumPlatformVersion(ltx.networkParameters?.minimumPlatformVersion ?: 1, 4, "Signature constraints") MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$contractAttachmentsPerContract .groupBy { it.first } // Group by contract. .filter { (_, attachments) -> attachments.size > 1 } MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$if (contractWithMultipleAttachments != null) throw TransactionVerificationException.ConflictingAttachmentsRejection(ltx.id, contractWithMultipleAttachments) MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$if (ltx.attachments.size != ltx.attachments.toSet().size) throw TransactionVerificationException.DuplicateAttachmentsRejection(ltx.id, ltx.attachments.groupBy { it }.filterValues { it.size > 1 }.keys.first()) MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$if (result.keys != contractClasses) throw TransactionVerificationException.MissingAttachmentRejection(ltx.id, contractClasses.minus(result.keys).first()) - MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$throw TransactionVerificationException.NotaryChangeInWrongTransactionType(ltx.id, ltx.notary, it.notary) - MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$throw TransactionVerificationException.TransactionNonMatchingEncumbranceException(ltx.id, symmetricDifference) MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$val constraintAttachment = AttachmentWithContext(contractAttachment, contract, ltx.networkParameters!!.whitelistedContractImplementations) - MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$val inputConstraints = (inputContractGroups[contractClassName] ?: emptyList()).map { it.state.constraint }.toSet() - MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier$val outputConstraints = (outputContractGroups[contractClassName] ?: emptyList()).map { it.constraint }.toSet() MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier${ // checkNoNotaryChange and checkEncumbrancesValid are called here, and not in the c'tor, as they need access to the "outputs" // list, the contents of which need to be deserialized under the correct classloader. checkNoNotaryChange() checkEncumbrancesValid() // The following checks ensure the integrity of the current transaction and also of the future chain. // See: https://docs.corda.net/head/api-contract-constraints.html // A transaction contains both the data and the code that must be executed to validate the transition of the data. // Transactions can be created by malicious adversaries, who can try to use code that allows them to create transactions that appear valid but are not. // 1. Check that there is one and only one attachment for each relevant contract. val contractAttachmentsByContract = getUniqueContractAttachmentsByContract() // 2. Check that the attachments satisfy the constraints of the states. (The contract verification code is correct.) verifyConstraints(contractAttachmentsByContract) // 3. Check that the actual state constraints are correct. This is necessary because transactions can be built by potentially malicious nodes // who can create output states with a weaker constraint which can be exploited in a future transaction. verifyConstraintsValidity(contractAttachmentsByContract) // 4. Check that the [TransactionState] objects are correctly formed. validateStatesAgainstContract() // 5. Final step is to run the contract code. After the first 4 steps we are now sure that we are running the correct code. verifyContracts() } - MaxLineLength:TransactionVerifierServiceInternal.kt$Verifier${ if (!contractClassName.contractHasAutomaticConstraintPropagation(transactionClassLoader)) { contractClassName.warnContractWithoutConstraintPropagation() continue } val contractAttachment = contractAttachmentsByContract[contractClassName]!! // Verify that the constraints of output states have at least the same level of restriction as the constraints of the // corresponding input states. val inputConstraints = (inputContractGroups[contractClassName] ?: emptyList()).map { it.state.constraint }.toSet() val outputConstraints = (outputContractGroups[contractClassName] ?: emptyList()).map { it.constraint }.toSet() outputConstraints.forEach { outputConstraint -> inputConstraints.forEach { inputConstraint -> if (!(outputConstraint.canBeTransitionedFrom(inputConstraint, contractAttachment))) { throw TransactionVerificationException.ConstraintPropagationRejection( ltx.id, contractClassName, inputConstraint, outputConstraint) } } } } - MaxLineLength:TransactionViewer.kt$ private fun calculateTotalEquiv(myIdentity: Party?, reportingCurrencyExchange: Pair<Currency, (Amount<Currency>) -> Amount<Currency>>, inputs: List<ContractState>, outputs: List<ContractState>): AmountDiff<Currency> - MaxLineLength:TransactionViewer.kt$TransactionViewer$"Input Party" to { tx, s -> tx.inputParties.any { it.any { it.value?.name?.organisation?.contains(s, true) == true } } } - MaxLineLength:TransactionViewer.kt$TransactionViewer$"Output Party" to { tx, s -> tx.outputParties.any { it.any { it.value?.name?.organisation?.contains(s, true) == true } } } - MaxLineLength:TransactionViewer.kt$TransactionViewer$// Column stays the same size, but we don't violate column restricted resize policy for the whole table view. // It removes that irritating column at the end of table that does nothing. minWidth = 26.0 maxWidth = 26.0 - MaxLineLength:TransactionViewer.kt$TransactionViewer$Inputs - MaxLineLength:TransactionViewer.kt$TransactionViewer$Outputs - MaxLineLength:TransactionViewer.kt$TransactionViewer$Transaction MaxLineLength:TransactionViewer.kt$TransactionViewer$private MaxLineLength:TransactionViewer.kt$TransactionViewer$private fun ObservableList<StateAndRef<ContractState>>.getParties() MaxLineLength:TransactionViewer.kt$TransactionViewer$private fun ObservableList<StateAndRef<ContractState>>.toText() - MaxLineLength:TransactionViewer.kt$TransactionViewer$val commands = if (it.transaction.coreTransaction is WireTransaction) it.transaction.tx.commands else emptyList() MaxLineLength:TransactionViewer.kt$TransactionViewer.ContractStatesView$copyableLabel(party.map { "${signature.toStringShort()} (${it?.let { PartyNameFormatter.short.format(it.name) } ?: "Anonymous"})" }) MaxLineLength:TransactionViewer.kt$TransactionViewer.ContractStatesView$label - MaxLineLength:TransactionViewer.kt$TransactionViewer.ContractStatesView$val issuer: AbstractParty = anonymousIssuer.owningKey.toKnownParty().value ?: anonymousIssuer - MaxLineLength:TransactionViewer.kt$TransactionViewer.TransactionWidget$private val partiallyResolvedTransactions by observableListReadOnly(TransactionDataModel::partiallyResolvedTransactions) MaxLineLength:TransactionViewer.kt$outputs.mapNotNull { it as? Cash.State } .filter { it.amount.token.issuer.party.owningKey.toKnownParty().value == myIdentity && it.owner.owningKey.toKnownParty().value != myIdentity } MaxLineLength:TransactionWithSignatures.kt$TransactionWithSignatures${ val sigKeys = sigs.map { it.by }.toSet() // TODO Problem is that we can get single PublicKey wrapped as CompositeKey in allowedToBeMissing/mustSign // equals on CompositeKey won't catch this case (do we want to single PublicKey be equal to the same key wrapped in CompositeKey with threshold 1?) return requiredSigningKeys.filter { !it.isFulfilledBy(sigKeys) }.toSet() } - MaxLineLength:TransformsSchema.kt$TransformsAnnotationProcessor - MaxLineLength:TransformsSchema.kt$TransformsAnnotationProcessor$private - MaxLineLength:TransitionBuilder.kt$CannotFindSessionException : IllegalStateException - MaxLineLength:TransitionExecutor.kt$TransitionExecutor$ fun forceRemoveFlow(id: StateMachineRunId) - MaxLineLength:TransitionExecutorImpl.kt$TransitionExecutorImpl$log.warn("Error while executing $action during transition to errored state, aborting transition", exception) - MaxLineLength:TransitionExecutorImpl.kt$TransitionExecutorImpl${ // If we errored while transitioning to an error state then we cannot record the additional // error as that may result in an infinite loop, e.g. error propagation fails -> record error -> propagate fails again. // Instead we just keep around the old error state and wait for a new schedule, perhaps // triggered from a flow hospital log.warn("Error while executing $action during transition to errored state, aborting transition", exception) return Pair(FlowContinuation.Abort, previousState.copy(isFlowResumed = false)) } - MaxLineLength:Try.kt$Try$ fun doOnFailure(action: Consumer<Throwable>): Try<A> - MaxLineLength:Try.kt$Try$ fun doOnSuccess(action: Consumer<in A>): Try<A> - MaxLineLength:Try.kt$Try$ inline fun <B> flatMap(function: (A) -> Try<B>): Try<B> - MaxLineLength:Try.kt$Try.Companion$ @JvmStatic inline fun <T> on(body: () -> T): Try<T> - MaxLineLength:TutorialContract.kt$CommercialPaper$"output states are issued by a command signer" using (output.issuance.party.owningKey in command.signers) - MaxLineLength:TutorialContract.kt$CommercialPaper$"the transaction is signed by the owner of the CP" using (input.owner.owningKey in command.signers) - MaxLineLength:TutorialContract.kt$CommercialPaper$return TransactionBuilder(notary = notary).withItems(stateAndContract, Command(Commands.Issue(), issuance.party.owningKey)) - MaxLineLength:TutorialContract.kt$State$override fun withNewOwner(newOwner: AbstractParty) - MaxLineLength:TutorialFlowStateMachines.kt$TwoPartyTradeFlow.Seller$override val progressTracker: ProgressTracker = TwoPartyTradeFlow.Seller.tracker() MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Acceptor$override MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Acceptor$return Triple(ptx, arrayListOf(deal.participants.single { it is Party && serviceHub.myInfo.isLegalIdentity(it) }.owningKey), emptyList()) - MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Handshake$@CordaSerializable data - MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Primary$abstract MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Secondary$@Suspendable protected abstract - MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Secondary$abstract MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Secondary$require(wellKnownMe == ourIdentity){"Well known party for handshake identity ${it.secondaryIdentity} does not match ourIdentity"} MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Secondary$require(wellKnownOtherParty == otherSideSession.counterparty){"Well known party for handshake identity ${it.primaryIdentity} does not match counterparty"} - MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Secondary$serviceHub.signInitialTransaction(utx, additionalSigningPubKeys).withAdditionalSignatures(additionalSignatures) - MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Secondary$val ptxSignedByOtherSide = ptx + subFlow(CollectSignatureFlow(ptx, otherSideSession, otherSideSession.counterparty.owningKey)) MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Secondary$val sessionsForOtherSigners = excludeNotary(groupPublicKeysByWellKnownParty(serviceHub, ptxSignedByOtherSide.getMissingSigners()), ptxSignedByOtherSide).map { initiateFlow(it.key) } - MaxLineLength:TwoPartyDealFlow.kt$TwoPartyDealFlow.Secondary$val stx = subFlow(CollectSignaturesFlow(ptxSignedByOtherSide, sessionsForOtherSigners, additionalSigningPubKeys)) - MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow${ // TODO: Common elements in multi-party transaction consensus and signing should be refactored into a superclass of this // and [AbstractStateReplacementFlow]. class UnacceptablePriceException(givenPrice: Amount<Currency>) : FlowException("Unacceptable price: $givenPrice") class AssetMismatchException(val expectedTypeName: String, val typeName: String) : FlowException() { override fun toString() = "The submitted asset didn't match the expected type: $expectedTypeName vs $typeName" } /** * This object is serialised to the network and is the first flow message the seller sends to the buyer. * * @param payToIdentity anonymous identity of the seller, for payment to be sent to. */ @CordaSerializable data class SellerTradeInfo( val price: Amount<Currency>, val payToIdentity: PartyAndCertificate ) open class Seller(private val otherSideSession: FlowSession, private val assetToSell: StateAndRef<OwnableState>, private val price: Amount<Currency>, private val myParty: PartyAndCertificate, // TODO Left because in tests it's used to pass anonymous party. override val progressTracker: ProgressTracker = Seller.tracker()) : FlowLogic<SignedTransaction>() { companion object { object AWAITING_PROPOSAL : ProgressTracker.Step("Awaiting transaction proposal") // DOCSTART 3 object VERIFYING_AND_SIGNING : ProgressTracker.Step("Verifying and signing transaction proposal") { override fun childProgressTracker() = SignTransactionFlow.tracker() } // DOCEND 3 fun tracker() = ProgressTracker(AWAITING_PROPOSAL, VERIFYING_AND_SIGNING) } // DOCSTART 4 @Suspendable override fun call(): SignedTransaction { progressTracker.currentStep = AWAITING_PROPOSAL // Make the first message we'll send to kick off the flow. val hello = SellerTradeInfo(price, myParty) // What we get back from the other side is a transaction that *might* be valid and acceptable to us, // but we must check it out thoroughly before we sign! // SendTransactionFlow allows seller to access our data to resolve the transaction. subFlow(SendStateAndRefFlow(otherSideSession, listOf(assetToSell))) otherSideSession.send(hello) // Verify and sign the transaction. progressTracker.currentStep = VERIFYING_AND_SIGNING // DOCSTART 07 // Sync identities to ensure we know all of the identities involved in the transaction we're about to // be asked to sign subFlow(IdentitySyncFlow.Receive(otherSideSession)) // DOCEND 07 // DOCSTART 5 val signTransactionFlow = object : SignTransactionFlow(otherSideSession, VERIFYING_AND_SIGNING.childProgressTracker()) { override fun checkTransaction(stx: SignedTransaction) { // Verify that we know who all the participants in the transaction are val states: Iterable<ContractState> = serviceHub.loadStates(stx.tx.inputs.toSet()).map { it.state.data } + stx.tx.outputs.map { it.data } states.forEach { state -> state.participants.forEach { anon -> require(serviceHub.identityService.wellKnownPartyFromAnonymous(anon) != null) { "Transaction state $state involves unknown participant $anon" } } } if (stx.tx.outputStates.sumCashBy(myParty.party).withoutIssuer() != price) throw FlowException("Transaction is not sending us the right amount of cash") } } val txId = subFlow(signTransactionFlow).id // DOCEND 5 return subFlow(ReceiveFinalityFlow(otherSideSession, expectedTxId = txId)) } // DOCEND 4 // Following comment moved here so that it doesn't appear in the docsite: // There are all sorts of funny games a malicious secondary might play with it sends maybeSTX, // we should fix them: // // - This tx may attempt to send some assets we aren't intending to sell to the secondary, if // we're reusing keys! So don't reuse keys! // - This tx may include output states that impose odd conditions on the movement of the cash, // once we implement state pairing. // // but the goal of this code is not to be fully secure (yet), but rather, just to find good ways to // express flow state machines on top of the messaging layer. } open class Buyer(private val sellerSession: FlowSession, private val notary: Party, private val acceptablePrice: Amount<Currency>, private val typeToBuy: Class<out OwnableState>, private val anonymous: Boolean) : FlowLogic<SignedTransaction>() { constructor(otherSideSession: FlowSession, notary: Party, acceptablePrice: Amount<Currency>, typeToBuy: Class<out OwnableState>) : this(otherSideSession, notary, acceptablePrice, typeToBuy, true) // DOCSTART 2 object RECEIVING : ProgressTracker.Step("Waiting for seller trading info") object VERIFYING : ProgressTracker.Step("Verifying seller assets") object SIGNING : ProgressTracker.Step("Generating and signing transaction proposal") object COLLECTING_SIGNATURES : ProgressTracker.Step("Collecting signatures from other parties") { override fun childProgressTracker() = CollectSignaturesFlow.tracker() } object RECORDING : ProgressTracker.Step("Recording completed transaction") { // TODO: Currently triggers a race condition on Team City. See https://github.com/corda/corda/issues/733. // override fun childProgressTracker() = FinalityFlow.tracker() } override val progressTracker = ProgressTracker(RECEIVING, VERIFYING, SIGNING, COLLECTING_SIGNATURES, RECORDING) // DOCEND 2 // DOCSTART 1 @Suspendable override fun call(): SignedTransaction { // Wait for a trade request to come in from the other party. progressTracker.currentStep = RECEIVING val (assetForSale, tradeRequest) = receiveAndValidateTradeRequest() // Create the identity we'll be paying to, and send the counterparty proof we own the identity val buyerAnonymousIdentity = if (anonymous) serviceHub.keyManagementService.freshKeyAndCert(ourIdentityAndCert, false) else ourIdentityAndCert // Put together a proposed transaction that performs the trade, and sign it. progressTracker.currentStep = SIGNING val (ptx, cashSigningPubKeys) = assembleSharedTX(assetForSale, tradeRequest, buyerAnonymousIdentity) // DOCSTART 6 // Now sign the transaction with whatever keys we need to move the cash. val partSignedTx = serviceHub.signInitialTransaction(ptx, cashSigningPubKeys) // Sync up confidential identities in the transaction with our counterparty subFlow(IdentitySyncFlow.Send(sellerSession, ptx.toWireTransaction(serviceHub))) // Send the signed transaction to the seller, who must then sign it themselves and commit // it to the ledger by sending it to the notary. progressTracker.currentStep = COLLECTING_SIGNATURES val sellerSignature = subFlow(CollectSignatureFlow(partSignedTx, sellerSession, sellerSession.counterparty.owningKey)) val twiceSignedTx = partSignedTx + sellerSignature // DOCEND 6 // Notarise and record the transaction. progressTracker.currentStep = RECORDING return subFlow(FinalityFlow(twiceSignedTx, sellerSession)) } @Suspendable private fun receiveAndValidateTradeRequest(): Pair<StateAndRef<OwnableState>, SellerTradeInfo> { val assetForSale = subFlow(ReceiveStateAndRefFlow<OwnableState>(sellerSession)).single() return assetForSale to sellerSession.receive<SellerTradeInfo>().unwrap { progressTracker.currentStep = VERIFYING // What is the seller trying to sell us? val asset = assetForSale.state.data val assetTypeName = asset.javaClass.name // The asset must either be owned by the well known identity of the counterparty, or we must be able to // prove the owner is a confidential identity of the counterparty. val assetForSaleIdentity = serviceHub.identityService.wellKnownPartyFromAnonymous(asset.owner) require(assetForSaleIdentity == sellerSession.counterparty){"Well known identity lookup returned identity that does not match counterparty"} // Register the identity we're about to send payment to. This shouldn't be the same as the asset owner // identity, so that anonymity is enforced. val wellKnownPayToIdentity = serviceHub.identityService.verifyAndRegisterIdentity(it.payToIdentity) ?: it.payToIdentity require(wellKnownPayToIdentity.party == sellerSession.counterparty) { "Well known identity to pay to must match counterparty identity" } if (it.price > acceptablePrice) throw UnacceptablePriceException(it.price) if (!typeToBuy.isInstance(asset)) throw AssetMismatchException(typeToBuy.name, assetTypeName) it } } @Suspendable private fun assembleSharedTX(assetForSale: StateAndRef<OwnableState>, tradeRequest: SellerTradeInfo, buyerAnonymousIdentity: PartyAndCertificate): SharedTx { val ptx = TransactionBuilder(notary) // Add input and output states for the movement of cash, by using the Cash contract to generate the states val (tx, cashSigningPubKeys) = CashUtils.generateSpend(serviceHub, ptx, tradeRequest.price, ourIdentityAndCert, tradeRequest.payToIdentity.party) // Add inputs/outputs/a command for the movement of the asset. tx.addInputState(assetForSale) val (command, state) = assetForSale.state.data.withNewOwner(buyerAnonymousIdentity.party) tx.addOutputState(state, assetForSale.state.contract, assetForSale.state.notary) tx.addCommand(command, assetForSale.state.data.owner.owningKey) // We set the transaction's time-window: it may be that none of the contracts need this! // But it can't hurt to have one. val currentTime = serviceHub.clock.instant() tx.setTimeWindow(currentTime, 30.seconds) return SharedTx(tx, cashSigningPubKeys) } // DOCEND 1 data class SharedTx(val tx: TransactionBuilder, val cashSigningPubKeys: List<PublicKey>) } } MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow.Buyer$@Suspendable private - MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow.Buyer$constructor(otherSideSession: FlowSession, notary: Party, acceptablePrice: Amount<Currency>, typeToBuy: Class<out OwnableState>) : this(otherSideSession, notary, acceptablePrice, typeToBuy, true) MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow.Buyer$require(assetForSaleIdentity == sellerSession.counterparty){"Well known identity lookup returned identity that does not match counterparty"} MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow.Buyer$require(wellKnownPayToIdentity.party == sellerSession.counterparty) { "Well known identity to pay to must match counterparty identity" } MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow.Buyer$val (tx, cashSigningPubKeys) = CashUtils.generateSpend(serviceHub, ptx, tradeRequest.price, ourIdentityAndCert, tradeRequest.payToIdentity.party) - MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow.Buyer$val sellerSignature = subFlow(CollectSignatureFlow(partSignedTx, sellerSession, sellerSession.counterparty.owningKey)) - MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow.Buyer$val wellKnownPayToIdentity = serviceHub.identityService.verifyAndRegisterIdentity(it.payToIdentity) ?: it.payToIdentity - MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow.Seller$override val progressTracker: ProgressTracker = Seller.tracker() - MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow.Seller$private val myParty: PartyAndCertificate - MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow.Seller$val signTransactionFlow = object : SignTransactionFlow(otherSideSession, VERIFYING_AND_SIGNING.childProgressTracker()) { override fun checkTransaction(stx: SignedTransaction) { // Verify that we know who all the participants in the transaction are val states: Iterable<ContractState> = serviceHub.loadStates(stx.tx.inputs.toSet()).map { it.state.data } + stx.tx.outputs.map { it.data } states.forEach { state -> state.participants.forEach { anon -> require(serviceHub.identityService.wellKnownPartyFromAnonymous(anon) != null) { "Transaction state $state involves unknown participant $anon" } } } if (stx.tx.outputStates.sumCashBy(myParty.party).withoutIssuer() != price) throw FlowException("Transaction is not sending us the right amount of cash") } } MaxLineLength:TwoPartyTradeFlow.kt$TwoPartyTradeFlow.Seller.<no name provided>$val states: Iterable<ContractState> = serviceHub.loadStates(stx.tx.inputs.toSet()).map { it.state.data } + stx.tx.outputs.map { it.data } - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$( // Buyer Bob is told about Alice's commercial paper, but doesn't know it .. expect(TxRecord.Get(alicesFakePaper[0].id)), // He asks and gets the tx, validates it, sees it's a self issue with no dependencies, stores. expect(TxRecord.Add(alicesSignedTxns.values.first())), // Alice gets Bob's proposed transaction and doesn't know his two cash states. She asks, Bob answers. expect(TxRecord.Get(bobsFakeCash[1].id)), expect(TxRecord.Get(bobsFakeCash[2].id)), // Alice notices that Bob's cash txns depend on a third tx she also doesn't know. She asks, Bob answers. expect(TxRecord.Get(bobsFakeCash[0].id)) ) MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$( // Seller Alice sends her seller info to Bob, who wants to check the asset for sale. // He requests, Alice looks up in her DB to send the tx to Bob expect(TxRecord.Get(alicesFakePaper[0].id)), // Seller Alice gets a proposed tx which depends on Bob's two cash txns and her own tx. expect(TxRecord.Get(bobsFakeCash[1].id)), expect(TxRecord.Get(bobsFakeCash[2].id)), expect(TxRecord.Get(alicesFakePaper[0].id)), // Alice notices that Bob's cash txns depend on a third tx she also doesn't know. expect(TxRecord.Get(bobsFakeCash[0].id)), // Bob answers with the transactions that are now all verifiable, as Alice bottomed out. // Bob's transactions are valid, so she commits to the database //expect(TxRecord.Add(bobsSignedTxns[bobsFakeCash[0].id]!!)), //TODO investigate missing event after introduction of signature constraints non-downgrade rule expect(TxRecord.Get(bobsFakeCash[0].id)), // Verify expect(TxRecord.Add(bobsSignedTxns[bobsFakeCash[2].id]!!)), expect(TxRecord.Get(bobsFakeCash[0].id)), // Verify expect(TxRecord.Add(bobsSignedTxns[bobsFakeCash[1].id]!!)), // Now she verifies the transaction is contract-valid (not signature valid) which means // looking up the states again. expect(TxRecord.Get(bobsFakeCash[1].id)), expect(TxRecord.Get(bobsFakeCash[2].id)), expect(TxRecord.Get(alicesFakePaper[0].id)), // Alice needs to look up the input states to find out which Notary they point to expect(TxRecord.Get(bobsFakeCash[1].id)), expect(TxRecord.Get(bobsFakeCash[2].id)), expect(TxRecord.Get(alicesFakePaper[0].id)) ) - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$// Insert a prospectus type attachment into the commercial paper transaction. val stream = ByteArrayOutputStream() JarOutputStream(stream).use { it.putNextEntry(ZipEntry("Prospectus.txt")) it.write("Our commercial paper is top notch stuff".toByteArray()) it.closeEntry() } val attachmentID = aliceNode.database.transaction { attachment(stream.toByteArray().inputStream()) } val bobsKey = bobNode.services.keyManagementService.keys.single() val bobsFakeCash = bobNode.database.transaction { fillUpForBuyerAndInsertFakeTransactions(false, issuer, AnonymousParty(bobsKey), notary, bobNode, bob, notaryNode, bankNode) }.second val alicesFakePaper = aliceNode.database.transaction { fillUpForSeller(false, issuer, alice, 1200.DOLLARS `issued by` bank.ref(0), attachmentID, notary).second } insertFakeTransactions(alicesFakePaper, aliceNode, alice, notaryNode, bankNode) val aliceTxStream = aliceNode.services.validatedTransactions.track().updates val aliceTxMappings = with(aliceNode) { database.transaction { services.stateMachineRecordedTransactionMapping.track().updates } } val aliceSmId = runBuyerAndSeller(notary, bob, aliceNode, bobNode, "alice's paper".outputStateAndRef()).sellerId mockNet.runNetwork() // We need to declare this here, if we do it inside [expectEvents] kotlin throws an internal compiler error(!). val aliceTxExpectations = sequence( expect { tx: SignedTransaction -> require(tx.id == bobsFakeCash[0].id) }, expect { tx: SignedTransaction -> require(tx.id == bobsFakeCash[2].id) }, expect { tx: SignedTransaction -> require(tx.id == bobsFakeCash[1].id) } ) aliceTxStream.expectEvents { aliceTxExpectations } val aliceMappingExpectations = sequence( expect<StateMachineTransactionMapping> { (stateMachineRunId, transactionId) -> require(stateMachineRunId == aliceSmId) require(transactionId == bobsFakeCash[0].id) }, expect<StateMachineTransactionMapping> { (stateMachineRunId, transactionId) -> require(stateMachineRunId == aliceSmId) require(transactionId == bobsFakeCash[2].id) }, expect { (stateMachineRunId, transactionId) -> require(stateMachineRunId == aliceSmId) require(transactionId == bobsFakeCash[1].id) } ) aliceTxMappings.expectEvents { aliceMappingExpectations } - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$SignableData(id, SignatureMetadata(1, Crypto.findSignatureScheme(notaryParty.owningKey).schemeNumberID)) MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$VaultFiller(bobNode.services, dummyNotary, notary, ::Random).fillWithSomeTestCash(2000.DOLLARS, bankNode.services, 3, 10, cashIssuer) MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$VaultFiller(bobNode.services, dummyNotary, notary, ::Random).fillWithSomeTestCash(2000.DOLLARS, bankNode.services, 3, 10, issuer) MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$VaultFiller(bobNode.services, dummyNotary, notary, ::Random).fillWithSomeTestCash(2000.DOLLARS, bankNode.services, 3, issuer) - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$fillUpForBuyerAndInsertFakeTransactions(bobError, issuer, bob, notary, bobNode, bob, notaryNode, bankNode).second MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$fillUpForBuyerAndInsertFakeTransactions(false, issuer, AnonymousParty(bob.owningKey), notary, bobNode, bob, notaryNode, bankNode) - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$fillUpForBuyerAndInsertFakeTransactions(false, issuer, AnonymousParty(bobsKey), notary, bobNode, bob, notaryNode, bankNode) - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$output(Cash.PROGRAM_ID, "bob cash 1", notary = notary, contractState = 800.DOLLARS.CASH issuedBy issuer ownedBy owner) - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$output(Cash.PROGRAM_ID, "bob cash 2", notary = notary, contractState = 300.DOLLARS.CASH issuedBy issuer ownedBy owner) MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$output(Cash.PROGRAM_ID, "elbonian money 1", notary = notary, contractState = 800.DOLLARS.CASH issuedBy issuer ownedBy interimOwner) MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$output(Cash.PROGRAM_ID, "elbonian money 2", notary = notary, contractState = 1000.DOLLARS.CASH issuedBy issuer ownedBy interimOwner) MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$output(Cash.PROGRAM_ID, notary = notary, contractState = 700.DOLLARS.CASH issuedBy issuer ownedBy interimOwner) - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$private - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$val (bobStateMachine, aliceResult) = runBuyerAndSeller(notary, bob, aliceNode, bobNode, "alice's paper".outputStateAndRef()) - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$val aliceFuture = runBuyerAndSeller(notary, bob, aliceNode, bobNode, "alice's paper".outputStateAndRef()).sellerResult - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests$val aliceNode = mockNet.createPartyNode(ALICE_NAME) var bobNode = mockNet.createPartyNode(BOB_NAME) val bankNode = mockNet.createPartyNode(BOC_NAME) aliceNode.internals.disableDBCloseOnStop() bobNode.internals.disableDBCloseOnStop() val bobAddr = bobNode.network.myAddress mockNet.runNetwork() // Clear network map registration messages val alice = aliceNode.info.singleIdentity() val bank = bankNode.info.singleIdentity() val bob = bobNode.info.singleIdentity() val issuer = bank.ref(1, 2, 3) bobNode.database.transaction { VaultFiller(bobNode.services, dummyNotary, notary, ::Random).fillWithSomeTestCash(2000.DOLLARS, bankNode.services, 3, 10, issuer) } val alicesFakePaper = aliceNode.database.transaction { fillUpForSeller(false, issuer, alice, 1200.DOLLARS `issued by` bank.ref(0), null, notary).second } insertFakeTransactions(alicesFakePaper, aliceNode, alice, notaryNode, bankNode) val aliceFuture = runBuyerAndSeller(notary, bob, aliceNode, bobNode, "alice's paper".outputStateAndRef()).sellerResult // Everything is on this thread so we can now step through the flow one step at a time. // Seller Alice already sent a message to Buyer Bob. Pump once: bobNode.pumpReceive() // Bob sends a couple of queries for the dependencies back to Alice. Alice reponds. aliceNode.pumpReceive() bobNode.pumpReceive() aliceNode.pumpReceive() bobNode.pumpReceive() aliceNode.pumpReceive() bobNode.pumpReceive() // OK, now Bob has sent the partial transaction back to Alice and is waiting for Alice's signature. bobNode.database.transaction { assertThat(bobNode.internals.checkpointStorage.checkpoints()).hasSize(1) } val storage = bobNode.services.validatedTransactions val bobTransactionsBeforeCrash = bobNode.database.transaction { (storage as DBTransactionStorage).transactions } assertThat(bobTransactionsBeforeCrash).isNotEmpty // .. and let's imagine that Bob's computer has a power cut. He now has nothing now beyond what was on disk. bobNode.dispose() // Alice doesn't know that and carries on: she wants to know about the cash transactions he's trying to use. // She will wait around until Bob comes back. assertThat(aliceNode.pumpReceive()).isNotNull() // FIXME: Knowledge of confidential identities is lost on node shutdown, so Bob's node now refuses to sign the // transaction because it has no idea who the parties are. // ... bring the node back up ... the act of constructing the SMM will re-register the message handlers // that Bob was waiting on before the reboot occurred. bobNode = mockNet.createNode(InternalMockNodeParameters(bobAddr.id, BOB_NAME)) // Find the future representing the result of this state machine again. val bobFuture = bobNode.smm.findStateMachines(BuyerAcceptor::class.java).single().second // And off we go again. mockNet.runNetwork() // Bob is now finished and has the same transaction as Alice. assertThat(bobFuture.getOrThrow()).isEqualTo(aliceFuture.getOrThrow()) assertThat(bobNode.smm.findStateMachines(Buyer::class.java)).isEmpty() bobNode.database.transaction { assertThat(bobNode.internals.checkpointStorage.checkpoints()).isEmpty() } aliceNode.database.transaction { assertThat(aliceNode.internals.checkpointStorage.checkpoints()).isEmpty() } bobNode.database.transaction { val restoredBobTransactions = bobTransactionsBeforeCrash.filter { bobNode.services.validatedTransactions.getTransaction(it.id) != null } assertThat(restoredBobTransactions).containsAll(bobTransactionsBeforeCrash) } aliceNode.internals.manuallyCloseDB() bobNode.internals.manuallyCloseDB() - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests.<no name provided>$return RecordingTransactionStorage(database, super.makeTransactionStorage(transactionCacheSizeBytes)) - MaxLineLength:TwoPartyTradeFlowTests.kt$TwoPartyTradeFlowTests.BuyerAcceptor$require(serviceHub.networkMapCache.isNotary(it.notaryIdentity)) { "${it.notaryIdentity} is not a notary" } - MaxLineLength:TypeIdentifier.kt$TypeIdentifier.Companion$ fun forGenericType(type: Type, resolutionContext: Type = type): TypeIdentifier - MaxLineLength:TypeIdentifier.kt$TypeIdentifier.Companion$is GenericArrayType -> ArrayOf(forGenericType(type.genericComponentType.resolveAgainst(resolutionContext))) MaxLineLength:TypeIdentifier.kt$TypeIdentifier.Parameterised$data - MaxLineLength:TypeLoader.kt$ClassCarpentingTypeLoader : TypeLoader - MaxLineLength:TypeLoader.kt$TypeLoader$ fun load(remoteTypeInformation: Collection<RemoteTypeInformation>, context: SerializationContext): Map<TypeIdentifier, Type> - MaxLineLength:TypeModellingFingerPrinter.kt$FingerPrintingState$writer.writeAlreadySeen() MaxLineLength:TypeParameterUtils.kt$private MaxLineLength:TypeParameterUtils.kt${ if (declaredClass == actualClass) { return null } if (actualClass.typeParameters.isEmpty()) { return actualClass } // The actual class can never have type variables resolved, due to the JVM's use of type erasure, so let's try and resolve them // Search for declared type in the inheritance hierarchy and then see if that fills in all the variables val implementationChain: List<Type> = findPathToDeclared(actualClass, declaredType)?.toList() ?: throw AMQPNotSerializableException( declaredType, "No inheritance path between actual $actualClass and declared $declaredType.") val start = implementationChain.last() val rest = implementationChain.dropLast(1).drop(1) val resolver = rest.reversed().fold(TypeResolver().where(start, declaredType)) { resolved, chainEntry -> val newResolved = resolved.resolveType(chainEntry) TypeResolver().where(chainEntry, newResolved) } // The end type is a special case as it is a Class, so we need to fake up a ParameterizedType for it to get the TypeResolver to do anything. val endType = actualClass.asParameterizedType() return resolver.resolveType(endType) } - MaxLineLength:TypesafeCordappConfigTests.kt$TypesafeCordappConfigTests$val config = ConfigFactory.parseString("string=string\nint=1\nfloat=1.0\ndouble=1.0\nnumber=2\ndouble=1.01\nbool=false") MaxLineLength:UniqueDummyFungibleContract.kt$UniqueDummyFungibleContract.State$override fun withNewOwnerAndAmount(newAmount: Amount<Issued<Currency>>, newOwner: AbstractParty): FungibleAsset<Currency> - MaxLineLength:UniqueDummyFungibleContract.kt$UniqueDummyFungibleContract.State$return UniqueDummyFungibleStateSchema.UniquePersistentDummyFungibleState(currency = amount.token.product.currencyCode) MaxLineLength:UniqueDummyFungibleContract.kt$UniqueDummyFungibleStateSchema : MappedSchema MaxLineLength:UniqueDummyLinearContract.kt$UniqueDummyLinearStateSchema : MappedSchema MaxLineLength:UniqueIdentifier.kt$UniqueIdentifier$@CordaSerializable @KeepForDJVM data MaxLineLength:UniquenessProviderTests.kt$PersistentUniquenessProviderFactory$database = configureDatabase(makeTestDataSourceProperties(), DatabaseConfig(), { null }, { null }, NodeSchemaService(extraSchemas = setOf(NodeNotarySchemaV1))) MaxLineLength:UniquenessProviderTests.kt$RaftUniquenessProviderFactory$database = configureDatabase(makeTestDataSourceProperties(), DatabaseConfig(), { null }, { null }, NodeSchemaService(extraSchemas = setOf(RaftNotarySchemaV1))) - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$private val requestSignature = NotarisationRequestSignature(DigitalSignature.WithKey(NullKeys.NullPublicKey, ByteArray(32)), 0) - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val response: UniquenessProvider.Result = uniquenessProvider.commit(inputs, secondTxId, identity, requestSignature).get() MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val response: UniquenessProvider.Result = uniquenessProvider.commit(inputs, secondTxId, identity, requestSignature, invalidTimeWindow) .get() - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val response: UniquenessProvider.Result = uniquenessProvider.commit(inputs, secondTxId, identity, requestSignature, timeWindow) .get() MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result = uniquenessProvider.commit(emptyList(), firstTxId, identity, requestSignature, invalidTimeWindow, references = listOf(referenceState)) .get() - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result = uniquenessProvider.commit(emptyList(), firstTxId, identity, requestSignature, references = listOf(referenceState)) .get() MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result = uniquenessProvider.commit(emptyList(), firstTxId, identity, requestSignature, timeWindow, references = listOf(referenceState)) .get() - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result = uniquenessProvider.commit(listOf(inputState), firstTxId, identity, requestSignature, references = emptyList()).get() MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result = uniquenessProvider.commit(listOf(inputState), firstTxId, identity, requestSignature, timeWindow, references = listOf(referenceState)) .get() - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result = uniquenessProvider.commit(listOf(inputState), txID, identity, requestSignature, invalidTimeWindow).get() - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result = uniquenessProvider.commit(listOf(inputState1), firstTxId, identity, requestSignature, invalidTimeWindow).get() - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result = uniquenessProvider.commit(listOf(inputState1), firstTxId, identity, requestSignature, timeWindow).get() - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result = uniquenessProvider.commit(listOf(referenceState), firstTxId, identity, requestSignature, references = emptyList()) .get() - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result2 = uniquenessProvider.commit(emptyList(), firstTxId, identity, requestSignature, references = listOf(referenceState)) .get() MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result2 = uniquenessProvider.commit(emptyList(), secondTxId, identity, requestSignature, invalidTimeWindow, references = listOf(referenceState)) .get() - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result2 = uniquenessProvider.commit(emptyList(), secondTxId, identity, requestSignature, references = listOf(referenceState)) .get() MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result2 = uniquenessProvider.commit(emptyList(), secondTxId, identity, requestSignature, timeWindow, references = listOf(referenceState)) .get() MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result2 = uniquenessProvider.commit(listOf(inputState), firstTxId, identity, requestSignature, timeWindow, references = listOf(referenceState)) .get() MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result2 = uniquenessProvider.commit(listOf(inputState), secondTxId, identity, requestSignature, timeWindow, references = listOf(referenceState)) .get() - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result2 = uniquenessProvider.commit(listOf(inputState1), firstTxId, identity, requestSignature, timeWindow).get() - MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result2 = uniquenessProvider.commit(listOf(referenceState), SecureHash.randomSHA256(), identity, requestSignature, timeWindow) .get() MaxLineLength:UniquenessProviderTests.kt$UniquenessProviderTests$val result3 = uniquenessProvider.commit(emptyList(), firstTxId, identity, requestSignature, timeWindow, references = listOf(referenceState)) .get() - MaxLineLength:UniversalContract.kt$UniversalContract$"action must have a time-window" using (tx.timeWindow != null) // "action must be authorized" by (cmd.signers.any { action.actors.any { party -> party.owningKey == it } }) // todo perhaps merge these two requirements? "condition must be met" using evalBoolean(tx, action.condition) - MaxLineLength:UniversalContract.kt$UniversalContract$"the transaction is signed by all liable parties" using (liableParties(outState.details).all { it in cmd.signers }) MaxLineLength:UniversalContract.kt$UniversalContract$Action(arr.name, replaceFixing(tx, arr.condition, fixings, unusedFixings), replaceFixing(tx, arr.arrangement, fixings, unusedFixings)) - MaxLineLength:UniversalContract.kt$UniversalContract$if (dt != null && fixings.containsKey(FixOf(perceivable.source, dt.toLocalDate(), perceivable.tenor))) { unusedFixings.remove(FixOf(perceivable.source, dt.toLocalDate(), perceivable.tenor)) uncheckedCast(Const(fixings[FixOf(perceivable.source, dt.toLocalDate(), perceivable.tenor)]!!)) } else perceivable MaxLineLength:UniversalContract.kt$UniversalContract$is Actions -> Actions(arr.actions.map { Action(it.name, it.condition, replaceFixing(tx, it.arrangement, fixings, unusedFixings)) }.toSet()) - MaxLineLength:UniversalContract.kt$UniversalContract$is Actions -> Actions(arrangement.actions.map { Action(it.name, it.condition, removeNext(it.arrangement)) }.toSet()) MaxLineLength:UniversalContract.kt$UniversalContract$is Actions -> Actions(arrangement.actions.map { Action(it.name, it.condition, replaceNext(it.arrangement, nextReplacement)) }.toSet()) MaxLineLength:UniversalContract.kt$UniversalContract$is Actions -> Actions(arrangement.actions.map { Action(it.name, replaceStartEnd(it.condition, start, end), replaceStartEnd(it.arrangement, start, end)) }.toSet()) MaxLineLength:UniversalContract.kt$UniversalContract$is Interest -> uncheckedCast(Interest(replaceStartEnd(p.amount, start, end), p.dayCountConvention, replaceStartEnd(p.interest, start, end), replaceStartEnd(p.start, start, end), replaceStartEnd(p.end, start, end))) - MaxLineLength:UniversalContract.kt$UniversalContract$is Obligation -> Obligation(replaceFixing(tx, arr.amount, fixings, unusedFixings), arr.currency, arr.from, arr.to) MaxLineLength:UniversalContract.kt$UniversalContract$is Obligation -> Obligation(replaceStartEnd(arrangement.amount, start, end), arrangement.currency, arrangement.from, arrangement.to) - MaxLineLength:UniversalContract.kt$UniversalContract$is PerceivableAnd -> uncheckedCast(replaceStartEnd(p.left, start, end) and replaceStartEnd(p.right, start, end)) - MaxLineLength:UniversalContract.kt$UniversalContract$is PerceivableOperation MaxLineLength:UniversalContract.kt$UniversalContract$is PerceivableOperation -> PerceivableOperation(replaceStartEnd(p.left, start, end), p.op, replaceStartEnd(p.right, start, end)) - MaxLineLength:UniversalContract.kt$UniversalContract$is PerceivableOr -> uncheckedCast(replaceStartEnd(p.left, start, end) or replaceStartEnd(p.right, start, end)) - MaxLineLength:UniversalContract.kt$UniversalContract$is RollOut -> RollOut(arr.startDate, arr.endDate, arr.frequency, replaceFixing(tx, arr.template, fixings, unusedFixings)) - MaxLineLength:UniversalContract.kt$UniversalContract$val action = actions[value.name] ?: throw IllegalArgumentException("Failed requirement: action must be defined") - MaxLineLength:UniversalContract.kt$UniversalContract$val schedule = BusinessCalendar.createGenericSchedule(start, rollOut.frequency, noOfAdditionalPeriods = 1, endDate = end) - MaxLineLength:UnstartedFlowTransition.kt$UnstartedFlowTransition$Action.PersistCheckpoint(context.id, currentState.checkpoint, isCheckpointUpdate = currentState.isAnyCheckpointPersisted) MaxLineLength:UnstartedFlowTransition.kt$UnstartedFlowTransition$SenderDeduplicationId(DeduplicationId.createForNormal(currentState.checkpoint, 0, initiatedState), currentState.senderUUID) - MaxLineLength:UnstartedFlowTransition.kt$UnstartedFlowTransition$deduplicationSeed = "D-${initiatingMessage.initiatorSessionId.toLong}-${initiatingMessage.initiationEntropy}" - MaxLineLength:Util.kt$arrangement.actions.fold(ImmutableSet.builder<Party>(), { builder, k -> builder.addAll(involvedPartiesVisitor(k)) }).build() MaxLineLength:Util.kt$arrangement.actions.fold(ImmutableSet.builder<PublicKey>(), { builder, k -> builder.addAll(liablePartiesVisitor(k)) }).build() MaxLineLength:Util.kt$arrangement.arrangements.fold(ImmutableSet.builder<Party>(), { builder, k -> builder.addAll(involvedPartiesVisitor(k)) }).build() MaxLineLength:Util.kt$arrangement.arrangements.fold(ImmutableSet.builder<PublicKey>(), { builder, k -> builder.addAll(liablePartiesVisitor(k)) }).build() - MaxLineLength:Util.kt$is PerceivableAnd -> Sets.union( signingParties( perceivable.left ), signingParties(perceivable.right) ).immutableCopy() - MaxLineLength:Util.kt$is PerceivableOr -> Sets.union( signingParties( perceivable.left ), signingParties(perceivable.right) ).immutableCopy() - MaxLineLength:Util.kt$net.corda.finance.contracts.universal.Util.kt - MaxLineLength:Utils.kt$ fun <SNAPSHOT, ELEMENT> DataFeed<SNAPSHOT, ELEMENT>.doOnError(action: (Throwable) -> Unit): DataFeed<SNAPSHOT, ELEMENT> - MaxLineLength:Utils.kt$ fun <SNAPSHOT, ELEMENT> DataFeed<SNAPSHOT, ELEMENT>.mapErrors(transform: (Throwable) -> Throwable): DataFeed<SNAPSHOT, ELEMENT> - MaxLineLength:Utils.kt$ fun <T> Observable<T>.notUsed() - MaxLineLength:Utils.kt$ fun TransactionBuilder.addAttachmentOnce(att: SecureHash?): TransactionBuilder - MaxLineLength:Utils.kt$@Suppress("UNCHECKED_CAST") inline - MaxLineLength:Utils.kt$StateRefHere MaxLineLength:Utils.kt$fun <TYPE> Configuration.Property.Definition.Single<TYPE>.listOrEmpty(): Configuration.Property.Definition<List<TYPE>> - MaxLineLength:Utils.kt$fun <TYPE> PropertyDelegate.Single<TYPE>.listOrEmpty(): PropertyDelegate<List<TYPE>> MaxLineLength:Utils.kt$inline fun <TYPE, reified MAPPED> Configuration.Property.Definition.RequiredList<TYPE>.map(noinline convert: (List<TYPE>) -> MAPPED): Configuration.Property.Definition.Required<MAPPED> MaxLineLength:Utils.kt$inline fun <TYPE, reified MAPPED> Configuration.Property.Definition.RequiredList<TYPE>.mapValid(noinline convert: (List<TYPE>) -> Valid<MAPPED>): Configuration.Property.Definition.Required<MAPPED> MaxLineLength:Utils.kt$inline fun <TYPE, reified MAPPED> Configuration.Property.Definition.Standard<TYPE>.map(noinline convert: (TYPE) -> MAPPED): Configuration.Property.Definition.Standard<MAPPED> @@ -9389,18 +5035,12 @@ MaxLineLength:Utils.kt$inline fun <reified NESTED : Any> Configuration.Specification<*>.nested(specification: Configuration.Specification<NESTED>, key: String? = null, sensitive: Boolean = false): PropertyDelegate.Standard<NESTED> MaxLineLength:Utils.kt$internal fun Config.serialize(options: ConfigRenderOptions = ConfigRenderOptions.concise().setFormatted(true).setJson(true)): String MaxLineLength:Utils.kt$internal fun ConfigValue.serialize(options: ConfigRenderOptions = ConfigRenderOptions.concise().setFormatted(true).setJson(true)): String - MaxLineLength:Utils.kt$return requireNotNull(getDeclaredAnnotation(A::class.java)) { "$name needs to be annotated with ${A::class.java.name}" } MaxLineLength:Utils.kt$return results.states.firstOrNull() ?: throw IllegalArgumentException("State (type=${T::class}) corresponding to the reference $ref not found (or is spent).") - MaxLineLength:UtilsTest.kt$UtilsTest$rawConfiguration += "key1.key2" to configObject("key3" to "value2", "key4" to configObject("key5" to -2.0, "key6" to false)) - MaxLineLength:UtilsTest.kt$UtilsTest$rawConfiguration += "key7" to listOf("Hey!", true, 17, 0.0, configObject("key8" to listOf(-12.0, "HH", false), "key9" to "blah")) - MaxLineLength:V1NodeConfigurationSpec.kt$V1NodeConfigurationSpec$flowMonitorSuspensionLoggingThresholdMillis = configuration[flowMonitorSuspensionLoggingThresholdMillis] MaxLineLength:V1NodeConfigurationSpec.kt$V1NodeConfigurationSpec$private val additionalNodeInfoPollingFrequencyMsec by long().optional().withDefaultValue(Defaults.additionalNodeInfoPollingFrequencyMsec) MaxLineLength:V1NodeConfigurationSpec.kt$V1NodeConfigurationSpec$private val additionalP2PAddresses by string().mapValid(::toNetworkHostAndPort).list().optional().withDefaultValue(Defaults.additionalP2PAddresses) MaxLineLength:V1NodeConfigurationSpec.kt$V1NodeConfigurationSpec$private val certificateChainCheckPolicies by nested(CertChainPolicyConfigSpec).list().optional().withDefaultValue(Defaults.certificateChainCheckPolicies) MaxLineLength:V1NodeConfigurationSpec.kt$V1NodeConfigurationSpec$private val cordappSignerKeyFingerprintBlacklist by string().list().optional().withDefaultValue(Defaults.cordappSignerKeyFingerprintBlacklist) - MaxLineLength:V1NodeConfigurationSpec.kt$V1NodeConfigurationSpec$private val extraNetworkMapKeys by string().mapValid(::toUUID).list().optional().withDefaultValue(Defaults.extraNetworkMapKeys) MaxLineLength:V1NodeConfigurationSpec.kt$V1NodeConfigurationSpec$private val flowMonitorSuspensionLoggingThresholdMillis by duration().optional().withDefaultValue(Defaults.flowMonitorSuspensionLoggingThresholdMillis) - MaxLineLength:V1NodeConfigurationSpec.kt$V1NodeConfigurationSpec$return result.mapValid { conf -> Validated.withResult(conf as NodeConfiguration, conf.validate().map(::toError).toSet()) } MaxLineLength:V1NodeConfigurationSpec.kt$V1NodeConfigurationSpec$val messagingServerExternal = configuration[messagingServerExternal] ?: Defaults.messagingServerExternal(configuration[messagingServerAddress]) MaxLineLength:V1NodeConfigurationSpec.kt$private fun toError(validationErrorMessage: String): Configuration.Validation.Error MaxLineLength:ValidateConfigurationCli.kt$ValidateConfigurationCli$internal @@ -9408,273 +5048,111 @@ MaxLineLength:ValidateConfigurationCli.kt$ValidateConfigurationCli$val rawConfig = cmdLineOptions.rawConfiguration().doOnErrors(cmdLineOptions::logRawConfigurationErrors).optional ?: return ExitCodes.FAILURE MaxLineLength:ValidateConfigurationCli.kt$ValidateConfigurationCli.Companion$internal fun logRawConfig(config: Config) MaxLineLength:ValidateConfigurationCli.kt$ValidateConfigurationCli.Companion$logger.error(errors.joinToString(System.lineSeparator(), "Error(s) while parsing node configuration:${System.lineSeparator()}") { error -> "\t- ${error.description()}" }) - MaxLineLength:ValidateConfigurationCli.kt$ValidateConfigurationCli.Companion$private val configRenderingOptions = ConfigRenderOptions.defaults().setFormatted(true).setComments(false).setOriginComments(false) MaxLineLength:Validated.kt$Validated$ fun <MAPPED> map(convert: (TARGET) -> MAPPED): Validated<MAPPED, ERROR> MaxLineLength:Validated.kt$Validated$ fun <MAPPED> mapValid(convert: (TARGET) -> Validated<MAPPED, ERROR>): Validated<MAPPED, ERROR> MaxLineLength:Validated.kt$Validated$ fun <MAPPED_ERROR> mapErrors(convertError: (ERROR) -> MAPPED_ERROR): Validated<TARGET, MAPPED_ERROR> MaxLineLength:Validated.kt$Validated$ fun value(exceptionOnErrors: (Set<ERROR>) -> Exception = { errors -> IllegalStateException(errors.joinToString(System.lineSeparator())) }): TARGET - MaxLineLength:Validated.kt$Validated$/** * Returns the underlying value as optional, with a null result instead of an exception if validation rules were violated. */ val optional: TARGET? get() = if (isValid) value() else null MaxLineLength:Validated.kt$Validated.Companion$ fun <T, E> withResult(target: T, errors: Set<E>): Validated<T, E> - MaxLineLength:Validated.kt$Validated.Result$Unsuccessful<TARGET, ERROR> : ResultValidated - MaxLineLength:Validated.kt$Validated.Result.Successful$override - MaxLineLength:Validated.kt$Validated.Result.Unsuccessful$override - MaxLineLength:ValidatingNotaryFlow.kt$ValidatingNotaryFlow : NotaryServiceFlow MaxLineLength:ValidatingNotaryFlow.kt$ValidatingNotaryFlow$open - MaxLineLength:ValidatingNotaryServiceTests.kt$ValidatingNotaryServiceTests$SignableData(wtx.id, SignatureMetadata(1, Crypto.findSignatureScheme(alice.owningKey).schemeNumberID)) - MaxLineLength:ValidatingNotaryServiceTests.kt$ValidatingNotaryServiceTests$assertThat(notaryError.cause).hasMessageContaining("Transaction for notarisation doesn't contain network parameters hash.") - MaxLineLength:ValidatingNotaryServiceTests.kt$ValidatingNotaryServiceTests$private - MaxLineLength:ValidatingNotaryServiceTests.kt$ValidatingNotaryServiceTests$val modifiedSignature = NotarisationRequestSignature(randomKeyPair.sign(bytesToSign), aliceNode.services.myInfo.platformVersion) MaxLineLength:ValidatingNotaryServiceTests.kt$ValidatingNotaryServiceTests.<no name provided>$val alteredMessage = InMemoryMessage(message.topic, OpaqueBytes(alteredMessageData.serialize().bytes), message.uniqueMessageId) - MaxLineLength:Validator.kt$Validator$ fun validate(target: TARGET, options: OPTIONS): Validated<TARGET, ERROR> - MaxLineLength:VaultFiller.kt$CommodityState$override - MaxLineLength:VaultFiller.kt$CommodityState$override fun withNewOwner(newOwner: AbstractParty) MaxLineLength:VaultFiller.kt$VaultFiller MaxLineLength:VaultFiller.kt$VaultFiller$ // TODO: need to make all FungibleAsset commands (issue, move, exit) generic fun fillWithSomeTestCommodity(amount: Amount<Commodity>, issuerServices: ServiceHub, issuedBy: PartyAndReference): Vault<CommodityState> - MaxLineLength:VaultFiller.kt$VaultFiller$ fun fillWithSomeTestCash(howMuch: Amount<Currency>, issuerServices: ServiceHub, atLeastThisManyStates: Int, atMostThisManyStates: Int, issuedBy: PartyAndReference, owner: AbstractParty? = null, rng: Random? = null, statesToRecord: StatesToRecord = StatesToRecord.ONLY_RELEVANT): Vault<Cash.State> MaxLineLength:VaultFiller.kt$VaultFiller$ fun generateCommoditiesIssue(tx: TransactionBuilder, amount: Amount<Issued<Commodity>>, owner: AbstractParty, notary: Party) - MaxLineLength:VaultFiller.kt$VaultFiller$addOutputState(DummyDealContract.State(ref = "test ref", participants = participants.plus(me)), DUMMY_DEAL_PROGRAM_ID) - MaxLineLength:VaultFiller.kt$VaultFiller$addOutputState(DummyDealContract.State(ref = it, participants = participantsToUse), DUMMY_DEAL_PROGRAM_ID) MaxLineLength:VaultFiller.kt$VaultFiller$cash.generateIssue(issuance, Amount(pennies, Issued(issuedBy, howMuch.token)), owner ?: services.myInfo.singleIdentity(), altNotary) - MaxLineLength:VaultFiller.kt$VaultFiller$fun evolveLinearState(linearState: StateAndRef<LinearState>): StateAndRef<LinearState> MaxLineLength:VaultFiller.kt$VaultFiller$statesToRecord: StatesToRecord = StatesToRecord.ONLY_RELEVANT - MaxLineLength:VaultFiller.kt$VaultFiller$val amounts = calculateRandomlySizedAmounts(howMuch, atLeastThisManyStates, atMostThisManyStates, rng ?: rngFactory()) MaxLineLength:VaultFiller.kt$VaultFiller$val signatureMetadata = SignatureMetadata(services.myInfo.platformVersion, Crypto.findSignatureScheme(issuerKey.public).schemeNumberID) - MaxLineLength:VaultFiller.kt$VaultFiller.Companion${ val numSlots = min + Math.floor(rng.nextDouble() * (max - min)).toInt() val baseSize = howMuch.quantity / numSlots check(baseSize > 0) { baseSize } val amounts = LongArray(numSlots) { baseSize } var distanceFromGoal = 0L // If we want 10 slots then max adjust is 0.1, so even if all random numbers come out to the largest downward // adjustment possible, the last slot ends at zero. With 20 slots, max adjust is 0.05 etc. val maxAdjust = 1.0 / numSlots for (i in amounts.indices) { if (i != amounts.lastIndex) { val adjustBy = rng.nextDouble() * maxAdjust - (maxAdjust / 2) val adjustment = (1 + adjustBy) val adjustTo = (amounts[i] * adjustment).toLong() amounts[i] = adjustTo distanceFromGoal += baseSize - adjustTo } else { amounts[i] += distanceFromGoal } } // The desired amount may not have divided equally to start with, so adjust the first value to make up. amounts[0] += howMuch.quantity - amounts.sum() return amounts } - MaxLineLength:VaultFlowTest.kt$VaultFlowTest.Initiator$addOutputState(UniqueDummyLinearContract.State(participants, "Dummy linear id"), UNIQUE_DUMMY_LINEAR_CONTRACT_PROGRAM_ID) - MaxLineLength:VaultFlowTest.kt$VaultFlowTest.Initiator$val stx = serviceHub.signInitialTransaction(TransactionBuilder(serviceHub.networkMapCache.notaryIdentities.first()).apply { addOutputState(UniqueDummyLinearContract.State(participants, "Dummy linear id"), UNIQUE_DUMMY_LINEAR_CONTRACT_PROGRAM_ID) addOutputState(DummyDealContract.State(participants, "linear id"), DUMMY_DEAL_PROGRAM_ID) addCommand(DummyCommandData, listOf(ourIdentity.owningKey)) }) MaxLineLength:VaultQueryTests.kt$VaultQueryTestRule$(notaryServices.myInfo.legalIdentitiesAndCerts + BOC_IDENTITY + CASH_NOTARY_IDENTITY + MINI_CORP_IDENTITY + MEGA_CORP_IDENTITY) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestRule$makeTestIdentityService(MEGA_CORP_IDENTITY, MINI_CORP_IDENTITY, dummyCashIssuer.identity, dummyNotary.identity) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestRule$notaryServices = MockServices(cordappPackages, dummyNotary, mock(), dummyCashIssuer.keyPair, BOC_KEY, MEGA_CORP_KEY) - MaxLineLength:VaultQueryTests.kt$VaultQueryTests$require(produced.filter { ContractState::class.java.isAssignableFrom(it.state.data::class.java) }.size == 20) {} - MaxLineLength:VaultQueryTests.kt$VaultQueryTests$require(produced.filter { DealState::class.java.isAssignableFrom(it.state.data::class.java) }.size == 10) {} MaxLineLength:VaultQueryTests.kt$VaultQueryTests$require(produced.filter { DummyDealContract.State::class.java.isAssignableFrom(it.state.data::class.java) }.size == 10) {} - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$/** * Query result returns a [Vault.Page] which contains: * 1) actual states as a list of [StateAndRef] * 2) state reference and associated vault metadata as a list of [Vault.StateMetadata] * 3) [PageSpecification] used to delimit the size of items returned in the result set (defaults to [DEFAULT_PAGE_SIZE]) * 4) Total number of items available (to aid further pagination if required) */ val states = result.states MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$// Beware: do not use `MyContractClass::class.qualifiedName` as this returns a fully qualified name using "dot" notation for enclosed class val MYCONTRACT_ID = "net.corda.node.services.vault.VaultQueryTestsBase\$MyContractClass" MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$@Suppress("EXPECTED_CONDITION") val pagingSpec = PageSpecification(DEFAULT_PAGE_NUM, @Suppress("INTEGER_OVERFLOW") Integer.MAX_VALUE + 1) // overflow = -2147483648 - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `logical operator NOT LIKE does not return results containing the same characters as the case insensitive string`() MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `logical operator case insensitive NOT IN does not return results containing the same characters as the case insensitive strings`() MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$@Test fun `logical operator case insensitive NOT_EQUAL does not return results containing the same characters as the case insensitive string`() - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$CashSchemaV1.PersistentCashState::pennies - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$CommercialPaperUtils.generateIssue(issuance, faceValue, TEST_TX_TIME + 30.days, DUMMY_NOTARY) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$CommercialPaperUtils.generateIssue(issuance, faceValue2, TEST_TX_TIME + 30.days, DUMMY_NOTARY) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$MyState : BaseState MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$QueryCriteria.TimeInstantType.CONSUMED - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$Sort.Direction.ASC -> assertThat(allStates.sortedBy { it.ref.txhash }.sortedBy { it.ref.index }).isEqualTo(allStates) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$Sort.Direction.ASC -> assertThat(allStates.sortedBy { it.state.data.linearNumber }.sortedBy { it.ref.txhash }.sortedBy { it.ref.index }).isEqualTo(allStates) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$Sort.Direction.DESC -> assertThat(allStates.sortedByDescending { it.ref.txhash }.sortedByDescending { it.ref.index }).isEqualTo(allStates) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$Sort.Direction.DESC -> assertThat(allStates.sortedByDescending { it.state.data.linearNumber }.sortedBy { it.ref.txhash }.sortedBy { it.ref.index }).isEqualTo(allStates) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$assertThat(constraintResults.states.map { it.state.constraint }).containsAll(listOf(constraintHash, constraintSignature, constraintSignatureCompositeKey)) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$assertThat(constraintResults4.states.map { it.state.constraint }).containsAll(listOf(constraintSignature, constraintSignatureCompositeKey)) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$assertThat(enrichedResults.map { it.state.constraint }).containsAll(listOf(constraintSignature, alwaysAcceptConstraint)) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$assertThat(fungibleStateCountUnconsumed.toInt()).isEqualTo(10 - cashUpdates.consumed.size + cashUpdates.produced.size) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$assertThat(metadata.last().contractStateClassName).isEqualTo("net.corda.finance.contracts.asset.Cash\$State") - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$assertThat(results.states).hasSize(1) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$assertThat(results.states).hasSize(2) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$groupByColumns = listOf(SampleCashSchemaV2.PersistentCashState::currency, SampleCashSchemaV2.PersistentCashState::stateRef) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$listOf(10.DOLLARS, 25.POUNDS, 50.POUNDS, 100.SWISS_FRANCS).zip(listOf(3, 1, 1, 3)) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$listOf(100.DOLLARS, 200.DOLLARS, 300.DOLLARS, 400.POUNDS, 500.SWISS_FRANCS).zip(1..5) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$listOf(100.DOLLARS, 200.DOLLARS, 300.POUNDS, 400.POUNDS, 500.SWISS_FRANCS, 600.SWISS_FRANCS).zip(1..6) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$softLockingCondition = QueryCriteria.SoftLockingCondition(QueryCriteria.SoftLockingType.UNLOCKED_AND_SPECIFIED, listOf(UUID.randomUUID())) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val allStates = vaultService.queryBy<DummyLinearContract.State>(sorting = sorting, criteria = criteria).states MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val alwaysAcceptConstraint = vaultFiller.fillWithSomeTestLinearStates(1, constraint = AlwaysAcceptAttachmentConstraint).states.first().state.constraint MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val avg = builder { CashSchemaV1.PersistentCashState::pennies.avg(groupByColumns = listOf(CashSchemaV1.PersistentCashState::currency)) } - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val baseCriteria = VaultQueryCriteria(constraints = setOf(Vault.ConstraintInfo(AlwaysAcceptAttachmentConstraint))) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val ccyIndex = builder { CashSchemaV1.PersistentCashState::pennies.sum(groupByColumns = listOf(CashSchemaV1.PersistentCashState::currency)) } - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val ccyIndex = builder { CommercialPaperSchemaV1.PersistentCommercialPaperState::currency.equal(USD.currencyCode) } - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val chfCashIssuerName = CordaX500Name(organisation = "Swiss Francs Cash Issuer", locality = "Zurich", country = "CH") MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val compositeKey = CompositeKey.Builder().addKeys(alice.publicKey, bob.publicKey, charlie.publicKey, bankOfCorda.publicKey, bigCorp.publicKey, megaCorp.publicKey, miniCorp.publicKey, cashNotary.publicKey, dummyNotary.publicKey, dummyCashIssuer.publicKey).build() - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val constraintCriteria1 = VaultQueryCriteria(constraints = setOf(Vault.ConstraintInfo(AlwaysAcceptAttachmentConstraint))) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val constraintCriteria3 = VaultQueryCriteria(constraints = setOf(Vault.ConstraintInfo(constraintSignatureCompositeKey))) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val constraintSignature = linearStateSignature.states.first().state.constraint as SignatureAttachmentConstraint MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val constraintSignatureCompositeKey = linearStateSignatureCompositeKey.states.first().state.constraint as SignatureAttachmentConstraint MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val criteriaByLockId = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.SPECIFIED, listOf(lockId1))) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val criteriaByLockIds = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.SPECIFIED, listOf(lockId1, lockId2))) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val criteriaExclusive = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.UNLOCKED_ONLY)) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val criteriaLockedOnly = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.LOCKED_ONLY)) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val criteriaMissingLockId = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.UNLOCKED_AND_SPECIFIED)) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val criteriaUnlockedAndByLockId = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.UNLOCKED_AND_SPECIFIED, listOf(lockId2))) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val database = configureDatabase(makePersistentDataSourceProperties(), DatabaseConfig(), identitySvc::wellKnownPartyFromX500Name, identitySvc::wellKnownPartyFromAnonymous) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val dealStateCountConsumed = vaultService.queryBy<DealState>(countCriteriaConsumed).otherResults.single() as Long - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val dealStateCountUnconsumed = vaultService.queryBy<DealState>(countCriteriaUnconsumed).otherResults.single() as Long MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val externalIds = listOf(linearState1.states.first().state.data.linearId.externalId!!, linearState3.states.first().state.data.linearId.externalId!!) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val faceValueIndex = CommercialPaperSchemaV1.PersistentCommercialPaperState::faceValue.greaterThanOrEqual(10000L) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val fungibleAssetStateCriteria = FungibleAssetQueryCriteria(participants = listOf(services.myInfo.singleIdentity())) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val fungibleStateCountConsumed = vaultService.queryBy<FungibleAsset<*>>(countCriteriaConsumed).otherResults.single() as Long - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val fungibleStateCountUnconsumed = vaultService.queryBy<FungibleAsset<*>>(countCriteriaUnconsumed).otherResults.single() as Long - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val gbpCashIssuerName = CordaX500Name(organisation = "British Pounds Cash Issuer", locality = "London", country = "GB") MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val issuedStates = vaultFillerCashNotary.fillWithSomeTestCash(100.DOLLARS, notaryServices, 10, DUMMY_CASH_ISSUER).states.toList() - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearIds = listOf(linearState1.states.first().state.data.linearId, linearState3.states.first().state.data.linearId) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearState2 = vaultFiller.evolveLinearState(linearState) // consume current and produce new state reference - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearState3 = vaultFiller.evolveLinearState(linearState2) // consume current and produce new state reference - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearStateCountConsumed = vaultService.queryBy<LinearState>(countCriteriaConsumed).otherResults.single() as Long - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearStateCountUnconsumed = vaultService.queryBy<LinearState>(countCriteriaUnconsumed).otherResults.single() as Long - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearStateCriteria = LinearStateQueryCriteria(linearId = listOf(linearId), status = Vault.StateStatus.ALL) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearStateCriteria = LinearStateQueryCriteria(linearId = txns.states.map { it.state.data.linearId }, status = Vault.StateStatus.CONSUMED) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearStateCriteria = LinearStateQueryCriteria(uuid = linearStates.map { it.state.data.linearId.id }, status = Vault.StateStatus.ALL) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearStateHash = vaultFiller.fillWithSomeTestLinearStates(1, constraint = AutomaticPlaceholderConstraint) // defaults to the HashConstraint MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearStateHash = vaultFiller.fillWithSomeTestLinearStates(1, constraint = AutomaticPlaceholderConstraint) // defaults to the hash constraint. MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearStateSignature = vaultFiller.fillWithSomeTestLinearStates(1, constraint = SignatureAttachmentConstraint(alice.publicKey)) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearStateSignatureCompositeKey = vaultFiller.fillWithSomeTestLinearStates(1, constraint = SignatureAttachmentConstraint(compositeKey)) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val linearStates = vaultFiller.fillWithSomeTestLinearStates(2, "TEST") // create 2 states with same externalId - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val logicalExpression = builder { CashSchemaV1.PersistentCashState::pennies.`in`(listOf(10000L, 20000L), false) } - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val logicalExpression = builder { CashSchemaV1.PersistentCashState::pennies.notIn(listOf(10000L, 20000L), false) } MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val maturityIndex = CommercialPaperSchemaV1.PersistentCommercialPaperState::maturity.greaterThanOrEqual(TEST_TX_TIME + 30.days) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val max = builder { CashSchemaV1.PersistentCashState::pennies.max(groupByColumns = listOf(CashSchemaV1.PersistentCashState::currency)) } MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val max = builder { CashSchemaV1.PersistentCashState::pennies.max(groupByColumns = listOf(CashSchemaV1.PersistentCashState::currency), orderBy = Sort.Direction.DESC) } MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val min = builder { CashSchemaV1.PersistentCashState::pennies.min(groupByColumns = listOf(CashSchemaV1.PersistentCashState::currency)) } MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val min = builder { CashSchemaV1.PersistentCashState::pennies.min(groupByColumns = listOf(CashSchemaV1.PersistentCashState::currency), orderBy = Sort.Direction.DESC) } - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val newAllStates = vaultService.queryBy<DummyLinearContract.State>(sorting = sorting, criteria = criteria).states - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val page = vaultService.queryBy<DummyLinearContract.State>(sorting = sorting, paging = paging, criteria = criteria) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val result = vaultService.queryBy<ContractState>(VaultQueryCriteria(status = Vault.StateStatus.ALL), sorting = sorting) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val results = services.vaultService.queryBy<FungibleAsset<*>>(baseCriteria and enrichedCriteria, sorter).states - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val results = vaultService.queryBy<Cash.State>(criteria, Sort(setOf(Sort.SortColumn(sortAttribute, Sort.Direction.ASC)))) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val results = vaultService.queryBy<DummyLinearContract.State>(criteria, Sort(setOf(Sort.SortColumn(sortAttribute, Sort.Direction.ASC)))) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val resultsComposite = vaultService.queryBy<ContractState>(linearStateCriteria.or(fungibleAssetStateCriteria)) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val resultsCompositeAnd = vaultService.queryBy<ContractState>(fungibleAssetStateCriteria.and(linearStateCriteria)) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val resultsCompositeOr = vaultService.queryBy<ContractState>(fungibleAssetStateCriteria.or(linearStateCriteria)) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val signatureMetadata = SignatureMetadata(services.myInfo.platformVersion, Crypto.findSignatureScheme(issuerKey.public).schemeNumberID) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val signedStatesExitingTx = services.signInitialTransaction(statesExitingTx).withAdditionalSignature(issuerKey, signatureMetadata) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val sortAttribute = SortAttribute.Custom(DummyLinearStateSchemaV1.PersistentDummyLinearState::class.java, "linearNumber") - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val sortAttribute = SortAttribute.Custom(DummyLinearStateSchemaV1.PersistentDummyLinearState::class.java, "stateRef") - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val sortCol1 = Sort.SortColumn(SortAttribute.Standard(Sort.VaultStateAttribute.CONTRACT_STATE_TYPE), Sort.Direction.DESC) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val sortCol2 = Sort.SortColumn(SortAttribute.Standard(Sort.VaultStateAttribute.STATE_STATUS), Sort.Direction.ASC) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val sortCol3 = Sort.SortColumn(SortAttribute.Standard(Sort.VaultStateAttribute.CONSUMED_TIME), Sort.Direction.DESC) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val sorting = Sort(setOf(Sort.SortColumn(SortAttribute.Custom(DummyLinearStateSchemaV1.PersistentDummyLinearState::class.java, "linearString"), Sort.Direction.DESC))) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val sorting = Sort(setOf(Sort.SortColumn(SortAttribute.Standard(Sort.LinearStateAttribute.EXTERNAL_ID), Sort.Direction.DESC))) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val sorting = Sort(setOf(Sort.SortColumn(SortAttribute.Standard(Sort.LinearStateAttribute.UUID), Sort.Direction.DESC))) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val statesExitingTx = TransactionBuilder(notary.party).withItems(*states.toList().toTypedArray()).addCommand(dummyCommand()) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val sum = builder { CashSchemaV1.PersistentCashState::pennies.sum(groupByColumns = listOf(CashSchemaV1.PersistentCashState::currency)) } MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val sum = builder { CashSchemaV1.PersistentCashState::pennies.sum(groupByColumns = listOf(CashSchemaV1.PersistentCashState::currency), orderBy = Sort.Direction.DESC) } - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val usdCashIssuerName = CordaX500Name(organisation = "US Dollars Cash Issuer", locality = "New York", country = "US") MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$val utx = TransactionBuilder(notary = notaryServices.myInfo.singleIdentity()).withItems(stateAndContract).withItems(dummyCommand()) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$vaultFiller.fillWithSomeTestCash(100.DOLLARS, notaryServices, 1, BOC.ref(0), MINI_CORP) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$vaultFiller.fillWithSomeTestCash(100.DOLLARS, notaryServices, 1, DUMMY_CASH_ISSUER, services.myInfo.singleIdentity()) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$vaultFiller.fillWithSomeTestCommodity(Amount(100, Commodity.getInstance("FCOJ")!!), notaryServices, DUMMY_OBLIGATION_ISSUER.ref(1)) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$vaultFiller.fillWithSomeTestLinearStates(1, "TEST1") vaultFiller.fillWithSomeTestDeals(listOf("123")) vaultFiller.fillWithSomeTestCash(100.DOLLARS, notaryServices, 1, DUMMY_CASH_ISSUER, services.myInfo.singleIdentity()) vaultFiller.fillWithSomeTestCommodity(Amount(100, Commodity.getInstance("FCOJ")!!), notaryServices, DUMMY_OBLIGATION_ISSUER.ref(1)) vaultFiller.fillWithDummyState() // all contract states query val results = vaultService.queryBy<ContractState>() assertThat(results.states).hasSize(5) // linear states only query val linearStateCriteria = LinearStateQueryCriteria() val resultsLSC = vaultService.queryBy<ContractState>(linearStateCriteria) assertThat(resultsLSC.states).hasSize(2) // fungible asset states only query val fungibleAssetStateCriteria = FungibleAssetQueryCriteria() val resultsFASC = vaultService.queryBy<ContractState>(fungibleAssetStateCriteria) assertThat(resultsFASC.states).hasSize(2) // composite OR query for both linear and fungible asset states (eg. all states in either Fungible and Linear states tables) val resultsCompositeOr = vaultService.queryBy<ContractState>(fungibleAssetStateCriteria.or(linearStateCriteria)) assertThat(resultsCompositeOr.states).hasSize(4) // composite AND query for both linear and fungible asset states (eg. all states in both Fungible and Linear states tables) val resultsCompositeAnd = vaultService.queryBy<ContractState>(fungibleAssetStateCriteria.and(linearStateCriteria)) assertThat(resultsCompositeAnd.states).hasSize(0) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$vaultFiller.fillWithSomeTestLinearStates(1, constraint = AlwaysAcceptAttachmentConstraint).states.first().state.constraint - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$vaultFiller.fillWithSomeTestLinearStates(1, constraint = AutomaticPlaceholderConstraint) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$vaultFiller.fillWithSomeTestLinearStates(1, constraint = WhitelistedByZoneAttachmentConstraint).states.first().state.constraint MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$vaultFillerCashNotary.fillWithSomeTestCash(100.DOLLARS, notaryServices, 10, DUMMY_CASH_ISSUER, charlie.party, statesToRecord = StatesToRecord.ALL_VISIBLE) MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$vaultFillerCashNotary.fillWithSomeTestCash(100.DOLLARS, notaryServices, 10, DUMMY_CASH_ISSUER, statesToRecord = StatesToRecord.ALL_VISIBLE) - MaxLineLength:VaultQueryTests.kt$VaultQueryTestsBase$vaultService.softLockReserve(UUID.randomUUID(), NonEmptySet.of(issuedStates[1].ref, issuedStates[2].ref, issuedStates[3].ref)) - MaxLineLength:VaultRestartTest.kt$VaultRestartTest$val node = startNode(providedName = DUMMY_BANK_A_NAME, customOverrides = mapOf("p2pAddress" to "localhost:30000")).getOrThrow() MaxLineLength:VaultRestartTest.kt$VaultRestartTest$val restartedNode = startNode(providedName = DUMMY_BANK_A_NAME, customOverrides = mapOf("p2pAddress" to "localhost:30000")).getOrThrow() MaxLineLength:VaultSchema.kt$VaultSchemaV1.PersistentStateRefAndKey$@Embeddable @Immutable data MaxLineLength:VaultSchema.kt$VaultSchemaV1.VaultLinearStates$@Table(name = "vault_linear_states", indexes = [Index(name = "external_id_index", columnList = "external_id"), Index(name = "uuid_index", columnList = "uuid")]) MaxLineLength:VaultSchema.kt$VaultSchemaV1.VaultStates$@Table(name = "vault_states", indexes = [Index(name = "state_status_idx", columnList = "state_status"), Index(name = "lock_id_idx", columnList = "lock_id, state_status")]) MaxLineLength:VaultSchema.kt$VaultSchemaV1.VaultTxnNote$@Table(name = "vault_transaction_notes", indexes = [Index(name = "seq_no_index", columnList = "seq_no"), Index(name = "transaction_id_index", columnList = "transaction_id")]) - MaxLineLength:VaultService.kt$StatesNotAvailableException : FlowException - MaxLineLength:VaultService.kt$Vault$Update<U : ContractState> - MaxLineLength:VaultService.kt$Vault.Companion$@Deprecated("No longer used. The vault does not emit empty updates") val NoNotaryUpdate = Vault.Update(emptySet(), emptySet(), type = Vault.UpdateType.NOTARY_CHANGE, references = emptySet()) - MaxLineLength:VaultService.kt$Vault.StateMetadata$return StateMetadata(ref, contractStateClassName, recordedTime, consumedTime, status, notary, lockId, lockUpdateTime, null) MaxLineLength:VaultService.kt$Vault.StateMetadata$return StateMetadata(ref, contractStateClassName, recordedTime, consumedTime, status, notary, lockId, lockUpdateTime, relevancyStatus, ConstraintInfo(AlwaysAcceptAttachmentConstraint)) - MaxLineLength:VaultService.kt$Vault.Update$ operator fun plus(rhs: Update<U>): Update<U> - MaxLineLength:VaultService.kt$Vault.Update$/** * Specifies the type of update, currently supported types are general and, contract upgrade and notary change. * Notary change transactions only modify the notary field on states, and potentially need to be handled * differently. */ val type: UpdateType = UpdateType.GENERAL MaxLineLength:VaultService.kt$Vault.Update$inline - MaxLineLength:VaultService.kt$Vault.Update$return copy(consumed = combinedConsumed, produced = combinedProduced, references = references + rhs.references) MaxLineLength:VaultService.kt$Vault.Update${ require(rhs.type == type) { "Cannot combine updates of different types" } val combinedConsumed = consumed + (rhs.consumed - produced) // The ordering below matters to preserve ordering of consumed/produced Sets when they are insertion order dependent implementations. val combinedProduced = produced.filter { it !in rhs.consumed }.toSet() + rhs.produced return copy(consumed = combinedConsumed, produced = combinedProduced, references = references + rhs.references) } - MaxLineLength:VaultService.kt$VaultService$ @Suspendable @Throws(StatesNotAvailableException::class) fun <T : FungibleState<*>> tryLockFungibleStatesForSpending(lockId: UUID, eligibleStatesQuery: QueryCriteria, amount: Amount<*>, contractStateType: Class<out T>): List<StateAndRef<T>> - MaxLineLength:VaultService.kt$VaultService$ @Throws(VaultQueryException::class) fun <T : ContractState> _queryBy(criteria: QueryCriteria, paging: PageSpecification, sorting: Sort, contractStateType: Class<out T>): Vault.Page<T> - MaxLineLength:VaultService.kt$VaultService$/** * Prefer the use of [updates] unless you know why you want to use this instead. * * Get a synchronous [Observable] of updates. When observations are pushed to the Observer, the [Vault] will already * incorporate the update, and the database transaction associated with the update will still be open and current. * If for some reason the processing crosses outside of the database transaction (for example, the update is pushed * outside the current JVM or across to another [Thread], which is executing in a different database transaction), * then the [Vault] may not incorporate the update due to racing with committing the current database transaction. */ val rawUpdates: Observable<Vault.Update<ContractState>> - MaxLineLength:VaultService.kt$VaultService$doneFuture(Vault.Update(consumed = setOf(snapshot.single()), produced = emptySet(), references = emptySet())) - MaxLineLength:VaultService.kt$VaultService$fun <T : ContractState> queryBy(contractStateType: Class<out T>, criteria: QueryCriteria, paging: PageSpecification): Vault.Page<T> MaxLineLength:VaultService.kt$VaultService$fun <T : ContractState> queryBy(contractStateType: Class<out T>, criteria: QueryCriteria, paging: PageSpecification, sorting: Sort): Vault.Page<T> - MaxLineLength:VaultService.kt$VaultService$fun <T : ContractState> queryBy(contractStateType: Class<out T>, criteria: QueryCriteria, sorting: Sort): Vault.Page<T> - MaxLineLength:VaultService.kt$VaultService$fun <T : ContractState> trackBy(contractStateType: Class<out T>, criteria: QueryCriteria): DataFeed<Vault.Page<T>, Vault.Update<T>> MaxLineLength:VaultService.kt$VaultService$fun <T : ContractState> trackBy(contractStateType: Class<out T>, criteria: QueryCriteria, paging: PageSpecification): DataFeed<Vault.Page<T>, Vault.Update<T>> MaxLineLength:VaultService.kt$VaultService$fun <T : ContractState> trackBy(contractStateType: Class<out T>, criteria: QueryCriteria, paging: PageSpecification, sorting: Sort): DataFeed<Vault.Page<T>, Vault.Update<T>> MaxLineLength:VaultService.kt$VaultService$fun <T : ContractState> trackBy(contractStateType: Class<out T>, criteria: QueryCriteria, sorting: Sort): DataFeed<Vault.Page<T>, Vault.Update<T>> - MaxLineLength:VaultService.kt$VaultService$fun <T : ContractState> trackBy(contractStateType: Class<out T>, paging: PageSpecification): DataFeed<Vault.Page<T>, Vault.Update<T>> MaxLineLength:VaultService.kt$inline - MaxLineLength:VaultServiceInternal.kt$VaultServiceInternal$ fun notify(statesToRecord: StatesToRecord, tx: CoreTransaction) MaxLineLength:VaultServiceInternal.kt$VaultServiceInternal$ fun notifyAll(statesToRecord: StatesToRecord, txns: Iterable<CoreTransaction>, previouslySeenTxns: Iterable<CoreTransaction> = emptyList()) MaxLineLength:VaultSoftLockManagerTest.kt$NodePair$internals.disableDBCloseOnStop() // Otherwise the in-memory database may disappear (taking the checkpoint with it) while we reboot the client. - MaxLineLength:VaultSoftLockManagerTest.kt$NodePair$server.registerCoreFlowFactory(AbstractClientLogic::class.java, ServerLogic::class.java, { ServerLogic(it, serverRunning) }, false) - MaxLineLength:VaultSoftLockManagerTest.kt$NodePair.ServerLogic$private - MaxLineLength:VaultSoftLockManagerTest.kt$VaultSoftLockManagerTest$ClientLogic : AbstractClientLogic - MaxLineLength:VaultSoftLockManagerTest.kt$VaultSoftLockManagerTest$private - MaxLineLength:VaultSoftLockManagerTest.kt$VaultSoftLockManagerTest${ assertEquals(emptyList(), fsm.resultFuture.getOrThrow()) // In this case we don't want softLockRelease called so that we avoid its expensive query, even after restore from checkpoint. } - MaxLineLength:VaultSoftLockManagerTest.kt$VaultSoftLockManagerTest.<no name provided>.<no name provided>$mockVault.softLockRelease(lockId, stateRefs) MaxLineLength:VaultSoftLockManagerTest.kt$VaultSoftLockManagerTest.ClientLogic$return serviceHub.vaultService.queryBy<ContractState>(VaultQueryCriteria(softLockingCondition = SoftLockingCondition(LOCKED_ONLY))).states.map { it.state.data } - MaxLineLength:VaultSoftLockManagerTest.kt$VaultSoftLockManagerTest.FungibleAssetImpl$@BelongsToContract(ContractImpl::class) private - MaxLineLength:VaultSoftLockManagerTest.kt$VaultSoftLockManagerTest.FungibleAssetImpl$override fun withNewOwnerAndAmount(newAmount: Amount<Issued<Unit>>, newOwner: AbstractParty) - MaxLineLength:VaultStateMigration.kt$VaultMigrationSchema - MaxLineLength:VaultStateMigration.kt$VaultStateIterator : Iterator - MaxLineLength:VaultStateMigration.kt$VaultStateIterator$// The rest of this class is an attempt at multithreading that was ultimately scuppered by liquibase not providing a connection pool. // This may be useful as a starting point for improving performance of the migration, so is left here. To start using it, remove the // serialization environment changes in the execute function in the migration, and change forEach -> parallelForEach. private val pool = ForkJoinPool.commonPool() - MaxLineLength:VaultStateMigration.kt$VaultStateIterator$criteriaBuilder MaxLineLength:VaultStateMigration.kt$VaultStateIterator$logger.debug("Loaded page $pageNumber of ${(numStates - 1 / pageNumber.toLong()) + 1}. Current page has ${result.size} vault states") - MaxLineLength:VaultStateMigration.kt$VaultStateIterator$private - MaxLineLength:VaultStateMigration.kt$VaultStateIterator${ endTransaction() transaction = database.newTransaction() val query = createVaultStatesQuery(VaultSchemaV1.VaultStates::class.java) { it } // The above query excludes states that have entries in the state party table. As the iteration proceeds, each state has entries // added to this table. The result is that when the next page is retrieved, any results that were in the previous page are not in // the query at all! As such, the next set of states that need processing start at the first result. query.firstResult = 0 query.maxResults = pageSize pageNumber++ val result = query.resultList logger.debug("Loaded page $pageNumber of ${(numStates - 1 / pageNumber.toLong()) + 1}. Current page has ${result.size} vault states") return result } MaxLineLength:VaultStateMigration.kt$VaultStateIterator.Companion$effectiveSerializationEnv.serializationFactory - MaxLineLength:VaultStateMigration.kt$VaultStateIterator.Companion.AMQPInspectorSerializationScheme$override - MaxLineLength:VaultStateMigration.kt$VaultStateIterator.Companion.AMQPInspectorSerializationScheme$override fun rpcClientSerializerFactory(context: SerializationContext) - MaxLineLength:VaultStateMigration.kt$VaultStateIterator.Companion.AMQPInspectorSerializationScheme$override fun rpcServerSerializerFactory(context: SerializationContext) MaxLineLength:VaultStateMigration.kt$VaultStateIterator.VaultPageTask$effectiveSerializationEnv.serializationFactory MaxLineLength:VaultStateMigration.kt$VaultStateIterator.VaultPageTask$return listOf(VaultPageTask(database, page.subList(0, pageSize / 2), block), VaultPageTask(database, page.subList(pageSize / 2, pageSize), block)) - MaxLineLength:VaultStateMigration.kt$VaultStateMigration$logger - MaxLineLength:VaultStateMigration.kt$VaultStateMigration$logger.info("Finished performing vault state data migration for ${persistentStates.numStates - statesSkipped} states") - MaxLineLength:VaultStateMigration.kt$VaultStateMigration$throw VaultStateMigrationException("Cannot add state parties for state ${stateAndRef.ref} as state class is not on the " + "classpath and participants cannot be synthesised") - MaxLineLength:VaultStateMigration.kt$VaultStateMigration$throw VaultStateMigrationException("Cannot migrate vault states as liquibase failed to provide a suitable database connection") - MaxLineLength:VaultStateMigration.kt$VaultStateMigration$throw VaultStateMigrationException("Failed to migrate $statesSkipped states in the vault. Check the logs for details of the " + "error for each state.") - MaxLineLength:VaultStateMigration.kt$VaultStateMigration$val myKeys = identityService.stripNotOurKeys(stateAndRef.state.data.participants.map { participant -> participant.owningKey }).toSet() - MaxLineLength:VaultStateMigration.kt$VaultStateMigration${ // This should only happen if there was no attachment that could be used to deserialise the output states, and the state was // serialised such that the participants list cannot be accessed (participants is calculated and not marked as a // SerializableCalculatedProperty. throw VaultStateMigrationException("Cannot add state parties for state ${stateAndRef.ref} as state class is not on the " + "classpath and participants cannot be synthesised") } - MaxLineLength:VaultStateMigration.kt$VaultStateMigration${ val stateAndRef = getStateAndRef(it) addStateParties(session, stateAndRef) // Can get away without checking for AbstractMethodErrors here as these will have already occurred when trying to add // state parties. val myKeys = identityService.stripNotOurKeys(stateAndRef.state.data.participants.map { participant -> participant.owningKey }).toSet() if (!NodeVaultService.isRelevant(stateAndRef.state.data, myKeys)) { it.relevancyStatus = Vault.RelevancyStatus.NOT_RELEVANT } } - MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest$OnLedgerAsset.generateIssue(txBuilder, TransactionState(CommodityState(amount, owner), Obligation.PROGRAM_ID, dummyNotary.party), Obligation.Commands.Issue()) MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest$cordaDB = configureDatabase(makePersistentDataSourceProperties(), DatabaseConfig(), notaryServices.identityService::wellKnownPartyFromX500Name, notaryServices.identityService::wellKnownPartyFromAnonymous) - MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest$createCommodityTransaction(Amount(it.toLong(), Issued(bankOfCorda.ref(2), Commodity.getInstance("FCOJ")!!)), owner) - MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest$createVaultStatesFromNotaryChangeTransaction(notaryTx, cashTx.coreTransaction.outputs + cashTx2.coreTransaction.outputs) - MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest$criteriaQuery.where(criteriaBuilder.equal(queryRootStates.get<Vault.RelevancyStatus>("relevancyStatus"), relevancyStatus)) - MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest$private - MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest$val notaryTx = createNotaryChangeTransaction(listOf(StateRef(cashTx.id, 0), StateRef(cashTx2.id, 0)), SecureHash.allOnesHash) MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest$val persistentIDs = certs.map { PersistentIdentityService.PersistentPublicKeyHashToCertificate(it.owningKey.toStringShort(), it.certPath.encoded) } MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest$val persistentName = PersistentIdentityService.PersistentPartyToPublicKeyHash(name.toString(), certs.first().owningKey.toStringShort()) - MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest$val signableData = SignableData(notaryTx.id, SignatureMetadata(3, Crypto.findSignatureScheme(notaryKey).schemeNumberID)) - MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest${ // Liquibase automatically closes the database connection when doing an actual migration. This test ensures the custom migration // leaves it open. addCashStates(12, ALICE) val migration = VaultStateMigration() migration.execute(liquibaseDB) assertFalse(cordaDB.dataSource.connection.isClosed) } - MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest${ // This test is a little bit of a hack - it checks that these states are migrated correctly by looking at params in the database, // but these will not be there for V3 nodes. Handling for this must be tested manually. val cashTx = createCashTransaction(Cash(), 5.DOLLARS, BOB) val cashTx2 = createCashTransaction(Cash(), 10.DOLLARS, BOB) val notaryTx = createNotaryChangeTransaction(listOf(StateRef(cashTx.id, 0), StateRef(cashTx2.id, 0)), SecureHash.allOnesHash) createVaultStatesFromTransaction(cashTx, stateStatus = Vault.StateStatus.CONSUMED) createVaultStatesFromTransaction(cashTx2, stateStatus = Vault.StateStatus.CONSUMED) createVaultStatesFromNotaryChangeTransaction(notaryTx, cashTx.coreTransaction.outputs + cashTx2.coreTransaction.outputs) storeTransaction(cashTx) storeTransaction(cashTx2) storeTransaction(notaryTx) val migration = VaultStateMigration() migration.execute(liquibaseDB) assertEquals(2, getStatePartyCount()) } MaxLineLength:VaultStateMigrationTest.kt$VaultStateMigrationTest${ val cashStatesToAdd = 1000 val linearStatesToAdd = 0 val commodityStatesToAdd = 0 val stateMultiplier = 10 cordaDB = configureDatabase(makePersistentDataSourceProperties(), DatabaseConfig(), notaryServices.identityService::wellKnownPartyFromX500Name, notaryServices.identityService::wellKnownPartyFromAnonymous) // Starting the database this way runs the migration under test. This is fine for the unit tests (as the changelog table is ignored), // but when starting an actual node using these databases the migration will be skipped, as it has an entry in the changelog table. // This must therefore be removed. cordaDB.dataSource.connection.createStatement().use { it.execute("DELETE FROM DATABASECHANGELOG WHERE FILENAME IN ('migration/vault-schema.changelog-v9.xml')") } for (i in 1..stateMultiplier) { addCashStates(cashStatesToAdd, BOB) addLinearStates(linearStatesToAdd, listOf(BOB, ALICE)) addCommodityStates(commodityStatesToAdd, BOB) } saveOurKeys(listOf(bob.keyPair)) saveAllIdentities(listOf(BOB_IDENTITY, ALICE_IDENTITY, BOC_IDENTITY, dummyNotary.identity)) cordaDB.close() } - MaxLineLength:VaultUpdateTests.kt$VaultUpdateTests$@Test fun `something plus consume states 0 and 1, and produce state 4, is something without state 0 and 1 outputs and only state 4 output`() MaxLineLength:VaultUpdateTests.kt$VaultUpdateTests$private val stateAndRef0 = StateAndRef(TransactionState(DummyState(), DUMMY_PROGRAM_ID, DUMMY_NOTARY, constraint = AlwaysAcceptAttachmentConstraint), stateRef0) MaxLineLength:VaultUpdateTests.kt$VaultUpdateTests$private val stateAndRef1 = StateAndRef(TransactionState(DummyState(), DUMMY_PROGRAM_ID, DUMMY_NOTARY, constraint = AlwaysAcceptAttachmentConstraint), stateRef1) MaxLineLength:VaultUpdateTests.kt$VaultUpdateTests$private val stateAndRef2 = StateAndRef(TransactionState(DummyState(), DUMMY_PROGRAM_ID, DUMMY_NOTARY, constraint = AlwaysAcceptAttachmentConstraint), stateRef2) MaxLineLength:VaultUpdateTests.kt$VaultUpdateTests$private val stateAndRef3 = StateAndRef(TransactionState(DummyState(), DUMMY_PROGRAM_ID, DUMMY_NOTARY, constraint = AlwaysAcceptAttachmentConstraint), stateRef3) MaxLineLength:VaultUpdateTests.kt$VaultUpdateTests$private val stateAndRef4 = StateAndRef(TransactionState(DummyState(), DUMMY_PROGRAM_ID, DUMMY_NOTARY, constraint = AlwaysAcceptAttachmentConstraint), stateRef4) - MaxLineLength:VaultUpdateTests.kt$VaultUpdateTests$val expected = Vault.Update<ContractState>(setOf(stateAndRef2, stateAndRef3), setOf(stateAndRef0, stateAndRef1, stateAndRef4)) MaxLineLength:VaultUpdateTests.kt$VaultUpdateTests$val notaryChangeUpdate = Vault.Update<ContractState>(setOf(stateAndRef2, stateAndRef3), setOf(stateAndRef0, stateAndRef1), type = Vault.UpdateType.NOTARY_CHANGE) - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$Cash().generateIssue(usefulBuilder, 100.DOLLARS `issued by` MEGA_CORP.ref(1), AnonymousParty(freshKey), DUMMY_NOTARY) - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$CashUtils.generateSpend(services, spendTXBuilder, 80.DOLLARS, services.myInfo.legalIdentitiesAndCerts.single(), BOB) - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$CashUtils.generateSpend(services, txn1Builder, 60.DOLLARS, services.myInfo.legalIdentitiesAndCerts.single(), BOB) - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$CashUtils.generateSpend(services, txn2Builder, 80.DOLLARS, services.myInfo.legalIdentitiesAndCerts.single(), BOB) MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$TransactionBuilder(notary = DUMMY_NOTARY) .addOutputState(DummyLinearContract.State(linearId = linearId, participants = listOf(freshIdentity)), DUMMY_LINEAR_CONTRACT_PROGRAM_ID) - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$addOutputState(DummyDealContract.State(ref = "999", participants = listOf(freshIdentity)), DUMMY_DEAL_PROGRAM_ID) MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$addOutputState(DummyLinearContract.State(linearId = linearId, participants = listOf(freshIdentity)), DUMMY_LINEAR_CONTRACT_PROGRAM_ID) - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$addOutputState(DummyLinearContract.State(participants = listOf(freshIdentity)), DUMMY_LINEAR_CONTRACT_PROGRAM_ID) - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$makeTestIdentityService(MEGA_CORP_IDENTITY, MINI_CORP_IDENTITY, dummyCashIssuer.identity, dummyNotary.identity) - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$services.validatedTransactions.getTransaction(deals.first().ref.txhash)?.apply { notaryServices.recordTransactions(this) } MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$services.validatedTransactions.getTransaction(linearStates.first().ref.txhash)?.apply { notaryServices.recordTransactions(this) } - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$val consumedStates = vaultService.queryBy<ContractState>(VaultQueryCriteria(status = Vault.StateStatus.CONSUMED)).states - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$val consumedStates1 = vaultService.queryBy<Cash.State>(VaultQueryCriteria(status = Vault.StateStatus.CONSUMED)) - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$val consumedStates2 = vaultService.queryBy<Cash.State>(VaultQueryCriteria(status = Vault.StateStatus.CONSUMED)) MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$val criteriaLocked = VaultQueryCriteria(softLockingCondition = QueryCriteria.SoftLockingCondition(QueryCriteria.SoftLockingType.LOCKED_ONLY)) - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$vaultFiller.fillWithSomeTestCash(100.DOLLARS, issuerServices, 10, MEGA_CORP.ref(1), AnonymousParty(freshKey)) - MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest$vaultFiller.fillWithSomeTestCash(100.DOLLARS, issuerServices, 3, DUMMY_CASH_ISSUER, AnonymousParty(freshKey)) MaxLineLength:VaultWithCashTest.kt$VaultWithCashTest.Companion$val cordappPackages = listOf("net.corda.testing.internal.vault", "net.corda.finance.contracts.asset", CashSchemaV1::class.packageName, "net.corda.core.contracts") - MaxLineLength:VersionExtractor.kt$VersionExtractor.Spec$private MaxLineLength:VersionExtractorTest.kt$VersionExtractorTest$val rawConfiguration = configObject("configuration" to configObject("metadata" to configObject("version" to null), "node" to configObject("p2pAddress" to "localhost:8080"))).toConfig() MaxLineLength:VersionExtractorTest.kt$VersionExtractorTest$val rawConfiguration = configObject("configuration" to configObject("metadata" to configObject("version" to versionValue), "node" to configObject("p2pAddress" to "localhost:8080"))).toConfig() MaxLineLength:VersionExtractorTest.kt$VersionExtractorTest$val rawConfiguration = configObject("configuration" to configObject("metadata" to configObject(), "node" to configObject("p2pAddress" to "localhost:8080"))).toConfig() MaxLineLength:VersionExtractorTest.kt$VersionExtractorTest$val rawConfiguration = configObject("configuration" to configObject("node" to configObject("p2pAddress" to "localhost:8080"))).toConfig() - MaxLineLength:VersionInfo.kt$VersionInfo$/** * Platform version of the node which is an integer value which increments on any release where any of the public * API of the entire Corda platform changes. This includes messaging, serialisation, node APIs, etc. */ val platformVersion: Int MaxLineLength:VersionedParsingExampleTest.kt$VersionedParsingExampleTest$val addressesValue = configObject("principal" to "${principalAddressValue.host}:${principalAddressValue.port}", "admin" to "${adminAddressValue.host}:${adminAddressValue.port}") MaxLineLength:VersionedParsingExampleTest.kt$VersionedParsingExampleTest$val configurationV1 = configObject("configuration.metadata.version" to 1, "principalHost" to principalAddressValue.host, "principalPort" to principalAddressValue.port, "adminHost" to adminAddressValue.host, "adminPort" to adminAddressValue.port).toConfig().also { println(it.serialize()) } MaxLineLength:VersionedParsingExampleTest.kt$VersionedParsingExampleTest$val configurationV2 = configObject("configuration.metadata.version" to 2, "configuration.value.addresses" to addressesValue).toConfig().also { println(it.serialize()) } - MaxLineLength:VersionedParsingExampleTest.kt$VersionedParsingExampleTest$val configurationV2 = configObject("configuration.value.addresses" to addressesValue).toConfig().also { println(it.serialize()) } - MaxLineLength:VersionedParsingExampleTest.kt$VersionedParsingExampleTest$val parseConfiguration = VersionedSpecificationRegistry.mapping(extractVersion, 1 to RpcSettingsSpec.V1, 2 to RpcSettingsSpec.V2) - MaxLineLength:VersionedParsingExampleTest.kt$VersionedParsingExampleTest$val rpcSettingsFromVersion1Conf = parseConfiguration.invoke(configurationV1).mapValid { it.parse(configurationV1) } - MaxLineLength:VersionedParsingExampleTest.kt$VersionedParsingExampleTest$val rpcSettingsFromVersion2Conf = parseConfiguration.invoke(configurationV2).mapValid { it.parse(configurationV2) } MaxLineLength:VersionedParsingExampleTest.kt$VersionedParsingExampleTest.RpcSettingsSpec$return Validated.invalid(Configuration.Validation.Error.BadValue.of(host, Address::class.java.simpleName, "Value must be of format \"host(String):port(Int > 0)\" e.g., \"127.0.0.1:8080\"")) - MaxLineLength:VersionedParsingExampleTest.kt$VersionedParsingExampleTest.RpcSettingsSpec.V2.AddressesSpec$override fun parseValid(configuration: Config) - MaxLineLength:VersionedParsingExampleTest.kt$VersionedParsingExampleTest.RpcSettingsSpec.V2.AddressesSpec$return Address.validFromRawValue(rawValue) { error -> Configuration.Validation.Error.BadValue.of(error) } MaxLineLength:VersionedParsingExampleTest.kt$private fun Configuration.Version.Extractor.parseRequired(config: Config, options: Configuration.Validation.Options = Configuration.Validation.Options.defaults) MaxLineLength:VersionedSpecificationRegistry.kt$VersionedSpecificationRegistry$value?.let { valid(it) } ?: invalid<Configuration.Specification<VALUE>, Configuration.Validation.Error>(Configuration.Validation.Error.UnsupportedVersion.of(version)) MaxLineLength:VersionedSpecificationRegistry.kt$VersionedSpecificationRegistry.Companion$fun <V> mapping(versionParser: (Config) -> Valid<Int>, specifications: Map<Int, Configuration.Specification<V>>) @@ -9682,100 +5160,36 @@ MaxLineLength:VersionedSpecificationRegistry.kt$VersionedSpecificationRegistry.Companion$fun <V> mapping(versionParser: Configuration.Value.Parser<Int>, specifications: Map<Int, Configuration.Specification<V>>) MaxLineLength:VersionedSpecificationRegistry.kt$VersionedSpecificationRegistry.Companion$fun <V> mapping(versionParser: Configuration.Value.Parser<Int>, vararg specifications: Pair<Int, Configuration.Specification<V>>) MaxLineLength:VersionedSpecificationRegistry.kt$VersionedSpecificationRegistry<VALUE> : - MaxLineLength:VirtualCordapps.kt$VirtualCordapp$info = Cordapp.Info.Default("corda-core", versionInfo.vendor, versionInfo.releaseVersion, "Open Source (Apache 2)") - MaxLineLength:VirtualCordapps.kt$VirtualCordapp$info = Cordapp.Info.Default("corda-notary", versionInfo.vendor, versionInfo.releaseVersion, "Open Source (Apache 2)") MaxLineLength:VirtualCordapps.kt$VirtualCordapp$info = Cordapp.Info.Default("corda-notary-bft-smart", versionInfo.vendor, versionInfo.releaseVersion, "Open Source (Apache 2)") - MaxLineLength:VirtualCordapps.kt$VirtualCordapp$info = Cordapp.Info.Default("corda-notary-raft", versionInfo.vendor, versionInfo.releaseVersion, "Open Source (Apache 2)") - MaxLineLength:Volume.kt$Volume$nodeInfoFile.readBytes().deserialize<SignedNodeInfo>().verified().let { NotaryInfo(it.legalIdentities.first(), validating) } - MaxLineLength:Volume.kt$Volume$val validating = ConfigFactory.parseFile(configFile).getConfig("notary").getBooleanCaseInsensitive("validating") - MaxLineLength:WebArgsParser.kt$ArgsParser$// The intent of allowing a command line configurable directory and config path is to allow deployment flexibility. // Other general configuration should live inside the config file unless we regularly need temporary overrides on the command line private val baseDirectoryArg = optionParser .accepts("base-directory", "The node working directory where all the files are kept") .withRequiredArg() .defaultsTo(".") - MaxLineLength:WebArgsParser.kt$ArgsParser$private val logToConsoleArg = optionParser.accepts("log-to-console", "If set, prints logging to the console as well as to a file.") - MaxLineLength:WebServerPluginRegistry.kt$WebServerPluginRegistry MaxLineLength:WebServerPluginRegistry.kt$WebServerPluginRegistry$/** * Map of static serving endpoints to the matching resource directory. All endpoints will be prefixed with "/web" and postfixed with "\*. * Resource directories can be either on disk directories (especially when debugging) in the form "a/b/c". Serving from a JAR can * be specified with: javaClass.getResource("<folder-in-jar>").toExternalForm() */ val staticServeDirs: Map<String, String> get() = emptyMap() MaxLineLength:WhitelistGenerator.kt$logger.info("Include contracts from $INCLUDE_WHITELIST_FILE_NAME: ${includeContracts.joinToString()} present in JARs: $optionalCordappJars.") - MaxLineLength:WhitelistGenerator.kt$private fun readAllLines(path: Path) : List<String> - MaxLineLength:WhitelistGeneratorTest.kt$WhitelistGeneratorTest$val newWhitelist = generateWhitelist(existingWhitelist, emptyList(), listOf(TestContractsJar(contractClassNames = emptyList()))) - MaxLineLength:WhitelistGeneratorTest.kt$WhitelistGeneratorTest$val whitelist = generateWhitelist(emptyMap(), emptyList(), listOf(TestContractsJar(contractClassNames = emptyList()))) MaxLineLength:WireTransaction.kt$WireTransaction : TraversableTransaction - MaxLineLength:WireTransaction.kt$WireTransaction$( inputs: List<StateRef>, attachments: List<SecureHash>, outputs: List<TransactionState<ContractState>>, commands: List<Command<*>>, notary: Party?, timeWindow: TimeWindow?, privacySalt: PrivacySalt = PrivacySalt() ) - MaxLineLength:WireTransaction.kt$WireTransaction$( resolveIdentity, resolveAttachment, { stateRef -> resolveStateRef(stateRef)?.serialize() }, { null }, // Returning a dummy `missingAttachment` Attachment allows this deprecated method to work and it disables "contract version no downgrade rule" as a dummy Attachment returns version 1 { resolveAttachment(it.txhash) ?: missingAttachment }, { isAttachmentTrusted(it, null) } ) - MaxLineLength:WireTransaction.kt$WireTransaction$/** * Builds whole Merkle tree for a transaction. * Briefly, each component group has its own sub Merkle tree and all of the roots of these trees are used as leaves * in a top level Merkle tree. * Note that ordering of elements inside a [ComponentGroup] matters when computing the Merkle root. * On the other hand, insertion group ordering does not affect the top level Merkle tree construction, as it is * actually an ordered Merkle tree, where its leaves are ordered based on the group ordinal in [ComponentGroupEnum]. * If any of the groups is an empty list or a null object, then [SecureHash.allOnesHash] is used as its hash. * Also, [privacySalt] is not a Merkle tree leaf, because it is already "inherently" included via the component nonces. */ val merkleTree: MerkleTree by lazy { MerkleTree.getMerkleTree(groupHashes) } - MaxLineLength:WireTransaction.kt$WireTransaction$/** * Calculate nonces for every transaction component, including new fields (due to backwards compatibility support) we cannot process. * Nonce are computed in the following way: * nonce1 = H(salt || path_for_1st_component) * nonce2 = H(salt || path_for_2nd_component) * etc. * Thus, all of the nonces are "independent" in the sense that knowing one or some of them, you can learn * nothing about the rest. */ internal val availableComponentNonces: Map<Int, List<SecureHash>> by lazy { componentGroups.map { Pair(it.groupIndex, it.components.mapIndexed { internalIndex, internalIt -> componentHash(internalIt, privacySalt, it.groupIndex, internalIndex) }) }.toMap() } - MaxLineLength:WireTransaction.kt$WireTransaction$/** * The leaves (group hashes) of the top level Merkle tree. * If a group's Merkle root is allOnesHash, it is a flag that denotes this group is empty (if list) or null (if single object) * in the wire transaction. */ internal val groupHashes: List<SecureHash> by lazy { val listOfLeaves = mutableListOf<SecureHash>() // Even if empty and not used, we should at least send oneHashes for each known // or received but unknown (thus, bigger than known ordinal) component groups. for (i in 0..componentGroups.map { it.groupIndex }.max()!!) { val root = groupsMerkleRoots[i] ?: SecureHash.allOnesHash listOfLeaves.add(root) } listOfLeaves } MaxLineLength:WireTransaction.kt$WireTransaction$// This calculates a value that is slightly lower than the actual re-serialized version. But it is stable and does not depend on the classloader. fun componentGroupSize(componentGroup: ComponentGroupEnum): Int MaxLineLength:WireTransaction.kt$WireTransaction$ReplaceWith("WireTransaction(val componentGroups: List<ComponentGroup>, override val privacySalt: PrivacySalt)") - MaxLineLength:WireTransaction.kt$WireTransaction$SerializedStateAndRef(resolveStateRefAsSerialized(ref) ?: throw TransactionResolutionException(ref.txhash), ref) - MaxLineLength:WireTransaction.kt$WireTransaction$check(componentGroups.map { it.groupIndex }.toSet().size == componentGroups.size) { "Duplicated component groups detected" } - MaxLineLength:WireTransaction.kt$WireTransaction$check(inputs.isNotEmpty() || outputs.isNotEmpty()) { "A transaction must contain at least one input or output state" } - MaxLineLength:WireTransaction.kt$WireTransaction$checkTransactionSize(ltx, resolvedNetworkParameters.maxTransactionSize, serializedResolvedInputs, serializedResolvedReferences) MaxLineLength:WireTransaction.kt$WireTransaction$componentGroups.map { Pair(it.groupIndex, it.components.mapIndexed { internalIndex, internalIt -> componentHash(availableComponentNonces[it.groupIndex]!![internalIndex], internalIt) }) }.toMap() MaxLineLength:WireTransaction.kt$WireTransaction$componentGroups.map { Pair(it.groupIndex, it.components.mapIndexed { internalIndex, internalIt -> componentHash(internalIt, privacySalt, it.groupIndex, internalIndex) }) }.toMap() MaxLineLength:WireTransaction.kt$WireTransaction$require(remainingTransactionSize > size) { "Transaction exceeded network's maximum transaction size limit : $maxTransactionSize bytes." } MaxLineLength:WireTransaction.kt$WireTransaction$return this.componentGroups.firstOrNull { it.groupIndex == componentGroup.ordinal }?.let { cg -> cg.components.sumBy { it.size } + 4 } ?: 0 - MaxLineLength:WireTransaction.kt$WireTransaction$val resolvedAttachments = attachments.lazyMapped { att, _ -> resolveAttachment(att) ?: throw AttachmentResolutionException(att) } MaxLineLength:WireTransaction.kt$WireTransaction$val resolvedNetworkParameters = resolveParameters(networkParametersHash) ?: throw TransactionResolutionException.UnknownParametersException(id, networkParametersHash!!) - MaxLineLength:WireTransaction.kt$WireTransaction${ var remainingTransactionSize = maxTransactionSize fun minus(size: Int) { require(remainingTransactionSize > size) { "Transaction exceeded network's maximum transaction size limit : $maxTransactionSize bytes." } remainingTransactionSize -= size } // This calculates a value that is slightly lower than the actual re-serialized version. But it is stable and does not depend on the classloader. fun componentGroupSize(componentGroup: ComponentGroupEnum): Int { return this.componentGroups.firstOrNull { it.groupIndex == componentGroup.ordinal }?.let { cg -> cg.components.sumBy { it.size } + 4 } ?: 0 } // Check attachments size first as they are most likely to go over the limit. With ContractAttachment instances // it's likely that the same underlying Attachment CorDapp will occur more than once so we dedup on the attachment id. ltx.attachments.distinctBy { it.id }.forEach { minus(it.size) } minus(resolvedSerializedInputs.sumBy { it.serializedState.size }) minus(resolvedSerializedReferences.sumBy { it.serializedState.size }) // For Commands and outputs we can use the component groups as they are already serialized. minus(componentGroupSize(COMMANDS_GROUP)) minus(componentGroupSize(OUTPUTS_GROUP)) } MaxLineLength:WireTransaction.kt$WireTransaction.Companion$ @CordaInternal fun resolveStateRefBinaryComponent(stateRef: StateRef, services: ServicesForResolution): SerializedBytes<TransactionState<ContractState>>? - MaxLineLength:WireTransaction.kt$WireTransaction.Companion$?: MaxLineLength:WireTransaction.kt$WireTransaction.Companion$else -> throw UnsupportedOperationException("Attempting to resolve input ${stateRef.index} of a ${coreTransaction.javaClass} transaction. This is not supported.") - MaxLineLength:WireTransaction.kt$WireTransaction.Companion$is ContractUpgradeWireTransaction -> coreTransaction.resolveOutputComponent(services, stateRef, params) - MaxLineLength:WithContracts.kt$WithContracts$//region Operations fun TestStartedNode.signDummyContract(owner: PartyAndReference, magicNumber: Int = 0, vararg others: PartyAndReference) - MaxLineLength:WithFinality.kt$WithFinality$//region Operations fun TestStartedNode.finalise(stx: SignedTransaction, vararg recipients: Party): FlowStateMachine<SignedTransaction> - MaxLineLength:WithReferencedStatesFlow.kt$WithReferencedStatesFlow<T : Any> : FlowLogic MaxLineLength:WorkflowTransactionBuildTutorial.kt$SubmitCompletionFlow : FlowLogic MaxLineLength:WorkflowTransactionBuildTutorial.kt$TradeApprovalContract$"Completed command requires the counterparty as signer" using (command.signers.contains(before.counterparty.owningKey)) - MaxLineLength:WorkflowTransactionBuildTutorial.kt$TradeApprovalContract$"Completed command requires the source Party as signer" using (command.signers.contains(before.source.owningKey)) - MaxLineLength:WorkflowTransactionBuildTutorial.kt$TradeApprovalContract$"Issue requires the source Party as signer" using (command.signers.contains(issued.source.owningKey)) - MaxLineLength:WorkflowTransactionBuildTutorial.kt$TradeApprovalContract$"Output must be a final state" using (after.state in setOf(WorkflowState.APPROVED, WorkflowState.REJECTED)) - MaxLineLength:WritablePublicKeyToOwningIdentityCache.kt$WritablePublicKeyToOwningIdentityCache : PublicKeyToOwningIdentityCache - MaxLineLength:X500Utils.kt$ fun X500Principal.toAttributesMap(supportedAttributes: Set<ASN1ObjectIdentifier> = emptySet()): Map<ASN1ObjectIdentifier, String> MaxLineLength:X509KeyStore.kt$X509KeyStore - MaxLineLength:X509KeyStore.kt$X509KeyStore$val certArray = requireNotNull(internal.getCertificateChain(alias)) { "No certificate chain under the alias $alias" } MaxLineLength:X509KeyStore.kt$X509KeyStore.Companion$val internal: KeyStore = if (createNew) loadOrCreateKeyStore(keyStoreFile, storePassword) else loadKeyStore(keyStoreFile, storePassword) - MaxLineLength:X509NameConstraintsTest.kt$X509NameConstraintsTest$private MaxLineLength:X509NameConstraintsTest.kt$X509NameConstraintsTest$setPrivateKey(X509Utilities.CORDA_CLIENT_TLS, tlsKeyPair.private, listOf(tlsCert, nodeCaCert, intermediateCa.certificate, rootCa.certificate), keyPassword) - MaxLineLength:X509NameConstraintsTest.kt$X509NameConstraintsTest$val (keystore, trustStore) = makeKeyStores(X500Name("CN=Bank A TLS, UID=, E=me@email.com, C=GB"), nameConstraints) - MaxLineLength:X509NameConstraintsTest.kt$X509NameConstraintsTest$val (keystore, trustStore) = makeKeyStores(X500Name("O=Bank A, UID=, E=me@email.com, C=GB"), nameConstraints) - MaxLineLength:X509Utilities.kt$CertificateType$enum - MaxLineLength:X509Utilities.kt$X509Utilities$ @JvmStatic fun createCertificate(certificateType: CertificateType, issuerCertificate: X509Certificate, issuerKeyPair: KeyPair, subject: X500Principal, subjectPublicKey: PublicKey, validityWindow: Pair<Duration, Duration> = DEFAULT_VALIDITY_WINDOW, nameConstraints: NameConstraints? = null, crlDistPoint: String? = null, crlIssuer: X500Name? = null): X509Certificate - MaxLineLength:X509Utilities.kt$X509Utilities$ @JvmStatic fun saveCertificateAsPEMFile(certificate: X509Certificate, file: Path) MaxLineLength:X509Utilities.kt$X509Utilities$ fun createCertificateSigningRequest(subject: X500Principal, email: String, publicKey: PublicKey, contentSigner: ContentSigner, certRole: CertRole = CertRole.NODE_CA): PKCS10CertificationRequest - MaxLineLength:X509Utilities.kt$X509Utilities$ fun getCertificateValidityWindow(before: Duration, after: Duration, parent: X509Certificate? = null): Pair<Date, Date> MaxLineLength:X509Utilities.kt$X509Utilities$JcaX509v3CertificateBuilder(issuer, serial, validityWindow.first, validityWindow.second, subject, subjectPublicKey) .addExtension(Extension.subjectKeyIdentifier, false, BcX509ExtensionUtils().createSubjectKeyIdentifier(subjectPublicKeyInfo)) MaxLineLength:X509Utilities.kt$X509Utilities$JcaX509v3CertificateBuilder(issuer, serial, validityWindow.first, validityWindow.second, subject, subjectPublicKey) .addExtension(Extension.subjectKeyIdentifier, false, BcX509ExtensionUtils().createSubjectKeyIdentifier(subjectPublicKeyInfo)) .addExtension(Extension.basicConstraints, true, BasicConstraints(certificateType.isCA)) .addExtension(Extension.keyUsage, false, certificateType.keyUsage) .addExtension(Extension.extendedKeyUsage, false, keyPurposes) .addExtension(Extension.authorityKeyIdentifier, false, JcaX509ExtensionUtils().createAuthorityKeyIdentifier(issuerPublicKey)) MaxLineLength:X509Utilities.kt$X509Utilities$fun createCertificateSigningRequest(subject: X500Principal, email: String, keyPair: KeyPair, certRole: CertRole = CertRole.NODE_CA): PKCS10CertificationRequest - MaxLineLength:X509Utilities.kt$X509Utilities$require(isSignatureValid(JcaContentVerifierProviderBuilder().build(issuerKeyPair.public))){"Invalid signature"} - MaxLineLength:X509Utilities.kt$X509Utilities$val builder = JcaX509v3CertificateBuilder(issuer, serial, validityWindow.first, validityWindow.second, subject, subjectPublicKey) .addExtension(Extension.subjectKeyIdentifier, false, BcX509ExtensionUtils().createSubjectKeyIdentifier(subjectPublicKeyInfo)) .addExtension(Extension.basicConstraints, true, BasicConstraints(certificateType.isCA)) .addExtension(Extension.keyUsage, false, certificateType.keyUsage) .addExtension(Extension.extendedKeyUsage, false, keyPurposes) .addExtension(Extension.authorityKeyIdentifier, false, JcaX509ExtensionUtils().createAuthorityKeyIdentifier(issuerPublicKey)) MaxLineLength:X509Utilities.kt$X509Utilities$val builder = createPartialCertificate(certificateType, issuer, issuerPublicKey, subject, subjectPublicKey, validityWindow, nameConstraints, crlDistPoint, crlIssuer) - MaxLineLength:X509Utilities.kt$X509Utilities$val distPointName = DistributionPointName(GeneralNames(GeneralName(GeneralName.uniformResourceIdentifier, crlDistPoint))) - MaxLineLength:X509Utilities.kt$X509Utilities$val signer = ContentSignerBuilder.build(signatureScheme, keyPair.private, Crypto.findProvider(signatureScheme.providerName)) - MaxLineLength:X509Utilities.kt$X509Utilities$validityWindow: Pair<Duration, Duration> = DEFAULT_VALIDITY_WINDOW MaxLineLength:X509Utilities.kt$X509Utilities${ val distPointName = DistributionPointName(GeneralNames(GeneralName(GeneralName.uniformResourceIdentifier, crlDistPoint))) val crlIssuerGeneralNames = crlIssuer?.let { GeneralNames(GeneralName(crlIssuer)) } // The second argument is flag that allows you to define what reason of certificate revocation is served by this distribution point see [ReasonFlags]. // The idea is that you have different revocation per revocation reason. Since we won't go into such a granularity, we can skip that parameter. // The third argument allows you to specify the name of the CRL issuer, it needs to be consistent with the crl (IssuingDistributionPoint) extension and the idp argument. // If idp == true, set it, if idp == false, leave it null as done here. val distPoint = DistributionPoint(distPointName, null, crlIssuerGeneralNames) builder.addExtension(Extension.cRLDistributionPoints, false, CRLDistPoint(arrayOf(distPoint))) } - MaxLineLength:X509Utilities.kt$val Certificate.x509: X509Certificate get() = requireNotNull(this as? X509Certificate) { "Not an X.509 certificate: $this" } - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$Crypto.supportedSignatureSchemes().filter { it != COMPOSITE_KEY }.forEach { serializeDeserializeX509CertPath(it) } - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$assertFalse { keyUsage.hasUsages(5) } - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$assertTrue { Crypto.isValid(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME, serverCert.publicKey, signature, testData) } MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$childSubject: X500Principal = X500Principal("CN=Test Child Cert,O=R3 Ltd,L=London,C=GB") - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$clientParams.endpointIdentificationAlgorithm = null MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$p2pSslConfig.keyStore.get(createNew = true).also { it.registerDevP2pCertificates(MEGA_CORP.name, rootCa.certificate, intermediateCa, nodeCa) } - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$private - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$serverParams.endpointIdentificationAlgorithm = null MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$signingCertStore.get(createNew = true).also { it.installDevNodeCaCertPath(MEGA_CORP.name, rootCa.certificate, intermediateCa, nodeCa) } - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val (_, caCert, childKeyPair, childCert) = genCaAndChildKeysCertsAndSubjects(signatureSchemeRoot, signatureSchemeChild) - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val (serverCert, serverKeyPair) = serverKeyStore.getCertificateAndKeyPair(X509Utilities.CORDA_CLIENT_CA, certStore.entryPassword) MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val (sslCert) = sslKeyStoreReloaded.query { getCertificateAndKeyPair(X509Utilities.CORDA_CLIENT_TLS, sslKeyStoreReloaded.entryPassword) } - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val caCert = X509Utilities.createSelfSignedCACertificate(X500Principal("CN=Test CA Cert,O=R3 Ltd,L=London,C=GB"), caKey) - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val caCert = X509Utilities.createSelfSignedCACertificate(X500Principal("CN=Test Cert,O=R3 Ltd,L=London,C=GB"), caKey) MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val caSubjectKeyIdentifier = SubjectKeyIdentifier.getInstance(caCert.toBc().getExtension(Extension.subjectKeyIdentifier).parsedValue) MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val certCaAuthorityKeyIdentifier = AuthorityKeyIdentifier.getInstance(getExtension(Extension.authorityKeyIdentifier).parsedValue) - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val certificate = X509Utilities.createCertificate(CertificateType.TLS, rootCACert, rootCAKey, BOB_NAME.x500Principal, BOB.publicKey) - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val childCert = X509Utilities.createCertificate(CertificateType.TLS, caCert, caKeyPair, childSubject, childKeyPair.public) - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val expected = X509Utilities.createSelfSignedCACertificate(ALICE.name.x500Principal, generateKeyPair(signatureScheme)) - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val p2pSslConfig = CertificateStoreStubs.P2P.withCertificatesDirectory(certificatesDirectory, keyStorePassword = "serverstorepass") - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val serverSocket = serverSocketFactory.createServerSocket(0) as SSLServerSocket // use 0 to get first free socket - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val signingCertStore = CertificateStoreStubs.Signing.withCertificatesDirectory(certificatesDirectory, "serverstorepass") - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest$val sslConfig = CertificateStoreStubs.P2P.withCertificatesDirectory(tempFolder.root.toPath(), keyStorePassword = "serverstorepass") - MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest.Companion$// We ensure that all of the algorithms are both used (at least once) as first and second in the following [Pair]s. // We also add [DEFAULT_TLS_SIGNATURE_SCHEME] and [DEFAULT_IDENTITY_SIGNATURE_SCHEME] combinations for consistency. val certChainSchemeCombinations = listOf( Pair(DEFAULT_TLS_SIGNATURE_SCHEME, DEFAULT_TLS_SIGNATURE_SCHEME), Pair(DEFAULT_IDENTITY_SIGNATURE_SCHEME, DEFAULT_IDENTITY_SIGNATURE_SCHEME), Pair(DEFAULT_TLS_SIGNATURE_SCHEME, DEFAULT_IDENTITY_SIGNATURE_SCHEME), Pair(ECDSA_SECP256R1_SHA256, SPHINCS256_SHA256), Pair(ECDSA_SECP256K1_SHA256, RSA_SHA256), Pair(EDDSA_ED25519_SHA512, ECDSA_SECP256K1_SHA256), Pair(RSA_SHA256, EDDSA_ED25519_SHA512), Pair(SPHINCS256_SHA256, ECDSA_SECP256R1_SHA256) ) MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest.Companion$Triple(ECDSA_SECP256K1_SHA256,java.security.interfaces.ECPrivateKey::class.java, org.bouncycastle.jce.interfaces.ECPrivateKey::class.java) MaxLineLength:X509UtilitiesTest.kt$X509UtilitiesTest.Companion$Triple(ECDSA_SECP256R1_SHA256,java.security.interfaces.ECPrivateKey::class.java, org.bouncycastle.jce.interfaces.ECPrivateKey::class.java) MaxLineLength:YearMonthSerializer.kt$YearMonthSerializer : Proxy @@ -9783,7 +5197,6 @@ MaxLineLength:ZoneIdSerializer.kt$ZoneIdSerializer : Proxy MaxLineLength:ZonedDateTimeSerializer.kt$ZonedDateTimeSerializer : Proxy MaxLineLength:ZonedDateTimeSerializer.kt$ZonedDateTimeSerializer$override fun fromProxy(proxy: ZonedDateTimeProxy): ZonedDateTime - MaxLineLength:ZonedDateTimeSerializer.kt$ZonedDateTimeSerializer$override fun toProxy(obj: ZonedDateTime): ZonedDateTimeProxy MaxLineLength:ZonedDateTimeSerializer.kt$ZonedDateTimeSerializer$override val additionalSerializers: Iterable<CustomSerializer<out Any>> = listOf(LocalDateTimeSerializer(factory), ZoneIdSerializer(factory)) MaxLineLength:ZonedDateTimeSerializer.kt$ZonedDateTimeSerializer.Companion$val ofLenient: Method = ZonedDateTime::class.java.getDeclaredMethod("ofLenient", LocalDateTime::class.java, ZoneOffset::class.java, ZoneId::class.java) MaxLineLength:internalAccessTestHelpers.kt$( inputs: List<StateAndRef<ContractState>>, outputs: List<TransactionState<ContractState>>, commands: List<CommandWithParties<CommandData>>, attachments: List<Attachment>, id: SecureHash, notary: Party?, timeWindow: TimeWindow?, privacySalt: PrivacySalt, networkParameters: NetworkParameters, references: List<StateAndRef<ContractState>>, componentGroups: List<ComponentGroup>? = null, serializedInputs: List<SerializedStateAndRef>? = null, serializedReferences: List<SerializedStateAndRef>? = null, isAttachmentTrusted: (Attachment) -> Boolean ) @@ -9791,9 +5204,10 @@ MaxLineLength:internalAccessTestHelpers.kt$fun createContractRejection(txId: SecureHash, contract: Contract, cause: Throwable) ModifierOrder:NodeNamedCache.kt$DefaultNamedCacheFactory$open protected NestedBlockDepth:ANSIProgressRenderer.kt$ANSIProgressRenderer$// Returns number of lines rendered. private fun renderLevel(ansi: Ansi, error: Boolean): Int + NestedBlockDepth:AbstractAggregatedList.kt$AbstractAggregatedList$override fun sourceChanged(c: ListChangeListener.Change<out E>) + NestedBlockDepth:AbstractConcatenatedList.kt$AbstractConcatenatedList$// This is where we handle changes to the *source* list. override fun sourceChanged(change: ListChangeListener.Change<out ObservableList<A>>) NestedBlockDepth:AbstractNode.kt$AbstractNode$private fun installCordaServices() NestedBlockDepth:AbstractNode.kt$AbstractNode$private fun registerCordappFlows() - NestedBlockDepth:AggregatedList.kt$AggregatedList$override fun sourceChanged(c: ListChangeListener.Change<out E>) NestedBlockDepth:AllButBlacklisted.kt$AllButBlacklisted$ override fun hasListed(type: Class<*>): Boolean NestedBlockDepth:Amount.kt$Amount.Companion$ @JvmStatic fun parseCurrency(input: String): Amount<Currency> NestedBlockDepth:AttachmentDemo.kt$@Suppress("DEPRECATION") // DOCSTART 1 fun recipient(rpc: CordaRPCOps, webPort: Int) @@ -9803,7 +5217,6 @@ NestedBlockDepth:CheckpointAgent.kt$CheckpointHook$private fun instrumentClass(clazz: CtClass): CtClass? NestedBlockDepth:CheckpointVerifier.kt$CheckpointVerifier$ fun verifyCheckpointsCompatible( checkpointStorage: CheckpointStorage, currentCordapps: List<Cordapp>, platformVersion: Int, serviceHub: ServiceHub, tokenizableServices: List<Any> ) NestedBlockDepth:ClassCarpenter.kt$ClassCarpenterImpl$ private fun validateSchema(schema: Schema) - NestedBlockDepth:ConcatenatedList.kt$ConcatenatedList$// This is where we handle changes to the *source* list. override fun sourceChanged(change: ListChangeListener.Change<out ObservableList<A>>) NestedBlockDepth:ConnectionStateMachine.kt$ConnectionStateMachine$override fun onConnectionFinal(event: Event) NestedBlockDepth:ConnectionStateMachine.kt$ConnectionStateMachine$override fun onDelivery(event: Event) NestedBlockDepth:CordaPersistence.kt$CordaPersistence$private fun <T> inTopLevelTransaction(isolationLevel: TransactionIsolationLevel, recoverableFailureTolerance: Int, recoverAnyNestedSQLException: Boolean, statement: DatabaseTransaction.() -> T): T @@ -9813,14 +5226,14 @@ NestedBlockDepth:InteractiveShell.kt$InteractiveShell$ @JvmStatic fun runFlowByNameFragment(nameFragment: String, inputData: String, output: RenderPrintWriter, rpcOps: CordaRPCOps, ansiProgressRenderer: ANSIProgressRenderer, inputObjectMapper: ObjectMapper = createYamlInputMapper(rpcOps)) NestedBlockDepth:InteractiveShell.kt$InteractiveShell$@JvmStatic fun gracefulShutdown(userSessionOut: RenderPrintWriter, cordaRPCOps: CordaRPCOps) NestedBlockDepth:InternalUtils.kt$ inline fun <T> Iterable<T>.noneOrSingle(predicate: (T) -> Boolean): T? - NestedBlockDepth:JarSignatureTestUtils.kt$JarSignatureTestUtils$fun Path.addManifest(fileName: String, vararg entry: Pair<Attributes.Name, String>) + NestedBlockDepth:JarSignatureTestUtils.kt$JarSignatureTestUtils$fun Path.addManifest(fileName: String, vararg entries: Pair<Attributes.Name, String>) NestedBlockDepth:Main.kt$Node$fun avalancheLoop() NestedBlockDepth:NetworkBootstrapper.kt$CopyCordapps$protected fun List<Path>.copy(nodeDirs: List<Path>) NestedBlockDepth:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$ private fun pollServerForCertificates(requestId: String): List<X509Certificate> NestedBlockDepth:Node.kt$Node$ override fun startDatabase() NestedBlockDepth:Node.kt$Node$ private fun tryDetectIfNotPublicHost(host: String): String? NestedBlockDepth:Node.kt$Node$private fun startLocalRpcBroker(securityManager: RPCSecurityManager): BrokerAddresses? - NestedBlockDepth:NodeVaultService.kt$NodeVaultService$private fun recordUpdate(update: Vault.Update<ContractState>, previouslySeen: Boolean): Vault.Update<ContractState> + NestedBlockDepth:NodeVaultService.kt$NodeVaultService$private fun recordUpdate(update: Vault.Update<ContractState>): Vault.Update<ContractState> NestedBlockDepth:NonValidatingNotaryFlow.kt$NonValidatingNotaryFlow$override fun verifyTransaction(requestPayload: NotarisationPayload) NestedBlockDepth:ObjectDiffer.kt$ObjectDiffer$fun diff(a: Any?, b: Any?): DiffTree? NestedBlockDepth:Obligation.kt$Obligation$override fun verify(tx: LedgerTransaction) @@ -9834,589 +5247,6 @@ NestedBlockDepth:StatusTransitions.kt$StatusTransitions$ fun verify(tx: LedgerTransaction) NestedBlockDepth:ThrowableSerializer.kt$ThrowableSerializer$override fun fromProxy(proxy: ThrowableProxy): Throwable NestedBlockDepth:TransactionVerifierServiceInternal.kt$Verifier$ private fun verifyConstraintsValidity(contractAttachmentsByContract: Map<ContractClassName, ContractAttachment>) - NewLineAtEndOfFile:AMQPBridgeManager.kt$net.corda.nodeapi.internal.bridging.AMQPBridgeManager.kt - NewLineAtEndOfFile:AMQPBridgeTest.kt$net.corda.node.amqp.AMQPBridgeTest.kt - NewLineAtEndOfFile:AMQPChannelHandler.kt$net.corda.nodeapi.internal.protonwrapper.netty.AMQPChannelHandler.kt - NewLineAtEndOfFile:AMQPClient.kt$net.corda.nodeapi.internal.protonwrapper.netty.AMQPClient.kt - NewLineAtEndOfFile:AMQPExceptions.kt$net.corda.serialization.internal.amqp.AMQPExceptions.kt - NewLineAtEndOfFile:AMQPPrimitiveSerializer.kt$net.corda.serialization.internal.amqp.AMQPPrimitiveSerializer.kt - NewLineAtEndOfFile:AMQPRemoteTypeModel.kt$net.corda.serialization.internal.amqp.AMQPRemoteTypeModel.kt - NewLineAtEndOfFile:AMQPRemoteTypeModelTests.kt$net.corda.serialization.internal.amqp.AMQPRemoteTypeModelTests.kt - NewLineAtEndOfFile:AMQPSerializerFactories.kt$net.corda.serialization.internal.amqp.AMQPSerializerFactories.kt - NewLineAtEndOfFile:AMQPServer.kt$net.corda.nodeapi.internal.protonwrapper.netty.AMQPServer.kt - NewLineAtEndOfFile:AMQPTestSerialiationScheme.kt$net.corda.node.internal.serialization.testutils.AMQPTestSerialiationScheme.kt - NewLineAtEndOfFile:AMQPTypeIdentifierParser.kt$net.corda.serialization.internal.amqp.AMQPTypeIdentifierParser.kt - NewLineAtEndOfFile:AMQPTypeIdentifierParserTests.kt$net.corda.serialization.internal.amqp.AMQPTypeIdentifierParserTests.kt - NewLineAtEndOfFile:ANSIProgressRenderer.kt$net.corda.tools.shell.utlities.ANSIProgressRenderer.kt - NewLineAtEndOfFile:ANSIProgressRendererTest.kt$net.corda.tools.shell.utilities.ANSIProgressRendererTest.kt - NewLineAtEndOfFile:APIServer.kt$net.corda.webserver.api.APIServer.kt - NewLineAtEndOfFile:AbstractCashFlow.kt$net.corda.finance.flows.AbstractCashFlow.kt - NewLineAtEndOfFile:AbstractNode.kt$net.corda.node.internal.AbstractNode.kt - NewLineAtEndOfFile:AbstractParty.kt$net.corda.core.identity.AbstractParty.kt - NewLineAtEndOfFile:AbstractPartyDescriptor.kt$net.corda.node.services.persistence.AbstractPartyDescriptor.kt - NewLineAtEndOfFile:Address.kt$net.corda.common.configuration.parsing.internal.Address.kt - NewLineAtEndOfFile:AddressBindingException.kt$net.corda.core.internal.errors.AddressBindingException.kt - NewLineAtEndOfFile:AddressBindingFailureTests.kt$net.corda.node.AddressBindingFailureTests.kt - NewLineAtEndOfFile:AddressUtils.kt$net.corda.node.utilities.AddressUtils.kt - NewLineAtEndOfFile:Addresses.kt$net.corda.common.configuration.parsing.internal.Addresses.kt - NewLineAtEndOfFile:AdvancedExceptionDialog.kt$net.corda.explorer.ui.AdvancedExceptionDialog.kt - NewLineAtEndOfFile:AllExceptionMapper.kt$net.corda.webserver.internal.AllExceptionMapper.kt - NewLineAtEndOfFile:AmountTest.kt$net.corda.client.jackson.AmountTest.kt - NewLineAtEndOfFile:AmountTests.kt$net.corda.coretests.contracts.AmountTests.kt - NewLineAtEndOfFile:AnonymousParty.kt$net.corda.core.identity.AnonymousParty.kt - NewLineAtEndOfFile:AnotherDummyContract.kt$net.corda.isolated.contracts.AnotherDummyContract.kt - NewLineAtEndOfFile:AppendOnlyPersistentMapNonConcurrentTest.kt$net.corda.node.services.persistence.AppendOnlyPersistentMapNonConcurrentTest.kt - NewLineAtEndOfFile:AppendOnlyPersistentMapTest.kt$net.corda.node.services.persistence.AppendOnlyPersistentMapTest.kt - NewLineAtEndOfFile:ApplicationMessage.kt$net.corda.nodeapi.internal.protonwrapper.messages.ApplicationMessage.kt - NewLineAtEndOfFile:Arrangement.kt$net.corda.finance.contracts.universal.Arrangement.kt - NewLineAtEndOfFile:ArtemisBroker.kt$net.corda.node.internal.artemis.ArtemisBroker.kt - NewLineAtEndOfFile:ArtemisRpcTests.kt$net.corda.node.services.rpc.ArtemisRpcTests.kt - NewLineAtEndOfFile:ArtemisTcpTransport.kt$net.corda.nodeapi.internal.ArtemisTcpTransport.kt - NewLineAtEndOfFile:AssertingTestDatabaseContext.kt$net.corda.testing.internal.db.AssertingTestDatabaseContext.kt - NewLineAtEndOfFile:AsyncLoggingTest.kt$net.corda.node.utilities.logging.AsyncLoggingTest.kt - NewLineAtEndOfFile:AttachmentTest.kt$net.corda.deterministic.contracts.AttachmentTest.kt - NewLineAtEndOfFile:AttachmentVersionNumberMigration.kt$net.corda.nodeapi.internal.persistence.AttachmentVersionNumberMigration.kt - NewLineAtEndOfFile:AttachmentWithContext.kt$net.corda.core.internal.AttachmentWithContext.kt - NewLineAtEndOfFile:AttachmentsClassLoader.kt$net.corda.core.serialization.internal.AttachmentsClassLoader.kt - NewLineAtEndOfFile:AuthDBTests.kt$net.corda.node.AuthDBTests.kt - NewLineAtEndOfFile:AuthenticatedRpcOpsProxy.kt$net.corda.node.internal.rpc.proxies.AuthenticatedRpcOpsProxy.kt - NewLineAtEndOfFile:AuthorizingSubject.kt$net.corda.node.internal.security.AuthorizingSubject.kt - NewLineAtEndOfFile:AzureBackend.kt$net.corda.networkbuilder.backends.AzureBackend.kt - NewLineAtEndOfFile:AzureContainerPusher.kt$net.corda.networkbuilder.containers.push.azure.AzureContainerPusher.kt - NewLineAtEndOfFile:AzureInstantiator.kt$net.corda.networkbuilder.containers.instance.azure.AzureInstantiator.kt - NewLineAtEndOfFile:AzureRegistryLocator.kt$net.corda.networkbuilder.containers.push.azure.AzureRegistryLocator.kt - NewLineAtEndOfFile:AzureSmbVolume.kt$net.corda.networkbuilder.volumes.azure.AzureSmbVolume.kt - NewLineAtEndOfFile:Backend.kt$net.corda.networkbuilder.backends.Backend.kt - NewLineAtEndOfFile:BankOfCordaWebApi.kt$net.corda.bank.api.BankOfCordaWebApi.kt - NewLineAtEndOfFile:BaseTransaction.kt$net.corda.core.transactions.BaseTransaction.kt - NewLineAtEndOfFile:BaseTransactions.kt$net.corda.core.transactions.BaseTransactions.kt - NewLineAtEndOfFile:BigDecimalSerializer.kt$net.corda.serialization.internal.amqp.custom.BigDecimalSerializer.kt - NewLineAtEndOfFile:BigIntegerSerializer.kt$net.corda.serialization.internal.amqp.custom.BigIntegerSerializer.kt - NewLineAtEndOfFile:BitSetSerializer.kt$net.corda.serialization.internal.amqp.custom.BitSetSerializer.kt - NewLineAtEndOfFile:BootstrapperView.kt$net.corda.networkbuilder.gui.BootstrapperView.kt - NewLineAtEndOfFile:BridgeControlListener.kt$net.corda.nodeapi.internal.bridging.BridgeControlListener.kt - NewLineAtEndOfFile:BridgeControlMessages.kt$net.corda.nodeapi.internal.bridging.BridgeControlMessages.kt - NewLineAtEndOfFile:BridgeManager.kt$net.corda.nodeapi.internal.bridging.BridgeManager.kt - NewLineAtEndOfFile:BridgeMetricsService.kt$net.corda.nodeapi.internal.bridging.BridgeMetricsService.kt - NewLineAtEndOfFile:BrokerJaasLoginModule.kt$net.corda.node.internal.artemis.BrokerJaasLoginModule.kt - NewLineAtEndOfFile:BrokerRpcSslOptions.kt$net.corda.nodeapi.BrokerRpcSslOptions.kt - NewLineAtEndOfFile:BuiltNode.kt$net.corda.networkbuilder.nodes.BuiltNode.kt - NewLineAtEndOfFile:CarpenterExceptionTests.kt$net.corda.serialization.internal.carpenter.CarpenterExceptionTests.kt - NewLineAtEndOfFile:CarpentryDependencyGraph.kt$net.corda.serialization.internal.model.CarpentryDependencyGraph.kt - NewLineAtEndOfFile:CashSelectionH2Impl.kt$net.corda.finance.workflows.asset.selection.CashSelectionH2Impl.kt - NewLineAtEndOfFile:CashSelectionH2ImplTest.kt$net.corda.finance.workflows.asset.selection.CashSelectionH2ImplTest.kt - NewLineAtEndOfFile:CashSelectionSQLServerImpl.kt$net.corda.finance.workflows.asset.selection.CashSelectionSQLServerImpl.kt - NewLineAtEndOfFile:CertPathSerializer.kt$net.corda.serialization.internal.amqp.custom.CertPathSerializer.kt - NewLineAtEndOfFile:CertificateChainCheckPolicy.kt$net.corda.node.internal.artemis.CertificateChainCheckPolicy.kt - NewLineAtEndOfFile:CertificateStore.kt$net.corda.nodeapi.internal.config.CertificateStore.kt - NewLineAtEndOfFile:CertificateStoreStubs.kt$net.corda.testing.internal.stubs.CertificateStoreStubs.kt - NewLineAtEndOfFile:CertificatesUtils.kt$net.corda.node.utilities.CertificatesUtils.kt - NewLineAtEndOfFile:CheatingSecurityProvider.kt$net.corda.deterministic.CheatingSecurityProvider.kt - NewLineAtEndOfFile:CheckpointDumperTest.kt$net.corda.node.services.rpc.CheckpointDumperTest.kt - NewLineAtEndOfFile:CheckpointSerializationAPI.kt$net.corda.core.serialization.internal.CheckpointSerializationAPI.kt - NewLineAtEndOfFile:CheckpointSerializationScheme.kt$net.corda.serialization.internal.CheckpointSerializationScheme.kt - NewLineAtEndOfFile:CheckpointStorage.kt$net.corda.node.services.api.CheckpointStorage.kt - NewLineAtEndOfFile:ChosenList.kt$net.corda.client.jfx.utils.ChosenList.kt - NewLineAtEndOfFile:CityDatabaseTest.kt$net.corda.worldmap.CityDatabaseTest.kt - NewLineAtEndOfFile:ClassCarpenterWhitelistTest.kt$net.corda.serialization.internal.carpenter.ClassCarpenterWhitelistTest.kt - NewLineAtEndOfFile:ClassCarpentingTypeLoaderTests.kt$net.corda.serialization.internal.model.ClassCarpentingTypeLoaderTests.kt - NewLineAtEndOfFile:ClassLoadingUtils.kt$net.corda.core.internal.ClassLoadingUtils.kt - NewLineAtEndOfFile:ClassLoadingUtilsTest.kt$net.corda.core.internal.ClassLoadingUtilsTest.kt - NewLineAtEndOfFile:ClassSerializer.kt$net.corda.serialization.internal.amqp.custom.ClassSerializer.kt - NewLineAtEndOfFile:ClearNetworkCacheCli.kt$net.corda.node.internal.subcommands.ClearNetworkCacheCli.kt - NewLineAtEndOfFile:CliBackwardsCompatibleTest.kt$net.corda.testing.CliBackwardsCompatibleTest.kt - NewLineAtEndOfFile:ClientCacheFactory.kt$net.corda.client.rpc.internal.ClientCacheFactory.kt - NewLineAtEndOfFile:ClientRelevantError.kt$net.corda.core.ClientRelevantError.kt - NewLineAtEndOfFile:ClientRelevantException.kt$net.corda.ClientRelevantException.kt - NewLineAtEndOfFile:ClientRpcExample.kt$net.corda.docs.kotlin.ClientRpcExample.kt - NewLineAtEndOfFile:ClientRpcSslOptions.kt$net.corda.core.messaging.ClientRpcSslOptions.kt - NewLineAtEndOfFile:ClientRpcTutorial.kt$net.corda.docs.kotlin.ClientRpcTutorial.kt - NewLineAtEndOfFile:CollectionSerializer.kt$net.corda.serialization.internal.amqp.CollectionSerializer.kt - NewLineAtEndOfFile:CommandLineCompatibilityCheckerTest.kt$net.corda.testing.CommandLineCompatibilityCheckerTest.kt - NewLineAtEndOfFile:CommandLineCompatibilityUtils.kt$net.corda.testing.CommandLineCompatibilityUtils.kt - NewLineAtEndOfFile:CommandsSerializationTests.kt$net.corda.coretests.serialization.CommandsSerializationTests.kt - NewLineAtEndOfFile:CommercialPaper.kt$net.corda.finance.contracts.CommercialPaper.kt - NewLineAtEndOfFile:CommonSchema.kt$net.corda.core.schemas.CommonSchema.kt - NewLineAtEndOfFile:CompatibilityTest.kt$net.corda.finance.flows.CompatibilityTest.kt - NewLineAtEndOfFile:ComposableTypePropertySerializer.kt$net.corda.serialization.internal.amqp.ComposableTypePropertySerializer.kt - NewLineAtEndOfFile:CompositeSignature.kt$net.corda.core.crypto.CompositeSignature.kt - NewLineAtEndOfFile:ConfigExporter.kt$net.corda.core.ConfigExporter.kt - NewLineAtEndOfFile:ConfigParsingTest.kt$net.corda.nodeapi.internal.config.ConfigParsingTest.kt - NewLineAtEndOfFile:ConfigSections.kt$net.corda.node.services.config.schema.v1.ConfigSections.kt - NewLineAtEndOfFile:ConfigUtilities.kt$net.corda.node.services.config.ConfigUtilities.kt - NewLineAtEndOfFile:Configuration.kt$net.corda.common.configuration.parsing.internal.Configuration.kt - NewLineAtEndOfFile:ConnectionChange.kt$net.corda.nodeapi.internal.protonwrapper.netty.ConnectionChange.kt - NewLineAtEndOfFile:ConnectionStateMachine.kt$net.corda.nodeapi.internal.protonwrapper.engine.ConnectionStateMachine.kt - NewLineAtEndOfFile:Constants.kt$net.corda.common.logging.Constants.kt - NewLineAtEndOfFile:Constants.kt$net.corda.networkbuilder.Constants.kt - NewLineAtEndOfFile:ConstructorForDeserialization.kt$net.corda.core.serialization.ConstructorForDeserialization.kt - NewLineAtEndOfFile:ContainerPusher.kt$net.corda.networkbuilder.containers.push.ContainerPusher.kt - NewLineAtEndOfFile:Context.kt$net.corda.networkbuilder.context.Context.kt - NewLineAtEndOfFile:ContextualLoggingUtils.kt$net.corda.node.services.logging.ContextualLoggingUtils.kt - NewLineAtEndOfFile:ContractAttachmentSerializer.kt$net.corda.serialization.internal.amqp.custom.ContractAttachmentSerializer.kt - NewLineAtEndOfFile:ContractHierarchyTest.kt$net.corda.coretests.contracts.ContractHierarchyTest.kt - NewLineAtEndOfFile:ContractJarTestUtils.kt$net.corda.testing.core.internal.ContractJarTestUtils.kt - NewLineAtEndOfFile:ContractUpgradeTransactions.kt$net.corda.core.transactions.ContractUpgradeTransactions.kt - NewLineAtEndOfFile:ContractUpgradeUtils.kt$net.corda.core.internal.ContractUpgradeUtils.kt - NewLineAtEndOfFile:Converters.kt$net.corda.webserver.converters.Converters.kt - NewLineAtEndOfFile:CopiedNode.kt$net.corda.networkbuilder.nodes.CopiedNode.kt - NewLineAtEndOfFile:CopiedNotary.kt$net.corda.networkbuilder.notaries.CopiedNotary.kt - NewLineAtEndOfFile:CorDappSerializerTests.kt$net.corda.serialization.internal.amqp.CorDappSerializerTests.kt - NewLineAtEndOfFile:CordaAuthenticationPlugin.kt$net.corda.tools.shell.CordaAuthenticationPlugin.kt - NewLineAtEndOfFile:CordaClassResolverTests.kt$net.corda.serialization.internal.CordaClassResolverTests.kt - NewLineAtEndOfFile:CordaClosureSerializer.kt$net.corda.node.serialization.kryo.CordaClosureSerializer.kt - NewLineAtEndOfFile:CordaException.kt$net.corda.core.CordaException.kt - NewLineAtEndOfFile:CordaExceptionTest.kt$net.corda.deterministic.CordaExceptionTest.kt - NewLineAtEndOfFile:CordaInternal.kt$net.corda.core.CordaInternal.kt - NewLineAtEndOfFile:CordaPersistenceTest.kt$net.corda.nodeapi.internal.CordaPersistenceTest.kt - NewLineAtEndOfFile:CordaRPCClient.kt$net.corda.client.rpc.CordaRPCClient.kt - NewLineAtEndOfFile:CordaRPCClientReconnectionTest.kt$net.corda.client.rpcreconnect.CordaRPCClientReconnectionTest.kt - NewLineAtEndOfFile:CordaSSHAuthInfo.kt$net.corda.tools.shell.CordaSSHAuthInfo.kt - NewLineAtEndOfFile:CordaServiceFlowTests.kt$net.corda.node.services.CordaServiceFlowTests.kt - NewLineAtEndOfFile:CordaServiceTest.kt$net.corda.node.internal.CordaServiceTest.kt - NewLineAtEndOfFile:CordaVersion.kt$net.corda.common.logging.CordaVersion.kt - NewLineAtEndOfFile:CordaVersionProvider.kt$net.corda.cliutils.CordaVersionProvider.kt - NewLineAtEndOfFile:CordaViewModel.kt$net.corda.explorer.model.CordaViewModel.kt - NewLineAtEndOfFile:CordaX500Name.kt$net.corda.core.identity.CordaX500Name.kt - NewLineAtEndOfFile:CordappConfig.kt$net.corda.core.cordapp.CordappConfig.kt - NewLineAtEndOfFile:CordappConfigFileProviderTests.kt$net.corda.node.internal.cordapp.CordappConfigFileProviderTests.kt - NewLineAtEndOfFile:CordappConfigProvider.kt$net.corda.node.internal.cordapp.CordappConfigProvider.kt - NewLineAtEndOfFile:CordappInfo.kt$net.corda.core.cordapp.CordappInfo.kt - NewLineAtEndOfFile:CordappLoader.kt$net.corda.nodeapi.internal.cordapp.CordappLoader.kt - NewLineAtEndOfFile:CordappProvider.kt$net.corda.core.cordapp.CordappProvider.kt - NewLineAtEndOfFile:CordappResolver.kt$net.corda.core.internal.cordapp.CordappResolver.kt - NewLineAtEndOfFile:CryptoServiceFactory.kt$net.corda.nodeapi.internal.cryptoservice.CryptoServiceFactory.kt - NewLineAtEndOfFile:CurrenciesTests.kt$net.corda.finance.CurrenciesTests.kt - NewLineAtEndOfFile:CurrencyParameterSensitivitiesSerializer.kt$net.corda.vega.plugin.customserializers.CurrencyParameterSensitivitiesSerializer.kt - NewLineAtEndOfFile:CustomSerializerRegistryTests.kt$net.corda.serialization.internal.amqp.CustomSerializerRegistryTests.kt - NewLineAtEndOfFile:CustomTypeJsonParsingTests.kt$net.corda.tools.shell.CustomTypeJsonParsingTests.kt - NewLineAtEndOfFile:DBRunnerExtension.kt$net.corda.testing.internal.db.DBRunnerExtension.kt - NewLineAtEndOfFile:Dashboard.kt$net.corda.explorer.views.Dashboard.kt - NewLineAtEndOfFile:DbExceptionHandler.kt$net.corda.node.internal.DbExceptionHandler.kt - NewLineAtEndOfFile:DbSchemaInitialisationTest.kt$net.corda.node.persistence.DbSchemaInitialisationTest.kt - NewLineAtEndOfFile:DbTransactionsResolver.kt$net.corda.node.services.DbTransactionsResolver.kt - NewLineAtEndOfFile:DbTransactionsResolverTopologicalSortTest.kt$net.corda.node.services.transactions.DbTransactionsResolverTopologicalSortTest.kt - NewLineAtEndOfFile:DeduplicationId.kt$net.corda.node.services.statemachine.DeduplicationId.kt - NewLineAtEndOfFile:DefaultCacheProvider.kt$net.corda.serialization.internal.model.DefaultCacheProvider.kt - NewLineAtEndOfFile:DefaultKryoCustomizer.kt$net.corda.node.serialization.kryo.DefaultKryoCustomizer.kt - NewLineAtEndOfFile:DemoBenchNodeInfoFilesCopier.kt$net.corda.demobench.model.DemoBenchNodeInfoFilesCopier.kt - NewLineAtEndOfFile:DescriptorBasedSerializerRegistry.kt$net.corda.serialization.internal.amqp.DescriptorBasedSerializerRegistry.kt - NewLineAtEndOfFile:DeserializeNeedingCarpentrySimpleTypesTest.kt$net.corda.serialization.internal.amqp.DeserializeNeedingCarpentrySimpleTypesTest.kt - NewLineAtEndOfFile:DeserializeQueryableStateTest.kt$net.corda.serialization.internal.amqp.DeserializeQueryableStateTest.kt - NewLineAtEndOfFile:DigitalSignatureWithCert.kt$net.corda.core.internal.DigitalSignatureWithCert.kt - NewLineAtEndOfFile:DistributedServiceTests.kt$net.corda.node.services.distributed.DistributedServiceTests.kt - NewLineAtEndOfFile:DoNotImplement.kt$net.corda.core.DoNotImplement.kt - NewLineAtEndOfFile:DockerBackend.kt$net.corda.networkbuilder.backends.DockerBackend.kt - NewLineAtEndOfFile:DockerInstantiator.kt$net.corda.networkbuilder.containers.instance.docker.DockerInstantiator.kt - NewLineAtEndOfFile:DockerUtils.kt$net.corda.networkbuilder.docker.DockerUtils.kt - NewLineAtEndOfFile:Driver.kt$net.corda.testing.driver.Driver.kt - NewLineAtEndOfFile:DriverTests.kt$net.corda.testing.driver.DriverTests.kt - NewLineAtEndOfFile:DummyClusterSpec.kt$net.corda.testing.node.internal.DummyClusterSpec.kt - NewLineAtEndOfFile:DummyLinearContract.kt$net.corda.testing.internal.vault.DummyLinearContract.kt - NewLineAtEndOfFile:DurationSerializer.kt$net.corda.serialization.internal.amqp.custom.DurationSerializer.kt - NewLineAtEndOfFile:EnumClassTests.kt$net.corda.serialization.internal.carpenter.EnumClassTests.kt - NewLineAtEndOfFile:EnumSerializer.kt$net.corda.serialization.internal.amqp.EnumSerializer.kt - NewLineAtEndOfFile:EnumSetSerializer.kt$net.corda.serialization.internal.amqp.custom.EnumSetSerializer.kt - NewLineAtEndOfFile:EnumTests.kt$net.corda.serialization.internal.amqp.EnumTests.kt - NewLineAtEndOfFile:EnumTransformationTests.kt$net.corda.serialization.internal.amqp.EnumTransformationTests.kt - NewLineAtEndOfFile:EnumTransforms.kt$net.corda.serialization.internal.model.EnumTransforms.kt - NewLineAtEndOfFile:ErrorCodeLoggingTests.kt$net.corda.node.logging.ErrorCodeLoggingTests.kt - NewLineAtEndOfFile:ErrorCodeRewritePolicy.kt$net.corda.common.logging.ErrorCodeRewritePolicy.kt - NewLineAtEndOfFile:ErrorMessagesTests.kt$net.corda.serialization.internal.amqp.ErrorMessagesTests.kt - NewLineAtEndOfFile:EventProcessor.kt$net.corda.nodeapi.internal.protonwrapper.engine.EventProcessor.kt - NewLineAtEndOfFile:Eventually.kt$net.corda.testing.common.internal.Eventually.kt - NewLineAtEndOfFile:EvolutionSerializerFactory.kt$net.corda.serialization.internal.amqp.EvolutionSerializerFactory.kt - NewLineAtEndOfFile:EvolutionSerializerFactoryTests.kt$net.corda.serialization.internal.amqp.EvolutionSerializerFactoryTests.kt - NewLineAtEndOfFile:ExampleConfigTest.kt$net.corda.docs.ExampleConfigTest.kt - NewLineAtEndOfFile:Examples.kt$net.corda.finance.contracts.universal.Examples.kt - NewLineAtEndOfFile:ExceptionSerialisingRpcOpsProxy.kt$net.corda.node.internal.rpc.proxies.ExceptionSerialisingRpcOpsProxy.kt - NewLineAtEndOfFile:ExceptionsErrorCodeFunctions.kt$net.corda.common.logging.ExceptionsErrorCodeFunctions.kt - NewLineAtEndOfFile:ExceptionsSerializationTest.kt$net.corda.node.services.statemachine.ExceptionsSerializationTest.kt - NewLineAtEndOfFile:ExchangeRateModelTest.kt$net.corda.client.jfx.model.ExchangeRateModelTest.kt - NewLineAtEndOfFile:ExitCodes.kt$net.corda.cliutils.ExitCodes.kt - NewLineAtEndOfFile:Explorer.kt$net.corda.demobench.explorer.Explorer.kt - NewLineAtEndOfFile:ExposeJpaToFlowsTests.kt$net.corda.node.services.persistence.ExposeJpaToFlowsTests.kt - NewLineAtEndOfFile:ExternalIdMappingTest.kt$net.corda.node.services.vault.ExternalIdMappingTest.kt - NewLineAtEndOfFile:FXFwdTimeOption.kt$net.corda.finance.contracts.universal.FXFwdTimeOption.kt - NewLineAtEndOfFile:FetchDataFlow.kt$net.corda.core.internal.FetchDataFlow.kt - NewLineAtEndOfFile:FilterMyKeysTests.kt$net.corda.node.services.keys.FilterMyKeysTests.kt - NewLineAtEndOfFile:FingerPrinterTesting.kt$net.corda.serialization.internal.amqp.FingerPrinterTesting.kt - NewLineAtEndOfFile:FlowHandle.kt$net.corda.core.messaging.FlowHandle.kt - NewLineAtEndOfFile:FlowInitiator.kt$net.corda.core.flows.FlowInitiator.kt - NewLineAtEndOfFile:FlowLogicRef.kt$net.corda.core.flows.FlowLogicRef.kt - NewLineAtEndOfFile:FlowMatchers.kt$net.corda.testing.internal.matchers.flow.FlowMatchers.kt - NewLineAtEndOfFile:FlowMonitor.kt$net.corda.node.services.statemachine.FlowMonitor.kt - NewLineAtEndOfFile:FlowOverrideTests.kt$net.corda.node.flows.FlowOverrideTests.kt - NewLineAtEndOfFile:FlowRegistrationTest.kt$net.corda.node.internal.FlowRegistrationTest.kt - NewLineAtEndOfFile:FlowRetryTest.kt$net.corda.node.flows.FlowRetryTest.kt - NewLineAtEndOfFile:FlowStackSnapshot.kt$net.corda.core.flows.FlowStackSnapshot.kt - NewLineAtEndOfFile:FlowTestsUtils.kt$net.corda.testing.flows.FlowTestsUtils.kt - NewLineAtEndOfFile:FlowTimeoutException.kt$net.corda.node.services.statemachine.FlowTimeoutException.kt - NewLineAtEndOfFile:FlowVersioningTest.kt$net.corda.node.services.statemachine.FlowVersioningTest.kt - NewLineAtEndOfFile:FlowsExecutionModeRpcTest.kt$net.corda.client.rpc.FlowsExecutionModeRpcTest.kt - NewLineAtEndOfFile:FoundNode.kt$net.corda.networkbuilder.nodes.FoundNode.kt - NewLineAtEndOfFile:FutureMatchers.kt$net.corda.testing.internal.matchers.future.FutureMatchers.kt - NewLineAtEndOfFile:GenerateHelpers.kt$net.corda.loadtest.tests.GenerateHelpers.kt - NewLineAtEndOfFile:GenerateNodeInfoCli.kt$net.corda.node.internal.subcommands.GenerateNodeInfoCli.kt - NewLineAtEndOfFile:Generator.kt$net.corda.client.mock.Generator.kt - NewLineAtEndOfFile:GetStringConfigFlow.kt$net.corda.configsample.GetStringConfigFlow.kt - NewLineAtEndOfFile:GroupAMoreTests.kt$net.corda.testing.internal.db.GroupAMoreTests.kt - NewLineAtEndOfFile:GroupATests.kt$net.corda.testing.internal.db.GroupATests.kt - NewLineAtEndOfFile:GroupBTests.kt$net.corda.testing.internal.db.GroupBTests.kt - NewLineAtEndOfFile:GuiUtilitiesKtTest.kt$net.corda.explorer.views.GuiUtilitiesKtTest.kt - NewLineAtEndOfFile:H2SecurityTests.kt$net.corda.node.persistence.H2SecurityTests.kt - NewLineAtEndOfFile:HibernateColumnConverterTests.kt$net.corda.node.services.persistence.HibernateColumnConverterTests.kt - NewLineAtEndOfFile:HibernateQueryCriteriaParser.kt$net.corda.node.services.vault.HibernateQueryCriteriaParser.kt - NewLineAtEndOfFile:HibernateStatistics.kt$net.corda.nodeapi.internal.persistence.HibernateStatistics.kt - NewLineAtEndOfFile:IOUContract.kt$net.corda.docs.kotlin.tutorial.twoparty.IOUContract.kt - NewLineAtEndOfFile:IOUState.kt$net.corda.docs.kotlin.tutorial.twoparty.IOUState.kt - NewLineAtEndOfFile:Id.kt$net.corda.core.utilities.Id.kt - NewLineAtEndOfFile:IdempotentFlow.kt$net.corda.core.internal.IdempotentFlow.kt - NewLineAtEndOfFile:IdempotentFlowTests.kt$net.corda.node.services.statemachine.IdempotentFlowTests.kt - NewLineAtEndOfFile:IdenticonRenderer.kt$net.corda.explorer.identicon.IdenticonRenderer.kt - NewLineAtEndOfFile:IdentitySyncFlowTests.kt$net.corda.confidential.IdentitySyncFlowTests.kt - NewLineAtEndOfFile:IdentityUtils.kt$net.corda.core.identity.IdentityUtils.kt - NewLineAtEndOfFile:InfrequentlyMutatedCache.kt$net.corda.node.utilities.InfrequentlyMutatedCache.kt - NewLineAtEndOfFile:InfrequentlyMutatedCacheTest.kt$net.corda.node.utilities.InfrequentlyMutatedCacheTest.kt - NewLineAtEndOfFile:InitiatedBy.kt$net.corda.core.flows.InitiatedBy.kt - NewLineAtEndOfFile:InputStreamSerializer.kt$net.corda.serialization.internal.amqp.custom.InputStreamSerializer.kt - NewLineAtEndOfFile:InstallShellExtensionsParser.kt$net.corda.cliutils.InstallShellExtensionsParser.kt - NewLineAtEndOfFile:InstanceInfo.kt$net.corda.networkbuilder.containers.instance.InstanceInfo.kt - NewLineAtEndOfFile:Instances.kt$net.corda.core.crypto.internal.Instances.kt - NewLineAtEndOfFile:InstantSerializer.kt$net.corda.serialization.internal.amqp.custom.InstantSerializer.kt - NewLineAtEndOfFile:Instantiator.kt$net.corda.networkbuilder.containers.instance.Instantiator.kt - NewLineAtEndOfFile:InterestRatesSwapDemoAPI.kt$net.corda.irs.web.api.InterestRatesSwapDemoAPI.kt - NewLineAtEndOfFile:InternalCordaRPCOps.kt$net.corda.core.internal.messaging.InternalCordaRPCOps.kt - NewLineAtEndOfFile:InternalMockNetworkConfigOverrides.kt$net.corda.testing.node.internal.InternalMockNetworkConfigOverrides.kt - NewLineAtEndOfFile:InternalTestConstants.kt$net.corda.testing.internal.InternalTestConstants.kt - NewLineAtEndOfFile:InternalTestUtils.kt$net.corda.testing.internal.InternalTestUtils.kt - NewLineAtEndOfFile:InvocationContext.kt$net.corda.core.context.InvocationContext.kt - NewLineAtEndOfFile:InvocationHandlerTemplate.kt$net.corda.node.internal.InvocationHandlerTemplate.kt - NewLineAtEndOfFile:IssueCash.kt$net.corda.bank.IssueCash.kt - NewLineAtEndOfFile:IssueCashLoggingTests.kt$net.corda.node.logging.IssueCashLoggingTests.kt - NewLineAtEndOfFile:JVMAgentRegistry.kt$net.corda.node.utilities.JVMAgentRegistry.kt - NewLineAtEndOfFile:JarSignatureCollector.kt$net.corda.core.internal.JarSignatureCollector.kt - NewLineAtEndOfFile:KMSUtilsTests.kt$net.corda.node.services.keys.KMSUtilsTests.kt - NewLineAtEndOfFile:KeepForDJVM.kt$net.corda.core.KeepForDJVM.kt - NewLineAtEndOfFile:KeyManagementService.kt$net.corda.core.node.services.KeyManagementService.kt - NewLineAtEndOfFile:KeyOwningIdentity.kt$net.corda.nodeapi.internal.KeyOwningIdentity.kt - NewLineAtEndOfFile:KeyStoreConfigHelpers.kt$net.corda.nodeapi.internal.KeyStoreConfigHelpers.kt - NewLineAtEndOfFile:KeyStoreGenerator.kt$net.corda.deterministic.data.KeyStoreGenerator.kt - NewLineAtEndOfFile:KotlinUtilsTest.kt$net.corda.coretests.utilities.KotlinUtilsTest.kt - NewLineAtEndOfFile:LargeTransactionsTest.kt$net.corda.node.services.statemachine.LargeTransactionsTest.kt - NewLineAtEndOfFile:LazyPool.kt$net.corda.core.internal.LazyPool.kt - NewLineAtEndOfFile:LazyStickyPool.kt$net.corda.core.internal.LazyStickyPool.kt - NewLineAtEndOfFile:LedgerTransactionQueryTests.kt$net.corda.coretests.transactions.LedgerTransactionQueryTests.kt - NewLineAtEndOfFile:LegalNameValidator.kt$net.corda.core.internal.LegalNameValidator.kt - NewLineAtEndOfFile:LegalNameValidatorTest.kt$net.corda.core.internal.LegalNameValidatorTest.kt - NewLineAtEndOfFile:LifeCycle.kt$net.corda.core.internal.LifeCycle.kt - NewLineAtEndOfFile:LifecycleSupport.kt$net.corda.node.internal.LifecycleSupport.kt - NewLineAtEndOfFile:LocalDateSerializer.kt$net.corda.serialization.internal.amqp.custom.LocalDateSerializer.kt - NewLineAtEndOfFile:LocalDateTimeSerializer.kt$net.corda.serialization.internal.amqp.custom.LocalDateTimeSerializer.kt - NewLineAtEndOfFile:LocalPropertyInformation.kt$net.corda.serialization.internal.model.LocalPropertyInformation.kt - NewLineAtEndOfFile:LocalTimeSerializer.kt$net.corda.serialization.internal.amqp.custom.LocalTimeSerializer.kt - NewLineAtEndOfFile:LocalTypeInformationBuilder.kt$net.corda.serialization.internal.model.LocalTypeInformationBuilder.kt - NewLineAtEndOfFile:LocalTypeModelTests.kt$net.corda.serialization.internal.model.LocalTypeModelTests.kt - NewLineAtEndOfFile:LocalVolume.kt$net.corda.networkbuilder.volumes.docker.LocalVolume.kt - NewLineAtEndOfFile:MQSecurityTest.kt$net.corda.services.messaging.MQSecurityTest.kt - NewLineAtEndOfFile:MainView.kt$net.corda.explorer.views.MainView.kt - NewLineAtEndOfFile:MappedSchemasCrossReferenceDetectionTests.kt$net.corda.coretests.schemas.MappedSchemasCrossReferenceDetectionTests.kt - NewLineAtEndOfFile:MatcherTests.kt$net.corda.testing.internal.MatcherTests.kt - NewLineAtEndOfFile:Matchers.kt$net.corda.testing.internal.matchers.Matchers.kt - NewLineAtEndOfFile:MerkleTransaction.kt$net.corda.core.transactions.MerkleTransaction.kt - NewLineAtEndOfFile:MerkleTree.kt$net.corda.core.crypto.MerkleTree.kt - NewLineAtEndOfFile:MerkleTreeTest.kt$net.corda.deterministic.crypto.MerkleTreeTest.kt - NewLineAtEndOfFile:MessageState.kt$net.corda.testMessage.MessageState.kt - NewLineAtEndOfFile:MessageStatus.kt$net.corda.nodeapi.internal.protonwrapper.messages.MessageStatus.kt - NewLineAtEndOfFile:MetricInterceptor.kt$net.corda.node.services.statemachine.interceptors.MetricInterceptor.kt - NewLineAtEndOfFile:MigrationNamedCacheFactory.kt$net.corda.node.migration.MigrationNamedCacheFactory.kt - NewLineAtEndOfFile:MigrationServicesForResolution.kt$net.corda.node.migration.MigrationServicesForResolution.kt - NewLineAtEndOfFile:MissingAttachmentsException.kt$net.corda.core.serialization.MissingAttachmentsException.kt - NewLineAtEndOfFile:MockAttachmentStorage.kt$net.corda.testing.services.MockAttachmentStorage.kt - NewLineAtEndOfFile:MockContractAttachment.kt$net.corda.deterministic.verifier.MockContractAttachment.kt - NewLineAtEndOfFile:MockCordappConfigProvider.kt$net.corda.testing.internal.MockCordappConfigProvider.kt - NewLineAtEndOfFile:MockCryptoService.kt$net.corda.testing.node.internal.MockCryptoService.kt - NewLineAtEndOfFile:MockKeyManagementService.kt$net.corda.testing.node.internal.MockKeyManagementService.kt - NewLineAtEndOfFile:MockNetworkTest.kt$net.corda.testing.node.MockNetworkTest.kt - NewLineAtEndOfFile:MockPublicKeyToOwningIdentityCache.kt$net.corda.testing.node.internal.MockPublicKeyToOwningIdentityCache.kt - NewLineAtEndOfFile:MockServices.kt$net.corda.testing.node.MockServices.kt - NewLineAtEndOfFile:MockTransactionStorage.kt$net.corda.testing.node.internal.MockTransactionStorage.kt - NewLineAtEndOfFile:ModelsUtils.kt$net.corda.client.jfx.model.ModelsUtils.kt - NewLineAtEndOfFile:MonthDaySerializer.kt$net.corda.serialization.internal.amqp.custom.MonthDaySerializer.kt - NewLineAtEndOfFile:NamedCacheTest.kt$net.corda.core.internal.NamedCacheTest.kt - NewLineAtEndOfFile:NettyWritable.kt$net.corda.nodeapi.internal.protonwrapper.engine.NettyWritable.kt - NewLineAtEndOfFile:NetworkBootstrapper.kt$net.corda.nodeapi.internal.network.NetworkBootstrapper.kt - NewLineAtEndOfFile:NetworkBootstrapperBackwardsCompatibilityTest.kt$net.corda.bootstrapper.NetworkBootstrapperBackwardsCompatibilityTest.kt - NewLineAtEndOfFile:NetworkBootstrapperRunnerTests.kt$net.corda.bootstrapper.NetworkBootstrapperRunnerTests.kt - NewLineAtEndOfFile:NetworkMap.kt$net.corda.nodeapi.internal.network.NetworkMap.kt - NewLineAtEndOfFile:NetworkMapServer.kt$net.corda.testing.node.internal.network.NetworkMapServer.kt - NewLineAtEndOfFile:NetworkMapUpdater.kt$net.corda.node.services.network.NetworkMapUpdater.kt - NewLineAtEndOfFile:NetworkParameterOverridesSpec.kt$net.corda.nodeapi.internal.network.NetworkParameterOverridesSpec.kt - NewLineAtEndOfFile:NetworkParametersReaderTest.kt$net.corda.node.services.network.NetworkParametersReaderTest.kt - NewLineAtEndOfFile:NetworkParametersResolutionTest.kt$net.corda.coretests.internal.NetworkParametersResolutionTest.kt - NewLineAtEndOfFile:NoOpTestDatabaseContext.kt$net.corda.testing.internal.db.NoOpTestDatabaseContext.kt - NewLineAtEndOfFile:NodeAdder.kt$net.corda.networkbuilder.nodes.NodeAdder.kt - NewLineAtEndOfFile:NodeAttachmentService.kt$net.corda.node.services.persistence.NodeAttachmentService.kt - NewLineAtEndOfFile:NodeBuildProperties.kt$net.corda.node.utilities.NodeBuildProperties.kt - NewLineAtEndOfFile:NodeConfigurationImpl.kt$net.corda.node.services.config.NodeConfigurationImpl.kt - NewLineAtEndOfFile:NodeConnection.kt$net.corda.loadtest.NodeConnection.kt - NewLineAtEndOfFile:NodeCopier.kt$net.corda.networkbuilder.nodes.NodeCopier.kt - NewLineAtEndOfFile:NodeDiagnosticInfo.kt$net.corda.core.node.NodeDiagnosticInfo.kt - NewLineAtEndOfFile:NodeFinder.kt$net.corda.networkbuilder.nodes.NodeFinder.kt - NewLineAtEndOfFile:NodeFlowManagerTest.kt$net.corda.node.internal.NodeFlowManagerTest.kt - NewLineAtEndOfFile:NodeHandleTests.kt$net.corda.node.services.rpc.NodeHandleTests.kt - NewLineAtEndOfFile:NodeInfoFilesCopierTest.kt$net.corda.nodeapi.internal.network.NodeInfoFilesCopierTest.kt - NewLineAtEndOfFile:NodeInstance.kt$net.corda.networkbuilder.nodes.NodeInstance.kt - NewLineAtEndOfFile:NodeInstanceRequest.kt$net.corda.networkbuilder.nodes.NodeInstanceRequest.kt - NewLineAtEndOfFile:NodeInstantiator.kt$net.corda.networkbuilder.nodes.NodeInstantiator.kt - NewLineAtEndOfFile:NodeMonitorModel.kt$net.corda.client.jfx.model.NodeMonitorModel.kt - NewLineAtEndOfFile:NodeNamedCache.kt$net.corda.node.utilities.NodeNamedCache.kt - NewLineAtEndOfFile:NodePerformanceTests.kt$net.corda.node.NodePerformanceTests.kt - NewLineAtEndOfFile:NodePropertiesStore.kt$net.corda.node.services.api.NodePropertiesStore.kt - NewLineAtEndOfFile:NodePusher.kt$net.corda.networkbuilder.nodes.NodePusher.kt - NewLineAtEndOfFile:NodeRPCTests.kt$net.corda.node.NodeRPCTests.kt - NewLineAtEndOfFile:NodeRpcOptions.kt$net.corda.node.services.config.rpc.NodeRpcOptions.kt - NewLineAtEndOfFile:NodeRpcSettings.kt$net.corda.demobench.model.NodeRpcSettings.kt - NewLineAtEndOfFile:NodeSchemaServiceTest.kt$net.corda.node.services.schema.NodeSchemaServiceTest.kt - NewLineAtEndOfFile:NodeStartupCliTest.kt$net.corda.node.internal.NodeStartupCliTest.kt - NewLineAtEndOfFile:NodeStartupCompatibilityTest.kt$net.corda.node.internal.NodeStartupCompatibilityTest.kt - NewLineAtEndOfFile:NodeStartupTest.kt$net.corda.node.internal.NodeStartupTest.kt - NewLineAtEndOfFile:NodeStatePersistenceTests.kt$net.corda.node.persistence.NodeStatePersistenceTests.kt - NewLineAtEndOfFile:NodeUniqueIdProvider.kt$net.corda.node.internal.NodeUniqueIdProvider.kt - NewLineAtEndOfFile:NodeVaultService.kt$net.corda.node.services.vault.NodeVaultService.kt - NewLineAtEndOfFile:NodeVaultServiceTest.kt$net.corda.node.services.vault.NodeVaultServiceTest.kt - NewLineAtEndOfFile:NonInvalidatingCache.kt$net.corda.node.utilities.NonInvalidatingCache.kt - NewLineAtEndOfFile:NonInvalidatingUnboundCache.kt$net.corda.node.utilities.NonInvalidatingUnboundCache.kt - NewLineAtEndOfFile:NotSerializableExceptions.kt$net.corda.serialization.internal.NotSerializableExceptions.kt - NewLineAtEndOfFile:NotaryChangeTests.kt$net.corda.node.services.NotaryChangeTests.kt - NewLineAtEndOfFile:NotaryCopier.kt$net.corda.networkbuilder.notaries.NotaryCopier.kt - NewLineAtEndOfFile:NotaryExceptionSerializationTest.kt$net.corda.coretests.serialization.NotaryExceptionSerializationTest.kt - NewLineAtEndOfFile:NotaryLoader.kt$net.corda.node.utilities.NotaryLoader.kt - NewLineAtEndOfFile:NotaryService.kt$net.corda.core.internal.notary.NotaryService.kt - NewLineAtEndOfFile:NotarySpec.kt$net.corda.testing.node.NotarySpec.kt - NewLineAtEndOfFile:NotaryTestContracts.kt$net.corda.verification.NotaryTestContracts.kt - NewLineAtEndOfFile:NotaryWhitelistTests.kt$net.corda.node.services.transactions.NotaryWhitelistTests.kt - NewLineAtEndOfFile:NullKeys.kt$net.corda.core.crypto.NullKeys.kt - NewLineAtEndOfFile:ObjectBuilder.kt$net.corda.serialization.internal.amqp.ObjectBuilder.kt - NewLineAtEndOfFile:ObjectDiffer.kt$net.corda.node.utilities.ObjectDiffer.kt - NewLineAtEndOfFile:ObjectSerializer.kt$net.corda.serialization.internal.amqp.ObjectSerializer.kt - NewLineAtEndOfFile:ObligationTests.kt$net.corda.finance.contracts.asset.ObligationTests.kt - NewLineAtEndOfFile:ObligationUtils.kt$net.corda.finance.workflows.asset.ObligationUtils.kt - NewLineAtEndOfFile:ObservableContextInterface.kt$net.corda.node.services.rpc.ObservableContextInterface.kt - NewLineAtEndOfFile:ObservablesTests.kt$net.corda.node.utilities.ObservablesTests.kt - NewLineAtEndOfFile:OffsetDateTimeSerializer.kt$net.corda.serialization.internal.amqp.custom.OffsetDateTimeSerializer.kt - NewLineAtEndOfFile:OffsetTimeSerializer.kt$net.corda.serialization.internal.amqp.custom.OffsetTimeSerializer.kt - NewLineAtEndOfFile:OpaqueBytesSubSequenceSerializer.kt$net.corda.serialization.internal.amqp.custom.OpaqueBytesSubSequenceSerializer.kt - NewLineAtEndOfFile:OptionalSerializationTests.kt$net.corda.serialization.internal.amqp.OptionalSerializationTests.kt - NewLineAtEndOfFile:OptionalSerializer.kt$net.corda.serialization.internal.amqp.custom.OptionalSerializer.kt - NewLineAtEndOfFile:OracleNodeTearOffTests.kt$net.corda.irs.api.OracleNodeTearOffTests.kt - NewLineAtEndOfFile:OverridePKSerializerTest.kt$net.corda.serialization.internal.amqp.OverridePKSerializerTest.kt - NewLineAtEndOfFile:P2PFlowsDrainingModeTest.kt$net.corda.node.modes.draining.P2PFlowsDrainingModeTest.kt - NewLineAtEndOfFile:P2PMQSecurityTest.kt$net.corda.services.messaging.P2PMQSecurityTest.kt - NewLineAtEndOfFile:PackageOwnershipVerificationTests.kt$net.corda.coretests.contracts.PackageOwnershipVerificationTests.kt - NewLineAtEndOfFile:PartyTest.kt$net.corda.coretests.indentity.PartyTest.kt - NewLineAtEndOfFile:Password.kt$net.corda.node.internal.security.Password.kt - NewLineAtEndOfFile:PasswordTest.kt$net.corda.node.internal.security.PasswordTest.kt - NewLineAtEndOfFile:PathUtilsTest.kt$net.corda.core.internal.PathUtilsTest.kt - NewLineAtEndOfFile:PeriodSerializer.kt$net.corda.serialization.internal.amqp.custom.PeriodSerializer.kt - NewLineAtEndOfFile:PermissionException.kt$net.corda.client.rpc.PermissionException.kt - NewLineAtEndOfFile:Permissions.kt$net.corda.node.services.Permissions.kt - NewLineAtEndOfFile:PersistentIdentityMigration.kt$net.corda.node.migration.PersistentIdentityMigration.kt - NewLineAtEndOfFile:PersistentIdentityMigrationNewTable.kt$net.corda.node.migration.PersistentIdentityMigrationNewTable.kt - NewLineAtEndOfFile:PersistentIdentityMigrationNewTableTest.kt$net.corda.node.migration.PersistentIdentityMigrationNewTableTest.kt - NewLineAtEndOfFile:PersistentIdentityService.kt$net.corda.node.services.identity.PersistentIdentityService.kt - NewLineAtEndOfFile:PersistentIdentityServiceTests.kt$net.corda.node.services.identity.PersistentIdentityServiceTests.kt - NewLineAtEndOfFile:PersistentMapTests.kt$net.corda.node.utilities.PersistentMapTests.kt - NewLineAtEndOfFile:PersistentScheduledFlowRepository.kt$net.corda.node.services.events.PersistentScheduledFlowRepository.kt - NewLineAtEndOfFile:PersistentScheduledFlowRepositoryTest.kt$net.corda.node.services.events.PersistentScheduledFlowRepositoryTest.kt - NewLineAtEndOfFile:PersistentStateServiceTests.kt$net.corda.node.services.schema.PersistentStateServiceTests.kt - NewLineAtEndOfFile:PortAllocationTest.kt$net.corda.testing.driver.PortAllocationTest.kt - NewLineAtEndOfFile:PrivacySaltTest.kt$net.corda.core.contracts.PrivacySaltTest.kt - NewLineAtEndOfFile:PrivacySaltTest.kt$net.corda.deterministic.contracts.PrivacySaltTest.kt - NewLineAtEndOfFile:PrivateKeySerializationTest.kt$net.corda.serialization.internal.PrivateKeySerializationTest.kt - NewLineAtEndOfFile:PrivateKeySerializer.kt$net.corda.serialization.internal.amqp.custom.PrivateKeySerializer.kt - NewLineAtEndOfFile:PrivatePropertyTests.kt$net.corda.serialization.internal.amqp.PrivatePropertyTests.kt - NewLineAtEndOfFile:ProcessUtilities.kt$net.corda.testing.node.internal.ProcessUtilities.kt - NewLineAtEndOfFile:ProcessUtilitiesTests.kt$net.corda.testing.node.internal.ProcessUtilitiesTests.kt - NewLineAtEndOfFile:ProgressTracker.kt$net.corda.core.internal.ProgressTracker.kt - NewLineAtEndOfFile:Properties.kt$net.corda.common.configuration.parsing.internal.Properties.kt - NewLineAtEndOfFile:PropertyTest.kt$net.corda.common.configuration.parsing.internal.PropertyTest.kt - NewLineAtEndOfFile:PropertyValidationTest.kt$net.corda.common.configuration.parsing.internal.PropertyValidationTest.kt - NewLineAtEndOfFile:PublicKeyHashToExternalId.kt$net.corda.node.services.persistence.PublicKeyHashToExternalId.kt - NewLineAtEndOfFile:PublicKeySerializer.kt$net.corda.serialization.internal.amqp.custom.PublicKeySerializer.kt - NewLineAtEndOfFile:PublicKeyToOwningIdentityCache.kt$net.corda.nodeapi.internal.PublicKeyToOwningIdentityCache.kt - NewLineAtEndOfFile:PublicKeyToOwningIdentityCacheImpl.kt$net.corda.node.services.persistence.PublicKeyToOwningIdentityCacheImpl.kt - NewLineAtEndOfFile:PublicKeyToOwningIdentityCacheImplTest.kt$net.corda.node.services.persistence.PublicKeyToOwningIdentityCacheImplTest.kt - NewLineAtEndOfFile:PublicKeyToTextConverter.kt$net.corda.node.services.persistence.PublicKeyToTextConverter.kt - NewLineAtEndOfFile:PushedNode.kt$net.corda.networkbuilder.nodes.PushedNode.kt - NewLineAtEndOfFile:QueryCriteriaUtils.kt$net.corda.core.node.services.vault.QueryCriteriaUtils.kt - NewLineAtEndOfFile:RPCApi.kt$net.corda.nodeapi.RPCApi.kt - NewLineAtEndOfFile:RPCConcurrencyTests.kt$net.corda.client.rpc.RPCConcurrencyTests.kt - NewLineAtEndOfFile:RPCConnection.kt$net.corda.client.rpc.RPCConnection.kt - NewLineAtEndOfFile:RPCException.kt$net.corda.client.rpc.RPCException.kt - NewLineAtEndOfFile:RPCMQSecurityTest.kt$net.corda.services.messaging.RPCMQSecurityTest.kt - NewLineAtEndOfFile:RPCOps.kt$net.corda.core.messaging.RPCOps.kt - NewLineAtEndOfFile:RPCReturnsObservables.kt$net.corda.core.messaging.RPCReturnsObservables.kt - NewLineAtEndOfFile:RPCSecurityManagerImpl.kt$net.corda.node.internal.security.RPCSecurityManagerImpl.kt - NewLineAtEndOfFile:RPCSecurityManagerTest.kt$net.corda.node.services.RPCSecurityManagerTest.kt - NewLineAtEndOfFile:RPCStabilityTests.kt$net.corda.client.rpc.RPCStabilityTests.kt - NewLineAtEndOfFile:RaftConfig.kt$net.corda.notary.experimental.raft.RaftConfig.kt - NewLineAtEndOfFile:RaftTransactionCommitLog.kt$net.corda.notary.experimental.raft.RaftTransactionCommitLog.kt - NewLineAtEndOfFile:RaftTransactionCommitLogTests.kt$net.corda.notary.experimental.raft.RaftTransactionCommitLogTests.kt - NewLineAtEndOfFile:RandomFailingProxy.kt$net.corda.node.services.rpc.RandomFailingProxy.kt - NewLineAtEndOfFile:ReactiveArtemisConsumer.kt$net.corda.node.internal.artemis.ReactiveArtemisConsumer.kt - NewLineAtEndOfFile:ReceiveAllFlowTests.kt$net.corda.coretests.flows.ReceiveAllFlowTests.kt - NewLineAtEndOfFile:ReceivedMessage.kt$net.corda.nodeapi.internal.protonwrapper.messages.ReceivedMessage.kt - NewLineAtEndOfFile:ReceivedMessageImpl.kt$net.corda.nodeapi.internal.protonwrapper.messages.impl.ReceivedMessageImpl.kt - NewLineAtEndOfFile:ReconnectingObservable.kt$net.corda.client.rpc.internal.ReconnectingObservable.kt - NewLineAtEndOfFile:ReferenceInputStateTests.kt$net.corda.coretests.transactions.ReferenceInputStateTests.kt - NewLineAtEndOfFile:RemoteSerializerFactory.kt$net.corda.serialization.internal.amqp.RemoteSerializerFactory.kt - NewLineAtEndOfFile:RemoteTypeCarpenter.kt$net.corda.serialization.internal.model.RemoteTypeCarpenter.kt - NewLineAtEndOfFile:RepeatingBytesInputStream.kt$net.corda.client.rpc.RepeatingBytesInputStream.kt - NewLineAtEndOfFile:RequiresDb.kt$net.corda.testing.internal.db.RequiresDb.kt - NewLineAtEndOfFile:ResolveStatePointersTest.kt$net.corda.node.services.transactions.ResolveStatePointersTest.kt - NewLineAtEndOfFile:RestrictedEntityManager.kt$net.corda.nodeapi.internal.persistence.RestrictedEntityManager.kt - NewLineAtEndOfFile:RolesAdderOnLogin.kt$net.corda.node.services.rpc.RolesAdderOnLogin.kt - NewLineAtEndOfFile:RpcBrokerConfiguration.kt$net.corda.node.services.rpc.RpcBrokerConfiguration.kt - NewLineAtEndOfFile:RpcClientCordaFutureSerializer.kt$net.corda.client.rpc.internal.serialization.amqp.RpcClientCordaFutureSerializer.kt - NewLineAtEndOfFile:RpcClientObservableDeSerializer.kt$net.corda.client.rpc.internal.serialization.amqp.RpcClientObservableDeSerializer.kt - NewLineAtEndOfFile:RpcExceptions.kt$net.corda.nodeapi.exceptions.RpcExceptions.kt - NewLineAtEndOfFile:RpcHelpers.kt$net.corda.nodeapi.internal.RpcHelpers.kt - NewLineAtEndOfFile:RpcInfo.kt$net.corda.RpcInfo.kt - NewLineAtEndOfFile:RpcMatchers.kt$net.corda.testing.internal.matchers.rpc.RpcMatchers.kt - NewLineAtEndOfFile:RpcServerObservableSerializer.kt$net.corda.node.serialization.amqp.RpcServerObservableSerializer.kt - NewLineAtEndOfFile:RpcServerObservableSerializerTests.kt$net.corda.node.internal.serialization.RpcServerObservableSerializerTests.kt - NewLineAtEndOfFile:RpcSslTest.kt$net.corda.node.services.rpc.RpcSslTest.kt - NewLineAtEndOfFile:RxNotificationSerializer.kt$net.corda.serialization.internal.amqp.custom.RxNotificationSerializer.kt - NewLineAtEndOfFile:SSHDConfiguration.kt$net.corda.tools.shell.SSHDConfiguration.kt - NewLineAtEndOfFile:SSLHelperTest.kt$net.corda.nodeapi.internal.protonwrapper.netty.SSLHelperTest.kt - NewLineAtEndOfFile:SchedulableFlow.kt$net.corda.core.flows.SchedulableFlow.kt - NewLineAtEndOfFile:SchedulerService.kt$net.corda.node.services.api.SchedulerService.kt - NewLineAtEndOfFile:Schema.kt$net.corda.common.configuration.parsing.internal.Schema.kt - NewLineAtEndOfFile:Schema.kt$net.corda.notary.experimental.bftsmart.Schema.kt - NewLineAtEndOfFile:Schema.kt$net.corda.notary.experimental.raft.Schema.kt - NewLineAtEndOfFile:SchemaMigration.kt$net.corda.nodeapi.internal.persistence.SchemaMigration.kt - NewLineAtEndOfFile:SchemaTest.kt$net.corda.common.configuration.parsing.internal.SchemaTest.kt - NewLineAtEndOfFile:SearchField.kt$net.corda.explorer.views.SearchField.kt - NewLineAtEndOfFile:SecureArtemisConfiguration.kt$net.corda.node.internal.artemis.SecureArtemisConfiguration.kt - NewLineAtEndOfFile:SecureHashTest.kt$net.corda.deterministic.crypto.SecureHashTest.kt - NewLineAtEndOfFile:SecureRandomTest.kt$net.corda.deterministic.crypto.SecureRandomTest.kt - NewLineAtEndOfFile:SendableMessage.kt$net.corda.nodeapi.internal.protonwrapper.messages.SendableMessage.kt - NewLineAtEndOfFile:SendableMessageImpl.kt$net.corda.nodeapi.internal.protonwrapper.messages.impl.SendableMessageImpl.kt - NewLineAtEndOfFile:SerializationAnnotations.kt$net.corda.core.serialization.SerializationAnnotations.kt - NewLineAtEndOfFile:SerializationHelper.kt$net.corda.serialization.internal.amqp.SerializationHelper.kt - NewLineAtEndOfFile:SerializationPropertyOrdering.kt$net.corda.serialization.internal.amqp.SerializationPropertyOrdering.kt - NewLineAtEndOfFile:SerializationSchemaTests.kt$net.corda.serialization.internal.amqp.SerializationSchemaTests.kt - NewLineAtEndOfFile:SerializationSupport.kt$net.corda.tools.shell.SerializationSupport.kt - NewLineAtEndOfFile:SerializationWhitelist.kt$net.corda.core.serialization.SerializationWhitelist.kt - NewLineAtEndOfFile:SerializeAsTokenContextImpl.kt$net.corda.serialization.internal.SerializeAsTokenContextImpl.kt - NewLineAtEndOfFile:SerializeAsTokenSerializer.kt$net.corda.node.serialization.kryo.SerializeAsTokenSerializer.kt - NewLineAtEndOfFile:SerializerFactory.kt$net.corda.serialization.internal.amqp.SerializerFactory.kt - NewLineAtEndOfFile:SerializerFactoryBuilder.kt$net.corda.serialization.internal.amqp.SerializerFactoryBuilder.kt - NewLineAtEndOfFile:ServiceHubCoreInternal.kt$net.corda.core.internal.ServiceHubCoreInternal.kt - NewLineAtEndOfFile:Settings.kt$net.corda.explorer.views.Settings.kt - NewLineAtEndOfFile:SettingsModel.kt$net.corda.explorer.model.SettingsModel.kt - NewLineAtEndOfFile:SettingsModelTest.kt$net.corda.explorer.model.SettingsModelTest.kt - NewLineAtEndOfFile:SharedMemoryIncremental.kt$net.corda.testing.driver.internal.SharedMemoryIncremental.kt - NewLineAtEndOfFile:ShutdownManager.kt$net.corda.testing.node.internal.ShutdownManager.kt - NewLineAtEndOfFile:SignatureConstraintMigrationFromHashConstraintsTests.kt$net.corda.contracts.SignatureConstraintMigrationFromHashConstraintsTests.kt - NewLineAtEndOfFile:SignatureConstraintMigrationFromWhitelistConstraintTests.kt$net.corda.contracts.SignatureConstraintMigrationFromWhitelistConstraintTests.kt - NewLineAtEndOfFile:SignatureConstraintVersioningTests.kt$net.corda.contracts.SignatureConstraintVersioningTests.kt - NewLineAtEndOfFile:SimpleStringSerializer.kt$net.corda.serialization.internal.amqp.custom.SimpleStringSerializer.kt - NewLineAtEndOfFile:SingletonSerializer.kt$net.corda.serialization.internal.amqp.SingletonSerializer.kt - NewLineAtEndOfFile:Specification.kt$net.corda.common.configuration.parsing.internal.Specification.kt - NewLineAtEndOfFile:SpecificationTest.kt$net.corda.common.configuration.parsing.internal.SpecificationTest.kt - NewLineAtEndOfFile:SslConfiguration.kt$net.corda.nodeapi.internal.config.SslConfiguration.kt - NewLineAtEndOfFile:StaffedFlowHospital.kt$net.corda.node.services.statemachine.StaffedFlowHospital.kt - NewLineAtEndOfFile:StandaloneShellArgsParserTest.kt$net.corda.tools.shell.StandaloneShellArgsParserTest.kt - NewLineAtEndOfFile:StandardConfigValueParsers.kt$net.corda.node.services.config.schema.parsers.StandardConfigValueParsers.kt - NewLineAtEndOfFile:StartableByRPC.kt$net.corda.core.flows.StartableByRPC.kt - NewLineAtEndOfFile:StartableByService.kt$net.corda.core.flows.StartableByService.kt - NewLineAtEndOfFile:StateMachineRunId.kt$net.corda.core.flows.StateMachineRunId.kt - NewLineAtEndOfFile:StateMachineRunIdTest.kt$net.corda.client.jackson.StateMachineRunIdTest.kt - NewLineAtEndOfFile:StateMachineState.kt$net.corda.node.services.statemachine.StateMachineState.kt - NewLineAtEndOfFile:StatePointer.kt$net.corda.core.contracts.StatePointer.kt - NewLineAtEndOfFile:StatePointerSearch.kt$net.corda.core.internal.StatePointerSearch.kt - NewLineAtEndOfFile:StatePointerSearchTests.kt$net.corda.core.internal.StatePointerSearchTests.kt - NewLineAtEndOfFile:StaticInitialisationOfSerializedObjectTest.kt$net.corda.serialization.internal.amqp.StaticInitialisationOfSerializedObjectTest.kt - NewLineAtEndOfFile:StatusTransitions.kt$io.cryptoblk.core.StatusTransitions.kt - NewLineAtEndOfFile:StatusTransitionsTest.kt$io.cryptoblk.core.StatusTransitionsTest.kt - NewLineAtEndOfFile:StreamTests.kt$net.corda.serialization.internal.amqp.StreamTests.kt - NewLineAtEndOfFile:StringBufferSerializer.kt$net.corda.serialization.internal.amqp.custom.StringBufferSerializer.kt - NewLineAtEndOfFile:StructuresTests.kt$net.corda.core.contracts.StructuresTests.kt - NewLineAtEndOfFile:SwapIdentitiesFlow.kt$net.corda.confidential.SwapIdentitiesFlow.kt - NewLineAtEndOfFile:TLSAuthenticationTests.kt$net.corda.node.utilities.TLSAuthenticationTests.kt - NewLineAtEndOfFile:TargetVersionDependentRules.kt$net.corda.core.internal.rules.TargetVersionDependentRules.kt - NewLineAtEndOfFile:TestAnnotations.kt$net.corda.testing.internal.db.TestAnnotations.kt - NewLineAtEndOfFile:TestCommsFlowInitiatorTest.kt$net.corda.configsample.TestCommsFlowInitiatorTest.kt - NewLineAtEndOfFile:TestDatabaseContext.kt$net.corda.testing.internal.db.TestDatabaseContext.kt - NewLineAtEndOfFile:TestNoSecurityDataVendingFlow.kt$net.corda.coretests.flows.TestNoSecurityDataVendingFlow.kt - NewLineAtEndOfFile:TestObservableContext.kt$net.corda.node.internal.serialization.testutils.TestObservableContext.kt - NewLineAtEndOfFile:TestSerializationContext.kt$net.corda.serialization.internal.amqp.testutils.TestSerializationContext.kt - NewLineAtEndOfFile:TestUtils.kt$net.corda.common.configuration.parsing.internal.TestUtils.kt - NewLineAtEndOfFile:TestingNamedCacheFactory.kt$net.corda.testing.internal.TestingNamedCacheFactory.kt - NewLineAtEndOfFile:ThreadContextAdjustingRpcOpsProxy.kt$net.corda.node.internal.rpc.proxies.ThreadContextAdjustingRpcOpsProxy.kt - NewLineAtEndOfFile:ThreadContextAdjustingRpcOpsProxyTest.kt$net.corda.node.internal.rpc.proxies.ThreadContextAdjustingRpcOpsProxyTest.kt - NewLineAtEndOfFile:TimeWindow.kt$net.corda.core.contracts.TimeWindow.kt - NewLineAtEndOfFile:TimedFlowUtils.kt$net.corda.node.utilities.TimedFlowUtils.kt - NewLineAtEndOfFile:TlsDiffProtocolsTest.kt$net.corda.nodeapi.internal.crypto.TlsDiffProtocolsTest.kt - NewLineAtEndOfFile:ToggleField.kt$net.corda.core.internal.ToggleField.kt - NewLineAtEndOfFile:TopLevelTransition.kt$net.corda.node.services.statemachine.transitions.TopLevelTransition.kt - NewLineAtEndOfFile:Trace.kt$net.corda.core.context.Trace.kt - NewLineAtEndOfFile:TrackedDelegate.kt$net.corda.client.jfx.model.TrackedDelegate.kt - NewLineAtEndOfFile:TransactionCallbackTest.kt$net.corda.node.services.persistence.TransactionCallbackTest.kt - NewLineAtEndOfFile:TransactionGenerator.kt$net.corda.deterministic.data.TransactionGenerator.kt - NewLineAtEndOfFile:TransactionStorage.kt$net.corda.core.node.services.TransactionStorage.kt - NewLineAtEndOfFile:TransactionVerificationExceptionSerialisationTests.kt$net.corda.coretests.contracts.TransactionVerificationExceptionSerialisationTests.kt - NewLineAtEndOfFile:TransactionVerifierService.kt$net.corda.core.node.services.TransactionVerifierService.kt - NewLineAtEndOfFile:TransactionWithSignatures.kt$net.corda.core.transactions.TransactionWithSignatures.kt - NewLineAtEndOfFile:TransactionWithSignaturesTest.kt$net.corda.deterministic.transactions.TransactionWithSignaturesTest.kt - NewLineAtEndOfFile:TutorialContract.kt$net.corda.docs.kotlin.tutorial.contract.TutorialContract.kt - NewLineAtEndOfFile:TutorialFlowStateMachines.kt$net.corda.docs.kotlin.tutorial.flowstatemachines.TutorialFlowStateMachines.kt - NewLineAtEndOfFile:TypeIdentifier.kt$net.corda.serialization.internal.model.TypeIdentifier.kt - NewLineAtEndOfFile:TypeIdentifierTests.kt$net.corda.serialization.internal.model.TypeIdentifierTests.kt - NewLineAtEndOfFile:TypeModellingFingerPrinterTests.kt$net.corda.serialization.internal.amqp.TypeModellingFingerPrinterTests.kt - NewLineAtEndOfFile:TypeNotationGenerator.kt$net.corda.serialization.internal.amqp.TypeNotationGenerator.kt - NewLineAtEndOfFile:TypesafeCordappConfig.kt$net.corda.node.internal.cordapp.TypesafeCordappConfig.kt - NewLineAtEndOfFile:TypesafeCordappConfigTests.kt$net.corda.node.internal.cordapp.TypesafeCordappConfigTests.kt - NewLineAtEndOfFile:UniqueDummyFungibleContract.kt$net.corda.testing.internal.vault.UniqueDummyFungibleContract.kt - NewLineAtEndOfFile:UniqueDummyLinearContract.kt$net.corda.testing.internal.vault.UniqueDummyLinearContract.kt - NewLineAtEndOfFile:UniqueIdentifier.kt$net.corda.core.contracts.UniqueIdentifier.kt - NewLineAtEndOfFile:UniqueIdentifierTest.kt$net.corda.deterministic.contracts.UniqueIdentifierTest.kt - NewLineAtEndOfFile:UpdateBusinessDayFlow.kt$net.corda.irs.flows.UpdateBusinessDayFlow.kt - NewLineAtEndOfFile:User.kt$net.corda.testing.node.User.kt - NewLineAtEndOfFile:Utils.kt$io.cryptoblk.core.Utils.kt - NewLineAtEndOfFile:Utils.kt$net.corda.common.configuration.parsing.internal.Utils.kt - NewLineAtEndOfFile:Utils.kt$net.corda.node.internal.classloading.Utils.kt - NewLineAtEndOfFile:UtilsTest.kt$net.corda.common.configuration.parsing.internal.UtilsTest.kt - NewLineAtEndOfFile:UuidGenerator.kt$net.corda.core.utilities.UuidGenerator.kt - NewLineAtEndOfFile:V1NodeConfigurationSpec.kt$net.corda.node.services.config.schema.v1.V1NodeConfigurationSpec.kt - NewLineAtEndOfFile:Validated.kt$net.corda.common.validation.internal.Validated.kt - NewLineAtEndOfFile:Validator.kt$net.corda.common.validation.internal.Validator.kt - NewLineAtEndOfFile:VaultEnumTypesTest.kt$net.corda.core.node.services.VaultEnumTypesTest.kt - NewLineAtEndOfFile:VaultQueryTests.kt$net.corda.node.services.vault.VaultQueryTests.kt - NewLineAtEndOfFile:VaultService.kt$net.corda.core.node.services.VaultService.kt - NewLineAtEndOfFile:VaultStateMigration.kt$net.corda.node.migration.VaultStateMigration.kt - NewLineAtEndOfFile:VersionExtractor.kt$net.corda.common.configuration.parsing.internal.versioned.VersionExtractor.kt - NewLineAtEndOfFile:VersionExtractorTest.kt$net.corda.common.configuration.parsing.internal.versioned.VersionExtractorTest.kt - NewLineAtEndOfFile:VersionInfo.kt$net.corda.node.VersionInfo.kt - NewLineAtEndOfFile:VersionedParsingExampleTest.kt$net.corda.common.configuration.parsing.internal.versioned.VersionedParsingExampleTest.kt - NewLineAtEndOfFile:VersionedSpecificationRegistry.kt$net.corda.common.configuration.parsing.internal.versioned.VersionedSpecificationRegistry.kt - NewLineAtEndOfFile:VirtualCordapps.kt$net.corda.node.internal.cordapp.VirtualCordapps.kt - NewLineAtEndOfFile:Volume.kt$net.corda.networkbuilder.volumes.Volume.kt - NewLineAtEndOfFile:WebServer.kt$net.corda.webserver.WebServer.kt - NewLineAtEndOfFile:WebServerPluginRegistry.kt$net.corda.webserver.services.WebServerPluginRegistry.kt - NewLineAtEndOfFile:WhitelistBasedTypeModelConfiguration.kt$net.corda.serialization.internal.amqp.WhitelistBasedTypeModelConfiguration.kt - NewLineAtEndOfFile:WithContracts.kt$net.corda.coretests.flows.WithContracts.kt - NewLineAtEndOfFile:WithMockNet.kt$net.corda.coretests.flows.WithMockNet.kt - NewLineAtEndOfFile:WritablePublicKeyToOwningIdentityCache.kt$net.corda.node.services.persistence.WritablePublicKeyToOwningIdentityCache.kt - NewLineAtEndOfFile:X509EdDSAEngineTest.kt$net.corda.core.internal.X509EdDSAEngineTest.kt - NewLineAtEndOfFile:YearMonthSerializer.kt$net.corda.serialization.internal.amqp.custom.YearMonthSerializer.kt - NewLineAtEndOfFile:YearSerializer.kt$net.corda.serialization.internal.amqp.custom.YearSerializer.kt - NewLineAtEndOfFile:ZoneIdSerializer.kt$net.corda.serialization.internal.amqp.custom.ZoneIdSerializer.kt - NewLineAtEndOfFile:ZonedDateTimeSerializer.kt$net.corda.serialization.internal.amqp.custom.ZonedDateTimeSerializer.kt - NewLineAtEndOfFile:errorAndTerminate.kt$net.corda.node.utilities.errorAndTerminate.kt - NewLineAtEndOfFile:internalAccessTestHelpers.kt$net.corda.core.internal.internalAccessTestHelpers.kt PackageNaming:MessageState.kt$package net.corda.testMessage PackageNaming:ScheduledState.kt$package net.corda.testMessage ReturnCount:AbstractPartyDescriptor.kt$AbstractPartyDescriptor$override fun <X : Any> unwrap(value: AbstractParty?, type: Class<X>, options: WrapperOptions): X? @@ -10441,7 +5271,7 @@ ReturnCount:FlowLogicRefFactoryImpl.kt$FlowLogicRefFactoryImpl$private fun buildParams(constructor: KFunction<FlowLogic<*>>, args: Map<String, Any?>): HashMap<KParameter, Any?>? ReturnCount:FlowManager.kt$NodeFlowManager.FlowWeightComparator$override fun compare(o1: NodeFlowManager.RegisteredFlowContainer, o2: NodeFlowManager.RegisteredFlowContainer): Int ReturnCount:InteractiveShell.kt$InteractiveShell$ @JvmStatic fun runFlowByNameFragment(nameFragment: String, inputData: String, output: RenderPrintWriter, rpcOps: CordaRPCOps, ansiProgressRenderer: ANSIProgressRenderer, inputObjectMapper: ObjectMapper = createYamlInputMapper(rpcOps)) - ReturnCount:InteractiveShell.kt$InteractiveShell$@JvmStatic fun runRPCFromString(input: List<String>, out: RenderPrintWriter, context: InvocationContext<out Any>, cordaRPCOps: InternalCordaRPCOps, inputObjectMapper: ObjectMapper): Any? + ReturnCount:InteractiveShell.kt$InteractiveShell$@JvmStatic fun runRPCFromString(input: List<String>, out: RenderPrintWriter, context: InvocationContext<out Any>, cordaRPCOps: CordaRPCOps, inputObjectMapper: ObjectMapper): Any? ReturnCount:InteractiveShell.kt$InteractiveShell$private fun maybeFollow(response: Any?, printerFun: (Any?) -> String, out: PrintWriter): CordaFuture<Unit> ReturnCount:Interpolators.kt$LinearInterpolator$override fun interpolate(x: Double): Double ReturnCount:JarScanningCordappLoader.kt$JarScanningCordappLoader$private fun parseCordappInfo(manifest: Manifest?, defaultName: String): Cordapp.Info @@ -10452,6 +5282,7 @@ ReturnCount:Main.kt$Node$fun isAccepted(tx: Transaction): Boolean ReturnCount:MockNodeMessagingService.kt$MockNodeMessagingService$ private fun getNextQueue(q: LinkedBlockingQueue<InMemoryMessagingNetwork.MessageTransfer>, block: Boolean): Pair<InMemoryMessagingNetwork.MessageTransfer, List<Handler>>? ReturnCount:NetworkRegistrationHelper.kt$NodeRegistrationHelper$override fun validateAndGetTlsCrlIssuerCert(): X509Certificate? + ReturnCount:NodeAttachmentTrustCalculator.kt$NodeAttachmentTrustCalculator$override fun calculate(attachment: Attachment): Boolean ReturnCount:NodeConfigurationImpl.kt$NodeConfigurationImpl$private fun validateDevModeOptions(): List<String> ReturnCount:NodeSchemaService.kt$NodeSchemaService$// Because schema is always one supported by the state, just delegate. override fun generateMappedObject(state: ContractState, schema: MappedSchema): PersistentState ReturnCount:NodeStartup.kt$NodeStartup$fun initialiseAndRun(cmdLineOptions: SharedNodeCmdLineOptions, afterNodeInitialisation: RunAfterNodeInitialisation, requireCertificates: Boolean = false): Int @@ -10468,6 +5299,7 @@ ReturnCount:SerialFilter.kt$SerialFilter$internal fun applyPredicate(acceptClass: (Class<*>) -> Boolean, serialClass: Class<*>?): Boolean ReturnCount:ServicesForResolutionImpl.kt$ServicesForResolutionImpl$// We may need to recursively chase transactions if there are notary changes. fun inner(stateRef: StateRef, forContractClassName: String?): Attachment ReturnCount:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$override fun retryFlowFromSafePoint(currentState: StateMachineState) + ReturnCount:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$private fun createFlowFromCheckpoint( id: StateMachineRunId, serializedCheckpoint: SerializedBytes<Checkpoint>, isAnyCheckpointPersisted: Boolean, isStartIdempotent: Boolean, initialDeduplicationHandler: DeduplicationHandler? ): Flow? ReturnCount:SpecificationTest.kt$SpecificationTest$fun parseMax(elements: List<Long>): Valid<Long> ReturnCount:StandaloneShell.kt$StandaloneShell$override fun runProgram(): Int ReturnCount:TransactionBuilder.kt$TransactionBuilder$ private fun handleContract( contractClassName: ContractClassName, inputStates: List<TransactionState<ContractState>>?, outputStates: List<TransactionState<ContractState>>?, explicitContractAttachment: AttachmentId?, services: ServicesForResolution ): Pair<AttachmentId, List<TransactionState<ContractState>>?> @@ -10559,14 +5391,14 @@ SpreadOperator:LogHelper.kt$LogHelper$(*classes.map { "+" + it.packageName }.toTypedArray()) SpreadOperator:LogHelper.kt$LogHelper$(*classes.map { it.packageName }.toTypedArray()) SpreadOperator:Main.kt$(*args) - SpreadOperator:MockServices.kt$MockServices$( identityService, *arrayOf(initialIdentity.keyPair) + moreKeys, pkToIdCache = MockPublicKeyToOwningIdentityCache() ) + SpreadOperator:MockServices.kt$MockServices$( identityService, *arrayOf(initialIdentity.keyPair) + moreKeys ) SpreadOperator:MockServices.kt$MockServices$( listOf(getCallerPackage(MockServices::class)!!), firstIdentity, *moreIdentities ) SpreadOperator:MockServices.kt$MockServices$( listOf(getCallerPackage(MockServices::class)!!), firstIdentity, networkParameters, *moreIdentities ) SpreadOperator:MockServices.kt$MockServices$(*listOf(firstIdentity, *moreIdentities).map { it.identity }.toTypedArray()) SpreadOperator:MockServices.kt$MockServices$(cordappPackages, TestIdentity(initialIdentityName, key), identityService, *moreKeys) SpreadOperator:MockServices.kt$MockServices$(firstIdentity, *moreIdentities) SpreadOperator:MockServices.kt$MockServices$(listOf(getCallerPackage(MockServices::class)!!), TestIdentity(initialIdentityName, key), identityService, *moreKeys) - SpreadOperator:MockServices.kt$MockServices.Companion$( identityService, *arrayOf(initialIdentity.keyPair) + moreKeys, pkToIdCache = MockPublicKeyToOwningIdentityCache() ) + SpreadOperator:MockServices.kt$MockServices.Companion$( identityService, *arrayOf(initialIdentity.keyPair) + moreKeys ) SpreadOperator:NetworkBuilder.kt$(*this.toTypedArray()) SpreadOperator:NetworkMapTest.kt$NetworkMapTest$(*nodes) SpreadOperator:NetworkMapUpdater.kt$NetworkMapUpdater$(*networkMapDownloadFutures) @@ -10628,7 +5460,7 @@ ThrowsCount:AMQPTypeIdentifierParser.kt$AMQPTypeIdentifierParser$// Make sure our inputs aren't designed to blow things up. private fun validate(typeString: String) ThrowsCount:AbstractNode.kt$fun CordaPersistence.startHikariPool(hikariProperties: Properties, databaseConfig: DatabaseConfig, schemas: Set<MappedSchema>, metricRegistry: MetricRegistry? = null, cordappLoader: CordappLoader? = null, currentDir: Path? = null, ourName: CordaX500Name) ThrowsCount:ArtemisMessagingServer.kt$ArtemisMessagingServer$// TODO: Maybe wrap [IOException] on a key store load error so that it's clearly splitting key store loading from // Artemis IO errors @Throws(IOException::class, AddressBindingException::class, KeyStoreException::class) private fun configureAndStartServer() - ThrowsCount:BrokerJaasLoginModule.kt$BaseBrokerJaasLoginModule$protected fun getUsernamePasswordAndCerts(): Triple<String, String, Array<X509Certificate>?> + ThrowsCount:BrokerJaasLoginModule.kt$BaseBrokerJaasLoginModule$@Suppress("DEPRECATION") // should use java.security.cert.X509Certificate protected fun getUsernamePasswordAndCerts(): Triple<String, String, Array<javax.security.cert.X509Certificate>?> ThrowsCount:CheckpointVerifier.kt$CheckpointVerifier$ fun verifyCheckpointsCompatible( checkpointStorage: CheckpointStorage, currentCordapps: List<Cordapp>, platformVersion: Int, serviceHub: ServiceHub, tokenizableServices: List<Any> ) ThrowsCount:CheckpointVerifier.kt$CheckpointVerifier$// Throws exception when the flow is incompatible private fun checkFlowCompatible(subFlow: SubFlow, currentCordappsByHash: Map<SecureHash.SHA256, Cordapp>, platformVersion: Int) ThrowsCount:ClassCarpenter.kt$ClassCarpenterImpl$ private fun validateSchema(schema: Schema) @@ -10664,7 +5496,7 @@ ThrowsCount:TransactionVerifierServiceInternal.kt$Verifier$ private fun getUniqueContractAttachmentsByContract(): Map<ContractClassName, ContractAttachment> ThrowsCount:TransactionVerifierServiceInternal.kt$Verifier$ private fun verifyContracts() ThrowsCount:TransactionVerifierServiceInternal.kt$Verifier$// Using basic graph theory, a full cycle of encumbered (co-dependent) states should exist to achieve bi-directional // encumbrances. This property is important to ensure that no states involved in an encumbrance-relationship // can be spent on their own. Briefly, if any of the states is having more than one encumbrance references by // other states, a full cycle detection will fail. As a result, all of the encumbered states must be present // as "from" and "to" only once (or zero times if no encumbrance takes place). For instance, // a -> b // c -> b and a -> b // b -> a b -> c // do not satisfy the bi-directionality (full cycle) property. // // In the first example "b" appears twice in encumbrance ("to") list and "c" exists in the encumbered ("from") list only. // Due the above, one could consume "a" and "b" in the same transaction and then, because "b" is already consumed, "c" cannot be spent. // // Similarly, the second example does not form a full cycle because "a" and "c" exist in one of the lists only. // As a result, one can consume "b" and "c" in the same transactions, which will make "a" impossible to be spent. // // On other hand the following are valid constructions: // a -> b a -> c // b -> c and c -> b // c -> a b -> a // and form a full cycle, meaning that the bi-directionality property is satisfied. private fun checkBidirectionalOutputEncumbrances(statesAndEncumbrance: List<Pair<Int, Int>>) - ThrowsCount:WireTransaction.kt$WireTransaction$private fun toLedgerTransactionInternal( resolveIdentity: (PublicKey) -> Party?, resolveAttachment: (SecureHash) -> Attachment?, resolveStateRefAsSerialized: (StateRef) -> SerializedBytes<TransactionState<ContractState>>?, resolveParameters: (SecureHash?) -> NetworkParameters?, resolveContractAttachment: (StateRef) -> Attachment, isAttachmentTrusted: (Attachment) -> Boolean ): LedgerTransaction + ThrowsCount:WireTransaction.kt$WireTransaction$private fun toLedgerTransactionInternal( resolveIdentity: (PublicKey) -> Party?, resolveAttachment: (SecureHash) -> Attachment?, resolveStateRefAsSerialized: (StateRef) -> SerializedBytes<TransactionState<ContractState>>?, resolveParameters: (SecureHash?) -> NetworkParameters?, isAttachmentTrusted: (Attachment) -> Boolean ): LedgerTransaction ThrowsCount:WireTransaction.kt$WireTransaction.Companion$ @CordaInternal fun resolveStateRefBinaryComponent(stateRef: StateRef, services: ServicesForResolution): SerializedBytes<TransactionState<ContractState>>? TooGenericExceptionCaught:AMQPChannelHandler.kt$AMQPChannelHandler$ex: Exception TooGenericExceptionCaught:AMQPExceptions.kt$th: Throwable @@ -10717,8 +5549,6 @@ TooGenericExceptionCaught:ErrorCodeLoggingTests.kt$e: Exception TooGenericExceptionCaught:EventProcessor.kt$EventProcessor$ex: Exception TooGenericExceptionCaught:Eventually.kt$e: Exception - TooGenericExceptionCaught:ExceptionMaskingRpcOpsProxy.kt$ExceptionMaskingRpcOpsProxy.ErrorObfuscatingInvocationHandler$exception: Exception - TooGenericExceptionCaught:ExceptionSerialisingRpcOpsProxy.kt$ExceptionSerialisingRpcOpsProxy.ErrorSerialisingInvocationHandler$exception: Exception TooGenericExceptionCaught:Expect.kt$exception: Exception TooGenericExceptionCaught:Explorer.kt$Explorer$e: Exception TooGenericExceptionCaught:FiberDeserializationCheckingInterceptor.kt$FiberDeserializationChecker$exception: Exception @@ -10745,6 +5575,7 @@ TooGenericExceptionCaught:InternalUtils.kt$ex: Exception TooGenericExceptionCaught:InternalUtils.kt$th: Throwable TooGenericExceptionCaught:IssueCash.kt$IssueCash$e: Exception + TooGenericExceptionCaught:JVMAgentUtil.kt$JVMAgentUtil$e: Exception TooGenericExceptionCaught:JacksonSupport.kt$JacksonSupport.PartyDeserializer$e: Exception TooGenericExceptionCaught:JacksonSupport.kt$JacksonSupport.PublicKeyDeserializer$e: Exception TooGenericExceptionCaught:JacksonSupport.kt$JacksonSupport.SecureHashDeserializer$e: Exception @@ -10785,7 +5616,7 @@ TooGenericExceptionCaught:NotaryUtils.kt$e: Exception TooGenericExceptionCaught:ObjectDiffer.kt$ObjectDiffer$throwable: Exception TooGenericExceptionCaught:P2PMessagingClient.kt$P2PMessagingClient$e: Exception - TooGenericExceptionCaught:PersistentIdentityMigrationNewTable.kt$PersistentIdentityMigrationNewTable$e: Exception + TooGenericExceptionCaught:PersistentIdentityMigrationNewTableTest.kt$PersistentIdentityMigrationNewTableTest$e: Exception TooGenericExceptionCaught:PersistentUniquenessProvider.kt$PersistentUniquenessProvider$e: Exception TooGenericExceptionCaught:ProfileController.kt$ProfileController$e: Exception TooGenericExceptionCaught:PropertyValidationTest.kt$PropertyValidationTest$e: Exception @@ -10810,6 +5641,7 @@ TooGenericExceptionCaught:SerializationOutputTests.kt$SerializationOutputTests$t: Throwable TooGenericExceptionCaught:ShutdownManager.kt$ShutdownManager$t: Throwable TooGenericExceptionCaught:SimpleMQClient.kt$SimpleMQClient$e: Exception + TooGenericExceptionCaught:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$e: Exception TooGenericExceptionCaught:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$ex: Exception TooGenericExceptionCaught:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$exception: Exception TooGenericExceptionCaught:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$t: Throwable @@ -10840,7 +5672,6 @@ TooGenericExceptionCaught:X509EdDSAEngine.kt$X509EdDSAEngine$e: Exception TooGenericExceptionCaught:X509UtilitiesTest.kt$X509UtilitiesTest$ex: Exception TooGenericExceptionThrown:AMQPExceptionsTests.kt$AMQPExceptionsTests$throw Exception("FAILED") - TooGenericExceptionThrown:AbstractNode.kt$AbstractNode$throw Error("Unable to locate agent jar file") TooGenericExceptionThrown:AzureBackend.kt$AzureBackend.Companion$throw RuntimeException(e) TooGenericExceptionThrown:ClassLoadingUtilsTest.kt$ClassLoadingUtilsTest$throw RuntimeException() TooGenericExceptionThrown:CommandParsers.kt$AzureParser.RegionConverter$throw Error("Unknown azure region: $value") @@ -10856,6 +5687,7 @@ TooGenericExceptionThrown:NodeConnection.kt$NodeConnection.ShellCommandOutput$throw Exception(diagnostic) TooGenericExceptionThrown:PhysicalLocationStructures.kt$CityDatabase$throw Exception("Could not parse line: $line") TooGenericExceptionThrown:RPCDriver.kt$RandomRpcUser.Companion$throw Exception("No generator for ${it.type}") + TooGenericExceptionThrown:RpcExceptionHandlingTest.kt$ClientRelevantErrorFlow$throw Exception(message, SQLException("Oops!")) TooGenericExceptionThrown:RpcServerObservableSerializerTests.kt$RpcServerObservableSerializerTests$throw Error("Observable serializer must be registerable with factory, unexpected exception - ${e.message}") TooGenericExceptionThrown:RpcServerObservableSerializerTests.kt$RpcServerObservableSerializerTests$throw Error("Serialization of observable should not throw - ${e.message}") TooGenericExceptionThrown:SelfIssueTest.kt$throw Exception( "Simulated state diverged from actual state" + "\nSimulated state:\n${previousState.vaultsSelfIssued}" + "\nActual state:\n$selfIssueVaults" + "\nDiff:\n$diffString" ) @@ -10875,6 +5707,7 @@ TooManyFunctions:ArtemisMessagingTest.kt$ArtemisMessagingTest TooManyFunctions:ArtemisTcpTransport.kt$ArtemisTcpTransport$Companion TooManyFunctions:AttachmentTests.kt$AttachmentTests : WithMockNet + TooManyFunctions:AttachmentTrustCalculatorTest.kt$AttachmentTrustCalculatorTest TooManyFunctions:AttachmentsClassLoaderTests.kt$AttachmentsClassLoaderTests TooManyFunctions:BCCryptoService.kt$BCCryptoService : CryptoService TooManyFunctions:BFTSmart.kt$BFTSmart$Replica : DefaultRecoverable @@ -10926,7 +5759,6 @@ TooManyFunctions:EnumTests.kt$EnumTests TooManyFunctions:EventProcessor.kt$EventProcessor : BaseHandler TooManyFunctions:EvolvabilityTests.kt$EvolvabilityTests - TooManyFunctions:ExceptionMaskingRpcOpsProxy.kt$ExceptionMaskingRpcOpsProxy$ErrorObfuscatingInvocationHandler : InvocationHandlerTemplate TooManyFunctions:Expect.kt$net.corda.testing.core.Expect.kt TooManyFunctions:FinanceTypesTest.kt$FinanceTypesTest TooManyFunctions:FlowFrameworkTests.kt$FlowFrameworkTests @@ -10943,6 +5775,7 @@ TooManyFunctions:IRSDemoTest.kt$IRSDemoTest TooManyFunctions:IRSTests.kt$IRSTests TooManyFunctions:IdentityService.kt$IdentityService + TooManyFunctions:InMemoryIdentityService.kt$InMemoryIdentityService : SingletonSerializeAsTokenIdentityService TooManyFunctions:InMemoryIdentityServiceTests.kt$InMemoryIdentityServiceTests TooManyFunctions:InMemoryMessagingNetwork.kt$InMemoryMessagingNetwork : SingletonSerializeAsToken TooManyFunctions:InfrequentlyMutatedCacheTest.kt$InfrequentlyMutatedCacheTest @@ -11006,7 +5839,6 @@ TooManyFunctions:PartialMerkleTreeTest.kt$PartialMerkleTreeTest TooManyFunctions:PathUtils.kt$net.corda.core.internal.PathUtils.kt TooManyFunctions:Perceivable.kt$net.corda.finance.contracts.universal.Perceivable.kt - TooManyFunctions:PersistentIdentityMigrationNewTable.kt$PersistentIdentityMigrationNewTable : CordaMigration TooManyFunctions:PersistentIdentityService.kt$PersistentIdentityService : SingletonSerializeAsTokenIdentityService TooManyFunctions:PersistentIdentityServiceTests.kt$PersistentIdentityServiceTests TooManyFunctions:PersistentNetworkMapCache.kt$PersistentNetworkMapCache : NetworkMapCacheInternalSingletonSerializeAsToken @@ -11029,6 +5861,7 @@ TooManyFunctions:RPCServer.kt$RPCServer TooManyFunctions:RPCStabilityTests.kt$RPCStabilityTests TooManyFunctions:ReadOnlyBackedObservableMapBase.kt$ReadOnlyBackedObservableMapBase<K, A, B> : ObservableMap + TooManyFunctions:ResolveStatePointersTest.kt$ResolveStatePointersTest TooManyFunctions:ResolveTransactionsFlowTest.kt$ResolveTransactionsFlowTest TooManyFunctions:SerializationAPI.kt$SerializationContext TooManyFunctions:SerializationHelper.kt$net.corda.serialization.internal.amqp.SerializationHelper.kt @@ -11113,6 +5946,7 @@ TopLevelPropertyNaming:InternalTestUtils.kt$/** * Reference to the finance-contracts CorDapp in this repo. The metadata is taken directly from finance/contracts/build.gradle, including the * fact that the jar is signed. If you need an unsigned jar then use `cordappWithPackages("net.corda.finance.contracts")`. * * You will probably need to use [FINANCE_CORDAPPS] instead to get access to the flows as well. */ @JvmField val FINANCE_CONTRACTS_CORDAPP: TestCordappImpl = findCordapp("net.corda.finance.contracts") TopLevelPropertyNaming:InternalTestUtils.kt$/** * Reference to the finance-workflows CorDapp in this repo. The metadata is taken directly from finance/workflows/build.gradle, including the * fact that the jar is signed. If you need an unsigned jar then use `cordappWithPackages("net.corda.finance.flows")`. * * You will probably need to use [FINANCE_CORDAPPS] instead to get access to the contract classes as well. */ @JvmField val FINANCE_WORKFLOWS_CORDAPP: TestCordappImpl = findCordapp("net.corda.finance.workflows") TopLevelPropertyNaming:InternalTestUtils.kt$@JvmField val FINANCE_CORDAPPS: Set<TestCordappImpl> = setOf(FINANCE_CONTRACTS_CORDAPP, FINANCE_WORKFLOWS_CORDAPP) + TopLevelPropertyNaming:InternalUtils.kt$// re-defined to prevent clash with Java 9 Class.packageName: https://docs.oracle.com/javase/9/docs/api/java/lang/Class.html#getPackageName-- val Class<*>.packageName_: String get() = requireNotNull(this.packageNameOrNull) { "$this not defined inside a package" } TopLevelPropertyNaming:InternalUtils.kt$val DEFAULT_HTTP_CONNECT_TIMEOUT = 30.seconds.toMillis() TopLevelPropertyNaming:InternalUtils.kt$val DEFAULT_HTTP_READ_TIMEOUT = 30.seconds.toMillis() TopLevelPropertyNaming:KeyStoreConfigHelpers.kt$val DEV_INTERMEDIATE_CA: CertificateAndKeyPair get() = DevCaHelper.loadDevCa(X509Utilities.CORDA_INTERMEDIATE_CA) @@ -11150,23 +5984,15 @@ TopLevelPropertyNaming:TestConstants.kt$/** A test node name **/ @JvmField val DUMMY_BANK_B_NAME = CordaX500Name("Bank B", "New York", "US") TopLevelPropertyNaming:TestConstants.kt$/** A test node name **/ @JvmField val DUMMY_BANK_C_NAME = CordaX500Name("Bank C", "Tokyo", "JP") TopLevelPropertyNaming:TestConstants.kt$/** A test notary name **/ @JvmField val DUMMY_NOTARY_NAME = CordaX500Name("Notary Service", "Zurich", "CH") - UnreachableCode:FlowRetryTest.kt$RetryFlow$throw ExceptionToCauseFiniteRetry() - VariableNaming:AMQPBridgeTest.kt$AMQPBridgeTest$private val BOB = TestIdentity(BOB_NAME) VariableNaming:AttachmentsClassLoaderSerializationTests.kt$AttachmentsClassLoaderSerializationTests$val DUMMY_NOTARY = TestIdentity(DUMMY_NOTARY_NAME, 20).party VariableNaming:AttachmentsClassLoaderSerializationTests.kt$AttachmentsClassLoaderSerializationTests$val MEGA_CORP = TestIdentity(CordaX500Name("MegaCorp", "London", "GB")).party VariableNaming:BootstrapperView.kt$BootstrapperView$val YAML_MAPPER = Constants.getContextMapper() VariableNaming:ByteArraysTest.kt$ByteArraysTest$val HEX_REGEX = "^[0-9A-F]+\$".toRegex() VariableNaming:Cap.kt$Cap$val TEST_TX_TIME_1: Instant get() = Instant.parse("2017-09-02T12:00:00.00Z") VariableNaming:Caplet.kt$Caplet$val TEST_TX_TIME_1: Instant get() = Instant.parse("2017-09-02T12:00:00.00Z") - VariableNaming:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$private lateinit var INTERMEDIATE_CA: CertificateAndKeyPair - VariableNaming:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$private val ROOT_CA = DEV_ROOT_CA VariableNaming:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$val ECDSA_ALGORITHM = "SHA256withECDSA" VariableNaming:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$val EC_ALGORITHM = "EC" VariableNaming:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests$val EMPTY_CRL = "empty.crl" - VariableNaming:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests.CrlServlet$private val EMPTY_CRL = "empty.crl" - VariableNaming:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests.CrlServlet$private val INTEMEDIATE_CRL = "intermediate.crl" - VariableNaming:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests.CrlServlet$private val NODE_CRL = "node.crl" - VariableNaming:CertificateRevocationListNodeTests.kt$CertificateRevocationListNodeTests.CrlServlet$private val SIGNATURE_ALGORITHM = "SHA256withECDSA" VariableNaming:CompositeKeyTests.kt$CompositeKeyTests$val EdSignature = keyPairEd.sign(SignableData(secureHash, SignatureMetadata(1, Crypto.findSignatureScheme(keyPairEd.public).schemeNumberID))) VariableNaming:CompositeKeyTests.kt$CompositeKeyTests$val K1Signature = keyPairK1.sign(SignableData(secureHash, SignatureMetadata(1, Crypto.findSignatureScheme(keyPairK1.public).schemeNumberID))) VariableNaming:CompositeKeyTests.kt$CompositeKeyTests$val R1Signature = keyPairR1.sign(SignableData(secureHash, SignatureMetadata(1, Crypto.findSignatureScheme(keyPairR1.public).schemeNumberID))) @@ -11206,7 +6032,6 @@ VariableNaming:EvolvabilityTests.kt$EvolvabilityTests$val C = "This is not a banana" VariableNaming:EvolvabilityTests.kt$EvolvabilityTests$val C = "three" VariableNaming:EvolvabilityTests.kt$EvolvabilityTests$val D = 4 - VariableNaming:EvolvabilityTests.kt$EvolvabilityTests$val DUMMY_NOTARY = TestIdentity(DUMMY_NOTARY_NAME, 20).party VariableNaming:EvolvabilityTests.kt$EvolvabilityTests$val E = null VariableNaming:Examples.kt$Examples$// fx swap // both parties have the right to trigger the exchange of cash flows val an_fx_swap = arrange { actions { (acmeCorp or highStreetBank) may { "execute".givenThat(after("2017-09-01")) { highStreetBank.owes(acmeCorp, 1070.K, EUR) acmeCorp.owes(highStreetBank, 1.M, USD) } } } } VariableNaming:Examples.kt$Examples$// maybe in the presence of negative interest rates you would want other side of contract to be able to take initiative as well val zero_coupon_bond_2 = arrange { actions { (acmeCorp or highStreetBank) may { "execute".givenThat(after("2017-09-01")) { highStreetBank.owes(acmeCorp, 1.M, USD) } } } } @@ -11215,6 +6040,13 @@ VariableNaming:Examples.kt$Examples$val cds_contract = arrange { actions { acmeCorp may { "claim".givenThat(acmeCorporationHasDefaulted and before("2017-09-01")) { highStreetBank.owes(acmeCorp, 1.M, USD) } } } } VariableNaming:Examples.kt$Examples$val european_fx_option = arrange { actions { acmeCorp may { "exercise".givenThat(before("2017-09-01")) { fx_swap("2017-09-01", 1.M, 1.2.bd, EUR, USD, acmeCorp, highStreetBank) } } (acmeCorp or highStreetBank) may { "expire" anytime { zero } } } } VariableNaming:Examples.kt$Examples$val one_touch = arrange { actions { highStreetBank may { "expire".givenThat(after("2017-09-01")) { zero } } acmeCorp may { "knock in".givenThat(EUR / USD gt 1.3) { highStreetBank.owes(acmeCorp, 1.M, USD) } } } } + VariableNaming:ExternalIdMappingTest.kt$ExternalIdMappingTest$val A = services.keyManagementService.freshKey(id) // Automatically calls registerKeyToParty and registerKeyToExternalId + VariableNaming:ExternalIdMappingTest.kt$ExternalIdMappingTest$val B = services.keyManagementService.freshKey(id) // Automatically calls registerKeyToParty and registerKeyToExternalId + VariableNaming:ExternalIdMappingTest.kt$ExternalIdMappingTest$val C = services.keyManagementService.freshKey(idTwo) // Automatically calls registerKeyToParty and registerKeyToExternalId + VariableNaming:ExternalIdMappingTest.kt$ExternalIdMappingTest$val D = services.keyManagementService.freshKey() // Automatically calls registerKeyToParty and registerKeyToExternalId + VariableNaming:ExternalIdMappingTest.kt$ExternalIdMappingTest$val E = Crypto.generateKeyPair().public + VariableNaming:ExternalIdMappingTest.kt$ExternalIdMappingTest$val F = Crypto.generateKeyPair().public + VariableNaming:ExternalIdMappingTest.kt$ExternalIdMappingTest$val G = Crypto.generateKeyPair().public VariableNaming:FXFwdTimeOption.kt$FXFwdTimeOption$val TEST_TX_TIME_1: Instant get() = Instant.parse("2017-09-02T12:00:00.00Z") VariableNaming:FXFwdTimeOption.kt$FXFwdTimeOption$val TEST_TX_TIME_AFTER_MATURITY: Instant get() = Instant.parse("2018-06-02T12:00:00.00Z") VariableNaming:FXFwdTimeOption.kt$FXFwdTimeOption$val TEST_TX_TIME_BEFORE_MATURITY: Instant get() = Instant.parse("2018-05-01T12:00:00.00Z") @@ -11224,43 +6056,11 @@ VariableNaming:HibernateConfigurationTest.kt$HibernateConfigurationTest$val _vaultLinearStates = it[1] as VaultSchemaV1.VaultLinearStates VariableNaming:InternalMockNetwork.kt$MessagingServiceSpy$internal var _messagingService: MessagingService? = null set(value) { check(field == null) { "Spy has already been attached to a node" } field = value } VariableNaming:InternalUtilsTest.kt$InternalUtilsTest$val MAX_SIZE = 100 - VariableNaming:KotlinUtilsTest.kt$KotlinUtilsTest$private val KRYO_CHECKPOINT_NOWHITELIST_CONTEXT = CheckpointSerializationContextImpl( javaClass.classLoader, EmptyWhitelist, emptyMap(), true, null) VariableNaming:Literal.kt$ActionBuilder$val This = this - VariableNaming:NetworkBootstrapperTest.kt$NetworkBootstrapperTest$private val ALICE = TestIdentity(ALICE_NAME, 70) - VariableNaming:NetworkBootstrapperTest.kt$NetworkBootstrapperTest$private val BOB = TestIdentity(BOB_NAME, 80) - VariableNaming:NodeInterestRatesTest.kt$NodeInterestRatesTest$private val TEST_DATA = NodeInterestRates.parseFile(""" LIBOR 2016-03-16 1M = 0.678 LIBOR 2016-03-16 2M = 0.685 LIBOR 2016-03-16 1Y = 0.890 LIBOR 2016-03-16 2Y = 0.962 EURIBOR 2016-03-15 1M = 0.123 EURIBOR 2016-03-15 2M = 0.111 """.trimIndent()) VariableNaming:NodePerformanceTests.kt$NodePerformanceTests$val N = 10000 - VariableNaming:NodeRPCTests.kt$NodeRPCTests$private val CORDAPPS = listOf(FINANCE_CONTRACTS_CORDAPP, FINANCE_WORKFLOWS_CORDAPP) - VariableNaming:NodeRPCTests.kt$NodeRPCTests$private val CORDAPP_CONTRACTS_NAME_REGEX = "corda-finance-contracts-$CORDA_VERSION_REGEX".toRegex() - VariableNaming:NodeRPCTests.kt$NodeRPCTests$private val CORDAPP_LICENCE = "Open Source (Apache 2)" - VariableNaming:NodeRPCTests.kt$NodeRPCTests$private val CORDAPP_SHORT_NAME = "Corda Finance Demo" - VariableNaming:NodeRPCTests.kt$NodeRPCTests$private val CORDAPP_TYPES = setOf("Contract CorDapp", "Workflow CorDapp") - VariableNaming:NodeRPCTests.kt$NodeRPCTests$private val CORDAPP_VENDOR = "R3" - VariableNaming:NodeRPCTests.kt$NodeRPCTests$private val CORDAPP_WORKFLOWS_NAME_REGEX = "corda-finance-workflows-$CORDA_VERSION_REGEX".toRegex() - VariableNaming:NodeRPCTests.kt$NodeRPCTests$private val CORDA_VENDOR = "Corda Open Source" - VariableNaming:NodeRPCTests.kt$NodeRPCTests$private val CORDA_VERSION_REGEX = "\\d+(\\.\\d+)?(-\\w+)?".toRegex() - VariableNaming:NodeRPCTests.kt$NodeRPCTests$private val HEXADECIMAL_REGEX = "[0-9a-fA-F]+".toRegex() VariableNaming:NodeVaultService.kt$NodeVaultService.InnerState$val _rawUpdatesPublisher = PublishSubject.create<Vault.Update<ContractState>>()!! VariableNaming:NodeVaultService.kt$NodeVaultService.InnerState$val _updatesInDbTx = _updatesPublisher.wrapWithDatabaseTransaction().asObservable()!! VariableNaming:NodeVaultService.kt$NodeVaultService.InnerState$val _updatesPublisher = PublishSubject.create<Vault.Update<ContractState>>()!! - VariableNaming:Notarise.kt$NotaryDemoClientApi$/** A dummy identity. */ private val BOB_NAME = CordaX500Name("Bob Plc", "Rome", "IT") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$/** * The curve group name. */ private val CURVE_GROUP_NAME_CCP1 = CurveGroupName.of("USD-DSCON-LIBOR3M") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$/** * The first counterparty. */ private val CCP1_ID = StandardId.of("example", "CCP-1") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$/** * The location of the curve calibration groups file for CCP1 and CCP2. */ private val GROUPS_RESOURCE_CCP1 = resourceLocator("example-calibration/curves/groups.csv") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$/** * The location of the curve calibration nodes file for CCP1 and CCP2. */ private val CALIBRATION_RESOURCE_CCP1 = resourceLocator("example-calibration/curves/calibrations.csv") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$/** * The location of the curve calibration settings file for CCP1 and CCP2. */ private val SETTINGS_RESOURCE_CCP1 = resourceLocator("example-calibration/curves/settings.csv") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$/** * The location of the historical fixing file. */ private val FIXINGS_RESOURCE = resourceLocator("example-marketdata/historical-fixings/usd-libor-3m.csv") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$/** * The location of the market quotes file for CCP1 and CCP2. */ private val QUOTES_RESOURCE_CCP1 = resourceLocator("example-calibration/quotes/quotes.csv") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$/** * The second counterparty. */ private val CCP2_ID = StandardId.of("example", "CCP-2") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$/** * The valuation date. */ private val VAL_DATE = LocalDate.of(2015, 7, 21) - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$private val CALIBRATION_RESOURCE_CCP2 = resourceLocator("example-calibration/curves/calibrations-ccp2.csv") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$private val CURVE_GROUP_NAME_CCP2 = CurveGroupName.of("USD-DSCON-LIBOR3M-CCP2") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$private val GROUPS_RESOURCE_CCP2 = resourceLocator("example-calibration/curves/groups-ccp2.csv") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$private val QUOTES_RESOURCE_CCP2 = resourceLocator("example-calibration/quotes/quotes-ccp2.csv") - VariableNaming:OGSwapPricingCcpExample.kt$SwapPricingCcpExample$private val SETTINGS_RESOURCE_CCP2 = resourceLocator("example-calibration/curves/settings-ccp2.csv") - VariableNaming:ObligationTests.kt$ObligationTests$private val Amount<Issued<Currency>>.OBLIGATION: Obligation.State<Currency> get() = Obligation.State(Obligation.Lifecycle.NORMAL, DUMMY_OBLIGATION_ISSUER, token.OBLIGATION_DEF, quantity, NULL_PARTY) - VariableNaming:ObligationTests.kt$ObligationTests$private val Issued<Currency>.OBLIGATION_DEF: Obligation.Terms<Currency> get() = Obligation.Terms(NonEmptySet.of(cashContractBytes.sha256() as SecureHash), NonEmptySet.of(this), TEST_TX_TIME) - VariableNaming:OracleNodeTearOffTests.kt$OracleNodeTearOffTests$private val TEST_DATA = NodeInterestRates.parseFile(""" LIBOR 2016-03-16 1M = 0.678 LIBOR 2016-03-16 2M = 0.685 LIBOR 2016-03-16 1Y = 0.890 LIBOR 2016-03-16 2Y = 0.962 EURIBOR 2016-03-15 1M = 0.123 EURIBOR 2016-03-15 2M = 0.111 """.trimIndent()) VariableNaming:OracleNodeTearOffTests.kt$OracleNodeTearOffTests$val DUMMY_NOTARY = TestIdentity(DUMMY_NOTARY_NAME, 20).party VariableNaming:PersistentStateServiceTests.kt$PersistentStateServiceTests$val MEGA_CORP = TestIdentity(CordaX500Name("MegaCorp", "London", "GB")).party VariableNaming:PortfolioApi.kt$PortfolioApi$var IMs: Map<String, InitialMarginTriple>? = null @@ -11273,24 +6073,13 @@ VariableNaming:RollOutTests.kt$RollOutTests$val contract_and2 = arrange { actions { highStreetBank may { "do it" anytime { highStreetBank.owes(acmeCorp, 10.K, USD) } } } actions { acmeCorp may { "do it" anytime { acmeCorp.owes(momAndPop, 10.K, USD) } } } next() } VariableNaming:RollOutTests.kt$RollOutTests$val contract_transfer1 = arrange { highStreetBank.owes(acmeCorp, 10.K, USD) } VariableNaming:RollOutTests.kt$RollOutTests$val contract_transfer2 = arrange { highStreetBank.owes(acmeCorp, 10.K, USD) } - VariableNaming:SSHServerTest.kt$FlowICanRun$private val HELLO_STEP = ProgressTracker.Step("Hello") VariableNaming:ScheduledFlowIntegrationTests.kt$ScheduledFlowIntegrationTests$val N = 23 VariableNaming:ScheduledFlowTests.kt$ScheduledFlowTests$val N = 99 - VariableNaming:SearchField.kt$SearchField$private val ALL = "All" - VariableNaming:SerializationOutputTests.kt$SerializationOutputTests$private val FOO_PROGRAM_ID = "net.corda.serialization.internal.amqp.SerializationOutputTests.FooContract" - VariableNaming:StandaloneShellArgsParserTest.kt$StandaloneShellArgsParserTest$private val CONFIG_FILE = StandaloneShellArgsParserTest::class.java.getResource("/config.conf").toPath() VariableNaming:SwapExample.kt$SwapExample$val VALUATION_DATE = LocalDate.of(2016, 6, 6)!! VariableNaming:Swaption.kt$Swaption$val TEST_TX_TIME_1: Instant get() = Instant.parse("2017-09-02T12:00:00.00Z") - VariableNaming:TLSAuthenticationTests.kt$TLSAuthenticationTests$// Default supported TLS schemes for Corda nodes. private val CORDA_TLS_CIPHER_SUITES = arrayOf( "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" ) - VariableNaming:TLSAuthenticationTests.kt$TLSAuthenticationTests$// Intermediate CA. private val INTERMEDIATE_X500 = X500Principal("CN=Intermediate_CA_1,O=R3CEV,L=London,C=GB") - VariableNaming:TLSAuthenticationTests.kt$TLSAuthenticationTests$// Password for keys and keystores. private val PASSWORD = "dummypassword" - VariableNaming:TLSAuthenticationTests.kt$TLSAuthenticationTests$// Root CA. private val ROOT_X500 = X500Principal("CN=Root_CA_1,O=R3CEV,L=London,C=GB") - VariableNaming:TLSAuthenticationTests.kt$TLSAuthenticationTests$// TLS client (client2). private val CLIENT_2_X500 = CordaX500Name(commonName = "Client_2", organisation = "R3CEV", locality = "London", country = "GB") - VariableNaming:TLSAuthenticationTests.kt$TLSAuthenticationTests$// TLS server (client1). private val CLIENT_1_X500 = CordaX500Name(commonName = "Client_1", organisation = "R3CEV", locality = "London", country = "GB") VariableNaming:TestCommsFlowInitiatorTest.kt$TestCommsFlowInitiatorTest$val ALICE = TestIdentity(ALICE_NAME, 70) VariableNaming:TestCommsFlowInitiatorTest.kt$TestCommsFlowInitiatorTest$val DUMMY_BANK_A = TestIdentity(DUMMY_BANK_A_NAME, 3) VariableNaming:TestCommsFlowInitiatorTest.kt$TestCommsFlowInitiatorTest$val NOTARY = TestIdentity(DUMMY_NOTARY_NAME, 12) - VariableNaming:TransactionSerializationTests.kt$TransactionSerializationTests$private val TEST_CASH_PROGRAM_ID = "net.corda.coretests.serialization.TransactionSerializationTests\$TestCash" VariableNaming:TransactionSerializationTests.kt$TransactionSerializationTests$val DUMMY_KEY_2 = generateKeyPair() VariableNaming:VaultQueryTests.kt$VaultQueryParties$val ALICE get() = alice.party VariableNaming:VaultQueryTests.kt$VaultQueryParties$val ALICE_IDENTITY get() = alice.identity @@ -11317,17 +6106,16 @@ VariableNaming:VaultQueryTests.kt$VaultQueryParties$val MINI_CORP get() = miniCorp.party VariableNaming:VaultQueryTests.kt$VaultQueryParties$val MINI_CORP_IDENTITY get() = miniCorp.identity VariableNaming:VaultQueryTests.kt$VaultQueryTestsBase$// Beware: do not use `MyContractClass::class.qualifiedName` as this returns a fully qualified name using "dot" notation for enclosed class val MYCONTRACT_ID = "net.corda.node.services.vault.VaultQueryTestsBase\$MyContractClass" - VariableNaming:VaultQueryTests.kt$VaultQueryTestsBase$private val TODAY = LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC) VariableNaming:ZeroCouponBond.kt$ZeroCouponBond$val TEST_TX_TIME_1: Instant get() = Instant.parse("2017-09-02T12:00:00.00Z") WildcardImport:AMQPClient.kt$import io.netty.channel.* WildcardImport:AMQPClientSerializationScheme.kt$import net.corda.serialization.internal.* WildcardImport:AMQPClientSerializationScheme.kt$import net.corda.serialization.internal.amqp.* WildcardImport:AMQPRemoteTypeModel.kt$import net.corda.serialization.internal.model.* - WildcardImport:AMQPRemoteTypeModelTests.kt$import net.corda.serialization.internal.model.* WildcardImport:AMQPSerializationScheme.kt$import net.corda.core.internal.* WildcardImport:AMQPSerializationScheme.kt$import net.corda.core.serialization.* WildcardImport:AMQPServerSerializationScheme.kt$import net.corda.serialization.internal.amqp.* WildcardImport:AMQPTestSerialiationScheme.kt$import net.corda.serialization.internal.amqp.* + WildcardImport:AMQPTestUtils.kt$import net.corda.core.internal.* WildcardImport:AMQPTestUtils.kt$import net.corda.serialization.internal.amqp.* WildcardImport:AMQPTypeIdentifierParser.kt$import org.apache.qpid.proton.amqp.* WildcardImport:AMQPTypeIdentifiers.kt$import org.apache.qpid.proton.amqp.* @@ -11363,6 +6151,7 @@ WildcardImport:AttachmentLoadingTests.kt$import net.corda.core.internal.* WildcardImport:AttachmentTest.kt$import org.junit.Assert.* WildcardImport:AttachmentTests.kt$import com.natpryce.hamkrest.* + WildcardImport:AttachmentTrustCalculatorTest.kt$import net.corda.core.internal.* WildcardImport:AttachmentsClassLoader.kt$import java.net.* WildcardImport:AttachmentsClassLoader.kt$import net.corda.core.internal.* WildcardImport:AttachmentsClassLoader.kt$import net.corda.core.serialization.* @@ -11405,7 +6194,6 @@ WildcardImport:CertificateRevocationListNodeTests.kt$import net.corda.nodeapi.internal.crypto.* WildcardImport:CertificateRevocationListNodeTests.kt$import org.bouncycastle.asn1.x509.* WildcardImport:CertificatesUtils.kt$import net.corda.nodeapi.internal.crypto.* - WildcardImport:CheatingSecurityProvider.kt$import org.junit.Assert.* WildcardImport:CheckpointDumper.kt$import com.fasterxml.jackson.databind.* WildcardImport:CheckpointDumper.kt$import net.corda.core.internal.* WildcardImport:CheckpointDumper.kt$import net.corda.node.services.statemachine.* @@ -11479,6 +6267,7 @@ WildcardImport:CordaRPCClientTest.kt$import net.corda.core.messaging.* WildcardImport:CordaRPCClientTest.kt$import net.corda.testing.core.* WildcardImport:CordaRPCOps.kt$import net.corda.core.node.services.vault.* + WildcardImport:CordaRPCOpsImpl.kt$import net.corda.core.internal.* WildcardImport:CordaRPCOpsImpl.kt$import net.corda.core.messaging.* WildcardImport:CordaRPCOpsImpl.kt$import net.corda.core.node.services.vault.* WildcardImport:CordaRPCOpsImplTest.kt$import net.corda.core.messaging.* @@ -11549,16 +6338,12 @@ WildcardImport:E2ETestKeyManagementService.kt$import net.corda.core.crypto.* WildcardImport:EnumEvolvabilityTests.kt$import net.corda.core.serialization.* WildcardImport:EnumEvolvabilityTests.kt$import net.corda.serialization.internal.amqp.testutils.* - WildcardImport:EnumEvolveTests.kt$import net.corda.core.serialization.* WildcardImport:ErrorFlowTransition.kt$import net.corda.node.services.statemachine.* WildcardImport:EventProcessor.kt$import org.apache.qpid.proton.engine.* WildcardImport:EvolutionSerializerFactory.kt$import net.corda.serialization.internal.model.* WildcardImport:EvolutionSerializerFactoryTests.kt$import kotlin.test.* WildcardImport:EvolutionSerializerFactoryTests.kt$import net.corda.serialization.internal.amqp.testutils.* WildcardImport:EvolvabilityTests.kt$import net.corda.serialization.internal.amqp.testutils.* - WildcardImport:ExceptionMaskingRpcOpsProxy.kt$import net.corda.core.* - WildcardImport:ExceptionMaskingRpcOpsProxy.kt$import net.corda.core.messaging.* - WildcardImport:ExceptionSerialisingRpcOpsProxy.kt$import net.corda.core.messaging.* WildcardImport:Explorer.kt$import tornadofx.* WildcardImport:FiberDeserializationCheckingInterceptor.kt$import net.corda.node.services.statemachine.* WildcardImport:FinalityFlowMigration.kt$import net.corda.core.flows.* @@ -11637,6 +6422,7 @@ WildcardImport:InteractiveShellIntegrationTest.kt$import net.corda.core.flows.* WildcardImport:InterestRatesSwapDemoAPI.kt$import org.springframework.web.bind.annotation.* WildcardImport:InterestSwapRestAPI.kt$import org.springframework.web.bind.annotation.* + WildcardImport:InternalAccessTestHelpers.kt$import net.corda.serialization.internal.amqp.* WildcardImport:InternalMockNetwork.kt$import net.corda.core.internal.* WildcardImport:InternalMockNetwork.kt$import net.corda.node.services.config.* WildcardImport:InternalMockNetwork.kt$import net.corda.testing.node.* @@ -11706,11 +6492,8 @@ WildcardImport:MessageChainState.kt$import net.corda.core.contracts.* WildcardImport:MessageState.kt$import net.corda.core.contracts.* WildcardImport:MigrationServicesForResolution.kt$import net.corda.core.contracts.* - WildcardImport:MigrationServicesForResolution.kt$import net.corda.core.node.services.* WildcardImport:MockAttachmentStorage.kt$import net.corda.core.node.services.vault.* WildcardImport:MockKeyManagementService.kt$import net.corda.core.crypto.* - WildcardImport:MockNetworkTest.kt$import net.corda.testing.core.* - WildcardImport:MockNetworkTest.kt$import org.assertj.core.api.Assertions.* WildcardImport:MockNetworkTest.kt$import org.junit.Assert.* WildcardImport:MockNodeMessagingService.kt$import net.corda.node.services.messaging.* WildcardImport:MockServices.kt$import net.corda.core.node.* @@ -11758,17 +6541,13 @@ WildcardImport:NodeAttachmentServiceTest.kt$import kotlin.test.* WildcardImport:NodeAttachmentServiceTest.kt$import net.corda.core.internal.* WildcardImport:NodeAttachmentServiceTest.kt$import org.assertj.core.api.Assertions.* + WildcardImport:NodeAttachmentTrustCalculator.kt$import net.corda.core.internal.* WildcardImport:NodeBasedTest.kt$import net.corda.node.services.config.* WildcardImport:NodeConfig.kt$import com.typesafe.config.* WildcardImport:NodeController.kt$import net.corda.core.internal.* WildcardImport:NodeController.kt$import tornadofx.* WildcardImport:NodeControllerTest.kt$import kotlin.test.* WildcardImport:NodeData.kt$import tornadofx.* - WildcardImport:NodeInfo.kt$import net.corda.core.crypto.* - WildcardImport:NodeInfo.kt$import net.corda.core.internal.* - WildcardImport:NodeInfo.kt$import net.corda.serialization.internal.* - WildcardImport:NodeInfo.kt$import net.corda.serialization.internal.amqp.* - WildcardImport:NodeInfo.kt$import picocli.CommandLine.* WildcardImport:NodeInfoFilesCopier.kt$import net.corda.core.internal.* WildcardImport:NodeInfoSchema.kt$import javax.persistence.* WildcardImport:NodeInfoWatcher.kt$import net.corda.core.internal.* @@ -11838,6 +6617,7 @@ WildcardImport:ObserverNodeTransactionTests.kt$import net.corda.core.flows.* WildcardImport:ObserverNodeTransactionTests.kt$import net.corda.testing.node.internal.* WildcardImport:OnLedgerAsset.kt$import net.corda.core.contracts.* + WildcardImport:OracleNodeTearOffTests.kt$import net.corda.testing.core.* WildcardImport:P2PFlowsDrainingModeTest.kt$import net.corda.core.flows.* WildcardImport:P2PMessagingClient.kt$import net.corda.core.utilities.* WildcardImport:P2PMessagingClient.kt$import net.corda.nodeapi.internal.ArtemisMessagingComponent.* @@ -11852,7 +6632,6 @@ WildcardImport:PersistentIdentityMigrationNewTableTest.kt$import net.corda.testing.core.* WildcardImport:PersistentIdentityService.kt$import java.security.cert.* WildcardImport:PersistentIdentityService.kt$import net.corda.core.identity.* - WildcardImport:PersistentIdentityService.kt$import net.corda.core.internal.* WildcardImport:PersistentIdentityServiceTests.kt$import net.corda.testing.core.* WildcardImport:PersistentNetworkMapCacheTest.kt$import net.corda.testing.core.* WildcardImport:PersistentStateServiceTests.kt$import net.corda.core.contracts.* @@ -11891,7 +6670,7 @@ WildcardImport:ReceiveFinalityFlowTest.kt$import net.corda.testing.node.internal.* WildcardImport:ReceiveTransactionFlow.kt$import net.corda.core.contracts.* WildcardImport:ReconnectingCordaRPCOps.kt$import net.corda.client.rpc.* - WildcardImport:ReconnectingCordaRPCOps.kt$import net.corda.core.utilities.* + WildcardImport:ReconnectingCordaRPCOps.kt$import net.corda.client.rpc.internal.ReconnectingCordaRPCOps.ReconnectingRPCConnection.CurrentState.* WildcardImport:ReferenceInputStateTests.kt$import net.corda.core.contracts.* WildcardImport:ReferencedStatesFlowTests.kt$import net.corda.core.contracts.* WildcardImport:ReferencedStatesFlowTests.kt$import net.corda.core.flows.* @@ -11909,7 +6688,6 @@ WildcardImport:RpcExceptionHandlingTest.kt$import net.corda.core.flows.* WildcardImport:RpcExceptionHandlingTest.kt$import net.corda.testing.core.* WildcardImport:RpcExceptionHandlingTest.kt$import net.corda.testing.driver.* - WildcardImport:RpcReconnectTests.kt$import net.corda.core.utilities.* WildcardImport:RpcServerObservableSerializer.kt$import net.corda.serialization.internal.amqp.* WildcardImport:SSLHelper.kt$import java.security.cert.* WildcardImport:SSLHelper.kt$import javax.net.ssl.* @@ -11952,7 +6730,6 @@ WildcardImport:ServiceHub.kt$import net.corda.core.node.services.* WildcardImport:ServiceHubInternal.kt$import net.corda.core.internal.* WildcardImport:ServicesForResolutionImpl.kt$import net.corda.core.contracts.* - WildcardImport:SetsSerializationTest.kt$import org.junit.Assert.* WildcardImport:SettingsModel.kt$import net.corda.core.internal.* WildcardImport:SettingsModel.kt$import tornadofx.* WildcardImport:SharedContexts.kt$import net.corda.core.serialization.* @@ -11970,7 +6747,6 @@ WildcardImport:StatePointerSearchTests.kt$import net.corda.core.contracts.* WildcardImport:StubOutForDJVM.kt$import kotlin.annotation.AnnotationTarget.* WildcardImport:SubFlow.kt$import net.corda.core.flows.* - WildcardImport:SwapIdentitiesFlow.kt$import net.corda.core.flows.* WildcardImport:SwapIdentitiesFlowTests.kt$import net.corda.testing.core.* WildcardImport:TLSAuthenticationTests.kt$import javax.net.ssl.* WildcardImport:TLSAuthenticationTests.kt$import kotlin.test.* @@ -11981,6 +6757,7 @@ WildcardImport:TestCommsFlow.kt$import net.corda.core.flows.* WildcardImport:TestCordappImpl.kt$import net.corda.core.internal.* WildcardImport:TestDSL.kt$import net.corda.core.contracts.* + WildcardImport:TestDSL.kt$import net.corda.core.internal.* WildcardImport:TestResponseFlowInIsolation.kt$import net.corda.core.flows.* WildcardImport:TestUtils.kt$import net.corda.core.crypto.* WildcardImport:ThrowableSerializer.kt$import net.corda.serialization.internal.amqp.* diff --git a/detekt-config.yml b/detekt-config.yml index 42a4494468..de3824c6da 100644 --- a/detekt-config.yml +++ b/detekt-config.yml @@ -84,7 +84,7 @@ complexity: ComplexMethod: active: true threshold: 10 - ignoreSingleWhenExpression: false + ignoreSingleWhenExpression: true LabeledExpression: active: false LargeClass: @@ -92,7 +92,7 @@ complexity: threshold: 150 LongMethod: active: true - threshold: 20 + threshold: 120 LongParameterList: active: true threshold: 6 @@ -135,7 +135,7 @@ empty-blocks: EmptyForBlock: active: true EmptyFunctionBlock: - active: true + active: false EmptyIfBlock: active: true EmptyInitBlock: @@ -240,7 +240,7 @@ naming: VariableNaming: active: true variablePattern: '[a-z][A-Za-z0-9]*' - privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*' + privateVariablePattern: '(_)?[A-Za-z][_A-Za-z0-9]*' excludeClassPattern: '$^' performance: @@ -321,7 +321,7 @@ style: ignoreEnums: false MaxLineLength: active: true - maxLineLength: 120 + maxLineLength: 140 excludePackageStatements: false excludeImportStatements: false MayBeConst: @@ -331,7 +331,7 @@ style: NestedClassesVisibility: active: false NewLineAtEndOfFile: - active: true + active: false NoTabs: active: false OptionalAbstractKeyword: diff --git a/docker/build.gradle b/docker/build.gradle index 92000ffc3f..37ff25c1f1 100644 --- a/docker/build.gradle +++ b/docker/build.gradle @@ -59,6 +59,7 @@ task buildDockerFolder(dependsOn: [":node:capsule:buildCordaJAR", shadowJar]) { from "src/bash/generate-config.sh" from "src/docker/DockerfileAL" from "src/docker/Dockerfile" + from "src/docker/Dockerfile11" rename(cordaJar.name, "corda.jar") rename(shadowJar.archivePath.name, "config-exporter.jar") } @@ -67,8 +68,8 @@ task buildDockerFolder(dependsOn: [":node:capsule:buildCordaJAR", shadowJar]) { final String runTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) final String suffix = project.version.toString().toLowerCase().contains("snapshot") ? runTime : "RELEASE" -final zuluBuildTags = ["corda/corda-zulu-${project.version.toString().toLowerCase()}:${suffix}", "corda/corda-zulu-${project.version.toString().toLowerCase()}:latest"] -final correttoBuildTags = ["corda/corda-corretto-${project.version.toString().toLowerCase()}:${suffix}", "corda/corda-corretto-${project.version.toString().toLowerCase()}:latest"] +final zuluBuildTags = ["corda/corda-zulu-java${JavaVersion.current()}-${project.version.toString().toLowerCase()}:${suffix}", "corda/corda-zulu-java${JavaVersion.current()}-${project.version.toString().toLowerCase()}:latest"] +final correttoBuildTags = ["corda/corda-corretto-java${JavaVersion.current()}-${project.version.toString().toLowerCase()}:${suffix}", "corda/corda-corretto-java${JavaVersion.current()}-${project.version.toString().toLowerCase()}:latest"] task buildOfficialZuluDockerImage(type: DockerBuildImage, dependsOn: [buildDockerFolder]) { inputDir = new File(project.buildDir, "docker-temp") @@ -76,6 +77,12 @@ task buildOfficialZuluDockerImage(type: DockerBuildImage, dependsOn: [buildDocke dockerFile = new File(new File(project.buildDir, "docker-temp"), "Dockerfile") } +task buildOfficialZuluJDK11DockerImage(type: DockerBuildImage, dependsOn: [buildDockerFolder]) { + inputDir = new File(project.buildDir, "docker-temp") + tags = zuluBuildTags + dockerFile = new File(new File(project.buildDir, "docker-temp"), "Dockerfile11") +} + task buildOfficialCorrettoDockerImage(type: DockerBuildImage, dependsOn: [buildDockerFolder]) { inputDir = new File(project.buildDir, "docker-temp") tags = correttoBuildTags @@ -90,6 +97,14 @@ task pushZuluLatestTag('type': DockerPushImage, dependsOn: [buildOfficialZuluDoc imageName = zuluBuildTags[1] } +task pushZulu11TimeStampedTag('type': DockerPushImage, dependsOn: [buildOfficialZuluJDK11DockerImage]){ + imageName = zuluBuildTags[0] +} + +task pushZulu11LatestTag('type': DockerPushImage, dependsOn: [buildOfficialZuluJDK11DockerImage]){ + imageName = zuluBuildTags[1] +} + task pushCorrettoTimeStampedTag('type': DockerPushImage, dependsOn: [buildOfficialCorrettoDockerImage]){ imageName = correttoBuildTags[0] } diff --git a/docker/src/docker/Dockerfile.zulu-sa-jdk-11-patch b/docker/src/docker/Dockerfile.zulu-sa-jdk-11-patch new file mode 100644 index 0000000000..1b52b6de42 --- /dev/null +++ b/docker/src/docker/Dockerfile.zulu-sa-jdk-11-patch @@ -0,0 +1,28 @@ +# Build and publish an Azul Zulu patched JDK 11 to the R3 Azure docker registry as follows: + +# colljos@ci-agent-101l:~$ cd /home/colljos/azul/case17645 +# $docker build . -f Dockerfile.zulu-sa-jdk-11-patch --no-cache -t azul/zulu-sa-jdk:11.0.3_7_LTS +# $docker tag azul/zulu-sa-jdk:11.0.3_7_LTS corda.azurecr.io/jdk/azul/zulu-sa-jdk:11.0.3_7_LTS +# $docker login -u corda corda.azurecr.io +# docker push corda.azurecr.io/jdk/azul/zulu-sa-jdk:11.0.3_7_LTS + +# Remember to set the DOCKER env variables accordingly to access the R3 Azure docker registry: +# export DOCKER_URL=https://corda.azurecr.io +# export DOCKER_USERNAME= +# export DOCKER_PASSWORD= + +RUN addgroup corda && adduser --ingroup corda --disabled-password -gecos "" --shell /bin/bash corda + +COPY zulu11.31.16-sa-jdk11.0.3-linux_x64.tar /opt + +RUN tar xvf /opt/zulu11.31.16-sa-jdk11.0.3-linux_x64.tar -C /opt && ln -s /opt/zulu11.31.16-sa-jdk11.0.3-linux_x64 /opt/jdk + +RUN rm /opt/zulu11.31.16-sa-jdk11.0.3-linux_x64.tar && \ + chown -R corda /opt/zulu11.31.16-sa-jdk11.0.3-linux_x64 && \ + chgrp -R corda /opt/zulu11.31.16-sa-jdk11.0.3-linux_x64 + +# Set environment +ENV JAVA_HOME /opt/jdk +ENV PATH ${PATH}:${JAVA_HOME}/bin + +CMD ["java", "-version"] \ No newline at end of file diff --git a/docker/src/docker/Dockerfile11 b/docker/src/docker/Dockerfile11 new file mode 100644 index 0000000000..dfb5eaa0e3 --- /dev/null +++ b/docker/src/docker/Dockerfile11 @@ -0,0 +1,78 @@ +# Using Azul Zulu patched JDK 11 (local built and published docker image) + +# colljos@ci-agent-101l:~$ jdk11azul +# openjdk version "11.0.3" 2019-04-16 LTS +# OpenJDK Runtime Environment Zulu11.31+16-SA (build 11.0.3+7-LTS) +# OpenJDK 64-Bit Server VM Zulu11.31+16-SA (build 11.0.3+7-LTS, mixed mode) + +# Remember to set the DOCKER env variables accordingly to access the R3 Azure docker registry: +# export DOCKER_URL=https://corda.azurecr.io +# export DOCKER_USERNAME= +# export DOCKER_PASSWORD= + +FROM corda.azurecr.io/jdk/azul/zulu-sa-jdk:11.0.3_7_LTS + +## Add packages, clean cache, create dirs, create corda user and change ownership +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get -y install bash curl unzip && \ + rm -rf /var/lib/apt/lists/* && \ + mkdir -p /opt/corda/cordapps && \ + mkdir -p /opt/corda/persistence && \ + mkdir -p /opt/corda/certificates && \ + mkdir -p /opt/corda/drivers && \ + mkdir -p /opt/corda/logs && \ + mkdir -p /opt/corda/bin && \ + mkdir -p /opt/corda/additional-node-infos && \ + mkdir -p /etc/corda && \ + chown -R corda /opt/corda && \ + chgrp -R corda /opt/corda && \ + chown -R corda /etc/corda && \ + chgrp -R corda /etc/corda && \ + chown -R corda /opt/corda && \ + chgrp -R corda /opt/corda && \ + chown -R corda /etc/corda && \ + chgrp -R corda /etc/corda + +ENV CORDAPPS_FOLDER="/opt/corda/cordapps" \ + PERSISTENCE_FOLDER="/opt/corda/persistence" \ + CERTIFICATES_FOLDER="/opt/corda/certificates" \ + DRIVERS_FOLDER="/opt/corda/drivers" \ + CONFIG_FOLDER="/etc/corda" \ + MY_P2P_PORT=10200 \ + MY_RPC_PORT=10201 \ + MY_RPC_ADMIN_PORT=10202 \ + PATH=$PATH:/opt/corda/bin \ + JVM_ARGS="-XX:+UseG1GC -XX:+UnlockExperimentalVMOptions " \ + CORDA_ARGS="" + +##CORDAPPS FOLDER +VOLUME ["/opt/corda/cordapps"] +##PERSISTENCE FOLDER +VOLUME ["/opt/corda/persistence"] +##CERTS FOLDER +VOLUME ["/opt/corda/certificates"] +##OPTIONAL JDBC DRIVERS FOLDER +VOLUME ["/opt/corda/drivers"] +##LOG FOLDER +VOLUME ["/opt/corda/logs"] +##ADDITIONAL NODE INFOS FOLDER +VOLUME ["/opt/corda/additional-node-infos"] +##CONFIG LOCATION +VOLUME ["/etc/corda"] + +##CORDA JAR +COPY --chown=corda:corda corda.jar /opt/corda/bin/corda.jar +##CONFIG MANIPULATOR JAR +COPY --chown=corda:corda config-exporter.jar /opt/corda/config-exporter.jar +##CONFIG GENERATOR SHELL SCRIPT +COPY --chown=corda:corda generate-config.sh /opt/corda/bin/config-generator +##CORDA RUN SCRIPT +COPY --chown=corda:corda run-corda.sh /opt/corda/bin/run-corda +##BASE CONFIG FOR GENERATOR +COPY --chown=corda:corda starting-node.conf /opt/corda/starting-node.conf + +USER "corda" +EXPOSE ${MY_P2P_PORT} ${MY_RPC_PORT} ${MY_RPC_ADMIN_PORT} +WORKDIR /opt/corda +CMD ["run-corda"] \ No newline at end of file diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 2a37ff7dc0..39f105febc 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -6,6 +6,7 @@ release, see :doc:`app-upgrade-notes`. Unreleased ---------- +* Support for Java 11 (compatibility mode). Please read https://github.com/corda/corda/pull/5356. * Updating FinalityFlow with functionality to indicate the appropriate StatesToRecord. This allows the initiating party to record states from transactions which they are proposing, but are not necessarily participants of. @@ -47,8 +48,9 @@ Unreleased * Added ``nodeDiagnosticInfo`` to the RPC API. The new RPC is also available as the ``run nodeDiagnosticInfo`` command executable from the Corda shell. It retrieves version information about the Corda platform and the CorDapps installed on the node. -* ``CordaRPCClient.start`` has a new ``gracefulReconnect`` parameter. When ``true`` (the default is ``false``) it will cause the RPC client - to try to automatically reconnect to the node on disconnect. Further any ``Observable`` s previously created will continue to vend new +* ``CordaRPCClient.start`` has a new ``gracefulReconnect`` parameter. The class ``GracefulReconnect`` takes two lambdas - one for callbacks + on disconnect, and one for callbacks on reconnection. When provided (ie. the ``gracefulReconnect`` parameter is not null) the RPC client + will to try to automatically reconnect to the node on disconnect. Further any ``Observable`` s previously created will continue to vend new events on reconnect. .. note:: This is only best-effort and there are no guarantees of reliability. diff --git a/docs/source/clientrpc.rst b/docs/source/clientrpc.rst index 5ec9f9bbc2..7e5cf7b19b 100644 --- a/docs/source/clientrpc.rst +++ b/docs/source/clientrpc.rst @@ -373,10 +373,29 @@ More specifically, the behaviour in the second case is a bit more subtle: You can enable this graceful form of reconnection by using the ``gracefulReconnect`` parameter in the following way: -.. sourcecode:: kotlin +.. container:: codeset - val cordaClient = CordaRPCClient(nodeRpcAddress) - val cordaRpcOps = cordaClient.start(rpcUserName, rpcUserPassword, gracefulReconnect = true).proxy + .. sourcecode:: kotlin + + val gracefulReconnect = GracefulReconnect(onDisconnect={/*insert disconnect handling*/}, onReconnect{/*insert reconnect handling*/}) + val cordaClient = CordaRPCClient(nodeRpcAddress) + val cordaRpcOps = cordaClient.start(rpcUserName, rpcUserPassword, gracefulReconnect = gracefulReconnect).proxy + + .. sourcecode:: java + + private void onDisconnect() { + // Insert implementation + } + + private void onReconnect() { + // Insert implementation + } + + void method() { + GracefulReconnect gracefulReconnect = new GracefulReconnect(this::onDisconnect, this::onReconnect); + CordaRPCClient cordaClient = new CordaRPCClient(nodeRpcAddress); + CordaRPCConnection cordaRpcOps = cordaClient.start(rpcUserName, rpcUserPassword, gracefulReconnect); + } Retrying flow invocations ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/example-code/build.gradle b/docs/source/example-code/build.gradle index 248f2eeba7..3de906ce19 100644 --- a/docs/source/example-code/build.gradle +++ b/docs/source/example-code/build.gradle @@ -26,10 +26,21 @@ sourceSets { compileTestJava.dependsOn tasks.getByPath(':node:capsule:buildCordaJAR') dependencies { + // Cordformation needs a SLF4J implementation when executing the Network + // Bootstrapper, but Log4J doesn't shutdown completely from within Gradle. + // Use a much simpler SLF4J implementation here instead. + cordaRuntime "org.slf4j:slf4j-simple:$slf4j_version" + compile project(':core') compile project(':client:jfx') - compile project(':node-driver') - compile project(':webserver') + compile (project(':node-driver')) { + // We already have a SLF4J implementation on our runtime classpath, + // and we don't need another one. + exclude group: 'org.apache.logging.log4j' + } + compile (project(':webserver')) { + exclude group: "org.apache.logging.log4j" + } testCompile project(':test-utils') compile "org.graphstream:gs-core:1.3" diff --git a/docs/source/example-code/src/test/kotlin/net/corda/docs/kotlin/txbuild/WorkflowTransactionBuildTutorialTest.kt b/docs/source/example-code/src/test/kotlin/net/corda/docs/kotlin/txbuild/WorkflowTransactionBuildTutorialTest.kt index 2e0d31eb26..b75214eae5 100644 --- a/docs/source/example-code/src/test/kotlin/net/corda/docs/kotlin/txbuild/WorkflowTransactionBuildTutorialTest.kt +++ b/docs/source/example-code/src/test/kotlin/net/corda/docs/kotlin/txbuild/WorkflowTransactionBuildTutorialTest.kt @@ -4,7 +4,7 @@ import net.corda.core.contracts.LinearState import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.UniqueIdentifier import net.corda.core.identity.Party -import net.corda.core.internal.packageName +import net.corda.core.internal.packageName_ import net.corda.core.node.ServiceHub import net.corda.core.node.services.queryBy import net.corda.core.node.services.vault.QueryCriteria @@ -34,7 +34,7 @@ class WorkflowTransactionBuildTutorialTest { @Before fun setup() { - mockNet = MockNetwork(threadPerNode = true, cordappPackages = listOf(javaClass.packageName)) + mockNet = MockNetwork(threadPerNode = true, cordappPackages = listOf(javaClass.packageName_)) aliceNode = mockNet.createPartyNode(ALICE_NAME) bobNode = mockNet.createPartyNode(BOB_NAME) alice = aliceNode.services.myInfo.identityFromX500Name(ALICE_NAME) diff --git a/docs/source/example-code/src/test/kotlin/net/corda/docs/kotlin/vault/CustomVaultQueryTest.kt b/docs/source/example-code/src/test/kotlin/net/corda/docs/kotlin/vault/CustomVaultQueryTest.kt index b500fa1b52..e4bffe678b 100644 --- a/docs/source/example-code/src/test/kotlin/net/corda/docs/kotlin/vault/CustomVaultQueryTest.kt +++ b/docs/source/example-code/src/test/kotlin/net/corda/docs/kotlin/vault/CustomVaultQueryTest.kt @@ -4,6 +4,7 @@ import net.corda.core.contracts.Amount import net.corda.core.contracts.ContractState import net.corda.core.identity.Party import net.corda.core.internal.packageName +import net.corda.core.internal.packageName_ import net.corda.core.node.services.queryBy import net.corda.core.node.services.vault.* import net.corda.core.utilities.OpaqueBytes @@ -31,7 +32,7 @@ class CustomVaultQueryTest { @Before fun setup() { - mockNet = MockNetwork(threadPerNode = true, cordappPackages = listOf("net.corda.finance", IOUFlow::class.packageName, javaClass.packageName, "com.template")) + mockNet = MockNetwork(threadPerNode = true, cordappPackages = listOf("net.corda.finance", IOUFlow::class.packageName, javaClass.packageName_, "com.template")) nodeA = mockNet.createPartyNode() nodeB = mockNet.createPartyNode() notary = mockNet.defaultNotaryIdentity diff --git a/docs/source/index.rst b/docs/source/index.rst index e6d66863a9..0719c26b86 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -36,7 +36,7 @@ Welcome to Corda ! .. _`繁體中文 (Traditional Chinese)`: _static/corda-introductory-whitepaper-zht.pdf .. _`日本語 (Japanese)`: _static/corda-introductory-whitepaper-jp.pdf .. _`download the PDF`: _static/corda-developer-site.pdf - + .. only:: latex Welcome to Corda, a platform for building decentralized applications. This guidebook covers everything you need to know to create @@ -147,3 +147,4 @@ Welcome to Corda ! deterministic-modules.rst design/design-docs-index.rst changelog + legal-info diff --git a/docs/source/legal-info.rst b/docs/source/legal-info.rst new file mode 100644 index 0000000000..58e7ffeff2 --- /dev/null +++ b/docs/source/legal-info.rst @@ -0,0 +1,3813 @@ +Legal notice +============ + +CORDA Open Source 4.1 THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This file is based on or incorporates material from the projects listed below (Third Party IP). R3 LLC licenses these components under the Corda Enterprise software license terms. The original copyright notices and the licenses under which R3 LLC received such components are set forth below for informational purposes. R3 LLC reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise. + +1. animal-snifferannotations +2. annotations +3. antlr +4. artemis-amqp-protocol +5. artemis-commons +6. artemis-core-client +7. artemis-jdbc-store +8. artemis-jms-client +9. artemis-journal +10. artemis-native +11. artemis-selector +12. artemis-server +13. asm +14. bcpkix-jdk15on +15. bcprov-jdk15on +16. byte-buddy +17. caffeine +18. catalyst-buffer +19. catalyst-common +20. catalyst-concurrent +21. catalyst-netty +22. catalyst-serializer +23. catalyst-transport +24. checker-qual +25. classgraph +26. classmate +27. commons-beanutils +28. commons-codec +29. commons-collections +30. commons-fileupload +31. commons-io +32. commons-jexl3 +33. commons-lang +34. commonscollections4 +35. config +36. copycat-client +37. copycat-protocol +38. copycat-server +39. corda +40. corda-common-configurationparsing +41. corda-common-validation +42. corda-confidential-identities +43. corda-core +44. corda-jackson +45. corda-node +46. corda-node-api +47. corda-rpc +48. corda-serialization +49. corda-shell +50. crash.cli +51. crash.shell +52. disruptor +53. dom4j +54. ea-agent-loader +55. eddsa +56. error_prone_annotations +57. forms +58. forms_rt +59. geronimojms_ 2.0_spec +60. geronimojson_ 1.0_spec +61. groovy-all +62. guava +63. h2 +64. h2 +65. h2 +66. HdrHistogram +67. hibernate-commonsannotations +68. hibernate-core +69. hibernate-java8 +70. HikariCP +71. j2objc-annotations +72. jackson-annotations +73. jackson-core +74. jackson-databind +75. jacksondataformat-yaml +76. jacksondatatype- jsr310 +77. jacksonmodule-kotlin +78. jandex +79. jansi +80. javassist +81. javax.activation-api +82. javax.persistence-api +83. jboss-logging +84. jbosstransaction- api_1.2_spec +85. jcabi-log +86. jcabi-manifests +87. jcl-over-slf4j +88. jdom +89. jgroups +90. jimfs +91. johnzon-core +92. jolokia-core +93. jolokia-jvm +94. jpam +95. jquery +96. json-simple +97. jsr305 +98. jul-to-slf4j +99. kotlin-reflect +100. kotlin-stdlib +101. kotlin-stdlib-common +102. kotlin-stdlib-jdk7 +103. kotlin-stdlib-jdk8 +104. kotlin-stdlib-jre7 +105. kotlin-stdlib-jre8 +106. kryo +107. kryo-serializers +108. LatencyUtils +109. liquibase-core +110. liquibase-slf4j +111. log4j-api +112. log4j-core +113. log4j-slf4j-impl +114. log4j-web +115. metrics-core +116. metrics-new-relic +117. mina-core +118. minlog +119. netty-buffer +120. netty-codec +121. netty-codec-http +122. netty-common +123. netty-handler +124. netty-resolver +125. netty-transport +126. netty-transport-native-epoll +127. netty-transport-native-kqueue +128. netty-transport-native-unix-common +129. newrelic-api +130. objenesis +131. okhttp +132. okio +133. picocli +134. postgresql +135. proton-j +136. quasar-core +137. reflectasm +138. rxjava +139. shiro-cache +140. shiro-config-core +141. shiro-config-ogdl +142. shiro-core +143. shiro-crypto-cipher +144. shiro-crypto-core +145. shiro-crypto-hash +146. shiro-event +147. shiro-lang +148. slf4j-api +149. snakeyaml +150. snappy +151. sshd-core +152. sshd-pam + +================================================ +================================================ + +=========== START OF NOTICES AND INFORMATION for the following component========= + +jdom 1.0 +Copyright (C) 2000-2012 Jason Hunter & Brett McLaughlin. +http://www.jdom.org/ +https://github.com/hunterhacker/jdom/blob/master/LICENSE.txt + +------------START OF LICENSE TEXT--------------- + + Copyright (C) 2000-2012 Jason Hunter & Brett McLaughlin. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the disclaimer that follows + these conditions in the documentation and/or other materials + provided with the distribution. + + 3. The name "JDOM" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact . + + 4. Products derived from this software may not be called "JDOM", nor + may "JDOM" appear in their name, without prior written permission + from the JDOM Project Management . + + In addition, we request (but do not require) that you include in the + end-user documentation provided with the redistribution and/or in the + software itself an acknowledgement equivalent to the following: + "This product includes software developed by the + JDOM Project (http://www.jdom.org/)." + Alternatively, the acknowledgment may be graphical using the logos + available at http://www.jdom.org/images/logos. + + THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + This software consists of voluntary contributions made by many + individuals on behalf of the JDOM Project and was originally + created by Jason Hunter and + Brett McLaughlin . For more information + on the JDOM Project, please see . + +-------------END OF LICENSE TEXT----------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +classmate 1.3.4 +http://github.com/FasterXML/java-classmate +http://www.apache.org/licenses/LICENSE-2.0.txt + +jacksondataformat-yaml 2.9.5 +https://github.com/FasterXML/jackson-dataformat-yaml +http://www.apache.org/licenses/LICENSE-2.0.txt + +jacksondatatype-jsr310 2.9.5 +https://github.com/FasterXML/jackson-datatype-jsr310 +http://www.apache.org/licenses/LICENSE-2.0.txt + +jacksonmodule-kotlin 2.9.5 +https://github.com/FasterXML/jackson-module-kotlin +http://www.apache.org/licenses/LICENSE-2.0.txt + +caffeine 2.6.2 +https://github.com/ben-manes/caffeine +https://github.com/ben-manes/caffeine/blob/master/LICENSE + +error_prone_annotations 2.1.3 +https://github.com/google/error-prone +https://github.com/google/error-prone/blob/master/COPYING + +guava 25.1-jre +https://github.com/google/guava +https://github.com/google/guava/blob/master/COPYING + +j2objc-annotations 1.1 +https://github.com/google/j2objc/ +https://github.com/google/j2objc/blob/master/LICENSE + +jimfs 1.1 +https://github.com/google/jimfs +https://github.com/google/jimfs/blob/master/LICENSE + +json-simple 1.1.1 +http://code.google.com/p/json-simple/ +http://www.apache.org/licenses/LICENSE-2.0 + +forms_rt 7.0.3 +Copyright © 2008 Jetbrains +http://www.jetbrains.com/ +https://github.com/JetBrains/intellij-community/blob/master/LICENSE.txt + +disruptor 3.4.2 +Copyright © 2011 - 2018 LMAX Ltd. +http://lmax-exchange.github.com/disruptor +http://www.apache.org/licenses/LICENSE-2.0.txt + +okhttp 3.11.0 +https://github.com/square/okhttp +https://github.com/square/okhttp/blob/master/LICENSE.txt + +okio 1.14.0 +https://github.com/square/okio +https://github.com/square/okio/blob/master/LICENSE.txt + +config 1.3.3 +https://github.com/lightbend/config +https://github.com/lightbend/config/blob/master/LICENSE-2.0.txt + +HikariCP 2.5.1 +https://github.com/brettwooldridge/HikariCP +https://github.com/brettwooldridge/HikariCP/blob/dev/LICENSE + +commons-beanutils 1.9.3 +https://commons.apache.org/proper/commons-beanutils/ +http://www.apache.org/licenses/LICENSE-2.0.txt + +commons-codec 1.11 +http://commons.apache.org/proper/commons-codec/ +http://www.apache.org/licenses/LICENSE-2.0.txt + +commons-collections 3.2.2 +http://commons.apache.org/collections/ +http://www.apache.org/licenses/LICENSE-2.0.txt + +commons-fileupload 1.3.3 +http://commons.apache.org/proper/commons-fileupload/ +http://www.apache.org/licenses/LICENSE-2.0.txt + +commons-io 2.6 +http://commons.apache.org/proper/commons-io/ +http://www.apache.org/licenses/LICENSE-2.0.txt + +commons-lang 2.6 +http://commons.apache.org/lang/ +http://www.apache.org/licenses/LICENSE-2.0.txt + +kryo-serializers 0.42 +https://github.com/magro/kryo-serializers +https://github.com/magro/kryo-serializers/blob/master/LICENCE.txt + +picocli 3.8.0 +http://picocli.info/ +https://github.com/remkop/picocli/blob/master/LICENSE + +catalyst-buffer 1.1.2 +https://github.com/atomix/catalyst +https://github.com/atomix/catalyst/blob/master/LICENSE + +catalyst-common 1.1.2 +https://github.com/atomix/catalyst +https://github.com/atomix/catalyst/blob/master/LICENSE + +catalyst-concurrent 1.1.2 +https://github.com/atomix/catalyst +https://github.com/atomix/catalyst/blob/master/LICENSE + +catalyst-netty 1.1.2 +https://github.com/atomix/catalyst +https://github.com/atomix/catalyst/blob/master/LICENSE + +catalyst-serializer 1.1.2 +https://github.com/atomix/catalyst +https://github.com/atomix/catalyst/blob/master/LICENSE + +catalyst-transport 1.1.2 +https://github.com/atomix/catalyst +https://github.com/atomix/catalyst/blob/master/LICENSE + +copycat-client 1.2.3 +https://github.com/atomix/copycat +https://github.com/atomix/copycat/blob/master/LICENSE + +copycat-protocol 1.2.3 +https://github.com/atomix/copycat +https://github.com/atomix/copycat/blob/master/LICENSE + +copycat-server 1.2.3 +https://github.com/atomix/copycat +https://github.com/atomix/copycat/blob/master/LICENSE + +metrics-core 3.2.5 +https://metrics.dropwizard.io/4.0.0/ +https://github.com/dropwizard/metrics/blob/4.1-development/LICENSE + +netty-buffer 4.1.29.Final +https://netty.io/ +https://github.com/netty/netty/blob/4.1/LICENSE.txt + +netty-codec 4.1.29.Final +https://netty.io/ +https://github.com/netty/netty/blob/4.1/LICENSE.txt + +netty-codec-http 4.1.29.Final +https://netty.io/ +https://github.com/netty/netty/blob/4.1/LICENSE.txt + +netty-common 4.1.29.Final +https://netty.io/ +https://github.com/netty/netty/blob/4.1/LICENSE.txt + +netty-handler 4.1.29.Final +https://netty.io/ +https://github.com/netty/netty/blob/4.1/LICENSE.txt + +netty-resolver 4.1.29.Final +https://netty.io/ +https://github.com/netty/netty/blob/4.1/LICENSE.txt + +netty-transport 4.1.29.Final +https://netty.io/ +https://github.com/netty/netty/blob/4.1/LICENSE.txt + +netty-transport-native-epoll 4.1.29.Final +https://netty.io/ +https://github.com/netty/netty/blob/4.1/LICENSE.txt + +netty-transport-native-kqueue 4.1.29.Final +https://netty.io/ +https://github.com/netty/netty/blob/4.1/LICENSE.txt + +netty-transport-native-unix-common 4.1.29.Final +https://netty.io/ +https://github.com/netty/netty/blob/4.1/LICENSE.txt + +rxjava 1.3.8 +https://github.com/ReactiveX/RxJava +https://github.com/ReactiveX/RxJava/blob/3.x/LICENSE + +byte-buddy 1.8.17 +https://bytebuddy.net/#/ +http://www.apache.org/licenses/LICENSE-2.0.html + +corda 4.0 +Copyright 2016 - 2019, R3 Limited. +https://github.com/corda/corda +https://github.com/corda/corda/blob/master/LICENSE + +corda-common-configurationparsing 4.0 +Copyright 2016 - 2019, R3 Limited. +https://github.com/corda/corda +https://github.com/corda/corda/blob/master/LICENSE + +corda-common-validation 4.0 +Copyright 2016 - 2019, R3 Limited. +https://github.com/corda/corda +https://github.com/corda/corda/blob/master/LICENSE + +corda-confidential-identities 4.0 +Copyright 2016 - 2019, R3 Limited. +https://github.com/corda/corda +https://github.com/corda/corda/blob/master/LICENSE + +corda-core 4.0 +Copyright 2016 - 2019, R3 Limited. +https://github.com/corda/corda +https://github.com/corda/corda/blob/master/LICENSE + +corda-jackson 4.0 +Copyright 2016 - 2019, R3 Limited. +https://github.com/corda/corda +https://github.com/corda/corda/blob/master/LICENSE + +corda-node 4.0 +Copyright 2016 - 2019, R3 Limited. +https://github.com/corda/corda +https://github.com/corda/corda/blob/master/LICENSE + +corda-node-api 4.1 +Copyright 2016 - 2019, R3 Limited. +https://github.com/corda/corda +https://github.com/corda/corda/blob/master/LICENSE + +corda-rpc 4.0 +Copyright 2016 - 2019, R3 Limited. +https://github.com/corda/corda +https://github.com/corda/corda/blob/master/LICENSE + +corda-serialization 4.0 +Copyright 2016 - 2019, R3 Limited. +https://github.com/corda/corda +https://github.com/corda/corda/blob/master/LICENSE + +corda-shell 4.0 +Copyright 2016 - 2019, R3 Limited. +https://github.com/corda/corda +https://github.com/corda/corda/blob/master/LICENSE + +jpam 1.1 +http://jpam.sourceforge.net/ +http://jpam.sourceforge.net/JPamUserGuide.html#id.s6.2.1 + +artemis-amqp-protocol 2.6.2 +https://github.com/apache/activemq +https://github.com/apache/activemq/blob/master/LICENSE + +artemis-commons 2.6.2 +https://github.com/apache/activemq +https://github.com/apache/activemq/blob/master/LICENSE + +artemis-core-client 2.6.2 +https://github.com/apache/activemq +https://github.com/apache/activemq/blob/master/LICENSE + +artemis-jdbc-store 2.6.2 +https://github.com/apache/activemq +https://github.com/apache/activemq/blob/master/LICENSE + +artemis-jms-client 2.6.2 +https://github.com/apache/activemq +https://github.com/apache/activemq/blob/master/LICENSE + +artemis-journal 2.6.2 +https://github.com/apache/activemq +https://github.com/apache/activemq/blob/master/LICENSE + +artemis-native 2.6.2 +https://github.com/apache/activemq +https://github.com/apache/activemq/blob/master/LICENSE + +artemis-selector 2.6.2 +https://github.com/apache/activemq +https://github.com/apache/activemq/blob/master/LICENSE + +artemis-server 2.6.2 +https://github.com/apache/activemq +https://github.com/apache/activemq/blob/master/LICENSE + +commons-jexl3 3.0 +http://commons.apache.org/jexl/ +http://www.apache.org/licenses/LICENSE-2.0.txt + +commonscollections4 4.1 +http://commons.apache.org/jexl/ +http://www.apache.org/licenses/LICENSE-2.0.txt + +geronimojson_ 1.0_spec 1.0-alpha-1 +https://github.com/apache/geronimo-specs +https://github.com/apache/geronimo-specs/blob/trunk/LICENSE + +geronimojms_ 2.0_spec 1.0-alpha-2 +https://github.com/apache/geronimo-specs +https://github.com/apache/geronimo-specs/blob/trunk/LICENSE + +johnzon-core 0.9.5 +https://github.com/apache/johnzon +https://github.com/apache/johnzon/blob/master/LICENSE + +log4j-api 2.9.1 +https://github.com/apache/logging-log4j2 +https://github.com/apache/logging-log4j2/blob/master/LICENSE.txt + +log4j-core 2.9.1 +https://github.com/apache/logging-log4j2 +https://github.com/apache/logging-log4j2/blob/master/LICENSE.txt + +log4j-slf4j-impl 2.9.1 exact +https://github.com/apache/logging-log4j2 +https://github.com/apache/logging-log4j2/blob/master/LICENSE.txt + +log4j-web 2.9.1 +https://github.com/apache/logging-log4j2 +https://github.com/apache/logging-log4j2/blob/master/LICENSE.txt + +mina-core 2.0.16 +https://github.com/apache/mina +https://github.com/apache/mina/blob/trunk/LICENSE + +proton-j 0.33.0 +https://qpid.apache.org/releases/qpid-proton-j-0.33.0/index.html +https://github.com/apache/qpid-proton-j/blob/master/LICENSE + +shiro-cache 1.4.0 +https://github.com/apache/shiro +https://github.com/apache/shiro/blob/master/LICENSE + +shiro-config-core 1.4.0 +https://github.com/apache/shiro +https://github.com/apache/shiro/blob/master/LICENSE + +shiro-config-ogdl 1.4.0 +https://github.com/apache/shiro +https://github.com/apache/shiro/blob/master/LICENSE + +shiro-core 1.4.0 +https://github.com/apache/shiro +https://github.com/apache/shiro/blob/master/LICENSE + +shiro-crypto-cipher 1.4.0 +https://github.com/apache/shiro +https://github.com/apache/shiro/blob/master/LICENSE + +shiro-crypto-core 1.4.0 +https://github.com/apache/shiro +https://github.com/apache/shiro/blob/master/LICENSE + +shiro-crypto-hash 1.4.0 +https://github.com/apache/shiro +https://github.com/apache/shiro/blob/master/LICENSE + +shiro-event 1.4.0 +https://github.com/apache/shiro +https://github.com/apache/shiro/blob/master/LICENSE + +shiro-lang 1.4.0 +https://github.com/apache/shiro +https://github.com/apache/shiro/blob/master/LICENSE + +sshd-core 1.6.0 +https://github.com/apache/mina-sshd +https://github.com/apache/mina-sshd/blob/master/LICENSE.txt + +sshd-pam 0.11.0 +https://github.com/apache/mina-sshd +https://github.com/apache/mina-sshd/blob/master/LICENSE.txt + +groovy-all 1.8.9 +https://github.com/apache/groovy +https://github.com/apache/groovy/blob/master/LICENSE + +jansi 1.14 +https://github.com/fusesource/jansi +https://github.com/fusesource/jansi/blob/master/license.txt + +snappy 0.4 +Copyright (C) 2011 the original author or authors +https://github.com/dain/snappy +https://github.com/dain/snappy/blob/master/license-header.txt + +jandex 2.0.5.Final +https://github.com/wildfly/jandex +https://github.com/wildfly/jandex/blob/master/LICENSE.txt + +jboss-logging 3.3.2.Final +https://github.com/jboss-logging/jboss-logging +https://github.com/jboss-logging/jboss-logging/blob/master/src/main/resources/META-INF/LICENSE.txt + +annotations 13.0 +http://www.jetbrains.org/display/IJOS/Home;jsessionid=D8BEE7ABBE9465C870555B5B84556904 +http://www.jetbrains.org/display/IJOS/License+Information + +kotlin-reflect 1.2.71 +Copyright 2010-2018 JetBrains s.r.o. +https://github.com/JetBrains/kotlin +https://github.com/JetBrains/kotlin/tree/master/license + +kotlin-stdlib 1.2.71 +Copyright 2010-2018 JetBrains s.r.o. +https://github.com/JetBrains/kotlin +https://github.com/JetBrains/kotlin/tree/master/license + +kotlin-stdlib-common 1.2.71 +Copyright 2010-2018 JetBrains s.r.o. +https://github.com/JetBrains/kotlin +https://github.com/JetBrains/kotlin/tree/master/license + +kotlin-stdlib-jdk7 1.2.71 +Copyright 2010-2018 JetBrains s.r.o. +https://github.com/JetBrains/kotlin +https://github.com/JetBrains/kotlin/tree/master/license + +kotlin-stdlib-jdk8 1.2.71 +Copyright 2010-2018 JetBrains s.r.o. +https://github.com/JetBrains/kotlin +https://github.com/JetBrains/kotlin/tree/master/license + +kotlin-stdlib-jre7 1.2.71 +Copyright 2010-2018 JetBrains s.r.o. +https://github.com/JetBrains/kotlin +https://github.com/JetBrains/kotlin/tree/master/license + +kotlin-stdlib-jre8 1.2.71 +Copyright 2010-2018 JetBrains s.r.o. +https://github.com/JetBrains/kotlin +https://github.com/JetBrains/kotlin/tree/master/license + +jgroups 3.6.13.Final +http://www.jgroups.org/ +http://www.jgroups.org/license.html + +jolokia-core 1.6.0 +https://jolokia.org/ +https://jolokia.org/license.html + +jolokia-jvm 1.6.0 +https://jolokia.org/ +https://jolokia.org/license.html + +liquibase-core 3.5.5 +https://github.com/liquibase/liquibase +https://github.com/liquibase/liquibase/blob/master/LICENSE.txt + +objenesis 2.2 +http://objenesis.org/ +http://objenesis.org/license.html + +snakeyaml 1.18 +http://www.snakeyaml.org/ +https://bitbucket.org/asomov/snakeyaml/src/default/LICENSE.txt + +-----------------------START OF LICENSE TEXT----------------------------------- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + END OF TERMS AND CONDITIONS + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +jackson-annotations 2.9.6 +https://github.com/FasterXML/jackson-annotations +http://www.apache.org/licenses/LICENSE-2.0.txt +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + +jackson-core 2.9.6 +https://github.com/FasterXML/jackson +http://www.apache.org/licenses/LICENSE-2.0.txt +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + +jackson-databind 2.9.6 +https://github.com/FasterXML/jackson-databind +http://www.apache.org/licenses/LICENSE-2.0.txt +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + +-----------------------START OF LICENSE TEXT----------------------------------- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +================================================ + +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] +Preamble +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. + +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. + +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". + +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) The modified work must itself be a software library. +b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. +c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. +d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. +(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. + +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + +a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) +b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. +c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. +d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. +e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: + +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. +b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +javassist 3.23.1-GA +Copyright (C) 1999-2019 by Shigeru Chiba, All rights reserved. +http://www.javassist.org/ +https://github.com/jboss-javassist/javassist/blob/master/License.html + +-----------------------START OF LICENSE TEXT----------------------------------- + + +Javassist License +================= + +**MOZILLA PUBLIC LICENSE** +**Version 1.1** + +-------------- +**1. Definitions.** + +**1.0.1. "Commercial Use"** means distribution or otherwise making the +Covered Code available to a third party. +**1.1. "Contributor"** means each entity that creates or contributes +to the creation of Modifications. + +**1.2. "Contributor Version"** means the combination of the Original +Code, prior Modifications used by a Contributor, and the Modifications +made by that particular Contributor. + +**1.3. "Covered Code"** means the Original Code or Modifications or +the combination of the Original Code and Modifications, in each case +including portions thereof **.** + +**1.4. "Electronic Distribution Mechanism"** means a mechanism +generally accepted in the software development community for the +electronic transfer of data. +**1.5. "Executable"** means Covered Code in any form other than Source +Code. + +**1.6. "Initial Developer"** means the individual or entity identified +as the Initial Developer in the Source Code notice required by **Exhibit +A**. + +**1.7. "Larger Work"** means a work which combines Covered Code or +portions thereof with code not governed by the terms of this License. + +**1.8. "License"** means this document. + +**1.8.1. "Licensable"** means having the right to grant, to the maximum +extent possible, whether at the time of the initial grant or +subsequently acquired, any and all of the rights conveyed herein. + +**1.9. "Modifications"** means any addition to or deletion from the +substance or structure of either the Original Code or any previous +Modifications. When Covered Code is released as a series of files, a +Modification is: + + **A.** Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + **B.** Any new file that contains any part of the Original Code or + previous Modifications. + +**1.10. "Original Code"** means Source Code of computer software code +which is described in the Source Code notice required by **Exhibit A** +as Original Code, and which, at the time of its release under this +License is not already Covered Code governed by this License. + +**1.10.1. "Patent Claims"** means any patent claim(s), now owned or +hereafter acquired, including without limitation, method, process, and +apparatus claims, in any patent Licensable by grantor. + +**1.11. "Source Code"** means the preferred form of the Covered Code for +making modifications to it, including all modules it contains, plus any +associated interface definition files, scripts used to control +compilation and installation of an Executable, or source code +differential comparisons against either the Original Code or another +well known, available Covered Code of the Contributor's choice. The +Source Code can be in a compressed or archival form, provided the +appropriate decompression or de-archiving software is widely available +for no charge. + +**1.12. "You" (or "Your")** means an individual or a legal entity +exercising rights under, and complying with all of the terms of, this +License or a future version of this License issued under Section 6.1. +For legal entities, "You" includes any entity which controls, is +controlled by, or is under common control with You. For purposes of this +definition, "control" means (a) the power, direct or indirect, to cause +the direction or management of such entity, whether by contract or +otherwise, or (b) ownership of more than fifty percent (50%) of the +outstanding shares or beneficial ownership of such entity. + +**2. Source Code License.** +**2.1. The Initial Developer Grant.** +The Initial Developer hereby grants You a world-wide, royalty-free, +non-exclusive license, subject to third party intellectual property +claims: + + **(a)** under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, modify, + display, perform, sublicense and distribute the Original Code (or + portions thereof) with or without Modifications, and/or as part of a + Larger Work; and + + **(b)** under Patents Claims infringed by the making, using or selling + of Original Code, to make, have made, use, practice, sell, and offer for + sale, and/or otherwise dispose of the Original Code (or portions + thereof). + + **(c)** the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes Original Code + under the terms of this License. + + **(d)** Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + +**2.2. Contributor Grant.** +Subject to third party intellectual property claims, each Contributor +hereby grants You a world-wide, royalty-free, non-exclusive license + + **(a)** under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications created by + such Contributor (or portions thereof) either on an unmodified basis, + with other Modifications, as Covered Code and/or as part of a Larger + Work; and + + **(b)** under Patent Claims infringed by the making, using, or selling + of Modifications made by that Contributor either alone and/or in + combination with its Contributor Version (or portions of such + combination), to make, use, sell, offer for sale, have made, and/or + otherwise dispose of: 1) Modifications made by that Contributor (or + portions thereof); and 2) the combination of Modifications made by that + Contributor with its Contributor Version (or portions of such + combination). + + **(c)** the licenses granted in Sections 2.2(a) and 2.2(b) are effective + on the date Contributor first makes Commercial Use of the Covered Code. + + **(d)** Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; 3) for + infringements caused by: i) third party modifications of Contributor + Version or ii) the combination of Modifications made by that + Contributor with other software (except as part of the Contributor + Version) or other devices; or 4) under Patent Claims infringed by + Covered Code in the absence of Modifications made by that Contributor. + +**3. Distribution Obligations.** + +**3.1. Application of License.** +The Modifications which You create or to which You contribute are +governed by the terms of this License, including without limitation +Section **2.2**. The Source Code version of Covered Code may be +distributed only under the terms of this License or a future version +of this License released under Section **6.1**, and You must include a +copy of this License with every copy of the Source Code You +distribute. You may not offer or impose any terms on any Source Code +version that alters or restricts the applicable version of this +License or the recipients' rights hereunder. However, You may include +an additional document offering the additional rights described in +Section **3.5**. + +**3.2. Availability of Source Code.** +Any Modification which You create or to which You contribute must be +made available in Source Code form under the terms of this License +either on the same media as an Executable version or via an accepted +Electronic Distribution Mechanism to anyone to whom you made an +Executable version available; and if made available via Electronic +Distribution Mechanism, must remain available for at least twelve (12) +months after the date it initially became available, or at least six +(6) months after a subsequent version of that particular Modification +has been made available to such recipients. You are responsible for +ensuring that the Source Code version remains available even if the +Electronic Distribution Mechanism is maintained by a third party. + +**3.3. Description of Modifications.** +You must cause all Covered Code to which You contribute to contain a +file documenting the changes You made to create that Covered Code and +the date of any change. You must include a prominent statement that +the Modification is derived, directly or indirectly, from Original +Code provided by the Initial Developer and including the name of the +Initial Developer in (a) the Source Code, and (b) in any notice in an +Executable version or related documentation in which You describe the +origin or ownership of the Covered Code. + +**3.4. Intellectual Property Matters** + + **(a) Third Party Claims**. + + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, Contributor + must include a text file with the Source Code distribution titled + "LEGAL" which describes the claim and the party making the claim in + sufficient detail that a recipient will know whom to contact. If + Contributor obtains such knowledge after the Modification is made + available as described in Section 3.2, Contributor shall promptly + modify the LEGAL file in all copies Contributor makes available + thereafter and shall take other steps (such as notifying appropriate + mailing lists or newsgroups) reasonably calculated to inform those who + received the Covered Code that new knowledge has been obtained. + + **(b) Contributor APIs**. + + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which are + reasonably necessary to implement that API, Contributor must also + include this information in the LEGAL file. + + **(c) Representations.** + + Contributor represents that, except as + disclosed pursuant to Section 3.4(a) above, Contributor believes that + Contributor's Modifications are Contributor's original creation(s) + and/or Contributor has sufficient rights to grant the rights conveyed by + this License. + +**3.5. Required Notices.** + +You must duplicate the notice in **Exhibit A** in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in **Exhibit A**. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + +**3.6. Distribution of Executable Versions.** + +You may distribute Covered Code in Executable form only if the requirements of Section **3.1-3.5** have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section **3.2**. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + +**3.7. Larger Works.** + +You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +**4. Inability to Comply Due to Statute or Regulation.** + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section **3.4** and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +**5. Application of this License.** + +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + +**6. Versions of the License.** + +**6.1. New Versions.** + +Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + +**6.2. Effect of New Versions.** + +Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. + +**6.3. Derivative Works.** + +If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +**7. DISCLAIMER OF WARRANTY.** + +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +**8. TERMINATION.** + +**8.1.** + +This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +**8.2.** + +If You initiate litigation by asserting a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: + + **(a)** such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + + **(b)** any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + +**8.3.** + +If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + +**8.4.** + +In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +**9. LIMITATION OF LIABILITY.** + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +**10. U.S. GOVERNMENT END USERS.** + +The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +**11.MISCELLANEOUS.** +This License represents the complete agreement concerning subject matter thereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +**12. RESPONSIBILITY FOR CLAIMS.** + +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +**13. MULTIPLE-LICENSED CODE.** + +Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the MPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + +**EXHIBIT A -Mozilla Public License.** + +The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +The Original Code is Javassist. The Initial Developer of the Original Code is Shigeru Chiba. Portions created by the Initial Developer are Copyright (C) 1999- Shigeru Chiba. All Rights Reserved. Contributor(s): __Bill Burke, Jason T. Greene______________. + +Alternatively, the contents of this software may be used under the terms of the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), or the Apache License Version 2.0 (the "AL"), in which case the provisions of the LGPL or the AL are applicable instead of those above. If you wish to allow use of your version of this software only under the terms of either the LGPL or the AL, and not to allow others to use your version of this software under the terms of the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the LGPL or the AL. If you do not delete the provisions above, a recipient may use your version of this software under the terms of any one of the MPL, the LGPL or the AL. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +antlr 2.7.7 +Copyright © 2012 Terence Parr & Sam Harwell +https://www.antlr.org/ +https://www.antlr.org/license.html + +jcabi-log 0.14 +Copyright (c) 2012-2017, jcabi.com +https://www.jcabi.com/ +https://www.jcabi.com/LICENSE.txt + +jcabi-manifests 1.1 +Copyright (c) 2012-2017, jcabi.com +https://www.jcabi.com/ +https://www.jcabi.com/LICENSE.txt + +forms 1.1-preview +Copyright (c) 2002-2015 JGoodies Software GmbH. +http://www.jgoodies.com/ +https://github.com/JFormDesigner/swing-jgoodies-forms/blob/master/LICENSE.txt + +dom4j 1.6.1 +Copyright 2001-2016 (C) MetaStuff, Ltd. and DOM4J contributors +http://www.dom4j.org/ +https://github.com/dom4j/dom4j/blob/master/LICENSE + +-----------------------START OF LICENSE TEXT----------------------------------- + +ANTLR 4 License +[The BSD License] +Copyright (c) 2012 Terence Parr and Sam Harwell +All rights reserved. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +================================================ + +Copyright (c) 2012-2017, jcabi.com +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: 1) Redistributions of source code must retain the above +copyright notice, this list of conditions and the following +disclaimer. 2) Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following +disclaimer in the documentation and/or other materials provided +with the distribution. 3) Neither the name of the jcabi.com nor +the names of its contributors may be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +================================================ + +The BSD License for the JGoodies Forms +Copyright (c) 2002-2015 JGoodies Software GmbH. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + o Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + o Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + o Neither the name of JGoodies Software GmbH nor the names of + its contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +================================================ + +Copyright 2001-2016 (C) MetaStuff, Ltd. and DOM4J contributors. All Rights Reserved. + +Redistribution and use of this software and associated documentation +("Software"), with or without modification, are permitted provided +that the following conditions are met: + +1. Redistributions of source code must retain copyright + statements and notices. Redistributions must also contain a + copy of this document. + +2. Redistributions in binary form must reproduce the + above copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. The name "DOM4J" must not be used to endorse or promote + products derived from this Software without prior written + permission of MetaStuff, Ltd. For written permission, + please contact dom4j-info@metastuff.com. + +4. Products derived from this Software may not be called "DOM4J" + nor may "DOM4J" appear in their names without prior written + permission of MetaStuff, Ltd. DOM4J is a registered + trademark of MetaStuff, Ltd. + +5. Due credit should be given to the DOM4J Project - https://dom4j.github.io/ + +THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS +''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +LatencyUtils 2.0.3 +Copyright (c) 2012, 2013, 2014 Gil Tene +https://github.com/LatencyUtils/LatencyUtils +https://github.com/LatencyUtils/LatencyUtils/blob/master/LICENSE + +postgresql 42.2.5 +Copyright (c) 1997, PostgreSQL Global Development Group +https://github.com/pgjdbc/pgjdbc +https://github.com/pgjdbc/pgjdbc/blob/master/LICENSE + +-----------------------START OF LICENSE TEXT----------------------------------- + + * This code was Written by Gil Tene of Azul Systems, and released to the + * public domain, as explained at http://creativecommons.org/publicdomain/zero/1.0/ + + For users of this code who wish to consume it under the "BSD" license + rather than under the public domain or CC0 contribution text mentioned + above, the code found under this directory is *also* provided under the + following license (commonly referred to as the BSD 2-Clause License). This + license does not detract from the above stated release of the code into + the public domain, and simply represents an additional license granted by + the Author. + + ----------------------------------------------------------------------------- + ** Beginning of "BSD 2-Clause License" text. ** + + Copyright (c) 2012, 2013, 2014 Gil Tene + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +ea-agent-loader 1.0.3 +Copyright (C) 2015 - 2016 Electronic Arts Inc. +https://github.com/electronicarts/ea-agent-loader +https://github.com/electronicarts/ea-agent-loader/blob/master/LICENSE + +kryo 4.0.0 +Copyright (c) 2008-2018, Nathan Sweet +https://github.com/EsotericSoftware/kryo/releases/tag/kryo-parent-4.0.0 +https://github.com/EsotericSoftware/kryo/blob/master/LICENSE.md + +minlog 1.3.0 +Copyright (c) 2008, Nathan Sweet +https://github.com/EsotericSoftware/minlog +https://github.com/EsotericSoftware/minlog/blob/master/license.txt + +reflectasm 1.11.3 +Copyright (c) 2008, Nathan Sweet +https://github.com/EsotericSoftware/reflectasm +https://github.com/EsotericSoftware/reflectasm/blob/master/license.txt + +asm 5.2 +Copyright (c) 2000-2011 INRIA, France Telecom +https://asm.ow2.io/index.html +https://asm.ow2.io/license.html + +javax.activation-api 1.2.0 +Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. +https://github.com/eclipse-ee4j/jaf +https://github.com/eclipse-ee4j/jaf/blob/master/LICENSE.md + +-----------------------START OF LICENSE TEXT----------------------------------- + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of Electronic Arts, Inc. ("EA") nor the names of + its contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY ELECTRONIC ARTS AND ITS CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ELECTRONIC ARTS OR ITS CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +eddsa 0.3.0 +https://github.com/str4d/ed25519-java +https://github.com/str4d/ed25519-java/blob/master/LICENSE.txt + +-----------------------START OF LICENSE TEXT----------------------------------- + +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. + +For more information, please see https://creativecommons.org/publicdomain/zero/1.0/ + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +jbosstransaction- api_1.2_spec 1.1.1.Final +Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved. +https://github.com/jboss/jboss-transaction-api_spec +https://github.com/jboss/jboss-transaction-api_spec/blob/master/LICENSE.txt + +-----------------------START OF LICENSE TEXT----------------------------------- + +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + +1. Definitions. + + 1.1. Contributor. means each individual or entity that creates or contributes to the creation of Modifications. + + 1.2. Contributor Version. means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. + + 1.3. Covered Software. means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. + + 1.4. Executable. means the Covered Software in any form other than Source Code. + + 1.5. Initial Developer. means the individual or entity that first makes Original Software available under this License. + + 1.6. Larger Work. means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. + + 1.7. License. means this document. + + 1.8. Licensable. means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9. Modifications. means the Source Code and Executable form of any of the following: + + A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; + + B. Any new file that contains any part of the Original Software or previous Modification; or + + C. Any new file that is contributed or otherwise made available under the terms of this License. + + 1.10. Original Software. means the Source Code and Executable form of computer software code that is originally released under this License. + + 1.11. Patent Claims. means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.12. Source Code. means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. + + 1.13. You. (or .Your.) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, .You. includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, .control. means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants. + + 2.1. The Initial Developer Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. + + 2.2. Contributor Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. + + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Availability of Source Code. + Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. + + 3.2. Modifications. + The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. + + 3.3. Required Notices. + You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. + + 3.4. Application of Additional Terms. + You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients. rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.5. Distribution of Executable Versions. + You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient.s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + 3.6. Larger Works. + You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. + +4. Versions of the License. + + 4.1. New Versions. + Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. + + 4.2. Effect of New Versions. + You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. + + 4.3. Modified Versions. + When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. + +5. DISCLAIMER OF WARRANTY. + + COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN .AS IS. BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +6. TERMINATION. + + 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as .Participant.) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. + + 6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY.S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + + The Covered Software is a .commercial item,. as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of .commercial computer software. (as that term is defined at 48 C.F.R. ? 252.227-7014(a)(1)) and .commercial computer software documentation. as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. + +9. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction.s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys. fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) + + The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. + + +The GNU General Public License (GPL) Version 2, June 1991 + + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + + c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + + One line to give the program's name and a brief idea of what it does. + + Copyright (C) + + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. + + signature of Ty Coon, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. + + +"CLASSPATH" EXCEPTION TO THE GPL VERSION 2 + +Certain source files distributed by Sun Microsystems, Inc. are subject to the following clarification and special exception to the GPL Version 2, but only where Sun has expressly included in the particular source file's header the words + +"Sun designates this particular file as subject to the "Classpath" exception as provided by Sun in the License file that accompanied this code." + +Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination. + +As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.? An independent module is a module which is not derived from or based on this library.? If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so.? If you do not wish to do so, delete this exception statement from your version. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +metrics-new-relic 1.1.1 +https://github.com/palominolabs/metrics-new-relic +https://github.com/palominolabs/metrics-new-relic/blob/master/LICENSE + +-----------------------START OF LICENSE TEXT----------------------------------- + +# Copyfree Open Innovation License + +This is version 0.4 of the Copyfree Open Innovation License. + +## Terms and Conditions + +Redistributions, modified or unmodified, in whole or in part, must retain +applicable copyright or other legal privilege notices, these conditions, and +the following license terms and disclaimer. Subject to these conditions, the +holder(s) of copyright or other legal privileges, author(s) or assembler(s), +and contributors of this work hereby grant to any person who obtains a copy of +this work in any form: + +1. Permission to reproduce, modify, distribute, publish, sell, sublicense, use, +and/or otherwise deal in the licensed material without restriction. + +2. A perpetual, worldwide, non-exclusive, royalty-free, irrevocable patent +license to reproduce, modify, distribute, publish, sell, use, and/or otherwise +deal in the licensed material without restriction, for any and all patents: + + a. Held presently or in the future by each such holder of copyright or + other legal privilege, author or assembler, or contributor, necessarily + infringed by the contributions alone or by combination with the work, of + that privilege holder, author or assembler, or contributor. + + b. Necessarily infringed by the work at the time that holder of copyright + or other privilege, author or assembler, or contributor made any + contribution to the work. + +NO WARRANTY OF ANY KIND IS IMPLIED BY, OR SHOULD BE INFERRED FROM, THIS LICENSE +OR THE ACT OF DISTRIBUTION UNDER THE TERMS OF THIS LICENSE, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS, ASSEMBLERS, OR HOLDERS OF +COPYRIGHT OR OTHER LEGAL PRIVILEGE BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER +LIABILITY, WHETHER IN ACTION OF CONTRACT, TORT, OR OTHERWISE ARISING FROM, OUT +OF, OR IN CONNECTION WITH THE WORK OR THE USE OF OR OTHER DEALINGS IN THE WORK. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +quasar-core 0.7.10 +Copyright (c) 2013-2018, Parallel Universe Software Co. +http://docs.paralleluniverse.co/quasar/ +https://github.com/puniverse/quasar/blob/master/LICENSE + +-----------------------START OF LICENSE TEXT----------------------------------- + +Quasar LICENSE +Quasar: lightweight threads and actors for the JVM. +Copyright (c) 2013-2018, Parallel Universe Software Co. All rights reserved. + +This program and the accompanying materials are dual-licensed under +either the terms of the Eclipse Public License v1.0 as published by +the Eclipse Foundation + + or (per the licensee's choosing) + +under the terms of the GNU Lesser General Public License version 3.0 +as published by the Free Software Foundation. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +javax.persistence-api 2.2 +Copyright (c) 2008, 2019 Oracle and/or its affiliates. All rights reserved. +https://github.com/eclipse-ee4j/jpa-api +https://github.com/eclipse-ee4j/jpa-api/blob/master/LICENSE.md + +-----------------------START OF LICENSE TEXT----------------------------------- + +Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +h2 1.0; 1.4.192; 1.4.197 +http://www.h2database.com/ +http://h2database.com/html/license.html + +-----------------------START OF LICENSE TEXT----------------------------------- + +H2 is dual licensed and available under the MPL 2.0 (Mozilla Public License Version 2.0) or under the EPL 1.0 (Eclipse Public License). There is a license FAQ for both the MPL and the EPL. + +You can use H2 for free. +You can integrate it into your applications (including in commercial applications) and distribute it. +Files containing only your code are not covered by this license (it is 'commercial friendly'). +Modifications to the H2 source code must be published. +You don't need to provide the source code of H2 if you did not modify anything. +If you distribute a binary that includes H2, you need to add a disclaimer of liability - see the example below. +However, nobody is allowed to rename H2, modify it a little, and sell it as a database engine without telling the customers it is in fact H2. This happened to HSQLDB: a company called 'bungisoft' copied HSQLDB, renamed it to 'RedBase', and tried to sell it, hiding the fact that it was in fact just HSQLDB. It seems 'bungisoft' does not exist any more, but you can use the Wayback Machine and visit old web pages of http://www.bungisoft.com. + +About porting the source code to another language (for example C# or C++): converted source code (even if done manually) stays under the same copyright and license as the original code. The copyright of the ported source code does not (automatically) go to the person who ported the code. + +If you distribute a binary that includes H2, you need to add the license and a disclaimer of liability (as you should do for your own code). You should add a disclaimer for each open source library you use. For example, add a file 3rdparty_license.txt in the directory where the jar files are, and list all open source libraries, each one with its license and disclaimer. For H2, a simple solution is to copy the following text below. You may also include a copy of the complete license. + +This software contains unmodified binary redistributions for +H2 database engine (http://www.h2database.com/), +which is dual licensed and available under the MPL 2.0 +(Mozilla Public License) or under the EPL 1.0 (Eclipse Public License). +An original copy of the license agreement can be found at: +http://www.h2database.com/html/license.html +Mozilla Public License Version 2.0 +1. Definitions +1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. + +1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" means Covered Software of a particular Contributor. + +1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. + +1.5. "Incompatible With Secondary Licenses" means + +a. that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or + +b. that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. + +1.6. "Executable Form" means any form of the work other than Source Code Form. + +1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. + +1.8. "License" means this document. + +1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. + +1.10. "Modifications" means any of the following: + +a. any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or + +b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants and Conditions +2.1. Grants +Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + +under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and + +under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. + +2.2. Effective Date +The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. + +2.3. Limitations on Grant Scope +The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: + +for any code that a Contributor has removed from Covered Software; or + +for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or + +under Patent Claims infringed by Covered Software in the absence of its Contributions. + +This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). + +2.4. Subsequent Licenses +No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). + +2.5. Representation +Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use +This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. + +2.7. Conditions +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. + +3. Responsibilities +3.1. Distribution of Source Form +All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. + +3.2. Distribution of Executable Form +If You distribute Covered Software in Executable Form then: + +such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and + +You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work +You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). + +3.4. Notices +You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms +You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Termination +5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. + +6. Disclaimer of Warranty +Covered Software is provided under this License on an "as is" basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer. + +7. Limitation of Liability +Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation +Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. + +9. Miscellaneous +This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. + +10. Versions of the License +10.1. New Versions +Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. + +10.2. Effect of New Versions +You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. + +10.3. Modified Versions +If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses +If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +This Source Code Form is subject to the terms of the Mozilla +Public License, v. 2.0. If a copy of the MPL was not distributed +with this file, you can obtain one at http://mozilla.org/MPL/2.0 +If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +This Source Code Form is "Incompatible With Secondary Licenses", +as defined by the Mozilla Public License, v. 2.0. +Eclipse Public License - Version 1.0 +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + +b) in the case of each subsequent Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS +a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +checker-qual 2.5.2 +Copyright 2004-present by the Checker Framework developers +https://github.com/typetools/checker-framework +https://github.com/typetools/checker-framework/blob/master/LICENSE.txt + +-----------------------START OF LICENSE TEXT----------------------------------- + +The Checker Framework +Copyright 2004-present by the Checker Framework developers + + +Most of the Checker Framework is licensed under the GNU General Public +License, version 2 (GPL2), with the classpath exception. The text of this +license appears below. This is the same license used for OpenJDK. + +A few parts of the Checker Framework have more permissive licenses. + + * The annotations are licensed under the MIT License. (The text of this + license appears below.) More specifically, all the parts of the Checker + Framework that you might want to include with your own program use the + MIT License. This is the checker-qual.jar file and all the files that + appear in it: every file in a qual/ directory, plus utility files such + as NullnessUtil.java, RegexUtil.java, SignednessUtil.java, etc. + In addition, the cleanroom implementations of third-party annotations, + which the Checker Framework recognizes as aliases for its own + annotations, are licensed under the MIT License. + +Some external libraries that are included with the Checker Framework have +different licenses. + + * javaparser is dual licensed under the LGPL or the Apache license -- you + may use it under whichever one you want. (The javaparser source code + contains a file with the text of the GPL, but it is not clear why, since + javaparser does not use the GPL.) See file stubparser/LICENSE + and the source code of all its files. + + * JUnit is licensed under the Common Public License v1.0 (see + http://www.junit.org/license), with parts (Hamcrest) licensed under the + BSD License (see http://hamcrest.org/JavaHamcrest/). + + * Libraries in plume-lib (https://github.com/plume-lib/) are licensed + under the MIT License. + +The Checker Framework includes annotations for the JDK in directory +checker/jdk/, and for some other libraries. Each annotated library uses +the same license as the unannotated version of the library. + +=========================================================================== + +The GNU General Public License (GPL) + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to +most of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you +can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for +a fee, you must give the recipients all the rights that you have. You must +make sure that they, too, receive or can get the source code. And you must +show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program proprietary. +To prevent this, we have made it clear that any patent must be licensed for +everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program +or work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is included +without limitation in the term "modification".) Each licensee is addressed as +"you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is +not restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as +you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the +Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may +at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus +forming a work based on the Program, and copy and distribute such modifications +or work under the terms of Section 1 above, provided that you also meet all of +these conditions: + + a) You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole or + in part contains or is derived from the Program or any part thereof, to be + licensed as a whole at no charge to all third parties under the terms of + this License. + + c) If the modified program normally reads commands interactively when run, + you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may redistribute + the program under these conditions, and telling the user how to view a copy + of this License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on the Program is + not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, and +its terms, do not apply to those sections when you distribute them as separate +works. But when you distribute the same sections as part of a whole which is a +work based on the Program, the distribution of the whole must be on the terms +of this License, whose permissions for other licensees extend to the entire +whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on +the Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and +2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above + on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only + for noncommercial distribution and only if you received the program in + object code or executable form with such an offer, in accord with + Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all +the source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code +distributed need not include anything that is normally distributed (in either +source or binary form) with the major components (compiler, kernel, and so on) +of the operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source +code from the same place counts as distribution of the source code, even though +third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. +However, nothing else grants you permission to modify or distribute the Program +or its derivative works. These actions are prohibited by law if you do not +accept this License. Therefore, by modifying or distributing the Program (or +any work based on the Program), you indicate your acceptance of this License to +do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), +the recipient automatically receives a license from the original licensor to +copy, distribute or modify the Program subject to these terms and conditions. +You may not impose any further restrictions on the recipients' exercise of the +rights granted herein. You are not responsible for enforcing compliance by +third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution +of the Program by all those who receive copies directly or indirectly through +you, then the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose that +choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original +copyright holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In +such case, this License incorporates the limitation as if written in the body +of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the +General Public License from time to time. Such new versions will be similar in +spirit to the present version, but may differ in detail to address new problems +or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any later +version", you have the option of following the terms and conditions either of +that version or of any later version published by the Free Software Foundation. +If the Program does not specify a version number of this License, you may +choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of +all derivatives of our free software and of promoting the sharing and reuse of +software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE +PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL +ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE +PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER +OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively convey the exclusion +of warranty; and each file should have at least the "copyright" line and a +pointer to where the full notice is found. + + One line to give the program's name and a brief idea of what it does. + + Copyright (C) + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., 59 + Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it +starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author Gnomovision comes + with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free + software, and you are welcome to redistribute it under certain conditions; + type 'show c' for details. + +The hypothetical commands 'show w' and 'show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than 'show w' and 'show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, +if any, to sign a "copyright disclaimer" for the program, if necessary. Here +is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + 'Gnomovision' (which makes passes at compilers) written by James Hacker. + + signature of Ty Coon, 1 April 1989 + + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General Public +License instead of this License. + + +"CLASSPATH" EXCEPTION TO THE GPL + +Certain source files distributed by Oracle America and/or its affiliates are +subject to the following clarification and special exception to the GPL, but +only where Oracle has expressly included in the particular source file's header +the words "Oracle designates this particular file as subject to the "Classpath" +exception as provided by Oracle in the LICENSE file that accompanied this code." + + Linking this library statically or dynamically with other modules is making + a combined work based on this library. Thus, the terms and conditions of + the GNU General Public License cover the whole combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules, + and to copy and distribute the resulting executable under terms of your + choice, provided that you also meet, for each linked independent module, + the terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. If + you modify this library, you may extend this exception to your version of + the library, but you are not obligated to do so. If you do not wish to do + so, delete this exception statement from your version. + +=========================================================================== + +MIT License: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +crash.cli 1.3.0-cr8 +Copyright (C) 2003-2009 eXo Platform SAS. +https://github.com/crashub/crash +https://opensource.org/licenses/LGPL-2.1 + +crash.shell 1.3.2 +Copyright (C) 2003-2009 eXo Platform SAS. +https://github.com/crashub/crash +https://opensource.org/licenses/LGPL-2.1 + +hibernate-core 5.3.6.Final +https://github.com/hibernate/hibernate-orm +https://github.com/hibernate/hibernate-orm/blob/master/lgpl.txt + +hibernate-java8 5.3.6.Final +https://github.com/hibernate/hibernate-orm +https://github.com/hibernate/hibernate-orm/blob/master/lgpl.txt + +hibernate-commonsannotations 5.0.4.Final +https://github.com/hibernate/hibernate-commons-annotations +https://github.com/hibernate/hibernate-commons-annotations/blob/master/lgpl.txt + +-----------------------START OF LICENSE TEXT----------------------------------- + +GNU Lesser General Public License +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] + +Preamble +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. + +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. + +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". + +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) The modified work must itself be a software library. + +b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. + +c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. + +d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. + +(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. + +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + +a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) + +b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. + +c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. + +d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. + +e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. + +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: + +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. + +b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +jsr305 3.0.2 +http://findbugs.sourceforge.net/ +https://www.gnu.org/licenses/lgpl-3.0.html + +-----------------------START OF LICENSE TEXT----------------------------------- + +GNU LESSER GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright © 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. + +0. Additional Definitions. +As used herein, “this License” refers to version 3 of the GNU Lesser General Public License, and the “GNU GPL” refers to version 3 of the GNU General Public License. + +“The Library” refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. + +An “Application” is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. + +A “Combined Work” is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the “Linked Version”. + +The “Minimal Corresponding Source” for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. + +The “Corresponding Application Code” for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. + +1. Exception to Section 3 of the GNU GPL. +You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. + +2. Conveying Modified Versions. +If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: + +a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or +b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. +3. Object Code Incorporating Material from Library Header Files. +The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: + +a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. +b) Accompany the object code with a copy of the GNU GPL and this license document. +4. Combined Works. +You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: + +a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. +b) Accompany the Combined Work with a copy of the GNU GPL and this license document. +c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. +d) Do one of the following: +0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. +1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. +e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) +5. Combined Libraries. +You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: + +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. +b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. +6. Revised Versions of the GNU Lesser General Public License. +The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +liquibase-slf4j 2.0.0 +Copyright (c) 2012-2015 Matt Bertolini +https://github.com/mattbertolini/liquibase-slf4j +https://opensource.org/licenses/mit-license.html + +classgraph 4.6.12 +Copyright (c) 2019 Luke Hutchison +https://github.com/classgraph/classgraph +https://github.com/classgraph/classgraph/blob/master/LICENSE + +jquery 1.11.0-rc1 +Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors +https://blog.jquery.com/2014/01/16/jquery-1-11-0-rc1-and-2-1-0-rc1-released/ +http://jquery.org/license + +bcpkix-jdk15on 1.60 +Copyright (c) 2000-2019 The Legion of the Bouncy Castle Inc. +http://www.bouncycastle.org/java.html +http://www.bouncycastle.org/licence.html + +bcprov-jdk15on 1.60 +Copyright (c) 2000-2019 The Legion of the Bouncy Castle Inc. +http://www.bouncycastle.org/java.html +http://www.bouncycastle.org/licence.html + +animal-snifferannotations 1.14 +https://www.mojohaus.org/animal-sniffer/index.html +https://www.mojohaus.org/animal-sniffer/license.html + +jcl-over-slf4j 1.7.25 +Copyright (c) 2004-2017 QOS.ch +https://github.com/qos-ch/slf4j +https://github.com/qos-ch/slf4j/blob/master/LICENSE.txt + +jul-to-slf4j 1.7.25 +Copyright (c) 2004-2017 QOS.ch +https://github.com/qos-ch/slf4j +https://github.com/qos-ch/slf4j/blob/master/LICENSE.txt + +slf4j-api 1.7.25 +Copyright (c) 2004-2017 QOS.ch +https://github.com/qos-ch/slf4j +https://github.com/qos-ch/slf4j/blob/master/LICENSE.txt + +-----------------------START OF LICENSE TEXT----------------------------------- + +MIT License + +Copyright + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +newrelic-api 3.10.0 +Copyright (c) 2008-2019 New Relic, Inc. +https://newrelic.com/ +https://docs.newrelic.com/docs/licenses/license-information/other-licenses/new-relic-agent-license + +-----------------------START OF LICENSE TEXT----------------------------------- + +Copyright (c) 2008-2019 New Relic, Inc. All rights reserved. + +Certain inventions disclosed in this file may be claimed within +patents owned or patent applications filed by New Relic, Inc. or third +parties. + +Subject to the terms of this notice, New Relic grants you a +nonexclusive, nontransferable license, without the right to +sublicense, to (a) install and execute one copy of these files on any +number of workstations owned or controlled by you and (b) distribute +verbatim copies of these files to third parties. As a condition to the +foregoing grant, you must provide this notice along with each copy you +distribute and you must not remove, alter, or obscure this notice. All +other use, reproduction, modification, distribution, or other +exploitation of these files is strictly prohibited, except as may be set +forth in a separate written license agreement between you and New +Relic. The terms of any such license agreement will control over this +notice. The license stated above will be automatically terminated and +revoked if you exceed its scope or violate any of the terms of this +notice. + +This License does not grant permission to use the trade names, +trademarks, service marks, or product names of New Relic, except as +required for reasonable and customary use in describing the origin of +this file and reproducing the content of this notice. You may not +mark or brand this file with any trade name, trademarks, service +marks, or product names other than the original brand (if any) +provided by New Relic. + +Unless otherwise expressly agreed by New Relic in a separate written +license agreement, these files are provided AS IS, WITHOUT WARRANTY OF +ANY KIND, including without any implied warranties of MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE, or NON-INFRINGEMENT. As a +condition to your use of these files, you are solely responsible for +such use. New Relic will have no liability to you for direct, +indirect, consequential, incidental, special, or punitive damages or +for lost profits or data. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + + +================================================ + +================================================ + + +=========== START OF NOTICES AND INFORMATION for the following components========= + +HdrHistogram 2.1.9 +https://github.com/HdrHistogram/HdrHistogram +https://github.com/HdrHistogram/HdrHistogram/blob/master/LICENSE.txt + +-----------------------START OF LICENSE TEXT----------------------------------- + +The code in this repository code was Written by Gil Tene, Michael Barker, +and Matt Warren, and released to the public domain, as explained at +http://creativecommons.org/publicdomain/zero/1.0/ + +For users of this code who wish to consume it under the "BSD" license +rather than under the public domain or CC0 contribution text mentioned +above, the code found under this directory is *also* provided under the +following license (commonly referred to as the BSD 2-Clause License). This +license does not detract from the above stated release of the code into +the public domain, and simply represents an additional license granted by +the Author. + +----------------------------------------------------------------------------- +** Beginning of "BSD 2-Clause License" text. ** + + Copyright (c) 2012, 2013, 2014, 2015, 2016 Gil Tene + Copyright (c) 2014 Michael Barker + Copyright (c) 2014 Matt Warren + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. + +---------------------END OF LICENSE TEXT----------------------------------------- + +=============END OF NOTICES AND INFORMATION for above components================= + +================================================ +END OF THIRD PARTY NOTICES FOR +Corda Open Source V. 4.1 +================================================ + + +----------------------END OF OPEN SOURCE LICENSES ----------------------- diff --git a/lib/quasar.jar b/lib/quasar.jar index 7282d8c8b8b9d0b01d9efd2a2149406dd0948eb6..c297550a86a4432ac5bae0c165e81d64745255c6 100644 GIT binary patch literal 1315142 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%0AIFMjZ6p(j za@!gS9oCsr&9EmuDIu{Z(W|LsoFPV22uAthNWql<8zxe{?Pc@y)Kt)EXVbCCFmJ*9 zpz=FA1eb~SRVW$>B6IypeM-TXR$)?_Aq^)yh8zS-3+V(PENoQi)LJ(cuPZK?QsxPc zTBDt+vU)Oh+gA1tutV(;<@#r9Mk9l*_3gwkbaqI7Zv8_>yrMuRa$f zWnW_21}JaSvON|5A%Nu|>I%~Vp`9TaPo=Vzk4t2N*2f}a+9tn^L;3>^Eo;lChgr55 z_nio&SphL34BsxtgEK)LLMO#FqL!kF9QVkWZ#0ZZ`+_SP_AVhG9QrO$r3ie2x&=<9K)!QPa)NMlzRZmK0~~VLV%k3aeG)mTCdC5vqeG0BD0{(DY%nq5`NXJ3d(}=^-Eb( zHb(ht(xHRcBhwTSXFZ$-{}A#P`Kqs(UWE4`Hmg6(eyAPxrt%fl>;+I6T_5S2@U!Bz z^xpjGZ!UpUgq?1T%6mh15E0%Sp&#y0L<4>5gKYx&MuvNG5ABGnBM5D-(p8u~h2%%h z4m#c0E9aK*aVM}yLv%`+@#a2?ohY~>s81AVs^ulet135!cxN#%8NbCXfTnS*T$eRxT;!Tp`&EFTC1pqO#^1<*`cGf7y@#; z5IV=zx;~fz%YfKO0atPK4Y*Uoh$l~ThFvad@G0BGAk~wKW6VC*@>4j|7JhSzOs8ep z)3M+V)M&Q#<2xfOoA|9^M^u9j7j_`7FQtc4{iL>Kf^Wo%zzn1BrMxlY)~K{Ch}JdJ zn0I{_|NG=uuyyQ1|M~rb;gxpg-=P`PjH6#!#c%Yf-CRQ2J2UQ5u7+!55Mhr7R;o+9 zu2VKnkb7zm)oe*wBXXQF@b2RUk0ee=R^3%H360guxdt>9!lu|O9aBiLz?+y0KqHr4 zQ&wd-Bjp^&=Ndj~ck!KCRiXDGo!TcHmxN>7ClVR*sd{n(F=v;sXr2?)n^8l*dGIBF{`4J7Kseqtr)%DxLuO1>kfaDfkB<*PL9)Yo*4D6xaJ*yZi@Ht;G}Y*b;dhNCZh4AZ$pOBYh3D@hO!8AQFmd_ z0zYz|Aa^8lI%<~PMFp2OO)yIyyak?489|b}y1hc>=GO@o^<%0`SdHe7M*Bkf3d){{ z_`+Nr&YB^_%9`SCbx>K3X>|lL!n%9}HcJvb8iu0Q)RN9VS0mz)pke1KaN0x z;gV9s(*CBNOE}|lh~kMOscIcMZkw4FS)%gjT9KVK=J2OI1<@$;>@6WeD(luDB|j!D z2u+-X&T+iBpJlZ@H+^)%yC+BPH8$1E>P9BKg2YxMAK91lY!TKYty>t-Z9w^nU*jAG z_3Y{Gs!QpQDF!V^5v^TpZcfK5i9nYzqkb)1!PRZu)&cjZglfEDp%9hNDeF;esM zQlcy*@Dy#kZvhw0e7X0D)}dpM2NAYmeO@P3`6pylN}5KmYM#|H?U%=+j=9jIW0ot} zlA9Z+WZkxRFE{lWW!sjO(WE@Z=%mO0eKV@w!YQEqH_$-lzj z38UBAwz0|x+{d9k)R#YjNlwGW`ROVUZ5jki*dwXF&X?C_G?)UOqz5PhK9^Pae*|)r zedR!jQbZIxxHL}sc#$gr+Et(3|yyG+6tRR1}S`ALF=)n#E- zzms7bbW(WAMgeTm%`sm>{$DTQSQI7d2*fRYq(RC*xAA%P%h=O5ZXJ1h_F5NE=O}52 zJt~93c!$AbpdiyxuU0*7!s{m-+V8W?rjUZmI`jfqjYskKCBg! zcLmU8YR^g6V%=np5q)MAI}*z)$~R(-xi*D;xpBzRDmx4db}owcy`u9)J?ej!dw}d^ zL)I+YA8eSA#n|}*$P-!sSS$hh-nw!{+?>Tu9ScG7KS9T=D^8~Jx}Lyks9z-KqRTooyorRM=fOhE;_VG>X?BV05_>cUhb9v{eKXAPqxLzlN$-j#fb|zw# z>26%)Z)|>d@e)2l$7?2SU;Y}bb_v!@jFw7U<+aG0(VIQY#J2D6CL0UuybQ^eO$!_gt67XK_5A{mD%;@_z^#7O%#d+b5AAPW|ediwk!maiN>oczQ4a=Mxn%+A&r4K>5WS{fl+wj3N zOLYiHNiaI-E5f<$w z-Ljo<1<3AO2cImr!dU?b^I=90#mbjNVbIho4>LtRJ0f0Vig&R42^7ptr^GnQfOOtd za}+r6cT&mP`)w^lUAyoIDQWiI=?fr>6QslEfQ}G#z|{bd0Fo_()Q`GNa6N%a?qNTU zf*`g^L=Q+D1IwlHqR7N(K^8k8mx4R$2>IDSj`m=;OQmxu=NJDe%ecQHpPpzp>nqLp zYltCrq{DXpmcg4m?NI1LGxa!j0V(yl1UCEX>=h?!l|68`0ezT3P>-nfihm^?7zbJv zq=^RlqNV;Z@rLr=;=~mqI$%^I-lfZtozqoFPZ@_e5+UB&?gBR87;FK&+(DccfaFjr>ATgG z5;%w6K*K(eLl%ZBvGP*9vQAst`+YBs^ochKSvbDywn?Y#7hs!;2%M#Z3O27 zAP(GC0Wcm&K@Ui^p`l@>I7DK*l7%>>88(XmF%O{3eOHT6zr`i@dR*U7-0=D&Ghdve zd?4k0$!Y(xdVZc5;e9L|5N}6tp0f2v7Ng81%hR5Fnsv)n-g_J#dCb^gcF5bPV!Fly z>o-6|09faNNnXoP!fMvpoIfW5VsDCW=pq z*YAHe*`c09x52*Cvuppqz=|e&wb!t~zWyx9TZ@4#%;}jVV8^~fRda&jFqT1@R!NV9 zxxM<6 z?ESlKM7yKOt_MF1sNK543X^!OK}?FDe2b4u30Pk>4M{zuICkFYUw-??mXU%E8Sl(&AZM z^Iln>JCiOFB+O+&gVCAZaSg(E?;$*u_=U zmD+rxg}K8@*lBIKRcpDRn^e>_YqNybtBg*xty}RcEk-k*Cf;ZOvr!+;A!F-@MrO%j zQprKCP!&jtcp$3~OM(yY}0O`Q7%-v3>bs;Ou{zgqJa;u&Nkjsn zO|99^RdZF?%FRxUnQo@dtgB|Gy&EV}_SXM_%sp6K-5uE)SR_={U?_leBVDflj2AgI zC?VeCS0@3U|G*|4UT}m-*e*fA1le!vpke;}T4oBIX6^UDvo$Z;*Ii4CBy zZ;0VRpv2su<9vKzXw`iBjV8ll1@eMmBc=2viP^IvG<1|}t>z&#OpvxhkW7YDn=BMQ z!mdBWqs0FJ78pqmh-60&G6M&+3^!;=moNgmG=cByqaDKxsUua!05t@SmyrNvM z$V2sQm=V86C^-bCM{FFyPs62fD6AagH9~?!L2@Zt`vo5;a!K3_auXk0_J@1#-AgjA zgAZ;>u{5IDsehZGz^6yERzHql8Hn<0s#Ix!d7AYZWd^(;Wq>!RT|k4#A*xeI(-cIt z>uMSeY!13$8;=Z?%A$XX~yn=0-rvN1%scl2-bmD6CH5(zOIqSjACy%FpN~F6>7slir5* zgvX)mN2)eP!m(_%`Ex5CF{^8{z?peM)K_{v(^ty(qjL1q)ycANXTuA}w+to94nu|( zThVQld(Bwvu_qHw?Fr@wKi9ofd0Wph=Eg9)IURVTAq$;n>Hl=!pf`R2mE>Y7G`eak1~TRHQ>j3fB+EUdCZIT42EJ3r$7!ceEr*T^m7Zk zxvoF>_T7tt>@-c(;SHgpDA2Cv54$$m!!SzIqN|#Bt_mgX3oI*)301W~f+I^*doaJ{ z^@KCdodrs(Eou}gQF@14NIl_|BrzwMjc*qEi&+@?+EqJKBraQ|O*19Om?a9Oyg(A} zE{Eu&JR#H!yln+{iv;{QzKht2xM=VjqAVOm^)JbKJ|UpS{CINv8b>l|p8Xp(u0GWP zH@9UQiuTatun_bS?kVYwoSlE;U;U;P()(4wYZ?)v))VgOZummjM%FPpBOiT;ADJzh zGJDXB#jnUEL}7I~q9UC#%KF`# zLNN0)mMBe5o#~kV>>-E4La!vZ&50S2>jSuTR#1i#G|4}m%BTXNL_^`C2S|3ANkh8M zXuKMox$}d}Ec`1uRAHxG+ZChpUv#%BQ}bW2k*V=ZGMB|JIk0g7P(*N#}N=;1qP;J3VDVNPBHU8EevD=?H@7AZ@Lmbs0q&dxXS) ze}&AwF~y`qP>SOX?ARD6S0u8ZXZ(tPau3((E|M7m>8La1pLh3muq0<7!S ze$S^+{Sln?wIF2i84C=>dIhND&Mn@ug5p8a0ve@pDp|YF}*9VM^C(z zgNxRHY)9URo^-?&1H6yyBqLRTY%ah$8w{w2wHw&D2c8XBbD-;vh1s{|!Q~qkJ?{3} z2hfD&)dRm8lWNUN*Ipw#siz%6d6027O*yiB%k^8Cm_MRc4>8y0TB#e+)($$~>vY4; z4FMi}oCN6mAs&Q$py>xO9B_NXFpkDNpnPM}4(XpiA@s;#yLDVfoh(`}w3L)z- zq#wW=;O$Y{_GOI#wd4@)K^{2v7;}gE!&e?*Z;0%Xbq{n8D7&=Ej!iOS-X?5p<2v2) zvHcJxly(VC4}zZHd{k+NY#qQ^$5b{6X$NkeFt^EVM|2zhT@#(x3EuaX9T<5Deq-h* z+Hc)ozx0#y4yGQxeMEmk>#!K#Iu~&F7(R}&Mj3pj(j)FLpYC;s!tMaBZvhSH{7kcB zaWPR3C`Zs=%k5bF?6>`X*nbW&M%BI+Ek^62#~uJjoL{RRP=8IkWB9T0_vJ^=-kKgr ze~iBT`>;Om-J^!TQ#p7HB#{g*=;jyoF;fKxt*{8MQ-P6;GiY#9FNju^$g)$HM6ySy zk!hzy6HP-TTC+)&XfVQ6rt*TPoNCUEIy7BcSi)JRhzD&q2s<_PP%l!|MMF<;6D;4u z&JEwCOf-EFd1?70^iuinO{pV+)Uw7KxJCr58^>EpBT#BUh83TI+j8}}}Dv->godrxO{X(elRHjWj&~xmq z%z}51fGJ-dQ37v^f~i_|z?OrY;RB@nP z8v${QSQgXEm3{Mrj7Eqm5TFmi9t0?ha86^O)ho~hNHw4W4?F&`*3;MAh2I`ou> zii^PUP<`EZmWQxc?0puy`=Y)$NK_BXG+=v&vvSB)j{rNO(;=G|i7y{0Iofg50Q{jB zB%EvmnD=o=JHT-Qotkcq+n1|};b9&KKSYuag~@a2GF81u;N+2LS%i@7cWK$OHtf4R zp?yqUY}kJ1U+~pnmv@sxPfE?mPVJDnEryotft86_PA>LdZbv4aG;EfS860u|z)tG9ty==vA3bY6@z?S4(g&a+4{WZW<8$bVf3XaAlCy zfh~)a?w8i07QnvZSyaVHO6^q90rEpur{XeO=xj2mSlm>~u?!`7m3qjQLfd$!H%-4d zi<10Hg8UVDP4++p2FyJoO%g}1d>ruJz^Oe_g)?-*z0=?wp>C`^d?kB$gZf~X^cF_t zBeVCkJ&XF#5tY2RCVR+zyOHAUD=$k2UGbAdXK76YnG+Hs9<*4LP&WVt1z{?TChHznz>Na3Z z1mqgYF9c(_r#SgGC~o-sK4l$vFABmi&m%l}X~+WQk5Tq|9|x|3&<2=glvEr*89 z*un8nEE2b4qz9~d0-#&rdeEr>Fo)_rPoGN?(~UBRB!3igh}ErfO^Wg1>6E2U!2T}U zt^Ebp7M@oBPjSmfs^5z~Q1z1O4Ixa#{HSyX>?v#^9MXP?cE@}Ua|=cO3DNZ-I2;Zu zjCzxZ#=xg8_<_jSyCanCl=Mg0C&jEoHRRy|PiX{jnmD2|w3~o)@&rA$`DzBsM^n8Nb3xn~*YXIy25M~1=ryt%_R}endda4pg9P?RZccHYh#5Zw zirE}rPoV(bNk9R#Q+N>C6YILuDS|U{UuH8Nc95BmIVK9(Xg#@dq_eWF%6^ zhY(9FdJILcRI$AI9-bn{k|i^tFD6}0lakRUNryI`r-_%Gm{ye)q@>m=m6SZq=*Wna zEeRqip-%vGi?9+e?#IK5Uoy8J^z*7;*lZv?bivA67Wxq=VifA?_fuqs>?(kpR5p2G}QQO4UP8U^3Z zPhFG0$@gWH`rGq*p3rqR$5n*(~i zFmx^(9S-C;*pIEI3hRw)bF78)(kgrlod3n@iHFZlStbs}8k&GctpwbKZ{@zM_|%_t zhC@lOkyxg%-d7QgMvdBByRu0G#OEwgpY*6lj$5^-2di8UZ?TT8Ca4P;KM4|43)2#*OSevc`Jx-$NKFw_zll zY1k$<*mMwky(kY(cu?ZCNIlgu<2{ql?5{;2fCu zn!Jeja)~e=RIC0Z*LeV8@E;#L$gt_JHp0)ix8uq-Zlft%s+^7_cEs5x?)sEbuePJe zIdR9JUuYwMbnKQFqgUiIZ_n;Hc}6|gg$-$Mw6;3p zEe`a{W2?hM%xu`H6YN71h|~e1j?_z|2bOf|xkU4-q#bJ2$zk}Rdn2^O^>AQ73aG<; z7d1}eHS~qnwy704-HU=24SHLKQ*tO=DGuiwJ$pz^p6Ep_GAA2z7*4k&XNK?}A->;N z(e$1MX5))#(%BC!4nCF#-XI$pc2{hMGZu+wRnBQ`Z%o?-xCyq>rwl>D!fBH#@UWKf zC0Qp}25C_QdUT;U7Xby0IAr6{6ons_P7#G`8d?_$5-Jz?)W`8H2gT6VfkvVbtBa&o zFZrtuKtJjm*~p#+jhyhl%)>etUag_e++;b~t;a5(x`=7EvidUU^*~OGb<%qha}g02 zvX6`467qe5{NxvB>(?%?HYaEaC7J^gvJ&;8v}58+Ig;RBoGwYK^V({{tR;iaURD(uwG96uzRfx)WV1Vyg+=b2#1;+ef#}PLfBw zzok4A8D1LQ9%e$AgTXaP=v;g zhqo>=J~1-S6YX~9`^Mmi*Jd8eE1*s z(TNs<7!>$Kd|FdPt`;c7YZ$tVg`6ebpq)7GBx~XRJ`gR%?;7i2Ff%2N;&uYOZj%2@ z&so@qy3GgA)8Ma*@{I~pJ|1)x(Em9ui{;|4FzsA)(`HD{$QIvdcPDjMQz&sHLgAIXNpl_d-$ z7TVxth~mM*MIW+2$U=5T0V#!Cj+9~G#}D584|g9Gb5x+cvZ-5)KaDlTK5z&R$#C%o zb?*hTzEaVWdEXkIEf=`#3-Tu@EBeM4GZ@04TUIaR7=!FK2k#XMOqVJ@FylmT zlR7s@{K&aZmlwwS2|w_ow7 z`#k>V9_O7;Ptta6D((UA9V+8O-ZAV8HZM8vDC#lqt>g>XFG2s%{*ju8fFE7Sx60&f z?)bh}K{6d{y2oIO?3>rVM#K-i*b$vo1U-Y0S z_NdQa@E8-nO+tNxuZ{`ZlMc6O!T+IS_Z@`?^@jZA;b6WDG!Dpz!21;Qg2ZUFV97_Z z91Eg;GXzFwoi_O@SUzeZXWKtc?lNH5K{@^-xS5CM487GmW8%BP9}UeK`h+Ky--3)t zHc$*@voPC~%b5;|_F>)JwT=4~kH=|%iPOYO!C*%0Gb9r1NW?yRFb%Gf4GoLk15!?3 z1^_cr?+Ec@&bCQkfyQ+y(OkcAo-^hL%)#%cK!5RlWDn!_ZWH%`kGHY)qrTkJe=|t& z`qbfrSA_jN56itg!1#{uRQ6@cLs}Q~7GJ%H(``PL(W{@DPZi%GN`%;6ov&nN9|^K; zPWron5K%zAfxK+VwlJX8X1#RFpUZ19OI*56CDU`466b#E?C7xu#N%d7^4WT zijj0kQiN^8RzC1G)=Ebp%lPwHqkv9F3!hdwRMK*Q99B)}#gFKwfv2EDq;e&&Waug2 z7+fF)kuv1O>awP=>?*SP`#s_-x>vtsXK~XsdY3kPC6Z53Tih0;$n6f~UUhLA7pEW;kZupxkVdEsE3D~Z9cid2cyGSknq{v|Yvtdz^>QQzH&Xkr|IM32 zDO#gx%yn{OZ(eZ;uJWQgHnUb;HsvN0+rX@yj&4L^-nD4RRgzLHvi1tU*0}^z*Hza$ zH0oXjc=!j1l>GI2wMHBIJE=U~iWIEbAUSX*9msK%Qo$&B0LPe(hVir?+L(@U0obT8 z#39QOd)qJ@2muh4zo7xk9qr_?Q0~7LE#P04>kB8r;ONBsTt{uvh3*QM|n3A52KkpFGqIhqNq*&z2DBs(`pvVIozZVtphF-ZWej zB`J?alU?&8Dha0AP`**t`L%W`t3%&|h|e%`Ju|uOu9e|CR)1-EoHFvC&hP37TeF@3 zvmPWl20J3UcEU`U!KPCj(^Z76*^ik8b5e9Bw)yI|#p_+yF?s+AeCWcR?Byeb;5)0&vHpWk|F{0^ z9#Kjkrj>yE`ncD9WY!9J<}UotnS=^cy=L=~>yF)FtcW!5_T8PfZ#Jpj-S z9bLg%*0DRt)&g{A<2R5Ysap@O)v$Z5IlEkp7E$?vKq}y-8osn)`BBBWcqFGkvIev) zMhkwyYBiwG%n2!vpqed8>}N+p$;c6fYK8{?oqr5}4Cm0B;(S12{zI{`V8BT7CwM#` z!@5O%Bc}0jr%IYg3(Z_4niEa4oBFVKJRcHMZO+huRVvjmbGzsqC01s)*!+eol;5F* z=iHfH!fMlrVmVeY49iTs-I#;8$YQ)|(4hnqtnF6@yZ~K!dtl)&O(G3F3$l&Vnt|Jd zhka-Uj}gX47pqiYd-}y@%p2eFV<-6m=%M738;xx{e4x1T$u_FmgCdq%qZAjpp|h^+ zFoGAoEb8`I1$=VmMm;{cBk)xfm3o@Qrh)sr^G@F+Db5}zeKJ20P$V?sL=13mYFXYB zwiWxd%cJKkN2QEgOZ)w`tmNwPHp+$5T*;6T{EY59WkDswk{~OZYC3x6FDAZBadG5= zr!hR*J^@v<@?L!MN+jLm@eS7lng+>hrtF6Cc6Ikwx91MLGYogAyr z&{u`s^N@YZDaSV4R00h|%|))Mvrb`XQvP3HN0VV;0VSDdLe46u(z1}-A(kF`*F5WA~Caw2hXL;lQK0211oMV$uC42lKo?R&w`nB7CNnF@=3!es)=!{B~*5Yuz zrMQGlb+>x>``DSCuos)Du{G=XGG>jFHB|_A{}BQHk&3m^;_CG$i4nz?4(^l@NR2O2 zLi@#s01FRv{J+XlsX*SLvaxZkAsRM{_breE zxSKCp0XyVy4V3WD-Mz~zu`#b2PkI0e-rO1oGU*>U;OfAyBqOIbk&?6hjhe!>4Y zG37sy;`ogV=SKgC(zpNOCjR`7dyb5qv5U2dsD-t&iKDWClNAZ$e?@!!7g;(@6>Ty# zl}Zv6wMCpixWt!0^ALKWSmIzHkqk*M^ag@>OJjTI(dY}E>>UyR3-BLRJm#^mL2=hAfzFe7pg%-i!qR}1kH8DIEO63?FO)+@miJ%I9ID)`BnrdK>!{BmQ9tI7P z`y>_6g{J^M+ZBbvXWm@bSw&N5!gf8qpTvNNOWB}ecBPZW7NZ7MbVFHFgdVbyhfCT? z{3IndhH^a#Lnv0B`d3aHjTy68fuLCCFnA{6Wi+B}xPeGMDgGvhl$Zv-B2s^B>`T=5 zy2^j9gXfsj?FVlc>un=k!ycVxf0cx0o2)u6)W9Gi9Ll7KeQL{Yx?w0GmNtDARCQS#yj?4?w?L$Qoh*)6;N{{PgH{Mf+Y&Sq$o`VLi^)Rb+P{XNx1#6wL7>u=1oXBYLQZ7iLeh0Ef z^{QMVzew)AhG*0kxp8HyP}`CDl6w|B3%b)BQ)Krj%xlKOF6OThzb}#M!HAD2b*cBL z@+SI`H?BFT>n4Ww(Zn}q-^J@0ed1T$kN+#Q`BpTLar(V9wS77?L%V|ekjBYw{Jb+#UArD!kes7W*ibQ1P@co39|pb z8-+n0{K(TBw4jtoE5j!?XrS=@RTpdVZNg#j8GSr?eav7u7%xn-biYIbtYg%L}ll=XbQ$Nt|v;6JGHNdb7qdjI}AaG?MI z1pmiJ_ zfE?6NuS*tpk0bLD24`&`(2UqW`ivQ%nH1a2(pkn zG_=rCIw_4^AR&qj*`%`l&4$+T_X;( zorQa3adD9KP105~3@n{7V~p}CAi@Lo4vl9D>)xoR37Qd;bX~=EL$-Aah6Yp|&`?HK&W) zS~K+gOs>ID`Waorj$V?fS+>}QB6)8(Qq?3x?tnc8I3rOoHOG#v=~>RIUtIYtZoWF0hp+A6v@NTLSuA>dmISnxT^FzVTVGsuo)7H9Ovc&AQM|b@T zOoJ)01Vj)9ssQf|DusP}&eKl#?`KWc+Al~yQ;FPR>#WYlD2DWHXc?yL-qV$%6@1pv zhLaC8O;w^cR&&yquvICP$#EB=W^+Nn`? zR=70T#-p7xhcz+++b}xwz~n_T3qlP0`g;nAfxtptD~onGGKM%|n>gfp;xnXjI~(iW zV~O~hvo?9q28&%24%~NgY7dcwn##%Y2z#`cF01cEXe`{Z?}YDZa+84Xd9g~+Vy<8M z^=gb5>c{dqx5QP;eJ_$q*Er!ZU)AF<^f?~z!ALmsUddIgCXupDAzqdO6Iwd5IUkb} z7;&U-tHNk~t;%8qUFvLNq%04`6(Me=w?eNRH!Yt&3XL8yr%ulcfRqV-u`CwA;b5pq zNG<5)me&VvnTW7S*z{9!8w~@Z%mu;FBzOl{oAvALL`A4y6A&p|5|;O~Z0a&|@_TqJ zB1fjyf7@3?g6og9coDWY8#jaDxQdo1S(dmPNBGF*2tCyz(&nFH{9yMMsTMv5#9D1e z@b}N(+$~)51J~;p3$}-L)gi~|du9PLk6Uv|;7v09aV}KicJ>KbZ_QW{Q z?&yymL*+iPc)Rjne*(}@zpasL`iN@|r^y7f&Y?c8vq^var_MtpnB6dm_c4n0C=Urm z*k_T=G#Z_8*=z~I;t1|Bq26)uZVSWf>SJNO{h9clH+Y3QFblV}3rgZg4Z7ijihaGQ z_;rIX=^k=M0`;&`YG{0x3B*X=-dC>yH2zry_Hv1_}_XnJd)A?6CojCAV4%=l7j2201*eV z#(_xu0cqhT5JVF*IG7C@Y-^-iqNJ)+<*yd0T3gUikqBI_0(Y!hs%&mdTUxxVs)*9> z{BFITPGy(^l;3^z{QBnbpLTuTcD!ag%>KRPeZ~!*Uqslc*;C+*ZH$Ub@IhWntG$L9 zYXdKqd=OQOD9fQPTo`%6-OP(4v)cSz+Bvw0wqVBQKv>9$0tlLA2|Y73}W$?BX)5~x@tW~GK>uz>7Z-^>+Pk#EIM@N zi!Q;1b7{VTPd{Ylu&MR}T4bx?iAPVb1-{bArRm_TC(tZ_zo;eqkUCMzqP z&4~P6D#U(pQhxosz}%oaPjeMnqCVG|=~bRu600*wfp$b>iT{L^v1W9v`!y2A9G;*E=hO z6vYHXP2kse3y>_wfqn~Ttv->JO7;w214rUMJHSZ>dW2}=lYresvJ0Q4pcJg*0+Yap z#Vjp6X{+G3b0wQODD9I%yrh%3VocoRjH*uG!+wEm6^!Q05w$s1oFxFF#&N-tX3*+G zJEt>STvxx?*^;!a&HVyUlMCT$vaZ>;X=;@0T@YGxXi}sGfG*R>0Q3syni#s$c)mg<~}8^S|)qBYipptf}(NNB=E2#qwPp9Ie=W8qT%4UL(f9|6}*aBPUCCXEq- zv+9Jtwdo{R>mC|IOMP)^UHz$S00Vs)wfeH!U}u|ucSKMCRL9^r_UDBY7@X9D$4gXs zq?#XXD#Dett25cmfe=c3^2WP)0p~T?yH>YGIn1<5W5C+}E}rGpa59dsK?V+dpaC_l z69?*vnfq*TZ_g7G?w~j8Brv7kWd7VWe6d|voNY-QHo*gOp!dIT+JS4C!Kqmy7cgQf zjh2*`m>8u28ecps+G!?FyDjc=&O9sXV2R6kq%>ax@Kr1Oo6k(@vz>Fng~xF2``H|4 zx?mmpn4cd~cKz+VNo}q?0f1(4_+2dkzjWs9j5lM}9S1?hm%*?v^ZBSHztTNA`9qVr zC)XGgLo-|5LpiFkvtV<8wuQ|%+B?E%rBFR1IaKY!V=#ZzoCj;n@7w_UhnYAFIRPSEoBYl?-zMg)4z2Hb=?4bQuAqoW|G`Y|7 zG3O=${=&R|=uA2X8IFaGQAf%t!I#j0gkE8OqhfwJtH#Xrc2>Nt0V&CvcN4r9scMeD z6iPdOHuCV_V6!tBRS=F?sl;YiVq{tZy+)RiDMZ#-iubs~)0b;|mnCqa)@9x%+MZXXx; zFS5YCgLcPpYWA<5?SgZK#k7WD+P_!qjo31G3)^5llVXW_EM#f(8Cz9NN|K}+r7!S% zyq%+Cn}&BqxIl~Kr3_A} z25GzJ$ICBgjqRy0Acc+}Ir2H4jxz%2LWv3kd#L#5qy&PUJpl4gBD{rQkbjiFns?6) zIWTgfYjl)u(oIK0Ev2cEh+z~cL`_3?EOnwAOIMz=RD&$c!Wly`Xh$7cdYDM}n$gIe z8FQ81g<~GCk{U(NeL4Np3COSxr5Pj2TAOLCt+)jc0E_03Nc-ta-_OZfJt!p!7mcS; zc&k<tuF%qP@hOH?MsG3YA<9M+V zjq|O`;-pZ|J_Q^}#bZMY8%D*w)G6no^3us?gLWX6DT$HC{nM_4TSbIyWbH1Ip_M_9 zp?8LVVXHI&*s?wxr5x5X6|SAxMiR^$C~W22N04U8)nNXtF!5U$b`Tf?-SHZz@yS&) zm?x`4ve}&Rq9sG4b)m#%8r`7QG^kr;^(YN>5ui$O7qx<;wG_s#sneTpON3q-x2<))gsWzAV2InH^VG;AWwy0|;#JZX%1G4CGc3UEU=mu^4iar#br+o3CN?*c2z_&CB&dpn^SqP4P!}YD#iHf{ zt>LLqgiB@A{>Ct+V0r1mz+1haS$aEKw~Balx*Gxn&9x+*|U z2u_@UjMRF6!yb;I$%HS1o>gw2(uJW%#6MAgWjvQ1ZoJD1nbm14mPCd27xM0W=h*he ze(LnXd_ObY8A z$v9%AaahhXTc6bHHlmh04M zH?0^ev2l`2um*3tP!?R%2SQHw>dz-yNRe#3!6j`0(!mkt8Yu|G$38NsH6XJm;|=8?=^bVTT|P5-K)EhsHJUP4uoUCvCoVg=Agg{d{`UK~+# z8d)1g5nhls7iZ07KJ(52CxBliUP!&4{iN*mM2lpa`?>aeq~Ru`(h$J8LYN8 z5g6HsfC+4|ymxJX8&C++Zj@_j;_$X0hpI6O<(SQy9$KtZa|`{Dv8yFvqvcIhU)&8? zRF_;1Pb>!Ox%{JWlw^w%bbkNmf=Ge7^lxz*dz(wfQTfJ9(PLar;CW7&yprrxMyA}U zB>rF!4p3Vo=vBl`d8C-8<_6@>6-^ilzw8|6u7&0=R~`=8Q~Ikn!$vW0OUI+0>?c?r zP5e;CvtThh*@a7kIq!bJ2dzOe_dk;p=b-kkxE4z{Zux54L33>#yqeg=Li8()GD-bn zNf|hUzYbM-1^q_ZgE(6sz7$B$YMfjd?15hrA0g6-83sL+`aueE3Sl-HN|{N^#vARi zG5^VU69R5E&ES`}VZEo@VI9~0e(5-Y*P&wjTjyt|46GHlDs6>UcYUR4gk0)V*MlRK z-8-S${e*@0cIniGxUKT-O#Mf+zJu{psy)v8YH(7{gSlrNg;eC>I(icG2~7|TXO>%6 zyuSy6ouCcFjnjMZgN%nQoGwrXS*f7z6G)EJ;qp%~_qSs&{`@R^)8ywnQOXbp|MzBm z%IQ)eK3|8tYQvg32&ZYid&Irzke#OW_GehVOI9&^tJ^tQ)LYyb;;XAl)KzO{9RL$m;cK|)Cm?I_F+yC#a-ryF*Ew4 z-DGOCU<5x*0);ordZ?VONCv%@iEuo3EAb>pTSn;KC|E>sOg9r)n1Z(2p1QVPRu2+mwKwG*I7$$yx~qe=l<0$zrGN?JwZ;vxVZ?keG`Pu1nf^zP@1q3CU~X^< z0PT)@=HgI}BYM*@lg=#@JHjT2&$Du1Br{Gn9#UPrTH{%Vp3WZZcCGWZuu za7TD#h~rAFTxB+nrEG0%ts*jL3?6|6bIYfYFIFWHmR&Fz5^|Yb9@`BHvmf}DY??Vg z4gVn6i^94DPxN^x(hgI9mNalTW-e0z%6-7EB>W0F;9(CFH$PrRgWn;C_v3`z_!bAs zcCG?Uso42rQitNmW#Xp1ch=_Elzh?5!Ku6%kv5J58auE~;7O0zywC4jgsP}R`iji< zO_{+XUVDV;2!+5^Q{I9}jB*fu1s|azJ~`o1hu-dJ?JHor=F3f~obTvzEjZ&iO* z#P4S3iS7r(->^BsTAZ(-AiePX!fVT527Gw8=8(*xZmm{x1=a4jNqR?|O>*;re11KQ z_`KLU!|QJy9XW_;ET@**2r5F~&b>VfD*!x8^~| zp66IXc&U1UG+A4QkimLCSm3;JLt(+1@5~9Y95}id2cH_BErf4V^u))bTuHM#c;tYQ z39Djw7codFk^Ey>!HT}P5k{s|c(N>ikJ)G1_9lN|2LZ}p9=WYQ_f*L3Cio^=T|gMx zoq#^Nzxb?Ppzpa&%^BLTcIFp2fKKeiz;4(7TKog@wKD_ixJYW90pDMd;}G~xt|S!h z)uoP%IYcdDuE!n6X(08T7oB2;`2_9Fr1Y_vSAV4t{tQT}EH6$B<&;r{U*5O(y(r<` z(M~~VPtVCf=?Wd&iq3-`8n<*T+$7ai;o5$PA@r3r)zB)%yaQPI=h%Lr=f0}N#}{}v z$aVqIgp;hMgQu)4+%%jbWZmVrI0%i3)vX4UsZ6+^U{htC(D!#g?gfqtBUzxFhM7B% z&q96^zF^;_*a4f69DHTYKpIJ7iKgD|c0XdAoqNmX=(D~5qp!yFQF?*SU=FWwYxFVU zTD`4=Znh2|-W;HHOXJsACBg&bVeK>Ptjf*U%)8DEb@k)Et|bElWoK35s8+<4Y3DcZ zl$}&s3OqenvPAC>>7^WhG#j{+LbdR4uy?89%3AvV7?;UY???KQucqBwgj{wjQXeYX zYe|vB)+U&$5s+G44bNQExY)4xm1TMmwGC)*V+e5zVQ2lsgVp6I(W0RY{aPORJXSqg zaX!P_0Qn)=nC2{TTv&6sw9Vgb50U#)>jsQih&!CjT6kyVidH%9RLNanCoes&K~Q>{ zGV!+Mnclf~vWX}O&l(cR-3;ZxT9`LsYR*(d5Insz!g|3C_1^S_<;-HF7d~8DEO|fT zKju{zIW6v-*}rL-zI9yOI(7WTZSu-3GS3?L_EYl+b?qg%>po?>ij$Aj9E=d>**5%b z5ENocz78Hy8#tt_rVYfm2yYf$z&ryU7oqZmtBMdFa>=<-S0Sbk_$34TX|vIxz*Fc_ zF+D>7u-a9{zO2uUVgkRp6o+N8o*SJ|Vs#qg`@@E{oKX3ZBC4xGlL~??gj;$`YR)6! zh`1pC_@p-xKcBiUp@^9~g*&J8pe?X;eRkoVE5NMcg*G#~Gv^0u)W;7#ccxfkIalIw z>5Dg`_V!fc0bTu9uu}0&#Cr~V!VfOcZ2z$D7I3)4y)%o22YCgw%fh2ROqIoDX%bjD z%XYP>18asAyc}`H#k`jPkBqf5o<(D10r-zIZCHfk)Y<($NwFU5M zGoll{@)Z@6Mce8KZ7R_tWoPuRT}?fdk$W*` zZh;rve2;wj-z4v2IM zWCrBZzalh-AvMq2Pvth}ZTgUHi(|Blmh}jDNn@5fLUHT^5OB^)Ykb&sVm*DE2Erc8 zurSB{{k-4{MuzKQy+ZPOAp+Kc9v0JZ>*LG<)z_m#&o)GE=)7}sYbAO2_Q9d*uPtf+ zR_|hFt}9?tQ=RAFr|UrVPi5P~cSOy82C?)M%w2ZJw#|MGX;7AdC7S5pm0_O$PV%Cy zUbvv$1C&>S&LrVzoZBZr_9|9^uh!HGrq)hLAw^aWPH9?Q@}pfBUSS&`U|W1dauZ+Z zS4RJY_Fk-Q(UYMq!?sB3+%<9$_m3m`{I-PJqHSmDtN!y&WQM?>3`l6dkRAqt=|Z)I zL=5(5-J(4$uHxZJ^_f7nvENy|Uv35u(%p{vrJy|}%HJvrglhQfyXJH?qs~IlDJ5Q^ zEz5!NzV~0(_@5P#JAbd9YuwIYRW)DnV+aIpz!<{7T*M(Nof1H`G>UVi06NCoc#70` z(L1T?7BPyx+)Ac1x&ILI7nmA z*C_oB1I9IBd--fV)N3@A_Pm?X@tCd(2K8e+d^|d|7JRf7N+wZ(ArYApTcks1uxHx_ zOZt=YQB9W~e*^a*kzJxTRc){DV!wiFnCS(7iCZLtdB&$uO)v?~ly=Z4XpsCQ}v%=bsnSjFxv z{U>4g_%uG?7k7k$144><-SEE#AVKs5I6P1)A4D#TM)Gsy48Hu!cL2Ga=h*c#c|$~c zL6KjGpFe7znY;dP9$~qtLg!V6AU<-@C1)cV&w&(W=!A{|zq>!GRGDAh#QG$jizCj)d3KXeW%B~h$@J0;!vbuJ*?b2E#qoVr7H1-}6;;oPBmn5mqA zIKfB6T$Oad{TFC&IY?gX4d&gg<>_ebp^iEZ0vxJw#02?i5z^unYh3tcT1wm)8bziWeG2^4oa^=MA;$G*FWHP zs9`++{P`7uyFu=F4!)z~0Z_@WArlAixuej0dJki=dD6iC4yC zxn*?VHUEP77(P0Le2xjtsc&_R-n0{2_%`H!UceOTD8uD##YA-t!WNt z?o)?HWd%Jz=!B0XUn?W-SY);*(~EW$w(pDC+JkTV1!-RcY{Rs`2e-xj2A@7}pPMA9 zy+V^)(}c9v@z6+npCohunG9NGhl{X-GVEz?c4cZ)x4D>+bo1!10p0dc>Kby>=#MRmM2GBJ< zg-FS70)Ff?@kA%Hc4467E#ooKXjDv{!;{668d;(%2)m)t2-a(Ip+PE1f@C&WChbq2 zAzm~>Vm@K43C91%#|Wxhj?$?j>J|a@FNky3$B>GbtW;o@IaxV1C~eBT-5rzbxb!bg z&!hkN#$j4zo&PO*pJK$J`6jJz3`>s7xj*d~FdQdZiD<-LdJ#=T>B+m+L*z+CED-dW zXO-u06^@)QyxWoxXgNF7F#crMNZx(28UJ_3Y_#hKFU#=lmz0i12P&uwtVhz-zdcx; z^Gkz&^AU?2dfnxrT@TA}f?7Q*jnrQFK+B zt|qn9IgmxUi<5VzG^%4YP8m)2#G!wh>Xe~J>CoUz?t{6+57T1f8N?WSbUU%SuB&<~ z!bN>Wx0y6t{mi&WHj?mZ4! zU*;^2Ft#%7Z|`8mM4@r=FvZ;9p`;HM&Ch{uAO<@Q+Jq2wcSM_1V)HT_3AHJJ9SX69 zu@j6=o!FKcduACW>174*;gdUMGv0suIK@Ax!YQ7Ih7df& ztECNT*XACnVh&G*)bcvp7I?AGa6#&BYWGu}Eu^2=cvj&I>m{BmI6LupF3gtmJGp~D@jgg^ z7RjwfGCC$=#D5EMjL0$bi3p_@dhSoViLaV>EXo{DTN^xgTvt{kqf{-E{%74MSzwZB z6qZg{D@b-(h;lCJ#-nxPT0=}FZ&%tA9WgL%@Mt%hArfcVO=^@=$DJY4) z>*r?NHyOSr`gjQ`0j#qy5pbXMM@Kx>gttEHY_5B5s`E|@rH=6obL|dk+0tmJ4i#4W zQ%F6qq}e{n)jp{be{IQy&(r;fO&&X21BcFvoWm(dTdr*q`aH>A_H6?8-}BGH?c!oq zd?w4Hr{kLa_O#hDspM!5?rpQK8K2gz|Gbn&<8++$!g$n2;gE`HWlXk3v|;WS4+L_< zP3#0-NB&q>6^7*nA)vI4ra6WyUPHDM^vPvt81{$s1EbyE@Ft!n#SPU5*gM)%rAM1w znlQ(t&_duD46o3#$h8tZikfG156`lU9^Uk*2T6g(Eo-K2S?ScOQs7c+=Qa$+72W-P z4lHr-wGUBiPvZR`{IC$nnA+Yp%YeTrz-rO1z97V!n$ddAx91l0t^UdX+9v$)NCA^; z6|Hd(7u70)nv9*VXF4n2?OMdal&v)i{+#lOMynh?o<=cK#v|J*AXlJDVXREVg{Vqf zRK+YSz78(2ZR=nTkft`iy>9MkO43cxlkZ-as4FDJ9Z1~cHSF^Oxs&GG5d-tfGcqwh z)7ttD5f~2bhC+dTY|x*Kc4t;7Wk)`t6Z6n1A3rEOC;iM&QHD3bkL+a~SO7m6=wupk z6dPb{luKD8&D-AkEBS$#DZfjaw;^Sw+<7mr&-adCro(ee4Y;-xM>&2XzVSLFTp1s5 z-L|eJn|s8foED~1!RQ)7_x2VjTuZb6b9ao65q0W&x3y|0%9!v7^*By#QP>UDvA+V~ z4a)Ha*wU{tpB>@uRa1$^)0`;hse;!fYNMNENn76AG;^0 zVdC)PO3j|D6S*De_F*ZdgegiJZL1A`AyWc=!hZkPwe3r{1`9B?x4Zyk+bj)47ir9# z3}vdJ*=hn-Oa}m+SI{?nHj#Z^`on;`1yoWiz;p_~eCHjAOX)|xq${zHu0gzegQ$T> z#Ly@5ABhX*Iex&U(Yr#m2iw2h5kwf=fjyu-OJJLp;8qn2zKb@kjWfKeKB7wg1q<0N z^ef}hDUqM2AzaHG_ZJ2dETh}@gNZ4x7t5=xNFLu17|#$e^^33yQdZf4FVIabg=oYx z*3|(r`cxZb0Q{uRs-u`%NJ34m){+DEB=ZmKnSh6BE=I=EH8OE~up!6V-gU_z+)dx6 z9B5GZ_WZ>YxuX19mA|q54(dN}9q8!GC4cKHiI(N63YxFXfpvnrWNU`G6UpSHB=|+8 z6t*%dbFE4k!PLA`ORwyVc)5CR<m z90PU^@t$W3aG-$dm^KPjol;Zyl-LZlAJg)jo~yF<)h!tw`kGGRlj6z27&?T}56IHc zdJHmeahuu`ih?JYx-B9lR@77+HjK{;N%f9(JU&Yx<^_`RSS}z0#CG^&!YaNTzxO3z z5k7$5pg}U-;0os>Ksz3LBd2p1!Ut8Db7pVB_hDwT1Lk*WI>52@7&p%ZI_Tn%_NApq z0FC=6bp6kdEwF|~4lyc-!4zwWro}D_a&i)0OBaaT!D=d3a%(@(S!sb|wW4NF+y-sG z%&Ng!xqiSGy5#UqvYsZvo^p-ztgYjQjAL<1Xr^+VeLiLhP2exKi3dnf+)YzH=VxAF z1vg}-TVo;T?Vq9rg86DrMywxvObsocIUy{Zl2dT2soc!C&$@ZmQ@~7R)$>e+3%V2B zZT~JUCr)^#S{Fj>uMJ%+#i>`F)tZY{fn}D=3JcfBbI&w(J${m5Eoaq~S_{q#5OFQJ zp%!S0@V_iJ#HOqZG&aCFWjf|z?+41o9xCG*BAkZ~v|=?Ty{6$;E1IWo+yvQnxCoj7 zqAXbfqDHNF@j9xFZ#1e?rb^g6K*ZOJq1D4C6p?xjNW4z&0|M1;t<_Rf{DL9vuy>21 z*9F>5td>4;Jlo4fISa~com$vyH8~x34mO6Ho(T^haSJ3ZS=niPhihyBwCGB)Xo7d9 zk5;tmy6K}9TK)d2Tw+_2EB}OnDse^mn~@Y;+bbFWEM#^Au6SD`CToE z&mR6Bj~(kC(^WDOxKEY>yF-$9YJi3ns-_nDAzad-t^BILW$lr2JB5cWfMFzvT^P*!_KAae}vmmL1gwJ6b{8^eSjt#xC^kyIw@QYv9>L zPG&(}bF}0uQz{y%Z@}7SCkTG(C`3;+Dfdy6$hL+bfoEkqIa2fAv;T@5|FSD~!8h5N z^C!kSn<#iFCnckUm^Y>>phTIs#N?%@9rB?j@BvQmn^t2K(wS3OE4l0x(4kjd>sop7 zb@?XLJ0Wr5mD8b@Un}nPmDjP8U+Y?aN%;l*@1n116YwQuZ~%aKcmM#=|FP)n|IVNz z`A^NNgsrLF|I)3hS=nQ&q5jl5m!z;|tve8*vpQ5Q7N^)Cg>bNuLd~yx5D<-xNXqQo zYf7lSl2xT_=y19ggeX3pGasz5QOoAy^006rYE_Er_C84Nm0tsy#Y)e;AuL`n^j&89SC zPdlC}9KK|32{DABiv!&nD6hMk8s_25)#~F$IL5< z^Oql{7yCfHrf*S_GbP#Ax|Mm*Nm8?-H#ewy?ZVbgI8%PyLkG_$DOtL#M_qvsW6fo} zQ&Z*XO&!}Q{N(7_-6tO#WIAv-I|iSo3(vx>PQirPw>XUTV7OcywaoQMHV(n@hUdLd za;)760~pA@0;H>*QWP_sz*qIUV=?U${jBC`nM*KNSx}Nf=tHR`Af*Q~$|&gF2J6YQ zE^HZZh)cCm)d4Z%;%)2+_D+G{rDiF~&7m_e*jZ0rbsWp_8-k?f9^AqWe5HzRWdh?b zXt>z+QcIhUEe+l2D6OG2%dXt6uY0{&Uv`abbP!7STlcLTjrpEC#MoS{lseKX+nTH; zSmY)tWr|l*luL3NPdyZzVKja`CvtM(%bxVCWH<+zAm9~;EH_5&DF!Dz!KXNS(U59F z{2{f{Fe(_ECpxsB;n|x3Ib2}%Q37RrHJQED$e}A2YreYoI#ZZMb$b!nvAW$+juvYa zMQ+-?54G{3Bbsk#^drC3*Eu|3C#*Lm6qbNrh*S$NJE3l46CnnntWanYBcvCbm5qY) zr9=5}>sRqx}%O#5UW6QDc-*loN7A0fnbna)&C)xX;XQw>)hH@>mzAAZXH0aQK@VwmJypq2-Z)Lc&W?GQyq zT$H(KuVN(CT7Kdwz(fI36>tv2&dxb!E}Ith9IUyiT@)Y%Awo;FRmkI#Wu*e?Az4en z09D$Zxd@|kv6cb-w6xui9iQyxn2scbQ4;yX%;oHzx{DlO%X*U%9$*zz*Z1eZj(WrL zODdv;ixHoFK2X)eJ31M*JZ;^PwF+z|!pC%>)JJO9ad_7=MbO56Q<+OldM)uU*wQ#B zNF#9Tg~uam5xS*I8;Pq%>z~MHCr^N}aVI7*<*MvkOPv*UHFi}h!xr5l)p7L|&l=4V zG)G(*J&-}#Vh7CrSm&JK7aiQDcEW9R*f)!vJ)@J_Th8q-8y~csgI;waGPkh@MK>b0 zFn0c++?ogDudZ|6Nb0>VAa@jX0+M+rK9tem00K)g?l0|OQ`_$tE^-u7@O zwPo`e;Wa#Zn4U-*#$PC-aS4O(IB<9(TK4JTv%;9TbvD*5m@>9$b5XOy>q&LB$p_p_ zUlA=a_c=%7Rrfuj?@`NgG|K!9^54T&%X#rMq8%yx$U2a;h`b>e8s6>Hh&dxWJ#2mHfSKg7=WXY&(&(X?M4)<^sU0Kb&4_jv`gez9F2 z^!E6EfbfrchakVGv-ju^Jin~E$9)6%?{*JNzqrs3d(1)nW1H{z8=61lsi%IXykGP* zQ@@j7?^4$3zcCqKch>|tA73VHGrtqJ2fv1IPkv29U;OV-AM8TRW&m;fc;3la4$!*& zWA^liD1Z6y9jILTD@G7A?dT8f69}KT-H-r}E1G zJ^&CUmtpdVmnk&Ydp#g1U{!ded&|!V0B1YH&=iOW=Hy<;IJQCij*npU5eV_E!26NhgbPk&sw|AUyKsC#c}+6+Iyk z{eu4YvAbtexl8`fF824IT}=9aJa+#-wALj5J7D|2tYbCGdsfH-2tRBRPe-1a>#OQU zE0twr6|YFpfyE#snlPii!ce^sSyOB}9k(f4J$&!%ANlzdP(Oe_3WwV#`7J2;$G7WS z8#x(wSsNKWdVPJrAomz_L$T=XVm!ya^k3o=Mu?UNw^RRuWR*9A7YgJ@am7Bx%PI5T z1><;YlOb}{25~@^cJ!&TZ6Tu#{GMa+o!FTc-ST9|)4WXoG5F1l^IOF<(U%X27y#Dp&WpmsWR+2 zbtLoiPrMQkU@_4;&LC@YZdJ>Y3?%>MzS%DcVqU?RSO|~HATTZeS{560$_e!FswEt> zcxK30ItM;|Znww}@p8=wEVis9C>yeKku*?oo8U_4VRjWp2g%tC|m{j{0NGRq#b7t1O zj-oGb={dY0*EpIlw28Bg*X7GN`q+km)dEJK6ft_P+4GKgCRYbI{$;-0v%ea`EcOgE zp0iOT3EgTJQf>G}8$r9G;+OXlD%k#Y2g`SW%1;EcCSikva{r?kL@?RzABCb1_f(cT z3vYoU-j)7&+>kLn!vEh3va_doF?csBvuC|8f6SWC!iu@O*HWUx znagO~>*4{^r~Q##$BS8my@d49@5d0=I3*-bV7c_1vGrZcP+gQQHVidc6H%NH7`j~O z0*^K(snkkMD4(>n!kbT$Xj)@Iq6(K!k*dgzUYT&nF!bjlQ4XPm*V)vPFtuczd1*@Ee!-))j;d$HxUFt)np;4&{y7f^Si&QzWzneG+U z*;PH+tS;)K-5u(Tg6N%QH;A~G-|@G_)u#z9diYt+kK_yvS;Ma^ zOx|}GMTU~8;zi^)7q$U%d2mzi-!2_v-Pm8Wu~L^nKwQQh6G&@3NHD;l(ff3A}Xli!pS|K@YZ~lu}1o<7t7V)=jy)D z@=c}MKrA!GhJoOw@i?zBBhp%c>6Z%1c{=OqY5r^SPv^fS$)dZ1R%~B)zSeT2v z4Wi2ZnR%qD+{S*Tu=}ildIi}w^6Wcgv1_yGLqlq_)40J+uiAEsD!K-KRvAHbZs))K zYKy1~%ZjYR(gaUjYQsQ=ZJ!2@|L4dWK68C+g)@E*^aPA0&0c3?mJ|;s??~L!6J|Tg)0@|$#Q;z{iDC!XOr65Krkn#_<)DJ zW6eb4VXLjwNem~=MP){ES4M>zM7069D^#usM9YUr3JgHPfh!{`aTn1ItxZ-YTWjm} z-ZGNKYQ0u{4YHT}*(fljkH4FeX3mg;4pwKqocyycEUIj{U%Y%$+YQz2+5M7Nw6XI3 zOw6rL?`KNPb#s3k-UEn zib4`JLFoV?&TGR{oIMOjgJO##Xj#vZ5~X}cz#QXRG%OrOM^s>_k-PlxQ`kQ?l4{wZ z0o|)96OkaF6$n0r6Nm#JEl}5y`*N7ry@9L@V-BJ>x!$~Of6B!|Vja4z_%^b;wEVHd zpme~#ds}E67l6045P(2}5TES(8A>|y1faoV(9}u*kIcE8^koM;WYoO`zPEd%5ILC& z7ptg4V&U94R9_&**@%gUZO{={hKxcSDm-%&q^9bVB%jytv+ysk>Q}uBYLU?gqo*gw z>croYlVR}mGzcv_)>Ox}@3~a}dq*!-MUDNgLxq~MnEuVlYBJN>v z^Y_B?k&*XAcbb`Z<^9rw=JA!0cP0bX#d_ilIzji$#_;@ewR;tOdZ*NyOLXCddl!Z4 zsD~JsYAcXx?9${rPW0R{(1u?-)8}2n=T_O8SaH7+Yo~lV!}aJ#2GL=vqU^}pOT~xI zc9G|2b9dmsru$62Bdl_xqOS&Biv^eJkY!Y4sZm`V-G&!UV!bIpVA}EvvsPu)Pd}-= zv@=~?gWi?qR-2WF6Or+7$ zg^4rr@0A7l!rERMR0wPAAGHX3A|i);GkdzS(oya_2k>7j(CFJ=bdVrn554_BeN2(0 z0g(nY-1KKZ3eS);&2YArVWO}Ur7!QuZQ#d|q~)Tp1f&g)0m<#9ji!Vl@>56R+EPna za1JQtU%F@%b>%PAzHNKVktqS2h~0h|S3u|+u~F)7n6&;}f%h$;EQVyP1<7oVrk1Ip z)(*=t*o`n+9v+E{yfmod6)6Yy5*FA}k;$9tj#3ufn+FG+-c=G=9?@b^3MK*iBNSYl zf#~&aAaAe(*z%zbeXlrg9rtG7i*Af^A-N_eJMtFLLa3uWo0*_$8|^73=cg+Yk_wR7 zlM^-IU{<6K)o$1M=GGsf#bMSA$?m+ly*$As z&B@V}KvtFmxGm5Jmm_+bv+kh0?jdeY4tGM7oatxheUQ#{!D}3{$4J1%CFd9pK^3_& zOo!Gvut)D{ocd>|^TwRsQJM-s%pQ0?H|V1tm~{2=JsiMF-dWlrkcq?mGO2$JVFSfp zQD4D?(jK7fA?sGDeMOpKj*|5@yb$Xi#u|@?++(u7Cq=R=OtwYuS^Ea7xz7B(9!TGZ z>j`6}HtZ+rx?}Co_1#*3?tpTgy*b7kW$p~Yo6J)|94OiS;f&~T2Y|RD32=pYdBa6L zA-K;CdO`8U67f>+xgREGBK8k>BA(p2b7kgQ%liqugA{b6GJ_{~`sC}g-`QpTQNynDr_3OH z=-4M{xLtIWWpX!ed=G)ou33(MRTes?K++9rzPysCW zgkIm?oxg1_E+_h~>9saFyI*!E2+IH>3U_i~!LI$3nUScZ&>`f*Jqq?MGxt4=r&C<( z>v;=e-#nGn)bJE0Y1}NGIwkq-Zt}CrYKV)dObh@UB53)hdz6GN*7IAcS}_p4TjuP3 zH?x7Q<5_1FTlZbpy+5#f1k)y!zvKPB_hk-aekIadmXcCwW!O7Ccr9hXC(*L)hRu8G z;00U5(cjZsl(+ltzZG`>5T@`&7-8!A=JY#){$G&Bzfgs+zLUOzzN0aTh}$>K-_S|P z+0NMEpGDn&XyL?4*&;Kb1V;agCY<9p*Tg%31rQncT0wyTZ=jS#q0~W+1uX#PWpre? z2Oot$v~&na(B6T(QFd1+K*Z4@YHO!DIqx?1xVE}{UZA!yUqRmfq-MqC=EaBzPPk5@#{1d!%_LPHx3V~dTCvrNXU|cMtYHYJyF)}=vVM#UYaB=- z=M&a^a$Su=(un^)(yJRVgRYIV+Y*HoUHmE{f_Aw8DSibF;BiKn{F%QP+tu5b$(!kb&! zJP6UAt74W^cVJObE6TAt%iKOCazivL)Q7P7F92d~s?Q9#P)dy&UY(jqwG#Q500gB~gpJck*w_uh5uON4rL&iIj6RaOvI2>uhT z&(Ol%Z?_)PKDN9gGch_0ziZ&NnjqbtO2d3nPa{(tg!D?emd{_iEZ@wI-Rv-&%Q?Qr^6q;4xJY3mQ5e+K|pZ*0n9--z_~ zTfl(re+>X6^TP5 z)|#@aNUnXXKE{?m?=n$%FCTG!xI&PG{&Vrg0m1qy_KPHRYaaC$1WEs!B=O|gPi8MsGXTqY!zKQ zh9UY_VRKX(#(7H1$hn3}U2Avt=o@Yv6pRcrC5>G^Bo6~%=OCCXiXTlw+o4`4F!jY$ zf%;Ym>2yX7m`#|}8#@JEcxUFgE-KM9gvM)?z5QUc2lRdv@bTn>)~P0LYA?}2ICMST z38f%Qch`3QDEorqQdsP1uIBq;!B>J`tFur+87jB{;xxsej(2h+x~yM)vN$uqf;7R_ zVbshCNpx>IWgjw}i-V%%ZqxgsgGae@T63Cd!UPf&(B+z7xrNg0xBE-|U5K}-P$VWL zhH$$qf^-06jLX=@Fc_Y{TIpG9y@7NR{DEEhC_wLmiCs+Q5VUzI1$Kt8abL8wdr*Yx z6@&D~0o=L1v#xHomW|adlC4L@8KviNRTtZbN1!;}$WenR^}`B8iwXGwS}mCgI(@ix zjG-!I;}R9^DI!T7ES#tmHee^WL2q8}xMj@ItpOZw{~t5Gkp>gk?;D(&WBgxY^S^16 z{71S{gVaV@!u`Y}=%)=QSJ;g$Xu#9q*Qp*7MhGwQMeA)L7nn6%#{F&NYQn`8K7)6X zT4Zi{#VT<%hi85^lP4}S+hD$W-*rXRdBxP}{nGfcIZ?v}O{^nx@axX)%E$BT?qkdU zi`SLyZ~2X!FDxWek^&7&;;bTv5dKm{1se8Z@N?ve=wg$DIiSYyjd@Km^1Q~p5Ea4~ zJb2!oB}p+dR{d(4kVc=1{HQA0DzgCLxW(*+ic8UgbGRTCY1Vx?QQtP*e zdEb-SV@c|I>FQ}r+Jg2=JIoqq9sx~tQ=`1IbL7sN5hF;r z1(D_f@RmZ(iSJWO37*q4iMdC5OEovTj4MWuBoGvyILaFMQq*mUr%QOL zs|72jrMI(@HbhLIftM4vz=R8u3nlDi5~>Qs_lzmd%JyRUa^kxM>*eF4iTwnP2>Fd` zu%I6P0CJaNC>A}tN>IKGY*GuYtf8rhy$CDw+k77V11^43mfe|PV+PN25ldSl>N-=g z;!@mB$6dpB@u! zB8HAz-QVBGXs$n>lV)^c$QR{GtfOgTKpuKE`ogehtg1)nBs%LQ$IlcZNs}CJyn4-O zL^~_0czrEt8{w&berUw}KD!JnOK;Mz4?`sf~dcF&>0>{ujmuiWtT~ogKQ) z&$MnOvb;27k!!*r0uQF?Y{g9$W2z6pn0wOtCD4f^3Mxo^J*y@)&XP9r%B-TFa z5(LxsjOu3061Ag(!w6&Qq0qo^9OMS8OLd})-V1%*XF=`;idcAicUSc_jv$O6;hvF; zWwe)34Tt<^a~!c_W#JtSO^-2olKq`Y6n*Mxc0oig{28%q+kX$YL94#vT_iWXwsXH` zw7ArK^@X;BE5LP^XMeNRXKFKOa|0H4JdlPg(H#9!X z9_X{YH7W1JlfdtTsns~EUuVy7+$=n6DD5h}VkvHzt+9->@)s2mkQtDB`Rr6RMC7US zR;x4xUTId&P?PqP;cX($q`YWDD3j0??Fi*cP|`&KTopLe^=(SXPty~vf7H=3oC=4c zgYC03hQlMBEE0>esimX1PXQ~b>rT3@7<{NhA8z~vn6MQ|9lm%?NzjTMEjSx5NqR6t zO3$hEmxKPE>LrjIP@^{$%mAIZFURK&r&DxwMw7{?Z7G{?+R297+JukFbD32Qb%lzf zrJes0QRwgiXafoRxnxHrXx2q$@1wTWRxBVd4XZ6^Ex3*(J2rnVvESuI$5W1V`Ktb< zkxX&Zv62JAzq*iXXEopC@veMZtYK&x&UJr^YvG(+&baku&3z`5zLNxZ{DSbEBm#f0 zcmR{x?>6?q@!Mdw@955ET$*bZ`<)J*Vz^qmtAqHN)Ejk(?)nUZb{Of8)Q2k8cmVw1 z1ENr)Bbx1W7#vgSs4LgeXO?za)}>=`T$>G3ZV_Bb(jDbJ>sdJ4N>PWuoj13sSVicX zg+WA4N56P-Z_BP|~)J<_U;P8QAfh7D7V#gMg^26vJ;)v`C`G=*N4w(}U~%F8SQ z#JleqBlW?-_!-;R6Kcv7OZLk9huG!7GwS=KC8vK-JltsZbNlRywlCkE>i}ua*tZkU z?xkb`*Tj;eS{4m=;856|86LT9n4EzSW(OxqR5Nr;ZL znzocLyklj~`48}=ARO(70Jw@@y<~A#IoYhU9RRo?_hDPYbAjliAlMie&U z8yD!tGeQf#d`3pMF|#uAbrtDy1y&9raV|C9fDS{EEtjOXk2ScT0^(KSxuTGxb5sd6 zON%FWunH=$6@=6lXHykT{VGnxw(p@Wa;o@h3BGP|ecY z#ypn4ZY+GcYBIu?pbyjQ8V$@vl|xYLhpUjM1b3XO8_JPvP_=jAF?!idvPH22w;aeF)S4DPI)^8u? z>kf>1)m0q}2?(Si-5jEc<7fe8V+i}$H9^a%2c*R$HqRbz*`hhyZ6P#|%}i@VlfQ!pba=x+?R* zRoG^M?fX(LDy?5E2@Gw9>9Cc}fMZrhQAxI2`1D^ltQEV_PHJfsb2_B*IF+Xm`8dI4 zX<{84fRs{Up-tJ%kEGDT!!(z&+%loxGtva8 zID~cyCk>dFEf3rju*E#-vTK-2As&6!kbB}dDna1v?qOn$@a$Ew%JLHA#6s_@yD3}}r9qZEajmZE;Ol`8cLL$x2c&gO~;2~~kCc*Ln zO5n0tn7fY^@vMsWmE(+yn5vqh7jIyKYePEU)BVs}W@d$1zg=>5o`vVED%1*N0(DW! zokzE>S)?J(h7xvM(`){#8OF#el$^pcjtJF?B?K zRaQh1E|mn)_ zy&7t2YATo)cOrUWJYnhx8_VWHNyqI8M7tDigfEhFIS7!m~}6@Y>@gn>Yi zLfKVD^OM2AU3*JH6gce@7>%GmzK-B);A4$$o{`Er>mk{dC!NaX7@&&xs4e0m%kfc7 z7LB9kM4Up=1Wx_!w^{Hz{c-+MCfc>Paan%j>WLGjq3YWKsfCa9ykWS6o?!Tfg-mxX zNF_dONM0bxQWa_e_7I076Ap=KTY`9gT5}Xigor?opC4p278&mg zu(`clDYeL=<({25eKsW-TJw&+7@YfsLj+;c(FDq2A;->n8(}v)I zou#XK!P7VIU{LE9arNw)wV$7p&su2R&ek-RT2S4!d`?PKROqrOQA$B`Rb^v(Y0Uc>rh?+?*?s zzi|Kksp3M?4t6M;#k$gDY-VJ~mLI;(A!>6(VEyAQFZc!(RR{x(y-GgAOmW9!}A?=&%5 z;w2pzW;?o?D^)-G#?*c}zh)1Uo8myQ`K2I)3jJpBvIQw^`mjmq3lZ6Y!C2k|2FF&(^ zZI$}RJ%hY}CWiGhgz8eBlf$!!O6ftL-_v;5MYqusE{1Ln!h;pK!k%FE_8$z@XEeC| z60s$NYQpkcU+r_z=;%txOYw$MUG?>xMMmi-HFY%=-0AH3&J=#Mu{Sv!<5=U^M~Oy} zh(U|t4?{(H|525KvG#A#n@s;<-<-k42LJ5~$(|g3cCZVot=*b0ERB?b+zDDgl;fOq zMoj+Mi@SDD68#aMLd_w7I zPEb3u>bC%#sGXhw-xqk~v!3v0aNZJvd*oq)i8m07r^{Rkqx_eoeZyVjRE@sDD@T&KIDEMLzf=oi&$EydVi{N5E#oM*B!#;&ARFt3D zbua(@Ir!(>NM^4U;zstbldT|TtxaF?4Q5xjY?LjTEmW&lXqOw6u{Nco9X2l&v0#QA zob9ext3kdbI|<(hOEN5E8MJDciFfq0vdGk~0z4-==XnM?Q`-UA2l zlsk0ec(4brfG>7nhkF8!C|`$Nei<*lAGiWRcr}DBp(EJEZ{welK6XXZ?SldzX|Rt5 zMnu{^R8!2P$mmzSm>i{VYg&*H`w;osgE2pOYby#u{LI=}%bbS-zvnS4oEoS*@2b;b`mnK zx)@%0X;NoyzA(0%Pnx90&@tweTo+?-E2!o!*Zi8ZwtJUUaK#4Yrs*92z1z;ldtop4 z{_DTW#*gob1`@g#Y47($Bk6mhLGwSCjiTlT#ts6Ge{2j%nEq8RMk?ya&GV!1Bv&;g zoK}@rY=x;CX&^}n?m`a*AV^57k{Y;WU%=7R%d*WS1!Nn8q&@e*UyEU0Ir$D2-%d|< znjU6wJT>@ye)9gjM$_q2Od}=M4_s7C7R8lHA2*VNb(3jYuZzu2Vb;A92w2QzM+-$W z;d^0ZPcYxXV;pufV!BZ)dN`9(ZWw zkV9PxFCG4ePJfrQ*`C*g)yod=|NHv-Kc-u0gQVNta6mvcctAj8|8p!TIq4f({woL? z)jd45)V#j%I!VWy_C;-wsH)-%L(db+B*KufibLavi|T$=-sqB2R>U(ySiF0FSi^fS;4;> zp5=L3ckJrEy7H>(dK_b#0y$Q;4{W*-tV^LSbmSmrOPs=ElQbs&!|oBXv@cG|<2?ai zh`^D?nK^nOhlaKCtV&?-25AY6e* zQ#c&?X_b`@3MKHSy0e&RmaDlH-wqcQ;c~U^ zXs0$ceQZ<3FHE?~wazo`XxCzTv`wE~{P;8iTC1+Hwy#Q=O0)k|D>IcS{u1yl`QQGg0Ol zt&Fq`){ErSeTzbcya!)Z@pD~^JBdd!Vh=1-ZGiutcwquS&Wgd8Eg)uKNJ^~eaBsN0 zU)^_+KzkWwi1IxyLKk_+LYs>CR9lU4Y(FobI-*i=72M*i6lXMv&d{?n6vG!XKW`YS z9Qi`6j+mQQg>nX{vnZUde!RgNqkS4#@RvI#wsHKGjnhw#ct(z6XMJt|67nUvY$c9# zO~cKUsubX@`050chWwWLC@$O7G@MaXO6BGFV@tWf8%~&TLQ(18oxBm9ha@`d;>)>l z_8m=A>BmxyPl5JakE2*Wev@e7u?|5O!r(61;;=b@WLa$C51rlonAwB7oLvXOfc_nm zS4Go&@&z<>q>?a0OiG-2LUP_Qg#n=flp2Gc(nHLXniop1@VdaFArQyi5NJ8crLfSxJS91>enGYk_*TK&PMRjIbbK_l)DDIryGeY0r= zYjuj)dooT>gRcJmmL-^=H+5@ucR@w>iS0Ob@e@G=^0nMMG$!iJF*~ZIKAH$U)+2nQ zN4W&3UlsC+?1XR4d$_mPnJ9Yxw(;FScy)cG{a-+vfc6gD@P|fmxzNR()sGPbQdHZV;&pKEjpMF^lGgT?FA{xpf zqXgZWle5U}X&(S!yt3dC*p6jsA9Nn~KXvt39KhtOT3g&1jwrG{rIm`V8<%8Sz zbihMH`_)cJ^A{!(h;|%9YhM$+`O~ zFg!38i?heoqhQg@XWchmLG6jWSCc=+wN|?KMFMOmSQYrzqRr9y7 zI~rvrx$$4d76U?-=`5Di!Uro&65L(T7#;R!hVaGF#pX1xME~6ALl+uWq!xYlv2T&g zdS)YhrN<7wI-zAcy2tFh!Nw6C*V*nqErvf7H|h3@-M0k6@J1d|j+Aw;l9htGj&8K| z{;(f8b1bqyRvsu_A8+-hlHz3gV&CF5cI}yWP=4yq`{0dw$(&^mMNT9SfxeW(@R-K>;>iLV)m}Y2 zJ;|#F-S)P*c6qSONs*9Dss>Ky-ws!y39j%kpc@C^Ifkoz*|YA5M9Izw9=yU8+ijfZ zvHmAq3p;G49had!-XDFyB+pRs1K1cyuJY;r_X8MY_TrX*h*=8Al9Fim8Hiu_BXBNf zePj3IDGXX$eV{K7Gm^8}cJanD;AhYbT9;x@M`>@yB&aAGLGLWcDDXz#n1 z1AkKMS?5%fh{(FQl?^bmL5HJ`%4C_yjZ<%uskQB?v6{P3rSS+AJ#l(5WSdsZ;oseL zovnx=oQJ$*549VqOrSft**Y(Hbg$lLl|5-5a#SY`tM#%3^FEVWql`1>o98b+k}+Su zMb7WZ+#g6RmU)!kcva9nF(t|=wEt{5q?ssgcKGtg7~(pabG3gETE%MLLFc*n%U9}E zcz@iv8n2(w=(;h$TjX_0c#78%?Z|8JwEcne^6~<-slQU~|76f@zE-QX2M0Z?d2d)W zSNzLQ$euy1!}y$9le#`rM7fHg8;j#W?dVYVIOJs_p(bKUm1Xm!NUs`eigjJgBFHkx zBZ_pvyanAJP~LFCsbTu}Y1-w=u%IJ5=^bb(+XV25aCX}tvBpGg15X?n%@EBO_3;dw z(ZjK3b3q-0ztEJ6&$mD& z`+^cX3GjMaUr$YwRB+QZNmr`QiQnSu*PQEHs?YGVHK46w+S3T?b>yb>3>`eCTAo0U z#pOP~I&#L*8`S5nX6Z_8v(C-JU&yUZFgHP)Q7u~0X$w*0Yd^<&W-33A+FMiQ`-J;k zznwui8uW%eD;ed~$w=a(Z=eV1nk0D+>R*L@hW0XwopGfQJDG`y{7goB4GF}n%&krv z+|s4qPPZD^a)1a??19$gpGQM*hIsZR{T&0s-La@A2K)|FfnnJR@xCSS7V9}p<9$x#dCO4Rd&?J}@RQH-JtPv}e)}t2W^*FiU9)Js zL3VgV@ETqG^C$GkSGj*j-Dvys3&SS>mD`wW{6H&WV?Pp(8622I9+k?v-)Wg<3W#HRo4Q- z&z=egI(Zcl9CgCX>FNCTMpL2N_jJ-w=32cNI4isV%B~q7ueW1lE)Jel z=te|!%xglBF3O#-OA)WB8FBJ3$Z^k|SV#W3((r3!nBw_mxsDaU8qL7l2&eCyxi{Ue z3{D*-r80dgAoXHFgW3~Jrt<6JFHRq2#hJ7C!rCqV{IcY6x+kD3#gy!@wSA~S z;xwVnS9%fI5j3eZ(xsRn4q%e_k3(itZ{D;_EhNu!+=U&d2S%-Xb=Y~Wng6F2GA_AW zMf~M5^u?6j?QYb%5`Y)=EfJx)w@8hqkUnC~)Vd-3M@PM~iSxO#_T``F*}kB>F_>zN zSqVRtc1ikUf2o8Bnp2~J3GY-K?9&D>$@Go{@o5?_@5#0 zKieTnhGxe9a2<2_Prg{DqKxevKZ4g;i@kyN?yR8D3+4PYSb-+E0-UmTo-ovWXaF() zsktFt z%Z?&&V$X~+PPt_&pD=fgq6c1-XrfR&LkBdXm-kTVQW6ip^<$?Nf)SK7XhF}=HH;wW zP!F9=-elSJJy`)Qf}7VKW2-wLxPktaTHu>7GE?MUjHyZ>2Ww9PE^XUv#ZF{o4Y?s_}ha=rPt z;h-?ADYdeErC>i+mC+|CS`#=?HeY%?z9ffvpiBYu5j(~fni(I6<#^^Fp;@LR?#4d z#RYo|W#J@uY^3tY?^jAWkeSee8n%-F&Q4B~rEpMmwA@go0Jz#E@>uZow~&SSsY8zp zFE!62zU{b8AJC7P2pc3F&1ssv157We6O{^m-0>1aXf}vudu&%o7VY9bDsn!SkUxB^ zP#|MW3%HV7WZ#^rfEp?@gkyR$+u7Ngd)R+(o~4dqzifZ6cs_i4RMG!$qQ%(3T;Iyv z{XZ#Og(@5WaHRU$h%pjsON0Us$7hkBCaDQn472vH{QJB4mQ;XJxqSTaM-oZ9Jsh*pe7 zGQZTAwDT2r5__6hThDH^M>Pu>*hqswTxs$Ryasi^BX-t31cXhl`#BoZ!62=rnG z?RTLIdCu3-e31!Ban={?f;W&N4sryQbldzHcr8H2%aaM_R@&D!1klH3CCxP8K#9^^ zLwAiwT6A#~v`&T#1R^j=!65eL->H)XsaESt-Ee}}T(AFH?UZw(y?(kGeEemci{Qp$ zgZ`_z1v5ayEpcbp8~h}}V+qzm88}{xtU8bt9dos8UC%Ylk)#yK-vBz1irh1|WgEMS zPMAlS2}NdgRy1GnzE37{0V3TP7TKE z1evb9VXPcu=zzqbMUbNIC5cZ7zU#_noGP!pC9FAc5W;x3B~8IDGI#v8h#HISO->3B=H2>gHVN zNmmSqleznZ8Y-Dzu{|)E&7!_A@qGwVXKnIR`nmyk#1@)@0K1C>V;nL)1JoMw8s4IC zu}0)q#V3ig)chFA%UxvsPHLATsUG^zFS?j8k7wn8Q>N3OEW>x`Ek|6mYB#NBlN_D` z>lU(=h=FFBNP2-32_(nMrZp{>obUrY%JO-lr}Fs6oLzGY%u@QWk8B5AX`K>}odBxD z5gB%o(`xIvB!H5Ncn4OL%G!4!XVO64hMj>`7|@V z;-Uz$HKZiyWiReJ-XPrIyZTIL5$7T@`qZ(##lz+9FnAAHJ}AWR84_WOL~d^7 zIHP-oP=%1U$eIFbF>0jHKmI}}&d(rF$UmLm2J0ZVqjV4lkqis=)V_itzs;TmEa*pls$~tZyV}Wou|@Ze#jiGl>6aKC9^1 zB8#E$7;@HcZ7^>S#q2gI;$k8a7Caba(!}7GdC(b$q5}oEJoXy9FMX*CNsI}r@mfxegUaX8>Jjn&9Lx% ztDxX=E(TqD>T@@68bt;%v%UXRW z{A~mw*>Bnh7jif(=s0W3+4b~Y0CJ2?Z-38&X5U&(3js?%S+eu*l$Az=bsas|OpM|# z%I7rosyVoN!|`p)w@8UZhBtZ`4B5-cdc+^OznG*i4ysR(%vwx1RO!cSl<}nRy8=~L zVKToUJJb+UNwlgOSWp;>3?TNflu>R+wp)I{1|J;jaBlxzxW%-AUu?FuN}iXPz(oin zV3y;C3&ba>)TYBnVXW#;2;=7cO%AK*4vw$D^sH~XkvG()EUWWmD>NJ`=P>o{y^CcE zMZRMQo6k-Jt*cK?vZ@)|V0bV#*&HZ9r&f{!Uy=u}cnSUsAq(9Fw07Oc9wX}V7J-6& z%Fg0S9vmGb!izP)i#R1}Q7rKW7yj`Gw z-Jj4%^M(@~5x3yU#==*eY1kRM~F*f@t2(U))sj(zLFxT^L*jL<^Mvaou z6v9Svh|ixGL>1yBx$;CA+CFh*-$UMccJFss$1tq~u9y@_$=+}c&!a;^(ZoolZ91EX z>JRPE=1`~{nMa7dC<{~8hfsrxdDit$^nHrx7jRQ7{QhvQX8Zc43XgM)IW`s>C#vp$ zLXPEsMIf3xtUXivx09USnIcvOlCw}1oxY=^JR*raLhYSjp~Q#cN|PCoiNWc^vBg!0 z=Glmsd0@?)LVINSVfO(bXv699=Tl3JFiG{kd^~My}oUd0qPIWq_@cH;`fVc%71;}Fj zL{1eqOc<@~Qj{q3t9Bn@Jw`RT(!mqi;yYR#%T=HaneIqXW2B$e1U55??y38B-Sm|B2KIC(T^lGYW~eOH_eE%i53r`?P!9IC^2#`R(#mr zM)Z*YS%|cylX%QRo057t-oU`9WT+OiHmlrCeA(>jhPSgO>w`VPgaBD*puXU%S2HmKE43($?lN=m4^mkcE7UM`C}>jhmq{*S zcMjB>bH&X|LO$LwYSZQn%VMi?sY&n@i!yLA^e~42;16tXD}Vy)sTMdvw^#Dr zI*(z`bJRSNE4AT6)hPEr%DS`G|5qQ)A)t1$pvXEt3tOe}4wr%~XP& zP=SErnSg*8|K~XP&!7L#tp5*7=YJ*rPEBY}<%4gvCZ<%bR2T$5Zb3Jg5#m&!ol2w- zeux+Z2ohkJZw+0C_y}o}U2gu0XibsI#h;Z;f?f;gyz&$Y81{)a?cp|S*3B0#md%Z} zuFY>HZ#7zP2#-EpSBHmWOpr5Mm!JEaZ-6KEBOkmij-$8TrKwEs%#ftJaOu0go7+oy zB9zFq87JzxDQObG?V~tV*8%K_I`upj%hLE%k-S5-z{Gr;!*EzzxzL;7!Hj%Gen;1X z1ye>@$;7$C{k=k233gB>pvbTEH$990x^!Ubx2PjM01HyZze5_C(MXekIaM-PNEKPC z24+yqE&7HLsSX1q-*X(*=5U~?3R%gQcR9GPDN2-kBAC$TT!Z7V5I zflsWYg8C7%YZo~)eDb&~gH{Ab=5ocekP{insMIhp@g(Ee0AY@v6F5FVVNSF|>4e;# zxgg%bv?rfTfy6B3)0`1y(jpNbpdh@kF<>6cieL``Itwf6>HrBxu3P$!uC)m;N>zJ)P< zIDP-30{ z@@0VunGd%r>eXpfTB$g9(SiTkc@b6Mxk`)>dmzAuhr6_Z7J33oqb^v}NJ3ngd51s4 z&!KM8hpKUG>x$y-t(*o+zWCcY>{H_n)a z+mug-D$5S&n%)+yY%nc)?xF55h>&}^6eXR2aZYAh8e|lzpe8$*fRBE-m`JBcCa+J9 zZSI%XJ!Bhr0*Nlw)FclAL;iFw8{Qh_4vtK|@I#{eNfdCZ-q}nJSMDnk;a|+`Ah}ZJ zX|&(Q$sRQiOnDW$8iC7bl9lj*i1Tn5PWW>JRnxjku2&HSoHK&FVTIea@JU8Pr&bzX zZd~x{%T76K6O3N2XyYbvC4RA3#1zPy?=W7AV!_9s40!H;&1KQHr~v12#@TejiBCD% zHpx0&@lpKFcC8nxSPyefxCnTn_cd>s94zvRoSv!=N`FltLg~s zdk-jZi?E${#mFmf<`mpTgR%m*9_RGprPCm9GERkwqTKGd=QgogEX2sM#0fWlDqkRw zLxL-7LpcS-`KogxTqf{iiVuP+W|M-@V2Mi+AVCKh{EUgN@dub8DbX`c6B#Q!v?cN5 zC}EeymSU%AN~(b^OVN#Vm17E~(xD>F-4MDINhbdKHt&FouE(We ztwa=;h>`ecROI>XQ_0IstlP@mo!3GYa5vsGh>iz^0wPb0nlUZsTCv-hjvsQ%#4JSy zXidgrHxxe_D^X|xEDO$ODTnZ4zv-n)j;2n^|2PG81;G%UKFsNzM%5o5t1`0R#^Vyg zyizIeYuuN{?Wf*p!JzliIeQ}fys%M<=_qY!+WKw$80eJMgKXclBN5^* zZz7XECe!GhH8FT?k>$r3FNHF`pnZB^&VFcele~I<;s+YIe~4KYvsCN|^K4Fy8WvriExorF#D$N_2I}=@|^{a zw;Sx-uAOJ^Zz$+{U2Oz7=W$?HyV_%8920ciW49SMf>g%#CbHcP#p6^7|8hiVqS4c; z%X!~dVI?AKILeyWM_`w?ADhQ}4-WSGp_=F>g`^skM-?jV*=+Wi(L>iJbTUD&>1oY= z59-6GWoG25109teG|`*8KY%Qw2UgEp0vQWP3}0((@{5fGmVJKiACYZd<|}j<_EhFs zUtqnXONa>0j5wPJCJ%ZB&Zp7v+9YxDM2%gnjX3>Xi80_e!XKKU-&i25U9k@|-%?Jo zh6^4@^}3`VHO_eo0`CnBmpUup6TNzLr@r)qTGeKsCKx_AvuV*IBGoyIJ#|uZmaa3c z%NF0_fD-GF&}eH8Xfraq7^!waq-Os@Qc_l_DHV$Cl#!US+!P$fp?B9?KS(Cfx(W&9lS_l z2XX}}%jK+OesKX<`Ft`|#}dwBncHU?SDJ^4UkRC zQP%3Q8>d25p~XsY!`;!P4?^xMVm-v0&R_C_x?6(&SIHm+E(1_s870Seucc?TFX}CpTK_oJ0vB9DsoAVVmqtcqxM~Fbf?f_&w5hJZkpz|VT#d5 zu}eCH9ekZuF76u(J)a%eb=ef`;KDCTi;@W8ABb2QChB>=0)PS0ak}R5_W@^f1X{i} zNC%4uV_SeRJvg3m+Ya$M0zR=SzI=@h(NoC8jS?xV)mt0*10{CZVT4^zj_Z5T-c7Ew zhZy9(>ij%$$4>EC)U*7y?01X@YM=J}4qALRerz^=j!7-tgZdO$v&d5$^kvI$_vc2f z1Z#~f(A7RwPa3+lRiRp&!?g>gZ|-pNywes+H7pj90nAWVL{=bCNM^x17PgAnFu&}F zBM_dvDfxJfcsIe%@@lD2NFfh1VE4}eEA_T3=XnK&`Y>biArk3qq;8Yb%)u&WiU_v$7<3xpd*O z@q}L6ke$}x5i;fl#?b}`L+gI+u$h-D3anwgdL6fAgSE&5bsR4SULiZ|#n{?l*5A!S z=P}mhwX0mudlYSqSHLPQ0hVxqgZc~YXeHf_M@ly-_jA?eFUT#_=2`0?J3y>!B9ig* zFamcjA}-QMmfv6^@$fr&)gka!r=r^L2sNA&x(Ed}sHSbUaXL1rotqRdNN5zNX4JG8 z=x)NpTYU=n#T$L?3iE~}b>+Z2%op)2u^L;*O;-XkX8<^-=bzvodXfg6P?z4sO@1Xa zzE{_x2u1ZaMfEIkQ@{CNiP!71dvD`=dvE>Y!4(<^i-&*5dHXQ6l9G}=isce`(%(@H z*#&<1K%*%T7UMthsdL|RlkWxG9!=+}SVMclcPA%_6?0d{DA&RLI=R7lrNOt(@yf{i zn|d;C9-vZsr+B$@+o=*0N32SImUYqGk9KqT;~USJTl@4pl~W`$7GFmIUu1_(#{uZ?jj^GYOl2%(UC-``2un^t&jO#M3FsYRK!rUM6^j ze>f)bQ65LLHti!VG%w|`A{2IBIMmE?w9jInNobefX$~d`?{P;CsjE(BLaXuU+c$HB zBGWnF&*(o=(%{c_MKpWiMZss*<=^-x)-i`&FJE^^|CvF##s3)>885oaF}}ICx#nmQ z-0wVAWzLcFv+{;&lAbH{5pbPxeKCK>xn}#~=Qn**aD7oe7M-J%>EpBW2jc_(#p`5P z<(kOr-NmZ6br@-FjBHdc-UZ6>2g5J@w%FE~RhirflWUL&dbgt(0YvhBoZr{Z$-|RW zzzj=q8={f@eER~5SB&3-&6WbbPy&y-Nt%Bosf%(O@4%iC{F-JFk9q+^`jqsO=WJYhO$i{b7I zJ-PDd;ltcZ4>8ZgWiCXHY)X+%`4ItlRB~#!qvI9+H2PE=AZr0XVAp=`N$dMT|0bt6 z@#p*J4v(35_9c824`*fh9@BmI!UDC`%MVhFNi=oOeelj7X%fW3S*L~zlCk}f1dE1N zG&He%2dX%t-EfO@T%S=LF-v`Et)VWVuO4&edkc*Wfm? zcetudmm=Ml#1C&6TUWdTWsmtsf-~|jr0ny#+xmn=G1;XURfx_A74(?Jt8%ZaqRZOT z!YSPauMTz-rIem%{QZR|5Co!>tv~hl>h9PXia0%dQn*^y?HX6;HRc}%ntPP^u8ICq z^7Eu@&D72AVB6n&Le^@2`M>$+c)02@L9N%hFDCh!t1QwhNaQiPWvSyWwhW?0sF2Ic zFSWgKtV%?vMIJ0b2sfYkb;ysOrUuH(@__-Ci24uU7;5Ws8Y0K! zFhYDtyTZ6BN3nF9g$`5ABesoW!V0xm zP~*Kwn4+TJ@uYi=*9Qs_+Ox><;@-qJ3btVB!|8n~JydHwWDsL#$?Xv7&~?tY{ofjJf^n zFC=D##Xmk_a(p>RY4%AnwQ;qy_nn}?en5hC4-&<;dBzOpL9|MvKScD3b!`4}lD_3a zfE<4^&H2-xk`9T7(x9O>v(J+;u{Z?=O4p)lS)Z1gKiC&tQ`e#kMv0m|t-4VHzkTQz z?Ubo|i&M{(y<^aZENg86xy&QWHE+fYwi>s6#T{a=1YDS!}RBX|T-qcKQg9w(1CxJm@a|>y}3TbTp zfOcR8rg8DD1@+snJSRKgH(GW_+-;Hn@xbLZFo@Esb6>&2{bd$nztSzqW5D^gn2Byx zue3iJ;$9ARncU-zPJa-)stJc@(=qn=jv*TP_Al>`}a3mXLbUk z%2s&9pImy&KA5zk?y93V9 z)HDR)D1`iI>^(4!fB41Ja-)!BK0`%*D0}8j9R}+F$QU>D5XPxLM5LmIo3i*%IXG;m!LTIcNC{SaxP~VbDLhM@%v<}MT|F+X(P&i`t&1% zzwj*6xMDk`P$ai*^7}ZaSEeGi0e41va$jK89(NU6(2iASUY?{b$%>F{oJ7|VD;|4KDo%wb#?ayDh9y9vLxFqEX#s>Q0iJ7A71wb%ss03hVp2!w zFbCc-ylY0KXQU~Q7agQG8Pm%hIX9)cyF&Y~u{)2;a+%qYGq<;xneyZN`KPFW zy%hZt8Wbq&32uO8@M=m-OT8LzLM*IrI&VLs-kK@%Jl`+QHFSua&S_dMmW>-WazW08NDbrBE zZwPg}bdOdpRhwf+dM=9_hk7Ma6m0e7xwQL=F$l~tlPOwyr&#|60ndmTp!n_v8fDM` z+wURS(;PSFsGj#xlpEs+v|FT`(9rja*y-?xkp=D$Y>{4PvFJzTWIVmLFuo^%3Wu`i zB;Ipg3AssQoqX!+yZ&i8&6tMeF-vph=zf-M3MbH&A}^2i5A{InqZ1%f%Opoil0{my z{|+BKNl{w+T5*_i3wmu~CE#Y}S6~mF>-bgeI?_(xqek5C686 zlu}G08yAG=@%D0YVuqVx7~8OvOO^s9cS*wWj`mWiGLF#CY1(TnLMO?!;(ZaHN_&GC z=|u+wzFytuV3Iz`hS9&j_hevxOx8z5jexHwN8~=GO^~PW+Czt(n?;BF`t@|9?Ao)P z`s6#wh^?x;>)6k+^u)9jrwu0aD`W5$aKSdR)=5=)IgPV0%3W*HTtA0wQa!u4T)qb! zV1MQR>Usm0GO~86;e1A3`#kP9^)ZS&F|@60nC^BF9A82;7`Kfm3E0TIc*p+lU3e! zz3GXI=c8Yjg5UW15q4aWURC15n34=j7VBh{PY5fRCA-%@XB^82txb1Lj(kf7F&%d! z0$0jJ(V+{CbU~5-O73d-+>_=Hib*Krej1H~8rtU6S#}ejeFlc3LM4@%D`lAeXe+n-(<^@ugmVy!R!x)o995&mcM05*vZ1$II_UrZ~D8=L9Aj`odyH%->HeiP{84EtUy~X!iDV(J5 zfiWX&Iye&b#Y-hknh)M+SDVfuh-b)bRdKpx9+xQ=_~TWAyj2>&5De2#IZ@rpJt#hT z=F)*V;kj>}nl?6y%S|!{J*S;5brHs;zDbr`evNm$aR=ty;B{IBf}p z2<3RP?Hye-a{|Fo+SM>@eIN4b0`d)ZdiL^+HMq*x-bmK&nv4+BCOVf*QC-HN(>dMy z?~zE5W87WMP^0;Q{X4L%_@A6FzFZ5I;lF*8`riZVp8!&|v^6#PpPJME{AMEI>f-8T z`ae6Q$-wU_cxq@L7ktO*qh#39M2rA3{~~iDS-qiQ0}_CN5J3ir5ehp8E9NniODz8; zxX&kuJA;k}u+=eGZ5Blty>fxZUGrJ1443eraN~F=8crq0yPXxlGy$!~|2X?)naKNx z`;o)_V(SCEN3&yUCXqc6Vsh@rGshj^o1-nBlQll%4c1=fj_)-J6dIFfj0C?xzdzg!Cm!W95j0j`W>w4zNsEx$7`)5`9O_El(66DA31QhR7) zwx7D$XKFT|*npTEIqb$|)s$HB3xHOjNWibtIrvS1 zVWvX6#nvWh+*|A@1*RgaP?R~=+JV1YFKfq6|DsvV`7|B-YY#8MFPy?;KR(oPs ziOncBtx>WL^L5~?B`)dC=y=npFFA&k`j{1(mTmG}uNfzFajaDCXLRCHIal(WeHy0; zXrNM7FBr0zW6I7)MGP!~(F(^LKTF2R_t=;_Gpr2jpom@MqCO8S-34IT?B=CD}i#13CXt<)Jcn}cn_Zm6Rrm7vB#R+r*G_)meXMrf*PAiJ(yJT z^0^rWhc37|OMjEO*nRr5nz#&BHhyOX@H4s2G6Oc#D3tDuyzVXHDonIXF}>vi<)`Wv zIdC{5R%hHY_%d`e*?S^8#FKM^ykj8Gtg}(YflV1iV@y_jdL}|&zQv+M?&cJ zzWp6~CFw#Ykt^jdT+fPu999MAmc6X%2lOj7wsm8Qx9ENi(ewD4;n1`K#AaiMNnP{+ zA*|XJHBiWdTs5#iF_+XUCJaQd6xI5%eb;6NT*XSsY!59~xQlRo2GUV6(>T(PcKeOY z8sCD!QSVpICTMqWw)>{Ddg{=w>ecEI%NWS_1K( z5~O^@LAoi9?Q5m%QJ_b@NoU3NW`4PRWWfaZaq~(ifqE#-8Rn>gX||5y6?Cd_$#n

xfik6=s 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

  • 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�riJy_vYphZMcyS1Qx$47I{dXU@m>eh&tp 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%0Dy5am4Q} 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�IoE5WnH&M@DJ|pSCK(Qko9K16h*t4X0;Y5OZ_o$yPe+gn(cU=-OB6h^#!jF zCWo0KrM7YkQ==+WWRD58wD4MoW;~-=Rebp_P zY%*VhStXL=A6n`lh_dqtVwOfZV%OR~QDCFD7E5lYp5zP_6cd3ABUCw)E48Pv)t_O2 zb;~heUuUjXGOYEp?>QR-=&w)Pdi!3(8vIRkw~r*$&&y^BL+vw~M@g$9$bA(*5Pv2| zm(saA&C_Fq2x6}x1QBGQ$TzTe+B(qRictuA-f57TI;Atjgqcgmo!N8AMZ(=y_k3g( z*82Aq4jao9A<0?|Gx2kUJ@^uau<@}_wa_!WNceVV!5-KNar&S%lu~-i*p9LKX*<~! ztR~ATYhUFyXg%jaL@pjr5Q#EWJOjxEMyrK?B?n7I=;<_{s9ftErs#u)Rp{+k4W`oP zj+a@~Y;M|@eSYz+)D7P0*S)&=4+q!C`AkWjCg3(q2#e4LImhtq2I+j7t6@SV+N_^$ z*rm&hFpH;l9D!PmREN@GH16WW+-S9&leosRRLI+balq}e$XZ!=meNMsCR+9*{yPSV zn4lI?^}k{u`r|8Hh2H$M$etYuTY@gj_z{7|SG}MG2etr*XSdHWGmQG6#K?e?wO1KS5zQIg~|5+~%k zoH;Y4;YKFLg)f+E=b1D320o@Ckv22%AsXPreT5!eM87yi-VQT99D{pS2J+1B$?N^2 z59IU_H6HLrIF^kh?v=i?K5h|{nX$M`s3e$#`SCbL9xNH~{-8vQgWl_>fz-ixNSX6k7uYWf$Fr!*5>*HV5E;8nf2c!E*n%KHKT6Do_e zd~oXguq}Z<$}67#pIP;Pwe0^WryjLSuOu_fZ{C@#(&Rq^jI`$lzZ(TJ@dU5fxDsN~ z&R0;2*90@d+9ss1#gp#HXqRRhWKh^zJ@jp7iR%q`W#w1uXBh7QxcJY&KlAmLE+3+N z6}|(`Z#{O{?H1Tt46Ysy3OgQ8JZ|3IzHbiSpSbJv0P6wSK{|ik#|GP8%$FnPM2nQd zFk3jEO+>`Xdm9qrNx5FJk^K=SLc;dy7mpbm;x*t+V3LLp?k_F5fg2X`bXI34eluSZ zhZ~V`StOND)3bUP^pQj_$BWOyRp4b?nYSX5CN3_Ewr>-NsHnv(6|m1|*bANT8hI8r zOjtq-Xb|v=y(vhR0NIYRY^;YB`|%Om(*9Tj3Yr(268VhBU9Z z7gyY?1-hM!3n-R?4~Zsm3HJ?Hs84{&NB|*(RHpqSnr}^n-q!yHgp0D~Nd2L%yPEuK zh>D(vLPPZ13RK&ZXb>keam>@O!Cg{Lwt(LYG5a z@QYx8NklZPY9CXl&W}#Zq~m6evDxWQKBA<{sn-e*&7R73C%q^KSeAqn!R-LgTz5PA zrZM~FUqfn7lIrWmx&-J2w5)7-Cy{>K7CyC;c>`P=$@2msp7dru>eHm7fxYaq6%%;Z z8D8!jX-s6iD>C*@i;Kkqcf(9#iukZ7p13!YkedN9DaK#}>JAh2o;9oEE4~x6;X&%W zB&xUs!kWQccZ0A|M`|KOVyv4uQp}GT4>L_bIpyebopUT@#9n&24%A{QJ&6m9l$((5 z7Z5(mAaUT4dtnN^(!E&xhzXEI!^!$(=V~ze?T11m#{pP(hu?~VermyoLr(C} z&V5>NqQ=%p95hWc$*OQt)Hujf#1mf_QhWY*MBRlEl=QLrnnYYw}JkwJgHcG>9y#vD>`1NnDgVX=0_Im z>hm5KUTvnurFR?NIwr6*dVW+|L83I%zFf6~mZs%X?n#&T)Tv`XdoP~TZIQjRuB+%a zQDMJQF?f+tLr=>ElElBSZ4EpokI34ICXbcq==VnF+L^#K8Oukp!-HU(8lS(yoZ6xu zL#oB!)9#EXcI|wEJb?LAWP2yxbSJU6-+X&F%{P~5Dlx)`qX#A;6o$5pM7k{DFrS7N zuDZ(o{hp0!MwqZ#Ri|n2QkBo;y%%6GH;EO1W3n-@j;8kBkGP>o@sCX?j(4p-*e2OU z;5giaRHiO9H$OD7j?rIxAovgUI8*)UXvT70I7?(!G?ep^8*Cpivx25GUE6dbYU-`SAR2PkGQ_I`%_p_=S=L)WE>TWn)DULkUT`5q4 z35g^?Kj+LqG7?AuS>&%+Cd6wqdPlDt`k689$6!3P%;oODGVhv!Y4T~KxacRZyJE1L zsIiupr7=S?+?Vyao*`RrHlGs5jP-03%PrG|MSL-^K{hN)rr4HR`s0pofSsJ;9%W2u z%}X4zbt-UBq&CCv9!*-eQh5S(a+@|J zO(85THY;BlqD7|hW|8=Fm@^88V8;cwU$Cxg2$sL?%uHc#hCZQu zVZp3rSYe(%gY`&uS*;oR4&2Uv>tDjQYte@bs->MQUd$F$EtlDJhvv{5;x3jq-pF_x z*Do)hRCYy!Z+b^kdmK=?&Keq@wUe2CJ+@A_tzeqlXh3ahj5PwWN+bP6?DS1uW{%;a zi?6z8upJ}zj`K<8!xf=#>xUVc!aVt8yAd2)6y!1X;tG$OPb0e6jE$p~3(@Ydsgq?g zUZ^4?KO(+JTIP?cM=AN8Fd9I!*%G;o-2F;o!y^)0rrt-sHj_IG>75i*0%^pSN*28t zVE1cSc7iMghUsqW;8nPg%cRJX%-{Uy9x)m8`U$d}+T)hdndL3}(3c$+MpLMg}w_x@w@jJ?+RlUWk7itZJZ;1RsqX_gb z4i$|*AKCfQNOd>B0p>3rDd5vJGTl+E?74|GQEZ7BWx!uynSGn%T@DQ`R_XvqQe=eJi*7 zCT{mN+>R@_T~|=s_UL=N_P9;=>eb5H>4oF_mhbf>=aS?DjW^%(s75vp*Ny4t$IQjf zpF@kyJR?_nUJul{NuJkVD={u4SRh^53Du`&$m5{4`oL0ewjY_>CtT1M?6KT*saZ4> zn8kc!4SdJJ@`|NifA^!NS<(_^o0^T0oNC&(*GFz2+8(SeO6~_g?mxAX_uVF+ur8a8 z8ny}=vu&g_Q66ynS9Zo0AAB`T<8!1BtsZ~!V3I!JIhz`$6?8-E4zVrS9ADi4x~%&- zo9?f?bNr6B`DuYTn1QA;yi}m>q@>__A3@=J`J2K%Lp;CV@L>6Rnby{jo^n;NtrJ)W zPH0Tqo!4Ck>V4e!p#8$|zsD`8THsCvT|Zh?#oS+T=cpyUf`mlJ3xLN3F(9 zB?4CsQc{4G6=B_D#a0a}R8UGRp06ohg;a7iuzh6f*XX3X>{_&JK@<5hlqevNq0W-} zAWa-hgb5*qrcf?YQZCe1HYiaKP%$hSe2*_#9oRhoz4r4-B->GT=Lo;14sJ>$tD)}5 z9;-DZl1$(!S|?}^a<8HSJrBM<==~G6%4fF88U3iUj$r@YCG7tVfl3x;wg%2Fjwb&= zt}SWrKlk-0V|{HB7Fl%7Ad^ExiX%u1p+B7xMI1UrKr4Sl6_2WIf{n)3^^i}Jnu_m^ z@h$2rpE>sHrj85PK-BC5_=EmK3}>##?U7-9c``al;^`*WiT~7VmiPJQ=$YT|6}Df{ zd)B^M-;8=|zqBH&*QEL^w#uwSYZmRwalLixDqHs?CDI_}Bqni$cX!@NMEBmg3_5yW ze#yD*B&TLhi$QznCowhJz>VaoU#E8vvsEU_YUN0k(o40D!!y9k^BzQ~Z*$NHBkSvy zDtzf$9F_}lAtAUgO%VOj6N=1jTSIpRGf{@=lsD{wFbwwpG4_qYnMK>Sv2EM7la6iM zww;c@*tYF-Y}>YNt2^nJbI-Z&)wy-6-ubHb_iybVYp*%i#F%4H!cX4GGv6&OQt9-j ze!?=_0%4^pzyIY;1jL*v-ss*K%>jgu)r&A}CSNDFQ>R|RG%IM8 zVdI>jU*Zg!pOa0&ZZW?lR@i7Nt_*7zo#2JlRfrLm1qlqFEIHzHf<01Hq)kEJT)<$L zxs~X9;X6QuaaMeYZPRm!i{*ydCKl8+=uz12(pXbb;XJD-Z_LzSJVjcpr3zYWs-Gy+ z2X={RF+PH1z?pSyo?Y~z#mkv7u8utyQa9F2rDT?K=PbY#@=Tnp*ggu_NqF^G-=)}< zwC{139i_QVF4oh$Na5MQNr)!>Pz%&>GGN*%`RbMMDeS|qly9w!mAnd!yaz`2U0_h& z{#^<$llMF+lbogLaSu`tyH))xbjQT(@LOIekL5`2@Oil2Wu}#{h>ktpW~R|LE=tUi zSu{*NTYr+7Y*UIVxeFgFTtI^MJ7Z5!7%s3SAdLLPx{(DnKJ=vu}M--uywUh+%P*${K4 zAD$l<@nP|Dmv{EhtASrE^1ab(#1bUN(YXs5*rHw1uLB(M1YXevPoyw!P{E{XS5?OT zq*oLfBUUgz0FWcoF*|Ex{v)7>IjG5@9mG5Txi0yRjb0L$PiTD<#}5RlFU`L@G_k5q z#uVF3h|AyLXXZv~wPvYb8S^yGyTn3iEe`vDmvzF2x>q7~h_()T_s*zb9VL$Wr_tMJ?CDGW zt@pRdcId|!lP&s84!U4b*)@l+)s?b|WRMHFv_is#lc~D(mRRnk3kp+D( z&`2X6)Om-ABXOmfi>SUacPUgh1!%mH5AM9jeuaEcC0t5qbvY05RCyuFf2bz9-6t?b z-&vA{8KVMN2oyWek8@Uf-Xjqz>$0%6<)VKBo3L2+?Bu`i*rYwcH?OzKU9ajm^y<@O zSocCI6$;p*Kl4X?5R0ltM^f7NCM<;=_WGZDs*b*Ao%alZeLVH{}AM1m3U0=n5TIsbN-pg`t(sYx68@z8N1iX zSwuo$w)(O9Be5F+jjh+vypRXMa?LhA1YJg$Agbu?7RAKho2F?>Z(Yqj8`m)G>-BwD z`u11%-`tmcTTYz3J_C!>x#aT;9;=0YM3<8E4o{;C3nZ4cY}gb251Ld=(b*$rMgaxh zG&^1Q7MfSISg;~+FSO*%Oh&_SkIks#DA{G_!s;N{?U%Zb)1tSO9q)xb*L!$)0Ey4E zfdMZ-&^#7Isu|TYj7X1pK4ZRdQFxSVtp_>yYyE5@XZc2Inz{;8S8Yy-%lGZ#phQEA zNEJTOKy70~KA2M)Tvh%(kz+$?UgTkIlx;*cX+&#`Rr496=)m0;i_1abnDnuM-cWWV zFdY}X$$usVAYtdVWXiVs$(jy+k@1ZKwt)~Ims|aMzQ=1#XJR~zjKMo8C$dpWgHhgy zFYrtS!!Ky@9957(^AeqqZvZaxcYGr%HCA1bFje)^ok^Yv&1TH%bP|_tC zmwj3{6Wak#ME!Nk#36AB)v7+Sn=ksCdPAY)_uy_h`r&lXg2W@d*$ckOmBa+oqR2Q_ zv^(S?^(B~f@i7$u=He)gu@2?0?MScac)BaV!u&@8+xKfc5dS6(If^Ug8KTPK}QgNa19A?=f!WA!ozTA*z-ku-gz>kQ zNxovq_d&@b-V^<~oDL`F(`yLG?JOjr1Rqyb0*jtFIZ&gG(INEuaf7k1uy_{72V7QYumWL z%L|l3!!QMC%GDJGCr4f05bWO9be-xvYp=qLPrvTY<0f!DgH0zkm%}E;9=-SyUb529 ze0Rx=Qw-@(Z59w?65R8}GNoT?V-wqBjxrWd!uV1~3H3w=;b+SCM`jMqb5ZkfF7S4l z7B0Wix(zH}Uee%rWSV>+WxBq`eSz_NHmMr!82LWJVDyT_IW6bucbscl7ff(@1!J=r zkH@$%osYVrqIaE6D#4TQqtQFtCC&-{-C0d!&ANnt(*Qu@{AV49|MesP^ZVBP7d##P z>t@PyXX*%eybmZTfKEFd4wa-_2vtxjfCURAMU0pMpCaz)oX!b@t))=CX~P<`#x5|D zenniTS(6x;G{42z22-bXL(RsfIjXr+hyL@%kC9ah>+OE0GtNz9fO!B!WGgbFpH1J`{Fi zGbS2>*l{7Dg@e*~{R)TG=49c>6-G4$jpgxRZ6sZA(8LRF6>^`cxSV=}!WRvdVC%X2_Bqy3#A8flKYo;HtF-F_jA!L+(1hWGwx}kuL`2iO${- z^%Y?c22xLo;SmV1637lY2T6*IQX<$wmXVx{5lb75VSp|L-~d~U@wfpHjYQAJbjzgH zU1AZ>#If0eWl_@IZA*XeC35hZ=#>hti*wV?;Y5lfA{LlrP$PRSOevM$p=^2Mo8-$} zxZ?kePE{R5>Z{?$Ik|u`tkx|%l)xl)7NS7Cv}gYHG_EB;Cn!3~6`kfg%~MHloe&F+ z@!Vg~*!hd5AcK7;JsDNO!)=nv3j5}6#4@6yobAZA>8&1Z(ltABk<5J(yeTG?k&45{ zz1X4mXL78m@`_HQO&gg$9{!WCpT97zW)Wg*ij9R~dK4wPUJ%;HX60Nn*u^hB z?9o+KYe)OEUo=qh>`q1I%mMrnT)=!Mbm~Q!U34(aEWf$+QZvqF5?Mrdl%_hB3585U zxummhdu)W&JPpP;k2#*zS*)NOCcUp@6xJB}FfP1+rwYnQ%w6-sD}GMNsvu>-iJ2jx z#dRLTDrBlmlf(gz{{5u@q$rttUUgz@&8?&WY-yCGh=esR=HYGy29=|8FD{q)S@pZ+B{J@d3`eLe>F{(xZ z%N=8jLgwStO_w^V6V|}AjAA1&6(xXUBc~gPT&G*}qTjuv!BbF1du51mQkfLg`W<3D zI2A!%+gb4#zilzBZm&wBof|&Z3f|zcK!QdywfP3)10XahVM8*gY;q7_C%4Tlf_{Gd zj^`&)AB|;m(=D(?xy}1Cz`=+P6L;c4F3_+%VE#KrUxD;pi*P^=iJni{lM72rS9Eca zTD=~y*P8T>xG}?KwW!u__SD?RRc(1OtV{lbM4q)SHeRdS8XM-+NvHT50!&ne8+(Rk z5n&H`{O_5d3pGb+HNYW>K5OQv*x8QU8vgZ1Y_NbYq(Xh6R^xg~x;LvxNu4Qun8-?- z{KPv!ZnD+0AENnOATG+gZCNbgc=~2U*_x~Kc@S&y4ZEEj&(EN;63X0y8&It-Q=!gv zBh!io-ldh|w%ox-D5OT9v_BtP-iD?%HUNkj(N}gS|9?KX|Nr{DEN2dw#E+TdSS*7P<* zk0ITiwd~z2gtxl!XOb>!8F;EkUy`H|QIP%^i9nUcQ?&CE_BIAe!=63-DP>FEM69WdjFq?AIhvf9ddjmYL_Pc%J@p+;O2{+e?sCo)< z7IwMk4qt=(iP~9*d9f?&62nyD)EVZ0^x9H25ApI<4Z0K^6Fv1V+Nd;54VR9bJSBSb z3Cn59Roo0Umi(g_3j8t}W}2Y}{&O9+vlb3_DhZEOpfvrihcTQzos1cagAwBwA6cV$ zC*UVx^oatI@CH0?rbK^VVXBUWuZQ>i9$&?B#yr@I$y1=$7!}uee>D#O=lXYOkrBQq zY-bRQ5f^j%>}>ELqrb)2e(5+jVq>>$u*aWJb=M--fsjWW$VYVs)LkjD+atj}q6M2` z=oTZ|AWW!k0fq7-bOZ;9h;qNvsp6a-szR$s{nGW&E>yB^0l2SJMoIK7K}_&vbKV71 z)GI=nx5zqIS=qv3cD^L_pbOl`)n z4t{D1E@rx$7$xZHlBI!d%iI509LM*W!>P?x#B~Lq47w4hrlJu@vIl)xkopuoFxu!q zRB0eY=9uR81e5bbo4mu?SOepAQp9c@Qf@KKjzC-=$(R^N5R>BMMR!A>PAgPTq)|zB z?aA_a%cKg}Q+G~EoyL5V5ch6yhvhR`wQo|>h~;uo>F(@^K4W{IZB4Bl?`R|3*pTeg z+YF0(DclZp@nIU?=tMspuRmgf;875o4}<506%08Sso%8r%rv@(L-!3te&r3ihcVxK zwH&Fk?6>JM?$QS`0>LN+<-6& z1s~A*DmFV0uaATvNuU7JQPkIqz=awn`)NSNU~1rr#>+^*!HrJv)ibTKQ;_qwAm_F~ znhObqVJQMxlZpoRW!cHCuLm9cw>sLDj#9k?I7^EkEzC=eAO^P?p#e{epN0z^s38ry zz#-Ad*esk`0Vkg0_**V=1$^6w<9mGwI%OXtg;7^}5VdjT!kwy&vQS;cnYx;gvc{UX z+^~dgcj-aV(#Eix{)3&J{l2F2bnBczOx~0F6x=Uw-OZ@D*S#SOtsfswq$(GvUs>Mw z*cD7ay5I07r!Wyhe%BuZPvA)@Kscq;+(TdVYArG=FBw*c6HyHec|yz}xusLeGbCrx z$Ql!Gl)C0RY!YiG+P6Me1uNQ^DL44Q28?wDrq>N=LZq!{={+2qJM@G|x2Z~1W8Erz z+#)5t>@fg@ZLWnZo4eaO!yQwe>NP>?G-32am566Xu;zuEbRgA!^_Sce*q-*I-yK}O zL1^eba7$V7ts(D)i;01WMroedU5xsP-u@(MccEwYanuqu)>P79{)Oq+eRf*j&_k!F zehvic(>S%(y~bD%&O^D&-&6sqkHS~*t-v#&*ZxfdGd|G*xto#)!AYyzeNz1j#s_Q% zNdd79JbMM2;0qw+=uc=0dS3jngSMyr!8Q zGuQfvF8a6!hTad9hr}Q>BIxW7UNM}=TOw>4L~KX44|uj1YeyNJSPev58|`-il*1T& zv@M6|PLK{2n-zlycqksqQTW2At-@R6;!y<0cP^S_wF6LHQ*RFk6Qu>M~9 z+#wG9xy_mUxL?t3S@l3HUwdg}`a3>iS$u?!I6&!MpnJstX2IRw(wIJON}vL@$V?|# zrwC9G=qeB7yLHRGQPLY}N8HfwpLh*-Y*~33Y;93!dx5HH=|^|Hu48mr=>)wITt}dT z>j1e~hu?_KZ;|nQiFAfUtGGocm6Trt>BWm}46cDBU{{UK+J@`=nPD|!{EQBHzDB8u zp4)GGPe(i8qDhiF3K5HX5Grh!6{B*VEL}wn^J8Rl`6K}18lp8vs;3QvNH1`Ul+2uLfH@Tu6{r|w();Ls(g~iJs!U+F;fWtncV&VEu#Ok ztp4AUZ_VF4XQ*aaKYKXNiS?+^w4uI_xva>hVUZ`E89A={2+IADT z5OQ)bNny|^Znq-i5_V1k6De!#>KE1M>E?EE1|C?(ePNbI@9Ssot5@7+@7LESB2d;{ zXkV!&Pok0>d&W|tmPp>btV~q7It_|UnX=VjWb`?-Nb|2!cTJg!jA-)}5h&YQ_v!EC z%>Zweep~)gzeZ38TlbaQO&nd*G$kF@7XRy3-Wwc87Ey~x7oC_;FBkk4+*oS4QG6-c z9J&cXMmwRphLZHNv_c5kkXh<-k?!PNjky4E>Y9S)%z1E8Rm1)0Xa`00=dt1FkwU-(>@qV$ z-OwTV#{9U8_SDTaSHT{6Nbw;;;N0R#1pzMD1$F1oRgDLopT+sG+rX|Qg?nPvX;$k) zeAri#fvL_urBe}1)>xTZXr;3Yj8^g+g)rXra*ew)?nk=C7TIi~yb~g7^{Cwou9#sB zOB(!ZBa_k!kd59f3`KtI0Y94-L!);L89H-mjBf?>5D(a)8zcVdYDsYz-J^@Wb=lqASSqL`+cwVs z6mzMZwkRU9e!xYEeiKEcrAsw>FhQ!yJa#089%JE3$^^qjp{!P?S6F20F+zZ6o}Ri9 z<**;X*kaO8zIeF$oEU45tSkaTRGBU-Pal9q;l=q&M#?*mDtEH;kQI)J4V<1GjuT*| zToUR!E<7HJ5p3WVAHBDiyR%kf%((C6*U`2d-8iFAcN{1hsi*7Fw^C`R!d}5!#u@xe z!FEURBkqYI4O2ysRperIg0t|k*Z5aQM{P?6>?r)1@J|&U>+LN`*O$l+llh5OrFlvz z9{Kn2Ax0LoSWDs0rQmJa)cpQf6kyOhZ!23TOs4j-J0m|9Jywv?@>$F`#LxcbTc6cw z{$mH%%I0w98%!f;zyo{uRE$Cqjm!#Et1<7KrcOL)4eOeEq2pA zOfZI23Z$9uSoj4B@3?abe6ZJO8Gtu{il+YPKySctQt!3%DNNZ28iLjD9L;0Dxityi zDrDQQE)3g_p^I6FJ_Cu*Spxf>Hi%%r7pCzgx*IrpW-$bs!wpBTohFj3ALh)(L~`9h zhCeIFa^Z^A?%uS1p7h;QXj>$Fg7o9Y`#_OvUS8VXi8!nWlnnW5v4k-akVV|?GUWm*=aXUS+8UYbvn&8V@gRD-Grx;|1oQB zIZRpFfE+TzJs20m4@CRU$C*wPhOi~kw=|Tl#~~RW&q$l|edu;#+63#_ePQYfSTN?Q zc$N%(sexK?>(cBcxO;Qj#LOCia|7Nni&CwsXuB%>u`~BKOQvpJxN`~4#O5(oYq)bK z$;7fX)#`-O4a#v*B-LtFL6=6Xa~>5UP2pBKz_|+Vn6}VY4>>ds6R~7e#L7`gfa*HS zfh%zr!-x&dXzQK{qWi?=A@kOrJLPuGd>6CXK&9X_Go7LJ^9Eh=+T*3XlT+#Y%;Hn)1Sc@hmPrUtKsGE{{RzWnToyXe-FOReM58q6B>6FD?3M9vwy!ta@6!3 z7A4X6lZxeVvlV+LFea3Hq_f%J>F9JMjnXhC!Zt{dRr_HRv!WyW8%Rf~FBS#vOgy(! zQXj}`Uf?4LLtm!W+>+RW`b79VZnk`8+bwEyW(@@X!0wUUKuxW5IWIoYk0!`(HglHj zCYn_(Q>}K154z|aS8iMKJQUb!PM1C{B7wX+9AAl3f+M(Tr2E<1X@gib|JsHR{G6On zv4?C?(Qn8^4>aiHf81Yb*otvxzspcvzijXC+V|RQ4#ow6eB@`JW)E!tgP5XLG2Yc~ zZiprhL2U{TN6H@w_5xcRWZ^EeH}LQ}F4=hc7`#XOMB3Se$q%vwl7+s=MQ7NAbu`xJ zvW^sbS^aMK$t^p`+sWEC0M5JPGPgoLEzqX? zYEW$oHu`y>q<@v|UDzHvTKyV+6=p+#StUweuTmlCdScn#MDHW6+D$^CNaI&F`(*2~ zfOD(|Z)+wmWJcxci;eTRJDI%FE?Td9b-|8KEoZxoVF+)K$a$~etVu0&ZN`Ak5zH_r z*6*xNGK}{rCvci-*4gOGw&870tQgR0Si8_=heeJyKyCt-L!LPAP?@mLP-LY!gJ_ml zSOgUFd|;dC5bxMQt#~#JtML$C?0%d0gi)e;&XDFKj-%*Iz(y5 z@q+J1rE>GgbR(eN`IIo3yG10El&Z~*S*pmDse8mLmnM&hb*il?LhGfcOtlYT?erF8 zDKcENSdri8F^*;>k$%+?frj6wUkIEd4MtO^H(;650k9*S3Ps?0ZjduVEjOG){h8E# z<1V59gzb7Dhq*PE;U}$l-TGUy^}j3Li~LV}#kuh5k^=(*QuwAO<*Y~ z5Pp!F%~hk7&Ys=QC99Kw@l3zlkn6d_#3$6u;8m{3H0z7RgR`wFfLWJ&#%5=M-(mPk zc9(b(YH&{I?>N1mjzu^(eO4!2Fzi96;rRG4Duu3LWj*KD8-hsjtod*Z?4Nv@nJn>KtCn+KUCYL&s zz#{P;EEacwWd%65xT>nj=WFp-qfqY-rb~J$iSbFk3j~u8WyXFFEDi1vpfl1?L=c~6 z;I`aw>QQszZqdv5O*Hx4)Lxp(inxl>09X@+n3&*p5~lgdV^HHPj7Q>={AdIDx&wm~ z(9ptJ{O6bG3z?Vr2V`t?w(g=()lvxlOrzQFi2xoULAUHO)#dnZ;wl{0^NaF|nL-uB zsBz)#QJ?=HE0`R_)4-{zGRG7`F&B|UB%dMi*Uj6W_v+n1rEwcy@%EDswqF@xHs*}- z8~GRvyB!Tt`PLr5sV0PD3@oFjsP~%ydTJrkY-cfK_LAjlBNylkvj;#@Ef;KeGGQT= zh`H0-cf2{lGW&5};Z|+I2z^KQ;PU|Kz9=Z`eoB9e(Lgfs zfAuwSF(|1OJ(VGsurjRRK@6*u{gQCi$W`^_F=+z!aZ3H^_Teo{fXtJ$VYvIO3mME< za*p#ENe;PHz~sUt*@1;c65|q(44?u|T40)y0cye>?3*3a22yTL@P))|+F}rYHOWh9 zz<{>SFr*)U(>CnIG#Ks-36zpDy+}wLLnEfINn=`^b)^h1ZBCf?rO1phJHXdnc<5~N zWiko{QmP5!~8cD~1YjV`{KzD!f+*oouU6SZl#Wp~)`DvYbl0u9|89Jc7h z;`;;vic{g@H6qy>B_Yfmu#$PsCvA`1>~1}6DL!I+>|lw z>m6v1C_ejIvD@BZDBUQ}`s>2nPoXm56&2GG#a9dJ1(qQkN@bs6>v0rj>X@)?t9>iY z>J|M4?YGE3CduR|;zq`MgF9-bjDgHT*NkwGa0V?(=*l5fKg-t8*etzxQ2-J}yk7l?LgwMsj zO-wkVl;;pe%+0-jdRXQO6?KHEn=xrP}+h8{l%pNpdpZXTlSEeYcrYK)boFj zqM(Hjg74P}&G=aDkZ8eWvT`z9UZ!4i9&>Wu-!C^kfLzuLHC;h}2cz=z%zifB$$Mfs zZAM79;3i84hF@*psjMX2>;nkfMtOy(ywWqH0-3ue3Arg_uXzvpb{O!SG|Xvo8=ri6 zag)(%;RaHC`4O<4zc~BV6^}BS;Y1oScmWuIo~k<&OOvx+l38r@>3YW~6q9h)raaFC zN=~ta0xxIlSy4z?0EgF^ScO(%t-anV(05!(n|pVJGx%^+gQQBKCpk19LVzlj4xv3i zI#-BdqS*m&X&s9a)vm2Fv$rx^EkBDBlQ+Taik6&ldLT%koP~3eJ(1xV5C#Fw+&4#R z1A2mGjyv21W0BkcBuX~eNXw5BZ*<_jmK`p-6JfI}w8uOsYmzay7`ADU+)b_wZQX8LwrToSKVq<4%e5dJ)%eCj<5`ZogM8_^dIXAcqtg zaDp2i@H{^L_dd5j{FG10dTyEA#GdKTIaCKr<3pv6pF|Hs{W=VYpgb4%__u;wjny-O z4XDW?X}vGLvB<_Y;8x(NvX!8c8kVs9Qm#pyB30~>mWAu}3kLHxIfpZtjhXerCb+{u zw++&V+tO&$uRz_(mc^kom66X7(@&7Hw0^NdHkp8fQ=BHh7!Ku#PC?f1xr)!7Vvj){ zN*;2xt$4bW=W@5m9hKsRvicdO&W}-DA{RTyJrtcZbFMjn98%sAwv}yG+0wB)9R*NUeu&iBAxX-meIJw-f2>GH$}=A?jI21DIQc@f^s(m z>L26}lAYn!;3I`bO!i`Qx_QXG`#xhf();&)aTX}Gq2I9|_Bs}~{o9P}iM;tD+pkCL zHeolfnZmDQ&VE(WcIU|aJo8(CA{{3MjozR78Ow68rGMy5X+L(B-{9s8bvr%*N;_px^M=nxdrNi@ z2&=>F)E_E$l**Yxd5l#S?q_dr zPgkn2)Jx7{TCeM#QC{Vcz(8t%D|ZBsi7^f%lj+enkUzyQ=|{dlI)Lvr@Cxfw6H*XyIu|2Eqmj4r? zwIGSrdNKCT7$a|_d>oXxG8>aUHyTG-1h}Z$n3yP=`#-elh7|DMC;O zTH$-{)x)EshDZ2G*mF9E#~* zsBG_kD1ywA$LPM6g@CHhzzap!%lg&uhhD(t#h+y>gbM!*8gLUXZA@T;+m=?ZrhWV0 z-Yg=s&z#$m<+nY|w_w0=PeMmahQE;AN#hKV1x7)f%=2^E^cae;ieBMAJ~ElMIW_BH zPS)EWhh?3L)3*naZ7`EUms-d82cA|4%>CbUIZE!3yJ0iO3Rr)_|7wfHYyiZKJF^oD zBagb}gC{dd7@_e5CLPtx@m(v}Gzn4_&C7&{vw35e#go%+3;P8cpj=YbsHmTd7S>u` z?MJ)aNN9q}9cDga)U+~3(AS)rAH2rpQfHH+%aWGRl_V&qu2}ZeSxD33&P!5HS{EnJ z6Qa!+mDXL+Zq#sDuONCpBS+KQAYu~i)jU~CX%QUo0~{Q6_ZLJ|Ro>8>7Z|b`v3}pw z{TQ?T1Z0=2=vBijb5~4yrcG=T|Dm?k)<9a6mC+SfDB}?EiA%_T{wdu2Gm%;vhiTlL z$O~tK=YjM888|S&Snk`Vfxd6W|N7y7|C=~4IvP0}+1i@fy4hQ~f1?G>7>!))7{AGn zZ5cs<{@-E^I~}=5*?q5`??sy5@GbiP-(n#ZIV*Fke?%Am%6Sz35l$dwKYvm^F)ob^ zY9lw*M{0syaT=k@&xp=s@6~C&0sl<)gyB0pTug!0k@M{ zU(X|x#vnB$|Kkl)Wu*3<3EvL-efLG{u1cdXA)WEdD`O48Ez@bg8i~i~#+HuO?!SVI zQ^o1mV1LMspH=zCN@b$YkpI3B3C)Q=i%5dN6(@uci5 zZ|iNVY3aSs(BDpHnNnas{r>9hMLAh&4v*0`Xv zuBq3sq@!_*e^pV3v$dwE#LZPh)LB?PpmPc&oNrJi@_0d0iTfrgp5M*Q=+2)UD;mYSEEqm`Z!7d=-G+3CFp7bwV#AZV?U_7KWi zC4)L7i#daqP0KK#6;3~MMRksrJ^Qjml2G(VXJiv=U%Wrr=W?X^Xj(M8T+OGl3(QiC zIxt*%R@lJ|fny0ZeF4vy>D}U9N+>@prmno!GF>u&9FE3#Z!ghCL;1X-E>A@x@WWV; zC6EF7CiT~LaAYlBC;)|Nq8t7k4=0k}oC67Mu*pNRwn&@Tzn zZ3`!aGQpn$PG#d8mI^fQL-^B$VG^XHiAl`*h$G# z@Iw?pdXtpH1ccYc2Hw6`Q6s3DCOu8_u%zaRq3-Px0#>MFnTsn{sOCje2|YwHKXxh1rbo_RqOTzmQ?;dYT_Z9eCc%xOdX4fR8I!Je zOZ^(_mciD3QkLwE$&s3Oh-0v#sntHvTs*Hb?jwB+hN*$4A(vB`qNeICwkQf}?p#2O z>Vl$8vdtrsf{TqAuT3c%jEBI3`F>DAd#a4cgcMVokQ9^`G>?bq0R#_QLJqaMskWTV zq3*3hQ#ol3NA;khz&!YaPA`{b=|TY$_C7ceHB~xl=N$z)Wq4 zGk+r&c39VBMr6|x!Bg5q%#7Nj36?ZJgmqo(lA4=v+>IDj1zxamkgvIU$67Tv8R!q; zQlXU4klCaWGGrtTj{a_2z5bK)wo9kZ%)tJs2zgm?WI)l3j?Ovt{X_rxIWXj^AU$Ch zm>&GAH5G4BL8&19JU8)Pwz%fRy%vCAE>8?Wvp=Q+%__QKkxFl{P3SSZ9)`gZlGccw z5E<^19j~YvERnX-+U8rSFk@211}xlcC$u6v&uZE(@$e@y#NZw)4${}a2m~WxdthHc zK51y&#H%;gtc&`S zw%~1kaG6h~3@x~w28ts%K7|QLY)7V`@SM{64nU0krKFC0j`HkmOZ#T<;=S#1E)No4 zqpeV#$P+ZMr{t)0otiAS3f2{c&+!8z`ttt8c=&HJGzZaKqjO zueEdW01%UJi-R0MS&Nd&h>^_LB*VH3K>ZLj5O5$gx1>)*hrE)gYg|%UKRd2vUD*wp zjvj%AET9HK=p!ClW7Ki#Lv}?<$In*+cSfSm%63E}u!2M!ECTC*e86(&^omY$$J5hd zxtKuZ8%87GtSKJSG5FEEprU^pQpN>JWtg}v^pfe0J!E0z$qPMuM?HIhRtw{-m!U2Y z=fzt4Oj3KUZPz!+=QLPu+gFv|vJ6X~VkHVm-~w}3Cq{C&*90>o1^0`}{JXUntE-NF zyqpUd;iVm2#2-9FmDY$jARVu%ConwC{DYEJ-TJB)8Ai^w%S8nkdSHvTpB0OuV&;Tt~9kag3#KhfWb zwgV$wu{M~Dm!J?l2fx9m%#V{uizJ0s4AU%^_`5tL(`N9(qO+M{AdNDXTV~=4p}o+~ zR?Rg??6fcRib^f@X{iXoRUKswrKsppUm-a3B42%arrXod37;f3LP5%YJ4TiaMSG#O z)_7X7jIfU@ojgbsUWDPc4Ct18bk{GmOy}Qwy|qbLL;Xtd5~{fMw7WVZtaQypfaR71 z7Gjx}Osit*SpsmBQa4j&s+wf|Z zVZ3ItTC-gn*j{aI3!2*%p{lBfq1! zAvx#V2(76%>YsKdn7#0YLLFkc9 z9k%KFa8M8!n3s86evwO<@+ebU+z*KZkf++_6d(hJeUOwfIwX|x^y1Fkp_!0)9d#K7 zYF}6AYp5Ey(lj)FH5IZ!odzkQEAoB6L^+(=w6O|YkBhNO9ig(Sl}#K7B@-)N?P4oF ztbzlDjrLI#WqK$(+r*jaR|m4k%e8V1jC(F77vXQ#mJQAjy9gm^rjsIk$TJ~kS7|$p zHsnR;#aoynQYMByCCPG09u>cOq__98-!N@`6a7)ARP$d|PsSoLXK^vajufBfPSP6P_}~d%$I+9rJ`H zmRXzGEys?YeHXdvmgPv>u{dLnP?F8<1;gD`qao{*e{IES31xhY# zPa74mOE@L#_7UntD%BDO+Bc*fExoeS3gFs>jpg^a1iZT zQnttH&Mx0U$e0W@fw?gx@icQ$x**t(jmuF*_kotq%uF1R+KbC1aO~@>OWCK~ISd|I zuoJrRVp<0*%62MxI2JsBruV^?9v_>Xn3CZhF_@x(;0N_bIc$z^3q?rgP?~Siv_9i+86p#0N zSOCKw_lSy7(_$yjm6k=PJ+^QKN|*=)hfh!4>+^ocu2sJLu%>;vgR#CG#42%qTySA! zfz3Wb9z&E+;*Z3Zh{+#|p1!eW*E%g*5lfw@bPst1dqJO>K2*$2RLni0oVFp^1LBUb zSz7YGD}rDWG3dmn6XBXTty!}Jb0(j3ap z4*v}Ama8pQpc@%bMQ`f3ZLT6$)$~Hkic@7x{^_T~oe+Qel#Nv8JX{EVE$~*ln|(<3 zBgvo*NI@&pjv;dCZ)9UKgLUY9bW)wAUh6mwf8stPjMB^0;`S=ebB`ukss zYNNzP6s%k5%hu7tOSXMN`^K&M%9Qf&(^Q&cMZW!wk$^-oXMKoXVO#v|cVb6w4t6BZ zp~B!2I^+7gUN#hdS@hm7Gc^L)o~8wsTwf61=O(Wv?o>7NlW3w`CPp!9i(+oXx`mUkn@7aZ75}JzEXd5EAAaLlH*ja(GrOB zf#Z)oXDnG38pZHu=S>1Ta72RzlesUjRIshvFN555?g$~s!iPmLmqSI(R+8=Dt<0eN zd*7clODmU=KUVRXR9)rmB48R>v>;4+>?{s2)*B?ba(GlYPQZ9|!ZJf5+8hLIiR%9# z610DEdv9|*{6P|a5GV0Me=slhnFRh;8}Ol`Y`4>r%KG#t>V4HSe}WS%;vX(EVIF5e zNs z>^OrjIzl+Gm2b+*H_}vgbH_ZKsfYR*peiSZs?ap_%Od~cpS-L=OVDtXB~XsaRW3>1 z*F?*{$Il5@jL@+T#sZV96jD-vlIP3H)2$$#dbcYuL9 zb=$$q$_LfNBJum2vM$21vcgRedbcqM za#ssSJoHrDWH-?T*NPWBSR4J+mJjTl(+gQ#rFsMZqeVDi5cXbQK07Uymz$S$m^(^b zs}TTWerk4t`((^+CEdeof&;Q{DUTu;`B++pZg^?_&eqUI#R;4BtNxe;LjFEmj;-vt z>{x-8=`1A@BtqR>zCfr>9rmbLimuLVE=PgQ)5Lt{$~IVkHlNi21?_!@9OsFm*>)ot zBqTj{&R!k1%>{<_v8=R&v`>e=@p0RCjDsC)oFO}xnyVoPxEW(?Y-(~=Rsr>@I|;a2 z?Uo_x*P=6v>Ekv`v9Gh$+%{j<ttVtM&&b)}tVKcl$zeF8!x?i@l_@0(<0jeYIW{@s_mMHi}Vt2(G;VK^znes->6u;&T>0xPW7v~8okqIAq zVuFrAHtVEVV%R)RAjo_`={`A1BEp{1FPb1KU+#%(B}p%Q8}&iYh@scRb)k&QSnkQ{ z=1}xi%8Pw+wm17pYyEe&?I9TVIc(##SjcKvXIt8^@MHFo$p_7?C%hj*;+r_Fec?JP z0i++S3imzFP;W5nBO~&Y-3Q)Z*bK~2P1*Zh>^ofnPeCPI7)rmmo>?Q`04pyUtdkpI zJWcNNU9Qoc(l)(I3}4%*FpU!t*bnB<5QV?V2708V0-Sjs5lVjwhlF~E>if=*n?u09 znjj#5UcV}XrPVxnSK>eEEbW9gDi1N1Wuw_=H z6J5WMUZf+douQQP2^^%15-Y9Ek{mSdRNRGmQ)X3tL3&la5#Eq0ByK@G-Jxs>leiO> zicT1F<{;Lfktx?2*Ry! z`SNLln3)=J0=!DgP{b%|$kvq;5RF^5C$b!)u=W+wyizTd&z9`dZuNLx8)Y+|q!YG~ zJ-*CVZFGeAuy}^xP}{CYq3vD}SuuPpxSo4ifWWM2A!O~*46SynP>8H36y_`zXXeQ< zHmnl|`Cs(3oEDk=GY!p0Q!^7RSf#exQ>p9RH+WN&3yq#Fin?6edWKAKLi3uQW(i(w;5rSc;~8qMRZ3d*;1rA3(7!~wfMarWVOWV4wcn7CN`ra zsRc4V3Wv3c^IaHWKK$N{r>r5typy`jE*39r*paFv&yND_rGv(H1=pJDwx?saOt z0F@mRMtE!daer|%^{u~@sz5UC`%e2FG5NPjg0W}W2N~1g6NeHy31ssiWKr30wP+UG z;2S@ZF%SR@K&`Q~yjKji8=l5!71zf%uh%iNYU^(qUw{g>ODjo$=oCp6$G&3F;+Zt` zm|U<7HX4zQ8o{zf?1(5V5P@^gquL{RjRFbsM^Yi%J)!M}kfK3$kjJ|scJ+)|R%0)* zE(+&m1*r`=@o6@9qvY*F5U>BNhSn?c^j9X^b$A$6Xlbx^!Tv}KDb$f4S$Q$1Qy!P| z47`=9pkRdK{dlHv26bhYI2wZvJ zgRyQ$BK{yo85r=PVV9;OQZdb4N#y_G>zso#3&K4;v2EvzZQHhO+qS-FV%wM`6Wg|J zXTk|4=H}krtwrtLs<-NNpMOtP*Xi!}`8_`qqi%slDkgWrQnHuM$P3wndWbyLLKeTp zENW1h(2n^alG9nZbj7LB0xPKGhdCmiBwc zph-sNW^6;;6R8u2*92Gk|47!P=N9?Z*L2Nm?AXy7TF@FA(;Ax78k*8N)~D9CraCsI zw!ThK@V645I3p?y+I!#*-E7()6SUmrw%jS`dZ(-Rq_g*bytAGQhw=OYcu{>a;R}Gq zD{~>bj^a9xz$}qp#!Ni^;@Bef!|2M&pz&E&jaW~gcNp?B zT!J4Bh4Z%{l*No-d6D8_5TeEX^z8ewgN+uziml9e1-c!Ef{7*o-){#^*{Sd)KIJQZ zux6lUfL82PSx)2aHGPnyC~O$A|NNw()|EZqx)uF-z;O?=Irq0!6!9|1qz!Hcm|F+` zH{#pH{5xdZ32rO2l)sMXZ@8%w5g(H8zI_{!Km^pDuUCRt|MwpxAxTtSeryPs87w{- zw^Jl~zp)D;K0tQQxB)#b>EVW|9X~D+Z;xvoGCq0x27Db(F-i0W-5WiRf^r|+8$}_h zbsy&rg-^C8_|Mqv4WB&}~upyUi7xREG zzW23JO8Cbi_Yzj!5;|b+ZeHHyH{h4^TPbtF9z#cFg5(p2=aYoz1H$u*C%-_OA7!x- z3;_s+#c%JBn0>7k<-3J>0gM%dfXccG1L`9wu`?)YUAk^^v(6u++woj+yt{$@y%>}l z``7|DZA6p-kAK8;MGim+kSl_XiuWkV_ASZwv9KY_?dpx%!cUwo53NwSAik6%`F zlR6v0^DC)77}{jL6sn}g!6};N6El{&qnPq52A|DPja9XP5L)K4T4H ztb&5}3R2X=WL1+U3eL1TnZ`rMAy&SFj!%pggBehC>g*& z!UfsHXcx4z0|6LMRP#97ln!;QSn`Zs8P|x~Z#eX76pu`aWQIVYPAN_|t6OCG4pGeo zu-AeM0tKISCLCj9mJqkp4eF8D9n+0z=+10IXT}Xv5DHkrsbz-0wn1yvZ2rcw;GG28beH0IA&XhM5%Em%ukp#gMlLPi|yj@8mx)5`*M12TMGcnu=Ev+?Cr7b*0`-Dgwz{0IKCfZO=RYPa=!K^l z63;_CQyX3CQDVXoqKa%d`^9`&u{Pt7zU!6`^;6FfEU3ti z=q9y)Ys|Qm^h*4^bye;UTiMbzh+NPLUC@eQuq2Q`7S8(1s^$H-bzBlk6r@p|p;NcT(@exms6tt_ zMP9WJV?2$3{aMHRkEj5f(Sj%U^FXmaX3*|7K77VoEu?*&-Ev_6hzGvL8{ znO41R*NDWf6%m8N!8qX@6{ncEE_e!DJ-Ox0AS7~4gMeKiY&M+vw|OT9sL_&g3>hsR zZ?7S*u!mE>%p0d1OIIw!dVzmUoCT!r^(6U4`MtopjIXv#OXUp*^U>~3p=l%k5vp%i z_cgFzjt)J%;tn0+QTy}GpLB~vc9<_Uf+RH(FE!F@1p2}$2M`qIc)?NaH?*5+Un431 zE-f=~z2q2X2rN9#0N!Fh1+1J=O9$)BCGlhxaUww_G1y5tLF4(Z)A+G(EO-L^)gAF# z9wx)F^m(C%`e4`O4I%T^@Kh=Qi0y*wLn8h`6$~z8OlQs%WwTetb2P`4Axlt~fm;_F zF*wWy`n&MTPHw}5**a#pgg#n&vY=Bckt>;o2`72s3*(Qo{W?C|Kl^0WRKN=buWf_3 zql?fA*_#$C<}|z&8Fmwz*do=bL~$YG6?~`_e94@anJm^=fj%I8q~E&ums?(u zSrHpE=_y|k{TD`iel;(+DE*6C+z{AF*STbnL63Li7|=_S0v@%Ay#(@lgNBlz zL6TiXoTMR2S0ij*8E)VP_V+-!qjv#hi9%iXFDOPEF2-U(#e4($*(2Euj>BO1cCn#|~@5u~W2N$$^NTG4w=&7$6pUkHKj zsmHZGzOf-yC#;E(Vwx%5&G?i^1`qb`c82ZZWE<-^dq<=5n8KMtRq#Ky)J zpNWDZ@4=R5ub%%we!fS3NSHjOh#rj$Vbd#&&U$qabiAIOYk0e%AFg`Eoc--^RX?TC zCm2|#ShnEhDDc+SM{PTe)!P>PE9S+!)ZtOV8_o_6+9pe)e8%}s$j+CwMcdi<(eX4f zG9Q)1(%S5iLel<-?@V*uMBEW+Xva8O#TLuAN+ce z^oH6WyQfTY-}e>zJzD^_{M7UYk6(djZd97`^_$SjCt-MH!x2(U5c5fbFP%+rzSm|+ z6i_T%z#6A}Mb(xv#Qepo{0mrFR07`mYXG~>O~`?v-Ywx~u3r{-8A&n)H57?U9>pL8 zszqiHAjebMdqIDp@4^tSBVG}bP<9|~Ld5+Ajl(JSoBwIp7Hz9CUqyRyWE!DAw< zR&aP4wXlae)|h0Q{?D8(C%ewIHa4=^);xZ&LJ^~zP3K_W@ZTrHHSR~Wcg+VH zNe3%wL0hknv53Jv>7&g)v4rJOoAkfI-tm>#tV&y};OLkgLmhS;#FGOfhT7oG^eEg+ zRSU7QBhL8=R5I}-8gZC{r^C+Z;9#{l=#03PMqCOpFJ!d^s!buB=xLj4ld{JG-`k#aiSz8`jtkd-sWA*3&sDB0nxzwdcSmC!AG&l;4ObRv;%*!cVv+(2L zk!CO?+R-7mB7z!_q1xPX7BO~FLRsNvSwaY3$0Sw+TM8v8Rw-4&fm-$BI-etI{PNzEyx>(JjYfP~0?iW3}EH_|?+ZM7X3~0Fa(8 zKj%@~JDc-|IC3bwPCWd^5C65{grNLNJ5qSdY-N{p5!_Dr?t^2dP<;^YOBuGuDkH>B zT!c^D*nw3Mf=$r$x{Ey;I>T9qpw0E4H^iOeKEiWQ17RmPb!#V}kJ|7%lEvtuPxDsp zx{dK3BRFy?CRTKwAWd*rzcP9-ha5M8R^`gdW0w;si`|?DiHcqGY?+M*M|e;V@pJwd zhy0sJpWhzq#3K%@Qf1sGVm%Dzqs`7DfeLILZ7>;oW1JjBuh&4bwf3M<&hAZ z%&|twggtgmt8q>T!m=ALys4)UWGC9zB?FZi@4lV~XLa8!yB(+A#NXhHHNv&&zv3`k zVDfg1_?AzDRhJ;LxZSC2_)Ji!OWW%hExJvsbnRUfWSne?2qmtk^=Z#ICy-sCq zI}4$ht4)@qaEsQ3%u7i~d?8={$j6N^8gJ+*LA%C9Ik;`P3vk-x$K*`TuY-7z2JAxT zX4`yhd8jc_I-ZJk0H*I!T5EIbkJeVi`VC#6)^}S{_2UTuQ@%u6M(~9qeo$-w`bIp* z#`u{!KxU0jkKGm2GEX7qkob|z<(3*AT~QRB7es$e`rc=@AW<+z`JFrVV0Mu05!9?6 zi@7-f2I0+|?NZZ-+jn^+0RvN1V@|CUoA%TQ<;u%Cl4T9Ugts4ug^l?}8LyNpDB=DI9)3d&yU&U~ z@P{glQ3=}6B>EP^XSH@8{}I7w#nG7mZRQcvHgq^0LF1sQUnYkmvYaP}5icx~P5FT2 z`%HrF_8vGl?-tARp+h%_W&J2oGJH!;P(HAjbCf(M{n`z4ms3$yEq}06AEgjghNEGk zP%g7-HH0m&YSrZQ?N0d_afVADAH8Uo`1^(L{-!62CBJmhAMJq{&V-4h1n$qjPnti| z3CM$&F7eJ`PBgYRgrDz%bCuQmi#IXPjD9BNO0QqRahIA~l%J5dm%XR!fxyp8Hh2-` zQY-KgYxp}hf)iWgy=DA55mqCDG)@~7r4vZlBLa7f z%oZTIxo-(HJFN!3J4T_!aCGr+5+BSFDE+D94r~ewr%AVj`E$QDq3&#J^4prx*vm2t z%j3ebVG;|g?!Gy_In4_M7#$+)-w)yNHHLc`!mcT<G}NLg8%#U&Frq_GCpIum??z#L9RC zHwN)qt8#`_ShNrJZE-^BZ#4$nQj4%x5{7 zCsm^jzMC#{@8(KLRMYCOT$H64nz<&f%b%3=%s$Woj7w0zNn(~Yiu^PR{TPH^swH0Z zBJZ?A@3i5hH+ZnC^}{4O2xk^JgvvZ%rWQH+y*DhZmKefinYu3Xm2^g(=^Xzdf7 zYKND)-SUz)4Hguxh#p}dS(s<|!q;inss`0t{!}HN{KS}F+Kk0}$Ck%(Y9TE6voC1| z-g_bClf$qz(JmsZC;}WRZnFCe&`CJ zYmHHjXB3Q`i;xiteUSYfm`5d1-6TexLLFuyLTr4Q=H5`Bn%*&|#}7jq?EcjZQJ5we zj~H%`2JXj>0w+hN(T=HlPDp~zW&A4PIp)?3Q>z>1)=bmbJyQqHQ87rOM$w;9WuD*! zuIcO+mO|ugek$9?l%u{!Lw|LTz3q;W|0>ZfQml$lXN{T)HJe)Pi~@9g@lBd2=Zyuz zEk4;SSSbPOzK|nUvnEB)d~)*!L6sXZOtQW>Gb;wcELZIC4vs?IkC<7Xn@)v~SZmeY zV5`>G0|*;$8GHfIyiL9R{u`2YhHu!(V~Tq?SFCcxy-_jLT3af_;_YW_^QrAUPkuS`6KL<%tvC~oxv z(H!TN^X9ME9TG&cs~3l-sjuK2>iJTR^OTFc4{RN>`65IMtf$336#Qk1#gq?c_ukv` zy9<^JPY-mj&3U4M3;#|TeFQ$_8I6oz?ecw1S9Ebs3Vg-T%jL?SqQ!&{dmm*wI7ffp zoy)y(pOv`j-1&a<=!{8(z;@kI3o-&=J8(Q&f8zpM@zEibTbIqhPmLuO-#7bIR3Mj^ z*mx^^FuP@f(NJP>unPsqVLtgfs1+C~5RG!;>owMKv?+b5ob%fTFynaWLpN$%4Z)|Vj&{wlk0D7OoH z+pt>bBd@&BYvS3qyghSiab^BAxVAli{&&fbV_~+aRYYUK8S`gg31}VmzR}S?CuhI) zLkqHO_kFWQt{%~AX1z=Qm$#dzFr*|Tu2Z=%EXMueLn4S;NvfN%k+koCBI zEsm>75O0`r6oYe(jPM(k?{}O-kd8`5UZL4*H)C{&Vn6&h5#5kL38;hPh6G_xwe7(O z7KTP7(jXvt@PgxZVY#8*_&$||C|eNRtk7g*=n%k{ux1|nOn!7@vwiTLmiQJ_^&mr@ zk|z|U4_Ix(E#9+a)T9rB`lF;=U?^2GM##UuI5ir;Je{fEWEddSp0eM>8NlVA%kI&3 zBL*y9NJDi851s!UDrF@9crYhZH&l?gpdB;wC(jIi;PYqCtTmMCdc}1K?n$d&T}>o- z6*p_`$-`gdOh9`bJ`(>xy^H8c>?(I8A-c#O*L*EaIZam{tZ#P=l@FP&RwoI;VNB%N)BU@>S_r z+`0~o2QFLvw{K{`v*#q2;%x^t=s@H!t zXi@CVCzvNPQanRyz`FOpbbWu<*qsenLE57@DZu>AX`TBZs^j@l$3ZAqeu`wP{i<9e z6)4858K_n@N3@uBI@)A=^H1W#*&g^A=281u(qb4W<0}`a!&{g?ConkccyHO1fB#1; zlKlF>GzAB3zH&tzZACsVZf-L>CbDw9&cTc}3A7)Po&Na?J$eZ0vg z+X})%0ba=%#|k0Kn%fH6rcF%?s-0_Nz?#QE&Sc!)7S4N%a7?(_dRe$APxiP<-IZU} zm7d+C32EI`+j0xhX2UvHPwRXD$6)hgV~2Ukd%9yq_cW}#*F4@b-zVZ}-j?awAzk_( zb1j}3mzPo$%}d2>{^GgaAHYuvv2#aZPP)$fUL8r8_xwTTUgX8i4cG?@Z=2EG?CF8E z{%ZpV_IYAF3|t}^ww<&3X~IV?6+Tm|+MeY`xNp=Eo_mu!%c&p=BYHJDJ@lPXZV!|R zH?ZtL5%5Vjl&|yNu7vBEI3-1Ec4eoX&1n12OujuBqJcwtWhS+`u)!m*`XRMByaCgc zACxWAONYt1AU^5~hgQ|VVA82f9hQh6X!)k9#P z&IeSR+!xC4r7r~Chx|Q_53IG){1E=vS|_D11jLKp!Q@wKE)w;q(MM1c8OLP4KbaNbe7#CEL`p5^SWfpips&E-8!IDYtl;PwGtV*7VJ-}G2zh8} zYGJQTw=B09kcvcgEO{25uSVMb`1zFvDlQY}w1FLOxZ0 z9(+@?voo=$9eCh@#p~1ZmucKliIqhz+12ovshj5JkrkH-sf9%@<<;eIkniLqn=NNIg^ZOC`~EL1_+OiX{n)}4sZwWpZ(7(6og=@=%j=p};;z4(SR zVPC)gFMP}$-9=XPJ2TB1?!Sgh|C2ovwK6xg{r}kAQ#E!~(KOLN9Z>Zmg^5Y5O4}Bq zk>{+`Q;L+JmFgph=b8%C(~q*g%_ED`6wx(ttnQbtMC;`O_wA~dC1*>SpI+y3Ulj_o z-P#=c>8a`bliRK{Pr0r=uH%AVpO3sjjb0N@4EDotSv5G2oHAtwCmxBT%_af{E^efG zW4HIA&Wla>)ARJMe8m{}4zxz_ADs{@TdF?Fo^&oqEcn~p%V!uh)y!<^(S8b(|Kwy? zWpaY)nenM&Zm3z4k+E?i{L|f4Jtc4yo~C=)pQQq$0X^wKrJrix@@qsAKTskPk{4s( zu{@@4A|!q?HCgL|U_(CkQ9wf=V@zFES}6DTGl^Km8xf^Y{3;FA>8PAmQxCml9vtt{ zW{zwt%v|?csCQ@ORq=E&^$ss5Sf7Y%s$e_*X))u%QHFMjRv|f0{`$xun(T&d1rPL) zV(f|+#@HE+(!P2d`Zb8rC0SF&+ejB`TNZ)_4`n+Vh5tZGkKvtESc*t$xgHntDKBjy z2eb^o?xX0^o}8lLYNig@sAG$cXKh+Rq^wzJ5MG*b;HgO~-oqDNbwJb6qF362i0G?< zfxrsaS7D;F6X}nvlZMa?%T;EgxMYVo98jQ@g66F>iY_ewjVm&4Gt!nzf82g1$1n3Q zWG*Nq9tUwY!+d&<)kfamMtiCYg;fN1>9OiLOnBUdQo1JTu$Xa`8EXXDLCgvK8v12w z5j4XkV*ZL0{k8J1ty`y-6vz%}`W^hBBj(y~N*CX+z<4~Kk;O+87U@eLy#=HxMEmP+jsF;*VqjX!J7FLwtS zBojce_MV3K222cH#EPTsHaBPn*AyPVP|HGnr5qSw!u z!j&QfHa%)?YOe(hi^AhfxWeg^_4X$6DrB{)Hc?@T38?CeVrt83QNK@)xzw)&8Iao?aQ=-7)5}PQ7Hy zUqOgFR5OhH#DGM`SS|6hO=*c@(6`~_Ct5T#g zHZ78W!7*f+{}?RB;oCDvT*rs0GLiK4$XwTlaaf8OUdR28WC~!gB**1CtSDKpieA`% zGf32`Gra+&nj%O;15Hk`{5CqifUoiO!TqofE4cHb#Xo+3$NyFOnm!}`d(P{4BE`Hx zQ}GhF)wZ4K*v)aj(@vPy9<@B8%o2sWbpL`lMkBp`$X@jEV0xzgoAbI!>N-p6`YYrZ zH`{?aMi<>Tdu^)_WJ{d)@B9mk0x^B&(63B?if(~qgFCH+jZ<<3xS@=w?nkcUIbz$> zoryDc(3l4Lb=doSe+K2KbDEHjc$J7c&cj}>zDc|f=UVR zcCZ7>ko4QKRvUBcJxgP!RaCSkMV<8EFW3 z(=dV_++pm7clq0yf2@Yxi(RiNpcX1V*OdP!nXK|)=syYg@nh$k^!~5%V5qjg*BOSct}VC>1``*ZDGmdYpktfRyIu6UF^j1KvIlqZt1vt z_|Rh*t)te}8cEse=$7=*qJP7$IKXg(r9owjLgTnR7D?r@GdEIeq1pV39U@6h>~OND zieS=nrVVeTTa&5QAd64YL?D}^q0l%<&@d+>w1F0%JV8lax^p7K&j&J<8VP|al%~mR z1Cg;0wh&ZTa1y}036Yr~h2uFRqEfBF82%bQge_FKCx~b8HC?egfe@o(su7}WNy9%` zEr^Ji(Ap@#Esy9YC}OT5M^CDk9EVUNR!;P@fRzdLfk7xmGR**7HrfGeO%#N&Kur58 zgyxa)J3Xb?0*ng%a-Rb5vU)pUqy~NVJ_tb^;6e_2Fv+Mo5qOsfVW2KD5R-4BgrrdJ>L?_N`-4NrK~%z{DuiruYzLWP<*E+P=Q6m*S{4mEx~s z6q|jyU^9SoigJ|dG+zc$txgS-#H$2M_79_e=8;Wl0LUN%$&5 zc(RuY#z2^WO$L#@l`W$90irye%AI_ma7j(2bu^xaj}gQnlTPX(CXn=j z-a#wbj2yNdPJx0JM*Q65V(@kZBxBR4&*wP~YDJixd5#Y3r?e}nt1YS1AT_iq(lyhh z$n8iP53htHNlb!?v0=PKh&;^#Iy$`cG+i(8l9v(dQpftKs%UvDM7BwHhOz-5vl0kt z5wVur-NJkn-`pHgq`=*>^mfShTO)&$E_uun=TGN8Ti8M{Ce#Na4nkc|RLZ<>4IWjG z8+3=xH$U3-VkYa6pS-qBEe2m3b? z@LX#G^3vQ8!>J0=DLl|>Uu25=>&n~76?BU z!Dg`h(@F2{mr==#V|)eZ3{h+Z71fY5iWq5AO-m)cL|@b#DJ0)mp*V1~!tSCumXAak zyklQFjKv(;#YmigR&GZD1ly_+%#5;TM#tqY;Q%W0NZ2dF{zO{^lk|?0wq@%EUnEX& zWo=KkBXah7;)>LZEbda7tp~pcvgtWmXfGMb1#3`12fz z7bq*&uV!%E0E-SotXyD}MW;09U`VS&Le?(j7eo_Fh07I7Z2@0dnZBuw^Me)P`_@Vn zSLAw+Un(iXY-zNZj|;T1JsX;%IXsEi6)iW{xD<_KsHaBa?Sd0>M%jfEs4#lp2E*7k zX`5}fc`?GAV|C1?I(e9MC_Zq9fM2`B*WUofK3G^UEn~XG8;7V}BYtgz^bg_Q7*W;- zcA%_~!$8!ueiaa`q6i3OIGAIT;t=G^M5SP5|Jn88#~aU^9S1mZ{)5T_7f)Z2fuZn6 zl7xQgbi6nd?G>gR4^qR+q;eQ`fEfsts%7yuXa^QQtX*AtIF=15aDCcYoTQNn^~Z=i zpJm<&0W0-f&g$xMB_X+gLpWu?RTJ{?=f~P0%EaDje~T8uFC=l%6ghn^!(-HO;czG{ z;^wa35y;Cc^KHQ~)c@wzqL!94CB{|<-9Nc%o+Rl(Ke4C(DQ=#epf#iTBj)INp?d3f znM+$`F9(@Dtv03Lw85wQ*1>8zQIF%YIODd#md4a@+<5T?FE^$kk1Xpu*vlmRiZ6hy(w;y6=(XL0+!}LIEM>!z zvtx6HenZw>0VxC_HIE8whFrO!j*JsC^AS&Q|I4YUqXy7K`{h{pOZg`|q$wM6bjE{f z6rS|s=zS}l)+|P3v!Nhd0A-CTpNs{By-hHm3m;!$t4BMPg7ll&tMDMz2hk-^bXWO9X;&7HMVZKyLxQA;?5p z!d6z!C(oUUP35X*VZ*m{Bh8j1Zi@DNx{)-*57MDn1hy587qiOYozQwxje(luwDyn0 zl%pmn%Z%dw^lTbbNhria^UwJ-){wAic+B0WKG=7VD~(l?W%24&=^55d5QX2*(3}>J zGnbWmf1S-Y4a2pK_aM9gowGf4_7!xV-p!;R`ei42 z3aK|GMRfMqaD6uNV6+tk0bg*HJ_Yk|2612Ogyp^9o|ZiLX~< z-HPI4eJ+H~-tK2Q2KfzEo_I&IP4{CD=eadV9}Ch_sdg2B-;#i~-I{yTsiUzj&PaLO zf8NbhJ?k2X$(zb(ag)p=N_vU+Qf_NhVK`*!w39gJ#P%u*VDAvd0JHR;F=5!y$sNaj zH)trMM-N5mQLV{s_J&@U?QcFqg=M)HQrS{abY4S7+oCLIrFtpEDU%wUU;oP)GTh-M z<5py?nTeb2K0?Omz2@EH4Qjg)WvSO7w2H=lMp18mmVD1((;~5MyG6SgO2%ZM2uV#` z;qbl9=YPf$pv~txHH}>^B+idN*d6-;Yv;@bomqc-P56%fB^;Px#N!sPi}icq_j@pnhB{6y{!R3{o|67x2E=X_cG}VPz*;&%!_ex6z0z+ zoHkJpxKe1riseuW;`X+(@)eBvWy6h+CPGRPHWSbOymGEoT|-THNLo5HB`{)xDwM&G zOl6YAK&9{a-58}7zc8FxXf?nqhO4d>%8>S)uDa$DVif$g)N+`{0J2|*d#G>~kc8MucQh}1zu9qFa#LIM zPf;*TP$~s11cEgX6;c)ZfBc>u2`thYaH<5jLSP_=(SM|ti>j%tr~DK>GGb1bH^Zik zqLJu{eSOnNH49POSArmtf&J(%O4b5s_=HJTljJ8%(lP&{8U}`lM(~OCtst6%ndp$N zxD4@SPK5fLbKoM>=XEf>>-hl>!apixbBzc+!#a6neV#NH>&A^Dq$t(_84;BZMarIG zN{|8RWZs`4Ms#|eaY!FWon&CWYs^78)CHW`P$6KF3p*1>V9tv-k_bjmTRvJi;QLG- zCVy}ZFiBhEe|ZUd+^hx7@$%tI*dSu2)J1gYIE>0Vd;_9e?a0(V2fII~2G@r3o8qB~6mi@OtI_MX4dlqBw#6UGG%HZ5zP^xxUSw~YEaEgKz9W$m5{X6#NT|%=T zg)&@rD4vU2FIve998UkhrP)yJ| zcg!~m%sWI@?;53ZkMCCnw8*uk=z+vbj{24u>|^@t_5r1tm0!_>w9`+vVE$;JE;`a( z1i(Q($l>sb=~K!xD|B;;_eyVT3dJ*l*lG@SNZ;n(0pTWuA2Nq_R&jW?tyo`ypr$Qe zB~7k4!Yk;leRg;jCE@1s`e7#OBgZbm!q5$sZhqMDK9Lpgz?eZcTby&%SMb!e!d5eq zcc_@}keSB#VEziD-^>0mq%3WN9{dZYj7gHuyRFEk#x<8^AB^y}sV#C-Ei)<~(4tUm zhwmCv2I(vmz?Cj(K7vRXg%CK2uk9xmAmT?ReO|}i67R=VIb0LTtHmG}H{CRaca7$W z^cGp}SizurJ&;+Rh2tmE81c!L1vXd>%(_@A9&BQddWyV<&FlechLaW^+xzi!b5P}% zc$LoUmiwI)SSB6{FN_`GqzFxGOB`tPLovkrSVw*@AbiksAjAYNeF)Y;2cGw`bB_Jj z@)H;E*bKd_)4QZojA1e{JtJpdf^rd5;#xF4$c7tk_`p zVA0QWnH~f3$aV^P3Ax|Vq{6okp4`|~jX?{@(kxM{NHy4AXJEW2F;CnF zj)b7ly@#(7b`Z#ybD2Ks!ToE^-W*JPh?w1wKsq)59%`ar`nyc|KSx6h983gDpTy}} zaV+9sjM1NmWd=KBh`&wkAdNzdTml<*Hu*&^`D8ZvB`*0GTHz{=A3chnQ_0%5soLuk zG`pCGxdI5}?PC=ae{8v3EA0t$8DqhlLUzOP7|)x6_zUJBpN5fp?@TagX}rVl>M398 zFT+$3(LVmZ3PRu%(x`vxyc{OsjI*4)wIG~* zDD~2{%2gDEcF5m>nD0UXomqz{?gALXCU*31am+OOS3((ga7?CN-IWS-U{U;eRcX{` z?J%Z=xq!cZMC9V#Tm}(54ayaBDTmwiHGn(%3xor0_Z}A5PCt;n3L~Nj!vXvQc}9rZ zgFrozC7Vi@rmRhX-UUo|!I9q(=KQ!GjJg3-hY1dh-=NrqC>Ed~3bVfB%mgX!zuh3M z!Q}Ug-!QhJ2mm+tY1`m>B0g>$iyqm#Ao*`F&-T&8Dl3-B{`wXqoFM(ds*Xx3Z4g}$ zRx(gVVo>*pd~>mu2JT6^l}=X4p3#UK=tHI_Qxo@QS?Z|7TKs#zt>#fVUrtjAw4;7F z7XqxWxx+9YA;a{c&oN^x%tNeaKysgg2$u26d3PbW@#)PHGSqs2^ty(Xbe9si-{!+WYj`ChH| zbk=1exOKgF-KY#T)(iqfJC_sT4^gtb-9%@CX#@n38e_&ql%9sNXOOmMR4T3ORVNpT zdz(l35>y5acc<_jgFJIb;k~%CB{xn^W2;)YNbtEOli}xN^XgZ>?y~|Ltqh1*zm5L~5IJ+_N-%`;i;->iWCQ zMylyyoD?5GpV&;PFGCC&Ov7e{d==J*X?2!A4#pL|^6f~qc+k5OHDOduT^t;SfS87Ha^$Ys?}_Xf0Mvrh=-LjzA-e=ZKbe zOXGklnv6Q={U9-u-BZbLZ_i(-Atk(hNEP#hng};H+;mwzV!XT;j#8(^s*yW$olhe> zH7oaAw$Kc752q*PQjIp>+!%ziX-P~(mfX}UwJh~2q`1?#5gkFA0zgpatVfBNUe+?m zWh;@txhSLRU&&H*;AUtek|kT&@uMrN#2dkTxaO$8RhjIATDp$F;*dZo&a>aID;wT| zh;7jm{u;=73(|((xkqss;r~qKwvToLE?V5uZ$M2}zB?9{h1 z0HO;AW%r+xAd>Opl5hqlIhwIr>`V&G5?(&R)koHr3Wpq3dFoO$Szc#{kZJh5=vn0K z*#V~aQc~>WjXD={@QBoye`d`Q?-Q}@+rA}!7R3>*7b6hM?YV6gVCi*e*CA)?)S09n zqCq_@o`YhD(k&9{4HDxGnmUCkGzAQLro6#nIkfsXiV7k%A}erVuj1IjjLKI2sVR55 zT9Lh>9fMo8c5yai7pVodPW;|I37+)At5OW^zd|&OoA14kJRRf$ z6q(WT<6ladviteW_o?CYSwI|Qz;hGv8EyzdUKrYLkrKkM2d&=w5=Z+=>U%UlVu;W_1ch+}L}2;ItnqA8rFCz5U0A3cl9+M!tbRK= z8eNiybt{wGRBxL9%o!o=#(9C)dsd9j$wymblsYlw=HT7fnwtL7nb^7%XN7Z|9>?IV zh{Q=R`JhRI@f-=W*cwu1`%hmwKjtffL+S@ zX(1$#CrKUby=~M|=x1);fZ){w&u{%cnM^J=p!LZwOV;bKXB6 zs@CqV-9Ngzx@xalz5Bk`wR1}{LK_qxE>syV5^51-J7?OW=<@XqZh^L|_75a$J-Zu)P zImyaeL^rkD$^K%yOj$_bdxuPgKGZ@L_pIG|p6SRafsw`7p-Z5AlRP}{A#YvaLraB5 zjca~-XJZJE3(3klU7bdA@)KTj8{}+&ipB6YtZYw7_UHmL?ucpF8u?{qyk%@0on>iW z%G%!bCz49J;)fcu6qpUTo$ET>6ND4ihTK~*9eF*KscWDsQRTXtXHIH0?Yzu@F1*|B%bXrkWUPhAiW8W|9M7E+661JkAlYdjpQXB#9 zkR_N%42yLdlCyP*wEi+)p9G12tVt(V_kRidcYC19quKXU->`EH5#Tn~G`v(an0BqF z{sRtX?0@u3U4Md1UEANEs{}r|2R|!Dm=4m z2(wS$X;(B0no;~i-rZ*dch|OO1nLcr{lo>so#BOgrWDnj#UM)^(%jM+FZ*9T*QTNK zBUo0GTUJxnl#_+!4U(-SHBB#0&;6wxal4TjCtuG3+rW+c}Uj#Q{%Q z44r2a4E+46Zg57)GkR7l-)0qq^wx0@(^gitPy1Hz5T~g?Cy4NdBD$!JY zLJ-`8!FupJpJS*E%UHqV;W9b#9y3DcyYo*o!)t<+n`@XFUJB=XO&h~@kR^YL`3K&+ zrhRR{O58lL*jZlZi_L|Puh(B5-iIf%nLBy3yuWr3K52bIfj%T&zk%JF&$PZJ?uX9H zInPz2Q?LHQ%G;AC7F<%(`h}(GqiPixB+jvi!nQc{^R0(c8=mdLn-NtlQI0uo(CXG2 z2UHts?V4SXI4#x=AFH7Ms#AHRIwD8R z`gp$WD|)p9JpKTtg%G&x&Js!LqP8d5isTIvQXK!>A$cCd>|fTDsVz0Ln5VnhwvlIPA%Q}5>TQa{8Hbe_@zUjSlTk@Fe*U6?kMJ0ERQL-%CoW1g_?Bf*VdA1(y$;xn? z=G7@C)-t+lmDP*TK1gN%0X8Ev`0y3bv-yZShW*NEi{g~LE5US+aQ(-Z zHmAtO;WImUeqDMUul_5yEYUXL5d>lmkx1e#{r-g_y#_B3wOK$U<`L6k{u4&&pGv#( z8_!n0FJ#UJ=5_HS8SWA=@TBFd?_3M9yW#_LX9XC5I2J6hg3Q0n_AI-)56dTZWoiQa0S zGoo^h$45@J<3ek+r+cYqK5twtwFhGOgalOvYodU)4ZH9lRAZl)^kxivk-DY8XQY zB(d9FD`i~4r0)$GHD-S&-OK)}iu3%XTFfU9Vo$5LU%0M4&6anbJ!`_#12JwW+^f~~uy|6GWDW$Y zJgT7QuBulispFl!VO^cw#Y3br{ypJ^icA16Xp_@LLYX{-!+R`7p*%~deOiEAO_Eo= zhDBMG)ROc#^LMjtgdIx6TQ1JtK_0=0FVO!f4!K&jGPwMPmo>ore-(#_TbkOK{I|^K zzr-OWYTC|=;s8Eto(ANJ={+QDn1j>}`9LYlj-}+p^x|~#fCHp6L59X2DKwMu@4cE2 zD&I4e-AycP^URFfwG80nm&@xvX<)LBId^WtN|pUA*RJc=>&cVA57~Y1P-{~T6&Ak5 z){bq5YPrj0&yi{k7I?$;j4f`4-prZWkUlRxE^=9QIscu^7zZ4qKV3+p(seG3$y)EQtXJ``jKi{6F*IKpGP8Fm28$E|A0 zdcY}%Ql2F^iT}Jl6nutJbf{BoZ52_q+yAr)?$s)d0nT{zPE$mb8;9K*W0-4}F+Wh? zA18eTSqj`!lCB*_usN6YddgD3bxsi-g0!n9j2^;5=P8Up6F0ros7U)%JlDoP1pUgk ze1k4o1I!ahT^e6i=@!4p_>KhK@G}@GTQt$I!=XiGEUIm%BOWCEgom86Ij&By_s0`U z_B><2Ih(Hi#) zeb*ejw85vkzxr6I%cHmOCEtroGB*}IqncRn^clcms^%|eiTbHQ#ZgW&u{Pf#j;^S& z{z&oEOgLQ>t+euSfoQ)81^V@slGyA&c6Vwv2&&uYVi4z{W!E;dmjn9Il` znikhDV%K7af!7nBn?G)R?m=d*2)^{o-Ko?DyhxTZ)RNM;sIoNHuvVEcX2sKZyE=*X zl2ThQqJSKVlM7|M1AT#o(VokvL5a@Meq6N&H_v_CZT+71MPO|S#%_@2j%)I`UDAm- zofs&o+_EF;%5SVYS1F}v0 zd((wzyZ>jS#oSCiqG0dSj~47=6}tUkXed{ck+?V*(ZikoYMg|2kU($QHq$C`)={SDENiEHGFObRtv zU6btzfgyM?Hw*&g0@5O3gt5=k96c{g(sg<}Oo^;9yThg|zKGm@6@mQ)`qHSbF{L&9 zp_A4d%K4@siu;`rWz^Z-*vq{?drKzTho?g(#0x_lUkMqd;YbkUIs-_#O7UryS6m@I zlKXo7aC-4z3^&O;3nAXX;#OFQ$OwWuP+(9+p|+x3$g*@NI??yG@mOsbZN)tpls;q& zBQYNC7pm_;+Put3y`6o1$syM#o)Hd4!=mud&a=YSiRrWXcII8~13*YUU&dIxLK_6xE z#gRSakjvePM!-ZvxUmo0~B8oSO&ucl_9sOLC-K^5~55?WS+|m_TGy zo#o@{nbd1#Fvsqes656_daWve-SD{sDn_d!A zdxFLQ=c)jSEJ!lgFII~;t5K=^uC`&~Pzliy!qRjiNqYbBlf4iD3NZ4e0IsK=iT3Oe z-)}x!fiakY=lE|;EIFgIL`%4M3{$gBP$W@3rE%Q3W~i_3 zb`sp^N(zdXI_XYD(O{wn;Z)?b1lFtd z=EbPvgu1J@czcN%c}T@frPJXg^OXczwkYP{OD!G?a9&cl%m!0d$hyKs34&s7P%+Q- z_T|rySHSyL&?w`sn#imz_nF8xi&|i(*=;ufhB#CO1rEKJX*MlUJk(kp$$X9;Cv5_c z&~D>6dkPj#g62%x&q)V|-C17m)J@Eko>`}N!WKVcIr=Rj`a%GP%&7e!oC*VX z8BIMHp*8axS2a|007zg%L#{O^F}?Z#Q4A7mlbPl|S;@BCI&o)HlD;#A2+GGQSyM*h zkmF(-sif2H(5L3B4mt7ifFFb*GYK9cnw1QQs(-z4KzHo;!p;$_e2XwaFAGU@Xb^u- z@dhiQFXA<^W_7NR_PrW&m_`=S7(1-cYMQ<_tU=#EZN{sdm^*_}Em|^ADLvEk;y{xf zGu~CkP>5fmm$6>}Dmy2R9U^Q$Zd|7ZvhHk{%GV&CD#d);WB7Q)c3>7{xaP73oLJ8q zL%zlohXvQPo9y9cZC5O})UVmiEUZjf2T_E&X(SA>ujWUGk5#x1%C*!(uYsVz+?JU2 zM-mZp7K)4HdfHr6=8$b|L=Pm;CYZ*tac6bPpPs$&U-wb1bf=W@4dlO*l^4f)!vSJ+FkFCUaD2}CF> z&WyIkchQgOxHgX<=uQqvIn-YCj9TqY=rJb(N18JiJN~7MLZNoj%eIY!`!WX~bkdRu z-C>7TCa~kOkknRW3I>ZO#qld?swBO~6Il^_fO#OmO^WjU&fEFDVzKtcB|JYf=xeCo z&c9V3cueu#4+cIzpt&D70wo$ZkFX#C`?0TVYmw$u$Q@qkTycWz#@BLyq{N?gMq0U3 zf^Z12dK|^6JaEJDSMp!_n)E=~a1t*5ML)xM|&{HUTbJ~~;7B66Jo5hD?(>raM`*-1`uc@x1hQ|dL9;I+0>1A#-N zH-wxEZ^B%)^qO7j4bc2{wl|gsMg;8wF-6w} zu_&M5w}L?i9V75$Fyv&h&?9vvI%9VC6%rD{=PjQ1DEyOe?roW9kx*C3um0ZMXP@}a z{LT7&{dj=-Emh4ll}vqOysQi_!g5yXSE#8*SF1jG<0Z#&Fd3%xcd%5Qr~0DoY56eI z44y~whw<7NUIm5Kmg01f$4GTrQpd^=iVSq5mu25;J|%x&Vrxd-vDU1y!*t03FX zO8en9*X++SUy!>hRfV`viwjPdiQ+t>Y>Rr^spd>(so71z`iZbIwQE&z%~@z_CZVms z2i1^jo-J-ZWmm&=%s)H04yKC{1fI~he@VhH{NVE;n+B4o*o7AQ%3yqXOb!7%3c&!q z1?;`66-s|3_w9G8Tf-*hA(mGNMEbpkJ3hIW$>s@pjK2a$SAT=%GLOHw8Mc2jafEcnl|FzE*M`V<&K02mgH3a1M3n~L(-Q^yRV~ucyzj3A??PcTzQ6ZFq;Z8X* zQaIH22?-w=Bm|YzC#Au_?m~Ox05l?jkmM%!VpN#={orMpVQ*Q)a=dN;{p2>4M;DLfT{mk9_!6;?4@Bc!_{)Y=h zv(sw+mhQ(7Op6~s*#7^opZ{7oExgbk-{ygnohLmrW-LNjFtZ?JBw=#HB(Zf;QV>w0 zeo|3Tt8`Kk=0w?pso)xQ9l;7U8v2@i6m^v}YC=*%dW)K0T^5*K3@di8+ATG%Va1?5zqH*I^$uH32I#iVnJj zxX`lq5*y@h;z2d2QQDv})@hK1bpPbU?H>1C5l)FB^Wg0g;~LcKIIt= zxPH3&K`siA9W&j|fJnh5nq>7KDe#P&K#{TlbULcr8;hI$EG?%CClak7)9R>u8J*0S z9FokRlDc>eLugqfNc*x zG!vAwUkr{pjlQn7qOQEUB2QmSzoEOk8`xM0botwu$?db5wYq{8;U)4<$zG%n=gh|T zp*5^0pf&b%HLHw;_1Y(LyB3ouL!qk_mq& zfJ=G{u{8`(&y3dE+rWerv6s18U_=xmMkFd-OfTZu0-*>P{+Clg2}b&%BN96I+rrUX zB|lv>hI&Z7kUxB<|WCRNUPLU>-#nUL3-ekRdMs#PlbJgAZzX;>)fztIPL81^goXrX= z03L2ZILEdGhx^@Ql{A;A74Cw@&i?#o5x7y$3&6BQi<3TwHXOLdY3Aeu+P3(%|!_={O=cWBM#@PjcuL*sFmu{s*i3Q!{n zEpFWJ6f|A}X9#F~kZ=V5d%qH}ki4T_S)_wzGh9 z5uNAf%%6Z*CN&)1(@N?ufYs@TxQz+8>PD8v*Zl*Er{2D=3`mOJ()t@JoGw^X^=8Rt zX9=Zq9_W>R9xBC{Aztt`6&^zk6ZU~)S;mz=4ypc$_TiTN7UVoK%UAp$gdD)6u5d% zjxT+K+Y$_XtA=z?pbmmQVLuz-*EGDA11$U`j#PCqBGj-v(B4zW+=A2Isz+E^r0<=M z<~C78K@XVj2A|a7@)I;0(TnK_H3apofl;O2C}LK39K<_%=Jdh8i6kOpkHO6i7omx` z?Ao*QI){a$=i^{7y8i{Yei>?e&82niJ2n%rt^QRax$V&h@ic%*^_)b6tHs&hf(_^J zFWZ_os-&c0@_jxPocSwx3XgG^2u;mQ@%VR`!{JHFI6Ch^V3;9h?GHX3wvl~eBr4}Y zyEPGoM`pnCYyo;m7SASVLHTsqKMAS_GJikw`j&|H_j1_I@qMxv9&SbpGsSelgpsFn z<*OohUpV|Ss$9nH=xu(^J(}|6`A4w;_**ted>tKsa61odgw8!G&frhp4Lbz<%ru7! z7KdO({E~GP`;p0lRS2j(09f1HuVE7oUK!aQEctdrs0-3HA)A6%9KzzzJG8MWdcJj@5|<&Qk=%iB=_|PWhcbt1EV4SMS2)k zH~a6p405i&w&Li8*&~727vlXpz1tAG30(#TMWSr}R%j6j%^EKXS)Ib!bsBuydlOwj zWU@UA*L1Tyiz*DSD`1Iy^S;nbH;Y9HWGYQLX@ z?ucj4LHD}$+wZ00+#2wXU+Qvni>PabeGSG75n^soM=Y8O47g-)BA)A zc_Sa#OO!T;f$p%eVkHP&ATL6Nd+YVKVQCPch(>hhVKDVW`xkS*rnkOKWw2Pd%ehTz ziiUh&6OxlNfx9UEW8XZhP-Mwu-gnWET?y-)eT^vlv)g)O@TTdL#*cC2DaP9I+Fy}J zRFx(QwW{_8l4M5`R*L8%#^}*<`XZR6G!GTG`k~DY^7U6Hpci0_+k?AU{X!DVbn_kv zpkUczRCCDS+G3PzO=Lo3RWW7IODHglrCr6m*+6fmYbTmx?H^a(x`ulGF+2lVP+)s! zU#?hHe+e!RNh|q6-uN>{XAIl8SvoyI5bH?rp%Xblv68jq*=$S|NB`5INfw#5o_1@Y z0Yv5lhq&Q);GZ$3j`GSD(`8e(2UGNAbU6C1xy+2L7?T|nhx#a`S5RwHD9d8aluMH+(uAefMvKEdVlN9rh8NZY!2z5$D+P~(1B69NV z{Y%Yf2F{doto|feX@(KiR0&KGa^%dV`8%6>mE>g3O%=EMtdJ^i`AVhmEs!m93@)k{ z=nbaUXB4vOjDDr7<7W90aRqe3)3C6UXb9it*9#}itO!fO$ua{~^QL+0%D-|5ORs~D zxaD+}%DCwiT#7@4x?=0dJb#80Z@-^XSRVM}Fx%CS^*X59LvDswbcR+s&FO5|>5NQ1 z)lNEBIL={gR~n={OD()STWtg#kyHWiLK@B3I7&bV?c4I#kfqjyjag+h$z)JP*)!4H zHP$7+5i##(Z_K$T;ZF1nAOhR7HVKq?H1j%8N^EZ zIi~tlcxhTXu6NXX@C*puyOsw;Ilk;nX4}w!?X=EJ+l4`pj@g>wMsD`{+UA=WkL_aE zBp+yJ5Xyd{WjqlpW#^9IqK8Sxz zw`a9xjns5kG_>;t+ff9QAMpP*xpHsfSv!#mV64H}ncKlHVXP2Yw@rB-@@H$v&M2F8 zkirGK>QIj{bNnHTyeLd}X>%SQjqi&gK@vqd#AG^(!JywM``0UN>0$dQaaaR3bUa6f zIq(uo7KgJn1+`B0g7vWpY^YOW`vSQ&>erKLF?VhEl|h_}QXTZiZIX>IjCY{n0{boQ z+7zLR633a&(tM+>MMeD#0*TfVEOOh^YW1hCom()ToZ)OeKAO1_4fa84j5=-Qnp^a( zZ{!;F>Q4o$yb)Thj`gMsaPq7RF4FuWROohE5Ren81=tHQ;=jdNcqU=ty$o3h$ZYA! z1Jim$|CX`LTt~REWTjiEU_+Nan~BvgprIt&vMmcXLBiZzOtYO!NP zjia)Qf+HQwF$el~NsWc22Nb7ypxlX%e|ze&I9XumDTp=RtHo9`VHLF+NJf9s(^pEB z_LNcrC4J&_0B9?JR%2p?kh+O~DRhECxHTXX z*AE8Q&v|i$bBpQ=lQg6qn(#<<-$LEb-U})Cj27jH&MReP`Ht}uQ@lw)nu5)gAC$Cf zCZLn8wDaQlf^Oz*U+^ido1~+BW1Xy5F2bQ2Dg&}|Fotm+-B}-F*_Gvw2aVL9Pg<3)BAB%Mvv0`HUwA9eV5p+D3%PFe7cj$Iuq3Fw3x`D z#*>|&i*gKg%8`?I%b=nXS`k<5vKQU57V~5t8&?DFsBrTp1GDd5{Pnf8u}4Qi`$dgP zn_HNZA~J#$y(RI1`9v1ofyBY3V0bkFiq6f$<4s%d#JN&F(@ZR}w+57oL>D z<>McDJnae>VUl77LDd;`E_cHGL?M{h5%;=sE~Bfda{ejza$6E7sI(u$BmN24yQvc0ng~C$}*dU zIB)Qba){(d(;yTKjUi}9E@BTO<57Rx<7>24{T()xIS5FE;eqiWMP7=5<G@%?-d9;v1 zXnDO5s{20F=heB=wr0xyH#Pv*Xb*t}x}oY;m!x-~#yo8dt|WwsC)L3ojbg7Aby~-Z zG>|i6^+xUBSzYe$zydW#ulS=WSeU~;8PB3GNt!xsmO(

    `?D2ng9Z3#}X4wp;gAOL4)8u=AwTjR&&{rZNVP~GB&|B^rC z76&z&wER%RJBTA0e_lW>hkQ2i^O5_lycf{ZNKMxMqVcT4I=X0~^*U>~f<6Sr!66VF zfD}7S%VoXSU>A!J9E#_9r!ATi{B+=Et+WhJcP7Dekl1!BIT%0UAWj@}%KYF3kZdQ`W- z1>H^q(LliAa_fvd^$N72;u?$K_+IM5nDAu()H>-|22{`Wj2d1tOc@Pt!Ch{ohv_ANOa zzh9sK>4E(Xf#J}c`yMmy$+18JnBRm!^!A06F$s*H&^f%&-K--)q=TKNcW`A<0r@&1 z{&ep7QLmAM)K><#@ribDZd8Tev_Y-!DW|8ClMYBLwzg?jx+}YrpLH%iQ`OahP1M#| zFQ%);C%v>7GYaa$ykjd*xt{XMOyLFM!Ts?%b9`p1!<$#+o~UN3?=pp^5hSuUPBZ}31*fEsVW{?FaeGHGtHiMFa zPh-YcP-2q&>jBLSFC0mYjKf*LSJYQl`x61RRzh`|WHWhdB@ffQiyr zU=1w*JSf0Y-o{yS_>Fbb7jg%&WqZ+k(Do_ABhR#Jw!cef^Fy-xY2#9Y=t^P`Fb@>% zZ-9waVMH8(O|Q#W=m)*w&53nA@EI?(C;lYwH#zr%`J`97lT~xb3|uq}WxHffk4V;$ z*O(6BD;YzNbx;Ieflt+*htPN#eiC6N3XLw}0WYgc>y_Hl6G{Di8t^Y*D?JJL0>nRc)_EOCZ~)BqNqfvUv^XA&T97uFr7d4s9_1bj=I z!eM6@R-fCVAjRjEuh170;%(>0=?0w(VqpxS3y(pW@KeJ=(L?YhIIm9HHmojRy?y6C z(>*=q1EAusE+c0D9DRB~-y%d365M&<&CgKx{&G}@{7Z0`BA_pq?=M8&zf7_HhQWMu zi?E~mQ~Z##^V~2suK7T(dp!>#J1S$4kUsu_l6T~%$2VG_cw}ihHw6lOKtz zuys~F*AD>8f$D?&Y`plyJYO{6GQ51C{gHXmk6u(2 zY(utouoKt7BnlB~1rS66@O7VhxkRoNX6L;ws|>DG(q5=tjrP2ub;;dHX!lD5Nr_T_ zYs_L3)GgRSCwF2^iM<%zy@Fbf$3DVDomWIjNz#1Ktlv)F`x1@^SVCQK=7cpOM0w`@ zs<~j!9`wn#$o0V|8`U};V)k6`zvi{+gZsszD9hFkD6Un+UY0!+X6cD1e9O>u1u$J+ zy!O+4Td@dYRHKDrbwU67;KH4FvYR_6gnSTt;P{bcPxCNJ7*?XDk6Ymf%&_9wZ3&I} zsib{&={rI_`|W@58y7eJ^XfSPfBSF^(ev@Uvu5ZD zYVjC=8p1%6YT;2W$OpQ-O2%=NG=ka^^p>-XrJ^al|*F53cA= zi8-*Xj&Ezi>JFL~Y5yIzj)HGU<3VA)cdiMw+s8l1(Xjb!9<23{UnQScK^ z?uV${fmyK?rg}Ll=k#NHzQ_Uks#S@3rO>2WZ2VWNq>}OoIgPYevZ(qRB^3o5p?y++ zD!%b#+uvj>z*7YUY(lGdCCb)LQu>Jxn7lXT$|z4(Kwd08PS zjvzSXosss>Y@gbDxGg+QHCuK4Nzd=K&+J#k1C`tJx8t+V7O#y!^q(H5ZC9&p2j{)rT#FvY+4&a` zn*Nh+Y;Sjj?}a@2WVb;n)&Bnq2C7BKMMc}6dWrE9KQsxr|CP1-ay%;Aa7fR0Vunh> z@L7!UAPjGOSiD0oJgY3N=Jhjv!nUV>EqwoWXtcmJo#&h=bW9dIq@=L~glHanWT!1= zh)UtmXf)$BTM8#%$Y9?W2F)7egz(uM%4g8V^Vj3NQc9KjMca<-^K}so8ecGeEKd*Q z!5|wv$v3@ym!?VHmaJm7I4o29{KYh$INHO$pnyXH0bparWo%}L z7eY}@P;@i+&79tI2md)iH@7b(@rrD+^iZH$Q%`C#>n!06*AZFSNy=P;;GcIGDZ|6M z&|^ipCpAl9dB}i-#3JUu<>ZwDfEcUpr!y~Rv;MUBTaU5-u%WnC>}e3iK4qlvgYPED2I@s?&5FsY zD&^C*rSPD}hQeEt(Tc_!z(;GlC$UCvts=?7y?gV7hPB=*Y&!C^{Ju)r`z2j01hh#-LNFYr_(!Lg!Vc6__*e*jN_g$vcKX zwb5D?shB{BMjDSv2x}~xtO5%q+AtC2gHY0k z32LsOe6Wl!l4~nyUM5_lN@ghV`A2)H@vI9+qc>VF+`em%aO&5R5$=s~kP9Ew!nHSl zEZph_p;I`G)AvE&xOLU`-R&_WcCf-0U3K#;SxQR&Q4c`SW)Cb9&VYODdA{cFMH+s_ zh-6ZcxG_CrI5Oe*Th%2i^{EJX5jxr@;Z4MlS3QF^o%u9ch>%}uysZtlWg{?#X_}|^ zxcKSKGP;#jKA0h2F=Q0>$&FlftO8e-LR^JGScOrTj#2PRAF!^)m254uPhEq8-E8W> zGO*b~-7ZlTI@*GLD)gMK9`*8}rY>bkh8FpI?e}Ou9cy^&IaSnf+1e~xltM#Z74st1 zBP?!N#0taurcu{tWKYo=Km17{*W*uLl9e|!2H5zNbove$JxZT`qd)efG_G-a;n}!h z&`CRK30~0&+_y&(CM{m;SK*rc<5dG0+%QI+0TBfh6i~T$&eePccw!!4Ks9VL`Kie#`5_CD%Td&=s$Tn+kx7;2%(1r5YC!NP+HFKK) z^JSuGT3Zk_$jL53Y=H~(loIuV7?&6m1KY%!?KDXtUBitIZASyJ?iU1(DFr@)!Ywsp z;hXWuZAH@?kZc=n;TBK*UjO_|`oJ8*9>u;-t$qD7Kbkz+wyAe)+aldJ)ox~j+|*CgEqOhi(yGvXp+w6ByL0ZFW-A-2^qA3!^eN?0 z8HSi~iKH9a6IH27A}k_tN;>*7EXoM6C@DSCSYXI|z=J!%XwOLHBq73~6oYI5(OmdrOqQ6v$a=Cw z*BM#unR$)?9ayie`f9WjYc6A-b|FP>zZ$(m?-}{s52aa(cWnI#IyKlLT9=TXs+GTo zDi>O74l>Qrey06QPkpY0DQ#xmH&Z} zYS|kU|HvPCDzcSE(7(MwU|9A@u~zqi6>Ci}h_j);2eqNUukrl;v>^}-;2^S&6UjyT z4ZHK(h3Ge0vz~Q`IVn+IYp~CT^7~@yL7wDKa6$lfyCu^3LOP;7G` zVDkX4flhLaq&mAm#B&Z=9WArJXJ{65*j5(nxg3~qg*AtqqhihoF1O*J8>FM#)=`6u z@rUHuLhR*dLF8%csZF_Z0}e9J{Bvmw)k9IXG&%gJCx1}nz@ZO{Z^*>xh${7emS-|Cw6%*4x*H) z3G!XV@k_H^L%#N4sA0xyToIgmA!4dkzerh2IVh6TB^@R}LQ=W$TFf>%+F{*Nw zB~?=gxf_Vi!?XA>-283q?GM`&ggo265u!qjI!$$_uG*wfTfyuz@uiZTr%`;PHf#XG z)h^WqL-t_XEv0SVu1u$n*rsI5t7ir%l`v=G6eElM_vgMII$CR zX*K{l7&z)e3cUDa7e3gRlEjb$KIM+H(lzpPO_n2qU|bE=&*Z*~Z5r1*KY*=>RDv&L z@BW2F9atL>1LmF`XG7Rcx`6H|5B+jU>ueA$U_) z8$OhH>wU^xFUhB;e4*?%qLvc3+ftwrueG9%92ezYUXWbz#3#Oso>5SB;E10;^`pOn zwQjR0Py+ttzRAA7lMgABk+K)e>~?^OoF=``;QOs+XRB&pn*1pyckiFeUP7Z$eGZgd zDko8Y$+qEo{&)7*ZgWwlrtE2c(JnP~^RgCiF2!I7j1{!)KvxFVYmLv@*;TcBYv~C1 zLWqvxZ2LkOlFaws4+lhjvadDHd!CZljr;ad#Hg!p;~QroU*txNi%`4*S{P_cueL{XrBMP@Tkkbv2WsP}Ucar5vUxxe|ex%X6g8+QDnv53J`7KeU}??|qREK(-K6ZegAQ z{s$Mkw0|!88ABu0s}#F}e?-bTLlgE#Rkgf-2-~T?am~-cSE`kY-Vye*I&GzEr08dT z47&?h2QYyd{DGB^`dk4T+}*JFNd?8m!CLh^W>>i#yIr zE;T;>8$;6UN%uhm)@}XCbts7Ky(uxy5q#CMLcap9zNEig4fUBjPV?H^`6u!mjm2kI z0j6ALo@J~-dAFX4UeD)z@7moowUwAzEJ3}<`k4J1iVQ#wzKXZ0rm*U9D?TZ%E+X9- z_vkMV3Y`^rk*UqRf4B~h`f!|Y#=eoRuUAAW{+MQGUr?s6Z;CZvAZiz27K;MGZ}r=hjpYO|G9{b%DQ*d3s9{@JO=z;eJv_H}s zj=-uH3@PLgia}2XnnoPZ$)MS1WCeeYMQ-@&EB}@HTV~KY`!0Slb1P*W<&Ein>FwM2 zE$X1BN5o8vi@NLADMFHtj%dx%u|n4Tj>>SCc_tUJqggfA3i+&anVfJbF+~4fyUti; zyv#q752tW7p%SYaBtg6V2wIS?t|ES7MmIi4s0xM*UnE}2!h9g)gCK8dhQ=5U#t6kY z&P1E-pyD`UjQx}$<0C%lMreaD#sO+#`=@`uNIe7q&L09%3+HHnNr7X3r504@3fC3o zb6L+heLYo~9w{n+kVf_sfB;=eJF{4o9a|dAzXZr%az?IFmiROJSeCsO=lC$F4FI6w~-R zLvaN*eSk}vT;<-2F}O=TXmJUP!Rl`|h2ytGUWlb_dHKS?Rrn$^a(G5=mI$9p>hwepgGRzraqM^Ib*5#$G#A9m{ZSTA1-q{>LnI5`&WL6@((<$8!oO1I`@-_)R&Mnpl+ zt@)sa;35m>)PqMvhvqH03NcGgn>!qUM9h^c=2iFqhBQkD<)QID^A#vkB9|u*-j~v5u#e}b-QyN)G zQX_TntpYA>E19TKUQeyyNu;osiX-*c3J^j=NYM|2C=b;j31EX=z}00rWl3Vl8MGD% zFhD~{-6Mr%p%^Q0Sa%-JmuAorpEDuX>2hvQV<fuaXFzMZau~;0$Q0%PnD>c|zLo}78gRW!}ts`mCgj$E@REfG=<7a;|nzEDvy-+m7 zBt=>B9u2Ijqyl9>09IAXz8PXw(!Ltv5v?kvk5MQPA{vcN3MEcI8e$r)NfIS#j|X-I zFh?Vl2|)t8L2(+l=LtK2CQ2R#n4|9hz9n5J6cCMOov_D>w)LamjG|33U>dBbUlwks zYL6anr(zFFe6{-gngh~K%|0_A7x)(mQm}R}8*Zm~Z~L2d>-WOgs@dy?+bP}qfD_2u z!^ZrV5P(e6cF43TVqY47O#M<95KGl2-Om8&M%yOQ-wk&SwC@do#_(3|w}tGj+A}gF zE9yTC(2@_kNQ`KyrFuyUkf(K5=of(_5|}!N6)4<8g^ZaQ&87c{#$hZTdF@*$2EPbAeKQ!n4eD*-3XKh_YFUK3u#y6q)NrUJx;MTn<<)_6 z>-sg?EA1ydI(0bt8(oI^KcNxc%@Dj5Y@fAl-si(Cr<-j4kH=edKNDpfRTr%b`%r1> zBC~Ypfit*hx6O=`45dv=*pF$a&A&xucwL8Zl)ZzS1q@p-ID<<9f_oW9sz9&$Rz~N$ z5FFD06=|Ayp?8S}m=PROaPg2juQgPJ@r}5aYo3zjA^~ywiE|d2=Rkoy)*Tx~60wuO zoyQ*&P$n_enJH(sOhxehL56`O%2XT&X?@BF2IL1g64nG{X{M48T%?ktaf%w)C~6w1 z%INfo&Na)QPJfFWhcIvk)oFO=oh~ae{C2+{&@JF~`KaQ0nY7g5YtN;rxAzMs6 zvZNW>s@Wy0SSjyE)eJl}7FwuVc`iA`gC%AF5&9ET1P^j^)2>BStaye`8&lBLydJbs znr|E^IH6y{ngJzo*A>$;BXNUpvYI-uA-5gt zO>Gz4#-Xj&fdYx_i)g&MUh-UwuQ?AlN!3p4dokrR;AY;N4MB|*9<7x%s#UgLF$_5w zN@S^j|RDiuXl(VAg!sFYVZo`IWUdye&hI~=*n$5G~J z9mzf_$S4(+PO4@&<0Rx#Cm7V z@BZfsPRATfmxloXc}4jj%OL*$EBL=wu9}q>`Y0~H)nrN>wh_cn<}_mxZ0qrnVTi=E zU!({Ss74Gda)_`qnwpo878I(qqjMav^zAL}rBZno3vp;0e}tv_e{v0<9gl~8hWgrk ziEXm7T1nN*!haNGPtLsOIQ_|Ht?d1{*l+>4_)CdMSgtLx|aC5VOWW`aWYj@stv46$i5&{&_hCVz~uh59v7QXP?b-8jaG$!gS%J~vkz_PgP z(h)Hqb@Bo=jGfNH;)=eP44U)Id}M-2bq@*AErk+YhTqUMA?HkEa}=n$L$>|{0dbk0 z=Hi@5b)Nwd)NaZ2(xtV7aVs`>9l(RPvPEu3axraL)YlS%`YQ?T)y4S5MFl2bR>Vj; zm`-Z8IUDu&_6E~)k%$E010;qAVXLMXlQOl#hbJNY@+H(th#+l6gcH8YQe`_d+tRBO z9h02mi*QAMU1ank@|n59q5~m33RX2ygx#O3bjMAbjhNp0$mBTj6p;|RSrnpn zZpONs^@RMeDzZCA*3F@)8!K79I{SgFu)qu()gNX z;wS8DXxu+<9uIaD;og{{2##Nsaf6iA=_c>Xs&Gk8MzevP$;>HI3E-dQSCby+d*@u_ z=N)jdYU;81b3yj%gBxGfWk(ul4^liOQ_Y2G<5_EJY^+bHn*ewX7XRGv_ zW^=Oz;aGHoER33Zy8S4{$R+~--bj2Dx6&zx@CylOx(5+)hxxnriQ`NhaVGS+1s~af zU}b(g#qF-%zk2suO1uMcDN-^Mo{+@*D1%AK_YM5poSgj6kJ}#O0zu}w?Xh-8@^#`H z`3HonZCrU<o-QrChU9A#_jZ(>`CF(R4E-IW^UEpzPUDPi)(O2MEC_|(p9DGj ziXf^SH`y@zPQrgbHW2p!?U z7ULN4H7q7VJc6(cr>Z!`r@_80Fp?fBPWBo{xAe%ItPBf2@+nbSG_E?fNSl%PQ&gmgv{Ztgk zfN@0~ER0%@{P`f{y@f{ucHQ62vg=qS1b-Nr(nk|_4;-6y59dcUb8{BkBsZL=hJYr! zN_^SDbgr23X;>`gd7hMOJ?Eq1)lxn&SYOA}@qpZ%_@RbQu~g*g65Mae4hqgo0^Ac>y0NH(3L3dpJrBD8aCQ z=3u26l=eJ#eE8_@9%zEuF(Vo64z)=_JJS6ip|DO>-F$8zTvmJ3F|kJc^c>-4Fqi8Q zh+N8GzhPc}*5+{HJH;@iR?YBVpP>i#B~v6c^5Yh!9x((tl%d#T z`(j)EsdcD~hXw*}dze_Gl?kIhW&1B+;R00l$vBU%nU@HjLdJHv*waa zq=`0Wb@p(?2;#o%;jtyORIa;l!?9+He0n8o)Y1F0B|ed^e>tZ22&;xVAwG!=xdwqw zSiG=K#JREae~}Ld(U!9@l|upleRx-7{PoE_H|U*6oweSv!)T-rNH2TYO;%(u;@C5C zC`P&QupOdo%7VvC*0bQoHvR+-oPTI9#(izXWhGlxjx9gY3)`&D!sU-blj((7+Fn@o z?qHT(S6Eb8AY=_*T}88JZ#OSBaNK#-@ac%qf8j>YH}z!c(C4BZnL)gA3;7CBGcE`- z7_jyj7i$+BYyWJcEw0#=fn{_oQuU)%lzhVwy+FpOiLlWX7f82hm?dMdBDaS`x7N zaLDL2h=E*3s(*|osD4HM&kW_G>Bl`LI0%T@x6oPOf0SbbEzE2UoLwCMzcd@@Y~XD2 zzf+asqzm~)1)P!GMy*cGJOqVwH?i%%EL|iWkm$=REt&X#D>7c1PGp!G>eHkv)LF$Vxcs=vmWk;Gt8g z@45=lzv~K@tfuLucU(T_f zC1tImX~##+@y{GY!5N zT-5F-o#op9HAJy;;Tul^Ilhu*1tN=E22&&A$XVzZMFx8MIs#xcLI?&-P{CQCgxh`^ zDvapEu#$!tBLpj83Cyk)m&pT2^uMljbi`+bQH#1rZtz07_nbi5;BL*WE-Bo-Jf<-Jphv z2XCo9X_hgk0O@N-W?37ebYZbqVZVPB5{MgsmA-oM@ZeScd&e#%{vngY`wuqp=Bq)w zuRYJ%obM+z>WKvc{Hs(n#B6G97;ZZJt$f=HD3E}Gf=hefo_*XPWAG6p6raErjsQSl z8%}U-pQbX<#w~|QfuPJiO>1xzknkx^aAO4EMDx*}k2WS=?1(=<46%jrNpcpsJdClW zVq=#OcA|lmWjG~f`t+SVm12Q&mxO)~`y7uQub?!304CicxbT(YqFbr=YdKQJ;BltJ zlaVeou8(DNi9uz&A^vB;VH1;7uYQ|m72tw^aQ#08-2V=>YBi7V&T6>)oUq0$d=Q~N zE(%FfV4~VT;!x5M&~ad;rh>+lhEvC-ak9F?8}rmt8C0uXZc5aHI}EU^tzjbol`2}A z|P*_#deJJly5?k|et- z)Z|a=(@>=|=cmO|^D?pmvD5#hoV zm_LI1PF4C_FsHvAR*ty3xl3$pr0xHj$M@Y{<=dCph=@2{(EL7xvI0c*F3aQhuORMo z{MKTkV=7T}R6__f?Vz+SvV_REm$1T*{dN=J(ab6vquM>sRO6&~qLNXm6_!0(-b03P z(%qyTtkja+Tp96Y7jQf7i=;jm8_}Vd(~qncidbfQN$zH9`-x(00ndKYMUTkd{Eja& z3Bd=*OS5%V3kHUlt;-VYkT^9GMY?+Gq|qoOY%EOLBS}}(G4ObPKunN!XxKG@uO9Q6ciCI02QK8!MJvkUK1B0xE+J4Jtv4>{)*44b8vu z)Ni6$1UaN_5pP9fiL8uJv?Pm0e+2b$>G|$a9GMf)$}YhXWVSj1ggkWO+tL>bO<6|8 zoko9>B~(!Bl^Rh0v!xU2?sG_gCZU`55Rsun1Ym|_CORL~Ho0fShGkqTtVw#5%W zZ^MkGu*1&AjeYoRSaeR_Ct`onvqdQ;vVA}3v-M?6d#FQZ#; zpt9hSM~$>tD_cpg8V@`($Ei)puFY4IHKcK`l9KZsH(q2ClHHPdR|Q?P&u{1z6Vasq zcmb(Z4J=5v+!k%VRuTs!b0Fp_zzde|qc#6s#53J<=e}Z{N|Vg@Ve6Yv6w}Bps`{-u zs4}s10wJ!6e(_i|Z@S!prkB^1-QL5XK#atmRX-Jcp;76$Sb@RWkR(1WcR28eq1i$N zPau}D%>liKiiwm!b9n)$2~ZotNQ-T|VozU_*ro-!l`YPa5cZ@QEDzCkMn{?;+L;q} zPRN{qYhe>K?YbLmgJ-LD_O|SQ`hpJY6X|#(cf6znUR#Bss@q=O=4BGlSr>>-w_XJ+ zOR)Hty;-bhru^JnX{xt8ZMSrvDEPfvCLu$d6yCsD8OgoT!PR1|T=i<))$WH0`@?v& zUVyJZr1HmU#BYb=tYHQ|@@RglX#S}+9h7Jn@dpUE8tG#Ht)XF|_OG65g149uaJYXC zC7M%Aok09*#~~^Ke@YXKT(q<}{HHfI`pJvc=WQ-3_!ax^*44O`6AYRP50NKN)ezzX z3yTAkS|nXPd7kvUjN7Ev!M_=2>Qngg?$J3rODT@nIr-@2ZJG>BE2(x#D>;L)#m%{6 zno4A?U$c@nw$pDL9byb!eXhoZIe$x)3!vD#!cvPOdr{KTgKbmYZnW*9-MU*>v?x93 zX!M3U`)H>Wu_70U$kLZOaj%s$Ya6D%H1~=~qLmRj?(wqAqlYdJJE&%=(WkKFayZyS zFH*7Ft}Wcb?IsdW+`uURXb@Nq6CXtg!e#lYBZ+9dG&cQB={qNTIw&OlCq~*esDu)h z*%gvr?#iEH3Nn$^-B$*6kbSpj8I>Up>?jRXQC~)uH{vT8g*p%CFEeSW>3_RI8eI$z zn@5Spt*R8;Lfcc(N1NFDlYClxM-+p4X{GTIe@UFUOdLFZ_ty8hTh$Z#!OZ<*h=0sTtr+dVdfHrv$&F8 z0!ecTNV$%>Jjc6YlWW@19R^?+sm-Jj+3eY95FDv~9B1Z>SL%`htuu7UH4pFkyPA~( z0PQ)bNovJ7l7nQ6c|?lIG69t3IM8rTr$j?SVmAVgZMg(Qdu|_cbbG9UdRKdP&VLzO zZZF8cE6-kP;vB#OLb+&{AKH7{BGHiYrI|RN3|6c@b1v>r7oB0ke{O7Di6rxI5bY>r@}3{oZ1*Q-N{kP;Xuy8a872&@g0@d&Vu-kUQUCmU{}S zdrXg@7850dL)n%n4NEvai!uYP>k5>BWAYuZ6tl1}rvJiXhRE)(lJWBUx zs9GIDt*K2eROT{TOGR%68OGBLaIDhAB5mGJ`)Zg+o{Ph!7Eq5jO>hUMYS zzU8=MbhBBDQ4xfhSSK&IfQj?Ft2>wPu&NBc!j#isl7M%)`TGwd?rL=DyC@M zf3>lI;|6%i>2fA9g)FQ{g;R2&^RFC*j>AWv{W7kTIEV#xZe}qElmql~q=>{n!yVnl zAT6e50vO%)CJEhrlh^)Ua7#q67lL#JTS4pV&2Tfw{k-HG$N{V^!te@8zv9N+{WGlh zui2-OGP4kfGy8o#GACjDN*HgZR}LG#^~{tfGxbJINyXW z)#5vxQk6>krPuTEr>>{_Q_-6@vnN|*cc$2m$LAu??qs30hU{rNc$cTWVe$@PZ78FE zlf2gc{qOs>`qY!aKMT$k1caV$e8RvJd#PA<%KfPOrrl6Cx5I$0_(}IS&BWRriz~9T zRd3(Ku?p3Z%^51k+%OOyoe?KjZXXSQAa0;0TmACXmui*BS_drFzMh{;CPVTLU3S!O zEltFCkpE1Ui%(sD%j0}ElI8&cq4~ch%LQE!19nNa+rMNa4Z2 zC_)6Gz@+BEgduT{jT!$m{^<{b7i#P`Z;W=bch__CK7=mcg_-PE;9hgl(UI$QdflOW z(Q$pHd+qDxbMaj1Yxf7y08Hr1Pfx{7#YM%%&E+|>>vi|!31wbp)m{jFqqFom=x~2# zM$(K1ONTg|l5}w}yymRjxXH=Wh!0O%`~Z?10y7s)mpEq!H>Nt9NZkie#INy-LC99i z81EU528K-)+R`#GUTz9yL7u2TK;ODKuS)T6?a;M_8QEMIsSndGoe-!XofeO6{2uS24@B*0B#vioYZbDNb;X(ExQTghH>fXT=mJc*4+9xkFv8CKukQKw@qyzluF zb-tlkG`%cFmQ5HSSNW3h?zqdtzDHg6tWVxvgHJTnTLaxrGx$pf=Tb)920;#?UK>ur z$TbAMlVGEo7k}`oG-TCK6W%jzgFwoSO-xQ&>`( zab_}~@Knc8%n#+G3pp9v`CxSSMv^?J1{IjytLt>4Bxh8hAysffo z%Z>2F(rKlIGbOB;GlSE#(W7pNRMknE%a&b>b#}e^1-1RasGDR4t)BeEXIt|ui$#@a zEi3Xa?1kzpgG24F$+2Na6O7v6q{4UsETfsXY?`#3ubX_QoQ>{t2u|%EhnOC0))tPf zv+!D37cs-}Dy{kD08{r5dVh-M{*evK+EGq^oPm!XPir@8Yc?A`W)54Gt@<4O!8Pum zI$ENubBdRfVwaPMXM_jQ)i(m{N{z6sW#*m9eVE|9T<=;MkNfHpX2!mPwEY>Y=t?^L zEBc4ePN}!SY7#sryrcDh;)_3P5n@7`v%CpiWxTe@o*hQu9BJ-57#_sir-&vm*E;6~L` z&V!(a<>K0!JE0a09`%6O>15m4(9O5LDxv4*)rQ_og155zT@>6~K2K|}npjTtd>VIl zy8KYP2cJF$eeYE)pOq#b^p3^z$}{*I5c4-b6Fb^Plmjk-w)+h1EOLbOGs)$ip{X_) zKl>tAP9^Ts8j^bzZTx z!ZII-M^t`(q&j4UOF@^&knB%J;j+pYS&Inp@`kBW4gKvWcegohBTD1U!yXriwO0JrHm}#y}B$yZdLz`H& zZ5T!|1R^rtYj&wblx0EX2hu(m-fnABU!-K4RgYE_>T$4P6IavCQv(Ftkh-sglZe?A z{fI$f_~5X6)$7LyVZ`BEDe*DAcBCTx5UPC5Ybe**F__;p3AT0q^A`uw1)JrZ`w8M$ z-gCZtm%xxB)h^F5En-a1)oUn+nIMJssD@^mL?k1*6;aDMx2>0$JGF6_zy#i#Shw&J zSd+RoGAy>P?9XAla7Be$)oLWhUpjJ09w<-h9obkTtz;gs%?V|Slj`(jSOSaUEKzJG zW$HmcewZ`l9>c^afJn8PdWztlQ_2SY+dWBevhjdV)co6MkAo(+nXl6pxz;&goY6 zH^PV`uX*x`0G@60jUs=ed;x5pSKfRh)XisGloz+m0obz|PDYz|=_OOrizrlnROSl7e0)^&EL4MeW=zHb zlYHOCg-NSGpwR@Hf`BZwf=dS8ObeUJh-3dBu@Zt|#|*q_#|#=XZdt++N5p9XAkoY> zH0zkb6L8GN9)4`uMPG8Xi{g`!G2oa{VaP2jYt~+}0R@~f{(fTIF(YH}duYb-zvf6; z4}?jJ2)jd<44#x@HkYiJLLwq}X95`&EgRXAs^*Pf^nU_Ys-zgP*&?+I8jmFe@SI!H z;Pi#NK%E(m@y12tic?sZr<5`@M{IO|H&bhA_+o|Vl!x;GbIM@TEREnByGjtOz;v!M zeqm2^R>pL$Sc07^%H~}t>!NNg7sEQcSb?3FT1=*;1pQ?41fUB6ZS_|x@arJjTvz=A z4$e5jMIEkc>NRIuq?&Rj4VIP}*pFW`?p8DIgk@iaOS;s7k@K$QV)<8&mDo0Fcc2=p ze}XAE?3)K0lC20+WOZ)ptZzo>u(~1(~?e$>{2{x5B5Th#q(#jx~EX zdqxIdb%|&);{(^F+w00;QSC}ESI}kGbg5Wb4>gGF((Aza+r~MC_LNMxu-?&d_rPIo z4Wd4C!BQtam@i{0hwE?>)pOti{baX-&@g9;ht(cQ#Rm#TL>#Bp-`ra%)lxgHI}!fT zPrqG5L06yvCPu>dcw<1)>wv;$!LL5G3!x3glY0@H|36K3hm!5?( zR7*O zz&J52M|HT!pwtd?vJplT==WzZz8?1fDZ=N-$(F0LY+zc{`);}ReBRbZ^`CC2bEO~X z@gQE9CFakxHpD$XHaOSThPobxb>nkB7V$=~%mUXK8$Qzl^;kys$;W@l&_^GnL$OCV z)z&KJ?O144yr?91k+~)TA5smx?36$K<8)wJ)IzA-PtMJ13MD+|^gfT~&&oEIA zjTaxNv9I^VZl41^~r$M+4x3PK{l9HF{F%JTZg;fIFJyy|ufq>YMN zeAo#4Q;fFs1)KO8Ms(>N9+c|_Z?n}NugcDQw5w&58%^Ejju^l5h9B#Tw;=8%a95vS z4wfIV5X0z#a_jTC+q^4|VZoyf=X7Dm#vhrhu&m+^m#66=p|jlE8J52@87|7kxGiR)l7PS2 zGKrb5HkDyFhs+N(i%2a3PUoV0s@Z>}onyg$)s%2f7>8jnp$lxr39XVPUu8bo)m+6H zQ;CwDeO1mdS*|qxu*!6lv3c?BhjqiD6aDB-e#E}Vdd;p_pxYvQb@A#|(S=@9!D%tR z({LWL#i~l!z9r9)3!<#Oj)Y3hg+<22hztP^<>ALx)Uy-o&g`_i;Od<&kjL>*yCd9o z<*XO-%(N@ncF~=8JO5UWU-o1{r%C1BZIK`EX1HXp><0g(fn9soTx&-j`4qL4a40PF zcOfcqQRqV$@*>$&SSE?VwcC(5zhNSUiyta+@#rNgF|-LGiu_z+OY5b)??^7#OXGG< zVd-V{eUnaJPCnsZ|BuX?ShWJas;&vj_cm8eRl=D@?Z(=qZu3p4&dVSC<_6I4rFF?V z4_!_cN5mInYceGco-6ghwD86_-8_CK(>vt$7J049%-byLSu`RCL|`sO*Fwu2If{Gy zYo%^UYU^CwL`CYU2|`OWl#1%(0+Y^W=@R)1UEL{#Ld!l7Y?wKjk?`kQTX z5GxT+7CNVV0A??7Z(uGgy}!L_XN2cy`KGih^un|X<{@8Ipo_y_q^>`ogp>na=P8qc zUS}uW50xfz3;=GLL(`)JEIe!LeAJO@jp2qUUs(#z7nZkZhR>g>AiF0{+Yjshu~iR| zuJ3?bLzCM!-M0^x)q10nhXuXs{Lqr9v*KPxI!1;KKp?I3*Sz$XZcB6x9V1cI>sR9o z>tv*w#V2j#4GkkvE9RMsusUMpMC9m>Z1C~0*{%d--um$L@$m4oc|M=Cxwl97kILdc zOKNIHYH?{rlUszR3N*aVpv`mID!P*v_@cEZmBy=<#Ij}gsyGM6l)pa8hFh_?-hLB` zFqF8+O3Ak04sSLbjGNa{Bg%5!p{V$N)*52aCIJp-`)xrZQ3O(vo z@-Tw!qWlS|p++8Me-F~flFjjRA_AT9TKD_8RP2gv+&S)&?TK7qdtrXu(l;%&EC75b zBcz4U)R6PzUPd04nZNkDXQ+R>z;@q)`OKdy6;Q85Xa@&WdjOgswCJ3N8KC>vtyx1h~} z{-L_%+oPg*0*O&Qpy<=4&;=zZ9J2EB0CXXx)ehnNK?1s9xm3ejLEw{Li1xTBc0dVg zhmb*tD10H*i-x@XEGc}!$`lWLepRCpgPbS5z|^US%Y!@uyy5=R+~V#*PzXTNDITnX zj^ueF z<02ra6r&(3R323N)d@zR7fA%rVKm&J_7Mr_prte#pr^_WXmiC!%D-gBE&OaL%s@Po zvLLx+$JhPZ5+p#;05g!}$yv~n)a@X3y5qrqhyWtwwX!49zMm9UAeqTk;8``s{Cfx# z@*r8|MacFk3BG;n01hZE=~DuVOq^L2mLd0?1p25G+V-qlFbXv$-LfN^k;o*z@LNL) zdDAY@@#Uygn)QD7^aLv$Mm0ymLrg%7(<$4=#rbYwHBE9lmhg3+i;WSkb~ zM){6rq%)~2#Gx`_m3gQ72r=rJ$^-qd8?ZCro}19hvQv9>6@^UYL3zkQ(aIuFcElfr zOzlB@I0z8vdkITGW)Y}38jOmiex*7*1PIK$1SQC`2$UZIqc)ShLvE=lyl`_>9kCBt z0Rp3KBI75xUdda7ZNTwV95?D$xWh(3&&W$wLM`jH>K)?9NwRn1EhNRR;a1_%Gmf6} z9pOl7(m&9{Nx)~=EhfdTk+;ftE>lm*(R2ui8Xt7j2!`!j0TT4!(v_Ydm zKZGgUq=@(f-*f~gC^(IC` zFG^~Lvjs2S3Og2sEshR6t66xkzk=p-XjMZdg>4qPjTwG*mIzuewg#fKLFvE}AHH}| zIjE)%FPyZmokntct$0WL%njNWoW6glZ8VY_7VT9k5K9!4bXIJ*SA{WfeBek-=2#$W zn(OZ@6FJTI#R}}O%Gax`Q{2Y>Pm<=>I-+&Ocaw*Y-yk4#|HIk%Z<=P>2U=f6?CCi@ z-D}qi78wQ>R0Iq{K?=Mm3?L64K%E8#rX+j^=FbMCDkuw!Seu+U=va&H=-`l1zJ&A| zZs=&yxu`+BxUQhxwVUX^`Pmgz_I2~+lab2lbUl^6_$Q0?IHdG<&od|~9_@~?v$@zu zTFBkVT}Fn2thCN!hJq2$T*d=R)kiI%Ip4dJYKW5S6K^uC4FPLe^Ho>Ivw-&YzJSu<^kNUO zV6*z3L-{j1zp_A+_>OYeA%8a^F|EkIDD<{y``Yenb{g?iMgBM zJ5=IAB5LbX=^mpj5sy(?3kXs*eQ7=OnC!>0vY>baR6LY!whp$grWUqHL%gOkj%`GQ zc?MAhcW@`i$wwx~A{{;n^LZV%vM#{Ky9|^Z;weeCR7Nx7{b#NZb|O7?I2;{d51%qn zT^HXnppT6LPz-sD_=BvH%oyOSW*WyhFSC=IXpxY57ZIU={&#e_dC7ETd6_enQ*Cv1 znzq&=zVNL?c~yl|9z318{2t=9*g~D!qx?RAEo4LtoiYv|eMGy-TcxaET|Sf*t_p_T zOqv_i4Nzg`44FkxM0Pr6o*^m0jECo&27RuUw3_4>rEuL5p%7R!BA@aRSBuFQaO(9RDq=crTl?+|jqe4OQ(HI{`<6xB}W4Gqul9OAR;}!zU&w1C? z{t6ZXEa$a@By%c*i`jU%5LVHf%zxg=W<#%FHg)*Q=*EX;vxr|Tby))#{vb{h3u9sm_-+3B~V zL#+v`qeQ?qSv!(z;&+~Isj|#Y0-1r8_o`$UXJjz($>zogJe2+^Vay>((WFqI3sIlM zSrZo#I~NzfP3qC#nguhR5YyEKlk@ zuQ=eVGfkGJiCG<|qsD@_CPpS$J+Nd8$9@ueuF6)6pcI{jSXqu$1L>qasSSsG9?HZ)Zkd!uGEFYiWsBc37Gh;QczKOqlZd!FNga=thxj5F%*rF> zXEt@yld*7c*PK4V2|*&qzAQhiygKVBEQ=Yvj5z%mz3@OrC9gSX(WLRjldafw%?@4d zC>$qSc*h(iF3!>y);3c_kG85|xZ9Js8=SfVL-;l`|ByXdwu)eqr*e!*687Q!qG0zS zTqacc^A|RBQDVdyUq&v2SYce2Oq_dH>aVNKpQQ{43pW;CY&M0H`rzYfaX-Wgx(I?O z)K)o`f-FTGEuqarADHnANVaH;H-&)+XAYaM%d*o7W6RFbO|4e@Y?&AAgi&v$m$f2I z-8q`YcecOS&ca6JIi*UKHE@eEExZ`t(6+0fQyqCFrMAK@>%er~c#oc2w;_^bE3j4~c9N3N9U;>Dm z9Gp;Xg)Z1lu)Wn%k|GHOqvZ4aM?x<2uj~iKzi<_ytfE3bCXqo{qD;w>uB)tH!HVYw zzkZxDkCm!M`%l=OopR>=B^OEgB`-a&M+vzGGv}1{Qz?;g3|C1*14r}X%}^XjDtAsa zQu?D?lu;Ud2b{CGjRAq3eYVEV^4i!xrwvUdO)Friq6j0Y8>zG0$?HJ{CqlEY6t-95 z(L6(ps8mf6SBWYa!=R|OXm4djDyEQ@Um&j+4~U38LxLk4&GdJGC=zl7-r;L|pDKz= zl6Y>ns7oMeq&ktBO?T`xkBPAO0$*5HGo??~g}u(2x3$Z|1Ok^JY^zRexV)Yhx%0bK zXr1oiYmz|Xzze~EIn>C3Lh=I{6ldW+G|?`JE^QqyIbGVkyTm_Ov1 z)|>dk10g~)UzD9F@*MYh3NQ~uD!!>%cVP|Q5x&7O(jZ8%@8z6N-sQckgJ*S*@&gb! z3&hG*Q^#p>H%3x?bY!r=##NyYWxiI5=56Fr4lLWjpoaSt4nx=X6c7@6n(9Fb;IUPg-Bpc!J~a#r6pxhR?F}h zYlR7h+?j!MVoa~1TLMH>P)G*;7f~iTt+|U}4ew{e4Y+?Ol7LIWG>%+zm=DW|%#Jq(wolC_jHNV~ zplNVpaS$0lKCd8S+daE=Flz}HuptB$L3ZLkuOuLPr6v1?J(*MvMjjk!@& z4bRqvMA#+_GmRwts5C>IuZkhOdC^%`KcJ0&$xv?`T0Nj^dlVl8gp~_l`_wn@Rf8=v zO!H-udO_8n3j_+D}zBW81SDgbhw}~5T!A@!4lUI$-e>sO{ z&)*&jzAfL^FY6y8Gs|%X`0Oe+x+Mjd14+elgmoBYi@IkM%2DPr^sslA95VtWhjc6G z)-l$6jqf9~Vv66ThNyn4AXM>)MO+HM z!5`_ueGH!0b`#ciT~jw^Dx4oak><}Z9gb&qOm3vaJ`vNh5QWkOAlKj3#~PHLKnqE> zJK0A4oGvsiJJ*`t=+7Vn6+ZW6xC>QWmHd1{vdR+WB_v@M%$sY6dYrX;03hAeUqS}< zC(FOGN+r1HuL(mc@)k$Q(W2vkPLekD&heE`s<Uxu>h<8a+u6z+T3-12vG{_BS^VkBltCm5}mzP}@mks^M*~)E|Q6+jHSDfjkjAll@JS>o<%f9d?$E5-ztt z3WdrEXCPR3_-@D=6YFpvo+tRN1?JO>i-$cl)JqHD@AeF!wf`4m=MZQI7z z*0gQgwrxz?=Cp0ww%t9`w$1Ic8+&o~X8(wcimHmb&C1Hke4p3k)ziNn9~>S06$l4! zc>nbmnHt|e5tyx6R0ECo&cF(q5V2gWA4Qy1`~nsJeF$R0q|&l`H=qM*N7yZE>(m7_ zH<sW7#HXo~wjy3?P@IB`iJT>oNFX{cRQQ0!QIGDO)DgjC zCMQcfozz+)@A6_@)R`HI#i9~yAN++3j#AnfI421G({GeKBZgM%AlLXMJWxLBXz}n! z6-bY@x2K>BBHa4HT?cH!WiZiHDq&sI zo&$4bj^A*%95~7El0+4SF0uGtCACWl%Rm|+Gyl~)mkzL3HNO_LV=kwKb30+gxyjpTGc>-}JK7j} zQC=uuOEo_^cC)Er1Z&S_*OK2kY3fvjx)toxG&su{;i!XBrdZVdR$WHLb~&VRK%JBh ziil+BbkkE4v-BBx>Y04FUPE_blh85XvdQBHCXX;DoocxoksEiefAbrpC`9%5 zf01%wEBN_-o~4Gx+Tevpbmi8~^YoUToHVpE5Qh7$oXvS*t2OC^kS=G0<~P&mE(<@? zQ%y2XPtr~Ov{O3S?Lan0hReA8e5E*v_6wc5jy1y1X6)S4^tL*Ax(IR&NaTOtaS?|m z?0xX&zn`e-_2P4&OB(N@8sZ=j-A@e2)Zc`1a^KV|ELTp#2l6*2<#%H>%)nl@kqj#C zE}w;%W6P8=X|aD$FI{iH7uV0kYb?oAcv?N4O(p1ZfSklE-1}6A-0WA z<)vw6Q^w!{_+kG2bUo`OG*&HHUeq>X~ z-td;eI~>|Zn^}pY@F{d!*=-;tEn$N?_u|4BxGT*8$ofhEh?=f$d2J3d2D zV#U(gWl5f@;g^6!4>67|bd4a**efyM0;+rVQoAWk4hj=VY-GX6tU<~R5Vf~1x7chW#JB8Fd=p;E{}xeAq5v7Gf{nzSgH|S zBNg22Fty@564()o0@y13y?9Iw978{_-E>B{s;@x7nZO8oMcush%;{ii>S8N^b3xWq z`sm2)*fdDKY9a{2#7oW*cY2bRfj%jwq+bsyiN`f3zjhRTyzt@ASkOwpM2p-HMksx3 zxh?~T0(J9GdbOdaU{8?h_`>|17c>S4up&@<6@a?Jfymx3sz8)FW|T3*aP+(~;Vi7gyB%djfH1B|P6dxS3*D224tyA-Od>flRHHcE`_KC$ zKSGh!Q2S`A5wZ@*8cLZ;$;+Kpq}~~|%_N}3Nh~5kLNilUB}~-imkJZkQpTUEx6}@) zV9KIf6=EB)q6yKEeTlzWy7B{)28QS{`oI`$qjQuQ1X!v#2s=K~ zot3&9axPk$X&MH)FdVCMlr!w14;QP?<0>eh^p%~-gf#7*4U$Rn0bTr5+3}g;Y;cBG z!X$Na_0^4)t0~4T4ec0xavQ_11v`lIl4a3ogjk77KYGS~r*hWYcea6n68A>;4kny+ z+r&fm4wRf*F^&wK+obL~euFnQc^&d(S4pLld{+;J zsoTMVPbpVl4hLD3d}1%<9pFD0@#Jp-$FYATC5UU3D7UCis?WV{p`=sl@sFv4gNbq9 z`kmyc1iDPpv0pmzJBwCcz^EL!r)tigInG}=_@G6xnIJ3rOA!&iMnt3?@Svmp;+s&8 z6YEYZB@pRuE!}~9?8)_lJNx8))L7bAz%1F(@1oOxMDjks#Q>9!y#~YiYst)H6cx-% zk3!Odb%4!=+)RdZvGThh_o5t8+&84u56Z-m>MZ0s;fQD0r!?~#ASM2;uJR7&BR2kw za>J+P`}@}@7B?Kdo@h0aL)dljg3)NpVn`EvCfa0epL`|F zt{*)ry(U4Rz$n_59Ss#f6~0qVmA>)DeR=7IbcUlZAy?9^%PN-ofw|!^Xa1gLp;`60 zEe;Sxtsj@HpX9KkJb!8`>MUbnW^Z!*p6wuj-82Tw)jQ1^SHxn=bTS{IwQPam8G|yv0uh>P(;iecg|7=zltu_A4 zDLo}W6QTKxRN`Pw;?$(1&qfFPq5w?%<-2ej9vS_<5d-vMl2uQ3I4JL(V4X2v4%m+1E)v zl&~bxlzrkVIMbHJBtra6Cy{EUR!%18+HRxSMj%D0aDkLcrP+>1td`;tY>eB}fU&sS z{{~~n`*)gGx#jC?X6kxlo?MF*lBQEkQm+eAQv zD^;AxcY5^Pf*yYi=676Cy2}fgkH{>FDfjP6xyS)L1m!WB&FnW*H9y9h97{0KzxA@b=*UW?8 z#TwF!MIBYu3Kb?5CQDHZwo={Edc~`7Nu}7=tn24Mc&Z zGh^~_+NNdF`%y_vLp}Bnxw%VXgrVq!)nC7|)a<5S{g>VB@5mw329cerhKyOOk5Xnyi7i~0_sV0)Kbiz}sOv4Tm zsnte2EURL>?l4Al*o6p%el~5R1V-Bl#;5uZ_NIv6rx}4?FV=9$_%OC{AuY;(E>$de z;2|=1LIb}{;2wIJ%teusW@KS5hM>Tv<)d1ScDAX64aJE_{)7xMN1F6ok`yX;k3R80 z2a&sBapFjSu5;o{jRY4$1H$kTYA6=q+`y&{#TRtk(C9@pG$1&7B4zV`ra9uTlpT0^ zCvP#R*sM=JBpxdh0*bFFRQgAM#RxWUMdaQQyYJ>)C@bjld)18x@q15UATw4dGMJ0p z0yb!pPJkxnphZi2j*B%5y9Sc<40@)}W9LAgPu~WcYX=Q^vDsLeAmsw%S)Q(iJ?xMq%o-Oca+*3W%z(qmV4_heg{qm@l!Q@MWC^!btqk|}!2GG-WA#8Oa&2=HJ zbs>*+A*cq>l>I2|MliWDrS-}uye$z7rls?$7cL!vIfCvD^i5f|qGs+4-QzQb&ugy_ z)SUr6=9mpwZpgS}3}%B01mi9B^%u`{QMT$UELk6P5Iv7X8i7-fW}WRjHlub5EN;Px z^|;B|I`-^NW8@Qd5bcxI)MoAE}Oc|G%jA&Xk@ zk@|f6hJHJp9IcspwXs(SDI*RNk=+BwjlykBmP~T%(ijQnfO_$dhWhX5di&wER>OnA||_c?gJUXiN-w|Yw^ zF@@Ic3KiWY1x~i7(vOCM6SCZgCe2gP@giL9Zn(biAZZ$-C-he;LJEirsSUKGNp%(p3Qp6|o&9aCdc+ezFEr(vg>k5bhs)CmKu0eeZK zZlO+0#Hc8gwIG}?`~IzN;U7A;6EwFIHn$Tvw-Y+|1(Dy4nC}ae?+cah3zqK-_n(tb zRH63=4yc&=(Jl^zbH&V5#78g)!BU_uAnek%EYgJ=Fk=23BNkg)dm4A z5GrtLGy>~%;d)Zu!=pV(V(S_jY3hfh!mjV$BsZVIwws>1GZV?8GOkx#oF!QK0rj7LbPZm)!Q^ z`SRjU&5bgE2hKqpx3eQhcXz_AFHqjf*neY&LGj)xSgVD9%5Gf_+rk~z4`w@pOMwA% z&DJtKdA~nC(=)HBq20p&x1B$vUx$_cev`b|drrrv+=qybKj)Ca#-d)6{o>{34Ql-- zn8cXnH`2y#_2zC&UihWBu!r0`?A({$_Lttz(*h7AE*p%(@9!?}@Bew)a4vZ9i>b-q zfTy_N6Z9ow&5y1rf0LFid&#$IsKWsvlG)_m5AC2H5I;JPw3Dag$%{V%IS1g6cX}06 z89=olCKRFdBw4;E8eEmcluJQA9TI5?gJ*nn5(=0r{e93$A zZ7<5xeJuTR5*SMPy9R=rYNMJM!+o@f`3Nh4A!Tg*{z8gUG*w*&sCZ zRW-8e8Y06VA8YE^L9CV2G`ZDZGY}m)TuS9CcsB_Hxl-s8Ytj) z0LtXidfM#D()&bLnHae_^oyA_p@c0JqQA`=FEh zt4$q~cd40J)EQjbsjYr$WlJk5tsXs5z4p`2h5e}>>55wdlTRpDiC z-&u;y_Q>%ZcsXq&()0gC4w=OtKfZ`<E_nykxfDab>p6aR%on4Hj(gxLK%4ynk! z?X};_Ufdq$P8bo18@&{Zp9l*cC0h(CY9T~+KP1i!O5iXG2t9&Iiz=u|>%onU3xS&; zLKXUYta0C`PK_)69=Sdt8xgYB%>UfX*`%p8$spG80uWm{M088R#=hN!_>D}>R+K&q z;x>?9T9lvvh_B_lkHlt~|^7=a}RI|NmM z2B{pw8L|>CY}qZ5KTVR-5((%KDOzM_j;z5fJQZ`qxtHA}Mf z2^sf>oR!8~-Jf=0#-Ez~V@QIEk#Pv^v9BvMde0T95awFGPFj#PogInRssm!uC3PYG ztSi}l^;cAKUu!(ig@f@5+V=NEAu2O!({uqAa~1-MCqQE=e{g8trD&{_x*z~X#P9&i z>?EZa1%I$k&5cT6P=WvOS2ATN-&&xF1{}9EQ>C>4N3s{yotA=DjZQN$TL5;>eqp6Ven0Wt9mUx*C!VUIQUJ1~9`uG(RvYA?9`Kgpkg?pPQFS+TLC%0Ft;3L7MoX-d zGUZE?yrXJvBhzChC*` z%R=ehnr^6_sR)j2$1QftqZu{Q%Pm+!2Pn85=|UGQxILXBLYhkXBi1ZZ`V{NdTZ^n^ zFh~E$uzSVyzoX8NMt@j6OZb!5xvZB22qfAZv=pS}5ssmUjzptBWXT*sUuuz3(&35XKmfSuSL#i} zSc_SC;Pn~b*Z}7|(pY;Xb27h`j@or3qHDA_8lJ776QYi3NQs)IjNUdJsa}ZscP%O8 z)p-j?K74X5YVECnp))ZWbdGtHTS_Y=4$|1&AS^%H97?-F+@Z_xP4_w9JvlG2iz2=~ z1~1f!_g_tm>U#ulX=}p=S+KrCpch29NVvpy#^rm+Zpj|erctAs8EexOL#Q(u0^O3q zuRu@8Agl0Ag0?0QMUri$-&d-?l4Uw3)NU4EvCkg-!39ti^}I^xKYm2_49tea=Y6a& zmZ$B#L^KA1RJp?d&sYTXS<pVGb#BC zO!thr^?dgJRn8w)DrUqSoV(lg>|G$qM2)Soo0l)|M~g1LU|W3PWh`StLFxysbf@#{ z3m)kk!}tng?`db!^xR_&0n$b+Y5WZ<9=ub=vnN`e8#`x=WRccz5;i86$InD~cEa{M zw6tR!g(GgCSmFss-KiE66m4`M@7Haz3a{&6yB2N}_!?PUkA*&fX8gfM1?GwOdI7Q@ zGL1w0BER!2dWOq3_EgNFwahhLQcXJ(jOw^h(};a5X``w?Xh?q!R!IZ)hpT<;p)|Ua zwaUtGUOQF?`>d8rso{6+ij$++>9RLWS;+P=PvPR*XeUJYp4m?_V5bir2sEb}ifDBO zmhsC`2rWT?IWT#9l%0*ElQfdvw|b_8HYssPWrZnVx> z*U5RCuSn<1JgH!J^Xj5(S#C#PUEH-QGS_^214@ag zQDuxSCQR!z*~)az!Ws?VGA2wgI$v|eP{ksq*tps;onfC(r`D-mZ`d7YxpvRJyo^}d z*376%=^S?4wUc%?4{kM!#K|{~JxGynH!gC&bIMopE1*Vz>_=HNv0r_O7Vg`daVz$jq?kp!AIwy(7CWj}phFewfH(JAcZpvMu-w-O@^M?MyjSwhdSa_VCN( zqwxt=5nd2Kg)P#>o&=o1-l7TdiUI~QVTHLMP^;2o8>EPGl_nY|Eb7_vCaR6gSG0b~ zt_X3jYl)Oh&~Km zWjD?FBG5R-iwu3KB>qyZn^^`-Rph%=rj}?t-Z;WLY>XB`>XaroKvuNLQJW(A zRFKi*b-za0>3Nq+S~`(b9Glup-Al7-pQDZKtEBH!NY%>~I`IUnCg>&y}h zz5$mgCN>?$oEiMR{EV}$w(dW6O*YVtGgyQnbOM!au#5J|{Rd(3%q#qb3LmyaC=0~Z zjH~pWHx%dH_qW@?0TZhW5pD+&g0P70oS3GLpv34LnR86MeAsIWRY1-)gMT^4yR^gk zT7|Y52q1t=vHfUbceDd1c4Dxq~RlP1A3H* z9!cr~eF|}>ZvbyK`@?bEQXv5XBzcd_kBwh~pw<2h4(F^d9ka+@y&s!X_EvRY!njq0r+{-x?%6l&f9{03rmP+FM@@?@C;Xcwlr{o<_K+v=Jegl+ z&jqs=JGr7~$2D5~$Ghj!s(1ReEbOgIW#o#=^t08d*GB>^w|U#sUvjvKZoIFTz)O<^ z5}+5s7V$ZMvFYaV>E_|g#{C~A;9ADpj-Vp~Y0KOTe8Is{KGhfEqqhM#U*=4XV!#Lj!zO&jf)mtIsa~XQFUl2+QivVmqanfFEXy8TJo}zmL5C7^aB!T zHbbel$S=ULF9!rFWFHnp9#i)VaT>Ew$V4!|L?f?r0s#QTE9)Wv}ri_eRAqfFP8D&+E|Ok7yHWb@^mUC3yen|sEpt#-oIx-Zr} z(!3`6qvfl?p+QQj9q#r4s&?&srhPoc-oT>W(y*HT=#uRW|CW+?<1@l4{cWKwID(pN z$N)D4{o3)HTLu011m^9^KoVNn5%zO9K=7W_LK+`(O?=Soj(UZm$fPqIq2*Yq#1{^I zjT|t`@MvMzGdbqdsGKY#o~~|3_ll`F-E&D+&83#TLm?)+Y?WA=Cb{6YZ4ApyKaLl$ zW4>pR+C*yXOB+Mja+m7L)zs};jfb~WW1Pu2=?VheZsD4^`(%mYpv^l(zGe^WyiJ78$@WGHC?>C zUzd3Yaf|j<^uVbza-VF`K)YrAL{?J z2y@n~{f=m|o;J9D5$>a@c+xA?f0#D~aKAM_haU0YA(z4=Yl&(Iie_h)&mjF4!6k1X zHd?%;Uar%>H(Y+P89J8oA?QCA_1Wn^X7yaZSl$2Be~0TkHt-qw#|oRr;zM)8MUauRU!TF|FD&>G;-4bf8_h}(qg`Ln3E(EQu=(q!8( z>B^xI!fr*@?PLSH!!5AJcD`A*qeXQ!)AbTB=E5h&rW`_V4VY6Ll<^9PR|nL86}ar$ zDclx6pynK=7ZxcB9B+M9IeB~H?hJ!Pk-!G)wQea}I zh0r{2t#iHfDe1!do%)IJ9b4|HajPM3zx(3YlkiDXVMAFN(2w_h|Cc-Lv|Wz`pK#hGXseKIZB7$IrH%U+gFJuHkpEzN!C&eVxEQ z$7bF=&n2TrR(IO2z5g&_OYf2V#_o;z#r4bN)AI-0yZ(pm`|bzdJLFgWC+YXnSA@Uq zcbdQX_5Sx`y~EbNK&SheKl@}D)mP3-_Zq`z(#QJ?MO4p9RSG}KA_S$LtUqqo;5&x~ z3q+hUB)KIOk(+!23f(-#7gpnmRMUd^OEsEp3%d4cTtl~yx_PBdt=>w)mu1YYoD(Y1 z@{qI#^(zCUq1ytBk6Njw;~q??X%C%VdE{$@M+%ME#NKiRry@qJ;;@TmmmGSMX}v1? z{`N1*QzVX-Tj%9>jd4T9EeT1YGR#+B!L!42+1s8Tz!0YJ@3*&k4ShPhx z!MXP_CF;J$r@GPi`SwAbWjtuc=d31j*PV>cz6W04aYM2cqaP9<5$2WQcZuHA?ehm+ zkfqHL0+?guSS925UY{vF+P&!6HI>-^z{@5aeU-#}KU6V|1r{3X1<+^mdby^YWi@$sbnWvNv-puZp9%3G?oDPP5F<-vo+FNWBo%h) zBWKK0`rvuZF_uUjXBtyoA|^K79lKx8_UmVdnzk2OIwY2?WIT z|J8gs85)}k+S%FvfZ{Ff?bIxtEnV#YFQ+fr{)ZTkHj>u~Y+PK&JkNEDNHeekPeVil z7Z#4gjLI}cUS{7hZy>pvP(ymFZCRjQ5JA|7Xv+KC60HcazL$0R@RWP}ob5b&nb#}e z51Kv*F(}ktL15Wpmf4}%8g0B?b6TNRS>`&*v>a5O^5{BQ!JTQWQeB|Pnq7epVl1JX zyk_VfZ`jqibdm2?#T*iAGw9@!Wk};+o{#UYpK53@Tn9%fE|$1mToefx8ugspn0l$E zHbO)O4GhQpz?Bz+Gq`uyp5vVWPXfkNHa<^@~bIu7)Yv>Z=;=l)wf1 zEzWa{DQD_lSxI)9TfrT_;+<%-r9qc_X)@O0+JplimYA3{_8i5|AbXRbv_(@()I2-~ z(h)aP^SS#W9nSFIZLw-C6P@nW{Q&w-zjxd0r;L+865K+M9_{8x!ikm$lN`^`O%1J5 zMXBBKxAOgz!i0p-Kk#DDx0d9aC~{aB4Z{1in9e|0z;zUda0vVmDbR@2aJ zhkV2g0OiitlBFI~SrVM1={mO>Vvz=fLxiAVCh^wmqQEYE*P%qkYsrj%^sSX2gnP6L zSysj;pf;e|2}!$QsY4Ho3;_d2p7wYK6#S@ncbQXX01nEM=9z7W=DekE>`47l>|#yB z;d|^?P-4kD+vso|!UTmPpL_UG?a>(!1V|<&5!3>QZ0J1^ie1QP!_!uZM)Xo}i)i2? z071ogHOo4_+*rSa49;@u#z)vdKE*XU!^7Gh*7bt#OLmijP?@H9Xhdp7R23`IpQ*Xm z7~jM`_z-wQpt!xR5o#POegOE{(R+*Bh<0BaB;4XX>UEQa6`zb;G$fI;3@EJ>DwjW^ zfWnG6+`pu`wC&Ga{zB)2&iDT}xsE7R7XJJs))qPt5a555T*5Yn&d&dpSKaE`?zqd? z+oP$48X26i(aTUqsF2xI4fuljO=|!or3Ea!QKVIXg2m|FTCNHKv?ZF5kTf-YD}+}* z{j;?89}b~>Bun(#<>jY*M0#Ha-&51(-onav9#(?!hN7|jD9qETc`onk>-Q)3qZ9dW z-|JSOnjx;x?o%5Y^P~S`9`zoQ!l*&rSeH!G;YPuh!?Cy$7_CV)wFbU9eKe>5lg6>p z=w;d|WCP!~vwsAwY^cm&&vSL@x!HUN(~ZiK)zDa8KJkzqG(mllX;GnIKNrQJW6smk zDQ~F#09u#qcv+aFh+9X-fap`YqSy|dI;NG0sT}LlAv}0n-JC`yH|#dN zVB`xip$CdG+0+fq-(mQrh|?|`G;=t_qdE;}1=j0m+^|nU#vQ|55Y3MxS$H%d zo8=mw0aZ1SDz_j15MkRUS|LVmETO};bGiM$t5Hx#;2S=m7C#~GtcV4f#?=YVghQ7cpjbbeohSe>;& zX`gv)_3>g9;bEIilHb{`@MiTta-q59{y3he9qXsjn60z>q_CA=OwfGlos_ejP9Q?S zj74#;_VKa6`~#DBY6S7uggv3vC8z8+w6)moF&w}$CR6NDUdAH zGxt$aM>F@Bd{+#WJ34v6d~UKaG2UNM3yZ^8wk@XHnU&q1k`-*{$B*lw`h|TlVhsrH zA;Nv3W*?uL^{`uR-~N3I>q}3KfdSt|oaG^3!B(XqM#*I48o-=hvXGGjUVFwoOAz0lhq2mGPvnA_>vJsx({(A*HL2g zCMQ(gxSxg-P)w4Z3>Id-$Nxrhcs7O_%qB3 zyM`+Xf8=1=>i13SESA8NgGi-IG~E2Q7WN67@k=f7s+lNTF3DV~l44llzoPTxr9C}h zuG>uK3v+40cqbQoWNGeR=o4G?6H&y^GB2Dx4NuI#kT7^^eRQYo{ZyiFk=|AER@?^wi z75X_kPq{}I-JXvVGX^3q?|sMmeerqS{;uE;2Y;#mgJ|>;cAbgUb9zi)f(U*Jx})v$ zR9dc%kRaF_?sS)Y^Kueqnmuot9Kn*Cym->t9Qwg(xjX9i5qiAwu1dLJKxCnyOv9&D ze`}yH*8f)o$HZA+*q{S@<5^RQE8#`Tj^<7i`PC<73{&)gwwdHxY7UX=&K~Wx|2Ntz zDM4!P7~wm~tJtGx$s_V{6x}~pzsna=uS3Z&@{g@|FILSF?UV++s_JidsW(XJ5BaC9 z-ZhNxlC|%jxfA0QYNdtN`ugqv1C%KC`uLLg`JB%9@rwMPReUi^QyY{2s`%Ba=W;(a z?yCe7W>Tq0rzl7YxPBW1Tu~)bN90!>21#>-g-mKgU#97%O)D9HkbPmqf(R;M-*1-O z3a1q?kh$X*RfNs`R%Av%}`}Oo3Q*o9*yo zI<~^<)6Dw3mHUpIW*-B%!Wg3&?+)y@Gaw3qGD;fIN#gn#?U+wA`>emRPDm$L8oK(%;e-D=O11SyZ;% zwVUJizPB#Eq+qSVyZ%#_xcMTmt{;-49c6C9whOJ+Lq4Q<{#e;EHEkdu4&DrFVSNsK?x`Lt;C7Ora;Ph;QBfg%-}z3M6a?<2EI(Q=k6vbxTij zRT;BTAA!kr$~0$5Z9nYC(UqfJ_cc0^IVnk{!@IUrlR{TUlQ3beNKm8Csm+nKq|~l^ zVKcRO`2Cjz%8$|YmNu*kqd|LKZ1%WGDp~nf(>U-ZF%w5OPjVld(7D=3Z+%393p@0SC87w@I;Yb z(RPZ^kWdr_O(Ce~@;MoeMh_|&e3XW*fk>!%KNna{y}Ke{7Zck=j_2p7$ZR9M`~k+L z6<$$UFIk_T{_kz_!|!Z7(SlqyJGhf*C1A=?zPekfrG2ce;Qp`Qx^;S|4z+m4NC(ZRdjw1?~+9u+XcDIkd|MP zl+eJSLO4Z5^v%JR4>e-Cc9pw9OcC@Gk8u3&SZ zh>;nIDJfbH$&gLUk#cQiG*n9*PlO<|r)54V*wpPxX}QrU$_dTo>P6`&M}f<3&JXRJ z#~=&Ghr?zrau9#qg`hW2i^TnD2(BtKC8V>kvo@4IdVX6a?TeQ?6OOFA+CBg=@5)Dv;T$IfpeYp-kSz^}GgClavhAbdEw*Wb}C!y3{gl}ZeY#&3*ubQ0S8(ceGr3bEeGF+_}a=8f^8iO9vL#b8w_r zO5b>2d+i0o17j2GP(jT+rM)Dr*)IWGKHYGT9Wvjh9=Y|y1!MXM{`rtDyY)Th!KTa~+%w$5Xtaq5ooPZYoc+hTKF3r`f{Ghu(|}%IdI_x%^08RcaNvN}w~aFE#%YaGH~ zt&J>=G#vIqHQ79%;*2~nKzV+(o8wQ0Vhe?v{2-H{5{+`L7n!|PF1hy7JgjG|0+uI1y zV(Uz5t7V|!7-nV6>KzfSVMf_X438#Fi?gXft$UxQ$vp8>coRa|F>wT|&*NlUmzHyn zQdmDSuyQ<6pp2N2Uk0BQeIPM`C&>J72iWYv1udbJzLChjLZke}N>>u(zA0A&#TSm;lC+X56kd z4|kk-6R*1C9p$eCPo7hW<7%^Dtl2|b^Mblky%+LM8K-VVOP)!jNGz+PaNKBs)r!?z z=C+c#cA^WjeHYp~;u~#xx+dR!SLIpNKM3z!a?-!#Y8{yL4(A0pNxr9Ss(sa#bW(8$ zm{9$^bem5&JO*&fW}$jaV=1L$WF-Zo0 zV$B2*NBUy4jp6ozhEqYXqgPB@m2aq^mv$0LW^nQ9xVapuKlC9y5h3SIQJBi$I0Jw; z#6cmD;^l$nAf0p_YO(Ac^OojH_hqqj8?n5^yv2RTsa$7iQ*Q3eGrd5Hxv21<|M>OQ zg2?n1In=QnD5Q%*j*s1+D8FctiN9Oenn`Mrr}Ky|&9zdH+5k|a#d&D#LH{txid>lZTEFlGB|T;tx)-RT*pNf>HNRfoos)3sm1&DWOBKCKM@@nLzP&Xr-Yn4@~R4xai`aCWW zjS3sml8jXtj(>B^lp0k;9VS2Vn+ONpkQud_Gy7kZy z#A)sIbXf=7EFx|` za5-n`A0Qr^a~u0W8tFiUefX`n^%n;E@eqfk@h(>ea)ED>oak}U8MR#$Aixolfo=+5 zIOc=wL%oFII4E*n?ydBT_pI?RPT`pg`#kDs8MR`jx~ZvKP|)Ho0qg9Fs~P*KnGTJ3 z)>YP8Yo}73NRLc`JJ45FyS+|Cm8fuT3oT&w4a5IIulzX7&vhH439aqMHstq8-tQXm z*bVSmY)iPU;QV${fK{q+(?s6-k;0WzsT*Z^pmH{-HvPaRvnl1CTV>HkxpbL!d=Jzo zNt>6-+>r6(g`$2c1%wqY#Ou+J9eVRX2=^@ab#TAC;lw+bTSmv3Ks$TIeLF7t{~S&0 zJnbkPyxAa=0l|x<%H?u;cO_)J4?b}<}f9yspd1;!}XU#>U z%s#)N(JjOIg2lUa3&gH4OA+f<-(TCi#0;1h(DZ$y=whoOBGx`O&G<$w#UR%M!A5f~ z(*m_Dwky#*%CTWx)S?oUdczH1eFN69g;l zM6G>jcUSgTW_xPc40Ka0T7}nnd7)_W=Z3w++*;guwoAAfCwt4mF2Kfk_%nA9aMvAl zhp#)2?}5_{2DXqtYU|IJ3=pM0U>lpcuoki zNDYzy76gTsQtJ*Hl?FHv4O*p7uM|BLi7c`?lQ#lvA+!vA zR@V91^Z9ZOq{r{)7197}28@Z6TX_y=ip90T4AXVX@hR#!g}JHR(5xA!s<38_n^l<} zt6H%snU>W(U&~J7dP2E3uIT5-3XXJ5l>GiuWbq^z!Rg^LEV^+Rr<P0A2{`H1QJos4v=A6%5Y%M?QdCvFbm>o+9etyVTr^we2FmMq*&C;L5S z&(}n!JFB2EOd&3L6`&^s%`K6S*zY(Ph!<&j?b}Di>x}96gdMs7o24x2%x9rdn2i(z&l1Sytk_Wza zu{a3JRS;-Wp{EAO7SXEb%;;yel-qB=+(z%l$?ML{xlx;K5$#Srqz-*0<9f9_hY!`}=(lw++e zEiTE>fJ)ez>sl*n+vH~Gh(O~ML_WD93NS6tHc!2-y%`-}`-S4hQd`az4}UM4@yY~l zAlbcN_44+puU^e}5Ak1<`D8&y5edj&zn+o*FT9ukGg|+L+4+A7*lcxg2NiYPZ#g`Z zM4H;QU;nTkq3ZQON|ZGz=176V$3SZ=EQBa_Zub5CX6|hrfLWq>wW=ogT;E_dY3=OS zG{p+gET-mVE+#jh=$L{S)t^$X^C&K^6n+<*uW3&AneAX$a;%@}j!y2R$h=FF-`4QDoF0Q(E4+92GB7_u7K#p+j`3r(WS zIDuU)eYWfHNRPQBj|DSlZ$H;4qVHP^_lJ2#Tn{vxAFAj)?^G@IP)wG zBbQ8pxpgjlA7Irh_s1sp8%S^Vq?NT2CO4vt;{>SyPh8y(u8ofMj*sHX`<0<#B}eZ` zIg`VFPT=G^7jYtEZekO10&q^GCSpgeva#i$wSqm*%9GY*54%)GS}=8R;q zU}m*L4oi209VeWNMs9_i<{~C94TI%p4Wg7aN`?8^xmEorrruan4ZQ%QPT^mCmAA%} z@T6U%v+*51x&$4GryZ3ORbX;XVzs!u}sJE z&VPtnpqHxs!d1Sfg20|Gwjn2~Gfg1NU+1;t=X!j8`8}E5z7;F_&s+m7KV$u5N`@cp z{LGh0z?S`4vgT2eW29&WB?|w+Ww?~4T@$H|IBYqmf~3o#ThAlzPHmw|ZGD+lUC5ostm9MraX)rND5uXUybYRS6vl)rcL7WjV7N!_5|2S7TFoKaP7NZpd zPm?(x?=io>i?KkEF$p(PMop=Z%U&Baht;%CYxjj&Y|5bs1Yr#+j&8k;d9_2ch1axz zNS>nfM6tfwmqb`TNlR{qNP!-Vra9#GgS05saWgGj_Bj^{aUbOs8oP$*#K&!_0+A1M zViDm>G~ppn4b)|;eef6mWxpG0GYI~*PJ`GlT#dtxs#%rb&Y#^@ZeZaz9H4Aqhtpim*;SxgmYVr(U_F!OO1yb zxset#`Dq7JdUb29&JZmQ&aIXivu?j_w<8F3&ty4b)!W!HGt33?gP9>rFnuV8_LilH zC`q~cc9hAYf%jg=&8XRd55iPl&G=#S!{?=2Ux1ZJnnmG-^xC(Khq+a1 z)HvuLzdAZEjak5$Lc<;NDQ|aNvJ!4d4R!C5V_b?%L5U|KbQU!joX&WQBqLY7JZJ9* zIO+ZeVX8g*@uu*7z@itCr{XwCX;TD3fY+7)l1qaP68)Wkw5{9>sxi=->KBS*Kz`%& z@oG3k>F}>51LCfM^FcBjw*VV-3)NGi3{P9!FnSHXfcf33)Y^uKl>mh?l4hyPEzi}z zP@9bHcN|-&BT`({@NMG))j|NMECK3uozZNa0cOl^g<1Nl_NcDB8muYjQx}o?>)U_;fn3xT8VdlX?+ytT#_@WW62l9+DjFibd5gE0jB_f z*~prD{5i)L;l=C6;t3@4Sp?~v{`G>fTL_dgtTXuSxIWYhF=3iTj*ukucMs`ZW%flL zM6cNDP`U9@QDvV|Z2}n-pZqlu)W4kI^$PqG2ZZ{>?YNKHRP8Fa*9N}Y$4W)MxEfAJ zaPAj5oX&8s3)@WGRD;O_4)cd|)Gp|nPY&1<7<^`S=+s|B<9`K-QukA;@_P&6jG2Fw zLug(WFs-o936fh>wyYCPApMtKR?Jr6N*^%t>2_1Ms%Jns-S=ok^2%Q)m|LbA{k8*s zmz(>H-KSddoU`^*PdWKa?iwKm<#M4 zw>rv)7ZMJf*>?!=L}vsW9HVS-UaJ_7EU*a`UX8d1cEqb?%ey-vi&bWFG_CyQxIax6(b@D4zLi#-q;|_4QR&^_J`znND*0l?c)?hZJ_H zC|hR5nPFJlq+t(9Dlcda3UuQNv_7TCK0io)HYg3edpjomKfgQL$!boIyl_D6%W=Iu~884dXvepx3$CqKwzGJK~BWvV|kGS@qD<=QRRpfkIzF4Rz z$Tj2_cm~m+1D~USGiqpE5Hz}SlXI1ms?P6ii2rBdRJFgg{q%KMfCd2$Vn8;2Hq?Ly4+lS-JxYEsa5EgVKXX6t z^;L7el?1~%;CJ5{fSRh@tHr^QU=t;at-(syK-j>C13{D7udm#-uYIu5xLSW!1HB4< zxCHT@i{43)9OlL_4_Z#hO={OsC@2m!k|eNhSR?KSiR@YFb^KYBW;&_6CPS~oV_in? z98PpUzFdJvkmKo9h3YDzb2L>;1-YF>;;&S30~Rjc%2q{GeZ> zU-D|6&MJ~b2(~ZkPRZ?8SJGCQQMK3I#FWspU}dkPzd8mDvj^j>bs1{!4rFGYj^Jh=am4*r9DulmIs7(; znGhfR`#5^!)mO5|rBz*ym9PK|l8ciM28`lHv{wfts6y8qcww4n)=9qjv%OWldoFHS z{OJ*+00T+1?mugtsjPy}^WXX7jJn1t@DsH<$5p444sLgqbUGpo`w;?BWiPwP<-iqz zhDF_cl_I@CfV#*ldXzGFHhK+NiVMT9N>!i1fc9XVWK%F7uBYGQXSYt`3`#cxS^$Ue z*&f^k%{mQ(L|282uHVL>GjNM5(0ICY7!8wQzw-mdiTf51EUF`y!TKvz8KpHbZ%Dhg zt&Z-F#_AEB|yxa)7 z-TeN}g-mp|>L56U>^oy)A!jDxGLWh7Q}rEMHE(Ow61Eeb4zQ-I+mJ<_J<;jDGFi)L z{JP)c;;gcE* z8y@jX)lfq1Ci2%X{8$miPLr)o5VoK|P=kx8y>@PU;2VO&zaCQK?6rk45oTx(U0Zq5 zVyD6KRVPu*`ndaZ`$gsbuY3JBGyh6;`aT>F1&Vv*llt>7Vf2sGM1PISAM41($wtVV6HeBPD>Cl0 zX@yRL7+ZL5wmDo!$fkg_NGVcYO8X9OR4IC++|l}6hxI#k(SnOiENiw<4udBAPeHZq z_ocmH_#KoJ=il^o!phg-vR}1n?}RvpCkxyGIu=Hd2$EuAM zcD9CMz{;bwL&8se{io;s0)+a+P__hH9zhOjxv`yq2(6PlUV5op-$3@t{f)Off{__^ z(!0`r?O^V2X1XJhubF$(6o~gcjEz`~#seh{obaZgFJw3vY+y$GZ*kyP?pI6syK*L! zGHd;BXZY=8)@uZ9VFJXX%;(;GM$CYw`D=6RFVgMA@K@?*Ox+RPSJsW|b%9Q<)yeml z0MNyq-ImHY#A^Z=igPxyFFgG5&Y$EBL~b&&ttS!RS7N?|!IJ}({Q@!TmEnAB(Vxv% zWW&)qHrns$kRAsVwA9kqWhyz-t=AXh4qDBDgil!im;IVoej!2fp7eGG4YV0ROuH2G1fnJ{;7YQbdi+i~c@=N;1S!?Hgj*>a@hsxx|Xo>6^CEUC;>4 z!XY(L{C;Cz3@?m z&T@r=0-a=Y=E=1)vk_5gOJ7_4iQKhn5o6}$dnyz zD{Cl6dPeNFefRy@^^tfJ)mue`lf>+K^|>(fn+t@>r;4w3OweV{TIlF}ZrJ>poh5R; zEuZhT2i)n~1Iu~cD(fRiY3h&jlCJC?f9)Cb*)IOYD{k%2MyAf zQNv!IZe2-U=Ft}dIvWG&QW6vjKHIduCsX({lle$gU>+6Y>;rk?Em3Dw+36wqTmvNb ztk9Ah9+yHQn)-yE^%Cl&l~vYdacp__P;M`|YzCQZn5YW?3q?_@!^lFeeUtgVj^J8n zfy<9}Y-A@#H+D=f;y>1=k&o>8p#lxr(Y}gHGvTloEN$E`ckkXwND2F_nv!e%e_Wh1 z%*ailBU5m-f#fNi*CnPBIBoZ72ZJD0K~w@?IDOlb=n@~#oZ39V4_x`$m6V9##3eG)TRip;gGt^BFy4_+Rpz1jih)wd;bm1=&*P zAPtJUYf_%8x2nI{QOCUkW3JX~>)XDSCtcLfu+XEV-k1bP=sI*?-B|vE2F~6YguXcZ zRui<$`HFWGQq1l7Eqi{D@E9g$wvn^-B=6lZDPQW`@tmWuuD-24&=j2HG{Ed6pl_Z; zBnzu1s%z&U3p>t4r&!RA}}#CRuid;SDFO1DrJ{O%b49kK0iJd>1A;NB_edmA}y zGg1>7=9ErKi8tR6+~iB$qLIlNuat!X_(5*UfFl*&UjJI8O1t9fOUTQgJr+gfr62O> z_Na!eH#KwaPkB>3{Qe=Z$%VEkQ-AuDtw3Jvl(_m36|~Fs0ZF)C>sy-BxXt2#n6_DB zv}O(Jl#nX<+PLAuY~W$dV~zjiEe0-;TaXaDNtL6twOAYJTcCqo7)c`5%7Fkq*0IG| zYfS#Z>fM_;{ddi#i*>G8L)Sr%0%!2I1w*emDE#|astFu~$wo@Don{@(Dw39>y^E15!`bzF&0i_C8yd4v!nU81IBV zoR{X5%k2*IUt`LN#wfUl4FPL5xxTVLR+{s8XAEpyyeY{kHXIMM{TTn~RbA`@Q}qL! z#f7NI53o9Qs9ykFdZT%uq?`VveKi@+;zs&f-EZsEfsW$q3Xb6XAx-8?K zqGb(x)eeQK4DTmh4U4AEj@r`II_RdDbm8<#uJ{ZFC_mJ8%lW`t{DHh!h#}W`}6tD8I7sGax2DHQUYPC&U zE?Q3QnC-(|S}w54Y>IvHrX5W;jG!wu>TAwGnu`!CHf~RTd(>E3%K=~1X``^SLt5LD z7ZSXE&L;h(nS+u1{i4m~i&VzTgK=G_d?*&t5Ntd+5aGx#I$zSDOT=m)vd@%3cCAMJOu2>ZLAr&BLUGc% zjYk}y++RLWWI5d}{l;GK`|DM$V~?}1nX9d6%zhj(j#KjSQ9TXTSzy8h((dXTv=i z;NI*=b}Jxju`t=o7CIC%-o3@>FM?+aYR@QvlMJj%H~GdSUlg_M_T5KtBo4DVyPx=K zWNqWOzb}x!rFUrG(Hr%7yT6mV`_* zwFJ2%^MuH$N;ax3`35odqE#Vz~W3)H57-KNZ2YY3DBHR>K)M&yPi+4W!1)) z8%#%IgohqCNJkUZ<(!&9&2qS}7W1>U`u-m`YB;Nx-MD9j?lRtp)FxhzO58rgE7;C_ z-|!m?{~_#k^VjNupc~HnTi+3e&tAnScHEK!+7Xw|tI}b3T=WC+7}wW2;+R|xx)JUe z+D(6Azw=gXerKLPx!iao9WiX5{f-DdEvN4dXZ2B==+Whl7qJAnl4s5o2TUtG z@X5@0)AHT`<+zhg?R&<^34-%j2?haT2-01 z&E&U@GTRMmj2F=p>{txTbl8KDyVpPH*v1)?XHQYrHyXx#lqP8N8ADa8X_#VvD2ScR zwv96J^?BH-5(4;UOXhw0V)>TI6n zid^wFVnTZ`O;rY{aeOMUg_|a2PZIHE0B67$E(-e6(&_ceMd^Uo#l^Qd(AKN3$%8Kn z&Nlju6cfCehE^votGS|w1((#qvuWe@8V22L^5oSqE5@IUHStoDWch(OT#JPT&CD`% z9(n3S6b++uNv$SXY|Hcc@`Z~;75_hKBoWLKJ&yQ3ev%|7d={b%=kkOR22{@&IEh)b z;_w>u2`mm`O)X-ZRXcGeqn2E%^-N1HPD+JHQJeEF)1kSUauKds^OW#c_4i2H)o3_z zOE{CM6OAiWIzwfeNK?{MoUlpg)LIu$M|M3Qd`YErJ>0kryljs0+(%Q_1zF!s21TB#~klr6ZYa>*&Ur}H9}7|BArr`k|0 zBa5acAU|5KExG=VAH3UuolxZ0A<~}Zuh4EL((#^c%N{k~YspRkDp4*F~(4BvnP`6qTro z4QwfNbH%eq>n!a;x-V|`rVnPp?@~7e#tNflEY+B#b(ddd*pNW8?I&n|^XA0OO z#XBdu_SCZQ*gJ#HaMFW_|y_8&CB#r9Flf!FDji}BonGvD<4c_tNn7C!!ZF^ zH`MOjUr?T`($F9S0ugU|Lns)V}Y~CE~TPNt2NZgFA7r`k7 zH>pyoL!ZkeTj_-z(z%k>J5(^ox_Tpe_g;r{u$SWYgBI-(bFG-lXJ|1r><2LIs10Xs zS<>#c;M)-xzF@MSHpLyBSX)6;J{j)wYRiM%93yS``UMcPQu;&CjUY91K~m0Yx00y_ z1X}|cmm+Zoi(Q-dQ1xf~eHUdMy|mPDCIw!1*b z2a^=+op!m6O-^_>^IS_}2)5>)l}sZvar?#^WhPKCB`)arV}r@tO%wCyFlg0qG5YZwAn2WUf?59Pzbz6n3OGe zM`~o^_F>V!vagQiws+d&E}$5(x7ZtE@@{4?1u&01mTq`O_~~He^6k4M#_~l_a*r4d z-dHoYAC8VbKNuYA)nVH5?(50X#ECyiN{8rt_eK zY+rwTx!#7rkj|wlB~lCRU5rXFF)!~I{&OUwPn)FLH!K|LCssv?*Aw3rtP(vdDX1By z4I{!R&<~ONXjaZmtU(`Vh(%B}Db(wHDzMI&n7f056@@Wsxk{)hQ)xzP&BlH>4~nOd zS-z+qwd?OhDk?!xrM1F>mG`0Vs9ag3cRQh5L8CS1uG+Xk&w>wBrDqxB2KQ+Jg<1+L zR>F#>tA&rP|CU*h6Dwjvf^M8Eos%09^$~=zHbz{Ls@23U*^Ni3|6|$RYbTm&TO6>S z0B!|PVv%hkdF9|3rD;)bb!?Mzg-voS-5w}Nk*+t`Nl+W59VfMX{`Aapa)aZWpu} zy;30RVQlK~A1nkqr|A%xdv{_-?scsY09`f56X>vqlGINr>dTy5>Bc_29e1nVyc{!{-mi z5a1>0LWaT zvBk0#CXpN&pIgmYVm~HHxi4%LWfy_7p;Vd$}qIb zVe0EWUVqzi{7JO5A0I~qCoMqpk@q$HNIC41?fhW+<}n~Fzf^tku|qm56PujnGS{vi zp{4&l>zM<6?f8*k7-8C@f-qgqgOISieD>|^1vUyF6oIpmlmj|RWj-=;*I#;QpoImDgo~+bZ@K>SI|VeiX{r;Ug`m}a9Eb? z;*t;jyVCAm!{F&}Di!JH8p1cHsWhh)SK`({Tl=dg5|{LnGmu|0e;o}% zhR&A8l6EepP7Y3{|K|S|3`-i`KFUkDKRFxXc)?16zr!U=VkrEoUT&G7|h+feUPZp;}6iTe?(8y#QkX_G3*xA`n*iKxyPSTt+@wdz$ z8gANNj^}2t7Th&%nwi!1a12h@*de@7F&OxkL zs2K8E2NSaj+|{@kfW%k#{`GJt;@ISq=vw_{Ego(Rb@tWbIEDwKO(S`6US-5orVy}6 z&Mie<;~*V^Q=t}z{Qwg|E`qT-IfX;Epq#dePPhybFmP+Orr}5d*FLwsXKP|z^2$hI zZ=JEJd7>$58E-)E4Vc;Gz&6`$02Vi&pAJL@rE$@;ra)TQ+By_~{AVFikR-TpXv;k4 zV2~2vk>8spChu&U@83MfFW!4?`J97xlVj~NgY3|nnY!$WwGTp$4e|gs+{D7d*2v;< zfoz=1JS>NpmK7DfZlMAg^{@yR5t&Fwxk@PYDu(%T~Ggd+7;>ZKh_uuAcd zQb3?d2|3DT{VqTlDujD+3vqXOBJ{C&n8=Uw1%`SW0fX9gsmNjhS4ZzsGB=~o@*nxG z7TA0ogU>oV%?q+VU)aE^egXdyGP^37cG;*xDBGzCH5)i_zNPZw8G@_mnEL88Vef>+ zS}lG=SAUWCAb%7pCDn%&XE`u9jkR)YVK;pL zE7idcRFN}P&)qzea-g&T|2MDO;sFjGHE|!UN>KLvMHldb7(*xHP~-!c90p`DA4=5l zqQT@Aw#v$@FPhKLZ?qP)C(+M64T}9<^&&6yeWHSLNp~)X2t?@A`rc-iMq1mu<@POF z*s7|#a_4kKS2}bDQx=H=eP|c5g%hY0f}Hm5ythP#$7Bur0WKQ^im`AiQ<*?L+W}T5 zSvwW_QBU4s!sLq+n1Fg3Ua^l?p}p;-`&LHl5_4T#aa9HA_8=<~)!9kcC|3&0hRn0e zI33JOmt8a*;{h`tVF6C#Hq@OY+b-0WiRS4@`?2PwNN&>&lcBA8+s1wFdRJ}78XI&? z#~ztmf~uPv8YN=HrWT6g)KCZye}nXQybGx?e%V8E_%2(1Qv1UTLw54%qz0`A@Z{p_ zu&{#m-12~9rk?pIBwSs^tC%+sQ#^kbHZI3zpGn;cDe;GS%;ZvM=4#DN-0(N+u652P zrjrE9?t#$kdYTmczf_~hLp*p10Q@GyR2`a`NHp4ITu7{we&gY`Tj7BDNue`x6{H(S z>}Lrc;@__%maig{V;Ma)r_P#Xih`RSl3LR$-lRXJ;dP0rP1D*92oghb5b40pH z-^U=M?>#c6wze%;f6>X|+%L4QdmlXdrZ4*B!Ip6=(KIRJvM=u-ww+h0?LYa^R~^Fl z4OpaZ`Cegik^{e#2wp9h`dek24?dhO^r1T)Usn&~#QFv>lCXZ%3_kV>9Gj&cjVo04 zUw|**%aGQ_n;_XG+w|NG3i`ej4TkdGy$QQ5VXcnT{E;+1A-@<=>0Oqo^m{+G>DgCt ze{0;KJ3S4b?cYJL+P`GL(asm&htTb?5awc8s1y6W*}APG`cvi!zz7X?^Jm zCYL1Z%we6!yf%vY3k=jPQp0yvCKiwK)Blno;RlEN{!Z4{n?|r9@5nN4$(v;jC(a(< z!e{_VOtl?Q?0Dxa-qro)il5lQIxIjtPzaNBIIzET#JFHY6>peI_E*nXUD7G5opP5Y zbwL`de(|EzY>06vWSkI*+hoBJh9UehVXVVrty4?kgPc&q*-_^TPk%XEm@{H&cT;`u z{!qp(i*JGXG^{%EylfU11%vRKb&q$c&0h;(cqepLvEWV@lwAv z{tVR2y?X6pJCrZzAp@ObqE#pKL$?Kc^GgeD#s|hWv#4VHeYE+)rp-itWi64UL&uz& z2DgU6XY^6dEBGUR!~FjLKkQDs)U6PKp`Q!X8`s^zDTyN@pYwCfhPJntXod515dmY|KEzr## zl}~uZ9lj2+lVerwJ{Ke03V^az5M@tHF)G>!&kkv6m1NT=+}jbL5v@I>#n(AAV!MyT z*I9E=@By?*`tBIJ8cl0Nf4va25Ta9EGvF#ygLC}}Ts?w>X|-SE(VNf##Lfh>vk)Zr zH)qhuCYUZr1F&y#~Uzr&~ClG2^%YkVxX@6Gu!>S!?Eg>o~;afs|>83?y+C zYWgzcd}7i$%{-M7Ii*3Asqopw(~XLsD%OtWJsB(j6ECMe!5TD51?P*~=~otDO^#rS zTr~kLj;D~6Z0O{C=PX3NaD=so4SrXxp;ON!1z%IjEK!coHO_(_4@iuYH+%8GX&X%* z<^&h=dIR#h8q{4ra3f*&TH0Ypc1r9di0Mt|uJF=Wsn{%gQqH+uMY`~$aIQ_?%47Chf%i-VT4-Ms9K3wPH{6|N|WLoCH9s=FNg8?tk3i+Lc>me(1{yw-dNKK zz;9zw%KHIfqg1I(8r@2Z_h@)zbeJBU3T6Llq_ivj+p?Yu%c@ZJkf zvSzSoUzVZJMK-iZ+JM33ej4V4k1@Y$PdM+X4_E9Hi2}5w`|*bc?MZI8d08+g6%j+z z2$xzBGWd_c!D_Jf#NcU3a>|gV%{@`)u(vGQli1|v>^|?6D8WynFEquR`$7!sU&x1; zohIx5tVg9)p>>Lo3{zt6E52bU9Pf~MOzOL{A<6&A-_BkeFpY#Acp!p|hqxn3ZtLEE=PFG5cJlB9i+*`6lK@fu zHYYKM`z~u){sI24oBYl1dzJ5hTBpf>Xfn3{f17+YLmOAq|F*qPR?$}0Rz>-Cqaz6h z=>w$_m4?QeEJ{FwwuMCnk+fhTOUn#wdWy^GKg%NXNcgKV0^uJ}!*>RF41tL3;@~ z5J`gEpTxerfHi%)S;8p0PZ?79gL>wl{At!;vB_jppqI$WraB$EHIFb%i9aMN0erB~ zY^V5iu&490O+u83WyCQdtZ(jcbGOF`ngeHYdwn{Uy)-NT0pK`7rJBV#cj7kbo?+TFg^fVWg<7 zP1GRQ2(i(N^Wpoocb(7#gu>qv()$L5YSWr1mq*5$psrZdwf=2<=4`M#+;DG(>8P~V zGy;vzuv2y2IMm?uEfU+P#>8A;Vvr4K7dRjdk#|Zyqdy|C*Ul0?UtHv@oJMqgAHv+F zmMcm1kdXJ%BTphUgUIeaHO>kj#xvUIBZRPpHcIMt)is?HJK` z{c5>jc;?30A?o-15n*`7#_3l&+^q76WpH0jw1vX+T9!!2G{G$VqKz`nbjoP`RU!T{ zRQ(JneB{h~daL$PPkI*A3>fi@6{DW-n%l|PTF|Q9SO=q_D90_@uzAElhi5=&^$}4E z)K+h8nyfmEH<8DEYP!edv&Dl#^dnj-QKW5Sc9756%Ov_yrgT z@eZ%YwvJ92cM=Q81qS}Qk!BzkkPM9bg$f6}lv_)=TkrEy_bcKfUs>-0=IEaTR>-tb z;314*jvutfFlqT2)4fK%gzn?<+yA1+`j102A<_@CdbnS|^eO+(6w&|MZu_6d25P2G zmS&d!nJYkIC6BZaQP()NRba2$(TEK!J09;rIIs8+@LBg)zfGKfO zhN$nn8CAWsbV=rv*7~{~t?x{i`?X9c zf~1bGPR_~X+qC!e+w{(d?+G`1=WXgpE+~VdPT-j9Tz-lI&Eld7OOt5-l^Bg3O340{ zXhfPIA(GX3c-VnxgYcb$ZWSUldvLS{n+QV{JnjTBB=Is5Gg5gC-L1Q_`(B2Ew?rH( zF%BfT8PsFvrxxzopWbBk9Q_MnG^b97K5C5obu`uxqG(aoie(Jf2%A^X95G_X5=xX< z=+L7h^}_YET^D?C!&-C@MiB-!Rn6%#_RtI~q`Y9o=H_V&$>4%`o7W|eH9eRC%q#&T z*EFpXwMXO3VrR;{lv;stFp!IUT3l6HF`7a##Lb+Qj`0N5I}sX{REpR^;^a9mW3OB@ z1S>1%;**yyz%F#jN{I;MMU=*RcQhKxv!&!3hj!dRL4{SB@f^>q6TXvU47#yn^=^Lm zG(Yx1XjQAL#AR6P446*SW%|}vUF$TF*Q6NK?mJj z&IBTNSt7I;mSWsYQ_d0ZAg~q|EnPL`M4e+8>-5yw!06>> z1>}FHh}&Za<*YOPsf!uXpa&UP#**hY+VXn@1e^9y4!p6fmw)7Hy9#^vVPHbwc2 zCrenCeFk<3g~gFAl-7-8@V>vz5)>(RU4442Q?S^wPn0R@3W|^A;fMtX+;71?r6Q_u zXa;!(k7bK==N5VSR_%zUbjRJ4;h;0zng?Z9dQW?Q0JW}(^>DonT*a-{lJr7A5wDVf=%y-7c>$%)`!PJ8asXZt=QcM&jtcB=fD15ph>xF zA>$hMeOJCk?Trb+hBi+tT0Ryn?piGeGpi4&eMjQr=@uF^z~P((K(q z7Eh$3(838slt(@d_LIS{87AM&!9oF3VT@wa*{j%G@pfM^P~7x01M`-U%yU%|?-ukI z3W&TAC*D^)cZS7zBaub0r2=)n5InpmH5=t}zqmPOPv__LhZ~g{{JTZD=TLunh}>{3 zT~PDG?8j8cW*bPe*fLfUG*{452v`JzjXdVMY5boXg5T$K|gR-J1N6zU^+vW?T zcs66+O~Lf#jtYb;J|}kUtx5mCPFh7VFyaJq<7SE$$DFBxQ>;H*s{B} z6nd7Gvah$G#W1}Guj1R@h`{M5w$5W=sU111dk8)fT^p!=H zfa52#3u4fI&gNLtkEL|vIv$keuIhTD12KK(?Qo!Wh7?`)lBifY#H^`Y+uT$HW3RW1 zlpsXEOqsxXXONP}V8~4Q%msjuC7MrT6It+`f@$q}Wi+-O+`A_e)#KO|1%x-=3@{|Wb>)GzkW|reWjP|-e&%w`&`4G@K+8Z5;fMkrzC12 z7aml$Ju%ZMD`!Q4u55ty$c9&NvLfne&4b*icCZ+Tjz@sidMpcX89s|@-y;S7XD5!n z*qe{=_!!%ZSFbFgotBI7;Q6G_Uk5Gpx!w)90STem3fz<9ndF4^-K*WX;0yOAGomli zCob6oLCjskBMS4gZiq8F&l$_Xysz5TP|lt|WSOJuk491&gs4oe7LYI{e zp+h`+VKfv(pWd)x9n4J&VM1lv`nx#X6ljjO(CG4Mn$Gyo&I$dFimToZ9V#vPS`e{u zt&=`{?ID0xx)Vz%r!TD-dFXpMfG6!sxnC9DV3l9c0|7ZBTrB$#O^&)g0zr*xJlAclM37{BQ99=Y7dZf^ak0&%QXP{{=E`E3_Eo^LUDP^jC zc(j(Ybc{RwAq)L8>9jSGY+;%}+HatxCTk!U->#NM zWc-6f$L_DOHJ#IDrM4D<`9x?%QDEAhkW+kGt}kGKuF05Y_3UucHBh9ed}g0rHR92Z zw39$?lLW9ycG)DwX;Z4{*ST}vBx==<+zh#%*jlB`_A=)kLfQEJ=7 zmvaB8;o#rHKXN`nBBw_n&@BM6}DewN!5HYO%t#Dhj@Fp|6E))fsqcSN8*b>FbB%STz9Wy3)U9Uwwyr z@(=V*8giluKh*`ty3i-Wv1$s8cC7OP&pgpzz_$8LWCg8trQb-8wljR`^yu_3HW85E zts&nbq=Qz{q@jc60bEEd6`3GSvqg)*J9m+GYJCnAU(q!BB2z+HqDiWYzY7Yaiy!s% z>pxbjaSr%4#%3DXCl|y1ZJiu(e_~sbfF%Sg72${>Rf@60v@lrnF(|Pea8LU zlIxK%74n9#lG1F3Q<{(0R6jtj42IFZpF3}aRGe#j6BW^~*rGF)$e9Ptd#yL2=&N~m zq5h;tTx5U)Yy3{Fh))XNiMns=CP^c7q?eLZpfpY+yRQ@OnZ$SJ)hq_OZ1{zvI1FJ- zz&fs0Ct*>ifyO|nF==+lC`u>=@TWF@sKX29FKGD>cqU_VctNJ7X&LJ3{86s7T%DOXfP(UC8GOCYHso>72REorfnyaKcuq@|R&O#ksk5r3n4DDpUTmj)58qml0 zZ1e2aBBc_nCC$a^iz@UB#d zHC7c1o%+cw6OgMJQRbo*JKfx4NYKUE>gRhQQyp?v#Xq*`*8F8%^ZRRz+O?Qn3wZmFX07-r8PzNiUIs?9(27p)oq|_2ORDU?9))lEOAHmzs!sbDiE(dn0pnVDfR5mAvqA zc`77r1r~7Ka%s(xY|69U8}1Xx@Q_;%<9TRZhIXHxn>VNK$F}rPJXv(7 z^w55kv*~Q(Iz@9f*YG_{pmP*vUT*n<{%2{;oxy;q9O>6D7=~ZJe(L|*`uhL+PDLFI ztp7t*o6>~z`Z1mI{p;~&G=Kzygk&a6rUwop_WF$&S0}+tEG|g@TbeXc3?M;jkRq;) z09t_}@LsN5E+tG-qk;l7UV+vWp<<Q)!TFZ zx8-`(ZTgz)c-8rDz;TDK9{$&z9eKdYPS(ag^eZOTOw7(5|y$kTW;ax;1XKz5QeNPavVGHUiqsu;O1kK+b97)~R4|5k zpny1-jAaA1bkL6Wy7aJ~Br8bX4k?3(IV-7u%yR}7s*D?qd+V;aiw1ix69phLcM2Ws zW&L%W!U`fMYnX%j%ujhd8|$x)9u-n=b7C2y!7GS&735ebLxb8QA1HeTNLKRlDwgtc z_AoMc?8X3haE#1-TMSo+@#rtNESHNS+=5n(T;rseG(4j5!K&r2tDc#n}be+mUq5iZHT1$KyuaJ|%|;ng`ivbaom{v#J##sHBd(sB3eh zga#t5;Co0KJ*i0CDl!C*26F#DV?{S~p-{9gyn<-YbGM|lyU29-^_qyi*|D@ad60UL1*4 zbYKH7$XZ%MT&X7nVo>ufjGPoasAdeV35-T+jzSP6ZTcLuISHvvpisgTlL2qT#+z%} zL_yGrptSA!j)TK>1EAHj$05b^@xCv##W=5R)Rf-&wD)wS^rhS`gQy?S^+>Ai29zlF zylMnRceXKuX^(u0DC(KY2`RPy&6{_*?fvkN+6R`KcDPA5+cOkmZazvQZF`z&2|&OG zz-vN1>0?YY`gapdHB!FnVX^hUhqc39rT$fqpmhvjyE8A8G~ zvcnC{!oaQs0jq<4{nt50(Q_R!!XZb{5#qh?Cx;5?VUamH-@J2)R{Y$*;P3q0!lonU zY*gF#4495^1pw~aIm7;Wy_T`=%7K6NQS<+#c)%sqe6k6K6FPxAIo!Jt!cfA!WoBxM z%lPy#JWj_nHP5DB+D8Br^%TbQ8`&W8Wu(s5i~DcUt}b{Au#3e~Ti09znd1E%7mszh z0llS;lfT^*13zz2aAIPHTLKmpciEc4=Tg*AEW%jl*8GuAiBxA7G%i*}81+O1;rp3r z*&${WL7X%!Fki8~>AW7D#<9{Cgx2~6xMApu`tEPI)@`s1OTDL4B{y*4L%L7ykg)eU zx}6)rRj^thdbEg1KG!9={s zXOYa|2p+Bp*O(dj(Pr1UB!2c1NXN7h1hVWCz+*oZY&wxKf3-+SA!=9dD(2vi?9ozp zs6(t83Yj+}nSWrXb)<<#gEBlbb##!*3z~tB1IuUZ8^$~4S8VAPAGyurk-|X+es}0Z zV*HZL3vNsYe?c4AaBtFx)A~-``f6Rm?f!s8%v?~SeMI}B@u9w(Pa0JpT7pTUJI8>0 zbY+E62VSkZC^~9i+Cb&m>EGP6ak3|Sp=gS#Tr7)dq+iigvXuEsgVQV!7=QnWy$ibM z5u6mt%S^Hy?6KYPaef#NnW6>1j%RHtXlM&73~Av=C0p9D8}!M4 z$btK_C-(j@Oy$=tG`zr~^6;?vIz~bl_1IYHR*DBs0Gsmqh}px&P)C+7uD%HtMDF@r z?@s*KSd<3`Zhr1sS8=rbug-;NrNljjSoFBedoxV3HO?qyhWaP z(>uzIJGFC&U@<}rI?r6VaC{5t3p#>qdchJBZ#?)qq@g04p3Pd9OxeUmP=$=Tr5Qs7 zH#Z+Xkuz3apAQPxZ4!}0SBs>!JYlXg&V(rxue$~B6<|%8lHq9PBNOXG9Tw^}1Nm0J z9P$I}Y0u0Yf}N>y&a-mx9`Uc)U>(l(tKs^sgO^VQa7fYc)Uim#Ci5{_?3JeWx$dJ` zLQAnYNXhWis)*LA2-ZTonZhs#0q*C#ix1zWrgAcl<>!*@f~!T8uI18CLe@{R27ER> z(ob-Y0kHbJ8`hvUL)6RcJb6@@376FpN7sYcePVlvt{0ZS{Dp49K>CR~_9~IB%e%9! zh@0EqUPGvnR4j>2s6%Nb<%>0|jw;-c174Ws4{GBe_4skUPH((=E~C5#L8ocRcU%N| z_JIDOHNjv`0Z!g2PSb$$s!MF84tDV7~|YApLuqH>mRwaH6W|H4lIGKNiE8%i`5n{>*w!FsEN7`yv@Z9 zic+F%82myUT37feMfMROIvu~9Pt8)7%Ob77I3oaLrU}aQxnfGo&Wg5b z#&1L;G9EBCcs3bVGq0stRv1*9h4Nw;ZtlAn)pt)P65Q!cR|$PgQ`F#~WlS1UubXqR zNKeHX1~Fwv6}h>cYm9Kvvjx?KRy#(1bW?u4uTeW#W# z_-95MJ!KBAqcLoaNA36TeW-Xn?N};Z>TUoU%aFaSq9q=N?LAX&cv6txt1hcH#N4pO zR3klg(WcZ`2y7a4dgxBOE4Sg&gkc}D;5|#t2fI=@F9D8A{;OVJlJK1Bvzt0NtNos# zbz96=kP~fyOlMi#RA)74EZ0F?PMhoOvIK_r*1-kjW*BSq4;Q_Bsx4=(BGa;fcIz(k zKFpQ5n8MtfL}A}mXYdE-m|KxvUliR9C~pYWX5?*R18*MH9fV+61zX!tzDLRmvXYyi zL<;UzWAY}~R@fR>09@q(*x+JG--=ZDa*sXn zVW_mJ_e-JNIQY<0aSEsdd9)Fu5PDQ_=miEXb-z-`C3eBGzu5VZVo-<=5L9ziRzq_G zu;b0GwtLEZI9a4#0Sm#s2ONgJSu`dF;cl4I zh~4UxX#3i?)ZBVm;rByp>IBpMuZA3|5mNU4fDy`DhblC+1HoHNZQ`20(8K5TqMK38 zhFot$;B~T_AwKr-%aNh-=dLPZe32fx&kZ8T{u9mlim-|IH0c+Lie`r%(}#K{IrhDR|#fDJdYH+6qBagEZWUfBy`*&`xsD#&q_%@%CtCNB9l)$*z*0 z_jz9_HtFz&N)OR*&0kSJqCdcJlXgZ-k792)UYWdfzo6i$D0}i?`p}c}UlI}m#Zc&Q zRqg=f!7$0@Q4~z+1(QY9i*lbe!Z#uRFG1mh}JZ4NZ=R1U5RE={17Bd;1dgYnE5vsi#us#t1dcSOA|sg_i# zHGnz8YL(dNN1u@{7i|v*oDDu~_G>NzTeZJ&Ls!-|l)Z_y2zuu>m*X`|EYYn=KH6F( zdnDM*Y6?bBJ?9 zkFppjr}NjhFOmmA9CO-WMK$l&%Z1s@SA-Hd+K>k1wOElS375U(nCS82dCMm+=UXp&2IlUNWUw%_j+- zSk5PLvkw>Oi1Pr$8Z)8RAD_r5>t__s%#{f!LGLQRq#d^}8Yq|h3W}6fc;rVw&5;Qx z*|v(Y@rSc?K$Z;t^HQE@6lI|awPF%=kH?@=D}M&{8iO`F^9J>0x`wMmlWpxPi4T?5 zGjFM7-cZZ9q?&q4HhGt9^e$fOnYa4Cf6PAh5NF~k-pC`&JVBR>bXNjjX1e!T9{r2} zeOn$Pa;H#URs4%e{hm0)L}Eqy-P@Q<&V;W3fAChfY1pq z+VF0`==n=>HIP1+2Lw8-C5^{$(?gozk#tc1phG11#M|q=&4W!8WHlnWz5|HWXUq+~*$#<^gsDcAu5Mec}9Yz|=@} zA~HtI@UKLZctgLB<=><7^5WAz`WL?*4CIgia{X>k%vloGrj0^i5C`IA!u9A(-J`7k zvmlI>qc$!YaY{1Lg+yBVMW!oV4qJ_vlHiY{HwDfeZn)3;6bYrL@0{5d^YuH?+DmZ{ZqSap2S%u>`+ULIN>f_uHAEt|6B~H@*lt+ ze*c#NkT?O;u$rHdG7R`%zu5lUy4U|<8JSX*azqk9xFYyt6vw^v;?wH~VCX>tE?^*y zD5y^=poUKwG@)E;qh7oy*zeB-m!kWEmGih!!2S6B1^*p#)H>Kf7+_FX-$l=}#q{ay zyLIvKuNIFFagO~65Pg31Cs@iRW1vcN1em}&{?LWuRQz}UzR48p#h+z|pek|y9bCgG z+7f6brS|D7v^EXYa%r1%zFmn#t;n(0{f60Wl)`=!9r)mUYksb?9R0;%DlnoHC z4hbbQ6k{ABbFKAaP4p-85N42D=S3r; z{GmFtSk;(tX)BJj9MGVo%PVjNIA{LEYQrWs|WbVcEIQ<^m?A6spD2JQ-x5?Se*Htmk zt+Swi{v8v8IcE+gXb=!GLf$b{4XPv_JbmJJqmK~{N(ufZ;brUBbv91!Vc0`R?5YxV zRnvFlH0MIRg7eT>+yJ3Dkm&y#)OMO9kB`LLB z!>|t2ycwrQR1w*?PT1ytS?t}5Uxx-Ew~l{dWq4y6^f`-@7l=D>XPfT17ScY5a?kzO zd~uL(pXr&XfZ*B-n^zF`i$K{SDn_s)!24&6fJX``<-n;R_=uRgbX`++K^S_1nA+5= zBA5hJ3e)?gk_32ygL7wq5q1JJo^u0pjY!f7vH+ z56q5D(nD)4(b}jqS!ki#{kG4iv?wC@T`s6or&;aN*raKx)v8(9(!84e_1wc|ON#Zo z>GRI`%H5UY{dJ~$=KEhg*)QdNWPf{^_y{w6G>G6Pc}8sQ%He%Y5&Uh<_%L(g0sq+$ zH+o$KJgexCCJ{~QHpa5y3j`oj+>NnQf44dc?^#0nHmb(CN?=Q1py`r7)Fr{lOoIMy z+Pg^|J*#x92uq}pFpN(tWQCfO?8-@Fg{)b#hE%{ZnCN%sMR5^-2muvk&?Cs)d?g!; zhlS8t<3#TL%u2uK@Z)eIKr))s`sA~<$PsMH<>${Af#8kh;6eh!%Yo3;UJ3opYYHbg z-YkS(3CZphcKOl3pw*Ep1Da|oW`x9`37s>a%acy8l!V&z6@S!=xtRp_-no1`=nKET z*P8Wje-)DX3Plq|&S^(1HA@*tE?Lx3^Et(Eu2q$79&}O;drVPw`H&gNtPI_%VlWzi zd2hnFpL{Ad^EqL9q?Q913fnkfA_htQDN~E7`nGuUql%?y7cTu^F@1fuz>6EmtfYqa z=`#QQoD?jTU187>c6!WY*{mS{cBi9s**}A{<&9aRbLF?PhXVxVjoEgFenn};Dg4Z% z4wc2DZfx;noo{jEQ=^cUKM??e63b^FJ`VLC04i~CrZFYL(c7GQBd~j;{N81~&b*e6 znwET%;|P%@XJ|{15!_xN*+qR-T9bWk|AayfQ*a$q)21_``k;Y)O)}nCPH+>W7~H=Z zam$jMNu8kM+TNW)?i1ndX=HM_batA)IV$1G*LgY6S!E+m>54GZeXlHy7RM_uri&-E zcKbkE86-i{)-sF;hBT-qA!>B35=XGI)WeKpcI{OXcbFO5%DG{ngER|?{ql_$tmqsF zaVpGytkW>_L+n)4SHg)l-b}`z1qw9M1w$-EOx~UJ1;bQxgznYzJQOmHhRqKH(q8?$ zwZoZ){bqy%UD*3)W0BIDh$)6dK)h-*kA;zXM8k>BvV;Y6obhoNK;n$v9>yzj2x>;z zizYmlk&j1a)3d#8aw>lo6f_LsM=Fi#`@nv0Xm*cgjYKIpnm%S@cpp1)cv{r>8t80A zfJz-Rko8mm4;m}Z97$(5RbUFL=7hx|Q#{@Nbt%zA!fI9r%kr(3TA1xN|I5P6oMRPL zDVKiQ+-)-1+&1km^U~2*_h8}7T{BF4pP^1YK;7H#k7bVIHu5gm3ooNZkC)gTO5KNv`z9-uSQ;jp4D|V&JL;E zPR(qc0Ba_fvFAD^RqJ0DolPBwL6_y+7G6m*%ODujh{aD!%Oyh^Y}?OowRSvKonF9p5v^Rwv-E zoq)>g~0-wJJ}hoaviZ3v_xZ*k?!Rc5~+`cOZA20^TxZ$!b*9?qw1n%+Fc0>TO`q7blGQn1O0&`4n0tqlP=|=|HQY*h5WYVv=eu6b)`G|GfAzE z8d;UNYN6e-ZNE#?HBlogCF-Wk+xTJcfXmo;-Toiot0 z>9H1oGzQo*%tkanrmv#~EPsqGi_*04bH=6Xp_@Ymp@A9-yjn}6IcFEy8TA`@#G{^- z#S$CItXJua8~Kjyv!K`I^Yc22qmGKjV7?CRQ9TmPYm6SS;c-SB4~8A!*Bn*u@ZDBM zXoLL4Zbe9ug>hHD{9y7ePV{peb;SG<9525XB8d1kT-di;AEzm<D=)(Y4<$c16wXa){yzE=xDgneOh% z;4ne9?MbR0jiiM?ygh6goE{{aT%Zw&PuA2hf{tZ4HDg~Y`I|Z-AwvDO-n?6T;vnN{ zBe8wNwKIQT2)mIZ#sU61XoaTvyl-_2@bBqLGm z0(sPiDEXaGLvQl$2Z>j{UIj{SMI$RJUNA)#a>O_*3SO~v9l2zNzDg2ve~Q5XxpBY} zeSVhXKl(lo{89%|hjACrGS_EvT?t+_3hRgmof6hH%H}ZeyVv4-By@S?a>vep8mq2* zU9588AFu5j`mI-fON_;Tm?$||avR}K&;(9RRdB~%c0$voxU-;A_xpt)?@7~v?Cq4m_J2H!BnjX&{#|N;0>CPMG%_z;yY11_F!-tjw#u&8&+^ddMKS#W)zi<}=z$Vm2hfVQG(PSg{L&M`&E(?X1QQgv$`G>v~ zL}?-tm_0!n4;83-BWh7$ERG_gULZ7ZQ@6N7W4cGj)qvft;0Z3fVUxi{S={2GxY+c#3tJJd12F52f409hE*NIORig4Om#MOQqMTNHqkGCWSb0(HL_w}be z(UE^x?=mzGRXZ{iIFqBYDHphs+t75lMn<08LXDJ4jg(#svsFktiW#3O#xPhgzP1Ie zkDFLSjt#SH3i)w*l$;79x+I!{{v{7UcA~AmwI6Ec4#U%imF3;erIRSWJ%PGQ6q@G_ z@5J3A)t&B#F>qEJQU0LDHXJjxovxZMD}y)T)M&dBl(#6*x8{cPj%h*YW~-6xu`4;o zZsFw*jHjSoj0bOE%ci^)d-ru{xXfL7a zk~8MqOM>J&gH4eK$W_BTfb`x2%#XnGXSvO2-#vqm%;9%D(mO2?0JzGg zKLv@_AH0+!Q~rV-MPr(#6f3cw8Ga$Exf`O~zx;xyRn4Nq88sLJrK6k;5kTxi2qD28+_P2sws2X~i8Co)OAizmWZjs2rtZ8?hyU z0P)TMG!q55u`#YYGP0^G^rR ze+>?k>H+JLH5>^nrp~D8Kx;a)!Ga`{$r! zsj$cFwW?6?P_iqeV&|#eb%U(NnHeyNw@hR+YGYF=+@`fozEadme+El^b(rPIoe;sa z2vFrB#T^20Tnxj5eDrj?Y3MUaN_;5q{xXqk>fkX?+OR)_jl_kg5F*IJNLqV<7p8F- zvLcnnksQL#qWu6+9QTt=i$$0H<*tW_He~p@nFxyjFNYVmNl*`})?>Sdqqd2G*yWlr z(nYY%S@JQR;Wx5eG0d0isDwWpo3~Aw$+6u_jTi}@bucI&yZeZIoxpXO|HRj@6RF_1Y32x)mnF*?Ge0m!y82DxG-9k~U46rXMDS!`VgUzMyraLBg?{} zi9Uws=3`rhJM5Ax2S$nsu3JdyGA4?`!I#zWznbF>o8rARB*5Tj@!Qr}O-pHciHUXP zd1j~f^TfoKd=N;FK}9v8)T4)c`y{;^uexA_K^d2TAf1qJq_hMGebSdL2qXqryEmLe zE=JA2+KjG#np{rTMpJPl4T~%Lt(KPk*=>?R#t-8Vjw3yyR-$0okSM|A6S9jU#nm{5 zusv#zxKx5dzCaMsKZk_pP(tH74BR2$OVC*r&8ME|6oRkwF~`-n-h6+)lG-%#6V;%6 zwKQTCAyQeLUB*~C(N4Ig9;>g;H*aA#66}Z~F%HXr$FiN@g>?TlZ!}HD)6(5#Z#loO zb{0b@+-xCq)F3YqFEO#w%D`(&%GRuJ6+fy78D0q(A$2`pFBuz-x7J}|V_re7> zfzMhF)UKz#s!7ZEXU{3xVgg<>jfX+{7bUwKTsYfFQ2WOR=&c6{Gt0NKS1Jy_kF<9G zhlebiIGYOhz`_0tqHs8vD5{%`JRCGZ$Y4M!A#`*X71b?zBS>1r9Pn2Kzp0>Q00|bE z+*w#=NCDVB2_Jn9lkftwCK08GvPeYQ_ZIobJ1>btnCykDbOwvJ6T*B*UMEqw=pU8> zlep(1yoSE#;)kK|MD`|2e}4#QEFGvulZXkw#fawnrnO;}z4U``T8|xifpGUKQT>}X zk{Z`1uG}DjFUP<($dkmmO}gLe|AMmcXKTRD@i;UHV*eDGe5k_C!)DXg`koGV}U`+v)C_@8dBWAwGGo*yw!`2Q!w{y)39l>XyO_ z?ob=6zwo5dnY%+I+)yZItE94m6GXB^6@mlI&hg?A(+6Dta&Gy)KX1wWK(mn3ESo4d zN-Wn~nl@sZiFD*trE4{AbtHxvE;DnERF*Ry)DwM>1oiFPdz3p3uF_C9oNCl)Z8zg! zdpinbtaloy{;_fIuwd~LrJO&WNvhzpA;=KY(l1Z(mU@9y4BB%xpGmDeXkA%2Zpac+ z=s#$JD9)$IoW4KoG?UYJSaGEE3Kr3K+Ux>Gn8fid@dHEW0sTS#4Anf; z2+yt5a=TX6?8{s2lkga&q8caHhA!Dn(39m!e^w*KxEegw484ndO+F2WePcV(#5lyyd)iZ zd?0uXKC}dUW*I{Vt8{}E!$gobVmLb9|DLg%>cgfSx6N_1dexdY#_Wlv>TZ!C(L1M_ z*9ji;30r>1aNc70Y?+`Kp=)Awk6NJ?)3sn@E7D?Pvnqe;SfamlUT9wAVV1>V+1|VY z8mTxCe-5zr$T>VSS=O{}C7{!68R903-^~S1)wbpW(S@)9yEYQLD&&4Op1mV%rfP!B zIT(hEK_9kFQzm?-l40l)=J01fLNZ1*r)GM<)-4&HHAoZW?enBr;FmuHNvtHqyTJ~R zNWxV)FT6Q zP5-dv*C&CqEW{75W^PeM^gCIo_H=Y2tP94&Trqa;i9H8GVo6=*_0MyBhh~?QtZV%F zZh3dul9`|0dAe(h?eNFC1t!<-Q&IMV`{D zBSnax$fHG2I6VU#4oPrht9!nIL5-ISZ*Zy?gxX!BnlrMtAyiNJT*TL`(bN}Qy*)9n zXss8p&KI=aT`niHPiVef+<4zxr5PU_;df_05sLtO(;IH8$Ey_qX5S+g9QW+-r*r1d zibcjD#ja8c7NmpJ%IUfP`ag(@yV-F4N!ydc`@cb?DcL$Z7#aVc62FF}EAk5J7Psz}jExBb#>ajHxx=ojEY-b;o!l6*Yr1_EheuT@5Il{{lld~!C0gp{)Lj}5HNpD`faXWZe zdQaGbnz8Ux<{j}8sYom!LSd%DHyi46 z`pY>J|M!N>-M@m|aj~E;cS*>EQ(RfrBFsl)YxC#D`Y7?x#`HU6&Jb@B zQ(D?`W{JOnw%AHX=9gEKnUOVDVMG$=R7;ka+bhN-!qJqhS%-WcTl99MIhAZ5JoG!67$76 z{w_M&wztC$9z3>YLK3YDeV)&y#fH}P$7qG3W)>$Sn{H>>CbP+yr5J1z*HtklS<+Wu z_Gp+uxJGfA8^@aFc3WZjE58Ez*-Fvscb_2e)n+k^b8Wy9H5Qjk4&ZmDiMmLi4->s ziKooh9rt{dweYf*i%mU7Xs0^JQMS-G3fUgTnt6$;N3SRU(rO5s)`#(yWR?pnr-<+| zcT&1Qf;0};%uQ{pYc5?)htl3&h~F_boJQscZICb(DI+ybvn|I28GC3BVE1ylDyopt zslNHM&&YRYiizaroaBGnZVjw|U)Ma021ey)Wuy7K=;#9NuV&5&;S;+G@t ziOh5G7gxAQjSo3&yZqiGX_l;BsDhX7W~MWAb|XVjPCxVEC7^F~>%hK7)@j%NbchaA zx3^mM&_az1H`zt!p>WDZ2W{28Q} zz?L#hEk@9lRUtShBeKLV>v8+7pC6=Ko6@Chv)^r9R9 zn@3%%T9v*y-K^CfQc3ny93qm$Qo2izu_a+Ag&&xY7Ig?HZsFsU1Fna?m%+m04}po> z@#OaK<>pP@#oThxFN9KDVIQ1331^4r=FoWTxN(0<9``S5Iqg%!e1(-3{|wLkH1p0( znRLaG->UrI)T0f{q-XA*PLX5pXQ1O}34%5>!hy|F+^-qJ&8NnFJ{V+tOs_KCYq zs;z{k_N&{fWDVY~kOenr)AnQR?Gd^grO@ie2%=Whc!d}+oEWeTG6kl}e?1@W_7}DIrv43WF6fzCX*)-+h=;$#LGPzVTGK{oTTaH`9 zFNe$~9qH`9UyshrCk;d|F^3k2AT}^mCgHphX3Aph*N!A7YNVPT87=?5lNa~i-~6te zrI$KIHN8jU;800U(UFPa`=1rnBapemxt1(8;;J?29X2;lZTjf2EQY2fS0CFdG;9u0 zw@*lGEbqR>NTv_ZSrJ^QSvHhX%^N96P&-dqpIRZ~&CMQm2wNnp@Azm|De$BtRAdp{(4U`S;B~*h8f4fmEEu)hoT%;qE9R!%Z9@dR7hTP= zRKY+osV<+AK)lPYG*e>)Y@qUa^5sJZ%eiru&{1keM5L+_*45)(|G4;^?K-8A=%e`c1R7c-EZ%o z_vj9WyW;t~MQ*y!GY0rc;+ZW+&{vG%E8b;3*^%$68HVC->>5&xhv!8SlS_n=i_1q| zS-gRlmT@RIb(JQrz5`vwF;mb&dZvy2It@Rncff_g?>cXdYKMG!gd_+Sv~jNV*OVB= zGQh{Gq^y7AkY|GN@Q7AH)E$y71mBEFj4M(enYxZuo-<7T=25XxNOC95`Sui;CMTpB zIB>%7hMw_Y=H!OUhvpuQ+V-1O7lHP8$WbOp<>j&Z^}h&}!31L?o|DZ>b)wLQy+fG* zrTzpm(tYi8sA)3-$9ho-j{DyKtaYR<+7&JRXdM_o(A)q1xW@mw(f#iTAf+GNtpdWA zEFCpF#^xuSs5PpHt)LI*|U2F+D4$agsJ>oGJPX@cm_274=v za+F=M79hEqbu4i->9OreU(4<7@dBm~VfV8fAnNQLo3C{$WXKoWBnnbKY z4L%@Z&E-K9D97oCnKYon0s|Bo!iWd$O5E}mpWeeFAVkB*H|Qm1F7}STexfICsQvNe zOj-&ELyAIlA08Dz4`2$@=ljP%S#l6Dr!C~?=nTm)Jf?ny3Gk6J4c_&uV*833Qbv^d zH;h$a>1xz~IcKL7{&l-_ocN3_at`tLet>eoWE_1WiUq1(ZaJY8y1Uj6@o8Ofvls+( zWlJd|j_ygLi1&@oueDmXzIufN9ZLBVi$t=(s`@FqWQTiSLDHYeVx!V#6!GoP)V$N) z`1nu2I`+NC97B8o#1KE;2|oOG?jI+ys8A0_1JUeBH1j@4_R3hJ;4NYYxWj=S!%I={ z9-1Pa@d+%a%4?gnIaQm4Y6VUdLl#I8iFjHNH!6P*{%Bd)RI?o?TTf_smLF}Coelgc zoJ+#Kp9<#+!~ucmt+<19OQTSXavwp}eH;H;fOU{f|5JnwV(v*DDo}_rQ=%S&bOyc|rv&5`0|}29AFjS^WgR6HF%+I|uDXUON#Zj67m58V1P!EKpotp7h?=!H zaG0btFp5K8Y=>bk{|2%)APyA&AB>%IaOBapwr677w%su&w#^A9 zww+AJ$;37$wr$(CZ9DmLF6!QMs=hk6s(V-WpWXG_Ywi86wVszqeI28K#&RU%0aHbh z==7z*sW(fwo+!G7nK8QBSqllJ0cRKGi$|KlWawrdXX)jcR~qr6)DPQ^RW|naU_a>i zx29{2(y`17Lc~XnC}VW;i*2{AiFL#>9Vr8;v}9xm$z6A!|Km{%9aWGhttB4r!K7N= z^w)Ipt_Qe_w}v$Yq+6#>whCYK$w2|y?JWg_T@~s(Cz-wo2Y%So`omqL8JF=%(P-;@ z6EldP(QM|Oi2f0v4~g@gki-_eg8Xc}eepmtYuIJ)Nsk$sz0i2Xmni`-&ZKk?7bKx; zA!zMeOs#KCtYi$UF8b38q*v3+AHr(FTXr)lXOve zv54Pe;gS@$Z0f^qEsB-JTd8HucW0rL`f3o78;$A9*qz8r79;lPVw`yppLFI<$JB-M z`KG*jT)jw55$oji3(~hAFS!<_ly9+QKRY8f<*7u#PiPJ{yT^*;iOP%5Tr_?WU zWjl5-j`BOw1yARsa0-SFDNKh@js%cQz)Jh?N$!T^i#t$}Al3Qip-bFBf*XI!E3vYW zxHm}dAXj#3rvs*xoh;>aJQvvA>{lB>{;b^zuFPa{?qQ3uE0;wNsV=;OQr1f~5iU<3 zC+}>4nPu!yeU6Gt`Xi!KqH_O@yIXN{VbqmMf@Gaq0fn}Uc3d^v_&g%AS0wFo`&w;9F%5H%($vO4sY-;xWfv;ta^|MNi6&~xKZtdC3 z4e(79>%8c#K;frA@b@sh$KIz1a0wkjc*m-os^6<`L3eE1ec(ydA>9))3ZJaGFGlb1 zXzsC38b>X7k6I3S$-dv?bii#Fbyhb1WfMp5iBkrBN%|>Y@BjN$?*B@3_+f%DJxoZV zpLO+$>IA~baC$;^`+v85=!7Lx3S#rX`BGsKw{rRxI^B5PK5xC-zvEStoSklLa8;EY zZLL!ghwU#dqy0jed)?RwZ3UVzM7#@v1NhQw7pQNh<+{*M5b^)p+db zPH}NG8;VZqm@evVn;o1JPom=Zz%a}^|6Wd?n>63woIVdVfYb1uj}4CPJ+k~Mrdpq) z;aAUzTmGcY+qR@x#z`+XlrEe$iYl6);c{l=yX4uww3I~qOhr41mocs^S6nJHbBwwmeTyx-;^;E1>hn*vPnp0@_CM} z`7(xDmV}Y;%S+@_F}T>_s~|WJh-5p%KH59TPb>RHpZCM(~Gvl)}F5=#u&k-yrQI1=>Cau24xrW_bOi30S=My2p4k!UB z=R6Q;dSKX67UC>PA^E#JM#93?$glHw9t2on`8z0M_ z;Czj~LQyFuU#I9?vqWq$rE0zEa3NOn_;LbZ2gUTjp1b9;nUY#jVUijHU@XN8f>P=w zPq8fCSQ7m2VdJKb?}`n_y=VE!uS$c+<42a+h#+%~b{TeJ3SWu)Pa6?%q8pP{Ag3=`-bg{nZAs=IGLVEX~jJng~k%PzHf@&!)iUi2Yk2 zw)@C{w+GVdG-?++Sqhc^_6~{W@PYAQ_Uw>EyC6nk|H>;6z~{*4KuV2tUMp^-Sxp#x z=`TH_+C>h;C#UNKKcylthgq;F{6GexteLKRU`kH1hi7dSgj`H8)wl3POTt2*- zqT1D>74#RJuDcY^xe7$q2I@a~fFK#N5kyt=b6#`ok0aK#lSeAG)tZ#kuRL|~u%UJ6 z7NW~`*U-~pG)(1nJ06*-b9R8{QxI7;YfCe4T1^dkfEtbYYpM8MoDXlHGYE&?8nH_I zDPHVguR-Sd%2G1#>SQ&XEBH0zn|9{8eB5t`YNZhlJi-jw^s6;?i)zR6#~3ncK)FG= z0`bKV&TfH;suZ5*OT3in4AZ@n@n(_UhC4DAebgjo zJnxud-gn^*_Wi@?HiMGQqEyW6z|$vPiYpSupcaN_Z=}qg`|Z&v1MekgIF63O@V34~ z5Ybm*FMgT7gv3C|s~Vbs)Sxtr0UlM2HXeOY4~v0ZnA=rqFSOIm8rcTw?YI${suBgZ z-pPuHbUMe?fDK2idWrT>u1c9ncQ)gaxDMQ!R2oQz)II=&HU;T315BW&HqWD?`c9qRV=@A9#jNxM=DI`nu&ums1>han zq@>~rm_&yb){z)pw(z{hRBQ2fgsnT=QPLRXdV4syJzEWbcj@zyb~uycghLgDQsM%3 zuE1;l4Tg^Aigj+zUvL3RJb^uohF>Pl+w+v%*5{6cxP3#U+5O(IL+bSzrpra`zT{#= z%>ij)vth9QYkwgCeKKq7BfiyjfA~K0LNs%+`j@dQ*;+Z40PYu1Ds3-QPZQCkn&k?f zBXJhbca+>ERrfvv=E9=`)}a{#4f3|BiX4~V-ZpBm2%4<~;*7F0D$X$prad)rj@!&~ zKF%%v{E_3WeZeRAC_mzck)-6^C0L+GnN;~{klD)FHjLHD@Mm5%s(_G7UU6u_)g=4| zgM3m_2H9)Fs3(ZH&Qfv9$uE)ng5JO!9jpk3@Wg+tJ@>|(UFDchnd$Fc-Us3=&!`JK z0=&^5qX^H~t_q2RjAyMs6}z!(9&s~`#y2r+@X!e$>>vsQ z`$N(cfO?yDKiHO)^2ucn+f|RpB@aj|J_j4ud(8BDsdI|TlBf1h(0@*?t1Wv>{; zlVz*5&`e3X4Z?8HxXqgM-d`f9c4!d2DWV(DztxD+m~*NjK+j(@yduo>;&s1>GU zozU&kmDX~^4P%T6(WHf%4$^^25xeEWqn|0zWYPR`gjjD1b0{8jYZU4YPhrq<4`gd-(2&UIfmD75ac-Osc~HgX^e~x`!f5gA>+4XV zP(4yKgQa^!!gJ{ThPDFweqZOqnzIavsTL;TW zdYcKR^(2PXWFg~n%tAx-a^FeJq$Va~X%ucDEa~xhX+*(?%NdY}u1sbNdQqCMcIm>%nsmtgFtFa51L|9=ye<7-qy zwsiS}@RD`$g9fuzRWell{0$0n#=%qse0K)ge z4q?=`eYdyX_LJ0`cir}u_;>lCn5;WeO66()Le8pRX3TvYY4s-07~0<lcVR80;Lp-crV3qlu10hqmX)PJVNtz+?-Z$YAn5-(V4Y(W}h7hv@8oP zB=l6zacaWJ=_!?Vv1=8^>`M!yP%{xAl(A{`(z%WH<&sTjTH0$Q0ers>ly1(TRx2@M zvvaS=Yx;F&!t!S@8m?sse88HXNUWkCiG8^y+&>c&Uo>2#O41)SrNp)h(2k($*URD$m&9c2QVC+?`+;#=Fd( zHF1fBr*+EaM8Ga#gtY}~(*~v0pFp*R#BC~CJC(vS;#&7uH)Ra`B0tdesL$v$^oj2z zxxPg+6nMk%Gu+fQ_D#Na`|T-KBJn!<@GcjxH*dKw;kDni-iWJ6l?N5ka1TIGl=xkaFXsiUZlbRu~PJ`R@L!|r=Abp z`s>SGVx2&KL*?J|-TDv>$ybQ_N7cH=YpuR_@^ej#D3v;KH~O78@^i5ILE4qwHVpfk zJp62zroZ?H^&!)->_X?qVGpd8qFx1g^WsrU@(Es1EHA%@=`sx%29wqQ08H^*4gAof zdn9FQs0qa~AO9rxNDpm64($Xd51{b>`DyR*_GjhuZ?+CqiP%_CdAhYhWTnG-kpy+4 z4qp+hk{X4#l&u{ZXa2M9LI&EycEW*D;zr~3R0vNj*0l&~{oq=cA82OwDW&^Zq1#xY z`ly z?H95Eb}IgQO!PA&MByw!lI$zeh< zGG{ENM93kM`Q4Op?GVBsG8e)1D| zvot+?P!bbSj7E>oBVSDuoDch*)yf;U%g}DY=#wAp;*~;@xPS-2oF9X2Q}67yZXafr zee(go8zXO2A+1%z?Om6Aa!w-`L1pYP5AQjf$&Ieub7@(3*0v9OX4N@y6cd;98Lvp$ z4E(#r0~E=&NS>d?kqw2&b@9z^hY#V4_{5(cT*!H>c3VZCG%R;$uaT z=^`(~gh8y-BHe=WahQ0qVZzvMv%8lug8hlh#9xj+Ks#0x!?xUC7Z>+6&o+Dl{0u&L z>y3t>#cGBUZeD9We5B9-^>Od3EGkmw-~k0rmZ(a#4J=TvgIh*j*43$wSqm8Fqq|7QLeV*7!n& z&P%fL@$;Y4IDcXTvNZg+Z_vcwzR~@=8?x{}{M-H~gO_V~>MQS~e`c_n6Se=KMx>@! zAxL1)cPb)kP{>Bho5A@0=QkYuIlahg9T_!DjV3ywRfj@1O@}^A@8Z-n+Ao+iEwpvC z4CR#7bjCU6!r9_9IF|`mTbmhHdivX_JD$zQj7L|!M#xCMd$`}#tkHH_#=3g#gO|m{ z)0Q}18wo7}*@x~R_3nb56^F8=*I*#~&Z;e_B3R4F6+&s3@NWLjK9nd>?esm&Np5N$ zP;!C~3(rt0LK1f>YA3*N-50lWCjs$F-6N&fPl@~EurKW$#^3>&-!ECRD3`Vt!EK5b z-}hmb_wT`-ed~j{kYeFSg0dSaD(7&aSk{M5T3zPD^n1I9uzKFXO3MtCgPS*{ZZgYz_+9jXmt#bQ15l8f2Q@a|v^$;S(xlMM`_|^uESIWJR3(sk-@KsP#zJkl&bxP?Ohyx^)HS@1r;9 ztU0AZam8TlOTCb~cnHWSaorRq$EeP?WXvLfnka(>>qR7gWodUQX0V`8^Sn=`fw*a< zGz*H>WJ#|-$xo3Ld|bjpHoTThKe~7K4-5z>J9~z<14(DnBwxN|3-?An>kak7gkh2sX1u!?K9HG-Huw?8 z7S5DijKczNhQrgNe7T<;YX*xlQY$63a_FKi$6)14rY9Sq3^qPD)%$y5ehQTVD8)vG zt2JGiCUf4?mSG55o}7(t>ShM@0jUjzhZJTjlh_4 z!XGA@Qrg5nDZ@c8m=;HtKLqwn%hjBx6pdAW_&cX)LX7TKMeaUFmgaX4Ss|4@7cnHN zQZ}iXI4ibD!LA3=s8~t}3RGKhnYOXyugQ4!{N_9ha7o_&gCj?f6}TpjJQ-PXX6iaT zel2>(AyPKQ)b$$#2LeX{^tI!Hg+YByqNGXmsr~+}qzWV^RVo=p94Lz4$}fat?<>dg z5{9ZC@{`f|t9X~UjYf)D8Q-^Gcd^cHmeHgYTUSCeFuslTGtYp&LbivkNlv(=`vd|T zA^f4cx0|G46V=$-rqP4QH0(xwm0zT2jOI8xYAf>)njz}eWZlV9k0Y%RwGo9PJ>5dA zZu8))U8cgIYI_78X9oUA&c!0S`0!*NZ&EN0(cmf6_&OKDXpN&`)#y8b8H8hP+*^7EE^n06JMV_y7|39-_Y+a`cE>{wAbrUmXdS4 zoxa{1msMRiu&A0C3r<$C)l7@E>MwI;2TBS5WWnIj1a}KM;<6#`VRr0FY3ID)SoGn* z2?5$N_uMg51?f3J=~TMLMsRm=D_=c={f0{PESz3r@qK9Z4j&^y=jMW5@gyjw%d` zw2b63Ctj&H*W&u#83IM>*qdnsn8tJ2FMnYnnHYeFoMc_ZyEU`8$$Hv^I{7AM7yO;Q zv@_m%`#{Pq-SX016!^+*XRZ&vOLx1(1J&4deiPQW@3t@-+BkaA-@V`wB){{MZM#U| zIfn2gFTS;voANK?L#p3VIs)UP_cWq-t}|7xx!Jfzu+VHR!W|2?LA|IfeDVw+CStz7 z8NtI=OJvKlwf*TFiFOj{C7)S1f07Z#KLLM9eO!@B!_a|D>0P?bkW#p~D}Zw`Kmm*#Aw2K_*dSjF_D5~Hu*hqRZb-7jKW_UJkhBIt zCP2qi_1}fG^&-1NHduFhRWDJ8{tVzrR>R)6sgTq4#IQk)`D9C;oO0CL>qL1l#~TS( zIk`XHho8}ycr0S3$giuIQ3h=8K8|egI*r$UY7AlfBlTrL=O=)+9m2OTbZ;g1l4K8IA0FVm1*pbE_ZO5FX4)Ah?XE5|d2eAydW{ zWwT>y^%7qTwls;wy_$M!vKvROn^duV3DBlECg9IgB$^Ym&PfEHhDA+hNPj5G`_ir| ztmBNMc2ya+-lLqGtA?SD)T61!njU$Nb+iV_3w5c4pn>!&vr%*B}O$kdJr>5I;Kck@gP(rof3yC9N*Bs+@T0368cTGPZ zc2dd;B`uE?Ov~C_CT$fpbDxutW(TAt#zEcI;Qq0z0hwosy}(P+@A}5A5);-D#S0r9 z+g|Whrtq(JbCR++QdDA&o&8x2?kk#4z9IW7oTS*rXXec=thP{lH&|tRsC+ldksycB zAcuTL>Lbc0>eZ<@|4*^CJgY5k+ZDU$c4A4DYRFT}f{25~4$@8LE+5RpUO6kP(gQIr zDdzxq?1|Na1}s?zv;hg{zSJ86$cI-QBmS+hE8@aogLI&Lbd)?7VU#`tzj6T@4vc1j zibSWQ43^OyhlI+l%lE#V6CDd3~(S0Cj8=A{2()Ota71-FtI(`9v+V}a4 zyMM^4fSG7W8SBF)A%u28mYeArCf4PQxu5#nMb4F#JInyfE;SYugQDyu1qjG3i^wgh z8d9b|9IZHvb%*6pIP%ZCNnstu4iWTo2}WJ3(y0wT2UWmpayht|l2LNo(oLWxYn9j| zMpKdR%uAZcsU&8Sx$KB8wv;IKd}5_Da>iu6DDxSN5L3xRl+KGIG0sNhe>sOKp^n>0 ztRd$r5Rxgg%oN+I)Q3OVA>J+n%ILI26Uky)ebi9_B)Gj+*m_1@pBlUOfkyX0%bFwsQ&Mev7j0#vWl%+Wi`&CP*i9T$GKczWE=Kj5C zYX8q4`EE%gSKyVKQ|_E%jzt{f`EYuGV!wfDuhec!YWnQ{x@Ze`_^Ch|xdR6#b_c%? z(fj2=`lAdc5e8TsOF>vV-pE`#eE=Fk^iyqL2>Yw3S5JOVgCCz#5$_%A24md#(K_eY za$K(+^ry+S{DkSP?Zgoh|F&~AaT^ zTzQtS;72*!HZ1A4TU3~GBs^O}maY!)+&z5>&XODa;>dKBK{+pD#O+h0k9Kxo1HSJn zl!U*BF5P_#=NvTi9A0*Rn1>PTy#^PQa%E#tXPm%ig23Pzu~3M_wR=C5uD`r8T~>kI zGg;r&@>-Zqzo{c@R`*W*I0dO8PB6*SP!R$|_ks(Uc5mz^V$3X&LbCFT{)iyfbxboSU(+%5j((Sl4@*6V{C`%fPcUVI~mSAMujKf8ZTY-NR%5wk*#pqL570SL=nDF zlO98nkGBp)4`Iv0;s>d2^X)-p7t@0Ugd5rt~uzs9IiR-x+HxYziiqO zS4;3lp69WVo@3|6bDunbWc*?lgSQnnIPi@f&LdNlpjP{H)?E@fio##X=nxn^0f^7Ri1qVdhjYh%EKs7k3S z#JD^cJ<$^(E5=fQ6G-7)cXO`GjijF2)V7Mg<9;9zvQ|f%?I2!>e+imt4JyR@-NEZz zj+YsZlNqh9zV9C&s9h|XEJs0crH)D3iB&ia?o>MRdrj)2&lO0`^vW6uZRg88a-t&L zSQwMxn^c}1qwt-cWJ63oe#Xc60$=7xhwbz_4j6mgw1+?3K`3G(7+; z63YVXms2>}l()@ke~lV)lF_|da(H_)`v9ggVm~vu?_{hxW;x98)fg=j+aJJVW;!&8 zPC^s{`x6Lah(yy6>E{Z~NBk1N0kp3=7n{xidWvxvu@?Hr#vnI7lu3;fSr5GMoVSJa z!Cc>JkANKw`79t*BY~Yq!3+%mM;h!f8&keb5wz0;)P^%EU&C!Ue_G?fU!AqXowZlu z9%Rxv-8W3eRUmX;slrR6@k%sjE7(p`vq@W2uQlDY{%jOc$$Ft$m@uKbs;Qcr7TjH! zq?hth6uyc4Vxp<$^I;BMJ>2nsq+Px}U+QZfbdF{hzoDxl>>qr-*I=P|^W}FhtAIvR zB{wXY&yDn~?;1-FNxH(>Bs5u$c&{e&n&&B+@feEMS~zxYqeNn61X+gA&!QyfC<))) z!uSnCQ}pe%YTc?|0!xc z^~#m8Ap*i^2hDgLQ1++|S0@hwGYy8?DWW9&gSeQaXo@Tc=~;Pdg=T?TOic8ym||wV z%-(pN_(L~=dO7UmS6Ch3%QUQ>ebH|PRrt;^nDQ^3Xn#(9n>9kvX|hcgog%?-R_bCW zvFs!j-|n3Zo`G7HfKWlHmB{=J4C+#$hu&k6wDVkkbYR8YSX{~P5k(4m7MgcZ;QI&b z;Lx#n)1&BpW$CLdqGwBQW`U=##7Bah?99#YsS>4T2{YN8tAE)k^O*ilAzxL9NaX*6 zeDNPU<$uW+YL-@bUkH^8{-&m+1g)*>d(Q7XmT(q05^-fYZTP&(S+)C}o9jsgIO8_xa$WX1F zkbGn?WO;ZB-ey;AQ%nRj-B{|bpBwTL8TwLPp9oHTbROHZUdBX{2Wsna~!0W7_GwP|DkW`__4WzVyLZ+SzT4iKN3M+&Is*#w9gnBOvl4So~UsWdaeq-%1q0BxD zvr%md(^MBb$(uU>+TBRd1>};p{w1S+LDOBiI3X_UQe2|dj=LC8(gA9`X&S4gbFZuZ z&>pY=HaNHJB`}f!dY2P)I-)?NvAIBS2i88TfiaTHyyXE=KRC_G5;0%do)VWSP7It@Z46-0?f4(dcrBQjD>g`Fp^$RbneU{Sm~XW%e8#~O4} zI8C6%9%xtO4TGPPZ3<&4EO?2w5a`FI+*Gu;2t#fU%eFoua$!95iuL3(2k3*qQ{mS$ zv7~=l3i*Rih?~&JAWCoNWu>y=fkxhbPb1}_EsWjpXV*HDH`a2ClUrP?u-aaKnV2;& z^6w!$9SpwsWr!(GTEP@)<4V-F17-!6AB2x64K|6xsDYVpHP$i>cyQ}eM_R+Bf%|1Y zR}-P-716>r@!ghz$WdrG(=Sh@aJwJL1QGb4VH=(FA3lXQygl;2-%PlZ^;0crV zb+cAzUY6hD^|;@e=go{GH>2NSfSB(cnvo9{tNc?Ajhi&tSx zvSdu!iROS{sojl1X8L5nAmAT(Vrjz2{l75WW+vr`nQ(+IOI z6!yv!;iPfI@R(*`X5R^v5%9|@NoP_qRjcp5ybk?fw%e3G%h`)zWOtz4+P3R9R^$P? z%+*zT2g`@ZF2~e8#ZULZGZt5h*cR|B< zjcTUuv9s@y*f5;o_qX+?NgTRuGjY&6zvSFB5l+-I1< z%;L6p-_>`DYhuA$jy3TYgEvt5ovgl7aW{OzU288t*QSoq_QxygX8vB^tLCEq&OVqo zZB{$$9#fKl&oBfpV)kum^j}AaAv-w zMI$XAGLwBLzJ<71vAd76=nH=&4Zd6(R~Fm-y7+{lJ-`E{4G?FrC)L1O2K7pVQr!7_ z4ANEVa{K_2g=apMS`{2%!E&!$4w%TImgLP*FT>ry!&O#THo-aH<}NLbk6CoW!V-jz zX&0;wc}$vah7U&)f+N72OqoFdxB=PTSSFVqwcZxlnd;0?`{GQiUX2IB!h$7E9vKp% z-WcTk_%Z5w=&&N0g7*ih!mJ4|i3lUNJ4)1zGlVOdmX93*xvDrH#CfcBhGTS(4bXKO;_0ns&X746Rd7NUuT6M5&B*Twki9PAsHt(8b`#Sg!4< zYOe{N*eE3}nF|v0y1P-RJy;{`FSb!t(=4ainmY63ttQy+chc^-dcoK7*3Q}s4Lh#CFYyto? z8@(%fty4^V0gC-8kV{HAN?jJJOq`RwKeoExLBxv(OXgGNKu?<8;paUbRHJsTl?FS> zkfW!cb-5ctxqPZ@-wQYfQjXh>_p!vj7i3InhejWZ~!ioJf(Ff2+L^{MJk z+-`F*d|yy;-+zJK?6i!BA@(I;e5!_h10ZQ4G#0C6tJgw$T>OriFjFHQWWKgC#$W*_ z&3(iai}kRnOk{NqZKmtaP6X_=59w%(>`~Cbyn!wYG2}mD6-4fzDI$Kpt|2*?$DueR z+_=Zr!TKlxV?EKcbVBy>hL^k2wpwX+S|V2n6DFAXjW0o=-BOYTY0NCQiO1CW{fcVo zL%w;d$G8e&?OwACw%aFqCpf@69)47 z#(DNA<6$~1!2TF>3!t_cmmNN>Zwd@oq`Q{|9M|xbvQDLV^WMyo*f9cJ?QYcUH53A| zKPgteNn|>&EqM5LfE2){P)SBv2}LERNHtFVTnoj??P=vE2fXNJ5o?={M} zUeA`4PE?9^nqZ#Xf-kc=M~N~krb@2Q;sAb+sY2Go2|sCfErBQQzOluHnlQpE%TX0+ zADt}1^E1cu5$SSqiVLVBs@kZ~lc|(LRbv!(-r=gN*5*;LTCNc9;(~KU`Wl3-jE-h2r)>j`vx~7Ww)>j){ zHpAw*DtZt)O9B@dsIH&!!--h%)VVnhxjEPoK~fP7@7Z4t67!SAApC~@8KU&engQ}t z;f_lo^3xHMoKab|2S4q0)BPhE4R&Z7HWvHrK}@gU**f-bNh+dUQ8%g45FKAytK*L@ zjr<#;34YDCG{3HD!Y_B2QhBRMewi5Bi%VH$z^n~?kBnMlQrGZ*F6*wE9aM6eS_Wuy z`kl_ZNYbXHEpUAz2hL4$&YW)GwWHcvaYrpk8RuC_5hqAM~K@8}M z99JHpNsZqjzKI|vRsW7*-KJ?AWiw%wj7pmBUW2b+ZHuShp;;Q__0!08aI}{dQMIwD zj|mEiT5~-OF-yLdHzqUo`C|Gb#JTDyZuoxt=ZFvfK*($LrFQgxMSaG9r*=r1+Zg?S z#EwL@1#qphY`-uIg=x|M!v~_dT&3EvB=pDe=|JFOC zi$x^dnbOYInh6gx9ZgODQ|=%kU_oo2vc3v=?YK$IH!?q_m2lR3sIQz6 zBewqzKaWimBLlo0)9f*lCAKb-hs%q*D+Ev<#cb+9*lb&{GSBRP7g9plJAk@(h4wfE zm@Upb1ktBk55<;#oN2#pS~_QyFO4LxT}UEuT4~C}=4?g1=!r3ragi?FlQmn4trb6e zh_*CZp{}=o57{dszV%aB2-%YM=bSD+A>|bIpJuh$!RTjw&_*e&y%C6ZbAUv;Um7S9lw@sZf1sr&HNmrAK*}mhJ=4X#vgWWB!+F4}&}{3~fDZtg~17h;4hkHVI~9hWmS zU{H|{*D6VJZ%2CR3S4v~IkE zE_SSga#MB(OYgtf5aEL}fT)?*VSGQ0@O9^|Avmrug5M4_xBK1+6mFh>)(`zE*7!A} zLeJtZvys-MTHrp25HxQF36NviB?3$^_g%)JOvi=hk^pDXvTvaTe3E!A==gSRGDqo4M?qFn z^A{p?HXcw^G%eT~E6jGvupWxP12=k=FQ#);RMp{T?Zm)htJQhqA{i};guS6qWI@oG z^*FN0!=*&PXsmaQ_Jd||^n@+3i1B6>KqCG@bLCvEl~>Mp^VHADl-9-{KsICzkrYege1RLNqc-kIS@@79TZjGL5%&@wI60zh?)qGe?c6N65DN}pk86wwKgMBb;f-XKj0v+Aejz&j8 z=&O^`P=4l}nkP5Zq@SMjri=C;?MuB0a67=-G97ai*Ag@Zt?C`o!#nD=ZczN$2g5;h zPzo$R8sfVgYTawKAE8s=uuQgK=xoU=TYXVdyFS(tn`Agi?6wpr%9mBv+|^ufKzC+s ziyqa+W;6eV4l!h#K%{kt=mYy(K>V#baqz{%Cu536rW1m7=Hk)p0h;Cr7LFoz)l81J zf4X50A<`FE5U?cX>4%ZA8e+3!MzY-CuNO()Fx3$V7TB2=hjKal2@UrBnonp4k~M^I z_>Vx2@>_Vo6F6pH<?&;?P-!O2G@huOB9Z?&ifXLzT?q&nsT#fSQ0F1U6$3Cvkr&8OV(QSjB|L&+aGA!mcB2P8@h)9vHsG)9Pg#1G;j$O zCZIt1AyWGUTfPIHaKqt2weN$?OxT#xk)*@m7hrRZ?RAg{E`z)`c7^qL6#ix(0Wjt;s_!)?&L}Nu2DO;y$Jf~=l zM9~Xi&^PG1OuUvj)tjWx5JAHUzAcIWeuoV@ia!kdwhP|HHTL>DYnJa9n+fk> z;}g;Our2atcMpX}d(b&whzBCZvIyF>+9jFW9z&JClr=yko4|+y7{+ctcL*mECZ79QW;CToUq%iHgd;KuW|I z-@eiQU*qO~hRJeub35fl^p8mLWsO8;EF+^bL)5P7dZJxUgr$Kq1$0KFA6CFCIsqdf zU309=SD9G0(Y%%wkRf@Tc)Y`q0!@ZxB2^pBN+C(Po|c#Kam;c|cBgKdddvd)W;VCxBNRiRTRUrV-Mg@49Q?tHV6F56BkN} zHxKFwb^1%0I1&E??2jC_X}H3gL^|9(VmeFinKRUgqtQairr(1$OB44a%0x0XX`D<# zb}~W1BTV}7(x5Cb06br~8qL=}glG;>m_`qJEHe^v((OGgSgTw`WV1)n`d7>;Sxh@} zVpYmsoep`_2^LRw92pVApc+?Bg=J#Qj*h;`(dG}ASH{YZC4Z$RX~h7X0oR$aGnH@P zr>Uuj*vXK_S5(5zekeF6#A=8mwcfNx;og1=1y^41uxk6Nh?EfHweLnLA35d2)qVON zgUdx+siEYkt@L+Lt5*T2KE!s9Bm1#7X{W-Kwx zhM{#eobsOI;$YqGveeyLEi%cb&QXx`VWUV3)c_NC20DoL)pBb_gSZ@36K z3adEzrGZ=ev0siNd@MO^0acD{Y>quPksbSw=T8SZbT-$49SXHrPs&FhO6?0iFIpw- zV4G2ASk>NV9SFr$+^oVUbVFJz-HuTW2SG%EantGxE0J`0d6#b`Rq^zsLie9C9U;c@ zvT1Gh1H<(i{Jp;}pUvZ3Cpe#l0df^t{LQ`t!|;1lJY3z=qE_C{hYD(ihQ27q>QyIK z#$`UhtcXR0gIircTabv8+6uPIoKy^;QJqhEqI@<21jkU(gGNTZg}aI^-8=WxH^0P7 zWxQSe)og`F2#RW|txxt55X|Wn9-m#?Gb;PY-s7QK&0=TSnM*44H>&o$`o^F#{8eqx zi zh!h-KwmhAGtN{IhC*+-%PoaUigjw{OHw3nzeWrtWpt}JC_u?O~yq((uVRM6!zM?DE zPc`zBV>q?*(u7pw6g@*cwR6*}Eh^bkdWOnE_`+z*v$JZBTpEgk8{3}4f>BQ4q>E@W zF#$j9>8`5F4=XtSrl z_8orTSLY1)>3G~8`n|2++ z3)uW{Z1@Jr|2g#cm2&4Dptgm-u+XVbzp-!Vfp}`4(fqOKCv)0>?6f+1u6NdG=oQFZ zQtuE=L-)#(j_Fi(LP}^;AGN86UmY1O$njL}RHp6+aW+)@S-!=%t-$}}a)IBqnWBCP z0DN{we?T*S1kOKkNMHFTTM}l&a#Ur&JxU-ygn=U4uZ%WFw2m9d^7z*i~CpV>nF65O8mgH3nZq?CuC}ZmCo|f zUa9(h=#u^)W$zf>X`F10cE?V~wr$(CoqufGw(X8>+eyc^opfyD&AfBhJ!j_JwdUNl zp0Cfhs`}Ng+O;<@2nv7}CrA$tVFqDq>T<1 zL9|O2JLw9SCOZ+-ARFv*?_1U$p>i8_!V+@nbb0isMLAQbb{?5pwojB?Js=<&Q7a;# zh(bLiAR1vC1M0DtI-qF+U%iH8#a^rSiMo%l1z+7)wU$v&exIVsnWE@@DW(t~G}+AY zWC$sWTf7T5U-$R-M_N2BUo)*(Gi`t2o8yK%OzIB8b)ayb@~2j;I}G^N&0iM*%W!ZQ zz3$<({=uT-2u9b}yuRh+4WSbR%B9J4U^Q5$Ij3h^5|;3}pq+Lh#JqPQ5eR z-%3v)O9wJxTYfwN<#)_Xk47+eT#rA;@{0?_!uu1zXFI&`Z9paO5Jk7xV~6g_W6-7X zXponbeO*B+w~RwR!3J{qBGtP#?#cLi4FbvzWW0F;)Q8#mljTX-thKVZr{GRSQEO;L z&HZ;K0{vxDbO*4l2PI5d9H4>C!GPwmSl-vCXEKGeo`^iMoyVTAJgKm<&J&ED8=I|1 zhvcwZtTmrR_3eH__e^%*P>&byzT)H#paZziF)2Z@Vz?lYjaDjmZ+TXouYa?I2WYg@ zv44*M4ZlZ#|Es3&zwLYyH*F9FkpFxQnD)`&soWG;RB1v>tw*b6@Q1Ak2j+E|3+-hO zFq$t@cNn?i->`VW(J?c8%SeM?=S7)@Bm>nIcEv^RW-&SX9Q#h4zrTKbkolR`qBmP@ zV_y4pRNIB-Fd+(%Q{z6;U_bzxI%l}z7-};FU@WDI8B>#nVM8XwIV98k6D*ENZ5WWrfHHE9rD$=s zpjB@+`O3le6HyqC&Ngrmr$|_B`W$MYmg+1IJ#gFZ%ZDpS<#HLM|SCdCS7Q1fLax z*VXh~dad6K?$&Oj^f6quBWqZ`vAS|`+a=+FO5F)~K+TFCjd0wwVuKl(#=ZmeBbQ^S zY9*>jbA2G`AK=WZ;+AvWqCS<5UNIQ;MkD$PSt<&q;|HOYM=51w72Y$73m47^z=Ysl z!kP-a2?zP)I4E$+EJGMpqtTtN$VJm_iBQ_gUtpL2v|6kFQRh=j6v|p6RlSZVznmr? zlR-JOgMVrY0AI=F8M=_q;Z%9{U*QVo9Vq4)UP6l)GQICgCqOM81j@;me&bTQpsbf! zs#blBtK_jJ`TDm}o;P;YMc8)$LVq*vX#X?n_&1G^rld{TZ@%51ulbZE+Htk2uCq-{&ZyJ{c08&3`7O4U^-yy>`i0|L8#EJIcGSa_DE~}F~AR3Kzd7# z9N&i?eBh79v=R+asX^ki>M&wJHYCuqSRYgl=oB}24BqhGE_PcgC+FC37SU2fI9s69 z62uLv;-PyqLa(Blgcd47wF~Y$FBg$32-iS{)gHngP*!wjf)E@nLIbM{KTBf}KZXsd z8(r%TW*n8c(CTw)afZ&&s%%%fsX_j>`4EO;a;?T6CQvb zbUCi2$k*ArA62plqJ4UDJ1BFW=J;qyq!px--?(`MrsYCd9hO}Q*S?v!1GQ1C;CS_z zIaEPQtVF0kfjQaETcnCG{mWr7ozvTR97F$^o`SJa@@0>snMYGWUn}|>U!Pav4+!Z` z>)Au%w0dQKm{pQ7*=rU})06ZT(^&aWA=btxgm}vg&TONHvKQRsUBn^8C7v!)!Ary6 ziOV@;8358*+`wH%6A!KyiH5z@@<+6!zid8HmM#zIcY$5JWMk0fI&x){4=TxKSuKqb z>#afzLq0(=N7_#=`D40BiIAv0(XDuoFQ3ET&ODbqIx0M^-4* zp+y;_3PXfdJiPtEilCQeLuPE>v3@R_d2RL%{*U#_Zi4>*rISueWAzFm;CZcbIMRNf z^D!~K-7W9J|4?!pqqlbdi}=*G4^eWyhO!GzI2mZ5`6^h*WHa=JuY2CwX{Lq2W~bKG z85Y1Gou$Lx(y)3z#TyyW>;I@ z2wl@=uyb&;lZc#8G9226K>x(Y708yRg@#(<=7?jx>5zNCM%uS%@p&Nl^4^3w)k6hkL2$Q zOc%#=;wiZ#m7tCLOSwTvHz%J=g*I|E@tT>yNOU$LNpNBr3~Z!U3b_Or)2h5Y3b7?P zYu)LQ7;O^fkW7f1h_!5!p+1N;!$!Y#$W(a<=<)+`YV$D|SOR*?Y^Nej)lgy@Oaa=$ z=!_9Zj#M^p#b#iAWA;51-DL69Z|{!>($Z%|>$cDZ6W}hN0vdnUtx$Is4$Ua)ZZJ)g1xz9lIY&Cckdz|@-Mig|D-u?*$ zjtcoq;!l%@gfVyn1=%@FEn-rxpX7=%lY%(Vn2b+VSS5gnytKq3sE|-&SW0RZpqh+# zY4+(Lyk4nenbBVwVu>8ZiC3L$60VH^6P4bvFi87QD@Ajj?~7M(w8A^FFS^#~2YbH* z`&y<*@TX!?Y!941#Gb|!C=po+n`17&9&sDNLrc!lkHQh}soTQ)Pdl4jE?LYBQfq7| z@^7wF33uGM2jL3oM3$PW;_ZLUDGg;1n(^|G2A^bhftp_g&@LKOTzD;@}k8 zag_*>PCtl7t=v7G2ndFRB;*-CnRml1S|s&`O>37H;_i^?U3i&7bQ!N7cw=rRnrjh? zk>PypJj+*J#}gATpZnu%KO)tQ#nWwyCwOeu`>WZP@~*w&cYP?3+ysqSDT^GYZn9}y z<-S?jN9!RqC?CE1CNt8IOfXFW)SbJbS$XS6A^;}hJL{WUM#*Ah48rjgLr^Lh$5HJP zjWQr1HO5rRlN0~qJm@Y?!m#0Af_QBKz~iRkEuof0bndOjiNs(jhG8#+E2`}=1Taz? z2q7ok5H8y(6r@?w3d%v5#pK{H!>b=Q5j(w`RO;O*tvQ6e^BRc?+6E_i5ie`vWQk== zk)?5!G2^ZI0BkjkVy-=;ArPVMJZ0J9KKjKYY>VK7jT%GA0b-jOo>CdWr2U2;c*@x` zrwM)W?1Twq*Mepopm{)IR)^7gIZva8^zPQdn9|?al+~TX^AY>gO#||DlOpU;mQM5g z_T-B{!u4HzYT1`bP7D+J7Mt-ld$6!^gue7>%|RQc=1cI9?eX|R^^f&N{KFOFN%`mZ zKCS7+mk%?_Ytw z4xSQsbS*~fM!L>sH2_yMECrE&UHFnDpNQ2ZmA2sGD43K1gld!&G0;nLdUhWCzJJer-*I4v@u`srH7GrP8kuxag zM$|?A=mmu`L+wh#Nh%x&c+qV(KfeEY^)#_XN%q~WQuAQTc~SyYHbR!L!-akxjX{{3S+ZNTQ5%h2OR z?h(cGF@1IXF-1sQH(U|@WG>60VETvw*Z^j=ehR>>CwsJZrUbq`^>9JEe9o|o+S8g9 zXq{o%-Mh#&S{55S!DF4IZp}9F?U3gkTuBHgMR8=Fe};Sp2WpdZW0OHo^(hD??j27a z6_gsTpFf_U!lJ1PX7<Sll4zg+jaxwS-A*oFORLlMVfw$ zu0+vuh}9?LAqe0DZD3BYxIfkr^)#pTH!|sY_3ybHhS8+E zdHX?cN#X-(Z7c3Czz=p5GS7vHJrPm`SDWZ3rTf?i4~4WZsuz{YM;n?!m=ppqvz z&2XU`$qsctsx|wbgNo3*3G8zbIb|Cc3N%SS0_iuxHzW@@MO>2!vhxp-*2Xzs=juCU zy;s@mx}K07chLSd?kkO8A~e6_zUdpd{zu#(ZS+4nt8d)!4{czrQkwDl+^VlH!u2ZS zAuJYr1co5YUTAToEAGvl-UQ>8RUYd-%V%s|vwV_&LRUw)OvMWQHu}tosjT#uqs(-k zf1(D|>#)8@!j?%xToA&OARo2Ca65O0oiTL?*Mh^v0pg7aO+xr#c`g=@qV$n8&s%nq zaeY|*iK{zW(-DtwqqJ4|6s&8zW$(=mv>a_CbiG?4JzA!ubH2@FFrlexHB7LnJau6> zB(ULlI{ZKhhfy9rfE}x-b@*wtv-=DJ%!>|z>sFJ*_*ydO%}x&4+TdKBT+lkQ1DyrS z`(Ua<<>+J#a)wxX-w7oViQx_+l!*4Aame3-F)9GM1nmd8G>o=LnK+NGVH!8O@Hd4e z9>@61`Lji@E(AML7ecuJ{n3pPed`)j*XcXnqtH-tqq|nCDj8&XD)JE3Ff3xk%bn97k z`;Jnl@9O*?i7L|HioCMU)&|B7|Gh-7e+MeEPDv3B4tQkI9w;3?&^#*oRW3<1n4y`X zn?Lhx%lu!+C=8Q~bc*nvUDxMaNVI}*yd5!&Ck`boN$MEV?uk`Xy(L{w)9i^SJiYFp zt+6U0^@r)!myUlBWdAh52jM{^g1?!ZKm(Sn)vTN!GyAu1HNQDlwN5sDktV-hH=rzS zc0@@eLc#^o4qM*+n4;JZjP+SUlz%z!8PT5}H|)yniU&anc}%)o)Q;7fE$peHU@a_` zqF`|{pJ0m87ZXKGqe31yMG;a}NhKj)uKtXE1>f;63sW*t3*x$3V^*FcpHnxt(a4u^ zOb&r>rs(IXS*!)-y7wBgRG@0x!`PUmkJbpO`FJ+n0y zm%p0kuN+d5+2}mwi`%P1`EtE`I&-4VEsU=mSG-3nY#Pk1=xSERgv|bWT8xXDlIE|m z$~It}NnC=nl0RiXTZ%)vcC zbSo|9oW}oCKIMEMiG*u(DwSdNqCvPMisX+Yp2y6$nK30h50vXJdi9P)i&J1HB%~HC z4q}JUL9G25y6YP<3yL0@1s%$gQIc=O8uk&2KPWnKB$!-TWxpD+?iUcP@9-XE3Lhn@ zcL-LAJT%V&ko0RLJ@;i@YL2H7kHSQRQ58AW!@o5d57KQqvfq>%({D-*?|%Zc(zb>G zD^-AlIl#cm`2S0PZc=6QpJZ{bbJleln&jL%5$J?^2?-+g?-{qI0P!zHE6Luan)QPO z+C&@1Oc@lDEQOz9V%~Pc7;on=`wdLZeg#p}p9-gKY#$J?=1i}9LafJGJa|2KT*q4< zcQtx=KiT~e2g(FVG!AL$QbpP>SE%}{!ij5W$avJkjEWU^4!K>eyVX(WW0Y=MP1Ulj zipZVlLk_BE9oZ^q1bjmBbn0WacBrxl)bCo)819V=b1FSuIMVAZbt3=dmO2~Lj!di+HT@%@gj2CYC#M&rDGHWpxG7MgZMeC}Gle$M+iWYfF z{MlT^nSO`d%Px{->Ra$Q`p-*}U$Ok@^s|<|p}Zk}Ek?@+y`L8m2oLRII1>?PFw~PX zht~H4c1Bk@7zQ}513Ox|K%xo@P}MpQl(a&=mVq!OT=^Y1EP-I(=8$%7YU*lc1kT*k zGn1C{)#J8fhlS2fs2R6Y)LXwm=}^|)1*Nfv5rBo<`hviCgd4&#AXo|wVZbYc?~wux z7|Ct=&029w=KCvHt@-GXg_BQX)vd95h&ziU8EluW3}{*K#+lANJA-178WC9DQgS<0 zsjc@&qMY}Mbxqh8Xsa?}W7NnCi6I15)`GUA{ln+e;>ygp2eK!%{!}!|Bq?c_;i^_z z+l~cCbcQU$N&_+gzT+%;`!I(MICRtF&VW6cC=B*UM^ZR^>Q!#rJ^Y-MInaCooAhuP zu)s?+k{ z0s}MZ`OR8SmoyiF9p z-_dedhV#o;n#p&}m|9t*Vc8$+T zklCU1u!jvOyo2?<->2Z0XdFzEk!&0s>xiZ25lSvZCZxzE21Wo$zNZEo5!yT1?6r^G za+>vJ=A};yJ9)a%=0~5sQdV1HkeL9fD_&wdFDdfJChDUa%M)pdqC++ryoFh#%{+l>v#g<2(*7t)e{oNKa|Np8~|Mlip{l7zHIZZTw z!o`R%za$rbS|7ayH$wvusagGuT($X&LYURdgiY%Krf1@<3@3)0{{OqzFu_8AoP)M~ zd^df};^=WaI{$orx#02xcN>;(;5kcs+prIscRl2P_OErDX%N(dsMuZIFt^vcZ6?al z6*KBXFOGfo(}HvDSkiqHUjd*>gzSMHXWSZ!w{?=CLq#{#e$1rWw8&m@64qik_@B3P zpT8ZX!U9N5d0t%F6WZ!*w_pGj^OO$CQC>aVl| z?Obu?*&M1&d%I(M@UncbPuPoHGE<*C)q+BGOGtnv2%J^K-8;)0)Q!_lBIK{=sa48T zNoQ%Dfh|i96hxB&&eS>7OXkgB7WUQZA&Fn!4-9)KH7$!Mw)rW4z^Fq;w|>{cSQ@&d z(>{|p#{tR-bY{<=*7|+%mQ~o*j?I{Qt{%L#Iul}g5oN?9c&}m7Fc}o3Vbhx1;){0Y zme4gYsp}yXmC}lji8Q^7n{H_{^%yLx#nPDA2sfD7h>|80Df>G$B*oO}j~NkAdrqFe z6Sml@7mlGb&kL5*9j(DEKZu8Vk4E(dPHtr1*^BcMfuT{cQM$rd5wZ%|UXf}jYfe(3 zq)Bn3dqwD5^f{dO*wOfgzGi1an7al01Jk~pJ3h8NeLnKO9mMwdZh_N73F$MdMOl@SEYdR< z7@THmmQ{)@+QJCRYt~9fcr*c{Xh46 zMO7DNRC<$r4b*`?55BL=G$!Lz6*Mc&wT%6%3qit^sW-!jAL@s)v0%$bPuJup1&INg zngUcJhTO{*;_L>}*bHWjP*}!_Y|d1qaW4E+K^rG1C-UPriV~X%qmcKnOyT@Q)=;n48Q{9wsxu)j;a{9(_ok;Knd8+K z98?~a7k-To6ep!?x`r!D5wZ?{roDPBgjnii&q^^SeV#=CJHKTEulgf7X0xAo%q#&biaIwmmCZ9K@i+8 zar`fdtdEB~fUMiii&P2(C!XjJ`p~z~uCtK~vJ0^AAYfSj1Y_aNf(tdWSRwfC2m_rH zMR7z(z?0e~g4#wxRu$6MEU0MY;4W*h(Vu~!|vSsbN zIhm%wmQTjyd!9tR&;t8QCN}>_Z0RLXF*C>Nc>HTdwvSt}J~tBR=_C5C2%+h39X?gcWAg)u+Ynce;xU{kF6GQ^Vuy}R1{n57q#mE zAK3-;SWtSL)F-!J?8vp=A_DyNc$lWt&3rcw@7i+!_y>tx-Kpr#JFZa|240tCN?uRX zddl!?U_HA78po|voqSt+&hA<{yA~^F2_3p>lNJVObqh*pRiD^L!z8pqyE+??a94YY zLKdQFn0CKsd3%kCU(R`Ut_C#_S^g|?D}U1I|3p<>>Cewz1q%O5%<>ec@59q7`Uc_{ zk(lM#%siP@Bs!h7c}-a|s5vh}zw+0*a|WL>y4~E#!#_XBlfP{aR!8bUX9&I^Jbuqbqze3A=KWKO11_IDnJ-GL}>E3U1QsBN53HpRh~s4NdOFqmW~-z{x6!H5}aMIlG9wvV-otdoC&4Gn~+FY}&aLT(QB zxULjCZqv+8v;MwrDnZ{^(?Sw&v>j1T;8j|95o$x-VT`&u8KURyRl!A5ja$ zSJob-55r-WUk?5V+EsT&j@s=f0G)HZd#BGuwp~bAKco7~c6qzy@UbKHEwT%Fn(FZ7b@orV9Rh*U_6vkDfiG$1nlk=Cda?EN8Ym zvyipTc+J#H25e8aXB~AGcTO648V6gi1QbELP3W5bx2dcU1`*yU2ala+VoT*!@3?DTL?}@^TjEp zr0rZ4HMO{M4CM121@w$fy)8BEIa_x48pYdr(jS%d2G%CdnI*hmA`2)=WK(8jZSLK0 zcn->8m@?5Au=uHf?=K#1(*+8gd$wIq}LKh$FrKH>^KhdKZRvKSIF?W%)$<&Z=lJ{R7Jo zep^_CZeVlh0qr0WYxZj%V!&#cKGN7r;<%-L<9-TCqa}JyZuE6c{pH_T8s?|(io4$j zS3%#I{2#Y(|IFfl^wY!)|Kx{9f1g_+G5qqDoeL_I;?>0L1_Hq};{}nLDx*{hmW&tV zXdLs;Ol&QqT8`}8g7`#2BbF!mKDhcsK*S%G%?2KMvD+-cq%z{LUjQfL@$08V16T}lqDmE+3+|EHC06+B-^(}Qtxxp6FgEz8rITaXj zX8!EqL_6HvvTV5W4$d43BlN8>ojyQ+URg>QiY??!YH0q{6hqy@I7c@~A(v$Awq^zU zDdq%<*M2^74|JfQKeEPz!Ismpq>3z1W$ap%;xe7A%~7$92?k-u6N@|slU@vuT&K{B z$x5*kMDL_ZV&xK(%TTN=GNV_a_5V?cg)e11(m1gteu6L;B;uGf0Qz909O zx9}cZDPh+JzlD90c2p3@E)fZ~6!VeANVL-@A^Lq2>Jk49JL-bs-y+-!@)QqFwdpv% z6s1XP0|;&Q7(^!2P({cEb5_fH%X){^=!i<>DndzpH(}M^@66d}7gMInYfVxc&nE)w zji!(wUSffduh=0p%0F#6IFG6_TSYJ?oLh5wh_}%!d*7;5`xG6^N=~a6Osto-REFsf66mR&K1!nLpA$VE?t|d$)AIuVeoB0TBK1gXTYh zu>Xpd|L2wf(_CM9=;iI`!erD0n3&j~1oA2VoHR(t-+`iJP>>(UjDNwnp;xdTG7~lw zg*swKr$R)4Mp3JDtZK4a|r^8@|` z(6`K7?0)HM*DoYJ{{fpPh3ququuX|42;icCML+ssKs|K)1b%w@s}{Kr^;QM^7o#bC zc><-LnYn~JF*Xbhj+AAxKPR7{g^r#12wEBZJg=#KG@m>cXyv$$;ldI~VT2X*Z zqefpG${x12!{yrAbMPom0Xn>`;srp_TA=qbQdk{e+MGEf3)QhO+ ztwOwY-GE95|GXN}wRceLUv@Xj@<0$Uw#b%tXYXY~ZS@!3lx)g*1J@hz9MGrM-8PiL zq(-ld2D$w9u-rH5P7b>m?DWVb)^ADnM)+x*SZ?u71>vL!9*qNSBe_tv)>6#9cUO~( zU$7g6*;5l?=UTnj=cUI!!swE<5~XgJsBWvnWM5&wmVU!CqP|j5V;;36!RaPOEH5!? z_S3l7zE7T>@uvV4c~*@-uwR0_fcdT$8cZ;P>@Pbo<80wj=U#Ee!#REj&>tun>x@t7Xw5cD3f3Q%0{2$e{ev$27Nv7H84CV9Ym$L}6k+#= z4=bIeasXf}3vkH=NXzL^PxWRPUg~M&$?LJw&QWMjily6TL02srC8qV0mdK&J7~YXx zOFQES74x4HVs}cgXE1TMxYp4$Ob}{ukUI+ly(55a_|d&RDk*|LCm`ASWoSnfEIL;~ zc@|F43TGe$rXi{GvT$c_@b4`%QPKW_JiwmWfrrGQ?Q5dqgmmRP{Tz?0xm~5xnNf?r zBz$dx%=8>23s+wv)ii#BTb%^$%4Jjfgk{K<=7MVtEhk<46TVyYu;?Fm&nO8)RQc`= zP!vI$-R{52s)hEs^4p?4DPeE@E!mQkU0b{)>Xy*HTa(!bX`ojl_Q;g= zXtd}Y)+ry(P5J`XN}uu`IlJ(ZBMjd!{u(9W=GgZ)Y`hdMEW8#y>Tn|Bzz@k%P&Mbm zdc~8E9cxfcbL@gXV;P5Jd><2`l{5cR5-a;fCRS>z1QE-zYdl<3bsHa8oT;HkFjf~K zX~OY>u+E<=-r2|9a~Z_8OG5-w3<|8095I+SZ+(^)eSi}rA#!sAf3&Yd)(L)!(4rHh$fjF>!eF$QcB-st1=yvIEx#qLrLS0@EX3w%rK0@ZK$-MRTsd0N{UD~DrPc=oUsrP&haVkEamYPjrLn{eW2mo;EDO^ctd|f7HmQCbSRc8TD9}r1R{_+_W_PI(0k1Efw)VAO#ZQK12i@O#$E>xS4gOc19RiM zjoD4D(;r%n{MQND&wDK)qEnPZL1r@Ib=FE$){wu%I}#`4t!k^OQ4 z#BMY8l_#y%BeM{vi~VUYV-VKbMFHP4?->%!l*=A9x7@=tz=4dW*Sp*>oq7>4FbQj( zPg~koro_KKx}z=neN!C+;r3ItP=JP3d`RQ`N5jg`Iij0pthHHavjOluT2q9j#u_aP z->(JQWpe9vB+U&AE<1+)rf)0zlD}xDK+sg#Ct`E?Jm}>xl?*mWnr&aAE2}wDNzD%4 znP=Ni#XkY}e|;eAb{vAvdVVLBXjN1lsH&Db>_Jt!_^WL(>PJIIESiykTBukKV>-V6 z7K(CQj?yQWSJmrEV-mboQg$j)+@~a~J}O>P6@ebU@hY~J$%Y0Scf|Z01O>HdjFG)} z@TNS@eJ|YF?fs27r*9?^4PE2csl4H**6jQMC|~hcyuqVMxWlxLSv3 z4Vivo+`UPa{i^r#4HgCG9gB|9-&{Cd8`0DtMQgn#edjP8$V3<>`%?c^UQtt31vzi7 z>I0G?H*OSn;)?qojMOqB$L-uF1x(usOUAHQr9IzrOCoLlM=JpO8V;-{F%4EUrPYor zsjy$7a~#x{WM3ZT3#ID$jF9%7#gYr!H*kjPMPS5|xb^|Dys-$JkL;*A-2R{!{3X9x^ih}g9r)aE=mP=3 z?`g+b>yMe176}p5j(2OQRuM4tkroiO7zEE%hwwz`rnxN2{fp$+M)aiDuv=1$|0jAK zxz$>U;uzTMZv}A_MUI*nlEm|QCvHC3(ta_WIH@UNYM#pg5A{P3EL_pF#Dn@Kkr=sh z%RAxmdcMCwEYHWprn9IcIM0pHbfExQFR^h+({#?W zCGCmYV_Md2I^6wA_KF8_Ym?!M=WjNU;@sr&%PDBrhmfG*DRQhc^u#p#khG($Z zH+^qk|4-^Dji;Fowxh1Ft;qc?&_hWfRPROZy=KdAwI;6R8 z!*mg(tcMjLnCOxd-{OTk7jgd%h%2~+XBz>eLSsmH(*fbpMS1kR{TxWl>l7F{8zkvl z<^g0uj;5be;e;2`T0bs9xi-W|+w=%06!ab?K-74m5p6>P!48GvRoSEgtvUDh`q zNz-OYpL_}R*o8rG$+WOj21&`8N$a-eBIRRNVuP?J3*$+}&ZSs6PNmx$q>85&(>=0P zvG22r4kj)AR&(~i()R7wG4-qeSljx&;JS_t*a3jGlTrbJ4=qAyisK|G*%`gdKYTcB z0>;494a%wr=Hm5;>T8f3ZR0Suh{?Pou`jG0(p^VJuKLZ~;7JGG1~s!fW(d+t0n%wtB{g?H0(m_3U*g#*Qtp(QlvUjBGVmMG z2!W>L8VAS*7fO(Af5+?j(ypEt%%oevrBLT#Q?SO5XUO_g8ii^XU@R#!2Nv`fu=L4g z=zj!~5;X0OqoYmI>m)(N#+1gd07Ayl<69uBsmIsBfW-qUVDhXKODo*U)gc?8U+313 zo?$cHCAa0V4-I~WQm)~nT*Spt#0A5h1eVc*%>L}OuQprL$GNqWOk`tPu8;);-%}Wq)#rkF9I^uP?S*AkH~HmdRdX5wu}Tiu=VPq%C|1pqPqCJzp?g|KQidL~t%k?zq-92eo!CBq zrd+HP0lF*{B~Sw-M_>^uHGk3uH+N&^c|GK87|$#$q(`%mkAYe>@Xo+O1F6(sQpe0f zjv_X?HwXs)Jdu0HbynqMr#y=T$%l2M>?;tlVxtGO`F03H4e((3zma>w4B8ooU!6!b$AZr&~$vKys3%G=O}IIWn<%L>$lGp^3kfK6ikwS)4@VrHMz-jQK7GkNKfJyuT}2 zg6O7z=+@!?A_a1`Ms!mlyT)APkpi+++_DU4p@FC*1+rWtz7D##E<}8-meuDF0skYI zLU^qke9oA$0}PFMHe$alg=tETo+z3kK?KdauunEl-K^nJC-PYhmr>{$Et?8`#>XW0 z4mHQac_@dgSeeDF{xZ=|^ewRCNMp3;JU9nS4`CYxplWW#w1Q<_#k8ttQLiI$!wH%R zJSD;q{Ilz*BhaFtVZ!%BDSA~bpXz0-)ar#WO)2-W9I(0`wpxWOxK8f7`4hL3iPWo; zv_Usfqh_>n*=Wg{s{97pe*P-yu9ecgm2`=$zczA* zzFPK(a#xqEDIqT1ZVUe>{^CHW0isZQIJZuI;h-Nznt8eneWWJgL|yM1|KH+S&P{pO zII_A&GZHL)xhb$TOaDg%AX^&}bv>2^q_hXvBF$B)!{F ziZEeKz#d>2hxX75s)R2=pHFHtAer}q7+hMq5K6*u;-&%}hgV#)Uzv*!rFT;rdabtu z=VSTRS~jWQ*>z;wm7+|{@Ox58ttgWdhe=%}8&@%8gR!qUBvGf8Og#OmuL+TNq~xRi zl!p4GXJo6D-FRhZWV7j0bb}&zksTd0tRcHLtp-)IX3i{{Ahm1S3Mvr<9V_w~lo&oz zuf`}o4q&h=Ex&>B6y1|GQJW8Ij4d&C7ERZUPuAHu@D}=9u-APN+z-SWXxH?N8u(H# zM{naDkNF+Xa&JDoj&lxGvu#^__RLl_CajKLgdEpgt^J+rYL)N(nZ+_}WBwZ&N!d3q zOS*PCKS(C>pfK5+`@qcaH$R+@WI%RM-!n$i&M`e)Pj17cFM!qulJ`C1{?$54M>RvR zhWVm?u5ny)o|ekFT&NA2FVic>qSE^~HUDKsM)q8g z6!irm_KZfMATG}vq$x}!g9`%{zi$K3eJZ%oWMjtn*GNH|%tN}z2y=>HydjU^Ni{;r z$Ww}Z*xV7`HIpX03g>P$u-3YSVd*}$NpZ9ivipn!$YFG8icj>pEz&eWPwF=*-=IfQJGmAWBF5P^8iM_fM?Y}`DC1*cck(0UJiXs#b z!mN*T&s8Iw(Ftx4&a|i!Dkcfrij7f`K;uZDsv?Q2St5N8Fch(EA293Dodo#)C`w!vMg?TTTwiX7 zW|~+ab-szM-8NXe3bo{W#j^RbQ*?S2gmlPelSe2fUZkgiQS4!lAkR}UPvy<9FH37= zmlEp8w9kn5VqbC;fy2;qVBnvjBv5+nHZ4R#9YH?+<>ukHJI5&qBSS|SpT{={8=nx^ zsDUhyIcne-Wi2xByGM6Kh%YLC1d={oikn+QhC;8L1k;~Kl1 z0j?<_oSs0-oIuN%h-FO26N$b{On3n-Nb*s@`V`pX&xZuOQ&9T|w>_G2UE6e@bHZ%C z)S=l5NJ^PcwgykQof =BL=ysjuayG^P*T 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%0DSDpw0Oxmusm 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 z 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 z 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%0A0&S1O23U1@4 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

    dZU`3Bx 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

    5f;PhoHz8M(hsXeZi}#pr=pFU6uO^Xu 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�UDEZyUj)UZ*k=1M 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 z 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%0DXlzKV@p}U0r#FjusHcEo}MXRN#$xD zju}2OLMYCbNmQ0ZZWSe^y0j?GIEht2*uSf^>AGxU!2uA11r3nEOxK*NFEfFlR$(Or z<1S^#cq&UQYD$I0t%el|ObRzLg)E~IW|GGW^fE=AQ4%xmIT$u8Mbu6u)+t3b&Splp zm8w*^L*#q{aY%B5!2RP;dEsLiGHG96fgL(KN#%@L0ho4)RkB|~aj_NOsU0)URa=@l z{h1BV-YCM$M6Vq@A2b{%m+_#^P6Yu{C)T~uZ{CgjNR5J(G9*m$giPjxwNt-4nF#<= zX!ogLn6E#h~n}k4HzPZh_pQuJJmeWRcPdQWp)C)e?Z}M%Ye5 zDwk%vxt{m5r1UnQ$%mE0O(`Mjnwx56A}*MVTzvBttjMKWjBh}sHY1d@^KV@U6gT1s zvQnge7z{jQ#bu79tE?A?N8=otIX2|{m@lt8M0g#gaDXe<9L)vJ=9a{7)Z}jqo+QC! zsmka<2$)2Brfh;y8+vgNIuv+1m`W{nrl4FC2G;1@J<6q$8g2WNU+H`SNvO47~ z;_dDIX4gg^N0uX=ar%Py2=!rffPKMj!Ar|e8_l1#3LPH1`3kSp^=prRMgB8mCw4F+0O-x*VaEv|!nF~=M?#!~I# z>RXrPja^)p8qO%?ZBzt|m-x?y5wO`J3JhdCtxLpNh+hch4B(F0<6~708t=4!q|}qe zqeGmrM&j72V71I^_|oXs;(WUC!J}8zgm_rKu_ia(XK^SqVC3*NYbGau$yCg7TBn?< zc5X@?J5?qzf$>`4RV=#{YxzRSHtHL5IG?QLixs`W%`In(RK4M|TTbtUufZyNmFko@ z9SMdYHNWUS!Hc4|Cd8tSjS$5c2^?rb z^FtGlFRQow3o;j>Y{Z6#pcSxf;>5vhwcoD@V~(a6+PK|d=T6FEZJ8pdExRJ7_0w$E z1b-A}me%=(0ncD!7WtVtzlJ4jkuMN5b6UoI$rS!{RvNjXqbj0hPnH4~(=1nLS$BC; zrGILgEe|%KW^|v06b>UJ&?_N3o0>G+)Wtp;&OI6LFNhP$6GSS$L5^?#st9MCqI`(O z7H@iG#AjOX4j8*57GA1^65E2;io%tp3FS8c>fTwpE4g9Y}AfN_6Tr#YR`Sd7$U!JNe)@eAx;g05p4&%KHJ0-XF zp*Ia$rX4g%az&R)moB97PL!;gEc||bPxr{lm|{GPnQ!L6_vW@WeWHF`#URwK7pv<< z6g~$C>eFh@nyf@#&R85v&>N|PkFlmoHhoManYL3+c9>}1!_k^O(k{G962nEISZ0td za7vfVZ;N2#Q7kZeh52zuwgic2MdJFRY4(Tv__7t6fJwRZq0+F)(aLx8%0DXoc=2UD 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�e!LJV)ov2v_? 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

  • !_YQ{ge(&9ZZ9fO~ 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%0AsR4 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