From fda73d13ddd0d5741c2e6d65f64ed6356f81698a Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Mon, 11 Dec 2023 14:03:51 +0100 Subject: [PATCH 01/13] build: update 'extra-java-module-info' for reproducible Jar patching (#10362) Signed-off-by: Jendrik Johannes --- build-logic/project-plugins/build.gradle.kts | 2 +- .../src/main/kotlin/com.hedera.hashgraph.java.gradle.kts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build-logic/project-plugins/build.gradle.kts b/build-logic/project-plugins/build.gradle.kts index 61cf661a906d..9346e7c1f730 100644 --- a/build-logic/project-plugins/build.gradle.kts +++ b/build-logic/project-plugins/build.gradle.kts @@ -31,7 +31,7 @@ dependencies { ) implementation("me.champeau.jmh:jmh-gradle-plugin:0.7.2") implementation("net.swiftzer.semver:semver:1.3.0") - implementation("org.gradlex:extra-java-module-info:1.6") + implementation("org.gradlex:extra-java-module-info:1.6.1") implementation("org.gradlex:java-ecosystem-capabilities:1.3.1") implementation("org.gradlex:java-module-dependencies:1.5") implementation("org.owasp:dependency-check-gradle:8.4.2") diff --git a/build-logic/project-plugins/src/main/kotlin/com.hedera.hashgraph.java.gradle.kts b/build-logic/project-plugins/src/main/kotlin/com.hedera.hashgraph.java.gradle.kts index 39d2f0461be5..cee6a760993e 100644 --- a/build-logic/project-plugins/src/main/kotlin/com.hedera.hashgraph.java.gradle.kts +++ b/build-logic/project-plugins/src/main/kotlin/com.hedera.hashgraph.java.gradle.kts @@ -100,8 +100,8 @@ tasks.processResources { from(writeGitProperties) } tasks.withType().configureEach { isPreserveFileTimestamps = false isReproducibleFileOrder = true - fileMode = 664 - dirMode = 775 + fileMode = 436 // octal: 0664 + dirMode = 509 // octal: 0775 } tasks.jar { exclude("**/classpath.index") } From 07a3466555065e2e33a3af5198d11dbe240ac80b Mon Sep 17 00:00:00 2001 From: Kelly Greco <82919061+poulok@users.noreply.github.com> Date: Mon, 11 Dec 2023 07:51:03 -0600 Subject: [PATCH 02/13] chore: 09882 dashboard updates (#10302) Signed-off-by: Kelly Greco --- .../hedera-node/arbitrary-stat-prom.json | 10 +- .../production/platform/gossip.json | 369 ++----- .../production/platform/hashgraph.json | 445 ++++---- .../production/platform/merkleDb.json | 169 +-- .../production/platform/networkHealth.json | 288 +++--- .../production/platform/reconnect.json | 961 ++++++++++++++++++ .../production/platform/signedStates.json | 204 ++-- .../production/platform/threadsAndQueues.json | 262 ++--- .../production/platform/virtualMap.json | 180 ++-- 9 files changed, 1927 insertions(+), 961 deletions(-) create mode 100644 hedera-node/infrastructure/grafana/dashboards/production/platform/reconnect.json diff --git a/hedera-node/infrastructure/grafana/dashboards/production/hedera-node/arbitrary-stat-prom.json b/hedera-node/infrastructure/grafana/dashboards/production/hedera-node/arbitrary-stat-prom.json index 250392804cf0..bd5abee58fdb 100644 --- a/hedera-node/infrastructure/grafana/dashboards/production/hedera-node/arbitrary-stat-prom.json +++ b/hedera-node/infrastructure/grafana/dashboards/production/hedera-node/arbitrary-stat-prom.json @@ -54,11 +54,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -139,7 +139,7 @@ } ], "refresh": "", - "schemaVersion": 38, + "schemaVersion": 39, "tags": [ "Platform" ], @@ -220,7 +220,7 @@ { "allValue": ".*", "current": { - "selected": true, + "selected": false, "text": "All", "value": "$__all" }, @@ -264,13 +264,13 @@ ] }, "time": { - "from": "now-6h", + "from": "now-3h", "to": "now" }, "timepicker": {}, "timezone": "", "title": "Any Stat (Prometheus)", "uid": "any-stat-prom", - "version": 9, + "version": 6, "weekStart": "" } \ No newline at end of file diff --git a/hedera-node/infrastructure/grafana/dashboards/production/platform/gossip.json b/hedera-node/infrastructure/grafana/dashboards/production/platform/gossip.json index 407075ca7c31..728427eb481a 100644 --- a/hedera-node/infrastructure/grafana/dashboards/production/platform/gossip.json +++ b/hedera-node/infrastructure/grafana/dashboards/production/platform/gossip.json @@ -1,8 +1,8 @@ { "__inputs": [ { - "name": "DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM", - "label": "grafanacloud-swirldslabsproduction-prom", + "name": "DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM", + "label": "grafanacloud-swirldslabspreproduction-prom", "description": "", "type": "datasource", "pluginId": "prometheus", @@ -21,7 +21,7 @@ "type": "grafana", "id": "grafana", "name": "Grafana", - "version": "10.2.0-60853" + "version": "10.3.0-63588" }, { "type": "datasource", @@ -77,7 +77,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The increase in the number of TLS connections established by a node per second.", "fieldConfig": { @@ -86,11 +86,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -157,11 +157,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "increase(platform_conns{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__rate_interval])", + "expr": "increase(platform_conns{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}[1m])", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -177,7 +177,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -185,11 +185,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -258,7 +258,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of events received per second that are already known.", "fieldConfig": { @@ -267,11 +267,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "% duplicate events", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -312,7 +312,7 @@ }, { "color": "red", - "value": 95 + "value": 80 } ] } @@ -342,11 +342,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_dupEvPercent{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "platform_dupEvPercent{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -362,7 +362,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of events received per second that are already known.", "fieldConfig": { @@ -384,7 +384,7 @@ }, { "color": "red", - "value": 95 + "value": 80 } ] } @@ -410,18 +410,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(platform_dupEvPercent{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(platform_dupEvPercent{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -434,11 +435,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(platform_dupEvPercent{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"})", + "expr": "avg(platform_dupEvPercent{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -450,11 +451,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(platform_dupEvPercent{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(platform_dupEvPercent{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -471,7 +472,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of events received per second that are already known.", "fieldConfig": { @@ -480,11 +481,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "# of dups", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -555,11 +556,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_dupEv_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "internal_dupEv_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -575,7 +576,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of events received per second that are already known.", "fieldConfig": { @@ -623,18 +624,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_dupEv_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_dupEv_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -647,11 +649,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_dupEv_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_dupEv_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -663,11 +665,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_dupEv_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_dupEv_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -684,7 +686,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of sync permits available.", "fieldConfig": { @@ -693,6 +695,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "# of permits", @@ -728,7 +731,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -762,11 +766,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_syncPermitsAvailable{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "platform_syncPermitsAvailable{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -782,109 +786,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" - }, - "description": "The number of sync permits available.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "text" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 24 - }, - "id": 14, - "options": { - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.2.0-59542pre", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "min(min_over_time(platform_syncPermitsAvailable{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Min", - "range": true, - "refId": "Min", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "avg(platform_syncPermitsAvailable{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"})", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Avg", - "range": true, - "refId": "Avg", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "max(max_over_time(platform_syncPermitsAvailable{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Max", - "range": true, - "refId": "Max", - "useBackend": false - } - ], - "title": "syncPermitsAvailable", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of events received per successful sync.", "fieldConfig": { @@ -893,6 +795,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "# of events", @@ -928,7 +831,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -962,11 +866,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_ev_per_syncR{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "platform_ev_per_syncR{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -982,109 +886,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" - }, - "description": "The number of events received per successful sync.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "text" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 32 - }, - "id": 15, - "options": { - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.2.0-59542pre", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "min(min_over_time(platform_ev_per_syncR{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Min", - "range": true, - "refId": "Min", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "avg(platform_ev_per_syncR{environment=\"$Environment\", node_id=~\"$NodeID\"})", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Avg", - "range": true, - "refId": "Avg", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "max(max_over_time(platform_ev_per_syncR{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Max", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "ev/syncR", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of events received per successful sync.", "fieldConfig": { @@ -1093,6 +895,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "# of events", @@ -1128,7 +931,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -1162,11 +966,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_ev_per_syncS{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "platform_ev_per_syncS{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1182,7 +986,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of generation ahead (positive) or behind (negative) when syncing.", "fieldConfig": { @@ -1191,6 +995,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "generations", @@ -1226,7 +1031,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -1260,11 +1066,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_syncGenDiff{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_syncGenDiff{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1280,7 +1086,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The total number of syncs completed per second by each node.", "fieldConfig": { @@ -1289,6 +1095,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", @@ -1324,7 +1131,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -1358,11 +1166,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_syncs_per_sec_Hz{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "platform_syncs_per_sec_Hz{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1378,7 +1186,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The duration of average successful sync.", "fieldConfig": { @@ -1387,6 +1195,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "seconds", @@ -1422,7 +1231,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -1456,11 +1266,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_sec_per_sync{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_sec_per_sync{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1476,7 +1286,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of times a TLS connections was created.", "fieldConfig": { @@ -1485,6 +1295,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "# of conns", @@ -1520,7 +1331,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -1554,11 +1366,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_conns{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "platform_conns{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1573,7 +1385,7 @@ } ], "refresh": "5s", - "schemaVersion": 38, + "schemaVersion": 39, "tags": [ "Platform" ], @@ -1583,18 +1395,19 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, - "definition": "label_values(environment)", - "description": "The environment to pull data from (i.e. mainnet, testnet, etc).", + "definition": "label_values(platform_trans_per_sec{environment!~\"nmt.*\"},environment)", + "description": "The network to pull data from (i.e. mainnet, testnet, etc).", "hide": 0, "includeAll": false, - "label": "Environment", + "label": "Network", "multi": false, - "name": "Environment", + "name": "network", "options": [], "query": { - "query": "label_values(environment)", + "qryType": 1, + "query": "label_values(platform_trans_per_sec{environment!~\"nmt.*\"},environment)", "refId": "PrometheusVariableQueryEditor-VariableQuery" }, "refresh": 1, @@ -1607,7 +1420,7 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "definition": "label_values(node_id)", "hide": 0, @@ -1636,6 +1449,6 @@ "timezone": "", "title": "Gossip", "uid": "e857b70d-9a9f-485b-bd3d-a359c55c8efc", - "version": 24, + "version": 9, "weekStart": "" } \ No newline at end of file diff --git a/hedera-node/infrastructure/grafana/dashboards/production/platform/hashgraph.json b/hedera-node/infrastructure/grafana/dashboards/production/platform/hashgraph.json index 5f888ae410b3..b87658e30a29 100644 --- a/hedera-node/infrastructure/grafana/dashboards/production/platform/hashgraph.json +++ b/hedera-node/infrastructure/grafana/dashboards/production/platform/hashgraph.json @@ -1,8 +1,8 @@ { "__inputs": [ { - "name": "DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM", - "label": "grafanacloud-swirldslabsproduction-prom", + "name": "DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM", + "label": "grafanacloud-swirldslabspreproduction-prom", "description": "", "type": "datasource", "pluginId": "prometheus", @@ -21,7 +21,7 @@ "type": "grafana", "id": "grafana", "name": "Grafana", - "version": "10.2.0-60853" + "version": "10.3.0-63588" }, { "type": "datasource", @@ -77,7 +77,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of rounds per second.", "fieldConfig": { @@ -86,11 +86,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -131,7 +131,7 @@ }, { "color": "semi-dark-green", - "value": 0.75 + "value": 1 } ] } @@ -161,11 +161,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_rounds_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "platform_rounds_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -181,7 +181,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of rounds per second.", "fieldConfig": { @@ -204,7 +204,7 @@ }, { "color": "semi-dark-green", - "value": 0.75 + "value": 1 } ] } @@ -230,18 +230,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(platform_rounds_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"})", + "expr": "avg(platform_rounds_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -257,7 +258,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of events per round.", "fieldConfig": { @@ -266,11 +267,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -341,11 +342,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_events_per_round{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_events_per_round{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -361,7 +362,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of events per round.", "fieldConfig": { @@ -410,18 +411,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_events_per_round{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_events_per_round{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -437,7 +439,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average age difference (in generations) between an event created by this node and its other parent.", "fieldConfig": { @@ -446,11 +448,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "# of generations", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -521,11 +523,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_opAgeDiff{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "platform_opAgeDiff{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -541,7 +543,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average age difference (in generations) between an event created by this node and its other parent.", "fieldConfig": { @@ -591,18 +593,19 @@ }, "showThresholdLabels": false, "showThresholdMarkers": true, + "sizing": "auto", "text": {} }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(platform_opAgeDiff{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(platform_opAgeDiff{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -618,19 +621,20 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, + "description": "The total number of stale events per metric snapshot.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -662,7 +666,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "semi-dark-yellow", @@ -700,11 +705,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "increase(internal_staleEvTot_total{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__rate_interval])", + "expr": "internal_staleEvents{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -714,13 +719,13 @@ "useBackend": false } ], - "title": "staleEv Changes", + "title": "staleEvents", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -728,11 +733,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -764,7 +769,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -800,20 +806,20 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, - "description": "The number of coin rounds that have occurred so far.", + "description": "The total number of stale self events per metric snapshot.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", - "axisLabel": "# of coin rounds", + "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -845,15 +851,16 @@ "mode": "absolute", "steps": [ { - "color": "semi-dark-green" + "color": "green", + "value": null }, { "color": "semi-dark-yellow", - "value": 1 + "value": 10 }, { - "color": "semi-dark-red", - "value": 5 + "color": "red", + "value": 20 } ] } @@ -866,7 +873,7 @@ "x": 0, "y": 32 }, - "id": 7, + "id": 14, "options": { "legend": { "calcs": [], @@ -883,11 +890,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_coinR{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "internal_staleSelfEvents{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -897,35 +904,62 @@ "useBackend": false } ], - "title": "coinR", + "title": "staleSelfEvents", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, - "description": "The number of coin rounds that have occurred so far.", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } }, - "displayName": "Max", "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "semi-dark-green" - }, - { - "color": "semi-dark-yellow", - "value": 1 + "color": "green", + "value": null }, { - "color": "semi-dark-red", - "value": 5 + "color": "red", + "value": 80 } ] } @@ -938,60 +972,39 @@ "x": 15, "y": 32 }, - "id": 8, + "id": 15, "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.2.0-60853", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "max(internal_coinR{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"})", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "node {{node_id}}", - "range": true, - "refId": "A", - "useBackend": false + "tooltip": { + "mode": "single", + "sort": "none" } - ], - "title": "coinR", - "type": "gauge" + }, + "title": "placeholder", + "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, - "description": "The score, based on tipset advancement weight, of each new event created by this node. A score of 0.0 means the an event has zero advancement weight, while a score of 1.0 means that the event had the maximum possible advancement weight.", + "description": "The number of coin rounds that have occurred so far.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", - "axisLabel": "score", + "axisLabel": "# of coin rounds", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -1023,15 +1036,16 @@ "mode": "absolute", "steps": [ { - "color": "semi-dark-red" + "color": "semi-dark-green", + "value": null }, { "color": "semi-dark-yellow", - "value": 0.1 + "value": 1 }, { - "color": "semi-dark-green", - "value": 0.15 + "color": "semi-dark-red", + "value": 5 } ] } @@ -1044,7 +1058,7 @@ "x": 0, "y": 40 }, - "id": 9, + "id": 7, "options": { "legend": { "calcs": [], @@ -1061,11 +1075,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_tipsetAdvancement{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "internal_coinR{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1075,35 +1089,36 @@ "useBackend": false } ], - "title": "tipsetAdvancement", + "title": "coinR", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, - "description": "The score, based on tipset advancement weight, of each new event created by this node. A score of 0.0 means the an event has zero advancement weight, while a score of 1.0 means that the event had the maximum possible advancement weight.", + "description": "The number of coin rounds that have occurred so far.", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, - "displayName": "Avg", + "displayName": "Max", "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "semi-dark-red" + "color": "semi-dark-green", + "value": null }, { "color": "semi-dark-yellow", - "value": 0.1 + "value": 1 }, { - "color": "semi-dark-green", - "value": 0.15 + "color": "semi-dark-red", + "value": 5 } ] } @@ -1116,7 +1131,7 @@ "x": 15, "y": 40 }, - "id": 10, + "id": 8, "options": { "minVizHeight": 75, "minVizWidth": 75, @@ -1129,47 +1144,48 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(platform_tipsetAdvancement{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"})", + "expr": "max(internal_coinR{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "Avg", + "legendFormat": "node {{node_id}}", "range": true, "refId": "A", "useBackend": false } ], - "title": "tipsetAdvancement", + "title": "coinR", "type": "gauge" }, { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, - "description": "The score, based on tipset advancements, of how much of a 'bully' this node is being to other nodes. Bullying is defined as refusing to use a node's events as other parents.", + "description": "The score, based on tipset advancement weight, of each new event created by this node. A score of 0.0 means the an event has zero advancement weight, while a score of 1.0 means that the event had the maximum possible advancement weight.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", - "axisLabel": "", + "axisLabel": "score", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -1201,15 +1217,16 @@ "mode": "absolute", "steps": [ { - "color": "semi-dark-green" + "color": "semi-dark-red", + "value": null }, { "color": "semi-dark-yellow", - "value": 2 + "value": 0.2 }, { - "color": "semi-dark-red", - "value": 5 + "color": "semi-dark-green", + "value": 0.6 } ] } @@ -1222,7 +1239,7 @@ "x": 0, "y": 48 }, - "id": 11, + "id": 9, "options": { "legend": { "calcs": [], @@ -1239,11 +1256,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_bullyScore{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}", + "expr": "platform_tipsetAdvancement{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1253,34 +1270,36 @@ "useBackend": false } ], - "title": "bullyScore", + "title": "tipsetAdvancement", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, - "description": "The score, based on tipset advancements, of how much of a 'bully' this node is being to other nodes. Bullying is defined as refusing to use a node's events as other parents.", + "description": "The score, based on tipset advancement weight, of each new event created by this node. A score of 0.0 means the an event has zero advancement weight, while a score of 1.0 means that the event had the maximum possible advancement weight.", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, + "displayName": "Avg", "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "semi-dark-green" + "color": "semi-dark-red", + "value": null }, { "color": "semi-dark-yellow", - "value": 2 + "value": 0.2 }, { - "color": "semi-dark-red", - "value": 5 + "color": "semi-dark-green", + "value": 0.6 } ] } @@ -1293,7 +1312,7 @@ "x": 15, "y": 48 }, - "id": 14, + "id": 10, "options": { "minVizHeight": 75, "minVizWidth": 75, @@ -1306,67 +1325,138 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "min(min_over_time(platform_bullyScore{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}[$__range]))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Min", - "range": true, - "refId": "Min", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(avg_over_time(platform_bullyScore{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}[$__range]))", + "expr": "avg(platform_tipsetAdvancement{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, - "hide": false, "includeNullMetadata": true, "instant": false, "legendFormat": "Avg", "range": true, - "refId": "Avg", + "refId": "A", "useBackend": false + } + ], + "title": "tipsetAdvancement", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "description": "The score, based on tipset advancements, of how much this node is being selfish. Selfishness is defined as refusing to use another node's events as other parents.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "semi-dark-green", + "value": null + }, + { + "color": "semi-dark-yellow", + "value": 0.4 + }, + { + "color": "semi-dark-red", + "value": 0.67 + } + ] + } }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 15, + "x": 0, + "y": 56 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(platform_bullyScore{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}[$__range]))", + "expr": "platform_selfishness{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"}", "fullMetaSearch": false, - "hide": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "Max", + "legendFormat": "node {{node_id}}", "range": true, "refId": "A", "useBackend": false } ], "title": "bullyScore", - "type": "gauge" + "type": "timeseries" } ], - "refresh": "5s", - "schemaVersion": 38, + "refresh": "", + "schemaVersion": 39, "tags": [ "Platform" ], @@ -1376,17 +1466,18 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, - "definition": "label_values(environment)", + "definition": "label_values(platform_trans_per_sec{environment!~\"nmt.*\"},environment)", "hide": 0, "includeAll": false, - "label": "Environment", + "label": "Network", "multi": false, - "name": "Environment", + "name": "network", "options": [], "query": { - "query": "label_values(environment)", + "qryType": 1, + "query": "label_values(platform_trans_per_sec{environment!~\"nmt.*\"},environment)", "refId": "PrometheusVariableQueryEditor-VariableQuery" }, "refresh": 1, @@ -1399,7 +1490,7 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "definition": "label_values(node_id)", "hide": 0, @@ -1428,6 +1519,6 @@ "timezone": "", "title": "Hashgraph", "uid": "c84ad8dc-c57e-4e01-b150-1732b151e317", - "version": 21, + "version": 6, "weekStart": "" } \ No newline at end of file diff --git a/hedera-node/infrastructure/grafana/dashboards/production/platform/merkleDb.json b/hedera-node/infrastructure/grafana/dashboards/production/platform/merkleDb.json index a4382351042f..f6cece2c96fd 100644 --- a/hedera-node/infrastructure/grafana/dashboards/production/platform/merkleDb.json +++ b/hedera-node/infrastructure/grafana/dashboards/production/platform/merkleDb.json @@ -1,4 +1,35 @@ { + "__inputs": [ + { + "name": "DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM", + "label": "grafanacloud-swirldslabspreproduction-prom", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.3.0-63137" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], "annotations": { "list": [ { @@ -18,10 +49,10 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 96, + "id": null, "links": [ { - "asDropdown": false, + "asDropdown": true, "icon": "external link", "includeVars": true, "keepTime": true, @@ -29,7 +60,7 @@ "Platform" ], "targetBlank": false, - "title": "Platform dashboards", + "title": "Platform Dashboards", "tooltip": "", "type": "dashboards", "url": "" @@ -40,7 +71,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -48,11 +79,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -119,10 +150,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "rate(merkle_db_ds_reads_hashes_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}[10m])", + "expr": "rate(merkle_db_ds_reads_hashes_$Store{environment=\"$network\", node_id=\"$NodeID\"}[10m])", "instant": false, "legendFormat": "hashes", "range": true, @@ -131,10 +162,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "rate(merkle_db_ds_reads_leafKeys_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}[10m])", + "expr": "rate(merkle_db_ds_reads_leafKeys_$Store{environment=\"$network\", node_id=\"$NodeID\"}[10m])", "hide": false, "instant": false, "legendFormat": "leaf keys", @@ -144,10 +175,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "rate(merkle_db_ds_reads_leaves_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}[10m])", + "expr": "rate(merkle_db_ds_reads_leaves_$Store{environment=\"$network\", node_id=\"$NodeID\"}[10m])", "hide": false, "instant": false, "legendFormat": "leaves", @@ -161,7 +192,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -169,11 +200,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -240,10 +271,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "rate(merkle_db_ds_flushes_hashesWritten_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}[10m])", + "expr": "rate(merkle_db_ds_flushes_hashesWritten_$Store{environment=\"$network\", node_id=\"$NodeID\"}[10m])", "instant": false, "legendFormat": "hashes written", "range": true, @@ -252,10 +283,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "rate(merkle_db_ds_flushes_leafKeysWritten_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}[10m])", + "expr": "rate(merkle_db_ds_flushes_leafKeysWritten_$Store{environment=\"$network\", node_id=\"$NodeID\"}[10m])", "hide": false, "instant": false, "legendFormat": "leaf keys written", @@ -265,10 +296,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "rate(merkle_db_ds_flushes_leavesDeleted_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}[10m])", + "expr": "rate(merkle_db_ds_flushes_leavesDeleted_$Store{environment=\"$network\", node_id=\"$NodeID\"}[10m])", "hide": false, "instant": false, "legendFormat": "leaves deleted", @@ -278,10 +309,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "rate(merkle_db_ds_flushes_leavesWritten_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}[10m])", + "expr": "rate(merkle_db_ds_flushes_leavesWritten_$Store{environment=\"$network\", node_id=\"$NodeID\"}[10m])", "hide": false, "instant": false, "legendFormat": "leaves written", @@ -295,7 +326,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -303,11 +334,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "bars", "fillOpacity": 0, @@ -375,10 +406,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_files_hashesStoreFileSizeMb_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_files_hashesStoreFileSizeMb_$Store{environment=\"$network\", node_id=\"$NodeID\"}", "instant": false, "legendFormat": "hashes", "range": true, @@ -387,10 +418,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_files_leafKeysStoreFileSizeMb_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_files_leafKeysStoreFileSizeMb_$Store{environment=\"$network\", node_id=\"$NodeID\"}", "hide": false, "instant": false, "legendFormat": "leaf keys", @@ -400,10 +431,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_files_leavesStoreFileSizeMb_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_files_leavesStoreFileSizeMb_$Store{environment=\"$network\", node_id=\"$NodeID\"}", "hide": false, "instant": false, "legendFormat": "leaves", @@ -417,7 +448,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -496,10 +527,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_files_hashesStoreFileCount_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_files_hashesStoreFileCount_$Store{environment=\"$network\", node_id=\"$NodeID\"}", "instant": false, "legendFormat": "hashes", "range": true, @@ -508,10 +539,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_files_leafKeysStoreFileCount_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_files_leafKeysStoreFileCount_$Store{environment=\"$network\", node_id=\"$NodeID\"}", "hide": false, "instant": false, "legendFormat": "leafKeys", @@ -521,10 +552,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_files_leavesStoreFileCount_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_files_leavesStoreFileCount_$Store{environment=\"$network\", node_id=\"$NodeID\"}", "hide": false, "instant": false, "legendFormat": "leaves", @@ -538,7 +569,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -616,10 +647,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_offheap_hashesIndexMb_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_offheap_hashesIndexMb_$Store{environment=\"$network\", node_id=\"$NodeID\"}", "instant": false, "legendFormat": "hash store index", "range": true, @@ -628,10 +659,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_offheap_hashesListMb_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_offheap_hashesListMb_$Store{environment=\"$network\", node_id=\"$NodeID\"}", "hide": false, "instant": false, "legendFormat": "hashes list", @@ -641,10 +672,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_offheap_leavesIndexMb_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_offheap_leavesIndexMb_$Store{environment=\"$network\", node_id=\"$NodeID\"}", "hide": false, "instant": false, "legendFormat": "leaves store index", @@ -654,10 +685,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_offheap_longKeysIndexMb_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_offheap_longKeysIndexMb_$Store{environment=\"$network\", node_id=\"$NodeID\"}", "hide": false, "instant": false, "legendFormat": "long keys index", @@ -667,10 +698,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_offheap_objectKeyBucketsIndexMb_$Store{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_offheap_objectKeyBucketsIndexMb_$Store{environment=\"$network\", node_id=\"$NodeID\"}", "hide": false, "instant": false, "legendFormat": "generic key buckets index", @@ -684,7 +715,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -763,10 +794,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "merkle_db_ds_offheap_dataSourceMb_accountStore{environment=\"$Environment\", node_id=\"$NodeID\"} + merkle_db_ds_offheap_dataSourceMb_fileStore{environment=\"$Environment\", node_id=\"$NodeID\"} + merkle_db_ds_offheap_dataSourceMb_tokenRelStore{environment=\"$Environment\", node_id=\"$NodeID\"} + merkle_db_ds_offheap_dataSourceMb_smartContractIterableKvStore{environment=\"$Environment\", node_id=\"$NodeID\"}", + "expr": "merkle_db_ds_offheap_dataSourceMb_accountStore{environment=\"$network\", node_id=\"$NodeID\"} + merkle_db_ds_offheap_dataSourceMb_fileStore{environment=\"$network\", node_id=\"$NodeID\"} + merkle_db_ds_offheap_dataSourceMb_tokenRelStore{environment=\"$network\", node_id=\"$NodeID\"} + merkle_db_ds_offheap_dataSourceMb_smartContractIterableKvStore{environment=\"$network\", node_id=\"$NodeID\"}", "instant": false, "legendFormat": "Total", "range": true, @@ -778,7 +809,7 @@ } ], "refresh": "", - "schemaVersion": 38, + "schemaVersion": 39, "tags": [ "Platform", "PlatformData" @@ -786,21 +817,17 @@ "templating": { "list": [ { - "current": { - "selected": false, - "text": "integration", - "value": "integration" - }, + "current": {}, "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "definition": "label_values(environment)", "hide": 0, "includeAll": false, - "label": "Environment", + "label": "Network", "multi": false, - "name": "Environment", + "name": "network", "options": [], "query": { "qryType": 1, @@ -814,14 +841,10 @@ "type": "query" }, { - "current": { - "selected": false, - "text": "0", - "value": "0" - }, + "current": {}, "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "definition": "label_values(node_id)", "hide": 0, @@ -832,7 +855,7 @@ "options": [], "query": { "qryType": 1, - "query": "label_values({environment=\"$Environment\"}, node_id)", + "query": "label_values({environment=\"$network\"}, node_id)", "refId": "PrometheusVariableQueryEditor-VariableQuery" }, "refresh": 1, @@ -842,14 +865,10 @@ "type": "query" }, { - "current": { - "selected": false, - "text": "accountStore", - "value": "accountStore" - }, + "current": {}, "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "definition": "metrics(virtual_map_vmap_size_.*)", "hide": 0, @@ -872,13 +891,13 @@ ] }, "time": { - "from": "now-24h", + "from": "now-3h", "to": "now" }, "timepicker": {}, "timezone": "", "title": "MerkleDb", "uid": "f57651cc-ee35-48d7-bbea-8908f07e3db4", - "version": 70, + "version": 74, "weekStart": "" -} +} \ No newline at end of file diff --git a/hedera-node/infrastructure/grafana/dashboards/production/platform/networkHealth.json b/hedera-node/infrastructure/grafana/dashboards/production/platform/networkHealth.json index b6223a5b6b1b..0e9f442541d9 100644 --- a/hedera-node/infrastructure/grafana/dashboards/production/platform/networkHealth.json +++ b/hedera-node/infrastructure/grafana/dashboards/production/platform/networkHealth.json @@ -1,8 +1,8 @@ { "__inputs": [ { - "name": "DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM", - "label": "grafanacloud-swirldslabsproduction-prom", + "name": "DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM", + "label": "grafanacloud-swirldslabspreproduction-prom", "description": "", "type": "datasource", "pluginId": "prometheus", @@ -17,7 +17,7 @@ "model": { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The maximum size during a sampling period of the event intake queue.", "fieldConfig": { @@ -26,6 +26,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "# of events", @@ -97,7 +98,7 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_event_intake_queueMaxSize{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_event_intake_queueMaxSize{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -118,7 +119,7 @@ "model": { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -148,6 +149,8 @@ "overrides": [] }, "options": { + "minVizHeight": 75, + "minVizWidth": 75, "orientation": "auto", "reduceOptions": { "calcs": [], @@ -157,7 +160,7 @@ "showThresholdLabels": false, "showThresholdMarkers": true }, - "pluginVersion": "10.2.0-59542pre", + "pluginVersion": "10.3.0-63137", "targets": [ { "datasource": { @@ -166,7 +169,7 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_event_intake_queueMaxSize{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_event_intake_queueMaxSize{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -182,7 +185,7 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_event_intake_queueMaxSize{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_event_intake_queueMaxSize{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -199,7 +202,7 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_event_intake_queueMaxSize{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_event_intake_queueMaxSize{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -221,7 +224,7 @@ "model": { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of events in the consensus queue (q2) waiting to be handled.", "fieldConfig": { @@ -230,6 +233,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "# of events", @@ -301,7 +305,7 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_consEventsMAX{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_consEventsMAX{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -327,7 +331,7 @@ "type": "grafana", "id": "grafana", "name": "Grafana", - "version": "10.2.0-60853" + "version": "10.3.0-63588" }, { "type": "datasource", @@ -378,7 +382,7 @@ "Platform" ], "targetBlank": false, - "title": "Platform Dashboards", + "title": "Platform Dashboard", "tooltip": "", "type": "dashboards", "url": "" @@ -389,7 +393,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -493,19 +497,20 @@ "fields": "", "values": false }, - "textMode": "auto" + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", "exemplar": false, - "expr": "platform_PlatformStatus{environment=\"$Environment\"}", + "expr": "platform_PlatformStatus{environment=\"$network\"}", "format": "time_series", "fullMetaSearch": false, "includeNullMetadata": true, @@ -522,7 +527,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The fraction (out of 1.0) of the network that is alive and healthy, weighted by consensus weight.", "fieldConfig": { @@ -531,11 +536,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "axisSoftMax": 1, "axisSoftMin": 0.5, "barAlignment": 0, @@ -608,11 +613,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_healthyNetworkFraction_fraction{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "platform_healthyNetworkFraction_fraction{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -628,7 +633,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -675,18 +680,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(last_over_time(platform_healthyNetworkFraction_fraction{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}[$__interval]))", + "expr": "avg(last_over_time(platform_healthyNetworkFraction_fraction{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"}[$__interval]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -702,7 +708,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of app transactions added to the hashgraph per second by each node via deduplicated events.", "fieldConfig": { @@ -711,11 +717,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -786,11 +792,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_trans_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "platform_trans_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -806,7 +812,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of app transactions added to the hashgraph per second by the network via deduplicated events.", "fieldConfig": { @@ -854,18 +860,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(platform_trans_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"})", + "expr": "avg(avg_over_time(platform_trans_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -881,7 +888,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The time from creating an event to knowing its consensus (in seconds).", "fieldConfig": { @@ -890,11 +897,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "sec", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -926,7 +933,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "semi-dark-yellow", @@ -967,12 +975,12 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", "exemplar": false, - "expr": "platform_secC2C{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "platform_secC2C{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "format": "time_series", "fullMetaSearch": false, "includeNullMetadata": true, @@ -990,7 +998,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "Of the secC2C values reported by each node, the minimum, average, and maximum.", "fieldConfig": { @@ -1003,7 +1011,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -1035,19 +1044,20 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", "exemplar": false, - "expr": "min(min_over_time(platform_secC2C{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(platform_secC2C{environment=\"$network\", type=\"min\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1059,12 +1069,12 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", "exemplar": false, - "expr": "avg(platform_secC2C{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"})", + "expr": "avg(platform_secC2C{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1077,12 +1087,12 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", "exemplar": false, - "expr": "max(max_over_time(platform_secC2C{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(platform_secC2C{environment=\"$network\", type=\"max\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1099,7 +1109,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of events per second created by each node in the network.", "fieldConfig": { @@ -1108,11 +1118,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -1144,15 +1154,16 @@ "mode": "absolute", "steps": [ { - "color": "semi-dark-red" + "color": "semi-dark-red", + "value": null }, { "color": "semi-dark-yellow", - "value": 5 + "value": 10 }, { "color": "dark-green", - "value": 10 + "value": 20 } ] } @@ -1182,11 +1193,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_cEvents_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "platform_cEvents_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1202,7 +1213,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of events per second created by each node.", "fieldConfig": { @@ -1210,21 +1221,21 @@ "color": { "mode": "thresholds" }, - "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "red" + "color": "red", + "value": null }, { "color": "dark-yellow", - "value": 5 + "value": 10 }, { "color": "green", - "value": 10 + "value": 20 } ] } @@ -1250,18 +1261,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(platform_cEvents_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(platform_cEvents_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1274,11 +1286,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(platform_cEvents_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"})", + "expr": "avg(platform_cEvents_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1290,11 +1302,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(platform_cEvents_per_sec{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(platform_cEvents_per_sec{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1350,7 +1362,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -1363,7 +1375,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "semi-dark-yellow", @@ -1395,18 +1408,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_consEvents{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_consEvents{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1418,11 +1432,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_consEvents{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_consEvents{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1435,11 +1449,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_consEventsMAX{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_consEventsMAX{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1456,7 +1470,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average time to handle a consensus transaction in SwirldState.handleTransaction()", "fieldConfig": { @@ -1465,11 +1479,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", - "axisLabel": "seconds", + "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "axisSoftMin": 0, "barAlignment": 0, "drawStyle": "line", @@ -1485,8 +1499,7 @@ "lineWidth": 1, "pointSize": 5, "scaleDistribution": { - "log": 2, - "type": "log" + "type": "linear" }, "showPoints": "auto", "spanNulls": false, @@ -1503,7 +1516,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "semi-dark-yellow", @@ -1514,7 +1528,8 @@ "value": 0.001 } ] - } + }, + "unit": "s" }, "overrides": [] }, @@ -1544,11 +1559,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_secTransH{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}", + "expr": "internal_secTransH{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1565,20 +1580,21 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, - "decimals": 7, + "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "semi-dark-yellow", @@ -1589,7 +1605,8 @@ "value": 0.0001 } ] - } + }, + "unit": "s" }, "overrides": [] }, @@ -1612,18 +1629,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_secTransH{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_secTransH{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1635,11 +1653,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_secTransH{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_secTransH{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1652,11 +1670,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_secTransH{environment=\"$Environment\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_secTransH{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1673,7 +1691,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average time it takes to perform preHandle.", "fieldConfig": { @@ -1682,11 +1700,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", - "axisLabel": "microseconds", + "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -1718,14 +1736,16 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", "value": 80 } ] - } + }, + "unit": "µs" }, "overrides": [] }, @@ -1752,11 +1772,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_preHandleMicros{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_preHandleMicros{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1772,31 +1792,33 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, - "decimals": 7, + "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "semi-dark-yellow", - "value": 300 + "value": 30000 }, { "color": "red", - "value": 500 + "value": 50000 } ] - } + }, + "unit": "µs" }, "overrides": [] }, @@ -1819,18 +1841,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_preHandleMicros{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_preHandleMicros{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1843,11 +1866,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_preHandleMicros{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_preHandleMicros{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1860,11 +1883,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_preHandleMicros{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_preHandleMicros{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1880,7 +1903,7 @@ } ], "refresh": "", - "schemaVersion": 38, + "schemaVersion": 39, "tags": [ "Platform" ], @@ -1890,18 +1913,19 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, - "definition": "label_values(environment)", - "description": "The environment to pull data from (i.e. mainnet, testnet, etc).", + "definition": "label_values(platform_trans_per_sec{network!~\"nmt.*\"},environment)", + "description": "The network to pull data from (i.e. mainnet, testnet, etc).", "hide": 0, "includeAll": false, - "label": "Environment", + "label": "Network", "multi": false, - "name": "Environment", + "name": "network", "options": [], "query": { - "query": "label_values(environment)", + "qryType": 1, + "query": "label_values(platform_trans_per_sec{network!~\"nmt.*\"},environment)", "refId": "PrometheusVariableQueryEditor-VariableQuery" }, "refresh": 1, @@ -1915,7 +1939,7 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "definition": "label_values(node_id)", "hide": 0, @@ -1944,6 +1968,6 @@ "timezone": "", "title": "Network Health", "uid": "ec9413c6-6f17-49fc-951b-51cbc21a1eef", - "version": 57, + "version": 11, "weekStart": "" } \ No newline at end of file diff --git a/hedera-node/infrastructure/grafana/dashboards/production/platform/reconnect.json b/hedera-node/infrastructure/grafana/dashboards/production/platform/reconnect.json new file mode 100644 index 000000000000..27b78eab8259 --- /dev/null +++ b/hedera-node/infrastructure/grafana/dashboards/production/platform/reconnect.json @@ -0,0 +1,961 @@ +{ + "__inputs": [ + { + "name": "DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM", + "label": "grafanacloud-swirldslabspreproduction-prom", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + }, + { + "name": "DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM-FOR-LIBRARY-PANEL", + "label": "grafanacloud-swirldslabspreproduction-prom", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus", + "usage": { + "libraryPanels": [ + { + "name": "conns Changes", + "uid": "ef64b104-def4-4374-ba11-df4fb2a8ec2d" + } + ] + } + } + ], + "__elements": { + "c0f06e60-0fcc-44e7-af5a-bf436e1fbe98": { + "name": "Platform Status", + "uid": "c0f06e60-0fcc-44e7-af5a-bf436e1fbe98", + "kind": 1, + "model": { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "1": { + "color": "super-light-blue", + "index": 0, + "text": "Starting Up" + }, + "2": { + "color": "semi-dark-green", + "index": 1, + "text": "Active" + }, + "3": { + "color": "#808080", + "index": 10, + "text": "Disconnected" + }, + "4": { + "color": "semi-dark-orange", + "index": 2, + "text": "Behind" + }, + "5": { + "color": "purple", + "index": 3, + "text": "Freezing" + }, + "6": { + "color": "dark-purple", + "index": 4, + "text": "Freeze Complete" + }, + "7": { + "color": "blue", + "index": 5, + "text": "Replaying Events" + }, + "8": { + "color": "super-light-green", + "index": 6, + "text": "Observing" + }, + "9": { + "color": "light-yellow", + "index": 7, + "text": "Checking" + }, + "10": { + "color": "light-orange", + "index": 8, + "text": "Reconnect Complete" + }, + "11": { + "color": "dark-red", + "index": 9, + "text": "Catastrophic Failure" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.3.0-63137", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "grafanacloud-prom" + }, + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": false, + "expr": "platform_PlatformStatus{environment=\"$network\"}", + "format": "time_series", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "node {{node_id}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Platform Status", + "type": "stat" + } + }, + "a5c5c524-a234-4292-85ae-9fb58f7a863a": { + "name": "syncGenDiff", + "uid": "a5c5c524-a234-4292-85ae-9fb58f7a863a", + "kind": 1, + "model": { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "description": "The number of generation ahead (positive) or behind (negative) when syncing.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "generations", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "semi-dark-red", + "value": null + }, + { + "color": "semi-dark-yellow", + "value": -5000 + }, + { + "color": "semi-dark-green", + "value": -3000 + } + ] + } + }, + "overrides": [] + }, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "grafanacloud-prom" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "internal_syncGenDiff{environment=\"$network\", node_id=~\"$NodeID\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "node {{node_id}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "syncGenDiff", + "type": "timeseries" + } + }, + "ef64b104-def4-4374-ba11-df4fb2a8ec2d": { + "name": "conns Changes", + "uid": "ef64b104-def4-4374-ba11-df4fb2a8ec2d", + "kind": 1, + "model": { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM-FOR-LIBRARY-PANEL}" + }, + "description": "The increase in the number of TLS connections established by a node per second.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "libraryPanel": { + "name": "conns Changes", + "uid": "ef64b104-def4-4374-ba11-df4fb2a8ec2d" + }, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "grafanacloud-prom" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "increase(platform_conns{environment=\"$network\", type=\"mean\", node_id=~\"$NodeID\"}[$__rate_interval])", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "node {{node_id}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "conns Changes", + "type": "timeseries" + } + } + }, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.3.0-63588" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [ + { + "asDropdown": true, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [ + "Platform" + ], + "targetBlank": false, + "title": "Platform Dashboards", + "tooltip": "", + "type": "dashboards", + "url": "" + } + ], + "liveNow": false, + "panels": [ + { + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 7, + "libraryPanel": { + "uid": "c0f06e60-0fcc-44e7-af5a-bf436e1fbe98", + "name": "Platform Status" + } + }, + { + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 5, + "libraryPanel": { + "uid": "a5c5c524-a234-4292-85ae-9fb58f7a863a", + "name": "syncGenDiff" + } + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decmbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "platform_directMemInMB{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{node_id}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "directMem", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "platform_memTot{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{node_id}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "memTot", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "changes(Reconnect_startsReconnectAsReceiver_total{environment=\"$network\", node_id=~\"$NodeID\"}[1m])", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{node_id}} starts", + "range": true, + "refId": "starts", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "changes(Reconnect_endsReconnectAsReceiver_total{environment=\"$network\", node_id=~\"$NodeID\"}[1m])", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{node_id}} ends", + "range": true, + "refId": "ends", + "useBackend": false + } + ], + "title": "Reconnect Learners", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 40 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "changes(Reconnect_startsReconnectAsSender_total{environment=\"$network\", node_id=~\"$NodeID\"}[1m])", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{node_id}} starts", + "range": true, + "refId": "starts", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "changes(Reconnect_endsReconnectAsSender_total{environment=\"$network\", node_id=~\"$NodeID\"}[1m])", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{node_id}} ends", + "range": true, + "refId": "ends", + "useBackend": false + } + ], + "title": "Reconnect Teachers", + "type": "timeseries" + }, + { + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 48 + }, + "id": 9, + "libraryPanel": { + "uid": "ef64b104-def4-4374-ba11-df4fb2a8ec2d", + "name": "conns Changes" + } + } + ], + "refresh": "5s", + "schemaVersion": 39, + "tags": [ + "Platform" + ], + "templating": { + "list": [ + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "definition": "label_values(platform_trans_per_sec{environment!~\"nmt.*\"},environment)", + "description": "The network to pull data from (i.e. mainnet, testnet, etc).", + "hide": 0, + "includeAll": false, + "label": "Network", + "multi": false, + "name": "network", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(platform_trans_per_sec{environment!~\"nmt.*\"},environment)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" + }, + "definition": "label_values(node_id)", + "hide": 0, + "includeAll": true, + "label": "NodeID", + "multi": true, + "name": "NodeID", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(node_id)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Reconnects", + "uid": "a11737aa-3390-4951-8ddb-0b1b3f06aebc", + "version": 20, + "weekStart": "" +} \ No newline at end of file diff --git a/hedera-node/infrastructure/grafana/dashboards/production/platform/signedStates.json b/hedera-node/infrastructure/grafana/dashboards/production/platform/signedStates.json index bf1fa35d0663..af822fed9295 100644 --- a/hedera-node/infrastructure/grafana/dashboards/production/platform/signedStates.json +++ b/hedera-node/infrastructure/grafana/dashboards/production/platform/signedStates.json @@ -1,8 +1,8 @@ { "__inputs": [ { - "name": "DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM", - "label": "grafanacloud-swirldslabsproduction-prom", + "name": "DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM", + "label": "grafanacloud-swirldslabspreproduction-prom", "description": "", "type": "datasource", "pluginId": "prometheus", @@ -21,7 +21,7 @@ "type": "grafana", "id": "grafana", "name": "Grafana", - "version": "10.2.0-60853" + "version": "10.3.0-63588" }, { "type": "datasource", @@ -83,7 +83,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The number of nodes that currently disagree with the consensus hash", "fieldConfig": { @@ -128,18 +128,19 @@ "fields": "", "values": false }, - "textMode": "auto" + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "ceil(rate(internal_issCount{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__rate_interval]))", + "expr": "ceil(rate(internal_issCount{environment=\"$network\", node_id=~\"$NodeID\"}[$__rate_interval]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -155,7 +156,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The age of the oldest SignedState object in memory", "fieldConfig": { @@ -164,11 +165,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -239,11 +240,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_oldestSignedStateSeconds{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_oldestSignedStateSeconds{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -259,7 +260,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The age of the oldest SignedState object in memory", "fieldConfig": { @@ -308,18 +309,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_oldestSignedStateSeconds{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_oldestSignedStateSeconds{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -335,7 +337,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of unsigned states awaiting signatures.", "fieldConfig": { @@ -344,11 +346,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -419,11 +421,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_unsignedStates_count{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}", + "expr": "platform_unsignedStates_count{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -439,7 +441,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The minimum, average, and maximum number of unsigned states reported. These use the min/mean/max metrics reported by each node and not just the average, so the min and max may be more extreme than shown on the average graph.", "fieldConfig": { @@ -487,18 +489,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(platform_unsignedStates_count{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"min\"}[$__range]))", + "expr": "min(min_over_time(platform_unsignedStates_count{environment=\"$network\", node_id=~\"$NodeID\", type=\"min\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -510,11 +513,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(platform_unsignedStates_count{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"})", + "expr": "avg(platform_unsignedStates_count{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -527,11 +530,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(platform_unsignedStates_count{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"max\"}[$__range]))", + "expr": "max(max_over_time(platform_unsignedStates_count{environment=\"$network\", node_id=~\"$NodeID\", type=\"max\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -548,7 +551,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of fully signed states awaiting signatures.", "fieldConfig": { @@ -557,11 +560,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -593,7 +596,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -631,11 +635,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_signedStates_count{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}", + "expr": "platform_signedStates_count{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -651,7 +655,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The minimum, average, and maximum number of fully signed states reported. These use the min/mean/max metrics reported by each node and not just the average, so the min and max may be more extreme than shown on the average graph.", "fieldConfig": { @@ -664,7 +668,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -698,18 +703,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(platform_signedStates_count{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"min\"}[$__range]))", + "expr": "min(min_over_time(platform_signedStates_count{environment=\"$network\", node_id=~\"$NodeID\", type=\"min\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -721,11 +727,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(platform_signedStates_count{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"})", + "expr": "avg(platform_signedStates_count{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -738,11 +744,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(platform_signedStates_count{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"max\"}[$__range]))", + "expr": "max(max_over_time(platform_signedStates_count{environment=\"$network\", node_id=~\"$NodeID\", type=\"max\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -759,7 +765,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The changes in total number of states that did not receive enough signatures in the allowed time per second.", "fieldConfig": { @@ -768,11 +774,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -804,7 +810,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -842,11 +849,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "increase(platform_totalNeverSignedStates_count_total{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__rate_interval])", + "expr": "increase(platform_totalNeverSignedStates_count_total{environment=\"$network\", node_id=~\"$NodeID\"}[$__rate_interval])", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -862,7 +869,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The total number of states that did not receive enough signatures in the allowed time.", "fieldConfig": { @@ -875,7 +882,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -909,18 +917,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60477", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(platform_totalNeverSignedStates_count_total{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "max(platform_totalNeverSignedStates_count_total{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -936,7 +945,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of state signatures gathered from other nodes per second.", "fieldConfig": { @@ -945,11 +954,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -981,7 +990,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -1019,11 +1029,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_stateSignaturesGathered_per_sec_hz{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}", + "expr": "platform_stateSignaturesGathered_per_sec_hz{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1039,7 +1049,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The minimum, average, and maximum number of state signatures gathered per second. These use the min/mean/max metrics reported by each node and not just the average, so the min and max may be more extreme than shown on the average graph.", "fieldConfig": { @@ -1052,7 +1062,8 @@ "mode": "absolute", "steps": [ { - "color": "red" + "color": "red", + "value": null }, { "color": "#EAB839", @@ -1086,18 +1097,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60477", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(platform_stateSignaturesGathered_per_sec_hz{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"min\"}[$__range]))", + "expr": "min(min_over_time(platform_stateSignaturesGathered_per_sec_hz{environment=\"$network\", node_id=~\"$NodeID\", type=\"min\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1109,11 +1121,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(platform_stateSignaturesGathered_per_sec_hz{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"})", + "expr": "avg(platform_stateSignaturesGathered_per_sec_hz{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1126,11 +1138,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(platform_stateSignaturesGathered_per_sec_hz{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"max\"}[$__range]))", + "expr": "max(max_over_time(platform_stateSignaturesGathered_per_sec_hz{environment=\"$network\", node_id=~\"$NodeID\", type=\"max\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1147,7 +1159,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average difference in round number between state signatures and the most recent immutable state. Negative numbers mean the are being received early, large positive numbers mean signatures are being received late.", "fieldConfig": { @@ -1156,11 +1168,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "# of rounds", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -1192,7 +1204,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -1226,11 +1239,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "platform_stateSignatureAge_rounds{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}", + "expr": "platform_stateSignatureAge_rounds{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1246,7 +1259,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average difference in round number between state signatures and the most recent immutable state. Negative numbers mean the are being received early, large positive numbers mean signatures are being received late.", "fieldConfig": { @@ -1259,7 +1272,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "semi-dark-yellow", @@ -1293,18 +1307,19 @@ "values": false }, "showThresholdLabels": false, - "showThresholdMarkers": true + "showThresholdMarkers": true, + "sizing": "auto" }, - "pluginVersion": "10.2.0-60477", + "pluginVersion": "10.3.0-63588", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(platform_stateSignatureAge_rounds{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}[$__range]))", + "expr": "min(min_over_time(platform_stateSignatureAge_rounds{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1316,11 +1331,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(avg_over_time(platform_stateSignatureAge_rounds{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}[$__range]))", + "expr": "avg(avg_over_time(platform_stateSignatureAge_rounds{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1333,11 +1348,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(platform_stateSignatureAge_rounds{environment=\"$Environment\", node_id=~\"$NodeID\", type=\"mean\"}[$__range]))", + "expr": "max(max_over_time(platform_stateSignatureAge_rounds{environment=\"$network\", node_id=~\"$NodeID\", type=\"mean\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1353,7 +1368,7 @@ } ], "refresh": "", - "schemaVersion": 38, + "schemaVersion": 39, "tags": [ "Platform" ], @@ -1363,17 +1378,18 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, - "definition": "label_values(environment)", + "definition": "label_values(platform_trans_per_sec{environment!~\"nmt.*\"},environment)", "hide": 0, "includeAll": false, - "label": "Environment", + "label": "Network", "multi": false, - "name": "Environment", + "name": "network", "options": [], "query": { - "query": "label_values(environment)", + "qryType": 1, + "query": "label_values(platform_trans_per_sec{environment!~\"nmt.*\"},environment)", "refId": "PrometheusVariableQueryEditor-VariableQuery" }, "refresh": 1, @@ -1386,7 +1402,7 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "definition": "label_values(node_id)", "hide": 0, @@ -1415,6 +1431,6 @@ "timezone": "", "title": "Signed States", "uid": "b9dde471-a093-42b6-b633-1755b3fc18d3", - "version": 15, + "version": 2, "weekStart": "" } \ No newline at end of file diff --git a/hedera-node/infrastructure/grafana/dashboards/production/platform/threadsAndQueues.json b/hedera-node/infrastructure/grafana/dashboards/production/platform/threadsAndQueues.json index c50edaef0b06..e5dca7be9a9c 100644 --- a/hedera-node/infrastructure/grafana/dashboards/production/platform/threadsAndQueues.json +++ b/hedera-node/infrastructure/grafana/dashboards/production/platform/threadsAndQueues.json @@ -1,12 +1,30 @@ { "__inputs": [ { - "name": "DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM", - "label": "grafanacloud-swirldslabsproduction-prom", + "name": "DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM", + "label": "grafanacloud-swirldslabspreproduction-prom", "description": "", "type": "datasource", "pluginId": "prometheus", "pluginName": "Prometheus" + }, + { + "name": "DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM-FOR-LIBRARY-PANEL", + "label": "grafanacloud-swirldslabspreproduction-prom", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus", + "usage": { + "libraryPanels": [ + { + "uid": "ea3a07d5-8f0b-4705-997d-51935e44d3c0" + }, + { + "uid": "ce95d4af-054d-4590-8e28-c3bea14512ac" + } + ] + } } ], "__elements": { @@ -17,7 +35,7 @@ "model": { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM-FOR-LIBRARY-PANEL}" }, "description": "The maximum size during a sampling period of the event intake queue.", "fieldConfig": { @@ -77,6 +95,9 @@ }, "overrides": [] }, + "libraryPanel": { + "uid": "ea3a07d5-8f0b-4705-997d-51935e44d3c0" + }, "options": { "legend": { "calcs": [], @@ -118,7 +139,7 @@ "model": { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM-FOR-LIBRARY-PANEL}" }, "description": "", "fieldConfig": { @@ -147,6 +168,9 @@ }, "overrides": [] }, + "libraryPanel": { + "uid": "ce95d4af-054d-4590-8e28-c3bea14512ac" + }, "options": { "orientation": "auto", "reduceOptions": { @@ -221,7 +245,7 @@ "model": { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of events in the consensus queue (q2) waiting to be handled.", "fieldConfig": { @@ -230,6 +254,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "# of events", @@ -301,7 +326,7 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_consEventsMAX{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_consEventsMAX{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -327,7 +352,7 @@ "type": "grafana", "id": "grafana", "name": "Grafana", - "version": "10.2.0-60853" + "version": "10.3.0-63137" }, { "type": "datasource", @@ -397,7 +422,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of events in the preconsensus queue (q1) waiting to be handled.", "fieldConfig": { @@ -406,11 +431,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "# of events", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -481,11 +506,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_preConsEvents{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_preConsEvents{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -501,7 +526,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "The average number of events in the preconsensus queue (q1) waiting to be handled.", "fieldConfig": { @@ -553,16 +578,16 @@ "showThresholdLabels": false, "showThresholdMarkers": true }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63137", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_preConsEvents{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_preConsEvents{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -574,11 +599,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_preConsEvents{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_preConsEvents{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -591,11 +616,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_preConsEvents{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_preConsEvents{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -612,7 +637,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -621,11 +646,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -697,11 +722,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_thread_busy_thread_curr_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_thread_busy_thread_curr_fraction{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -719,7 +744,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -768,16 +793,16 @@ "showThresholdLabels": false, "showThresholdMarkers": true }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63137", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_thread_busy_thread_curr_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_thread_busy_thread_curr_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -791,11 +816,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_thread_busy_thread_curr_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_thread_busy_thread_curr_fraction{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -809,11 +834,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_thread_busy_thread_curr_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_thread_busy_thread_curr_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -844,7 +869,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -853,11 +878,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -929,11 +954,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_thread_busy_event_intake_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_thread_busy_event_intake_fraction{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -951,7 +976,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -999,16 +1024,16 @@ "showThresholdLabels": false, "showThresholdMarkers": true }, - "pluginVersion": "10.2.0-60853", + "pluginVersion": "10.3.0-63137", "targets": [ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_thread_busy_event_intake_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_thread_busy_event_intake_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1022,11 +1047,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_thread_busy_event_intake_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_thread_busy_event_intake_fraction{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1040,11 +1065,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_thread_busy_event_intake_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_thread_busy_event_intake_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1101,7 +1126,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -1182,11 +1207,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_thread_busy_event_creator_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_thread_busy_event_creator_fraction{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1202,7 +1227,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -1253,11 +1278,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_thread_busy_event_creator_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_thread_busy_event_creator_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1269,11 +1294,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_thread_busy_event_creator_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_thread_busy_event_creator_fraction{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1286,11 +1311,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_thread_busy_event_creator_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_thread_busy_event_creator_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1307,7 +1332,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -1388,11 +1413,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_event_creator_queueMaxSize{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_event_creator_queueMaxSize{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1408,7 +1433,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -1459,11 +1484,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_event_creator_queueMaxSize{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_event_creator_queueMaxSize{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1475,11 +1500,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_event_creator_queueMaxSize{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_event_creator_queueMaxSize{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1492,11 +1517,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_event_creator_queueMaxSize{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_event_creator_queueMaxSize{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1526,7 +1551,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -1607,11 +1632,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_thread_busy_event_writer_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_thread_busy_event_writer_fraction{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1627,7 +1652,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -1678,11 +1703,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_thread_busy_event_writer_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_thread_busy_event_writer_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1694,11 +1719,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_thread_busy_event_writer_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_thread_busy_event_writer_fraction{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1711,11 +1736,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_thread_busy_event_writer_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_thread_busy_event_writer_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1745,7 +1770,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -1828,11 +1853,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_thread_busy_thread_cons_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_thread_busy_thread_cons_fraction{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1850,7 +1875,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -1902,11 +1927,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_thread_busy_thread_cons_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_thread_busy_thread_cons_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1920,11 +1945,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_thread_busy_thread_cons_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_thread_busy_thread_cons_fraction{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1938,11 +1963,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_thread_busy_thread_cons_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_thread_busy_thread_cons_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -1973,7 +1998,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -2026,11 +2051,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_consEventsMAX{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_consEventsMAX{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -2044,11 +2069,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_consEventsMAX{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_consEventsMAX{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -2062,11 +2087,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_consEventsMAX{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_consEventsMAX{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -2097,7 +2122,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -2178,11 +2203,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_thread_busy_state_hash_sign_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_thread_busy_state_hash_sign_fraction{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -2198,7 +2223,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -2249,11 +2274,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_thread_busy_state_hash_sign_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_thread_busy_state_hash_sign_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -2265,11 +2290,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_thread_busy_state_hash_sign_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_thread_busy_state_hash_sign_fraction{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -2282,11 +2307,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_thread_busy_state_hash_sign_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_thread_busy_state_hash_sign_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -2316,7 +2341,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -2397,11 +2422,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "internal_thread_busy_status_state_machine_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}", + "expr": "internal_thread_busy_status_state_machine_fraction{environment=\"$network\", node_id=~\"$NodeID\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -2417,7 +2442,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -2468,11 +2493,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "min(min_over_time(internal_thread_busy_status_state_machine_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "min(min_over_time(internal_thread_busy_status_state_machine_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -2484,11 +2509,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "avg(internal_thread_busy_status_state_machine_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"})", + "expr": "avg(internal_thread_busy_status_state_machine_fraction{environment=\"$network\", node_id=~\"$NodeID\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -2501,11 +2526,11 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "max(max_over_time(internal_thread_busy_status_state_machine_fraction{environment=\"$Environment\", node_id=~\"$NodeID\"}[$__range]))", + "expr": "max(max_over_time(internal_thread_busy_status_state_machine_fraction{environment=\"$network\", node_id=~\"$NodeID\"}[$__range]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, @@ -2521,7 +2546,7 @@ } ], "refresh": "5s", - "schemaVersion": 38, + "schemaVersion": 39, "tags": [ "Platform" ], @@ -2531,17 +2556,18 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, - "definition": "label_values(environment)", + "definition": "label_values(platform_trans_per_sec{environment!~\"nmt.*\"},environment)", "hide": 0, "includeAll": false, - "label": "Environment", + "label": "Network", "multi": false, - "name": "Environment", + "name": "network", "options": [], "query": { - "query": "label_values(environment)", + "qryType": 1, + "query": "label_values(platform_trans_per_sec{environment!~\"nmt.*\"},environment)", "refId": "PrometheusVariableQueryEditor-VariableQuery" }, "refresh": 1, @@ -2554,7 +2580,7 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPRODUCTION-PROM}" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "definition": "label_values(node_id)", "hide": 0, @@ -2583,6 +2609,6 @@ "timezone": "", "title": "Threads & Queues", "uid": "daf603b7-4578-4641-92b3-aa4f0f146876", - "version": 20, + "version": 4, "weekStart": "" } \ No newline at end of file diff --git a/hedera-node/infrastructure/grafana/dashboards/production/platform/virtualMap.json b/hedera-node/infrastructure/grafana/dashboards/production/platform/virtualMap.json index 0be4bb9da566..0d6498731acf 100644 --- a/hedera-node/infrastructure/grafana/dashboards/production/platform/virtualMap.json +++ b/hedera-node/infrastructure/grafana/dashboards/production/platform/virtualMap.json @@ -1,4 +1,35 @@ { + "__inputs": [ + { + "name": "DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM", + "label": "grafanacloud-swirldslabspreproduction-prom", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.3.0-63137" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], "annotations": { "list": [ { @@ -18,10 +49,10 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 95, + "id": null, "links": [ { - "asDropdown": false, + "asDropdown": true, "icon": "external link", "includeVars": true, "keepTime": true, @@ -29,7 +60,7 @@ "Platform" ], "targetBlank": false, - "title": "Dashboards", + "title": "Platform Dashboards", "tooltip": "", "type": "dashboards", "url": "" @@ -53,7 +84,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -62,11 +93,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -133,11 +164,11 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "code", - "expr": "virtual_map_vmap_size_$Store{environment=\"$Environment\", node_id=\"0\"}", + "expr": "virtual_map_vmap_size_$Store{environment=\"$network\", node_id=\"0\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -153,7 +184,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -162,14 +193,14 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "bars", - "fillOpacity": 0, + "fillOpacity": 100, "gradientMode": "none", "hideFrom": { "legend": false, @@ -233,11 +264,11 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "code", - "expr": "virtual_map_vmap_size_accountStore{environment=\"$Environment\", node_id=\"0\"}", + "expr": "virtual_map_vmap_size_accountStore{environment=\"$network\", node_id=\"0\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -249,10 +280,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "virtual_map_vmap_size_fileStore{environment=\"$Environment\", node_id=\"0\"}", + "expr": "virtual_map_vmap_size_fileStore{environment=\"$network\", node_id=\"0\"}", "hide": false, "instant": false, "legendFormat": "fileStore", @@ -262,10 +293,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "virtual_map_vmap_size_smartContractIterableKvStore{environment=\"$Environment\", node_id=\"0\"}", + "expr": "virtual_map_vmap_size_smartContractIterableKvStore{environment=\"$network\", node_id=\"0\"}", "hide": false, "instant": false, "legendFormat": "smartContractIterableKvStore", @@ -275,10 +306,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "virtual_map_vmap_size_tokenRelStore{environment=\"$Environment\", node_id=\"0\"}", + "expr": "virtual_map_vmap_size_tokenRelStore{environment=\"$network\", node_id=\"0\"}", "hide": false, "instant": false, "legendFormat": "tokenRelStore", @@ -288,10 +319,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "virtual_map_vmap_size_uniqueTokenStore{environment=\"$Environment\", node_id=\"0\"}", + "expr": "virtual_map_vmap_size_uniqueTokenStore{environment=\"$network\", node_id=\"0\"}", "hide": false, "instant": false, "legendFormat": "uniqueTokenStore", @@ -316,7 +347,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -325,11 +356,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -396,11 +427,11 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rate(virtual_map_vmap_queries_readEntities_$Store{environment=\"$Environment\"}[10m])", + "expr": "rate(virtual_map_vmap_queries_readEntities_$Store{environment=\"$network\"}[10m])", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -416,7 +447,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -425,11 +456,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -461,8 +492,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -496,11 +526,11 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rate(virtual_map_vmap_queries_addedEntities_$Store{environment=\"$Environment\"}[10m]) + rate(virtual_map_vmap_queries_updatedEntities_$Store{environment=\"$Environment\"}[10m]) +\nrate(virtual_map_vmap_queries_removedEntities_$Store{environment=\"$Environment\"}[10m])", + "expr": "rate(virtual_map_vmap_queries_addedEntities_$Store{environment=\"$network\"}[10m]) + rate(virtual_map_vmap_queries_updatedEntities_$Store{environment=\"$network\"}[10m]) +\nrate(virtual_map_vmap_queries_removedEntities_$Store{environment=\"$network\"}[10m])", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -517,7 +547,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -525,11 +555,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -561,8 +591,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -597,11 +626,11 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "code", - "expr": "virtual_map_vmap_lifecycle_nodeCacheSizeMb_$Store{environment=\"$Environment\"}", + "expr": "virtual_map_vmap_lifecycle_nodeCacheSizeMb_$Store{environment=\"$network\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -617,7 +646,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -625,11 +654,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -661,8 +690,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -697,11 +725,11 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "disableTextWrap": false, "editorMode": "code", - "expr": "merkle_db_ds_files_totalSizeMb_$Store{environment=\"$Environment\"}", + "expr": "merkle_db_ds_files_totalSizeMb_$Store{environment=\"$network\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -717,7 +745,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -725,11 +753,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -761,8 +789,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -797,10 +824,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "virtual_map_vmap_lifecycle_hashDurationMs_$Store{environment=\"$Environment\"}", + "expr": "virtual_map_vmap_lifecycle_hashDurationMs_$Store{environment=\"$network\"}", "instant": false, "legendFormat": "{{node}}", "range": true, @@ -813,7 +840,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -821,11 +848,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -857,8 +884,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -893,10 +919,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "virtual_map_vmap_lifecycle_flushDurationMs_$Store{environment=\"$Environment\"}", + "expr": "virtual_map_vmap_lifecycle_flushDurationMs_$Store{environment=\"$network\"}", "instant": false, "legendFormat": "{{node}}", "range": true, @@ -909,7 +935,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "description": "", "fieldConfig": { @@ -918,11 +944,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -954,8 +980,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -990,10 +1015,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "virtual_map_vmap_lifecycle_flushBackpressureMs_$Store{environment=\"$Environment\"}", + "expr": "virtual_map_vmap_lifecycle_flushBackpressureMs_$Store{environment=\"$network\"}", "instant": false, "legendFormat": "{{node}}", "range": true, @@ -1006,7 +1031,7 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "fieldConfig": { "defaults": { @@ -1014,11 +1039,11 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "axisShow": false, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, @@ -1050,8 +1075,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1086,10 +1110,10 @@ { "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "editorMode": "code", - "expr": "virtual_map_vmap_lifecycle_familySizeBackpressureMs_$Store{environment=\"$Environment\"}", + "expr": "virtual_map_vmap_lifecycle_familySizeBackpressureMs_$Store{environment=\"$network\"}", "instant": false, "legendFormat": "{{node}}", "range": true, @@ -1101,7 +1125,7 @@ } ], "refresh": "", - "schemaVersion": 38, + "schemaVersion": 39, "tags": [ "Platform", "PlatformData" @@ -1109,21 +1133,17 @@ "templating": { "list": [ { - "current": { - "selected": true, - "text": "performance", - "value": "performance" - }, + "current": {}, "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "definition": "label_values(environment)", "hide": 0, "includeAll": false, "label": "Network", "multi": false, - "name": "Environment", + "name": "network", "options": [], "query": { "qryType": 1, @@ -1137,14 +1157,10 @@ "type": "query" }, { - "current": { - "selected": true, - "text": "accountStore", - "value": "accountStore" - }, + "current": {}, "datasource": { "type": "prometheus", - "uid": "grafanacloud-prom" + "uid": "${DS_GRAFANACLOUD-SWIRLDSLABSPREPRODUCTION-PROM}" }, "definition": "metrics(virtual_map_vmap_size.*)", "hide": 0, @@ -1167,13 +1183,13 @@ ] }, "time": { - "from": "now-24h", + "from": "now-6h", "to": "now" }, "timepicker": {}, "timezone": "", "title": "VirtualMap", "uid": "d4dfeec8-23dc-48b9-931a-71e07a963ffc", - "version": 13, + "version": 19, "weekStart": "" } \ No newline at end of file From ee4af5fbef512b8283151ebfd9961dac26cc131c Mon Sep 17 00:00:00 2001 From: Kelly Greco <82919061+poulok@users.noreply.github.com> Date: Mon, 11 Dec 2023 07:55:14 -0600 Subject: [PATCH 03/13] chore: Add platform-base as code owners to two platform modules (#10324) Signed-off-by: Kelly Greco --- .github/CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d3d47e5bd24f..deb443717115 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -59,8 +59,8 @@ /platform-sdk/swirlds-platform-core/ @hashgraph/platform-hashgraph /platform-sdk/swirlds-sign-tool/ @hashgraph/platform-hashgraph /platform-sdk/swirlds-unit-tests/common/ @hashgraph/platform-hashgraph @hashgraph/platform-base -/platform-sdk/swirlds-unit-tests/core/ @hashgraph/platform-hashgraph -/platform-sdk/swirlds-unit-tests/structures/ @hashgraph/platform-data @hashgraph/platform-architects +/platform-sdk/swirlds-unit-tests/core/ @hashgraph/platform-hashgraph @hashgraph/platform-base +/platform-sdk/swirlds-unit-tests/structures/ @hashgraph/platform-data @hashgraph/platform-architects @hashgraph/platform-base /platform-sdk/swirlds-virtualmap/ @hashgraph/platform-data @hashgraph/platform-architects /platform-sdk/**/module-info.java @hashgraph/platform-hashgraph @hashgraph/platform-base @hashgraph/release-engineering @hashgraph/release-engineering-managers From 3aca01eea3a6fa0cbd0e0af3d3f38d24061f05c2 Mon Sep 17 00:00:00 2001 From: Cody Littley <56973212+cody-littley@users.noreply.github.com> Date: Mon, 11 Dec 2023 08:46:24 -0600 Subject: [PATCH 04/13] chore: remove platform version (#10397) Signed-off-by: Cody Littley --- .../version/bad-version-descriptor.jar | Bin 534507 -> 0 bytes .../platform/version/bad.git.properties | 3 - .../version/example-version-descriptor.jar | Bin 534741 -> 0 bytes .../resources/platform/version/git.properties | 4 - .../gossip/chatter/ChatterGossip.java | 4 - .../platform/gossip/sync/SyncGossip.java | 4 - .../platform/gui/internal/SwirldMenu.java | 117 +++--- .../platform/system/PlatformVersion.java | 344 ------------------ 8 files changed, 45 insertions(+), 431 deletions(-) delete mode 100644 platform-sdk/swirlds-common/src/test/resources/platform/version/bad-version-descriptor.jar delete mode 100644 platform-sdk/swirlds-common/src/test/resources/platform/version/bad.git.properties delete mode 100644 platform-sdk/swirlds-common/src/test/resources/platform/version/example-version-descriptor.jar delete mode 100644 platform-sdk/swirlds-common/src/test/resources/platform/version/git.properties delete mode 100644 platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/system/PlatformVersion.java diff --git a/platform-sdk/swirlds-common/src/test/resources/platform/version/bad-version-descriptor.jar b/platform-sdk/swirlds-common/src/test/resources/platform/version/bad-version-descriptor.jar deleted file mode 100644 index e6a515b8b719a650f464cc0a9a33daff54a81cd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534507 zcmb4rWmsfOmMu`YJBbzU?(XjHnz*}b;qIojjo|*i< z$jl!RCnERWXGN^N*GWa0PvGbvAkfetARt7PIY#51ydU3qJ{md*IEb8>st}!&yf}lL zki3+*n2IXBocP-)2*{1x_?WB=9sLY~3?234_*A_z<2=juPbcb$ajBU*>5)YQdPzA* z*vuOzh!XOH!eULTWb~BcYo{wGP!PqB8DT$W{Fvfn#y{Tw;|25a<^Rw4-*-d$&)sZ+ zZl-n&|9xlN|JvEu-j?3k-O|a%#QEP0r2h8<|9%0wkBiyb|G9vFm@yKEpjqT&ywpeI z{6AgC;bUzMPWBF_PA-Yv|%VP^u-YA9a*3LZ`S_D!nEjI9Nob|K+fSnK$!l| z3-hqGDNenDArvg79&rnwqOZuPlu&9ih`Dft!whtO`x3u|8J}|C=dQs1$Tq>= zuT*7qq|T3qfi=RI*dZ|>D|ON(Vy6rEnUP$?DT&VXIf*yFMry28x}?yDO0k05#8TAx zmIS86CF1rnRQNK@35P^x1U=4)e_UoO#nuFYb}KjmJNmPaGjm|=QyRvX(*S!pADWu= zX?WWygr1un`?&`>js_IN`wmO!o#8-3t1z=Ex3f#^4&WW;>=}Z{4;>A|6_5MgXX+>P zIKEuYCbkx^wO>4Q0l)YKkydmWz=uAs<*}7o@D8XJJQR3~0CfEPgNL|pG2nkqr@V^5 z8&bbV9EZ92pQQ847Qg*~Q-s%V%dJ>BpB}1N1l-K|(+e{)<4YVLYf+Azai#97RTjU% ze{#0r{}yY=ji=3Tb;?IlY2O-P8W6G2djg?Ckt|#S3fUG|%TW_H#k`PdZU~iUZ@f8+ z8GB}^!K{|g2!d`Z0KEHJDafB*?3y)!=yn+>PPWbabGM6)VQhDjG1WxQIR~9IQzhr> zN4kgcp1S>BHXCjXtj`1WY)-#f{S3!f^xNW%F7~e291!0$Q5k2Y(WVMKF)xbb4Pe5_ zDx7eiM7RcuhPd303vV-HNhqH8CuUS^Et@pRjwv^ZQpC`+J`J<-=*}6yI}KImdzGC|_futa zV-Fie?=T$C;Jt7lr`Usw97SQayXyueBXeq}aYwsg%AmSg&O@P}Vk3DX#&_yx<@s-IDHI=|>D#F@y&Qd!%)DEey^ zX;s2C?V>cE#B8d;;j3l$NhX$yFcuL{P<}_*IGw`Zdz?Ta(ESNR7xy&JQNHiZwRi`Z z4m@Z{DIiD*e~@k023Ol?w!C1pzxL>wiR}UoqCT;Q#kc`WuwQWGEk`ZO7%oBY(yQ;p z5bG6%kY?b z1#aP0VDYU!WyjZrwTcdr(6a~V95G$4%a}QdgZm-x5D!Wz=6c<&6UYmP%o-^trm@Do zFX`Y#(0h(G?+QbpmeGN~yKKB&2%8Xe)nKfWBq!xS|3=-(*R_s%T)VpndpAZTIVV`? zTCaMsyD|9h@%;nLKt3?|-vBxM-+TPekdO8+J^vEh?{WErwLn2YV!=Q_sQ!9@kdd>C z6VTX266kCJG_o=Mh!3E%bBL0XOrIe--&VHHWQv(38J{Z2H1;pHnqcUBsIsuW2Ycru z6T8}pe1A1XaK775&q_1D4-%0_!hYp?UvM4jcfH*GzJl3?cSS&TqBgQ4K6|dLmfrX`J#TPq*4@HZudYp-R^|L|w92VeeHzf5VXFqaC z#O{SYh?jJ@W=XHdEx+W2v;n-e$|z=M+h6&>1LdA7xlMmtUtzEbcS8<0#qP+Vdx%6~ zUrR|oRDax|#p3O?$rjReyO`?NtOfmA#?ckSh6SxLhd2DHEoTJY!z@~b+TkHV)TiN> z+i_HY`f<_^mAP7{;A8Py1|_$|d(a6VD3%r6d8|>=WU&}x#jt3-O0?M$S=Ab$1R&bN z_&`3Tm*)+}$<4T+RMa4WqaS%SkOs{?oDP!8%)0jx(=t{$Y&AKB3tClH54%ZaViM_( z;P}TDryl^LpZMXIk&pJr7WYSR{DoFi{XK z?(CQNAt51kAnn{B$;Bam?Z4{&-n|~r&rUY-CFJ1{P}r(%Al>4k=;mZ&qM}$}5MUrJ zpzP*lVaUk|2uTnkq^YG<5};sW(AyHAqG4+d&IyP~5W*vh%+E>)V8i}lW@5NF4R36+ z4Liv|CoS(f1}-(STPKNRf-|l9jh@g9f;$bxf`#W3RQNy-3~2_S&){n4X z_&7n)|Md?PvA1)!w=pIC`=^SFlPS>l&tDg#cIu3#hW@UX=(bi9lBxV{IbSlN0W>fY z8d91-8AnowkPW)DM$T@{mZRPDp}3I$Dq_?f3QvGDw%}_3m)z8+Ua>nS2J^Oh;OGcD21?Hn*q<`Co-2 zX#uKq%jAL=ddt9VEwqgz6bpkg$+TgB-xWcwq}2XV>ejgpUHt&X*o3g6jtm&9;b5_&BIG!-xThPbR-mA{=HGynV? zVZk5e_z8`i+%a{;;M0(saoP2(hFhoXeYC^3h&g!7;@rf_?X994-fg~LYLQ~7|X8) z-@5$5iiV*Ia@wjQz5}`v+AM|j?gIZU%Q9A`PpKtjr7{rtm8!XiM75g8h2x!W#gN55$G~(;hoTPby;IgvrtCVmO%rbH#H~BW$@uhQx z|I9NIs2R1VJmEQD=*+?&y+h(-vmMI6{}uX{KX%G3tph>}sow2eqAKwE)ihvDp~(|p zlZD%?RZIf1Q)^0xl7SuY$(l-@j$st?attAK(+Z6wb#LE>Y>w_x_EH*UTx8I-NT4qO zMH2J-uQD*~7OI*xhrKM*TYLv zH}UK{uJ%P}x@T8b#7x>Q*p^vKY_CwnmYzdxnVFC-S#?B*!E?o#K^J%8Rh61echJ$s zn|Jtn|0K1(B!7=SA+Ew_1@+qRFBEukgGixcMi>l8x1@Vv1WMg|!-5K=KGym^-%6K8 za;fD_PBBLa%IFl-9Lq66d@$70nIeDFrv#j zlTYlOkj>7J3yjm=QrCW=x3aFvFG8Xb?jMwHyjWa)IJFjdFcxU;HduRaWziBreXMc5 z;Csk^_uO<&Y<_=v&H}L;*g91VkcLykStwOnj=!N`-f6%^zXpcBz-*1VJn0`{;f1UY zXGCy+8dBFxJ zFX}6G>hD?EgsUO7?aQdkuye? z(4sWGqVL{@V)b%wsz3cA?0Y|pySEZQ$Y@u>^JByI@Ei~BH9t*5Gf96OpQcS@Z!f>- z*+StWp)>Fj2EqGt-WpOipjS9H*MPi)D%!B#N1SbtvATvjdDpF&;&)Hw1vuTJ0MoIz zJZcmQ-cpN7;i6(>69xtENF`c$;X0C(k~gaFS1CR6XRvx05llc%44f^m)rl4k{8wpo zSdBuZAIW`Q)N6aus{_LGYL_C1(}ifu38&tPA)B0>EI1UToUY#7FGzT6OIuPH52SiS z9(8L-7UqlmyFE@LpFGrw`Z_I;`pDI}DQ7^_1KLmLb|Y z#nXf;e|EYm9W=h?T!fs|6QhV`@a|kzu*CSf=pp=B?XDp!ZcuEW1?Ovuc3NVxIl1oF zxyKHNGHfnir9GJg7vab5{42Gcw9)ZrE;O_}fugI1SUil4@DOd zNQRuj_UyP`Cec~GYB}V%1lKE{m>-|}v?8vC5PJ(p2JIR;=5Kv9E2ucRzA3C4ZOawe z4M)R^;E@O_EN8TUs?J6;Qe!<=E`5@&Ee-_hJs48`g-)Qy8^1`;5v!Th_n92yTa9n4 zT}!qJ!=6+UFH0a!D(p;r!tPNinq&g=x=&9neq(`67L22neie>cAtbR|3%~bli}eo2 zSws|Y&+Au22}TrmhEAd+G1e%yRhM$$u9P1ucI-`%*NjJDF=#hnKif_NeqQQ}J-RwI z|M1f4q2yrt2YEzkt}qPCLnEhR(4f=Se9d}1ObS_Go@}Xzf3i`RH>g*qprK$`g3KsX zOlNDzdfXe^=?ZOtv)FC^F~?V^;kdER4oB9FT8Uas4ZN#p=GzDb zd}7j+uiH=$q|qT!B|I(8vvp2KE-|ZJP^2)`&=Urz6r)8-vaRd%QT$X?>kFz&y&P83 zav$Gyd}B{_VCLc<*}{^3ti!{NaEolq#WsTO_5+=A^!Ezqn3~B+1JpRnN)}0NC&?l^ zWS5OH((z;rXVr$@)#duz>5cWaLqOPs4GFaQ+yYUXcj)m%K(J8EIB67&BKLqeQ`at# z?t8qaM+oa<0=wt^1`Yymy-W`ZykGoxgkEuxsNj$))I3D1`U_4Vd5i6O_sTyhl>X){ z3+0L|bl~2-r3fKu|GHg5i@5ST`lm9`O`s%Ky8Z>iQqAl^<~0)H$r`pwV&L7vBPIkE z&R)s3p18+<9&xur&R{ol3N^~2G)6vw;>A|nP z^X9=W%;O7~x+KD8Nq*=j>HM9J!jw~_LfL&EyBQs?+;V-weap5>VtjAQfYH>tQOsAw z?htUW6@vcFiO5-=b?3;k$pwA(b_j z=p3QVqz=30l*?w)Xw9PE^hAb1gB0<7kdR}a&4 zO*rWG3q(pf6p_J;OMagTPyJP8;W{#%Ijq%pLrgNak|KapHNU0Vbdgj+vS5p+al=@t zbr1%>#M!%(A`%g0E`g>BkI>qRsdxX>x zxK3SdiWot2d~)qu0R(MtD7|t!t6;iOuOk&aWd5*4>jjAsL@M^N$SB*$jmQB+w_~$q znwhu1rHKBKC!jzs0w8_Z_wA#x{I!jx?A(AhmL@8e=60qgDlR}5Q&~%A7gIY^r@wRQ zgj)H2M&!^bI?`$SO4&-r2EQ-ic?sH7YT)6Ldd#g?MNW>BiNC<_762X~pJ8``10aZb z*ZsMFzqveL?A`pr2RR3R?ho$GXGU=UK5BLBafBUv(BPfug= zW|9pPOLF=VhM(x}voQv^=#?Db7re)!O%-H+|7>Au(h2@YY3Cikb z(YuF-T$-Z0`oP2+QwKAi-X{{JC}-+q0pulraLpm@fRT$vMp>nwKTW zI}g_aj{`9TzYX`#F-%bdn412u?deCJjPS4RE9dI+k9*oxNzQ&w5ZU*%#gRX|xKNQ0 z{gR1JSxzAZT1?VMG6j{BH1f;Zpw=v16Nk1vAp+_Ev8@C_wxQ?8mcq^}2lq zdry(S2=4v~9G|n~WYjL6JD(ix=k9+KXhXjsW~zT)$p>P~+`Nr2Yl?ir<)_!Gy7tYG zzUk>FKYmN_$aNo3Oj)rqdPvAbX7y&qm^v8IJlfgKUr<4blhBnp#S&VYCI&QlzZ)2( zLT9bu=iO z+L!{J{}B+r@j41L6$XHB1OV1ALh?zjdif$wrbVv!1NE@Fe&Cl4aq+ z=#Jd##rg`LdDKoY>S5NVjT&>~VCOt}q3iehdX3OyT!=6aI4Afz%DjLEY)R2B+NZQt zxgMI;W|E~ER3U-wl{rM16t#Q6MBbGS_6meX2))ydtH0LGG}1IPiEA8<^?@Nk4+M_n z;`qM3?w9s4R@%8uJ@VvY=*HCLvMI;hH$NldQfLbHA&)ubezvjejHr>^dn-ut_!<>~ z+f`Uh(FdIp6`M=_a`qq*jhTw3>sr4^AVu~o37Q6e>;_x^c>s`arM6W+h3s}aZ9APJ z-H{#()rU9bX65cW8O6^r`=rL$;35|qbMB8+Hx&_pN)2*dpshoPO5wvrnifiHS2DP z(CK0(?yI~8727ayZl9n>p1(XsA|(HXisRt{Gur`fsT!{V?Q=eQ50ME^5bq;)de=Fn z`F!pWFhrLK$qnuy-Hzw6zgk%-%zes!j_k6bQOlm;{+k!K`(JXFiY$dnLm#e}g8%^` z{cHDs;H#61tAnbg?cej|DJs@~_@7S%ZjD}s>L*nsy66ffP|c_L%cFGo9g2+AWzdKl z&tk|gyZW3+0XSAr;)v&oA6q8T?u&G)gruy;n;AS0+1>}6Jl$_Tzab4lkyKp>^9jrI z(DdL(TyF|2Ig54J^i!8w$pCHFP1aFjq2aky11KW80p)qPIQ?Q{71%LyYwpwtL5plt zY>|DpV)b2COPnI^1-=|Q&_`K)Zj`HynO#$Q!1TU~mDF0i^rcrmithu?)Tl>l@$=JR z=pqJRFhor%TSQM2o5D|Rnc+_|`f5c2kqi}k<3oYbjN{ovY$8Z{#dgm=D^=)RWSNU_ z5;RFX=OY~{QW9+0LlCGMDZ>G&E%$;DSlEL|8#J-~6~!V&Xs;s_QA;7eTA2#5L;Jys ze{RfHQ_Ql>ZEa&<7^f%8wUb_KrRGuktW_N_lci|8YV~7iwS!Apo<_mqV?$^mu(XWE zbJK3_72A)l!%JsG$xT|`N!wRcZ#T9bX2sUx&^wiUZsI5&z;`i|x8jJkuurM|fy}U~ zwuCPCHS_9{);LK3h>qzDKO>Ga(=?2?EYLhde&p7+6)8vQs@IOO z5UvD?^Xh)o@0H_52_^jvEqK~cskHHGy)rD~xr_x>y+O)bvY)Z=t0rft=B88MVJT*3 zvHev^Q=wE7ReF-7Zppp-G_E-y#XjYXZPhitJE`k-dBi!0_r?T!W%7)E*$tUl!GH}U zjwBLhy)fmT0lL{C%LdOK5!ywR(0|pO(gul-=g7YvpOk-pBtDon&jKJa&m$}~s3iPr zdmV{1*VI4XoWR(+>`G78XUcBIl5|@#0Tx-hNH1_cIzBX&97Ae-fNyo9#2@~QLmWLa zk|fM0-I{q?Q2U-y4D5li)AieT8pT@C;gBF)xkkH&xB#}Ms1*jqrZ~dEqjrF*_3^)) zI!ptS*}Xq*fXI(V^w&3nnw_PitErU9pJ$AJR3qg7R*g9RFVzSER)+c-)&-W3zpg%f z)ExL4f3Sok1ZauOB_#yVaCSFPaxKuYP^2UTU=?d16~@FQfR;vrf&&7?Ynf{TG~v$# z6C(mX{TrbM_Fu2u$j1KfmAHQ#v#^YwZ<#-U|JO(3_;n~9Rj@&kRvI~qb`nkSg&e^M7%KWV$6fdjgmoqU{IGSKqbK$`<`=< zJl)ZJV?+Ctz~PD+3^f4Cd9K*@y4bcpM4tDK1t*M*O;SHA$I#7c<=dNd|r57&gv=b{jX;$K-71?<6MKA z*~gtlvJMho?F=fevxdeLLN@pG_5P4FK8dtoW>2;<@h3&G#|tOpY!&zW9yKUimcgLN z5@WU+J(z!RJ{Yy9#PU-N6qe1y6`{y?%D{-_duw>ZrElep}l0cXBN^Gf;@l4PHGfqoU=<30B%!no0 zt9$@|t82y=ff`_+-LkCsUjIZRAH=0|f7NI~rs^&Ao(e5SUx+lmvm%)y<%4a~8f>^C zX!(c;FMiYlC2zsVkLn|2tU)w0Ich%cOv%i_c&rL4&4V2!@MM3y^v_%c@zkp1d9`*je9 zCl-C4VEQn2a$cwERO6?o!v=TU^Ix$hH1mK(v6z*_5ojhZ;^Vep=RzdX^cw;9tM{)9 zMT_~bi|z_J+>Kb%HR_pgt?G`n3Drv|!cccV{lHS@@PrH`Y~xfnz7?S91><1jBz6ry zf!Uy@bD+Q{m@wCQJCU~3Xh{GzTsTbA_oe#kWA2Yyz|&yS5$sqX-5UnOw2Q730%mA5 zZcmQ-O~D|7B3iH`236QG$zBs(N({ak;e2ZJJ+UF?hGZPRn?cVDM!=P`N5SlgA8Upk z&oJ{0yIm4tW>bFX8Y0GIn>CRgg5Cui=nq|?#)cjUi>9G#Cn{qsH!e}7%m+h@Lv6n= zpL6M*Pnd*`kc8oTr}po%8t`@>zc%8io^@!9wRWiLxwbT7&9sosh^|jiHC~n!C#gMB zO9)7x`OHLuJ9l8Q3Qt4Du!AvDYH4x`Jr7k3=bZ_UTU)hKKGAvI29Sbv^L62}QlIQlY$DRXc*g%%vK>LH{o>tXF%)&|R&! zlsfEDR|Y_7PMJUIFh2MB4?VEVhC(0XL`10(KJN1YUl$$eLUZYPBC&^44-lm5y0s|0 z2jNCvA_OG3Y?h=4Q=krQqVyeL1pTHnR3bgWEHwMuDtkj{|L;7v#P!thl5xrPvxpzF z=o2S4oekZtHwTM!zjqWF7`nU2=kd?C8r+=yODopMNYbSzvuF1~tKn=B-5;DYe>=Ev zerB4J(yqu-iq)Oj*jS$(Z?TYpcT^e)wOBurj)Mn`*uj0b7cpW)J&l-#iv1fQ#6iN`WPa0n1YSd@oeHfUa&~4} zG0jnoyuJO2n(>o2iB?8|gJH9!N$$E^M&)iXU&HNL0EH2R4wLZ^EbkM*^4juBAq}jx z+w2Ftmd>zodVWtSxia|)2yR&p!(3a!?0yz&)xc&nGmqGeYF0`z0=Z*v1{hW1NX82_ z-La)v;sKx1m;s$tig9WQJB&WLs4JClgL-C$d>m!+}F45g&O^ zalcJ8N|iGQUyA|~A}W!=!+_kBolFr_Fa2ckEP*hLy3VmtX3PP;jNW35jj@tkhcQ;M z6?hfuUtws+``>849C=$V-dV?sOUb7tF!LZ};CejVDe~HpE+pVOrRSh9eN`|81xLJ` z$&Qjx8hSGxH}G5zq2`@bFzblD4$|7A;CvHLePbL_FdIpFt(jKyRS(Vfm%c-~>gQIt z)2b><9l+KRaMj$pd9jRLti!P3>)o5qH69AFFK_0H+gjTZho7n`(UE?{M6BmaWVxZ$ zvAkZ>C6RkesxXN_NhGg8`u1pwZhw`6H*~gifVG)~oi^rJ^9-O4yz6SEa9BOnbbyBo zx``t~hL0_H1EhjiC}86EGsBEk8L~OxZd=7xlYRBx?!UWzgH#vbn0d&mjsAWIu^gwq z9(m`pNqS4z2s0Q;@9m84Uq^vGrouOpBEzK)oYIWd(oUQxID3hAk2J7Dpw9z>BBU+* z2uMUt?eVZz*s@n>UqYy6({i6&W_~Ze7~NIP>MJv|&!ISV82eUQhz5~;TGHEN`;*gu z2!__c-;GP1V)?j~ZU|?kwR2?ep(F7A=TkNL#P=t@^Sq!-wVy9+TWv|3m;7>g+;?%S zOk5W_&A-Tv{gcFrB>ZA_%U=r+=Y&E*E|L9{_+-Tq83PH#z9h6pqqHX4;uc&IKl@=f z7O|Ydw8xHj3EHv2%)3CkZs@gdRWhGAjnJT z;x)?uMCTZ$xS=2UJ*N7|L0z^Kk>s{*TVm_!)@6uqsm&hC09ke47txaop~ZnGL4-1X zusOv^aqdj~BTVCxnvP&3f$wx!-`Q^E)asr7Wu744_SpN|WOD+juauto?+UtV^5!kR z3&PhsKleS)T*DA^Jgi^NV?pWRr?9R-zu^V@Z#edec^rTYdny;U25q@eVHX1{2)t}i zpS0Hq+Cea_Xbh4Iv}B9NTx0^OeEQx8+k7wE{0{7VdVXFiVgEF-=%tluo)Exyk!X&v zbb`{~^o9DJdy7aGpJ z6^L8KY4s*Kd`so(8Fl*7IikPCDhhr&=*R_>Bj4S7|Ag{7VlFYP;ug#*i$&yIPrN^d z)VIf7*|-1c0Z1W#fQk`}lu0SlNI4|DGo*F46jffSN#$fz)GM^kNT!ZcXB5&*j7Eb& z;8+yjEovL{0hxWb<{Oix;J=Dn~zdC*gNkN+cS)k+FQJzYgCI{U@GPeZT6?4oUhgt=J<~ zv`#JZNIbM-OB7Lec`ZBHAVP(=haP=D0jdO|x^O&tu03!!+F#n^<$0V~Xi>vuZ#QK)bx0jwhMm3{p)cMew1#~jepm3BvBNL7A}CFGxtlo;LssHLmw zGc}7eExUKDhN8*@zshNKM$#=Mh6UAiFo9lQ_VER9I@5EfGw#GJp&xWwP&>KT%kB8q z0t4-CrC+zbj&G&0x8OGRT9n)VXgfe@tE8WdEpjx+bYt?$Ox0nf9sf1V?MKwCw9@X76;zH-vOogiXvcr&~}SvWhiTMV;PUQ-n8~*b&5Z z7o~V{2pKufxQsI#^9r1MAn6DtjFB)`JkVB~H^_IF(GE)j-8(B|p=p~{?G;^G0{?#S z68BZTmVJ<;F)|ojvyVW{B0 zC52P?E{xCp|0US;=wg166`Txc_Q~oRGq@p08JOU@? zLycllj#|dn1Ym>Lp^l;6Iiudp-u+IhQ%;gu#$EQ8io?Plqh8N}_*?m8CE}xH#5#$D4%`iMZsO>3ZljhY2wRO7& z^P;E2)jcip_`=I) z|Jf~nlH4LyIeT0&fS+0YWbt{iToU;Yr93LqdHKj@I$JPKImw*VO2OWW=g89=dwEq)#1g=x%bN@TsqY7^=# zac)N_rXvb(tWS8lt`HpSP|q1uk4bKm-A~$oXSVFRJJm64KY%#0!RUZ`{FKY<;MV^Q z5C7I=Io9L*9$T~L`c)vi&{2GYQ&8`?25buLr15HBbc}}TAd3XRt>sKnZ8My19}p>G z#r7JXO#L++{b22+qbd&jp+dm#>0tZ#0#o0VvQzg`c;(Ph7fb0ZLk-*s>I5 zZei%O7z#h!mS2lWuB5VlH$S1k$73soA&hq(sd)~~Hp?p5gbPkQdy{uC^4Z6`MKo>- zr2q7G0tgz_&@Cmv6C{s0a{IO5j@c4#75i645kXJa61}IkMB_CvY{P2Vr_>r*9u=IiE5pV8LaO;$NmzV)~g z>j3JvX2u9&CvdZbeN){z*AE$Bk+z1Ux#bjkKw>0LOJcQhbY78l3t|#4))l)i_BtWm z@6~tVMH7EitI#aXV-f}{FOVDFgD&stQ+LQVcBFQFvd%nXdn-9s7t+^p^HfCss)RzX+gisbhNMgqRHhfP6u z@l1E4q!XJv5{>ZI=xa^wH*Dh@t{W!(m+sb@mu1=Y8GZMwfX(KzAoLXo)mu4AOH2Zz z^S?a;@Q<`&-Frz0_XifEeqgci|Kg^XwYM|>AHX<4;SVq#*i!r!E{6QRtA=#adqS;zR_(6~kPdju>VmKqY< zJWNiAPcm_e7diQi@Bmldrh-c%67=Mi)KR|B(U2L{N1d)ng{DOxhc17yT1u397!?(lPx?cNE zbflSsr5EOJL2|`GcE_uIZX@_-Oi`fpOD~*{;QtKATWqJCUq9g3=>v}0{_mdo|9I@Y zCJOLdOsM>!w%Q;koJhqQf}X9AFiS4DURXAV+Acqf&C+$-Q~3*DM<_MAftt$P4+@GN zj}nR#JyaxYXE@}&XX*%^;G$ZTdObNq9&y#T@nY$w>!SW;%|Ji^!U3%j%n49uxXhSf z4&d2GYTa|}-os->5|d%xm#MxOl?%<=^(puQjMk)F=KPekbLM=bz3mPV=Uv5Fj|yq} zj_H7TNE^Mv83zZyq%AZR!S62e9iNNz0cNTsVT4z(VuzJM+G=DA(AVPoW{rfCK$Z znxrql7TvY#C4sUt#v1B=3$9C&5#NlaHA*Pk)yV~2gR`N|VrYQ_xj1?H`9RDE9A1|N ze=m#SYFwtuMg7`I1jxC&wcT(*RRHZyMDAq-xpB~4LfufDo9mrdaNzaN&&by-z_SG7%ZXrY%ITvicXg-mEu((qWW8~X-aoQsMvwvISQ81J5=k%76+R7ZnU z`O}=A$9ks;Lm1sK=)EPblDvu;({or%dsbi59S`^e4Z;+e!zWEvx2KLOCv@ zy6dssUxDUVQ9_;Ub%pQeD!PzAFJo+B<(Y*UCFOLwvL>`-U zUnYC5UyMxBfdW8}qa+4KCIZV`p#8mQpzG-cDaA;#B%R3IFk;cv3q=FERzxz5YNA}e zT`Chrx>3|TRXPz&aW-2j*w z5KJ#M_p(j?IQUv0U6pyVT?TI*(7qshu{l|u&7AjhxVM0c9(@E)lbolU@)X-ib{Q=u zrho6{S;G~${VM_88G2R#&*}+1|LhCBT0CKUaCvTUVzC1f%lp3&4KyMjfAJ427XH9u z`TxZouVQLrref-3`Jt`x`lH*d=I8s-7JOQDX5=|`H&XO&MnngK^@ zbcCg8I#QRl{yFpUd!;PxE9e{L-nu2wv|yqmgQK3u-fUAqe+wi#UrP)$H_qq_>S*w@ zDsQ+VoHN0Fs0x=f%uh5^RWI?&`+F#U>fp)YN#Tc5R6aMN7Z&Tjye3)s;H+WNGa28d zvbYh7wtZe%ZdzEsIzqqSJF zJWLvr_L~(&^5&J2U~wA>VI**l-N!82Vzi&oOIQ98HYnx3JPP91%BBczex4r5RdFRJ z(rIp$GQKv*+Wv~d(8R_jiExR$8kZ_Ku{$@vJ!CA5K-C7tVqu||X-u$8b&bePNC#(o z;f}Z%w9IrSM?~hAAq^l(jYDQcNWN-)F&ORO?3jC-D z{co7ezwy}L@mk%$9Zd}VU9N7V=@_grUK*K^Qdqf0DVSQ$(z5R>xttCo8MPR&4m*)< z#BO~9WM(f2k3WL{D2V?taKU;1@eJ$o5%gBYW4gUw2F8|>ucXA>+|KO$^}Ms&`$G2J z_TSd4g4!0ullRLkWQz5)i8Kq?c>y zRG+I=UJbip8ZM7r$T@*5Uqr+7gRxL}t_H3hJN6-9>6hJFBeN%$-fo-qie6}5n*&_& zo|6g|ym6V!v8lu zQy^}KrB82#T*Aiacdm2RI;QAdHH;TFQim@)my0LxpU^!*IC#(-6Q#fJ8*zqFuhBiAy@62O5M5V5X zB;dg;J7uFs~4@LXDdv1gkvhf!hXv3~0BUR|PSoh*e8}?Waub1(1M(HrXQoq# z{gNZIp7nhr?7tB)F`9vjO4+A}zuY{>n4|gQHf#k3rhb8YSb1{s$Q_kiM5ZzxL$0t_ zxRefDy!ettDJv%DVeHa8)is#_ZV^4`NT&7y#GzVf4-pq&A?5a!uN@0lK5$9R$+2}~ zcRX+%bTEoc3J#_Pc23R4Xaqr2vx!tC-XYIgsk(XO-$kA5reOjJ7c#IQPFtF`=_uxK zFCosai(=Q#TTENC?%;!~5TDo@(E!)iyS{o2dR8ze3%Ky!rdV@NeY4MqdZTQ$XiIPh zEJ+Ykckx2sR`9yw)Od%TWsoT<>}LmgZ^Gs#@QHX39GXhuTi0W0TD{#LPKTv_@(Ppx@hVF zmDjWgpad(^^E+$Ip@nIxnYgpbnR&23F;TQ7PJz=Er}_UST7YHGuaD?mn0iTT1jZ5kEG9LaC!#D;w{$q$q)Zl!>k!Wn6dfTd=S)YxV3P zj(+>KqUqM}2MygE05m$PazNLkAYFYZN!Q>OYBf{<|0-YZ>-yIFP?T6gt*jA8ObJsk z3xG&ruYp-SIlIU+^z9mbhyA-*jYfr=M0`$SHGJyxJLBKfHGQT(3x{Fv2((c`pBcZ({b zb_7Z@C!`gYOu(+m?8OOVyGy!XfH|%?kTksvjdseD)x99y2D24sY|F0nW>&?&j<7rG6Cs*UYi5>qXr(|?- zHLUQlZ}LO_`KKFyQJ4Sc;eV4x{PA4p->zuyqzJV9yBf7obl?#zMqM^jqY@6V`PT+8Z#}Zr6bTf9Ytnz~O1k2hLv&*N=dWCQn zH-ympj@=VDD)Dms)=|D4{udq-iY3d*7E7{8%^(!qK#MTaf95~s5@j?@C(kn zv&|J^bA(S)v|mkr&l52D=gxKs#=R>9iM8j-$1Mog#|!Xx8C^Gv!^p3&gf89iVPb#F zCWG~2<;8wj@LxA`^g;FYe6FWsxTSkx!t(a9OntCbf}?gRG!K+$HN^nMhNvfbA|MltN3CNB-OW z?Ozn>;EV%VWgl_6@*&{+Z)7}w5vNin;`UCqK$j0q&!6Xn993(TIYnf?<_0;K9ktK- z!~GJZRg%4t&|<2Q7S>Q^mHoqyR1Il3#d2ne4cu?kzXOk=-$4A6_clodb(n)Pkyc)o z`MmGX$h-ag-(j|yBAJPg5|Gu9MY4fMlJ>_LZFY;y?NAaOyUah95at{>0A3CA`d~1j z!P*O$0_FB9%qF)|is-k-Ux3@ZEhZUkkYz6|4lY!N_eyeebhOzgbr z61%9+>vSD1x1;8Q^hR^5dy!pr>%7=^@Ih>&^7>-#{COA%4aXSiQb!JhC431*Yor^* zh*eivsdRP5Ag$2eYVY#sUH4l^bHIXd-Te-^om5Me-~fK;&&Y*gP6GILeOKlNJ56%z zImcgS0}Dteyf-)~VKk{E@jvVV-IajQh5izCfA*M`;G^NV!^?$_I^kxH%0Hx9?D?lA~zR+~dRkU|? zh;Nmr3zY-b1C`Phz<>xep4duiph=|uBadsBle>%^?gGqNdcX~?Fu+z>BB?7@|2o5D z$8W{ft00!FBzNJ#DOd1ilkvEn{g3L>H2;W5QT}kzW$EDMr|groG+3WR!qFOHV}95- zH&%pBS5aro^_~S|_|_o0J7w(6nDMU8iuDX;gDr5{a1E3m%8GWXQH(H?QvJEh?{SJ= zDlsOqpd-LLM-=?zHj(#0!XYzP7bW{qcCizsy3Jr8%ugl&xgAA<>K-iSE%ONFHt``Z zle25{fMv8Xm}vpX?*H2jebf4@TVJOw8|VH`LA3oIW*m6RI}itsA{n-4tbS{pIGXO; z17|(hYEP#vpF4vO68p~1`GA?XZYhDwKIZRb!MX?J9i(j@VK3I@tb_F5=?sI+t+%-_ ze{ZF5ND1OReHQmWpSPU9qLKdptMq>r=)dka5~en`4#xk|^94o9Nqq|0`Zi|g&E8a_ ziF4f!r_y;sA*qmH-l>>iw$0NJ^hZootJ5SqQX%>M2qe?pD)B+-N5|9L`PaRC+I+t> z_WA@OZ1K1npKdrAoA9A)bJ2`F%g?#XEB0I+UI6GzOWe?Nq%cS4g!;smh}*NqIlm#z zLl2acRnJ49)r#o6NeX>*%_)yBEHiFp)4i7tAu^O%Pm=MQSM+HayLC^=oMcEVLj=PL z+2%;oJ^en@GH5iysotZ3T^-A$fZoc_kl}=)mK@yTAMC}-V1S629%!-hN`r$AWG%u^ zT@bvzvDH(2&iT{srpZ9q&*oCOA|1gC*Zw#Eu3wKV0Sw}oFOr`T8h-^&{hzIqRo~s1fj@hJe3KdFXrt3co^&8pbp-nB0CHdyYJE zJu~t3a}6G{oWw*PwW;duGxXQ*33WFDPi)D`C}M?^KfEFAQSo7YlYVqWjH>n>GuIkKAL6RykuZzN-g&Ce1Q~E~Nk^G};-O1Ipml&kK z$XLU@Wm%IJflj~2R?G#`0E}+y^8HcXu$f;2imX`=;+VB`whE>sE<}PCy%Cg&#Xzk* zD{Jf7#54o9yyp&k{;(0m5~2V_BBTX`WZ48^pcMD;2RF78fI90SsIinOhS76WR?2lR z3&(jiFzx6?8nYJjXPb|3CI1@de4*4{npNkuUY_K&CU{BpV1|XQauV~t3SL^3C?kV` zaTV53NMm-6gU4RYUU-jBNtCsjesXm+MZAla0i`pVKIgKN)c}IOrs(%6)|WCu+qp@4 zwd5f07A!#IpKa~HjKkR~sW}-s1G+S97g!Y_$=hB3uPq$L4DBCMCzdBG-BtTtIoX_M zK!ZZxnaT-Vh4T5yu~;?}?E?W)ukWFgc4?daur$?F=k%-ef2su!?jkuiaBxDBgImQ0 z(}=Av=}GJ!^eUnjx+>SEEyVJ~Iyl<{IFRgmAUnP)iW5AuJO|5kzE5F9!C{YPIIDxY zt<27GkmW;yK&*QQ99uCCZgat^;DbBE5tCA07aiJgeR6J7;awKdu%~3&8NuB;S=zg; z2_s3ONi&f?70rLH5ilWTp674HA_Zp(E$-QAZ#-!rN4J2+Q^jaHkQVD*Zh-wW*0wA8 zO@Y-?c^Gjg5kcFr5e-G?mPsBQlFDB$!}OK9WT-cqK*N(w#e){UAZM zVfs0dx#JA3^$_+c_Nq&CM-HqC_mnbLI&jw##ML}Xaz51~C1As$8_jw@9Cp}DV4b?h zSwwS1^}!j}y1%P}F+^7-KYqHOfM-JQMZYJYRdqmjvmFkcyrBuMqhk&5I%R*hq5mu4 zH|)j26^PfQN@qD%z~kPZMf4hhLp`?+^$m;uuifu-;3$^s3c=-w1pVRwFQtJuj#wsi z=OD0BRricFZZ_zBqpm)%$7Epi$)glcGA<%{*a;7h2tyO(jE#ycz)8V+4k66r^TKf{ zf#(|}2c0-J$m}xKE-;wIL}Z;+$|*zahE2iNEPvi_dZ`YdHFM>TYpR^(0JerzqgC1H zz!gr=iQ()eQ8oKK_6rO8ag`(V^H-=3s9q{}&7s_{C?{)0@Ch%C{Ae^|d^>+hU;*!o zSGLQo$GDxe-};#Qz=_nW{P`0@+X;pQTg;g!YzA~9Ki(zL85_w`tRi{!CQ6JtH~Q$Y zIkhU>DnO>kDF;>#>X;31G08y4a-Zhr@@IQ^f!2T z;XU7q`lP?joRdbOP{Ht0gR>XphO;cV;hdjrirU1Pc;vC!y*D0z=QpZ3C$5E7tAiwb zcAvnGsmq39qp1*Q46Qi8E2$x}1P-we_2M#aWWUTsj=#Xu`Ey_Ysw^6g2kB)fYl?Vq{`z@0hyMe2q$= zmBcBu3t+BVi|GGZyvG;)F?AUbg>e-;q{S~b!O074#FC0_UiPGKU4NtpQ>UC=T9b~$ zP*k%zQkpiSXz7+P#KoF{Q?XeZ<@i{``h@9Y8mPhL>?n0Fn+f+o%Dz$uA0ksUzs$>qm zjq(=s&%)-n4(}J^%e1n1LVo{wPi) z9XUkOnnDcnm@D3u(3DKyuoPKh|1gYElBgqRZJw3P$o49wj_Cz_MGJc(8H9d-R#B4m zF-vJIszUwcp{+7Z&8nV!ToB0qB1M?Gb1*sHUWD4Ll611`!P*K$XuxLL@H-Ayv?YPr z`>I|t#HEd`go+_+&OU&sdTd9--z_7W@Ygb~dwU3CXY}TNwAO`L}z`0-!D5 zs$!Rx|LA@+&dYNpTSOa^UE_=dSm?#t%lGTZCn_*1MmuSw8(t;@9v-7P>-_MPG!C@K z{A-`E3xz569Rv_9o!p5*R=cze#Mlq1wjLsb&ztEte^>pLcYe`6@#?nhn8nm7Z?V)Q zoBk8A2sN;2Yu%e=I6?wZg}Ge_(W!U5wX`hUoVPbnLE-1<$Q}!Bhk65~IxmKtW1;*` ztTU=QV_&FP+jq%|?4YWA7ZC+uU%&xGrx{fWMa5h{jJOk4g^|*wHFfe<{Z$zQ#l4|UP({uhU*Z)%rNwW1`H_Ki2(_OGUBf_4%;r?r-RLF$T$-5<18zW5=q4KvUfh0@C}u;PJ&@$|&Qlr?*3* zOD@h|GsKs|*Ry?B<*xkH_HGXICZu;+{@G86OP~qc_JDGk);jXY%4U})5=uS zmAyZVDT-$Y*u)bcCCc(k%geC@=P2F4Eefa?V4^xl!ks057uL^QIxWn_7`;(hVRjW7 z9{Acjq-VCNffJ~7_EO)fdw7`d5+6^?>I|>WO%rAKIoC-wV-Du`qbHme_9XO+4psr$ z&y{K8cqQQ^JZS4K>}T7f=;gcU{v;v+qJuW9o5+Roa?KGbD{`hQWT-h z;Tjv&860A|Gedx+ooT~eubEpNs3j5^2h|DDOoMasUFg5E8HSg&wx%)t!1w%<${_{R zc5hP_V630@0ppI&&cBB~#T5Km^PZ<>cm`!Tga?Tn;_7suOi^)d$<+*NfsBdYg@an7*f_GS%p1mjVDKQJ z(FQegR7!85*|T_V|2hS1di5j-yW)%AdCPw$JmM1?{uXmCsDQ5@z~@Kq6`{f(sO^UN zmCqlMFH(Qmk%8~$!**OgpX@P%8lU#WDqTNulZ=j3(;g*7yY269Cn+MXgE};z--b?- z4G1TA$7i$`$;GJ8RER!!5(bU8&65j$P)tqUQQPTk1(h66WY)~j)GQWWJHnyZ+_kOu zgWo9Uart%3CUmwrEw(|oS~d*FJk-r8^9Ov3+%yCI#=1L~;M42`ZOh{hjVrYYo5^!x z0ZxH^&HDsRiu|ZS^K-!@XxpCK%~|&HSn1M2PHl22Kf(dI7^LR$p~Oi%Ad0U~1iO#f zD>9K+Y?psr10cDOxs_?_xWGOYVap^U#|+V7*i@bIB`ti;O~E6@O~)ig?zOf$RCzF- zZ`&K?>{M0srzbD7z(XcWBL6 zA01{Qtox}M0z$ph(-+(WnPEJAXNTYE=(_fwx&j(eSpurH_XH& z^u+Z80rI0L=!Z1vQ?p|UH}c~GTXSh;RMhjtn#g~9G!iy~E7N3n}Q?>SH;q;B&vGZ(<_z0DZmQ-WLaSwtJ|li` zGjT-6Fs%@Zg0pe!O91x5jIbQhm3CK;i}`>!VC=5Pr+4beDPJoV*K!ueD+CviC_Mcs z{UT=Uj1cvExiH8pC4szRcDxDTULae@$t<~QA>d@v3O^p9Dvf0sRhYtt^wij@rym97`VN5==&ijsJ;{cbcIcO?SNKo!}<8 zAgHkYGG3+J3Che?ExN16q;&p7;tGoYG(Hzcfsc$O4mY0?VKi;@2ft|}z$Mpcmp!Tl zSY`Ib9k`6!CtbiIfA#ADRM46&5tF`^!|7JOIJ*KbtcN3)Y&ul3trsd|-pYl-OJeC} zbicZ+kpWY(Jfhbc`#$g(lT3Iik{92pDV977y=F+j0x0#6)eaAo{^PxKebNf&LRq`d z_q4~8X`xZ#$l#wd8Kt-vYH7~q`q*$#B)IuyzkQ66r41W143(9N9j!!#z`rfxgJFi} zhi#k#Bn_&yv=XJhvvgG@keLaNhTnLNP?$h(;h2JCkzc=Mww4`uCTFC}h?77y+Rs&- zZ(?ND%+CKePKf6#38Ba5v-0}vOtbw@o|pJvQ5>JC9RKKv{Fh-iLGd540q;QcM0({) zEz}=cO0}YAxfKv3MMzR?dTI*7Zj3W7e}wO+N5_f#AMaXTQHQZ$*ZT?XBRLO>m!<@v9sE`vpQUBtSAfiJ)KVY>`Xm&cSg-? z=}36(=#T*E6t%d%y4ab9FGVc|+iWKAt3y5AxIK>$o&wx+5~bR}f^Byo-oYudiX=vP zoWCbr_}FAa-ZusJvcbX{g0K0{=sh}T)~Xi|EJh{zQj8H?%!nsd8;BM(5=N99`f;Al zFRGfpQfes4>~2H(h1{EM&(sb-!X-ZZLPXc&({FPpGUwdi!fE@BZF-?cTNyJ z1lOZC@{KQQ*8vji6eHwg-@no0`g=?C+>iz<902ftjk=;-B8pCP##c^)*>-(5tkKm+ zEjRKt(Br-V%Ucm|bP4HZmu?Dfyt@yq^P?TYnuhJ=6~6IZRnB_lJG5m_SH@d4?6!O07SaRGS}BePw>??jFRQgjT@LPlmrOEV9U zpnw~x@L0t)W=91qEYd2hLP+M|zii<@|FVUf)coBR{%;}XAsuGG&Zpdu{4%NKIawY%UBd~kYYQncjC?-b;x?SX44+lmKSqN zj{NuMYaQ=Cj!>JLr-LCx^h7y&P(5%c6So*1L;E^MS0vVJ)0%W+Qu69N}TbuYvoDLD)GwOvczP9D!+i;l?EJR3MZyBbrxmFV`)(`-&*#Xtb1l2X!-PR zLXTJh1Mcg5dYENb-ZT3Tqb6|#N89eojr_=unfin9T!rVPOvAsM*ZkkU&&Ds`DQ_Wr`^WF|dXU14leHf(&xcS*X? zT)mV8)k(bKEF>GHY>Z%ts^8VdCG(?Y9DRthJ>wJ(wa^!x7ITHO~FB|8XJs)4O{k(?6K-j)`XqV$9* zWWyC(Ur*0P&l&Dp?k=@k?!3{9TidiWsdd8xQ!b5?WrxfTZNg>0 z&ygfKHPqt|*IGLiG~YS7KlKmKhyufxxoL<=(GJ*QI3?} zy@;uai^-}K2hEiD)6VwsT^oLy2pp(8!mTY&X|wzyG48fZ?$wxocV!`pMzLNXjvW=~ z$gc6uZdol9X0?}9%qthn!E?_3kjMIU@osPlHbF{2ri57t31`K%4xFjC9AJdzSGbpz zPm`^)2J}u{^zd->DOJ(xER?MPyEMxTQ6a2Ca0ddsMwEY_VSDw!O}ihp(rUwg$BGZL zc2p(&<5uN8oL2){hzkTy&bdbvzQh8BwZVASB|9S82KYJUxb2~-<-i`1g)%iq`XOCe zq;|6WD*9MMj`iE&_F_1kZj59lhBY~96s7@tmKNy{bkI|wN7dcxRzGzN%oK-#4e;g> zA*dNa;_lJzs-r$1O0HyA88mJg-0N?740LANGrWH=yw(Syf>9s~6wiM+Od_3mxB>$R z{qB45QzKCYy;)jFUI=N$WWaa%;l_OE01d768xiA0Yh3IU+F+#@ooQHbBr181@}X$8 zj^C~=yaG&IonQ|+rCq{?4(XCY|C|Uv^byPCN1vheJJ^5LPhkIt`r+Vi=VbdgaCd?0 zO>_16{_0PF_n#U_|NPv4rLq6NC5Qh#nLR_kOA?F;HGRRx)mhv6Y|QW~7r&VusaA*z z^;>w7Cwv*l2L$N3~UVQGgwZj zy9!`@oLNg}LciApQ05xVXb^hF+1e*&KqYFOPPktP+#fmubR%qeh084;K-&78q8Qgv z-i~l>b5jdRAAX##?Gu5MuLHY?BdX zCI=;0lrGq}b@aY@UQq_%6Wb(Ij-a6s*d*FVt7|xBJKw`-Tu%ygW6qC|oU)MPfFMkk zpJiw`H~y`+-x#h$D*K7Met+UFy8rDX5dO!CihV}g+x}PcE#tr7mP)-9#-9QhHyWK^ z^)NVDQ1X$`0WqlVf7rH$q?2-J>1)!~ik7psJLJFje&5~`Me&WlI;{-479dy*c3g36 zzsX2p@%`|ALD*!nLIL}Z^k@}J(AcqwTc#HfLYo+tt^MBP~gxb0My?H z9MwfE3vLEWT3Le=?+)MX4MU29SLt^PSU{<(eFf4*=*3&$`A$Twx8yXSEg4-rO}li< zW_x+6mnff8@}DwBKrJ~G{DCddS_;ENw>Vg6RtS}MU;r@>;#oX$l1ef_NTSeu7s z#eyr~%WhMX`dZF7nwjM_%2uR46%`8FPbaMxON0aM%q3Z;yYgNWkHd6&_t;Ke^BJr3 zH4MGbE=~VEAQ|o{QGTMA&DN8bG)Zy~w#Mi?!;5BseytefRdw3}>K4uVEoE%Q6T)9Q zY(swN!nr6Zx))ZS8vI$k!K=Oc6^me{%urdiZwqLy>*Y6ug5%R>3`Y5lPJ<=48Aqc* zC>C>9v1{xnKHN^d#U&IR!p8JI@NObBYyxr?Uo5XOW9rZuc#Z&lht~dE2=3v#Ow%fR zh^J8f`$RyW!{!!JnaCeGslkmHrg#Si*bfp(Oh1Rf4`c#ZlsWyHqE~IDf4v5Ei$}y> zp#*s+>)PG1?BxSoGUfftIhYFGr z;_s~k+oilc3j7F>)haO0QjD&nU&dqx$Ui`ZH52K1^}!PpuoyLa$bTf0bCw_-{IfRv z8(Yj`Wz<%D+6cgLzkH$nA8brh2YoxUe>H{M)K(mE=CD5Sv`YtdmO?`f;oy@1QN~Mx zO^DbOQK5$1RVbV}iQ9<5y`=?pt)Z>VEhUH`WVHgYsLQnyux)lnk&_NGZijzHFFRpb zye+bx*#%aPq&J3dyIsd^=EIydk*2O9?$c`yUVS<)(l1`d8{T((KQ4*Oyy_lGS^HYU41{fo)*g7Dx9i%>k&5$U7897Gra1x z+J5vltmRR0fBTcF0>=`gtKiarcti~?2wN$+eNSqj+N-r`o zi%lFoYR*lWdgEmItqB(!h^T>;N(XEt|v8}09e zl@DXxA-U7%o!SsS$)tPH^)yxQ-k%ycv{z3N&)Xwqz&$ZY^hVI2X>0Y-!Fi~og@^f& z=ZR4C849tWX~(fdt_D`vJ>S8J^&DBI5psr(mH1)CL`a`s;Dw3MrPHeA_*fTK;8pygjun#afdhOvWnM<0R6CO30F3f*8dPr z8?Q*(L}FEt7*Se~C%!LBBjMJ=h6t10&*J181REjY%YZAx|Ks$f6oURl2Mky=tZ=#_4cIqGNs$^=c=DDoQ5@6 zZz>S)>mzaBS7-$QykxH}??yV{;%??+|yXB}ooVn6qC_CCe8ON~0q_NpF}NV?hzYh6VY9EPF#;tmQzt zko@2GZ_fpL5;Hl5&>f8;1uUa%{k)~Ta^Zwid&2K z1||9!cLC5Dg{$~FDfEwKlT{)52g6uD>9d2uM>A@j=Ug*v!jWRIRt$;@)smzGlEC23 zs;m^orAL&gn-Huw0Gh5KJrBSvXm6lJBcstvv#vrpt5Pxg4eq2oT6!6b zo2y|ih6?usp-+a>-9$mBS`fd{Utyr{obSDFOFMZ-sPlVhd8kd&jxN*6in7UdL z!nH`XDQCV$y?I#Y@gsqT{g>g0y4oAF6g%iZ!uHwRwV_ZFtFUaUg^DA+gFR97oMTdw zXchgvO$&Lkd(&^DIGBd)DlJ*?BnL+5iET;}&ENZt;bqr}_8*{w~q&ONM$_7uM zFFcC%#i{0#=P0t5%k@86BAM+SsDGOmC)Q6tu*{*tel+<%+<8?^27l-=8-6JIwUZCo zrtU1IXDZ#7@Jv-umCv4Ua|_p1Lz?~xxXXqOpX~gF)<$;xG9_{r$yZJA4P?7$22OaC zvFnA?BBS8F?NR~OEc8|zf`)Lj&(mPJ=QC(RQE;R7;LtUL72cf(G-N){Z4~4UNNDcz z9IeP7coV==8^9AtaoB+CE=Bc}H#Z33MpLnK^fU&OZC#L!LF4BGE4Q3&X*Kzq+OIw- zpj{p0*4!&?-LbNcZIQ!kQYrrk#u1g{;rv;_17!7}mZoR#6#ysKHE`1iBg0zO5- zbcBjnCEneC(5T{1>gNi;bPrd}A z&&^&Zu$a~H&wZuIzc? z#w9Ndg~G9#%W&0cyfv1scb3qk)T6i^2tVOG!So-In$nnXfJ3Ml*XGN&Ww6EZ_sI4y zU-^VjOu;7__QhRz#ao^y;XhQz;17^_qQEV8i6hmB9u2oxJu`lJ{kSBk{`UH1 z%VC%BD#_7tUR{L1>F}o;G(VD2SME*JN_HXqvWzMBsM&TZR9!!2h(W-ob&A}hzDDD| z{#w)uC7={CgH}Og^$gK9Zfyc~+a~QXR&9c7Xp~B!^QR#Ue;Fd~LjrbVgOJ^8#0}yh zAd1uT!SV8a1kJ%b7uBm7yAl2wrmkKuy6n-WDruDnoc!rSax@O~X88xKG=cacb>_Ei z<(H=PAYHJFkM2b8c&$nC2}Hc7{gTEGKgDNZM**8>rSP81ut%wiw)(`HLLj?&(pVm5|>8z6kQc5(zw?YBUpoXg`8TS@7 zFz|ANckfD?Zu`VM8?d)_8t~Q!&j0RDdFOryVfsX*Z=Z@c)ge z&4~Ml9vb*DHsk^&Lsc8dMrO_l2o4Yw+9obgKvkgX=KTYY+%Z^s)38)G$khG;IxO!{l-PsT2+Vl$2D3ftkU#f3_^?`GS$~PJI`WY3(xV;iJi<9 z)iF6BCzMsgMG0gSeyd}f&W&jpQJwL_nO>THTfU5~i`Gc>OJZ@;eEGRIW1B`(&zRA9 zJ|ho}`Ndsy^YI}m7Yxtzd^vbyKL{331$C2o=G^1F$mcX!HE-PBB5}+8=mQhRMo+MN z49-TM=@}pX!V0m`Lb#Pyj=*W6@ZA2~*zxzfhGoZE89}=RJ~Qh3cF`uA1M<01-@s>%}jd;KUvWzf9}hLpvnUZ_&f!H$ai zDHrb#&E8R?R3Zl$bFGPm&_Iz?H+N2(j%J0I@ApK3a$-w$XTSdAV)}3JS#N3Zd*zeZ z`uGH({~gK-Wa~PWR9Dze9g39v4IIyigi-1AvF-lufr{mLFfQa2d=*R4$%oT(y z;eeIt)Gg<%r$Uq}2%m`XCedU$wQ#X~NKtngVh2_c_A96N41kgl;Le}9WaM7p)YUiL zDd{oI1?iMvmCZXO3A&~wYHOcIb%Mw8=NN#-f%>N#Yo3R7x*Y?mf30s7Pn0D0L--Sw z5EH^!HRo?Ln}7o&HRjAU&UM<1W{dF80MIQH#owzv|4cdEmxV1E8ES|E%|9s^r(Z9MG`$N>rjnneo>|fpXpMpqcu1;~+#8pZAtaL#Qkd z{XadU?)=ZtYeVCfWX(dOQk zvO(ZDbQ<;Q77MOp`}I|tBqL{h&IOP%0yJF4dG&?>I`SJ#@A}ioiM1L^JGF-5`mOpj z@&&d(deg3(0HE^%rEiBhpcO7&sdr%E$-xI7rBDh1NfbGSk4;0Ph zBj2RXjuhcSeuK#(zRaa+z_=;Y2WKL5%I_I6jVBCFkzMwP)`3Hi3~-gBPo~OX*B3$8 z?Hv|1ybMXkXnia10TGhfr{M#ecP9w_=rS3He3wh2|VKv4>;9H6=(_OLn$VIc;t4>hB^>gvJM*~}u%zFrm zmw<}ffQQ42KEW~KEX&v8F zlDoSZVQit$-HT5A$xz=LUqs0?#oCf(Ryv%vEA$)N?C(1Pa+&K($rSO=V@lN8&dL2R(n&?% z%GvmD2USAc+F!<p!H_0S`_LUYDanvL z06eDSfz{doA07{xJe{;>FcWVlHU4|IWPgA^`|p5nZS*JDyr`JMMU1%k{j;!D-@P{; zd%>fNkGaDm^bq?xz`sVqXZ@hP{DnpIjo^FP6jq-!Bq$B%B;n7i6bz3mSkR!{w@ieh zqnSz8w5m&?hwRz$0E8sK;GP~DJ<1{ zF-0V~Ki*4)HY8VR4;uXS^prB_{&r7s(I(9DMP#A4=;jda$;V>NY+?)gZXyo&@y(YG znzGDI)7qVyaCzv}U$Zixd*KRF)}YH(b5{8H>TW<^7bLZ^E5LgjdwBkYT9 zgR%aXNlft1p#jL0SgSccX)to-aRyxH?nwRv_r4oqfNTibus`9+#=!{05kXBgn~!}# z!pAavhzOp065N`wY@U=YTL}2OT<=2QHrtM{JLu(!gb?PVtc(2*)}=gs*j;}TZi<*_ zeN}StyiPDdYS0)jK?Y@vpxR3+-CjOHlTZPhX1SODDdxNhQ48go;;+b1M*l%8Rrk2Y zF>uqop7>Kb)#5N$>%@j=Z_z#$@?k1DIXC8&pPm+M@aGh}Nug74;~H2!cj`6}b#sn< zEQ&T_Q~49#bBeFf{~bNGY<+ZgebObupVa7o7!dfclS|Cm$=Sj9zmuW=ZZ_%sBm61y z@69GT{-!_G*`&G~WwrUWlyf9i93-D(5EK5t(}({t`w+STi*YRiuJx#h3?^*Vn5yvD=1l*{=C=48-ShnjD7Ka~?EMau0KkVT4*BZCKnbSQ%K-2_2?Rt-B z|1o*|UyJeAGW^TUtZHeeWsK$1erhv*?lKbyFvqr`_ZRw%|M1t#NkWaSEzq3KcM@i# zQ(J%@5lR;3j;Tqp}&0&x$v)VX!}4 z4wqhZR>F()9ZV6=;ir4niQqd^A+3mkqx`-M`00Q5Is6t3;cYcI% zHhB{VT9-B!VQ!0bXr{aV6^}$P)5sX=&I}Q%V0P3mCZ#fT-~1v(>T9IKi!!M8*~@bx zWQ%JB_^G} zf31NxOZ}88CIP#H5s&^NXxVC+VRjhE+Y<1GRg2KP49!fQ&77A72?v{7kJQ?E9|;}< zx;Eip`>2*F=eMULN{~5;p)Gejpt|1N`1O!bbR-ktAgC4cN8}9E%!YunLS~VZg=GuZ zQX7hiDoL-{X_Jt?s{p%MxDoC`*GQ>y%&C+;X~y(A!hCvo94=Ckmq(@5P&bR9%%>Nd zsu!Nfs+Zh9(cF9Zuz^`(t$n?gVrh8AqkmkA{wk`#3UCXh+o)1w1Uj3dQUj+Ac2ngp2L6QljD9h<7LOt#`=Aj!1*`;L@F?_ij|}0ZFW?CWM4Ny0sY@T@)MdV;IX`jN@7}9LA$FVqL`*LJ;BV zNl4OSBbw3KDXQ@pmq*>MHq#CWsO48%PB9E-%-fnrF)93zKx{eSqG#Hr7+vkIk-RN z{uxmt!4UkB!~kAjt4en?(x#&3JfOuc>Zr_!Po;k{RHW@OzeUmixFNn2Ic9X{#g`L} zb1(goACtcQs1vYHQ6|JSH-Rnl@CS9>`T*eW{^X7oiF(0c%Z>6gI-l9n(zoH(B?@Qv z_#My?@q4zcwuS>>uzNjQ|lzePe}G3BbpngiE?>O2u-NA6dNEz(jUdUGpw<9-OzLoRa(hCB7dG0fx76a`-M zg6q3FHBt{rL%bo;W54>O1)TsS5CU z`tU|zgKU#VNy@btJ@yXIx}^2x=BIoI@)60AoDT>|bZL)%h3ysaCbylV;7juotbLQU z&96JDoMv0=#bzIMG5hMB+;)eH;q^?yATTQIsiW?b+HoBTsg<{7-~}v`pF+s$Be{P5 zwZVzd?@}FGPeU@rIoq}!?ZJD)k%w#!c1#HtTH9=PMmUscM2@=iu_J zyBJvy25fgEI!BI^XXaN)*0$)Ejn4bXa=K$F&DotFxIZ*!Tj~#8>)kr-MFGswH@Ovg z=a}@k)>c{KyCS5|#LYTFNnZ7XA3Ly(k7TujXS^0KEXt$sZcO7Sve`(G9Be^Q)AR?T zQcAgpdQzJ=VG(Y@uoi&FCyEW4-38;Agh9KXgaZg!-4<;|b4`maTKBmF+(lsnla#@^ z1G@cae%tF3+hgk_P@;LU_q453k?oF)(Y4QRKy@wrHMJEDPp`Ip^$Xj3c1yYK()nc* z--l-b$ITG90-hsYAEuXaf@u94vzW{R`?A97X;fxrh_|d zx0^0-+p@#w^!{g=i zFFhl-mu`DuMpy0a@p-$YyYTI;IzvewJjXj`P0IHK1T-i1mn?FJCcJv%2)@Hq?QdK{ zguIisZ&MN%&cZ+DuV&Inl&Qe;Z4ayHQfYRCRd9y4NJthvVZP?U>DZEW8q)g-KyOlw za(y{TkKMBFo;RhQA8(%bkh07Y`&m;zqp!2Wt5J2WzA&6RJzTMab2^mJ@)Yl59m_e- z8hqv$!hOW1lwy4oF%6pVjF;4#COKu%&2AsRI6)Z&y0QJ?=(fIepik`fWMxVxMY{?1 zQ(JP3J%Y{04xc?E1a&47{CGcGRif_Vhvmirr_N40f490D9>x}YABjRQ-Idt@>|;Hb zEw_%*Q2Ewy<#e<-Rqr=@*79c)d8@dXIwpAZErCk@2v#L|{GRM;?yamFy zdQs=-wOS{mlE==ocf)arsIDu@%-gVJ5OAE=nlwXh%{cS8vGBI8!aX@@Mk5Prn+)|9 zEw;s|Lj+pH>YB*V{EN7k6j1cq)q+jEj*qTQ(ic5EZ|H`GZ#{OMmultlo9gaE(n zoKz#9L8qT7_*|9(M@8amg)mADlo)D^W+n|1Rpu*yd0d49TU=-SK-d|!&Q|Xg@;R$4 zkS)Ppb+EAB@0;qEn&Wu?G-|&JdeE%wKS}7B<)01804Z2GVTPYK7Dbn{v^q!ehq&jZ z5$8|JFwsdvq-8oi-)3)urKuCJrD^@MepFn4#h5*Z1M$L?aV5?UY>c20A{*Y{pGI9f&Z@QfZ+d+PJr3)gSsCSWN$MadFd!T~7fD>u@wD0@B z$v^$Z6+e;>={1h*Sr`!M&Cy1Um~596LqTff85Q;ohb>G)awEA?<282*WlSYq5#(f2 z1xt~kB3lk(v(*Qvc?c`3KF;qkP~$&6ot4u`MAZ?s&hu5}IWpNMU32eRY-j>U8)b;| z`fWgXE;fTWfe~gM#*n@t`yMuk*BBeDk3-_MbE=hDL=3g9A&Gf5MH8KC>lpHSm|kM< zDdW~_kvhe0Udjeu(ri(&mY3&T5+a_6Gi<(mLr9nLmFltx2~CKVLF5{8{C#Y|EQl`$;hk#=Q?4@+%(>S|m$u3?{kZw`&fJ1#V@<#4J z9iH+nXgtp;ib@Z6O;ADVXw0Kr7;C3m?vOVvrg>m3bGD(p3EMAr*g`ry&g>mRgcwT2 z+Q=$ELs{hN2npI)Pj%@F>3Ya%012r5=agC_=A8j>wzapd_K2Pu)xJ&2t1XD5z>eWO%#MUopOLxpEiTKg~#V zi-Ae*rp6MmS>3O0-;;z-RT9X#H3;)(D>1x=dwhlH94%V`8dXyTVr$vuuGofe2(Lkfy!cP!af$y20dwiW^ z3}F%bkPbqoF>m^E<_2Fe6RXv>wOO|lPHl!f{7u(6WBVz#$FY+NlX%o%g_h4tgq{m+ z%vkv>Hb<4kk7rEjz!Co}CVHFMzmrMW__d$(@~h z2U-V54|LxVL!Z23m~p5Qq3KZ=ZY@prT!l#98-*3SoxB$wVA*&Ha{N95Kiv=>Woyog z;y0(Waom+|!EZ57-4eXm0uY|Zk}j@P(F{9Xlj;y^}vT_gN@8Fs7D zO;w-CiE`-cuMU0#Y=)ZHjk{zkdzt#|V0p4QG{os`&GHJW0RxVADexUf47{2b9+RZy zSF90Z1o%hJI^V4-EEj9wk~ThjNpT~7FFRfyw=z>zTz-)Ht>-aQexT3T{c9xhywo?Y zZqSWxB5~5K5O9tsAUZhp|HIfj25S~<*`ih3wr$(CZQHhOqqc3^wr$(CUHk67jnjSN z-P12(eG%(#t}i2V&M^m;hITwzKsTpAx28J8h;Nv+1aImPhUj2lbo)eYQ{D?i%lnc% zFn4q)oSo_x6Ivv{&R`TAwv{*(OpPkttRltz)uVKR`&cKT&fjbBovHrPR8o#=`-*}u z>H(Vuw*Y*PTYm2@_0UWEnihR6NK11^>-4)WcC-9=qC|u2@Ix0*i>7NuOdusWeAE!^ z;O1-$iSKxT&$+p2hW4zv}Q%&8R85B4X>IS4y8i%#_w!z)!M+ECmGB`62I2_LIr1jhmbq+Fzur zlzo2Y0}izT0C{_&hOF-L_Or5D)g$t!?{^nO(VLWUP{Oo-g6btW7~B^9AV7f{);wl; zDqxo7h*ra;p78a1&c1BjHqY1Xz?R}tAz0z|db=*73v=ox^!Db>nv>VyC@3-`_@0C* zPAIa=C2MK&d15=S%jC9sVm%qUb9nQwg}cGp2~^r=_$jf=gY0S#Ii!y%C$f}YWmyg4 zD-y2zjPKAVrtA8$7*X{RH8WcnY0PE+RT*U>pZ_RB0^ z{j>K`vA3f;-OnWO;>Y{w|B)2?-ylSD8&g?lCp%{+MJESied~WOy*dRuXK~Oz=>iQ;LO;VgKBE-MWQ2k3g-V+lC6cO?Ai3I2MNAo&$`$n%8TQD1M)kmK&uj$w zRGsX^=^#3YZqX=Q#mbsSUz5{GSAFSPv&KBmIq{UsyuMR`s6b5=&m*IdOery4|JaDQDwOK6OvOCi-x!@k1-t3iM83+ypg%gWfq2v4lpSd77{j*I zG0+B#7pkYNP25twz^H?*eZW6dVv4QPqFseQV}*Ty50X(a6S%*c9Q74}{0&dto-Goy*?XL$W%|Qg{ z^j_Mpo^yZOTif{OZIai)9;mOy-&zl7)rbR79(IDYQHvj#R9!fbv8~j&LrxFoyoU$n zAPKs2@NaU0sKE2IjStic1L`v8yatvrU^fW6+)#LqgUfn>c7KAjN#oJy#z4eSOOy7B z^>7|iVaY~*t19%&{RNCW*@62&-{L1qU;mEkUWNJbFIVM)nfn{Q0;M=LIEWyq%Aiv24O=; z9b*IBu(*dfhaK_RpB2QyP5>Md!=8z_63m$i-vBIQU&pLvF-=RAs{_|7$xpR%!DS%Q zPr?;NIYN)1i-E=;w_~;DE335i{ZCQC*}3gntUu>r(*H_O7Pq$k_e|k`fceo0*0%F< zKQXeX5ZION;T&18qnn6DR^ELG(y5YuLssZ>gVf&iI;k)e9U;wyu#8@mPte1tAOGg? z-DcfDS1;{0=V){D_I>@GDf#{RwB$T5!CEX;ySWHpRHW_{q#`UJ&n#xPX^dC8^a^$ik53-V*de~S5fVC!E$`E8^FS{brrO;P zKXRjB0cCx&jwk3j?INYXo}IuLGv( z?RXf_jPkbM254S0p<z(b`b2D!6P61fK|^)+GP0lCToDa}n2J@6}+C>VkJLEau7 z0l7-9cu?3aS~&usHu;xEV&wW;#4}<&QMA1+MuUt!VL#PS5x9uaMdJX$t_c8FK9@AT z>RdVNe)(gYwQ#F~mRs-yF!KWlApF^Z zd_Oyo<6qv&|B)H~4^GHG4STcVcWe>(;YNBi$&d=0^K+Y<YiGOJwZovifAzqzW_fAqB>LssEb(c_MS~nModjyj#qAOcz<{H>mWb^ z%~)+O1i&Nekj@rv9(0>T+VdW2Y~d=zI&aghfD2e|x<1M_FTkR|q`;AqNnZ+|w`tYZ zZcx5Ao*;=bkv#+B*2gT6C%XhXAbos|;Q3hwIi5oBnYK|gUeQs5bXsf=Pfw*ESc{u^`FV9O? zY;&>A#ah0{Df3#T0|6i8$S*Nnv{&vh>=9zwiou zR`a)e@kgi1`0w_ax8shH1K(sEXDvDV6^h6xTFO@P1Ij*x&|y2M@Z4-ZXFSTwizU|* zImK(u7Wi|^Gd{3@$ZxzL=SgtEHrywa@PjKBxRlAP{71q0vMt^Gpx<^9TYv`-MGw^= z?x`fC0l~|DJ0w|A{RND?G4MQQCF;?8qqOmj5okV4i^*gmuJ;R77|#LL$K>QAx)Kpb z^6(C@k#y2}(-GngUwtuM+la42tfMrQS9I~|SD7c|is^hH!>7!^Clk#a$NisMPa&{E z?DtRQ(eg9IB>k6LPtw@^zmbqsv{eyRk+xFA#n3`v3j*-W;0B2ri&aXMd5{zr7ju`% zP?~U4#?XePO!g;%#(B+k-`7K*fA`FuTU=;(U+|s_c6eM*`I#eZ7*U%XPjh?bcu#M= z!1#WCovZ$OxFtB%LtDslSl?jMuGlR)Yr9-E-`XmFm3c3(bGEE7aPr45#E+5*i7A2_ zaJ%-UZva4AnkD8NpZd&4bG4kE9e_(yQ=i<@8E2H*v<#FG#(gI|ovVeV52>|bZ|<|h zi<{&=#N@KJ??~{|^3u81 zj_SU{e6?@o4Z@H27Rrn@3?_JzX`b;HV1O?lJx#hgEI!tZErM;p#|9aD<#AWYk@8X+(LE8nPoB{HH;at9ErVb4+x@~8ZT&eJmAE<=MD{KMkE4s1JCd=~zy@by_Nr(YcSWS;- z-VOv;kv2+H*~T3T6mcptz7tbe6{tb!e50+>7+u(gx_!tZjidfC+D6H1q0X>B0|Uh_ zdoaa)Y?Q5e`irwLKAS6NgQqCXYVICoO3of8(x8oog={0ZQs@p`okF)Mg&}_+Md;Qz z#HfOJs+nYTzPXibPL=tvmI{i-n#7r8qmGT)4i&!qsg>4reYnZOeag=EjyZBW(_Gzw zbF(h9z|k_eqgW5(RN!yB_*whC$=tEe5_3?jriz$LY0EhCS(pF2>QnZ0aX6-@h>AH9 z82r>|GifX7jbm5iB&GjyaPFfCX3N^|A|fo_M;Vm*mrNVrjkHT?<{2iduQnD0YPh&` z*Yau`Erwt_>Qr{}*3wv1?2#9*6xC#C-z{=C?<}|6{IDl5slB&QC!%g?%XLhdF))<; zW@sAwEmy7bqYV#MAb;k0%1s)z5Y{-yOogWTeK}85x#U?apPHc%o8nQsiSdkXdd%P< zy2<@w)D~>s=>y`8wZ??hj@ zEX+4qBzB71sB388Nr7yx6)(S$CQYEiN+*+uT|~NL`Z|MRiaA5=PaLH(x;#?aqtBm5 zR|5F2O{uRaBEf1y9}7@YOMqfa@q!)6-&XvyL?s3boT+axA4zYxvz*ABl%jjHpJ71Q zkUHcPDZqe4PFU3jvug z7r;>Z3Y@79y^xcUk-PhO@9FlcAWLNFLd)NKHOv&eMkp-lr2vLzxk;C*$@4 zBeC;fLX1?8+8+}0ctbqh;i%VG?ckMh2zleIHV}=ZcU~xktC@lX{*@q`ujH z;V(;&8Mt9JCot5em~a4J;NIDuLZV4OZs8hpHBbu(MPyt~rm>%Rop7dX<@9v>fZhVd zS~ccv35@fDa-hGvyyCn7;3RdiYI63kKxM@m6Fn)0xVZWZ3`1$&ESGkSP&ODO!MhF&05-Z zjF~DAdDaspM*Bdip*hh7>4!*$8!Ept15{?vRcMu`5FkWcs4;t~=9eGG$>t?*EyT&} zFr8(Fr!x|XU>E*~-ZDJIa7JN+c(1BIk2IMA)DGmyVH}GMzEbVz!pTFn9RTH+?$C!f z83j(Lv`o;rOy2jqXel&?Bu`MB5p_6DH z_0K9UZti$bQBGN`549G1)lp65os`;1f&ijx<;kvaS?m3n#y(+Was6a3VMB)MFdrE0UiULa)&)xf4@?!{KYXVFE zKta7MIS#Xo0pgr-odPSFif@LMff__(ADy zmJy#uCx{R~%xKNXY_eV^{vl_=vGCIU(&lZM!%%dxsa>-y(CSnBa(>PI@_GI3b$PA( z{qe#4EAZ7E2^x$HtQ-uVYBr0Sx^Q9zA~}t+#Jp3EqPSssK3`iRhx{XP|4prmIZ@#+?ZRIrynrbppS>#j*Oi#bIfW=_C^V6 zYPC2wn7aw0QER^D++30Ncmc5?C90AdPV8BRe3hoQ#N)}tMDpXP3q)j31DjSQ^5b!y2X7;t^bAT&7bwqK#sC|C zwdn;s2?boGxtI}P43m&I)0zlxG4L>`?{mdCz6jA!WhX+c0YtX^U3+BN{Zc+M%jAf{ z?--*SwJNtStEa>W*}VmTKKCvz+S#TbvuyL=#l#8cASwg~MyvlkiDn+R>XvEtM! zHI(o~oVb<`Lbg78uCje3PeLlk-o49Q~Guso3@I? zIw_iHO609Ve*t$U#!XNBkdxca0D9yDHpee z7+SJdDoOgb?og)-FlCd8w9u!EDZ1MeC8<4Oe=th7_C!K%0iY4qoPov&$W(lgcnA5G z!!D^|`cHzLk9gNasFWpPWDXN?BG<1s1Z87~gxpqS5h@4=q!Wrm^R_@9%lL&;BYfS( zEWILD$YsBqM8zV3>TjbS&rI@&ILCHt!{B`T=6X6ywUex?jbRD(t<3o6;y4*Xf2y2aXA$`#XWvp*k+rOQIo*}we8v&_9_3-gf7N`M4zQL zMqo*o3^HlyQH!K3(u2vUvHOxMGcJk=Gv1_)Z*n3H9UWaCy#}y}rODB1kxL89K=L<~k&Tt(~m^atD-Fk##|AoUAZ@sLlYrqkE!Ma0r&YjjCunOGz3Izi(3w6uW zvv{LjrS4lt)NbqZS4K%A@?#+arC2eCYHkrn041AJ(i4z5z-Lsgugua5q(m)d&1O zY8>!>L{>EUNnwPC}B>MtdRX)U814w z09{^qa65+qL8m8siFT9#rx1bXYXDmqi3`Xg*dN$B+Pikx_@=}GoSAH!O1G$73w|T% z>y#jc5K9Gr5!!eYdVweOE3xH$eR+S&oHsj8M81*}%4Fm4I@!E_*ZngIZPst;Ky=&g z>f&#E!0AljUMj*@*JDGJGvum$pt)Ib>OoP|6)I<^{((r)BScnP=^Zu7W@?Q4wIzgl zf(G4`VRj-^qCcaZ>4PZor{k>NwR+^Wk6Z*E0i9#x!Ks{{F{@d?3Q>2EVREUQkH|b`_GwXyfu$E-<_j3$Tco46NUjV_S(Q8*ZAi8 zEs==J*Iv)Hi3w{?@=?7#Ovio*)oBV?LJ!kNjO;S8n^~&_w~Yc?B1tUsqZ0XJx$t`i zmSkIqtdB9Bgx!mgJDuoFK)GOGQ4G)KkBDuYh;4!Vrcgp_Fw7kd$4`D&+~;qmJN$VA zbkV^Y?{;X9c4&zvAm(-(@XJ#a;w^!kSyDsG3AnrO(IejTWlN?Z{jR_iiw@xuTIu}i zSP<3?pQxPC3(SAk8gxAxED8S7z`tgZ{P+mj{0t%ffq-WHCjy#MBA|+vzuS;e z-v-d0j&=a(IA$V{EY1WUxHchKHd~Zf)V1_l#WWXZwhwwMh(2SDi3iCs5V`F+bH?8D z!27cIe-S6H5pQI0BIH7*!Z`iX^nixx)tecT7~`dM zWZlI17Rui8ZEA&3;Ec#xb9T!04M_I;Y60)sea_IVb_w{rwL+HF!6P2lWh6+I^ryZn zj1}-%TGfWIS~T8JH_2tKjyew=(jkkH_Bjxh&DJX($Wb22FDw+g7O~RTPHm==oG!(K zv(Mc!UNQ+5r`c|$DvT#+ zA|1J{Cb%|>KmPn0pnjLQe_!a7sbS#voo_4#6+ghfza$i=%vH&Pse+KK2M=* zmoW4v@Ut$|gFE@nGCH4+WwlQ;6|WlZt{ovctCe<-frtdIR`RwVrIF9J3mz>S{t%@j zz(}N;f0;_9syQ1zb$C?lTOR_y&e#4I`TT^O0g>b71gO|hYSAOw>!@s2@P1SQ7~DK_ z{~q06ej{{rpZMNvCY(}g2${fsh#NsQwvExgq}4@ba~QxLDw^(m`=3B5#K0iD)E_YF z_2)W=_X;R0};xvB7u}uGRk^gUNnP53ih@Y`+W^~TdtF<*Uk$F8RoMs&y6~J>w>o9bN zP<-j>92J*eD1s~GT)*rS&VW~H+ZL_rFU3bPDgfF^1Qjgf>Sf>s-}oY`N!bnt!|qXH z)%!_6;^WTMbV+&Q(~-~Kw0-lzWPYmt_+ANY zJzJ#dI$URjC%7Bh@T)$}GlKL9B$l^jm8Kr&CP2t)rT*tzR9ijZm?ohp>lpZ_XjogI z|Fb2jrQBq20sHj}2l0QCQvZjrLhV8mX$9M7rk<`gMh{L7ju0)u zAz`V!sonx0ti9fEieOGJf8e^ca&p?r#Z)+c{V`iIqq(@Hu!Tsvz*9x}Q4d5-*CExija`Bl2dAQLB3gtkPRb#GKdk98Rh6LtWA zjQKWtLiCH3l5~Z($}J-emxa`AqhqK7_Fur|O6@AS&BP3}^cJS^CIpKd3jP$8ino3d z7L}-A!<9;OoN1G2ca@tZRE%g7QbpF3XiJRZQ(`<7(dh4Y>`4H~XK&u#I)W;(M-1Yg z6sK{)0HwlN0nijI`8v7o?#zWa*%B83{y{dLp@GyB5jN4AifUpSZQ{a&ERbY~jsmzE zz$HN4!orB@z~^D58)9leblDIi=;4QLh1vE7C@{PDR*JW^5u&%`{?!Ee2`Y4!rcTsJ z+Pjm2=~d82mrm0$9JavYq-6rI8IzE{lC920&>C~ax!S^@&5%}V!^rMAPigd&)g#1~ z7iO_R$Vzp9oWK;=b=->0+gW2~M6}lESLWE@dZ;dxs|EXvtCY1j--0+SkbWz6;jkKM zNaXb%Tsg)JPyJPr39{`jIT18LXo-;NaSNf-;Fr|N#T5{XG+1)>av&0Mbf-LJd-Q1z zTL7_QP!)&^75i}SK+6*JkekRZTpE#t6fp#o0yL9h{M18*<>urT7Rc|)LUerD^b(UW zn!x&y3@}5LIy6VfP~cphx7I9GBLSo@m#ZhkIZpCC5PEPq3D|n3zvQ7P+42m4WWlVo zMrG~?G$xxFf*L|pf~P90(&#Z3)tT@n>_ZFF6)Ca@$q;GsGCV{YwtVPuH-k&HODQov zkqBFFuX2&6hK9LsJf-FP(EXbUEc!_jsMt?Z0X(dSx>qi!!lROLa_&2r-qi~>tfIoCE^z1X;z$ZCn}3FxuiP{h&e9wH<3-M9>;$Lk@t z1OuqdaiNgOQ>{p%OltCs8vrg)4~rk@h{P8tvVZF*pUoUH5q6lV9EvKHK8-2tgo{n_ zelNYo{-V)S=o3a(baS!EJi07|ccKUe7`L{pe!VbCP)`?F%8bfUwFlSL6O=SZ^r$f& zX8Hghj^|ACVmS(mB-)`UZw=!C)-{4azOk0yVpCmR3F~2<$Bxbh$3=h}Sp`4Fiymbm zo|(Rg>mDhPkrHkVI(|*P1Kc8=d3?#@Ks>|bV(?0oW$pJ~$7W~vR)VqdrM*zfrHE&G z>eI52nt?h=QWdRCHHk6<8f^HOwT&e``;$efrt2io(8f|t$0ceewYY462&l2XRLGzY zk-kuze00IUYcKLBmCW47G}8`7b~Kl4Ag0O=fUQNW5(8-W{S}7KQ)AQs;WLR~Cx!3p zHtIPLgSv79>d^-U6-@jHVO>o<`;F#o=&Y&# z?-3O#N-#&pQ+FHOX^UWD>H=IU0 ziCsCAv*5e|Zo!<)vO%_c8(KwvH?06Pd4qY@@c`>L23OW(CFPVh22)wh&zPlFmN~*x z&`e@$#4(p36re7O&p3&Ow0lu@4`wzh&befKTFgn#Zk=Le1b)`A<4EDe*xq6Y0^87rEv2Y`RQsxP8J_N_U;FzqEV@cVurBRo9#) zZXK^I9(%&qpPl{Dy*z5IKd5*ladnffv-|$4bB!y00AiMPh1x!}!p!WW0W#o*RXOq6 zrC+;69CJrwWa{Hh-@l=)yLoPgwg%di3{gq+h=yV0#opzWqBMj>VjQs^u{ii3st}{Y6z9zZ&6Qak(h~+?A zAh^MjDAy~7{`?ax?f8uKwd%rU!P!$#Q*?XjVfrf7)skm)3FZjWX*JSmSQ6@V0w%w? z6KKXAI{N_wYvo-G+b&BL&1>6JJEe>GTXewLSMvio@x5e&SHIVkt}j)#GjKls>^WAR z8Beh$um@eOra)sjyCj5C?o)M-Hcdw2Rdw(&jU}B&HcjcBR z&dQ`n=Y%ompsI;XnPRACZZh6WDtY$i)*rHE;Y^>Y5M=EI1$k)$Sor8A!U94+<)v|A zgQ}_xQdmnkNma37RJ_4vk9{}YRJPkx8u6tAxIaUC51|5JC*22_b<}R5k1-OqEji&9 z#TWNLHU`a~_n@XV^8KF)cD@>nd-Okr3pFp$bUsJ=mnzs`apg>rP`Ve>jo__<5Bk5en(-i0boHctjZ+7%>N1u7D11;tG!rY zG0!kDpC{4IEb=^e!neL0L@JR^caqGw{-FI*^jPIevi=I52+)6nMo{! z=%};VU#I3aJbEII&7*)egH|^1u7wR^&)3I~?20E-u-&KMZ*D{?1>PdGJr^eQM#f0B zd5vtp8Z|(HfVMA>YCbUIohF_DpJuSiGT(x%6<{hf1mA}^seW7;w_F7mLr|utG(;aI zzIteP^rYk;e@rpsgPj*?`p}##ZSSmURP;&VLZSk{Lb~e&fN1;$=9oA&=WMekU$$A+f3j~CTa^~=tP=&-4 z*{X=hD7szpNUOo`7uho+TNJh$s2(;%Q>DxyQFMr{dMS(~ch=J8)pwQa899DrV6=xkYkqr$UjQnq2T$q<4aPkyn}hyVjtK@pg3z=Myi=$)Erp2K?D@)qn$qTQDz}9M#*xh?3jjc&L%$ z{I5n~6c22-3O7{PeMzf69f3^k`Aow-?YC;XvV{m`u#>yS08=Hd$dhC(xCk=Dz@Pm! zr*`gHo_TFSqEtbzJG6r2r9H%YE4{p0k<^DzUBNCFUamzEsaiE|(;#>2^@L=sDS4h2 zKAt?h3r+MMKjwMxK`a)!Dh4W560v4Tz+-S_6$_0c&2c3Z@!_5q59UL^3k^}=UcR!gs6+&GykLafz+YwS6$H|SDTboU~$im3ho&9B6oywjNNx9U-wNk}piFy&PI&u$zLTqJs9}uulxD7MlMGd2*Bk2(g=+n?EwdF}|fVOE2 ztlH0#eY3;~*O8QCDj_gYo)wKQL_g87%FkV)sX=m9&8;Lx(-3VgM5eRbL^`iywk4l~yS(ui7m%Cd~BVU(}qbTCT zGmMd?ZJOCa%A+O3YMfH&1HYCw-eeUgGe@aR^y!5QE!z%sjD-ui>Xd)S+tc*gu!2XG z%$}uwWudvyVS z6isxK9$O7XWmk+8dj0J~76D*N+XfI5d4e(mf}dOPz>pYIJ)x$GvLuGTTcs$1YcUt= z0mVizAk3m#n7Y(vfq^9%oP%l~ULaSHpgY^*>_oHMF1gwmrjl3DaDYq(2{r+_S|?=P zCFm1&px>>7fK0K$m1OOPUc*MQVV9QsR@>V)N&5(_dRt!cDRU3bm9Ayofx1hkBU*K% zUCkiQD^eG?B9>R*HhNlS)gOC@2vMW-h@nFpK>kEe!`#17-7@P0zLj#@2YhLH*%R>P z^Li4w4hxMsvX|;*7}*)dY3QHKw*tVkh=9jJstM3v54_2V3z;aKd4Adspc94~XA7>? zrv*JU=eM;w(;+^N?d+QABpL_^FDk2%_y^($h-|zQLkEa!a{ho1y-S zV#?q%^`-Kf{yjme&Brg-XNz=e;hydL2dPsUyl3EMYjg8}2;P4?%#qeZzudk%t8CPA zZQ_D=cAUUA#goqK{*z%El!DD0=Opm8V8VTy8-5Er3l;9q3FnT`EjrNWLzXQb8&SZ* z&<+95GZTg|QJVq{U!1PrC8|b5s;xc39(?{I*_>x4yj#F4*BFpTIYCMX_h1P@W z6Mf2ezby|aC2~E&Cu=ie`9?4=tovVVyZKl%5S_rAR$a7sE*e+1WN!<2SW?uxL5G=~ zirdbmhtC=`2Vx$oD1g3SIN&8!OjfVUlx|C`J1f7KoTU~^TeY$zg{B7J)kNwU}{ z)he6ASv572T>K>CmH$qMGZbzsjZ?Fz(vBzoQSu)L6t$cc)OcT6;-;Rx$~A#0mSE?6 z{1~H8r$`U}30*v!HtLyp^EvsPzS{Wwn!)w`jW!~P+YTgS5@Bg_6sI_CN=Y)c5&_Jp zxJ{-UX)->BTxn5dwX;UH<^$%&Om>QLOI!mL8v~<_5GLgc7R#Wsv}@XV;zBWf;f=wh z^FoBEs&EHdX0(5Ndm4->NX40(2g+aXOn{w}En5r}<%x|6$v48u1H_Cqi2s{7ffmKe zKX7mKF`~&P&As9e;|YrDrBu@N^PV=Y0LHt0&}BEzAF9RWu-^8hnl(pBfPy{kQ=#p0 zrTh*Sg{6AMQDIk2Jz#lU5a5u=qs%t7N@NC1^a_Qkjbn*n7RjUi_JpR1ssj@IICutG@q!&f2`^H|?y{>L)>8q^^qY~(-t`lEl@#> z5c}*?cJ<%%Lz)E`G`l|`p26`lq6cqUaatP1MrWQ+bo=ok6H&7&SJB7jC{gB%U_^45 zWxG?dOoOXNvPJSr3oiJo+9qp-AwYm0mtNcC%2`oKvWw#v%@D#v$~MuJR?sj<%+QLh zG_x5E6$#-You*Yy+(oAf%JkB0e>EuN_EhOfYk8fieg5u`5*kQp4_MgR&)Psv{>?#; zC{#A1I3C-*+_Z|H8Y@<^Pcg`mDpiBKRlG|q6;usP9pQ%7-Q{sDz5El=duCVofI}>c z$!43MT9o=I#R=@$+}v!Ia-$aMzK(8tU~r-elOh<0kk~v9bK#ie0m%TkeO@ov{3RX5 z$MpHUhnVVa>D2Lz7a(~=ko3q^cC~o$jetpQNvq!E#XKdx%Tb|`wuD}BC=zayPJSL) zC$-(>kxz}fp*HeEVbj1Jj80jPuXHTs3|bzOQVrploW za$xL=v-a?P=5Sl#iT9Bs>`oKJa51T{QrkFS!9KBS>=xCG? zCQWpj%}j^=pqAWW*uR31&537K;UT`ze!b`}=+?(2(9G%}ioP}2QDn3u7@n}uYA+xD zd|P0V?Qo+%2wtHD&Ufmj)d^3OC3%cH^s-VeUX?zK%X@HnbT8o0JKD-I7o#(p#I|5; z!|a|Vy%Rcxb%yP%{DMCQjW(gn0{~}X)ShGIyJFD?i1r|PYa)WGeM-G^064Y91`(y0rM9; z-poa%R2vA=forDcynr&!=h_D=4b<6MAMwCNY>%NqY0NUmNUmHjqTgaH77jwv% zrYHCOr4v%?zVPPcgQ{fROJGpIPj8EWE(S*LEnfjDH?oZ~U|M6&rd+vZMbDdGN#hTx zkk#@CZ*5QUweQHWqO#{>*j^Y>XRM{TIRk{ij5;+u6*GTwRX1<2!upJ?E*4!@V?KNwD{y>ihTb`XN5$oi@g5R0`C8K`~7Qh zU&%q=#_`AU{3inFzfR_V?+B|jAib21lD>1=651FOGX4O8KoKFpF{Ocr?-7&WQwsIz z38=aAmZLKy7>yc{Oan$~TWYq{Q*>K2QA8F+CRx}kH**OA<5ItxRcUBac2qT6wlsHG zUk&hh1!X^MamGRkqCB^J`n2t|?R-tYO&@$`Id;F@&EMt?{5oC;rdiEBtHmVq3$)X5 zb;{-GCPsn;-G7pT6(W4vs>|yWYV>h0W!;x0GVDVZ4CD{+85?3enKWI=W5Z7Oz%r{eIpZ;AJ+&LP{57^POJgeP_aU5rT8u5d6TYO?^$QX9YUuH zP8XaR7p9PShDNFIxlrtV+YddscfmL zN)jY!paXkfTe_y{j5G$-w$+g)km-J?0P8OS_bOJq?#^V88k|Q_fWF@PM7=kTgGf0i}I1M`Q1+#3dPd(OT7 zbNR#LK%a#0#dKwvS{2|qAzixTL52Xzu1Lfb#&-bu?a>fq5ETPtO@wG*0eD}vz51zW zX0-~#EdQrfJ~qiba-^!B)tp;b62u>O_5tcsTs=LT@L+_#W-!2Yoh_19-9Snxt#F!c zZEwT1b1-lQRtLL=KVyHcp@*G-z=qP!f(5~s>qMQP>SDaX&Q^_bbr(D7Vp-K{TIWf0 zdNR4MU_-0#Y@tAfSDM9=%Q;|wZ!3cKES{huNoB>jeF^Anrtwf4X95*~fY>AJ_xttm zu3|*n38{u6cuNf-`tW2p5Nue;@Fds-(aUFM(ft`Tc~+988t162 zXU1}(cZVlU!jAzF%`;I(2b*J9CO#iFwabc`!Fa{ukwvRmjH!hk{Dw^6=I%oaUBQJB zU6YB~S2y1fp|L>V|2Er&Z1oo${!5ZLp;DstAq!$NC|&u77v%vK+{R*=*2xglW{!TK zx2iR|$2qhBe%ndQxtVuru?%Jg8>BmolYQ=mXevtAyjqe(K;K2SkP|)9zPUoTkcU;A zqkE!vD?U;?&WvD@u@Mg|dCe1Qld|EN`Y+r`*%cK7+&T0xJMwk!7e}{&9%;8kYW5EW zu=H(qQTIIdrRp#X9U$gVkMGSgA}Q;Df0;NDt^9^=VP{CfBY}gGvsQADmoJs&-QwYw zxQW|ruZ@@XbVIQ7cKJh8gV0BrjMIWg)6BqYNDMa!PG3)PM9Tdo0C<`jdMCvhs^gKB zW9>@Y-iRRx&WKL-#w9E%`vc-|EEnvu|B0Cw;)l~EtKBb9MRNWzR>Db#EALAM_}agR zuaZ6b0?2?**Wlrd;-AT#wmmw)(usZy7lr5n9Jnb>RT(KPjK6qcvKsXE7JN`iN)#69zA2gx|UrLOj# z@hfl>y&1P=?#&pMr|KhD7q-5z|MFYbKu)h(lCOP(`ZBHzD&pF>yotyRSIre7S#7+t z@E~lWf<-xXO4^lNXlsqoDhm4(8!HRAc;TfcdF8t&adqWWtsPGa{z1JfX~W-04I}x~ zFB6X+S@pOUT_YjU_z2kgx+79GiQZvjgnF*9z3%%vNxGrO+WfB1E{k49huK1`#YlM7^&~TpO-FK;vzK%An-pUv-nO+$ zf-t_nwR^X*b3JN-qdrsm?&JyXB^b$jzW*y4Xx2sXL#ajyh7D(!?e+qLMKD1|!59Ao z+XGBP7_g{erq1;k%c6!EL|3As3>#X`GEVd}Dd=Be7 z3F#7oiZRtpIj=Gm9a^b`P(?dBRJfkVMn4L}; z$V3ipI)ca}&2iCfttj%%rR00%*AFtGv`?_1l@EruC-LZ|)FP1@W|@Xz$13}JW|^kp z$lcvJ65f;B*UU{R^=H_{O<4IMC;aWhlUO$s%ENbvsHb-d3T_u!|B=19mjD<(UoHC1 zA=$R*U;HRrp$AghHubwZcesA}LdFV-WQK}~r3K^?NX?WIN;GnbXh(91sYR4UK33$; zq&KJgbA%E}niB4r5>@$HP0a>aHVPKjbZPSz?*H{9`d&q(o0J{NLvSD|S1lq)AURP0 zLreB?QUNEekR3HUnBqL)7}R(ZN_Ktg)_@c5u`FR4mYY@>g9m?FuX_F>?k=!7rZEVZf<{+&ut08W7QBY>Lab6gPfFR`rOz9o#=2Q9ap0 zem|vHiyfRD;Na@UYn8gqvODtjY9?^%#bX*uN7B(MY1B03YsDLci{VwgEXo`LM1 ziNkH#f$?_zbQL(GX|of`VLQabg_=&^YhwHWk`ilH_kkNPVME4GyM`;d+iSSR% zvmM9!z?m6rNdb2z$blV3)POl1Oi3S`mA^b$ct@lvt|_+(-TLtDq&Vv1 z{l++9wQ(eJi*#e7I0ivQr6%Ar0%H;X_4cjJbe$t+gH?Orbwd;#PN145(Y%%Gkn0Z; zuV{|I1#R`}lirzbY@FDv5@6Bi@#;$81;twGd!(>1tX~Xvq#ju312lmlv&5Ni|LE5rbkd1;~5(@}~kwM)4(4T?3Q^jp0$TM-cL;0vcHi}gnjr!bQx zwE2P8{Sxh%KJBP0b1+s#ANHi)$Q@>=&$ED0D_i4ZItz+wChTv-BG)rWGP?b~4jxVP zBDjY_RBX(OTKx8N;8da7Z9dU4-vo9cnvMaeMl)+jbytKkS3P<>oD*KLh{rXzJ0^)% zv5u2Kc#!k*5E5FKvTZ9C#K>9L+h3>FaU)uuMMSWiprs7A$ca4Rx9j7AS}JzG>Imxt zG!p{DSW%RCj;x&ACa^#1gg4c%**2HTh)&PX5;4>+?Hzt`b4XGkisO92@mNRPpHAM~ zpS~1CNvcbPQ4$aSAJX0_NV8yD*Y57JZQHiHY}>Z&sxI3$zCxF6+qP}nRj2maYyWZ9 zia*X-5oca}kvH>;d679X$H-^AZ$)+xZWB1geyYd%iojBg0r(nGrp^`3r>GSl<`J$`?R=&$UWo?u^IcmsP{J+>C+&MYs7h|zL5^3d_Ba35wsJ( z811X<6Oy#J+!BG9bfO>S6Njtu*!Tjh*LUSfIbqd}9Vw>JNkfv>gy=RsGM&KRclzp& zJtUp{hP|jaz*FM~O~omzi4k~5%T%*UR5wZ<(%-wz9_)2GP8}XfC(4${)RID4>}6r^ zGTX=d+|x1~(==}xbB4#b*-~0)@R+*x4YO0myxet6M#t7;$J%-6>S*Zh&b1DI;~r8J z#BE5`5vAHr!7Tj7HE~uf{DrzJmsJL?-UmQ7Y+47iIpTgUloF;)h8=7K0ckATsf964 zvT<#7YMaoc=a_378HZDRGT5~VT31RP+Dz6;;!9al2Sqv1*U21fr=fFXP*-KU{433c zV{o*aIl1P-w)T8L{f2G+hJD&7dtQg=(q3fbtPviGGK3eP6hn8#d&5r&y)x+u-)hYk zZVhKz!p3?AEkPZjuo5CMM?i=vxktUwRj6YBch-8+yY!^yH8bG(2mxk-|9y;nBI1E% z9*;Z_OJ`Q%NkPoo#MBASQO@(K6N8cz(S*G9dm!u=NpC_>?%~qcCB@AbK=W4(+X37+gdC+J+RbbaP4(~GSQx6R`#uF!Y8&6PU)m7rha z&=Yhf&Tf{*=UUjpE-`6_YreME@cw$18h)jb!=}u^0w^h#3uW=7iNm9eQdmsdJx;&i zlS5Z`-fk0WaKJlft}%5cB~RrA@YOhk`kY+(ihTabwV8}o2@2te;o$Csc?8=WajBjr zw^vIt>{R{ow#dW_L+i>D8iYuWlxcbvYA9>su`Ix;f)o|EA27DGDveBE=un)GO{$QJ zc+N~dYHkowg7~uD+x*sa7(bHm+CDl;)|yUcjJWL9a%846zT{=LS0h+9z-cXl`iE65 z*+~yt*+Cu6I%dcDY_fGdd=eG~2X>SJ8S)lx+uZ!ho44U;=LO{{Ki42;c~|j~J0;Eh zk)o~E3ZacpntCo6BSBchqiPN zWyS*qfrCz)$C&_6`9_eAa_R(0GzuKT<;mq#6qoRwP)4&=ocXI2(5Gw5muoAXnsp8v z+=@f-AnYQ_i<@=jO6Rwu>T5Boj*xg;flR-&lH**cSY+}_EVx68N&*d!SQCbevzg}W zba=4Ll1DFv>da}k-p9T`|CRj=-J0}Q_-4-=zMCf*|BuLoim`*aiMgTvKZ<2e-|)mg z+bEM1^=0Seka=v+7AssBsTld;g%eTjoGE?u5s?|xwL}bzO>PubA(NddPB z06TTxp3GZ-U8g}K?OU5G@1tx_4~M6Zp(EQLxO;Jt$bGd)F5{P;bhoapq#drk-A?&% zSG&_zt#M6f94_ZUekg19RT*Fb1%v_A0qq-ZGs_+udgM!@J8B2S94PKG@#efGOW8N0 zASk7|6)cmMXv&d!Vh!$;*0vhZhZ!>_6w`LgT5P9pkABv#F4d+s z4Nux+q*f5B#!{uJy)2lYSk)N!oCUkxkDix{w0+^c(;Yi&8<(fQd%}t6mNjuQyCHzT zBE!#8jfYh_x+9j*N$+ zheK;x(VC-liZ4W}&KqTuiof8EA~{9MLZUC&E{69CAnK5paZN)9p9}diPtkWcX(ppj%I{sGKrr}LAd+0E z(yMU7GcO}~AkeIk%HhWP49C6%#4~qErH|?URc(vo9h@L45N0F`6G9!Sh!jgi8pq4C zbDJy)`xHl}m);zY|BDF0o$&I9d)NMe?7wE{w<5wf$n)a|0r`LZ{?9}3JutMjrgL;P zcd#;Yr28IQ+uG3mQ=-Y(#?;)#_}|P#6B_#uh`$w{fFXYT;P_8o=XZ3sG5l|h4>5fk zBdh-r?95XBr}_Az4aEVW#En0AzS?SUIQU;0@*P5A5GnlFT)HtAE3~x@6FR-Gz^|Z` z_-8%0M^TKa$x09n+QN+jPm{;-C-0;2Z#T@(&sP{dSSW;g0(=7W0h~Z|6D0t#rf9nQ zxH{tsiC~IyokAl_+L^ob(XGGo%)$gC8;T~=y|VBWO3MiRs9CGY6q8rDDO{qUu!~g% zxhcz-jHzvZd5<@1lpxK}#QkzK74>8=n+tSo>(SbS6{hc7FcR!Ndnp<*ZBQ1ofE=1<&F!;SNLJ_CkAE zxU!v~H{t+(HX^~naF!u@m@X3Fj4+-#(iBl7|Gz|T6ep50(TplKTOoT_S;ns{S?L(g zb%wmm^DC*OeBZ=r`V^p0w1@V4fzhI{t;JoFJ8jtuy=`o$-h|UnCNN7C*5#!paNZL5 z+j7;R=hzfkOvt2_J@?6i={-&lm;%Qd4AR=2>7i>P!b{A&7v`Lm(nuA!uSPd!Z(Db9 z7%O-;Cj9E_$;K*}lO^p4ReJ2gTZ92x`g)$wU=<)Un4WS-WO@Y#V?7vW9%M(l=axp6FJ>O_l4XiI7A>cQ-_Wi71%z6|QKSI?p}>P^ldo1Y?$ z&_hZu;fE^rzI$=$c73^>EK*JJZ&3a-3(OLL6y{g|A3T2&#foIQqer0eWxf!0c%$J- z=|vV}kAi{Ye~Ac$cQWcr|0casH4^AK!nj+HhU!-}&~Uzw_xDoa-WLF%bf!zDTt%G{jyn6u4^Ob;th z@FvAr&HEX26XI(4rLSxz~6iQ-6t4uQEjTd z#tIW1Vt0=uXb%ErADZVo@u0%gsb0x={zX5D4r(tnC<+;E5V|-}TY=OXbb!J*G_A_~ zp{`jK|Jc*tyts-_I?`>Q8Edc5Ljlbc*{UPIK-DVGsJupl>YjPuRiAHRW3S_SPe|68 zV>PQboPwy$I@EAc9;=c*A7Noz=cM?g#9svxZY`!1)enmP5BxWEmSm2L5 z$#8yQlyt7it7<>;sh7Z9lW9Jl5Ont}GzbFn4cHKDb_DU$o-CBNTt>vJ?P8{&cm-2I z#}gI7ITI5PtEJ~eTSCsJ66%r2pTS|GbjOOHldjv4wF{hVLpPvaE?{p_W;mV&tM805 zb{e50ohi@#bx+n+t+S~#Ni4d^m+VvESYM057$1F>=)tz3&om2J9xwchXPZ<^ot-mw zz_gMfdx$$ZxiMjiTFVivxZ0>8GzM)$F}&>}=PPXp2(uoo$Xf%8+A$i;8@KB>(SPnV zJZ>-;!GkqK|BVX8cuDz;`2;=*dmzT4HOCXOBV!=?WPN|+6_dPXdP_2;J(pswSf2xa z3wdc6ClP!6cezLw=D^P244BtyQJcvRwn^}QzdRoRHgUWRhGR&{XPRL=cQdy%2VLW( zMg+~))_Q!IPA<=MhC2Mj8`WrJd0;#@1~$C=ZQS;lf2r=Zo|^a`FT8OwI=R`{4hH_B zSG?j;Xzt;Y!m3H#0KV%*!dvh+Ytjo0tj1!bVkJnuNx@W4658`Pn_lJUA-tQk&!GAG z>%|y-3${;zEcCA`05K}{Oi9R^1sRnmh*&+proT-x5|W~xy3cacGz*n{TCVceX5|+= zr6chg?wm-7sTCScN`ZJ(zp8ys)Up^r@jCk`hZ34wQ) zy(Gp!zz`<|^fQ1ER8C(iLr*1s|mn?a>3`jj+afiZ_Okry1Tq!hGs7yRl2p1YE<)3ju(QBX>C^ z*{gcx=VND46lhuVt zQ+|y(_D7+goY`)dnmB~tE;DmiR78f;sh){L@o=vSl_c&*{jw`cTM4{rLRLy_ngN--L|86SI zHI!ycIP}#hZ&4|v+ci}kgr`ag98lL%`VK!E|ED9Q`B1>)K1mC3Zh_b&`kX}p`&6={` zggfvL5*HD-7jJueb=x`G9btSM2!Zmd>%gXIrfVxc!Qx?XlAIWsjKN|C-J7F8;4x}( zr0KX~k4;-)s4`S+6M2p2V!IqtrlZ8>sZn~z_LDW!?kIxf?0^bZ@;!v_r1Pb==4wBV zxX0`W7*{B*7f59xl+L|Dt{-RmBR7$wxPpMoii+@~as)$EQQ^>8(-eU+^)h9KQ0nvd z5ZW-VbL!qW2?{?rme3Yl;XK*TuwgeJB*iys&3RzBwoOJ4csZ9$ERF9-AMN5kx&LvI^#7WUUtJ=XcXTP&$|9 z#eRCkG$ip8HA)3bg7{11G+B5~Z%vYR2pedW0)825h6AIYs}i9j8lCJWe@i&$}teRzHK-wvkXeNOAUb{!w{Xld2U_Z(RE zS4q~_%^lt?JKD0eTz+L(YovVXb03}J?lz&cFz&6+w_WV$UGQ_qj+hvsGko~QwJk?_ zqQryMLbB?A>0);YJMqnn0Kvvy6ney7L7Kn=g;nzS7bx+?{j{AfTpF5%Ew*B~JvjQD z80j{MN$ed+Y3B_uN3kB(TX`Fny)H!nv=telMx=ro+Il2^;qnM!LW4MXY6F4@7y*DJ zOcY0ip@-vri&hZ~N5)tK!{%VyQ1iFY*TVX}tQc?K_!PQ#@Cxg!D4~Dme&F(BEH>pF ziVI%db7jQ2mXM1KyrIBqKPp0MLC2al$Q9^x$`DM_R}Q}Geh z>M9SLfNU6I8xm;)`s>rhGwF*eB%mFcRILaY&#*k|g(z=88y%&n3ThPx(?RSF_|Ew9 z(onVi>GR*<8@XOK_g~+|1lR9;>pu!5g8GJL|0S&ZKgT{f2U{2O|Ia3&Ld9AUOBvaR zR(vJiir}{{aN%;Y0b*{Mu%*6YVv&*=((ibMhqZ~rcxo$`z0T=d#dkDkk(m>)p%c*| zygfKO?5T}@5)wbg$iDGx$0?pCjw$!ciH`T1sk5yg+}%wO_XI`wmAk)QF)lG>1n+cG zE0rIZZ?U2)FfRG$T$%Nkq%_U2q<0*)oX(|}R@lmVjgP0&8c*mL`e)NF5PCcQ8vKC3 zTne0`Pn$$`dEs69wN+oA)y=x^P=U;xkxZe*^AjZn8M+i*Abdw6)zZGLDCw+nd%@q( zE`s2t_x{XMX*dz!d7{X$h7tof214)o>pwh+{)S9}4^~L=;pSqu8u&D%$^EEokFs z+!}eus-2V$KGDJ0$OAs1FWhA<3iHWYQvj@O(l14_8i2*@$Qz7P ziQ`XRW(D%KHf`C3$Z%@e3K&aUW`Ir{PoMbcMuBeGygh`}?mZZt7kbI1a5_1b{1*F} z;!+mCpqzH81d9r{8*4X^HzE#PIjp1@y3kv%%D@fKVSgIQjaS_gAr-K`-?-~L9HmM& zi>>r<2T+hTKZL$%(b+=KRllnY$$!<}NGA7{%~Z~&ejSY=2hZP37^6oj5W|dOT%f97 z!tx2=oV0i&AOvfgE|UdA<%tqY^0GaW7gwkm9264t`tX2^Iduxs%cB2W;G15|QqY?R zkOGWOX>m|S>TAA68%VUy57$e~V@{HXc}T%qT$NOGxQpy64Skb0y^%jdm}1E}{47I< zisl`53+kLjXNgB}Iis&$Xl+r0bX`j~<@i*P)cTM>WR;QSjGEo&sbCorvqZe~$VM6Y`oWp3m@E6mrlmq%*+C z52T+V1{pPPM$DR~cj!6re4~l*&S>u$d9Ge2*-emDhBfO0qA#TRk!vubjw$4M8w^_P zZKsUd+qPnAavWzDaO7Ck`%rt!J_DSMFD`0@EF7til<=G$D@hPx1=Tbm;E}U~dn0D> zD`$_lfmJ+a>z93W5O&P%5x|RQbV~RIj@(!Lv+dU-+aU7pjqq^T&RAn4+@Af5Nc<9u zARswq2ryl_ZLgVA1@4N2HP0VL2oauG6J<;P_;2MLHK+jiTC5*Gk`@1Ng5CejDFy%0 z@Fo0@($IgSeG^&`UP=QWU!SBylB{$Dz~F(Bv;-rhz=R>h@Z%st4)|euzXwQGh@r-8 z)`21$SHn%Ic?UG;7p1G=%V2H3(~ZE-$KBUd?5E*&cRyzp+}mu=&Zp z9j&_GnfN?$)a`Ix;qt)h1vOKH{W8a#bvD9JsIDLD0uVNjAzizGQMtAEU6ma}Lf?nH zqu}Ze<6O72qdc6pux+1SVVSvx2;l14#>!2f!Ll@aYU$gObE<1=&2meGF2EWQXa)$1 z!a51OT-&X8>cmW03z#dx1&$x!=8!1~s_AfBAWE>Z$A&Oq-jW~~LcFYLacQIIq*OKK zTc5GIs)oj@Xw?#Ah~pF+a+AW>`lCLL$pk!wr55Cg4H-!hL`LOn<2?p(bEWcujjeg4 zc02GINBJ{K4>@HDqYv5g=q#yJd1`lW9l(Nq_~jCIiX-wV4pEPr2rZVre%f{9?7;sO z?^_8BFSxb6zHbd60PUKayMSe<2Qwr-H^3nwC)sx%YA2(X!q0BTFJnop;Z3--IIq-d zcl*BVx%^W+G-39m*HPQ3fyB*E<50|=3X^+)}mmIdn)f7j8HyXgK4?! z63|B{Gve}(4ak$0-A5)97$VmFt(J%k z8X}5kX&yzjj8^EB#cv)G4OQdUXS_Wx97r+(5ebxe(i&QgKdB;!jpE(Dyf1ZG2Ibk_ zE^Trs&B;1;%oD_RA0o&|iN)=D53*iqgOZ1{94c90sVzY+xv%jkrMO|l-fhgOwLI$Q zJ0y1>IOz-(gfQyp43wL=~I<7yPu(h<9$1kTH)YsxqO!7xxo*!#;#6^Vr^~L zy=44U!9uIsq)IsjRE69P+k0w21Q#rbYb#twhAu&%QUA~eBp46?$_KV$CSiRmarC$d z>e0uw-YK_-qJ8PpLIRb7G~1?4kOIUDOoBp?7Hz%K%!91=lYX4~oY)AAr-N6O9NW%x z2h!&p&i28hb+Hu;yBSf{+$|>hY1e}FH%Rxz9#{|N}&sJc<7cd^lIJS=|6dHY{ zPO?B{IVVhv9(v$zAc(1xaRari&D;%xS7vV7<^ZgXYNq^-@|p>z_YTeiNiprrHN+%A z-(HdlZCab)P*!sUfUO8gt*qTA!PzW&(YhuiNy9UQn_ zf?nn~m#VImj?b2eV`Ln+lURIaRv=$=IENUIX%_MFvtP3CTqfZgG}u;2g&7O$+WE9W*f zRj}`FPkn5HW6h`*7+Txqiql)^74~2{%jfXuJ-1B3w`;cxh8muJAxGn!n!LuA62C02 zpAp5EWyxY)rF)i$fW`UJKVl3%+CyyD$gb}E8R$gKsHBX$>|)RpUK)ovwr9_<*`)jE z6FngMO-8;lUWOHW%S~BH)@S@4RWS z=q}i3bQtN(4%gJ#bJvC#BEE>?zz`!Ci1$Q)R;sd(ru8I=Yn>nh-vlphGUh&!`R1K=i-3Yn?>k%NRsPXS1=}9!E5`AWFt)iH zSU~JWaaQ_vV~g_@M^KXssObQdI6t6L-8Wde1=z`8+Xp6M8pEH-8$dgpbfZL5O2U|%UFCa#qPmcl>)U2A)NFB2Yj1mL^*jY{(nou&@y*=OYN#zNJ zpoLYom?3dWIWmSUm@~zkh}wWMmJnC8nbMdIvqmgILX_37=|GO)a@x$GcXh(zvJsP| z^?hH*FWf0zO0oPdHTusQO;k`dX=Pk0NSFLs(`%dJbZ$SRbn!`l)>tYzs&W?+rlLr~ zUxOJl6Dj!EP))55*z`P1j>3UkW#wYoJZk|EGYL>Z2f6bWY1>3#vD3{1&!Vr+{d zsX3@>ud=O$OYV$U?@HK!$)g-BWibeLh*_RctVMlt+vJQn0?pxk)hgAb2E-ZG+*0yv z3ntATx2STai9x?0JDWWRx0g_oUCJ2r^^#R-UJ_L$6k`2aXV=2U12Vi zT3dbgbn>v!-la_DAyljgn$cWPJwG6dQ(Gu2(4E4e7j{!^Yg(tRu%pID`(T&EvJfgN zw|^>sf>T>6rFw*dAFiKtrcHGG)NB%0Bt?mhLrz??AWwIYW;B%MPZO7U1kl-E$=>a4 zd&Swod*;oUe&d3Vr{j6absDtQi>@A|bJw8OS0ht*83*w?T-kN9CPqCMdy^M1*QJ<>Xp7~8fsuA;bM{UgW|y8gM6TS;CeKPIu49K)632d&+vCC#qkwg%LK)Q&X{1PLn3-S+n~}Vy*#%5( zz}(w@K7+i&_#+7qx$2I3t4i^P6HYOQs;g^7d49zCf?a)+L0O!c?evKVguTXnD5F5t zMQrVl6Q?>Eyj-|ZK_Yj0u~cC{_}J zG9$sCjK@UrSuu!{Yh5ShH}+ z&GKMg968~uS{u`yV;(zz2x{qDojIu9XIPlj46{9)MmggN#5k0RgPF?#1UYd?Z2*vl zviNHgKM6vBgzuw`!bdV1=q+TWF>&@rX&MAYV2yAr7ugnBtx9Yy)t44mmse{F8ybVo zn*9~wmek|o{N=N9jc1UwUfWt-C+YF)o@t1P+L>>yYTn0-KZ&1$Mt(xO;wfnN-Lm_b zxN`$cfk$>z4RYy%jyt`?BC%?cEs#qmOwpBv)Ijf}YNSo`qe`-{|Dsb86fZgEP`7EI z8d|yysZ2K4j-=r3UOBk4HUGkWv63kYdF95|q!LN30N-=TwlEBQDvo{JRcaE9SIB42 z86R)?JZgsB`?eR`ZOqQjCTK^6?J7?;*rJ zgJAURd_7zpcEyKq&)z=$thOc;ZKPU6<976aEWUZKe4M|MO;^o0Jb7AAwCQCPvz75O zCr7%Y;K^Q3HGZ{{^Vl&9Pd;wB0%wyrFB6?6CAFw;_PT1!YB?IIoA7aM3X=llz;l~| zDidy&D~us@C}UlM?j^2`7tn6vp+$@8Y`A%zFR_`PQb*;2S?d{7ipBlt{Y_Z3x4}{< zc3*`27Z)!Qh|gXwQWBvjW%pnX1If*!`w9-mQQMwUqxX?XO3wgq?QW|tIX)w-vm(%4 zTt%eQ>MukVTCp3DY2f9sD{M&HId)Pw9Y>UBp;CE{QP`1Uh0gjsIvx_!`ofTZ_`0`B zG=72RYqQCHdEpN}ltahJ40I;XY^K{a(n)dHvP;;~ZSU8PA3)YPFD#k{y5nq$nHRaG zXOX*VxW$VKEi@i0ER+zo;hJIB<(qr@eP&Q0=;3eB;@LgXJIU>1k35#F@qa$VpITf; zWMzjn*(HO2C+%J_c~6YEF7(NjAV@C6=-K3oFmZ&z`CxTY=`!Q!@vnO z6&Xx>$UF7W;9M4OX{%lY9iv@**{2V54&s~_)!zKJy&wWQ!rkFO1hH#1*7JCMUG1cb z*p~>B!ziVd&J0@A5bi$QV{D6k+uC}clku-)Y|ewg&H8{yL{VPwvo zKiR@Pt-Xod!Rj?f4cecY>0pv0UD0qnSa*z_Sw97?FT5m9DR4~rQOlP_1m!d4T;e4V zU}7&5VLI1H_^6AXv2;Ra%SO0cCun(g(o**S^07#krD-KcySo!!o6fn7K-c9}zFB>6 zux^vtD!e*~fP%o27{E(d|DD-Wr(xm=D7YrnPJ}e=v~x(cxqVsx>HKy8Yq4w4yFyW- zgOoDp1z_D&5GblaXNn8rhQ}FDL!L=Fq2f;Fd!;j!-} z=~a19_g8pm`2n?Xq>x$0J0)20ni;h6u1?lf*nQnqy6qd4^JYCIdwZwBZO!A0<9ypT zwRp$&?9NU4_hyB8Dcu+H``>*=nYQ-RNZ{Y0jgoLdar__uYCO<{;mX^gePxYt zGQ{x?$v%{Y5M4>9sP6IS2v+ZgKnYI>Mt0$5EjYkzUmpo>30H^-Zt2GEgTMaH&d{{v4xAGr z#O{XQiULOn?du{eUUwk;*QFpQFW3vts=eEfxf^__F9Pb`BXx1zZVxYnlx@l5K3=V` zk7mr69Sv-`b5u;~wDViBumr<2C&)npjII9Z1Ii%=H_oi_4;S+v=8(Qch)YXW)!6sm zuYUdqxu(Y<)a`f!?VgJsPnm_4cz2Fe4H*7K5aq~GM_>{;20=JoNG(I#XVk}hf!%vD z*$x_t`W(uGipGocv>eJF>+bKhwRBPKW8EKVFtKq$?(aS!|IX6h(%Ry$07Is$jX%|xcPKEcK7fD@#3XCESh-{YY z+psmv3|^Bqe8zF~V9++OlQ7N5tW?VM(T9)W^#ck(FQ>?I0jqu5JJvC}96}0kQ*d~e zj(D>jwBx%#2=bssLhfUi7UGrem7?s`N*{!l4NfSc4^yo1pR7fnI--B}^a#RmT}9U& z3HMfJ=u}wYE{W@Th9uR!s8;`yF#d>BMnGW3{~#{H*Y2}{d1Gmxv^cyG-!#ZUvhX@5 zeiKP&q4_qG7k)p6vm&V43B{-$MNjD`oyD!$4Z2mOYz*Q=fN;JaLUy5ztaBv&5bspx zq8iV_z&?U}gjvxtUdz4Vl0 z^6gQ#2Tx~6%vfXxM)*kjG_mQF_!NbE=Llo-9dk$D;_=6WI1d6G(CeW0)8Q#|Ij-=^ zr2YiRVNzKO(OMgfwSpV2Opwi*1et>NVUF2+NWQiadc_Mr6CVf^obv~$74HZY5$@v^ zb@_G^8~GCw)1tr@?FE{zfud+rr{fkCV7c!Py2;cdP~KW8Nmc(%{ry$H+dzQCaaTpI zO%qQ$H~(32{1zj=1r;ghVZO(3e&Upj(_5uUQh0z6htoHfbs&1sQAf&Ybs>J2d_Z&X?eMppru0j}(A9rBk#LUb~t@DKuG;NmS&qHr^iqI;~Q z+b_@3Sq=o;?si5}$Gy!2I&nHCXj4Wm&|`qqX@wO#-k#LG{iIxzA%u4?VGBA(xSaUA zLd0`n@XhcSNiVoxV|UX$J<**u@$~_Jd%z9$0Q0C%!rt%s%FQA!DSkEvRP!f}!bwK) z8~i97Or^`3^7It-{e899NrnfSo=!{uj`SXhTQa6`5z`g?sH6LqDrHRlmNbTWohq?y(;y1d`b9bZ?cn;E%i zlut4@95RJZM9utv%X7YoOYthk78|4sXXP~mNnwb}sC*i6Mw&YTo6g8nMI7iyN(`Q0 zV>?z*tC-Aakp_w>#*Rs)jY!!Qj~dWXdhJ?E9ST_=l0GI1JR&Dm5z8hBw~owNFliYx z$!cZ>Fq{9K&90}QStG>PGy(_YjyEQF{Ieg`o@D?vAkUNA~jPYi=q zB?;&tljXK(>Bx)6tNF2ojsXd1sOe=e9&I4M$>?q z>xPSA^S+$Du|;EVR(YkU#GV#LC@H z_#~u6eZ@ynKA5Kk%^17T`Omu<8hcR+HhfEitS<_Hkgcn)6kLXiSVst@8>?Jv8b*~Dk~46=-mQ%sQjXqQJ8yqxq%ci zNh(EV}lk0^OyC1Ygc zRO4<&4h84#%hK`uad5m=BLJm$6=c<2i@>&t`mF;Q?w$iML_gYbv)`#dyQFj>4+I zDep=x718p?wx>9Ah!9q&q@i6a#bn3;G?rTQW8*>yoo3XFdDp2d{&L*^GBM0PT<>m; zE#T|p@B2U=9FF0?O`PR-xLY=rdKst4fu@TI1C)2Q^1C2ym zhvf+hvpTpUSO+K&49R(Pbq_LT(?v|~X&Mi5_bo4~S8G=8uV4bLJ_G`skVI))g=Y(s z&*L(T7D|$b6`N-P_xg@ebQ;V}2H%7QkhImFSv$^NV9ddusp!>^7J|QGV2#4LKtS^^ zv@oh2RMk9Pt*EDPOS^>SsJ4D*H?{T9y7Zkr;6>1Uu&!HH$}H$}>5jj-57CQ!vM_Dwd%}o&0;jHke%{qEf z&Cyc046_0WEfm(Vp5G~4n$kaRnVJ?sQ|{jPUty&*AZe)2Z{2RqZ(vFEKY^8mjIE4K zzmZZK)Bl}V`XA1KnBkuqkP6n8Nc`|Vtm2;H?dfV|Q4baAmKlHCnBn=o0K^o*q~<#k z@6&L#Et&~YDQnfP;wN;sb&!OFA3s0I?JqImfeW|oxtONbC;P@7@Ai(G9DmTsO%Mgu z`$dM4P&1u3TNs2CE4=BLDRRsEU7XgL7g&kH0^v^7v-4&^1|M)dnGzbgDV1b9(W*aE zhfq6!-jY^!8!f+iW`PGY!n-Iw8w?X+K)(r$xy}}4L5r>Qy)|bB%UY*8OHI7Ed2Gia~9dkbRf1 zVF!Do&}*l(bwL?D(&U~n7-0@(@PlAW<};*01@P|tWYZR+9a^@IGzQ(`wCo8lJITUO z*{}YlxeRnh^1o~m@j5ZE{Q&vbDb^ow5~TbMu}FUNaKiuZQ|!Md*noI$URSDOd z@RW>0nVuSVi}HT-Ax7iFbWIMr`z1Z_5zN^2EcC_Ajuv{jE$mGK$?CcFX zhu}uM#olAVE`KTntpS$cJT}FWIb|y{TeWnGIT`w;n;L&C1TX&#=rLOY325!2ii4DK z{|ofZOWXiVUEczpnfM|Tl=w0gb2=8ShU$j9&@&xMXk~f~z0@u-b8>V8^u%M@CCPq0 zz7}&+iC3GT=~G!wI>;<~&;bGo`gM+!t#yPQtSCL`J?I_niO~$NiM{<>`FAf6QQ<|Q z8q%Z*opH|e1B+I>+WdslaQ8{pTNd$V(>2ni@Tvw}MH)wLZNl{E%)l2)6u^t3r_!S^RLpv}r1g*o00ue(ZVgyUJA zhj<5B9A3xY;%s~7uZ9*+ycKqZI0!9f7fn+2)WIu`O^CsgpQ_D~%nPqGM&RaET<-Pq zJiyQ^x1<^snyr3`asf={te z`(HRj(zHQLE+aE9-h#*r6^A6;v{Lf+Rt`&R+q>Ix7s89w5nN+Mhpp>{GBe_;QqxE% zYy$E5yRE{GVCX#Nm}nj~_?BqO;4;=iG_%B{jvQw5sedq1KA!1cj5LJh-I zY!Vmj;Ku$W24aws=>Lsk{;NGhJ^n6Gmz(ejbQOiY+jp~7fH+u)Bi3Qr$sPNQqg$RMCTa1)(Xj8*<#>a#AELt{#ikCVMWRG41;s8xeUIOf7-qbP(-X;nawV*7)QCW`v9?%Q9h>w9!bQ z)-AMZxK0&z$e;@6Qkx*8>k&sM_X0NEFf4Ay@IDG>Z|<|3!35U+DL4K-x870Pfr^an z@a`{YVOcSp$C|7oIseWvmryB&(qG*0!ALK@2;2S4zNSwdXf#ou^b-(Lrok+qxpnhDD>x`2ly~^p0W87bufe<8>z0_4wuFak*iPL>MR~YSPQ& z={V`0eU#~Vb$I3bZ4aR|6V4jEhEWDj*D-HRq#2%|T|MqLxJkvSqQ&Ic zS~7s7~zlsv5?DX5X*~4Lzgr_(u zv!Ww^FtNXg6lPAlAZwI3Agjsmrt*|du39+5?YGNzU{r%7wl!VVUmNh|-Cp}h2) zfU#B|(RDgeM4>2W$eeOyvNZdwx3btu4%1E6=a@Y=W2H>;hY7B<@NS~vp}OW%tO;Wl zTpp0+#DqC58zh>;&H>fYX%#vp&zX}&W3ikWRZyNPIDS;8LvvyAjJU$ApUbFaTwgwH zq|NS_$W2(1WLAf{#r2FM>DS*-H}jVroBV|`)#Wb%*_prgX!fvJ;lz>fq zdnv`mediU0#`B4Ed7UW(n7BPmB01@a1(N6+ElZga>q}NBaawt$lCF>9Zz%X-Lv0^2 zmse^_+_yKprmFdIu{7Pc#&H--tZmL?>QHQ@81~80(L~l^X!kpGw>8QI%M^q)mAY%eFqm znPvQ}KN(}T^FntM{5u=2SNe89y^D}xACba>Tt{gLBE@Ozi`cioH5j`~;UTQiFyuTx zjHld|U|wXmnG?NQ&+yN|%lgj2B+;23mEKA{FZ$*fF_aB!DZkqE_?}Fx3nugjjL27L z5gyQ9#Mc1ijSy<)cy&!*k2<$<6LV3aU;~tXAJKN5kFoUZV6XGoai99)`^Ib13H-u} zdRTGynllusxg%EZ%lPpUB1-K(bd7NbhrYV|_oBFO}xLQ`jJ4^q1)pV__9Osl?MWp?CZ90Ex>yx~7|x z!kr`O8*nIAe)w-W#~-w*!Ju!~&L7{hg5v*4U==nra@1EeHnd}8VYOuV|I0i6JJ?RB zuDN1~Vthr>m^-VJMb9;F%)%!n3dLuUPc+0i+zE?I8&frCHPt{E(^M2RsJ5M6j)sAY zQzUw7lFQM8jAnIS|L~U6_+Om8V|(QBxAhqt9d(>^Y}>YNRP2t8?x5m|ZQHilv27Q>J{4K_q{?nrS zg|X*~wc+#M$uuz-cjUIzY>**5IIc)Aj$%rs_gY)=y5y=1hC$1O>zD(FK3!Fs#^%DD zsZCjN#-gZLgN9bi#GmG-$`pwWo_*RSqII2 z6rkGrT+J%_D=rFL8c5S7eoNDPoR(9LV>@c&A%1DcT^7e!dRuQc6{oy;t+eT%7#jaC z0dyF1{;*J-M|WbbO4>9{h2yHTLK`M0sKB<<(|-1W?tjHmtJLnh0HS%N*sD$I$pyRf z^mb#bRR(fb(N?Wts=64G&JFOwiQ2@`pBNJtl(3QBi|U)jRg;Z)y6*mop9)hFv!R9# zBPC`RBc@2`SvKqj(Yw)~zi~5|r&h{OODTv%KjoA0eZgQU$j!*(Ojeo@{*{{JrrX3L z{wbebK)?d_4eEPzdlO)G00`n8wI%VSa8LsH$)v3{Tt?{U7v-06m+i~Jfx@IbLgUcH zNlsC6e!o(km+{MWmc~;u5P^o?vbGXV5L6VI@i$P4Y!}~~)7q1W?Az9?8dP^_a9SmC zCvwTDg{zbk@$IjPHl(w86{SG$xpdAank9N=;HHjYSyC1= z3gq}W(0h1UJU3};^TPW(0F8_<(+ zQMN37_QqTdBoU2_J!>VC?5sYD*sHo`3g=2@Qn=0&JX$&qn)%9unN*jmc-d`F%^kKF zaGCbxkY+(%7>Q^|EuW}-9v=?t4fqe{Hh!j>X?Pb?{At{al}uKTNKDM-C7l|o(K?Gu zFB^JDtsGgbj4c8`ul(O)Zwm~u+ddtq;>!LF6}t7LDgMOwg^@J$iV0^h5*uV(-IRxQLEfk$$SbK$#G2BWe4-yzwQzCaJZ%hl`edmf9bp~=?>@bg(Z zi!(Af1=Ld%oc6?fhdxHg7VqeJ3lFZ(%S&TUHBX;upN$8crLCX-IowiU;*py3jMmt0 z*}||b)k6at%KWl_t6={r;Y0=S&tA!~^GT8wu%xylKT?r;Uz@*1BOGBu;Ph*S#q-H~ z;u;mP2-mFFctLz9=9A+k&``_(U19ywcGhu5gSSSi>10m`FS?NrYiKA+p@2ZtrkhdX z;8GlSV=C{EdJ%M_%#tP*-L7B$QN~QeA$!*KT#~*Ia_qwgDuh&H1|=v3oSPh zvFU>q;tz0V9QoeR4}`uc@>_C>u7#b91ZQdSwRd6{vCb(1_n(TFk(azuM{$tkW27UN%f z#2XjJ)z0V@0#ugY?z6nZx;9VFzS)P#hYaT-e%zY!A_o zYoI@WUhA=ZTyFoT`6J8Y$HVx=p9sVR0~7fFJL~_88WFAK;i4iQ-kV3w9T+!bjE&zx>7o; z`@sa36eCorMYHi42mvRBe)Sli$e!wfE2oyqcKg4NN$9kGTr&E$`vq#4@*xI+&f4c? zk-?_G?2C(d=C1rXF8X>Q>yugL8#$-Qs8a+BNe7V(Eqbwdw~uji9mASu%jC zww!lCcp)CL>hK|!sh9c6ab7h;pIzcuYC$f63&nLe)EGT;?qCZN~2xL^vh z8+0dzliODOMyv0$(`36j6bQ)(pYn^OXad;_K{kU~tnD25-}6PGw2FdpU&O63cr|EB zC8MD#;F- zW2-`+?uH^AIk3}iZw5K?&Iykq2lwP0%kCSnkt!9kQTdU>sZ9kibz9HvFxdVOYq3&` z>oH!60j|OXSQ?e8wGuI=@|81teHm(RpcjE^CGh7r~r_dk4uj^B=X(Nsr zt-R^NUdm!)qJrxoqs<#%PIIIL&DQ`N?R$uZpJjKD8|LRJRY2F@w=7-P?+4;tU5ue8 z{nUjI28*B{VDV0*WZMuN*yw72kRQepx*!hHy3aLMN|PMQ zAToy{R1eY>HB&ni7RUbbsSk$qFmZAz?D9)f7n4b+2n}?B*1;NFWJS67QdYmz`3otn z+eL3|GGZ&G`t(9JDJ#NH#u=ijt(d>hLCtO=fcA;d-7K?N!cTJFs2`qbdbOmWKOxZx z_Q};zmcm(z0#X5r_fx|I2wT7wHAW*Bv7pepwq9(uenyUJ7``SuV0qtYI*P!L zEQBoz(r)&h8`w?-WWwxC2PL`Q^^Jp;n^ysZt;na@hsr#$zMimXPyMB|T83d6csD%_ z0Z}&sDc*;$BWe7oQqW**KBx=y9IHm)!3`p;amP7BTkG54eq6l<_f;Ma#q`A?2Gorv zERtdb>uemkQ+Y%|%9XgQ_fPEp7_ah8xMulMjZV-xy;NxfT+A2(1al~bspxSL_-6uu z!^wle$;>dtCmc(nyL>qX_x99ULrP(7_CTqdR%%*H@k?)s(eY=@(C~luRKuNhyY$(Z zHbcwsUWlXI5YX5_=>)`U3N2EYFc)lC@JRmG$$iqLH_yF*6Ic2xHO~+zwE9b@aW2X&89sa}MI0@{D!;>-lO-k+i6Jh+@qmHoY)Jh4h^kLyQ<^-( zWL6*@EkPoI9AtLMUU^7LdvcnY{wM> z-g<@i>_$u$lVNbk^z%#4)rCtTDvC#_zq7?5Am-n6Zy+7u^XB-(YY#B2&=w8r4m}{PQ_Rq*vhlKp2 zDaYf-Ev-+~Iiyu3WL|#X%TKlCxGMLuWMbtydWW9p5#4V}o!I7-?`NFYWB=Q0NT27g zv0%)>TMJ^lwHQA;gzAJO*|M2I<7_fYNX8dpfwV-g^Op_FFEFjj=eC`*_}+sAMyJ(dZrbK@ja1D0M=M8k3|@xU1pF(N~YDk9FNHrBi7ByG!4?z%U z-kMQPG=i`Zsmm{%A|$Ppm0OOQLF*OPh#i(Zz&dAMr6ujXfVt>@b)bWn{(mlysXzQq{sd4X3cj0w+=r0EobS96P3H>d3?P*+|pOEZ#D_`ZU5KmBx2cYkz z)QrI2#~T0qIVCvOny2GGEDKbn9dujA;$L&9k{$6CQsgRrau0JDoYz{>Hvtd+klY+dHlqz0XfB>W9vIh>i34q1nksa>@uC7 znsnV+i^dr=43?0uk6*?y4}-D%zogg@SC<>E2G+&7^_pGc`*|UWbE=On>f!U%vqRRu z5F4tzK42+~yCmm}d+w1Gj$ixHUi4{utMYf1q`SJ=|NdaUZU1*S-viG^<=2<#)Q$!Q zCi*`TqGqfd94tKlZ*G(A|LQs1#3qj>3W|1;&u0fEQ96|m!|h+k65@fQd_xzr z=9Lb@A+tW1g{wSTw49UL>&~FGpZB;cBA)Z@m6=a!udsa(`;`3@)zp0ILWhJwvT!r6 zx}6d5INES|Tz$%Psrh(6H4=hxBnm(%fS<(k<^2Z-m-%OH$jp4m8KF%!-g%ahqCv6h zVojzYu|?Lxd32Ofx9Feesw>iRy<7^R&+2#@NH}+zR>z@7*oB{kQ1TlIGJp{61j4Ul zP2srR$D2rq%bs^BFlp1Qy~r59?YHQbJH1C8^|ds=%c3@CJaj>#QnB2k32ohO-}65W zw)0~43k>c$u94z`JdK@FR!x=$4c& zE!4q2j?!WsARnik-reXwi0;{`w_{OR#2lFvxa~p$EG&W~j^qsmCbUtItwxu7$52yt zg_bt6by`s`foW?)qJHxz=bqoBpaTE6i8@2Hd0N!a7rSe-SRcv(_1q@PbXVmkQO36i z<#8CSlEDOP_5u8)xlS5wXXy}Jf^wgH)QUWkWhQ2a#a_0m=%*_D#U#~azfpceo~xs- zx%aWl4tCpNmLEL_3j6q4nA&i%x9S;i7w@)$$Q9uTw(;S3Co?W%4V)+A^>CXBiaUNW zWv3D*0z2F?6E&~$RA0SUsShVM4$pl1#s$s4lGi?KWJ}k~A)ens2zq1n2|*mo1eJ{R zqlI@>%$CskPM7i)_{bqbMFptG&}%2dLCL%Rt&!!hQPM?-yxH1nx6BJk2j?P$Vz+K| zMltD05pi70M#XOW8~4t>fIO3SRv?vI)DGgre7!*(IUmH+kkn;xGb}D)0qf3Dr~Y<` z6JbhAt`XaI2s~keo?}gyLmwM&@eRFCc6ofdFm-qKsEGb7OOOt)X%aj?fs&aWRSx_3 zMOLwv7lD#N(nAW>Al%V41@iRyGb@tj8{;d)Tjh8ykI`g_Tz#`k#0~DMUOlgKeO;qM z5mkxg@R!@Le;G*@M1>H<`u~ji?z- z+2IwRx>QSly<*Tzl_tOJws4L0+Xq``40@gqNI7Avku2Ea?@$8c<qHt{!CZQad;vx9_hB)MHk%+7Riuk%!XEZzj# z{Gw7Nm6Jej3Ln+)GJlBReA_g&W!vhcsbiM;(*M{ZOl2!*BAP4jvTL5<2aeQ!MD00Y z=$UTamM?U=1?(yh?fJ3tXa&GO%-zRIpYIfJwMeC4!$O%UZok0{dMo2N!X+-Sb^E+3id-RWyH0@>xA_ z*?OW}9v?b#7^>wbWw&XhGWKeR4XGY+ToLke(C0-qmPh-@(|e6XvqH2VkRdN8E|ltT zc>)KME~|?PU*e_{JThvX2ZzW96v@Fdk-vX*LjnP`RKSQrSdX$*|MCm2=6Fp1i0w8P z^{E?$FUI!X$-eo+BJg*>T;edxEZRerXh%r0;b(`{IkImsq*ng#C#P%5{D7;l*Mjb; zYSRkOo#}CPsJB|;$#ES%WXN}4&fXI2nep{`fMHzWKKx#^@)d_~hHh17h%fARksPnx zueiCV>-PHeUi`%LMAsnIhWPFn;%~PA7?qY=F)ZczRN#A#agJn$px26H7E)tHBvcfMo8m(*RyhOma7=?OOesyQclh11mfuZc`J35_6)* zC6xYHODp1PvJ)VW!#`n1`w1vm{3ZoY8uh@1b&57>AShOcCM?az|8p{g05kS6e-MDe zbbEVOPnxff+E12$gr;&AR=Rr}5eD|RYiRRvRu1i_+U@)@g#T}&TLakP8#-CMcLUWI zw8CXXS|QPUKS^^XZF33ybipAN(O|Fl39>5e9X1X=p_1b3mqPj zkurNmzbW*6fvsI&oaLAKr@JizxlPj5n-VHbt<>jyoJPKE~$ECb7} z2}G_ykD20~UlBpvgN`%X8tC3>^cs!p`K*I((@u0q9mu=UD-<#7yx`qL>)yRfX<$Q~ zkLZ)!QDg|9a&F-M*NTe{;ySZ^UeRrLXmPNuAZv(RrbPF5BcJyM@;ekPD)PHzbe_0c zjV`P{noLbcN$(x{f#1=Z<&2iCk3G~{$j?#xw7j!JGZV`}Zl#wf(3?n>oYf$nw0gtR zd?kS;iCH#6z2C!*-h7+kKNdL3k8vAcQIuZ$9lh$5%N%TmJ5IEibN2-Fjk$F@Hl2|W z;_`|JO%ppBSh*F-#>Q@BfcvL}STyWit<)9g=mR0Tu$G9`4ZSYO(w)PizOsGhK%xGzQtmzX`I;@ath1-zCDn2hEb5?c?5eTirwq-b5J8xz|3c6ijga|qA zBVPY^#-~AX9?P^>-o|oUzlz^g3@k>Q5*6@i`ZQQ#I2K`}k^M?W<4a^2$kkVI%8CH- zAy{<%R{aT#Z#+qwED8Mf9y;pRp#wQyvTVVpz3@*`53ePl*g!m838nz4dNVB|U zItkxHS&H_^HYoH@Z+3SR*|U@Tb|k8?#W_sK-z?2GkPy-*ir;99&1st~)Y2|SSFQ&Z zHqC5E`B(*$!)Is z!dOb!dvNkS-Tl_NuJ|_V*5@5GE?nG=LnfjbDxoT6!AP$1x?F=Fw=l(q%uflfS8G48 z6i4v8#x=Z< zjYynod~mgr9sS_B4lmj$Hsb4T;ahTy5E%BRNG}<7_m`A9v|`WmKl5gOQU}jIXa0b+ zbo{>m`yX>`+OG-tS1Yj14SO6)lNKv;D5v%W*w|r>c$q*-_y>$qZqN=c8iI@`ILYc8 zg3%kf+B47_+5bxKjN{dnh7zW((51U#xMW}%HeC<3ruPHd!*J%;%dh?q)y%ak8P1*1 zPq6=ddI7^F5Z7OXvN{|vFs}c}(<|fP3a~X7w{~#^xSCr1*V|jA4eyI-iS-#^mN4ef z9s3QAeWqWvdJ4!yQ%P4m6UWY$}KO}0Wa zE?dDV&aqrE-oon^N0)u+&E5P6PyYj#C`I+POvS1Bn>!{d| z2|OebIFh@skYvxip5-pK?T)RZayS!|h%8Otv#qz7TpEOiji5+$l%_T>-C%ec>n^R7 z@cnDhkrX?oJeO-z-j}3lO(?9(Rr)JK;(>Wq#WgJDF~WKf751g+1j2%C!ugM8qr0W-tdllBXxR5 z{tKqBLn4nvn4Q)1LjFfebWwh2=AiVapH@HnL2Ozm4olaMKL?yqKYGGUS(2F((Oyu* z7LgY>$Z)QW^kHOG{_MmL_&Kce2HvZJ%(WFigbOq7we^=rFOll0nES0}*u!++hb)Gr z)UhcxEH)SvX@H1y*R=3-JZH5LohHG*i%T=5nG>Zj*-D4^REnadSthO*j+{^XZ5@+> zD|j>u1m(6l!9uiK90twMZ_oHeFA<`m$6hKIJ&OB3Fn;O~iXYQ~fF-7j=mbnX}V zq~iOQQb^eq$@#o<6`*EJ0BhqgfI3>B6vxkIR54PIJMe_OM5CTdrh1HoW{A_-3ITSJ zwVN-q&L0b>+2x{Fu^p2-gYDU<4Anl5PvkO!Hd(-M#7V%RHbKcd2oOp|{I9SJ@GsML zwlhvl5?ie95Ym)vRnYvDVSj&1_nq8=FxIHI&w2VK0~lzgYY9Ff0PA>K)J2A9Fv`-f44(fNJ7{j?m-T3g$u#D(3!b zaglM-xxrG#pfr$fDIpu3D-o)qp~xJA6ixcM>se8&=@pS%_0%Y+FG}p;)M-E+)ba`m z9w58N+6n0)w=#XB*crKd8!m?gBc&gs8oZ=HZ|jhseC+@%TNO>-CF)Gs_iIgYq*~~T z(9n7L;|TU7)0(pn?)&2p&}$sonJ$eM1O19tiE*(XTN2m=I|kK;Mse{V0z%y#IM@$2 z(~|d`78N|r=V4e8{5^B^sDexv^fAK&SF^I>zFBc3IB=HWAvpqwuCpm;^) z*mp9~pVq}^k{!VsD2v$2X5-z#q@|M7ez8HyZT#WrJplO#s}nmAEek}2k=&;`zq@^wnvEX!vv*hUwG2S>_?@628f+kO z>VTSJFwZkr|`yJh-Csz00+dyug0ik#=OK;K`_Nz+G`^dL}B!rTeTTf0oRzXP2yceWkA zds>HI60C>9=^1{b4ZstfU0_0&!c#raI^Oze{ZQ2%t1VyVhHkk`^=Orc6d1+h{F0}R zwUFQ%&{!&ZxM)iFgy0mIxK(;yY^AkV6|q_nih)J(oP^jj{FD4&^1jEjU%OphY=v&l zR>d=fb0r=9JbW7;p^tgpY=fm##t*kqO5=u1ZJe2hEwj#R=y*5f!P5}?HFCt9s>x0J zd@~Gng`#eBCUwkxB}Q82kBJ+yPUUb_-RBJLXTFiU{Ny8l1vMnPUrE8i0W1rO?L%g* zW}OW1Of2;2iL?~|m@1MdVP!8JAWa1anVfzFujZTOt0bMURbH`&fzDmnvjeHD^`q0$ zUewrY^4Lya=GjZSV}_&msCZ`yXR?E*=eMxI+yjTvtFmvhh2xf4;7UAJf6#XRfo0j$ zQ{xZQi7}l5VYE)L1h-kTl(@nno~j+<25R}%IP!y!fbxsPT3J2OYluW4tGtx}gr%d_ z`8VIHbqw~Z+!qov2a84Q9={K_xRLs@cPmDDAn!f|!Fk1yu?LT;py$CE6+R)SN?bA1 z)L<#9uBxl9xr$5E(9*bZ@t+JOEqGRmA?cMiZ=z(i|H+sMg6dK@OO0R1yax!qmYopx z7OVsntVCigJY)_tcmivGHfjKwc6BQHxPzGX=?XPj(1+7ZqJwoJDrdEBIR2zs($8aJ zbTRr8ZVSVA%T%~gD+1m$Vb)vNRG;s(18){4zI43f`7O^IJd*nqi(E6Ay(W zpGps8{(kvzmUdtVoQ06c-vL^ilBHb-b~QeVd-jA@oe)|6&@0{B#zJ<=!lN`Sl82|0 zudd|?N%$6xxw2z6)~?j}vY-_gqF%~Z^@-kf(C!rA!sW|1JBf`PVn4g;is2ojWi2yYRZIL_kSk!x9|%985JIU zP@sK6en`jQyh8^R9TR_VP`g$-3;ZzH8w|KM>WoVNg#1qtsmLF;cmM+ihKd0OCiXuO zkqYL{wsz)UQqtVn0buvPJ4XI<_kL2#)&oNV$G=#n-M(E`q*M}WKtMq+{}&bvM=wJV5CzW}$avWV|gz9%{FsVHx$+v#uNcNTUwtZ=^XxVR4m zxRF@&Do%vStn?`moJt2WH?9XiTI?ByB1@4JXf6lk*Jmf7b~o|TQMK0k2!C;^&5-VS z3WzbQt2DYv!@;U=gdHLYMy_WfSy5oyL})j{)77f>P0|Kx4}Ei<9e1?t-)XGDF)1Ek zP-DaScVHHix9Uz$gW)EOQ!hEBTUmf~i$ksdNqO@AW0SJGFPpNOd=gA_|r1b0^U>4&KphYQs@ zd;y99Xt)8lhIA1|Rj)^rnm|9=$4E{+_G1s2kb4Oxj$N=z^_h~rAFrElPKIC+9dbUn zq?c~`s`bIjG8(k8=An)$fdjOAIGKlLbyua#F_u+Pk~CXKb4dkvE|;>Cpa-JUQvr4y{F4~AjSVf8$V|Qn7A$z>Sx!~b;y&6n ztvUOCr$Wp^jT4-bs`6(s*F)`eC&;lt4m1`QPCioddZ+yRMa z+eSoQG?C2HW&>4(7*pm+V2NAJ)UFKb2l$iL=w$}-D39gf0++IDN%+h5X!sTWNt*D; zC|eqMlugc7m=b5PZ4r%SM81aEz22pe*W=(uVB;UxPny-tl3 z^G??XPf0xPQfG1hVt$fbXsFl3bx6*r3>k>b@f}TKJ8>!0mI;5Y!j7_JkYl=v44Ay? zRZN}Y++_{A0NE(IM|KVqGO#!)|49V-U&$uC$^STFz}8NPajo5ZC6A- z>S%;Zav@mOMocC1h6Ny`KKm9Qv)zBsi<><`G=h2qQM!31XFoVQF=Q8%=wkNXdH$BH z;l`4YrGDxq6TyCmGcT?&bbIc$XY*#eCXM8 z4AoxM4gEVFPxv5|=QB93(n|<^5gy|SIex!@txPErjNcRd`!Dh?#N`K30kqX`po}A` z|KOl>?k*{7Pb2gh;wZAvsj1QX13j*VQEW4!(vt~`0N>bI)je(x@}JW;`Y7ryw^<{u zM*x){_r)+Z^k44B-rOgQM(<=nN5jD^&!B^Cv7V>}m0Mq8Kd>&~^3YIh?N)Dw)sIS* z&X5+Ga=M!zTYVjk_!6ZAvo68c-BHgxxa+(;Z(zi#>4O(!uUA7OhlvqMN>+zzX~@&& zm1Ze%Dl;#z@R=zx|DvEy1x3L~xAz>GF%v<}j}Szdfa?kA=UP`X{X~Y0 zWqJjGGo^f40vn*z5~wmcSK5wiuF`mLcO;A3*V08tV@8!rufk zcopzAR1p&2iW)ITig0AxIPyvZNn;@-*hK?dsv4a2dE5`Ug@t}y?O+QB272y5K2r}~ zP_iiQCI1oYY+$pTBA5no3HkfKq3keTV#W4JqojlAC2=WRUTht_Hase$tLy<%NCoE0 z9t9dew1Q{R{yW}bW#dsk()Ozx&B)zamCAop>Qk!Vyu&W3Gfv+UkQzizv^&TCw%2y{ zI_X2qwRhTUKpewAwULPeS@sIM>QkagrcBI*zK_#J0}w)8xbyd^i*b`Lasf?St$A9u zI%ZrD+w}uk7MR-oC3XONc8O6kuIrqTKHC;b#F%en0~5rySfxu&gjA04fDJ@X`$?C; zndmcQU|Zp{ThAsn1>eGH6)AVsKGGB`=GjJ#*PatO^;;4P64Ajr_Uyxj%3UW2SKoM4 zMJoNTG&BEN&khl~>IrV+n@BVcs%B}2(t0!ln&wNgRCbxHvC9=SszKWoZ&T^z92kSv z$9rz+lB>|6VuO_JC#+Fh`(-%rxG@80 zj;{SozGN=F2sT`nU80jqq#ni(6hv6UM6Nl;Jjjgcquh^|Wc$%0p$Jw=mrVHGqA>>VKitiDyeEtGjU$E6Ocv(v@G*msQqJy=FAcD;A zbB2j%G03mJ$~nht1I-j=TLL{Fx0@$oVn>|m)!Ly0*rs-HE zGV-Rm#I(336FPTC@hJEzvKtyJR1;@;t^L8-CJhd{_j)Y}UZuOyCT3j%HFKem&D+zi z_DKKUE211Zg=-c}s}*V#=vuV&<5jUHa|rFugr>Ty^DJYyu9CFdrGUoHLvP79`EG3* zK^aGTj35R^{jH%gk+qbFr3(${kNnVm{qB-c<83(%6d>$IDx^yTuPW3-FEWzFQvnE87XVj z^SIskDAxFpxuo=$=bh#qO(4ssAsAB>J?3wUkLA@A|J}sJ#K!yGm61QRBl0%%EVL1r zKl~oAE&o6i&F_cMdwxaJ!spCy;P?mWe%}$ssm9OwuQq8lQED5UJJurxTZQi z5RxrDk7pUzclXBko4^V359&Nr^nsO+R>XP(6S(q-gcO4HdV@)I_0{9YdTV>AnHMohb+o%mf%Uzs|49SxgOB)`O>L;zpC%8yRD-7d%M z&?7KXJ~TsT6`*o!5iL^@4kOIBlxsmo7Wrm|*^X+!H`wgfth4*m;&I1xQ7#4!My=AQ zB<`%ZknyLnNze3b>aniWUNbOa>DEA0Tt)WRb=={UnzHp3$bTNI z{z;=B7;}}QlkJ5nCf6Tg7h|Gu!LOtcnr?<&#>rO*L^9~YV@)jiM{POvJ(6S+1-H8T zY1ecE&RDZwfjmqv1B%&|FL^@fBFRyYRiWEg@E7?&Sr#^pftI>XPLp~|C63~)j!4<{ zEZQJ}!ws#rG51C#@U~O&JB4o`dt5!HUfvo$s>c=siy1lnKIen5J>x`%ru`Ou^ZA&4 zY;zTz^j1==1W4M!ku9Q|L8gz92>@L&sK|A=cj2C*YRY9nX5D&tIt(({T2V&;fweO2 zf(sVaX~ak8R~Hh5R0cewnyjZ0+p}Fa4=6z0rUkqCPB|8SmlnYGNE)fOph=uN)KuY^ z@k=;ciB$#zz)Dx`-P-QIH8;F6Z1sT4r6azl9gM&B+qnY-T$mJ)nLAs=q-g*VJQoM% zn-m`(!8(QZ%nCuw`^j9GbW}f25L!49>$6iBqJ?}y{Ywg07mgW5FND;_e2mI&E(Nv$ zM`J%_*a4+M23nNj4zvO_Q-Da#7OALu;=9*f?sg+sExP`;NWnJq* z`ksyCTAff^s8@ggY*wwS4)9seZ6P66^*uQ)W0rGOlmRbVzdL z^{no+PyP8}+pZ~+w*0)zyH*&%bZa+zr5@!U3=T9^zJ~rwE8qqI`Xl3hauhd-Q#q~S z{@skjHl7ZNkUR%>@Jaos489rFv`h*8rcM?Lo)MtMvY$v^v)9iaW85(ztPKDHx78eIVcv73fWd zbqgxJ6OVE%{f!8P?Gv4?BE+BoVKqp&8pJ0@^D;M(Rm?_oBm!C&YZYJ-(QttFa^xbn z_NTb-8Rjzid?fx)q2zazx4ZVmBvJjk?f)Nb1FC%$_5$pzz5mZL#s53Aq3ORi2jY>! z>9%GQ%U4v9xR&K46k=()@{o;@bFF?3SZq|cs(@d+qY~;)ltN2)8 zn8K0d5w{b&TO4QJWxuVyoaYFAKsjPNKoFiBgjt1=4m*xGMz(*B-(Gaq%y*ygw(r^} zLujRdta(&(&?WnvCyL_l#f{sh#HRhM4~s^=;kOX{ubf#Px!T#4C5kADlj`5MVuHkR z5ytC6YRcGNG!%sa6<4-68KVfc|T?4tlp%pe(D8l31 z-s=3*toKE_^(fV}M}@!`_3IeVxfGF*!5bE_b{RN&t)~IU7jH%H*hVZaVD)Z?QrT~Kz1b4U=oLJj~tSCJYUYVUUPjF!xN-|GRuU?%2h24jh<@jR-$y1 zm1-s)K}+rjl7v6d(|$$tN;@#a>>K^|8gehb)%vt5M80X3+*&zr>EefojrYO!(i&r(dUXOX~9e)b0F&Bjyra;ykH*c|A>l) zRw=ir>FM6I%yec^`!vmwXtL$^e&r$ zQaQu-o#@dtX-hW*Jmw~NDJ*?1~-ss9oz_iOZ1-y!TN9-7cw&$iM&!s6GDNz zt*7k0B?I$3IWOmQBu{pe;2XQ5dpmjR!o8>=YtxJY8M1MK6 zYS-!xL_wO3Mr)N>V2N)HVQW?3Dq|nB2oqA+FdfY5BN!H=IzFkMRp8&=^@&&^*klX% zl}pH@>f#H1&fMQy8BB5l=iwziSLQwqi0_8@OH6hPQXk|da&!biNhO=c&2I)dZFq*Z z^4b@oQILCdk)2pU8mL?n6GsR($^x zd8_3NaCH3AxAFjc6ElFMo2#3%`TsuG&-%X@PD}2}%zLWRy(|<5s(9;A;`np=cG7qd z41?rseIf7(*d$Dn;q+c+H1Jv0Z-{HBrfl!vey3t=YHLo!yk4@FuLZmUbYr40Bk)K; z?$hSePk(uQ+~2PP0^Yw`p`Q}MNEk^-_MzHwV6sc6)rXWPBW{h);g<=3)q!996MixN z1cR$#8CN;!@sr;Zjv5W+vhQsU_=oMHcje}^>0Np*^dT8on+M~-swJCt9h&mRs`~Z= z-s(wQpzHiWGgDPtQ+l3D2B7jJuLI;jyycmkZe4pfFo>SSf(wwX-LZ4I^53nw$urmgpo`g@hYiF$%)3Fdd% zKct(e1G0z5r!jzf(?Qipp@9h%5}YGe!f6#LQ}?WhR^ue=<97+(o~O;T?=5m?$s*}} z`9)=4zvWyMB@y0Is)kLUj;I1F?9$OzeNEz<*SjZ)p6Uvx$hNEe3`>M}a6|-DPIY<5 zpW*@g^(vk}>!=3vg#ygA3cxK6sm1K-@}?i~V?)?@HQ`}y@GZDgmpRMKP)wnU=$Fj; zHXXl*u=QO+lujmQQpO}tS)@_ifQPDx^;qRqasvI#A0W#3+6m?xO=1M>-D2kD1vct&#)0#l8A&hw-MQ}Y`5kOgm4ip$JhsO&k# zT9hy$2OnYlL413XD2GZvX8%D67QJB2`BD*4;Jvv71Rhd8{WxU2%6q~p+eJ8*$)ZjfI! z!1%`#A5an>CwzA~R(+0bn@qKWC=IYJAW9hn0gZu~Ug(P;&;K2K0wubib1B#>h=hfm zdH5P#bq||-4}u*HeDlX?9PAk^5u$KSilPx zN~uf?TUz#iaQ2STnWbC1a4Hp>6<2KAwr$(0IH}mSRk3ZSV%xTzRGiB9bobu-bl2(L z@B5t}YmDc|v(^~*yyv{8=OnTCh)ZuZRo>(a(`&15^U@y2P1t?Nv>EAB2JiCUQ*j{HXLXJ{0b8GyWYOy*oO#Hwo@EeL$Pa9cD(Y2hC{x zFd@p0Lp(|Ik-@0J4|>N`QV#OsN6Zi;{c~_BU*2AgTjbp5Ae}(rEA}^`j$0(c$ES`j z42S0-kpZT!pTjnqpLu_?$NqjVJ>h>v74v^3e17q|&!ug@Kmr2+xdM#3|Gp{lKOgvG znVBg7p3K}7jU9g*Y3T6p`GuJYqc+I&C_&z&f;Lj-VwwWYx)Sq%O)|jvWK+VxxdaK4 za-YsJFi7p0F+@MZE4z{q=>_)rfp3w!BK4&XBg~M6Q`A*^Mok_%yuO%uy**tccOzRR z#PGAgj}AcYp^t#S61sf-e3!A9`EeUFXw48q>^1?vtz~}V{HMsxzPy3!R;e%YXNhx< z9KlmxC~Vc}AQ5&3Isx!Cmy^)-*{@5u4FU8FM}eSAFoF2+y@CZDTr%`rT35wCJYZC` z-Td@h$UoNL!g2_79pYqjB^Clk2p(t*IG@x@=?1}Yjt4Sc(9OB`%mvG9nk^?LR8@gK zY}gYj=PLT=a7396WkHO`zMaV5TN4pX$7Kr%T+o+G$1Ao4R?bv@%Otw`*b4>PiIO)( zM!k`5z))^u!~EW5Flt7TMnTh{B=qQjVJVmHQgfa{fRPPaStW4Oj#OC1g|%pxS)XqN zJG~!k`||@4!M=u^2t`S?EZWx`0Sg8XT8Mzk7e{Es9jK&YYK$=PJbWAJ+9dP+sWF4e z@k_l;vsnJr0j-_(uvw;+T_B}u0mftB29ymMIM8zCy{@rpEX8tW{YmWb4(8;F9jlQI z@$iYHj!DL&b#f+7e#=4r%SqwM?XO`QGSd;vl00byjL0{@G!rBh8Lu4v7Zc(ZfYM&4 z)D7y!usej)(4r75rerdA^Vh{k=)bxR5vE7tTL3N#2E=#%dpG-k<+4B2UxAXQEHXdJ z&ma{IiP46T5C}4haEX2_gKGf|F-)5NPnK7KFz5Av1V0zjE7%0pC-n<-k zY?LwRODOeEw8Dwk+=ln&Z){Y^h=0T}vtR)EvxX>|8JlIswkpA6aK)O@0P(JTg#ek3 z!V`QT**u_+JS|WgSV$~~2;vhje$J;w(&lO;y)Zh4$VJwM>8Ph*?#u~AogIQ6Wsn-} zmuScX@8AjWKk79PDnVB1rQ?f0QsyL;Qcvj7qE7ciW6%=s1(g7^1N+F60c(J8h|Yl- zklaiWkK~5W%n)nDbR5Hh+gIIN{7z@9kQ7jmR{KmhGBrOGx3PrcCd?J*a9byfrn-oB zuuxleJht{cV#V@8l_}0}$26RvOoABA7=RRHLta^iy=b*PXbk3^sJRfO|A{PMD?WF~ zTAJA+GJcB`B@CzoGLKLDR4buXt&tLoC}}p;y`+oys{yp8(SFwKwh3a|>(5;M1JH_Q zOx_}q*#XcROY&Y6${z$hqHtmzH~2f+4T)?EjRE|oL$RYn4%CCv$5&;sccryNkcIDp zJ~0<6nKUFJ#QO&1JzxBd_8~rqa6=oTPTEpmTfll(^S3@p%@F{r_mT)76x2Cw$vz@S zA;6rEqO=lWf9}IenQ_u5VN#G%bHwqW6Hv`y*aD`B!^u;JrpbxipbUv2mB>Q8VUK>N zTv{P@x8B4NZ1GJjD{G8 zxrp`_VeMV`@T?d+!D_o5-R=cm^}ua?(_D>Xl&_k(*>1h>EU)(!(n<6y$*5!cy3=T&Nd5o%mmL1^_Zm)Wc@jM>KWv9lS4@d&F zO#Tkge~<8={~qCuT@8)x9L;TQ9DV_J*tGo#FTjvm3V_}D4lrt#J`$ebW>a5RGfgw@ldMt6wY=NOu(f!oT zvlQf>(;^ee$KH6Z=ugPsJMKU$@7}Ez5ag^zA0q9G-6WG~hk_E{z}^Q`v`mj$}t3~awYP8PN&Tme&-cd zMf(j~eto{+TR8}IQN9$-#HH|Ub$Pa4n`h;(fKkJjKsp9(VMrrj6wG6KN!2H%Q!*3A z*f7YPa-FnCTiBr5kBh_8G)TFcDhKK8qAwkP+_g@pLhMx+1?jlB>IWEGn(`H& zIb_jY4h@|~_7KuuSX%b@& z;nHE8_FEMlkAqgvM;+-6Uoe<*{lL5xwcud2eQn0i`w@#|rYjb8iTpM)0xT_7l>Sta zf$Tz}umg%gnv?c$O==4b;|n$eZQR4F2ON~U6_JVFt|k++(_k-23^xnJksFyHP0iEm zl9=;s>qoog2gARhfH~98Q4avW-~&+LAIi-CgaW?_{~vL>UzjB^c2uT^4<+b*Tcv_* zgHK7yQMG#sJqZGfHdNdnI^soxgzh&4II(OYu;2dpC^z6B!5oHQm_EkN_%^|6%3*s+ zTLq-CG#e|RAxIKU^##~z&}IBe9<*1-OyS}=i#!|K4VQcqT3Rx2`sq*!&n1@&wE=WS zS_8qnVe1+JAP8i5cHf0!lp_kxbM5!CY-TCV~;VYZ!JCe zOf`w!tILCFDXn(~zQf5wKHqnRth0zUO$@C%1-j?J$dw5Wf-$Q`#8gVdHOl0&Y;yNCD8qVt!*Q!F2vM#&WZ3BJw<;4t7wkC$l{ z?N!{gQaMWv-j*^lrJvRDNVif6pc;xH zHJRVF(YcmcE5{7NvCAOJS>JtNsGtGM%Nc*fL#=CCE1ZLNl6S4l7Zx}&EqMMUYEA@3 zm3*qj^wEpjL-)R{Lx}2;T87~1Nk}PdpZWiMM@@H7O}X7x`oZ$#uOmC4EQ%DWjOYLl>p>ewb16 zLNd801WNJZXzscz{PhHy>6zkY^I*GAHV6jQ?A}loj4+jKBUzk~Q?aC5{=JJ62U;yB zyYNfta+frTo;!o=adm^Un6EVNj#vDjGj+`uf7zC@RqknJL0yR?7p+ zhz+l#&1!aQ5L?B65k+o*bZ*P?F6dMust{y7yF{m@@C|cUnsBKBxLrFY`A9<0izxPS1zUf#x4 zq=mvLm2IDr%%)HHaZw#aSzJss5s{TD-n;mr&o-v?&Ui(8%pk3L}+<&X8`TAK_x!FToZhsZTsuuLp<6Ru5s>{ zZSlUTg*HZDj1%x_GUvxEQjyJ8y1AEJ%=+VGn(4Z4A40R!%AuA~>&-g&i?~}+ADj$f zOzt`b-z18VRLr&cQWrGks-rM%c1bcdkeL^T;LRZ^;>UhOJc+dPu3(ASMwE$k0kw+X zuzWoXm; z>l@e>^Jh-79IM{a9KTY&Qw6WM4YeS`OCo4RoMP5&PiAo^6euO#W4R(x;QjlbJ|AuE z=EC^u*57azB@J<+;2Z{}o##N-h@&V;-@@6_M(S!PdTbojwDmgP&}J#pF@eDW=mhrw z&T;|SewEiPS;zrcX8-vZ4~qLo*<>H5Jg!o?fG&Zm*iV!6u`xsFLcM$`uk zs;MK9PHcFiayMOUjpINW5FO`t%GDenoMNI_!ru2hLEkXix&WGV$#hgTW&AQ7mef8F z2AmN5?}aro*VkKRqVgF zPW}_)`Kva3LHiKa2w=DpKuhF5*s1?{li$wH%G~geq_VMzxsCa6?(ZM2YKO9=EtW6} z_pa%A`D~xK;ta6o)t3ym)qHZf43M+@0-JTF{sM(iKFrndHvNu9XV!18NI$_6?I?W% z`c%D8b~e;komf6vbYAr{aym@39B!m?{ye?h{0USYNUGk4AWNu^7n;yLmh&o~7Ujr! zkav(X4+Wx--e?KF3Vhu&GYd0;A1|`djRND_pi*V|%)6X5doP{l;!$bd=DXiALr?kE zY1m|>_pqjY>hUQjm5-(Ga=4N>rm72W34&|&Jb}Hh-uE^IacJ1fTh|?gSXx)_f-ia! zE5(p^HlT~Pqpi`fhR0T$uDV;ZrLukOB=&BkAed+5&g}_;SvmpHutKEs_PSX+^`;$zW8Qj^psz{MtYY1>?rcOG|)KlxZ zhKJ~S;XZe)w5WE8jwFX{f$8mo9X%pf)A7%>IpxPLTB}qAD}@FZW4w|9c}k_u`0J>b zycA8uvx9V8TetK8M%cF9k*y)ZitP8InXGZbY{5!H(8$oJELyV*B-ALq#Q5>AIo0{% z{CX?_GI#c3-fYX=juZG+jt1KXHe;}>ZYFys3A9dZf+VXpk#we(Tpt9VFdl^b6iO60 zqbphav4fpUTLbL44`qf5m#4gq@rFRpb!)on=*hRY2h}g1lJHOt~P)*wAV;%-= zLifgIF*DC#2^vOts6}E~F!7n#g?I86R`JI2r41-tqYBx(`8e7e`)JiLbz9lf(|3Qh zr)Tf(-??mlwW9w4bqQnl0~B%RF~F-T9$zn2NF|0Ja#oF)lSIAQmlDMW^z<6y=5{tNy*MK;z`kARO+WudbfCr z0S`Bl!KXvw4cR8$Ty*7D#+(FP%5_0$!(D>}t=X04XmHG%d9tURB(0(!vwMJFHA(G7 z#8slhx|YMy)x1Qu$Z59vVd;85`cpEM%O*o^BNfyjU1f#0fY`7AfD$yCw7tXu0QEI3zlT0&-*oCRw*7%{R#? z<<2`!?(bhXJ=%a_-=lY;!r7H@nwhouq`NuG3fWjfi#EVdtP7>%++SkHq9P+bcpE`X zvX6vJCqdFGx)N3}?P?^o%yqW(N4=>x#cAV+IEJXqITb%t(&_Q*6+v8C7I_8nT;@>%*WG)Ep6EB7E$oM_J_>2$6tp*Kys4}OJCkvcFDXbR zI>iWT6!)o$>mM2Gecf}O@<;oNnkR?V1_`uryip-qyNEGur%n(%(D-k)UI_b0*>K5d zwn-vs#=i}HXL#eY&hMozpBjspr{85CX=z;9n7~IP#V<=(7{U)H+(z$_|7aPYzxIrN zs2FZMVQsrP>XuCECOy)YdAlGolFj8Zwp%QorXbVlAd{y``WSOEF(~PuLc5 zNg5s+e$tF%4y3Hfvdqf&bGYS9zgNnyab~%fKgo7e8xo*EhDjI?$FgpGgiAAwq-fA5t94kBhNPysra=-WlA%;2%l+Lu-eu(XPlX99j%%SUIY#+ zdP7RXeehMA4;J|i6dcD7ZM>K~evC8F?Tmb?bZJ_tF0eYB4eHp8OC_2xu9PX_`Qm%I zCWLHV-Q5k`+h;sRtou2H;$gL6&UCo&@=7^JToI?!l$p;68|=-EkCg#^@FN{pemS)L z2(Htfe}b&z9>$5@vu=S?oQxEpwvc;P_j_jmv0}YQZ!f-)x%5wJKDgQX!E1C`jqyYT z7_ov~(j)GlS2!Oz0~}sV%Lv2Lm2$3arr_cbi7~(+x%!zQY{BYsVq%=;zh$vy8AK(R zMb%7^AV|U&GLkmCNYS58Jw|-SanaA>z{m>ztn>OyOlLp&1+NQW`@8}=`6&Mf=KZbU z`OmDIIIe&tiV`R*Nhp$Jtlk55X9=^U#@kmby+d?B8r40N8&HQQudqLl2WDQKl9P{5 z9)fJEW|Xd~x9h~xmk2uAOhFqXDz*=+K$ARtynqKG&aX7%D0_O}vdP^f`h31l3l3y* z#Rh`=%27`Te1sfQiKUCxpQO(kmR(Vv?xgz7cBPiuMWs7?eBKcRlwgowdC&%A$`dCD zVSpGXmX3yyB1S=9paqWC3ZuuA;)?vdU1&6$?p~a%P&?kvneEp~QQBtF};-Iqc z(zQmv^LWrQoIZje#}0!eU~%O-V39&+%}T|*OzbV}AdNI$rpt)8zn}dFvBu#yzSVNN$Zh9-xV1uY<#7^x>jm9StCVzq1nF;n|5e+&)RE3IdZq!n*|y60zVeFGYp#6>(L$;EjaJHE$+p0 z|7b67e!1>2oB&S&A%p>nDqRrU;UXF7td?m6y!l!$kts_5%Of8m{4NiV(MYtC`=;h& zA67n!cn{(7_NNx|-E8qwkB~z}dTcLRc7^G!iMz^ZZ11dtWLqr}t^#|*j1~yh6^wyuzUt$qs-nm5vav^{W6LMa zFGbQK_N!9ZKP2?IhZb;V%PC0k-sO86OW_XQgc6vx3V%u>firn~X!t-~7rfTz<9x}F zhsbs;Oz>??4CFp`bABmlGa6@@u3aqP*SHX2mzui{vE) zz6-=tM$9ICe>n0*zX!T~m9;1}lzr#7SK4>jzxqHV0l2N>0K?}FpvdU{2ORi!?S-JN zwe`Q9pGbvOK>Y;*x6Dkwbn;qn#Tt1NM2!HK0)jPAi2_uj!Vh0o(_Io8EUaZ2g-6Oc zaH7wTKs-?N&eW)V(3BO?rW2{lshLktr!Vk8v{&E4fWuG|kjlS}O|cz7XB}us&phNA z#q8{ETQ zLehx)3R9+-g$uhEtEX4xnJeN)q5vmYg-Ecs* zC(%^KqTzNKvW<2uJy1@Gef3RrdeLEj0@d0@=KMMyVREV<<@|aH!ZP?Kd}+d=1I4hE zb1^<=cUd&3F!N;J#wzA(R8JbTzQ_uct;DI3NT*1-8e1o6 zX(#hnnsUg4XkMp0hZ^pu#bXqr*BoD3FO6<@ij#Tk+%+!|gIqcI^+= z_GzOwPX#)rg3Fd3vDdwaS1oVX z1~1SSW)PA)@W2WxMLW7J8vk{dT>*oPv`XyPP!`gcn0QvRajXey@grz-nrn>2{u_DY zTjFCfec5i|rWul#pj;pMM}9MIq3*Z+`gELJQmP(Z)QFV%no`3Jm3Z^h;5OUHf;|fo zJvw#s(p-Dv7(22ptMyouE>sb;x$T0-s^t1LlLASxmqiK=r{HaJam}ihvW~(aysfXR zJA;vQw(8w*gEYF;gUK<~lgl4WJ-xsqu)klE^w`hb^&GSQRXFi#mvGJiRMZAgllC8} zDdJ>f_**nW-|FAA{1+juqbDUk^1}>tl{Z+P;)2kg50`bY!OIDOP@_OW)7)i6Px zl5^Hk@T7s`b_d6qpjpt46GQ6Wyu@vGUE%_{G!Mlhl5i+dcrC4T2oXD>w%78HV^+n( zW@(#Sj81r^VsrQGr){dU-`kd|RYb}J@UKZDT-bgJcB7vUDl2wo(qX?H3JoW*PE&F| zajYeR$>wQTu3w-Z^s$@AfYR4_rDRYJDqJuz$xMlY!}eIML>!omlx<{?#HwK9am7V) zvFrI^@IIPF_b@zHRX$!Xi-(;98#fs}oy?P5N%{nW5u{+s)}Okk!U^8^SHht)jP`>8 zh=v3}wSQ(q+23mzek0r8v0;HcH-HThJmElRZ(lZ+~3tn6VS1hys&X<2G342~ zfFzb>rVe1ugSe#j;5Y3#)EBq@NXCth)DqJ`xSTG!Nf8g^tUIGty>wJK2>*8)tK|o( zDZw5)R>w84bZwXc@A#Cdbo&)&7ghMS7IIdrlRM1`BgG)&^s@1rLTnzS);!hG(FQ36 zHvA0RtXSy%JyXJBipI$Onp*<*>&3uRW>LVv?3`|%1axtOF~nAeQ}M;vuT=IFPQG=& zz~JYQMJ;dujS2wIKUvqdwEq^@-%4PFj2-{w7|M-He56Oum}@9&Skd5eyWYbMVRxg* zqVTJxXrA$4d68Fij*pW@`AU-A?GL{t7&^S-F9xp@GzJrY`Eqc3`u4G#ScIGdCU|D9 z-A%rc0_*ce!?YGgR=jeqLRD_@QJ7X(fIb`Aq@Sw5|Rrff&aGNk2CUR5e#YK-k%X`6*HyxP8VpH6n;cR~26DRJmvsWXm; zr+#OK*xhs^5h(LY0fNA~VWA!hu)X&8Rds_f9c!+X#~S^28@TUWEJz#>ZQuNz@^hAk zSf-(yQJ2(5ePwPwA-?&ntFZStcmIqI$AMWnt2S=?WjPJsGhS*gfZr|w&p$uu*|EH@*;z!Q&?l~F4fA2wN^-Fyg)fdQhZD5+aWK@snOfq~A_%$L+vpMo8y^*z4Bl{GH|Q_9H@NzJZ7;x)695k};4!qdrgd;J|6*n2KnwT{ zFv4ifZD|36&m92pZ*27IA!U9)g~6zfaL-2hS=66>ojIEze% zlA)`Ska3cf8b31B4bI9BpPw2T`=L1E0|>e=SS>@fuNur5UtFl~$KMa|_a+4XKOW#u znVrAFO%RO?Bnd!-#sJShRaqXMos(4n_$gX~krP-J zEeN9E5;*1O3YAN>vvasc8XeTakiL>hP;rZ%+6afjLv+W4yOlaNck$jc3`H0qfjzGq zi3@ddv#7s~?V@4fLXHPr3`$Hz8WuB2I&J&T?pp~_<{9LWa~msWQXBS!FHm4h5+@g( zkhECmNL8mvFQaBILSlmZ-A3y@B=J>8y~qA;vZXcPi$&4Ik4aU??^9#7YC04TLY6hR zL)S}zla%|uHG#$;fI(5p0+EbgBoCSgB%+xI-N1uwzb*QeIKV(Tr4QpUv7L^Qm*=Td z^$0>^1**0k9e@2L9e4iuI3^50^mKs!{D<<{zY<>1O5edj#@0~;kdXVoioWEvY5Vw4 zxDAsPPAxrGg_Fgcxrj6h>p0RYVUB$9{5-f2Ifs^X*O=6Pa&kU%@+>}nQcQFQvxgBx`^4Pj z`8jJf_*`<^0-2i*=I+xJc)b2q-DUAr#`op}F9JADn7n!awA&7CR{3rp-|xUdbgz*e zC4{Lv9vl=<%_d959K3Bm7!MDfP8v29Ny5;X=~TMeNYG7qz@y^iM)}S*T6ZKQQRCJM zVG1@((BB0s7Z~XJs}D-Mqil`#JZhxfz6oejXnw8kyO*&r5cL=4 z`v$8ajvEa{GTi2f7`K*Q=owUMh(07wMT@5Xfc&MXp5b2ym z7@<*UiNP3IU3-A)fZ>ASK;IZD5vJ}6?61-V+8PI20=VErK#erl|3)~)|ETO!bo^qh zZ!Kr*@TVMDrlPg%tQ=r_@~H~?Za+TlPK=CjD_lt!=D1G^x|A9Tx@civU%q3qyq4yS zbNA*Aa-Wd55ATTUg|!>jF0|&C$(BQ&L$?X;!~4rFU2mZBE#*(1VkL54#0Y!o8f|ej z3U|{_(=7*Cctfx^4Tq>Wvydwo^6wM`jqacyfqI*D;vua^EmMDx*|n<>i@-n$MSVZ= zZAMvMfqo^lEEJQCx-nstRaY`y^8D zg2v?awfj7T6}0ENCxkDYVgOx)c8JyG9x}e4jYLW608m~F(~EYwC{ zm@4Z{=3YWlGgiU)uZs_TV^7O{f{d{xfaUdGM}6@8ZkMd=y<+3nk0OKX+uxH?panY* zR#n>cL8F#P`H5E?1cF!_R)>{~&uQQV%ZNcMnFH{xH8W%220eH_aV(b2EBNalmE*up zGlQuZqt~Am6G|k-4u3Wbb*QUEeck#Vw2wrk`M~Kr&davrKFeLEgTh6&gWq9tJ?axG z8@@1DuSqaER2Yd|oxOLbAGJ^pg7!@hOm=9rA8$;MloA3A$xm4T%4&ctoA2Btg*2ZA zgTz3o2d^CohCD0j%+C^s{P|<4ybc?GW4cvpoC;Cur{0O-xd16wV=4rVsi->&`{MK; zg!rsBWb$_X#5~f?o$&%1^#eoEh2Df+nG{(&HlCWPs0S#s+-X;-odeGWttbi(rJ!QX?j^CU`#_^-vLXLbqlKTcl#Z-33P~H zDMyf=^GPM-$Xbb>bbkI4!k>hMeuDu-K@|W|P@exEBJeMj`-`T@R63RUy-z@=F=?a# zf&xXICUN}>`Gzk+m{uIIFp_0RU!ReAaIF!okqdNW)sEt$=(G^P@nXnYw$52Y%9l2o z7-M(ny!>iv^8Whvgw-usPBb+@SC&drbyE0sNPE)Gid{1{+ELcIMJLupdob>eo5q8u zqQcy*!K-_er%Em%fJ|_))2sMUdcE=hz_r7PLfCNuLQqXHMn^n9EE^}w){JA|oazQx zT`-K8Y@0Q+lVIDsY8*{3bY8aeqKHLS|^gJyZGR2iKh ztTn4oFhWwUZ(SaPL&iQV>c~C1b_0rr<>Of>3JHDxlq@7`v7pL0#XKAwcCy79lq3ug z6Jmy}z6c2PU65jrp*whT-NE>Uha>m#4(50S^&&x`Sz2p9g0?e7MoyjC(yR6O%Jzka zJe6SUQG%0$BAIDIcrNi$H(4&u>!gN9ImaYN@it3+* zaFZd%Q?=6iz3^*shOr4%R-)iSj?vFIr{5A^tzAV7<4p8?eqwNuO2SRQ|r2oANlc~?&YC_HUOv=}O zWD9h+Kki~`ifL6`0U^6@@d_#!8X#_8xYGMH%txkV>e9zuybd#H)9)59!?S@{t|&r3 zz*vM7Ac*?upQU8mttYsSgL7NAm3bHso%sG~)mCd%3TVq-+I;;c@!c*rYQ(d&~uOvC9t=$In z#;_wsNwx@6w}0x!2z!zMiGr$x8r(~IQvR?BS;e-gxlGpZmGd|Lmtt}gOvtykyNo}c zmn{8k<3ZEwE+mVneNRJfIFLw>5!5pu)6q&Ot6b3EJt>aL(odIqNjPH{txwqMaQz_C z^4w^LnRKL<^Qq0ou$;)!4_}+!x@OkqGnA?9Hiii0%+>-=5gi9SnxW1*5$DF;^-G$1 zIE;p3GY#*}?On>w=Cn>3!55Y{D*alVlK`t63hS<-mQ!K6KG+Rsay_mYvmhhoMjSz_ z)DgebG7e1zprF_$1^4=7H%m=dCv}HeNGg(R6iH0ShUFxTFYjMc??bIZswef{t?hf` zCop=OY)A$4f!?~$(}>r!ghxc$P-}2rKrb>IgaTf_S(-mwsiD8~(&Fd#QI}b`=duNu z?qQF9uAYP`skMe4^ri|d+Xn4DYbaf)9-#AVNYG*SMQ3c5oD6*K`##qe8uf5&l_*lE z0)42rY0lsS?kM%V6C8pcZk|>Ej96i0uH>_gP%SP|AdT{AB1fBqi^O<>)CgEvOs)=t z>n46s9JQLqAf}VAwYvK8<1lmt5Tab>hW{uJ6V?#tlp}<49kz*h#Z@YTF5ETd_N4tG zgL9&V`$phAhgyaIJY6s;zB9#$Z|LY8vqI&AJzvd{ERY+o$!Ac^U^8Q1FG?lA!12;! zV#LCq|BpVCqp^+AZ;^vvLJt(4E@NJRjI=1g3;SZGnmp5__zPB(d|sinC5QLx^1)XZs}NudT6^aIG79GgsXcMaSY@P(Nbu}@5QXluO? zMPw@~y%eRw6oE*dmWmyS=o>`Y(RX^^Y9VtqclH(~*Kep5t$Z%h9!pb}8WT)k90l}N zcU+ zDM24F_tj(c>kbr5%7uPo%i95M7gIhofX+D6I$eT#$x^2GOCCxCFdfq@>l& z^r6}l&Bw*~MN28xfP{aiG+7;A(^N_8AnNARsEPJ28>3a0a_j(hX62qG7ED|X|ADer zFBUL>zf124*8sOW!Wcf|fMQ0n~Jff%5nY z@n}E#6AkzgT5wOwwz+qc0LcbZbVqh8n$&$Rd-@FvINF|zXT?E*<{8(}j;Y2!1e$j! zg6^27XNxv0*hU#$HDpOSqraR8s|L{?i!yE}gotu40<_so#uhYkYzw=>RW|fJ;5$w` z(Umr1nCyjCa&hVT{BjvGQhrr*x~&m57GKV8PA^KhFHyrpL(89FmP79;zuG z1YN-|XCSjWL>V8l^zOc}f3KVx($U7Y(gTM?Yg`dnkIi|uYBDLNfuvl~%dWz2(d`9) zm;A_GDpQS7^vVzA{CdYi(rF7_zmbc#1cTD|BBWmh>>i6VwahYg``#Ey;9ELZ0sqcu zSGr6QFH;7B?uu2_U}{`fAP4)>UuJaVt7I^(@HEIB+dO2WX;(rTC{2R<@{|~OoIywFVY?(@$4y!^aKUEru z2a{F@S`ygMv?Ri*Ih7T#B=ice z24LR(-@B3b&orjlA~`dM{XHkLxDQ`CxlL8Q-yc>bfwH%tVWD~(k{0RxKd!p0_=Sm4np)+2OI}A8dkF6UaO$fWn4e8YOfwzX0?f+!az^!V~?&!&YXB6?li8iyFVGt zAT*dr4YExrTKb9YJZ??o(|?!S5+&uq*Xkt_Ja;@t<|uR;+tLooN%4boUa>cl?*_%W z+$I>;iOA63fkmdZ4cn9CpxONxH0Ns@oDn7wxgnx%g$|=(?ol#*6xmX0s4~XZu12WTn3ET!2R-pBLxVmMT?D`kiIW-2NbS zCoWV8W)iwc6y}s#w2K+a_@#hM#0X14@y3Kq_wlDdmivTM@nk98h z=VsL@^0zS#NkEo<3m1aC#Qc=M#89ay^_@VNG*(U*|D&>?hG56TB>EL? zA$e+Na_r9-A)+B279BoD3b!}aj3?ydLv-fSCzrk4D{RI25&STytl=n#>D_=2Yeecz zbP=mWXK*z7;$hVH2=@LwmoZrgqxqz8-(qCpcJJwsDeIap5@cg1PB)6(voh^B{618anq8o-~2vGwC0 zU}R18Mx!P2W{Fe55?&`#3`x%9t6?2>n-@tt9L~LD^4uHrb&{1O!op@7M~j<_Jw5!o zB2=C0BltbQjc@^kDF2~b;P>$4f3V~arb`Bp=@{)G(a0EqrU>;LfOF%h0+L$m+gAFXyf$u>hK0??hnZu zw9{@Cc~qTUNJL9uoq*a6&;hrmWUgw6ac+T{owAsZAp9|)9u=TpEk`RcH^LJ>{55B^ zyJnK^j7)uPe&Y0~I|khnxL5f8O7Yd$J)Sq#uQp7dc9dAqyPf6-!xZ+UeGlD=qcjUD zSk^ccIj5(U7uAN}J&ZZYEnu+QiHdc}rL@-8O&4KhF159kA-TeHLPF&Z8(;ecf@iL% z5VCtT=a*LD3A!bGZzdGM5f8TaUjl&_GkmDK0CEZf$oaoA8UGBZ{}(+cWq|1c9lpN( zz_|i!$H?Vq9=8JRW^~H|M({*hY>5T<#BJ2e&Vi=4fFZPU1LR=6zP(0;U8!EThcAb> z(B04?z|=hs+Z4wSg*1ygfWfttk@3$6_1b01CB_>8+QJ9WI=DDG&@iD=FE z5wf^-ue^c?$2ZI`W!Y_oG_(k9FU)K9CcT%Bbt%#+J;$>5-udl9v31JRhvSqoXr~2YYD_757T7rUYpJG2X zExpvUP#wM;IfwBh{XUQPJMR`ar=tA;{M(10B!ky2F3HBB$9LhqF%AwF?2`@?4wJ)x zg?UdP-O^vp@Pgan#)Uoz0`ER#+G4luK6>1noOZ58fdnOSZ-%RY+%!C$Bf=O81?wB2 z6n0y1vQ_sIR;@0>T4%unZ{7p1dLp#^teib*zNWte=B>AF=qWy}&#Ndtq~=FUhhu(`C`RU`|M9VIvARdc3v`$q>76M9m*jDXZ01TUyRRCG1!WBnSHS)m3U_@OPiv~ zfWs%H#&1kFBs5{2$wyn9CS6$F!Ks^GLSfLzD!{Fa>dqaxpSbNUraK3-78l-w+0_X$ zGK74g8+-{Fx}-}qWsb5!oNHKI8I-nG{2M*c#RYIEm#>$kY{}Y?Wqr+{BCLgFUdq}g z^k+14PWldL^`c%$~_qn9{^c7oSLVZmP3EfAyouBfG zWJ4lO6@@FW;`wq)whnf`Aw^LYLeXBy4^P&XQYo~73Bs}*_mrZhk{i_$TVQtY9?>$D zC-R_Ni0qk)&d9D%#%5jpG42sN&dAsnENCw`xgp41|U3h-BajvCBK7 z#DJm1AZ5MX-zC(Wa^b=@;n}SW@>1{_s$O|mGrQ!op}Rb#B@u4J38V2jdh)1-_Xkd* z$B4tp(4Xl!rcxRLh#lqB3C>6@W^Ueff?qn3!}*$ThutDikeIIyf4> zqE1|!ukDPi@JN;?KulbbPoboMN>Kup7Yem3@YtJ*@`V&5ga8`D@Q|4qI{NvsYuC_w zQvMO25v)I~u4YOn%f5UTW!Pvf65-$0QY{GqxLCsD%V5qILx?Mes7Qi%uD*itN#TT z3KBFGXXOwE-;1bWVafMRI_wZJrU8wn*TBHa?%zLz?aG}&a1}`Vh^4ccL+!NDdVS>e zm5t)a>;1;)1;m@sN(vcE9*9v5e|)h#e%WREkn#Hb_D1SsJ{ETMofZ!-2b4cZYPp!i zk~2+R-a@>#?EmBJ8-pv0w|qOcZQHhO+qUhFZL?!_Y&$uzZQJQMoxI$cH&btJ-Fa0r zRr{PeU(WupYp?ZR_#rHBF{b!!UD-{HUQHEHWfi6`V;<9CZ}leL&#cy-#RJI*TE?o^ zs0wSI*4W_Z>mLtX$(D<)bPttLNFz@KUlEN=9%E`M6KX0^(u(V&RkybClvxi` zSWTBw8jaZ6V%rTpc$HlBNCMB&Y#i5E@*?mA4;8F!Dv_)Rl>^;)tuCLChR1v-x<=g8 za5OAk!$AYrc?wQ(P{^vb_p}rx7fnwys~(z(Uv7)ExY!a$l^l2^cU^ue>oecEr{9D7aKBbGMi9R7aV7T`)Ls*L=Md%3&+W3m zpH2jv`Df#oJPWD+T&*68F^-|`wxAKi%lbW3%~YABglZXngP?%8Ycef=eGsT4v0N=8 z?JFj_DX|!j5&NE5=%+xSoXCp?b&x@bJSZaDF@#18ekw2-`PU(vr16jSv^aT=DFPOG zyH%&1Q8DCoW3`0otCd?HPJbJn3@?3SJb##YELcc_04w+$4#?I_m{3Q`1S|oc^lTh0 z8yW9Nj7&!Un-}dq()OdF=Yb1w_H6`ZXsR}yce=R!>1z{uVj680v4m)eW#^jC|5J5 z{}6NCaGm)5I`I;i{(POO?FDHICPP62X^+xq4aNi1s)1y?Z@Jh38jtKLw<;-DOebJ* zXW%YB><91gJQ`8oloubqg)}+AzFpQPgmFs)U+e&G15_Y`75gnOLaPNT=})!`7(`o* zp?{=-`6M$q3xKP>%8fg4Lwd?X94Z(Qvtw%p=RW1j}ZDmn%$wh_JRIsp0%sr7iBE9NBVat6K9 zLM8bBD)bIIOb&?Y7Rpu^?jC3LFl^No9SH#+WH8?Kgd!vqo)@iQGEOjWCMGSmAWnU}Fdts?1Lpb8ahgAI{0OJ2bb`QW>-TZTGn+N*Fl7Lx(@?#n@BQ>^BWR1Ft_;)4rt` zu%)!*`bH$IGx*ivxIo8<_WI11hOk~12P|H4u4-(@#*+ucd(dnN)AnVZbuAuT77WnS zS1i=iA4(oeK8haa|9mJj&Dc8Y|2Cm1TsBpi#^qUqCQW;&bmi1?)oq`xO3&;aPi~0T z7h6;hxheO1XGFK>3JmnU3-AoripydE8B=00lVb%=)$StSnsSWBN)cA_VrIa$I~FY~ zKjhGBXBj*r39_u-xHO&C?|-Pn|TE_Tk+gV%j;=NP-d5x4QtJGjLsF52d9L7qJ4H{?H; zr=qw+~)>!=^rWui&SHuqAtRjZE$-=N1>t(Si%$#D--=@+<%*XYgD+mv?B3(N$F)_$x{BH+6%M_uGYwT- zWVtJG{!}79YZ5MG^y?3|4Gw<{( zZ@z<9!8Ncf9V`b^uMd5Tu#qjw;{kv4DSXS#*%tL1g~wdaT8ULn8>e~$UkDP{_5COO zg0gO>ha8!5{`7kLvp?f`N&2*h^A%sg! z+Vc-99^T5k#%_?NgIi~>aZVPy9KXIZ$~t${^gW**YEQOi=HW6VklgD3t>bcszbNalJ z1NRGIm#}ck>VMNQGPr&3A6qVLf2U<2 zbe5MFg~$MBH7(hz2=dN5itTP@+f;B%s_mnsMk#BXmm~F-@8lCWI{FJ=~hzB^6n!vD^SmYLqD7np&AcaBi$>l*PNSowo1!KZG zB|47fltEpe+Abt!L)Q0Y_L?Csu=HzNF;vJ_(>9KB8J~snBqklHsJj9Z69IT@uz*$Z z%tz;z7Tz(QgiFcJqt@4m#hjjv1P{8@*~{AneWjBDFm{8O8#7$2#|Wo1C5&hjEjLmC zQUW~3i^1+WhxZ6qTGTt@@H~B!u@!=qe{#V7B)xMlarZrLBLc(K!T!$h3qACVBx4wr zsS`i81*B6lAqy!44^5y=lWy4+d-cQU9{O=z1hLp=A;9bH>T}F^mrBKU% zngYpZ>^37zDYiCkwvJbPfsd5rN&}0QlRP?75WP*ESsCcmFRuZ4_N+idl-ROD6cQ$- z(l&X<>DA~C;qb}OarWtM?FOXHbhp7B(%SjQBV12x{`nvECX^V44`96lvw-cvZgLVl)XVj_&YU0}87o zQRFJL1k}NDASv*jJt4;=*d7W!+Kg%^bOFM={C4zW!@p?%bwQpV@z?qvV$HOW|MSEk zXXL43|n$U2lmk8^sM5aaTpXF)TqEdv&u*2Bo@V8A;^rjQ$ z9F0C!{dY?m27iPMd>_}acw{%Q{GJ`07hP^@fWUH<36gxS;~#Qwa&9&|dp|$_Sp2vt z$`gil!pjN-BE^)ZtJQ(TU+Y<4z(luZ zKqda3GkZoForMyf4;1S4Zk=#O9wOH4XT?#0tT+W5eSSHbNNQa@g<+_vPE=>9E@s1; zAXJ5?4OP@I5HxuzB=}@?oS}g%WEf>!YWt{iwVFlF*v=8r5LOZ!wuxf09bIW&)0^#X zT-!5+!kU}893Dn4yqk-ZrgGd?+WtzJ0il;qu%1C_B*fv|Oc+D(~@1vX+@-r`CX1H$e3} zX$u-f>XAlj5}X8q`Ek>|0^6HyFm=^E(mtcLQACY!aPPY2bhd>W2570f!0hXL#ZKGy7n~DE^m|@B7fa_XChaWT6*!p)HsE7J3(F1UA`T zW!|VK50=^xY?<+cdqM%n;Pth~5qJ?r@p;E41CKi5tssDVaMFdW+h^r_`T|o}3i*ZtA3{FK! zY4DTQD&&_yIwEn_P*zGQXYMr;AM`P`Y054zKzcwbtF@9Nx0jYzF`!oVXo9+Gx2jet z;V-~=<##Tp(QcK32fkcjt_XsuR3^9LD-&hCBhqrZ?=CI32B^9Olyyj+h0IS=RaBHG zoug#He%YqVDcj39F%Bdng>y=un`TBqo=b^`n!aG#K$3MxVEIN(1pLz&fe5ShDCS$~ z#0~j>K3-I{barrcwf)yQrdq?s71aXE-`s<}u@hF25GDi>5|T^{_;(3t_N*c#5W77x zDG{nAUGfwu*6Nm)y9LxA<66t;>PO{D!QW`r^=Q3d3bG~_-#*cbUoaawEozPG_bs-DwkV7)AU~*FL`@lid%3e zS9h#RIl_&yo6(f#2So#dL*r%zMQci1b68_~$Tu;6i|t9#!ab(rNsfPnJ+cKzWp2q& zv(DQcz(AL3X4>{s$2$JPFCA6 zw6^we#H?i$8P#wqmh67>SCqXt6ts#fMVn{UecX2I6B{?P5C67e!97?irO>*Z+Q((iZF3T%S_Qyk-Epn&@nyuw z*8*s7RuCq%FoQ*5R@2~&J0}z2878{PqMU^bcTg2w9 znXvFxf0&aOn;d(G#mH*Z*ah@UMur~Iqh&GE&;y(#C@PY) zLYlDVI2EB>5cw&UR3*fD5+mK%+gzP*u2vfw?U%lnDCTl^h$4gIbq-3GRQYC*3)Gt6 zKq8Ko$+E~`ov&Z`u-R(V83vj1itIRtR+&7t;>l)d5$R*{IJSo6a=RNn7mpiaFvj|; z2Td4%bUX9H$hfn?WcaxG3aM(0Vz;6U;A3LHxsuKa(2pDrS(??3t%@;GM;UuEZ(3S3 zmS+Ir1!ESLt))n&vn5M^b#x^I#?|7(x|=i#m8i|&v8k40O}vT05|!&F#}8pZK-A|8 zF`F9SMIAXzS()h_wi%4K3wQ{wM z7>|L#UwYuggn{mvixc8wggcVX>Z=7v_Ow>EcO@8CF%DZFJ&F;L;_S|rv8ww+w&;n3>zPStjgCtuxf_DbJlu;*czA!uHN~<8lg@y_y zP$?Ja*l{$PeY)S z+5*Uv{_xr(y(~^VXLC;T^q^3)kbGH7dlA^Ynu7KHmB;}wtF5F7(11x>7;&h#Pv(ni zFH4ZM+duXT17~G1GkqXO2+7CH4>w7V#h-_bT$Z2bn~m0 zY>x&KDJEa@9`%Adk&Z5!(Al$>QVVo=1~*;>0r65{)gwu52%q|d8y@~KAzT&yAmTpl zL?Lp2$i5sD_K;LE;hA&fsdMQpl*$i0A;ObUAJ;|!GM17{v9h~vI{sG}%3~u`cYf0p zs_b}&5R)d9;bUI$b!mT)DQA~sllRVV$o4rBCVM7xpGB7>_hyWux9=qf z9E@R~=i^nXN+Nt?rdiQAnL$?e(lJb+{7j|Rt#Arg0WR@Pxe*CW75y0lLH<;oj1 zW_c$%SQ5OJB*LnWiKh)K`l=TxemwzC}3mfK6R?2+IyV&|JOCm}MZEV;lBRgb` zh~xc43@h@o{x?BPp91)&5~t1Z;@_n*-rz=}>&hb8y%VieKxR1wV|ps9k!zlfD>}+E zMV?ZsjZsb_37AF6UkTlJ3N8v{8>^rX78w-a6H*kdNAG`c)%kizFkEHf8==9L_c|Rzd^~H&B(22s(0yL zjD#&h{`(K%!ZV{MXCxVL;BAwQ>N0@x>>c%?*Y<;eFf4vHBHjt2MtXX~(u><+)9DVwYhR;%KRNwGDVf6S->z5e zt|O_MehN|pzOf@3P`Zw;oL*q@%(fcpAyA(p!x9V(y-pNFp^q5EVfS`T?UQEhNQbz+ z(~Asm^}M^fL$jxrp|96}R<*iAcwsO5?kJPLOTPc*Wk(o?gUUi;!a{2`tspPT#bX5(*2l>1QPQ&U#wa*vxZDSvk&l&Tnj~WOszi9## zZ`Cc~%!WcA&<*!W1Utq7uZh|#R9r1$t3t*l991S)l0D=?!7IQh(qGm=^K`)vEji zMWXw#n>B8$Xs6cBf-bUJ(iwRvEJ{#xmJ*yVWkIJj$+>#O0MboRtlS6Yk+~pwd*1KR z?M7#T3OhM(s$J@5nsjb-R2S?0jE533>h@EV% zkWDjoZ2+f+QX>gOfL&772G~G-{}YgvVRamWAs!1+uG{@_gdo7@c1WW<=WN~yVi{)g zS^D%TyXHty!K5T43GsTq9ta2QoVm1h37^Z*n~XEq*(G_}*qC44Y*M)i+zhm3bgBB> zr?shF4&eR=T9h1?fv*ynsE*T+(dvY6@X6AF!re;pd^MI2IC`5*D7S^BUvX%i27f2o z@4KkF1at$#-8@MO;;?r^Egaeg)P?b~a9p>^e)d-7k zz$PEz$=JF$AB5RF@xX?p?u-o>8a>8ihb-+4D!VBrC4(*HX6fN=C0!!IpJApfHTJnw z!_q9xaF4x*yZT}h5Ls08X_X`jGP~Sz+a3SHl;`{aI3QU%{c}cdVoG?>1Y>rbUP%w zTdG7Qq3m0_MMUWw=qBh_YWIn8Q$I^uxs|-tHMp5;;-dGf9xejbJN{#_F;t$)wgIbP zUMxXrm$y(l2_czjbm$}nKmqpo#GnA7`CC-OQjnzRy&Y5L>Z`l#(QQ_y#{zf{!x)rb zNXGRQ22k8l=_7$M71sPL=Dm-JQ#jD_KaqI`*jH5ioRR*<>5Q)`Dlk)t!Fb98PVRUe zU@D9ZW|(FslMgi;{K_Tlf2C|tkQOkUz99EZc0;Y)%T};aHRBIkwcixbt#)@kwi<*2iQTU2_Gf`u1kkq{DcIujdZe`G{BEm2KlUpM- zF*dD*Y0sj2aA)XyJJ@*4y#9m1%VqYGM*mt&u3gm4ruM-kOl|6S-%im`N{8l>4I5<TK*Gx@XEPKFKJ>TtrzNutE_C zKx(9MHRPl&I$l&D4rk8l+SgW2&j9^HstGo48t?CqBDF1i(Ut`IUlSp982 zDuZ*-$MAR(@Qrb;XH*H_0$OIaM|h7LQN!z&Ew6PvQES>|t1>2QUU<_MzAom`1KpYM z&71y7Pdh*+Td{g|i$_y=2wR)AQ?$1ywz&@@r*t*|DHqDco_^}@ECY43kZs1Pf$r4x zXv-ypopLC)IDZ$a+L04hyvDAEHPutEJ+7xtOHca2;S|~_uJi93^+h}CWm7zobzR(1ZqKE$uUiD% zf9$n(bhLKjRh-Psu^Jlk#u7L|P&g$|LZU|bTAT1Du!3PTp<-utV`qNyW_0n!fm`LW z$M>g|Kx`JUtd;3`^a5}0FR)95KcDfF2?BFNzd*DWRl%1-e!bGt-D`C$|B3E7llYh@ zXB&+zZR1iiH*b0Eoo($kX8Iga{_14jQHydVlw9a)O7pU!dze3cUjVgDcC-m_Rn(Mn z#id|9v4IG?MTk(YeZhV$*S^o*0(n2wGe%AsX~`x{NF^S#oL{@*?r6<4EgUXruve|bRFiF!7u-+pg9m%eU*dL0`b0c*M-VLfRV zqboT9RrN~R=pedKeRB(8xlB1j^Om?t25R4hiHZ6 z1{AWh_F6EH&0BGtO%NoCfma?I3xSU-i3aEBS4rWP=A2aqf91){_PJQfjEIJCy#mt-4 z)i!LCGnkkTE5%7DEtp>~Sb$m2jCE(|>q)dUic{waFvQ|lcMMl$mKxx_o|nJE?jz^* zz;NFXK-?nbEy=P_38^EZHLf6cw3yR=i978A3ZZZNTzPuV+J9c$Zp3PNX@01C%VxT` zX0Ny>!&-N)BD0{a&;laf^zaRX@YGbYs#t`sCp1}+4c;< z5!kpzh0LNnBV4i2Ehy`TpumZw=OynyFgk9oHi5z?A3lKYK$6nC^3^!iN_^#yXzszh z_nE6UI`@#q>}g z!PN_d^6j^K1e?VkOK%jH*3*``?ze{BDlLbyD3`G{!!bay(eaTY;fj zOU;Z@20VML2`iNO_Q$(e$Wl+0Kmd+8L{C-O$`U<1QS^Z=&S9pwJSc57O@BozS!H#e ziYL!MqKj0P=A;5$CS0SiC93ORdrJOT_t`Fa28RooUcKe@tBI~g{(1U^UffDt#d_7f&tf8k+hB=MLjJU zkhEa=6VJ_Txa$TBy?8Gf@3l1!@yfqIv6ZeZ&(G6Qaw@|<`v(V{-Y7%J4MZou@d&E4 z35bL8CGvVLaefK;J1O>**U{4I$Cl}NNf9`i<1 zN^D}DC0YHn2S5E)@GBQlhvhDo!lx;*41<&C8*&b@Ng*maZ7v1NimQ@Zy zMWJX{)mOT)o3k>^ZqMr?O1(Lhc%snqfV&`ngwEa369u?eq<3JsUTc4aH?J!J*RgoPdp zjlJ&$MeChu!OGIrZgJbQAD=vWdo7h(CJ|QWS8Ls}0KY%KX6~@l>8Qv#^O}#|mkGq1 zxaWwf1!HIMOR>VoAJNyYGK8rf@HR~d{drggjKOvC5dWaWM_>|gG8lO9cwW%wkn-DC z;eLqI;{65fqsFomhN)VN){lzvNUBmG3Mww<7Lh!0q4PB<$mXN6@v0T6J03gDZNsk$ z{RIez(-PS;MDFYf%eFn#@}1B2{p{{$T(*S0F^#%EtqsYd4$q=K+QS@YI$hSjn1LNP z4%)lqp5bx8Zu1X?TuTK&3`sOS41#rgWLl@Z7cOgiFigV@f@eaWZ5A(~0P;;S+`sC$ zL}ONS$a?4&-W_$xO<9ntsyp1zHF_Lg)v&y(JdL=|?6W%vTQ_%5u{!KGrZv6Qd!BMs z!Le4@{FPW3_6D1XodEx5a1jac!UA`38oWkG0Ns8T;jNT%;voBdPi_JQtDCmPoPNyB zu9~CO9E~xQ#s{$*lWNE!n-k`)C(`;du>%uawaBi8d`JtyoDN5Zxe8ep$Q8#IhgZb3 zjEB=cd||5T3z2e8t~DoLaASOewd72G`i{76j*tKZ0wd_;?i7}8dvMEHQe^HB@Ceg% zx&__S!%@Hw9mj-M?+7oij3ScLU2n2vS*3tnN8uBD=PMK6ft?w)HDH5X8sFg3e|Dgu z%au?6hhr@8H>+9pe|t`RZ!pb_OjV4`|J^g>KMx6I9h-khc96GDjVzVUiB~UaGcZMF z0fG6Qib>~7Lqd~-`fgsvouy2{UY5L-`69A{fqe_tNb@#E%0%!-j54yEyiIvb=iCVN z_=40S=nKJn!GJ-CrC?T4TvtqhXvn?%zKgsy4x7(YW#%^=<}@DSiDbSU2fjrGvH^KWa0uNU^XapqrYcML zn;l|Q&5-JuDGMOR%_0rcHt?}$bQZDt6Izc*FcGmQ_VvZ;l3pMThjo74RWhu?A$f|m zOd>&9jt3**l@z(;^;($+G%u&zIB$zV(dt0mima(7-92)FSU^r{(OFBLWUgo!_Aqko!AI z&J~t50dsltYG|J~<{ZhkrEEjfdrd}8VdNOUB{{vcvsv3?0` zOR5)jQ7|PX-^JD-NuePK^t)aUbBg3K@-vOIXR?R3lh5am6M>UWp0k55zZb%vEJL<% zK!FSU>H)Nke2MZ;rp8@2t;+QwXcMLjrE|X`-7?QY5@j!$JCe=Qy;qD&n6*e!r$UfK zB}EG0;lzL!7+6}coUMJV4H<1Vpi%SkB*_|RK%udZ?Pn3uGZGtZ*c!qB>@mit$Tm@Z zlVQ`mmU1o}s70s?tSM)d0M|e=6rNt|y4D?8vnl)?W#Bz~5|d;6N*;hyh18pBMG-U$ zXp~j5;;wnxvbD1%kHQ2A?g-dMFC(rU=kU}Rugn+ri^Z*Kh&m7%YQ%`8DN74CK<*F`snPg()R+Wr0(S?#4i_510@H%x?w>@K-xBm95)2=lM&M6-& zcuHaJRRoCJI#2RctJX4Wc!ljgAKRKA1ap8@_TA$P5mbWVNY_CvT!$}Y~lU3#8@gtxskBJy)YV* z0^3#;C`h#fovd9t03S!TCA_;B<;-sK(8U(4F(DT`5goRyY?C?FAe&o$xSN$bAYB?p zH&eZKQZ#07Z{MaBHv{vLMmc6Z87Cvml>-rM`viGkPKf-=%gu~w>T}$`%4eSDnBO{j za2ykn1b9c?Iw)#z*=cd96p6s z-p14LCJa@KJwF+&Uy|Y&OeittYzuc{xFROGY$ncuXtq~M47Fh3@VLCX!l>m3nH5gL z?--wKIP(vXa8Wsl6!ykkrA$3Wv=iiI2R$ag*EwxH$;;&4wm zJluTAtiEn3QSRK~P8dBk2RJX}Fiz2bvgf$z6q+5TRiI3&H4Es}5m+jkSQ436;GaCQ z&mOM2>$(=AaK_-kXP|uD^}#D>iW;gOR@p6UFeK{?sUPq`R$aGX4~T>GIP2Ooo9*n3 zOc1ZSOjNxn0=QS#)L^+e5PA#PUH-0|6WZiTfHCc!dHTc4=Kuy2)!7Dx zz1Giq!WyIJ)@7yQoSm1h6<)khu*U%J#AW}$We=>m1Vv{4cW9#1y(I4;2u=WLO}8$$8E#1uSGL;8!)*M zjwgcihn8e1nU%$bo6hE9S8ze|?LaPtjwJq-bZaZna_@K}bu>#(Y@ZJJ#H;t!w>|#3g9t~;huW-ECrO;##GF-W!dRdZ(b70g zaBHYkb&-9<*8V{VU%HKE3_*08?KbaM%Ew<8UgR!m-M}S^VTYY7 zv_vxedL0U2_&QKKVbBgFUYG#g`5*by1d(qLz8UHA$WZ>?o!4NOsbtDih{taQZzE0$ z&glHJcY~dM1lxgMG+h)dz)#A*efMHtRcs+Z>K@8Pe5qB~AugdNyNGi3A$pSfG-5$) z8!_R0vp{_NGj?eoMGOWn-al)9>s43nb?m!D1UrXKBqWyj# zVS7)s{{?zhb=M)1O<*-cDrr%~BB0z!aJDU#upE1`fGsc&l1!KjP#%wVjU%wyA(g}# zc{uYGnD3WLU^h;VM!hB0+r6>f$pAh3K1_DXrhYvT@i9RqebZq0yRRPji_0j4nCr=U z6`TT0eBF_Y@oah6=T&IsUm?O$V?|E&l-`{}hCmW^kW%Aif>Qgf%Ms#M-K*!RQJgi_sra% z1LnU1jHo`Rz;6kT&Y<7)#%N!lF0|QGQ|+s3hgd3?kG2%2v8VL(T-2Y1KY@E)37@&@qsI($k)SrI zf>$sT>mzX?Yv~g1qA!Kkg2wZkG(FrDHy=j!z(@+X13?KZIqkp)3b8xNh1w(Xr5BCU z$_FF6=m|;A){W`aVxd3Ap_C@wn2$NJj3xZFAGfHr@ds+#qhKdlQE`d>T+Fh4hJZJuW&`%4nZJ+qQE>**|;LH=(ZqCjKazI;mKIUecWe3>~ zwXgQxD9B!ad41ukuuvE|`a;QkAnSWfb0W7muUjMg(X7~0%)v{0vXfmFhghf#Gy^F2 z4DKag1~8$%yf2aUIbsmxDfi5Ybw$n79baX}Ci6qKQW)i-I;jf2yYZKOB^l3*X9hf; z6P$3Tg^(N;(b1#__Ky1C9FL?2dS`zKt{dVLnr+r;1_HK|-n&nz^jF>z@y+WL;*M1lfuMe4=g9 zll)UhH$;sy$^$-Bdwwam`qFLBa>=&_5_EgLUSHT8T}7w7Sq1|NIUI2z2u|yRq~1Sm z2uSB7sP;@!ZfR0(nWSHuzkf;MLm3c|>;=T@4Jg1KB%?^bkRs&~H@hsecwE`C{+<3^@U+q@M-W1vbYn1sN`Juij`{e`yTNmqk77xYXpFsh^<q(}4^kjd{6wdwa^TiY5cA1(SwZNI{9yzg}@l%b_9y@VK zYiMl_&lF5%0#Ej|Uz_~Ax2IKWgPx9}>)iN+NEt%QEKFpIvGanUXo1?e80CW>KmBT= zD+Q2fojJoa8#>mO@H2vgdk#$dH4%Ot$apw0q_`rA3LiY^(U(3Cye_=l z-r|br^@tNSWqcTZzXm({;%)wFGZSWFx{_o_qxvYGpTMKb=qn=8?@b5zy9@}IVMXIRrEJd743M5iQb$5}-kmync{ zfee(xKm_SWZq`k*X{cMnad#M(h%P~kYO&T?*H*d<)>fv`uFnEqS`EPC@sIg(t773k zh!Jr8z{D$4@ttn>5NKE%k@T=|p5Z&;yLsrkdC2paIlOwdmj_-A;$V9L)rPoClzj8# zO~sUz;KZ*_PHe-I;-Q+rmHHN5Q{9vuQpgNPQLoL~FsE3E%XFP5N+HZADi;~V4O}NV z4ldnXH{(9eW3q6abmD*n-8dL)TOg_{XG*IdZ?&{Jhan1KhU)^Ir4yEv3rGQp%-c z{iQw3i^hpz!`$a}A?8tkGf)&njqjR5BmoL@1-m!zImS9?YqZ2 zdZ{lEdVU?Qw%>bo$!ZS@Ta~kQy0t6Rj9(%uHbj?#@p12n2Wbl9nYg|7XAZ4#d@pr^ znfEJZ@%2?DgY;*&B)~^p;n&8HKJ^L!|36L(`B~%bmr3*jl?VQ~sO9SP9vc-%dFf4T zqd_qfy6POqR)_K}Qcdx4LM|A>FQE9dj*{V#gTQcN@_|)}Z7$3Wa^2S_I$0JDqt4KY zW=v&ff6)SOZc-*8%Z%iM6vgz;8Pqy=+H8eI}YQ@YuoULTNG0%OaKkG0&h(0L4L{;*N zkeMs@?k2VJt2d0PaZFS?<+C?6^*O0TvXbhOi!zI=Y3uCb7?v>5{`3gULme)0qEovm|oU$1KrJP-=sDU{To;3G5zx#OUnJXxp8{)#GH#yyhLqjeXpiQ&iH8dF%qS5 z)!ve<=yeRvoa|wD?pLz!vOF1ME>EI9#$?mt$9B1Gv*$>0LqwhaMvFsYuN@k>J$Z$djm^=JF^@NGyB9Ao$I7`DFY(HX1KC#y+7Me3DG`sHiRYPlk(F@;sDk zj9vpY5!x;JYY*Rn0SbF(RjB^MrtHe1?BFrj(sRnXQQ=T7S-bIyQ7p3WMJfBRC7e2h z!z^OOZHkn`jSD57^a{|u_jdu(PS2q1uGkZpf=E<(`x^_U0fEZAGV(J@Q72TxFks5O zEHqSkzfw^R4qrkMv<2U zaRaan+G88H8>kFvO#|&{^bJu$ymEIrGz~elWF6}I>>K*XVW2O6i$Py18wL8=c?bIa z4VJDqX|4ALRsvTPjrw(WW!Lb6Nc)O zirNjEAAuUMw_z~$>5#I2Bl|8uIV?am+zVa&@>EsqX{N618-DQn<=QSMsyQ2Egjm`s zzZ^9vmHJ~=><1cg1US)`2GWo=5_Q79k65v1vtrbZLi)b8delmn%3Rj}q3oQ3JB^|( zpAI@sI@Uk7ZQHgxwryJ-+qP}nwrx9^+`98J_fE~NsrqU^e=q0M*=w);TcR9yT?$Gj z1t+Qs0QBz1Vqk0`=F;VV?$qW31P!5sYP4rH;#8CK_&Ft#*c$ZMZ_wm+7%OxN)vWN3Wg;~9H^?f zy2xAKW6y{XN1m(|9w}UuYhEZFrMJ$5+5Sxru(QW6I@eOc*M>ow3#YD35H;pYSn36H z-qC11s^dIfL@sxNzTiJ_VHS4CY}{N`4Rc{CYj|YdqB4E69ihh`It0TvE^ANvxBFfD z%3c`C3*Q5kFW59n{j=;n=IY^iv8G4jd98=Vw;tsz#C#8wyRmV-$;a_Dg41CnY1BXI z+~|OZ9{A#VkZ>}KKYH zd3fnPL7AvwCAldKI{hY*3vb)$NxJ#ER-E(EptOulyUq!Bv4EWFR28AJm)R|0u=_8R04AQlACFJM1VPymbKOdcX%eIK6~6C_!fLwZ?lJcjMdE^Tu}O_6JES5t8RM zyuD9rx5M;j#$lF+59`J2)hub4DUMH;I1T1b5tA?od8V0;LrEc99sM7;s&M4}R^kN> z00fF?o?dq~v4YmF?rM{9l#S6$_W-UA+Jov#9*@oWTa#%g>R*X$EK^vaV@ByGr5`uy zPJAz%A7Xnw#h-^{DfJ|A42Dm((stMeRZfp-DR7esXY-rI*}|<&G-+3yUX46t^NKc98*H<=>ywa$0*u zTt$Q)A@B_%pSvo$H7#4Xa4-IT)Lo`{3uR753N%s3$1!oO?wMv|b^H)Zrosj#zGi=g zKvN{j;9ai}Q#~{C1Ss?=wDxTtL%igDT-f)+g|_j5{g#+D20?|vXN8LJ`JhBCmLo7D zjWl-I@z^v4#c{v>jgnGwq;N?IsuJE4SYX$~->4xfqDbeTN~I$BG;p0n2z7`BGEEb> zc|f4FpMr-Q&s79|lxn-xb+eBp)DA`JjfvCgx|pBCD?SLO!On(Kr=6dYkjG>5i?*3X z=OLzzGf7D{2!rr5VhkAx2_|XopAYjZ&IP<5Q*wky8)IU`E+k%Ye81K30^?%*;3C>$ z5-ch5?OBz{$_mPOlD%v(-?H$N{Tt*E$HtYOyzYl7=ps;*=Mn#CF#jw! zC90D|fJDnXR;XpGbgy_wkt`|(q$g2mhz#Rr@5_|KiOX$ZdG@mST$+mq3s0GjSV(ti z$rCcuN5Q?P3+^h9_Rp$XN+;)Jmz)r3{OTBK>v5;FK!a?Oot5atA&}9P*U;|FvvdV#1*9FgTy(zi0BQ)^;Biy4_Amo{Q>tjzO;QFb?#_T1qR<`;mSPWVv=SNLLuRf8MI*YE@x23v2#Sjg9;G*f@s#stcBm|M(nNYlyW(gW7Q&(0kv6)bEgiH+r^re(F=~~n+%_!>UzPN;s z$8+><`6!o~!0bGA(u zvxcPB_<3FC6XT>+2T?oVYN%QI=1*WcPHBI_rpek=9?B9`jv2(c@mqCfX#)-a2?IYv z4AG)&im~Pfn!>P&GA0^HM}uPl5mT`x1Q?dn#$e;qCvYx@ls{oaPUj{ zghgH`J%pA__Lw)z<0wA3a$P(^Tbw(dWGOX7IH%VvSHlM7ufdDu6rW($#P z2uhMID`v~-6gCTqbmp80&!%9+(s+DvhkFy>9}~6p{dNgr?(+(*ePH>VlD>v`zoySOu<(nlW~cbVIwY4}$%}Gx?wu_9^xmP%)=Fs25O46#vfiX+P~Ayr@PL zFb=fmR+fo(vI&cP6Pfi9GB`3ntvmjfnf)I52zdNJX_Ooy$jwA~hHwe7d9DM*F*0Jv?L}v#TLj0-_EDKAthf znd5CEBc3j^F>2(7Ymm_JMb6`P9VJDSeCl|Xt#3$z&y4Lta8>fz6-&NfxB!S?fgpT{ zoCaA~y>_R%Q>Cb31MtYx38hL>0t?|wf+)DCv^zzB^>7nP9<5+l zr-g%+5ki#dFb_GCTyE>CJ-5i1#KtWMJr#UQk6 zE`HtIKxvzRAu72JRawY@k$zh;SykA1l}*V#$A)XNt43h3C?Nn(_+HKLP{@e zc=8;)sLW@Z{lUJ{xH-!O|*>je-|Yo>>_PPp}3NBP(?3S-yzw702Wj zH(^T<+ouTcY<;gH3_WZ*^Yf&HzJalnPKJ4kLGPhe5>;GzfnC&$SAs9)T0sY$Jrey2 zluZj1@I5#!1@&h1UbB+&1+c%Fdw9+0s%p4tuzI{n&&adM2cTJ(+CP3 zUF!hmMilqxnmq_nX_Dm^R$(Lb`Md<#7P~4M6YW=w+UWZZ{@bCKx{~UO`@W#4!lD@~ zm5v};`uF-uVYIr^tb$dMPS+vqDwo!leM=VR5hlped%BoIFrUkh%`^ko7V8= zTQ?~K1HIFt1&%sacTBAItmpW%Y6keybQ*LtvM#wKZ)??d!`rZ)X`vncqSTT@FV~Lo zvBcSAimu3J120Eqo3jB#S%yrq%O>W!fQR86O2Z*+DbnJcRu>P2EYx8IrGmRbwWY$t z#3Q!pftTosxDv_K+4UPB0!%#8q5@VWMLDGTvBy1t2Da(razkUqLkL!d5km*Z!UZ(V zy`IL0HOG9O1xRccujhLUCrCFX-u9VzX-z?FMjN6M=#3QyY!E^-e%P{^y_nO+a^(5v z9#kVl6X+lTt05#d3}LH-2len5ENq`@Oh5S_M;~}Xz@;VI<6#J1#1Ot2#ZD=10^f-du89{5vhR!;+@7j?8+f0!%1>+ zqF8hh!w05D)TWJGgpFcjx0AGE<*Mx1@>}|HZUui`?CAU_5ew^R@uFu6W2wte4iUH3Xp?p;N{Q~+Etr?3Pv*I0jXbG z+@_nyZ#qSdEavb6?2=}2qQOGlZLZrZc?_0@ynpBUgd`r+r+LQf2OJs&mDgooT{ekD zaa+8Xk|s`^>HUB|0QQJWBJ#Q+hzYekLPsnZkJ6v@M9hu$8*^K{m*1iuP+JX0(-rWI zLFu3N9e>kSh7peb%u4K!3S+S8x0*72XH*j%l^?Knr3H`cR^4!=*KFT0yE;&NbB6!s zOB&&J!gTqwT^&^2KP|O+S?H)Su)J>;NIcZNgBAKPPx~rTqW?NyDDO;CxXYTCS2|zh z@~=IfVV%6)SmdpO-AoZTf8+4g44Y|BZ!Bh-L13IVAb6iVA_=4}7OGTy+BKzcJgatO zf=rh6c5-Jl56~5469n0B2C+TVY~X#wSu%1nG3P0Sp@^IJ;f&cnpT(;E%zEyYKx}ZN z*A;)wupcq`;>XZ+zLR5c!^gNn?8E*8K<|+dOgCxO8+~|CXU;QOi*&}seeSWPZt&Y^ zi2XfpJXT1pajRreW95ajEv=j~0V_FZj8?$dIEmO3FltbgnQ3}oP=&Aw1#3c7%Ncc@ zdnzJI?l{Ko_3wntvY1>u(NZuv^H?l`pXCUzEBQKLk7+B+ux^1mC{oNw)*~y}6s-X% z!}jF!O_8qwZgyT9IG(mJw_!7veSIlo68K+@TaFWWlcu4bn zhZ(2UC+eeU>g?8q(xo6 zeMbwuD3Cw10WYtAh}Q7uAs3v*9OppY2X@QFo2p4}X~Jw_?gFd+d23`2$nw^GEND@S z%{xC`6&KIE!@OmKEHJvh13n%+c|VW~Py=dyLDWTyfapcxMV{uwSB|_In&0wazT`?gDIuO4JxgeNo1Q~1euE4$BUNGU0 zO17_K(6L(LLaxRpRBMv1x4X8ZU2lsvu0%9n{|uOWx86IzuP@IQJv8MLsnQgs`LRLL z6dk8rW@H2RSjL!`p3?)v_th}IWIsMw-@5(hyN1@Qeeap&y6y0yYGa4k7&fG7_$6fj z{=88eQ!9|siWnV*I8Uhh4edL?Nkl@~qmYa9>so7L3+Kri^4asjNw7z@QfL^YmeaIb z{z$D~P__5uDL6RR9TxjZ##urf@-xAUCoBiqki7)!)sN=xW<*?)g2S{jMc)I$R7~$t z)_y9fMlRuOPY3b@2IR#0seOOP=!+dgiVw*|2}-i_9159PyO}7bc4k4>(SE_de@z2A=wZ$NwJp|bE? zHF}ZGz^98>p!K;_sL`@wV5YMx2`8+}Y>K-9)ObP9Y%Zx+Tv)w7c{|0vCXB8!zott+ zcV0O^3B!E4=(v2&3w+G8d>ZGMQGo4dIy>KwsctervaEL4!MWCZ9CXgO?m}*ezFwF1 z^v({Lc6a?QxlD6?0iL?oU#-Yo>%9(Ou1x{QP&XGR;L~)T;_6&_`?wieY8Y9$n8vPg zNZN2}h~ib?qp&Ln)&;Sq_p{OctXdfbWU+>Bs&Sq;R$??jAs5yL{Bh;eL}1ulb9enR z9uABinlzvewaG`$y{*t}&wp*&;XT&56C#|Mx>P}n#nRcAww8zP>g~B^Wv6fNed$7B zH~++AbHM6@$A}-!gjK_u4mJ<(|L2MN5P}~rGV$PK8TBC$6JT7LK`s=!2bk&rO-kmt z{bHi^GoJo6D|Hl*+e(@iMn2mCm&VF}k7~LFI;olC*8a_O6mbQ{HN7Jk_cCHoQdB7P z$Wy`ty2vBv1ySae^LFCv$;4P1qt7%*K6?Q^iI($<$fWCgBsueO>Ff1CkOeO*!8|Va zNk?2(&G!gf(gn82n)8OLw2e)-DCwFtd>=1#1tF*$2bD;fxlsi(W^Xh{*T8Nn+WH$; z?m!~`jZDNrNrH(zXB1>oZ05kvn8;KFyC&vo$L$xb)LuS=pmHjrGC~Q7uQ|d0F4+HK zP)Q%a4ic+JAcBl_lQEVS zzawy0o8Elwc}J+l?YFf=?If1vt5jwxz@^cd&iRpkOBaBrslHEq>MEvvgp^z*qg!fA zI^D!5whh>30$0q7waOG*F01^_gsZ3&D`j+V8E}pAnI9(({s1T6Cm-I#Z$51o+)5bR z%(cJ@odTZ?!sEad_r_N^$y2(9i}KJ}CgY_iTV`L%6v1HZ43L%9+bm?SaRxeOH_&q7Xo0r80{+S@MFabQ`{wb}bl+m$fbbO5-+_I> zrF&)JnfB#{1v!LQN3yC$n;4NC$6e_?o)BN=k=eNgL<~KNd+Vt;7j@&P2s0&HirxX?@q|Z5OGxKYbEXrlUHu>j^Yo|=!!xIZhE>M7 z@3IhF_E!X47kT_XvvX6P)9VWkeR~jd1G>9Ag1IGmsBPigK8CCvdfqFU2hbv=AfEe?T-F?b>^zxW__?o zNRsDBc8^}%e6)Bi4tpqWvxL_^in~`&+*<=&7l%>L#8OKek~o+#k~S|EO~QKeWwGbx2R-LzM6CNfIO$5PUySe_snBnDid^ygyaw z{#2I0BnY4tY!@d4=Wfh`dV`S%cL{nJ2!ve%vZ)_s zJ(4MpxRN)ypyB=sD14a;zLgf;#N5T;<4g-`I^e}S;woOk<3s9%m#L<}-1fkBBjM%k$lwSgBZ;wxtVEPdE-Cv00MU}?W}US#qB~+>jLHCF zwdCtsSvh@U$-Lz=q^5eM2@%5HbOxA+T8QJYxIpX}YqfAS%>gZxAAhs#)7je_H+GHX zCb=bZ`ic<5CFc#p6KJvpd4wR{mdQIwVziq3LM(>8xTl)0F$(mo0NG;R>`|5)mqdz+ zYRVE~6|`+d_@MuI3C^Tt_^=fYIXAhcq!Ja%1Z6wh{6tm-4!}#_t~{KjwuPvWG!nKA ze%vm@-x&qFuey+r5j%)O@omPxege+kxg@4@e@F%+dKe0fQaQs{Igq?x9b>7HMxZhE z>XKO@a_i48OBHQX4VebV6P104irz3Np8P$c3gU^)c2IW2`Zs?!b7E3oXio#OIm`XI{iIHOk6iam~ z-U!o-1`QfwOb!3OT?V7*BKX2=t}&9Izulc`tfan_?5DO6w30Co_eLviK~J_N{YUlJ z%sCx0EI7He1)yrnehjxhrc4(rvw~8$Dh8dJEEy{8k{B+n&SAAL#{sr%3vsbI27qt- z$sJ99%ob}^8FXsNvLKK&i?%4j2wy9sx!pD2Ae(9nyYI3V5B+9a{6tmnNc;onA~lq= zPN-Mdwo$xgCZ`g6pK9X#dazVHTOLy2_d$i61HZ+tYq*|ZLL=;Jx6u2w8{G)RTV?dP) zuQy6u-t7xVKwq)r-6!9Flx5|Xu1Bq3E$mR#V6{TS)1uw;Ruv9@gLljir{+;Q<-B#F zbj$6TZIT2FSdwSi!0v{8^q?dYgo1QoT2I!z4GkA9q)Z-=It{OTXbH#Nfz+9kDwbb5 zqWngIDGX!oBS{ocMhSK-5A3h!n%AUP4)Z^)I7qVlNNimcKw|?Hl>wSuWj+YfZ7%G5B!J3V6||6EWP5B zFz=9zvySR5R!1+`(gL+Q2_OY+c*C31N|>0-Rq=|_Mm#R?PDkL4t`Je!l|Ry5bP)IA zJOR1H0EV#2VpPKQw#f2Je9+^CG5OD`<^Fl-0gK*f@u95UobD|vn2+i$yqR-vCnuZ! z!;?`bpq@cd058c4fnHjhikg@;HChQZy+y%H zAH2T$x!J<(Ai3?)iSN7x{_16+FVB^AB)h@w!%0R|*etqRsY4~+{z(goqm+s3A5Arf zkmMESf*3?NmN~wxtsmmmnzIeZNKK!w%~mk1e<-+&-?iy?<~GJ=F?>S~LeH{fWkM+% z1+!Ck4k;yIcTmo`IUAWHNX-pM8VSX-SruWInDd(9YsC(Mg8P_-w8}>c7;oFSh9<;r zqw>l2B!ft`I%Q)8*O(k7P-`^?a1=W{UGxP`8Z>fnsuxxFixm^J-4B`yZ1rT~1JyZe z?NMQDcxXD64~M255-VNj|4yr#fuTu9K7cf-F&v7+ihOL-WY47KjbM6KoM3Jx43#{g z)2<-Sx7*A>WQlw{-5TP0_U!~*T%0f7|EnHlJon5HW;_-KZ*Cb<;7Fj0RW$;-GvOh4 z%}=cs^VZLYf1X8fED&H+{+Vsz+&xYlqAekw=V4M7IT=aONFH=?KX!xX+(?TabWLAD zH_WE!>PTz=WP2ZGnUa5v>Yh75i;_ITSvzm` zlhx3Y2;*E)6945R6gNam*oedY33-fqXfj>w)IEDxjFGXCYp5W*>QGN)VD(G4tPmJm z>7NaXhD1t-jRH;>Q7MV1=_xdF7*JyN~_Dq;FQ z^bnOMGmN78{+J=VCJt{=Ih9QHDvl4s_3K=O53b)?F)yyM{)j=IP!ztimf+i8+EF$~ zta?nOwz&QvY#B8eMt*OVZ0^v&Q)_@e87fn&lIvmmijTa>lAY{-^%x`-0Hrq6!jEfA z=YcTvi1-z93wjjN`aMie1ML24lSE!1B(cI+mNJJrXFnX({aUG zck-~mbR^Jjk4mslG?iahgRR)&JLh8RpBu&mVCOzMeueBaQ4NVW?l?Bx!U)+GSuG+| zXi`&@WQYiE<*S$HDe)&ZIpi?~53R9?mWG$9`>Sb0=A|NeF-@_gnQ|fBR1VXp(HPw7 zKhO-HKbej#bzLA<8VsRLJ*c=D9V@_F z^S9o67KR9RI)hi~EYkT-28z@8wW}U(24ew`%R5;0I|9exsMHqe#GS2idQ`d9*pct} z8#T;NF!|XfXKJf|UyQw(puL;$uJg9re=tHx>?dqO%pE+_ zug0H~Rd48Pi8kJ+_i?79H&wHOeSE$Y`A}W8+-XEY{1Zy}_TFek(lqg~=!g;A^s_4e zSf{&@%Nbga!Dd++{LoU~hzT+80C81|v$M?6$->=lOz%7O1>kN`Tp6hX0LVy+{bbvmYA1e}GVnAIAunJGlHt2=&l`Zb(F(ZZl!fIX=RQo+dwx zDXf+o$PBYTqw~WBR@yir!YYAMz5{E&vt7RO@459vPOKBV7}BMz7OQ0en%(E0D>MjG z2U67SK&Y_7u=QKb((-N(v7MJr=;1q-B6rO`S4QZz@=$)93MU?Ko;SONEKMop!S~Ih zo87mMs&Nx{-mjL!e3PQ}QdWh~>tWp{w&AN`-a`|h_OMwj%uGBufYb{)#{#988ilQwC4ignwX zPbJYgf%6wn-)H#TepeIJ$s+crcdlozU)ToSw1zRE-&_@{2-pz_4Jjtybmm{M|0nHb zE+|JJ7a9m?5gQ1IW`|n2JMs+tWz#{fHj~YYGJ4B!sfjC~ssc~4{5ZoxxD7(=GuFgre?(2 zPm`9Z{TGepb;ZYdYr>;@`})1z2R_T|d}kksrDhNj3VkZ(EP&sjI4yKI60Z{6iMr&B zzh8>%E(hU44zUcNN}K4hClT^ksk02DxFltu9ubG0Q(cNwRA!-x*j6g~_`*W0H&c#= zgDjrXi=UgKr~OrjX{cx|nInJ=-v^xyIwc>T z3KOLmp~$Q#ZfehEdOn*fH*`M7LgWn_yq7XZNxDx$-T#FW>k?>D0(zK2oa=AEazs~= zl~z7!Stn1#4R$x-0+C#^%N6~~7TjBo8P#sd5G?Q=Ze8m}C5nPd_X0C0bmMP3e*&xOM}fq1&19n@MK<;`VUEVg@TDu#kH2+{C8coPUH8T z!nzJ}@?w?q!V4pEbO-GiR2UOtNu0QYab(lRP**QZQUq&%42(F+ja_nJg-4|T3tP`7E9#`x#w^zo&~-5K=eePhS=j{97} zh~r}j+UEv0FX=(aoVLG)gI25++j0dG^!Ujg9`Gcb=JSZ?{pl=`C;*-Qwk!xuB;Xzi zLYg*S-Iy`N$kG?j4kaxqdRegm%sHeYL@ZT8bc)b;tHOfPp-~8u#5uO##HIj_V04xP z6|H|IM^}H7ri9`CNf*XY2rKWiXGUFCI>laMN5zu7nZYj$_iZ|5?l!3e&)2uI`aI#| zBGM710K_l;l3^D^tx}a)6jg+W^UxTqyVDe{At4gC0NUA{_Z5N%ll&Zn%QCeo>xT9V zm-5e%h8Ba{1z@pTi(gfJMfOgPbfS%I)}ln8U{nO9?1_EL2gwA zT%)0Or0%04U^z-VNTec?pp7h0V#s7Nh$$Uwje(PMK&8Il zU_kZ*vImdRWjGa3^>f4qkb&jeN;_+-avkoUiflbZNu_f|VMqrf+NRNJRQo;w@H_m$ z%A!?hMr@PRaCNz*`fiwHqDD%7KD@(dw||uX_RZ#?%L_-$%JF{=A^+p}RP=Z+8N}H^ z?15!LeZ6U=Efp&X1?^-A#}gy4~ro4MPzwDBVc+D>p{GU=TP;}pt$4; zD|^;3v~@ru`hk2UwL8|FBw)L5+)!~&k3H`gWxkj-J{7w^98m+f1WR^dQwSx;f@GCg@;Y{>`<#69CUafw-z)+p-Tbk%mq;wfmL=g?s zPukHkIT4gnY;Ei)IS%430}Y}Jd|_U#o5a!ieRHo!Tpdru&8fPY&MJD`&F_By(wUhS zq-1ap{ku9yV@>BdglNvqR`uDS#r0fLB>BOvT@@qvek4#id$cI9B6RCu4di;=7z`su zHNRvOhM0ly6X!AG8LhagoU$fCT)7N{;jS8%Q5pA*G7sBvq|>8J8k%p|>^ekp5XT zj_>acs9RMI3nxI*e0|1mBgnyrcZ$xSQ;%QVk|2#SIdnH<5^y<|-A*4r|AQ3t(EeLk z4LaKC1*dbe9`eTP1E@xYcOWJd8_CDbVWp~W%WtozpA4&aqmyPBW9eBMmDD=hj!oWp ze;CfI6J(t9q+CR96=mhP?nXnCnvCD#H(oaMNJ#chF{9WO=wlbv|2w-jdS}a<6S9L=a75n z5QoN@!pzwLpJ=sAS{1Y~(rSU}i~}m|`sLymxFn%ogDCHqUP$D| zYjrGauXW(i7HE-q)xI=bAo(o?zBFB3K(9{6bW`>&G!D*35T4gYwo(i*-5v+wQhVjW z^!M~y4%UN>2^Y9-`rTMa$46rKCX#hL;6FTX@@D?vZ^=f(EfL*tCi7?+n%s>~ftC$UUotRd&inKJTYwArwaWe_j~ zW-0g@MU2XazXf2BQ?u{QO`w0ph1)$L(^KYUdifC`xcAWo4KT@hpvRe@%Tf7TusNCRW_pyt~XP1hsd2G&v28~JCj|4we2=vuiBUqHgx^t z_;tf%W*5paqE~i4Er-b^Ipm!+HU`axL958?7F74D%!DA!xLTA*H7A@|5aKS5o2VTX z{z6lhrm8sEktMOMt@QB}=YUfHKuy{ZW8sdadQ|<0x>yqA5^|16*f{2J!2Pl|`p}?o zd1_VRc!mFnKlwUj+djJGxLhsPagqH@cMiOl^{Ic6p?hjTYRt;;aRCH56)dB@Y zwqeGrK~|2fQn3uHPZloHtIQIGR>Udi22%fxP=lrTuW{oiuK9E3~ck{Uhq$j|{>ASmAL?epWt+25($#6V6^P=h!f<5Ptcr1N1whhI2 z^dXrT4blFh+L|l8kqb+c8NOML89A6h>mJbLFMK(g^nOy}PDDkhPH|dyeluw4>-Zs} zj_1h>(~dQ5$$u};>zg)R*Xb@F+uxnnlOwubyC2EFHpG_AZxF1-(Cobm^HcSm+ZKlR zweYu-$sZCc^2`n-y!MUh4GbA=nBa^i?UEZHx5_n5>g-tBT;|$0gX(x<3^zq%sv=1 z$238GxMJsKWKL`ouQuJNtftgc1$g=(gdH7o;%gX80Q9Tp4SJhdwZ_`tkh887dg&R= zcZ^;Ygz?!JQ2DTwpb3d}2D|S11i%7P!{&|%{zDsDPi%Tt8wkox469xJhn^Z2C+mkW z!Jq*+*cLTOGc+=;n?x7UvdkUa^cq+Vc8ne?lx8K6=PQSCCKBvgRK=A7^pWK?{68Tj zs{5FIi_C`MUy)87HX&^tQPt>Vn`zXj(blw6k%{%{eat#aPdIJkQksH|c6a#rY{ZcL zw;Eqj$rzoH>Hu>X9q6CszhDce2S`7brT#uaKs~ic;)h9Zlpp9o|H1RtlwRv2iJl`E#@?&c<>EdrQkKVPE?Lfg);;lojXeDhtCx48LAZ_QG|^X^v6j^HSDN- z6htrY!&bPhRS=;RpEtQHpvn&j)vdS|!-0gfU>2B6KE%p1@)}G=8{1=$Skqa(qNE}Q;k(8G}sLnDeYq_SjdM9vXerxP(TY`zl-4l9H0$K^o1iI_SH?bk{ZF9-ANw37N;aCs@6j(>^&9n8ocUT6C7 zk8YM6qsi_boF!1X7r<6Hqz3H0rkFDipg(npL^o7nlm9kJ- z&KF_tHh}p|B&rp{Uo7wz9cTFl0ULJ^sd2r)G3Yz5!6xL{yqmor9a+6R>nHfCh&qjq z?C>qT?kV|Rg~UXMB#z%T&h`@po?Q5#*1xe_Zc5f;sw8F?sV{Mp`h|$6aCe@ACt!Ms z#O2WSC@?b?q>)jFkVLEZ>2llS?{#!%zKhhw25;6Hr$`QRHg%$kWG06QrEfo4AF?uB&-cd72ihIr1Tvdnm&|cV#fKQfdfI+wp}BXL{lQwp`1QTr&h729D-w zDb{tb$1k@HJHI$zqk+1NrJWk+wsm!0j!AFuu$O~J6>{ZGgcYuSm(cUsO7gxrH@is+ zD^9LgyvhRAZAkK439>TD`BzI2FPNSob(Jcvpi_^%1-ps&X`M>9H%J{GohFtzPF2$Y z|8jK=oi1=BmPH-CE?Tu4oW~nfFpCMG-Xnp;So-Ntu^jfo#`+muX`PPV+{;{trD<6| zQ4{OGW0^qqf4eKSo%_F4|F-XY{tbKc2312d(I-=^%N~rTp`Vhp$j21!>gUcq#saG% z23TOM-EOrCb(Ddr>}gdSl)ZkOs4=`N43w2kEYQ;?C~tByl9qF1Jq0ZZoo~2b9GWO` zm*+2Tmd@i|mcEu;olXTSC`MfOqQeRvxZ@zc*d0k=zMS4bX$He{SOc^${UeYlaVV0u z8zJa0866@s-lJR$UJ-tTWF$Y#n zp*O7#itCNd`b~3f3%FGGv9&v~3iHcrJC_{h1rRt7CMML5(DnnameUqt<9WzIVj1lvC=}hjzpJsoAd=mvy|K(Yj5`Ej?`rN7ia%qn>IVZE1+z0gu7IzpC1$lkK`I9PqC2k07v<$WlBNZ#eK zV6aW^scAfmFQ@<0aL-i8U0(;F-1m8FUw*+7Kd@rwhP!4e#>(ULLDd5{G&D#f05?536aq5@aj4KCKZ#l<88(%ODE)>zhcg`)3 zuG86Z4tAiNNGBcoMea?wei5ot?Vi7Af5DBEo5w)tQX|+@6Yf3VynkHAcO$L(p*o?t=q{6=KC!tpXUIt~FMUK8<} z-~pp*H%vpXoS1A;>ju4sOtx^~pP^u~6vu-N{K4?9xVoL$`47K--{Q0EgNmLBwm`+; z`H9{_Mfa+R_<+jNg=G(r@l0)b3$)g!*Gq~f*u8*&Z4{iZ6pROoCq0E+>?ot#J`t-G z1>*NGwBLySu(ZF0(EzL8usEw0(|2j078oDrG=5AQuHriED)A?>u9kbU*c9EVHgOr6 z#5a*d9&IxF(S|XZl~P076+O?#Lc;7B3 z;pj>B(1D|`s5}w%IXl-V(|<6x-LeAiZ0yQ>(m@`$VRp0G2($WmJ}5)>G+RKvtNyT0 zu)y2?`3^s1GT^p8@Q}4LGvd`sxKaxJhbjKzWlpsFTpo*u_P3I?eySLw*P0|jj$i=Q zQZ-=)IW4Zcsmeq>nR*|qD$=G7CU-ytR1<`@PH++vmt87~8#5YOFqFE5$cLxn@x4O> zJF@$*oIpZ`ZtYbyLyZ1|denL}^(vkMD%bQR@Bmqqe9g-rjWV@Ffd(~0mYKS!b+mAj zbXmn1Oia{QBX{0jh|E86!4JKX55BUGBOIS!`y`(ky{K_TxD)F1vx%Rkj64XnR32E#wG|`Yq44l1f*T?dJ(749r~WvpojxT9-w-{aOr z#=KKxtmqHVsxrIBmXgzxTz2uoX%!YnSN@1R_4jq+hmY;S_N2w0)G+EX^4XSs*0_yu z)G>NqCd4d_Y?E_K83#a_p$u;+7mmoL$+-k%w7VzA=U}?CWt#q^{USkW-zrhz{0I6D zLZf^Le3c#fdupdLK+70cBs7Au+R-KqjC6YM*qS#+7kPeuE6t-(E=^~8sN3&XcR+cn zADMK1vXo^(f9O2bJbpd^t5&%^+R6cY{fMJ!QoQDm3*EM|(#fIY8%}X;bD6b+!ibK? zRB0K9r-BSEz0K_oFy2?{@OPh4&+om+k86alOG)QvB?4abP%s)OKy6PEx=BxasAl1_ zgh~cm2z=SL+puzF;d@Qw)v=ZO4UZC(fGPJ8Md zJL#uy@ayK~EQd0|ct^R+#*H`G!zCYfYp+dqtM}DPbj3G>_1eEwrkto7$j~%nwZk(a zG4+bLy-@CbNS)rxwg3AYrpJKf2eCYImwj;0WL_8cSXSN8PGqAnQC+Zq>SkAe$?ZGU zh~d~=9Ah@QB}=a2PNx;<_KlIQVh@PnZERgDoX!vH>LL0hKzfKIEmbWW5?yH8{ch=+ zXm)#=sFw*ToCvqac8+}Y_E5`$-f+%HXt2Elcn1~4si4ITb8+-T;grl0S9uN8dDnod zw^!kv2Mvzfr)_i8q3@s>@s8ql7Ysth#)L>C2WKZK2Iftf7IJD_M!K8AY9CHm9kjN@ zNhIV*H-OdR{+BRMiY-3NgdZ-=6&er_-~V?@`rju~g{tokN~+l385^6O?W58Veg#xS zL3qTguz%JBpu{1jfuQ~H#06o6TUWK>f+n{dpMyoqQP*EgYr`v1`NK7EZ~fpCihLO( zc}FAnBctEIU(z}D9TsW>q;4IiI#)NjNc|=cwtkkPd3d&e5{kNxvvj+B&RKk=Us9ui z{i5tVa(Emleo&*vXY4pNijR=(Jo^RI4tR>&dWA^F47VMt@eLdc8_t}Gb`uHl)Llp9s6qa$whlqu_7E_r~5v|NsWG^{>|kRgKS(aHG%ujGWB!Mf5c5Q(>Y6lsA#s&k@ zOKPY~;qPA#+{*xia3s&x#5g8JugA(#{2_YqZH7G!5CkDG7?fL=+3$U?-a(vR*iWqj4HOGqv-z^*CC(UAYAq}enO>-{29r23%u!J-nHLTJ8l`V&j za879sOi-1nXqhnkfQfMtKjr#qzrb#sL}Ak*5^U<=t@pN;*B}9U`I6HbaJzC4H z=B1)RaKT^;F%3a=TAz_}=5&euDs5)WbaC&!Czpql84BOIV&)YI_#rO!6~8O!qu>Y9shxl)Yng zq<^{v+F{2=#kOsCY&+?oV%zDsW81cE+fF*R?M~9UnfcE-_s*=jXU_RhYgK)C-?gfq zdiSIK+xwm*cdtdKn*w}k!ukQGK|p0bt>L*{BX8|O4?Al)Nka2A1k$6zsram{Vlpay zls^9P`CRsQ#vkzVf)@jY7(&mV8LBd!mbDNiY5Xxwcsw=~^`7A7WSf0U^Y+p=@w4_} zlDI4=meXAZo?{XD)=SpkD{6s`RBfZOF3T&XT<`3rXNNOv5MeyHEIx+WT*t8hHF^ih zDe*R=DZEb4vWlwAa`Y;%wY@5*JfYMw`$jtxy9)fJ=~;P4Q%mLWiZ7e3c&?o-Ib$+}Od#Y`%PM-WlN1pC+fVx_94BUyfAxRV&r#oSU52x@=d2;c;Y*jo+D*zoi- z0BvdJ06(L~LA6auzkB3s(gUKalj&S5;(=>NNne{X*mPLNqn-Q?Bpq{#mvxw|i?w?Z z2QUeKpFQk!ZMUX6t%#hoG_nwRYCg#9S{9gA$@tuGv)UrGX$zU?ec56dP<;~|MudNZ z5->UEiV0nid<|6HDjLZNcAtoFoOHBCgWnf;FKe=ni#z+?oO&v&m5OfN~}SeWOp;Caqh!tFzfAdm~SDpNLr1d$T< zDmzlWLpgOQJ&qFd!Ge$oTawymZkS_9wrIJbO)fKP<#oUorL0P#Kd+pQaZ0?59!;Bp zMb}FU8@+jB;gnJI109MJ1VWTrYV?zzN(17GwcH-4;jo0CDhsO)!H@$b9U=Lhl>Pkp zRcpwHrteC)15!?uNQ%o|>^ayOLs$?Mkkfk*5T7SC28Yd__HbWw6JPFTVca8bXD)X# zhCE|(PQ_}i4A1$Dd8^jx9S`bk0yLY2rmed|Fzu6W=lUfSAafj}*oOK}Y7PGuw-uRZ;BRat8rn7ydu?3)f(lsRS_bdB6eC_aoxYL7&HfmUk z)%ww1GUVARK%=l@c^v{KV`~H=cB$W8^kYN;(U7Q`AwI?+5UM$5M(TzdV;h(HM$_bi z4L?(0I{wa`b=#SB2i~d|)BV&dzK5X(pFR&Y*$uRPB49*YW(r+&)h1Xe0G^r%1WP5U zgA=i%no?`G;kGP~y2@-};TTt(|F?kP6$7P?ktjWz{+@)I0v2e{6B61}jn1%#QLip> zw#3yD=i%z2^lx{D6IC7XTr)rI2aaC8z~xHN#DY>baT$m~zcVk7kb#J~H+U2WmTLU6 zIwIBBoI4mp)h7Hh6+$h1FRBL!#4boCtgAEJZXp}pj_T`7Csgvy-IADVLlWG@jUN7o zn0~DyaNo%@TMf(Z1C)1f{3$yOQ-HqVuR!d`9XR_A`){?iY+qf&BD|<1m??c|3aX_^K^s17-ZVqkMbnE!$F^$~PSHgVt zmbTeG$)_XHz(ZiBQ^D?a&;wd0BUpBkVIl*T{JS6tg4krC5zqX|be!36d@#q{-${1f zphZ7fp%?lZ{k}l>_sGUq*NQ=b6}OL2*=NkAoh_@34+HN%$&EMo<>&OCD<2x&Pi|Ab z1mb~$1P_pb`id)kr@Dh>-GS95dS>w%<6$z|ij)h-8N|x$rOg_%*n9%zWy{IdU#lW% zG;uK9lEKB1+CqqlE>Z0jhSec_Pa#1)RK#6(-u&C4IzI=%tsmH}{DGz&dM~=0z^L-Z zB&p=GW4zI>@$~92nm;0-;@Y<>T2%35V~T{-NJ!CyqhJGc&K^kF&hMIaH zs(WV<_!jp~n2wF=f)MLp*HauJNDr#rZXj|u@?m{@0zTlibOulycPL6J)V(#VrF23F zFmx>L4ocLcgj=&JEOZw7D2OSMoi#|+4lY1m*nF_JaMkxVJ!nP~?ag!Fw5}P?Zy5vg z%8#4mMQpmEDS1M91&9`3a>eSlVA(vPy6&E^;Yr4ZTvG^=6Rw1Qy+eO&DZYloT|(Lr zz4`t#`{?;g1heC(rBdgo6N2IYsp3=qyG*@^t&QWSp^}p$>0f6@{(DW~WNvGt@M-UE zYh-Js26S-z{P>q#VPmYcG#C?Fki6A}S*6z2bWj+q^Ue>R8<4r*fD&bMOZB`0qnQPB zP|33GZU?fK>raoR0iJw+8#Hi^r$Zhc2YER?z3eQI^Y5D?i2a%cJYAjf;y*x|Ruq5uZSMD?z4=Oa~Ks@y+dIDHSk<+8Vc&$vpg;T*^5n~c#G_42UKFsyZ zu!7Z{_T{jS?#rT@_O~daX1YYDcDU5UMRF1SMhslY9lanw2)Kak@igAcFt}9{(#yp0 z*Msm=Ns^M_hi?U@ZiVw&)&f?H#?rr)7~#|lPz;*qQHo+yOaYb0KZj-ITtWo~D%z8h zb~4n6y;ziqD!nE6Z8nM<nl4_JF+zB^{pXOsIxu6?eTMt>(?#q5ws-oMkpC6WOyzN#c|kNj z)MDp&a_<|s=%xfvYd`D(81xw2WirU&C_@S*8q#q|@!r8&vNe$2vhD$xPzZt^agb%X zyBye<)1WK9qbwdrZ^#*WZh{MPx@&{^IOVct@H)R1P`fh&79fn9vO>4v$fGpSkE;Qd;;t$Rw%Bv8+ z{UD``Z|fJsaf2k&51kA)!$)dER0c>CHZcQm>XAuRJZ&bcQR`M?AyHM>)fd=c^MElD zgSCgRI?u9*v6>-y<4Ff*ucTfqj$u3f3S(i`jppV>L>VSJWP7arb-;d?h2YW!TxnIA zfV6Sd`32QgyRwib3+U1;S}Zz#gChx#rqe)DWp%p7($O{-(lztaSypRhreV|=zt>a0 z^*L+t($X>Qa@AtL=)j#CcQW2XxbQYiJENJa>k&CVLyg(~sTELwznQ>b)An87Y;tRVE2Gw$;{&VL1KKCj`r)zbZ2~TLYD%G4o0(Y1}H8f z-Lm7T1$XoQKg7eXhM0<@H=aLve0egi7?e5wqO`Hq_ z97U%b&|7JJ&Cu0yJ8XStNB6EZOhc|zHsuGfs6b}F8M8x=H@V=)TP|009>^xlXo{s}(zpZ`Xo{|r8V2b{kP zaj80)TRD<`13La=Df(Z&E18P2@}Nve-lE1YO2`8P@tBBi23I-cVx%_yaZnx%;}T(o z(!Z*(ebc^vx~+_@=%SFB$uuN$+;QJ+Hrze_xrNyVwBs|wT`;D-94eY|v3G@=#@>qV z(V}%{b6HQkBOt?|_UQ);=M|14E$%qDNnAZ~7=xF;s@6GAt z5}9vs_6nd7kYoR8h^M43VXCG7-efY@TjPpHLu2AZ69JIqR;8}v^@i{N6KBDpW+3c{ zMJfF|DrBGbR^9kq)VLx9Tjb6*+=%k4R4jk|IzVdfK=u#-Sc<_tbZLviWxm!)a`wU( z#RMuiyb)6ykqpXOaZR+Qh4o(~lp78kAcq>FKj`fIOO%o=q7*MaqvQPR^N zBf`$+R>uDot3>&6xqe2Z3_3EKc?=k+8!+5$CEqW*J<2M=_X;;4au%vpxb1a#+iRTH zAYN#O@lxpisGg~rnX8LaN6W8Ye@Np(IYFrxRvUY<_0s3lH%mz@wMXfdK->}74~^j zJ9TE>6!qiZF|$m!Mt7O?#*^~4tsuw!@UfgbNAi&8F8WFk--B;(+ie!Ov%rOCQxT@f z!uOWWMuOxrgJyrKYdir_Pj3{RnDL4L325T%<2Q;ju?)0d`uG=%I zd|~}R|Du1v?x6alBd$35$Ag8dsVkd3uI8T<&f4WzCYsf`v=zDUWNWn#exhn>Khahp z;UZkt%4@}0&QdjfM>vTj$rQNkB+8z_S^|wwls@N_GWK?=+ap}b87+!~L3t%o&(2p> z4ROm#SXeC+XO~ZlSDjmDmoM|l-S2!q_MXilnVbMW(C=y=0FbWi&{LH9S z)eFVtKyxdj6~W?cI-?y?*3+yf?_^rDxAa5Pm_R3(+Wli+trdP+UThhqoz(kXaagdB zX*e+e(bCQs7$B?6jmNOeJDpY7ySe)d7v9AX7N4VLaRBugg|qPl0M2c?SkgsV!?N6t zs~Ucv<7eYXa@L+6(~GViwGz9Lm)gsIuE4fMWkQyUZ0jrYrOuuDt2Z-3E>~GgVU&DM9M%Pr^St;(S^h-Ha zi1<9X^!Fo?O>FDT>g7Adv$NZd9; z59@Bl&{m9V-!zBY_rKnyam|E+{`^H0Z;BY5(1}y(V%b?-%GF( zu7l9d%X`3lUoD{z?Dr9=O9A5q(h@m!#Q9tzZ9l`P@Zpj*8JC42T;KqLnxV`QaooA} zm@EyG-=)sgd%JoowtDFAsGd~W;4L%6#X(US0H>v)5}U;G`&Zl>oP`dwE}HB0Un^Q; zHto6DiF%{e?y+#jT$T(XqybbiIBtUja8t;RXXx&Ik5;;7L31Xv(M>L^HI^Ye+uSwQ zPVs_XD-4dW(U^GhS(TI1W8d5G71U=LRxcwa6*z5ahw`~XIOcXjItY)CmZSHReiN)q zN35GWHp2<{U%;jus8amCk%bs2W1C^IYQLoA36PzomtvniHQcOVhxPDa;Q^#&;qwZe zrOx7zX{vrlgr8{KB#a-&^>-dCb#p1$q9s6-#k`b%5B=Z}I|XTkfZ+mV3bDt1jlR@1 zF<(Le-f?eiKE4os=gguAn8g`Ku|zQRi^pl%+D1}Slt}aSZ;piHUBj~nJ={dJfw9tj z_u7%InqGr$FPk;o=0;wpCcYm2FeD;ajd#kgD+-pf+3U8UlTyE*OVC-8rqrIV5!Dyl*XFu zm!;PGtI+R?D+h?hlI+N%{&9=73wd(RDwU{7|P z=pApfkKme}Z(}I?hMJ$^1GefT@~u1mPr#e+jrGonab~z&mGwI@8^^P0;atrqpuG^GQg(k(njp`7W@xQ)R{Z{L6lz>O{SPz$D- zZ2qt0_wP;6DE?#e`)@zvf9_$RmhV{WK8^d9KJP32zrV>}J*tWW5cp4hs=VFbx>d)& z5^JTZy)up}(gz<36sdYnLf#z4tVKHbzMz#QG#xonP`@B;D2P8s^gf7qG*3tS%u@Gn zgEwWxc9VJaBmPX}MfaSfH~SOo3A*`DOVh4pNS{8G^!4PDG$ofv_lT zv;8qt>7I4(-|Fwf=;nQ&w}U~tUqe0Yr@ zwWW8Oi;Cz*-KYB-$#9s*ijsVeZgX`Drf?UEWKCHp!>+1*Y;cO8U(56kTIquQjyi!GJ40^@jgIJDr5G;_?H(MACf|}KzukQlg1cL zJt>o*D5*?#8t|?7MYt}NjkSHX+^J#)%Ous#5)|<`KH$vitXbaCl({g~8O)Yad7DU1 zEKD;WNf;~Ydp4kW!csUC9qSis0FgZ;8q>mhT_{zf$)S1bvSx_jJ$);Xf{<+4t$)Tj z3H*&E0|^>@f_ifIUh{iN>;-D%L=6&M=JMC1wwiCw`B1|~I7PjZXJytj=&r$-r)9gd zLUB?=s+$#Bz(0bhvd-`Kj7Ga9C+%3dIMF+nPT!HjHS)Zpu-o8aMz^*NMD&WLy*DW^ zkKdd5TP1GCpkLYT?`HLg@ivMYs^Suaf4B(RzOiY%A>}qMAA1B{OD|hSF4_D{Z3`vL z+b0ki?I$Ft*yHhV30<4)$0299Iph5nnB$?}vPWsht&^=-_ovIidvOt@m!oCHic9W{ z#0n{^#!G@0JUZ)nM3lFB=N3nYONiwhvP;y-wjC|x>=0kH_7$WIc0EAW-%>;qoLn~O zkM_zV=;WL-p(M%87E;wtKXw&|cxoOq**Ybd^O_hMG|vpwbaZFb*C2HWq^;_F`DT6zgBK+yF zCS&*Bd>PyJn9?jJDOdazo5)Do9C?4JRuhFFFx865a;>`Z==CSF$vkjs_CKYur*{}i%@g8BqPBFdcr#)7%ehC2Dv1N;Bq|N6hYMgCuWHE?kHBp826 z|Nd>F=iqGgX&(6(TuOfWNIKXUSp8$%qhc*TuYl%r$*smd_Jb*ym>~~T8=0Ci3<1hy zz}O%M8j@s7$`u$?MP?mh>pNuYa}y2?D}?&De%tL*7pyKu@NH&o-f`MJ>nOv~*7xJ( z2DXPeN%^OcBJ%Q#AGpX>m%A}`)X60lgX>c(Ix}gK)iQ!QAi>LkCsdA9wSd)0$mp}4 z-GJI$>r#e?t2@iGT**QXx)$gJeu7dUr3;w+?dxrp_HHT)=s#xn5+or_u z2N4adbzqZ`iq+E(bs86>qL?7!x=#zfP@-TtY2%lS@18UtCg29Ou>AlUgCq=PBB&Plx4xiMb>^YT6SC*&&LEul8v1)==! z6m_=pF_wnc?K13Uc*6cm&{ApNP?RM|ouc*$87*E)~{74Db=wjcbs1EGC6Je5Wp#UiUo+NmO zSdYI7YR-HyAbMxgor|iKL!9`C%(x2OlU%=_I7^t2KYjt!URA1i3MG$P;pBvWFwoy+ z9pXMV&apHVDmj;uB>B(3P$1s@YFjlvd-H3!|BWpCe?LC|QcnOK4E|P9{PoBbCTZJg ztD^^h?4>tlUbu-z;ce}%RL!p-gvOD}N?wpAS#zn;Nry(Af0I-``WCC(T8C!LMdhb- z4DZ1})+wS5Qz$5{ot;pmoTID<2tI*jVC-i>oVbRIhO=b2I4+SbW@s|GKhd_l2w&nd z9ru0N8qWU08HngzQfEh*sE<&gGlo`oqz-!T&Xo;oeCwBJNOVD44bI$Z*cRhh2g0K} z!nryDEKV6cGQ^yN_@jUb%ZAceQa@uxv75U+;dQP-iJewsM_N}^8uG9%oToRfE5agw z+ye9y&ngL|I&7Pgmm2-{2 zW~>B2c?v1+!ExZX5p7#`rqTd$vLdIN(sjry&C$J)xXJV6h1C?9XA43~3Z!_&^;an3QkcU#ib#HxZ? z85AaO=G1BR&-!uHEx*gtvL(DBL7q&7UnGXG&dJQnNujVNh}SBgqbCT%3jJxv0sae| z8=?)u1L8M?3ltpmIm!x2jr{hH9w9$uKN3(QP$EAnKXbp59(%vQ9%w&hP*db&d#y=IHe*vQwIJXY25=N>y&I!A+XBrWlTL_Kkwhi(mncPP`EXb%%y{ zAAMwann&!2h-Y_P-C7cb6f7PAnfiJy+6+8x$yIY?zo9P(te3mJzSM3iV6$WWhS!E$ zgX4j3hxdekg?9xYU|lk=8?{Vd|JV`gNA4#HHVP){r|LKFFWIs058Q$7R}MCXo5n7J z!-QiA)|6e$okl!WpnEt-b_@UgKvTz`_s7z%_Km3Ph6?5?Uh|o)bJ@NstU_$zdgvqH<~LY{abvgzkLF&VDTSqOn|+)!{rgk=eXD|tQj1wre3)=0 zcvvGU<%(#DYi*<;{4t4@U2P_zE*uiJ?m4NIQ*HXpz9EB9>x%r!{w}-!*5E~;31$dX zx^4uDmQDn!maYs+QwtR8FP%?4FM7j31WbG3;&4sj%H_7PqkKka-@PTtfI@5fS7AWWm(oZYkOsWmC+Z_jegcVYw=Qb@HKpe z*sCsee3k5V7bc!!Y_%7_*IXs5*VQc5^c5SU*VxLn(U`)Y^DiCf(3u*y;E1`gaZIy2;Ou%DFbv*i+RS$TRtvc52cd ze&O60Ice}(dTPKk{TO@-)HZ%iJvGw)4JFVWcF=eWe?yC>-s8eL$F%781yAes#2HBl zwpEv&ABeRc&WWE(asVT``9oxS1(d&+?>Pb?)b~63M_$OE?t4p}fDl>%{6>%K zghm|o3gix}4Zr2ec(-}2o;5XO%O$WD6TW~g?dsj=C7$Q_2PXddKM~zpzWrO3zH^hB zz^v`^=N~U?|LQ5nlCXBV{MizZe`-nm=e6FyPh84Q21b_uXoJkO4_Q?B< zFj56g@YSW2){P*almja$>Ysy4b7ZZ3rzRYiHg@~T_g|fg^eg9u=~yy-F0)Sr%sekI zQG`LAA%6p}>gBWej(8cKHs4;JY`eiyzHvoCVmQQVK%+k{Eq`u1% zoDVd>+Ds5+?+6<5XRtx%#?rqa06zt)ER)$MIv2YxzV_up#q-y$|t)hYy?U@a0 zE+#mFmXD(P1E1PYlfRG7-Z58*c$mGQ{kG>1hQ)@AK{6|+Y7vxSK&xvTH#n9vv7{gc z2P|CE(?bv7X*O^Gkv0=?%c9k1uPmPhMTeIPi-psfNN0|kd3S79fb}so`$bMDmdr%q zWLH3350latJ^Nhf9($hDOfq&|%F!|dZh!pi9=TnYp2V}gha8zB4lMTNES)^U=K4=PRF1)ZxqI)72td7A;0Y{X-#88!Rl zU{}ImS7hx~p>c+vh#wKp^uN^g@{NqYUUdlRgA2SsjeEJ|_)UXnWB&AxUG5{qpPNVh zzC%;-rRxDoKVEVhCj%CXAckqI(J|W4xFL)15-c*-Z2hYoc(%$XcLLA}u9B4ZbLKD< zLy7a00CBk>&n+Mv)HjC@r=#Pj+lkb7ka78CHrCopBYg$E;r1GTKy~x`a@lh{kuS~f zYdW=2c8RGgGb$haC!+2tv!Hob0MN$jJC6DzmHg|>{P7U2WkPA*S$V;l_z0W7YdpPt z8>RIo!8Zjbo0Q93C!b(-blrw9dhwF>f_7JMU68skdVh+03!lzK+p|RbUpa&0rEyPd zfieq+?>|W`*zpO7272bfgu$~Eodlow@>Soy3AzTfKYo?FWH<4BJF3=QKct+-TYNZX zzf_RFR4rsY8p(YWp;5jfwiQTa=r>lbq_#%QZSv_#r&JmRUb2oao6K+ZG{$eDWQA-< zzI+}=peC!PKH+$oszbz6X<`aQpgx;9`knN|@Xuq!mX;Vv@y`*W`KJ%3*#CZv_)o?D z-!W6v3TO?qary^zs(ZRAA7FiCvRlvDSxCcNz(64nG*T(pi(En_5ckGdpu#{jW{?j* z&g_$tQ_x+X?*cE2rar$ju+1H3t;285Aw9i)=aAiXabx|^N!``e#`n3Ub;~o3+#EY4 zx?+0XEBS77YwOi#>uKLN${VD|;%z(>24b8f)XmdlKw>cO#ARv^x_(2Vp|~=kYHm% ziKf!j@W{EN#yCknrXg0r_dP|#gY|m>9fyU2YJgV8&bQ1k4;j^(#|0CtPui#qom$N_ zGm6Qlz@11Y6JJ&O!Y5k>yVgvK16>9l?cQdldg7QyR5u{ZJf$j!Ja$33=?erV_~y^u zDtnNob#ioD;d)TEyg@_1Z=@8zCj^Ovn+kUlFlHSOe?_pUPV}X+a#V_=n6PF*nVFZ1 zbSTvPfyYwAjZIW${HjMWrNpF;qNa|53ZWXCQdKw*SFbuT%+){|C&}cmNy3eS6wdHs4h@Hzyb9 zSX+6!D%WFyZfOTXMZ!dv`N(qqa4@n|su7LAqxY-J+ud#T8(yDeGf(YoD6FcLzpt=$ z%}+R{BJQGeu%#Sb93P@?3DGawKZl%(1Tsl1tZrVl!3rm6_$s#O(J}W>AY|>WB}`>e zfNOA;jQW`{Q|74?nqn!OXiCUKYDJ9YE!y%$_pI|-B2}i$$@{?cunSN>Dk{D#z!C>` zX~RJuLfig>$6%qfs!s6uiKUeMX>r8Aa~%+}Ss& z)9S|K{p+Jg=s)dt&8UA@4z1-SkFN=WvpC7=8m>ca65)I-e~w59@855_ADk|2AwWce zCZQ^${T3lUxW5pAbD7NF46Ay3R}%(?;+mWYu%&U6-iL!Rn z^xdc=u4hM+muF#h7JYpN^YRq70ygMXiZiH8%1^yXWXHz$y07bUD!iRXB(wLrt)`o1 z1@jnA53ot!|R%8NHQX(mgv`@5!=eb*&+jCnyA+RBCu0CLuzf#Vc zspOl`6(^SJK7|p4AD@)aBAtHGh!(5WIbz3K%IR%W3q8;KQyZ1T&Bu~zj~~<;E_8(B z=plSP&}d%7kCNtfRT5@A4C#Y_h+P`0Z)we>-C#UrFgHBO;-5z z&1fPN;wk8Dk}Ua5eBLgEv4AmBbvdz>Q2@jQaO7i{D;<@n2j<3X+x$U2DZb7O*><*U zi}fKP(;;&?G#PEeS67VZhB@EeLdl-1^!+&ujyAsXs%F`XN3GYS6sHv5GEj6S+zA9{+7QYD}IA}_sEu*%8e`Z`&}-= z(R^27gB2G3Q56Rbgnpg#m`sKGdFqOO?@RJcV#bn7)NSRMD^wPkJH+DSA+~l-8rcZ6 z%C)K&-FSst3k?xI(Om=`tlalge-VY~F@v@o6STV)zUsq6p4tIZ+iuO=j$hlt%Ya`P zaeLrt#sJgU*2zY@1fgTHYVCM3(+g%xOe$+}dp!uR2b-}NHd+GyF-c-hp>eW@2S z@W>56cWdXo{aJ777?6qdr`6hMMM2NC@5gF7bh-no-a#AJ;b-I^Yw{%vY4 zZ?;+=I?JmzV(G&}x>QT`pN7LxS|*|7{1ta;<#qS|>8Z=eoGf)cJFCrfuuz#lRz7~+ z6{c02!r2f`*%ln8%jLbix`tMaXiy9M{@ynT#Lt(c}rH0s0Co*)^Vme@f~F@0hQ+-dUGe-*wQvy33^> z;i*RV&T3PE=jw&<;r6OF*-W?B?P3pK+srz9`?&7`_(!e?kn1#~bn`@EjIz2GW{+bG z^S3uyhP|)75=8Qi;0T`9lUR~(-U9v67bh3RZ>S)e^E6Gen=BoJ>Q`6A4yP}DFM@<4 zTp81PtW*5gG*w-{v+HApzu;;Fw`*EH)pT6~@isz;&W|jQeZstc)PKD}!Z(>ftn26N zE4rbycY&JTsma^^x!b1*gt>WY*)SAaBePDy8VH`+rK3x zbc3x`WB>b7 z)f(tvX$Ab35*N5n>XGot-1GQc2~q!#*9kconVGx%O<(4(GB#3C))w`XOc@Wq$}XE0 zSL8+DC8!#XG?ZT12LVlB za@cv}*)-hkqyO=xCR&`PgeXkWb_WAHaJY0bepjj8N{3YEXo2Vk!9hm7GzF4d>+0j%aVG~$wTSCSP&2S;Zg_R>wh&<%Mq~zZk>fDMA z%XKpbEwC6=ldqiU!ITJLt0*=yRuc-S#Q3E_#+qfB{|;hcRPIa7U>qmu7zfuee`sv$ z2{4MRX)?o2P6}+fr6yn_T|m4@5h|{Z^l;6JPVf{U5Nx(pPK7U=2T?cX(}}KG{m3S| ztgX!E_Ixp^0{}g@fgX=)Q`EzUJz4E4cqd=DVQ=c~oc~l|b3@UTq1xn+qX+r!w@f`K zPYtwUcta!eMMcJ~4nhtub%gV@Xj5O+_UpJul$<|g>G(lq&;E&e7IA&SQSaw*PjMr#kJp zrh@b*t6=42ht(#osDZ4ZA$LTs1cy?=5H*gPPBA7EYuALk(-`fQO_4?#Uy>f$l>VB) z?w~ISj4utWKQeXm#lGH8d_SHPaRNZu zVCh1Li~;w-Thu|>oPKL?(gn?4)eF15B+1ETN-25+VAC#G!6NuruTg8pEyd|e;h>g2 z@yQ>9G}k<{u~);w3|kCV(FOn#&4@$BVBG%FkVm8Tg;3mPV=jY%oS>=V453BXB0Ijs ze(+o4EBjx(`RNeSVl7S0>c7^#M{pFm!X<-Sh3e23WMK8C7}35~D(qKmTOly);2tbr zuZ6(Ddh7(viVrCHV*+kZIOJvllQmmcp4ac&Nf}R zv`BU8auM~#AsZ$$$*4?feN<^c_M_RWpEbC+*SrWeactwWc~&o<`{y_l(gVbrGWe#W zxIx&=YnAl1uxag5qe_;k^jJm;ROp8H?3J87mkSdm$8A?GoA5aMW-+>TrmM8 z0!(za?edSZ{g=Q;;yNN!DQsHgU^2ZrpfGDdH>+Z)JY7dXvb#7 z0cY7~YCCZChwR>i$|{P|pR@F5#h!$jn!n?PM?bn|Hj(rV!mscTH`YI`*C%^*$o7Un z#g^sW{}NZdLw(Uf@9H#X);8Eq`v|1C4r)w2X{%Ab&A(r#8y0DiR-fLxY z(6MQ%8pMWUr`MrEZZt=H+K6y3^GU05p+BO8Hjy{@Shm8-)k1a4L3x8cte9|r$2sDA zR)NN|h|QoIEmxued~?^Rc$y{ zu&pxm#&N*pP!022{s*318(C-B$G-rGpR}+s?`LvI{*TGwF94AN8kqc*95NN#KiS)8 zd^RHR);Wg{GxWk~chEww{ma}C~we{|(yZaqsn-3s4FjGual}`W$hY8=F=1h$1>ZEwj5+|K`%KZ?pF5 zZ_wie>rcRVUpVKAK7fT6Ai+2Qe<>BLLaloYK~*et)mu_mxI??cFYT}q*H`N%+7H$L zHaZt|FzZRCX+=y~fV45o=!k?$?vwRW4-H&CaNP>ca|E0EO*oK*8y z+l=&xvdKFRwyOpJYAKubt?foZ-}9Ju_vu6zXJtSWP!U(E$W0KlO1*qF3hk9h7hOFs zHZRN<`#LWMoJWIo93wePBxVr7ZxG5wYAE61#{rYJsN@Ugfrm{fE!_2Y%17q+1kw{y zH))+>&lyXp_{;O%r9NR>MO~@F<|c^)xJJjBkyQz!%uJavn-X5nF)9VaV^{1lbvbjk zyNDO(3YXuyR2C{$wHwaC_VdiRis(t}XkYt~lZbAcOeH_cMI(lu2BDvhR8qK|q3*U- zm_7*djbm>M!lLRHq?pP;v@(gonu&`wrv<4Y zP&bSgaDin)VNFK>!$}ob`=kUh{NA^xdurAbY6d4yqYqxoc1~ZwP=o`$&*3L09^sHzj0Wt8 z1*}8`h;YWHc$S>nTfOS9%AJ5OCt5!e2yL+Y2_*QfMAmJDWWXCJp)~}c4NCBK?y8{f z^+-yMHjRI=jc0Cx>v>7&c?bGmZ9v+*{=7GY;-n*yWA2$jg}X8?!rxmb>6k(I(}~Ex zgap^Kc!|JY^m+w#8UN)Ha+I>v*yL2b!!2;x(Cq7LE(9%>KUr-kF~EL3kCVEp@cTPj z_6v=-gZJe<;B$*6FPe+=HT$~*#T@{1P4;~eC85_yXf?OKJq7wllgN^|TfD(3a*+?T zH2seLyX=_&1>;s>2a^|ani7S6uI@8Qu!{Qg zU2ba1)%~cG_v)@|i^I43{V*Hke9-C(+x5u|+_NH0&F=#DUlArUro`O5E^|`uppBkZ z!;ingy>^;N;7de0qki~70zlK1Y}nHTjE4~QMp=Z5#rk5REQ~8do{22ylapkrPOrzMWjv-&r99-eOWThjQR=( zev>2k#Eh+6760TAlwcaAc+-a6+asAPF?y1|PTVhkPJ*%Q6*tM0)l|-!bd?f9K#KA{807ZS_`Yl)UIyd-$!cTVr(PB|wX$VSh(ik8jSgfl z?q8d-*<5n0pu_l;fk+q#&&`hQ29*x3Mz`-g<4g{IKW|d>9iD~aY5W<(_EUJris@Q0 z5aM)`-$#B6!iAO}?&A}#5B9%YMwxxSz`O|+V#BcoEry59v45og6OGaO0- zjnH%GbE#)c?hAVQ^vtOk2ZC8=q-Nvh^?h!tz%eNwfW3SJ?br0QOjS-q9h&7thFTyW4Oj_z zH*Qa5SVK83$zr$p$Nsq|NR>QC)`lFVuIU7FZ#2^*RQeqi9q#BHIz8>cWL=W6 zF=V}i4of>sy^E1{mY>v)UZ=D8=Jc&pPO8WW92!p&EX2NGV#43lG%p&x0`%pWW&VWB zi&9y_xzq?!45+MQ%3}qsIesHnVIRIKQ>&nP#f?uS|ohecoY`l`$C2T{iRbr2RB+-yeLInUNlPl@d!eSM*DKjdKR89Zag{oq29O z5?Jfpl?)AVUb%tK>FNz_ry_|a-VUxM1;vcK1Netx1LcsxC#I9^t(tjWRf)g_6OMQ*|QV;7Cvb;@H3&ixVtHUsH-Fq-; z77C!WUg?vHGr!Sx{WESki+<^p(auK~;F8@%XXp(#Yx%|J3 zsUf9&9M||Mf$0s#=%N~3qDuXHo*zT$u9Ws?x=C>F?Gc4`)WtG+JOqJoM75lx{(m@o z$0otrC|R^iUAAr8wr$(C-DP#zwr$(CZQH&zI59Kti8(QMe!$*eo{YuJTr8^vT)3l6 z{H(?%Q7P=2Q<4#BtmgM%7Tu`FC>8~(dXmoia_#wE=2C7ZXAAs}WkyUfaqLPN@No8R zEQO(j+i@g&Q!Sc7vaSn$e4XjysHddYq*n>n%0*wr;fc=M+EAo+E{7ALO4}hIOEkaZ zGxLx%w-pFIRp3Ojp@{Tl*@{$0O_~Vdn94N0PVACR(dlxw6Rqx4!&{jpum3S@P zzetgozl3p*s#S2%zN`4dCN`4;MVhQ--l5Pah^pokdWfek80;otNFRrDP};5-4~#jh zUnfK(V%yeispdpg5p4+27+*FU&oWd0tnK1jSEdx3e&0<`lk#r#1SHmDdqK2fqz1K2 z@k7(xvgQP`^7o@?9gUDd>{7l^WIx_v$Sd5ivS^cg5;#Em*i$pWYVRNevzZ~q+`p?e znYlwc2V6GKcmq}DPvVw+B3g)eA5KOSi8OK!eT_h|Oy^M3hn!Hgea-nqzIl&TgK+~@ ze`5fZ4fcN!ZS=~v(D>9k-On4Mx)`t`oa}0sslIk5b#V_gl6XlA+X3nxgSm+ho|IdA zfC6z4f{na`8XF5WvsWK7uKFN~c#`8>a)@#R+UBwry|#T)f90@5cLMSbElpvb;9jN- z|FR9%vbmk!pT!W;_+Wflpb9>^RfCSodX6Z+{!}EWC>3kEb3{WEA%xLKu6E;p!xo7< z4>`S--$IMpm7juj;O=!ZV)A~l63?iG@c!R!IDO>Dz& za7)o8+P+`8{ z(Im%#6ZbuDzx@cIcZOKcF#Haw4;^9^g#7Vv^~Z(TfNZ&DEfM2XbBsdO{F zxh^WW`L$)&-^|j)yI#=hpVjAyZyP0h8TjKSwZV%WF!vu(KJm;iq70tFkFTmhOEMUm z0ienkJQ9`tw)TS}5AV&jX`H@t_>&+1 z;JqJYe~^{^aNg5@EVY^cr!|JSjrqT@-pxJ!y``#D)l@}PMf#Ef8wiv)=vc-iFhE#v ztG50n42FT3hk$`x$sr}9r^kS3N<#7E)4jc(`~{%MF{Ix1$#>kt%-rg&ml0{H5x~$v< zS5T2D$#xI}7zj+wM#hqh{(?z8zXx2PkwJ@w1I`f8 zATy995M2OqW6E(}0eVwiDq=7+5PD^#X0F>9saM-eC=Ps27_`9 zg5gUexb#}$Ka~hgyTrj;hwfq2W!(FBnt>Vh(yK>^j0O0~V^Eu8g(7pGsSj%3W^V>b zyG}s ziAmaBUv0cVhkPckmi*-?zH)u*s2$B(k2xfHoYe$PQuH5v-9QItT`*BQray)VQTxFC zZ$XjDqOtEwsUI@J%;4(NDol~NK$)r0e=VS3>jTC^i3PQrilkdE?$llR&I zkz*bt^*#Dmv|A9~>}Letiz&*-AO|Irv%7kd9{QY(?xlg+f!<6jjnvWDq)_Ho`2UO z!WjEEcSJ*{h*8$ib7^6uujsKv|HDCIEOVk22U5$iK@jsL7}r-tX}eo8|a;@mK8eSM_TBYes?rjGbrfx zM@%6PSv#v8!<5TdRbRYoj<|uXh4E11PY8zpW5v`8kAlZ8h@VB+`5zF+vp|}4xr_bEJwU zlnwCSK;%Evx&G}5_K=O5i`N+QT(R~{^DwPsluF@bSCxftv%HV4f7(mSb~-9hnQWX* zpbXm-WR}8a7o~|wS~o;up{JYGlvmwsFHRQ$)aM{!EcAd*V*OjtXo4V z)7c1BuXf#UyTTN4$&&{2g4?(KKq=0`j-ipEz3F_SjYi0{6P!P~>>ex=7Mfjt;#XeM zTyzrHoJaijOqK78-Ix=i2r82kvIc_F8R1TZjl+8E4%LQZS$=!dRM8AmYfZnWApo_9 zV$&X4tTirh%kBgy3#W|{>PY0<1w#kC3IJuWfp{20I%XV)dn+W*C6ACrwk-Y?3@Rbk zkt{Bd!-bTsupqMU+xuPezJ`d^#Sro{lwrR_4!#;b;l4owazy*lTlmlHx;i<{Si%ns z$(Bs+s6~TY4H9|NmK>y$Uko?ow|9nLpP_UDiq8|GY04F3ML+pdz__UVybdBXj#L$nGk9(I-=;;TOTe|tpjKX<49)?mu% zJDDjM+ga%w{wMNQqw2dSmNL4}^wq`G5B<}8M1YmGX=dDHo=CuQ&Bg;?+CyD>KCOaU znvY{MlSq(-aeT_k93D>Mwu;Pu29O%Bk)T94mL#Yt6cq^>!24tH_?Glz)VBvT_mryJq{4}1B$u1{Cy#+!s4%s)wXAQ zQWN@zrL$o3GNYRzH76w;pPYyoKL}Frpt)mSf1Bd8DWeMLC}PnpeeU6Ky~Z%h?FlO* zM!&!OB+iUTLx)L0BTl{Eihw3VAcfL+iG0nkMks1WOUd+BpsFz(1oX03v1a=}m}1x? zv9Vujy6js{jR~xgq8i0`f6LJUH+<{$;uE7*5|@r&iBu!h_$*Ke2=aCKfiTbwa7{VQ zS2VWd>WvoWF0$yk)Ad`}lc=Uo-CJ1>66)1^8$%faozDI3%ckJI-7@{pYg2g2h;fs3 z=|NG4X9q1ilzJHk&?pxFraJl)kkMVdy~H6uCh*RKQρGXOK9#C-=dZ1)EMk=N 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 StU*6~b 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�e{G4i1RW6O~#c{ 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

4I1ymM#LF+*6MtECKy+hDB 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

fbe0Z-BL98d@btSrt!IzO@;3O&XiV92= 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

&j6H^Dx1tC-8Pjt#XQ=I1R5p?tdUn$5Z0vVfc9( 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 diff --git a/platform-sdk/swirlds-common/src/test/resources/platform/version/bad.git.properties b/platform-sdk/swirlds-common/src/test/resources/platform/version/bad.git.properties deleted file mode 100644 index 3277e80b4ba5..000000000000 --- a/platform-sdk/swirlds-common/src/test/resources/platform/version/bad.git.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Generated by Git-Commit-Id-Plugin -git.commit.id.abbrev=380ec788 -git.commit.id.full=380ec7887491c0bf2d2089e968bdbef9fa8e8292 diff --git a/platform-sdk/swirlds-common/src/test/resources/platform/version/example-version-descriptor.jar b/platform-sdk/swirlds-common/src/test/resources/platform/version/example-version-descriptor.jar deleted file mode 100644 index c6bf58b1b650e0d3f8fd5c5c253e1a3b97d22393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534741 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ρGXOK9#C-=dZ1)EMk=N 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 StU*6~b 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�e{G4i1RW6O~#c{ zB20c4Xk`{y%Tob6I@Bd835gTrL=ZS`k+Wt;TILv zcv9u5iA=OcgL<5nPxpAGt zpoW>{sR|oJz_4mqJ*5k*^9wJM)h&M1Gk(;|OG=9Z@%rI05vUgCmo(?8mG$#N&*)Si z;z6s*n{s7jH-^QXMKiAAvp@;1gjv?5dnLIoN?_ct@zge{u?GXcbh}u(5hZP`Ooz0P z9HvYpgVk?~D~2{!<3SV5``+5Gy&+ukXUq1hQz=DO*yKI@P3nBnVY z=`o*fF%^c`{s~i)=?n8g0S1GE3W*?3z0J~v|pc29^AsVaeaG|&C-5OEURc%)yX zZP_^rgSd(tl`^vnT>ilM*?XSzBuB(JCe-rOp^N9yt3wHnUS_%nz;havh{@xFo)-Gj zRM7!Fxw*jb0f!9yD%AXxx-sk}qwyt}6oHZD)xO+;ZxT-p zGZ~GeL#R=6`YBH97%F!5j-8757k-2y>00HVCg+#%5RPDZ3n=MsGZH*JxN|ExHctjn zjAwtDVGb9r01r3wXW5N^M{hPFOX3Zt8(j{2nC#}`61SMB5tzvV1wEw-pQcCkIe|KH zt%BTYQ+#sPkqen-9Jl_*@_d2hCfSEQop46-14*!*4IjFzzw>3zON8icFyQa8q3)yk zEa;PWEzhwFTx=q;xYA}E8)t$gd4LEr=2#W)(sRyv1pN=ld{hVEKGD-VRdR+!Dsw@_ z2a$i&-o!AMABG!63Z{bN4p5N!C=Zl5rs}#Cly4MaMKx%PLG>-}H(-_ok3)R0Y9%;` z4`}pESDSEC2KW$An~%F5oTc0HK>yt`@zEYIzf{55_R9%c#L|U5d1C4Bwn;H>DGqRQ zO<+))-WA*lY@fC3V9{{eQm7?MZJ9+&l@e89S=oCTX*9oH8QlY>$_fxDP<=AF=`+N7 z5u06=9~n261FT3XjV(e+DjEthB+0mnHp>-h#~j=VO(v4@R&bH7I(b%vf5|glY*y)K zj3hg>+s#RjG{4y)X?pwnYeQh^;7L->-QklGUP`>|4dkau|8VuRy;DltqrBP9c<7YWcqXHQmHCn^*D{I$;Wh3g!PE>uK~0%RB=$AKNzQH5znb)x=<%x^pRT@Sjmch4RvldP)s-#YwGkqwc_;Q?k+~twE;lJtm*z z{!R(S8{Pk1wlbMH+J6%b#rJ|5t#!C$(X5`QQ zy7oGXuU({pRVnV80+G3dT99FS(;ymOc0!(RZkax%t@0aOD`UZn-bvY@(;o7qG3>xO(E-WQqCUHlNcD z8Megj5b@ZOSm^)!VSZV3M;+1xhW7Y{IMq>y<$dWc|Xmy}W%UlJY~qQe(hL@P7ggMNqHPj<(X60?U+Ckg z+XQ6xfG^H=SP^|5s>6%oTt}2`#B>7cA^nyb?UhSTbmUt`G{<3Pvn5!)wV^DqD)98PNvTa7M*%5FDmmb`+az*5U2RL*~}*r&rS zN%Q7E99+?N`;hwrY5I`WR4)%a=%YG1g}xp|4}R`v2Y3Df^Tol(sdWsjL6@WC5p+oU zx#9~Kx3-aDEQ`On@c4z?%`Z(|t6-FqU*V6&eXI4WCQS`vcbPs=J9om~6QiHD_L2m< zhKqx9L#H9!f}1a8Y}DxPUamgIw!$Lfj%dT9IP6(yWRopHB)}X$DR{fo%)v^^V zXnDt6dR+s=FY_#Vok3G+cbs>#zLa2_bSJ-*YztI2B$1k#4@W$NquFmu%E;LLgc5rP zYfsJjKgb>)J0}+i&Ym&kkTk!jKV$t1j{lo(KlG)^4D(Gpiuqo&|8w5-e;cI;+WZ%w z%jACv^fB_%->@S@Uph&!Vty%22aumzix2`d70`$jMNw*7MCA2CR3oX#r8ez|7zX`6 zI8crDiGFaK-I*OvWtC>c&9u6MsB=Kg8lBn?syUFl3=0=Fg5U!^jiB{-Pl~0e*J z8(Ca4Mzc0EJ~QO9%-3C@K7KJ|?}Olthb=bmDvR#qi?5QKN#Pb=#_aWS4F%L)wK2m& zb#`*bGC28-$gzHc{%1Cdu3XfR0t*5%O#lMI{QqND{|oNr{GZ8awI-AY>Jr{p_Y_^D zCV(X5O^>9{3`J8wL4pI?a(0&VH%?#x8+>Pyi9sWZJGn%jRkKIla-&+lRdut`5*2_t zPazK4s$0vJwz|4m%iG$zIZgfRX3E6ft+A8l{ZsCs(^rX8yE?I#@=GxHj;!+ z*-+v4AwS0RqKRkNub4-Ij4+HqS4DvXV5`IOPVX|ZXLWF^0x0`Y44vDw5Tq2S@@0k% zlAk44O)cj73Osbq^7Ffm%sr{B^Pz?vj`i8ITN48gyp>Q#MYJ*GR=xVUd zZoh|(gMQXVM{tB1iohR@QdMgu!_F|Qq~#jffu#iJ3k{pd7&=hqFUWy zauHIH-Qua(ALa8HQOhfu>J`3B=)8g%|?p zxgGe>@Y2Urd1CgGFDqCFVYA#07`2DbID!S4T#y3WS?Uf{&7fqUoUx>;;bakRb;^&R z)ToW|cbuE=FZb?x1%`!uVud28#}#sDr=2b6l-%m0xqSY>qUrb@XZ)qcBK!5%LtEfX zW#G!{cSUP+0{IJvweW8Vdn+Bt29eP+|0u zhTz|FSyqoGbB!jZ)^N+B(N=1t#95L9+^PZr{=m>t9IYxjD}ksWgyu^i>piy8>DxIhHEaC!qy6l#vCo2PVdMNqO|TOI}^5Q zVl5hGC9SYkTo(U_bTkakwEw$1N?Vn9bDIKkHlp3_cSoJ%KqwR2!`1y~Re53)HB@Z> znN31{3RtZCyk+>(-<6c&emNB>1r(9KH0;ymX|ZzM8RQQ2P0gR5Hv^X-Opi z3ddrou}V(9`|Ag8&BQR}@0~d6bI7lkV5i9WuofUO{>XShQ(c%BnQume-emBlgEOl6E-dxu+i@4&YM`%e?Ztcu5-}L3F@0r+rHl>wbLruH|0n%_gZx zd=irW8!9&}RxCVK1-Yzw*w1&F<{%(O4_~tNLk479`uq-lNaAnenYiY5EXUZPAJ4cw zR-9@2`g*O-(J&GqG$Ye-s~Phv=G2OaZRs}g_uf9vMfQk7NkzV3$Lo~tO2<$<_P-@=HLzY~&jqgT?fgX+0p=cM? z0r^Wgr9MG@*S%(&PEYO_$8;#Q+%iRGSW`>7k;@PzytpZ6&`$agWFEd+LFMUo|4y}N>0FKCD}-D_9wV%Lsn{lM zWTRZHO73>B5CD0*P3FvoDQ#CoxjbDf zp7HNMBo+_&t1d%BnUQz_j#YbYJ`-3Bs4w%5(+rGwH9d{>G3(MIs#QO@XKg@6{}I%g z?p>YL9|+<`kv*1JX*9?B8XQz3sS~CpixuLC`5)1q>A`4{la$ODI0DaysK&G{k~?L; zf`l{&6tq$pkP5l)`rzL-9-boY2{T})m5h*(3yI1uzIUZ@GueqS(&a0cO*ZwPBlX+O zGUc2__;k`b)26c4WF*8s-f_a309jIJbI3;pGsi)Na(hekm?@^_`GByg4a3)BJU4)* zdtw#QPl?S0ivE6#!AgA90qbj^cj9HIxQQ*ZHYVW?;k|KjX!x%6j)|{`7vtf+HG+u` zF+S-BZaecGfBTaaoSk5;E<)zk*sDHc~ zi@~q=zfKH&^4r7RQh($Jb8JBQ&+%0~HTr6d_-nm?c5CRm9@-_V-mOiZ>s9T5liN1) z3*B?v{rXr|*a5Yg%Fz&nyIvbKBQ2Tb$QjlO85NQ>2~~9|)|c(56(nCXgV8*}t^(FV zEm)re*za%zCfndL(jBciZqcVqt&e28WDo4m%7YG=b;f#scalyf+`?nZ@)zQ5Bnr!P zLT1$Tm2gJTq6|t&l%6WKWh1;k7e4eC36Torp)M82t0C`e1!1Ym(;D@SDNDp7O~)uboAkXNv#j&yd!VAn+#J6Ef*+z#~D17K|sotCLm!T1x&#*o0r7Y-^~|H0fU76#uP z@qKj?6mu%!%i;?eF_cKN2ZhDeEj@ z08G}V4B(BcmZTM(5GcIK&&@ahN}T0O44!sf%ALg5HgOz`?zMb1(t26dlhjWooan8* z;ifpsJe_Qg%^2cGkneNe?{S$Quq7RO3UZ8ctwa@VexMlQ_><~S9;$Dm)#!rBL7~Vy z=cagTX}3q9n%*#DSJ29B1ua3G_O@o^#obA?50Bly!Oe?@vELjg{?X-!NpW=^K5Imu zj+0VTqH0)9iXB%{sv$p&=Io{E)q5YEGP=fb-`^WYMNd8Uy|=|3{hj{>n>a#fcFh3a z?i9)}yb*R4B9k;v^adHaLZDbmIK18*AIUg-vJO2+BZszy`tRx%N9suzFJ+83FZchz zvm%^oyNWeHo1g=YF{8{WUH|lhW|oF%t;&~$O6G4*7^xzYEL6y&S*V`#(>OUgo`RtX zjofsG#HwaMo3&mVyD$-yB>qdM4WddM(FvsulKDiF{Jc52Jx2leb|vt1<@a>e7u5TE zYd5*CVT(1pw?jLfl>GO)Y0fG9e9-jccjeiNX{MieV98eF&oA`sbHDDq}?Z+HXc`!{REL$?-J>Hlaze z2F1tp#`>|fki*O5LmMZjW9jLN#74`pHCQh*B!2|Vtf^@OXU6m1|EzK(eTbP}zU#&t zu>TX;`G2YH{|~b?pK8P+i&P@l9&|OERfmiV#J18f?~-=+VXE?TzKYC~0w8!PaD~j#}Nd2lt zET68iIt&I-NFk`u8M3O`0srgLiGm(Ja0)$cMdAGD7<6X?Y+n3jE} z>8D(j$w8&JlHQZi#+`%7oQSI2N#p|Cc@B95q0`N5Of=OH+)gdKRbK6L#~iPVH=|mN z^<@*?KcjWc@QLIjF{ukJ0o(;%<*RClldfJ)T>VR9Q(HYhx!2Br%~&j+(5~f?eo$Y%+4e? z&DXz0$<*w0;ho?5v-hn(|Cw$1|I;5)M>`uyr+-!mCMQVQAu%8a&tx47C_bSmD&hur z`xRDkj)%zn$m?EIRnRCrFRmCHgsDDOn39J4P{Su6s5^x_jTO|EBLYXF8y_~SzIow( zth4j|=mfZh%`j0%=T*z*j+2!W1-`hHfBHsk4j>F7 z@;-dmH$=FJD!0tuf;MGWjnXYD_;KOhtD|HytH~Z91Xu24v&7GSvZqUZzpiSRK69)! zgU-68UB&*CEn^)(H~?P0CH}aHn3xtP_0r77;IXORX6HJr=wdSE+Q8N!!xpYy#1XXd za?<*VX6~4a3NH6jr2hK)0-*6)u2=<~d_$-*oz>L)>BULwXwraaAW{>wi@)O`wE&SZ~G^tlKjd#ay?=pC{K=5~Pky$^h4j=r~v zy3;IZMQLT&?qBbcY6j0SrSB;hbKe*q>;EES@(=cw?^;ns6Q}Psz`qkxS;||oSYqfr zkubU$0Cc49iSpnStjN&*3C!$C(OrIhe2X2etr8cs!vsf;ki zRSLA#{@UNXf~xdj(1D(pBGwi0@czkqIi5_v`}~}tvjf-^8w!Mlhzz#m(DpRVN{O*F zc-5&^?QeRun4=DL0nlhL#z}Xn&>TayidNi$g0Kydb(TQiRAOpRS&5D+CjFCf7xc|u zaR33)f~02CG5j_Tt-IZFV<<+`W_IY_l;MAOzB**dSbbs4KZX8cqq1|{t_#Yy0@HFf z59iug`dtx@C*&6?x-P6qxoqhYZQxf?Ew&`=%$JAx9gxqI%!~4tVJhTd8=@bN`;a9( zFMHs2@{ZFFUjXP@Od(_Hc2C<25o5}kED3X`$XSMrcN8ic@evW@F-S+)WJxq8A8E_CC7VWM_i z&yeIQafM&Wkk~O*N9}%M)NIzUwtJ!&C0iCm#4LrkKR9ka~ zn1ZMK(fk76=M8twPg5C&|I*m|AspytPBUt5S z!W|z!y;lI&V(es0gYJp)ivqwHU>r8yjANiM(j1P8(!lt`h-yMTp?;LuZTbxAk)27e zec&U67l+fvZM7St8cWXV+h2~X6#d)aZjl~Nin;y;_bm@jgEFoZby9JeyUE?Cq@%+y zC9-q58FcAfj@t2fsp=p?!!9#n8U@;#$vF*pj{?p%g0nN&g~Q&JQ~VI=b7epI z!jS}=`1e=VAH%-)8?^5di|;#%<3CzPR<54_J6;-{>t#GIa++z8~lA!HEBY8 z)7!Uw`6fzS8#@jp#P!0b_=OPw901ORhyVg>^b<_UH3!RV`6&(KI$W*EBCT*F<)7esMfa8op_ya?Yw?X zPcq$Lf2VkxD;E8v>~)=58yMR;;31lYsn%|wLn#aD!j5h#D_3M>=x0&uH9PHzHuz&8 zfN=Y2qd#Rn$8-4>Roe^)L@PK*N7GTjK@6RMHB6M25Bnpzfr`Vupb@mWZ)sutWvMX# zxVf%v&_DxMHO2E!Mu2x#dDVu36kOb=d~=Tds?XrLm-VnZtIk#I<~7bE4_;+740J%wSf?JKesoo z$jz;mLnlT6Z?ZrnAsyDQ?A^o$Zwg{t0jq9G5doaS%D> z_;t!bO1h^l8Aup8*qCc+_-7zXM}W$-Y6;6Bl9c6v`R!Z zl76X|8R?`zk^Z~L{&;k`TD{d#AUFEFAsp)=(sEhP>+Bw&Swf3pVZw%%*#UtT_3$mw z#vr?-%c-p=aZof#Mk2KWjY-~Q7ZE9S-#Y-2hrp7>&1r9W+(ec6+^*pgrnG~Vs+nC_ zAo!QWO@Fn$Ua(^5Zz15mjfp}sz@Ns^?YM{9RS zTNf#9&^pbOsv0#sEQUJ2%Trx7{p=w}K$!^;yP2=3DXWY|L0Vh?ASH@Z zy;k7XoGTDaK)*Y+dM6GHm$sDC>O@<>p-ePPx7&XJvM3uWM5GwZo_(*m37 z@|{G7GSV_e>-gZ?9Y8rtdfhXitj=+)GdbB*RhOgB)p*DdRSMMb3Jhm@@p@2&%yXUp zg?YFG=E-a|nDK@{kgAVX7!zPO~~Tw(LCR@4;+MlCJCId$cd2GWOp zP$af;G!OsN0QXz9N2i8xILd=DJqA08tM`zH2bc;=s}zr0g7w5Hud;EYqEGxc8Z9ZC zcI8}uxCIKZMG-e@_{z$g>vKrZ$}qH+10v9CdIz%Wd_9Zi2WYM5LnraU_Tr2v8o1CD zH?Xp>F%t~uBwl5H=353Nyb&^YRm}3;`FiC#Xv10x>1k!s7Yd}D;jPAI{!$id^)KB@ zo2@n5Qt4}^C{G{(AiCx~r*YP6gJ0Kf<)lsSq59HZ&bn?^6)1I@2@vSdbbXEfiED(u zjaidL*B*4dHIMHBx#iZg!twg#AikxgEjW70#JKR!OG>KvZ%Yi?X3-3xfT<^6>+_U=w*Qt zkCshYiW=M7nLR9B%If2INFVnVhMlMoA(&`sKJ-8f4~0`hKTa8Dt@eMwnu5|=n1@zN zHK=*f<_DgOYp|MZ8Io)dkm3#;0LD%mMG7%I*xn_v;9`?FZ|lb^xrlx=GppoUS*k5D zDabqPdLivF-r69^?T)qHSWZjK&gZSI9>Te5QE5{6Bz(_e$>X`8IMUep9@W$XvFobs zH9YuqOI@H@$c4NwY%y(A(H{5JhvF=~FX zEl~-E`^F#_yA1XG{vr+~{nVfRLU5t(TCW;%Ew-CWOBz!y2P7X@ZjG$L8m|Bc0Y_6H0oEU` zxa)q^2ENvZH9#WKv(7Gu8juwm6hrebQ5i{NP#vUsU-gqu7etHZU|(``Zf8$){(Qsh2h}Sl`GDNsF6;D zl5UenS$_FUK?UJV=gU`(6hn90A_%Y^Iz)Moqg0}emjcmcl>cc91A@jd|BiZ$SMuXK2oL9#l#!LbwTEJ{4c_IC0QwgrPS)F#yik&If%WY zN}P*D1`^soA}jSLxP6^QI;+A>+D_wSl>}cMnJisi&eHe7_Nyk6tb#%q2)ew~T8#{d zH_zMx+?ime!(-qh?1; zA|+|HmUyPp_e&iGYP8M99~^;H5NzPwz_iX2$8-Fz+ZlJPnJFyU(j6NdXZoSK>2j{B}^{CCDkP zn4?vK|4Nz!=QEO+BgkPrvRxa_#Dm&cYhvd}D8E%I8$RRANuI%QjHTEx5#x>^D<+>4 zMscrSJaW$wDw>yvh-C2@^4k$oR$~LB@hw~=EwD6*^~z5B9R;<{2;eCrve&K3rC(2+ z`X=*|PdVm+bWw(w<(BcsqD0X3xg5#jtWmCYDtBYRWZ z{YJa&6l?=17#C;hm3AhJEIh~3dx9-FwXns>8TdB)uR?y?FaN%thEXl-`-IHRrQN)Q ztG;8Jy%jT84d7hMO}BCZ@`x6@4ddoDRj ze4z{E@o~@tOesFyx|%1(Z?Yj`Jx`>}1$yo(SbhmW9|v=ko{ca*I2(x5ikRa3txxElmUQqcLVnN&Gmh+tX-J84nmP|8Oobd+4hF`I`bapGusuJW?6jhw#H{Nl4?Ryo!Og-AZYOMHnM_EGZwHcJit!YioBon zZjvCR7-q1&$NEl*J%ZR?0-WwS9ApD%Iya=2BS8Kwyqi;sQ>>8=K*Q00mTd27k2}yU zUOQ4W>K^T-oXumTI%!j>ChXf})S9Wp=<8zZ_|27C2g)lKEcYROD|TKe0zTUW_s`ah zvp6CzVNhR$Xn@5M&-?dcuB-d@9LEK5Hg*=IJSX~AWF>sLcD~8Ml$4o5_XcOJGxLo* zg+Z#hm2^|to|A4|U>smrv{Xm#P;I zbWEwEBJZ-ld>Kf)pD^#CIz9>STGcB}Ainyvu?-!U<%c6Ms~Msi%!V5FFjF1XGA$^D z(s?kDa(zIFf1^XvYkDupZZc?YA=N*OA#jYljjXzjvAw)kC7l31SRpT|^?=V`*(0Ae zk6N%9Fl_)n0AYQ+^Ke(>NVU~ij_6kw4;f}V_f);f-NrUmW%Eh2fSiM2wP#&4_6J-` zR6oNC%!`Z$>^IkSqG=q}LJ+Tz2f4fE{H^Fon@BNa^U2*Xy zN<%xxLxP`rO%dPbA_qaD^_2ANbja~27*T_WB+;{%~x(q<6@P(#3HkCi|Nx^^HY zgG(~mAD5Ga*DY!YX_JzAGcX%rq<(nahq!dpH?Bjj+l*H6lwSvS0riWj7&j<6n&)SO zAacPr!l?P-?Vk?g1B)2G3AP!1;wB!DnX`cu$Iy84T?603Sfy-s>$Z3G3tgOi_PcBM z{VgP~k{F}jreS_>eLrZqORl)GtkJy+J352&xZqi?*p z)nL{f>)Fy>UkrV8xyx&0@(A=~E<}djo9AuYrmkO81=^@35uem3O~$r1rG?H#z#6p> z9aC~*-g1k{%|goNWAcpvHoH8NRQE%*0+iUZ`Ao6&oRsg(|Mm$zxeX11#2v6N-!0Lc z96_RF&n^x)fIz{PQxxFcw9CJiah_zV^>j}lv@Q8s>t2=8QY?NUhU0j_e}p)vjG3JN z#pF5(L|%pN>65I5p^89r3C|VW?qrp6$@ziBf{UkWld~Gr3b(r|;57o%?b!}C^RPQI zVqY(tQDIaO+`iCqjE3^Fk9M-`0_g&(876bTW5@K*)?ho(vk{!`b;eyw5{73Zwe0{7 zv(wUbp|TB6ZJJ{v}=4+$3A0w{wIk={yJ2bS|sBAIy-hz&e+r>(`yzSF}pu21pxx{=($;>g_ z43k{R`UcQPwk58Tv|GyM`GRGP=MVPso8wkQ9UEs; zQQ|QL&`+HB2DCT6q<8X8U&^~_S;UVXC6El#XEmjriW1J@gB7@gLf0nT&Y>S$RO-i3 zlM+$XeAF7zo+KH82gQ%#*8&VWr^x}9Zu5~AV|4W;ubT^AYbaoa;^}7q6l=i@OB@ik zkS5$jqZE2EMj#qV!_?ZMRPr`NRlC5t{S)E4ZcyG(2{TE|$RdnU>*z6mf+VCQ9nz5v zs*#O?qXc<2sD?(!c`#)Z11e0Q`x#*snzf9%o5z7S$xn7s)1zz@MI%ddNu&oL$_6Rg ze)t-{B~12CI1=a@ta~aIH-xl{*B>F;P*h1DiEO^4uJax<>TEpD1>MDXcLv1&qy}T# zclGce)2M}68LesU7va*RD_NZ|OwlCoN!gj*mev3Dp3-G)0{3Af6+38iA!xiK>||NU z5zQAJmgPQcuv_>_r}18sAopRRNuX8JKB}sh$wBZAg=~vE()=W{W)scpRwG?|VC51+ z_m(Sd%wYE%MWm8lS-zRSNjL+9e#R8xNLT&))iI)z$ML$VEsB)x)lnJx?kI`s?fyu4 zbxOG-J;kswSn=5D!hCPyEdIC7tpiwxnX0E($jky!GVeiY1Sqez)Rpu=)%|{K{nUBn z_&mRdUbs|IJZBGLlOsyX_*2T1`F=!^16C><^s7I=4`zi^DPkJ z47!roQTKKz!?wO+;kYxJizn zZJu@`lThmt0LvPoodffDy67e>kTJd1i2V%O9N>=Roun2{ue)rlnR8ytpd!6stK}wp^iVA^GZ(iS4k^!@zK2Ea`p@t}J4$Ah~fV z$VC#6<1C5k10mN>!SN5~kKp~!J zn;H$_E+!9YTjxs*7Tn|)!X%S(V8-4uB0c_6n?*y{HXB*VDjb$m0v4#sr!zKO^pn@o zam_Y&Fy+v)P?vrsf;LY+5VKS)SR!p56AjPWhi6!&kLTGlp2}Jm z;QJ=QiZ@GFfrISjTVnT>np!+EgG6y}r+80^$s?x*PX)rb!bRLcm}_IDuO^~PHS#2S zL!>XD*Ks_pTDadd)&pIczI+>C5R%=*U};)-1Gvp^tGFp6Na&r2cqx2VNjd}K?`V&k z>Ht!@q~p^D08C<^&sD?LMd#|#o z>0?D5e%^10k+42f zp=%4Km?5#r$XR98`z%XPN`+RP-k2cASq`pHRaIG(Z;g(6#ASR=#DV>4chRL(YW5?KFX#r#Wb1HVli_=&y-bs z(-{bwN`=sToU8s>HINc60?Ug3$HLvwMRAo%KW#GcD}@MqvW;)4;i7^DnwRSF6f zPI<#9+PwxYJ2{+5-i%`ixkj7go-4v&tMpV#mw^K&)DT3*OYEe>W7{ypWWsMm)n|$N zEfq)p?#e%&JElXBGp(Zd8!AD7Y7A`D{pKs9#6si}=z`(ZEr~MC#C0DPtQTxVOKAs+aG6fX*1j;l8|PD<`Do2s5%p8&?a>SI{nE zCn({->Kw(I8(l@hvysd>o-u>8OB0SXv?I`j=Yebk)t@L74Qz{%c*dd%^k3A)LD7~l ztasm{%E&a`%q}L8wR4b6n6z@gH+Z&%XOHy&hFK+9H5QXrBd(~gxIcgXTcf5ObTo6q zH+oR}z5X-9>HkF${#kO*^9cKv`%3 ztg;lCy!a*^40)QW&eV7pa+;1tQr2Z+QUU}s(6|~`oCS*rhzN)Y2%H|U%D_Y)s1AMA zpBM=U?8m?2xL>zblLg;m{ndv`{=JOsZ0MZaEF7(ko#?*zHg>jjPXErL*JHAEs)_l+Y&*IUrRRq&Xde|ld|uV8`%T38XNAD; zh5RBfRq%=_x+9?i-hQRpFli-wNL+T?(4`mJWWD+zN ze}i&aNmI!Y#|AlydO&X>R~1AZi;P2J`nv$Odato2R#gkGCpYK=J@&_UK1KaOTKNzg z2a=DvtXlRIgsOz7*gm#}%2zu`aQ4#iy)YPN1re9IpEIs38qTdNv)%yzsvj}oJM5X? zVjp}jhW{wOh^vXMv(Pue<6neOiZ0gwIEG}|zm5Sp6OB)S%7#0Tu(c>yJzO;aUapoD zPGU`vdHAy zBE7-ufi~-#H(*{MsIu>Q-VS*X3mCfBzlmCv(+y$tJ>>oLyR6}V!V3S^kpG{k-!%>P zcD7Fc5IIZfMs7hKnaA#8xyqT5j1hxRnSYJH42ghLsGqTfKqF1#1aTj1A(|}3xyqsg zFoJ3L8s_pN(`17#RzM{Qc@kw} zkfqgwSKB{F966=2W%43AKUJ4q6j}=nu`NJ7>Qt(EYR;jt=tO^&;|EeP&Qp@wClf5! zVP`N&A3`+=71)`l7~q*dJQCbI2Tkq&ilRW_kWLKI^DE!FNJ#58cyRwf;fU**)v1G? zq0%8g?Y3G6D~dz{7U<=xFoazho0M5#{h$dMd$&K4%}eH&CcraA5+}`#7}27%HIh(A z9KA)yJ%%bs7d-H_7e_J6c}K5FXWhAS+1Rwfw27qT@|{ybchD?8c80DnX)WG`1ru+c zJ2JF0hrW8LkwHvdoC4ao^`za)e-Vs?oi!bSjP`sD?aCku-^jO!xW3;v&A-Mi;y?jZ$h-R+gYkyKNWGW^ z_tFF+XFxK{*H2tth0*#2InhiX5bp)XH&pcjJGes~=JCvVjuJg0Y#wHGf{KYOjpJ3W z16oFWr0a*0G}V4-upqOz|E={q)2gnsUuicP4E}{@9e@VgJ1WGc7=yKK&{RcEDVr0~ z&wz}PFwn71WMaoS>cIeEj-h=9MKL}OCV?+z#d}o_>bO#B2=3H2QQYv>Pn>@>(i-x&{ectV$G@d(oR-QBg^yK|P6JPm4$NV=+3-GFM z(bVyj=`_>Tap3#u{Rrl#WSTh)*H*M4IzTbsYLYH;(tPk+)nVB3whUBA(5={IquCm?nYEqC5aq;CV-vpt{$ zI*^UUsNdFAbJLlur|M60g_bEG7lvq6QL=W$L2DaH_JU(~d*;zm+90{3V83lh)r%!s z-SK++8ud%Uwn`n^+bEn*K>-HrK)2U}%UNpBE6^wvx{^XKyHIhY&vHFi`7xvSon(s zh!XU{7f`(O^L0r@`b#u^1?G>|e!SxNDqC$|0RjAx?attmTb&|1HF+C};vQf(8^GMJ|8ml!a!A2urh z2kzc0u-7`DiOWn~E;;#XA~(UjZeSr5_lpaTIIF9gO4>TCSu&lmr-)PXsMHZc1FSbU zmP#_%s#IuAUQZ4?Ro!UbSO??`l#WF4?gLC&p|3BiG?y()bk@Ho$NT?j+2|a3q~a-W zLCCMf5S4NBpzufC%8ODcE0#{&FcEUXz9u(U%IS(X22ozks@ayjI<_0OZ3iUOZ{?o} zYyCJ22oKB1+!kV%Lu2Qmx_7})7(C6Qt@K9`#S@}9#3g#jK)b~l+#*hSnsefNJ^P6* zjH~i%OaVXG0F%j&4Uu^g3nCx_L!y3CQ0drtu9NjfcrkdJm#GYT*VqY1Ml$AI_W+6R>?3z~&Dd7=)>O0m1-x zw1ng&a0fdEz&^e3t~?*O>vKxUy= zMgQ(3<{X6qTFF+#zVOK;L1#5Md@|rdVE%}ciXZLsK;+9%ryVOl=6vxWl<&LC^!rO6 z=yyUl&!9FraDa1?`zR1PH8$Si0X_C&tm6S{L{4MX@JSKFBtF_@C%3WdOkt@N@j5bf$VD`lQFRa5C9ewQbHaZ7$vNQ+GUw=D6eMC z(}QrFWzVv0>UDY@%nF+s9Vr(oeoySr=Aqzgs-UCT7ZE4mXogy}W{bBZr#C_#0LJ(v zZ7@m~UI*8(@fjYL%OlyBO>ST$S*$AXM2q$YMIDIt>^RKRSeS(X+JaFP+0Ij3C>syp zTx)++`6VLz1rBY;Pzejhc=a&LO4&^aCwtg84lvdf6(u9t)894|A*fu|rdwo?knbAS zD$qgcz#jukALDM_^h2^Ecj{HzftMc5Y*XNv<$z@V?(1~d^I}h^>9RIH4_u5}m+?kV zR$MN_KM6J#whRQGi!m?YagLs{=0D1Q7Tx1;&dhTkM1P86XEnE|b_AI zXuntFXqJ89CYg#ws0kcXr9!p0nb}^cN7t&$$##=~e~YGx*uppuOKf(kdYJ?-y}_s$ zP%VDNe78un)gQgt_HuK5B;!E~_}Rks#8dS!p^*LfwGpqEaAI&Xro7`D%&b`$O<>ew zeL^LZ;HT;+VnIA4ab3N6Pu5+0SDi}7ytR>T*ZMALJNzR^cCnfQ++9A~ZC5#elinIyds&(>Qn$h_sYmVx5#a6N->#25zLP^2g&`-D5>OjB+kGmM!&k72z%L4Pz1x;~R(D*NO+Ol`AH05%Mu zQYP5}n&A!m(DL*=OIUvKC$~M^jhg|W`shBP-)OgC)iX%1dPj2bzVMLl(qBZ@AEDen zfn=92p8gFYWKQ%m&&a6gIekvUpwx`4kukcx^Rgrp&R_E*1QS%vji3KEx@6UI84mp0 za>c%#r~e$?$p6D~{|fMA4ZceS|6#&O8?KA2$RRDGacLHS9LaIn_`%J@%nU(7aM+qg zR*WHaJWZEBy5{oc#$Kk(i;n!H}6FclOK73O-dUak{Zer>Nmj78q&ZHX2iJV>ut}SawW*n38tT5`n0nr8f;GR01slW!w z12~aop{$xpd9y=SyNl|f64|+p78u{C@6X>rE27(UCHV+m*}>q_NG3-Z!y6SsZL+=) zAi~WOv8j{Vd+vNyl2n|;^krt*2f6-056F|^5na-`7){~Zb5DqCsxG-ApA%cae7~xv zp;7d2itg%mwoM>vpw|Nkbm%Bp-d`z{pLXu#k&_#SJKvkRs#vHbf zhN?|UpE_2lA{ibJc+!Sf*tb)WV`STk8KwrDl0fdjSt7-4ve>X2IrdXg|AN+?*K=HB z#erglfVwrN&At4!2{R%)QhxFJ})MIIO`O4xjvk z#{9H}6CFLYW6w($z2haOJjE^;`H0HA(N0BLblt z^~G}jJ9ee%`4Rt|+g`VWFpXQHUy%ns`A8-OfznI<=gAv;zvR_!Gj| z(1qPgB684=B4x}uvaIK+kZd+?pCd^9BeTXsrGp_9R}Oc45jY<{m{|0ou^9Ro%X`?& z05>S}7-?d>cDEphB!NvnOS^FKE709R@9}+jM81}{W}|A*+x*>@w=9QrFrSbf3%fLj zH89(v%`n~JomRIthaI3hLZ8dKH*q&u?>}DR`}lUz=6v1QIoXY3F?KJPt?+wdNn#x` zapbD~BM;t%f8ff$lgwgPJZ}G6Bz<@ncmVfpRFx%|_nl(m!=;p&sK}s-^uU_OX)c|x!($~pRfTP zJ$s#hO{0a)g&yES<$p9mNnnk1qk zRdeK+?#$aTibMmc3F1o7kbf+E8WT`ETl-7V=|!40Sqdtq1M-@nA0Ni9xE>25+Ti}` zDmZvHoE8EBWb4%67Og762Ht`>Wozl_KB#D;XmEYGTEQ87Bh&}t2?cr=z~UWjboGIe zVs)Xay{>tH9;Hh@tNC7&#)BZ2LuG-MgwAyrIKWrDj~;iv-%NVL*%X6t?jqUJINrv?7Xrginb+oPw8+pl6sKHTq)&n50wx zv<;x!AOr6_L~?h`V)Zl3NHR0`!)!;|$2bt<{ zzWY?a4Rw`^N*4gx+LvsNS;fEy(Sq`6CNO5A@TI6`ohbxUq5_jBH?xSqTk;86N6H3!Gh2b zw-fz{J5Bdw#OrU@WA5(ZufR@dI)?CHEz|=~hrsvmGltny$PXMw>Vr%S)c&2RB>OV( zar4`xM85m5=>MZ>DVi7xFP1{O(4tlecyrvTNigjPV}X4` zH>oA?;X^}cM+alpEn-P)7K)jN!}_h28JB0g%7ytoUwTbMpeM0OM(}x#Yn5I{X%bag z=-OX+BK1<2oxmcVLY}K^@-yZY1q5)jVpz?+22%8^Swh$rH)X${vHsO7hXI&8_5MDg z#_vV#QoHNlen*MC1z3ML#IAh{FR2JouHmDKHb|tiXWG(o>H2V zn3h_7larMEOS^x%cX%{6Y6HI2RTQ*(_kBM9P`PCi8($1~%9$swkH6rX0Ny_>82}g^ zIiT7DVa&>%6iw}e&mnW``u~BB_Lw%?0x$%Rd>VjH1P6r@do$9t`;d* zU^V;?H8WbdI1*BQ&JicGUUaes`{Sutp0gjR!H0BaBt6P2^E)#~VjavZ>HYC(s-hKx z1W8_5V|`F5-z(qSiSlY<=V%DjHTH3MRKnhF8ay&%azFcTZ&8S?`1#+plce?R<;tD~ z+^A=DUWhefjGYe=Vl_THJP zBGi23Y`?F)a%;5NdlawPYfyXM{PZ0CU_FDZI-RKBZrrQbFR?N}Ro9wdz}=&%sf?V*g+0!+(Ji#D8n~f9)Cnc3z`p1z-dC zzh_|A`eC~V>23vekRcVI@!STWuz}XsLg=vgOa;Q-DhvlBiDfi0EwC>5bl0%?!7%z` zH1KEe4?fY}X>&T>4E?xz zORf2V+gFwAmmjEzQc~MrdnT4wvNOt#ZWVh;ub9m{CmOUp`!h5It55!SK><=o@x~>M zOa9R=v(S|vo)g`!FDPwV8LOyQa%!0PFwoYO+}^F?FDTE&95hK( zDoD3+R}2v;3^GlJb9T7tQqi2+dYeK0T4A zV94y#@Uy28h@-7s&?NKR=wA2}p8_~N*KUYI=a9X8?uCSAKZmH@ZxX3yzqHRnD0$0i zyV{!JOZJ&0A?-_(yG**N4u1(x$}s&gqYsVeleZ>2$L@sb`M&InCx*~svxu`vLOrJo z^fXGTRpD2ayoC3c#{KuOA>n_tH3MT~M-wNfe}fPEON*-x5q|u@{%)B5&u^iBJ}>b1 z@BFQ`OPUbwT1&~FH;Kk$zav*x!|M}=>PYB}`yhyA4Y^$N2eDEPNT-u>S0(d>Q?w;y z3C+_nAhV`L(+QwwgU6^zOnyznhvEE^2fs=pkr%X(Dk(xvn+Mb>&T?%B9LsdtSy*^H zq@I-SsiWy}O8t}Lbi=dJ@tE#Jh6gfB&AKstp$DrDqA%vpe;{vM$l!{P4g)iih8rG) z6`CJD=UzC676$r}w+r)`mB)XxIxTN+?u5S=1QhJbu7WIpQp#cwOJaD}D_-F1&W;&2 zgsIh7!rynU&yKD~bgMX3Jl*yA@i`pF*V!?L77IGip?36Wjk&pf&f>#Kr!c4T1qRJQ zxdO|s5QWGksgjhZ&A+xysgDII(huNY#?oX#&BOHs8nR!JS!+OfV_MW(iD|=)ijElx zdJsOGL@k;fa^~9VehuwEZ%qs!C3D43kTpY%(!dZJ1QrT1NP7LNWFK-8%|0kl=&k<~ zVZNAK%{#kIeu$8R2^IY6yf}TcOnGc+dVmg)Ts7DKOzH6t-N*Jx;EU#5ykG= zlCl2RRaMi5md7V1ij@MTe4dtJJ1h5gem=`gtFmcV#N+*)wKr?&YMPn$Z#%_0j4VJ) z>edZ*aetCjYcuHOs(i5kkba?Ia5(LX{8+GvkB$O={$cr^2pX@X<@jFlK~t{RYnF_Z zYVbd{HcAX(SAfBN>So5Hc;~U;%!_Fhrq`1dmS7miAC%Ptu+O%X|S7yUG>%auK9?Mrl<>%i=_WR_Gq?pg;?7bko^e6EM z`(;`ARq?MFDhc~Tl{e?t+6FeZcD7gM=9jOHYTo=J$j#fwe-=%fna)eebjB^=DAnPC ziC5%}lFQVToT2sDLC48E0NEB!#h#VOOt&sO{|SsAR_DgNjU8m9HtOQLzQKr$jT!QG zR0ahDEB;fHq5MwpDV}T2eyh9NwTIlEx@R{Wdetg2RP`Lz%aU3{Mf3K<#xj=)aeIoa zLjvflG=gs^2SRzg?^@hB=!c=d0S&!^Z?s2k7lv=%KAi&=PVJ$!%plM_F1e}$ah#H^ z+MU|76{LkDBnAc4vYLzdP}Vb+KO;v)@i!`WE$q@1L7|h)BU%|90+Y{Al%D`!!7IoS2ZH`Ho9u%G^;iN=dscCb;LrzxpKB zWV+TaCnpH(C5MQf19}?~BqMF&Z{zqryY;=`6q3jX93W{ItUB*aezGszrbR5cXToNp zE~EZ-idT+TAR3kZ^-A(yfunak`vjbBDd|n~2Weyf*XB53OK8C(E_czsMJ7Sno%p;@ z`Kp?u3w3CKnMb%DLjLuBM6*Dm#&+ZdppZiY<^Y4(84$!-=m{MLLf>Dnb2XKW1}yjh2L1pju`*IJxd^2USuslXXB?Qo**h>qPT)dkm+sm zHP%e==#Xt4NncY3w~rTdHYCcAaxd}S*rSxLKg%1&p6iuJbf(qqEJEr6BIx;{h) zAN0ld^3$Uh(wIYp5;^dVpsvr9GrK5qH@e9F_TovhggLw0HlQJWZe1@{mmzjTnQPc6 z-C^1xy%(`e^!j;53)Puz>@VA992b)nEZlDp0akCEh_YO?wL-GHO4=bA5r*TxKgJYCc_&;KAja5aVq` zBwKFd6O>Ywc8pFrOM`D1u`8XkzsXc(iX>dzuvoTJ{e~f?E6?7%i zNM0tLD1FH%8(}{^FE&k6tU%fzHD5cJLe_^srkJ|zrwMIIe+0SxRVWy*6vLD@~M&LlzC;qS1W4WlUe zq=WuxcswsUl2a1SCL(m%>cvL)R`D`q<43ZC?yVf{Fef$QbuoXl9=<^fo!Ztp<=us#$9an@nBjvG4qxVK_}yfT z*i;noQkjNj>ZWKDDh|o`P?wRv2EM7ZQHhO+qP}z zAO54s$?m@O*4ejqxAvTGUES3mp6;sd=l2hAzPgkGg^k-W z^2A#C_2z}~>b2!wSxoQCK_NDbv_K%cO`*9%DX01#(gYt>`)z-ME%|_`Vqe$Fa|I|A znC@Mgf9~czN19*TE|{|J(|bdlOr8>bp7UpWt(+ZNlH?4q4cxESv}QiKRPN}MwAQZV z;ynGEK1-U#|6DKSYZY^!6fY%OklEWUbEYXlhM=}vY}`_?vDXMH@XZaG24?wvrh&hr zf4VH7+#zkDdu5U<2lhzp+nxqxH9$mx%`CQ*8bjT@q-AapqXOVw~Lu(}> zVtpfufP0Z7!zFS=<I9iYZ0vr}mRM!Ng zhSEPfJs_X0>TQ&Fgj~&`*hj+yVqHOB;ci^uB ziAJZg@yEQ<71@Mzo5$(SB&F!4c9G6mC+9x0XXD=|54Tr<64 z#ju?8$_H@FUKefTkd}5qhlDmF4VxR$NZkY=skMnU4amuD*BXYotU83go8cqgF=$$EMPk|Cj6 zcT(E=C^f{mcM`=l*u)X@oOTe)B*LtFh zD0AI*;seL9G4{*3g-1UhP+tA`CPZ|(=Mnxl^s#V?KGZy#>nH27X%$&X$p$TND7 zwq?{k>met<;h7l3#_zqm?1v`If))9-sNCw46deAkk`vdn`3#!S1m z7C%ni#TZ}WQ#G6kVq8}pd#Yvi&3L`CyxeeQ7zpc6#&MHx1~q;*%DWiYw)~w__4&BK z{TPM%iVXTH<_5BG03+%!ff1~^fX)kUCCVk^Lq1WUDb&|1H!#ap5ojbmzzOv)0QV#H z*B4jNmjnKXFb9xTUN43(5jqq1gAMA7X5dR7-z#=%?Auyte=JfrH}Fex;0ta4i}PDO zC}d``dV|d&lf0GpvKi)D-vH=jaW7;RKVhIQ?3lyo{)*5(%#gNxPu=TIYIK2>yN2^TB5 zKq9q1x&UdmcFyQ7vMF?@@Lc-0=+wLTlry=aOHp_^{gBcahAO(ERam-Rdv3)phRh zycD7Uv6c2W?h z0##(uxua(_nFIbFwKR4(oIoRICu7&g64t5I4$hBX$^3FT1&!X=XcJgd@;Us?_te}I zj%^YgktWCPR&qTN_{R`diakGj@13s{d;HVxrMGIlU~=VpqTiEJ?WEkXN|SC6CMT%a zE4v~vl5Y2nkDa^9y$E{ceEeLK*n*_p6;Y{d!x@i74SMbk>!n`9)oMSK9?AJ6ITFvL zH$u*mZAkt!`z2Hp?TTgB^+a#(icDq{o2w|2qaQ}$w{kvVe7qX7-?mV9h7+h<>o4L% zOxkdUC;oL|e$&=q&Y-h6dJ5~~m9Hd>j6L^%$=Y-zuv#h1A(NA00Ln9_i}Jx`9+#am zN4l>{g=*NN zxY)rFIbQU=0Qg%I{(c%TMwdTAK`dAnsenAc91!zVGOesn5&u>@Hw;TS%T)@ttTfom zPg2RV>$u8SO17|fyeL$vwor0l%T1DLx?Ccu(Ufa~V_{LFYqX=eMB*u_|;>*X`anq^^IS1b!`%Ihv4!ep zY9uecAa@mg#)*cU(Pbr+Z{cKUxxY)Q^Q~03ik;I)ei9q*e4E~P1BuN=J=6R4-!^2s zHt9ijH$Z!|*?TkP!dx;|Bf*#{Mr*@V~v|{{aS@)nL3( zUcA5lQLmehpF)oO{P@Au0-`w(hKSwAIy4gUTa=Z#gcJnZBLzV&jzpD{Ka18pHDu)6 zQah6;p+-BC*9_-i%!a&PXGh}aUrE__K+f%EXD{Mg{8`T3+AnNW|a z%NC>iG6L}02mw^2hz^7BwEE;db88$GIjOP^O|Ft)MiFZKh#_Rrr+G1IYhcrC zziH#rVo*fbyVJ(mqac6!9WB{XQ%BA->7hN3#ZW@{Op87rdcH!x0h)3dsnRJI=@wIX z{gK&~oD@#@(-G=~7vlFkZeBHxqKKuzZy*o`Y1-tbZXU4R#Rz3_G@t=hlxYAsvY>GA|l;i;i%qG9GxO)_1(ToEJY@MM9q~ zUr&@UM>&w@6S#xk%^bqR0m|9@P}|R}m+vR#Xh^RkjBR7!ab~W`RAMkBT4G9IRnS<% zq;Dnea0#p9sLiRB9J?oJ%BJjKC)i_42tg-cY%08xxkwdlEjtrIFyx`>jH(Ry{4`Ka zAF7ufcInp>_8>yyNsu5lc+rT%D700sS8OO+@c+muf+MS6uiRr57!63MEoQ4JUL5qG zoW`WX{g4L+@>%*E3xi~-F0EG|Op{h^UDUN9!|KNdw3cCx=m@NTVA9(yc+E{6)Zun3 z4)b1}dWImJs#>m%=xIsf!e3*zXDUWL990LkSgP#Ag0Yt!SkL_;nR1~==gF8GQ8QDn z%zTfFk060(LNCNr&Z}e(8f=8lgd`dVwEZAm$R&vZDn((M203%jsRRxP${$xv7D=KxSL&uF?*a;9IB-&>ErZeaXQ$$ z>~{cy=|SpE0-cI)X4Dl}oG=_Qo~Tk~Z5X$|slDNLs`~TQw&oN~K(&$&EicI$ZWQhL zcErh}zU|irg9Lgp-zq8b`#Pb98PE%`#L=6Ka&GiJbKA4}JW;ue43H6+&KzUy)?&=g z`9JX^zj*WAawA?2!LCw++Ia|ITLvMxdP@!j3v?L_N2O%N>kuYSM2l{oTAwD%cjW+? zL|Yh=x12d^=~6hss#kpdLxusDvB)aNP~JN2@?KKIqrx?GGkw_TbK!fkWxzl9rw;ua zYd^@U(EjK+3fO^qbNbdV-iBWsnjpXgqeMNdo#{C!A;j9`ZqtpJazL+`9Hz0(r-@-l z6MGmEp~SueD7<7S&reD09Z@Q+)e7E%BEEyQU^i_f3TLt3Z|?L=lt zg`NPYhRfa~752*<)uy@YG<1975WaZ_6y;Hw7^ECoc2FunMr;{OP@!6{&-{qm152%2 zk*6l{Jy+uaH%^atGHyaG%w8@r^AR1JU^)QcCMD|} zfsvyMCf$|RR!>&msy<<|%9NK=cBQ`rX*KbF_ zR;Ru^1v>Ns#^Z{6b$;3D{XRGMOo*>EfZzAPs9K)CwjX3-q~K*HnF6H^Qzos+GgMC5S^f3j;rjIm-kv^k06Z6j0XP%LVj zKqC*uopez|$|736*@*Wv9H4%)y)LhvCbj>z8x`x3bGm1>5uoe$%K~87b+z?{;wzDN|H+s6!nZF=bCLD#yDy8eIN5>2 zl2X*eAj)w@xHr9$$J1jn=yAI>W7iLf%SsuF;B`7999RqnTB6cXNr7sFlP-n ze{j(8Z@I|(vW|kfi#EL$ zS%IlS1T4BK_PL_tfpA7vlWyjjpSC!j8FQ`Y;5j0z{N1oKET9y497_x1IssuC*x zaI#hTqcUENa#+^yOlE~#c8j)44ywziRLviBM^6+uaq@ zvnHlS=9Tr(h&l&DV?jBmTnNjM^GyX6c#JKw=nnr>U!C=Tj2D$3+GBqDblEPa_VdYJ z=MEJH{?xeRR(a^aqhsgvP=C+Ouky-PWs z87WtBr&(%@mDOKZpzfp>-Q8&d-RsCHS$$iF(mOfTJL-M%p2bDy;O{;zZ>eKXOfX)H z#6n(-te{?z%}Yd< z`U<+vs%n=YrA>hdd5eP`!-$8>CxL!{oqjQjTW;TZS~i5^DHk7 zaLED6oy0qj6FYf|KSzQ{$$hi%)ddczl+!Vk(_M5GsQMhr>=pF*w1pAM^6nAD8bZk} zv{0I<=pZ1IJ(c|w*(s~-tX}*!C3nN^E~XTUp%N9MVAXp0aJ0r6xW*b*y<-;j<*?(i ziY-^ab|ZDEj578@UW&!$hzkd{!t{QoW$YKCC(TQ!`cYY7@ro4jz{{a2Z(294+TfA! zGYkxpTvMqp{(xAEUYEg6cC^y*)j5rK;Ay~Y2a z@;7YnL$%|pov*K$4VtYvx|barTQ@pC?5n!`z&_5-V+Jw?^gdB@kfbf4P47e@wwk-N z(0Uw^CBgcIb5eOu0c3rsJq)X#ry_yvD=V}5AlqZ+y*YR-{@OiAm*yy}3nosAkONEM z+e^VYbH-9VD9lO@Xw7t_* zkuStYEfbYwC#5gRun_4sp>+L;bgwJ32(+kFbp`qjT2--_IZ#CORZ0u}yHG~J+*grA_&; zE==Y3ZM5I;`&=}J^D^riA-PWvSaw0JSTmu9wAi`xOSx&1Do%x*O>4&2GGJ5$9#Ib+%3;N4w|bk%jWdy zAMx$)X+_7diB!Y_Fpj6q`S`+R2g?3d+M8+AVFB9tfLyc?GHb=&{dZ@B@7(NP|IONf zkQ~aLk4pc0(Td;1Nc8{ax&7zD#q=G&6~aRLPWt}~a8xYcDKq#NF>87f5q4kNFC+kz zye{s{O>BhQVBDdIy+}CqNC=n1blepLpspl_>h*&lSPcgnn$pb1<>cAM)OD9nXZJ^z zerF8w1Ue;aMHv$M=m9@_xZI0OCtnJfU|IGECF^O>{f^JKKVv^$5sE0^h&tmE{Ai*Q z$D23~hy78Yk_Z=uz+@%26%EcfPrKbwu2ekUFP9FGxprXZI!%=W5xFQBs_+5TEkx9b5mced8B)r$P z;M9h}^-;@2mT;F4Hg+JW5Y#cPa$n&8v$WBts}@-l;l~eavL8P<|9`&4|3E|PFm9-; z&i`s%iq)${4C4O^fI{)db!&`MuVF%hV~V5K-Afcy#YLMH!Y}-$sd72aR>yZqY?6Kx z)9f_AXcNyGvcVSI*xM*c`Hg6J!0d8SRLg!t9Nx<+p4nu+Q2Nkh=rNN$e{*$nra$kK zyXJYyJM;c=I(2t|lUnm*jpF%T9yAuTHbNl@$_h_fIwU#~;AAlMYtf4_88)^=RyMud z?i6WI%CgWzN_Mna=tJjPOklSZ3xyjx={k(;@Prmbw$8Z>mp6&(uCmOJvTiuI%zlIZ zX}r!yKsH09O_J#mKZlXu`wD(~34B6yvBRWfA)Wzbev-LTiP|tAIV6X@LsxP!xZ5Ma zHKnrbB)cMsBfs>aMWswFTw`NG+kh5ydcHmR7zNMEGdaSer+bP&jm_P*IfBIuwT%8S z(Sr@9GO>(h-f#noX3BD3Y=OSHh=QV8c|OV+lv16+JdW_Nyoj*wp)M1%#T{34aN9{s z7W+HavUP2rY`|8&-ru{`!AXFC$7gPCF$N_h00%tdWOXSP9h?JH141G&v{NHA%?78o z35FZ>>iSxHOah0rXSt^nil-9 zoIbdxMjBh+^p2_AKZ+xn!O$U<=-G(V=3-vSL8}kv%9zP!Kn1OJzZ!J%xFpfJ_%{RB&@Po{LaCiLuOkT|6Zgh~2vY0z z9bS2KjO>hVd5wH4>pYlPXR%OMX`_KK@>hD!H*)iVJV{K49?x;S=*x+Rq$Fo8d6r>f z4@Xjts#{rYOzE8IO*PK22(2P%&%9_zkI+CX#q_JhFyoQ32;RrU?Fg@hbQ#N12-caw zjya~ml>C=UAXZC*>ukSS(gRtE0U{&?Wt93f_)X^Iek2tA>L1OjcJ;ANyVd|f$`E_C z-$$fk3rmaQH2el>Cfpo0PLt05%ZVElqHoTnjN*>HIVo4avWcs1XUpAiM1H}KI)#pO z?pBS&8_Dd4J*I{bLyIU!`JY*9GO|EJV2@Ni7BMbsN|V@W4TB#%N+FTgv94K=D2zmr z4Tv&{!}uGdmzN7^$-352k1GH9I|M34&6oWG5qjFa)3KIjz)OLq*cLi9?$waqR5~AT@7HY$Cz4!VvP>M8F=t+zU@m%qG&J2V@3D&bNS=|_S_=b zB*N7>MI#n4PlVO;Y@*eH6xqfSxrmq!9dio#g>J^;)c?ZNy%hFrDsY5RwNp}tj_lEV zr|kdMG_j&_Q`DLBOKiP5m5w}C1?Tp;$6WC3+sp>6kJmywO+PAyc36+tQ1Q$}AmJ;o%XJO=8S}`b5n~X4$gYI~>F)OBYMP z^!ecUC(y530i^n1aW-f#1aEn3%ORa>E#jrjpAw(qCDcXLQ2-csNrh5aR;&K50f#wL zg+ut40`hnZE;GjFPb7Y-F-|4FqQHN9;;@VsqIrjgraQb!J%nYT-JVIjnOfs{Bepy^ zy5iax@Kttj3H+%)UzUP7{pZX(Y6s+cpub)QIDa|Hx1WpVB{|&sYNi~cnL8p~8p??W z@g>oAtkYKIBO!^3PJa>q6H>$=5R&NAQ?vsf?m5Z{pMB2V?9awxud5wFcjHV74n=pU zMy$d@3D*WzWVF!DZ)xl)!nbE6(-!VMQ#*7}xM&))6HV z1;v!q&vkhJJpf!p@OoP$tdVOQqb>rM%DuGW*rjE0`oW(tOW9sA%B*LVR6&al<};#a`{;v zwpq_uANU4VuZV^tB>A^#ZosDZ3{^YgtYk+-?sHpiXtyEssi)0!rH%mj#a89L)qI$} zDaKnLn&CQ1<=Ci=lQBGE@_yXb?#5)p43nGp?}$G&tefr~!l%^Cc193SXKXa{gIKC) zZ|W-H(6Zgjsmqxa=X*Ahop81%`;IH&&!5D#8pV#X8QIo|Fz6=g3A~6i46}?c@@39T z`W1OPbx?m_e}X3S@!{@#yX=Dy!u>|tL;=@xhczWcrAMxfWM z{rPp$*`|8JfK(h!E?V`q~#&my;}!@FV2@w=?>n_ z{TO?jdWW)EMI)s_)8ux6K>Ul==qk*tRj{JyQEO$`*x{H^lsehS&^*qdN@(YUGWdsO zZEJ8&2xB09Z1OW^-6-}ftj)3b_EnMo&&`cl!&9uKW~kazq7Ku#R8yw52Wo7fn4-(N zM_zVTqfN@|13ks7KKLC{)qv=DS*)BEuY@PTC@Xh}O%^`^ufM(*vZ0$6<$@JdrgKpY z!6BIf2VQM{WYSxYQuh(d(;Gav zWfLt)9+t~(!usSW?qXA2Gay<#Xbs4J+t5&IU_wKqUjU5~?DVD23(bn$-)iJGNwR)m zcQduUQ10-X*`rg@9cG8FAXJHRiea9Jq~d=XfP zeg!@bxpxMGUAqT~&+JCEXs@5IFSnf-n%P)(xp%hiyiA+7yW`!az7Yuiba+h~7FW^$(NGp;O8v=jVno??Y2a2@4bZAe8hXr{%^R?P5l$G_!R^ zKf%o2R(qAV3z7op?r;4ban?8V^@Gi$hg(ESpVYfk&$j5G>w-k@qM7ZY5ps%zKYqQT zh)YFG?Paq@pE*d!0Wkc;H|S_hCdG8+l}hpbK^YKjkVTvR+o^z|{J#6YlMvj-AS;XL zIy~0>Xb43c!Es8L0l`Y#ah$0pcTzLYDi9wG6i+A$$1KSE&d}w#1#q^ApxT412Cag> zwq#5l{;g*}$rhJ27{6C_ug-$jGgC{9As6|0}7Bk!#oM9kN;e{1|66rX%()aLX(tMVH#k4 z?T4<8IXWoY*H9X8U>$QP3@Mc5ip=y)uvVT?qMG~WCW?wwm)ZX?GG56~Zqku_rw$H4 z)@56!Wn6&{FpYc`QFFi1_E*K9l?AV#$d6&OJWGaA<(NNHITo@`v0OWucr8V3&_2!Z zb*@RJf}v||)6qHh;E;1`Uw(4n0g+{}TH;o>dnH|+gsVxtgr>7~>F(l$QPX}ljycXa zrO=ugxE$B_7d}#fjF%7vCKnVLu$|swt9m#)&TqCLc8hpTm#kVYR_ec2kw0l-siKx~ z;VD_-Dp7D#J*(}nA4#;*inh)K+nf$Kts(=_xC-;yvMEuG={Icx{U%D*T zxt5tH`ziPJU$Rs6AV*&ZfByIp`Yqew{{K{-E8Cd;CuaE{1$wcHr6bNVmQTzd&4_M5 zwBGNyI6tt4BcZ=-ROVqu!|`#}e_K!tG#XRjS4Qq@8af>g31Nn< zEN(kqDb}tkZ{K9T>c0l<#5EjV+D@T?Ad2K@b_xyQN_HDSDb3-%8s4_wD%2- zM5j-IOJm0Lp1EIY;m-cze)N6HHVHVX&VZHX_Rr#kbDu30Mw>+;Cr>E_$Cum*OXgBC zNe)?*5S(v)AXVnB%#Sk9!CKwWd8Vd$)<>Tm26TmB$RWAqNscsY73#O)q<67por<}a z)6zk0@rw-4eCR!6ok+L@p&955g3id9Nb4rMPgY&rU=5NqowsqycJ#4>>2~-yVtDh2 zegW*yb8Wu>pX}(JiAVKiVO15!P8%zR9`6mt4gFZ+7y^v6<`*6JIM zyk}zT6&KME*+T5_q=q)zdBd_Pwl)8Z-L(=(lnIsaV62KZP{wVbZR>=LlUvG`4f1(i zs4UWygC&*Mo!~myV@NGSF#g`q&4f^aezLezEpb(7wv?5L!ctD}1fcJrTrRk9J9IO$ z|7#_idTG+$M48_dL-*JH&S`UP@+f+~ZwfdIGo-6P4cM0=eIBESpqvEN~ zYz}c6nMi5gurR50?epDaZ=Fxl9>VApI`cqt@18HaOPD6T%jr{6rR&=85x~VjfecU; zT!Ska+{4AFoj(>{OlrZv8F%{1?#st%;EF+jc>c1LKgp+?QWeO0sqf?X1GI930=xQ( zL!%66#Qpjuxeqjsd5QrrjxNK$YJUKA?%xLaJx%BC^@mz=8@vVpy(9DTEdkcD7uZ7> zIcZ0|9{7H2;;^%OXwS^Lzo^P82gY;083E?Tb zJC(RFn+o~48iGAH!9~XL+)`p_QM@u{(h1M1AbBsSVEPdX{8>OVu1421K4|;k`>X?~ z8Vt)H(Qi~u-mmrMVoDYU4<^t@&O@_-Xa}=MzBxdcHUd-5C;}M3=w9Db6oFtQf2>#N zI4A8-1|W`eMYd!4BiUKFb;(zN{}MWU;^;nKK3PZlKc<7l-MxK`+WoTorJ!$RLvkZ2 zcWC*|SoY4Il@TOb$(}DzdrDLFb}`FsFV&?`M~i(<*i~7B*WJ1lQy(Pi^b!pIB}L%?gS}yFnTRrh8(&$Qwskb9J}uhq$BbyvQ`z z`V{#pr29gQ`wb%1{-NLTw0mxxtI@H&!NB`4B>c(^smc5m#Sw(sF?3&M8bDdg8BdE=lGwdB>%1V@E<=#)pu7MQM7+6E!2D~^$&H}Y}19L zQ1^xMVwol3_htuc^;+u|G^65K0v#!=&l?Lh71|uqxqtmzxHZWU^Zr762f$GLfp5Z< zc?Iz~`|8`jqq~Fru{%|>g5wV7ewMYpp3dcX+WF%1GIO@*>-%W>Bh-#1f)k?CL4`qI zmwqC+D|^p%o)P6)cym4y%A21JkBdPsy~Sn&?Y-^9jK=Kmp9m2&d1i{Uv_Ou&ZnLxyM>T%$F4G1qXbq(%0p+@$ymgrg+*V2xAFbK*k$@c4JSpLSho3`7 z@MxCxF_GV0MLNqE{q!s*A|V_lC+K($bnKrK9Vch*gl&?;B7|mCkjgOQ+mx(O;~84Z zAyOQ*shV|IngweW1~@m$cE5)pLXzw7Y~-6z)Vr9EDw*L1k-2evrWvC-O`}qkY@u~izRlI@Wyd-V zkY8x&P|rJ>pPPgdhbN8mFN#AKcPjm<>#SHxBo7-FJb967(L=b2JplPGV)6n$TTPrN zU@^CcNN+c$$YXy^Bb2Yjf#qmH)CN8P~2 zv9V^$WmB({LMF=Nk_A@ZO9@b!x2tbA4yHKX$V#b3fevP4dNmZFT^ZWcLV$&ZtwNy< zipAGylow?d9e@Gi<8vOX%_X6wV}D7T=j&Nqw4g>oL100AHyNx2NK|9CR?uV1F);w< zj8>|c!$AStU#g3BCbRHr?%OXq=!rzHvhmvhC5bu8NG8y)q=0TfroCSDMA6(`+uWUd z{=Nw}X32im++9#WJ|e+R$%Og0tuZD|j53;}MCnSsUydq6pt?$K0c&le$O-dl(*9J0 z1%;W^$c`wlbTDF8AwMNkIjkco*6Vw(M(*cni0i6|yj&d&_z85_c*0(NU-s)K^ zB79C|+f#u`i9DjcV7wn-Makqs%ap?zkIf~KLs{;Dokzara~K8apPxF~12~o{pcn?? z5^!>6aHOL-UIsnyX`yG=Pqq6`skzuudooHA;H^p;^N?9I1k?Z`D5P?jtpdqoGfIxf zG-PUrKuhRq#T5qKE4gbhsv)AE+1h4oWN}J(RVZXGkD*p~oXx39(MVa|{Jd@J`qNp; zJY3&a;F)YTtUPy$QiuU{Pi*eUb$tmqD#6Crd)a0A1V3{p&PmRz$$KUS$UcXk%A@G? zNv1DdL3!k65-C8sXYv+~@XX{9wdW>Vz*ke8o3=j6RPGNJ%O(?uDSgBo8tlkZ!mgm> zqpCzwS*PD#SC7TjQML1_z#T}Z|bKtFO=O(X}EWGBi**_@pKUk*9sNCvs4Z@)WSLTXRPw1b`IN$ zO>(Hb76eH4V|t=!7Y}Bn)15s(HyKZ>N{lDhYg+FQ4JY6;ep;y&>*gE$r9y4!A|T1U z^AAw>owRWte6KXsuS!2cKahTcFqCCOX9`{8B z^vUQ}UwVL9Tld6!>V8_C+v)_dUY)yPz1$`}Vbvy(;F-Pa4(9X=WPbaR;eLD7r@s|U zjO&ZZAccQ(tvPTS#I@z}$pe=`K z$^hF}IP{JQh+)D-G3pby8m9Q?$uZ4`V_Jux=ya^E@z6HZGd+A@NH8+#luy*#BXhH~ zkE77r@buHMC*0Ou{vRZf!myU@E>{>c_46m3rAMk=&{<4ZwAiP?E}5JN-$-BjB_=B2 zd8$4Zvix~!JW}rVCnGyC5&9=1zClx^ZitZA^W&shH0}Pp@a`T@g0pNK-6E_^j&J!) zVlET21Nyg1Mqygv`a>54Iyr^Ikyqat$L<-27tU@zPiFgpa!k9(V$B(LjbCD$V32=n&T z($4bd{0H% z4_^IFY;+$kso9S^=o#09;CE_sTLbn>&QMBCeR5gf- zzZY9H9&8Mnmi}5N8EmQ`4cZpUzaH&=#pP^-b)!KajZzCY|9w*w`ZLf1(ldL4i7UY!}143i=vk`L6*wP9>Ju_6>ji*u6*}EJ`EvgT=3~e-r@I>+|F( zvLtLl17xmin9)>^)t%VUbjz$}U)kMn4BHhug7%qY|A(*r^;VF019$3yBz4?o&Ub<9?I8GCfL&*ZAmK478296 z{Xm!79iCIyozt!5-LJ-bd_P5CBmvwVa4&f-j5Ng1+)$pi*6h`4B+0zn?973)H>(lW zU2mi5USdO{!d-gYVwQ4I-C2#{6qucV4kf+%Jub=JFINFEZ3gJ4%SS^F)Ph*jVx@7G zS4macX8g9bWK-UzPGk5tHOEn%R-xtyWpUDEKvAS+Aeqg;Pg*(=2fj=N3kB?lzlRI^y@{&{&=DG5b={|W_R>YRzK4cFj-4xnF%%) z;xJ#RJAoW3M!zo><--A*;5(}Rmtf)VQkU)wfr6-mj^Y{U9Qmx5{XyiBHV3>*axs1B zRt1Tcyf=mz7~Y~kUf>uM@)J#kiw_nV3r*<>&g7M8N|4!T2ScR6z6o2s#oG0g5G0l< zA8h@fZ2qzKWZqeXXi`;ZxZ1snf$x+V+^iIk~sl+Lg2TGp||LkHgL|cKBgCu-k^jgLGdLyq#-1#9M zW)e&|+|JY{5@u~4RkbXYheKAq-}*(#RuY7Sk5^V6)f~|aZ+3X1F!~lr`_UD&pI;oG zK?+JWBK;eBz!hvyi@}gz$boz=EY%zOPy3fki$W7fa$eu$Xutejf~CgUQiLW~?sC*I z`qnJ#kj1P>MfqzvY+z4Q;h}`y7USuWQoq>Ir|x2Fmy;0FrIUfG7hh&2SRV$$(x>i8)qIgix{QUet*l{TmTZ7EhS6L416u9^#WmT5Y!%dMgz_gV<^C%-jO~g@wu{48=c}(I zkKXeX2McGIQLlv!_29o9i77_|0fvrA&cx-c<|dQPWN+&+=N=m&+Y(Q-TZXIpe?p4s zF`>&d70^nUp&TigO)BE_i|e&r_}>R`r9#Hg7%ETFDy{G&FouN)(SNyYsWL>ocUZc@+c)Zd$*3<>>L%U@Ub!abg?d!Wdc~U@Wj!5CN5N~M=VwRw?(tBMpvs-tB1N0vut=*AqvS;L}s z!qIqbta;ZCvt|c7I`Y^u#(G}baB};+<6YG_987nJje*3nq`*PzJ1MZmeZ}5bSHmdW1S~)^v?I|->jLK z=;p#<&b5P_`w~%`LuFyy9^tQ*p(POGy~P@QS&a@^Nv8T zrPF~AI?0%nV{eGQ7o$2~H$Ah%KRy9jU7{od4?mEjvd?$7tSuh&uDe2x;yO|Zg89Z# z!y$_39HWSYDx~v+g0)h@Q}>`egM@qvp&Zi6N#&nS;sU^^rm0sWDhkJ$@JgB)BzzbF z#}xZD?RPYK;|(0X0qhb>U4ysE>(;$9BBMOEk*|q-X*k?RB6o`B?GX308A+GXQ^{4Px^(W20vN!opTau`_4ml7;1kn+oJ73^kRi)e@ zV83tqgb06AM2w9+nY@bSSZ^ZUfE=$;yaDn?G3sWNDZ=3?Px1WFAOrAcfx}=rbCkU1DIKYqKSUTi2i2NLf*E6ueK||jh3iULTlAgiA8PEOMVaNi z7eqcTm!A~l7s_6FUGqL}CY*Qacl$oU7=S#Ah+yC~|EfOgYWDi$Uo!8$;;M2Tb)2EQ zgp(S5UB-Il(qN9+{CoL^cEz%DZ&^Bkkct?<@qDQ(YfNGNDc>^vjKmb5Xuj3P0osgFQ2RNKz-h7@4)0Ur)iv=Rw z1Y1(T_6L5dS$-9#SmeM|W*Th57?F-f@pA5Ndom^SW8cQ|j4ZtrZ3Q5|2KE;ufbRPF=?8CPdG)tK? zwGqZQ-xvoWMawz7qzyNYffxJ)JZo|Gva-UCcfF0x=GOMM9wT+njVjg`e$ICL{$-dR z%5Tpkk7>Z$rsIPYdi_MZc1n!`+5Gbe^FIowV|~RD2WabW2~vpPSnNWcUPD1kl#-L= z9G_t#_lbLUBTNpjDJUqwJlC1)GYw&ZyMAhDW%Kq;&hd|n(m0>CA{(eNA#Hakga%j; zcr*Qhw2{XUntjX{4t?=_hpaRrrKt!qy~i)3`XS5Fx5*ep(255Oe2c;!O^EwmC<*3N zV&UP55=w`3rs&9iW4-5}Y!j8zvWLpx_f1Gg2UeFvC4IP0HszLh?Rf@Nn6nc?1x8s4esiS+K6-7c??v zwB708__^?;a*qbI6gF^@5_djtqkqo#k$Z8Fg99AQGqfg#MfJm`eSU$`UdOjCQ>GIP zlck8m%Ob$dj~nr;a1hBXA5B@<_e=59uGl2>$2u&`{O+|8Y5nT_>L2cQ`aK|sks^yt z%g;3vw5I=ag`2JaAb0E!er=mVdmygTtVUWb+ZZBbMX)zU$hhZ`%Po z;&%!Mm|$HLj?+7gk~TPJcR<8n^d9U-EEi+GE|tB$v;cVjJQl^a6;<2` z&6ABu4b521h{70%u!^`?Qefp*Y;ah%l*GKtY_->R&WmWFZX^qmKOzJqjTa;iR3A%V zxTshr=M=-J{ISjWmZq^RCoq~4aIlo90no(2&SLj2-|HcnsR^2`Q^{-P7{}JeP;Tc7 z+H8^!Hk8ulK-4yJ$M^&<1Q#SOCdq6YQuY}qhkz-?n*>@N-4{X+S`|i!7NJy3-lf6P zf7FCtYj0HN$r*?WGTy3;<1i~_t<`OEJU-yyv62_k6lqY^MjEh*W5=rrbEQbJn$*Km zGV_{Urx05kYeagD)d}Xd*R_1(GBHm$t@~3PhoNRr1W@Ht+sE>s&8G7owV+C114CnB z`;CTOsw=ftS^!xAD)noj3PWqQe3uK?dX}t~vzKQ~Cc{*jdS7iLHcb|*>_9uphfNI{`H{>@K+es@PcG+w$u>@HLn-WiNGiCNt z)iBsse_H+w2TdKV79ZXKY^&mcEEijW?oM$<0j~V326do3A+G)ULeXt@Ze6Z0E2cd8 z_}BBEj$l&PJR&y zZ%GG}{nAdzZj1HF(j0k><-2v|F<31AJnMIti{2W@!O8=T^;&1mvQw&U|1Qai z;u!cjs$jt)bWY>}f~#0KZX$(^la1x9T~>wfDsr!47xT5+BY2%**|?37Bgtv|$jt$$ zsqCUwqC!y5=UjiJAPd?W69obhapuJu#K|sXGUyXw4i6)CKo z8NXZd5cjRYMs=x!SBZ2XyGy%JJ$u2wLvd^!?Ght<{&a-w{h^Te4JWoZPDw^VJUgq< z+0<2IzF`~=HGh-9$>~)P^RTr7C&W=?K)cA~@upc$)k-nd(O7KZ3L|=touyND#HW=X z{}H;lq%I$D_^r}z6Zt2@FOQJhpV96+Sx(kOb7@k#ea3DRhu6!uc#@pytRu|evYZbY zTwCObUJ8*|PS2qKw$Ge{iE4+ zYmU3qox<1J@Aw8ckoU)rec?N2_n5&j1x~$8q!X&UmFNoC1Z@wq)wa^4uCd0o9PDj# zvydVH$-rc392VnA;+q@zz@HBi`We}p4XVY#SldXv6J|1lgCnllr(++h8NQZcrsyThdi1yhu~P-WvS73 z($!Ql!7s#!+2*vQupUu^dR3(OfM2ywFxh@ebl+5Dj$TTWircftcvyGFy`@8aC!N5! zSGe1Le*PV$uFF0PQMd=XSgiTggR79&kC1AOm(5^NG#Jfe>ffYZA))%L<8wMF{!8`R zOILLLYDGMDgGyYvIPN#Mt)$uZFDf2Pw_A`&=o&^(awUN25b~LB?JrEMvF)_yJ0cWP z!*pd`cu&QHth4(&2i=jIqth}EY2$^PT9%SSeQb?Q#W_}GV;bH**l=Da= z{`*HWM-_pXk_9t0U9E+A5fJxjDJt1Y1P!;tBJT)}h`P)ra|}YBD0%@t@#z96U~~<~ z;2VsdoIbJZS503(M87j1`rXGA?|VOh=bgM}`F4g2CoKL5jDkD(?#MZ{qrwE~UOw+AX#M&4jW>qcf8+TF_V`>x z@X3HWM?UxKE&5Y=rC`{vBP0I8LNK=HT5Y=g#>2OPQjUj-%|MRIy#vf2gS=O~Szx;PucZQCMIotkx}j&e?#quGn$z0Mcvgb!5g!7L|OL*ket zJ%AeL5RM*0zM;5XH+vcG+^&3;RZ-kS4Z z%2~zUk~z4(uqpx+QKyVzp<~F-Va;oU>le|ZT)uSsh{DWrm}tMxT^(Oke^?%B@>vLu zuNv4qBZN33v_0(pYwG$SFMe38?U{&n#;n}&49{P$1b{F6%;|EGK9~%B*I_r{I3vIc z3Vu~ofLkQJ6=LnczkGA6Kf5L-Umf)XemFcs8NWNuv@SB*Q__~$+;%tlTbT>sAi2vS z-VE+jKjpfcqwEBrvX8@<`H>2Sn>CCbjedHvD}dW2u&Kk7m?_#KU_YVB zfPK^PNpzGwutT?&HF(1)GGkzlU$RXz`(o0w&~^oUYxFSUDvI|G8SNXs^~`acO)xgn zwg2p*LIg-9`Gs|A?17Gk{V@tYWbIu5$W zmYm)NCP*LM%v4TP=$_I1yVYh$>GSF}UrbI(E|gDFgdYZk2`_9^uRLJ9{3^~<$su|m za8GV|oO$hmF|Y?w{zie`oOj zR5@Yq-Aj+X+u($lX^TX4*(Bt$r5qUKzR|A^-M$lXQ5Ja;sr68m>P)`pd!F9eYVdfC zB%*^rxD^$<#-EMmKe&jo9LZte{Y+Fm?`ivE8vew5<&j485lQsn{Tk!LTBETVTn3+w*a4N zsd?zP>LQg4)z%Y*D&kWzm77OumGg?waD;LZP*$SwA|c_f*}C-0CL+M^i|tW2<_$W< z-Gt_mufb}8>eE1A3nrDHGACdNZi>>5e_b$-qp9y=dO5M-ybMfj-R&-xR^b`Z4zVdE zX}S?yRsMU7rd*NCN`cNwkv2J3j%Em|4yIyIilxC8b%OF-YO}vN;?k{doZLC*Ygq4E zeLtj>(;>sjyN(rtev#DpkSK|Kd+V1iAlO(55uNdBC|2*P~5~&KpF})^MouEB8xRm z%$@l?_xNMXsVjp<+7yB(aGPp8#b_{vUb@TsS#WdzivO(Kz|(nRKQt(&g$G&}v*!>q zoJvp|_2wD{>BR{1aj+{iv|x5{gF$>#oN`-kgLkK4!fA$X!jqW4;39wDkK<@Hc&M06 zlryk_F3GW_u|i#CbSJ*j5Um05%&R)kNI`^8MP)JwiNq;MM58`rIf-uWb5{8%u~<9iZokP!#i%C4_jdx;tk(-7r5FHXaM?V z)jUGxPIY^$w&k(jd|qv(Fwdcmv1fM!^Um$#Q)c=mWazaA`vj&2RNXlxHwni%cN$&Q zdGD23-T6?Pbhx6DN_c^4i#(i4@3!ElmE4k;Q#?N*x=F}6*4$CDvPb^SvO<_{rwF{q zn)&b2ui>Q%skoQbkBB(k(}7_S911nXoG#4jjWiOG_CYjik-y07kzwsXY33O>Bs`a! zubRjRkoQB)q~YRZVRvwDoBcJVy%{3i*!ES9RC)rrM2MvIRTx3F6rmOh#W*r>clvC? zxNK#l%M6n2T_sg1rKox_Oe$)J(Qem{t?s%PnR{3wJ-(R42>|EAx45Rs1$u7P1wp0@}HSXUFLWw&Mz_yBDFfibmev&^2i1G#14-Pow{Rtpt8W&}W zP?Ew!j3|*KXef}Y;1980h^V~R!pA>@#{=fqOn7d+lbx_`jn~6g&8z=xhaE^Xrk<4f z059Pw+au+rD#Q!SIc~rLqkZ@BorIX=uuJHrN$Ey31=fdHWFRb|#CTwQOxkar){O=% zL#nuG@|zN>R!SQjDwCnatl_2LuwFyNQIsbr?mAiPykID=%xBo`7iK@o%+aYP_7X|G zG^nO(|M8SpNGdAza;09)oLqC;BI!4rN`GQ#B12 z*Nc#@vUDeEbyZ^@aG6z?><%P8dSRPiy`XmEQfY&lkXzu<8o%Ft!e1mVT*HDbCo28L zQIwjeyIFuf?YU%W16jwdD6&(ukPVen&%tS;OdHc<`wYt01YDR3Pb{|ZX15n6V2a8= zHXqw{h*;j>d;{B628za4&vFFysmgyIgqRdB3C#nX@#$`I6DdVzLgu{aap36bO}`Um zwBKaVM{{zX2ZL%{;V`$#*$N7l3jV(Ol#JlKHmRY&>;{C!*c{{xrXltTrGxuSeWD+@ z6xRdz;L>4lb!}yAWRL0sYnk&6V4N|9tDgdv4Zy3@6xmQ^Aw3J^t#B>@c$ z0!?GF)nbJ+3|jQAjhEErISuR?MA!GW2!v{ysOEcR*ZBa?DL_WZ4imnS+uAGwsMgP3B<3 zy%NND79P;TKtQlP8HD_3T;BV(569Zh5K4#%0tH|sGMGW9HqB!4@ChSdSEf~19RK0J zIE~C}kKhKg&s0sB+PhJBih@ABBCRs5T&1z1tUn9dMcYvzTBQcvOj9b>q_73uY-RwQ z@CgXW@DT4sq)LPyj_>{XxHsKOKVaKh)C-M|YI}r=fcSNnzN0GxDM5NEkXzH%VTTg# zFMIjZ3DiM+7{nOn&_WXjjzVe zwi~>Y>i9krjXBX|qAGXQ35O#~0-rOjFIa&yqsS5q8-~LGNPhoUG~eV_kEKJz59G*h zfQQ*#%O3NCS~>+!uQ0P5KW$f+3+N%7|`OeGWK(3%)Dz4$ro-5&S_gAa3QC^)3@qrGO}MmcZnZ* zL}-3QHWAN$<6pn&fs%|UAl^3I@O*GEc7`8V(=j^-RB_QqAtAwVI^)!x$o5ufNdrDPQo%F%9dGAbG~J2wm4cHi401FsD_l z%QjkRAlmZY@9$p3|2_ZyKRZSJXYSn6&c)Qp&d}yBL_8g9Mh3xGyV4Zww{LR)GP?cy zWPf*wQ?@j>GjwrvGW{>g5Pi0uG&x5*c?TP740Z@O?w{;FF ztW+Gbo)ZLeuX0`m;-8a_GM&x!Iy@Ne(k|_Vvn8lk<@c%2g4UN?Mx73Mn?;tiv5hdp z(9k`ln}E(v*2*!5z)aIStV@JNsbON*#^v?t08Q+qHKkYRpRJXxgeE-Q_DkoDa& zFIVEqO@_eP#MP<}C#(+Fn%nNGJY{9lBj|T9<;jqayoe`KlCI@M%2C!4D+?RXSx}AF zvfoOSBJOUuVah{~XjvgV-NIxi-DE}*aAE$b(PauzmByvj3eHzWf)Dhbo~7Z-J=d&O zqUGsRId1K}j-QJXsk&6~Q>W{3W$*lqK}7!%<*Z@FC7=Ff88M1n2QX zW7SdL^X5Ir7iO zO-6%be}s{Q1ZD!Gk3x9i?&{>hGP`-yJ^;6{n?Vw&Z+h?!=+$sAMxBvNFfMNJmh@+S zk?BA)y@~3`4B8S6Ey-QLTW)6;02ztQq>w>Uwgu+2P(59_L6pxc+>m&TpzaKGuG^oT zRA!6=(iL)`nD$xLC0lbT6ZKm{*jXu2RwAS(%cw!VzGAUaNLhgNzO{}5^1Sq_CgnB2sc9PZQKC^^E;bAG za0=VIbQjJtT55E@U3J347hslJ3$vbeWp z0j%@1%pt8e1Gi=E0U4Pda4_NuQzM}a)J`GQ8{5%0geHXsuTdigPw0iU4w66`*sp~! z=nhfZpP*r(q-Et%TT!9o2&oRDmiuB=E!7Q=DLU(BX?mY3E%DAbxPLNOqn|?3M zs--D?n5?q?cCOx0VDJsqo4xLtd-2zxazC^?*z6iqt^j7K1piBD6@Kgq2tW~b2C+pT zi$FQ_Bo2DyW7NhS5S!r;w&P|bz`&Zn z`%N{jBluRqABQRfzwI&scg`?6dDoYo($Vw@$xl;pR_=-N+r~YGCX4RM+TR?_>dU<^ zuCmK)BlR_tTGxoCZ4v$nvgdMifr(s?RHuhn{yJ6PD%^YH6PuA%TTDo&AA{Pf`_45_ z+GD;e8D-Yvk;6O+tz6&0L*u$ETw~vg)Vgg<*3fV;ZO9#dt42PDMOu<4`Ke6;;9d>L zIc<2vbNx+^DthJ^z9>BO8tT0!1mr6-qti^YGC<5)+k+5mvB}`QH^^tP67z8IjygiN z*IIIJz~(l;9EKb+3_AZ!G>*NRtKNo$b1>!x#N#+i z+<;=%5*#CSHx6^_nYDK!V`}6Hm?q!EuR(Xb;i%we80Y_Gpv4mJ58d!U=1PmVf8%rw64OUj3 zuY60oz;&61m{&Odq48^>AD5r;v49VbOsRoyFi5Ri+!fZ=$pxp?{!{}_Www^Z?bEhN zKFI#cUcD7I>SeM&Y3fJ@EHV5Qfd~3^7|#|Ro4gWwCBp7q6${X4RkW^Xpt0l!ly6v! z=&CDK*{;#XE0Ttm#<_qjsqsUYK@;D7rZ<|G>9kba)$Q62v%CvTRkMb8v)C|eP%;4) zP}%^S=lg2cSnf^7;6cm-RfiPWo|3_ErRI>aQ8W}Zk4 zT%rUWOL=0iz*y~xRYkY#Wq7k~zFF(yEUU9{1MHtGYSYJT|H`|f&-DyVV90^nMQ@lZ z1dMXUmf1OmMw+}KPMf%-qRH=QbT}wh`x*+BAW(?IaO~r|5C8dUaX^XD{6rY)kX(pkvoK zC%GgZ9VA@XRU!(N4)~K@dm$eVvv4bgG?eqzrn*AX&8#blo7^0}+0ANw9MB zSVZRh^>AIf=v82P{s8Ff&bSpOUt@VCI*{xnG$FX*5fLzYMAyqf>M(WS9iW5L5ub}@ zC*so|Y{7gWX)SJuA&AEfJ`g_n(OaO`Zw{sYQ*zK7OwUX&o4%W}b?-rNdBhV{-7Mjt zM#Lr3S`S`SipVKkyjB9WX%cPfUaO;@sXiO3@60k*x1cG3I0b!2wB3^)V z7AXI@5(&I9kZXj)0KFRQ=N?cWL+>%pPO>=+V&_=JV4*gJ=R*XAXlr9o{A7`7V!jSl z9?HI?`dcCXy_dV>3z)pu2J;8JWLjf*0s8UjO0?AHA>({c6uG1bLL69JDFG6)h{nrC z?Nvz+Qg)cbi@n#R2-sHNaY-%EH6GY)EBN4#r=?oMHV|#TK~&*MC>x-jnKi^M~UfE6fz7RS{UrZnu=1nRr)uHv}NvSa< z3td*1q4hc&MOB-Gb2R#OEL+QVTA3_$lqKE?TpUK18LM`)8Ag|2;%5RcghYh+Ip{RQ z=fWH4blWNjWmHjNdPbPrs=K~qDwmADmTV}+MPE!13=a?akJl%?jEp1Z`t{rMEs*j0zejAH6acmDxn=H?8 z!UUb!PF(lEdWjB#!_pY$sTU~y)`7LQvh>=J?m32qZY9lhJndXX`Zr{gJ0q;^LdR4alcgruydX+Ztt#I2xWF%As3iXbV!PG@F?}@ z)g^KBT@rH|ND$Zu6_Z+J6lGH!MfjAcz!qlSQ4N z#pl7lUy-@q%T7wP5)uQ}e15i9siLscdAdf(pLGgBhY=}FvW}R_4Rmg@~s&|J*6UJ8)LYg@NqSLFtDbaxfdsC324rpjaE(} zbj+|R!U$UT^uXNj$}x=KlxdL2)5pdOK1^nV0tg$QYALMbqLYIjC3vctM)}iz%VBs) z?~#X)Rj^P${rO8;U>Tk>Sw|Sb(FUn?vsx zcb*GY+!Vrrfqpm;4$4Nxc+9q65Y?yCdYr@aAv$%B%dVcyn&V}7re2k=K1F&5=*&{Q zJvezqs5uQl*b|?^5LQjI10|2n*THgrOPJFqz|DOaz+AHwQbZUOML(4pXb(H6^wM@Jg~JBs_^j80^p>WmpO}8=XrU$s%(ASh$2Hk{8G`G>3!< zld#v`i|pf~zX}a34O{`hsG ze?mT{6F&bN7g)Drj(@J<;-`EYQ1x}Y@ewFS5kl{AVJhO)MG&GSO zG|>}8W`DFI7k1;Z@Z6Gq%Hs7R!>2y$FPoZE$B{2OGU*BZpTW_%lW9swqQjaT~8| zaBddZfla}8auWG+@T7i%JZ&L9ciVS62L6fs2|40y-yaWH?Ypb(c+CDW{RN8L#}`-n zpKpJ-e`;&Q5C^b050J%7#2cV|pysGD`W6VY5{<4Rj3V8kjW(dU zUtQPUm^y}C0qy1M=BhVChZcEiL&$H+usO<$Xu}oF>><_{8{WV%;?MvVt~>YE+u*Ub z0*7>99nCrfqF4G|d#N|J1m+iaHm*iHwh2$nHB%$Gnu}tB`E6zZG*$M9C}39&uOC=L zP(b8WlhPc6;vO7x;elqGJ#;y8U&W0k!5{HA{T?Y8eT4@YB%tmSz2%B6sA_(|CQ?hj z`sC8jkC(9?K|d$T7_^28Lp5&~>GsV-Jnc+uE#GFc;36~cdmLS~TNp{WQhPuJl%BF9 z>=gbA|f# zXSICgP9bPeo+LRF{U$;~g%VZH39lJz;gVg;wA?fq6Bxtge4^enaWvYF?>{>P4&tCdt)T(l#V5%lz!_g!E*)+#i3@=YrQe} z%Pa%AJ8et7V#q4$Qo1lyb@IEjXQQc6h;{O8QZS64xs5OhVQLH`nME%364!7ILW(gt zUx3K>o@-(ohT#Ktt*|{>Oz@)%A)CP^ZCO&t9;2j@PAFy-G@TC!D#>!=&Kq+RA;~gZ z@9xlQt<=s|l?SV4ug~z!fW$?)+xFNh|Hhjj&N{om#VL)eooM}bG|om`u3*^~wDVz? zXS>|pao9Tg8I4>tH8U>D+LT*8m7pt6KgH3gblWvrx~kh(CqRntpAW)jLL!(hD*XXX?k z6ubz;Tv8NRMy(`q->uhON$SqxPhgxqDx%AR1>ZprLlCNkp=w%SC_=i4hhI;&teLVc zEO}zQe|a?8;rN7>q~p%8tcnS50HaArubQ373@Q;_`0)IaG0(PAwICowi$@sP&>&$D z7GkEEQyt9Wa>%wo5h))i3*qRALB}I(1L%@qT}xa*v;IQR9_nbN4pgg?!A0~OoRAvb zkl_6-(U{iw12#;&e{g%?mC!N{i?Sr{t$WO^i`4QldUwh8w28g3Q>oVu%Jj@>&k=Oyh&n8(1b|dx55&RgM|Qs^u_h?#nxCyy%&6gAk5l_n<^nsd zGgDFW@4s`u|2>h6``^Q%i-nV^p~)A_{e?De8d-VF`>Ngk2J-FO|AmA8k4FVv>}@TL zMeJRTZ2s*cEGlk7u3rEJ@VPrLR7C{g(NoKyBU70Y3{4LyB_k6`$8sTU=^$a5pmbBW zC{p0K3-Y8e%q%R*LL-xq#=PL%{d_bza=gL))7Zu$l%Slbm>4eDu-O<+W`OZmv*Xgm zs#95bI6*X1V8k zu`%-?c=19>+7inoL6MP~I98gzx$iL<@HN*>SYIsl()jP3$lX7L!WWa)ie}~0y07)y zw(B2Jl-A6yGfY{4Q|CH3cH=(UYet);Pgmo3s z2Nd%mlB33Y{d*b^K*yo;;;6t1lzhVPd6T33-xb|r2dhaANj0G*iL??QfRk%+m|({- zrFaFq@OM$#JQ)N_eUWQ#bN4|NwJm~6OBuV#JwXDSylonyA((WMf4coZ$=J{ zCP^8srqd_2{@OZJ(PKLHw`zTYuQyKj{}(7Ke-9aD8&gw z3t(ft0fhzxNDz>a1k7`HgW)`1BwT`YM+Ly|6d;^aLu_13PETL>etP=?we~9phBL6| zDWColTOlKDh1NS<8EtR+5ao@sI8A;1&bsSSu-)jSRT%OcAWJ5rqzL)@?aEs;^_Mrs zRRb&^>nd@k9c~MsbEI%i+q*W>029pIO+Q!in;$rRc!I+n$CC}W-kQlubWIn$X3TR? z!>jF!(M@q=6ZSQa^+1X;upxMnM0bt>RVSjF^tNbl+78q!N333>@XlX07Ox`s=Z;^W z!ur=u%D=cksxFo`|JJONr81+8qK@!^$9+LFfq>`-22!6(*gz1OE9e4bi~@$+YZ9k2 zv|#K>1Jb~(-4IwfzIR0WOddZ@YA&Oi&*|{6L;CFOMD%RtW~ff9J~1$P{;22Pb9H@w zr4H_Q36eU@ZrMnXC(Jw>UMO%}>`gq%>8gw>tl*#u|c`Y@Ol)Sm~Wif&R{1PtWkd9|^Y(Q*&$w}`mYlIoHc z0kDW~TnjMy)Wrs&=u9M5twUIusN$gMqYuE!{GT^}^(q4r!M1#F5QR|s0R{H~Mf!mBbTWgc9s@#AR_-E<5uV6bh zlY@~!d5Bi)ZY?+90{)VudlnB!nK%D5@wv3^mV1rhm(6wU@Z`aW7vf22xoYyex6E2o zOmt}XT^@}M?Whw>Y&56;!v#E;Dje>1#fb(2$D`LaXrEi!10E%0VKJ1QtwquOhns?e zdnUxi^miO_Vseaq9_w8alnY%s7AeRpPAE^NfnTQ80oLcUIS4;cv>XCIU2Iss!J^-w zk`|N)Wjv*y$Fv4-EarkRN@b~Kzu&>UFuT0@BkP(2{^S(Ag1xZJ^L6rPrJi0sqwWuM z?XNW1U6Ou3E6;JaroRamsKgl~2HxhC4c-2D?dWs47;WsaVAhpdt@u6kXBB+uao`N0jdHdQ~NFn-{m37UIq z%K<`#)Fi$;{?8Dhw~jCf zSfwJoW#;?qNp`#q_s15$Z{GbOtSSnyh%7h2)WEM{Sz>ERZl@d(C-PNcZ-bPa%SSw1 z85}=EkHzgGaf+mJ&zuIDHn7ohm%dw-LW73MDEq6mpzDw7Gf9y~gs8>55@G>Q1wZ+? zqN9J=ssMC zb24wZQ?qHS$a85AJvQ1Q=RywM`^4&?ul>DZ(LhPDBKNy3j?di$KAU{-6X(|Axt1?M zgTJXwdNGWyxudHyAuwMkcVP9r4C_ornU`(YOEWvM_X_z;(k@;o`BZ&B>6H?B>9|O} z_Pf6;U#Jy9xO=ZfprXLW!3ejhT*SDzSb&@B_4j}))_16Nod}rRiFLf@6IL_N)nV#& zajpB*#uexF-AuH2G$Y`0gV5k(q(mmOyraJ>#3Py)C`7 zyQPzji8KAzf7`D%wg1?)m^m5Rn!4LNS^s70!>M5deD(G4$ydm5{Ogk_x|+J0{v$X3 zBQ0hrOvni_BJd80gXw#NILacU({+vtA*-`99&O=M6ba4HfL|ZT_*2QHs)X0}LoQA@UYas-eiW0kCF60YP*cy<|wa2f%Vh;o9WYI2m|9 zwd;1i;XvKSOA$0d*Vn$i@uYj+ADzE`HUH5L69NOy=NCJ5sVXXxm31=!9qQDgMd_4& zb@|EC#>a1K()9Nq`(qfmMj3`Y$o2u&g1sX~WYXwHDZ7=|UL`EItVJzqY|-16%F|)> z$B=a+4y+2C&SrH8!O1X+yGhkdloiRl2X9302~w)(MgYa);wXnLq!&Yw*g_CibusQd z524CyN#BI(j41Mqst3Po$!z4~SwY{a1r$ZIPTIq+Gd0I{v{BO%nGN$*p`W-xiHrr2 zVxgri@-^SUUDTEcqhDU1{z3!~yw(tTel4%gR}rP~zaFN_F7^%%e*-p>zx@+3wJ>zE zw0HV9l0*4genA0+H^$AS!n9W;)}M%f5jDvFr|(XPvB{Ycb7DWzUI`NvN=I@d?wdAn z7(x_a=0kD#H5;`A1G$0Cv!&&6(^<}b`}O5=AN`xOM|p0PVcF5j{cas{E4N{G_IYu+OJjbI6n5gzo7r`@OU4hC#>Xn+5qKqoSXPqR=~x;p>x!E3By^aW z$Yc$44qGMR@CCO-YV4xlzo%BPsYMG0so7a9P7D-=%c+OW#!M(WZ50(n$=gv}EKbA# zgo@5SGiE1ar^EiPCWpEa8q3Y_7g{2#c$-SI6?yP2nDaf~NNW_ywZ)S+YFFGakDO(H zRaBz_pk?VNDG2PLr=T(gZp>L>3}W+q=58}B((>5dyBaFh6C_Gm;%ty8@j_T54HD(W zJRmT`zwE}=Vk2^F?#g?FjZax{W~y1vHr#6aZefn}FHULC&0u=W+El3>JXn+CdC&Hn ztOHac{@~W9F=g@2gku5i7G~-dO*Lvb?@M++8*fF>uIrHLEkW7PrFch_Kl7@i4DHJ8Z@t^Jw=IcBh3+F zta+6;f=Y1QklJK>3u|X`FLd7I4J3&t)Fc@PyUG&eZOfO0?ht0_R5S^bi+(>~q}_wT z`)Ymhyd8_Y(&V9h@cT<-*R%|F{>{6K@+-R8{uhz`Z^8Tpzh6gC-auMWfx#9Vowic! ziLF?SNHPR`Xe9J2fK!suhNW5YPD|Sj$Q#AJt#IsMk|W#kCii3J>(k#94Q7Q$ghg|) z%Sjj_Bu0>t8RS*4R?EmZ!{$?VG$(@4qElu4epdIe66hsYrnG=(PA^9&OI?wvf({X z;9CC`f(6`C>V+zKICj_Jy@je*JI{lauRek*-1rA|Wm0Qf?pQmm8fRn`)51s6 zn&yl{itZ8Wg`r;>cQ0at*BEFtJ@@uM!}owhOx5_;>OcQ4vE?6W@C#wSs>c40V1bJ5 z->}7(?uR9Ncm@b!th)l60vQyAUGMjddJ{~mk@z9_;>iDxwRa4%HC(cUPx+K>+qSJ! zwr$(CZQHhOyXur}+f`HDcVfQj8{IuU)8CHR5qtl6e!S0{D>GMSt^^#aBDMnakq{ve zD%fq{9e2Gdq6ohYut>_4$_-VayjE3&$-X}Wk(n}L} z*Rl$StmPoFIEB=B58 z3)uxVZ%C}MF%Dm7!FygaD0qds2$q!UYK);kiB>9>q-@Nx=f*I zs(ab$-{nh&5yn!Vxir%bn@ZEAMt9)`=(sM+L)NnB<7(!@%nqB_$yoD?v_U<@X;c|S zQ`lk)C!4~WFEr0~sWi$()=G7$j$&Tc*4}Jh--b?HakA6s4n6kjK&XMeZ)PJ|h~lz! zeU)2eaP9KZ$+zUb^dN4fg z0A}vSH&FYe-()E_ff6GMern;tuh!3jg*&MIqz5y)N;;4{O=mXz@)dq4RWi(f1ya9S>0QY`opsKzsTEV zyqz)O_CjWZ^xSd#kf!W#3`XMtd!FUU3xl+V!)q%N4;>5~YxJoXzOnzUskAgXWYPbC zmG=K#r1QVr@c$k$7RmpENP)%|#o_b4IU|n`F7N{tCJ+$7<0p#_pH9*6AK)ffPx-(E z!R-~rf1(i+EAuD2SZ#7KcIo<86_(kNxDbe4{Y2vKEDJ=@WmL{F`Ry(YnNd&NhG-T#t4d@BLuIi(a^RvQ>mM`&nd zPB<32sGZ*dnKSUiVv>=li53i!s1sX%?VvPESfX~*xfs^yqI&o%&7JP>Rf?Fw!_-9g z0Q}pln8Yy$?fLN+mp|YCV65cd3p)RC0}4h)|Firp9NlFN$PX1bLbP$K5StvH%v32~ zfW##B^YN|Ld6KL*oT0qD?CU5R1-g+9<(A*+|6)q7^XmHi0(cpu6Aii1^DH`xfd1*o z*&B}t-}ZAdJCwit{$&Ys#GBtc-H{JvrEqWv9^W#hkF z=m=sZ_f`}^ zB?tCe@H{KSC=m@{`%k`fxvtLk;^%oB|Gc97|8-ybFCz_x|L!}=`DnAk0}2YN0m|bH zN+JS!e(<6Bxpz02pP8udg~!RtE7L<%K*mf@%t))nTSZ3C+QijEromfSkH<{hO4O5! zM^8@53|#4-fFehnfs4F8w4GuO=$G~Q4 z`nJPN%veLzR9f1YE3}O`448(bn4SWbUxkj&7Qnc0k09|ULLMDmm6=IUz*oPE1z%Y? z5#91Q;L60}19b0!c9vVS@3lyHtjs!%olo@7kNg~WtW__ak)bZAzOwEC{g2demLJgQ zKJZ;CTB|Qw|DN#~86YY!zX|Mj)ke=p)a>I8>M?Fe zhO5+P%@}NvJ7z{YGh=KqkO$}H2{kbWR*P%w6O@i|D!V_x_>Jt^0ijnSVyHQc?01!^ zw1(umMKinOs9#*wDUD2Tk@_allDc#W1x7$eXK~orpKpxmdChy_yc}8IE9v?cpkc%! z!CclB%Osx`$x-cIZ4vF;s9TwyzQ0C9kGt%lxfDtZ(FsA#%G`4eOv-W%0(h29vTW!v z9&Nnf9)|1(bdBlkr{Upn>M*2s(^i! z!z@kWx(TxV2$IavOT(sIc5q3{ng6|8v>CjW=IU*tpZ;Xy93bK;VT3bTZGp>FlpEJy zanYXbu*mY*7Lp_pq)zM|UI3YFar|Hwz-=2}LEW4iY z0&yF}p%uE&#NmpziN@cbBNXrx*qGN?yTuneZavkY9 zCC(gV3vlnwVKy6XCKIhQ%basOo+w20 zEf&_eRisfISwWQ;whE7!zI*72@EEk9%DA9Zv3fpLTM7YV%8pj*hMn+ECz4(m%L#1` zPO%z~S42(DC1@g+kmr`L^iZ9dXL~&HJeiPULS9={E_>t?RvzLx%h(~T*Xc=!(y!1h zP4b`-3l4QbkMYtTn1TrY4qji9f@OuLv1ZWJCn9nxD1s;Z$Lf23 zw!6yycdY(j$dP}~@>A3l7G%+aw+Uq>q5VT!cL1xc)b^s|>(%(}C`M=XfNSPi5=}E4 z=Y>MPcal)QV7kf}IriDK-wLpL5(+ECfS~&&XUwKkjz60-Gk;9~k<-_V3wr-INBbOk zJ|upy;xL(5kxP2oOfpeADwI}zvy{@9xx4flLz4g7G~KpXx^-D`^+D0A;}}CyWRrPC zbGkj14w?v$-ie0#Gz+o>qhqkF<^r=ta2_Fo)^WUOTXt_Pyf{v9K9<(?FnzEI&o270 zu^Fu)n%;wLO$=k@%hMW|>Jd74fy^NI1EXV+6?KkLEMbOR4~3L#+C8XH=3Xa2$ckYf zv~&d9fW%gYGI$jYGDLGx;XMWI3_H9a+YB5{*|LK0%#l*Uu3$uI7DSr!TzoPG<8*

4I1ymM#LF+*6MtECKy+hDB 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

fbe0Z-BL98d@btSrt!IzO@;3O&XiV92= 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 GZTKIT* - * NOTE: SwirldsMenu is a lightweight Component. So the transparent background will work if the window - * contains only lightweight Components, such as JPanel. If the window contains a heavyweight Component, - * such as a Canvas, then it is better to set backColor to true. + * NOTE: SwirldsMenu is a lightweight Component. So the transparent background will work if the window contains only + * lightweight Components, such as JPanel. If the window contains a heavyweight Component, such as a Canvas, then it + * is better to set backColor to true. * - * @param platform - * the Platform running the app that owns this window - * @param window - * the window to add this menu to - * @param size - * height and width, in pixels - * @param foreColor - * must be one of Color.BLUE, Color.WHITE, Color.BLACK - * @param backColor - * should background square be non-transparent? + * @param platform the Platform running the app that owns this window + * @param window the window to add this menu to + * @param size height and width, in pixels + * @param foreColor must be one of Color.BLUE, Color.WHITE, Color.BLACK + * @param backColor should background square be non-transparent? */ public static void addTo(Platform platform, JFrame window, int size, Color foreColor, boolean backColor) { Color fore = null; @@ -154,8 +144,7 @@ public static void addTo(Platform platform, JFrame window, int size, Color foreC /** * Delete the Swirlds menu icon from the given window. If there is no such menu, then nothing happens. * - * @param window - * the window to remove it from + * @param window the window to remove it from */ public static void removeFrom(JFrame window) { removeFromRecursive(null, window.getRootPane()); @@ -163,11 +152,10 @@ public static void removeFrom(JFrame window) { } /** - * Recursively search through all components in the container tree, and delete any SwirldsMenu objects - * found. The search starts at root. The root should be immediately inside the given parent Container. + * Recursively search through all components in the container tree, and delete any SwirldsMenu objects found. The + * search starts at root. The root should be immediately inside the given parent Container. * - * @param root - * the root of the tree to search + * @param root the root of the tree to search */ private static void removeFromRecursive(Container parent, Component root) { if (root instanceof SwirldMenu) { @@ -181,19 +169,14 @@ private static void removeFromRecursive(Container parent, Component root) { } /** - * Constructor for a menu in the upper-right of the window with the Swirlds logo. The parent is the - * window to add this to. It should already be set to the right size. + * Constructor for a menu in the upper-right of the window with the Swirlds logo. The parent is the window to add + * this to. It should already be set to the right size. * - * @param platform - * the Platform running the app that owns this window - * @param parent - * the window to add the menu to - * @param size - * the height and width of the logo icon, in pixels - * @param foreColor - * the color of the icon - * @param backColor - * the background color of the icon, or transparent if null + * @param platform the Platform running the app that owns this window + * @param parent the window to add the menu to + * @param size the height and width of the logo icon, in pixels + * @param foreColor the color of the icon + * @param backColor the background color of the icon, or transparent if null */ SwirldMenu(Platform platform, JFrame parent, int size, Paint foreColor, Paint backColor) { this.platform = platform; @@ -292,9 +275,7 @@ public void actionPerformed(ActionEvent e) { case "About": int choice = JOptionPane.showOptionDialog( null, // parentCompoinent - (platform == null ? "" : GuiModel.getInstance().getAbout(platform.getSelfId())) - + "\n\n" - + PlatformVersion.locateOrDefault().license(), // message + (platform == null ? "" : GuiModel.getInstance().getAbout(platform.getSelfId())), "About this app", // title JOptionPane.DEFAULT_OPTION, // optionType JOptionPane.PLAIN_MESSAGE /* INFORMATION_MESSAGE */, // messageType @@ -334,17 +315,15 @@ private void showBrowserWindow(@Nullable final ScrollableJPanel comp) { } /** - * Popup a dialog box with an OK button, giving a scrollable view of the given HTML file within the .jar - * file. + * Popup a dialog box with an OK button, giving a scrollable view of the given HTML file within the .jar file. *

- * For example, if the path is "/docs/license.html", then the license.html file must be in the docs - * directory inside the swirlds.jar file. + * For example, if the path is "/docs/license.html", then the license.html file must be in the docs directory inside + * the swirlds.jar file. *

* That will work from the command line. To also work in Eclipse, the file must also be copied to * platform/target/classes/docs/license.html * - * @param path - * the path such as "/docs/license.html" for the file license.html located in both locations. + * @param path the path such as "/docs/license.html" for the file license.html located in both locations. */ void popupHtml(String path) { JEditorPane display = new JEditorPane("text/html", ""); @@ -389,22 +368,16 @@ protected void paintComponent(Graphics g) { } /** - * Draw the Swirlds logo into the given Graphics2D context, with upper-left corner at pixel (x,y), with - * width and height both equal to scale pixels, wtih the given foreground color. If the background color - * is not null, then the background is filled with the given color. + * Draw the Swirlds logo into the given Graphics2D context, with upper-left corner at pixel (x,y), with width and + * height both equal to scale pixels, wtih the given foreground color. If the background color is not null, then the + * background is filled with the given color. * - * @param g - * Graphics2D context. - * @param x - * x coordinate of location of icon - * @param y - * y coordinate of location of icon - * @param size - * draw logo at size by size pixels - * @param foreColor - * draw logo with this color - * @param backColor - * fill background with this color (null means don't fill background) + * @param g Graphics2D context. + * @param x x coordinate of location of icon + * @param y y coordinate of location of icon + * @param size draw logo at size by size pixels + * @param foreColor draw logo with this color + * @param backColor fill background with this color (null means don't fill background) */ static void drawLogo(Graphics2D g, float x, float y, float size, Paint foreColor, Paint backColor) { diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/system/PlatformVersion.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/system/PlatformVersion.java deleted file mode 100644 index 4c84cf22e2f6..000000000000 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/system/PlatformVersion.java +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright (C) 2022-2023 Hedera Hashgraph, LLC - * - * 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. - */ - -package com.swirlds.platform.system; - -import static com.swirlds.common.utility.CommonUtils.nullToBlank; - -import com.swirlds.base.utility.ToStringBuilder; -import com.swirlds.common.io.streams.SerializableDataInputStream; -import com.swirlds.common.io.streams.SerializableDataOutputStream; -import com.swirlds.common.utility.InvalidSemanticVersionException; -import com.swirlds.common.utility.SemanticVersion; -import edu.umd.cs.findbugs.annotations.NonNull; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Path; -import java.util.Comparator; -import java.util.Objects; -import java.util.Properties; -import java.util.jar.JarFile; -import java.util.zip.ZipEntry; - -/** - * Represents a unique platform or core system version number and associated commit identifier. Provides methods to - * support reading from a version descriptor via a variety of sources. - */ -public final class PlatformVersion implements SoftwareVersion { - - /** - * Constant representing an empty/zero version. - */ - public static final PlatformVersion ZERO = new PlatformVersion(SemanticVersion.ZERO, ""); - - /** - * Constant representing the properties file generated by the {@code git-commit-id-plugin} during the build process. - */ - private static final String GIT_PROPERTIES_FILE = "git.properties"; - - /** - * Constant representing the key of the version number in the properties file. - */ - private static final String GIT_BUILD_VERSION = "git.build.version"; - - /** - * Constant representing the key of the commit id in the properties file. - */ - private static final String GIT_COMMIT_ID = "git.commit.id.full"; - - /** - * The version and license template to be used by the {@link #license()} method. - */ - private static final String LICENSE_TEMPLATE = - """ - Swirlds browser v. %s (commit: %s) - (c)2016-2022 Swirlds Inc - This is an early alpha version. - The Swirldsâ„¢ software is covered by one or more patents - (see www.swirlds.com/ip). The browser is free to download, - to experiment with, and to test in building apps. To deploy - or use those apps, contact sales@swirlds.com"""; - - private static final long CLASS_ID = 0x7f90a5b72e7dc0b1L; - private static final int COMMIT_MAX_LENGTH = 200; - - private static final class ClassVersion { - public static final int ORIGINAL = 1; - } - - private SemanticVersion versionNumber; - private String commit; - - /** - * Needed for {@link com.swirlds.common.constructable.RuntimeConstructable} - */ - public PlatformVersion() {} - - /** - * @param versionNumber - * the semantic version number. - * @param commit - * the Git commit id of this version. - */ - public PlatformVersion(final SemanticVersion versionNumber, final String commit) { - this.versionNumber = versionNumber; - this.commit = commit; - } - - /** - * Reads a version descriptor from the {@link Path} specified by the {@code file} argument. If the - * version descriptor cannot be read, then a {@link InvalidSemanticVersionException} is thrown. - * - * @return an instance of {@link PlatformVersion} if a version descriptor was read successfully. - * @throws IllegalArgumentException - * if the {@code file} argument is a {@code null} reference. - * @throws InvalidSemanticVersionException - * if a version descriptor cannot be read or an exception occurs while reading the version descriptor. - */ - public static PlatformVersion fromJarFile(@NonNull final Path file) { - Objects.requireNonNull(file, "file must not be null"); - - try (final JarFile jarFile = new JarFile(file.toFile())) { - final ZipEntry ze = jarFile.getEntry(GIT_PROPERTIES_FILE); - - if (ze == null || ze.isDirectory()) { - throw new InvalidSemanticVersionException( - String.format("The JAR file did not contain a valid version descriptor: %s", file)); - } - - try (final InputStream inputStream = jarFile.getInputStream(ze)) { - return fromStream(inputStream); - } - } catch (final IOException e) { - throw new InvalidSemanticVersionException(String.format("Unable to read the JAR file: %s", file), e); - } - } - - /** - * Reads a version descriptor from the {@link InputStream} specified by the {@code stream} argument. If the - * version descriptor cannot be read, then a {@link InvalidSemanticVersionException} is thrown. - * - * @return an instance of {@link PlatformVersion} if a version descriptor was read successfully. - * @throws IllegalArgumentException - * if the {@code stream} argument is a {@code null} reference. - * @throws InvalidSemanticVersionException - * if a version descriptor cannot be read or an exception occurs while reading the version descriptor. - */ - public static PlatformVersion fromStream(@NonNull final InputStream stream) throws IOException { - Objects.requireNonNull(stream, "stream must not be null"); - - final Properties properties = new Properties(); - properties.load(stream); - return fromProperties(properties); - } - - /** - * Reads a version descriptor from the {@link Properties} specified by the {@code properties} argument. If the - * version descriptor cannot be read, then a {@link InvalidSemanticVersionException} is thrown. - * - * @return an instance of {@link PlatformVersion} if a version descriptor was read successfully. - * @throws IllegalArgumentException - * if the {@code properties} argument is a {@code null} reference. - * @throws InvalidSemanticVersionException - * if a version descriptor cannot be read or an exception occurs while reading the version descriptor. - */ - public static PlatformVersion fromProperties(@NonNull final Properties properties) { - Objects.requireNonNull(properties, "properties must not be null"); - - final String versionString = properties.getProperty(GIT_BUILD_VERSION); - final String commitId = nullToBlank(properties.getProperty(GIT_COMMIT_ID)); - - if (versionString == null || versionString.isBlank()) { - throw new InvalidSemanticVersionException( - String.format("The version descriptor is missing the mandatory property: %s", GIT_BUILD_VERSION)); - } - - return new PlatformVersion(SemanticVersion.parse(versionString), commitId); - } - - /** - * Searches for a version descriptor using the {@link ClassLoader} specified by the {@code loader} argument. If no - * version descriptor is found, then a {@link InvalidSemanticVersionException} is thrown. - * - * @return an instance of {@link PlatformVersion} if a version descriptor was found. - * @throws IllegalArgumentException - * if the {@code loader} argument is a {@code null} reference. - * @throws InvalidSemanticVersionException - * if a version descriptor cannot be found or an exception occurs while reading the version descriptor. - */ - public static PlatformVersion fromClassLoader(@NonNull final ClassLoader loader) { - Objects.requireNonNull(loader, "loader must not be null"); - - try (final InputStream inputStream = loader.getResourceAsStream(GIT_PROPERTIES_FILE)) { - if (inputStream == null) { - throw new InvalidSemanticVersionException( - "Unable to locate a valid version descriptor via the ClassLoader"); - } - - return fromStream(inputStream); - } catch (final IOException e) { - throw new InvalidSemanticVersionException("Failed to read the version descriptor from the class path", e); - } - } - - /** - * Searches for a version descriptor using the {@link ClassLoader} of the {@link PlatformVersion} class. If no - * version descriptor is found, then a {@link InvalidSemanticVersionException} is thrown. - * - * @return an instance of {@link PlatformVersion} if a version descriptor was found. - * @throws InvalidSemanticVersionException - * if a version descriptor cannot be found or an exception occurs while reading the version descriptor. - */ - public static PlatformVersion locate() { - return locate(PlatformVersion.class); - } - - /** - * Searches for a version descriptor using the {@link ClassLoader} of the {@code sourceClass} argument. If no - * version descriptor is found, then a {@link InvalidSemanticVersionException} is thrown. - * - * @param sourceClass - * the class whose {@link ClassLoader} is used to search for the version descriptor. - * @return an instance of {@link PlatformVersion} if a version descriptor was found. - * @throws IllegalArgumentException - * if the {@code sourceClass} argument is a {@code null} reference. - * @throws InvalidSemanticVersionException - * if a version descriptor cannot be found or an exception occurs while reading the version descriptor. - */ - public static PlatformVersion locate(@NonNull final Class sourceClass) { - Objects.requireNonNull(sourceClass, "sourceClass must not be null"); - final ClassLoader classLoader = sourceClass.getClassLoader(); - return fromClassLoader(classLoader); - } - - /** - * Searches for a version descriptor using the {@link ClassLoader} of the {@link PlatformVersion} class. If no - * version descriptor is found, then the {@link #ZERO} value is returned. This method suppresses all - * exceptions encountered while searching for the version descriptor. - * - * @return an instance of {@link PlatformVersion} if a version descriptor was found; otherwise the - * {@code defaultVersion} value. - * @throws IllegalArgumentException - * if the {@code sourceClass} argument is a {@code null} reference. - */ - public static PlatformVersion locateOrDefault() { - return locateOrDefault(ZERO); - } - - /** - * Searches for a version descriptor using the {@link ClassLoader} of the {@link PlatformVersion} class. If no - * version descriptor is found, then the {@code defaultValue} argument is returned. This method suppresses all - * exceptions encountered while searching for the version descriptor. - * - * @param defaultVersion - * the value to be returned if a version descriptor was not found. - * @return an instance of {@link PlatformVersion} if a version descriptor was found; otherwise the - * {@code defaultVersion} value. - * @throws IllegalArgumentException - * if the {@code sourceClass} argument is a {@code null} reference. - */ - public static PlatformVersion locateOrDefault(final PlatformVersion defaultVersion) { - return locateOrDefault(PlatformVersion.class, defaultVersion); - } - - /** - * Searches for a version descriptor using the {@link ClassLoader} of the {@code sourceClass} argument. If no - * version descriptor is found, then the {@code defaultValue} argument is returned. This method suppresses all - * exceptions encountered while searching for the version descriptor. - * - * @param sourceClass - * the class whose {@link ClassLoader} is used to search for the version descriptor. - * @param defaultVersion - * the value to be returned if a version descriptor was not found. - * @return an instance of {@link PlatformVersion} if a version descriptor was found; otherwise the - * {@code defaultVersion} value. - * @throws IllegalArgumentException - * if the {@code sourceClass} argument is a {@code null} reference. - */ - @SuppressWarnings("squid:S1166") - public static PlatformVersion locateOrDefault( - @NonNull final Class sourceClass, final PlatformVersion defaultVersion) { - Objects.requireNonNull(sourceClass, "sourceClass must not be null"); - try { - return locate(sourceClass); - } catch (final InvalidSemanticVersionException ignored) { - return defaultVersion; - } - } - - /** - * Builds a license statement include the version number and commit id from a standard template. - * - * @return a multi-line string containing a license statement and version information. - * @see #LICENSE_TEMPLATE - */ - public String license() { - return String.format(LICENSE_TEMPLATE, versionNumber(), commit()); - } - - public SemanticVersion versionNumber() { - return versionNumber; - } - - public String commit() { - return commit; - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("versionNumber", versionNumber) - .append("commit", commit) - .toString(); - } - - @Override - public long getClassId() { - return CLASS_ID; - } - - @Override - public int getVersion() { - return ClassVersion.ORIGINAL; - } - - @Override - public void serialize(final SerializableDataOutputStream out) throws IOException { - out.writeSerializable(versionNumber, false); - out.writeNormalisedString(commit); - } - - @Override - public void deserialize(final SerializableDataInputStream in, final int version) throws IOException { - versionNumber = in.readSerializable(false, SemanticVersion::new); - commit = in.readNormalisedString(COMMIT_MAX_LENGTH); - } - - @Override - public int compareTo(final SoftwareVersion that) { - if (this == that) { - return 0; - } - - if (!(that instanceof PlatformVersion pv)) { - return -1; - } - - return Comparator.comparing(PlatformVersion::versionNumber) - .thenComparing(PlatformVersion::commit) - .compare(this, pv); - } -} From 7d5a629f361088a4b85649b3b552e9d4fee0cc81 Mon Sep 17 00:00:00 2001 From: Neeharika Sompalli <52669918+Neeharika-Sompalli@users.noreply.github.com> Date: Mon, 11 Dec 2023 09:34:00 -0600 Subject: [PATCH 05/13] chore: Enable `evmLazyCreateViaSolidityCallTooManyCreatesFails` HapiTest (#10341) Signed-off-by: Michael Tinker Co-authored-by: Michael Tinker --- .../workflows/handle/HandleContextImpl.java | 10 +- .../handle/record/RecordListBuilder.java | 8 +- .../handle/HandleContextImplTest.java | 16 ++- .../handle/record/RecordListBuilderTest.java | 24 ++-- .../contract/FailedLazyCreationXTest.java | 128 ++++++++++++++++++ .../xtest/java/contract/XTestConstants.java | 5 + .../initcode/NestedLazyCreateContract.bin | 1 + .../node/config/data/ConsensusConfig.java | 4 +- .../contract/impl/exec/FrameRunner.java | 12 +- .../failure/CustomExceptionalHaltReason.java | 5 +- .../CustomMessageCallProcessor.java | 10 +- .../scope/HandleHederaNativeOperations.java | 19 +-- .../impl/exec/utils/FrameBuilder.java | 5 +- .../contract/impl/exec/utils/FrameUtils.java | 41 +++--- .../utils/PropagatedCallFailureReference.java | 52 +++++++ .../impl/hevm/HevmPropagatedCallFailure.java | 60 ++++++++ .../impl/state/DispatchingEvmFrameState.java | 9 +- .../impl/test/exec/FrameRunnerTest.java | 16 ++- .../CustomExceptionalHaltReasonTest.java | 3 + .../HandleHederaNativeOperationsTest.java | 16 +-- .../state/DispatchingEvmFrameStateTest.java | 2 +- .../suites/leaky/LeakyContractTestsSuite.java | 1 + 22 files changed, 356 insertions(+), 91 deletions(-) create mode 100644 hedera-node/hedera-app/src/xtest/java/contract/FailedLazyCreationXTest.java create mode 100644 hedera-node/hedera-app/src/xtest/resources/initcode/NestedLazyCreateContract.bin create mode 100644 hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/PropagatedCallFailureReference.java create mode 100644 hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/hevm/HevmPropagatedCallFailure.java diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleContextImpl.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleContextImpl.java index 54c1b0ebead2..c3e4aa2cc76f 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleContextImpl.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleContextImpl.java @@ -542,11 +542,13 @@ public T doDispatchPrecedingTransaction( if (category != TransactionCategory.USER && category != TransactionCategory.CHILD) { throw new IllegalArgumentException("Only user- or child-transactions can dispatch preceding transactions"); } + // This condition fails, because for lazy-account creation we charge fees, before dispatching the transaction, + // and the state will be modified. - if (stack.depth() > 1) { - throw new IllegalStateException( - "Cannot dispatch a preceding transaction when a savepoint has been created"); - } + // if (stack.depth() > 1) { + // throw new IllegalStateException( + // "Cannot dispatch a preceding transaction when a savepoint has been created"); + // } // This condition fails, because for auto-account creation we charge fees, before dispatching the transaction, // and the state will be modified. diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/RecordListBuilder.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/RecordListBuilder.java index eb8ec8e849c6..5e824a5999a8 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/RecordListBuilder.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/RecordListBuilder.java @@ -212,7 +212,7 @@ public SingleTransactionRecordBuilderImpl addChild( @NonNull final Configuration configuration, @NonNull final HandleContext.TransactionCategory childCategory) { requireNonNull(configuration, CONFIGURATION_MUST_NOT_BE_NULL); - return doAddChild( + return doAddFollowingChild( configuration, ReversingBehavior.REVERSIBLE, NOOP_EXTERNALIZED_RECORD_CUSTOMIZER, childCategory); } @@ -230,7 +230,7 @@ public SingleTransactionRecordBuilderImpl addChild( */ public SingleTransactionRecordBuilderImpl addRemovableChild(@NonNull final Configuration configuration) { requireNonNull(configuration, CONFIGURATION_MUST_NOT_BE_NULL); - return doAddChild( + return doAddFollowingChild( configuration, ReversingBehavior.REMOVABLE, NOOP_EXTERNALIZED_RECORD_CUSTOMIZER, @@ -254,11 +254,11 @@ public SingleTransactionRecordBuilderImpl addRemovableChildWithExternalizationCu @NonNull final Configuration configuration, @NonNull final ExternalizedRecordCustomizer customizer) { requireNonNull(configuration, CONFIGURATION_MUST_NOT_BE_NULL); requireNonNull(customizer, "customizer must not be null"); - return doAddChild( + return doAddFollowingChild( configuration, ReversingBehavior.REMOVABLE, customizer, HandleContext.TransactionCategory.CHILD); } - private SingleTransactionRecordBuilderImpl doAddChild( + private SingleTransactionRecordBuilderImpl doAddFollowingChild( @NonNull final Configuration configuration, final ReversingBehavior reversingBehavior, @NonNull final ExternalizedRecordCustomizer customizer, diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleContextImplTest.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleContextImplTest.java index 08bfb8eb1dfe..ef1642f64138 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleContextImplTest.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleContextImplTest.java @@ -1047,23 +1047,25 @@ void testDispatchPrecedingWithNonUserTxnFails(final TransactionCategory category @Test void testDispatchPrecedingWithNonEmptyStackDoesntFail() { // given + given(networkInfo.selfNodeInfo()).willReturn(selfNodeInfo); + given(selfNodeInfo.nodeId()).willReturn(0L); final var context = createContext(defaultTransactionBody(), TransactionCategory.USER); stack.createSavepoint(); // then - assertThatThrownBy(() -> context.dispatchPrecedingTransaction( + assertThatNoException() + .isThrownBy(() -> context.dispatchPrecedingTransaction( defaultTransactionBody(), SingleTransactionRecordBuilder.class, VERIFIER_CALLBACK, - AccountID.DEFAULT)) - .isInstanceOf(IllegalStateException.class); - assertThatThrownBy(() -> context.dispatchReversiblePrecedingTransaction( + AccountID.DEFAULT)); + assertThatNoException() + .isThrownBy(() -> context.dispatchReversiblePrecedingTransaction( defaultTransactionBody(), SingleTransactionRecordBuilder.class, VERIFIER_CALLBACK, - AccountID.DEFAULT)) - .isInstanceOf(IllegalStateException.class); - verify(recordListBuilder, never()).addPreceding(any(), eq(LIMITED_CHILD_RECORDS)); + AccountID.DEFAULT)); + verify(recordListBuilder, never()).addRemovablePreceding(any()); verify(dispatcher, never()).dispatchHandle(any()); assertThat(stack.createReadableStates(FOOD_SERVICE) .get(FRUIT_STATE_KEY) diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/record/RecordListBuilderTest.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/record/RecordListBuilderTest.java index 041a9ab9aa84..dc8313b6ff9c 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/record/RecordListBuilderTest.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/record/RecordListBuilderTest.java @@ -48,8 +48,8 @@ class RecordListBuilderTest extends AppTestBase { private static final long MAX_CHILDREN = 10; private static final Configuration CONFIGURATION = HederaTestConfigBuilder.create() - .withValue("consensus.message.maxPrecedingRecords", MAX_PRECEDING) - .withValue("consensus.message.maxFollowingRecords", MAX_CHILDREN) + .withValue("consensus.handle.maxPrecedingRecords", MAX_PRECEDING) + .withValue("consensus.handle.maxFollowingRecords", MAX_CHILDREN) .getOrCreateConfig(); private static final int EXPECTED_CHILD_NANO_INCREMENT = 0; private static final int EXPECTED_CHILD_NANO_INCREMENT_SCHEDULED = @@ -138,8 +138,8 @@ void testAddTooManyPrecedingRecordsFails() { // given final var maxPreceding = 2L; final var config = HederaTestConfigBuilder.create() - .withValue("consensus.message.maxPrecedingRecords", maxPreceding) - .withValue("consensus.message.maxFollowingRecords", MAX_CHILDREN) + .withValue("consensus.handle.maxPrecedingRecords", maxPreceding) + .withValue("consensus.handle.maxFollowingRecords", MAX_CHILDREN) .getOrCreateConfig(); final var consensusTime = Instant.now(); final var recordListBuilder = new RecordListBuilder(consensusTime); @@ -242,8 +242,8 @@ void testAddTooManyReversiblePrecedingRecordsFails() { // given final var maxPreceding = 2L; final var config = HederaTestConfigBuilder.create() - .withValue("consensus.message.maxPrecedingRecords", maxPreceding) - .withValue("consensus.message.maxFollowingRecords", MAX_CHILDREN) + .withValue("consensus.handle.maxPrecedingRecords", maxPreceding) + .withValue("consensus.handle.maxFollowingRecords", MAX_CHILDREN) .getOrCreateConfig(); final var consensusTime = Instant.now(); final var recordListBuilder = new RecordListBuilder(consensusTime); @@ -356,8 +356,8 @@ void testRevertMultipleMixedPreceding() { // given final var maxPreceding = 4L; final var config = HederaTestConfigBuilder.create() - .withValue("consensus.message.maxPrecedingRecords", maxPreceding) - .withValue("consensus.message.maxFollowingRecords", MAX_CHILDREN) + .withValue("consensus.handle.maxPrecedingRecords", maxPreceding) + .withValue("consensus.handle.maxFollowingRecords", MAX_CHILDREN) .getOrCreateConfig(); final var consensusTime = Instant.now(); final var recordListBuilder = new RecordListBuilder(consensusTime); @@ -452,8 +452,8 @@ void testAddTooManyChildrenFails() { // given final var maxChildren = 2L; final var config = HederaTestConfigBuilder.create() - .withValue("consensus.message.maxPrecedingRecords", MAX_PRECEDING) - .withValue("consensus.message.maxFollowingRecords", maxChildren) + .withValue("consensus.handle.maxPrecedingRecords", MAX_PRECEDING) + .withValue("consensus.handle.maxFollowingRecords", maxChildren) .getOrCreateConfig(); final var consensusTime = Instant.now(); final var recordListBuilder = new RecordListBuilder(consensusTime); @@ -681,8 +681,8 @@ void testAddTooManyRemovableChildrenFails() { // given final var maxChildren = 2L; final var config = HederaTestConfigBuilder.create() - .withValue("consensus.message.maxPrecedingRecords", MAX_PRECEDING) - .withValue("consensus.message.maxFollowingRecords", maxChildren) + .withValue("consensus.handle.maxPrecedingRecords", MAX_PRECEDING) + .withValue("consensus.handle.maxFollowingRecords", maxChildren) .getOrCreateConfig(); final var consensusTime = Instant.now(); final var recordListBuilder = new RecordListBuilder(consensusTime); diff --git a/hedera-node/hedera-app/src/xtest/java/contract/FailedLazyCreationXTest.java b/hedera-node/hedera-app/src/xtest/java/contract/FailedLazyCreationXTest.java new file mode 100644 index 000000000000..026fd304083a --- /dev/null +++ b/hedera-node/hedera-app/src/xtest/java/contract/FailedLazyCreationXTest.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * 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. + */ + +package contract; + +import static com.hedera.hapi.node.base.ResponseCodeEnum.MAX_CHILD_RECORDS_EXCEEDED; +import static com.hedera.node.app.service.contract.impl.ContractServiceImpl.CONTRACT_SERVICE; +import static contract.XTestConstants.COINBASE_ID; +import static contract.XTestConstants.LAZY_CREATE_TARGET_1_HEADLONG_ADDRESS; +import static contract.XTestConstants.LAZY_CREATE_TARGET_2_HEADLONG_ADDRESS; +import static contract.XTestConstants.SENDER_ID; + +import com.esaulpaugh.headlong.abi.Address; +import com.esaulpaugh.headlong.abi.Function; +import com.hedera.hapi.node.base.AccountID; +import com.hedera.hapi.node.base.ContractID; +import com.hedera.hapi.node.base.FileID; +import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.contract.ContractCallTransactionBody; +import com.hedera.hapi.node.contract.ContractCreateTransactionBody; +import com.hedera.hapi.node.state.file.File; +import com.hedera.hapi.node.state.primitives.ProtoBytes; +import com.hedera.hapi.node.state.token.Account; +import com.hedera.hapi.node.transaction.TransactionBody; +import com.hedera.node.app.service.contract.impl.exec.processors.CustomMessageCallProcessor; +import com.hedera.node.config.testfixtures.HederaTestConfigBuilder; +import com.hedera.pbj.runtime.io.buffer.Bytes; +import com.swirlds.config.api.Configuration; +import java.util.HashMap; +import java.util.Map; + +/** + * Test verifying behavior of the {@link CustomMessageCallProcessor} when a lazy-creation fails + * due to insufficient preceding child records. + */ +public class FailedLazyCreationXTest extends AbstractContractXTest { + private static final long NEXT_ENTITY_NUM = 1234L; + private static final long GAS = 6_000_000L; + private static final FileID NESTED_LAZY_CREATE_CONTRACT_INITCODE_ID = + FileID.newBuilder().fileNum(1002L).build(); + private static final Function CREATE_TOO_MANY_HOLLOW_ACCOUNTS = + new Function("createTooManyHollowAccounts(address[])"); + + @Override + protected void doScenarioOperations() { + handleAndCommitSingleTransaction(CONTRACT_SERVICE.handlers().contractCreateHandler(), synthCreateTxn()); + handleAndCommitSingleTransaction( + CONTRACT_SERVICE.handlers().contractCallHandler(), synthCallTxn(), MAX_CHILD_RECORDS_EXCEEDED); + } + + private TransactionBody synthCallTxn() { + return TransactionBody.newBuilder() + .transactionID(TransactionID.newBuilder().accountID(SENDER_ID)) + .contractCall(ContractCallTransactionBody.newBuilder() + .contractID(ContractID.newBuilder() + .contractNum(NEXT_ENTITY_NUM) + .build()) + .gas(GAS) + .amount(1000L) + .functionParameters(Bytes.wrap(CREATE_TOO_MANY_HOLLOW_ACCOUNTS + .encodeCallWithArgs((Object) new Address[] { + LAZY_CREATE_TARGET_1_HEADLONG_ADDRESS, LAZY_CREATE_TARGET_2_HEADLONG_ADDRESS + }) + .array())) + .build()) + .build(); + } + + private TransactionBody synthCreateTxn() { + return TransactionBody.newBuilder() + .transactionID(TransactionID.newBuilder().accountID(SENDER_ID)) + .contractCreateInstance(ContractCreateTransactionBody.newBuilder() + .autoRenewPeriod(STANDARD_AUTO_RENEW_PERIOD) + .fileID(NESTED_LAZY_CREATE_CONTRACT_INITCODE_ID) + .gas(GAS) + .build()) + .build(); + } + + @Override + protected Configuration configuration() { + // Override to set the max number of preceding children to 1 + return HederaTestConfigBuilder.create() + .withValue("consensus.handle.maxPrecedingRecords", "1") + .getOrCreateConfig(); + } + + @Override + protected long initialEntityNum() { + return NEXT_ENTITY_NUM - 1; + } + + @Override + protected Map initialFiles() { + final var files = new HashMap(); + files.put( + NESTED_LAZY_CREATE_CONTRACT_INITCODE_ID, + File.newBuilder() + .contents(resourceAsBytes("initcode/NestedLazyCreateContract.bin")) + .build()); + return files; + } + + @Override + protected Map initialAliases() { + return withSenderAddress(new HashMap<>()); + } + + @Override + protected Map initialAccounts() { + final var accounts = withSenderAccount(new HashMap<>()); + accounts.put(COINBASE_ID, Account.newBuilder().accountId(COINBASE_ID).build()); + return accounts; + } +} diff --git a/hedera-node/hedera-app/src/xtest/java/contract/XTestConstants.java b/hedera-node/hedera-app/src/xtest/java/contract/XTestConstants.java index c47dee7366d0..e0ec69745af8 100644 --- a/hedera-node/hedera-app/src/xtest/java/contract/XTestConstants.java +++ b/hedera-node/hedera-app/src/xtest/java/contract/XTestConstants.java @@ -36,6 +36,7 @@ import com.hedera.hapi.node.transaction.TransactionBody; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes; import com.hedera.pbj.runtime.io.buffer.Bytes; +import com.swirlds.common.utility.CommonUtils; import java.util.Map; import java.util.function.Consumer; import org.hyperledger.besu.datatypes.Address; @@ -82,6 +83,10 @@ public class XTestConstants { .build(); public static final com.esaulpaugh.headlong.abi.Address RECEIVER_HEADLONG_ADDRESS = asHeadlongAddress(asEvmAddress(RECEIVER_ID.accountNumOrThrow())); + public static final com.esaulpaugh.headlong.abi.Address LAZY_CREATE_TARGET_1_HEADLONG_ADDRESS = + asHeadlongAddress(CommonUtils.unhex("abcdef1234567890abcdef1234567890abcdef12")); + public static final com.esaulpaugh.headlong.abi.Address LAZY_CREATE_TARGET_2_HEADLONG_ADDRESS = + asHeadlongAddress(CommonUtils.unhex("aaaaaa1234567890bbbbbb1234567890cccccc12")); public static final Address RECEIVER_BESU_ADDRESS = pbjToBesuAddress(Bytes.wrap(asEvmAddress(RECEIVER_ID.accountNumOrThrow()))); public static final TokenID ERC721_TOKEN_ID = diff --git a/hedera-node/hedera-app/src/xtest/resources/initcode/NestedLazyCreateContract.bin b/hedera-node/hedera-app/src/xtest/resources/initcode/NestedLazyCreateContract.bin new file mode 100644 index 000000000000..f6ae6d9d55cc --- /dev/null +++ b/hedera-node/hedera-app/src/xtest/resources/initcode/NestedLazyCreateContract.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b6102618061148183390190565b6114068061007b6000396000f3fe6080604052600436106100a75760003560e01c80638f8d7f99116100645780638f8d7f99146101955780639f1cddfc146101b5578063aa3ed908146101c8578063af99c633146101db578063d614cdb8146101fb578063f2c31ff41461022957600080fd5b80632c523dd3146100ac5780633b3bff0f146100c15780633c4dd32e146100f4578063593d6e82146101225780636fc3cbaf146101425780637c41ad2c14610175575b600080fd5b6100bf6100ba366004610ab2565b610263565b005b3480156100cd57600080fd5b506100e16100dc366004610ab2565b610422565b6040519081526020015b60405180910390f35b34801561010057600080fd5b5061011461010f366004610ae6565b6104fc565b6040516100eb929190610bd9565b34801561012e57600080fd5b506100e161013d366004610cc5565b6105e3565b34801561014e57600080fd5b5061016261015d366004610df2565b6106c0565b60405160079190910b81526020016100eb565b34801561018157600080fd5b506100e1610190366004610ab2565b6106ec565b3480156101a157600080fd5b506101626101b0366004610f8f565b61071a565b6100bf6101c3366004610ab2565b610750565b6100bf6101d6366004610fc8565b6107b4565b3480156101e757600080fd5b506101626101f6366004610f8f565b61084c565b34801561020757600080fd5b5061021b610216366004610ab2565b610882565b6040516100eb929190611062565b34801561023557600080fd5b50610249610244366004610f8f565b61098c565b6040805160079390930b83529015156020830152016100eb565b6000546001600160a01b03166399047f0261027f60023461109c565b6040516001600160e01b031960e084901b1681526001600160a01b03851660048201526024016000604051808303818588803b1580156102be57600080fd5b505af11580156102d2573d6000803e3d6000fd5b50505050506000816001600160a01b03166004346102f0919061109c565b604051600081818185875af1925050503d806000811461032c576040519150601f19603f3d011682016040523d82523d6000602084013e610331565b606091505b505090508061037e5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064015b60405180910390fd5b6001600160a01b03821661039360043461109c565b604051600081818185875af1925050503d80600081146103cf576040519150601f19603f3d011682016040523d82523d6000602084013e6103d4565b606091505b5050809150508061041e5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610375565b5050565b6040516001600160a01b03821660248201526000908190819061016790633b3bff0f60e01b906044015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161048a91906110be565b6000604051808303816000865af19150503d80600081146104c7576040519150601f19603f3d011682016040523d82523d6000602084013e6104cc565b606091505b5091509150816104dd5760156104f1565b808060200190518101906104f191906110ec565b60030b949350505050565b6000610506610a57565b604080516001600160a01b0386166024820152604480820186905282518083039091018152606490910182526020810180516001600160e01b0316631e26e99760e11b1790529051600091829161016791610560916110be565b6000604051808303816000865af19150503d806000811461059d576040519150601f19603f3d011682016040523d82523d6000602084013e6105a2565b606091505b50915091506105af610a57565b826105bc576015816105d0565b818060200190518101906105d09190611157565b60039190910b9890975095505050505050565b60008060006101676001600160a01b031663593d6e8260e01b868660405160240161060f929190611232565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161064d91906110be565b6000604051808303816000865af19150503d806000811461068a576040519150601f19603f3d011682016040523d82523d6000602084013e61068f565b606091505b5091509150816106a05760156106b4565b808060200190518101906106b491906110ec565b60030b95945050505050565b60008060006101676001600160a01b0316636fc3cbaf60e01b868660405160240161060f929190611275565b6040516001600160a01b03821660248201526000908190819061016790631f106b4b60e21b9060440161044c565b6040516001600160a01b038381166024830152821660448201526000908190819061016790638f8d7f9960e01b9060640161060f565b600054604051632c165ac560e21b81526001600160a01b0383811660048301529091169063b0596b149034906024016000604051808303818588803b15801561079857600080fd5b505af11580156107ac573d6000803e3d6000fd5b505050505050565b805160005b81811015610847578281815181106107d3576107d36112fa565b60200260200101516001600160a01b031682346107f0919061109c565b604051600081818185875af1925050503d806000811461082c576040519150601f19603f3d011682016040523d82523d6000602084013e610831565b606091505b505050808061083f90611310565b9150506107b9565b505050565b6040516001600160a01b03838116602483015282166044820152600090819081906101679063af99c63360e01b9060640161060f565b604080516060810182526000808252602080830182905282840182905283516001600160a01b038616602480830191909152855180830390910181526044909101855290810180516001600160e01b0316631ac299b760e31b1790529251909283918291610167916108f491906110be565b6000604051808303816000865af19150503d8060008114610931576040519150601f19603f3d011682016040523d82523d6000602084013e610936565b606091505b5060408051606081018252600080825260208201819052918101919091529193509150826109665760158161097a565b8180602001905181019061097a9190611339565b60039190910b97909650945050505050565b604080516001600160a01b038481166024830152831660448083019190915282518083039091018152606490910182526020810180516001600160e01b0316633cb0c7fd60e21b1790529051600091829182918291610167916109ee916110be565b6000604051808303816000865af19150503d8060008114610a2b576040519150601f19603f3d011682016040523d82523d6000602084013e610a30565b606091505b509150915081610a43576015600061097a565b8080602001905181019061097a91906113a4565b6040518060a0016040528060001515815260200160006001600160a01b03168152602001606081526020016060815260200160006001600160a01b031681525090565b6001600160a01b0381168114610aaf57600080fd5b50565b600060208284031215610ac457600080fd5b8135610acf81610a9a565b9392505050565b8035610ae181610a9a565b919050565b60008060408385031215610af957600080fd5b8235610b0481610a9a565b946020939093013593505050565b60005b83811015610b2d578181015183820152602001610b15565b83811115610b3c576000848401525b50505050565b60008151808452610b5a816020860160208601610b12565b601f01601f19169290920160200192915050565b805115158252600060208201516001600160a01b0380821660208601526040840151915060a06040860152610ba660a0860183610b42565b915060608401518583036060870152610bbf8382610b42565b925050806080850151166080860152508091505092915050565b8260070b8152604060208201526000610bf56040830184610b6e565b949350505050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610c3657610c36610bfd565b60405290565b6040805190810167ffffffffffffffff81118282101715610c3657610c36610bfd565b60405160a0810167ffffffffffffffff81118282101715610c3657610c36610bfd565b604051601f8201601f1916810167ffffffffffffffff81118282101715610cab57610cab610bfd565b604052919050565b63ffffffff81168114610aaf57600080fd5b6000808284036080811215610cd957600080fd5b8335610ce481610a9a565b92506060601f1982011215610cf857600080fd5b50610d01610c13565b6020840135610d0f81610cb3565b81526040840135610d1f81610a9a565b60208201526060840135610d3281610cb3565b6040820152919491935090915050565b600067ffffffffffffffff821115610d5c57610d5c610bfd565b5060051b60200190565b8015158114610aaf57600080fd5b600067ffffffffffffffff821115610d8e57610d8e610bfd565b50601f01601f191660200190565b600082601f830112610dad57600080fd5b8135610dc0610dbb82610d74565b610c82565b818152846020838601011115610dd557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215610e0557600080fd5b610e0f8335610a9a565b82359150602083013567ffffffffffffffff80821115610e2e57600080fd5b818501915085601f830112610e4257600080fd5b610e4f610dbb8335610d42565b82358082526020808301929160051b85010188811115610e6e57600080fd5b602085015b81811015610f80578481351115610e8957600080fd5b80358601601f196040828d0382011215610ea257600080fd5b610eaa610c3c565b60208301358152604083013588811115610ec357600080fd5b929092019160a0838e0383011215610eda57600080fd5b610ee2610c5f565b91506020830135610ef281610d66565b82526040830135610f0281610a9a565b6020830152606083013588811115610f1957600080fd5b610f288e602083870101610d9c565b604084015250608083013588811115610f4057600080fd5b610f4f8e602083870101610d9c565b606084015250610f6160a08401610ad6565b6080830152602081810192909252865294850194919091019050610e73565b50959890975095505050505050565b60008060408385031215610fa257600080fd5b8235610fad81610a9a565b91506020830135610fbd81610a9a565b809150509250929050565b60006020808385031215610fdb57600080fd5b823567ffffffffffffffff811115610ff257600080fd5b8301601f8101851361100357600080fd5b8035611011610dbb82610d42565b81815260059190911b8201830190838101908783111561103057600080fd5b928401925b8284101561105757833561104881610a9a565b82529284019290840190611035565b979650505050505050565b82815260808101610acf6020830184805163ffffffff90811683526020808301516001600160a01b03169084015260409182015116910152565b6000826110b957634e487b7160e01b600052601260045260246000fd5b500490565b600082516110d0818460208701610b12565b9190910192915050565b8051600381900b8114610ae157600080fd5b6000602082840312156110fe57600080fd5b610acf826110da565b8051610ae181610a9a565b600082601f83011261112357600080fd5b8151611131610dbb82610d74565b81815284602083860101111561114657600080fd5b610bf5826020830160208701610b12565b6000806040838503121561116a57600080fd5b611173836110da565b9150602083015167ffffffffffffffff8082111561119057600080fd5b9084019060a082870312156111a457600080fd5b6111ac610c5f565b82516111b781610d66565b815260208301516111c781610a9a565b60208201526040830151828111156111de57600080fd5b6111ea88828601611112565b60408301525060608301518281111561120257600080fd5b61120e88828601611112565b60608301525061122060808401611107565b60808201528093505050509250929050565b6001600160a01b038316815260808101610acf6020830184805163ffffffff90811683526020808301516001600160a01b03169084015260409182015116910152565b600060408083016001600160a01b03861684526020828186015281865180845260608701915060608160051b880101935082880160005b828110156112eb57888603605f190184528151805187528501518587018890526112d888880182610b6e565b96505092840192908401906001016112ac565b50939998505050505050505050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561133257634e487b7160e01b600052601160045260246000fd5b5060010190565b600080828403608081121561134d57600080fd5b611356846110da565b92506060601f198201121561136a57600080fd5b50611373610c13565b602084015161138181610cb3565b8152604084015161139181610a9a565b60208201526060840151610d3281610cb3565b600080604083850312156113b757600080fd5b6113c0836110da565b91506020830151610fbd81610d6656fea26469706673582212207435d0e6b25239cdb110932d182b35dcd72565d4edc952e5510e3324567b838564736f6c634300080b0033608060405234801561001057600080fd5b50610241806100206000396000f3fe6080604052600436106100295760003560e01c806399047f021461002e578063b0596b1414610043575b600080fd5b61004161003c3660046101db565b610056565b005b6100416100513660046101db565b6100f9565b6000816001600160a01b03163460405160006040518083038185875af1925050503d80600081146100a3576040519150601f19603f3d011682016040523d82523d6000602084013e6100a8565b606091505b50509050806100f55760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064015b60405180910390fd5b5050565b6000816001600160a01b03163460405160006040518083038185875af1925050503d8060008114610146576040519150601f19603f3d011682016040523d82523d6000602084013e61014b565b606091505b50509050806101935760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016100ec565b60405162461bcd60e51b815260206004820152601860248201527f536f7272792c206e6f7420676f6e6e612068617070656e21000000000000000060448201526064016100ec565b6000602082840312156101ed57600080fd5b81356001600160a01b038116811461020457600080fd5b939250505056fea2646970667358221220887447e0f30c5ca0dac71367b4e2e1271a08775a447ad6fb03c8a22ee29d43de64736f6c634300080b0033 \ No newline at end of file diff --git a/hedera-node/hedera-config/src/main/java/com/hedera/node/config/data/ConsensusConfig.java b/hedera-node/hedera-config/src/main/java/com/hedera/node/config/data/ConsensusConfig.java index 22b34c119d7d..a34af89aa4f3 100644 --- a/hedera-node/hedera-config/src/main/java/com/hedera/node/config/data/ConsensusConfig.java +++ b/hedera-node/hedera-config/src/main/java/com/hedera/node/config/data/ConsensusConfig.java @@ -24,7 +24,7 @@ public record ConsensusConfig( @ConfigProperty(value = "message.maxBytesAllowed", defaultValue = "1024") @NetworkProperty int messageMaxBytesAllowed, - @ConfigProperty(value = "message.maxPrecedingRecords", defaultValue = "3") @NetworkProperty + @ConfigProperty(value = "handle.maxPrecedingRecords", defaultValue = "3") @NetworkProperty long handleMaxPrecedingRecords, - @ConfigProperty(value = "message.maxFollowingRecords", defaultValue = "50") @NetworkProperty + @ConfigProperty(value = "handle.maxFollowingRecords", defaultValue = "50") @NetworkProperty long handleMaxFollowingRecords) {} diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/FrameRunner.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/FrameRunner.java index 36f47abf6f4a..fcd096f2fe69 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/FrameRunner.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/FrameRunner.java @@ -16,14 +16,13 @@ package com.hedera.node.app.service.contract.impl.exec; -import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.INVALID_SIGNATURE; -import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.clearMessageCallHaltedForMissingReceiverSigReq; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.contractsConfigOf; +import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.getAndClearPropagatedCallFailure; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.maybeNext; -import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.messageCallHaltedForMissingReceiverSigReq; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.proxyUpdaterFor; import static com.hedera.node.app.service.contract.impl.hevm.HederaEvmTransactionResult.failureFrom; import static com.hedera.node.app.service.contract.impl.hevm.HederaEvmTransactionResult.successFrom; +import static com.hedera.node.app.service.contract.impl.hevm.HevmPropagatedCallFailure.NONE; import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asEvmContractId; import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asNumberedContractId; import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.isLongZero; @@ -39,7 +38,6 @@ import com.hedera.node.app.service.contract.impl.hevm.HederaEvmTransactionResult; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; -import java.util.Optional; import javax.inject.Inject; import javax.inject.Singleton; import org.hyperledger.besu.datatypes.Address; @@ -132,7 +130,6 @@ private void runToCompletion( @NonNull final ActionSidecarContentTracer tracer, @NonNull final CustomMessageCallProcessor messageCall, @NonNull final ContractCreationProcessor contractCreation) { - clearMessageCallHaltedForMissingReceiverSigReq(frame); final var executor = switch (frame.getType()) { case MESSAGE_CALL -> messageCall; @@ -142,10 +139,11 @@ private void runToCompletion( // For mono-service compatibility, we need to also halt the frame on the stack that // executed the CALL operation whose dispatched frame failed due to a missing receiver // signature; since mono-service did that check as part of the CALL operation itself - if (messageCallHaltedForMissingReceiverSigReq(frame)) { + final var maybeFailureToPropagate = getAndClearPropagatedCallFailure(frame); + if (maybeFailureToPropagate != NONE) { maybeNext(frame).ifPresent(f -> { f.setState(EXCEPTIONAL_HALT); - f.setExceptionalHaltReason(Optional.of(INVALID_SIGNATURE)); + f.setExceptionalHaltReason(maybeFailureToPropagate.exceptionalHaltReason()); }); } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/failure/CustomExceptionalHaltReason.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/failure/CustomExceptionalHaltReason.java index beb857ec7349..29483b6ab390 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/failure/CustomExceptionalHaltReason.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/failure/CustomExceptionalHaltReason.java @@ -33,7 +33,8 @@ public enum CustomExceptionalHaltReason implements ExceptionalHaltReason { FAILURE_DURING_LAZY_ACCOUNT_CREATION("Failure during lazy account creation"), NOT_SUPPORTED("Not supported."), CONTRACT_ENTITY_LIMIT_REACHED("Contract entity limit reached."), - INVALID_FEE_SUBMITTED("Invalid fee submitted for an EVM call."); + INVALID_FEE_SUBMITTED("Invalid fee submitted for an EVM call."), + INSUFFICIENT_CHILD_RECORDS("Result cannot be externalized due to insufficient child records"); private final String description; @@ -66,6 +67,8 @@ public static ResponseCodeEnum statusFor(@NonNull final ExceptionalHaltReason re return ResponseCodeEnum.INSUFFICIENT_GAS; } else if (reason == ExceptionalHaltReason.ILLEGAL_STATE_CHANGE) { return ResponseCodeEnum.LOCAL_CALL_MODIFICATION_EXCEPTION; + } else if (reason == CustomExceptionalHaltReason.INSUFFICIENT_CHILD_RECORDS) { + return ResponseCodeEnum.MAX_CHILD_RECORDS_EXCEEDED; } else { return ResponseCodeEnum.CONTRACT_EXECUTION_EXCEPTION; } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/processors/CustomMessageCallProcessor.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/processors/CustomMessageCallProcessor.java index 25be31e0c2f9..b95c2599eb72 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/processors/CustomMessageCallProcessor.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/processors/CustomMessageCallProcessor.java @@ -16,12 +16,15 @@ package com.hedera.node.app.service.contract.impl.exec.processors; +import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.INSUFFICIENT_CHILD_RECORDS; import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.INVALID_FEE_SUBMITTED; import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.INVALID_SIGNATURE; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.acquiredSenderAuthorizationViaDelegateCall; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.alreadyHalted; -import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.setMessageCallHaltedForMissingReceiverSigReq; +import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.setPropagatedCallFailure; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.transfersValue; +import static com.hedera.node.app.service.contract.impl.hevm.HevmPropagatedCallFailure.MISSING_RECEIVER_SIGNATURE; +import static com.hedera.node.app.service.contract.impl.hevm.HevmPropagatedCallFailure.RESULT_CANNOT_BE_EXTERNALIZED; import static org.hyperledger.besu.evm.frame.ExceptionalHaltReason.INSUFFICIENT_GAS; import static org.hyperledger.besu.evm.frame.ExceptionalHaltReason.PRECOMPILE_ERROR; import static org.hyperledger.besu.evm.frame.MessageFrame.State.EXCEPTIONAL_HALT; @@ -216,7 +219,7 @@ private void doTransferValueOrHalt( acquiredSenderAuthorizationViaDelegateCall(frame)); maybeReasonToHalt.ifPresent(reason -> { if (reason == INVALID_SIGNATURE) { - setMessageCallHaltedForMissingReceiverSigReq(frame); + setPropagatedCallFailure(frame, MISSING_RECEIVER_SIGNATURE); } doHalt(frame, reason, operationTracer); }); @@ -261,6 +264,9 @@ private void doHalt( frame.setExceptionalHaltReason(Optional.of(reason)); if (forLazyCreation == ForLazyCreation.YES) { frame.decrementRemainingGas(frame.getRemainingGas()); + if (reason == INSUFFICIENT_CHILD_RECORDS) { + setPropagatedCallFailure(frame, RESULT_CANNOT_BE_EXTERNALIZED); + } } if (operationTracer != null) { if (forLazyCreation == ForLazyCreation.YES) { diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/HandleHederaNativeOperations.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/HandleHederaNativeOperations.java index adeb6c6b83c5..b2496737a86e 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/HandleHederaNativeOperations.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/HandleHederaNativeOperations.java @@ -18,9 +18,7 @@ import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_SIGNATURE; import static com.hedera.hapi.node.base.ResponseCodeEnum.OK; -import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; import static com.hedera.node.app.service.contract.impl.utils.SynthTxnUtils.synthHollowAccountCreation; -import static com.hedera.node.app.spi.workflows.HandleContext.TransactionCategory.CHILD; import static java.util.Objects.requireNonNull; import com.hedera.hapi.node.base.AccountID; @@ -35,6 +33,7 @@ import com.hedera.node.app.service.token.api.TokenServiceApi; import com.hedera.node.app.service.token.records.CryptoCreateRecordBuilder; import com.hedera.node.app.spi.workflows.HandleContext; +import com.hedera.node.app.spi.workflows.HandleException; import com.hedera.pbj.runtime.io.buffer.Bytes; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; @@ -103,13 +102,17 @@ public void setNonce(final long contractNumber, final long nonce) { .build(); // Note the use of the null "verification assistant" callback; we don't want any // signing requirements enforced for this synthetic transaction - final var childRecordBuilder = context.dispatchChildTransaction( - synthTxn, CryptoCreateRecordBuilder.class, null, context.payer(), CHILD); - // FUTURE - switch OK to SUCCESS once some status-setting responsibilities are clarified - if (childRecordBuilder.status() != OK && childRecordBuilder.status() != SUCCESS) { - throw new AssertionError("Not implemented"); + try { + return context.dispatchRemovablePrecedingTransaction( + synthTxn, CryptoCreateRecordBuilder.class, null, context.payer()) + .status(); + } catch (final HandleException e) { + // It is critically important we don't let HandleExceptions propagate to the workflow because + // it doesn't rollback for contract operations so we can commit gas charges; that is, the + // EVM transaction should always either run to completion or (if it must) throw an internal + // failure like an IllegalArgumentException---but not a HandleException! + return e.getStatus(); } - return OK; } /** diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/FrameBuilder.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/FrameBuilder.java index 12705d316020..b5110e91ad45 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/FrameBuilder.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/FrameBuilder.java @@ -19,7 +19,7 @@ import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_ETHEREUM_TRANSACTION; import static com.hedera.hapi.streams.SidecarType.CONTRACT_STATE_CHANGE; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.CONFIG_CONTEXT_VARIABLE; -import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.RECEIVER_SIG_REQ_FAILURE_CONTEXT_VARIABLE; +import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.PROPAGATED_CALL_FAILURE_CONTEXT_VARIABLE; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.SYSTEM_CONTRACT_GAS_CALCULATOR_CONTEXT_VARIABLE; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.TINYBAR_VALUES_CONTEXT_VARIABLE; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.TRACKER_CONTEXT_VARIABLE; @@ -35,7 +35,6 @@ import com.swirlds.config.api.Configuration; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; import javax.inject.Inject; import javax.inject.Singleton; import org.apache.tuweni.bytes.Bytes; @@ -121,7 +120,7 @@ private Map contextVariablesFrom( contextEntries[1] = Map.entry(TINYBAR_VALUES_CONTEXT_VARIABLE, context.tinybarValues()); contextEntries[2] = Map.entry(SYSTEM_CONTRACT_GAS_CALCULATOR_CONTEXT_VARIABLE, context.systemContractGasCalculator()); - contextEntries[3] = Map.entry(RECEIVER_SIG_REQ_FAILURE_CONTEXT_VARIABLE, new AtomicBoolean()); + contextEntries[3] = Map.entry(PROPAGATED_CALL_FAILURE_CONTEXT_VARIABLE, new PropagatedCallFailureReference()); if (needsStorageTracker) { contextEntries[4] = Map.entry(TRACKER_CONTEXT_VARIABLE, new StorageAccessTracker()); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/FrameUtils.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/FrameUtils.java index 5e5d31b6978b..a29639c5410d 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/FrameUtils.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/FrameUtils.java @@ -23,6 +23,7 @@ import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; import com.hedera.node.app.service.contract.impl.exec.gas.TinybarValues; import com.hedera.node.app.service.contract.impl.exec.processors.CustomMessageCallProcessor; +import com.hedera.node.app.service.contract.impl.hevm.HevmPropagatedCallFailure; import com.hedera.node.app.service.contract.impl.infra.StorageAccessTracker; import com.hedera.node.app.service.contract.impl.state.ProxyWorldUpdater; import com.hedera.node.app.service.contract.impl.utils.ConversionUtils; @@ -31,7 +32,6 @@ import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; import java.util.Optional; -import java.util.concurrent.atomic.AtomicBoolean; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.evm.frame.MessageFrame; @@ -39,7 +39,7 @@ public class FrameUtils { public static final String CONFIG_CONTEXT_VARIABLE = "contractsConfig"; public static final String TRACKER_CONTEXT_VARIABLE = "storageAccessTracker"; public static final String TINYBAR_VALUES_CONTEXT_VARIABLE = "tinybarValues"; - public static final String RECEIVER_SIG_REQ_FAILURE_CONTEXT_VARIABLE = "receiverSigRequiredFailed"; + public static final String PROPAGATED_CALL_FAILURE_CONTEXT_VARIABLE = "propagatedCallFailure"; public static final String SYSTEM_CONTRACT_GAS_CALCULATOR_CONTEXT_VARIABLE = "systemContractGasCalculator"; private FrameUtils() { @@ -72,38 +72,33 @@ public static boolean hasValidatedActionSidecarsEnabled(@NonNull final MessageFr } /** - * Returns whether the transaction executing the given frame just experienced a message call - * fail due to a missing receiver signature requirement. + * Sets a context variable with a Hedera-specific propagated failure reason indicating that the transaction + * executing the given frame just experienced such a message call failure. * * @param frame a frame in the transaction of interest - * @return true if the transaction just hit a missing receiver signature requirement + * @param failure the propagated failure reason */ - public static boolean messageCallHaltedForMissingReceiverSigReq(@NonNull final MessageFrame frame) { - return receiverSigReqFailureContextVariableFor(frame).get(); + public static void setPropagatedCallFailure( + @NonNull final MessageFrame frame, @NonNull final HevmPropagatedCallFailure failure) { + requireNonNull(frame); + requireNonNull(failure); + propagatedCallFailureReference(frame).set(failure); } /** - * Sets a context variable that indicates the transaction executing the given frame just experienced - * a message call fail due to a missing receiver signature requirement. + * Gets and clears any propagated call failure from the context variable in the transaction containing + * the given frame. * * @param frame a frame in the transaction of interest */ - public static void setMessageCallHaltedForMissingReceiverSigReq(@NonNull final MessageFrame frame) { - receiverSigReqFailureContextVariableFor(frame).set(true); - } - - /** - * Clears a context variable that indicates the transaction executing the given frame just experienced - * a message call fail due to a missing receiver signature requirement. - * - * @param frame a frame in the transaction of interest - */ - public static void clearMessageCallHaltedForMissingReceiverSigReq(@NonNull final MessageFrame frame) { - receiverSigReqFailureContextVariableFor(frame).set(false); + public static @NonNull HevmPropagatedCallFailure getAndClearPropagatedCallFailure( + @NonNull final MessageFrame frame) { + requireNonNull(frame); + return propagatedCallFailureReference(frame).getAndClear(); } - private static AtomicBoolean receiverSigReqFailureContextVariableFor(@NonNull final MessageFrame frame) { - return initialFrameOf(frame).getContextVariable(RECEIVER_SIG_REQ_FAILURE_CONTEXT_VARIABLE); + private static PropagatedCallFailureReference propagatedCallFailureReference(@NonNull final MessageFrame frame) { + return initialFrameOf(frame).getContextVariable(PROPAGATED_CALL_FAILURE_CONTEXT_VARIABLE); } public static @NonNull ProxyWorldUpdater proxyUpdaterFor(@NonNull final MessageFrame frame) { diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/PropagatedCallFailureReference.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/PropagatedCallFailureReference.java new file mode 100644 index 000000000000..5a0055bc462d --- /dev/null +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/PropagatedCallFailureReference.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * 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. + */ + +package com.hedera.node.app.service.contract.impl.exec.utils; + +import static com.hedera.node.app.service.contract.impl.hevm.HevmPropagatedCallFailure.NONE; +import static java.util.Objects.requireNonNull; + +import com.hedera.node.app.service.contract.impl.hevm.HevmPropagatedCallFailure; +import edu.umd.cs.findbugs.annotations.NonNull; + +/** + * Wrapper that holds a reference to a {@link HevmPropagatedCallFailure} value. Added to the + * {@link org.hyperledger.besu.evm.frame.MessageFrame} context so that such failures can be + * propagated up the call stack. + */ +public class PropagatedCallFailureReference { + private HevmPropagatedCallFailure failure = NONE; + + /** + * Sets the failure value to the given value. + * + * @param failure the failure value to set + */ + public void set(@NonNull final HevmPropagatedCallFailure failure) { + this.failure = requireNonNull(failure); + } + + /** + * Returns the current failure value, if any, and ensures the reference is reset to {@link HevmPropagatedCallFailure#NONE}. + * + * @return the current failure value + */ + public @NonNull HevmPropagatedCallFailure getAndClear() { + final var maybeFailure = failure; + failure = NONE; + return maybeFailure; + } +} diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/hevm/HevmPropagatedCallFailure.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/hevm/HevmPropagatedCallFailure.java new file mode 100644 index 000000000000..c21fe1b32bd9 --- /dev/null +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/hevm/HevmPropagatedCallFailure.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * 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. + */ + +package com.hedera.node.app.service.contract.impl.hevm; + +import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.INSUFFICIENT_CHILD_RECORDS; +import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.INVALID_SIGNATURE; + +import com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason; +import edu.umd.cs.findbugs.annotations.Nullable; +import java.util.Optional; +import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; + +/** + * Enumerates special types of call failures in the Hedera EVM that not only prevent the frame + * of the call from being processed, but also halt the execution of the parent frame whose code + * contained the initiating {@code CALL} operation. + */ +public enum HevmPropagatedCallFailure { + /** + * No special failure occurred. + */ + NONE(null), + /** + * The call failed due to a missing signature on the receiver account. + */ + MISSING_RECEIVER_SIGNATURE(INVALID_SIGNATURE), + /** + * The call failed because its externalizing its result would exceed the maximum number of child records. + */ + RESULT_CANNOT_BE_EXTERNALIZED(INSUFFICIENT_CHILD_RECORDS); + + private final @Nullable CustomExceptionalHaltReason exceptionalHaltReason; + + HevmPropagatedCallFailure(@Nullable final CustomExceptionalHaltReason exceptionalHaltReason) { + this.exceptionalHaltReason = exceptionalHaltReason; + } + + /** + * Returns the {@link ExceptionalHaltReason} that should be used to halt the parent frame, if any. + * + * @return the halt reason, if any + */ + public Optional exceptionalHaltReason() { + return Optional.ofNullable(exceptionalHaltReason); + } +} diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/state/DispatchingEvmFrameState.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/state/DispatchingEvmFrameState.java index 3e780c167535..4d038f1c2e77 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/state/DispatchingEvmFrameState.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/state/DispatchingEvmFrameState.java @@ -17,10 +17,13 @@ package com.hedera.node.app.service.contract.impl.state; import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_SIGNATURE; +import static com.hedera.hapi.node.base.ResponseCodeEnum.MAX_CHILD_RECORDS_EXCEEDED; import static com.hedera.hapi.node.base.ResponseCodeEnum.OK; +import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.CONTRACT_IS_TREASURY; import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.CONTRACT_STILL_OWNS_NFTS; import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.FAILURE_DURING_LAZY_ACCOUNT_CREATION; +import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.INSUFFICIENT_CHILD_RECORDS; import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.INVALID_SOLIDITY_ADDRESS; import static com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason.SELF_DESTRUCT_TO_SELF; import static com.hedera.node.app.service.contract.impl.exec.scope.HederaNativeOperations.MISSING_ENTITY_NUMBER; @@ -386,8 +389,10 @@ public Optional tryLazyCreation(@NonNull final Address ad } } final var status = nativeOperations.createHollowAccount(tuweniToPbjBytes(address)); - if (status != OK) { - return Optional.of(FAILURE_DURING_LAZY_ACCOUNT_CREATION); + if (status != SUCCESS) { + return status == MAX_CHILD_RECORDS_EXCEEDED + ? Optional.of(INSUFFICIENT_CHILD_RECORDS) + : Optional.of(FAILURE_DURING_LAZY_ACCOUNT_CREATION); } return Optional.empty(); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/FrameRunnerTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/FrameRunnerTest.java index 145e4e6b878f..9cf61e8aa496 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/FrameRunnerTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/FrameRunnerTest.java @@ -46,8 +46,10 @@ import com.hedera.node.app.service.contract.impl.exec.gas.CustomGasCalculator; import com.hedera.node.app.service.contract.impl.exec.processors.CustomMessageCallProcessor; import com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils; +import com.hedera.node.app.service.contract.impl.exec.utils.PropagatedCallFailureReference; import com.hedera.node.app.service.contract.impl.hevm.ActionSidecarContentTracer; import com.hedera.node.app.service.contract.impl.hevm.HederaEvmTransactionResult; +import com.hedera.node.app.service.contract.impl.hevm.HevmPropagatedCallFailure; import com.hedera.node.app.service.contract.impl.state.ProxyWorldUpdater; import com.hedera.node.config.testfixtures.HederaTestConfigBuilder; import com.hedera.pbj.runtime.io.buffer.Bytes; @@ -57,7 +59,6 @@ import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.evm.frame.MessageFrame; @@ -92,7 +93,7 @@ class FrameRunnerTest { @Mock private CustomGasCalculator gasCalculator; - private final AtomicBoolean receiverSigCheckFailed = new AtomicBoolean(); + private final PropagatedCallFailureReference propagatedCallFailure = new PropagatedCallFailureReference(); private FrameRunner subject; @@ -245,7 +246,9 @@ private void givenBaseScenarioWithDetails( doAnswer(invocation -> { messageFrameStack.pop(); messageFrameStack.push(childFrame); - receiverSigCheckFailed.set(true); + if (receiverSigCheckFailure) { + propagatedCallFailure.set(HevmPropagatedCallFailure.MISSING_RECEIVER_SIGNATURE); + } return null; }) .when(contractCreationProcessor) @@ -265,10 +268,9 @@ private void givenBaseScenarioWithDetails( .withValue("contracts.maxRefundPercentOfGasLimit", HEDERA_MAX_REFUND_PERCENTAGE) .getOrCreateConfig(); given(frame.getContextVariable(FrameUtils.CONFIG_CONTEXT_VARIABLE)).willReturn(config); - given(frame.getContextVariable(FrameUtils.RECEIVER_SIG_REQ_FAILURE_CONTEXT_VARIABLE)) - .willReturn(receiverSigCheckFailed); - given(childFrame.getContextVariable(FrameUtils.RECEIVER_SIG_REQ_FAILURE_CONTEXT_VARIABLE)) - .willReturn(receiverSigCheckFailed); + given(frame.getContextVariable(FrameUtils.TRACKER_CONTEXT_VARIABLE)).willReturn(null); + given(childFrame.getContextVariable(FrameUtils.PROPAGATED_CALL_FAILURE_CONTEXT_VARIABLE)) + .willReturn(propagatedCallFailure); given(frame.getGasPrice()).willReturn(Wei.of(NETWORK_GAS_PRICE)); if (success) { given(frame.getState()).willReturn(MessageFrame.State.COMPLETED_SUCCESS); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/failure/CustomExceptionalHaltReasonTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/failure/CustomExceptionalHaltReasonTest.java index 659f3b5af55f..205ac0c5eec6 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/failure/CustomExceptionalHaltReasonTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/failure/CustomExceptionalHaltReasonTest.java @@ -33,6 +33,9 @@ class CustomExceptionalHaltReasonTest { void translatesSameStatusesAsMonoService() { assertEquals(ResponseCodeEnum.OBTAINER_SAME_CONTRACT_ID, statusFor(SELF_DESTRUCT_TO_SELF)); assertEquals(ResponseCodeEnum.INVALID_SOLIDITY_ADDRESS, statusFor(INVALID_SOLIDITY_ADDRESS)); + assertEquals( + ResponseCodeEnum.MAX_CHILD_RECORDS_EXCEEDED, + statusFor(CustomExceptionalHaltReason.INSUFFICIENT_CHILD_RECORDS)); assertEquals(ResponseCodeEnum.INVALID_SIGNATURE, statusFor(INVALID_SIGNATURE)); assertEquals(ResponseCodeEnum.INSUFFICIENT_GAS, statusFor(ExceptionalHaltReason.INSUFFICIENT_GAS)); assertEquals( diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/HandleHederaNativeOperationsTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/HandleHederaNativeOperationsTest.java index fdaccaa4761c..40f30c3f6f7e 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/HandleHederaNativeOperationsTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/HandleHederaNativeOperationsTest.java @@ -35,12 +35,11 @@ import static com.hedera.node.app.service.contract.impl.test.TestHelpers.SOMEBODY; import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.tuweniToPbjBytes; import static com.hedera.node.app.service.contract.impl.utils.SynthTxnUtils.synthHollowAccountCreation; -import static com.hedera.node.app.spi.workflows.HandleContext.TransactionCategory.CHILD; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; @@ -151,8 +150,8 @@ void createsHollowAccountByDispatching() { .cryptoCreateAccount(synthHollowAccountCreation(CANONICAL_ALIAS)) .build(); given(context.payer()).willReturn(A_NEW_ACCOUNT_ID); - given(context.dispatchChildTransaction( - eq(synthTxn), eq(CryptoCreateRecordBuilder.class), eq(null), eq(A_NEW_ACCOUNT_ID), eq(CHILD))) + given(context.dispatchRemovablePrecedingTransaction( + eq(synthTxn), eq(CryptoCreateRecordBuilder.class), eq(null), eq(A_NEW_ACCOUNT_ID))) .willReturn(cryptoCreateRecordBuilder); given(cryptoCreateRecordBuilder.status()).willReturn(OK); @@ -162,17 +161,18 @@ void createsHollowAccountByDispatching() { } @Test - void createsHollowAccountByDispatchingDoesNotCatchErrors() { + void createsHollowAccountByDispatchingDoesNotThrowErrors() { final var synthTxn = TransactionBody.newBuilder() .cryptoCreateAccount(synthHollowAccountCreation(CANONICAL_ALIAS)) .build(); given(context.payer()).willReturn(A_NEW_ACCOUNT_ID); - given(context.dispatchChildTransaction( - eq(synthTxn), eq(CryptoCreateRecordBuilder.class), eq(null), eq(A_NEW_ACCOUNT_ID), eq(CHILD))) + given(context.dispatchRemovablePrecedingTransaction( + eq(synthTxn), eq(CryptoCreateRecordBuilder.class), eq(null), eq(A_NEW_ACCOUNT_ID))) .willReturn(cryptoCreateRecordBuilder); given(cryptoCreateRecordBuilder.status()).willReturn(MAX_ENTITIES_IN_PRICE_REGIME_HAVE_BEEN_CREATED); - assertThrows(AssertionError.class, () -> subject.createHollowAccount(CANONICAL_ALIAS)); + final var status = assertDoesNotThrow(() -> subject.createHollowAccount(CANONICAL_ALIAS)); + assertThat(status).isEqualTo(MAX_ENTITIES_IN_PRICE_REGIME_HAVE_BEEN_CREATED); } @Test diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/state/DispatchingEvmFrameStateTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/state/DispatchingEvmFrameStateTest.java index 1d977b25befe..84bce582628e 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/state/DispatchingEvmFrameStateTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/state/DispatchingEvmFrameStateTest.java @@ -472,7 +472,7 @@ void cannotLazyCreateOverExpiredAccount() { @Test void noHaltIfLazyCreationOk() { given(nativeOperations.createHollowAccount(tuweniToPbjBytes(EVM_ADDRESS))) - .willReturn(ResponseCodeEnum.OK); + .willReturn(ResponseCodeEnum.SUCCESS); final var reasonLazyCreationFailed = subject.tryLazyCreation(EVM_ADDRESS); assertTrue(reasonLazyCreationFailed.isEmpty()); diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/leaky/LeakyContractTestsSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/leaky/LeakyContractTestsSuite.java index b53d2a270ca3..3848d63e404c 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/leaky/LeakyContractTestsSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/leaky/LeakyContractTestsSuite.java @@ -1904,6 +1904,7 @@ private HapiSpec requiresTopLevelSignatureOrApprovalDependingOnControllingProper recordWith().status(INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE))); } + @HapiTest private HapiSpec evmLazyCreateViaSolidityCallTooManyCreatesFails() { final var LAZY_CREATE_CONTRACT = "NestedLazyCreateContract"; final var ECDSA_KEY = "ECDSAKey"; From 3ec27bc1acf740f03171f7a5a4ccd90796778e7a Mon Sep 17 00:00:00 2001 From: JeffreyDallas <39912573+JeffreyDallas@users.noreply.github.com> Date: Mon, 11 Dec 2023 09:40:38 -0600 Subject: [PATCH 06/13] chore: add new legacy intake tests to nightly regression (#10394) Signed-off-by: Jeffrey Tang --- .../platform-zxf-jrs-daily-interval-05.yaml | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/.github/workflows/platform-zxf-jrs-daily-interval-05.yaml b/.github/workflows/platform-zxf-jrs-daily-interval-05.yaml index 52054fcb45e2..810f35e908b6 100644 --- a/.github/workflows/platform-zxf-jrs-daily-interval-05.yaml +++ b/.github/workflows/platform-zxf-jrs-daily-interval-05.yaml @@ -199,3 +199,43 @@ jobs: needs: - NewNodesMinStake if: ${{ !cancelled() && always() }} + + LegacyIntakePipeline: + name: LegacyIntakePipeline + uses: ./.github/workflows/zxc-jrs-regression.yaml + with: + ref: ${{ github.event.inputs.ref }} + branch-name: ${{ github.event.inputs.branch-name }} + panel-config: "configs/suites/daily/4N/GCP-Daily-LegacyIntakePipeline-4N.json" + secrets: + access-token: ${{ secrets.PLATFORM_GH_ACCESS_TOKEN }} + jrs-ssh-user-name: ${{ secrets.PLATFORM_JRS_SSH_USER_NAME }} + jrs-ssh-key-file: ${{ secrets.PLATFORM_JRS_SSH_KEY_FILE }} + gcp-project-number: ${{ secrets.PLATFORM_GCP_PROJECT_NUMBER }} + gcp-sa-key-contents: ${{ secrets.PLATFORM_GCP_KEY_FILE }} + slack-api-token: ${{ secrets.PLATFORM_SLACK_API_TOKEN }} + gradle-cache-username: ${{ secrets.GRADLE_CACHE_USERNAME }} + gradle-cache-password: ${{ secrets.GRADLE_CACHE_PASSWORD }} + needs: + - NewNodesZeroStake + if: ${{ !cancelled() && always() }} + + SBReconnectLegacyIntake: + name: SBReconnectLegacyIntake + uses: ./.github/workflows/zxc-jrs-regression.yaml + with: + ref: ${{ github.event.inputs.ref }} + branch-name: ${{ github.event.inputs.branch-name }} + panel-config: "configs/suites/daily/10N/SBReconnect-LegacyIntake-10N.json" + secrets: + access-token: ${{ secrets.PLATFORM_GH_ACCESS_TOKEN }} + jrs-ssh-user-name: ${{ secrets.PLATFORM_JRS_SSH_USER_NAME }} + jrs-ssh-key-file: ${{ secrets.PLATFORM_JRS_SSH_KEY_FILE }} + gcp-project-number: ${{ secrets.PLATFORM_GCP_PROJECT_NUMBER }} + gcp-sa-key-contents: ${{ secrets.PLATFORM_GCP_KEY_FILE }} + slack-api-token: ${{ secrets.PLATFORM_SLACK_API_TOKEN }} + gradle-cache-username: ${{ secrets.GRADLE_CACHE_USERNAME }} + gradle-cache-password: ${{ secrets.GRADLE_CACHE_PASSWORD }} + needs: + - LegacyIntakePipeline + if: ${{ !cancelled() && always() }} From ff96c7f641d0ecf03ff52191bcb886bb880c2c3f Mon Sep 17 00:00:00 2001 From: Petar Tonev Date: Mon, 11 Dec 2023 17:40:54 +0200 Subject: [PATCH 07/13] fix: only enable `TargetNetworkPrep` suite (#10410) Signed-off-by: Petar Tonev --- .../services/bdd/suites/regression/TargetNetworkPrep.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/TargetNetworkPrep.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/TargetNetworkPrep.java index 3e282a7a27c5..06e9a89e316c 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/TargetNetworkPrep.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/TargetNetworkPrep.java @@ -38,6 +38,7 @@ import static com.hedera.services.bdd.suites.records.RecordCreationSuite.STAKING_FEES_STAKING_REWARD_PERCENTAGE; import com.hedera.node.app.hapi.utils.fee.FeeObject; +import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestSuite; import com.hedera.services.bdd.spec.HapiSpec; import com.hedera.services.bdd.spec.HapiSpecOperation; @@ -73,6 +74,7 @@ public List getSpecsInSuite() { return List.of(ensureSystemStateAsExpectedWithSystemDefaultFiles()); } + @HapiTest private HapiSpec ensureSystemStateAsExpectedWithSystemDefaultFiles() { final var emptyKey = Key.newBuilder().setKeyList(KeyList.getDefaultInstance()).build(); From 23a28eae7d4db0f5c7d56679fb2ce7a34c033583 Mon Sep 17 00:00:00 2001 From: Stoyan Panayotov Date: Mon, 11 Dec 2023 18:29:20 +0200 Subject: [PATCH 08/13] fix: Consider input bytes when calculating gas cost (#10379) Signed-off-by: Stoyan Panayotov --- .../execution/HederaEvmTxProcessor.java | 12 +- .../execution/HederaEvmTxProcessorTest.java | 36 +- .../contracts/execution/EvmTxProcessor.java | 2 +- .../execution/CreateEvmTxProcessorTest.java | 3 +- .../impl/exec/gas/CustomGasCharging.java | 4 +- .../test/exec/gas/CustomGasChargingTest.java | 6 +- .../contract/hapi/ContractCallSuite.java | 5 +- .../ContractCallV1SecurityModelSuite.java | 3 +- .../contract/hapi/ContractCreateSuite.java | 2 +- .../opcodes/Create2OperationSuite.java | 2 +- .../ERC1155ContractInteractions.java | 5 +- .../ERC721ContractInteractions.java | 1 + .../precompile/AssociatePrecompileSuite.java | 2 +- .../ContractKeysStillWorkAsExpectedSuite.java | 8 +- .../precompile/ContractMintHTSSuite.java | 2 +- ...ThroughPrecompileV1SecurityModelSuite.java | 12 +- .../precompile/PrngPrecompileSuite.java | 2 +- .../suites/contract/records/LogsSuite.java | 10 +- .../traceability/TraceabilitySuite.java | 410 +++++++++--------- .../bdd/suites/file/FileUpdateSuite.java | 2 +- .../suites/leaky/LeakyContractTestsSuite.java | 16 +- .../factories/IdFuzzingProviderFactory.java | 2 +- .../suites/token/TokenAssociationSpecs.java | 4 +- 23 files changed, 299 insertions(+), 252 deletions(-) diff --git a/hedera-node/hedera-evm/src/main/java/com/hedera/node/app/service/evm/contracts/execution/HederaEvmTxProcessor.java b/hedera-node/hedera-evm/src/main/java/com/hedera/node/app/service/evm/contracts/execution/HederaEvmTxProcessor.java index 8f0723c112ef..d5fab069b468 100644 --- a/hedera-node/hedera-evm/src/main/java/com/hedera/node/app/service/evm/contracts/execution/HederaEvmTxProcessor.java +++ b/hedera-node/hedera-evm/src/main/java/com/hedera/node/app/service/evm/contracts/execution/HederaEvmTxProcessor.java @@ -16,6 +16,7 @@ package com.hedera.node.app.service.evm.contracts.execution; +import com.google.common.annotations.VisibleForTesting; import com.hedera.node.app.service.evm.contracts.execution.traceability.HederaEvmOperationTracer; import com.hedera.node.app.service.evm.store.contracts.HederaEvmMutableWorldState; import com.hedera.node.app.service.evm.store.contracts.HederaEvmWorldUpdater; @@ -48,7 +49,7 @@ public abstract class HederaEvmTxProcessor { protected BlockMetaSource blockMetaSource; protected HederaEvmMutableWorldState worldState; - protected final GasCalculator gasCalculator; + protected GasCalculator gasCalculator; // FEATURE WORK to be covered by #3949 protected final PricesAndFeesProvider livePricesSource; protected final Map> mcps; @@ -179,8 +180,8 @@ public HederaEvmTransactionProcessingResult execute( } } - public void setupFields(final boolean contractCreation) { - this.intrinsicGas = gasCalculator.transactionIntrinsicGasCost(Bytes.EMPTY, contractCreation); + public void setupFields(final Bytes payload, final boolean contractCreation) { + this.intrinsicGas = gasCalculator.transactionIntrinsicGasCost(payload, contractCreation); this.updater = worldState.updater(); this.coinbase = dynamicProperties.fundingAccountAddress(); } @@ -223,4 +224,9 @@ private AbstractMessageProcessor getMessageProcessor(final MessageFrame.Type typ case CONTRACT_CREATION -> contractCreationProcessor; }; } + + @VisibleForTesting + public void setGasCalculator(GasCalculator gasCalculator) { + this.gasCalculator = gasCalculator; + } } diff --git a/hedera-node/hedera-evm/src/test/java/com/hedera/node/app/service/evm/contracts/execution/HederaEvmTxProcessorTest.java b/hedera-node/hedera-evm/src/test/java/com/hedera/node/app/service/evm/contracts/execution/HederaEvmTxProcessorTest.java index dd9cee8dcca2..114b215dc252 100644 --- a/hedera-node/hedera-evm/src/test/java/com/hedera/node/app/service/evm/contracts/execution/HederaEvmTxProcessorTest.java +++ b/hedera-node/hedera-evm/src/test/java/com/hedera/node/app/service/evm/contracts/execution/HederaEvmTxProcessorTest.java @@ -21,8 +21,11 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.hedera.node.app.service.evm.contracts.execution.traceability.DefaultHederaTracer; @@ -152,7 +155,7 @@ void assertSuccessExecution() { givenValidMock(0L); given(globalDynamicProperties.fundingAccountAddress()).willReturn(fundingAccount); - evmTxProcessor.setupFields(false); + evmTxProcessor.setupFields(Bytes.EMPTY, false); final var result = evmTxProcessor.execute(sender, receiver, 33_333L, 1234L, 1L, Bytes.EMPTY, true, mirrorReceiver); assertTrue(result.isSuccessful()); @@ -184,7 +187,7 @@ void assertSuccessExecutionChargesCorrectMinimumGas() { given(globalDynamicProperties.maxGasRefundPercentage()).willReturn(MAX_REFUND_PERCENT); given(globalDynamicProperties.fundingAccountAddress()).willReturn(fundingAccount); - evmTxProcessor.setupFields(false); + evmTxProcessor.setupFields(Bytes.EMPTY, false); final var result = evmTxProcessor.execute(sender, receiver, 0L, GAS_LIMIT, 1234L, Bytes.EMPTY, false, mirrorReceiver); assertTrue(result.isSuccessful()); @@ -200,7 +203,7 @@ void assertSuccessExecutionChargesCorrectGasWhenGasUsedIsLargerThanMinimum() { given(gasCalculator.transactionIntrinsicGasCost(Bytes.EMPTY, false)).willReturn(intrinsicGasCost); given(globalDynamicProperties.fundingAccountAddress()).willReturn(fundingAccount); - evmTxProcessor.setupFields(false); + evmTxProcessor.setupFields(Bytes.EMPTY, false); final var result = evmTxProcessor.execute(sender, receiver, 0L, GAS_LIMIT, 1234L, Bytes.EMPTY, false, mirrorReceiver); assertTrue(result.isSuccessful()); @@ -224,7 +227,7 @@ void throwsWhenSenderCannotCoverUpfrontCost() { given(stackedUpdater.getOrCreate(any())).willReturn(wrappedRecipientAccount); given(updater.updater()).willReturn(stackedUpdater); - evmTxProcessor.setupFields(false); + evmTxProcessor.setupFields(Bytes.EMPTY, false); final var result = evmTxProcessor.execute(sender, receiver, 333_333L, 1234L, 1L, Bytes.EMPTY, true, mirrorReceiver); assertEquals(INSUFFICIENT_GAS, result.getHaltReason().get().name()); @@ -252,7 +255,7 @@ void throwsWhenIntrinsicGasCostExceedsGasLimit() { givenInvalidMock(); - evmTxProcessor.setupFields(false); + evmTxProcessor.setupFields(Bytes.EMPTY, false); final var result = evmTxProcessor.execute(sender, receiver, 33_333L, 0L, 1234L, Bytes.EMPTY, true, mirrorReceiver); assertEquals(INSUFFICIENT_GAS, result.getHaltReason().get().name()); @@ -265,7 +268,7 @@ void throwsWhenIntrinsicGasCostExceedsGasLimitAndGasLimitIsEqualToMaxGasLimit() final int maxGasLimit = 10_000_000; given(gasCalculator.transactionIntrinsicGasCost(Bytes.EMPTY, false)).willReturn(maxGasLimit + 1L); - evmTxProcessor.setupFields(false); + evmTxProcessor.setupFields(Bytes.EMPTY, false); final var result = evmTxProcessor.execute(sender, receiver, 0L, maxGasLimit, 1234L, Bytes.EMPTY, false, mirrorReceiver); assertEquals(INSUFFICIENT_GAS, result.getHaltReason().get().name()); @@ -308,7 +311,7 @@ void assertSuccessExecutionWithRefund() { given(globalDynamicProperties.maxGasRefundPercentage()).willReturn(100); given(globalDynamicProperties.fundingAccountAddress()).willReturn(fundingAccount); - evmTxProcessor.setupFields(false); + evmTxProcessor.setupFields(Bytes.EMPTY, false); final var result = evmTxProcessor.execute(sender, receiver, GAS_LIMIT, 0L, 1234L, Bytes.EMPTY, true, mirrorReceiver); @@ -348,7 +351,7 @@ void testEvmVersionLoading() { given(globalDynamicProperties.fundingAccountAddress()).willReturn(fundingAccount); // uses default setup - evmTxProcessor.setupFields(false); + evmTxProcessor.setupFields(Bytes.EMPTY, false); evmTxProcessor.execute(sender, receiver, 33_333L, 1234L, 1L, Bytes.EMPTY, true, mirrorReceiver); assertEquals(EVM_VERSION_0_30, mcpVersion); @@ -369,4 +372,21 @@ void testEvmVersionLoading() { NullPointerException.class, () -> evmTxProcessor.execute(sender, receiver, 33_333L, 1234L, 1L, Bytes.EMPTY, true, mirrorReceiver)); } + + @Test + void forwardsPayloadToGasCalculator() { + final var mockedGasCalculator = mock(GasCalculator.class); + evmTxProcessor.setGasCalculator(mockedGasCalculator); + + Bytes empty = Bytes.EMPTY; + Bytes somePayload = Bytes.fromBase64String("9499rew9rwefdsfkad9cd09f0dscds0cds"); + + // with empty bytes + evmTxProcessor.setupFields(empty, true); + verify(mockedGasCalculator).transactionIntrinsicGasCost(argThat(x -> x.equals(empty)), eq(true)); + + // with actual payload + evmTxProcessor.setupFields(somePayload, true); + verify(mockedGasCalculator).transactionIntrinsicGasCost(argThat(x -> x.equals(somePayload)), eq(true)); + } } diff --git a/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/contracts/execution/EvmTxProcessor.java b/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/contracts/execution/EvmTxProcessor.java index a849ba3c08af..06e84b00e2ee 100644 --- a/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/contracts/execution/EvmTxProcessor.java +++ b/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/contracts/execution/EvmTxProcessor.java @@ -115,7 +115,7 @@ protected TransactionProcessingResult execute( final Wei gasCost = Wei.of(Math.multiplyExact(gasLimit, gasPrice)); final Wei upfrontCost = gasCost.add(value); - super.setupFields(contractCreation); + super.setupFields(payload, contractCreation); final var chargingResult = chargeForGas( gasCost, diff --git a/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/contracts/execution/CreateEvmTxProcessorTest.java b/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/contracts/execution/CreateEvmTxProcessorTest.java index bcf057cea843..cd62cde8fe12 100644 --- a/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/contracts/execution/CreateEvmTxProcessorTest.java +++ b/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/contracts/execution/CreateEvmTxProcessorTest.java @@ -24,6 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -339,7 +340,7 @@ private void givenValidMock(final long amount, boolean getOrCreateMocking) { given(updater.getOrCreate(any())).willReturn(evmAccount); } - given(gasCalculator.transactionIntrinsicGasCost(Bytes.EMPTY, true)).willReturn(0L); + given(gasCalculator.transactionIntrinsicGasCost(any(), eq(true))).willReturn(0L); given(evmAccount.decrementBalance(any())).willReturn(Wei.of(1234L)); given(evmAccount.incrementBalance(any())).willReturn(Wei.of(1500L)); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/gas/CustomGasCharging.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/gas/CustomGasCharging.java index cc4802446403..f7931a7835a8 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/gas/CustomGasCharging.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/gas/CustomGasCharging.java @@ -32,7 +32,6 @@ import edu.umd.cs.findbugs.annotations.Nullable; import javax.inject.Inject; import javax.inject.Singleton; -import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.evm.gascalculator.GasCalculator; /** @@ -114,7 +113,8 @@ public GasCharges chargeForGas( if (context.isNoopGasContext()) { return ZERO_CHARGES; } - final var intrinsicGas = gasCalculator.transactionIntrinsicGasCost(Bytes.EMPTY, transaction.isCreate()); + final var intrinsicGas = + gasCalculator.transactionIntrinsicGasCost(transaction.evmPayload(), transaction.isCreate()); validateTrue(transaction.gasLimit() >= intrinsicGas, INSUFFICIENT_GAS); if (transaction.isEthereumTransaction()) { final var allowanceUsed = diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/gas/CustomGasChargingTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/gas/CustomGasChargingTest.java index 0025ff57d336..d367365ec2e4 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/gas/CustomGasChargingTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/gas/CustomGasChargingTest.java @@ -30,6 +30,8 @@ import static com.hedera.node.app.service.contract.impl.test.TestHelpers.wellKnownRelayedHapiCallWithGasLimit; import static com.hedera.node.app.service.contract.impl.test.TestHelpers.wellKnownRelayedHapiCallWithUserGasPriceAndMaxAllowance; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; @@ -43,7 +45,6 @@ import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import com.hedera.node.app.service.contract.impl.state.HederaEvmAccount; import com.hedera.node.app.service.contract.impl.test.TestHelpers; -import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.evm.gascalculator.GasCalculator; import org.junit.jupiter.api.BeforeEach; @@ -365,7 +366,6 @@ private void givenWellKnownIntrinsicGasCost() { } private void givenWellKnownIntrinsicGasCost(boolean isCreation) { - given(gasCalculator.transactionIntrinsicGasCost(Bytes.EMPTY, isCreation)) - .willReturn(TestHelpers.INTRINSIC_GAS); + given(gasCalculator.transactionIntrinsicGasCost(any(), eq(isCreation))).willReturn(TestHelpers.INTRINSIC_GAS); } } diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCallSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCallSuite.java index 77bef8e499ec..b27d2ddd4253 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCallSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCallSuite.java @@ -733,9 +733,11 @@ private HapiSpec bitcarbonTestStillPasses() { .getContractAccountID())))), uploadInitCode(addressBook, jurisdictions), contractCreate(addressBook) + .gas(1_000_000L) .exposingNumTo(num -> addressBookMirror.set(asHexedSolidityAddress(0, 0, num))) .payingWith(DEFAULT_CONTRACT_SENDER), contractCreate(jurisdictions) + .gas(1_000_000L) .exposingNumTo(num -> jurisdictionMirror.set(asHexedSolidityAddress(0, 0, num))) .withExplicitParams(() -> EXPLICIT_JURISDICTION_CONS_PARAMS) .payingWith(DEFAULT_CONTRACT_SENDER), @@ -744,6 +746,7 @@ private HapiSpec bitcarbonTestStillPasses() { minters, bookInterpolated(literalInitcodeFor(minters).toByteArray(), addressBookMirror.get()))), contractCreate(minters) + .gas(2_000_000L) .withExplicitParams( () -> String.format(EXPLICIT_MINTER_CONS_PARAMS_TPL, jurisdictionMirror.get())) .payingWith(DEFAULT_CONTRACT_SENDER)) @@ -1399,7 +1402,7 @@ inlineTestContract, GET_CODE_SIZE, asHeadlongAddress(acctAddress)) private HapiSpec multipleSelfDestructsAreSafe() { final var contract = "Fuse"; return defaultHapiSpec("MultipleSelfDestructsAreSafe", NONDETERMINISTIC_TRANSACTION_FEES) - .given(uploadInitCode(contract), contractCreate(contract).gas(300_000)) + .given(uploadInitCode(contract), contractCreate(contract).gas(600_000)) .when(contractCall(contract, "light").via("lightTxn").scrambleTxnBody(tx -> tx)) .then(getTxnRecord("lightTxn").logged()); } diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCallV1SecurityModelSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCallV1SecurityModelSuite.java index 8369c41b362e..df5a638709ea 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCallV1SecurityModelSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCallV1SecurityModelSuite.java @@ -374,7 +374,8 @@ private HapiSpec lpFarmSimulation() { BigInteger.valueOf(10000L), BigInteger.valueOf(1000000000000000L), BigInteger.valueOf(2500000000L)) - .bytecode(initcode)), + .bytecode(initcode) + .gas(500_000L)), tokenCreate(sauce) .supplyType(TokenSupplyType.FINITE) .initialSupply(300_000_000) diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCreateSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCreateSuite.java index 0111e6e0193f..e2fab37bd508 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCreateSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractCreateSuite.java @@ -276,7 +276,7 @@ private HapiSpec childCreationsHaveExpectedKeysWithOmittedAdminKey() { return defaultHapiSpec("ChildCreationsHaveExpectedKeysWithOmittedAdminKey") .given( uploadInitCode(contract), - contractCreate(contract).omitAdminKey().gas(300_000).via(txn), + contractCreate(contract).omitAdminKey().gas(600_000).via(txn), withOpContext((spec, opLog) -> { final var op = getTxnRecord(txn); allRunFor(spec, op); diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/Create2OperationSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/Create2OperationSuite.java index 988cf88b25ed..98b6ba1af9c9 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/Create2OperationSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/Create2OperationSuite.java @@ -753,7 +753,7 @@ private HapiSpec canCallFinalizedContractViaHapi() { newKeyNamed(SECP_256K1_SOURCE_KEY).shape(SECP_256K1_SHAPE), cryptoTransfer(tinyBarsFromAccountToAlias(GENESIS, SECP_256K1_SOURCE_KEY, ONE_HUNDRED_HBARS)), uploadInitCode(contract), - contractCreate(contract).payingWith(GENESIS), + contractCreate(contract).payingWith(GENESIS).gas(500_000L), contractCallLocal(contract, "computeChildAddress", salt) .exposingTypedResultsTo(results -> childAddress.set((Address) results[0])), sourcing(() -> ethereumCryptoTransferToAddress(childAddress.get(), ONE_HBAR) diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/openzeppelin/ERC1155ContractInteractions.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/openzeppelin/ERC1155ContractInteractions.java index 43946a5ef38a..690c8cbc87fc 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/openzeppelin/ERC1155ContractInteractions.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/openzeppelin/ERC1155ContractInteractions.java @@ -86,7 +86,10 @@ private HapiSpec erc1155() { uploadInitCode(CONTRACT)) .when() .then( - contractCreate(CONTRACT).via("contractCreate").payingWith(ACCOUNT2), + contractCreate(CONTRACT) + .gas(500_000L) + .via("contractCreate") + .payingWith(ACCOUNT2), getTxnRecord("contractCreate").logged(), getAccountBalance(ACCOUNT2).logged(), getAccountInfo(ACCOUNT1).savingSnapshot(ACCOUNT1 + "Info"), diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/openzeppelin/ERC721ContractInteractions.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/openzeppelin/ERC721ContractInteractions.java index 6c181c4d2b02..109597e90548 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/openzeppelin/ERC721ContractInteractions.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/openzeppelin/ERC721ContractInteractions.java @@ -80,6 +80,7 @@ private HapiSpec callsERC721ContractInteractions() { contractCreate(CONTRACT) .payingWith(DEFAULT_CONTRACT_SENDER) .hasKnownStatus(SUCCESS) + .gas(500_000L) .via(CREATE_TX), cryptoTransfer(tinyBarsFromTo( DEFAULT_CONTRACT_SENDER, DEFAULT_CONTRACT_RECEIVER, 10 * ONE_HBAR)) diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/AssociatePrecompileSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/AssociatePrecompileSuite.java index bd76ef612385..17fa58e3f475 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/AssociatePrecompileSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/AssociatePrecompileSuite.java @@ -316,7 +316,7 @@ private HapiSpec invalidSingleAbiCallConsumesAllProvidedGas() { .getTransactionRecord(INVALID_SINGLE_ABI_CALL_TXN) .getContractCallResult() .getGasUsed(); - assertEquals(99011, gasUsed); + assertEquals(99014, gasUsed); })); } diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractKeysStillWorkAsExpectedSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractKeysStillWorkAsExpectedSuite.java index 9c7e3268f516..27032bbb8df0 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractKeysStillWorkAsExpectedSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractKeysStillWorkAsExpectedSuite.java @@ -232,7 +232,7 @@ private HapiSpecOperation someWellKnownTokensAndAccounts( cryptoCreate(B_WELL_KNOWN_RECEIVER) .exposingCreatedIdTo(id -> bReceiverAddr.set(idAsHeadlongAddress(id))), uploadInitCode(WELL_KNOWN_TREASURY_CONTRACT), - contractCreate(WELL_KNOWN_TREASURY_CONTRACT), + contractCreate(WELL_KNOWN_TREASURY_CONTRACT).gas(500_000L), tokenCreate(WELL_KNOWN_FUNGIBLE_TOKEN) .exposingAddressTo(fungibleTokenMirrorAddr::set) .tokenType(TokenType.FUNGIBLE_COMMON) @@ -359,7 +359,7 @@ private HapiSpec canStillTransferByVirtueOfContractIdInEOAThreshold() { // Create an immutable contract with a method // transferViaThresholdContractKey() // that tries to transfer token units from a spender to a receiver - contractCreate(managementContract).omitAdminKey(), + contractCreate(managementContract).gas(500_000L).omitAdminKey(), // Setup a 1/2 threshold key with this contract's ID as the first key newKeyNamed(controlledSpenderKey) .shape(threshKeyShape.signedWith(sigs(managementContract, ON))), @@ -407,9 +407,9 @@ private HapiSpec contractKeysStillHaveSpecificityNoMatterTopLevelSignatures() { .given( uploadInitCode(managementContract, PAY_RECEIVABLE_CONTRACT), newKeyNamed(tmpAdminKey), - contractCreate(managementContract).adminKey(tmpAdminKey), + contractCreate(managementContract).gas(500_000L).adminKey(tmpAdminKey), // Just create some other contract to be the real admin key - contractCreate(PAY_RECEIVABLE_CONTRACT), + contractCreate(PAY_RECEIVABLE_CONTRACT).gas(500_000L), newKeyNamed(otherContractAsKey).shape(CONTRACT.signedWith(PAY_RECEIVABLE_CONTRACT)), cryptoCreate(associatedAccount).keyShape(SECP256K1_ON).exposingEvmAddressTo(accountAddr::set), tokenCreate(fungibleToken) diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractMintHTSSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractMintHTSSuite.java index 9fc2080f9c3e..44959c64dc0a 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractMintHTSSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractMintHTSSuite.java @@ -191,7 +191,7 @@ private HapiSpec transferNftAfterNestedMint() { .withStatus(SUCCESS) .withTotalSupply(1L) .withSerialNumbers(1L)) - .gas(3_837_920L) + .gas(3_836_587L) .amount(0L) .functionParameters(functionParameters() .forFunction( diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/LazyCreateThroughPrecompileV1SecurityModelSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/LazyCreateThroughPrecompileV1SecurityModelSuite.java index d1d631dacedb..ae53b351c39e 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/LazyCreateThroughPrecompileV1SecurityModelSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/LazyCreateThroughPrecompileV1SecurityModelSuite.java @@ -411,7 +411,9 @@ private HapiSpec cryptoTransferV1LazyCreate() { cryptoTransfer(moving(500, FUNGIBLE_TOKEN).between(TOKEN_TREASURY, SENDER)), cryptoTransfer(moving(500, FUNGIBLE_TOKEN_2).between(TOKEN_TREASURY, SENDER)), uploadInitCode(NESTED_LAZY_PRECOMPILE_CONTRACT), - contractCreate(NESTED_LAZY_PRECOMPILE_CONTRACT).maxAutomaticTokenAssociations(1), + contractCreate(NESTED_LAZY_PRECOMPILE_CONTRACT) + .gas(500_000L) + .maxAutomaticTokenAssociations(1), getContractInfo(NESTED_LAZY_PRECOMPILE_CONTRACT) .has(ContractInfoAsserts.contractWith().maxAutoAssociations(1)) .logged()) @@ -757,7 +759,7 @@ private HapiSpec transferTokenLazyCreate() { .exposingCreatedIdTo(id -> tokenAddr.set( HapiPropertySource.asHexedSolidityAddress(HapiPropertySource.asToken(id)))), uploadInitCode(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT), - contractCreate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT), + contractCreate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT).gas(500_000L), tokenAssociate(OWNER, List.of(FUNGIBLE_TOKEN)), cryptoTransfer(moving(5, FUNGIBLE_TOKEN).between(TOKEN_TREASURY, OWNER))) .when(withOpContext((spec, opLog) -> { @@ -820,7 +822,7 @@ private HapiSpec transferTokensToEVMAddressAliasRevertAndTransferAgainSuccessful .exposingCreatedIdTo(id -> tokenAddr.set( HapiPropertySource.asHexedSolidityAddress(HapiPropertySource.asToken(id)))), uploadInitCode(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT), - contractCreate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT), + contractCreate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT).gas(500_000L), tokenAssociate(OWNER, List.of(FUNGIBLE_TOKEN)), cryptoTransfer(moving(5, FUNGIBLE_TOKEN).between(TOKEN_TREASURY, OWNER))) .when(withOpContext((spec, opLog) -> { @@ -883,7 +885,7 @@ private HapiSpec transferNftLazyCreate() { .adminKey(MULTI_KEY) .supplyKey(MULTI_KEY), uploadInitCode(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT), - contractCreate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT), + contractCreate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT).gas(500_000L), tokenAssociate(OWNER, NON_FUNGIBLE_TOKEN), tokenAssociate(SPENDER, NON_FUNGIBLE_TOKEN), tokenAssociate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT, NON_FUNGIBLE_TOKEN), @@ -946,7 +948,7 @@ private HapiSpec transferNftsLazyCreate() { .adminKey(MULTI_KEY) .supplyKey(MULTI_KEY), uploadInitCode(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT), - contractCreate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT), + contractCreate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT).gas(500_000L), tokenAssociate(OWNER, NON_FUNGIBLE_TOKEN), tokenAssociate(SPENDER, NON_FUNGIBLE_TOKEN), tokenAssociate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT, NON_FUNGIBLE_TOKEN), diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/PrngPrecompileSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/PrngPrecompileSuite.java index 9f5f5a1d1f69..9c0ad2aaf409 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/PrngPrecompileSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/PrngPrecompileSuite.java @@ -209,7 +209,7 @@ private HapiSpec nonSupportedAbiCallGracefullyFails() { .getTransactionRecord(failedCall) .getContractCallResult() .getGasUsed(); - assertEquals(394209, gasUsed); + assertEquals(394210, gasUsed); })); } diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/records/LogsSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/records/LogsSuite.java index bcafe10e1f0c..c033b1228c76 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/records/LogsSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/records/LogsSuite.java @@ -78,7 +78,7 @@ private HapiSpec log0Works() { .hasPriority(recordWith() .contractCallResult(resultWith() .logs(inOrder(logWith().noTopics().longValue(15))) - .gasUsed(22_285)))); + .gasUsed(22_489)))); } @HapiTest @@ -95,7 +95,7 @@ private HapiSpec log1Works() { .noData() .withTopicsInOrder(List.of( eventSignatureOf("Log1(uint256)"), parsedToByteString(15))))) - .gasUsed(22_583)))); + .gasUsed(22_787)))); } @HapiTest @@ -114,7 +114,7 @@ private HapiSpec log2Works() { eventSignatureOf("Log2(uint256,uint256)"), parsedToByteString(1), parsedToByteString(2))))) - .gasUsed(23_112)))); + .gasUsed(23_456)))); } @HapiTest @@ -134,7 +134,7 @@ private HapiSpec log3Works() { parsedToByteString(1), parsedToByteString(2), parsedToByteString(3))))) - .gasUsed(23_638)))); + .gasUsed(24_122)))); } @HapiTest @@ -160,6 +160,6 @@ private HapiSpec log4Works() { parsedToByteString(1), parsedToByteString(2), parsedToByteString(3))))) - .gasUsed(24_294)))); + .gasUsed(24_918)))); } } diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/traceability/TraceabilitySuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/traceability/TraceabilitySuite.java index 0b65f05038f8..317ba41e199e 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/traceability/TraceabilitySuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/traceability/TraceabilitySuite.java @@ -234,6 +234,7 @@ private HapiSpec traceabilityE2EScenario1() { .given( uploadInitCode(TRACEABILITY), contractCreate(TRACEABILITY, BigInteger.valueOf(55), BigInteger.TWO, BigInteger.TWO) + .gas(500_000L) .via(FIRST_CREATE_TXN), expectContractStateChangesSidecarFor( FIRST_CREATE_TXN, @@ -259,7 +260,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(298224) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) .setGasUsed(68492) @@ -299,7 +300,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + SECOND)) .setGasUsed(28692) @@ -339,7 +340,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + THIRD)) .setGasUsed(28692) @@ -398,7 +399,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978632) .setGasUsed(33979) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -418,7 +419,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(963018) + .setGas(962655) .setGasUsed(2347) .setCallDepth(1) .setRecipientContract( @@ -432,7 +433,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallingContract( spec.registry().getContractId(TRACEABILITY)) .setCallDepth(1) - .setGas(960236) + .setGas(959873) .setGasUsed(5324) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -445,7 +446,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(952309) + .setGas(951947) .setGasUsed(2315) .setCallDepth(1) .setRecipientContract( @@ -458,7 +459,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(949543) + .setGas(949181) .setGasUsed(3180) .setCallDepth(1) .setRecipientContract( @@ -472,7 +473,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(946053) + .setGas(945691) .setGasUsed(5778) .setCallDepth(1) .setRecipientContract( @@ -490,7 +491,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(928026) + .setGas(927670) .setGasUsed(2347) .setCallDepth(2) .setRecipientContract( @@ -503,7 +504,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(939987) + .setGas(939625) .setGasUsed(1501) .setCallDepth(1) .setRecipientContract( @@ -522,7 +523,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(924301) + .setGas(923945) .setGasUsed(423) .setCallDepth(2) .setRecipientContract( @@ -536,7 +537,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(938149) + .setGas(937787) .setGasUsed(3345) .setCallDepth(1) .setRecipientContract( @@ -554,7 +555,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(922684) + .setGas(922327) .setGasUsed(2391) .setCallDepth(2) .setRecipientContract( @@ -567,7 +568,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(934470) + .setGas(934107) .setGasUsed(4235) .setCallDepth(1) .setRecipientContract( @@ -586,7 +587,7 @@ private HapiSpec traceabilityE2EScenario1() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(918936) + .setGas(918579) .setGasUsed(3224) .setCallDepth(2) .setRecipientContract( @@ -628,7 +629,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48260) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) .setGasUsed(8792) @@ -668,7 +669,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + SECOND)) .setGasUsed(28692) @@ -708,7 +709,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + THIRD)) .setGasUsed(28692) @@ -765,7 +766,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978632) .setGasUsed(70255) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -785,7 +786,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(963083) + .setGas(962721) .setGasUsed(2347) .setCallDepth(1) .setRecipientContract( @@ -799,7 +800,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallingContract( spec.registry().getContractId(TRACEABILITY)) .setCallDepth(1) - .setGas(960302) + .setGas(959939) .setGasUsed(22424) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -812,7 +813,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(937875) + .setGas(937512) .setGasUsed(5811) .setCallDepth(1) .setRecipientContract( @@ -830,7 +831,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(919912) + .setGas(919554) .setGasUsed(2315) .setCallDepth(2) .setRecipientContract( @@ -843,7 +844,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(931783) + .setGas(931421) .setGasUsed(4235) .setCallDepth(1) .setRecipientContract( @@ -862,7 +863,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(916248) + .setGas(915892) .setGasUsed(3180) .setCallDepth(2) .setRecipientContract( @@ -876,7 +877,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(927248) + .setGas(926886) .setGasUsed(5819) .setCallDepth(1) .setRecipientContract( @@ -894,7 +895,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(909474) + .setGas(909118) .setGasUsed(2347) .setCallDepth(2) .setRecipientContract( @@ -907,7 +908,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(921145) + .setGas(920783) .setGasUsed(21353) .setCallDepth(1) .setRecipientContract( @@ -926,7 +927,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(905801) + .setGas(905444) .setGasUsed(20323) .setCallDepth(2) .setRecipientContract( @@ -940,7 +941,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(899766) + .setGas(899403) .setGasUsed(3387) .setCallDepth(1) .setRecipientContract( @@ -958,7 +959,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(884859) + .setGas(884502) .setGasUsed(2391) .setCallDepth(2) .setRecipientContract( @@ -971,7 +972,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(896045) + .setGas(895682) .setGasUsed(1476) .setCallDepth(1) .setRecipientContract( @@ -990,7 +991,7 @@ private HapiSpec traceabilityE2EScenario2() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(881071) + .setGas(880714) .setGasUsed(424) .setCallDepth(2) .setRecipientContract( @@ -1007,7 +1008,8 @@ private HapiSpec traceabilityE2EScenario3() { .given( uploadInitCode(TRACEABILITY), contractCreate(TRACEABILITY, BigInteger.valueOf(55), BigInteger.TWO, BigInteger.TWO) - .via(FIRST_CREATE_TXN), + .via(FIRST_CREATE_TXN) + .gas(500_000L), expectContractStateChangesSidecarFor( FIRST_CREATE_TXN, List.of(StateChange.stateChangeFor(TRACEABILITY) @@ -1032,7 +1034,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(298224) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) .setGasUsed(68492) @@ -1072,7 +1074,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + SECOND)) .setGasUsed(28692) @@ -1112,7 +1114,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + THIRD)) .setGasUsed(28692) @@ -1170,7 +1172,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978632) .setGasUsed(57011) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -1190,7 +1192,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(963059) + .setGas(962697) .setGasUsed(2347) .setCallDepth(1) .setRecipientContract( @@ -1204,7 +1206,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallingContract( spec.registry().getContractId(TRACEABILITY)) .setCallDepth(1) - .setGas(960277) + .setGas(959915) .setGasUsed(5324) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -1219,7 +1221,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(954683) + .setGas(954321) .setGasUsed(5810) .setCallDepth(1) .setRecipientContract( @@ -1237,7 +1239,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(936458) + .setGas(936102) .setGasUsed(2315) .setCallDepth(2) .setRecipientContract( @@ -1250,7 +1252,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(948592) + .setGas(948230) .setGasUsed(4209) .setCallDepth(1) .setRecipientContract( @@ -1269,7 +1271,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(932820) + .setGas(932463) .setGasUsed(3180) .setCallDepth(2) .setRecipientContract( @@ -1283,7 +1285,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(941399) + .setGas(941036) .setGasUsed(3278) .setCallDepth(1) .setRecipientContract( @@ -1301,7 +1303,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(925906) + .setGas(925548) .setGasUsed(2347) .setCallDepth(2) .setRecipientContract( @@ -1314,7 +1316,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(937474) + .setGas(937112) .setGasUsed(21401) .setCallDepth(1) .setRecipientContract( @@ -1333,7 +1335,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(921827) + .setGas(921471) .setGasUsed(20323) .setCallDepth(2) .setRecipientContract( @@ -1347,7 +1349,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(915805) + .setGas(915443) .setGasUsed(3345) .setCallDepth(1) .setRecipientContract( @@ -1365,7 +1367,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(900689) + .setGas(900333) .setGasUsed(2391) .setCallDepth(2) .setRecipientContract( @@ -1378,7 +1380,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(911814) + .setGas(911452) .setGasUsed(4235) .setCallDepth(1) .setRecipientContract( @@ -1397,7 +1399,7 @@ private HapiSpec traceabilityE2EScenario3() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(896634) + .setGas(896278) .setGasUsed(3224) .setCallDepth(2) .setRecipientContract( @@ -1414,7 +1416,8 @@ private HapiSpec traceabilityE2EScenario4() { .given( uploadInitCode(TRACEABILITY), contractCreate(TRACEABILITY, BigInteger.TWO, BigInteger.valueOf(3), BigInteger.valueOf(4)) - .via(FIRST_CREATE_TXN), + .via(FIRST_CREATE_TXN) + .gas(500_000L), expectContractStateChangesSidecarFor( FIRST_CREATE_TXN, List.of(StateChange.stateChangeFor(TRACEABILITY) @@ -1439,7 +1442,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(298224) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) .setGasUsed(68492) @@ -1478,7 +1481,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48260) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + SECOND)) .setGasUsed(8792) @@ -1517,7 +1520,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48260) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + THIRD)) .setGasUsed(8792) @@ -1563,7 +1566,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978632) .setGasUsed(23913) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -1583,7 +1586,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(963038) + .setGas(962676) .setGasUsed(2347) .setCallDepth(1) .setRecipientContract( @@ -1597,7 +1600,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallingContract( spec.registry().getContractId(TRACEABILITY)) .setCallDepth(1) - .setGas(960256) + .setGas(959894) .setGasUsed(3223) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -1610,7 +1613,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(956871) + .setGas(956509) .setGasUsed(2391) .setCallDepth(1) .setRecipientContract( @@ -1624,7 +1627,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallingContract( spec.registry().getContractId(TRACEABILITY)) .setCallDepth(1) - .setGas(954049) + .setGas(953687) .setGasUsed(3224) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -1637,7 +1640,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(950522) + .setGas(950160) .setGasUsed(5810) .setCallDepth(1) .setRecipientContract( @@ -1655,7 +1658,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(932362) + .setGas(932006) .setGasUsed(2315) .setCallDepth(2) .setRecipientContract( @@ -1668,7 +1671,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(944118) + .setGas(943755) .setGasUsed(3953) .setCallDepth(1) .setRecipientContract( @@ -1687,7 +1690,7 @@ private HapiSpec traceabilityE2EScenario4() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(925954) + .setGas(925596) .setGasUsed(423) .setCallDepth(2) .setRecipientContract( @@ -1704,7 +1707,8 @@ private HapiSpec traceabilityE2EScenario5() { .given( uploadInitCode(TRACEABILITY), contractCreate(TRACEABILITY, BigInteger.valueOf(55), BigInteger.TWO, BigInteger.TWO) - .via(FIRST_CREATE_TXN), + .via(FIRST_CREATE_TXN) + .gas(500_000L), expectContractStateChangesSidecarFor( FIRST_CREATE_TXN, List.of(StateChange.stateChangeFor(TRACEABILITY) @@ -1729,7 +1733,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(298224) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) .setGasUsed(68492) @@ -1744,7 +1748,8 @@ private HapiSpec traceabilityE2EScenario5() { BigInteger.TWO), contractCustomCreate( TRACEABILITY, SECOND, BigInteger.ZERO, BigInteger.ZERO, BigInteger.valueOf(12)) - .via(SECOND_CREATE_TXN), + .via(SECOND_CREATE_TXN) + .gas(500_000L), expectContractStateChangesSidecarFor( SECOND_CREATE_TXN, List.of(StateChange.stateChangeFor(TRACEABILITY + SECOND) @@ -1769,7 +1774,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(298248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + SECOND)) .setGasUsed(28692) @@ -1784,7 +1789,8 @@ private HapiSpec traceabilityE2EScenario5() { BigInteger.valueOf(12)), contractCustomCreate( TRACEABILITY, THIRD, BigInteger.valueOf(4), BigInteger.ONE, BigInteger.ZERO) - .via(THIRD_CREATE_TXN), + .via(THIRD_CREATE_TXN) + .gas(500_000L), expectContractStateChangesSidecarFor( THIRD_CREATE_TXN, List.of(StateChange.stateChangeFor(TRACEABILITY + THIRD) @@ -1809,7 +1815,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(298236) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + THIRD)) .setGasUsed(48592) @@ -1865,7 +1871,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978632) .setGasUsed(27376) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -1885,7 +1891,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(963081) + .setGas(962719) .setGasUsed(2347) .setCallDepth(1) .setRecipientContract( @@ -1899,7 +1905,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallingContract( spec.registry().getContractId(TRACEABILITY)) .setCallDepth(1) - .setGas(960300) + .setGas(959937) .setGasUsed(5324) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -1914,7 +1920,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(952373) + .setGas(952011) .setGasUsed(2315) .setCallDepth(1) .setRecipientContract( @@ -1927,7 +1933,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(949607) + .setGas(949245) .setGasUsed(3180) .setCallDepth(1) .setRecipientContract( @@ -1941,7 +1947,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(946117) + .setGas(945755) .setGasUsed(5777) .setCallDepth(1) .setRecipientContract( @@ -1959,7 +1965,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallOperationType(CallOperationType.OP_STATICCALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(928090) + .setGas(927734) .setGasUsed(2347) .setCallDepth(2) .setRecipientContract( @@ -1972,7 +1978,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(940069) + .setGas(939707) .setGasUsed(3320) .setCallDepth(1) .setRecipientContract( @@ -1990,7 +1996,7 @@ private HapiSpec traceabilityE2EScenario5() { .setCallOperationType(CallOperationType.OP_STATICCALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(924598) + .setGas(924242) .setGasUsed(2391) .setCallDepth(2) .setRecipientContract( @@ -2006,7 +2012,8 @@ private HapiSpec traceabilityE2EScenario6() { .given( uploadInitCode(TRACEABILITY), contractCreate(TRACEABILITY, BigInteger.TWO, BigInteger.valueOf(3), BigInteger.valueOf(4)) - .via(FIRST_CREATE_TXN), + .via(FIRST_CREATE_TXN) + .gas(500_000L), expectContractStateChangesSidecarFor( FIRST_CREATE_TXN, List.of(StateChange.stateChangeFor(TRACEABILITY) @@ -2031,7 +2038,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(298224) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) .setGasUsed(68492) @@ -2071,7 +2078,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + SECOND)) .setGasUsed(28692) @@ -2110,7 +2117,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + THIRD)) .setGasUsed(28692) @@ -2164,7 +2171,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978632) .setGasUsed(29910) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -2184,7 +2191,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(963082) + .setGas(962720) .setGasUsed(2347) .setCallDepth(1) .setRecipientContract( @@ -2198,7 +2205,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallingContract( spec.registry().getContractId(TRACEABILITY)) .setCallDepth(1) - .setGas(960301) + .setGas(959938) .setGasUsed(5324) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -2211,7 +2218,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(954706) + .setGas(954344) .setGasUsed(5810) .setCallDepth(1) .setRecipientContract( @@ -2229,7 +2236,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(936481) + .setGas(936124) .setGasUsed(2315) .setCallDepth(2) .setRecipientContract( @@ -2242,7 +2249,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(948616) + .setGas(948254) .setGasUsed(4209) .setCallDepth(1) .setRecipientContract( @@ -2261,7 +2268,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(932843) + .setGas(932487) .setGasUsed(3180) .setCallDepth(2) .setRecipientContract( @@ -2275,7 +2282,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(943883) + .setGas(943521) .setGasUsed(5777) .setCallDepth(1) .setRecipientContract( @@ -2293,7 +2300,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallOperationType(CallOperationType.OP_STATICCALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(925891) + .setGas(925534) .setGasUsed(2347) .setCallDepth(2) .setRecipientContract( @@ -2306,7 +2313,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(937591) + .setGas(937229) .setGasUsed(3320) .setCallDepth(1) .setRecipientContract( @@ -2324,7 +2331,7 @@ private HapiSpec traceabilityE2EScenario6() { .setCallOperationType(CallOperationType.OP_STATICCALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + SECOND)) - .setGas(922159) + .setGas(921803) .setGasUsed(2391) .setCallDepth(2) .setRecipientContract( @@ -2365,7 +2372,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(115992) .setRecipientContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) .setGasUsed(67632) @@ -2409,7 +2416,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(116016) .setRecipientContract( spec.registry().getContractId(TRACEABILITY_CALLCODE + SECOND)) .setGasUsed(27832) @@ -2453,7 +2460,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(116004) .setRecipientContract( spec.registry().getContractId(TRACEABILITY_CALLCODE + THIRD)) .setGasUsed(47732) @@ -2511,7 +2518,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978632) .setGasUsed(51483) .setRecipientContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) @@ -2531,7 +2538,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(963159) + .setGas(962797) .setGasUsed(2500) .setCallDepth(1) .setRecipientContract( @@ -2546,7 +2553,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) .setCallDepth(1) - .setGas(960259) + .setGas(959897) .setGasUsed(5249) .setRecipientContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) @@ -2561,7 +2568,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(952294) + .setGas(951931) .setGasUsed(2368) .setCallDepth(1) .setRecipientContract(spec.registry() @@ -2575,7 +2582,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(949526) + .setGas(949163) .setGasUsed(3215) .setCallDepth(1) .setRecipientContract(spec.registry() @@ -2589,7 +2596,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(945992) + .setGas(945630) .setGasUsed(6069) .setCallDepth(1) .setRecipientContract(spec.registry() @@ -2607,7 +2614,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallOperationType(CallOperationType.OP_CALLCODE) .setCallingContract(spec.registry() .getContractId(TRACEABILITY_CALLCODE + SECOND)) - .setGas(927718) + .setGas(927361) .setGasUsed(2500) .setCallDepth(2) .setRecipientContract(spec.registry() @@ -2622,7 +2629,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(939626) + .setGas(939264) .setGasUsed(21544) .setCallDepth(1) .setRecipientContract(spec.registry() @@ -2641,7 +2648,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallOperationType(CallOperationType.OP_CALLCODE) .setCallingContract(spec.registry() .getContractId(TRACEABILITY_CALLCODE + SECOND)) - .setGas(923822) + .setGas(923465) .setGasUsed(20381) .setCallDepth(2) .setRecipientContract(spec.registry() @@ -2658,7 +2665,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(918049) + .setGas(917687) .setGasUsed(3393) .setCallDepth(1) .setRecipientContract(spec.registry() @@ -2676,7 +2683,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallOperationType(CallOperationType.OP_CALLCODE) .setCallingContract(spec.registry() .getContractId(TRACEABILITY_CALLCODE + SECOND)) - .setGas(902867) + .setGas(902511) .setGasUsed(2522) .setCallDepth(2) .setRecipientContract(spec.registry() @@ -2691,7 +2698,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(914320) + .setGas(913958) .setGasUsed(1270) .setCallDepth(1) .setRecipientContract(spec.registry() @@ -2710,7 +2717,7 @@ private HapiSpec traceabilityE2EScenario7() { .setCallOperationType(CallOperationType.OP_CALLCODE) .setCallingContract(spec.registry() .getContractId(TRACEABILITY_CALLCODE + SECOND)) - .setGas(899149) + .setGas(898793) .setGasUsed(349) .setCallDepth(2) .setRecipientContract(spec.registry() @@ -2755,7 +2762,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(115992) .setRecipientContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) .setGasUsed(67632) @@ -2799,7 +2806,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(116016) .setRecipientContract( spec.registry().getContractId(TRACEABILITY_CALLCODE + SECOND)) .setGasUsed(27832) @@ -2843,7 +2850,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(116004) .setRecipientContract( spec.registry().getContractId(TRACEABILITY_CALLCODE + THIRD)) .setGasUsed(47732) @@ -2891,7 +2898,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978632) .setGasUsed(29301) .setRecipientContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) @@ -2911,7 +2918,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(962924) + .setGas(962562) .setGasUsed(2500) .setCallDepth(1) .setRecipientContract( @@ -2926,7 +2933,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) .setCallDepth(1) - .setGas(960024) + .setGas(959662) .setGasUsed(3281) .setRecipientContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) @@ -2941,7 +2948,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(956466) + .setGas(956103) .setGasUsed(2522) .setCallDepth(1) .setRecipientContract( @@ -2956,7 +2963,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) .setCallDepth(1) - .setGas(953547) + .setGas(953185) .setGasUsed(3149) .setRecipientContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) @@ -2971,7 +2978,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(950079) + .setGas(949717) .setGasUsed(5783) .setCallDepth(1) .setRecipientContract( @@ -2989,7 +2996,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallOperationType(CallOperationType.OP_CALLCODE) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(931893) + .setGas(931536) .setGasUsed(2368) .setCallDepth(2) .setRecipientContract(spec.registry() @@ -3004,7 +3011,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(943995) + .setGas(943633) .setGasUsed(4290) .setCallDepth(1) .setRecipientContract( @@ -3023,7 +3030,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallOperationType(CallOperationType.OP_CALLCODE) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(928209) + .setGas(927853) .setGasUsed(3215) .setCallDepth(2) .setRecipientContract(spec.registry() @@ -3040,7 +3047,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallOperationType(CallOperationType.OP_CALLCODE) .setCallingContract( spec.registry().getContractId(TRACEABILITY_CALLCODE)) - .setGas(938961) + .setGas(938599) .setGasUsed(4144) .setCallDepth(1) .setRecipientContract(spec.registry() @@ -3061,7 +3068,7 @@ private HapiSpec traceabilityE2EScenario8() { .setCallOperationType(CallOperationType.OP_CALLCODE) .setCallingContract(spec.registry() .getContractId(TRACEABILITY_CALLCODE + SECOND)) - .setGas(920706) + .setGas(920350) .setGasUsed(481) .setCallDepth(2) .setRecipientContract(spec.registry() @@ -3081,7 +3088,8 @@ private HapiSpec traceabilityE2EScenario9() { .given( uploadInitCode(TRACEABILITY), contractCreate(TRACEABILITY, BigInteger.valueOf(55), BigInteger.TWO, BigInteger.TWO) - .via(FIRST_CREATE_TXN), + .via(FIRST_CREATE_TXN) + .gas(500_000L), expectContractStateChangesSidecarFor( FIRST_CREATE_TXN, List.of(StateChange.stateChangeFor(TRACEABILITY) @@ -3106,7 +3114,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(298224) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) .setGasUsed(68492) @@ -3146,7 +3154,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + SECOND)) .setGasUsed(28692) @@ -3185,7 +3193,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + THIRD)) .setGasUsed(28692) @@ -3239,7 +3247,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978632) .setGasUsed(50335) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -3259,7 +3267,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(963040) + .setGas(962678) .setGasUsed(2347) .setCallDepth(1) .setRecipientContract( @@ -3273,7 +3281,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallingContract( spec.registry().getContractId(TRACEABILITY)) .setCallDepth(1) - .setGas(960258) + .setGas(959896) .setGasUsed(5324) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -3288,7 +3296,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(952332) + .setGas(951970) .setGasUsed(2315) .setCallDepth(1) .setRecipientContract( @@ -3301,7 +3309,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(949566) + .setGas(949204) .setGasUsed(3180) .setCallDepth(1) .setRecipientContract( @@ -3315,7 +3323,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(943624) + .setGas(943262) .setGasUsed(29899) .setCallDepth(1) .setRecipientContract( @@ -3329,7 +3337,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + THIRD)) - .setGas(928493) + .setGas(928136) .setGasUsed(2347) .setCallDepth(2) .setRecipientContract( @@ -3342,7 +3350,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + THIRD)) - .setGas(925711) + .setGas(925354) .setGasUsed(20323) .setCallDepth(2) .setRecipientContract( @@ -3356,7 +3364,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + THIRD)) - .setGas(905493) + .setGas(905136) .setGasUsed(2391) .setCallDepth(2) .setRecipientContract( @@ -3369,7 +3377,7 @@ private HapiSpec traceabilityE2EScenario9() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + THIRD)) - .setGas(902659) + .setGas(902302) .setGasUsed(3224) .setCallDepth(2) .setRecipientContract( @@ -3386,7 +3394,8 @@ private HapiSpec traceabilityE2EScenario10() { .given( uploadInitCode(TRACEABILITY), contractCreate(TRACEABILITY, BigInteger.TWO, BigInteger.valueOf(3), BigInteger.valueOf(4)) - .via(FIRST_CREATE_TXN), + .via(FIRST_CREATE_TXN) + .gas(500_000L), expectContractStateChangesSidecarFor( FIRST_CREATE_TXN, List.of(StateChange.stateChangeFor(TRACEABILITY) @@ -3411,7 +3420,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(298224) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) .setGasUsed(68492) @@ -3451,7 +3460,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + SECOND)) .setGasUsed(28692) @@ -3490,7 +3499,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + THIRD)) .setGasUsed(28692) @@ -3545,7 +3554,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978632) .setGasUsed(52541) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -3565,7 +3574,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(963038) + .setGas(962676) .setGasUsed(2347) .setCallDepth(1) .setRecipientContract( @@ -3579,7 +3588,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallingContract( spec.registry().getContractId(TRACEABILITY)) .setCallDepth(1) - .setGas(960256) + .setGas(959894) .setGasUsed(5324) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -3592,7 +3601,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(954662) + .setGas(954300) .setGasUsed(5811) .setCallDepth(1) .setRecipientContract( @@ -3610,7 +3619,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(936436) + .setGas(936080) .setGasUsed(2315) .setCallDepth(2) .setRecipientContract( @@ -3623,7 +3632,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(948571) + .setGas(948209) .setGasUsed(4235) .setCallDepth(1) .setRecipientContract( @@ -3642,7 +3651,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(932774) + .setGas(932417) .setGasUsed(3180) .setCallDepth(2) .setRecipientContract( @@ -3656,7 +3665,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(941591) + .setGas(941228) .setGasUsed(29898) .setCallDepth(1) .setRecipientContract( @@ -3670,7 +3679,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + THIRD)) - .setGas(926492) + .setGas(926135) .setGasUsed(2347) .setCallDepth(2) .setRecipientContract( @@ -3683,7 +3692,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + THIRD)) - .setGas(923710) + .setGas(923353) .setGasUsed(20323) .setCallDepth(2) .setRecipientContract( @@ -3697,7 +3706,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + THIRD)) - .setGas(903492) + .setGas(903135) .setGasUsed(2391) .setCallDepth(2) .setRecipientContract( @@ -3710,7 +3719,7 @@ private HapiSpec traceabilityE2EScenario10() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY + THIRD)) - .setGas(900658) + .setGas(900301) .setGasUsed(3224) .setCallDepth(2) .setRecipientContract( @@ -3727,7 +3736,8 @@ private HapiSpec traceabilityE2EScenario11() { .given( uploadInitCode(TRACEABILITY), contractCreate(TRACEABILITY, BigInteger.TWO, BigInteger.valueOf(3), BigInteger.valueOf(4)) - .via(FIRST_CREATE_TXN), + .via(FIRST_CREATE_TXN) + .gas(500_000L), expectContractStateChangesSidecarFor( FIRST_CREATE_TXN, List.of(StateChange.stateChangeFor(TRACEABILITY) @@ -3752,7 +3762,7 @@ private HapiSpec traceabilityE2EScenario11() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(298224) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) .setGasUsed(68492) @@ -3792,7 +3802,7 @@ private HapiSpec traceabilityE2EScenario11() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + SECOND)) .setGasUsed(28692) @@ -3831,7 +3841,7 @@ private HapiSpec traceabilityE2EScenario11() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(48248) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + THIRD)) .setGasUsed(28692) @@ -3884,7 +3894,7 @@ private HapiSpec traceabilityE2EScenario11() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978632) .setGasUsed(44077) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -3904,7 +3914,7 @@ private HapiSpec traceabilityE2EScenario11() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(963038) + .setGas(962676) .setGasUsed(2347) .setCallDepth(1) .setRecipientContract( @@ -3918,7 +3928,7 @@ private HapiSpec traceabilityE2EScenario11() { .setCallingContract( spec.registry().getContractId(TRACEABILITY)) .setCallDepth(1) - .setGas(960256) + .setGas(959894) .setGasUsed(5324) .setRecipientContract( spec.registry().getContractId(TRACEABILITY)) @@ -3931,7 +3941,7 @@ private HapiSpec traceabilityE2EScenario11() { .setCallOperationType(CallOperationType.OP_DELEGATECALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(952341) + .setGas(951979) .setGasUsed(237) .setCallDepth(1) .setRecipientContract( @@ -3946,7 +3956,7 @@ private HapiSpec traceabilityE2EScenario11() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(949404) + .setGas(949041) .setGasUsed(2347) .setCallDepth(1) .setRecipientContract( @@ -3960,7 +3970,7 @@ private HapiSpec traceabilityE2EScenario11() { .setCallingContract( spec.registry().getContractId(TRACEABILITY)) .setCallDepth(1) - .setGas(946606) + .setGas(946244) .setGasUsed(20323) .setRecipientContract( spec.registry().getContractId(TRACEABILITY + THIRD)) @@ -3973,7 +3983,7 @@ private HapiSpec traceabilityE2EScenario11() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(926387) + .setGas(926025) .setGasUsed(2391) .setCallDepth(1) .setRecipientContract( @@ -3986,7 +3996,7 @@ private HapiSpec traceabilityE2EScenario11() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(TRACEABILITY)) - .setGas(923534) + .setGas(923172) .setGasUsed(3224) .setCallDepth(1) .setRecipientContract( @@ -4021,7 +4031,7 @@ private HapiSpec traceabilityE2EScenario12() { spec.registry().getAccountID(GENESIS)) .setRecipientContract( spec.registry().getContractId(contract)) - .setGas(197000) + .setGas(184672) .setGasUsed(214) .setOutput(EMPTY) .build()))); @@ -4063,7 +4073,7 @@ HapiSpec traceabilityE2EScenario13() { .setCallingAccount(accountIDAtomicReference.get()) .setRecipientContract( spec.registry().getContractId(PAY_RECEIVABLE_CONTRACT)) - .setGas(947000) + .setGas(937984) .setGasUsed(135) .setOutput(EMPTY) .build()))); @@ -4102,7 +4112,7 @@ private HapiSpec traceabilityE2EScenario14() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(accountIDAtomicReference.get()) - .setGas(947000) + .setGas(937984) .setRecipientContract( spec.registry().getContractId(PAY_RECEIVABLE_CONTRACT)) .setGasUsed(135) @@ -4142,7 +4152,7 @@ HapiSpec traceabilityE2EScenario15() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(153184) .setRecipientContract( spec.registry().getContractId(contract)) .setGasUsed(613) @@ -4213,7 +4223,7 @@ HapiSpec traceabilityE2EScenario15() { .setCallType(CALL) .setCallOperationType(CallOperationType.OP_CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(3979000) + .setGas(3965516) .setValue(tcValue) .setRecipientContract( spec.registry() @@ -4233,7 +4243,7 @@ HapiSpec traceabilityE2EScenario15() { .setCallingContract( spec.registry() .getContractId(contract)) - .setGas(3883883) + .setGas(3870609) .setRecipientContract(childId) .setGasUsed(44936) .setValue(tcValue) @@ -4278,7 +4288,7 @@ HapiSpec traceabilityE2EScenario16() { spec.registry().getAccountID(GENESIS)) .setRecipientContract( spec.registry().getContractId(PRECOMPILE_CALLER)) - .setGas(197000) + .setGas(125628) .setGasUsed(942) .setOutput(EMPTY) .build()))); @@ -4303,7 +4313,7 @@ HapiSpec traceabilityE2EScenario16() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingAccount( spec.registry().getAccountID(GENESIS)) - .setGas(79000) + .setGas(78304) .setRecipientContract( spec.registry().getContractId(PRECOMPILE_CALLER)) .setGasUsed(5330) @@ -4322,7 +4332,7 @@ HapiSpec traceabilityE2EScenario16() { .setCallOperationType(CallOperationType.OP_STATICCALL) .setCallingContract( spec.registry().getContractId(PRECOMPILE_CALLER)) - .setGas(76587) + .setGas(75902) // SHA 256 precompile address is // 0x02 .setRecipientContract(ContractID.newBuilder() @@ -4338,7 +4348,7 @@ HapiSpec traceabilityE2EScenario16() { .setCallOperationType(CallOperationType.OP_CALL) .setCallingContract( spec.registry().getContractId(PRECOMPILE_CALLER)) - .setGas(73240) + .setGas(72555) // HTS precompile address is // 0x167 .setRecipientContract(ContractID.newBuilder() @@ -4374,7 +4384,7 @@ private HapiSpec traceabilityE2EScenario17() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(185276) .setRecipientContract( spec.registry().getContractId(REVERTING_CONTRACT)) .setGasUsed(345) @@ -4397,7 +4407,7 @@ private HapiSpec traceabilityE2EScenario17() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) + .setGas(978796) .setGasUsed(32583) .setRecipientContract( spec.registry().getContractId(REVERTING_CONTRACT)) @@ -4410,7 +4420,7 @@ private HapiSpec traceabilityE2EScenario17() { .setCallOperationType(CallOperationType.OP_CREATE) .setCallingContract( spec.registry().getContractId(REVERTING_CONTRACT)) - .setGas(931868) + .setGas(931667) .setCallDepth(1) .setGasUsed(201) .setRevertReason(EMPTY) @@ -4433,7 +4443,7 @@ private HapiSpec traceabilityE2EScenario18() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(185276) .setGasUsed(201) .setRevertReason(EMPTY) .build())))), @@ -4488,7 +4498,7 @@ private HapiSpec traceabilityE2EScenario20() { .given(uploadInitCode(REVERTING_CONTRACT)) .when(contractCreate(REVERTING_CONTRACT, BigInteger.valueOf(6)) .via(FIRST_CREATE_TXN) - .gas(53050) + .gas(64774) .hasKnownStatus(INSUFFICIENT_GAS)) .then( withOpContext((spec, opLog) -> allRunFor( @@ -4522,7 +4532,7 @@ private HapiSpec traceabilityE2EScenario21() { .setCallType(CREATE) .setCallOperationType(CallOperationType.OP_CREATE) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(197000) + .setGas(185276) .setRecipientContract( spec.registry().getContractId(REVERTING_CONTRACT)) .setGasUsed(345) @@ -4545,8 +4555,8 @@ private HapiSpec traceabilityE2EScenario21() { .setCallType(CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) .setCallOperationType(CallOperationType.OP_CALL) - .setGas(979000) - .setGasUsed(963811) + .setGas(978936) + .setGasUsed(963748) .setOutput(EMPTY) /* For EVM v0.34 use this code block instead: @@ -4563,12 +4573,12 @@ private HapiSpec traceabilityE2EScenario21() { spec.registry().getContractId(REVERTING_CONTRACT)) .setCallOperationType(CallOperationType.OP_CALL) .setCallDepth(1) - .setGas(960639) + .setGas(960576) .setInput(ByteStringUtils.wrapUnsafely( Function.parse("boo" + "(uint256)") .encodeCallWithArgs(BigInteger.valueOf(234)) .array())) - .setGasUsed(960639) + .setGasUsed(960576) .setError(ByteString.copyFromUtf8(PRECOMPILE_ERROR.name())) /* For EVM v0.34 use this code block instead: @@ -4606,7 +4616,7 @@ private HapiSpec vanillaBytecodeSidecar() { spec.registry().getAccountID(GENESIS)) .setRecipientContract( spec.registry().getContractId(EMPTY_CONSTRUCTOR_CONTRACT)) - .setGas(197000) + .setGas(195600) .setGasUsed(66) .setOutput(EMPTY) .build()))); @@ -4638,7 +4648,7 @@ private HapiSpec vanillaBytecodeSidecar2() { spec.registry().getAccountID(GENESIS)) .setRecipientContract( spec.registry().getContractId(contract)) - .setGas(197000) + .setGas(184672) .setGasUsed(214) .setOutput(EMPTY) .build()))); @@ -4664,7 +4674,7 @@ private HapiSpec actionsShowPropagatedRevert() { .given( overriding(SIDECARS_PROP, "CONTRACT_ACTION"), uploadInitCode(APPROVE_BY_DELEGATE), - contractCreate(APPROVE_BY_DELEGATE).via(contractCreateTxn), + contractCreate(APPROVE_BY_DELEGATE).gas(500_000).via(contractCreateTxn), withOpContext((spec, opLog) -> { final HapiGetTxnRecord txnRecord = getTxnRecord(contractCreateTxn); allRunFor( @@ -4679,7 +4689,7 @@ private HapiSpec actionsShowPropagatedRevert() { spec.registry().getAccountID(GENESIS)) .setRecipientContract( spec.registry().getContractId(APPROVE_BY_DELEGATE)) - .setGas(197000) + .setGas(433856) .setGasUsed(214) .setOutput(EMPTY) .build()))); @@ -4744,8 +4754,8 @@ private HapiSpec actionsShowPropagatedRevert() { spec.registry() .getAccountID(somebodyElse))), serialNumberId)) - .setGas(979000) - .setGasUsed(948950) + .setGas(978120) + .setGasUsed(948098) .setRevertReason(ByteString.EMPTY) .build(), ContractAction.newBuilder() @@ -4759,8 +4769,8 @@ private HapiSpec actionsShowPropagatedRevert() { .getTokenID(tokenInQuestion) .getTokenNum()) .build()) - .setGas(959347) - .setGasUsed(944446) + .setGas(958481) + .setGasUsed(943594) .setInput(ByteStringUtils.wrapUnsafely(Function.parse( "approve(address,uint256)") .encodeCallWithArgs( @@ -4786,8 +4796,8 @@ private HapiSpec actionsShowPropagatedRevert() { .setRecipientContract(ContractID.newBuilder() .setContractNum(359L) .build()) - .setGas(941693) - .setGasUsed(941693) + .setGas(940841) + .setGasUsed(940841) .setInput(ByteStringUtils.wrapUnsafely(ArrayUtils.addAll( ArrayUtils.addAll( Arrays.copyOfRange( @@ -5041,7 +5051,7 @@ create2Factory, GET_BYTECODE, asHeadlongAddress(factoryEvmAddress.get()), salt) .setCallType(CALL) .setCallOperationType(CallOperationType.OP_CALL) .setCallingAccount(TxnUtils.asId(GENESIS, spec)) - .setGas(3979000) + .setGas(3965516) .setValue(tcValue) .setRecipientContract( spec.registry() @@ -5061,7 +5071,7 @@ create2Factory, GET_BYTECODE, asHeadlongAddress(factoryEvmAddress.get()), salt) .setCallingContract( spec.registry() .getContractId(create2Factory)) - .setGas(3883883) + .setGas(3870609) // recipient should be the // original hollow account id as // a contract diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/file/FileUpdateSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/file/FileUpdateSuite.java index a7c8cb5fc148..84fd85f311ce 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/file/FileUpdateSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/file/FileUpdateSuite.java @@ -373,7 +373,7 @@ private HapiSpec allUnusedGasIsRefundedIfSoConfigured() { .when(contractCall(CONTRACT, CREATE_TXN).gas(1_000_000L)) .then(contractCallLocal(CONTRACT, INDIRECT_GET_ABI) .gas(300_000L) - .has(resultWith().gasUsed(26_451))); + .has(resultWith().gasUsed(26_515))); } @HapiTest diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/leaky/LeakyContractTestsSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/leaky/LeakyContractTestsSuite.java index 3848d63e404c..5d83bd50eeeb 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/leaky/LeakyContractTestsSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/leaky/LeakyContractTestsSuite.java @@ -511,7 +511,7 @@ private HapiSpec transferDontWorkWithoutTopLevelSignatures() { cryptoTransfer(moving(500, VANILLA_TOKEN).between(TOKEN_TREASURY, ACCOUNT)), cryptoTransfer(movingUnique(KNOWABLE_TOKEN, 1, 2, 3, 4).between(TOKEN_TREASURY, ACCOUNT)), uploadInitCode(contract), - contractCreate(contract)) + contractCreate(contract).gas(500_000L)) .when( // Do transfers by calling contract from EOA, and should be failing with // CONTRACT_REVERT_EXECUTED @@ -655,7 +655,7 @@ private HapiSpec transferWorksWithTopLevelSignatures() { cryptoTransfer(moving(500, VANILLA_TOKEN).between(TOKEN_TREASURY, ACCOUNT)), cryptoTransfer(movingUnique(KNOWABLE_TOKEN, 1, 2, 3, 4).between(TOKEN_TREASURY, ACCOUNT)), uploadInitCode(contract), - contractCreate(contract)) + contractCreate(contract).gas(500_000L)) .when( // Do transfers by calling contract from EOA withOpContext((spec, opLog) -> { @@ -791,7 +791,7 @@ private HapiSpec transferFailsWithIncorrectAmounts() { tokenAssociate(RECEIVER, VANILLA_TOKEN), cryptoTransfer(moving(500, VANILLA_TOKEN).between(TOKEN_TREASURY, ACCOUNT)), uploadInitCode(contract), - contractCreate(contract)) + contractCreate(contract).gas(500_000L)) .when(withOpContext((spec, opLog) -> { final var receiver1 = asHeadlongAddress(asAddress(spec.registry().getAccountID(RECEIVER))); @@ -1572,7 +1572,7 @@ HapiSpec temporarySStoreRefundTest() { .given( overriding(CONTRACTS_MAX_REFUND_PERCENT_OF_GAS_LIMIT1, "100"), uploadInitCode(contract), - contractCreate(contract)) + contractCreate(contract).gas(500_000L)) .when( contractCall(contract, "holdTemporary", BigInteger.valueOf(10)) .via("tempHoldTx"), @@ -1598,7 +1598,7 @@ HapiSpec temporarySStoreRefundTest() { .getContractCallResult() .getGasUsed(); - Assertions.assertTrue(gasUsedForTemporaryHoldTx < 23535L); + Assertions.assertTrue(gasUsedForTemporaryHoldTx < 23739L); Assertions.assertTrue(gasUsedForPermanentHoldTx > 20000L); }), UtilVerbs.resetToDefault(CONTRACTS_MAX_REFUND_PERCENT_OF_GAS_LIMIT1)); @@ -2155,7 +2155,7 @@ private HapiSpec contractCreateNoncesExternalizationHappyPath() { overriding(CONTRACTS_NONCES_EXTERNALIZATION_ENABLED, "true"), cryptoCreate(PAYER).balance(10 * ONE_HUNDRED_HBARS), uploadInitCode(contract), - contractCreate(contract).via(contractCreateTxn)) + contractCreate(contract).via(contractCreateTxn).gas(500_000L)) .when() .then(withOpContext((spec, opLog) -> { final var opContractTxnRecord = getTxnRecord(contractCreateTxn); @@ -2213,7 +2213,7 @@ private HapiSpec contractCreateFollowedByContractCallNoncesExternalization() { overriding(CONTRACTS_NONCES_EXTERNALIZATION_ENABLED, "true"), cryptoCreate(payer).balance(10 * ONE_HUNDRED_HBARS), uploadInitCode(contract), - contractCreate(contract).via(contractCreateTx)) + contractCreate(contract).via(contractCreateTx).gas(500_000L)) .when(withOpContext((spec, opLog) -> allRunFor( spec, contractCall(contract, deployParentContractFn) @@ -2304,7 +2304,7 @@ private HapiSpec shouldReturnNullWhenContractsNoncesExternalizationFlagIsDisable overriding(CONTRACTS_NONCES_EXTERNALIZATION_ENABLED, "false"), cryptoCreate(payer).balance(10 * ONE_HUNDRED_HBARS), uploadInitCode(contract), - contractCreate(contract).logged().via("txn"), + contractCreate(contract).logged().gas(500_000L).via("txn"), withOpContext((spec, opLog) -> { HapiGetTxnRecord op = getTxnRecord("txn") .logged() diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/factories/IdFuzzingProviderFactory.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/factories/IdFuzzingProviderFactory.java index 0c8b94d79a1d..9ba76ea73338 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/factories/IdFuzzingProviderFactory.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/factories/IdFuzzingProviderFactory.java @@ -204,7 +204,7 @@ private static HapiSpecOperation[] initOpFungibleTransfer() { .exposingCreatedIdTo(id -> tokenAddr.set(HapiPropertySource.asHexedSolidityAddress(HapiPropertySource.asToken(id)))), uploadInitCode(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT), - contractCreate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT), + contractCreate(TRANSFER_TO_ALIAS_PRECOMPILE_CONTRACT).gas(500_000L), tokenAssociate(OWNER, List.of(FUNGIBLE_TOKEN)), cryptoTransfer(moving(INITIAL_SUPPLY, FUNGIBLE_TOKEN).between(TOKEN_TREASURY, OWNER)) }; diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/token/TokenAssociationSpecs.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/token/TokenAssociationSpecs.java index ddc1fbf77a5a..fb8dfb08d9e8 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/token/TokenAssociationSpecs.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/token/TokenAssociationSpecs.java @@ -203,7 +203,7 @@ public HapiSpec expiredAndDeletedTokensStillAppearInContractInfo() { newKeyNamed("admin"), cryptoCreate(treasury), uploadInitCode(contract), - contractCreate(contract).gas(300_000).via(CREATION), + contractCreate(contract).gas(600_000).via(CREATION), withOpContext((spec, opLog) -> { var subOp = getTxnRecord(CREATION); allRunFor(spec, subOp); @@ -388,7 +388,7 @@ public HapiSpec dissociateHasExpectedSemanticsForDissociatedContracts() { newKeyNamed(MULTI_KEY), cryptoCreate(TOKEN_TREASURY).balance(0L).maxAutomaticTokenAssociations(542), uploadInitCode(contract), - contractCreate(contract).gas(300_000), + contractCreate(contract).gas(600_000), tokenCreate(uniqToken) .tokenType(NON_FUNGIBLE_UNIQUE) .initialSupply(0) From 6353aeb5bc77823b083abbaeb6194446d43c9ece Mon Sep 17 00:00:00 2001 From: Cody Littley <56973212+cody-littley@users.noreply.github.com> Date: Mon, 11 Dec 2023 12:09:28 -0600 Subject: [PATCH 09/13] feat: migrate event creation to new wiring framework (#10236) Signed-off-by: Cody Littley --- platform-sdk/sdk/settings.txt | 2 +- .../config/PlatformSchedulersConfig.java | 36 ++- .../model/internal/InputWireChecks.java | 8 +- .../com/swirlds/platform/SwirldsPlatform.java | 91 ++++--- .../creation/AsyncEventCreationManager.java | 2 +- .../event/creation/EventCreationConfig.java | 7 + .../event/creation/EventCreationManager.java | 144 ++++++++++ .../creation/EventCreationManagerFactory.java | 57 +++- .../platform/event/creation/EventCreator.java | 3 +- .../creation/SyncEventCreationManager.java | 3 +- .../creation/tipset/TipsetEventCreator.java | 20 +- .../platform/wiring/PlatformCoordinator.java | 28 +- .../platform/wiring/PlatformSchedulers.java | 9 + .../platform/wiring/PlatformWiring.java | 35 ++- .../EventCreationManagerWiring.java | 140 ++++++++++ .../platform/wiring/diagram-commands.txt | 7 +- .../platform/wiring/PlatformWiringTests.java | 4 +- .../tipset/EventCreationManagerTests.java | 246 ++++++++++++++++++ .../event/tipset/TipsetEventCreatorTests.java | 33 +-- 19 files changed, 780 insertions(+), 95 deletions(-) create mode 100644 platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationManager.java create mode 100644 platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/components/EventCreationManagerWiring.java create mode 100644 platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/test/java/com/swirlds/platform/test/event/tipset/EventCreationManagerTests.java diff --git a/platform-sdk/sdk/settings.txt b/platform-sdk/sdk/settings.txt index a5fe8c1d1316..1c1095e7cccc 100644 --- a/platform-sdk/sdk/settings.txt +++ b/platform-sdk/sdk/settings.txt @@ -45,4 +45,4 @@ prometheus.endpointEnabled, false # Misc. # ############################# -loadKeysFromPfxFiles, false \ No newline at end of file +loadKeysFromPfxFiles, false diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/config/PlatformSchedulersConfig.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/config/PlatformSchedulersConfig.java index f16e592350e4..c0c8cf8fe5c5 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/config/PlatformSchedulersConfig.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/config/PlatformSchedulersConfig.java @@ -25,19 +25,27 @@ * Contains configuration values for the platform schedulers. * * @param internalEventValidatorSchedulerType the internal event validator scheduler type - * @param internalEventValidatorUnhandledCapacity number of unhandled events allowed in the internal event validator scheduler + * @param internalEventValidatorUnhandledCapacity number of unhandled events allowed in the internal event validator + * scheduler * @param eventDeduplicatorSchedulerType the event deduplicator scheduler type - * @param eventDeduplicatorUnhandledCapacity number of unhandled tasks allowed in the event deduplicator scheduler + * @param eventDeduplicatorUnhandledCapacity number of unhandled tasks allowed in the event deduplicator + * scheduler * @param eventSignatureValidatorSchedulerType the event signature validator scheduler type - * @param eventSignatureValidatorUnhandledCapacity number of unhandled tasks allowed in the event signature validator scheduler + * @param eventSignatureValidatorUnhandledCapacity number of unhandled tasks allowed in the event signature validator + * scheduler * @param orphanBufferSchedulerType the orphan buffer scheduler type * @param orphanBufferUnhandledCapacity number of unhandled tasks allowed in the orphan buffer scheduler * @param inOrderLinkerSchedulerType the in-order linker scheduler type * @param inOrderLinkerUnhandledCapacity number of unhandled tasks allowed in the in-order linker scheduler * @param linkedEventIntakeSchedulerType the linked event intake scheduler type - * @param linkedEventIntakeUnhandledCapacity number of unhandled tasks allowed in the linked event intake scheduler + * @param linkedEventIntakeUnhandledCapacity number of unhandled tasks allowed in the linked event intake + * scheduler + * @param eventCreationManagerSchedulerType the event creation manager scheduler type + * @param eventCreationManagerUnhandledCapacity number of unhandled tasks allowed in the event creation manager + * scheduler * @param signedStateFileManagerSchedulerType the signed state file manager scheduler type - * @param signedStateFileManagerUnhandledCapacity number of unhandled tasks allowed in the signed state file manager scheduler + * @param signedStateFileManagerUnhandledCapacity number of unhandled tasks allowed in the signed state file manager + * scheduler */ @ConfigData("platformSchedulers") public record PlatformSchedulersConfig( @@ -53,6 +61,8 @@ public record PlatformSchedulersConfig( @ConfigProperty(defaultValue = "500") int inOrderLinkerUnhandledCapacity, @ConfigProperty(defaultValue = "SEQUENTIAL") String linkedEventIntakeSchedulerType, @ConfigProperty(defaultValue = "500") int linkedEventIntakeUnhandledCapacity, + @ConfigProperty(defaultValue = "SEQUENTIAL") String eventCreationManagerSchedulerType, + @ConfigProperty(defaultValue = "500") int eventCreationManagerUnhandledCapacity, @ConfigProperty(defaultValue = "SEQUENTIAL_THREAD") String signedStateFileManagerSchedulerType, @ConfigProperty(defaultValue = "20") int signedStateFileManagerUnhandledCapacity) { @@ -61,6 +71,7 @@ public record PlatformSchedulersConfig( * * @return the internal event validator scheduler type */ + @NonNull public TaskSchedulerType getInternalEventValidatorSchedulerType() { return TaskSchedulerType.valueOf(internalEventValidatorSchedulerType); } @@ -70,6 +81,7 @@ public TaskSchedulerType getInternalEventValidatorSchedulerType() { * * @return the event deduplicator scheduler type */ + @NonNull public TaskSchedulerType getEventDeduplicatorSchedulerType() { return TaskSchedulerType.valueOf(eventDeduplicatorSchedulerType); } @@ -79,6 +91,7 @@ public TaskSchedulerType getEventDeduplicatorSchedulerType() { * * @return the event signature validator scheduler type */ + @NonNull public TaskSchedulerType getEventSignatureValidatorSchedulerType() { return TaskSchedulerType.valueOf(eventSignatureValidatorSchedulerType); } @@ -88,6 +101,7 @@ public TaskSchedulerType getEventSignatureValidatorSchedulerType() { * * @return the orphan buffer scheduler type */ + @NonNull public TaskSchedulerType getOrphanBufferSchedulerType() { return TaskSchedulerType.valueOf(orphanBufferSchedulerType); } @@ -97,6 +111,7 @@ public TaskSchedulerType getOrphanBufferSchedulerType() { * * @return the in-order linker scheduler type */ + @NonNull public TaskSchedulerType getInOrderLinkerSchedulerType() { return TaskSchedulerType.valueOf(inOrderLinkerSchedulerType); } @@ -106,10 +121,21 @@ public TaskSchedulerType getInOrderLinkerSchedulerType() { * * @return the linked event intake scheduler type */ + @NonNull public TaskSchedulerType getLinkedEventIntakeSchedulerType() { return TaskSchedulerType.valueOf(linkedEventIntakeSchedulerType); } + /** + * Get the event creation manager scheduler type + * + * @return the event creation manager scheduler type + */ + @NonNull + public TaskSchedulerType getEventCreationManagerSchedulerType() { + return TaskSchedulerType.valueOf(eventCreationManagerSchedulerType); + } + /** * Get the signed state file manager scheduler type * diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/InputWireChecks.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/InputWireChecks.java index baf6e95f5ac0..b6bafca9394a 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/InputWireChecks.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/InputWireChecks.java @@ -17,6 +17,7 @@ package com.swirlds.common.wiring.model.internal; import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; +import static com.swirlds.logging.legacy.LogMarker.STARTUP; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.Set; @@ -43,6 +44,7 @@ public static boolean checkForUnboundInputWires( @NonNull final Set inputWires, @NonNull final Set boundInputWires) { if (inputWires.size() == boundInputWires.size()) { + logger.info(STARTUP.getMarker(), "All input wires have been bound."); return false; } @@ -51,11 +53,11 @@ public static boolean checkForUnboundInputWires( for (final InputWireDescriptor inputWire : inputWires) { if (!boundInputWires.contains(inputWire)) { sb.append(" - ") - .append("Input wire ") + .append("Input wire '") .append(inputWire.name()) - .append(" in scheduler ") + .append("' in scheduler '") .append(inputWire.taskSchedulerName()) - .append("\n"); + .append("'\n"); } } diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldsPlatform.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldsPlatform.java index 46570ac52be5..dcb9e390a43a 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldsPlatform.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldsPlatform.java @@ -22,6 +22,7 @@ import static com.swirlds.logging.legacy.LogMarker.RECONNECT; import static com.swirlds.logging.legacy.LogMarker.STARTUP; import static com.swirlds.platform.event.creation.EventCreationManagerFactory.buildEventCreationManager; +import static com.swirlds.platform.event.creation.EventCreationManagerFactory.buildLegacyEventCreationManager; import static com.swirlds.platform.state.address.AddressBookMetrics.registerAddressBookMetrics; import static com.swirlds.platform.state.iss.ConsensusHashManager.DO_NOT_IGNORE_ROUNDS; import static com.swirlds.platform.state.signed.SignedStateFileReader.getSavedStateFiles; @@ -83,6 +84,7 @@ import com.swirlds.platform.event.EventUtils; import com.swirlds.platform.event.GossipEvent; import com.swirlds.platform.event.creation.AsyncEventCreationManager; +import com.swirlds.platform.event.creation.EventCreationManager; import com.swirlds.platform.event.deduplication.EventDeduplicator; import com.swirlds.platform.event.linking.EventLinker; import com.swirlds.platform.event.linking.InOrderLinker; @@ -503,8 +505,7 @@ public class SwirldsPlatform implements Platform { final WiringModel model = WiringModel.create(platformContext, Time.getCurrent()); components.add(model); - platformWiring = new PlatformWiring(platformContext, time); - components.add(platformWiring); + platformWiring = components.add(new PlatformWiring(platformContext, time)); platformWiring.wireExternalComponents( preconsensusEventWriter, platformStatusManager, appCommunicationComponent); @@ -731,13 +732,25 @@ public class SwirldsPlatform implements Platform { preConsensusEventHandler::preconsensusEvent, intakeEventCounter); + final EventCreationManager eventCreationManager = buildEventCreationManager( + platformContext, + time, + this, + currentAddressBook, + selfId, + appVersion, + transactionPool, + platformStatusManager::getCurrentStatus, + latestReconnectRound::get); + platformWiring.bindIntake( internalEventValidator, eventDeduplicator, eventSignatureValidator, orphanBuffer, inOrderLinker, - linkedEventIntake); + linkedEventIntake, + eventCreationManager); intakeHandler = platformWiring.getEventInput()::put; } @@ -752,19 +765,23 @@ public class SwirldsPlatform implements Platform { .setMetricsConfiguration(new QueueThreadMetricsConfiguration(metrics).enableMaxSizeMetric()) .build()); - eventCreator = buildEventCreationManager( - platformContext, - threadManager, - time, - this, - currentAddressBook, - selfId, - appVersion, - transactionPool, - intakeQueue, - eventObserverDispatcher, - platformStatusManager::getCurrentStatus, - latestReconnectRound::get); + if (eventConfig.useLegacyIntake()) { + eventCreator = buildLegacyEventCreationManager( + platformContext, + threadManager, + time, + this, + currentAddressBook, + selfId, + appVersion, + transactionPool, + intakeQueue, + eventObserverDispatcher, + platformStatusManager::getCurrentStatus, + latestReconnectRound::get); + } else { + eventCreator = null; + } transactionSubmitter = new SwirldTransactionSubmitter( platformStatusManager::getCurrentStatus, @@ -838,7 +855,12 @@ public class SwirldsPlatform implements Platform { }); } - final Clearable pauseEventCreation = eventCreator::pauseEventCreation; + final Clearable pauseEventCreation; + if (eventCreator != null) { + pauseEventCreation = eventCreator::pauseEventCreation; + } else { + pauseEventCreation = () -> {}; + } if (eventConfig.useLegacyIntake()) { clearAllPipelines = new LoggingClearables( @@ -853,7 +875,6 @@ public class SwirldsPlatform implements Platform { clearAllPipelines = new LoggingClearables( RECONNECT.getMarker(), List.of( - Pair.of(pauseEventCreation, "eventCreator"), Pair.of(intakeQueue, "intakeQueue"), Pair.of(platformWiring, "platformWiring"), Pair.of(shadowGraph, "shadowGraph"), @@ -963,6 +984,12 @@ private void initializeState(@NonNull final SignedState signedState) { private void loadStateIntoEventCreator(@NonNull final SignedState signedState) { Objects.requireNonNull(signedState); + if (eventCreator == null) { + // Event creator is null when using the new intake pipeline. New intake pipeline + // is not compatible with old states that contain events that need to be loaded. + return; + } + try { eventCreator.setMinimumGenerationNonAncient( signedState.getState().getPlatformState().getPlatformData().getMinimumGenerationNonAncient()); @@ -1078,10 +1105,9 @@ private void loadReconnectState(final SignedState signedState) { // from the ones we had before the reconnect intakeQueue.pause(); try { - if (platformContext - .getConfiguration() - .getConfigData(EventConfig.class) - .useLegacyIntake()) { + final EventConfig eventConfig = + platformContext.getConfiguration().getConfigData(EventConfig.class); + if (eventConfig.useLegacyIntake()) { eventValidators.replaceValidator( SignatureValidator.VALIDATOR_NAME, new SignatureValidator( @@ -1131,7 +1157,10 @@ private void loadReconnectState(final SignedState signedState) { } gossip.resetFallenBehind(); - eventCreator.resumeEventCreation(); + + if (eventCreator != null) { + eventCreator.resumeEventCreation(); + } } /** @@ -1176,7 +1205,7 @@ private EventLinker buildEventLinker( /** * Build the preconsensus event file manager. * - * @param startingRound the round number of the initial state being loaded into the system + * @param startingRound the round number of the initial state being loaded into the system */ @NonNull private PreconsensusEventFileManager buildPreconsensusEventFileManager(final long startingRound) { @@ -1218,10 +1247,12 @@ public void start() { metrics.start(); - // The event creator is intentionally started before replaying the preconsensus event stream. - // This prevents the event creator's intake queue from filling up and blocking. Note that - // this component won't actually create events until the platform has the appropriate status. - eventCreator.start(); + if (eventCreator != null) { + // The event creator is intentionally started before replaying the preconsensus event stream. + // This prevents the event creator's intake queue from filling up and blocking. Note that + // this component won't actually create events until the platform has the appropriate status. + eventCreator.start(); + } replayPreconsensusEvents(); gossip.start(); @@ -1238,7 +1269,9 @@ public void start() { */ public void performPcesRecovery() { components.start(); - eventCreator.start(); + if (eventCreator != null) { + eventCreator.start(); + } replayPreconsensusEvents(); stateManagementComponent.dumpLatestImmutableState(StateToDiskReason.PCES_RECOVERY_COMPLETE, true); } diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/AsyncEventCreationManager.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/AsyncEventCreationManager.java index cd92abc7199b..c91179edb852 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/AsyncEventCreationManager.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/AsyncEventCreationManager.java @@ -142,7 +142,7 @@ public void setMinimumGenerationNonAncient(final long minimumGenerationNonAncien * @param event the event to pass */ private void handleEvent(@NonNull final EventImpl event) { - eventCreator.registerEvent(event); + eventCreator.registerEvent(event.getBaseEvent()); } /** diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationConfig.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationConfig.java index 47cb222b7f94..650be2b57d16 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationConfig.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationConfig.java @@ -28,6 +28,12 @@ * for the entire network is equal to this value times the number of nodes. A * value of 0 means that there is no limit to the number of events that can be * created (as long as those events are legal to create). + * @param creationAttemptRate the rate (in hz) at which a node will attempt to create new events. If this + * value is higher than the max creation rate, it will still be constrained by the + * max creation rate. This being said, it is recommended to attempt event creation + * faster than the max creation rate in situations where creation rate is also + * throttled by the tipset algorithm (i.e. we are waiting for new events to use as + * parents). * @param antiSelfishnessFactor the lower this number, the more likely it is that a new event will be created * that reduces this node's selfishness score. Setting this too low may result in * a suboptimal hashgraph topology. Setting this number too high may lead to some @@ -45,6 +51,7 @@ @ConfigData("event.creation") public record EventCreationConfig( @ConfigProperty(defaultValue = "20") double maxCreationRate, + @ConfigProperty(defaultValue = "100") double creationAttemptRate, @ConfigProperty(defaultValue = "10") double antiSelfishnessFactor, @ConfigProperty(defaultValue = "10") int tipsetSnapshotHistorySize, @ConfigProperty(defaultValue = "1024") int eventIntakeThrottle, diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationManager.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationManager.java new file mode 100644 index 000000000000..6e4f23b954a1 --- /dev/null +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationManager.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * 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. + */ + +package com.swirlds.platform.event.creation; + +import static com.swirlds.platform.event.creation.EventCreationStatus.ATTEMPTING_CREATION; +import static com.swirlds.platform.event.creation.EventCreationStatus.NO_ELIGIBLE_PARENTS; +import static com.swirlds.platform.event.creation.EventCreationStatus.PAUSED; +import static com.swirlds.platform.event.creation.EventCreationStatus.RATE_LIMITED; + +import com.swirlds.base.time.Time; +import com.swirlds.common.context.PlatformContext; +import com.swirlds.common.metrics.extensions.PhaseTimer; +import com.swirlds.common.metrics.extensions.PhaseTimerBuilder; +import com.swirlds.platform.event.GossipEvent; +import com.swirlds.platform.event.creation.rules.EventCreationRule; +import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.Nullable; +import java.util.Objects; + +/** + * Wraps an {@link EventCreator} and provides additional functionality. Will sometimes decide not to create new events + * based on external rules or based on paused status. Forwards created events to a consumer, and retries forwarding if + * the consumer is not immediately able to accept the event. + */ +public class EventCreationManager { + + /** + * Creates events. + */ + private final EventCreator creator; + + /** + * Rules that say if event creation is permitted. + */ + private final EventCreationRule eventCreationRules; + + /** + * Tracks the current phase of event creation. + */ + private final PhaseTimer phase; + + /** + * Whether or not event creation is paused. + */ + private boolean paused = false; + + /** + * Constructor. + * + * @param platformContext the platform context + * @param time provides wall clock time + * @param creator creates events + * @param eventCreationRules rules for deciding when it is permitted to create events + */ + public EventCreationManager( + @NonNull final PlatformContext platformContext, + @NonNull final Time time, + @NonNull final EventCreator creator, + @NonNull final EventCreationRule eventCreationRules) { + + this.creator = Objects.requireNonNull(creator); + this.eventCreationRules = Objects.requireNonNull(eventCreationRules); + + phase = new PhaseTimerBuilder<>(platformContext, time, "platform", EventCreationStatus.class) + .enableFractionalMetrics() + .setInitialPhase(PAUSED) + .setMetricsNamePrefix("eventCreation") + .build(); + } + + /** + * Attempt to create an event. If successful, attempt to pass that event to the event consumer. + * + * @return the created event, or null if no event was created + */ + @Nullable + public GossipEvent maybeCreateEvent() { + if (paused) { + phase.activatePhase(PAUSED); + return null; + } + + if (!eventCreationRules.isEventCreationPermitted()) { + phase.activatePhase(eventCreationRules.getEventCreationStatus()); + return null; + } + + phase.activatePhase(ATTEMPTING_CREATION); + + final GossipEvent newEvent = creator.maybeCreateEvent(); + if (newEvent == null) { + // The only reason why the event creator may choose not to create an event + // is if there are no eligible parents. + phase.activatePhase(NO_ELIGIBLE_PARENTS); + } else { + eventCreationRules.eventWasCreated(); + // We created an event, we won't be allowed to create another until some time has elapsed. + phase.activatePhase(RATE_LIMITED); + } + + return newEvent; + } + + /** + * Pause or resume event creation. + * + * @param paused true to pause, false to resume + */ + public void setPauseStatus(final boolean paused) { + this.paused = paused; + } + + /** + * Register a new event from event intake. + * + * @param event the event to add + */ + public void registerEvent(@NonNull final GossipEvent event) { + creator.registerEvent(event); + } + + /** + * Update the minimum generation non-ancient. + * + * @param minimumGenerationNonAncient the new minimum generation non-ancient + */ + public void setMinimumGenerationNonAncient(final long minimumGenerationNonAncient) { + creator.setMinimumGenerationNonAncient(minimumGenerationNonAncient); + } +} diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationManagerFactory.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationManagerFactory.java index 077289d9951e..3901d65d3ca9 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationManagerFactory.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreationManagerFactory.java @@ -51,7 +51,7 @@ public final class EventCreationManagerFactory { private EventCreationManagerFactory() {} /** - * Create a new event creation manager. + * Create a new event creation manager (legacy pre-wiring version). * * @param platformContext the platform's context * @param threadManager manages the creation of new threads @@ -68,7 +68,7 @@ private EventCreationManagerFactory() {} * @return a new event creation manager */ @NonNull - public static AsyncEventCreationManager buildEventCreationManager( + public static AsyncEventCreationManager buildLegacyEventCreationManager( @NonNull final PlatformContext platformContext, @NonNull final ThreadManager threadManager, @NonNull final Time time, @@ -129,4 +129,57 @@ public static AsyncEventCreationManager buildEventCreationManager( return manager; } + + /** + * Create a new event creation manager. + * + * @param platformContext the platform's context + * @param time provides the wall clock time + * @param signer can sign with this node's key + * @param addressBook the current address book + * @param selfId the ID of this node + * @param appVersion the current application version + * @param transactionPool provides transactions to be added to new events + * @param platformStatusSupplier provides the current platform status + * @param latestReconnectRound provides the latest reconnect round + * @return a new event creation manager + */ + @NonNull + public static EventCreationManager buildEventCreationManager( + @NonNull final PlatformContext platformContext, + @NonNull final Time time, + @NonNull final Signer signer, + @NonNull final AddressBook addressBook, + @NonNull final NodeId selfId, + @NonNull final SoftwareVersion appVersion, + @NonNull final TransactionPool transactionPool, + @NonNull final Supplier platformStatusSupplier, + @NonNull final Supplier latestReconnectRound) { + + Objects.requireNonNull(platformContext); + Objects.requireNonNull(time); + Objects.requireNonNull(signer); + Objects.requireNonNull(addressBook); + Objects.requireNonNull(selfId); + Objects.requireNonNull(appVersion); + Objects.requireNonNull(transactionPool); + Objects.requireNonNull(platformStatusSupplier); + Objects.requireNonNull(latestReconnectRound); + + final EventCreator eventCreator = new TipsetEventCreator( + platformContext, + time, + new Random() /* does not need to be cryptographically secure */, + signer, + addressBook, + selfId, + appVersion, + transactionPool); + + final EventCreationRule eventCreationRules = AggregateEventCreationRules.of( + new MaximumRateRule(platformContext, time), + new PlatformStatusRule(platformStatusSupplier, transactionPool)); + + return new EventCreationManager(platformContext, time, eventCreator, eventCreationRules); + } } diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreator.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreator.java index 718d262791d6..37f839c33ec3 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreator.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/EventCreator.java @@ -17,7 +17,6 @@ package com.swirlds.platform.event.creation; import com.swirlds.platform.event.GossipEvent; -import com.swirlds.platform.internal.EventImpl; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; @@ -31,7 +30,7 @@ public interface EventCreator { * * @param event the event to add */ - void registerEvent(@NonNull EventImpl event); + void registerEvent(@NonNull GossipEvent event); /** * Update the minimum generation non-ancient. diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/SyncEventCreationManager.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/SyncEventCreationManager.java index dc808ea67fd2..b12bf008fec5 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/SyncEventCreationManager.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/SyncEventCreationManager.java @@ -28,7 +28,6 @@ import com.swirlds.common.metrics.extensions.PhaseTimerBuilder; import com.swirlds.platform.event.GossipEvent; import com.swirlds.platform.event.creation.rules.EventCreationRule; -import com.swirlds.platform.internal.EventImpl; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.Objects; import java.util.function.Function; @@ -175,7 +174,7 @@ public void resumeEventCreation() { * * @param event the event to add */ - public void registerEvent(@NonNull final EventImpl event) { + public void registerEvent(@NonNull final GossipEvent event) { creator.registerEvent(event); } diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/tipset/TipsetEventCreator.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/tipset/TipsetEventCreator.java index ffc771e69a40..b06c1329be11 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/tipset/TipsetEventCreator.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/creation/tipset/TipsetEventCreator.java @@ -16,7 +16,6 @@ package com.swirlds.platform.event.creation.tipset; -import static com.swirlds.common.platform.NodeId.UNDEFINED_NODE_ID; import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; import static com.swirlds.platform.consensus.GraphGenerations.FIRST_GENERATION; import static com.swirlds.platform.event.creation.tipset.TipsetAdvancementWeight.ZERO_ADVANCEMENT_WEIGHT; @@ -37,7 +36,6 @@ import com.swirlds.platform.event.GossipEvent; import com.swirlds.platform.event.creation.EventCreationConfig; import com.swirlds.platform.event.creation.EventCreator; -import com.swirlds.platform.internal.EventImpl; import com.swirlds.platform.system.SoftwareVersion; import com.swirlds.platform.system.address.AddressBook; import com.swirlds.platform.system.events.BaseEventHashedData; @@ -158,7 +156,7 @@ public TipsetEventCreator( * {@inheritDoc} */ @Override - public void registerEvent(@NonNull final EventImpl event) { + public void registerEvent(@NonNull final GossipEvent event) { final NodeId eventCreator = event.getHashedData().getCreatorId(); if (!addressBook.contains(eventCreator)) { @@ -172,17 +170,11 @@ public void registerEvent(@NonNull final EventImpl event) { // to learn of self events for the first time here if we are loading from a restart or reconnect. lastSelfEvent = buildDescriptor(event); lastSelfEventCreationTime = event.getHashedData().getTimeCreated(); - lastSelfEventTransactionCount = event.getTransactions() == null ? 0 : event.getTransactions().length; - - if (event.getBaseEventUnhashedData().getOtherId() != UNDEFINED_NODE_ID) { - final EventDescriptor parentDescriptor = new EventDescriptor( - event.getBaseEventHashedData().getOtherParentHash(), - event.getBaseEventUnhashedData().getOtherId(), - event.getBaseEventHashedData().getOtherParentGen(), - event.getBaseEventHashedData().getBirthRound()); - - childlessOtherEventTracker.registerSelfEventParents(List.of(parentDescriptor)); - } + lastSelfEventTransactionCount = event.getHashedData().getTransactions() == null + ? 0 + : event.getHashedData().getTransactions().length; + childlessOtherEventTracker.registerSelfEventParents( + event.getHashedData().getOtherParents()); } else { // We already ingested this self event (when it was created), return; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformCoordinator.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformCoordinator.java index 312e815ad1b3..2ac48132fbb7 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformCoordinator.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformCoordinator.java @@ -16,6 +16,7 @@ package com.swirlds.platform.wiring; +import com.swirlds.platform.wiring.components.EventCreationManagerWiring; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.Objects; @@ -29,6 +30,7 @@ public class PlatformCoordinator { private final OrphanBufferWiring orphanBufferWiring; private final InOrderLinkerWiring inOrderLinkerWiring; private final LinkedEventIntakeWiring linkedEventIntakeWiring; + private final EventCreationManagerWiring eventCreationManagerWiring; /** * Constructor @@ -39,6 +41,7 @@ public class PlatformCoordinator { * @param orphanBufferWiring the orphan buffer wiring * @param inOrderLinkerWiring the in order linker wiring * @param linkedEventIntakeWiring the linked event intake wiring + * @param eventCreationManagerWiring the event creation manager wiring */ public PlatformCoordinator( @NonNull final InternalEventValidatorWiring internalEventValidatorWiring, @@ -46,7 +49,8 @@ public PlatformCoordinator( @NonNull final EventSignatureValidatorWiring eventSignatureValidatorWiring, @NonNull final OrphanBufferWiring orphanBufferWiring, @NonNull final InOrderLinkerWiring inOrderLinkerWiring, - @NonNull final LinkedEventIntakeWiring linkedEventIntakeWiring) { + @NonNull final LinkedEventIntakeWiring linkedEventIntakeWiring, + @NonNull final EventCreationManagerWiring eventCreationManagerWiring) { this.internalEventValidatorWiring = Objects.requireNonNull(internalEventValidatorWiring); this.eventDeduplicatorWiring = Objects.requireNonNull(eventDeduplicatorWiring); @@ -54,6 +58,7 @@ public PlatformCoordinator( this.orphanBufferWiring = Objects.requireNonNull(orphanBufferWiring); this.inOrderLinkerWiring = Objects.requireNonNull(inOrderLinkerWiring); this.linkedEventIntakeWiring = Objects.requireNonNull(linkedEventIntakeWiring); + this.eventCreationManagerWiring = Objects.requireNonNull(eventCreationManagerWiring); } /** @@ -62,27 +67,36 @@ public PlatformCoordinator( * Future work: this method should be expanded to coordinate the clearing of the entire system */ public void clear() { - // pause the linked event intake, to prevent any new events from making it through the intake pipeline + // Phase 1: pause + // Pause the linked event intake and event creator, to prevent any new events from making it through the intake + // pipeline. linkedEventIntakeWiring.pauseInput().inject(true); + eventCreationManagerWiring.pauseInput().inject(true); linkedEventIntakeWiring.flushRunnable().run(); + eventCreationManagerWiring.flush(); - // flush everything remaining in the intake pipeline out into the void + // Phase 2: flush + // Flush everything remaining in the intake pipeline out into the void. internalEventValidatorWiring.flushRunnable().run(); eventDeduplicatorWiring.flushRunnable().run(); eventSignatureValidatorWiring.flushRunnable().run(); orphanBufferWiring.flushRunnable().run(); + eventCreationManagerWiring.flush(); inOrderLinkerWiring.flushRunnable().run(); linkedEventIntakeWiring.flushRunnable().run(); - // once everything has been flushed out of the system, it's safe to unpause the linked event intake - linkedEventIntakeWiring.pauseInput().inject(false); - - // data is no longer moving through the system. clear all the internal data structures in the wiring objects + // Phase 3: clear + // Data is no longer moving through the system. clear all the internal data structures in the wiring objects. eventDeduplicatorWiring.clearInput().inject(new ClearTrigger()); eventDeduplicatorWiring.flushRunnable().run(); orphanBufferWiring.clearInput().inject(new ClearTrigger()); orphanBufferWiring.flushRunnable().run(); inOrderLinkerWiring.clearInput().inject(new ClearTrigger()); inOrderLinkerWiring.flushRunnable().run(); + + // Phase 4: unpause + // Once everything has been flushed out of the system, it's safe to unpause event intake and creation. + linkedEventIntakeWiring.pauseInput().inject(false); + eventCreationManagerWiring.pauseInput().inject(false); } } diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformSchedulers.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformSchedulers.java index d546d7f2e633..7f6906c6ba1e 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformSchedulers.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformSchedulers.java @@ -36,6 +36,7 @@ * @param orphanBufferScheduler the scheduler for the orphan buffer * @param inOrderLinkerScheduler the scheduler for the in-order linker * @param linkedEventIntakeScheduler the scheduler for the linked event intake + * @param eventCreationManagerScheduler the scheduler for the event creation manager * @param signedStateFileManagerScheduler the scheduler for the signed state file manager */ public record PlatformSchedulers( @@ -45,6 +46,7 @@ public record PlatformSchedulers( @NonNull TaskScheduler> orphanBufferScheduler, @NonNull TaskScheduler inOrderLinkerScheduler, @NonNull TaskScheduler> linkedEventIntakeScheduler, + @NonNull TaskScheduler eventCreationManagerScheduler, @NonNull TaskScheduler signedStateFileManagerScheduler) { /** @@ -101,6 +103,13 @@ public static PlatformSchedulers create(@NonNull final PlatformContext context, .withMetricsBuilder(model.metricsBuilder().withUnhandledTaskMetricEnabled(true)) .build() .cast(), + model.schedulerBuilder("eventCreationManager") + .withType(config.getEventCreationManagerSchedulerType()) + .withUnhandledTaskCapacity(config.eventCreationManagerUnhandledCapacity()) + .withFlushingEnabled(true) + .withMetricsBuilder(model.metricsBuilder().withUnhandledTaskMetricEnabled(true)) + .build() + .cast(), model.schedulerBuilder("signedStateFileManager") .withType(config.getSignedStateFileManagerSchedulerType()) .withUnhandledTaskCapacity(config.signedStateFileManagerUnhandledCapacity()) diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformWiring.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformWiring.java index 40743617262a..825b2cf64af1 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformWiring.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/PlatformWiring.java @@ -30,6 +30,7 @@ import com.swirlds.platform.components.LinkedEventIntake; import com.swirlds.platform.components.appcomm.AppCommunicationComponent; import com.swirlds.platform.event.GossipEvent; +import com.swirlds.platform.event.creation.EventCreationManager; import com.swirlds.platform.event.deduplication.EventDeduplicator; import com.swirlds.platform.event.linking.InOrderLinker; import com.swirlds.platform.event.orphan.OrphanBuffer; @@ -41,6 +42,7 @@ import com.swirlds.platform.state.signed.SignedStateFileManager; import com.swirlds.platform.state.signed.StateDumpRequest; import com.swirlds.platform.system.status.PlatformStatusManager; +import com.swirlds.platform.wiring.components.EventCreationManagerWiring; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.Objects; @@ -57,6 +59,7 @@ public class PlatformWiring implements Startable, Stoppable, Clearable { private final OrphanBufferWiring orphanBufferWiring; private final InOrderLinkerWiring inOrderLinkerWiring; private final LinkedEventIntakeWiring linkedEventIntakeWiring; + private final EventCreationManagerWiring eventCreationManagerWiring; private final SignedStateFileManagerWiring signedStateFileManagerWiring; private final PlatformCoordinator platformCoordinator; @@ -68,6 +71,7 @@ public class PlatformWiring implements Startable, Stoppable, Clearable { * @param time provides wall clock time */ public PlatformWiring(@NonNull final PlatformContext platformContext, @NonNull final Time time) { + this.platformContext = Objects.requireNonNull(platformContext); model = WiringModel.create(platformContext, time); @@ -84,14 +88,16 @@ public PlatformWiring(@NonNull final PlatformContext platformContext, @NonNull f orphanBufferWiring = OrphanBufferWiring.create(schedulers.orphanBufferScheduler()); inOrderLinkerWiring = InOrderLinkerWiring.create(schedulers.inOrderLinkerScheduler()); linkedEventIntakeWiring = LinkedEventIntakeWiring.create(schedulers.linkedEventIntakeScheduler()); - + eventCreationManagerWiring = + EventCreationManagerWiring.create(platformContext, schedulers.eventCreationManagerScheduler()); platformCoordinator = new PlatformCoordinator( internalEventValidatorWiring, eventDeduplicatorWiring, eventSignatureValidatorWiring, orphanBufferWiring, inOrderLinkerWiring, - linkedEventIntakeWiring); + linkedEventIntakeWiring, + eventCreationManagerWiring); } else { internalEventValidatorWiring = null; eventDeduplicatorWiring = null; @@ -99,7 +105,7 @@ public PlatformWiring(@NonNull final PlatformContext platformContext, @NonNull f orphanBufferWiring = null; inOrderLinkerWiring = null; linkedEventIntakeWiring = null; - + eventCreationManagerWiring = null; platformCoordinator = null; } @@ -131,6 +137,8 @@ private void solderMinimumGenerationNonAncient() { eventSignatureValidatorWiring.minimumGenerationNonAncientInput(), INJECT); minimumGenerationNonAncientOutput.solderTo(orphanBufferWiring.minimumGenerationNonAncientInput(), INJECT); minimumGenerationNonAncientOutput.solderTo(inOrderLinkerWiring.minimumGenerationNonAncientInput(), INJECT); + minimumGenerationNonAncientOutput.solderTo( + eventCreationManagerWiring.minimumGenerationNonAncientInput(), INJECT); } /** @@ -143,11 +151,11 @@ private void wire() { eventSignatureValidatorWiring.eventOutput().solderTo(orphanBufferWiring.eventInput()); orphanBufferWiring.eventOutput().solderTo(inOrderLinkerWiring.eventInput()); inOrderLinkerWiring.eventOutput().solderTo(linkedEventIntakeWiring.eventInput()); + orphanBufferWiring.eventOutput().solderTo(eventCreationManagerWiring.eventInput()); + eventCreationManagerWiring.newEventOutput().solderTo(internalEventValidatorWiring.eventInput(), INJECT); solderMinimumGenerationNonAncient(); } - - // FUTURE WORK: solder all the things! } /** @@ -181,7 +189,8 @@ public void wireExternalComponents( /** * Bind the intake components to the wiring. *

- * Future work: this method should be merged with {@link #bind} once the feature flag for the new intake pipeline has been removed + * Future work: this method should be merged with {@link #bind} once the feature flag for the new intake pipeline + * has been removed * * @param internalEventValidator the internal event validator to bind * @param eventDeduplicator the event deduplicator to bind @@ -189,6 +198,7 @@ public void wireExternalComponents( * @param orphanBuffer the orphan buffer to bind * @param inOrderLinker the in order linker to bind * @param linkedEventIntake the linked event intake to bind + * @param eventCreationManager the event creation manager to bind */ public void bindIntake( @NonNull final InternalEventValidator internalEventValidator, @@ -196,7 +206,8 @@ public void bindIntake( @NonNull final EventSignatureValidator eventSignatureValidator, @NonNull final OrphanBuffer orphanBuffer, @NonNull final InOrderLinker inOrderLinker, - @NonNull final LinkedEventIntake linkedEventIntake) { + @NonNull final LinkedEventIntake linkedEventIntake, + @NonNull final EventCreationManager eventCreationManager) { internalEventValidatorWiring.bind(internalEventValidator); eventDeduplicatorWiring.bind(eventDeduplicator); @@ -204,6 +215,7 @@ public void bindIntake( orphanBufferWiring.bind(orphanBuffer); inOrderLinkerWiring.bind(inOrderLinker); linkedEventIntakeWiring.bind(linkedEventIntake); + eventCreationManagerWiring.bind(eventCreationManager); } /** @@ -258,8 +270,8 @@ public InputWire getSaveStateToDiskInput() { /** * Get the input wire for dumping a state to disk *

- * Future work: this is a temporary hook to allow the components to dump a state to disk, prior to the whole - * system being migrated to the new framework. + * Future work: this is a temporary hook to allow the components to dump a state to disk, prior to the whole system + * being migrated to the new framework. * * @return the input wire for dumping a state to disk */ @@ -271,8 +283,8 @@ public InputWire getDumpStateToDiskInput() { /** * Inject a new minimum generation non-ancient on all components that need it. *

- * Future work: this is a temporary hook to allow the components to get the minimum generation non-ancient - * during startup. This method will be removed once the components are wired together. + * Future work: this is a temporary hook to allow the components to get the minimum generation non-ancient during + * startup. This method will be removed once the components are wired together. * * @param minimumGenerationNonAncient the new minimum generation non-ancient */ @@ -281,6 +293,7 @@ public void updateMinimumGenerationNonAncient(final long minimumGenerationNonAnc eventSignatureValidatorWiring.minimumGenerationNonAncientInput().inject(minimumGenerationNonAncient); orphanBufferWiring.minimumGenerationNonAncientInput().inject(minimumGenerationNonAncient); inOrderLinkerWiring.minimumGenerationNonAncientInput().inject(minimumGenerationNonAncient); + eventCreationManagerWiring.minimumGenerationNonAncientInput().inject(minimumGenerationNonAncient); } /** diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/components/EventCreationManagerWiring.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/components/EventCreationManagerWiring.java new file mode 100644 index 000000000000..28d8b2b3e41f --- /dev/null +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/components/EventCreationManagerWiring.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * 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. + */ + +package com.swirlds.platform.wiring.components; + +import com.swirlds.common.context.PlatformContext; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.wires.input.Bindable; +import com.swirlds.common.wiring.wires.input.BindableInputWire; +import com.swirlds.common.wiring.wires.input.InputWire; +import com.swirlds.common.wiring.wires.output.OutputWire; +import com.swirlds.platform.event.GossipEvent; +import com.swirlds.platform.event.creation.EventCreationConfig; +import com.swirlds.platform.event.creation.EventCreationManager; +import edu.umd.cs.findbugs.annotations.NonNull; +import java.time.Instant; + +/** + * Wiring for the {@link EventCreationManager}. + */ +public class EventCreationManagerWiring { + + private final TaskScheduler taskScheduler; + + private final BindableInputWire eventInput; + private final BindableInputWire minimumGenerationNonAncientInput; + private final BindableInputWire pauseInput; + private final Bindable heartbeatBindable; + private final OutputWire newEventOutput; + + /** + * Create a new instance of this wiring. + * + * @param platformContext the platform context + * @param taskScheduler the task scheduler for the event creation manager + * @return the new wiring instance + */ + @NonNull + public static EventCreationManagerWiring create( + @NonNull final PlatformContext platformContext, @NonNull final TaskScheduler taskScheduler) { + return new EventCreationManagerWiring(platformContext, taskScheduler); + } + + /** + * Constructor. + * + * @param platformContext the platform context + * @param taskScheduler the task scheduler for the event creation manager + */ + private EventCreationManagerWiring( + @NonNull final PlatformContext platformContext, @NonNull final TaskScheduler taskScheduler) { + + this.taskScheduler = taskScheduler; + + eventInput = taskScheduler.buildInputWire("possible parents"); + minimumGenerationNonAncientInput = taskScheduler.buildInputWire("minimum generation non ancient"); + pauseInput = taskScheduler.buildInputWire("pause"); + newEventOutput = taskScheduler.getOutputWire(); + + final double frequency = platformContext + .getConfiguration() + .getConfigData(EventCreationConfig.class) + .creationAttemptRate(); + heartbeatBindable = taskScheduler.buildHeartbeatInputWire("heartbeat", frequency); + } + + /** + * Bind an event creation manager to this wiring. + * + * @param eventCreationManager the event creation manager to bind + */ + public void bind(@NonNull final EventCreationManager eventCreationManager) { + eventInput.bind(eventCreationManager::registerEvent); + minimumGenerationNonAncientInput.bind(eventCreationManager::setMinimumGenerationNonAncient); + pauseInput.bind(eventCreationManager::setPauseStatus); + heartbeatBindable.bind(now -> { + return eventCreationManager.maybeCreateEvent(); + }); + } + + /** + * Get the input wire for possible parents. + * + * @return the input wire for possible parents + */ + @NonNull + public InputWire eventInput() { + return eventInput; + } + + /** + * Get the input wire for the minimum generation non-ancient. + * + * @return the input wire for the minimum generation non-ancient + */ + @NonNull + public InputWire minimumGenerationNonAncientInput() { + return minimumGenerationNonAncientInput; + } + + /** + * Get the input wire for pause operations. + * + * @return the input wire for pause operations + */ + @NonNull + public InputWire pauseInput() { + return pauseInput; + } + + /** + * Get the output wire where newly created events are sent. + * + * @return the output wire for new events + */ + @NonNull + public OutputWire newEventOutput() { + return newEventOutput; + } + + /** + * Flush the task scheduler. + */ + public void flush() { + taskScheduler.flush(); + } +} diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/diagram-commands.txt b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/diagram-commands.txt index 2a249d087745..50bde61d800c 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/diagram-commands.txt +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/diagram-commands.txt @@ -6,9 +6,11 @@ Groups high level grouping of components and component groups. Substitutes known pcli diagram \ -s 'getMinimumGenerationNonAncient:minimum generation non ancient:*' \ -s 'heartbeat:heartbeat:♡' \ + -s 'eventCreationManager:non-validated events:†' \ -g 'Event Validation:internalEventValidator,eventDeduplicator,eventSignatureValidator' \ -g 'Orphan Buffer:orphanBuffer,orphanBuffer_splitter' \ -g 'Linked Event Intake:linkedEventIntake,linkedEventIntake_splitter,getMinimumGenerationNonAncient' \ + -g 'State File Management:signedStateFileManager,extract oldestMinimumGenerationOnDisk,to StateWrittenToDiskAction' \ -g 'Intake Pipeline:Event Validation,Orphan Buffer' \ -g 'Consensus Pipeline:inOrderLinker,Linked Event Intake' @@ -20,10 +22,13 @@ Same as "Uncollapsed" but with low level things collapsed. Attempts to hide thin pcli diagram \ -s 'getMinimumGenerationNonAncient:minimum generation non ancient:*' \ -s 'heartbeat:heartbeat:♡' \ + -s 'eventCreationManager:non-validated events:†' \ -g 'Event Validation:internalEventValidator,eventDeduplicator,eventSignatureValidator' \ -g 'Orphan Buffer:orphanBuffer,orphanBuffer_splitter' \ -g 'Linked Event Intake:linkedEventIntake,linkedEventIntake_splitter,getMinimumGenerationNonAncient' \ + -g 'State File Management:signedStateFileManager,extract oldestMinimumGenerationOnDisk,to StateWrittenToDiskAction' \ -g 'Intake Pipeline:Event Validation,Orphan Buffer' \ -g 'Consensus Pipeline:inOrderLinker,Linked Event Intake' \ -c "Orphan Buffer" \ - -c "Linked Event Intake" \ No newline at end of file + -c "Linked Event Intake" \ + -c "State File Management" \ No newline at end of file diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/wiring/PlatformWiringTests.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/wiring/PlatformWiringTests.java index 54597b2eac5c..f1b0354a877f 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/wiring/PlatformWiringTests.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/wiring/PlatformWiringTests.java @@ -23,6 +23,7 @@ import com.swirlds.common.context.PlatformContext; import com.swirlds.config.api.Configuration; import com.swirlds.platform.components.LinkedEventIntake; +import com.swirlds.platform.event.creation.EventCreationManager; import com.swirlds.platform.event.deduplication.EventDeduplicator; import com.swirlds.platform.event.linking.InOrderLinker; import com.swirlds.platform.event.orphan.OrphanBuffer; @@ -73,7 +74,8 @@ void testBindingsWithNewIntake() { mock(EventSignatureValidator.class), mock(OrphanBuffer.class), mock(InOrderLinker.class), - mock(LinkedEventIntake.class)); + mock(LinkedEventIntake.class), + mock(EventCreationManager.class)); wiring.bind(mock(SignedStateFileManager.class)); assertFalse(wiring.getModel().checkForUnboundInputWires()); diff --git a/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/test/java/com/swirlds/platform/test/event/tipset/EventCreationManagerTests.java b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/test/java/com/swirlds/platform/test/event/tipset/EventCreationManagerTests.java new file mode 100644 index 000000000000..4769f772fca7 --- /dev/null +++ b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/test/java/com/swirlds/platform/test/event/tipset/EventCreationManagerTests.java @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * 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. + */ + +package com.swirlds.platform.test.event.tipset; + +import static com.swirlds.platform.event.creation.EventCreationStatus.RATE_LIMITED; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.swirlds.base.time.Time; +import com.swirlds.common.context.PlatformContext; +import com.swirlds.platform.event.GossipEvent; +import com.swirlds.platform.event.creation.EventCreationManager; +import com.swirlds.platform.event.creation.EventCreationStatus; +import com.swirlds.platform.event.creation.EventCreator; +import com.swirlds.platform.event.creation.rules.EventCreationRule; +import com.swirlds.test.framework.context.TestPlatformContextBuilder; +import edu.umd.cs.findbugs.annotations.NonNull; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("EventCreationManager Tests") +class EventCreationManagerTests { + + @Test + @DisplayName("Basic Behavior Test") + void basicBehaviorTest() { + final EventCreator creator = mock(EventCreator.class); + final List eventsToCreate = + List.of(mock(GossipEvent.class), mock(GossipEvent.class), mock(GossipEvent.class)); + when(creator.maybeCreateEvent()) + .thenReturn(eventsToCreate.get(0), eventsToCreate.get(1), eventsToCreate.get(2)); + + final AtomicInteger eventWasCreatedCount = new AtomicInteger(0); + final EventCreationRule rule = new EventCreationRule() { + @Override + public boolean isEventCreationPermitted() { + return true; + } + + @Override + public void eventWasCreated() { + eventWasCreatedCount.getAndIncrement(); + } + + @NonNull + @Override + public EventCreationStatus getEventCreationStatus() { + return RATE_LIMITED; + } + }; + + final PlatformContext platformContext = + TestPlatformContextBuilder.create().build(); + + final EventCreationManager manager = + new EventCreationManager(platformContext, Time.getCurrent(), creator, rule); + assertEquals(0, eventWasCreatedCount.get()); + + final GossipEvent e0 = manager.maybeCreateEvent(); + assertNotNull(e0); + assertEquals(1, eventWasCreatedCount.get()); + assertSame(eventsToCreate.get(0), e0); + + final GossipEvent e1 = manager.maybeCreateEvent(); + assertEquals(2, eventWasCreatedCount.get()); + assertNotNull(e1); + assertSame(eventsToCreate.get(1), e1); + + final GossipEvent e2 = manager.maybeCreateEvent(); + assertNotNull(e2); + assertEquals(3, eventWasCreatedCount.get()); + assertSame(eventsToCreate.get(2), e2); + } + + @Test + @DisplayName("Rules Prevent Creation Test") + void rulesPreventCreationTest() { + final EventCreator creator = mock(EventCreator.class); + final List eventsToCreate = + List.of(mock(GossipEvent.class), mock(GossipEvent.class), mock(GossipEvent.class)); + when(creator.maybeCreateEvent()) + .thenReturn(eventsToCreate.get(0), eventsToCreate.get(1), eventsToCreate.get(2)); + + final AtomicInteger eventWasCreatedCount = new AtomicInteger(0); + final AtomicBoolean allowCreation = new AtomicBoolean(false); + final EventCreationRule rule = new EventCreationRule() { + @Override + public boolean isEventCreationPermitted() { + return allowCreation.get(); + } + + @Override + public void eventWasCreated() { + eventWasCreatedCount.getAndIncrement(); + } + + @NonNull + @Override + public EventCreationStatus getEventCreationStatus() { + return RATE_LIMITED; + } + }; + + final PlatformContext platformContext = + TestPlatformContextBuilder.create().build(); + + final EventCreationManager manager = + new EventCreationManager(platformContext, Time.getCurrent(), creator, rule); + + assertEquals(0, eventWasCreatedCount.get()); + + // Event creation is not permitted + for (int i = 0; i < 10; i++) { + assertNull(manager.maybeCreateEvent()); + assertEquals(0, eventWasCreatedCount.get()); + } + + // Event creation is permitted + allowCreation.set(true); + final GossipEvent e0 = manager.maybeCreateEvent(); + assertEquals(1, eventWasCreatedCount.get()); + assertSame(eventsToCreate.get(0), e0); + + // Event creation is not permitted + allowCreation.set(false); + for (int i = 0; i < 10; i++) { + assertNull(manager.maybeCreateEvent()); + assertEquals(1, eventWasCreatedCount.get()); + } + + // Event creation is permitted + allowCreation.set(true); + final GossipEvent e1 = manager.maybeCreateEvent(); + assertEquals(2, eventWasCreatedCount.get()); + assertSame(eventsToCreate.get(1), e1); + + // Event creation is not permitted + allowCreation.set(false); + for (int i = 0; i < 10; i++) { + assertNull(manager.maybeCreateEvent()); + assertEquals(2, eventWasCreatedCount.get()); + } + + // Event creation is permitted + allowCreation.set(true); + final GossipEvent e2 = manager.maybeCreateEvent(); + assertEquals(3, eventWasCreatedCount.get()); + assertSame(eventsToCreate.get(2), e2); + + // Event creation is not permitted + allowCreation.set(false); + for (int i = 0; i < 10; i++) { + assertNull(manager.maybeCreateEvent()); + assertEquals(3, eventWasCreatedCount.get()); + } + } + + @Test + @DisplayName("Paused Halts Creation Test") + void pauseHaltsCreationTest() { + final EventCreator creator = mock(EventCreator.class); + final List eventsToCreate = + List.of(mock(GossipEvent.class), mock(GossipEvent.class), mock(GossipEvent.class)); + when(creator.maybeCreateEvent()) + .thenReturn(eventsToCreate.get(0), eventsToCreate.get(1), eventsToCreate.get(2)); + + final AtomicInteger eventWasCreatedCount = new AtomicInteger(0); + final EventCreationRule rule = new EventCreationRule() { + @Override + public boolean isEventCreationPermitted() { + return true; + } + + @Override + public void eventWasCreated() { + eventWasCreatedCount.getAndIncrement(); + } + + @NonNull + @Override + public EventCreationStatus getEventCreationStatus() { + return RATE_LIMITED; + } + }; + + final PlatformContext platformContext = + TestPlatformContextBuilder.create().build(); + + final EventCreationManager manager = + new EventCreationManager(platformContext, Time.getCurrent(), creator, rule); + + assertEquals(0, eventWasCreatedCount.get()); + + // We are unpaused, so we can create events. + final GossipEvent e0 = manager.maybeCreateEvent(); + assertEquals(1, eventWasCreatedCount.get()); + assertSame(eventsToCreate.get(0), e0); + + // While paused we should not be able to create events. + manager.setPauseStatus(true); + for (int i = 0; i < 10; i++) { + assertNull(manager.maybeCreateEvent()); + assertEquals(1, eventWasCreatedCount.get()); + } + + // Once unpaused we should be able to create events again. + manager.setPauseStatus(false); + final GossipEvent e1 = manager.maybeCreateEvent(); + assertEquals(2, eventWasCreatedCount.get()); + assertSame(eventsToCreate.get(1), e1); + + // While paused we should not be able to create events. + manager.setPauseStatus(true); + for (int i = 0; i < 10; i++) { + assertNull(manager.maybeCreateEvent()); + assertEquals(2, eventWasCreatedCount.get()); + } + + // Once unpaused we should be able to create events again. + manager.setPauseStatus(false); + final GossipEvent e2 = manager.maybeCreateEvent(); + assertEquals(3, eventWasCreatedCount.get()); + assertSame(eventsToCreate.get(2), e2); + } +} diff --git a/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/test/java/com/swirlds/platform/test/event/tipset/TipsetEventCreatorTests.java b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/test/java/com/swirlds/platform/test/event/tipset/TipsetEventCreatorTests.java index ab79f2db04c9..a918da8255fc 100644 --- a/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/test/java/com/swirlds/platform/test/event/tipset/TipsetEventCreatorTests.java +++ b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/test/java/com/swirlds/platform/test/event/tipset/TipsetEventCreatorTests.java @@ -258,7 +258,7 @@ private void distributeEvent( @NonNull final Map eventCreators, @NonNull final EventImpl eventImpl) { for (final SimulatedNode eventCreator : eventCreators.values()) { - eventCreator.eventCreator.registerEvent(eventImpl); + eventCreator.eventCreator.registerEvent(eventImpl.getBaseEvent()); eventCreator.tipsetTracker.addEvent( eventImpl.getBaseEvent().getDescriptor(), TipsetUtils.getParentDescriptors(eventImpl)); } @@ -693,30 +693,31 @@ void sizeOneNetworkTest(final boolean advancingClock) { } @NonNull - private EventImpl createMockEvent( + private GossipEvent createMockEvent( @NonNull final Random random, @NonNull final NodeId creator, long selfParentGeneration, @Nullable final NodeId otherParentId, final long otherParentGeneration) { - final EventImpl event = mock(EventImpl.class); + final GossipEvent event = mock(GossipEvent.class); final BaseEventHashedData hashedData = mock(BaseEventHashedData.class); when(hashedData.getCreatorId()).thenReturn(creator); - when(event.getCreatorId()).thenReturn(creator); + when(hashedData.getCreatorId()).thenReturn(creator); final long generation = Math.max(selfParentGeneration, otherParentGeneration) + 1; when(hashedData.getGeneration()).thenReturn(generation); when(event.getGeneration()).thenReturn(generation); final Hash hash = randomHash(random); when(hashedData.getHash()).thenReturn(hash); - when(event.getBaseHash()).thenReturn(hash); - when(hashedData.createEventDescriptor()) - .thenReturn(new EventDescriptor(hash, creator, generation, -EventConstants.BIRTH_ROUND_UNDEFINED)); + final EventDescriptor descriptor = + new EventDescriptor(hash, creator, generation, -EventConstants.BIRTH_ROUND_UNDEFINED); + + when(hashedData.createEventDescriptor()).thenReturn(descriptor); + when(event.getDescriptor()).thenReturn(descriptor); when(event.getHashedData()).thenReturn(hashedData); - when(event.getBaseEventHashedData()).thenReturn(hashedData); final BaseEventUnhashedData unhashedData = mock(BaseEventUnhashedData.class); when(unhashedData.getOtherId()).thenReturn(otherParentId); @@ -757,11 +758,11 @@ void frozenEventCreationBug() { final GossipEvent eventA1 = eventCreator.maybeCreateEvent(); assertNotNull(eventA1); - final EventImpl eventB1 = createMockEvent( + final GossipEvent eventB1 = createMockEvent( random, nodeB, EventConstants.GENERATION_UNDEFINED, null, EventConstants.GENERATION_UNDEFINED); - final EventImpl eventC1 = createMockEvent( + final GossipEvent eventC1 = createMockEvent( random, nodeC, EventConstants.GENERATION_UNDEFINED, null, EventConstants.GENERATION_UNDEFINED); - final EventImpl eventD1 = createMockEvent( + final GossipEvent eventD1 = createMockEvent( random, nodeD, EventConstants.GENERATION_UNDEFINED, null, EventConstants.GENERATION_UNDEFINED); eventCreator.registerEvent(eventB1); @@ -790,7 +791,7 @@ void frozenEventCreationBug() { // but has not been updated in the current snapshot. final NodeId otherParentId = eventA2.getUnhashedData().getOtherId(); - final EventImpl legalOtherParent = createMockEvent(random, otherParentId, 0, nodeA, 0); + final GossipEvent legalOtherParent = createMockEvent(random, otherParentId, 0, nodeA, 0); eventCreator.registerEvent(legalOtherParent); @@ -830,13 +831,13 @@ void notRegisteringEventsFromNodesNotInAddressBook() { final GossipEvent eventA1 = eventCreator.maybeCreateEvent(); assertNotNull(eventA1); - final EventImpl eventB1 = createMockEvent( + final GossipEvent eventB1 = createMockEvent( random, nodeB, EventConstants.GENERATION_UNDEFINED, null, EventConstants.GENERATION_UNDEFINED); - final EventImpl eventC1 = createMockEvent( + final GossipEvent eventC1 = createMockEvent( random, nodeC, EventConstants.GENERATION_UNDEFINED, null, EventConstants.GENERATION_UNDEFINED); - final EventImpl eventD1 = createMockEvent( + final GossipEvent eventD1 = createMockEvent( random, nodeD, EventConstants.GENERATION_UNDEFINED, null, EventConstants.GENERATION_UNDEFINED); - final EventImpl eventE1 = createMockEvent( + final GossipEvent eventE1 = createMockEvent( random, nodeE, EventConstants.GENERATION_UNDEFINED, null, EventConstants.GENERATION_UNDEFINED); eventCreator.registerEvent(eventB1); From 4123932aeffb1e6a5233b5946daee41b34886d9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Brandst=C3=A4tter?= Date: Mon, 11 Dec 2023 21:24:13 +0100 Subject: [PATCH 10/13] chore!: remove `swirlds-commons` dependency from `swirlds-config-impl` (#10386) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Timo Brandstätter --- .../throttles/GasLimitBucketThrottle.java | 2 +- .../hapi-utils/src/main/java/module-info.java | 1 + .../throttles/GasLimitBucketThrottleTest.java | 2 +- .../service/mono/records/RecordsModule.java | 2 +- .../mono/state/logic/BlockManager.java | 2 +- .../mono/stream/RecordStreamManager.java | 2 +- .../stream/RecordStreamFileWriterTest.java | 2 +- .../mono/stream/RecordStreamManagerTest.java | 2 +- .../impl/exec/gas/CustomGasCalculator.java | 4 +- .../src/main/java/module-info.java | 1 + .../com/swirlds/demo/stats/StatsDemoMain.java | 2 +- .../StatsDemo/src/main/java/module-info.java | 1 + .../migration/MigrationTestingToolMain.java | 2 +- .../merkle/map/FCMTransactionHandler.java | 2 +- .../platform/PlatformTestingToolMain.java | 2 +- .../platform/PlatformTestingToolState.java | 4 +- .../demo/platform/TransactionSubmitter.java | 2 +- .../platform/expiration/ExpirationUtils.java | 2 +- .../signing/StatsSigningTestingToolMain.java | 6 +- .../src/main/java/module-info.java | 1 + .../demo/stress/StressTestingToolMain.java | 6 +- .../src/main/java/module-info.java | 1 + .../swirlds/base}/units/UnitConstants.java | 2 +- .../src/main/java/module-info.java | 1 + .../base/test/fixtures/time/FakeTime.java | 2 +- .../src/testFixtures/java/module-info.java | 1 - .../com/swirlds/common/bloom/BloomFilter.java | 6 +- .../hasher/SelfSerializableBloomHasher.java | 2 +- .../extensions/CountingStreamExtension.java | 2 +- .../extensions/ThrottleStreamExtension.java | 2 +- .../synchronization/LearningSynchronizer.java | 2 +- .../swirlds/common/metrics/DurationGauge.java | 2 +- .../metrics/extensions/CountPerSecond.java | 2 +- .../statistics/internal/StatsBuffer.java | 2 +- .../swirlds/common/settings/ParsingUtils.java | 196 ---------- .../common/settings/SettingsException.java | 49 --- .../common/stream/EventStreamManager.java | 2 +- .../stream/LinkedObjectStreamUtilities.java | 4 +- .../AbstractStoppableThreadConfiguration.java | 4 +- .../internal/StoppableThreadImpl.java | 2 +- .../swirlds/common/time/IntegerEpochTime.java | 2 +- .../com/swirlds/common/units/DataUnit.java | 2 +- .../com/swirlds/common/units/TimeUnit.java | 18 +- .../com/swirlds/common/utility/ByteUtils.java | 6 +- .../common/utility/throttle/RateLimiter.java | 2 +- .../common/utility/throttle/Throttle.java | 2 +- .../src/main/java/module-info.java | 1 - .../prometheus/PrometheusEndpointTest.java | 2 +- .../settings/DurationDeserializerTests.java | 361 ------------------ .../common/settings/ParsingUtilsTest.java | 61 --- .../common/time/IntegerEpochTimeTest.java | 2 +- .../common/units/UnitConstantsTest.java | 24 +- .../swirlds/common/utility/ByteUtilsTest.java | 6 +- .../impl/converters/DurationConverter.java | 162 +++++++- .../internal/ConfigurationBuilderImpl.java | 11 +- .../src/main/java/module-info.java | 1 - .../converters/DurationConverterTest.java | 329 +++++++++++++++- .../swirlds/merkledb/MerkleDbDataSource.java | 4 +- .../merkledb/MerkleDbStatisticsUpdater.java | 2 +- .../collections/AbstractLongList.java | 2 +- .../merkledb/files/DataFileCommon.java | 6 +- .../merkledb/files/DataFileCompactor.java | 2 +- .../merkledb/files/hashmap/Bucket.java | 2 +- .../hashmap/VirtualKeySetSerializer.java | 2 +- .../MerkleDbDataSourceMetricsTest.java | 2 +- .../MerkleDbDataSourceSnapshotMergeTest.java | 2 +- .../merkledb/MerkleDbDataSourceTest.java | 2 +- .../swirlds/merkledb/MerkleDbTestUtils.java | 2 +- .../collections/AbstractLongListTest.java | 4 +- .../collections/HashListByteBufferTest.java | 2 +- .../collections/LongListHeapTest.java | 2 +- .../collections/LongListOffHeapTest.java | 2 +- .../files/DataFileCollectionTest.java | 2 +- .../MemoryIndexDiskKeyValueStoreTest.java | 2 +- .../hashmap/HalfDiskVirtualKeySetTest.java | 4 +- platform-sdk/swirlds-merkle/build.gradle.kts | 1 + .../merkle/reconnect/BreakableDataSource.java | 4 +- .../reconnect/VirtualMapReconnectTest.java | 4 +- .../platform/JVMPauseDetectorThread.java | 2 +- .../platform/SwirldTransactionSubmitter.java | 2 +- .../PreconsensusEventFileManager.java | 2 +- .../platform/health/OSHealthCheckMain.java | 2 +- .../filesystem/OSFileSystemChecker.java | 2 +- .../platform/metrics/AddedEventMetrics.java | 2 +- .../metrics/ConsensusMetricsImpl.java | 2 +- .../platform/metrics/RuntimeMetrics.java | 2 +- .../swirlds/platform/metrics/SyncMetrics.java | 2 +- .../network/NetworkStatsTransmitter.java | 2 +- .../state/SwirldStateManagerUtils.java | 2 +- .../platform/state/TransactionHandler.java | 2 +- .../platform/stats/cycle/CycleBusyTime.java | 2 +- .../stats/cycle/IntervalPercentageMetric.java | 2 +- .../stats/simple/AccumulatedAverageTime.java | 2 +- .../RandomVirtualMapReconnectTests.java | 4 +- .../platform/recovery/RecoveryTestUtils.java | 2 +- .../MerkleSynchronizationBenchmarks.java | 2 +- .../chatter/simulator/GossipSimulation.java | 4 +- .../chatter/simulator/SimulatedNetwork.java | 2 +- .../simulator/SimulatedNetworkStatistics.java | 2 +- .../test/chatter/simulator/SimulatedNode.java | 2 +- 100 files changed, 617 insertions(+), 812 deletions(-) rename platform-sdk/{swirlds-common/src/main/java/com/swirlds/common => swirlds-base/src/main/java/com/swirlds/base}/units/UnitConstants.java (99%) delete mode 100644 platform-sdk/swirlds-common/src/main/java/com/swirlds/common/settings/ParsingUtils.java delete mode 100644 platform-sdk/swirlds-common/src/main/java/com/swirlds/common/settings/SettingsException.java delete mode 100644 platform-sdk/swirlds-common/src/test/java/com/swirlds/common/settings/DurationDeserializerTests.java delete mode 100644 platform-sdk/swirlds-common/src/test/java/com/swirlds/common/settings/ParsingUtilsTest.java diff --git a/hedera-node/hapi-utils/src/main/java/com/hedera/node/app/hapi/utils/throttles/GasLimitBucketThrottle.java b/hedera-node/hapi-utils/src/main/java/com/hedera/node/app/hapi/utils/throttles/GasLimitBucketThrottle.java index f328e38cfe5e..aacc3478654a 100644 --- a/hedera-node/hapi-utils/src/main/java/com/hedera/node/app/hapi/utils/throttles/GasLimitBucketThrottle.java +++ b/hedera-node/hapi-utils/src/main/java/com/hedera/node/app/hapi/utils/throttles/GasLimitBucketThrottle.java @@ -17,7 +17,7 @@ package com.hedera.node.app.hapi.utils.throttles; import static com.hedera.node.app.hapi.utils.CommonUtils.productWouldOverflow; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_NANOSECONDS; /** * Responsible for throttling transaction by gas limit. Uses a {@link DiscreteLeakyBucket} under the diff --git a/hedera-node/hapi-utils/src/main/java/module-info.java b/hedera-node/hapi-utils/src/main/java/module-info.java index e9458e324ab8..6c1a66be3266 100644 --- a/hedera-node/hapi-utils/src/main/java/module-info.java +++ b/hedera-node/hapi-utils/src/main/java/module-info.java @@ -27,6 +27,7 @@ requires com.fasterxml.jackson.databind; requires com.google.common; requires com.sun.jna; + requires com.swirlds.base; requires org.apache.commons.codec; requires org.apache.logging.log4j.core; requires org.apache.logging.log4j; diff --git a/hedera-node/hapi-utils/src/test/java/com/hedera/node/app/hapi/utils/throttles/GasLimitBucketThrottleTest.java b/hedera-node/hapi-utils/src/test/java/com/hedera/node/app/hapi/utils/throttles/GasLimitBucketThrottleTest.java index d00bc8929ebb..520a18cffb45 100644 --- a/hedera-node/hapi-utils/src/test/java/com/hedera/node/app/hapi/utils/throttles/GasLimitBucketThrottleTest.java +++ b/hedera-node/hapi-utils/src/test/java/com/hedera/node/app/hapi/utils/throttles/GasLimitBucketThrottleTest.java @@ -16,7 +16,7 @@ package com.hedera.node.app.hapi.utils.throttles; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_NANOSECONDS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/records/RecordsModule.java b/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/records/RecordsModule.java index 948f9ac48a47..1afe47e054c9 100644 --- a/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/records/RecordsModule.java +++ b/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/records/RecordsModule.java @@ -17,7 +17,7 @@ package com.hedera.node.app.service.mono.records; import static com.hedera.node.app.service.mono.stream.RecordStreamManager.effectiveLogDir; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_MILLISECONDS; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_MILLISECONDS; import com.google.common.cache.Cache; import com.hedera.node.app.service.mono.context.annotations.StaticAccountMemo; diff --git a/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/state/logic/BlockManager.java b/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/state/logic/BlockManager.java index 87ba5989f7e0..85c81ae25531 100644 --- a/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/state/logic/BlockManager.java +++ b/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/state/logic/BlockManager.java @@ -19,8 +19,8 @@ import static com.hedera.node.app.service.mono.context.properties.PropertyNames.HEDERA_RECORD_STREAM_LOG_EVERY_TRANSACTION; import static com.hedera.node.app.service.mono.context.properties.PropertyNames.HEDERA_RECORD_STREAM_LOG_PERIOD; import static com.hedera.node.app.service.mono.state.merkle.MerkleNetworkContext.ethHashFrom; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_MILLISECONDS; import static com.swirlds.common.stream.LinkedObjectStreamUtilities.getPeriod; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_MILLISECONDS; import com.hedera.node.app.service.evm.contracts.execution.HederaBlockValues; import com.hedera.node.app.service.mono.context.properties.BootstrapProperties; diff --git a/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/stream/RecordStreamManager.java b/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/stream/RecordStreamManager.java index aebd77135c0b..32a5b5615b28 100644 --- a/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/stream/RecordStreamManager.java +++ b/hedera-node/hedera-mono-service/src/main/java/com/hedera/node/app/service/mono/stream/RecordStreamManager.java @@ -16,8 +16,8 @@ package com.hedera.node.app.service.mono.stream; +import static com.swirlds.base.units.UnitConstants.MB_TO_BYTES; import static com.swirlds.common.threading.manager.AdHocThreadManager.getStaticThreadManager; -import static com.swirlds.common.units.UnitConstants.MB_TO_BYTES; import com.google.common.annotations.VisibleForTesting; import com.hedera.node.app.service.mono.context.properties.GlobalDynamicProperties; diff --git a/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/stream/RecordStreamFileWriterTest.java b/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/stream/RecordStreamFileWriterTest.java index 00e7fdfc3f2f..4b70d7eeff5f 100644 --- a/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/stream/RecordStreamFileWriterTest.java +++ b/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/stream/RecordStreamFileWriterTest.java @@ -17,10 +17,10 @@ package com.hedera.node.app.service.mono.stream; import static com.hedera.node.app.hapi.utils.exports.FileCompressionUtils.COMPRESSION_ALGORITHM_EXTENSION; +import static com.swirlds.base.units.UnitConstants.MB_TO_BYTES; import static com.swirlds.common.crypto.SignatureType.RSA; import static com.swirlds.common.stream.LinkedObjectStreamUtilities.generateStreamFileNameFromInstant; import static com.swirlds.common.stream.StreamAligned.NO_ALIGNMENT; -import static com.swirlds.common.units.UnitConstants.MB_TO_BYTES; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.junit.jupiter.api.Assertions.assertArrayEquals; diff --git a/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/stream/RecordStreamManagerTest.java b/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/stream/RecordStreamManagerTest.java index 687a7c75d282..8de1be4fa676 100644 --- a/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/stream/RecordStreamManagerTest.java +++ b/hedera-node/hedera-mono-service/src/test/java/com/hedera/node/app/service/mono/stream/RecordStreamManagerTest.java @@ -16,7 +16,7 @@ package com.hedera.node.app.service.mono.stream; -import static com.swirlds.common.units.UnitConstants.MB_TO_BYTES; +import static com.swirlds.base.units.UnitConstants.MB_TO_BYTES; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/gas/CustomGasCalculator.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/gas/CustomGasCalculator.java index a5b2172e429e..3eb9d45c6f04 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/gas/CustomGasCalculator.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/gas/CustomGasCalculator.java @@ -18,8 +18,8 @@ import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.configOf; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.tinybarValuesFor; -import static com.swirlds.common.units.UnitConstants.HOURS_TO_MINUTES; -import static com.swirlds.common.units.UnitConstants.MINUTES_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.HOURS_TO_MINUTES; +import static com.swirlds.base.units.UnitConstants.MINUTES_TO_SECONDS; import static java.util.Objects.requireNonNull; import com.hedera.node.config.data.CacheConfig; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/module-info.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/module-info.java index 4bfe65af360e..fef550881971 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/module-info.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/module-info.java @@ -21,6 +21,7 @@ requires com.hedera.node.app.service.evm; requires com.github.benmanes.caffeine; requires com.google.common; + requires com.swirlds.base; requires com.swirlds.common; requires org.bouncycastle.provider; requires static com.github.spotbugs.annotations; diff --git a/platform-sdk/platform-apps/demos/StatsDemo/src/main/java/com/swirlds/demo/stats/StatsDemoMain.java b/platform-sdk/platform-apps/demos/StatsDemo/src/main/java/com/swirlds/demo/stats/StatsDemoMain.java index 1657df34bc2f..b7e475cb71e0 100644 --- a/platform-sdk/platform-apps/demos/StatsDemo/src/main/java/com/swirlds/demo/stats/StatsDemoMain.java +++ b/platform-sdk/platform-apps/demos/StatsDemo/src/main/java/com/swirlds/demo/stats/StatsDemoMain.java @@ -26,9 +26,9 @@ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. */ +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.common.metrics.Metric.ValueType.VALUE; import static com.swirlds.common.threading.manager.AdHocThreadManager.getStaticThreadManager; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.platform.gui.SwirldsGui.createConsole; import com.swirlds.common.Console; diff --git a/platform-sdk/platform-apps/demos/StatsDemo/src/main/java/module-info.java b/platform-sdk/platform-apps/demos/StatsDemo/src/main/java/module-info.java index 67c0a692cadd..6aa85b2d2419 100644 --- a/platform-sdk/platform-apps/demos/StatsDemo/src/main/java/module-info.java +++ b/platform-sdk/platform-apps/demos/StatsDemo/src/main/java/module-info.java @@ -1,4 +1,5 @@ module com.swirlds.demo.stats { + requires com.swirlds.base; requires com.swirlds.common; requires com.swirlds.platform.core; requires java.desktop; diff --git a/platform-sdk/platform-apps/tests/MigrationTestingTool/src/main/java/com/swirlds/demo/migration/MigrationTestingToolMain.java b/platform-sdk/platform-apps/tests/MigrationTestingTool/src/main/java/com/swirlds/demo/migration/MigrationTestingToolMain.java index 598c11130f68..c6ad6f411445 100644 --- a/platform-sdk/platform-apps/tests/MigrationTestingTool/src/main/java/com/swirlds/demo/migration/MigrationTestingToolMain.java +++ b/platform-sdk/platform-apps/tests/MigrationTestingTool/src/main/java/com/swirlds/demo/migration/MigrationTestingToolMain.java @@ -16,7 +16,7 @@ package com.swirlds.demo.migration; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import com.swirlds.common.platform.NodeId; import com.swirlds.fcqueue.FCQueueStatistics; diff --git a/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/merkle/map/FCMTransactionHandler.java b/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/merkle/map/FCMTransactionHandler.java index 08e8d81d97ca..2759d256bd01 100644 --- a/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/merkle/map/FCMTransactionHandler.java +++ b/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/merkle/map/FCMTransactionHandler.java @@ -16,7 +16,7 @@ package com.swirlds.demo.merkle.map; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; import static com.swirlds.demo.merkle.map.FCMTransactionPool.DEMO_TRANSACTION_INFO; import static com.swirlds.merkle.map.test.lifecycle.TransactionState.HANDLED; import static com.swirlds.merkle.map.test.lifecycle.TransactionType.Create; diff --git a/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/PlatformTestingToolMain.java b/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/PlatformTestingToolMain.java index 89daa9b8e585..c470756b3adb 100644 --- a/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/PlatformTestingToolMain.java +++ b/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/PlatformTestingToolMain.java @@ -40,6 +40,7 @@ import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.swirlds.base.units.UnitConstants; import com.swirlds.base.utility.Pair; import com.swirlds.common.merkle.iterators.MerkleIterator; import com.swirlds.common.metrics.Counter; @@ -48,7 +49,6 @@ import com.swirlds.common.metrics.SpeedometerMetric; import com.swirlds.common.platform.NodeId; import com.swirlds.common.threading.framework.config.ThreadConfiguration; -import com.swirlds.common.units.UnitConstants; import com.swirlds.common.utility.AutoCloseableWrapper; import com.swirlds.common.utility.StopWatch; import com.swirlds.demo.merkle.map.FCMConfig; diff --git a/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/PlatformTestingToolState.java b/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/PlatformTestingToolState.java index b27c7d96a8f2..c2839df6920e 100644 --- a/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/PlatformTestingToolState.java +++ b/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/PlatformTestingToolState.java @@ -16,10 +16,10 @@ package com.swirlds.demo.platform; +import static com.swirlds.base.units.UnitConstants.MICROSECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; import static com.swirlds.common.io.streams.SerializableStreamConstants.NULL_CLASS_ID; import static com.swirlds.common.metrics.FloatFormats.FORMAT_11_0; -import static com.swirlds.common.units.UnitConstants.MICROSECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; import static com.swirlds.common.utility.CommonUtils.hex; import static com.swirlds.demo.platform.fs.stresstest.proto.TestTransaction.BodyCase.FCMTRANSACTION; import static com.swirlds.logging.legacy.LogMarker.*; diff --git a/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/TransactionSubmitter.java b/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/TransactionSubmitter.java index 8eb1c42c9321..9616c39194ff 100644 --- a/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/TransactionSubmitter.java +++ b/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/TransactionSubmitter.java @@ -16,8 +16,8 @@ package com.swirlds.demo.platform; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_MILLISECONDS; import static com.swirlds.common.metrics.Metrics.PLATFORM_CATEGORY; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_MILLISECONDS; import com.swirlds.base.utility.Pair; import com.swirlds.common.metrics.Metrics; diff --git a/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/expiration/ExpirationUtils.java b/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/expiration/ExpirationUtils.java index 15cc61bd612f..d282d318cf6a 100644 --- a/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/expiration/ExpirationUtils.java +++ b/platform-sdk/platform-apps/tests/PlatformTestingTool/src/main/java/com/swirlds/demo/platform/expiration/ExpirationUtils.java @@ -16,7 +16,7 @@ package com.swirlds.demo.platform.expiration; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; import com.swirlds.common.platform.NodeId; import com.swirlds.demo.merkle.map.FCMFamily; diff --git a/platform-sdk/platform-apps/tests/StatsSigningTestingTool/src/main/java/com/swirlds/demo/stats/signing/StatsSigningTestingToolMain.java b/platform-sdk/platform-apps/tests/StatsSigningTestingTool/src/main/java/com/swirlds/demo/stats/signing/StatsSigningTestingToolMain.java index ac2ec76d57c9..036308f9ac38 100644 --- a/platform-sdk/platform-apps/tests/StatsSigningTestingTool/src/main/java/com/swirlds/demo/stats/signing/StatsSigningTestingToolMain.java +++ b/platform-sdk/platform-apps/tests/StatsSigningTestingTool/src/main/java/com/swirlds/demo/stats/signing/StatsSigningTestingToolMain.java @@ -26,10 +26,10 @@ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. */ +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.common.threading.manager.AdHocThreadManager.getStaticThreadManager; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.logging.legacy.LogMarker.STARTUP; import com.swirlds.common.metrics.Metrics; diff --git a/platform-sdk/platform-apps/tests/StatsSigningTestingTool/src/main/java/module-info.java b/platform-sdk/platform-apps/tests/StatsSigningTestingTool/src/main/java/module-info.java index c51893b8ff29..504c352504ed 100644 --- a/platform-sdk/platform-apps/tests/StatsSigningTestingTool/src/main/java/module-info.java +++ b/platform-sdk/platform-apps/tests/StatsSigningTestingTool/src/main/java/module-info.java @@ -1,4 +1,5 @@ module com.swirlds.demo.stats.signing { + requires com.swirlds.base; requires com.swirlds.common; requires com.swirlds.logging; requires com.swirlds.platform.core; diff --git a/platform-sdk/platform-apps/tests/StressTestingTool/src/main/java/com/swirlds/demo/stress/StressTestingToolMain.java b/platform-sdk/platform-apps/tests/StressTestingTool/src/main/java/com/swirlds/demo/stress/StressTestingToolMain.java index 36a161b6f9a3..1d21eba6eecd 100644 --- a/platform-sdk/platform-apps/tests/StressTestingTool/src/main/java/com/swirlds/demo/stress/StressTestingToolMain.java +++ b/platform-sdk/platform-apps/tests/StressTestingTool/src/main/java/com/swirlds/demo/stress/StressTestingToolMain.java @@ -26,10 +26,10 @@ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. */ +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.common.threading.manager.AdHocThreadManager.getStaticThreadManager; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.logging.legacy.LogMarker.STARTUP; import com.swirlds.common.metrics.Metrics; diff --git a/platform-sdk/platform-apps/tests/StressTestingTool/src/main/java/module-info.java b/platform-sdk/platform-apps/tests/StressTestingTool/src/main/java/module-info.java index 52cc20e76eba..b8187275823a 100644 --- a/platform-sdk/platform-apps/tests/StressTestingTool/src/main/java/module-info.java +++ b/platform-sdk/platform-apps/tests/StressTestingTool/src/main/java/module-info.java @@ -1,4 +1,5 @@ module com.swirlds.demo.stress { + requires com.swirlds.base; requires com.swirlds.common; requires com.swirlds.config.api; requires com.swirlds.logging; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/units/UnitConstants.java b/platform-sdk/swirlds-base/src/main/java/com/swirlds/base/units/UnitConstants.java similarity index 99% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/units/UnitConstants.java rename to platform-sdk/swirlds-base/src/main/java/com/swirlds/base/units/UnitConstants.java index 905bf01f0799..21da94e7d10b 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/units/UnitConstants.java +++ b/platform-sdk/swirlds-base/src/main/java/com/swirlds/base/units/UnitConstants.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.swirlds.common.units; +package com.swirlds.base.units; /** * Contains a variety constants useful when converting between units. diff --git a/platform-sdk/swirlds-base/src/main/java/module-info.java b/platform-sdk/swirlds-base/src/main/java/module-info.java index 0cc6ea2a2020..6365dc0aa720 100644 --- a/platform-sdk/swirlds-base/src/main/java/module-info.java +++ b/platform-sdk/swirlds-base/src/main/java/module-info.java @@ -3,6 +3,7 @@ exports com.swirlds.base.function; exports com.swirlds.base.state; exports com.swirlds.base.time; + exports com.swirlds.base.units; exports com.swirlds.base.utility; exports com.swirlds.base.context; exports com.swirlds.base.context.internal to diff --git a/platform-sdk/swirlds-base/src/testFixtures/java/com/swirlds/base/test/fixtures/time/FakeTime.java b/platform-sdk/swirlds-base/src/testFixtures/java/com/swirlds/base/test/fixtures/time/FakeTime.java index 5ae5dfdb0432..4e1c75acdeca 100644 --- a/platform-sdk/swirlds-base/src/testFixtures/java/com/swirlds/base/test/fixtures/time/FakeTime.java +++ b/platform-sdk/swirlds-base/src/testFixtures/java/com/swirlds/base/test/fixtures/time/FakeTime.java @@ -16,7 +16,7 @@ package com.swirlds.base.test.fixtures.time; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_MILLISECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_MILLISECONDS; import com.swirlds.base.time.Time; import java.time.Duration; diff --git a/platform-sdk/swirlds-base/src/testFixtures/java/module-info.java b/platform-sdk/swirlds-base/src/testFixtures/java/module-info.java index c0fc526a4965..76c0fcf4be12 100644 --- a/platform-sdk/swirlds-base/src/testFixtures/java/module-info.java +++ b/platform-sdk/swirlds-base/src/testFixtures/java/module-info.java @@ -8,6 +8,5 @@ requires transitive com.swirlds.base; requires transitive org.junit.jupiter.api; requires static com.github.spotbugs.annotations; - requires com.swirlds.common; // Should be removed in future requires jakarta.inject; } diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/bloom/BloomFilter.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/bloom/BloomFilter.java index 95313596409c..dfd8b96146f3 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/bloom/BloomFilter.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/bloom/BloomFilter.java @@ -16,9 +16,9 @@ package com.swirlds.common.bloom; -import static com.swirlds.common.units.UnitConstants.BITS_TO_BYTES; -import static com.swirlds.common.units.UnitConstants.BYTES_PER_INT; -import static com.swirlds.common.units.UnitConstants.BYTES_TO_BITS; +import static com.swirlds.base.units.UnitConstants.BITS_TO_BYTES; +import static com.swirlds.base.units.UnitConstants.BYTES_PER_INT; +import static com.swirlds.base.units.UnitConstants.BYTES_TO_BITS; import com.swirlds.common.io.SelfSerializable; import com.swirlds.common.io.streams.SerializableDataInputStream; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/bloom/hasher/SelfSerializableBloomHasher.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/bloom/hasher/SelfSerializableBloomHasher.java index f5a229c9fbfb..4ce8d7fc78dd 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/bloom/hasher/SelfSerializableBloomHasher.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/bloom/hasher/SelfSerializableBloomHasher.java @@ -16,7 +16,7 @@ package com.swirlds.common.bloom.hasher; -import static com.swirlds.common.units.UnitConstants.BYTES_PER_LONG; +import static com.swirlds.base.units.UnitConstants.BYTES_PER_LONG; import static com.swirlds.common.utility.ByteUtils.byteArrayToLong; import static com.swirlds.common.utility.NonCryptographicHashing.hash64; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/io/extendable/extensions/CountingStreamExtension.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/io/extendable/extensions/CountingStreamExtension.java index a6af05f4c894..1728e5d6ccf7 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/io/extendable/extensions/CountingStreamExtension.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/io/extendable/extensions/CountingStreamExtension.java @@ -16,10 +16,10 @@ package com.swirlds.common.io.extendable.extensions; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.io.extendable.extensions.internal.Counter; import com.swirlds.common.io.extendable.extensions.internal.StandardCounter; import com.swirlds.common.io.extendable.extensions.internal.ThreadSafeCounter; -import com.swirlds.common.units.UnitConstants; /** * A stream extension that counts the number of bytes that pass through it diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/io/extendable/extensions/ThrottleStreamExtension.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/io/extendable/extensions/ThrottleStreamExtension.java index 4c9bca231644..2fc0065246ac 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/io/extendable/extensions/ThrottleStreamExtension.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/io/extendable/extensions/ThrottleStreamExtension.java @@ -16,7 +16,7 @@ package com.swirlds.common.io.extendable.extensions; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.common.utility.CompareTo.isGreaterThanOrEqualTo; import static java.util.concurrent.TimeUnit.MILLISECONDS; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/merkle/synchronization/LearningSynchronizer.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/merkle/synchronization/LearningSynchronizer.java index b89f29f20087..1a129b3d4d6a 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/merkle/synchronization/LearningSynchronizer.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/merkle/synchronization/LearningSynchronizer.java @@ -16,7 +16,7 @@ package com.swirlds.common.merkle.synchronization; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_SECONDS; import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; import static com.swirlds.logging.legacy.LogMarker.RECONNECT; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/DurationGauge.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/DurationGauge.java index 71623ae1039f..4f69d601ea16 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/DurationGauge.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/DurationGauge.java @@ -19,7 +19,7 @@ import static com.swirlds.common.metrics.Metric.ValueType.VALUE; import com.swirlds.base.ArgumentUtils; -import com.swirlds.common.units.UnitConstants; +import com.swirlds.base.units.UnitConstants; import edu.umd.cs.findbugs.annotations.NonNull; import java.time.Duration; import java.time.temporal.ChronoUnit; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/extensions/CountPerSecond.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/extensions/CountPerSecond.java index de111f94bf20..5ac8c5489458 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/extensions/CountPerSecond.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/extensions/CountPerSecond.java @@ -20,13 +20,13 @@ import static com.swirlds.common.utility.CommonUtils.throwArgBlank; import com.swirlds.base.time.Time; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.metrics.IntegerAccumulator; import com.swirlds.common.metrics.IntegerPairAccumulator; import com.swirlds.common.metrics.LongAccumulator; import com.swirlds.common.metrics.Metric; import com.swirlds.common.metrics.Metrics; import com.swirlds.common.time.IntegerEpochTime; -import com.swirlds.common.units.UnitConstants; import java.util.Objects; /** diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/statistics/internal/StatsBuffer.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/statistics/internal/StatsBuffer.java index 81b20f9a853e..0debdfb6e7f5 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/statistics/internal/StatsBuffer.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/metrics/statistics/internal/StatsBuffer.java @@ -16,7 +16,7 @@ package com.swirlds.common.metrics.statistics.internal; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import com.swirlds.base.time.Time; import java.util.concurrent.atomic.AtomicInteger; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/settings/ParsingUtils.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/settings/ParsingUtils.java deleted file mode 100644 index 0bc901c610b6..000000000000 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/settings/ParsingUtils.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (C) 2021-2023 Hedera Hashgraph, LLC - * - * 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. - */ - -package com.swirlds.common.settings; - -import static com.swirlds.common.units.UnitConstants.DAYS_TO_HOURS; -import static com.swirlds.common.units.UnitConstants.HOURS_TO_MINUTES; -import static com.swirlds.common.units.UnitConstants.MICROSECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.MINUTES_TO_SECONDS; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.WEEKS_TO_DAYS; - -import java.time.Duration; -import java.time.format.DateTimeParseException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * This class contains utilities for parsing various types of settings. - * - * @deprecated will be replaced by the {@link com.swirlds.config.api.Configuration} API in near future. If you need to - * use this class please try to do as less static access as possible. - */ -@Deprecated(forRemoval = true) -public final class ParsingUtils { - - /** - * Regular expression for parsing durations. Looks for a number (with our without a decimal) followed by a unit. - */ - private static final Pattern durationRegex = Pattern.compile("^\\s*(\\d*\\.?\\d*)\\s*([a-zA-Z]+)\\s*$"); - - /** - * Regular expression for parsing a single number. - */ - private static final Pattern numberRegex = Pattern.compile("\\d+"); - - private ParsingUtils() {} - - /** - * Make an attempt to parse a duration using default deserialization. - * - * @param str the string that is expected to contain a duration - * @return a Duration object if one can be parsed, otherwise null; - */ - private static Duration attemptDefaultDurationDeserialization(final String str) { - try { - return Duration.parse(str); - } catch (final DateTimeParseException ignored) { - return null; - } - } - - /** - * Parse a duration from a string. - *

- * For large durations (i.e. when the number of nanoseconds exceeds {@link Long#MAX_VALUE}), the duration returned - * will be rounded unless the duration is written using {@link Duration#toString()}. Rounding process is - * deterministic. - *

- * If a string containing a single number is passed in, it will be interpreted as a number of milliseconds. - *

- * This parser currently utilizes a regex which may have superlinear time complexity for arbitrary input. Until that - * is addressed, do not use this parser on untrusted strings. - * - * @param str a string containing a duration - * @return a Duration - * @throws SettingsException if there is a problem parsing the string - */ - public static Duration parseDuration(final String str) { - - final Matcher matcher = durationRegex.matcher(str); - - if (matcher.find()) { - - final double magnitude = Double.parseDouble(matcher.group(1)); - final String unit = matcher.group(2).trim().toLowerCase(); - - final long toNanoseconds; - - switch (unit) { - case "ns": - case "nano": - case "nanos": - case "nanosecond": - case "nanoseconds": - case "nanosec": - case "nanosecs": - toNanoseconds = 1; - break; - - case "us": - case "micro": - case "micros": - case "microsecond": - case "microseconds": - case "microsec": - case "microsecs": - toNanoseconds = MICROSECONDS_TO_NANOSECONDS; - break; - - case "ms": - case "milli": - case "millis": - case "millisecond": - case "milliseconds": - case "millisec": - case "millisecs": - toNanoseconds = MILLISECONDS_TO_NANOSECONDS; - break; - - case "s": - case "second": - case "seconds": - case "sec": - case "secs": - toNanoseconds = SECONDS_TO_NANOSECONDS; - break; - - case "m": - case "minute": - case "minutes": - case "min": - case "mins": - toNanoseconds = (long) MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; - break; - - case "h": - case "hour": - case "hours": - toNanoseconds = (long) HOURS_TO_MINUTES * MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; - break; - - case "d": - case "day": - case "days": - toNanoseconds = - (long) DAYS_TO_HOURS * HOURS_TO_MINUTES * MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; - break; - - case "w": - case "week": - case "weeks": - toNanoseconds = (long) WEEKS_TO_DAYS - * DAYS_TO_HOURS - * HOURS_TO_MINUTES - * MINUTES_TO_SECONDS - * SECONDS_TO_NANOSECONDS; - break; - - default: - final Duration duration = attemptDefaultDurationDeserialization(str); - if (duration == null) { - throw new SettingsException("Invalid duration format, unrecognized unit \"" + unit + "\""); - } - return duration; - } - - final double totalNanoseconds = magnitude * toNanoseconds; - if (totalNanoseconds > Long.MAX_VALUE) { - // If a long is unable to hold the required nanoseconds then lower returned resolution to seconds. - final double toSeconds = toNanoseconds * NANOSECONDS_TO_SECONDS; - final long seconds = (long) (magnitude * toSeconds); - return Duration.ofSeconds(seconds); - } - - return Duration.ofNanos((long) totalNanoseconds); - - } else { - final Matcher integerMatcher = numberRegex.matcher(str); - if (integerMatcher.matches()) { - return Duration.ofMillis(Long.parseLong(str)); - } - - final Duration duration = attemptDefaultDurationDeserialization(str); - if (duration == null) { - throw new SettingsException("Invalid duration format, unable to parse \"" + str + "\""); - } - return duration; - } - } -} diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/settings/SettingsException.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/settings/SettingsException.java deleted file mode 100644 index 92dedc4255ba..000000000000 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/settings/SettingsException.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2016-2023 Hedera Hashgraph, LLC - * - * 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. - */ - -package com.swirlds.common.settings; - -/** - * This exception is thrown when there is a settings problem. - * - * @deprecated will be replaced by the {@link com.swirlds.config.api.Configuration} API in near future. If you need - * to use this class please try to do as less static access as possible. - */ -@Deprecated(forRemoval = true) -public class SettingsException extends RuntimeException { - - public SettingsException() {} - - public SettingsException(final String message) { - super(message); - } - - public SettingsException(final String message, final Throwable cause) { - super(message, cause); - } - - public SettingsException(final Throwable cause) { - super(cause); - } - - public SettingsException( - final String message, - final Throwable cause, - final boolean enableSuppression, - final boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } -} diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/stream/EventStreamManager.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/stream/EventStreamManager.java index 956bfdf1a206..b9511cdd8799 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/stream/EventStreamManager.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/stream/EventStreamManager.java @@ -16,8 +16,8 @@ package com.swirlds.common.stream; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_MILLISECONDS; import static com.swirlds.common.metrics.Metrics.INFO_CATEGORY; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_MILLISECONDS; import static com.swirlds.logging.legacy.LogMarker.EVENT_STREAM; import com.swirlds.common.context.PlatformContext; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/stream/LinkedObjectStreamUtilities.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/stream/LinkedObjectStreamUtilities.java index 5ad48fc733e3..f97b97fcfc07 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/stream/LinkedObjectStreamUtilities.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/stream/LinkedObjectStreamUtilities.java @@ -16,9 +16,9 @@ package com.swirlds.common.stream; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_NANOSECONDS; import static com.swirlds.common.stream.internal.TimestampStreamFileWriter.OBJECT_STREAM_VERSION; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_NANOSECONDS; import com.swirlds.base.utility.Pair; import com.swirlds.common.crypto.DigestType; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/threading/framework/internal/AbstractStoppableThreadConfiguration.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/threading/framework/internal/AbstractStoppableThreadConfiguration.java index e6d70f77b30e..3c17ee549ad6 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/threading/framework/internal/AbstractStoppableThreadConfiguration.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/threading/framework/internal/AbstractStoppableThreadConfiguration.java @@ -16,8 +16,8 @@ package com.swirlds.common.threading.framework.internal; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_NANOSECONDS; import com.swirlds.common.threading.framework.Stoppable; import com.swirlds.common.threading.framework.ThreadSeed; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/threading/framework/internal/StoppableThreadImpl.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/threading/framework/internal/StoppableThreadImpl.java index b911667f6713..194592a5ecb8 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/threading/framework/internal/StoppableThreadImpl.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/threading/framework/internal/StoppableThreadImpl.java @@ -16,8 +16,8 @@ package com.swirlds.common.threading.framework.internal; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_MILLISECONDS; import static com.swirlds.common.threading.interrupt.Uninterruptable.retryIfInterrupted; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_MILLISECONDS; import static com.swirlds.common.utility.CompareTo.isGreaterThan; import static com.swirlds.common.utility.StackTrace.getStackTrace; import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/time/IntegerEpochTime.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/time/IntegerEpochTime.java index 29a27a72ee72..52e56d310040 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/time/IntegerEpochTime.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/time/IntegerEpochTime.java @@ -17,7 +17,7 @@ package com.swirlds.common.time; import com.swirlds.base.time.Time; -import com.swirlds.common.units.UnitConstants; +import com.swirlds.base.units.UnitConstants; /** * A wrapper around a {@link Time} instance that provides the lower 31 bits of the epoch, and calculates elapsed time. diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/units/DataUnit.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/units/DataUnit.java index b72a5d472a34..9c9edd63900c 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/units/DataUnit.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/units/DataUnit.java @@ -16,7 +16,7 @@ package com.swirlds.common.units; -import static com.swirlds.common.units.UnitConstants.BYTES_TO_BITS; +import static com.swirlds.base.units.UnitConstants.BYTES_TO_BITS; import com.swirlds.common.units.internal.UnitConverter; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/units/TimeUnit.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/units/TimeUnit.java index 42a1fa29b2b8..f2e6ebdac66c 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/units/TimeUnit.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/units/TimeUnit.java @@ -16,15 +16,15 @@ package com.swirlds.common.units; -import static com.swirlds.common.units.UnitConstants.DAYS_TO_HOURS; -import static com.swirlds.common.units.UnitConstants.HOURS_TO_MINUTES; -import static com.swirlds.common.units.UnitConstants.MICROSECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_MICROSECONDS; -import static com.swirlds.common.units.UnitConstants.MILLISECOND_UNIT; -import static com.swirlds.common.units.UnitConstants.MINUTES_TO_SECONDS; -import static com.swirlds.common.units.UnitConstants.NANOSECOND_UNIT; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_MILLISECONDS; -import static com.swirlds.common.units.UnitConstants.SECOND_UNIT; +import static com.swirlds.base.units.UnitConstants.DAYS_TO_HOURS; +import static com.swirlds.base.units.UnitConstants.HOURS_TO_MINUTES; +import static com.swirlds.base.units.UnitConstants.MICROSECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_MICROSECONDS; +import static com.swirlds.base.units.UnitConstants.MILLISECOND_UNIT; +import static com.swirlds.base.units.UnitConstants.MINUTES_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECOND_UNIT; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_MILLISECONDS; +import static com.swirlds.base.units.UnitConstants.SECOND_UNIT; import com.swirlds.common.units.internal.UnitConverter; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/ByteUtils.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/ByteUtils.java index f03f56512a19..fda2383cc29f 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/ByteUtils.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/ByteUtils.java @@ -16,9 +16,9 @@ package com.swirlds.common.utility; -import static com.swirlds.common.units.UnitConstants.BYTES_PER_INT; -import static com.swirlds.common.units.UnitConstants.BYTES_PER_LONG; -import static com.swirlds.common.units.UnitConstants.BYTES_PER_SHORT; +import static com.swirlds.base.units.UnitConstants.BYTES_PER_INT; +import static com.swirlds.base.units.UnitConstants.BYTES_PER_LONG; +import static com.swirlds.base.units.UnitConstants.BYTES_PER_SHORT; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/throttle/RateLimiter.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/throttle/RateLimiter.java index 8714e971ed2f..49f5a502f28c 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/throttle/RateLimiter.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/throttle/RateLimiter.java @@ -16,7 +16,7 @@ package com.swirlds.common.utility.throttle; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_NANOSECONDS; import static com.swirlds.common.utility.CompareTo.isGreaterThanOrEqualTo; import com.swirlds.base.time.Time; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/throttle/Throttle.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/throttle/Throttle.java index 33deb4f2f9e2..6f8333e6df8e 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/throttle/Throttle.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/utility/throttle/Throttle.java @@ -16,7 +16,7 @@ package com.swirlds.common.utility.throttle; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; /** * Each instance of this class can be used to throttle some kind of flow, to allow only a certain number of transactions diff --git a/platform-sdk/swirlds-common/src/main/java/module-info.java b/platform-sdk/swirlds-common/src/main/java/module-info.java index 629698686b47..b788958b3655 100644 --- a/platform-sdk/swirlds-common/src/main/java/module-info.java +++ b/platform-sdk/swirlds-common/src/main/java/module-info.java @@ -49,7 +49,6 @@ exports com.swirlds.common.sequence; exports com.swirlds.common.sequence.map; exports com.swirlds.common.sequence.set; - exports com.swirlds.common.settings; exports com.swirlds.common.stream; exports com.swirlds.common.stream.internal; exports com.swirlds.common.threading; diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/metrics/platform/prometheus/PrometheusEndpointTest.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/metrics/platform/prometheus/PrometheusEndpointTest.java index 8ceefdc0d90e..de62e390fe04 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/metrics/platform/prometheus/PrometheusEndpointTest.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/metrics/platform/prometheus/PrometheusEndpointTest.java @@ -26,6 +26,7 @@ import com.sun.net.httpserver.HttpServer; import com.swirlds.base.test.fixtures.time.FakeTime; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.metrics.Counter; import com.swirlds.common.metrics.DoubleAccumulator; import com.swirlds.common.metrics.DoubleGauge; @@ -58,7 +59,6 @@ import com.swirlds.common.metrics.platform.Snapshot; import com.swirlds.common.metrics.platform.SnapshotEvent; import com.swirlds.common.platform.NodeId; -import com.swirlds.common.units.UnitConstants; import com.swirlds.test.framework.config.TestConfigBuilder; import io.prometheus.client.Collector; import io.prometheus.client.CollectorRegistry; diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/settings/DurationDeserializerTests.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/settings/DurationDeserializerTests.java deleted file mode 100644 index ff4b57169748..000000000000 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/settings/DurationDeserializerTests.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (C) 2023 Hedera Hashgraph, LLC - * - * 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. - */ - -package com.swirlds.common.settings; - -import static com.swirlds.common.settings.ParsingUtils.parseDuration; -import static com.swirlds.common.units.UnitConstants.DAYS_TO_HOURS; -import static com.swirlds.common.units.UnitConstants.HOURS_TO_MINUTES; -import static com.swirlds.common.units.UnitConstants.MICROSECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.MINUTES_TO_SECONDS; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.WEEKS_TO_DAYS; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import com.swirlds.test.framework.TestTypeTags; -import java.time.Duration; -import java.util.List; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; - -@DisplayName("DurationDeserializer Tests") -class DurationDeserializerTests { - - private static void testDeserialization(final String str, final Duration expected) { - final Duration parsed = parseDuration(str); - assertEquals(expected, parsed, "parsed duration from \"" + str + "\" does not match"); - } - - @Test - @Tag(TestTypeTags.FUNCTIONAL) - @DisplayName("Nanosecond Parsing Tests") - void nanosecondParsingTests() { - - // Test whitespace - testDeserialization("0ns", Duration.ofNanos(0)); - testDeserialization("0 ns", Duration.ofNanos(0)); - testDeserialization(" 0 ns", Duration.ofNanos(0)); - testDeserialization(" 0 ns ", Duration.ofNanos(0)); - testDeserialization(" 0 ns ", Duration.ofNanos(0)); - - // Test decimals - testDeserialization("1ns", Duration.ofNanos(1)); - testDeserialization("1.1ns", Duration.ofNanos(1)); - testDeserialization("1.1 ns", Duration.ofNanos(1)); - testDeserialization("1.4ns", Duration.ofNanos(1)); - testDeserialization("1.5ns", Duration.ofNanos(1)); - testDeserialization("1.6ns", Duration.ofNanos(1)); - testDeserialization("1.ns", Duration.ofNanos(1)); - testDeserialization(".1ns", Duration.ofNanos(0)); - - // Test large values - testDeserialization("10ns", Duration.ofNanos(10)); - testDeserialization("100ns", Duration.ofNanos(100)); - testDeserialization("1000ns", Duration.ofNanos(1000)); - testDeserialization("1000ns", Duration.ofNanos(1000)); - testDeserialization("1000000000ns", Duration.ofNanos(1000000000)); - - // Test abbreviations - for (final String unit : List.of("ns", "nano", "nanos", "nanosecond", "nanoseconds", "nanosec", "nanosecs")) { - testDeserialization("123456 " + unit, Duration.ofNanos(123456)); - } - } - - @Test - @Tag(TestTypeTags.FUNCTIONAL) - @DisplayName("Microsecond Parsing Tests") - void microsecondParsingTests() { - - // Test whitespace - testDeserialization("0us", Duration.ofNanos(0)); - testDeserialization("0 us", Duration.ofNanos(0)); - testDeserialization(" 0 us", Duration.ofNanos(0)); - testDeserialization(" 0 us ", Duration.ofNanos(0)); - testDeserialization(" 0 us ", Duration.ofNanos(0)); - - // Test decimals - final long factor = MICROSECONDS_TO_NANOSECONDS; - testDeserialization("1us", Duration.ofNanos(factor)); - testDeserialization("1.1us", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.1 us", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.4us", Duration.ofNanos((long) (1.4 * factor))); - testDeserialization("1.5us", Duration.ofNanos((long) (1.5 * factor))); - testDeserialization("1.6us", Duration.ofNanos((long) (1.6 * factor))); - testDeserialization("1.us", Duration.ofNanos(factor)); - testDeserialization(".1us", Duration.ofNanos((long) (0.1 * factor))); - - // Test large values - testDeserialization("10us", Duration.ofNanos(10 * factor)); - testDeserialization("100us", Duration.ofNanos(100 * factor)); - testDeserialization("1000us", Duration.ofNanos(1000 * factor)); - testDeserialization("1000us", Duration.ofNanos(1000 * factor)); - testDeserialization("100000us", Duration.ofNanos(100000 * factor)); - - // Test abbreviations - for (final String unit : - List.of("us", "micro", "micros", "microsecond", "microseconds", "microsec", "microsecs")) { - testDeserialization("123456 " + unit, Duration.ofNanos(123456 * factor)); - } - } - - @Test - @Tag(TestTypeTags.FUNCTIONAL) - @DisplayName("Millisecond Parsing Tests") - void millisecondParsingTests() { - - // Test whitespace - testDeserialization("0ms", Duration.ofMillis(0)); - testDeserialization("0 ms", Duration.ofMillis(0)); - testDeserialization(" 0 ms", Duration.ofMillis(0)); - testDeserialization(" 0 ms ", Duration.ofMillis(0)); - testDeserialization(" 0 ms ", Duration.ofMillis(0)); - - // Test decimals - final long factor = MILLISECONDS_TO_NANOSECONDS; - testDeserialization("1ms", Duration.ofNanos(factor)); - testDeserialization("1.1ms", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.1 ms", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.4ms", Duration.ofNanos((long) (1.4 * factor))); - testDeserialization("1.5ms", Duration.ofNanos((long) (1.5 * factor))); - testDeserialization("1.6ms", Duration.ofNanos((long) (1.6 * factor))); - testDeserialization("1.ms", Duration.ofNanos(factor)); - testDeserialization(".1ms", Duration.ofNanos((long) (0.1 * factor))); - - // Test large values - testDeserialization("10ms", Duration.ofMillis(10)); - testDeserialization("100ms", Duration.ofMillis(100)); - testDeserialization("1000ms", Duration.ofMillis(1000)); - testDeserialization("1000ms", Duration.ofMillis(1000)); - testDeserialization("1000000000ms", Duration.ofMillis(1000000000)); - - // Test abbreviations - for (final String unit : - List.of("ms", "milli", "millis", "millisecond", "milliseconds", "millisec", "millisecs")) { - testDeserialization("123456 " + unit, Duration.ofMillis(123456)); - } - } - - @Test - @Tag(TestTypeTags.FUNCTIONAL) - @DisplayName("Second Parsing Tests") - void secondParsingTests() { - - // Test whitespace - testDeserialization("0s", Duration.ofSeconds(0)); - testDeserialization("0 s", Duration.ofSeconds(0)); - testDeserialization(" 0 s", Duration.ofSeconds(0)); - testDeserialization(" 0 s ", Duration.ofSeconds(0)); - testDeserialization(" 0 s ", Duration.ofSeconds(0)); - - // Test decimals - final long factor = SECONDS_TO_NANOSECONDS; - testDeserialization("1s", Duration.ofNanos(factor)); - testDeserialization("1.1s", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.1 s", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.4s", Duration.ofNanos((long) (1.4 * factor))); - testDeserialization("1.5s", Duration.ofNanos((long) (1.5 * factor))); - testDeserialization("1.6s", Duration.ofNanos((long) (1.6 * factor))); - testDeserialization("1.s", Duration.ofNanos(factor)); - testDeserialization(".1s", Duration.ofNanos((long) (0.1 * factor))); - - // Test large values - testDeserialization("10s", Duration.ofSeconds(10)); - testDeserialization("100s", Duration.ofSeconds(100)); - testDeserialization("1000s", Duration.ofSeconds(1000)); - testDeserialization("1000s", Duration.ofSeconds(1000)); - testDeserialization("1000000000s", Duration.ofSeconds(1000000000)); - - // Test abbreviations - for (final String unit : List.of("s", "sec", "secs", "second", "seconds")) { - testDeserialization("123456 " + unit, Duration.ofSeconds(123456)); - } - } - - @Test - @Tag(TestTypeTags.FUNCTIONAL) - @DisplayName("Minute Parsing Tests") - void minuteParsingTests() { - - // Test whitespace - testDeserialization("0m", Duration.ofMinutes(0)); - testDeserialization("0 m", Duration.ofMinutes(0)); - testDeserialization(" 0 m", Duration.ofMinutes(0)); - testDeserialization(" 0 m ", Duration.ofMinutes(0)); - testDeserialization(" 0 m ", Duration.ofMinutes(0)); - - // Test decimals - final long factor = (long) MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; - testDeserialization("1m", Duration.ofNanos(factor)); - testDeserialization("1.1m", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.1 m", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.4m", Duration.ofNanos((long) (1.4 * factor))); - testDeserialization("1.5m", Duration.ofNanos((long) (1.5 * factor))); - testDeserialization("1.6m", Duration.ofNanos((long) (1.6 * factor))); - testDeserialization("1.m", Duration.ofNanos(factor)); - testDeserialization(".1m", Duration.ofNanos((long) (0.1 * factor))); - - // Test large values - testDeserialization("10m", Duration.ofMinutes(10)); - testDeserialization("100m", Duration.ofMinutes(100)); - testDeserialization("1000m", Duration.ofMinutes(1000)); - testDeserialization("1000m", Duration.ofMinutes(1000)); - testDeserialization("100000m", Duration.ofMinutes(100000)); - - // Test abbreviations - for (final String unit : List.of("m", "min", "mins", "minute", "minutes")) { - testDeserialization("123456 " + unit, Duration.ofMinutes(123456)); - } - } - - @Test - @Tag(TestTypeTags.FUNCTIONAL) - @DisplayName("Hour Parsing Tests") - void hourParsingTests() { - - // Test whitespace - testDeserialization("0h", Duration.ofHours(0)); - testDeserialization("0 h", Duration.ofHours(0)); - testDeserialization(" 0 h", Duration.ofHours(0)); - testDeserialization(" 0 h ", Duration.ofHours(0)); - testDeserialization(" 0 h ", Duration.ofHours(0)); - - // Test decimals - final long factor = (long) HOURS_TO_MINUTES * MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; - testDeserialization("1h", Duration.ofNanos(factor)); - testDeserialization("1.1h", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.1 h", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.4h", Duration.ofNanos((long) (1.4 * factor))); - testDeserialization("1.5h", Duration.ofNanos((long) (1.5 * factor))); - testDeserialization("1.6h", Duration.ofNanos((long) (1.6 * factor))); - testDeserialization("1.h", Duration.ofNanos(factor)); - testDeserialization(".1h", Duration.ofNanos((long) (0.1 * factor))); - - // Test large values - testDeserialization("10h", Duration.ofHours(10)); - testDeserialization("100h", Duration.ofHours(100)); - testDeserialization("1000h", Duration.ofHours(1000)); - testDeserialization("1000h", Duration.ofHours(1000)); - testDeserialization("100000h", Duration.ofHours(100000)); - - // Test abbreviations - for (final String unit : List.of("h", "hour", "hours")) { - testDeserialization("123456 " + unit, Duration.ofHours(123456)); - } - } - - @Test - @Tag(TestTypeTags.FUNCTIONAL) - @DisplayName("Day Parsing Tests") - void dayParsingTests() { - - // Test whitespace - testDeserialization("0d", Duration.ofDays(0)); - testDeserialization("0 d", Duration.ofDays(0)); - testDeserialization(" 0 d", Duration.ofDays(0)); - testDeserialization(" 0 d ", Duration.ofDays(0)); - testDeserialization(" 0 d ", Duration.ofDays(0)); - - // Test decimals - final long factor = (long) DAYS_TO_HOURS * HOURS_TO_MINUTES * MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; - testDeserialization("1d", Duration.ofNanos(factor)); - testDeserialization("1.1d", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.1 d", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.4d", Duration.ofNanos((long) (1.4 * factor))); - testDeserialization("1.5d", Duration.ofNanos((long) (1.5 * factor))); - testDeserialization("1.6d", Duration.ofNanos((long) (1.6 * factor))); - testDeserialization("1.d", Duration.ofNanos(factor)); - testDeserialization(".1d", Duration.ofNanos((long) (0.1 * factor))); - - // Test large values - testDeserialization("10d", Duration.ofDays(10)); - testDeserialization("100d", Duration.ofDays(100)); - testDeserialization("1000d", Duration.ofDays(1000)); - testDeserialization("1000d", Duration.ofDays(1000)); - testDeserialization("100000d", Duration.ofDays(100000)); - - // Test abbreviations - for (final String unit : List.of("d", "day", "days")) { - testDeserialization("12345 " + unit, Duration.ofDays(12345)); - } - } - - @Test - @Tag(TestTypeTags.FUNCTIONAL) - @DisplayName("Week Parsing Tests") - void weekParsingTests() { - - // Test whitespace - testDeserialization("0w", Duration.ofDays(0)); - testDeserialization("0 w", Duration.ofDays(0)); - testDeserialization(" 0 w", Duration.ofDays(0)); - testDeserialization(" 0 w ", Duration.ofDays(0)); - testDeserialization(" 0 W ", Duration.ofDays(0)); - - // Test decimals - final long factor = - (long) WEEKS_TO_DAYS * DAYS_TO_HOURS * HOURS_TO_MINUTES * MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; - testDeserialization("1w", Duration.ofNanos(factor)); - testDeserialization("1.1w", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.1 w", Duration.ofNanos((long) (1.1 * factor))); - testDeserialization("1.4w", Duration.ofNanos((long) (1.4 * factor))); - testDeserialization("1.5w", Duration.ofNanos((long) (1.5 * factor))); - testDeserialization("1.6w", Duration.ofNanos((long) (1.6 * factor))); - testDeserialization("1.w", Duration.ofNanos(factor)); - testDeserialization(".1w", Duration.ofNanos((long) (0.1 * factor))); - - // Test large values - testDeserialization("10w", Duration.ofDays(10 * 7)); - testDeserialization("100w", Duration.ofDays(100 * 7)); - testDeserialization("1000w", Duration.ofDays(1000 * 7)); - testDeserialization("1000w", Duration.ofDays(1000 * 7)); - testDeserialization("10000w", Duration.ofDays(10000 * 7)); - - // Test abbreviations - for (final String unit : List.of("w", "week", "weeks")) { - testDeserialization("12345 " + unit, Duration.ofDays(12345 * 7)); - } - } - - @Test - @Tag(TestTypeTags.FUNCTIONAL) - @DisplayName("Default Parsing Tests") - void defaultParsingTests() { - testDeserialization(Duration.ofNanos(1234).toString(), Duration.ofNanos(1234)); - testDeserialization(Duration.ofMillis(1234).toString(), Duration.ofMillis(1234)); - testDeserialization(Duration.ofSeconds(1234).toString(), Duration.ofSeconds(1234)); - testDeserialization(Duration.ofMinutes(1234).toString(), Duration.ofMinutes(1234)); - testDeserialization(Duration.ofHours(1234).toString(), Duration.ofHours(1234)); - testDeserialization(Duration.ofDays(1234).toString(), Duration.ofDays(1234)); - } - - @Test - @Tag(TestTypeTags.FUNCTIONAL) - @DisplayName("Large Number Tests") - void largeNumberTests() { - - final long seconds = Long.MAX_VALUE - 1; - - final Duration parsed = parseDuration(seconds + ".5 seconds"); - final Duration expected = Duration.ofSeconds(seconds, (long) (0.5 * SECONDS_TO_NANOSECONDS)); - - final long delta = parsed.getSeconds() - expected.getSeconds(); - - assertTrue(delta <= 1 && delta >= -1, "values should be closer together"); - } -} diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/settings/ParsingUtilsTest.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/settings/ParsingUtilsTest.java deleted file mode 100644 index d4ae6047a4fb..000000000000 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/settings/ParsingUtilsTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2023 Hedera Hashgraph, LLC - * - * 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. - */ - -package com.swirlds.common.settings; - -import static com.swirlds.common.settings.ParsingUtils.parseDuration; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.time.Duration; -import org.junit.jupiter.api.Test; - -class ParsingUtilsTest { - @Test - void defaultUnit() { - // given - final String str = "1000"; - - // when - final Duration parsed = parseDuration(str); - - // then - assertEquals(1000, parsed.toMillis()); - } - - @Test - void parseDurationMs() { - // given - final String str = "1000ms"; - - // when - final Duration parsed = parseDuration(str); - - // then - assertEquals(1000, parsed.toMillis()); - } - - @Test - void parseDurationDefaultParser() { - // given - final String str = "PT15M"; - - // when - final Duration parsed = parseDuration(str); - - // then - assertEquals(15, parsed.toMinutes()); - } -} diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/time/IntegerEpochTimeTest.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/time/IntegerEpochTimeTest.java index 697325bb00ba..960d8ebf752d 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/time/IntegerEpochTimeTest.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/time/IntegerEpochTimeTest.java @@ -20,7 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals; import com.swirlds.base.test.fixtures.time.FakeTime; -import com.swirlds.common.units.UnitConstants; +import com.swirlds.base.units.UnitConstants; import java.time.Duration; import java.time.Instant; import org.junit.jupiter.api.BeforeEach; diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/units/UnitConstantsTest.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/units/UnitConstantsTest.java index 301196e6aa53..a28650b2ca37 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/units/UnitConstantsTest.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/units/UnitConstantsTest.java @@ -16,18 +16,18 @@ package com.swirlds.common.units; -import static com.swirlds.common.units.UnitConstants.MICROSECONDS_TO_MILLISECONDS; -import static com.swirlds.common.units.UnitConstants.MICROSECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.MICROSECONDS_TO_SECONDS; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_MICROSECONDS; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_SECONDS; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_MILLISECONDS; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_MICROSECONDS; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_MILLISECONDS; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.MICROSECONDS_TO_MILLISECONDS; +import static com.swirlds.base.units.UnitConstants.MICROSECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.MICROSECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_MICROSECONDS; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_MILLISECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_MICROSECONDS; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_MILLISECONDS; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_NANOSECONDS; import static org.assertj.core.api.Assertions.assertThat; import org.junit.jupiter.api.Test; diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/utility/ByteUtilsTest.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/utility/ByteUtilsTest.java index fd6a7715abbb..83244ceb72ae 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/utility/ByteUtilsTest.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/utility/ByteUtilsTest.java @@ -16,10 +16,10 @@ package com.swirlds.common.utility; +import static com.swirlds.base.units.UnitConstants.BYTES_PER_INT; +import static com.swirlds.base.units.UnitConstants.BYTES_PER_LONG; +import static com.swirlds.base.units.UnitConstants.BYTES_PER_SHORT; import static com.swirlds.common.test.fixtures.RandomUtils.getRandomPrintSeed; -import static com.swirlds.common.units.UnitConstants.BYTES_PER_INT; -import static com.swirlds.common.units.UnitConstants.BYTES_PER_LONG; -import static com.swirlds.common.units.UnitConstants.BYTES_PER_SHORT; import static com.swirlds.common.utility.ByteUtils.byteArrayToInt; import static com.swirlds.common.utility.ByteUtils.byteArrayToLong; import static com.swirlds.common.utility.ByteUtils.byteArrayToShort; diff --git a/platform-sdk/swirlds-config-impl/src/main/java/com/swirlds/config/impl/converters/DurationConverter.java b/platform-sdk/swirlds-config-impl/src/main/java/com/swirlds/config/impl/converters/DurationConverter.java index 9955117fba45..11595a4bcdff 100644 --- a/platform-sdk/swirlds-config-impl/src/main/java/com/swirlds/config/impl/converters/DurationConverter.java +++ b/platform-sdk/swirlds-config-impl/src/main/java/com/swirlds/config/impl/converters/DurationConverter.java @@ -16,9 +16,13 @@ package com.swirlds.config.impl.converters; -import com.swirlds.common.settings.ParsingUtils; +import static com.swirlds.base.units.UnitConstants.*; + import com.swirlds.config.api.converter.ConfigConverter; import java.time.Duration; +import java.time.format.DateTimeParseException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Concrete {@link ConfigConverter} implementation that provides the support for {@link Duration} values in the @@ -26,11 +30,165 @@ */ public final class DurationConverter implements ConfigConverter { + /** + * Regular expression for parsing durations. Looks for a number (with our without a decimal) followed by a unit. + */ + private static final Pattern DURATION_REGEX = Pattern.compile("^\\s*(\\d*\\.?\\d*)\\s*([a-zA-Z]+)\\s*$"); + + /** + * Regular expression for parsing a single number. + */ + private static final Pattern NUMBER_REGEX = Pattern.compile("\\d+"); + /** * {@inheritDoc} */ @Override public Duration convert(final String value) throws IllegalArgumentException { - return ParsingUtils.parseDuration(value); + return parseDuration(value); + } + + /** + * Parse a duration from a string. + *

+ * For large durations (i.e. when the number of nanoseconds exceeds {@link Long#MAX_VALUE}), the duration returned + * will be rounded unless the duration is written using {@link Duration#toString()}. Rounding process is + * deterministic. + *

+ * If a string containing a single number is passed in, it will be interpreted as a number of milliseconds. + *

+ * This parser currently utilizes a regex which may have superlinear time complexity for arbitrary input. Until that + * is addressed, do not use this parser on untrusted strings. + * + * @param str a string containing a duration + * @return a Duration + * @throws IllegalArgumentException if there is a problem parsing the string + */ + private static Duration parseDuration(final String str) { + + final Matcher matcher = DURATION_REGEX.matcher(str); + + if (matcher.find()) { + + final double magnitude = Double.parseDouble(matcher.group(1)); + final String unit = matcher.group(2).trim().toLowerCase(); + + final long toNanoseconds; + + switch (unit) { + case "ns": + case "nano": + case "nanos": + case "nanosecond": + case "nanoseconds": + case "nanosec": + case "nanosecs": + toNanoseconds = 1; + break; + + case "us": + case "micro": + case "micros": + case "microsecond": + case "microseconds": + case "microsec": + case "microsecs": + toNanoseconds = MICROSECONDS_TO_NANOSECONDS; + break; + + case "ms": + case "milli": + case "millis": + case "millisecond": + case "milliseconds": + case "millisec": + case "millisecs": + toNanoseconds = MILLISECONDS_TO_NANOSECONDS; + break; + + case "s": + case "second": + case "seconds": + case "sec": + case "secs": + toNanoseconds = SECONDS_TO_NANOSECONDS; + break; + + case "m": + case "minute": + case "minutes": + case "min": + case "mins": + toNanoseconds = (long) MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; + break; + + case "h": + case "hour": + case "hours": + toNanoseconds = (long) HOURS_TO_MINUTES * MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; + break; + + case "d": + case "day": + case "days": + toNanoseconds = + (long) DAYS_TO_HOURS * HOURS_TO_MINUTES * MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; + break; + + case "w": + case "week": + case "weeks": + toNanoseconds = (long) WEEKS_TO_DAYS + * DAYS_TO_HOURS + * HOURS_TO_MINUTES + * MINUTES_TO_SECONDS + * SECONDS_TO_NANOSECONDS; + break; + + default: + final Duration duration = attemptDefaultDurationDeserialization(str); + if (duration == null) { + throw new IllegalArgumentException( + "Invalid duration format, unrecognized unit \"" + unit + "\""); + } + return duration; + } + + final double totalNanoseconds = magnitude * toNanoseconds; + if (totalNanoseconds > Long.MAX_VALUE) { + // If a long is unable to hold the required nanoseconds then lower returned resolution to seconds. + final double toSeconds = toNanoseconds * NANOSECONDS_TO_SECONDS; + final long seconds = (long) (magnitude * toSeconds); + return Duration.ofSeconds(seconds); + } + + return Duration.ofNanos((long) totalNanoseconds); + + } else { + final Matcher integerMatcher = NUMBER_REGEX.matcher(str); + if (integerMatcher.matches()) { + return Duration.ofMillis(Long.parseLong(str)); + } + + final Duration duration = attemptDefaultDurationDeserialization(str); + if (duration == null) { + throw new IllegalArgumentException("Invalid duration format, unable to parse \"" + str + "\""); + } + return duration; + } + } + + /** + * Make an attempt to parse a duration using default deserialization. + * + * @param str the string that is expected to contain a duration + * @return a Duration object if one can be parsed, otherwise null; + */ + private static Duration attemptDefaultDurationDeserialization(final String str) { + try { + return Duration.parse(str); + } catch (final DateTimeParseException ignored) { + return null; + } } } diff --git a/platform-sdk/swirlds-config-impl/src/main/java/com/swirlds/config/impl/internal/ConfigurationBuilderImpl.java b/platform-sdk/swirlds-config-impl/src/main/java/com/swirlds/config/impl/internal/ConfigurationBuilderImpl.java index 5feeec05ce72..e196eb94ccbe 100644 --- a/platform-sdk/swirlds-config-impl/src/main/java/com/swirlds/config/impl/internal/ConfigurationBuilderImpl.java +++ b/platform-sdk/swirlds-config-impl/src/main/java/com/swirlds/config/impl/internal/ConfigurationBuilderImpl.java @@ -16,9 +16,6 @@ package com.swirlds.config.impl.internal; -import com.swirlds.common.threading.locks.AutoClosableLock; -import com.swirlds.common.threading.locks.Locks; -import com.swirlds.common.threading.locks.locked.Locked; import com.swirlds.config.api.Configuration; import com.swirlds.config.api.ConfigurationBuilder; import com.swirlds.config.api.converter.ConfigConverter; @@ -31,6 +28,7 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.ReentrantLock; /** * This class is an implementation of the {@link ConfigurationBuilder} interface that is based on the given config @@ -41,7 +39,7 @@ final class ConfigurationBuilderImpl implements ConfigurationBuilder { /** * Internal lock to support a thread safe initialization */ - private final AutoClosableLock initializationLock = Locks.createAutoLock(); + private final ReentrantLock initializationLock = new ReentrantLock(); /** * The configuration instance @@ -92,7 +90,8 @@ public ConfigurationBuilderImpl() { @NonNull @Override public Configuration build() { - try (final Locked ignored = initializationLock.lock()) { + initializationLock.lock(); + try { if (initialized.get()) { throw new IllegalStateException("Configuration already initialized"); } @@ -105,6 +104,8 @@ public Configuration build() { validationService.init(); configuration.init(); initialized.set(true); + } finally { + initializationLock.unlock(); } return configuration; } diff --git a/platform-sdk/swirlds-config-impl/src/main/java/module-info.java b/platform-sdk/swirlds-config-impl/src/main/java/module-info.java index a4e668d70029..da7210b9c975 100644 --- a/platform-sdk/swirlds-config-impl/src/main/java/module-info.java +++ b/platform-sdk/swirlds-config-impl/src/main/java/module-info.java @@ -7,7 +7,6 @@ requires transitive com.swirlds.config.api; requires com.swirlds.base; - requires com.swirlds.common; requires com.swirlds.config.extensions; requires static com.github.spotbugs.annotations; requires static com.google.auto.service; diff --git a/platform-sdk/swirlds-config-impl/src/test/java/com/swirlds/config/impl/converters/DurationConverterTest.java b/platform-sdk/swirlds-config-impl/src/test/java/com/swirlds/config/impl/converters/DurationConverterTest.java index d91edef39682..f2b0722247d6 100644 --- a/platform-sdk/swirlds-config-impl/src/test/java/com/swirlds/config/impl/converters/DurationConverterTest.java +++ b/platform-sdk/swirlds-config-impl/src/test/java/com/swirlds/config/impl/converters/DurationConverterTest.java @@ -16,9 +16,20 @@ package com.swirlds.config.impl.converters; +import static com.swirlds.base.units.UnitConstants.DAYS_TO_HOURS; +import static com.swirlds.base.units.UnitConstants.HOURS_TO_MINUTES; +import static com.swirlds.base.units.UnitConstants.MICROSECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.MINUTES_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.WEEKS_TO_DAYS; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + import java.time.Duration; -import java.time.temporal.ChronoUnit; +import java.util.List; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class DurationConverterTest { @@ -32,17 +43,315 @@ public void convertNull() { Assertions.assertThrows(NullPointerException.class, () -> converter.convert(null)); } + private static void testDeserialization(final String str, final Duration expected) { + final Duration parsed = new DurationConverter().convert(str); + assertEquals(expected, parsed, "parsed duration from \"" + str + "\" does not match"); + } + @Test - public void convert() { - // given - final DurationConverter converter = new DurationConverter(); - final String rawValue = "2ms"; + @DisplayName("Nanosecond Parsing Tests") + void nanosecondParsingTests() { - // when - final Duration value = converter.convert(rawValue); + // Test whitespace + testDeserialization("0ns", Duration.ofNanos(0)); + testDeserialization("0 ns", Duration.ofNanos(0)); + testDeserialization(" 0 ns", Duration.ofNanos(0)); + testDeserialization(" 0 ns ", Duration.ofNanos(0)); + testDeserialization(" 0 ns ", Duration.ofNanos(0)); - // then - Assertions.assertNotNull(value); - Assertions.assertEquals(Duration.of(2, ChronoUnit.MILLIS), value); + // Test decimals + testDeserialization("1ns", Duration.ofNanos(1)); + testDeserialization("1.1ns", Duration.ofNanos(1)); + testDeserialization("1.1 ns", Duration.ofNanos(1)); + testDeserialization("1.4ns", Duration.ofNanos(1)); + testDeserialization("1.5ns", Duration.ofNanos(1)); + testDeserialization("1.6ns", Duration.ofNanos(1)); + testDeserialization("1.ns", Duration.ofNanos(1)); + testDeserialization(".1ns", Duration.ofNanos(0)); + + // Test large values + testDeserialization("10ns", Duration.ofNanos(10)); + testDeserialization("100ns", Duration.ofNanos(100)); + testDeserialization("1000ns", Duration.ofNanos(1000)); + testDeserialization("1000ns", Duration.ofNanos(1000)); + testDeserialization("1000000000ns", Duration.ofNanos(1000000000)); + + // Test abbreviations + for (final String unit : List.of("ns", "nano", "nanos", "nanosecond", "nanoseconds", "nanosec", "nanosecs")) { + testDeserialization("123456 " + unit, Duration.ofNanos(123456)); + } + } + + @Test + @DisplayName("Microsecond Parsing Tests") + void microsecondParsingTests() { + + // Test whitespace + testDeserialization("0us", Duration.ofNanos(0)); + testDeserialization("0 us", Duration.ofNanos(0)); + testDeserialization(" 0 us", Duration.ofNanos(0)); + testDeserialization(" 0 us ", Duration.ofNanos(0)); + testDeserialization(" 0 us ", Duration.ofNanos(0)); + + // Test decimals + final long factor = MICROSECONDS_TO_NANOSECONDS; + testDeserialization("1us", Duration.ofNanos(factor)); + testDeserialization("1.1us", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.1 us", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.4us", Duration.ofNanos((long) (1.4 * factor))); + testDeserialization("1.5us", Duration.ofNanos((long) (1.5 * factor))); + testDeserialization("1.6us", Duration.ofNanos((long) (1.6 * factor))); + testDeserialization("1.us", Duration.ofNanos(factor)); + testDeserialization(".1us", Duration.ofNanos((long) (0.1 * factor))); + + // Test large values + testDeserialization("10us", Duration.ofNanos(10 * factor)); + testDeserialization("100us", Duration.ofNanos(100 * factor)); + testDeserialization("1000us", Duration.ofNanos(1000 * factor)); + testDeserialization("1000us", Duration.ofNanos(1000 * factor)); + testDeserialization("100000us", Duration.ofNanos(100000 * factor)); + + // Test abbreviations + for (final String unit : + List.of("us", "micro", "micros", "microsecond", "microseconds", "microsec", "microsecs")) { + testDeserialization("123456 " + unit, Duration.ofNanos(123456 * factor)); + } + } + + @Test + @DisplayName("Millisecond Parsing Tests") + void millisecondParsingTests() { + + // Test whitespace + testDeserialization("0ms", Duration.ofMillis(0)); + testDeserialization("0 ms", Duration.ofMillis(0)); + testDeserialization(" 0 ms", Duration.ofMillis(0)); + testDeserialization(" 0 ms ", Duration.ofMillis(0)); + testDeserialization(" 0 ms ", Duration.ofMillis(0)); + + // Test decimals + final long factor = MILLISECONDS_TO_NANOSECONDS; + testDeserialization("1ms", Duration.ofNanos(factor)); + testDeserialization("1.1ms", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.1 ms", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.4ms", Duration.ofNanos((long) (1.4 * factor))); + testDeserialization("1.5ms", Duration.ofNanos((long) (1.5 * factor))); + testDeserialization("1.6ms", Duration.ofNanos((long) (1.6 * factor))); + testDeserialization("1.ms", Duration.ofNanos(factor)); + testDeserialization(".1ms", Duration.ofNanos((long) (0.1 * factor))); + + // Test large values + testDeserialization("10ms", Duration.ofMillis(10)); + testDeserialization("100ms", Duration.ofMillis(100)); + testDeserialization("1000ms", Duration.ofMillis(1000)); + testDeserialization("1000ms", Duration.ofMillis(1000)); + testDeserialization("1000000000ms", Duration.ofMillis(1000000000)); + + // Test abbreviations + for (final String unit : + List.of("ms", "milli", "millis", "millisecond", "milliseconds", "millisec", "millisecs")) { + testDeserialization("123456 " + unit, Duration.ofMillis(123456)); + } + } + + @Test + @DisplayName("Second Parsing Tests") + void secondParsingTests() { + + // Test whitespace + testDeserialization("0s", Duration.ofSeconds(0)); + testDeserialization("0 s", Duration.ofSeconds(0)); + testDeserialization(" 0 s", Duration.ofSeconds(0)); + testDeserialization(" 0 s ", Duration.ofSeconds(0)); + testDeserialization(" 0 s ", Duration.ofSeconds(0)); + + // Test decimals + final long factor = SECONDS_TO_NANOSECONDS; + testDeserialization("1s", Duration.ofNanos(factor)); + testDeserialization("1.1s", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.1 s", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.4s", Duration.ofNanos((long) (1.4 * factor))); + testDeserialization("1.5s", Duration.ofNanos((long) (1.5 * factor))); + testDeserialization("1.6s", Duration.ofNanos((long) (1.6 * factor))); + testDeserialization("1.s", Duration.ofNanos(factor)); + testDeserialization(".1s", Duration.ofNanos((long) (0.1 * factor))); + + // Test large values + testDeserialization("10s", Duration.ofSeconds(10)); + testDeserialization("100s", Duration.ofSeconds(100)); + testDeserialization("1000s", Duration.ofSeconds(1000)); + testDeserialization("1000s", Duration.ofSeconds(1000)); + testDeserialization("1000000000s", Duration.ofSeconds(1000000000)); + + // Test abbreviations + for (final String unit : List.of("s", "sec", "secs", "second", "seconds")) { + testDeserialization("123456 " + unit, Duration.ofSeconds(123456)); + } + } + + @Test + @DisplayName("Minute Parsing Tests") + void minuteParsingTests() { + + // Test whitespace + testDeserialization("0m", Duration.ofMinutes(0)); + testDeserialization("0 m", Duration.ofMinutes(0)); + testDeserialization(" 0 m", Duration.ofMinutes(0)); + testDeserialization(" 0 m ", Duration.ofMinutes(0)); + testDeserialization(" 0 m ", Duration.ofMinutes(0)); + + // Test decimals + final long factor = (long) MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; + testDeserialization("1m", Duration.ofNanos(factor)); + testDeserialization("1.1m", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.1 m", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.4m", Duration.ofNanos((long) (1.4 * factor))); + testDeserialization("1.5m", Duration.ofNanos((long) (1.5 * factor))); + testDeserialization("1.6m", Duration.ofNanos((long) (1.6 * factor))); + testDeserialization("1.m", Duration.ofNanos(factor)); + testDeserialization(".1m", Duration.ofNanos((long) (0.1 * factor))); + + // Test large values + testDeserialization("10m", Duration.ofMinutes(10)); + testDeserialization("100m", Duration.ofMinutes(100)); + testDeserialization("1000m", Duration.ofMinutes(1000)); + testDeserialization("1000m", Duration.ofMinutes(1000)); + testDeserialization("100000m", Duration.ofMinutes(100000)); + + // Test abbreviations + for (final String unit : List.of("m", "min", "mins", "minute", "minutes")) { + testDeserialization("123456 " + unit, Duration.ofMinutes(123456)); + } + } + + @Test + @DisplayName("Hour Parsing Tests") + void hourParsingTests() { + + // Test whitespace + testDeserialization("0h", Duration.ofHours(0)); + testDeserialization("0 h", Duration.ofHours(0)); + testDeserialization(" 0 h", Duration.ofHours(0)); + testDeserialization(" 0 h ", Duration.ofHours(0)); + testDeserialization(" 0 h ", Duration.ofHours(0)); + + // Test decimals + final long factor = (long) HOURS_TO_MINUTES * MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; + testDeserialization("1h", Duration.ofNanos(factor)); + testDeserialization("1.1h", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.1 h", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.4h", Duration.ofNanos((long) (1.4 * factor))); + testDeserialization("1.5h", Duration.ofNanos((long) (1.5 * factor))); + testDeserialization("1.6h", Duration.ofNanos((long) (1.6 * factor))); + testDeserialization("1.h", Duration.ofNanos(factor)); + testDeserialization(".1h", Duration.ofNanos((long) (0.1 * factor))); + + // Test large values + testDeserialization("10h", Duration.ofHours(10)); + testDeserialization("100h", Duration.ofHours(100)); + testDeserialization("1000h", Duration.ofHours(1000)); + testDeserialization("1000h", Duration.ofHours(1000)); + testDeserialization("100000h", Duration.ofHours(100000)); + + // Test abbreviations + for (final String unit : List.of("h", "hour", "hours")) { + testDeserialization("123456 " + unit, Duration.ofHours(123456)); + } + } + + @Test + @DisplayName("Day Parsing Tests") + void dayParsingTests() { + + // Test whitespace + testDeserialization("0d", Duration.ofDays(0)); + testDeserialization("0 d", Duration.ofDays(0)); + testDeserialization(" 0 d", Duration.ofDays(0)); + testDeserialization(" 0 d ", Duration.ofDays(0)); + testDeserialization(" 0 d ", Duration.ofDays(0)); + + // Test decimals + final long factor = (long) DAYS_TO_HOURS * HOURS_TO_MINUTES * MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; + testDeserialization("1d", Duration.ofNanos(factor)); + testDeserialization("1.1d", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.1 d", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.4d", Duration.ofNanos((long) (1.4 * factor))); + testDeserialization("1.5d", Duration.ofNanos((long) (1.5 * factor))); + testDeserialization("1.6d", Duration.ofNanos((long) (1.6 * factor))); + testDeserialization("1.d", Duration.ofNanos(factor)); + testDeserialization(".1d", Duration.ofNanos((long) (0.1 * factor))); + + // Test large values + testDeserialization("10d", Duration.ofDays(10)); + testDeserialization("100d", Duration.ofDays(100)); + testDeserialization("1000d", Duration.ofDays(1000)); + testDeserialization("1000d", Duration.ofDays(1000)); + testDeserialization("100000d", Duration.ofDays(100000)); + + // Test abbreviations + for (final String unit : List.of("d", "day", "days")) { + testDeserialization("12345 " + unit, Duration.ofDays(12345)); + } + } + + @Test + @DisplayName("Week Parsing Tests") + void weekParsingTests() { + + // Test whitespace + testDeserialization("0w", Duration.ofDays(0)); + testDeserialization("0 w", Duration.ofDays(0)); + testDeserialization(" 0 w", Duration.ofDays(0)); + testDeserialization(" 0 w ", Duration.ofDays(0)); + testDeserialization(" 0 W ", Duration.ofDays(0)); + + // Test decimals + final long factor = + (long) WEEKS_TO_DAYS * DAYS_TO_HOURS * HOURS_TO_MINUTES * MINUTES_TO_SECONDS * SECONDS_TO_NANOSECONDS; + testDeserialization("1w", Duration.ofNanos(factor)); + testDeserialization("1.1w", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.1 w", Duration.ofNanos((long) (1.1 * factor))); + testDeserialization("1.4w", Duration.ofNanos((long) (1.4 * factor))); + testDeserialization("1.5w", Duration.ofNanos((long) (1.5 * factor))); + testDeserialization("1.6w", Duration.ofNanos((long) (1.6 * factor))); + testDeserialization("1.w", Duration.ofNanos(factor)); + testDeserialization(".1w", Duration.ofNanos((long) (0.1 * factor))); + + // Test large values + testDeserialization("10w", Duration.ofDays(10 * 7)); + testDeserialization("100w", Duration.ofDays(100 * 7)); + testDeserialization("1000w", Duration.ofDays(1000 * 7)); + testDeserialization("1000w", Duration.ofDays(1000 * 7)); + testDeserialization("10000w", Duration.ofDays(10000 * 7)); + + // Test abbreviations + for (final String unit : List.of("w", "week", "weeks")) { + testDeserialization("12345 " + unit, Duration.ofDays(12345 * 7)); + } + } + + @Test + @DisplayName("Default Parsing Tests") + void defaultParsingTests() { + testDeserialization(Duration.ofNanos(1234).toString(), Duration.ofNanos(1234)); + testDeserialization(Duration.ofMillis(1234).toString(), Duration.ofMillis(1234)); + testDeserialization(Duration.ofSeconds(1234).toString(), Duration.ofSeconds(1234)); + testDeserialization(Duration.ofMinutes(1234).toString(), Duration.ofMinutes(1234)); + testDeserialization(Duration.ofHours(1234).toString(), Duration.ofHours(1234)); + testDeserialization(Duration.ofDays(1234).toString(), Duration.ofDays(1234)); + } + + @Test + @DisplayName("Large Number Tests") + void largeNumberTests() { + + final long seconds = Long.MAX_VALUE - 1; + + final Duration parsed = new DurationConverter().convert(seconds + ".5 seconds"); + final Duration expected = Duration.ofSeconds(seconds, (long) (0.5 * SECONDS_TO_NANOSECONDS)); + + final long delta = parsed.getSeconds() - expected.getSeconds(); + + assertTrue(delta <= 1 && delta >= -1, "values should be closer together"); } } diff --git a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/MerkleDbDataSource.java b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/MerkleDbDataSource.java index a047c8ad6cdf..3ef84e229fc8 100644 --- a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/MerkleDbDataSource.java +++ b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/MerkleDbDataSource.java @@ -16,8 +16,8 @@ package com.swirlds.merkledb; +import static com.swirlds.base.units.UnitConstants.BYTES_TO_BITS; import static com.swirlds.common.threading.manager.AdHocThreadManager.getStaticThreadManager; -import static com.swirlds.common.units.UnitConstants.BYTES_TO_BITS; import static com.swirlds.logging.legacy.LogMarker.ERROR; import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; import static com.swirlds.logging.legacy.LogMarker.MERKLE_DB; @@ -25,6 +25,7 @@ import static com.swirlds.merkledb.MerkleDb.MERKLEDB_COMPONENT; import static java.util.Objects.requireNonNull; +import com.swirlds.base.units.UnitConstants; import com.swirlds.base.utility.ToStringBuilder; import com.swirlds.common.config.singleton.ConfigurationHolder; import com.swirlds.common.crypto.DigestType; @@ -32,7 +33,6 @@ import com.swirlds.common.io.streams.SerializableDataOutputStream; import com.swirlds.common.metrics.Metrics; import com.swirlds.common.threading.framework.config.ThreadConfiguration; -import com.swirlds.common.units.UnitConstants; import com.swirlds.merkledb.collections.HashListByteBuffer; import com.swirlds.merkledb.collections.LongList; import com.swirlds.merkledb.collections.LongListDisk; diff --git a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/MerkleDbStatisticsUpdater.java b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/MerkleDbStatisticsUpdater.java index 1934e40b28fd..7c3da721e278 100644 --- a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/MerkleDbStatisticsUpdater.java +++ b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/MerkleDbStatisticsUpdater.java @@ -16,7 +16,7 @@ package com.swirlds.merkledb; -import static com.swirlds.common.units.UnitConstants.BYTES_TO_MEBIBYTES; +import static com.swirlds.base.units.UnitConstants.BYTES_TO_MEBIBYTES; import com.swirlds.common.metrics.FunctionGauge; import com.swirlds.common.metrics.Metrics; diff --git a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/collections/AbstractLongList.java b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/collections/AbstractLongList.java index 356a7e679ded..38acc9d81d83 100644 --- a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/collections/AbstractLongList.java +++ b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/collections/AbstractLongList.java @@ -16,7 +16,7 @@ package com.swirlds.merkledb.collections; -import static com.swirlds.common.units.UnitConstants.MEBIBYTES_TO_BYTES; +import static com.swirlds.base.units.UnitConstants.MEBIBYTES_TO_BYTES; import static com.swirlds.merkledb.utilities.MerkleDbFileUtils.readFromFileChannel; import static java.lang.Math.max; import static java.lang.Math.min; diff --git a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/DataFileCommon.java b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/DataFileCommon.java index 9dd364cf19af..34bed7de99f7 100644 --- a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/DataFileCommon.java +++ b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/DataFileCommon.java @@ -16,10 +16,10 @@ package com.swirlds.merkledb.files; +import static com.swirlds.base.units.UnitConstants.GIBIBYTES_TO_BYTES; +import static com.swirlds.base.units.UnitConstants.KIBIBYTES_TO_BYTES; +import static com.swirlds.base.units.UnitConstants.MEBIBYTES_TO_BYTES; import static com.swirlds.common.formatting.HorizontalAlignment.ALIGNED_RIGHT; -import static com.swirlds.common.units.UnitConstants.GIBIBYTES_TO_BYTES; -import static com.swirlds.common.units.UnitConstants.KIBIBYTES_TO_BYTES; -import static com.swirlds.common.units.UnitConstants.MEBIBYTES_TO_BYTES; import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; import static com.swirlds.logging.legacy.LogMarker.MERKLE_DB; import static java.util.stream.Collectors.joining; diff --git a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/DataFileCompactor.java b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/DataFileCompactor.java index 2c8d220404b3..281ad0161896 100644 --- a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/DataFileCompactor.java +++ b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/DataFileCompactor.java @@ -23,8 +23,8 @@ import static com.swirlds.merkledb.files.DataFileCommon.getSizeOfFilesByPath; import static com.swirlds.merkledb.files.DataFileCommon.logCompactStats; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.config.singleton.ConfigurationHolder; -import com.swirlds.common.units.UnitConstants; import com.swirlds.merkledb.KeyRange; import com.swirlds.merkledb.collections.CASableLongIndex; import com.swirlds.merkledb.config.MerkleDbConfig; diff --git a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/hashmap/Bucket.java b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/hashmap/Bucket.java index 3c8f95cea726..18f18e354330 100644 --- a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/hashmap/Bucket.java +++ b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/hashmap/Bucket.java @@ -22,7 +22,7 @@ import static com.swirlds.merkledb.files.hashmap.HalfDiskHashMap.SPECIAL_DELETE_ME_VALUE; import static com.swirlds.merkledb.files.hashmap.HalfDiskHashMap.VALUE_SIZE; -import com.swirlds.common.units.UnitConstants; +import com.swirlds.base.units.UnitConstants; import com.swirlds.merkledb.serialize.KeySerializer; import com.swirlds.virtualmap.VirtualKey; import java.io.Closeable; diff --git a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/hashmap/VirtualKeySetSerializer.java b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/hashmap/VirtualKeySetSerializer.java index a3eef6263ac6..fa5776f88360 100644 --- a/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/hashmap/VirtualKeySetSerializer.java +++ b/platform-sdk/swirlds-jasperdb/src/main/java/com/swirlds/merkledb/files/hashmap/VirtualKeySetSerializer.java @@ -16,7 +16,7 @@ package com.swirlds.merkledb.files.hashmap; -import static com.swirlds.common.units.UnitConstants.BYTES_PER_LONG; +import static com.swirlds.base.units.UnitConstants.BYTES_PER_LONG; import com.swirlds.common.constructable.ConstructableIgnored; import com.swirlds.merkledb.serialize.AbstractFixedSizeKeySerializer; diff --git a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceMetricsTest.java b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceMetricsTest.java index 2c5391198463..5ed2eb8faa6b 100644 --- a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceMetricsTest.java +++ b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceMetricsTest.java @@ -25,12 +25,12 @@ import static com.swirlds.merkledb.collections.LongListOffHeap.DEFAULT_RESERVED_BUFFER_LENGTH; import static org.junit.jupiter.api.Assertions.assertEquals; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.constructable.ConstructableRegistry; import com.swirlds.common.crypto.DigestType; import com.swirlds.common.io.utility.TemporaryFileBuilder; import com.swirlds.common.metrics.Metric; import com.swirlds.common.metrics.Metrics; -import com.swirlds.common.units.UnitConstants; import com.swirlds.test.framework.TestComponentTags; import com.swirlds.test.framework.TestTypeTags; import com.swirlds.virtualmap.VirtualLongKey; diff --git a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceSnapshotMergeTest.java b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceSnapshotMergeTest.java index 43dd51189f8e..c3f20b5416b4 100644 --- a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceSnapshotMergeTest.java +++ b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceSnapshotMergeTest.java @@ -30,11 +30,11 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.constructable.ConstructableRegistry; import com.swirlds.common.constructable.ConstructableRegistryException; import com.swirlds.common.metrics.Metric; import com.swirlds.common.metrics.Metrics; -import com.swirlds.common.units.UnitConstants; import com.swirlds.virtualmap.VirtualLongKey; import java.io.IOException; import java.lang.reflect.Field; diff --git a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceTest.java b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceTest.java index 821b12903085..68870ac3e4b2 100644 --- a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceTest.java +++ b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbDataSourceTest.java @@ -30,9 +30,9 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.constructable.ConstructableRegistry; import com.swirlds.common.io.utility.TemporaryFileBuilder; -import com.swirlds.common.units.UnitConstants; import com.swirlds.merkledb.serialize.KeyIndexType; import com.swirlds.test.framework.TestQualifierTags; import com.swirlds.virtualmap.VirtualLongKey; diff --git a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbTestUtils.java b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbTestUtils.java index cb1e79037710..7afe86500496 100644 --- a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbTestUtils.java +++ b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/MerkleDbTestUtils.java @@ -22,6 +22,7 @@ import static org.mockito.Mockito.mock; import com.sun.management.HotSpotDiagnosticMXBean; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.crypto.DigestType; import com.swirlds.common.crypto.Hash; import com.swirlds.common.crypto.HashBuilder; @@ -31,7 +32,6 @@ import com.swirlds.common.metrics.platform.DefaultMetrics; import com.swirlds.common.metrics.platform.DefaultMetricsFactory; import com.swirlds.common.metrics.platform.MetricKeyRegistry; -import com.swirlds.common.units.UnitConstants; import com.swirlds.config.api.Configuration; import com.swirlds.test.framework.config.TestConfigBuilder; import com.swirlds.virtualmap.datasource.VirtualDataSource; diff --git a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/AbstractLongListTest.java b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/AbstractLongListTest.java index 5562d6cf3aa2..f6c7b0fef52b 100644 --- a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/AbstractLongListTest.java +++ b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/AbstractLongListTest.java @@ -16,8 +16,8 @@ package com.swirlds.merkledb.collections; -import static com.swirlds.common.units.UnitConstants.BYTES_TO_MEBIBYTES; -import static com.swirlds.common.units.UnitConstants.MEBIBYTES_TO_BYTES; +import static com.swirlds.base.units.UnitConstants.BYTES_TO_MEBIBYTES; +import static com.swirlds.base.units.UnitConstants.MEBIBYTES_TO_BYTES; import static com.swirlds.merkledb.MerkleDbTestUtils.checkDirectMemoryIsCleanedUpToLessThanBaseUsage; import static com.swirlds.merkledb.MerkleDbTestUtils.getDirectMemoryUsedBytes; import static com.swirlds.merkledb.collections.AbstractLongList.FILE_HEADER_SIZE_V2; diff --git a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/HashListByteBufferTest.java b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/HashListByteBufferTest.java index d4dc17ae4234..1982eca59719 100644 --- a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/HashListByteBufferTest.java +++ b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/HashListByteBufferTest.java @@ -26,8 +26,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.crypto.Hash; -import com.swirlds.common.units.UnitConstants; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; diff --git a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/LongListHeapTest.java b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/LongListHeapTest.java index 55a3d1ae1624..73b64cce76ed 100644 --- a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/LongListHeapTest.java +++ b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/LongListHeapTest.java @@ -16,7 +16,7 @@ package com.swirlds.merkledb.collections; -import static com.swirlds.common.units.UnitConstants.MEBIBYTES_TO_BYTES; +import static com.swirlds.base.units.UnitConstants.MEBIBYTES_TO_BYTES; import java.io.IOException; import java.nio.file.Path; diff --git a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/LongListOffHeapTest.java b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/LongListOffHeapTest.java index dd4896d06ca2..6e12324d80e8 100644 --- a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/LongListOffHeapTest.java +++ b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/collections/LongListOffHeapTest.java @@ -16,7 +16,7 @@ package com.swirlds.merkledb.collections; -import static com.swirlds.common.units.UnitConstants.MEBIBYTES_TO_BYTES; +import static com.swirlds.base.units.UnitConstants.MEBIBYTES_TO_BYTES; import static com.swirlds.merkledb.collections.AbstractLongList.DEFAULT_MAX_LONGS_TO_STORE; import static com.swirlds.merkledb.collections.AbstractLongList.DEFAULT_NUM_LONGS_PER_CHUNK; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; diff --git a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/DataFileCollectionTest.java b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/DataFileCollectionTest.java index b4891f32fc72..0873caf15ab7 100644 --- a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/DataFileCollectionTest.java +++ b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/DataFileCollectionTest.java @@ -33,8 +33,8 @@ import static org.mockito.Mockito.reset; import static org.mockito.Mockito.when; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.test.logging.MockAppender; -import com.swirlds.common.units.UnitConstants; import com.swirlds.merkledb.KeyRange; import com.swirlds.merkledb.collections.CASableLongIndex; import com.swirlds.merkledb.collections.ImmutableIndexedObjectListUsingArray; diff --git a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/MemoryIndexDiskKeyValueStoreTest.java b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/MemoryIndexDiskKeyValueStoreTest.java index 589d79e83727..c528f979a5d8 100644 --- a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/MemoryIndexDiskKeyValueStoreTest.java +++ b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/MemoryIndexDiskKeyValueStoreTest.java @@ -23,8 +23,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.threading.atomic.AtomicDouble; -import com.swirlds.common.units.UnitConstants; import com.swirlds.merkledb.collections.LongListOffHeap; import com.swirlds.test.framework.TestQualifierTags; import java.io.IOException; diff --git a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/hashmap/HalfDiskVirtualKeySetTest.java b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/hashmap/HalfDiskVirtualKeySetTest.java index 61eeee7a80d5..96b11e6df686 100644 --- a/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/hashmap/HalfDiskVirtualKeySetTest.java +++ b/platform-sdk/swirlds-jasperdb/src/test/java/com/swirlds/merkledb/files/hashmap/HalfDiskVirtualKeySetTest.java @@ -16,9 +16,9 @@ package com.swirlds.merkledb.files.hashmap; +import static com.swirlds.base.units.UnitConstants.BYTES_TO_BITS; +import static com.swirlds.base.units.UnitConstants.MEBIBYTES_TO_BYTES; import static com.swirlds.common.test.fixtures.RandomUtils.getRandomPrintSeed; -import static com.swirlds.common.units.UnitConstants.BYTES_TO_BITS; -import static com.swirlds.common.units.UnitConstants.MEBIBYTES_TO_BYTES; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/platform-sdk/swirlds-merkle/build.gradle.kts b/platform-sdk/swirlds-merkle/build.gradle.kts index 2d9fe487b26f..d69a2152607e 100644 --- a/platform-sdk/swirlds-merkle/build.gradle.kts +++ b/platform-sdk/swirlds-merkle/build.gradle.kts @@ -20,6 +20,7 @@ plugins { } testModuleInfo { + requires("com.swirlds.base") requires("com.swirlds.common.testing") requires("com.swirlds.config.api") requires("com.swirlds.config.extensions") diff --git a/platform-sdk/swirlds-merkle/src/test/java/com/swirlds/virtual/merkle/reconnect/BreakableDataSource.java b/platform-sdk/swirlds-merkle/src/test/java/com/swirlds/virtual/merkle/reconnect/BreakableDataSource.java index 5e1b1cc1d0de..349a56d30cf3 100644 --- a/platform-sdk/swirlds-merkle/src/test/java/com/swirlds/virtual/merkle/reconnect/BreakableDataSource.java +++ b/platform-sdk/swirlds-merkle/src/test/java/com/swirlds/virtual/merkle/reconnect/BreakableDataSource.java @@ -16,8 +16,8 @@ package com.swirlds.virtual.merkle.reconnect; -import static com.swirlds.common.units.UnitConstants.BYTES_TO_BITS; -import static com.swirlds.common.units.UnitConstants.MEBIBYTES_TO_BYTES; +import static com.swirlds.base.units.UnitConstants.BYTES_TO_BITS; +import static com.swirlds.base.units.UnitConstants.MEBIBYTES_TO_BYTES; import com.swirlds.common.crypto.Hash; import com.swirlds.common.io.streams.SerializableDataOutputStream; diff --git a/platform-sdk/swirlds-merkle/src/test/java/com/swirlds/virtual/merkle/reconnect/VirtualMapReconnectTest.java b/platform-sdk/swirlds-merkle/src/test/java/com/swirlds/virtual/merkle/reconnect/VirtualMapReconnectTest.java index 97f8dd166350..d7359d82530e 100644 --- a/platform-sdk/swirlds-merkle/src/test/java/com/swirlds/virtual/merkle/reconnect/VirtualMapReconnectTest.java +++ b/platform-sdk/swirlds-merkle/src/test/java/com/swirlds/virtual/merkle/reconnect/VirtualMapReconnectTest.java @@ -16,8 +16,8 @@ package com.swirlds.virtual.merkle.reconnect; -import static com.swirlds.common.units.UnitConstants.BYTES_TO_BITS; -import static com.swirlds.common.units.UnitConstants.MEBIBYTES_TO_BYTES; +import static com.swirlds.base.units.UnitConstants.BYTES_TO_BITS; +import static com.swirlds.base.units.UnitConstants.MEBIBYTES_TO_BYTES; import static com.swirlds.test.framework.TestQualifierTags.TIME_CONSUMING; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/JVMPauseDetectorThread.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/JVMPauseDetectorThread.java index 1d273c3ac56b..441763eaeeaf 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/JVMPauseDetectorThread.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/JVMPauseDetectorThread.java @@ -16,7 +16,7 @@ package com.swirlds.platform; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_NANOSECONDS; import java.util.concurrent.TimeUnit; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldTransactionSubmitter.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldTransactionSubmitter.java index c44d22cc6b2d..b8010a14c20c 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldTransactionSubmitter.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldTransactionSubmitter.java @@ -16,7 +16,7 @@ package com.swirlds.platform; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; import com.swirlds.base.function.BooleanFunction; import com.swirlds.common.config.TransactionConfig; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/preconsensus/PreconsensusEventFileManager.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/preconsensus/PreconsensusEventFileManager.java index 7ba647378a0a..63192eba0424 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/preconsensus/PreconsensusEventFileManager.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/event/preconsensus/PreconsensusEventFileManager.java @@ -21,11 +21,11 @@ import static com.swirlds.platform.event.preconsensus.PreconsensusEventUtilities.compactPreconsensusEventFile; import com.swirlds.base.time.Time; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.config.StateConfig; import com.swirlds.common.context.PlatformContext; import com.swirlds.common.io.utility.RecycleBin; import com.swirlds.common.platform.NodeId; -import com.swirlds.common.units.UnitConstants; import com.swirlds.common.utility.RandomAccessDeque; import com.swirlds.common.utility.UnmodifiableIterator; import com.swirlds.common.utility.ValueReference; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/health/OSHealthCheckMain.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/health/OSHealthCheckMain.java index 62349d519c68..23cce8d51d62 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/health/OSHealthCheckMain.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/health/OSHealthCheckMain.java @@ -16,7 +16,7 @@ package com.swirlds.platform.health; -import com.swirlds.common.units.UnitConstants; +import com.swirlds.base.units.UnitConstants; import com.swirlds.platform.health.clock.OSClockSourceSpeedCheck; import com.swirlds.platform.health.entropy.OSEntropyCheck; import com.swirlds.platform.health.filesystem.OSFileSystemCheck; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/health/filesystem/OSFileSystemChecker.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/health/filesystem/OSFileSystemChecker.java index a20c3f1d39a3..851f110a7817 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/health/filesystem/OSFileSystemChecker.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/health/filesystem/OSFileSystemChecker.java @@ -19,8 +19,8 @@ import static com.swirlds.common.formatting.StringFormattingUtils.addLine; import static com.swirlds.platform.health.OSHealthCheckUtils.reportHeader; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.config.OSHealthCheckConfig; -import com.swirlds.common.units.UnitConstants; import edu.umd.cs.findbugs.annotations.NonNull; import java.nio.file.Path; import java.util.Objects; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/AddedEventMetrics.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/AddedEventMetrics.java index d3df49c1593d..4cd44a1130de 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/AddedEventMetrics.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/AddedEventMetrics.java @@ -16,6 +16,7 @@ package com.swirlds.platform.metrics; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.common.metrics.FloatFormats.FORMAT_10_3; import static com.swirlds.common.metrics.FloatFormats.FORMAT_13_2; import static com.swirlds.common.metrics.FloatFormats.FORMAT_16_0; @@ -24,7 +25,6 @@ import static com.swirlds.common.metrics.FloatFormats.FORMAT_5_3; import static com.swirlds.common.metrics.Metrics.INTERNAL_CATEGORY; import static com.swirlds.common.metrics.Metrics.PLATFORM_CATEGORY; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; import com.swirlds.common.metrics.Counter; import com.swirlds.common.metrics.Metrics; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/ConsensusMetricsImpl.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/ConsensusMetricsImpl.java index bebb0ac94688..13e42d79fed9 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/ConsensusMetricsImpl.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/ConsensusMetricsImpl.java @@ -16,13 +16,13 @@ package com.swirlds.platform.metrics; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.common.metrics.FloatFormats.FORMAT_10_0; import static com.swirlds.common.metrics.FloatFormats.FORMAT_10_3; import static com.swirlds.common.metrics.FloatFormats.FORMAT_4_2; import static com.swirlds.common.metrics.FloatFormats.FORMAT_9_6; import static com.swirlds.common.metrics.Metrics.INTERNAL_CATEGORY; import static com.swirlds.common.metrics.Metrics.PLATFORM_CATEGORY; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; import com.swirlds.common.metrics.Counter; import com.swirlds.common.metrics.Metrics; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/RuntimeMetrics.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/RuntimeMetrics.java index 9b9ad376598c..f9d163211956 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/RuntimeMetrics.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/RuntimeMetrics.java @@ -27,10 +27,10 @@ import com.sun.management.HotSpotDiagnosticMXBean; import com.sun.management.OperatingSystemMXBean; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.metrics.FunctionGauge; import com.swirlds.common.metrics.Metrics; import com.swirlds.common.metrics.RunningAverageMetric; -import com.swirlds.common.units.UnitConstants; import com.swirlds.common.utility.CommonUtils; import com.swirlds.common.utility.RuntimeObjectRegistry; import com.swirlds.platform.state.signed.SignedState; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/SyncMetrics.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/SyncMetrics.java index 5419db11dc64..6470748b05ef 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/SyncMetrics.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/metrics/SyncMetrics.java @@ -25,10 +25,10 @@ import static com.swirlds.common.metrics.Metrics.INTERNAL_CATEGORY; import static com.swirlds.common.metrics.Metrics.PLATFORM_CATEGORY; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.metrics.Metrics; import com.swirlds.common.metrics.RunningAverageMetric; import com.swirlds.common.metrics.extensions.CountPerSecond; -import com.swirlds.common.units.UnitConstants; import com.swirlds.platform.consensus.GraphGenerations; import com.swirlds.platform.gossip.shadowgraph.ShadowGraph; import com.swirlds.platform.gossip.shadowgraph.ShadowGraphSynchronizer; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/network/NetworkStatsTransmitter.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/network/NetworkStatsTransmitter.java index f5061fda33bc..0eb172eb1aaf 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/network/NetworkStatsTransmitter.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/network/NetworkStatsTransmitter.java @@ -16,7 +16,7 @@ package com.swirlds.platform.network; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_MICROSECONDS; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_MICROSECONDS; import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; import com.swirlds.base.state.Startable; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/SwirldStateManagerUtils.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/SwirldStateManagerUtils.java index e011da818013..fa863d6ec807 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/SwirldStateManagerUtils.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/SwirldStateManagerUtils.java @@ -16,7 +16,7 @@ package com.swirlds.platform.state; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_MICROSECONDS; import com.swirlds.platform.metrics.SwirldStateMetrics; import com.swirlds.platform.system.SoftwareVersion; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/TransactionHandler.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/TransactionHandler.java index d3fd37453e86..b914d2c6a1ca 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/TransactionHandler.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/TransactionHandler.java @@ -16,7 +16,7 @@ package com.swirlds.platform.state; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; import com.swirlds.common.platform.NodeId; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/cycle/CycleBusyTime.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/cycle/CycleBusyTime.java index e5b5e0d7c11c..af57b8827f78 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/cycle/CycleBusyTime.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/cycle/CycleBusyTime.java @@ -16,8 +16,8 @@ package com.swirlds.platform.stats.cycle; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.metrics.Metrics; -import com.swirlds.common.units.UnitConstants; /** * Tracks the fraction of busy time to idle in a cycle diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/cycle/IntervalPercentageMetric.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/cycle/IntervalPercentageMetric.java index a96391a32309..f5b2e464b67d 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/cycle/IntervalPercentageMetric.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/cycle/IntervalPercentageMetric.java @@ -16,8 +16,8 @@ package com.swirlds.platform.stats.cycle; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.metrics.Metrics; -import com.swirlds.common.units.UnitConstants; /** * Tracks the fraction of time spent in a single interval of a cycle diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/simple/AccumulatedAverageTime.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/simple/AccumulatedAverageTime.java index a943c96493c9..efe66b7636a9 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/simple/AccumulatedAverageTime.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/stats/simple/AccumulatedAverageTime.java @@ -16,10 +16,10 @@ package com.swirlds.platform.stats.simple; +import com.swirlds.base.units.UnitConstants; import com.swirlds.common.metrics.FloatFormats; import com.swirlds.common.metrics.IntegerPairAccumulator; import com.swirlds.common.metrics.Metrics; -import com.swirlds.common.units.UnitConstants; /** * Tracks the average time taken for an operation by accumulating the time and the number of operation. The actual diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/reconnect/RandomVirtualMapReconnectTests.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/reconnect/RandomVirtualMapReconnectTests.java index a54b49920a4b..56c96622db30 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/reconnect/RandomVirtualMapReconnectTests.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/reconnect/RandomVirtualMapReconnectTests.java @@ -16,9 +16,9 @@ package com.swirlds.platform.reconnect; +import static com.swirlds.base.units.UnitConstants.BYTES_TO_BITS; +import static com.swirlds.base.units.UnitConstants.MEBIBYTES_TO_BYTES; import static com.swirlds.common.test.fixtures.RandomUtils.getRandomPrintSeed; -import static com.swirlds.common.units.UnitConstants.BYTES_TO_BITS; -import static com.swirlds.common.units.UnitConstants.MEBIBYTES_TO_BYTES; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/recovery/RecoveryTestUtils.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/recovery/RecoveryTestUtils.java index 65c01f3c957f..1c28666a8d30 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/recovery/RecoveryTestUtils.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/recovery/RecoveryTestUtils.java @@ -16,11 +16,11 @@ package com.swirlds.platform.recovery; +import static com.swirlds.base.units.UnitConstants.SECONDS_TO_NANOSECONDS; import static com.swirlds.common.test.fixtures.AssertionUtils.assertEventuallyTrue; import static com.swirlds.common.test.fixtures.RandomUtils.randomHash; import static com.swirlds.common.test.fixtures.RandomUtils.randomSignature; import static com.swirlds.common.threading.manager.AdHocThreadManager.getStaticThreadManager; -import static com.swirlds.common.units.UnitConstants.SECONDS_TO_NANOSECONDS; import static com.swirlds.common.utility.CompareTo.isLessThan; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.spy; diff --git a/platform-sdk/swirlds-unit-tests/common/swirlds-common-test/src/test/java/com/swirlds/common/test/merkle/MerkleSynchronizationBenchmarks.java b/platform-sdk/swirlds-unit-tests/common/swirlds-common-test/src/test/java/com/swirlds/common/test/merkle/MerkleSynchronizationBenchmarks.java index 5095516b0163..a562ab8a9127 100644 --- a/platform-sdk/swirlds-unit-tests/common/swirlds-common-test/src/test/java/com/swirlds/common/test/merkle/MerkleSynchronizationBenchmarks.java +++ b/platform-sdk/swirlds-unit-tests/common/swirlds-common-test/src/test/java/com/swirlds/common/test/merkle/MerkleSynchronizationBenchmarks.java @@ -16,7 +16,7 @@ package com.swirlds.common.test.merkle; -import static com.swirlds.common.units.UnitConstants.MICROSECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.MICROSECONDS_TO_SECONDS; import static com.swirlds.test.framework.ResourceLoader.loadLog4jContext; import static org.junit.jupiter.api.Assertions.fail; diff --git a/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/GossipSimulation.java b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/GossipSimulation.java index d04220eeb315..f82e832cb5a9 100644 --- a/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/GossipSimulation.java +++ b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/GossipSimulation.java @@ -16,10 +16,10 @@ package com.swirlds.platform.test.chatter.simulator; +import static com.swirlds.base.units.UnitConstants.MILLISECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.common.formatting.StringFormattingUtils.commaSeparatedNumber; import static com.swirlds.common.threading.manager.AdHocThreadManager.getStaticThreadManager; -import static com.swirlds.common.units.UnitConstants.MILLISECONDS_TO_SECONDS; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.platform.test.chatter.simulator.GossipSimulationUtils.roundDecimal; import static java.time.temporal.ChronoUnit.NANOS; diff --git a/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNetwork.java b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNetwork.java index bd628eca3fa0..9894529a8b1f 100644 --- a/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNetwork.java +++ b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNetwork.java @@ -16,7 +16,7 @@ package com.swirlds.platform.test.chatter.simulator; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import com.swirlds.common.platform.NodeId; import com.swirlds.platform.system.address.AddressBook; diff --git a/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNetworkStatistics.java b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNetworkStatistics.java index a58eebce70b0..009a0f27504e 100644 --- a/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNetworkStatistics.java +++ b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNetworkStatistics.java @@ -16,9 +16,9 @@ package com.swirlds.platform.test.chatter.simulator; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.common.formatting.StringFormattingUtils.commaSeparatedNumber; import static com.swirlds.common.units.DataUnit.UNIT_BYTES; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; import static com.swirlds.platform.test.chatter.simulator.GossipSimulationUtils.printHeader; import static com.swirlds.platform.test.chatter.simulator.GossipSimulationUtils.roundDecimal; diff --git a/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNode.java b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNode.java index cbe4f18b97d4..98e5afe3fec8 100644 --- a/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNode.java +++ b/platform-sdk/swirlds-unit-tests/core/swirlds-platform-test/src/main/java/com/swirlds/platform/test/chatter/simulator/SimulatedNode.java @@ -16,7 +16,7 @@ package com.swirlds.platform.test.chatter.simulator; -import static com.swirlds.common.units.UnitConstants.NANOSECONDS_TO_SECONDS; +import static com.swirlds.base.units.UnitConstants.NANOSECONDS_TO_SECONDS; import com.swirlds.common.platform.NodeId; import com.swirlds.platform.gossip.chatter.protocol.messages.ChatterEvent; From 352256080ab82a57df4bce0651ddea677d0f6164 Mon Sep 17 00:00:00 2001 From: JeffreyDallas <39912573+JeffreyDallas@users.noreply.github.com> Date: Mon, 11 Dec 2023 16:47:38 -0600 Subject: [PATCH 11/13] fix: Fix perf test work flow how to check active message (#10427) Signed-off-by: Jeffrey Tang --- .github/workflows/support/scripts/loki-logs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/support/scripts/loki-logs.sh b/.github/workflows/support/scripts/loki-logs.sh index 36e6557e6e2f..f99383d91140 100644 --- a/.github/workflows/support/scripts/loki-logs.sh +++ b/.github/workflows/support/scripts/loki-logs.sh @@ -33,7 +33,7 @@ do echo "query_result = [$query_result]" echo "nodes = [$nodes]" - if [[ $nodes = $maxnodes ]]; then + if [[ $nodes >= $maxnodes ]]; then break fi From 15e30f91f07c5e39d94aab2c869d83aa36a02ffe Mon Sep 17 00:00:00 2001 From: Valentin Tronkov Date: Tue, 12 Dec 2023 08:59:56 +0200 Subject: [PATCH 12/13] chore: Follow up for Support "isolated" flag on HapiTestSuite. (#9873) Signed-off-by: Valentin Tronkov <99957253+vtronkov@users.noreply.github.com> --- .../main/java/com/hedera/node/app/Hedera.java | 30 +++++++------------ .../services/bdd/junit/HapiTestEngine.java | 10 +++++-- .../services/bdd/junit/HapiTestEnv.java | 23 +++++++++----- .../bdd/junit/InProcessHapiTestNode.java | 4 +-- .../spec/utilops/records/SnapshotModeOp.java | 6 ++-- 5 files changed, 39 insertions(+), 34 deletions(-) diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/Hedera.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/Hedera.java index 86ee60c65b33..511f6b8cad57 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/Hedera.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/Hedera.java @@ -573,27 +573,19 @@ public void init(@NonNull final Platform platform, @NonNull final NodeId nodeId) logger.info("Hederanode#{} is ACTIVE", nodeId); startGrpcServer(); } - case BEHIND -> { - logger.info("Hederanode#{} is BEHIND", nodeId); - if (wasActive) shutdownGrpcServer(); - } - case FREEZE_COMPLETE -> logger.info("Hederanode#{} is in FREEZE_COMPLETE", nodeId); - case REPLAYING_EVENTS -> logger.info("Hederanode#{} is REPLAYING_EVENTS", nodeId); - case STARTING_UP -> logger.info("Hederanode#{} is STARTING_UP", nodeId); - case CATASTROPHIC_FAILURE -> { - logger.info("Hederanode#{} is in CATASTROPHIC_FAILURE", nodeId); - if (wasActive) shutdownGrpcServer(); - } - case CHECKING -> { - logger.info("Hederanode#{} is CHECKING", nodeId); - if (wasActive) shutdownGrpcServer(); - } - case OBSERVING -> logger.info("Hederanode#{} is OBSERVING", nodeId); - case FREEZING -> { - logger.info("Hederanode#{} is FREEZING", nodeId); + + case REPLAYING_EVENTS, + STARTING_UP, + OBSERVING, + RECONNECT_COMPLETE, + CHECKING, + FREEZING, + BEHIND -> logger.info("Hederanode#{} is {}", nodeId, platformStatus.name()); + + case CATASTROPHIC_FAILURE, FREEZE_COMPLETE -> { + logger.info("Hederanode#{} is {}", nodeId, platformStatus.name()); if (wasActive) shutdownGrpcServer(); } - case RECONNECT_COMPLETE -> logger.info("Hederanode#{} is RECONNECT_COMPLETE", nodeId); } }); diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/HapiTestEngine.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/HapiTestEngine.java index bec5e1d5d2de..69fec62aef8a 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/HapiTestEngine.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/HapiTestEngine.java @@ -16,6 +16,8 @@ package com.hedera.services.bdd.junit; +import static com.hedera.services.bdd.junit.HapiTestEnv.HapiTestNodesType.IN_PROCESS_ALICE; +import static com.hedera.services.bdd.junit.HapiTestEnv.HapiTestNodesType.OUT_OF_PROCESS_ALICE; import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation; import static org.junit.platform.commons.support.AnnotationSupport.isAnnotated; import static org.junit.platform.commons.support.HierarchyTraversalMode.TOP_DOWN; @@ -72,6 +74,9 @@ * support the JUnit Jupiter {@link Disabled} annotation. */ public class HapiTestEngine extends HierarchicalTestEngine /* implements TestEngine */ { + + public static final int NODE_COUNT = 4; + static { // This is really weird, but it exists because we have to force JUL to use Log4J as early as possible. System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); @@ -184,10 +189,11 @@ public HapiTestEngineExecutionContext before(HapiTestEngineExecutionContext cont // Allow for a simple switch to enable in-process Alice node for debugging final String debugEnv = System.getenv("HAPI_DEBUG_NODE"); - final boolean useInProcessAlice = Boolean.parseBoolean(debugEnv); + final boolean debugMode = Boolean.parseBoolean(debugEnv); + final var nodesType = debugMode ? IN_PROCESS_ALICE : OUT_OF_PROCESS_ALICE; // For now, switching to non-in process servers, because in process doesn't work for the // restart and reconnect testing. - env = new HapiTestEnv("HAPI Tests", true, useInProcessAlice); + env = new HapiTestEnv("HAPI Tests", NODE_COUNT, nodesType); context.setEnv(env); final var tmpDir = Path.of("data"); diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/HapiTestEnv.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/HapiTestEnv.java index 0f7a1c39b219..84b2c4903cef 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/HapiTestEnv.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/HapiTestEnv.java @@ -16,6 +16,8 @@ package com.hedera.services.bdd.junit; +import static com.hedera.services.bdd.junit.HapiTestEnv.HapiTestNodesType.IN_PROCESS_ALICE; + import com.hedera.hapi.node.base.AccountID; import edu.umd.cs.findbugs.annotations.NonNull; import java.io.File; @@ -36,10 +38,9 @@ public class HapiTestEnv { private final List nodes = new ArrayList<>(); private final List nodeHosts = new ArrayList<>(); private boolean started = false; - public static final int CLUSTER_SIZE = 4; - public HapiTestEnv(@NonNull final String testName, final boolean cluster, final boolean useInProcessAlice) { - final var numNodes = cluster ? CLUSTER_SIZE : 1; + public HapiTestEnv( + @NonNull final String testName, final int nodeCount, @NonNull final HapiTestNodesType nodesType) { try { final var sb = new StringBuilder(); sb.append("swirld, ") @@ -47,7 +48,7 @@ public HapiTestEnv(@NonNull final String testName, final boolean cluster, final .append("\n") .append("\n# This next line is, hopefully, ignored.\n") .append("app, HederaNode.jar\n\n#The following nodes make up this network\n"); - for (int nodeId = 0; nodeId < numNodes; nodeId++) { + for (int nodeId = 0; nodeId < nodeCount; nodeId++) { final var nodeName = NODE_NAMES[nodeId]; final var firstChar = nodeName.charAt(0); final var account = "0.0." + (3 + nodeId); @@ -66,17 +67,18 @@ public HapiTestEnv(@NonNull final String testName, final boolean cluster, final .append("\n"); nodeHosts.add("127.0.0.1:" + (FIRST_GRPC_PORT + (nodeId * 2)) + ":" + account); } - sb.append("\nnextNodeId, ").append(numNodes).append("\n"); + sb.append("\nnextNodeId, ").append(nodeCount).append("\n"); final String configText = sb.toString(); - for (int nodeId = 0; nodeId < numNodes; nodeId++) { + for (int nodeId = 0; nodeId < nodeCount; nodeId++) { final Path workingDir = Path.of("./build/hapi-test/node" + nodeId).normalize(); setupWorkingDirectory(workingDir, configText); final String nodeName = NODE_NAMES[nodeId]; final AccountID acct = AccountID.newBuilder().accountNum(3L + nodeId).build(); - if (useInProcessAlice && nodeId == 0) { + boolean currentNodeAlice = nodeId == 0; + if (IN_PROCESS_ALICE == nodesType && currentNodeAlice) { nodes.add(new InProcessHapiTestNode(nodeName, nodeId, acct, workingDir, FIRST_GRPC_PORT)); } else { nodes.add(new SubProcessHapiTestNode( @@ -88,6 +90,13 @@ public HapiTestEnv(@NonNull final String testName, final boolean cluster, final } } + // Defines the types of nodes(InProcessHapiTestNode or SubProcessHapiTestNode) for the test executing nodes. + enum HapiTestNodesType { + // Makes the fist starting node(Alice, id=0) to use InProcessHapiTestNode. This gives us the ability to debug + IN_PROCESS_ALICE, + OUT_OF_PROCESS_ALICE + } + /** * Starts all nodes in the environment. */ diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/InProcessHapiTestNode.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/InProcessHapiTestNode.java index d754024bd67d..98d9b22212e1 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/InProcessHapiTestNode.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/InProcessHapiTestNode.java @@ -170,9 +170,7 @@ public void waitForActive(long seconds) throws TimeoutException { @Override public void shutdown() { if (th != null && (th.hedera.isFrozen() || th.hedera.isActive())) { - if (th.hedera != null) { - th.hedera.shutdown(); - } + th.hedera.shutdown(); th.interrupt(); // This is a hack, but it's the best I can do without classloader isolation and without a systematic diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotModeOp.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotModeOp.java index 66daae2457d3..0a41b1908482 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotModeOp.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotModeOp.java @@ -40,7 +40,7 @@ import com.google.protobuf.ByteString; import com.google.protobuf.Descriptors; import com.google.protobuf.GeneratedMessageV3; -import com.hedera.services.bdd.junit.HapiTestEnv; +import com.hedera.services.bdd.junit.HapiTestEngine; import com.hedera.services.bdd.junit.RecordStreamAccess; import com.hedera.services.bdd.spec.HapiSpec; import com.hedera.services.bdd.spec.utilops.UtilOp; @@ -722,8 +722,8 @@ private List monoStreamLocs() { } private List hapiTestStreamLocs() { - final List locs = new ArrayList<>(HapiTestEnv.CLUSTER_SIZE); - for (int i = 0; i < HapiTestEnv.CLUSTER_SIZE; i++) { + final List locs = new ArrayList<>(HapiTestEngine.NODE_COUNT); + for (int i = 0; i < HapiTestEngine.NODE_COUNT; i++) { locs.add(String.format(HAPI_TEST_STREAMS_LOC_TPL, i, i + 3)); } return locs; From d971a0f826bec88481ca9eb29690b51ea4701a99 Mon Sep 17 00:00:00 2001 From: Lazar Petrovic Date: Tue, 12 Dec 2023 11:58:54 +0100 Subject: [PATCH 13/13] chore: introduce latest complete state nexus (#10134) Signed-off-by: Lazar Petrovic --- .../java/com/hedera/node/app/AppTestBase.java | 5 - .../com/swirlds/platform/SwirldsPlatform.java | 34 +-- .../DefaultStateManagementComponent.java | 28 --- .../state/StateManagementComponent.java | 17 +- .../query/LatestSignedStateProvider.java | 39 --- .../PreconsensusSystemTransactionManager.java | 2 +- .../platform/gossip/AbstractGossip.java | 8 +- .../platform/gossip/GossipFactory.java | 14 +- .../gossip/chatter/ChatterGossip.java | 11 +- .../gossip/sync/SingleNodeSyncGossip.java | 8 +- .../platform/gossip/sync/SyncGossip.java | 11 +- .../platform/gui/GuiPlatformAccessor.java | 27 ++ .../gui/internal/WinTab2Consensus.java | 5 +- .../recovery/internal/RecoveryPlatform.java | 14 -- .../state/nexus/LatestCompleteStateNexus.java | 72 ++++++ .../state/signed/ReservedSignedState.java | 37 ++- .../platform/state/signed/SignedState.java | 2 +- .../state/signed/SignedStateFileManager.java | 14 +- .../state/signed/SignedStateFilePath.java | 238 ++++++++++++++++++ .../state/signed/SignedStateFileReader.java | 79 +----- .../state/signed/SignedStateFileUtils.java | 150 ++++------- .../state/signed/SignedStateManager.java | 21 -- .../state/signed/StartupStateUtils.java | 9 +- .../platform/system/StateAccessor.java | 13 - .../src/main/java/module-info.java | 1 - .../platform/SignedStateFileManagerTests.java | 67 +++-- .../SignedStateFileReadWriteTest.java | 4 - .../state/StateManagementComponentTests.java | 77 +----- .../state/RandomSignedStateGenerator.java | 9 +- .../state/SignedStateManagerTester.java | 96 +++++++ .../AbstractSignedStateManagerTest.java | 25 +- .../state/manager/AddIncompleteStateTest.java | 7 +- .../state/manager/EarlySignaturesTest.java | 14 +- .../manager/EmergencyStateFinderTests.java | 145 ----------- ...ldCompleteStateEventuallyReleasedTest.java | 17 +- .../manager/PostconsensusSignaturesTest.java | 8 +- .../RegisterStatesWithoutSignaturesTest.java | 11 +- .../SequentialSignaturesRestartTest.java | 5 +- .../manager/SequentialSignaturesTest.java | 7 +- .../manager/SignedStateManagerBuilder.java | 5 +- .../state/signed/StartupStateUtilsTests.java | 25 +- 41 files changed, 698 insertions(+), 683 deletions(-) delete mode 100644 platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/query/LatestSignedStateProvider.java create mode 100644 platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/nexus/LatestCompleteStateNexus.java create mode 100644 platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFilePath.java create mode 100644 platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/SignedStateManagerTester.java delete mode 100644 platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/EmergencyStateFinderTests.java diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/AppTestBase.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/AppTestBase.java index 08219af4e15f..33bf2cf427a3 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/AppTestBase.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/AppTestBase.java @@ -446,11 +446,6 @@ public AutoCloseableWrapper getLatestImmutableState(@ return null; } - @Override - public AutoCloseableWrapper getLatestSignedState(@NonNull String s) { - return null; - } - @Override public boolean createTransaction(@NonNull byte[] bytes) { return false; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldsPlatform.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldsPlatform.java index dcb9e390a43a..fd0a704e652f 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldsPlatform.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/SwirldsPlatform.java @@ -70,6 +70,7 @@ import com.swirlds.platform.components.appcomm.AppCommunicationComponent; import com.swirlds.platform.components.state.DefaultStateManagementComponent; import com.swirlds.platform.components.state.StateManagementComponent; +import com.swirlds.platform.components.state.output.NewLatestCompleteStateConsumer; import com.swirlds.platform.components.transaction.system.ConsensusSystemTransactionManager; import com.swirlds.platform.components.transaction.system.PreconsensusSystemTransactionManager; import com.swirlds.platform.config.ThreadConfig; @@ -151,6 +152,7 @@ import com.swirlds.platform.state.iss.IssHandler; import com.swirlds.platform.state.iss.IssScratchpad; import com.swirlds.platform.state.nexus.EmergencyStateNexus; +import com.swirlds.platform.state.nexus.LatestCompleteStateNexus; import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SavedStateInfo; import com.swirlds.platform.state.signed.SignedState; @@ -511,8 +513,17 @@ public class SwirldsPlatform implements Platform { platformWiring.bind(signedStateFileManager); + final LatestCompleteStateNexus latestCompleteState = + new LatestCompleteStateNexus(stateConfig, platformContext.getMetrics()); final SavedStateController savedStateController = new SavedStateController(stateConfig, platformWiring.getSaveStateToDiskInput()::offer); + final NewLatestCompleteStateConsumer newLatestCompleteStateConsumer = ss -> { + // the app comm component will reserve the state, this should be done by the wiring in the future + appCommunicationComponent.newLatestCompleteStateEvent(ss); + // the nexus expects a state to be reserved for it + // in the future, all of these reservations will be done by the wiring + latestCompleteState.setState(ss.reserve("setting latest complete state")); + }; stateManagementComponent = new DefaultStateManagementComponent( platformContext, @@ -520,7 +531,7 @@ public class SwirldsPlatform implements Platform { dispatchBuilder, new PlatformSigner(keysAndCerts), txn -> this.createSystemTransaction(txn, true), - appCommunicationComponent, + newLatestCompleteStateConsumer, this::handleFatalError, platformStatusManager, savedStateController, @@ -599,11 +610,16 @@ public class SwirldsPlatform implements Platform { initialState.getState(), appVersion); + final InterruptableConsumer newSignedStateFromTransactionsConsumer = rs -> { + latestCompleteState.newIncompleteState(rs.get().getRound()); + stateManagementComponent.newSignedStateFromTransactions(rs); + }; + stateHashSignQueue = components.add(new QueueThreadConfiguration(threadManager) .setNodeId(selfId) .setComponent(PLATFORM_THREAD_POOL_NAME) .setThreadName("state-hash-sign") - .setHandler(stateManagementComponent::newSignedStateFromTransactions) + .setHandler(newSignedStateFromTransactionsConsumer) .setCapacity(1) .setMetricsConfiguration(new QueueThreadMetricsConfiguration(metrics).enableBusyTimeMetric()) .build()); @@ -806,7 +822,7 @@ public class SwirldsPlatform implements Platform { consensusRef, intakeQueue, swirldStateManager, - stateManagementComponent, + latestCompleteState, eventValidator, eventObserverDispatcher, syncMetrics, @@ -891,6 +907,7 @@ public class SwirldsPlatform implements Platform { GuiPlatformAccessor.getInstance().setShadowGraph(selfId, shadowGraph); GuiPlatformAccessor.getInstance().setStateManagementComponent(selfId, stateManagementComponent); GuiPlatformAccessor.getInstance().setConsensusReference(selfId, consensusRef); + GuiPlatformAccessor.getInstance().setLatestCompleteStateComponent(selfId, latestCompleteState); } /** @@ -1364,17 +1381,6 @@ public AutoCloseableWrapper getLatestImmutableState(@ wrapper.isNull() ? null : (T) wrapper.get().getState().getSwirldState(), wrapper::close); } - /** - * {@inheritDoc} - */ - @SuppressWarnings("unchecked") - @Override - public AutoCloseableWrapper getLatestSignedState(@NonNull final String reason) { - final ReservedSignedState wrapper = stateManagementComponent.getLatestSignedState(reason); - return new AutoCloseableWrapper<>( - wrapper.isNull() ? null : (T) wrapper.get().getState().getSwirldState(), wrapper::close); - } - /** * check whether the given event is the last event in its round, and the platform enters freeze period * diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/DefaultStateManagementComponent.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/DefaultStateManagementComponent.java index 48a976be3d17..01511b9427df 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/DefaultStateManagementComponent.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/DefaultStateManagementComponent.java @@ -16,7 +16,6 @@ package com.swirlds.platform.components.state; -import static com.swirlds.common.metrics.Metrics.PLATFORM_CATEGORY; import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; import static com.swirlds.logging.legacy.LogMarker.STATE_TO_DISK; @@ -24,7 +23,6 @@ import com.swirlds.common.config.StateConfig; import com.swirlds.common.context.PlatformContext; import com.swirlds.common.crypto.Signature; -import com.swirlds.common.metrics.RunningAverageMetric; import com.swirlds.common.stream.HashSigner; import com.swirlds.common.threading.manager.ThreadManager; import com.swirlds.platform.components.SavedStateController; @@ -103,11 +101,6 @@ public class DefaultStateManagementComponent implements StateManagementComponent private final SavedStateController savedStateController; private final Consumer stateDumpConsumer; - private static final RunningAverageMetric.Config AVG_ROUND_SUPERMAJORITY_CONFIG = new RunningAverageMetric.Config( - PLATFORM_CATEGORY, "roundSup") - .withDescription("latest round with state signed by a supermajority") - .withUnit("round"); - /** * @param platformContext the platform context * @param threadManager manages platform thread resources @@ -162,10 +155,6 @@ public DefaultStateManagementComponent( newLatestCompleteStateConsumer, this::stateHasEnoughSignatures, this::stateLacksSignatures); - - final RunningAverageMetric avgRoundSupermajority = - platformContext.getMetrics().getOrCreate(AVG_ROUND_SUPERMAJORITY_CONFIG); - platformContext.getMetrics().addUpdater(() -> avgRoundSupermajority.update(getLastCompleteRound())); } /** @@ -245,15 +234,6 @@ public void newSignedStateFromTransactions(@NonNull final ReservedSignedState si } } - /** - * {@inheritDoc} - */ - @Override - @NonNull - public ReservedSignedState getLatestSignedState(@NonNull final String reason) { - return signedStateManager.getLatestSignedState(reason); - } - /** * {@inheritDoc} */ @@ -262,14 +242,6 @@ public ReservedSignedState getLatestImmutableState(@NonNull final String reason) return signedStateManager.getLatestImmutableState(reason); } - /** - * {@inheritDoc} - */ - @Override - public long getLastCompleteRound() { - return signedStateManager.getLastCompleteRound(); - } - /** * {@inheritDoc} */ diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/StateManagementComponent.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/StateManagementComponent.java index 943850764d59..e499936b6c9f 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/StateManagementComponent.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/StateManagementComponent.java @@ -19,8 +19,11 @@ import com.swirlds.platform.components.PlatformComponent; import com.swirlds.platform.components.common.output.NewSignedStateFromTransactionsConsumer; import com.swirlds.platform.components.common.output.SignedStateToLoadConsumer; -import com.swirlds.platform.components.state.query.LatestSignedStateProvider; -import com.swirlds.platform.state.signed.*; +import com.swirlds.platform.state.signed.ReservedSignedState; +import com.swirlds.platform.state.signed.SignedStateFinder; +import com.swirlds.platform.state.signed.SignedStateInfo; +import com.swirlds.platform.state.signed.SignedStateManager; +import com.swirlds.platform.state.signed.StateToDiskReason; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; import java.time.Instant; @@ -41,8 +44,7 @@ public interface StateManagementComponent extends PlatformComponent, SignedStateFinder, SignedStateToLoadConsumer, - NewSignedStateFromTransactionsConsumer, - LatestSignedStateProvider { + NewSignedStateFromTransactionsConsumer { /** * Get a reserved instance of the latest immutable signed state. May be unhashed, may or may not have all required @@ -54,13 +56,6 @@ public interface StateManagementComponent */ ReservedSignedState getLatestImmutableState(@NonNull final String reason); - /** - * Returns the latest round for which there is a complete signed state. - * - * @return the latest round number - */ - long getLastCompleteRound(); - /** * Get the latest signed states stored by this component. This method creates a copy, so no changes to the array * will be made. diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/query/LatestSignedStateProvider.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/query/LatestSignedStateProvider.java deleted file mode 100644 index dc93e0a6ab86..000000000000 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/state/query/LatestSignedStateProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2016-2023 Hedera Hashgraph, LLC - * - * 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. - */ - -package com.swirlds.platform.components.state.query; - -import com.swirlds.common.utility.AutoCloseableWrapper; -import com.swirlds.platform.state.signed.ReservedSignedState; -import edu.umd.cs.findbugs.annotations.NonNull; - -/** - * Provides the latest complete signed state, or null if none is available. - */ -public interface LatestSignedStateProvider { - - /** - * Returns the latest complete (fully signed) state with a reservation that is released when the - * {@link AutoCloseableWrapper} is closed. - * - * @param reason a short description of why this SignedState is being reserved. Each location where a SignedState is - * reserved should attempt to use a unique reason, as this makes debugging reservation bugs easier. - * @return an auto-closeable with the latest complete state, or an auto-closeable wrapper with {@code null} if none - * is available. - */ - @NonNull - ReservedSignedState getLatestSignedState(@NonNull final String reason); -} diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/transaction/system/PreconsensusSystemTransactionManager.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/transaction/system/PreconsensusSystemTransactionManager.java index 56fc62b26c14..2ad651ef2f95 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/transaction/system/PreconsensusSystemTransactionManager.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/components/transaction/system/PreconsensusSystemTransactionManager.java @@ -87,7 +87,7 @@ private void handleTransaction(@NonNull final NodeId creatorId, @NonNull final S } catch (final RuntimeException e) { logger.error( EXCEPTION.getMarker(), - "Error while handling system transaction preconsensus: handler: {}, id: {}, transaction: {}, error: {}", + "Error while handling system transaction preconsensus: handler: {}, id: {}, transaction: {}", handler, creatorId, transaction, diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/AbstractGossip.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/AbstractGossip.java index a823b0c1ca45..a278c131e9ca 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/AbstractGossip.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/AbstractGossip.java @@ -33,7 +33,6 @@ import com.swirlds.common.threading.framework.QueueThread; import com.swirlds.common.threading.framework.config.StoppableThreadConfiguration; import com.swirlds.common.threading.manager.ThreadManager; -import com.swirlds.platform.components.state.StateManagementComponent; import com.swirlds.platform.config.ThreadConfig; import com.swirlds.platform.crypto.KeysAndCerts; import com.swirlds.platform.event.GossipEvent; @@ -57,6 +56,7 @@ import com.swirlds.platform.reconnect.ReconnectLearnerThrottle; import com.swirlds.platform.reconnect.ReconnectThrottle; import com.swirlds.platform.state.SwirldStateManager; +import com.swirlds.platform.state.nexus.SignedStateNexus; import com.swirlds.platform.state.signed.SignedState; import com.swirlds.platform.system.PlatformConstructionException; import com.swirlds.platform.system.SoftwareVersion; @@ -124,7 +124,7 @@ public abstract class AbstractGossip implements ConnectionTracker, Gossip { * @param appVersion the version of the app * @param intakeQueue the event intake queue * @param swirldStateManager manages the mutable state - * @param stateManagementComponent manages the lifecycle of the state queue + * @param latestCompleteState holds the latest signed state that has enough signatures to be verifiable * @param syncMetrics metrics for sync * @param statusActionSubmitter enables submitting platform status actions * @param loadReconnectState a method that should be called when a state from reconnect is obtained @@ -140,7 +140,7 @@ protected AbstractGossip( @NonNull final SoftwareVersion appVersion, @NonNull final QueueThread intakeQueue, @NonNull final SwirldStateManager swirldStateManager, - @NonNull final StateManagementComponent stateManagementComponent, + @NonNull final SignedStateNexus latestCompleteState, @NonNull final SyncMetrics syncMetrics, @NonNull final StatusActionSubmitter statusActionSubmitter, @NonNull final Consumer loadReconnectState, @@ -214,7 +214,7 @@ protected AbstractGossip( this::pause, clearAllPipelinesForReconnect::run, swirldStateManager::getConsensusState, - stateManagementComponent::getLastCompleteRound, + latestCompleteState::getRound, new ReconnectLearnerThrottle(time, selfId, reconnectConfig), loadReconnectState, new ReconnectLearnerFactory( diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/GossipFactory.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/GossipFactory.java index 019f32771761..4328da0c3feb 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/GossipFactory.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/GossipFactory.java @@ -26,7 +26,6 @@ import com.swirlds.common.threading.framework.QueueThread; import com.swirlds.common.threading.manager.ThreadManager; import com.swirlds.platform.Consensus; -import com.swirlds.platform.components.state.StateManagementComponent; import com.swirlds.platform.crypto.KeysAndCerts; import com.swirlds.platform.event.GossipEvent; import com.swirlds.platform.event.linking.EventLinker; @@ -40,6 +39,7 @@ import com.swirlds.platform.observers.EventObserverDispatcher; import com.swirlds.platform.recovery.EmergencyRecoveryManager; import com.swirlds.platform.state.SwirldStateManager; +import com.swirlds.platform.state.nexus.SignedStateNexus; import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SignedState; import com.swirlds.platform.system.SoftwareVersion; @@ -80,7 +80,7 @@ private GossipFactory() {} * @param consensusRef a pointer to consensus * @param intakeQueue the event intake queue * @param swirldStateManager manages the mutable state - * @param stateManagementComponent manages the lifecycle of the state + * @param latestCompleteState holds the latest signed state that has enough signatures to be verifiable * @param eventValidator validates events and passes valid events further along the intake pipeline * @param eventObserverDispatcher the object used to wire event intake * @param syncMetrics metrics for sync @@ -107,7 +107,7 @@ public static Gossip buildGossip( @NonNull final AtomicReference consensusRef, @NonNull final QueueThread intakeQueue, @NonNull final SwirldStateManager swirldStateManager, - @NonNull final StateManagementComponent stateManagementComponent, + @NonNull final SignedStateNexus latestCompleteState, @NonNull final EventValidator eventValidator, @NonNull final EventObserverDispatcher eventObserverDispatcher, @NonNull final SyncMetrics syncMetrics, @@ -131,7 +131,7 @@ public static Gossip buildGossip( Objects.requireNonNull(consensusRef); Objects.requireNonNull(intakeQueue); Objects.requireNonNull(swirldStateManager); - Objects.requireNonNull(stateManagementComponent); + Objects.requireNonNull(latestCompleteState); Objects.requireNonNull(eventValidator); Objects.requireNonNull(eventObserverDispatcher); Objects.requireNonNull(syncMetrics); @@ -160,7 +160,7 @@ public static Gossip buildGossip( consensusRef, intakeQueue, swirldStateManager, - stateManagementComponent, + latestCompleteState, eventValidator, eventObserverDispatcher, syncMetrics, @@ -183,7 +183,7 @@ public static Gossip buildGossip( shadowGraph, intakeQueue, swirldStateManager, - stateManagementComponent, + latestCompleteState, syncMetrics, platformStatusManager, loadReconnectState, @@ -205,7 +205,7 @@ public static Gossip buildGossip( consensusRef, intakeQueue, swirldStateManager, - stateManagementComponent, + latestCompleteState, syncMetrics, eventLinker, platformStatusManager, diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/chatter/ChatterGossip.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/chatter/ChatterGossip.java index 7e3a9cb24bf1..9f659c9795a3 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/chatter/ChatterGossip.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/chatter/ChatterGossip.java @@ -39,7 +39,6 @@ import com.swirlds.common.utility.Clearable; import com.swirlds.common.utility.LoggingClearables; import com.swirlds.platform.Consensus; -import com.swirlds.platform.components.state.StateManagementComponent; import com.swirlds.platform.crypto.KeysAndCerts; import com.swirlds.platform.event.GossipEvent; import com.swirlds.platform.event.linking.EventLinker; @@ -66,6 +65,7 @@ import com.swirlds.platform.reconnect.emergency.EmergencyReconnectProtocol; import com.swirlds.platform.recovery.EmergencyRecoveryManager; import com.swirlds.platform.state.SwirldStateManager; +import com.swirlds.platform.state.nexus.SignedStateNexus; import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SignedState; import com.swirlds.platform.system.SoftwareVersion; @@ -112,7 +112,7 @@ public class ChatterGossip extends AbstractGossip { * @param consensusRef a pointer to consensus * @param intakeQueue the event intake queue * @param swirldStateManager manages the mutable state - * @param stateManagementComponent manages the lifecycle of the state + * @param latestCompleteState holds the latest signed state that has enough signatures to be verifiable * @param eventValidator validates events and passes valid events along the intake pipeline * @param eventObserverDispatcher the object used to wire event intake * @param syncMetrics metrics for sync @@ -137,7 +137,7 @@ public ChatterGossip( @NonNull final AtomicReference consensusRef, @NonNull final QueueThread intakeQueue, @NonNull final SwirldStateManager swirldStateManager, - @NonNull final StateManagementComponent stateManagementComponent, + @NonNull final SignedStateNexus latestCompleteState, @NonNull final EventValidator eventValidator, @NonNull final EventObserverDispatcher eventObserverDispatcher, @NonNull final SyncMetrics syncMetrics, @@ -156,7 +156,7 @@ public ChatterGossip( appVersion, intakeQueue, swirldStateManager, - stateManagementComponent, + latestCompleteState, syncMetrics, platformStatusManager, loadReconnectState, @@ -250,8 +250,7 @@ public ChatterGossip( threadManager, otherId, reconnectThrottle, - () -> stateManagementComponent.getLatestSignedState( - "SwirldsPlatform: ReconnectProtocol"), + () -> latestCompleteState.getState("SwirldsPlatform: ReconnectProtocol"), reconnectConfig.asyncStreamTimeout(), reconnectMetrics, reconnectController, diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/sync/SingleNodeSyncGossip.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/sync/SingleNodeSyncGossip.java index 453a0a043852..1101c430a1a2 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/sync/SingleNodeSyncGossip.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/sync/SingleNodeSyncGossip.java @@ -28,7 +28,6 @@ import com.swirlds.common.threading.manager.ThreadManager; import com.swirlds.common.utility.Clearable; import com.swirlds.common.utility.LoggingClearables; -import com.swirlds.platform.components.state.StateManagementComponent; import com.swirlds.platform.crypto.KeysAndCerts; import com.swirlds.platform.event.GossipEvent; import com.swirlds.platform.gossip.AbstractGossip; @@ -36,6 +35,7 @@ import com.swirlds.platform.gossip.shadowgraph.ShadowGraph; import com.swirlds.platform.metrics.SyncMetrics; import com.swirlds.platform.state.SwirldStateManager; +import com.swirlds.platform.state.nexus.SignedStateNexus; import com.swirlds.platform.state.signed.SignedState; import com.swirlds.platform.system.SoftwareVersion; import com.swirlds.platform.system.address.AddressBook; @@ -71,7 +71,7 @@ public class SingleNodeSyncGossip extends AbstractGossip { * @param shadowGraph contains non-ancient events * @param intakeQueue the event intake queue * @param swirldStateManager manages the mutable state - * @param stateManagementComponent manages the lifecycle of the state + * @param latestCompleteState holds the latest signed state that has enough signatures to be verifiable * @param syncMetrics metrics for sync * @param statusActionSubmitter enables submitting platform status actions * @param loadReconnectState a method that should be called when a state from reconnect is obtained @@ -88,7 +88,7 @@ public SingleNodeSyncGossip( @NonNull final ShadowGraph shadowGraph, @NonNull final QueueThread intakeQueue, @NonNull final SwirldStateManager swirldStateManager, - @NonNull final StateManagementComponent stateManagementComponent, + @NonNull final SignedStateNexus latestCompleteState, @NonNull final SyncMetrics syncMetrics, @NonNull final StatusActionSubmitter statusActionSubmitter, @NonNull final Consumer loadReconnectState, @@ -104,7 +104,7 @@ public SingleNodeSyncGossip( appVersion, intakeQueue, swirldStateManager, - stateManagementComponent, + latestCompleteState, syncMetrics, statusActionSubmitter, loadReconnectState, diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/sync/SyncGossip.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/sync/SyncGossip.java index 5c56f69cac0d..82213775e3dc 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/sync/SyncGossip.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/sync/SyncGossip.java @@ -38,7 +38,6 @@ import com.swirlds.common.utility.Clearable; import com.swirlds.common.utility.LoggingClearables; import com.swirlds.platform.Consensus; -import com.swirlds.platform.components.state.StateManagementComponent; import com.swirlds.platform.crypto.KeysAndCerts; import com.swirlds.platform.event.GossipEvent; import com.swirlds.platform.event.linking.EventLinker; @@ -64,6 +63,7 @@ import com.swirlds.platform.reconnect.emergency.EmergencyReconnectProtocol; import com.swirlds.platform.recovery.EmergencyRecoveryManager; import com.swirlds.platform.state.SwirldStateManager; +import com.swirlds.platform.state.nexus.SignedStateNexus; import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SignedState; import com.swirlds.platform.system.SoftwareVersion; @@ -124,7 +124,7 @@ public class SyncGossip extends AbstractGossip { * @param consensusRef a pointer to consensus * @param intakeQueue the event intake queue * @param swirldStateManager manages the mutable state - * @param stateManagementComponent manages the lifecycle of the state + * @param latestCompleteState holds the latest signed state that has enough signatures to be verifiable * @param syncMetrics metrics for sync * @param eventLinker links events to their parents, buffers orphans if configured to do so * @param platformStatusManager the platform status manager @@ -148,7 +148,7 @@ public SyncGossip( @NonNull final AtomicReference consensusRef, @NonNull final QueueThread intakeQueue, @NonNull final SwirldStateManager swirldStateManager, - @NonNull final StateManagementComponent stateManagementComponent, + @NonNull final SignedStateNexus latestCompleteState, @NonNull final SyncMetrics syncMetrics, @NonNull final EventLinker eventLinker, @NonNull final PlatformStatusManager platformStatusManager, @@ -166,7 +166,7 @@ public SyncGossip( appVersion, intakeQueue, swirldStateManager, - stateManagementComponent, + latestCompleteState, syncMetrics, platformStatusManager, loadReconnectState, @@ -276,8 +276,7 @@ public SyncGossip( threadManager, otherId, reconnectThrottle, - () -> stateManagementComponent.getLatestSignedState( - "SwirldsPlatform: ReconnectProtocol"), + () -> latestCompleteState.getState("SwirldsPlatform: ReconnectProtocol"), reconnectConfig.asyncStreamTimeout(), reconnectMetrics, reconnectController, diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gui/GuiPlatformAccessor.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gui/GuiPlatformAccessor.java index ee3c2be279bd..b1606a0db7f2 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gui/GuiPlatformAccessor.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gui/GuiPlatformAccessor.java @@ -22,6 +22,7 @@ import com.swirlds.platform.components.state.StateManagementComponent; import com.swirlds.platform.gossip.shadowgraph.ShadowGraph; import com.swirlds.platform.internal.EventImpl; +import com.swirlds.platform.state.nexus.SignedStateNexus; import com.swirlds.platform.system.events.PlatformEvent; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; @@ -45,6 +46,7 @@ public final class GuiPlatformAccessor { private final Map shadowGraphs = new ConcurrentHashMap<>(); private final Map stateManagementComponents = new ConcurrentHashMap<>(); private final Map> consensusReferences = new ConcurrentHashMap<>(); + private final Map latestCompleteStateComponents = new ConcurrentHashMap<>(); private static final GuiPlatformAccessor INSTANCE = new GuiPlatformAccessor(); @@ -199,4 +201,29 @@ public Consensus getConsensus(@NonNull final NodeId nodeId) { } return consensusReference.get(); } + + /** + * Set the latest complete state component for a node. + * + * @param nodeId the ID of the node + * @param latestCompleteState the latest complete state component + */ + public void setLatestCompleteStateComponent( + @NonNull final NodeId nodeId, @NonNull final SignedStateNexus latestCompleteState) { + Objects.requireNonNull(nodeId, "nodeId must not be null"); + Objects.requireNonNull(latestCompleteState, "latestCompleteState must not be null"); + latestCompleteStateComponents.put(nodeId, latestCompleteState); + } + + /** + * Get the latest complete state component for a node, or null if none is set. + * + * @param nodeId the ID of the node + * @return the latest complete state component + */ + @Nullable + public SignedStateNexus getLatestCompleteStateComponent(@NonNull final NodeId nodeId) { + Objects.requireNonNull(nodeId, "nodeId must not be null"); + return latestCompleteStateComponents.getOrDefault(nodeId, null); + } } diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gui/internal/WinTab2Consensus.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gui/internal/WinTab2Consensus.java index 7ee33d8f29ca..9b74bf72529e 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gui/internal/WinTab2Consensus.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gui/internal/WinTab2Consensus.java @@ -24,6 +24,7 @@ import com.swirlds.platform.gui.GuiUtils; import com.swirlds.platform.gui.components.PrePaintableJPanel; import com.swirlds.platform.gui.model.GuiModel; +import com.swirlds.platform.state.nexus.SignedStateNexus; import com.swirlds.platform.state.signed.SignedStateInfo; import com.swirlds.platform.system.Platform; import java.awt.Font; @@ -65,7 +66,9 @@ public void prePaint() { long r3 = consensus.getMaxRound(); final StateManagementComponent stateManagementComponent = GuiPlatformAccessor.getInstance().getStateManagementComponent(platform.getSelfId()); - long r0 = stateManagementComponent.getLastCompleteRound(); + final SignedStateNexus latestCompleteStateComponent = + GuiPlatformAccessor.getInstance().getLatestCompleteStateComponent(platform.getSelfId()); + long r0 = latestCompleteStateComponent.getRound(); if (r1 == -1) { s += "\n = latest deleted round-created"; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/recovery/internal/RecoveryPlatform.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/recovery/internal/RecoveryPlatform.java index 39f87a2eb134..c40b1101068c 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/recovery/internal/RecoveryPlatform.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/recovery/internal/RecoveryPlatform.java @@ -160,20 +160,6 @@ public synchronized AutoCloseableWrapper getLatestImm reservedSignedState::close); } - /** - * {@inheritDoc} - */ - @SuppressWarnings("unchecked") - @Override - public AutoCloseableWrapper getLatestSignedState(@NonNull final String reason) { - final ReservedSignedState reservedSignedState = immutableState.getAndReserve(reason); - return new AutoCloseableWrapper<>( - reservedSignedState.isNull() - ? null - : (T) reservedSignedState.get().getSwirldState(), - reservedSignedState::close); - } - /** * {@inheritDoc} */ diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/nexus/LatestCompleteStateNexus.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/nexus/LatestCompleteStateNexus.java new file mode 100644 index 000000000000..74e4d5a0e774 --- /dev/null +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/nexus/LatestCompleteStateNexus.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * 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. + */ + +package com.swirlds.platform.state.nexus; + +import static com.swirlds.common.metrics.Metrics.PLATFORM_CATEGORY; + +import com.swirlds.common.config.StateConfig; +import com.swirlds.common.metrics.Metrics; +import com.swirlds.common.metrics.RunningAverageMetric; +import edu.umd.cs.findbugs.annotations.NonNull; +import java.util.Objects; + +/** + * A nexus that holds the latest complete signed state. + */ +public class LatestCompleteStateNexus extends SignedStateNexus { + private static final RunningAverageMetric.Config AVG_ROUND_SUPERMAJORITY_CONFIG = new RunningAverageMetric.Config( + PLATFORM_CATEGORY, "roundSup") + .withDescription("latest round with state signed by a supermajority") + .withUnit("round"); + + private final StateConfig stateConfig; + + /** + * Create a new nexus that holds the latest complete signed state. + * + * @param stateConfig the state configuration + * @param metrics the metrics object to update + */ + public LatestCompleteStateNexus(@NonNull final StateConfig stateConfig, @NonNull final Metrics metrics) { + this.stateConfig = Objects.requireNonNull(stateConfig); + Objects.requireNonNull(metrics); + + final RunningAverageMetric avgRoundSupermajority = metrics.getOrCreate(AVG_ROUND_SUPERMAJORITY_CONFIG); + metrics.addUpdater(() -> avgRoundSupermajority.update(getRound())); + } + + /** + * Notify the nexus that a new signed state has been created. This is useful for the nexus to know when it should + * clear the latest complete state. This is used so that we don't hold the latest complete state forever in case we + * have trouble gathering signatures. + * + * @param newStateRound a new signed state round that is not yet complete + */ + public void newIncompleteState(final long newStateRound) { + // NOTE: This logic is duplicated in SignedStateManager, but will be removed from the signed state manager + // once its refactor is done + + // Any state older than this is unconditionally removed, even if it is the latest + final long earliestPermittedRound = newStateRound - stateConfig.roundsToKeepForSigning() + 1; + + // Is the latest complete round older than the earliest permitted round? + if (getRound() < earliestPermittedRound) { + // Yes, so remove it + clear(); + } + } +} diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/ReservedSignedState.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/ReservedSignedState.java index 1259c0fdd2a4..4194560d284f 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/ReservedSignedState.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/ReservedSignedState.java @@ -47,7 +47,7 @@ public class ReservedSignedState implements AutoCloseableNonThrowing { private final SignedState signedState; private final String reason; - private final long reservationId = nextReservationId.getAndIncrement(); + private final long reservationId; private boolean closed = false; /** @@ -63,19 +63,23 @@ public class ReservedSignedState implements AutoCloseableNonThrowing { private ReservedSignedState() { this.signedState = null; this.reason = ""; + this.reservationId = nextReservationId.getAndIncrement(); } /** * Create a new reserved signed state. * - * @param signedState the signed state to reserve - * @param reason a short description of why this SignedState is being reserved. Each location where a - * SignedState is reserved should attempt to use a unique reason, as this makes debugging - * reservation bugs easier. - */ - ReservedSignedState(@NonNull final SignedState signedState, @NonNull final String reason) { + * @param signedState the signed state to reserve + * @param reason a short description of why this SignedState is being reserved. Each location where a + * SignedState is reserved should attempt to use a unique reason, as this makes debugging + * reservation bugs easier. + * @param reservationId a unique id to track reserving and releasing of signed states + */ + private ReservedSignedState( + @NonNull final SignedState signedState, @NonNull final String reason, final long reservationId) { this.signedState = Objects.requireNonNull(signedState); this.reason = Objects.requireNonNull(reason); + this.reservationId = reservationId; } /** @@ -88,24 +92,12 @@ private ReservedSignedState() { */ static @NonNull ReservedSignedState createAndReserve( @NonNull final SignedState signedState, @NonNull final String reason) { - final ReservedSignedState reservedSignedState = new ReservedSignedState(signedState, reason); + final ReservedSignedState reservedSignedState = + new ReservedSignedState(signedState, reason, nextReservationId.getAndIncrement()); signedState.incrementReservationCount(reason, reservedSignedState.getReservationId()); return reservedSignedState; } - /** - * Create a new reserved signed state. This method assumes that the reservation count will be incremented by the - * caller. - * - * @param signedState the signed state to reserve - * @param reason a short description of why this SignedState is being reserved. Each location where a - * SignedState is reserved should attempt to use a unique reason, as this makes debugging - * reservation bugs easier. - */ - static @NonNull ReservedSignedState create(@NonNull final SignedState signedState, @NonNull final String reason) { - return new ReservedSignedState(signedState, reason); - } - /** * Check if the signed state is null. * @@ -154,10 +146,11 @@ public boolean isNotNull() { if (signedState == null) { return new ReservedSignedState(); } + final long reservationId = nextReservationId.getAndIncrement(); if (!signedState.tryIncrementReservationCount(reason, reservationId)) { return null; } - return create(signedState, reason); + return new ReservedSignedState(signedState, reason, reservationId); } /** diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedState.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedState.java index 929016a3b44c..8504299d71c8 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedState.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedState.java @@ -727,7 +727,7 @@ public void pruneInvalidSignatures(@NonNull final AddressBook trustedAddressBook * @return the reservation history */ @Nullable - SignedStateHistory getHistory() { + public SignedStateHistory getHistory() { return history; } } diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileManager.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileManager.java index 16b2c0c3342e..9f3127d4976e 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileManager.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileManager.java @@ -19,9 +19,6 @@ import static com.swirlds.common.io.utility.FileUtils.deleteDirectoryAndLog; import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; import static com.swirlds.logging.legacy.LogMarker.STATE_TO_DISK; -import static com.swirlds.platform.state.signed.SignedStateFileReader.getSavedStateFiles; -import static com.swirlds.platform.state.signed.SignedStateFileUtils.getSignedStateDirectory; -import static com.swirlds.platform.state.signed.SignedStateFileUtils.getSignedStatesBaseDirectory; import static com.swirlds.platform.state.signed.StateToDiskReason.UNKNOWN; import com.swirlds.base.time.Time; @@ -77,6 +74,8 @@ public class SignedStateFileManager { * Provides system time */ private final Time time; + /** Used to determine the path of a signed state */ + private final SignedStateFilePath signedStateFilePath; /** * Creates a new instance. @@ -103,6 +102,7 @@ public SignedStateFileManager( this.swirldName = Objects.requireNonNull(swirldName); this.platformContext = Objects.requireNonNull(context); this.configuration = Objects.requireNonNull(context.getConfiguration()); + this.signedStateFilePath = new SignedStateFilePath(configuration.getConfigData(StateConfig.class)); } /** @@ -161,7 +161,8 @@ public void dumpStateTask(@NonNull final StateDumpRequest request) { // states requested to be written out-of-band are always written to disk saveStateTask( reservedSignedState.get(), - getSignedStatesBaseDirectory() + signedStateFilePath + .getSignedStatesBaseDirectory() .resolve(getReason(signedState).getDescription()) .resolve(String.format("node%d_round%d", selfId.id(), signedState.getRound()))); } @@ -217,7 +218,7 @@ private void stateLacksSignatures(@NonNull final SignedState reservedState) { * @return the File that represents the directory of the signed state for the particular round */ private Path getSignedStateDir(final long round) { - return getSignedStateDirectory(mainClassName, selfId, swirldName, round); + return signedStateFilePath.getSignedStateDirectory(mainClassName, selfId, swirldName, round); } /** @@ -225,7 +226,8 @@ private Path getSignedStateDir(final long round) { * @return the minimum generation non-ancient of the oldest state that was not deleted */ private long deleteOldStates() { - final List savedStates = getSavedStateFiles(mainClassName, selfId, swirldName); + final List savedStates = + signedStateFilePath.getSavedStateFiles(mainClassName, selfId, swirldName); // States are returned newest to oldest. So delete from the end of the list to delete the oldest states. int index = savedStates.size() - 1; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFilePath.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFilePath.java new file mode 100644 index 000000000000..185d27d13d2b --- /dev/null +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFilePath.java @@ -0,0 +1,238 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * 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. + */ + +package com.swirlds.platform.state.signed; + +import static com.swirlds.common.io.utility.FileUtils.getAbsolutePath; +import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; +import static com.swirlds.platform.state.signed.SignedStateFileUtils.SIGNED_STATE_FILE_NAME; +import static java.nio.file.Files.exists; +import static java.nio.file.Files.isDirectory; + +import com.swirlds.common.config.StateConfig; +import com.swirlds.common.platform.NodeId; +import edu.umd.cs.findbugs.annotations.NonNull; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.TreeMap; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * Utility methods for determining the path of signed states on disk. + */ +public class SignedStateFilePath { + private static final Logger logger = LogManager.getLogger(SignedStateFilePath.class); + final StateConfig stateConfig; + + /** + * Create a new instance of this class. + * + * @param stateConfig the config that contains the location of the saved state directory + */ + public SignedStateFilePath(@NonNull final StateConfig stateConfig) { + this.stateConfig = stateConfig; + } + + /** + *

+ * Get the base directory where all states will be stored. + *

+ * + *
+     * e.g. data/saved/
+     *      |--------|
+     *          |
+     *       location where
+     *       states are saved
+     * 
+ * + * @return the base directory for all signed state files + */ + public @NonNull Path getSignedStatesBaseDirectory() { + return getAbsolutePath(stateConfig.savedStateDirectory()); + } + + /** + *

+ * Get the directory that contains saved states for a particular app. + *

+ * + *
+     * e.g. data/saved/com.swirlds.foobar
+     *      |--------| |----------------|
+     *          |             |
+     *          |         mainClassName
+     *          |
+     *       location where
+     *       states are saved
+     * 
+ * + * @param mainClassName the name of the app + * @return the path of a directory, may not exist + */ + public @NonNull Path getSignedStatesDirectoryForApp(final String mainClassName) { + return getSignedStatesBaseDirectory().resolve(mainClassName); + } + + /** + *

+ * Get the directory that contains contains saved states for a particular node. + *

+ * + *
+     * e.g. data/saved/com.swirlds.foobar/1234
+     *      |--------| |----------------| |--|
+     *          |             |            |
+     *          |         mainClassName    |
+     *          |                          |
+     *       location where              selfId
+     *       states are saved
+     * 
+ * + * @param mainClassName the name of the app + * @param selfId the ID of this node + * @return the path of a directory, may not exist + */ + public @NonNull Path getSignedStatesDirectoryForNode(final String mainClassName, final NodeId selfId) { + return getSignedStatesDirectoryForApp(mainClassName).resolve(selfId.toString()); + } + + /** + *

+ * Get the directory that contains saved states for a particular swirld (i.e. an instance of an app). + *

+ * + *
+     * e.g. data/saved/com.swirlds.foobar/1234/mySwirld
+     *      |--------| |----------------| |--| |------|
+     *          |             |            |       |
+     *          |         mainClassName    |    swirldName
+     *          |                          |
+     *       location where              selfId
+     *       states are saved
+     * 
+ * + * @param mainClassName the name of the app + * @param selfId the ID of this node + * @param swirldName the name of the swirld + * @return the path of a directory, may not exist + */ + public @NonNull Path getSignedStatesDirectoryForSwirld( + final String mainClassName, final NodeId selfId, final String swirldName) { + + return getSignedStatesDirectoryForNode(mainClassName, selfId).resolve(swirldName); + } + + /** + *

+ * Get the fully qualified path to the directory for a particular signed state. This directory might not exist. + *

+ * + *
+     * e.g. data/saved/com.swirlds.foobar/1234/mySwirld/1000
+     *      |--------| |----------------| |--| |------| |--|
+     *          |             |            |      |      |
+     *          |         mainClassName    |      |    round
+     *          |                          |  swirldName
+     *       location where              selfId
+     *       states are saved
+     *
+     * 
+ * + * @param mainClassName the name of the app + * @param selfId the ID of this node + * @param swirldName the name of the swirld + * @param round the round number of the state + * @return the path of the signed state for the particular round + */ + public @NonNull Path getSignedStateDirectory( + final String mainClassName, final NodeId selfId, final String swirldName, final long round) { + // FUTURE WORK: mainClass, selfId and swirldName never change during a run, so they should be constructor + // parameters + return getSignedStatesDirectoryForSwirld(mainClassName, selfId, swirldName) + .resolve(Long.toString(round)); + } + + /** + * Looks for saved state files locally and returns a list of them sorted from newest to oldest + * + * @param mainClassName + * the name of the main app class + * @param platformId + * the ID of the platform + * @param swirldName + * the swirld name + * @return Information about saved states on disk, or null if none are found + */ + @SuppressWarnings("resource") + @NonNull + public List getSavedStateFiles( + final String mainClassName, final NodeId platformId, final String swirldName) { + + try { + final Path dir = getSignedStatesDirectoryForSwirld(mainClassName, platformId, swirldName); + + if (!exists(dir) || !isDirectory(dir)) { + return List.of(); + } + + final List dirs = Files.list(dir).filter(Files::isDirectory).toList(); + + final TreeMap savedStates = new TreeMap<>(); + for (final Path subDir : dirs) { + try { + final long round = Long.parseLong(subDir.getFileName().toString()); + final Path stateFile = subDir.resolve(SIGNED_STATE_FILE_NAME); + if (!exists(stateFile)) { + logger.warn( + EXCEPTION.getMarker(), + "Saved state file ({}) not found, but directory exists '{}'", + stateFile.getFileName(), + subDir.toAbsolutePath()); + continue; + } + + final Path metdataPath = subDir.resolve(SavedStateMetadata.FILE_NAME); + final SavedStateMetadata metadata; + try { + metadata = SavedStateMetadata.parse(metdataPath); + } catch (final IOException e) { + logger.error( + EXCEPTION.getMarker(), "Unable to read saved state metadata file '{}'", metdataPath); + continue; + } + + savedStates.put(round, new SavedStateInfo(stateFile, metadata)); + + } catch (final NumberFormatException e) { + logger.warn( + EXCEPTION.getMarker(), + "Unexpected directory '{}' in '{}'", + subDir.getFileName(), + dir.toAbsolutePath()); + } + } + return new ArrayList<>(savedStates.descendingMap().values()); + } catch (final IOException e) { + throw new UncheckedIOException(e); + } + } +} diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileReader.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileReader.java index 29105c1fb95e..9a13a2482dfc 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileReader.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileReader.java @@ -17,14 +17,12 @@ package com.swirlds.platform.state.signed; import static com.swirlds.common.io.streams.StreamDebugUtils.deserializeAndDebugOnFailure; -import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; import static com.swirlds.platform.state.signed.SignedStateFileUtils.MAX_MERKLE_NODES_IN_STATE; -import static com.swirlds.platform.state.signed.SignedStateFileUtils.SIGNED_STATE_FILE_NAME; import static com.swirlds.platform.state.signed.SignedStateFileUtils.VERSIONED_FILE_BYTE; -import static com.swirlds.platform.state.signed.SignedStateFileUtils.getSignedStatesDirectoryForSwirld; import static java.nio.file.Files.exists; -import static java.nio.file.Files.isDirectory; +import com.swirlds.common.config.StateConfig; +import com.swirlds.common.config.singleton.ConfigurationHolder; import com.swirlds.common.context.PlatformContext; import com.swirlds.common.crypto.Hash; import com.swirlds.common.io.streams.MerkleDataInputStream; @@ -34,88 +32,31 @@ import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; -import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.TreeMap; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; /** * Utility methods for reading a signed state from disk. */ public final class SignedStateFileReader { - - private static final Logger logger = LogManager.getLogger(SignedStateFileReader.class); - private SignedStateFileReader() {} /** - * Looks for saved state files locally and returns a list of them sorted from newest to oldest + * Same as {@link SignedStateFilePath#getSavedStateFiles(String, NodeId, String)} but uses the config from + * {@link ConfigurationHolder} * - * @param mainClassName - * the name of the main app class - * @param platformId - * the ID of the platform - * @param swirldName - * the swirld name - * @return Information about saved states on disk, or null if none are found + * @deprecated this uses a static config, which means that a unit test cannot configure it for its scope. this + * causes unit tests to fail randomly if another test sets an inadequate value in the config holder. */ - @SuppressWarnings("resource") + @Deprecated(forRemoval = true) @NonNull public static List getSavedStateFiles( final String mainClassName, final NodeId platformId, final String swirldName) { - - try { - final Path dir = getSignedStatesDirectoryForSwirld(mainClassName, platformId, swirldName); - - if (!exists(dir) || !isDirectory(dir)) { - return List.of(); - } - - final List dirs = Files.list(dir).filter(Files::isDirectory).toList(); - - final TreeMap savedStates = new TreeMap<>(); - for (final Path subDir : dirs) { - try { - final long round = Long.parseLong(subDir.getFileName().toString()); - final Path stateFile = subDir.resolve(SIGNED_STATE_FILE_NAME); - if (!exists(stateFile)) { - logger.warn( - EXCEPTION.getMarker(), - "Saved state file ({}) not found, but directory exists '{}'", - stateFile.getFileName(), - subDir.toAbsolutePath()); - continue; - } - - final Path metdataPath = subDir.resolve(SavedStateMetadata.FILE_NAME); - final SavedStateMetadata metadata; - try { - metadata = SavedStateMetadata.parse(metdataPath); - } catch (final IOException e) { - logger.error( - EXCEPTION.getMarker(), "Unable to read saved state metadata file '{}'", metdataPath); - continue; - } - - savedStates.put(round, new SavedStateInfo(stateFile, metadata)); - - } catch (final NumberFormatException e) { - logger.warn( - EXCEPTION.getMarker(), - "Unexpected directory '{}' in '{}'", - subDir.getFileName(), - dir.toAbsolutePath()); - } - } - return new ArrayList<>(savedStates.descendingMap().values()); - } catch (final IOException e) { - throw new UncheckedIOException(e); - } + // new instance on every call in case the config changes in the holder + return new SignedStateFilePath(ConfigurationHolder.getConfigData(StateConfig.class)) + .getSavedStateFiles(mainClassName, platformId, swirldName); } /** diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileUtils.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileUtils.java index 504ae8fa74aa..d3d4d03f5663 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileUtils.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileUtils.java @@ -16,25 +16,18 @@ package com.swirlds.platform.state.signed; -import static com.swirlds.common.io.utility.FileUtils.getAbsolutePath; - import com.swirlds.common.config.StateConfig; import com.swirlds.common.config.singleton.ConfigurationHolder; import com.swirlds.common.platform.NodeId; import java.nio.file.Path; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; /** * Utility methods for dealing with signed states on disk. */ public final class SignedStateFileUtils { - - private static final Logger logger = LogManager.getLogger(SignedStateFileUtils.class); - /** - * Fun trivia: the file extension ".swh" stands for "SWirlds Hashgraph", although - * this is a bit misleading... as this file doesn't actually contain a hashgraph. + * Fun trivia: the file extension ".swh" stands for "SWirlds Hashgraph", although this is a bit misleading... as + * this file doesn't actually contain a hashgraph. */ public static final String SIGNED_STATE_FILE_NAME = "SignedState.swh"; @@ -60,133 +53,74 @@ public final class SignedStateFileUtils { private SignedStateFileUtils() {} /** - *

- * Get the base directory where all states will be stored. - *

+ * Same as {@link SignedStateFilePath#getSignedStatesBaseDirectory()} but uses the config from + * {@link ConfigurationHolder} * - *
-     * e.g. data/saved/
-     *      |--------|
-     *          |
-     *       location where
-     *       states are saved
-     * 
- * - * @return the base directory for all signed state files + * @deprecated this uses a static config, which means that a unit test cannot configure it for its scope. this + * causes unit tests to fail randomly if another test sets an inadequate value in the config holder. */ + @Deprecated(forRemoval = true) public static Path getSignedStatesBaseDirectory() { - final StateConfig stateConfig = ConfigurationHolder.getConfigData(StateConfig.class); - return getAbsolutePath(stateConfig.savedStateDirectory()); + // new instance on every call in case the config changes in the holder + return new SignedStateFilePath(ConfigurationHolder.getConfigData(StateConfig.class)) + .getSignedStatesBaseDirectory(); } /** - *

- * Get the directory that contains saved states for a particular app. - *

- * - *
-     * e.g. data/saved/com.swirlds.foobar
-     *      |--------| |----------------|
-     *          |             |
-     *          |         mainClassName
-     *          |
-     *       location where
-     *       states are saved
-     * 
+ * Same as {@link SignedStateFilePath#getSignedStatesDirectoryForApp(String)} but uses the config from + * {@link ConfigurationHolder} * - * @param mainClassName - * the name of the app - * @return the path of a directory, may not exist + * @deprecated this uses a static config, which means that a unit test cannot configure it for its scope. this + * causes unit tests to fail randomly if another test sets an inadequate value in the config holder. */ + @Deprecated(forRemoval = true) public static Path getSignedStatesDirectoryForApp(final String mainClassName) { - return getSignedStatesBaseDirectory().resolve(mainClassName); + // new instance on every call in case the config changes in the holder + return new SignedStateFilePath(ConfigurationHolder.getConfigData(StateConfig.class)) + .getSignedStatesDirectoryForApp(mainClassName); } /** - *

- * Get the directory that contains contains saved states for a particular node. - *

- * - *
-     * e.g. data/saved/com.swirlds.foobar/1234
-     *      |--------| |----------------| |--|
-     *          |             |            |
-     *          |         mainClassName    |
-     *          |                          |
-     *       location where              selfId
-     *       states are saved
-     * 
+ * Same as {@link SignedStateFilePath#getSignedStatesDirectoryForNode(String, NodeId)} but uses the config from + * {@link ConfigurationHolder} * - * @param mainClassName - * the name of the app - * @param selfId - * the ID of this node - * @return the path of a directory, may not exist + * @deprecated this uses a static config, which means that a unit test cannot configure it for its scope. this + * causes unit tests to fail randomly if another test sets an inadequate value in the config holder. */ + @Deprecated(forRemoval = true) public static Path getSignedStatesDirectoryForNode(final String mainClassName, final NodeId selfId) { - - return getSignedStatesDirectoryForApp(mainClassName).resolve(selfId.toString()); + // new instance on every call in case the config changes in the holder + return new SignedStateFilePath(ConfigurationHolder.getConfigData(StateConfig.class)) + .getSignedStatesDirectoryForNode(mainClassName, selfId); } /** - *

- * Get the directory that contains saved states for a particular swirld (i.e. an instance of an app). - *

- * - *
-     * e.g. data/saved/com.swirlds.foobar/1234/mySwirld
-     *      |--------| |----------------| |--| |------|
-     *          |             |            |       |
-     *          |         mainClassName    |    swirldName
-     *          |                          |
-     *       location where              selfId
-     *       states are saved
-     * 
+ * Same as {@link SignedStateFilePath#getSignedStatesDirectoryForSwirld(String, NodeId, String)} but uses the config + * from {@link ConfigurationHolder} * - * @param mainClassName - * the name of the app - * @param selfId - * the ID of this node - * @param swirldName - * the name of the swirld - * @return the path of a directory, may not exist + * @deprecated this uses a static config, which means that a unit test cannot configure it for its scope. this + * causes unit tests to fail randomly if another test sets an inadequate value in the config holder. */ + @Deprecated(forRemoval = true) public static Path getSignedStatesDirectoryForSwirld( final String mainClassName, final NodeId selfId, final String swirldName) { - - return getSignedStatesDirectoryForNode(mainClassName, selfId).resolve(swirldName); + // new instance on every call in case the config changes in the holder + return new SignedStateFilePath(ConfigurationHolder.getConfigData(StateConfig.class)) + .getSignedStatesDirectoryForSwirld(mainClassName, selfId, swirldName); } /** - *

- * Get the fully qualified path to the directory for a particular signed state. This directory might not exist. - *

+ * Same as {@link SignedStateFilePath#getSignedStateDirectory(String, NodeId, String, long)} but uses the config + * from {@link ConfigurationHolder} * - *
-     * e.g. data/saved/com.swirlds.foobar/1234/mySwirld/1000
-     *      |--------| |----------------| |--| |------| |--|
-     *          |             |            |      |      |
-     *          |         mainClassName    |      |    round
-     *          |                          |  swirldName
-     *       location where              selfId
-     *       states are saved
-     *
-     * 
- * - * @param mainClassName - * the name of the app - * @param selfId - * the ID of this node - * @param swirldName - * the name of the swirld - * @param round - * the round number of the state - * @return the path of the signed state for the particular round + * @deprecated this uses a static config, which means that a unit test cannot configure it for its scope. this + * causes unit tests to fail randomly if another test sets an inadequate value in the config holder. */ + @Deprecated(forRemoval = true) public static Path getSignedStateDirectory( final String mainClassName, final NodeId selfId, final String swirldName, final long round) { - - return getSignedStatesDirectoryForSwirld(mainClassName, selfId, swirldName) - .resolve(Long.toString(round)); + // new instance on every call in case the config changes in the holder + return new SignedStateFilePath(ConfigurationHolder.getConfigData(StateConfig.class)) + .getSignedStateDirectory(mainClassName, selfId, swirldName, round); } } diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateManager.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateManager.java index 03733de8b338..d3f4bb192aab 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateManager.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateManager.java @@ -144,27 +144,6 @@ public SignedStateManager( new StandardSequenceSet<>(0, stateConfig.maxAgeOfFutureStateSignatures(), SavedSignature::round); } - /** - * Get the round number of the last complete round. Will return -1 if there is not any recent round that has - * gathered sufficient signatures. - * - * @return latest round for which we have a majority of signatures - */ - public long getLastCompleteRound() { - return completeStates.getLatestRound(); - } - - /** - * Get the last complete signed state - * - * @param reason a short description of why this SignedState is being reserved. Each location where a SignedState is - * reserved should attempt to use a unique reason, as this makes debugging reservation bugs easier. - * @return the latest complete signed state, or a null reservation if no recent states that are complete - */ - public @NonNull ReservedSignedState getLatestSignedState(@NonNull final String reason) { - return completeStates.getLatestAndReserve(reason); - } - /** * Get the latest immutable signed state. May be unhashed, may or may not have all required signatures. State is * returned with a reservation. diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/StartupStateUtils.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/StartupStateUtils.java index 3eca9282568a..f9bd7fd6020c 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/StartupStateUtils.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/StartupStateUtils.java @@ -21,7 +21,6 @@ import static com.swirlds.logging.legacy.LogMarker.STARTUP; import static com.swirlds.platform.state.GenesisStateBuilder.buildGenesisState; import static com.swirlds.platform.state.signed.ReservedSignedState.createNullReservation; -import static com.swirlds.platform.state.signed.SignedStateFileReader.getSavedStateFiles; import static com.swirlds.platform.state.signed.SignedStateFileReader.readStateFile; import com.swirlds.common.config.StateConfig; @@ -96,7 +95,9 @@ public static void doRecoveryCleanup( + "Any states with a round number higher than {} will be recycled.", initialStateRound); - final List savedStateFiles = getSavedStateFiles(actualMainClassName, selfId, swirldName); + final List savedStateFiles = new SignedStateFilePath( + platformContext.getConfiguration().getConfigData(StateConfig.class)) + .getSavedStateFiles(actualMainClassName, selfId, swirldName); for (final SavedStateInfo stateInfo : savedStateFiles) { if (stateInfo.metadata().round() > initialStateRound) { recycleState(recycleBin, stateInfo); @@ -201,7 +202,9 @@ static ReservedSignedState loadStateFile( final StateConfig stateConfig = platformContext.getConfiguration().getConfigData(StateConfig.class); final String actualMainClassName = stateConfig.getMainClassName(mainClassName); - final List savedStateFiles = getSavedStateFiles(actualMainClassName, selfId, swirldName); + final List savedStateFiles = new SignedStateFilePath( + platformContext.getConfiguration().getConfigData(StateConfig.class)) + .getSavedStateFiles(actualMainClassName, selfId, swirldName); logStatesFound(savedStateFiles); if (savedStateFiles.isEmpty()) { diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/system/StateAccessor.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/system/StateAccessor.java index 93e937491208..e083f2c52cbd 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/system/StateAccessor.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/system/StateAccessor.java @@ -34,17 +34,4 @@ public interface StateAccessor { * @return a wrapper around the most recent immutable state */ AutoCloseableWrapper getLatestImmutableState(@NonNull final String reason); - - /** - * Get the most recent fully signed state. May return a wrapper around null if the platform does not have any fully - * signed states still in memory (e.g. right after boot or if there is trouble with the collection of state - * signatures). - * - * @param reason a short description of why this SignedState is being reserved. Each location where a SignedState is - * reserved should attempt to use a unique reason, as this makes debugging reservation bugs easier. - * @param the type of the state - * @return a wrapper around the most recent fully signed state, or a wrapper around null if there are no available - * fully signed states - */ - AutoCloseableWrapper getLatestSignedState(@NonNull final String reason); } diff --git a/platform-sdk/swirlds-platform-core/src/main/java/module-info.java b/platform-sdk/swirlds-platform-core/src/main/java/module-info.java index 447813578fae..375c923c3e92 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/module-info.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/module-info.java @@ -22,7 +22,6 @@ exports com.swirlds.platform.components.common.query; exports com.swirlds.platform.components.state; exports com.swirlds.platform.components.state.output; - exports com.swirlds.platform.components.state.query; exports com.swirlds.platform.config; exports com.swirlds.platform.config.legacy; exports com.swirlds.platform.event.report; diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/SignedStateFileManagerTests.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/SignedStateFileManagerTests.java index 0dc3eec6b7e3..8030619607ff 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/SignedStateFileManagerTests.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/SignedStateFileManagerTests.java @@ -20,8 +20,6 @@ import static com.swirlds.common.test.fixtures.RandomUtils.getRandomPrintSeed; import static com.swirlds.common.threading.manager.AdHocThreadManager.getStaticThreadManager; import static com.swirlds.platform.state.signed.SignedStateFileReader.readStateFile; -import static com.swirlds.platform.state.signed.SignedStateFileUtils.getSignedStateDirectory; -import static com.swirlds.platform.state.signed.SignedStateFileUtils.getSignedStatesBaseDirectory; import static com.swirlds.platform.state.signed.StateToDiskReason.FATAL_ERROR; import static com.swirlds.platform.state.signed.StateToDiskReason.ISS; import static com.swirlds.platform.state.signed.StateToDiskReason.PERIODIC_SNAPSHOT; @@ -57,6 +55,7 @@ import com.swirlds.platform.state.signed.SavedStateMetadata; import com.swirlds.platform.state.signed.SignedState; import com.swirlds.platform.state.signed.SignedStateFileManager; +import com.swirlds.platform.state.signed.SignedStateFilePath; import com.swirlds.platform.state.signed.SignedStateFileReader; import com.swirlds.platform.state.signed.SignedStateFileUtils; import com.swirlds.platform.state.signed.SignedStateMetrics; @@ -91,6 +90,10 @@ class SignedStateFileManagerTests { private static final NodeId SELF_ID = new NodeId(1234); private static final String MAIN_CLASS_NAME = "com.swirlds.foobar"; private static final String SWIRLD_NAME = "mySwirld"; + + private PlatformContext context; + private SignedStateFilePath signedStateFilePath; + /** * Temporary directory provided by JUnit */ @@ -105,6 +108,14 @@ static void beforeAll() throws ConstructableRegistryException { @BeforeEach void beforeEach() throws IOException { TemporaryFileBuilder.overrideTemporaryFileLocation(testDirectory); + final TestConfigBuilder configBuilder = new TestConfigBuilder() + .withValue( + StateConfig_.SAVED_STATE_DIRECTORY, + testDirectory.toFile().toString()); + context = TestPlatformContextBuilder.create() + .withConfiguration(configBuilder.getOrCreateConfig()) + .build(); + signedStateFilePath = new SignedStateFilePath(context.getConfiguration().getConfigData(StateConfig.class)); } private SignedStateMetrics buildMockMetrics() { @@ -120,8 +131,8 @@ private SignedStateMetrics buildMockMetrics() { */ private void validateSavingOfState(final SignedState originalState) throws IOException { - final Path stateDirectory = - getSignedStateDirectory(MAIN_CLASS_NAME, SELF_ID, SWIRLD_NAME, originalState.getRound()); + final Path stateDirectory = signedStateFilePath.getSignedStateDirectory( + MAIN_CLASS_NAME, SELF_ID, SWIRLD_NAME, originalState.getRound()); validateSavingOfState(originalState, stateDirectory); } @@ -167,20 +178,12 @@ private void validateSavingOfState(final SignedState originalState, final Path s @ValueSource(booleans = {true, false}) @DisplayName("Standard Operation Test") void standardOperationTest(final boolean successExpected) throws IOException { - final TestConfigBuilder configBuilder = new TestConfigBuilder() - .withValue( - StateConfig_.SAVED_STATE_DIRECTORY, - testDirectory.toFile().toString()); - final PlatformContext context = TestPlatformContextBuilder.create() - .withConfiguration(configBuilder.getOrCreateConfig()) - .build(); - final SignedState signedState = new RandomSignedStateGenerator().build(); if (!successExpected) { // To make the save fail, create a file with the name of the directory the state will try to be saved to - final Path savedDir = - getSignedStateDirectory(MAIN_CLASS_NAME, SELF_ID, SWIRLD_NAME, signedState.getRound()); + final Path savedDir = signedStateFilePath.getSignedStateDirectory( + MAIN_CLASS_NAME, SELF_ID, SWIRLD_NAME, signedState.getRound()); Files.createDirectories(savedDir.getParent()); Files.createFile(savedDir); } @@ -201,14 +204,6 @@ void standardOperationTest(final boolean successExpected) throws IOException { @Test @DisplayName("Save Fatal Signed State") void saveFatalSignedState() throws InterruptedException, IOException { - final TestConfigBuilder configBuilder = new TestConfigBuilder() - .withValue( - StateConfig_.SAVED_STATE_DIRECTORY, - testDirectory.toFile().toString()); - final PlatformContext context = TestPlatformContextBuilder.create() - .withConfiguration(configBuilder.getOrCreateConfig()) - .build(); - final SignedState signedState = new RandomSignedStateGenerator().build(); ((DummySwirldState) signedState.getSwirldState()).enableBlockingSerialization(); @@ -236,14 +231,6 @@ void saveFatalSignedState() throws InterruptedException, IOException { @Test @DisplayName("Save ISS Signed State") void saveISSignedState() throws IOException { - final TestConfigBuilder configBuilder = new TestConfigBuilder() - .withValue( - StateConfig_.SAVED_STATE_DIRECTORY, - testDirectory.toFile().toString()); - final PlatformContext context = TestPlatformContextBuilder.create() - .withConfiguration(configBuilder.getOrCreateConfig()) - .build(); - final SignedState signedState = new RandomSignedStateGenerator().build(); final SignedStateFileManager manager = new SignedStateFileManager( @@ -408,12 +395,14 @@ void stateDeletionTest() throws IOException { context, buildMockMetrics(), new FakeTime(), MAIN_CLASS_NAME, SELF_ID, SWIRLD_NAME); final Path statesDirectory = - SignedStateFileUtils.getSignedStatesDirectoryForSwirld(MAIN_CLASS_NAME, SELF_ID, SWIRLD_NAME); + signedStateFilePath.getSignedStatesDirectoryForSwirld(MAIN_CLASS_NAME, SELF_ID, SWIRLD_NAME); // Simulate the saving of an ISS state final int issRound = 666; - final Path issDirectory = - getSignedStatesBaseDirectory().resolve("iss").resolve("node" + SELF_ID + "_round" + issRound); + final Path issDirectory = signedStateFilePath + .getSignedStatesBaseDirectory() + .resolve("iss") + .resolve("node" + SELF_ID + "_round" + issRound); final SignedState issState = new RandomSignedStateGenerator(random).setRound(issRound).build(); issState.markAsStateToSave(ISS); @@ -422,8 +411,10 @@ void stateDeletionTest() throws IOException { // Simulate the saving of a fatal state final int fatalRound = 667; - final Path fatalDirectory = - getSignedStatesBaseDirectory().resolve("fatal").resolve("node" + SELF_ID + "_round" + fatalRound); + final Path fatalDirectory = signedStateFilePath + .getSignedStatesBaseDirectory() + .resolve("fatal") + .resolve("node" + SELF_ID + "_round" + fatalRound); final SignedState fatalState = new RandomSignedStateGenerator(random).setRound(fatalRound).build(); fatalState.markAsStateToSave(FATAL_ERROR); @@ -449,8 +440,10 @@ void stateDeletionTest() throws IOException { } // Verify that old states are properly deleted - assertEquals(Math.min(statesOnDisk, round), (int) - Files.list(statesDirectory).count()); + assertEquals( + Math.min(statesOnDisk, round), + (int) Files.list(statesDirectory).count(), + "unexpected number of states on disk after saving round " + round); // ISS/fatal state should still be in place validateSavingOfState(issState, issDirectory); diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/SignedStateFileReadWriteTest.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/SignedStateFileReadWriteTest.java index 85fc7fed295e..279a6d07c785 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/SignedStateFileReadWriteTest.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/SignedStateFileReadWriteTest.java @@ -67,10 +67,6 @@ @DisplayName("SignedState Read/Write Test") class SignedStateFileReadWriteTest { - - private static final NodeId SELF_ID = new NodeId(1234); - private static final String MAIN_CLASS_NAME = "com.swirlds.foobar"; - private static final String SWIRLD_NAME = "mySwirld"; /** * Temporary directory provided by JUnit */ diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/components/state/StateManagementComponentTests.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/components/state/StateManagementComponentTests.java index a47786b497bf..5c546b8c81f3 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/components/state/StateManagementComponentTests.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/components/state/StateManagementComponentTests.java @@ -23,7 +23,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import com.swirlds.common.config.StateConfig_; @@ -40,7 +39,6 @@ import com.swirlds.platform.dispatch.DispatchBuilder; import com.swirlds.platform.dispatch.DispatchConfiguration; import com.swirlds.platform.state.RandomSignedStateGenerator; -import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SignedState; import com.swirlds.platform.state.signed.SourceOfSignedState; import com.swirlds.platform.system.address.AddressBook; @@ -125,76 +123,6 @@ void newStateFromTransactionsSubmitsSystemTransaction() { component.stop(); } - /** - * Verify that when the component is provided a complete signed state to load, it is returned when asked for the - * latest complete signed state. - */ - @Test - @DisplayName("Signed state to load becomes the latest complete signed state") - void signedStateToLoadIsLatestComplete() { - final Random random = RandomUtils.getRandomPrintSeed(); - final DefaultStateManagementComponent component = newStateManagementComponent(); - - component.start(); - - final int firstRound = 1; - final int lastRound = 100; - - // Send a bunch of signed states for the component to load, in order - for (int roundNum = firstRound; roundNum <= lastRound; roundNum++) { - final SignedState signedState = - new RandomSignedStateGenerator(random).setRound(roundNum).build(); - - final SignedState signedStateSpy = spy(signedState); - when(signedStateSpy.isComplete()).thenReturn(true); - - component.stateToLoad(signedStateSpy, SourceOfSignedState.DISK); - - // Some basic assertions on the signed state provided to the new latest complete state consumer - verifyNewLatestCompleteStateConsumer(roundNum, signedStateSpy); - - verifyLatestCompleteState(signedStateSpy, component); - } - - // Send a bunch of signed states that are older than the latest complete signed state - for (int roundNum = firstRound; roundNum < lastRound; roundNum++) { - final SignedState signedState = - new RandomSignedStateGenerator(random).setRound(roundNum).build(); - - final SignedState signedStateSpy = spy(signedState); - when(signedStateSpy.isComplete()).thenReturn(true); - - component.stateToLoad(signedStateSpy, SourceOfSignedState.DISK); - - // The signed state provided is old, so the consumer should not be invoked again - assertEquals( - lastRound, - newLatestCompleteStateConsumer.getNumInvocations(), - "The new latest complete state consumer should not be invoked for states that are older than the " - + "current latest complete state"); - - // The latest complete signed state should still be the same as before and not the one just provided - verifyLatestCompleteState(newLatestCompleteStateConsumer.getLastSignedState(), component); - } - - component.stop(); - } - - private void verifyLatestCompleteState( - final SignedState expectedSignedState, final StateManagementComponent component) { - // Check that the correct signed state is provided when the latest complete state is requested - try (final ReservedSignedState wrapper = component.getLatestSignedState("test")) { - assertEquals(expectedSignedState, wrapper.get(), "Incorrect latest signed state provided"); - - // 1 for being the latest complete signed state - // 1 for being the latest signed state - // 1 for the AutoCloseableWrapper - assertEquals(3, wrapper.get().getReservationCount(), "Incorrect number of reservations"); - } - assertEquals( - expectedSignedState.getRound(), component.getLastCompleteRound(), "Incorrect latest complete round"); - } - private void verifyNewLatestCompleteStateConsumer(final int roundNum, final SignedState signedState) { final SignedState lastCompleteSignedState = newLatestCompleteStateConsumer.getLastSignedState(); assertEquals( @@ -240,10 +168,7 @@ void stateSignaturesAppliedAndTracked() { // This state should be sent out as the latest complete state final int finalRoundNum = roundNum; AssertionUtils.assertEventuallyDoesNotThrow( - () -> { - verifyNewLatestCompleteStateConsumer(finalRoundNum / 2, signedState); - verifyLatestCompleteState(signedState, component); - }, + () -> verifyNewLatestCompleteStateConsumer(finalRoundNum / 2, signedState), Duration.ofSeconds(2), "The unit test failed."); } diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/RandomSignedStateGenerator.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/RandomSignedStateGenerator.java index 99728339eb18..9897985b24ce 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/RandomSignedStateGenerator.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/RandomSignedStateGenerator.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.spy; +import com.swirlds.common.config.StateConfig; import com.swirlds.common.crypto.Hash; import com.swirlds.common.crypto.Signature; import com.swirlds.common.merkle.crypto.MerkleCryptoFactory; @@ -35,7 +36,7 @@ import com.swirlds.platform.system.SoftwareVersion; import com.swirlds.platform.system.address.AddressBook; import com.swirlds.platform.test.fixtures.state.DummySwirldState; -import com.swirlds.test.framework.context.TestPlatformContextBuilder; +import com.swirlds.test.framework.config.TestConfigBuilder; import edu.umd.cs.findbugs.annotations.NonNull; import java.time.Instant; import java.util.ArrayList; @@ -181,7 +182,11 @@ public SignedState build() { consensusTimestampInstance)); final SignedState signedState = new SignedState( - TestPlatformContextBuilder.create().build(), + new TestConfigBuilder() + .withValue("state.stateHistoryEnabled", true) + .withConfigDataType(StateConfig.class) + .getOrCreateConfig() + .getConfigData(StateConfig.class), stateInstance, "RandomSignedStateGenerator.build()", freezeStateInstance); diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/SignedStateManagerTester.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/SignedStateManagerTester.java new file mode 100644 index 000000000000..0cb360bfbc5f --- /dev/null +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/SignedStateManagerTester.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * 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. + */ + +package com.swirlds.platform.state; + +import com.swirlds.common.config.StateConfig; +import com.swirlds.common.metrics.noop.NoOpMetrics; +import com.swirlds.platform.components.state.output.NewLatestCompleteStateConsumer; +import com.swirlds.platform.components.state.output.StateHasEnoughSignaturesConsumer; +import com.swirlds.platform.components.state.output.StateLacksSignaturesConsumer; +import com.swirlds.platform.state.nexus.LatestCompleteStateNexus; +import com.swirlds.platform.state.signed.ReservedSignedState; +import com.swirlds.platform.state.signed.SignedState; +import com.swirlds.platform.state.signed.SignedStateManager; +import com.swirlds.platform.state.signed.SignedStateMetrics; +import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.Nullable; + +/** + * A SignedStateManager that is used for unit testing. Since the SignedStateManager is in the process of being broken up + * into smaller components, this class is a temporary solution to allow unit tests function. In the future, these unit + * tests should become small integration tests that test multiple components. + */ +public class SignedStateManagerTester extends SignedStateManager { + private final LatestCompleteStateNexus latestSignedState; + + private SignedStateManagerTester( + @NonNull final StateConfig stateConfig, + @NonNull final SignedStateMetrics signedStateMetrics, + @NonNull final NewLatestCompleteStateConsumer newLatestCompleteStateConsumer, + @NonNull final StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer, + @NonNull final StateLacksSignaturesConsumer stateLacksSignaturesConsumer, + @NonNull final LatestCompleteStateNexus latestSignedState) { + super( + stateConfig, + signedStateMetrics, + newLatestCompleteStateConsumer, + stateHasEnoughSignaturesConsumer, + stateLacksSignaturesConsumer); + this.latestSignedState = latestSignedState; + } + + public static SignedStateManagerTester create( + @NonNull final StateConfig stateConfig, + @NonNull final SignedStateMetrics signedStateMetrics, + @NonNull final NewLatestCompleteStateConsumer newLatestCompleteStateConsumer, + @NonNull final StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer, + @NonNull final StateLacksSignaturesConsumer stateLacksSignaturesConsumer) { + final LatestCompleteStateNexus latestSignedState = new LatestCompleteStateNexus(stateConfig, new NoOpMetrics()); + return new SignedStateManagerTester( + stateConfig, + signedStateMetrics, + s -> { + newLatestCompleteStateConsumer.newLatestCompleteStateEvent(s); + latestSignedState.setState(s.reserve("LatestCompleteStateNexus.setState")); + }, + stateHasEnoughSignaturesConsumer, + stateLacksSignaturesConsumer, + latestSignedState); + } + + @Override + public synchronized void addState(@NonNull final SignedState signedState) { + super.addState(signedState); + latestSignedState.newIncompleteState(signedState.getRound()); + } + + /** + * Get the last complete signed state + * + * @param reason a short description of why this SignedState is being reserved. Each location where a SignedState is + * reserved should attempt to use a unique reason, as this makes debugging reservation bugs easier. + * @return the latest complete signed state, or a null if there are no recent states that are complete + */ + @Nullable + public ReservedSignedState getLatestSignedState(@NonNull final String reason) { + return latestSignedState.getState(reason); + } + + public long getLastCompleteRound() { + return latestSignedState.getRound(); + } +} diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/AbstractSignedStateManagerTest.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/AbstractSignedStateManagerTest.java index eacc98d00927..96af3dd2c971 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/AbstractSignedStateManagerTest.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/AbstractSignedStateManagerTest.java @@ -56,6 +56,7 @@ public class AbstractSignedStateManagerTest { protected final Map signedStates = new ConcurrentHashMap<>(); protected final AtomicLong highestRound = new AtomicLong(-1); + protected final AtomicLong highestCompleteRound = new AtomicLong(-1); protected final int roundsToKeepForSigning = 5; protected final int futureStateSignatureRounds = 16; protected int roundsToKeepAfterSigning = 0; @@ -135,12 +136,28 @@ protected void validateReservationCounts(final Predicate shouldRoundBePres if (shouldRoundBePresent.test(round)) { assertEquals(-1, signedState.getReservationCount(), "state should have no reservations"); } else { + int expectedReservationCount = 1; if (round == highestRound.get()) { - // the most recent state has an extra reservation - assertEquals(2, signedState.getReservationCount(), "unexpected reservation count"); - } else { - assertEquals(1, signedState.getReservationCount(), "unexpected reservation count"); + // the most recent state has an extra reservation inside the SSM + expectedReservationCount++; } + if (round == highestCompleteRound.get()) { + // the most recent complete state has an extra reservation held by the nexus + expectedReservationCount++; + } + assertEquals( + expectedReservationCount, + signedState.getReservationCount(), + ("unexpected reservation count!%n" + + "round: %d%n" + + "highestRound: %d%n" + + "highestCompleteRound: %d%n" + + "history:%n%s") + .formatted( + round, + highestRound.get(), + highestCompleteRound.get(), + signedState.getHistory())); } } } diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/AddIncompleteStateTest.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/AddIncompleteStateTest.java index e235a9303c0a..38d50f9b5596 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/AddIncompleteStateTest.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/AddIncompleteStateTest.java @@ -30,9 +30,9 @@ import com.swirlds.platform.components.state.output.StateHasEnoughSignaturesConsumer; import com.swirlds.platform.components.state.output.StateLacksSignaturesConsumer; import com.swirlds.platform.state.RandomSignedStateGenerator; +import com.swirlds.platform.state.SignedStateManagerTester; import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SignedState; -import com.swirlds.platform.state.signed.SignedStateManager; import com.swirlds.platform.system.address.Address; import com.swirlds.platform.system.address.AddressBook; import java.util.HashMap; @@ -75,6 +75,7 @@ private StateLacksSignaturesConsumer stateLacksSignaturesConsumer() { private StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer() { return ss -> { assertEquals(highestRound.get() - roundAgeToSign, ss.getRound(), "unexpected round completed"); + highestCompleteRound.accumulateAndGet(ss.getRound(), Math::max); stateHasEnoughSignaturesCount.getAndIncrement(); }; } @@ -83,7 +84,7 @@ private StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer() { @DisplayName("Add Incomplete State Test") void addIncompleteStateTest() { - SignedStateManager manager = new SignedStateManagerBuilder(buildStateConfig()) + SignedStateManagerTester manager = new SignedStateManagerBuilder(buildStateConfig()) .stateLacksSignaturesConsumer(stateLacksSignaturesConsumer()) .stateHasEnoughSignaturesConsumer(stateHasEnoughSignaturesConsumer()) .build(); @@ -117,7 +118,7 @@ void addIncompleteStateTest() { assertEquals( stateFromDisk.getState().getPlatformState().getPlatformData().getRound(), manager.getFirstStateRound()); - assertNull(manager.getLatestSignedState("test").getNullable()); + assertNull(manager.getLatestSignedState("test")); assertEquals(-1, manager.getLastCompleteRound()); try (final ReservedSignedState wrapper = diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/EarlySignaturesTest.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/EarlySignaturesTest.java index ccc898aa8ec8..3bbc054d05d3 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/EarlySignaturesTest.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/EarlySignaturesTest.java @@ -27,9 +27,9 @@ import com.swirlds.platform.components.state.output.StateHasEnoughSignaturesConsumer; import com.swirlds.platform.components.state.output.StateLacksSignaturesConsumer; import com.swirlds.platform.state.RandomSignedStateGenerator; +import com.swirlds.platform.state.SignedStateManagerTester; import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SignedState; -import com.swirlds.platform.state.signed.SignedStateManager; import com.swirlds.platform.system.address.AddressBook; import com.swirlds.platform.system.transaction.StateSignatureTransaction; import java.time.Instant; @@ -70,7 +70,10 @@ private StateLacksSignaturesConsumer stateLacksSignaturesConsumer() { * This consumer is provided by the wiring layer, so it should release the resource when finished. */ private StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer() { - return ss -> stateHasEnoughSignaturesCount.getAndIncrement(); + return ss -> { + highestCompleteRound.accumulateAndGet(ss.getRound(), Math::max); + stateHasEnoughSignaturesCount.getAndIncrement(); + }; } @Test @@ -79,7 +82,7 @@ void earlySignaturesTest() throws InterruptedException { final int count = 100; final StateConfig stateConfig = buildStateConfig(); final int futureSignatures = stateConfig.maxAgeOfFutureStateSignatures(); - final SignedStateManager manager = new SignedStateManagerBuilder(stateConfig) + final SignedStateManagerTester manager = new SignedStateManagerBuilder(stateConfig) .stateLacksSignaturesConsumer(stateLacksSignaturesConsumer()) .stateHasEnoughSignaturesConsumer(stateHasEnoughSignaturesConsumer()) .build(); @@ -173,10 +176,11 @@ void earlySignaturesTest() throws InterruptedException { lastExpectedCompletedRound = Math.max(lastExpectedCompletedRound, roundToSign); } - try (final ReservedSignedState lastState = manager.getLatestImmutableState("test")) { + try (final ReservedSignedState lastState = manager.getLatestImmutableState("test get lastState")) { assertSame(signedState, lastState.get(), "last signed state has unexpected value"); } - try (final ReservedSignedState lastCompletedState = manager.getLatestSignedState("test")) { + try (final ReservedSignedState lastCompletedState = + manager.getLatestSignedState("test get lastCompletedState")) { assertSame( signedStates.get(lastExpectedCompletedRound), lastCompletedState.get(), diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/EmergencyStateFinderTests.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/EmergencyStateFinderTests.java deleted file mode 100644 index 9f0aff37b3ca..000000000000 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/EmergencyStateFinderTests.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 2022-2023 Hedera Hashgraph, LLC - * - * 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. - */ - -package com.swirlds.platform.state.manager; - -import static com.swirlds.platform.reconnect.emergency.EmergencyReconnectTeacher.emergencyStateCriteria; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; - -import com.swirlds.common.test.fixtures.RandomAddressBookGenerator; -import com.swirlds.common.test.fixtures.RandomUtils; -import com.swirlds.platform.state.RandomSignedStateGenerator; -import com.swirlds.platform.state.signed.ReservedSignedState; -import com.swirlds.platform.state.signed.SignedState; -import com.swirlds.platform.state.signed.SignedStateManager; -import com.swirlds.platform.system.address.AddressBook; -import java.util.HashMap; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("SignedStateManager: Emergency State Finder") -public class EmergencyStateFinderTests extends AbstractSignedStateManagerTest { - - private final AddressBook addressBook = new RandomAddressBookGenerator(random) - .setSize(4) - .setWeightDistributionStrategy(RandomAddressBookGenerator.WeightDistributionStrategy.BALANCED) - .build(); - - @DisplayName("Emergency State Finder Test") - @Test - void testFind() { - final SignedStateManager manager = new SignedStateManagerBuilder(buildStateConfig()).build(); - - final int roundAgeToSign = 3; - - // Create a series of signed states, none of which are ancient - for (int round = 0; round < roundsToKeepForSigning - 1; round++) { - final SignedState signedState = new RandomSignedStateGenerator(random) - .setAddressBook(addressBook) - .setRound(round) - .setSignatures(new HashMap<>()) - .build(); - - signedStates.put((long) round, signedState); - highestRound.set(round); - - manager.addState(signedState); - - // Add some signatures to one of the previous states - final long roundToSign = round - roundAgeToSign; - if (roundToSign >= 0) { - addSignature(manager, roundToSign, addressBook.getNodeId(1)); - addSignature(manager, roundToSign, addressBook.getNodeId(2)); - addSignature(manager, roundToSign, addressBook.getNodeId(3)); - } - } - - validateReservationCounts(round -> round < signedStates.size() - roundAgeToSign - 1); - - try (final ReservedSignedState lastCompleteWrapper = manager.getLatestSignedState("test")) { - final SignedState lastComplete = lastCompleteWrapper.get(); - - // Search for a round and hash that match the last complete state exactly - try (final ReservedSignedState actualWrapper = manager.find( - emergencyStateCriteria( - lastComplete.getRound(), lastComplete.getState().getHash()), - "test")) { - final SignedState actual = actualWrapper.get(); - // the last complete state should always have 3 reservations - // 1 for the reservation - // 1 for the lastCompleteWrapper AutoCloseableWrapper - // 1 for the actualWrapper AutoCloseableWrapper - verifyFoundSignedState( - lastComplete, - actual, - 3, - "Requesting the last complete round should return the last complete round"); - } - - // Search for a round earlier than the last complete state - try (final ReservedSignedState actualWrapper = manager.find( - emergencyStateCriteria(lastComplete.getRound() - 1, RandomUtils.randomHash(random)), "test")) { - - final SignedState actual = actualWrapper.get(); - verifyFoundSignedState( - lastComplete, - actual, - 3, - "Requesting a round earlier than the last complete round should return the last complete " - + "round"); - } - } - - try (final ReservedSignedState lastWrapper = manager.getLatestImmutableState("test")) { - final SignedState last = lastWrapper.get(); - - // Search for a round and hash that match the last state exactly - try (final ReservedSignedState actualWrapper = manager.find( - emergencyStateCriteria(last.getRound(), last.getState().getHash()), "test")) { - final SignedState actual = actualWrapper.get(); - // the last state should have 4 reservations: - // 2 for being the last state held by the manager - // 1 for the lastWrapper AutoCloseableWrapper - // 1 for the actualWrapper AutoCloseableWrapper - verifyFoundSignedState(last, actual, 4, "Requesting the last round should return the last round"); - } - - for (long i = manager.getLastCompleteRound() + 1; i <= last.getRound(); i++) { - // Search for a round later than the last complete round with a hash that doesn't match any state - try (final ReservedSignedState actualWrapper = - manager.find(emergencyStateCriteria(i, RandomUtils.randomHash(random)), "test")) { - final SignedState actual = actualWrapper.getNullable(); - assertNull( - actual, - "Requesting a round later than the last complete " - + "round with an unknown hash should return null"); - } - } - } - } - - private void verifyFoundSignedState( - final SignedState lastComplete, - final SignedState actual, - final int numReservations, - final String wrongStateMsg) { - - assertEquals(lastComplete, actual, wrongStateMsg); - - assertEquals(numReservations, actual.getReservationCount(), "Incorrect number of reservations"); - } -} diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/OldCompleteStateEventuallyReleasedTest.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/OldCompleteStateEventuallyReleasedTest.java index 1fa5bed3c081..30b0ac8d76f6 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/OldCompleteStateEventuallyReleasedTest.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/OldCompleteStateEventuallyReleasedTest.java @@ -26,11 +26,12 @@ import com.swirlds.common.crypto.Signature; import com.swirlds.common.platform.NodeId; import com.swirlds.common.test.fixtures.RandomAddressBookGenerator; +import com.swirlds.platform.components.state.output.StateHasEnoughSignaturesConsumer; import com.swirlds.platform.components.state.output.StateLacksSignaturesConsumer; import com.swirlds.platform.state.RandomSignedStateGenerator; +import com.swirlds.platform.state.SignedStateManagerTester; import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SignedState; -import com.swirlds.platform.state.signed.SignedStateManager; import com.swirlds.platform.system.address.Address; import com.swirlds.platform.system.address.AddressBook; import java.util.HashMap; @@ -59,6 +60,15 @@ private StateLacksSignaturesConsumer stateLacksSignaturesConsumer() { return ss -> stateLacksSignaturesCount.getAndIncrement(); } + /** + * Called on each state as it gathers enough signatures to be complete. + *

+ * This consumer is provided by the wiring layer, so it should release the resource when finished. + */ + private StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer() { + return ss -> highestCompleteRound.accumulateAndGet(ss.getRound(), Math::max); + } + /** * Keep adding new states to the manager but never sign any of them (other than self signatures). */ @@ -66,8 +76,9 @@ private StateLacksSignaturesConsumer stateLacksSignaturesConsumer() { @DisplayName("Old Complete State Eventually Released") void oldCompleteStateEventuallyReleased() throws InterruptedException { - final SignedStateManager manager = new SignedStateManagerBuilder(buildStateConfig()) + final SignedStateManagerTester manager = new SignedStateManagerBuilder(buildStateConfig()) .stateLacksSignaturesConsumer(stateLacksSignaturesConsumer()) + .stateHasEnoughSignaturesConsumer(stateHasEnoughSignaturesConsumer()) .build(); final Hash stateHash = randomHash(random); @@ -108,7 +119,7 @@ void oldCompleteStateEventuallyReleased() throws InterruptedException { try (final ReservedSignedState lastCompletedState = manager.getLatestSignedState("test")) { if (round >= roundsToKeepForSigning) { - assertNull(lastCompletedState.getNullable(), "initial state should have been released"); + assertNull(lastCompletedState, "initial state should have been released"); } else { assertSame(lastCompletedState.get(), stateFromDisk); } diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/PostconsensusSignaturesTest.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/PostconsensusSignaturesTest.java index f62658c0bbe2..68ebf149d2cf 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/PostconsensusSignaturesTest.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/PostconsensusSignaturesTest.java @@ -25,6 +25,7 @@ import com.swirlds.platform.components.state.output.StateHasEnoughSignaturesConsumer; import com.swirlds.platform.components.state.output.StateLacksSignaturesConsumer; import com.swirlds.platform.state.RandomSignedStateGenerator; +import com.swirlds.platform.state.SignedStateManagerTester; import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SignedState; import com.swirlds.platform.state.signed.SignedStateManager; @@ -60,7 +61,10 @@ private StateLacksSignaturesConsumer stateLacksSignaturesConsumer() { * Called on each state as it gathers enough signatures to be complete. */ private StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer() { - return ss -> stateHasEnoughSignaturesCount.getAndIncrement(); + return ss -> { + highestCompleteRound.accumulateAndGet(ss.getRound(), Math::max); + stateHasEnoughSignaturesCount.getAndIncrement(); + }; } @Test @@ -69,7 +73,7 @@ void postconsensusSignatureTests() throws InterruptedException { final int count = 100; final StateConfig stateConfig = buildStateConfig(); - final SignedStateManager manager = new SignedStateManagerBuilder(stateConfig) + final SignedStateManagerTester manager = new SignedStateManagerBuilder(stateConfig) .stateLacksSignaturesConsumer(stateLacksSignaturesConsumer()) .stateHasEnoughSignaturesConsumer(stateHasEnoughSignaturesConsumer()) .build(); diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/RegisterStatesWithoutSignaturesTest.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/RegisterStatesWithoutSignaturesTest.java index e0b246942a94..aa01f2f82df9 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/RegisterStatesWithoutSignaturesTest.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/RegisterStatesWithoutSignaturesTest.java @@ -25,9 +25,9 @@ import com.swirlds.platform.components.state.output.StateHasEnoughSignaturesConsumer; import com.swirlds.platform.components.state.output.StateLacksSignaturesConsumer; import com.swirlds.platform.state.RandomSignedStateGenerator; +import com.swirlds.platform.state.SignedStateManagerTester; import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SignedState; -import com.swirlds.platform.state.signed.SignedStateManager; import com.swirlds.platform.system.address.AddressBook; import java.time.Instant; import java.util.HashMap; @@ -66,7 +66,10 @@ private StateLacksSignaturesConsumer stateLacksSignaturesConsumer() { * This consumer is provided by the wiring layer, so it should release the resource when finished. */ private StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer() { - return ss -> stateHasEnoughSignaturesCount.getAndIncrement(); + return ss -> { + stateHasEnoughSignaturesCount.getAndIncrement(); + highestCompleteRound.accumulateAndGet(ss.getRound(), Math::max); + }; } /** @@ -75,7 +78,7 @@ private StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer() { @Test @DisplayName("Register States Without Signatures") void registerStatesWithoutSignatures() throws InterruptedException { - final SignedStateManager manager = new SignedStateManagerBuilder(buildStateConfig()) + final SignedStateManagerTester manager = new SignedStateManagerBuilder(buildStateConfig()) .stateLacksSignaturesConsumer(stateLacksSignaturesConsumer()) .stateHasEnoughSignaturesConsumer(stateHasEnoughSignaturesConsumer()) .build(); @@ -113,7 +116,7 @@ void registerStatesWithoutSignatures() throws InterruptedException { assertSame(signedState, lastState.get(), "last signed state has unexpected value"); } try (final ReservedSignedState lastCompletedState = manager.getLatestSignedState("test")) { - assertNull(lastCompletedState.getNullable(), "no states should be completed in this test"); + assertNull(lastCompletedState, "no states should be completed in this test"); } final int expectedUnsignedStates = Math.max(0, round - roundsToKeepForSigning + 1); diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SequentialSignaturesRestartTest.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SequentialSignaturesRestartTest.java index 5f15fbbdcb9a..cb8b9bbeb83d 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SequentialSignaturesRestartTest.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SequentialSignaturesRestartTest.java @@ -29,9 +29,9 @@ import com.swirlds.platform.components.state.output.StateHasEnoughSignaturesConsumer; import com.swirlds.platform.components.state.output.StateLacksSignaturesConsumer; import com.swirlds.platform.state.RandomSignedStateGenerator; +import com.swirlds.platform.state.SignedStateManagerTester; import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SignedState; -import com.swirlds.platform.state.signed.SignedStateManager; import com.swirlds.platform.system.address.Address; import com.swirlds.platform.system.address.AddressBook; import java.util.HashMap; @@ -74,6 +74,7 @@ private StateLacksSignaturesConsumer stateLacksSignaturesConsumer() { private StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer() { return ss -> { assertEquals(highestRound.get() - roundAgeToSign, ss.getRound(), "unexpected round completed"); + highestCompleteRound.accumulateAndGet(ss.getRound(), Math::max); stateHasEnoughSignaturesCount.getAndIncrement(); }; } @@ -82,7 +83,7 @@ private StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer() { @DisplayName("Sequential Signatures After Restart Test") void sequentialSignaturesAfterRestartTest() throws InterruptedException { - final SignedStateManager manager = new SignedStateManagerBuilder(buildStateConfig()) + final SignedStateManagerTester manager = new SignedStateManagerBuilder(buildStateConfig()) .stateLacksSignaturesConsumer(stateLacksSignaturesConsumer()) .stateHasEnoughSignaturesConsumer(stateHasEnoughSignaturesConsumer()) .build(); diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SequentialSignaturesTest.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SequentialSignaturesTest.java index b57998bd8259..d3c8b681982d 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SequentialSignaturesTest.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SequentialSignaturesTest.java @@ -28,9 +28,9 @@ import com.swirlds.platform.components.state.output.StateHasEnoughSignaturesConsumer; import com.swirlds.platform.components.state.output.StateLacksSignaturesConsumer; import com.swirlds.platform.state.RandomSignedStateGenerator; +import com.swirlds.platform.state.SignedStateManagerTester; import com.swirlds.platform.state.signed.ReservedSignedState; import com.swirlds.platform.state.signed.SignedState; -import com.swirlds.platform.state.signed.SignedStateManager; import com.swirlds.platform.system.address.AddressBook; import java.time.Instant; import java.util.HashMap; @@ -71,6 +71,7 @@ private StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer() { return ss -> { assertEquals(highestRound.get() - roundAgeToSign, ss.getRound(), "unexpected round completed"); stateHasEnoughSignaturesCount.getAndIncrement(); + highestCompleteRound.accumulateAndGet(ss.getRound(), Math::max); }; } @@ -78,7 +79,7 @@ private StateHasEnoughSignaturesConsumer stateHasEnoughSignaturesConsumer() { @DisplayName("Sequential Signatures Test") void sequentialSignaturesTest() throws InterruptedException { this.roundsToKeepAfterSigning = 4; - final SignedStateManager manager = new SignedStateManagerBuilder(buildStateConfig()) + final SignedStateManagerTester manager = new SignedStateManagerBuilder(buildStateConfig()) .stateLacksSignaturesConsumer(stateLacksSignaturesConsumer()) .stateHasEnoughSignaturesConsumer(stateHasEnoughSignaturesConsumer()) .build(); @@ -130,7 +131,7 @@ void sequentialSignaturesTest() throws InterruptedException { assertSame( signedStates.get(roundToSign), lastCompletedState.get(), "unexpected last completed state"); } else { - assertNull(lastCompletedState.getNullable(), "no states should be completed yet"); + assertNull(lastCompletedState, "no states should be completed yet"); } } diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SignedStateManagerBuilder.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SignedStateManagerBuilder.java index 43442ff42f36..9ea2fb917322 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SignedStateManagerBuilder.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/manager/SignedStateManagerBuilder.java @@ -21,6 +21,7 @@ import com.swirlds.platform.components.state.output.NewLatestCompleteStateConsumer; import com.swirlds.platform.components.state.output.StateHasEnoughSignaturesConsumer; import com.swirlds.platform.components.state.output.StateLacksSignaturesConsumer; +import com.swirlds.platform.state.SignedStateManagerTester; import com.swirlds.platform.state.signed.SignedStateManager; import com.swirlds.platform.state.signed.SignedStateMetrics; @@ -51,8 +52,8 @@ public SignedStateManagerBuilder stateLacksSignaturesConsumer(final StateLacksSi return this; } - public SignedStateManager build() { - return new SignedStateManager( + public SignedStateManagerTester build() { + return SignedStateManagerTester.create( stateConfig, metrics, newLatestCompleteStateConsumer, diff --git a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/signed/StartupStateUtilsTests.java b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/signed/StartupStateUtilsTests.java index 0c14e979c7b1..06e174a6a36c 100644 --- a/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/signed/StartupStateUtilsTests.java +++ b/platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/state/signed/StartupStateUtilsTests.java @@ -18,7 +18,6 @@ import static com.swirlds.common.test.fixtures.RandomUtils.getRandomPrintSeed; import static com.swirlds.common.test.fixtures.RandomUtils.randomHash; -import static com.swirlds.platform.state.signed.SignedStateFileUtils.getSignedStateDirectory; import static com.swirlds.platform.state.signed.SignedStateFileWriter.writeSignedStateToDisk; import static com.swirlds.platform.state.signed.StartupStateUtils.doRecoveryCleanup; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -82,6 +81,8 @@ class StartupStateUtilsTests { @TempDir Path testDirectory; + private SignedStateFilePath signedStateFilePath; + private final NodeId selfId = new NodeId(0); private final String mainClassName = "mainClassName"; private final String swirldName = "swirldName"; @@ -89,6 +90,10 @@ class StartupStateUtilsTests { @BeforeEach void beforeEach() throws IOException { FileUtils.deleteDirectory(testDirectory); + signedStateFilePath = new SignedStateFilePath(new TestConfigBuilder() + .withValue("state.savedStateDirectory", testDirectory.toString()) + .getOrCreateConfig() + .getConfigData(StateConfig.class)); } @AfterEach @@ -134,7 +139,8 @@ private SignedState writeState( .setEpoch(epoch) .build(); - final Path savedStateDirectory = getSignedStateDirectory(mainClassName, selfId, swirldName, round); + final Path savedStateDirectory = + signedStateFilePath.getSignedStateDirectory(mainClassName, selfId, swirldName, round); writeSignedStateToDisk( platformContext, selfId, savedStateDirectory, signedState, StateToDiskReason.PERIODIC_SNAPSHOT); @@ -280,7 +286,8 @@ void corruptedStateRecyclingPermittedTest(final int invalidStateCount) assertNull(loadedState); } - final Path savedStateDirectory = getSignedStateDirectory(mainClassName, selfId, swirldName, latestRound) + final Path savedStateDirectory = signedStateFilePath + .getSignedStateDirectory(mainClassName, selfId, swirldName, latestRound) .getParent(); assertEquals(5 - invalidStateCount, Files.list(savedStateDirectory).count()); @@ -704,7 +711,8 @@ void recoveryCorruptedStateRecyclingPermittedTest(final int invalidStateCount) assertNull(loadedState); } - final Path savedStateDirectory = getSignedStateDirectory(mainClassName, selfId, swirldName, latestRound) + final Path savedStateDirectory = signedStateFilePath + .getSignedStateDirectory(mainClassName, selfId, swirldName, latestRound) .getParent(); assertEquals(5 - invalidStateCount, Files.list(savedStateDirectory).count()); @@ -754,7 +762,8 @@ void doRecoveryCleanupInitialEpochTest() throws IOException { doRecoveryCleanup(platformContext, recycleBin, selfId, swirldName, mainClassName, null, latestRound); - final Path signedStateDirectory = getSignedStateDirectory(mainClassName, selfId, swirldName, latestRound) + final Path signedStateDirectory = signedStateFilePath + .getSignedStateDirectory(mainClassName, selfId, swirldName, latestRound) .getParent(); assertEquals(0, recycleCount.get()); @@ -811,7 +820,8 @@ void doRecoveryCleanupAlreadyCleanedUpTest() throws IOException { doRecoveryCleanup(platformContext, recycleBin, selfId, swirldName, mainClassName, epoch, latestRound); - final Path signedStateDirectory = getSignedStateDirectory(mainClassName, selfId, swirldName, latestRound) + final Path signedStateDirectory = signedStateFilePath + .getSignedStateDirectory(mainClassName, selfId, swirldName, latestRound) .getParent(); assertEquals(0, recycleCount.get()); @@ -881,7 +891,8 @@ void doRecoveryCleanupWorkRequiredTest(final int statesToDelete) throws IOExcept assertEquals(epoch, scratchpad.get(RecoveryScratchpad.EPOCH_HASH)); - final Path signedStateDirectory = getSignedStateDirectory(mainClassName, selfId, swirldName, latestRound) + final Path signedStateDirectory = signedStateFilePath + .getSignedStateDirectory(mainClassName, selfId, swirldName, latestRound) .getParent(); assertEquals(statesToDelete, recycleCount.get());