From 7c05a328f5568cf58330c7d2b5d0fa0c4f90905e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ri=C4=8Dardas=20Bu=C4=8Di=C5=ABnas?= Date: Mon, 23 Oct 2023 21:47:08 +0300 Subject: [PATCH 1/2] feat: messagelog archive hash-chain verifier Migrated previous ruby utility to java. Refs: XRDDEV-2403 --- doc/archive-hashchain-verifier.README | 25 -- doc/archive-hashchain-verifier.rb | 256 ------------------ .../messagelog-archive-verifier/README.md | 17 ++ .../messagelog-archive-verifier/build.gradle | 27 ++ .../xroad/cli/ArchiveHashChainVerifier.java | 144 ++++++++++ .../org/niis/xroad/cli/DigestCalculator.java | 63 +++++ .../java/org/niis/xroad/cli/LinkingInfo.java | 75 +++++ .../xroad/cli/MessageArchiveExtractor.java | 112 ++++++++ .../cli/ArchiveHashChainVerifierTest.java | 90 ++++++ .../src/test/resources/message-archive-0.zip | Bin 0 -> 9895 bytes .../src/test/resources/message-archive-1.zip | Bin 0 -> 251479 bytes .../redhat/SPECS/xroad-addon-messagelog.spec | 8 +- .../generic/xroad-addon-messagelog.install | 4 +- src/settings.gradle | 2 +- 14 files changed, 535 insertions(+), 288 deletions(-) delete mode 100644 doc/archive-hashchain-verifier.README delete mode 100755 doc/archive-hashchain-verifier.rb create mode 100644 src/addons/messagelog/messagelog-archive-verifier/README.md create mode 100644 src/addons/messagelog/messagelog-archive-verifier/build.gradle create mode 100644 src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/ArchiveHashChainVerifier.java create mode 100644 src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/DigestCalculator.java create mode 100644 src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/LinkingInfo.java create mode 100644 src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/MessageArchiveExtractor.java create mode 100644 src/addons/messagelog/messagelog-archive-verifier/src/test/java/org/niis/xroad/cli/ArchiveHashChainVerifierTest.java create mode 100644 src/addons/messagelog/messagelog-archive-verifier/src/test/resources/message-archive-0.zip create mode 100644 src/addons/messagelog/messagelog-archive-verifier/src/test/resources/message-archive-1.zip diff --git a/doc/archive-hashchain-verifier.README b/doc/archive-hashchain-verifier.README deleted file mode 100644 index 96e4cf963b..0000000000 --- a/doc/archive-hashchain-verifier.README +++ /dev/null @@ -1,25 +0,0 @@ -Script 'archive-hashchain-verifier.rb' is for verifying if hash chain related to log archive is correct. Basically it calculates ASiC container hashes in log archive (zip) file and compares them with the ones in linking info file. - -If there are previous files archived, the script takes last hash step result of previous archive file into consideration as well. - -For script to work, it needs Ruby and gem "rubyzip" to be installed. Tested versions: - With plain Ruby: - ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-linux] - rubyzip (1.1.7) - With JRuby: - jruby 1.7.16.1 (1.9.3p392) 2014-10-28 4e93f31 on OpenJDK 64-Bit Server VM 1.8.0_45-internal-b14 +jit [linux-amd64] - rubyzip (1.1.7, 1.1.6) - -Recommended way for installing proper Ruby version is using RVM, described here: https://rvm.io/rvm/install - -When Ruby is installed, 'rubyzip' can be added: - -gem install rubyzip - -Script will be invoked: - -./archive-hashchain-verifier.rb <(lastHashStepResult) or (-f) or (--first)> - -NB! If value of second argument is '-f' of '--first' (both case insensitive), it is assumed that first archive file in chain is verified (no previous hash steps has been calculated). - -Standard output of the script is result of last hash step of the archive file. diff --git a/doc/archive-hashchain-verifier.rb b/doc/archive-hashchain-verifier.rb deleted file mode 100755 index 757f67a70c..0000000000 --- a/doc/archive-hashchain-verifier.rb +++ /dev/null @@ -1,256 +0,0 @@ -#!/usr/bin/env ruby - -require 'rubygems' -require 'zip' # gem 'rubyzip' must be installed! -require 'digest' - -class DigestCalculator - SUPPORTED_DIGEST_ALGO_IDS = ["SHA-256", "SHA-384", "SHA-512"] - - def initialize(digest_algo_id) - digest_algo_id ||= "" - - case digest_algo_id.upcase - when "SHA-256" - @digest_class = Digest::SHA256 - when "SHA-384" - @digest_class = Digest::SHA384 - when "SHA-512" - @digest_class = Digest::SHA512 - else - raise "Digest algorithm id '#{digest_algo_id}' is not supported, "\ - "supported ones are:\n#{SUPPORTED_DIGEST_ALGO_IDS.join(", ")}" - end - end - - def chain_digest(file_content, prev_hexdigest = "") - return hexdigest(prev_hexdigest + hexdigest(file_content)) - end - - def hexdigest(input) - digest = @digest_class.new - digest.update(input) - return digest.hexdigest - end -end - -# Raised when log archive is not in correct format. -class InvalidLogArchiveException < Exception - def initialize(message) - super(message) - end -end - -class LinkingInfo - attr_reader :prev_digest, :prev_arch_file, :digest_algo_id - - def initialize(file_lines) - @content_lines = {} - - parse(file_lines) - end - - def digest_calculator - DigestCalculator.new(@digest_algo_id) - end - - def digest_for_file(file_name) - @content_lines[file_name] - end - - def file_names - @content_lines.keys - end - - private - - def parse(file_lines) - prev_digest, prev_digest_file, @digest_algo_id = - file_lines.shift.split(/\s+/) - - @prev_digest = prev_digest == "-" ? "" : prev_digest - @prev_arch_file = prev_arch_file == "-" ? "" : prev_arch_file - - file_lines.each do |each_content_line| - digest, file_name = each_content_line.split(/\s+/) - - @content_lines[file_name] = digest - end - end -end - -class ArchiveExtractor - def initialize(archive_file) - @archive_file = archive_file - @asic_containers = [] - @linking_info = nil - - @previous_digest = nil - end - - def extract - Zip::File.open(@archive_file) do |zip_file| - extract_linking_info(zip_file) - - zip_file.each do |entry| - process_asic(entry) if is_asic?(entry) - end - end - - return { - :asic_containers => @asic_containers, - :linking_info => @linking_info, - :last_digest => @previous_digest - } - rescue Zip::Error, Errno::EACCES - handle_input_error("File '#@archive_file' cannot be extracted - "\ - "it may not be valid zip file.") - end - - private - - def process_asic(entry) - file_name = entry.name - file_content = entry.get_input_stream.read - - digest = @digest_calculator.chain_digest(file_content, @previous_digest) - - @asic_containers << {:name => file_name, :digest => digest} - @previous_digest = digest - end - - def is_asic?(entry) - /\A*\.asice\z/ =~ entry.name - end - - def extract_linking_info(zip_file) - linking_info_entry = zip_file.get_entry("linkinginfo") - - linking_info_content = linking_info_entry.get_input_stream.read - linking_info_lines = linking_info_content.split(/\n+/) - - @linking_info = LinkingInfo.new(linking_info_lines) - @digest_calculator = @linking_info.digest_calculator - @previous_digest = @linking_info.prev_digest - rescue Errno::ENOENT - raise InvalidLogArchiveException.new( - "Linking info not found in archive file '#{zip_file.name}'") - end -end - -def print_usage - STDERR.puts(%{ -Program must be invoked like this: - - ./archive-hashchain-verifier.rb \ -<(previousArchiveHexDigest) or (-f) or (--first)> - }) -end - -def handle_input_error(message) - STDERR.puts("INPUT ERROR: #{message}") - print_usage - exit 1 -end - -def validate_archive_file - unless ARGV.length == 2 - raise "First argument must provide two arguments, "\ - "but there is less." - end - - zip_file = ARGV.first - - unless File.exists?(zip_file) - raise "Archive file '#{zip_file}' does not exist." - end -rescue Exception - handle_input_error($!.message) -end - -def parse_arguments - validate_archive_file - - archive_file = ARGV.first - prev_digest = "" - - unless first_in_hash_chain? - prev_digest = ARGV[1] - end - - return archive_file, prev_digest -end - -def first_in_hash_chain? - second_arg = ARGV[1] ? ARGV[1].downcase : "" - - return second_arg == "-f" || second_arg == "--first" -end - -def extract(archive_file) - ArchiveExtractor.new(archive_file).extract -end - -def verify(archive_file, prev_digest, extracted_archive) - asic_containers = extracted_archive[:asic_containers] - linking_info = extracted_archive[:linking_info] - - unless asic_containers.any? - raise InvalidLogArchiveException.new( - "There are no ASiC containers in archive file "\ - "'#{archive_file}', at least one is expected.") - end - - unless prev_digest == linking_info.prev_digest - raise InvalidLogArchiveException.new( - "Last hash steps given by user and in linking info differ\n"\ - "\tBy user: '#{prev_digest}'\n"\ - "\tIn linking info: '#{linking_info.prev_digest}'\n") - end - - linking_info_file_names = linking_info.file_names - in_archive_file_names = asic_containers.map { |c| c[:name] } - - unless linking_info_file_names == in_archive_file_names - raise InvalidLogArchiveException.new( - "File names in linking info and in archive file differ\n"\ - "\tIn archive file: '#{in_archive_file_names.join(", ")}'\n"\ - "\tIn linking info: '#{linking_info_file_names.join(", ")}'\n") - end - - asic_containers.each do |each_container| - file_name = each_container[:name] - file_digest = each_container[:digest] - - linking_info_digest = linking_info.digest_for_file(file_name) - - if file_digest != linking_info_digest - raise InvalidLogArchiveException.new( - "Digests of file '#{file_name} do not match:\n"\ - "\tDigest in linkinginfo: #{linking_info_digest}\n"\ - "\tActual file digest: #{file_digest}\n") - end - end -end - -def exit_with_error(archive_file) - STDERR.puts("ERROR: Archive file '#{archive_file}' "\ - "is invalid, reason:\n#{$!.message}") - exit 1 -end - -def print_last_digest(extracted_archive) - puts extracted_archive[:last_digest] -end - -def run - archive_file, prev_digest = parse_arguments - extracted_archive = extract(archive_file) - - verify(archive_file, prev_digest, extracted_archive) - print_last_digest(extracted_archive) -rescue InvalidLogArchiveException - exit_with_error(archive_file) -end - -run diff --git a/src/addons/messagelog/messagelog-archive-verifier/README.md b/src/addons/messagelog/messagelog-archive-verifier/README.md new file mode 100644 index 0000000000..0d1c85203b --- /dev/null +++ b/src/addons/messagelog/messagelog-archive-verifier/README.md @@ -0,0 +1,17 @@ +## Messagelog archive verifier + +This code verifies the correctness of the hash chain related to the log archive. It calculates the ASiC container hashes in the log archive (zip) file and compares them with the hashes in the linking info file. + +If there are previous archived files, the script also takes into consideration the last hash step result of the previous archive file. + +To use the script, make sure you have the matching Java version installed. + +The script can be invoked using the following command: + +``` +java -jar messagelog-archive-verifier.jar <(lastHashStepResult) or (-f) or (--first)> +``` + +**NB!** If the value of the second argument is `-f` or `--first` (both case insensitive), it is assumed that the first archive file in the chain is being verified, and no previous hash steps have been calculated. + +The standard output of the script is the result of the last hash step of the archive file. diff --git a/src/addons/messagelog/messagelog-archive-verifier/build.gradle b/src/addons/messagelog/messagelog-archive-verifier/build.gradle new file mode 100644 index 0000000000..d607029b71 --- /dev/null +++ b/src/addons/messagelog/messagelog-archive-verifier/build.gradle @@ -0,0 +1,27 @@ +plugins { + id("java") + id 'com.github.johnrengelman.shadow' +} + +dependencies { + implementation project(':common:common-util') +} + +ext { + mainClassName = 'org.niis.xroad.cli.ArchiveHashChainVerifier' +} + +jar { + manifest { + attributes 'Main-Class': mainClassName + } +} + +shadowJar { + archiveVersion = '' + archiveClassifier = '' + from rootProject.file("LICENSE.txt") +} + +jar.enabled = false +build.dependsOn shadowJar diff --git a/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/ArchiveHashChainVerifier.java b/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/ArchiveHashChainVerifier.java new file mode 100644 index 0000000000..a97378364a --- /dev/null +++ b/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/ArchiveHashChainVerifier.java @@ -0,0 +1,144 @@ +/* + * The MIT License + * + * Copyright (c) 2019- Nordic Institute for Interoperability Solutions (NIIS) + * Copyright (c) 2018 Estonian Information System Authority (RIA), + * Nordic Institute for Interoperability Solutions (NIIS), Population Register Centre (VRK) + * Copyright (c) 2015-2017 Estonian Information System Authority (RIA), Population Register Centre (VRK) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package org.niis.xroad.cli; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class ArchiveHashChainVerifier { + + public static void main(String[] args) { + ArchiveHashChainVerifier verifier = new ArchiveHashChainVerifier(); + + try { + verifier.run(args); + } catch (MessageArchiveExtractor.InvalidLogArchiveException e) { + exitWithError(args[0], e.getMessage()); + } catch (InputErrorException e) { + System.err.println("INPUT ERROR: " + e.getMessage()); + printUsage(); + System.exit(1); + } + + } + + public void run(String[] args) throws InputErrorException, MessageArchiveExtractor.InvalidLogArchiveException { + String[] parsedArgs = parseArguments(args); + String archiveFile = parsedArgs[0]; + String prevDigest = parsedArgs[1]; + + MessageArchiveExtractor extractor = new MessageArchiveExtractor(archiveFile); + MessageArchiveExtractor.ExtractionResult extractedArchive = extractor.extract(); + + verify(archiveFile, prevDigest, extractedArchive); + printLastDigest(extractedArchive); + } + + private void verify(final String archiveFile, final String prevDigest, + final MessageArchiveExtractor.ExtractionResult extractedArchive) + throws MessageArchiveExtractor.InvalidLogArchiveException { + List asicContainers = extractedArchive.asicContainers(); + LinkingInfo linkingInfo = extractedArchive.linkingInfo(); + + if (asicContainers.isEmpty()) { + throw new MessageArchiveExtractor.InvalidLogArchiveException("There are no ASiC containers in archive file '" + + archiveFile + "', at least one is expected."); + } + + if (!prevDigest.equals(linkingInfo.getPrevDigest())) { + throw new MessageArchiveExtractor.InvalidLogArchiveException("Last hash steps given by user and in linking info differ\n" + + "\tBy user: '" + prevDigest + "'\n" + + "\tIn linking info: '" + linkingInfo.getPrevDigest() + "'\n"); + } + + Set linkingInfoFileNames = linkingInfo.fileNames(); + Set inArchiveFileNames = asicContainers.stream() + .map(MessageArchiveExtractor.AsicContainer::name) + .collect(Collectors.toSet()); + + if (!linkingInfoFileNames.equals(inArchiveFileNames)) { + throw new MessageArchiveExtractor.InvalidLogArchiveException("File names in linking info and in archive file differ\n" + + "\tIn archive file: '" + String.join(", ", inArchiveFileNames) + "'\n" + + "\tIn linking info: '" + String.join(", ", linkingInfoFileNames) + "'\n"); + } + + for (MessageArchiveExtractor.AsicContainer container : asicContainers) { + String fileName = container.name(); + String fileDigest = container.digest(); + + String linkingInfoDigest = linkingInfo.digestForFile(fileName); + + if (!fileDigest.equals(linkingInfoDigest)) { + throw new MessageArchiveExtractor.InvalidLogArchiveException("Digests of file '" + fileName + "' do not match:\n" + + "\tDigest in linking info: " + linkingInfoDigest + "\n" + + "\tActual file digest: " + fileDigest + "\n"); + } + } + } + + private void printLastDigest(MessageArchiveExtractor.ExtractionResult extractedArchive) { + System.out.println(extractedArchive.lastDigest()); + } + + private static void exitWithError(String archiveFile, String errorMessage) { + System.err.println("ERROR: Archive file '" + archiveFile + "' is invalid, reason:\n" + errorMessage); + System.exit(1); + } + + private static void printUsage() { + System.err.println("Program must be invoked like this:\n" + + "java -jar messagelog-archive-verifier.jar " + + "<(previousArchiveHexDigest) or (-f) or (--first)>"); + } + + private String[] parseArguments(String[] args) throws InputErrorException { + if (args.length != 2) { + throw new InputErrorException("First argument must provide two arguments, but there is less."); + } + + String archiveFile = args[0]; + String prevDigest = ""; + + if (!firstInHashChain(args)) { + prevDigest = args[1]; + } + + return new String[]{archiveFile, prevDigest}; + } + + private boolean firstInHashChain(String[] args) { + String secondArg = args.length > 1 ? args[1].toLowerCase() : ""; + return secondArg.equals("-f") || secondArg.equals("--first"); + } + + public static class InputErrorException extends Exception { + public InputErrorException(String message) { + super(message); + } + } +} diff --git a/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/DigestCalculator.java b/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/DigestCalculator.java new file mode 100644 index 0000000000..1bca89548f --- /dev/null +++ b/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/DigestCalculator.java @@ -0,0 +1,63 @@ +/* + * The MIT License + * + * Copyright (c) 2019- Nordic Institute for Interoperability Solutions (NIIS) + * Copyright (c) 2018 Estonian Information System Authority (RIA), + * Nordic Institute for Interoperability Solutions (NIIS), Population Register Centre (VRK) + * Copyright (c) 2015-2017 Estonian Information System Authority (RIA), Population Register Centre (VRK) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package org.niis.xroad.cli; + +import ee.ria.xroad.common.util.CryptoUtils; + +import lombok.SneakyThrows; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; + +public class DigestCalculator { + private static final List SUPPORTED_DIGEST_ALGO_IDS = Arrays.asList("SHA-256", "SHA-384", "SHA-512"); + + private final String digestAlgoId; + + public DigestCalculator(String digestAlgoId) { + this.digestAlgoId = digestAlgoId.toUpperCase(); + + if (!SUPPORTED_DIGEST_ALGO_IDS.contains(digestAlgoId)) { + throw new IllegalArgumentException("Digest algorithm id '" + digestAlgoId + "' is not supported, " + + "supported ones are:\n" + String.join(", ", SUPPORTED_DIGEST_ALGO_IDS)); + } + + } + + public String chainDigest(byte[] fileContent, String prevHexDigest) { + String hexDigest = hexDigest(fileContent); + String combinedDigests = prevHexDigest + hexDigest; + + return hexDigest(combinedDigests.getBytes(StandardCharsets.UTF_8)); + } + + @SneakyThrows + private String hexDigest(byte[] fileBytes) { + return CryptoUtils.hexDigest(digestAlgoId, fileBytes); + } +} diff --git a/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/LinkingInfo.java b/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/LinkingInfo.java new file mode 100644 index 0000000000..331529d5f1 --- /dev/null +++ b/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/LinkingInfo.java @@ -0,0 +1,75 @@ +/* + * The MIT License + * + * Copyright (c) 2019- Nordic Institute for Interoperability Solutions (NIIS) + * Copyright (c) 2018 Estonian Information System Authority (RIA), + * Nordic Institute for Interoperability Solutions (NIIS), Population Register Centre (VRK) + * Copyright (c) 2015-2017 Estonian Information System Authority (RIA), Population Register Centre (VRK) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package org.niis.xroad.cli; + +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +@Getter +class LinkingInfo { + private String prevDigest; + private String prevArchFile; + private String digestAlgoId; + private final Map contentLines; + + LinkingInfo(String[] fileLines) { + contentLines = new HashMap<>(); + parse(fileLines); + } + + public DigestCalculator digestCalculator() { + return new DigestCalculator(digestAlgoId); + } + + public String digestForFile(String fileName) { + return contentLines.get(fileName); + } + + public Set fileNames() { + return contentLines.keySet(); + } + + private void parse(String[] fileLines) { + String[] firstLineParts = fileLines[0].split("\\s+"); + prevDigest = firstLineParts[0].equals("-") ? "" : firstLineParts[0]; + prevArchFile = firstLineParts[1].equals("-") ? "" : firstLineParts[1]; + digestAlgoId = firstLineParts[2]; + + for (int i = 1; i < fileLines.length; i++) { + String line = fileLines[i]; + String[] lineParts = line.split("\\s+"); + if (lineParts.length != 2) { + throw new IllegalArgumentException("Invalid log archive format"); + } + contentLines.put(lineParts[1], lineParts[0]); + } + } + +} diff --git a/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/MessageArchiveExtractor.java b/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/MessageArchiveExtractor.java new file mode 100644 index 0000000000..e565853021 --- /dev/null +++ b/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/MessageArchiveExtractor.java @@ -0,0 +1,112 @@ +/* + * The MIT License + * + * Copyright (c) 2019- Nordic Institute for Interoperability Solutions (NIIS) + * Copyright (c) 2018 Estonian Information System Authority (RIA), + * Nordic Institute for Interoperability Solutions (NIIS), Population Register Centre (VRK) + * Copyright (c) 2015-2017 Estonian Information System Authority (RIA), Population Register Centre (VRK) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package org.niis.xroad.cli; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +public class MessageArchiveExtractor { + private final List asicContainers = new ArrayList<>(); + private final String archiveFile; + private LinkingInfo linkingInfo; + private String previousDigest; + + public MessageArchiveExtractor(final String archiveFile) { + this.archiveFile = archiveFile; + this.linkingInfo = null; + this.previousDigest = null; + } + + public ExtractionResult extract() { + try (ZipFile zipFile = new ZipFile(archiveFile)) { + extractLinkingInfo(zipFile); + + zipFile.stream() + .filter(this::isAsic) + .forEach(entry -> processAsic(zipFile, entry)); + } catch (IOException | InvalidLogArchiveException e) { + throw new InvalidLogArchiveException("File '" + archiveFile + "' cannot be extracted - it may not be a valid zip file.", e); + } + + return new ExtractionResult(asicContainers, linkingInfo, previousDigest); + } + + private void processAsic(ZipFile zipFile, ZipEntry entry) { + String fileName = entry.getName(); + String digest = linkingInfo.digestCalculator().chainDigest(readFile(zipFile, entry), previousDigest); + + asicContainers.add(new AsicContainer(fileName, digest)); + previousDigest = digest; + } + + private boolean isAsic(ZipEntry entry) { + return entry.getName().endsWith(".asice"); + } + + private void extractLinkingInfo(ZipFile zipFile) throws InvalidLogArchiveException { + ZipEntry linkingInfoEntry = zipFile.getEntry("linkinginfo"); + + if (linkingInfoEntry == null) { + throw new InvalidLogArchiveException("Linking info not found in archive file: " + zipFile.getName()); + } + + String[] linkingInfoLines = new String(readFile(zipFile, linkingInfoEntry)).split("\\r?\\n"); + + linkingInfo = new LinkingInfo(linkingInfoLines); + previousDigest = linkingInfo.getPrevDigest(); + } + + private byte[] readFile(ZipFile zipFile, ZipEntry entry) { + try { + return zipFile.getInputStream(entry).readAllBytes(); + } catch (IOException e) { + throw new InvalidLogArchiveException("Failed to extract content from archive file: " + zipFile.getName(), e); + } + } + + public static class InvalidLogArchiveException extends RuntimeException { + public InvalidLogArchiveException(String message, Throwable throwable) { + super(message, throwable); + } + + public InvalidLogArchiveException(String message) { + super(message); + } + } + + + public record ExtractionResult(List asicContainers, + LinkingInfo linkingInfo, + String lastDigest) { + } + + public record AsicContainer(String name, String digest) { + } +} diff --git a/src/addons/messagelog/messagelog-archive-verifier/src/test/java/org/niis/xroad/cli/ArchiveHashChainVerifierTest.java b/src/addons/messagelog/messagelog-archive-verifier/src/test/java/org/niis/xroad/cli/ArchiveHashChainVerifierTest.java new file mode 100644 index 0000000000..39b4545342 --- /dev/null +++ b/src/addons/messagelog/messagelog-archive-verifier/src/test/java/org/niis/xroad/cli/ArchiveHashChainVerifierTest.java @@ -0,0 +1,90 @@ +/* + * The MIT License + * + * Copyright (c) 2019- Nordic Institute for Interoperability Solutions (NIIS) + * Copyright (c) 2018 Estonian Information System Authority (RIA), + * Nordic Institute for Interoperability Solutions (NIIS), Population Register Centre (VRK) + * Copyright (c) 2015-2017 Estonian Information System Authority (RIA), Population Register Centre (VRK) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package org.niis.xroad.cli; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class ArchiveHashChainVerifierTest { + private static final String MESSAGE_ARCHIVE_0_FILENAME = "build/resources/test/message-archive-0.zip"; + private static final String MESSAGE_ARCHIVE_1_FILENAME = "build/resources/test/message-archive-1.zip"; + private final ArchiveHashChainVerifier verifier = new ArchiveHashChainVerifier(); + + @Test + void shouldSucceedOnValidHashChain() { + String validHashChain = + "9011ab557706b5050584d6888af7b390e5350f4edad296bd7a582aa51732aac" + + "7f49a4ec44dd361027945ade0de8b8cf607fb7b7d11f17b0560d44b965c358eaa"; + try { + verifier.run(new String[]{MESSAGE_ARCHIVE_1_FILENAME, validHashChain}); + } catch (Exception e) { + Assertions.fail(e); + } + } + + @Test + void shouldSucceedOnValidHFirst() { + try { + verifier.run(new String[]{MESSAGE_ARCHIVE_0_FILENAME, "-f"}); + } catch (Exception e) { + Assertions.fail(e); + } + } + + @Test + void shouldFailOnMissingArgs() { + try { + verifier.run(new String[]{}); + Assertions.fail(); + } catch (Exception e) { + Assertions.assertTrue(e instanceof ArchiveHashChainVerifier.InputErrorException); + } + } + + @Test + void shouldFailOnMissingPrevHashArg() { + try { + verifier.run(new String[]{MESSAGE_ARCHIVE_1_FILENAME}); + Assertions.fail(); + } catch (Exception e) { + Assertions.assertTrue(e instanceof ArchiveHashChainVerifier.InputErrorException); + } + } + + @Test + void shouldFailOnInvalidPreviousHash() { + String validHashChain = + "4145ab557706b5050584d6888af7b390e5350f4edad296bd7a582aa51732" + + "aac7f49a4ec44dd361027945ade0de8b8cf607fb7b7d11f17b0560d44b965c358eaa"; + try { + verifier.run(new String[]{MESSAGE_ARCHIVE_1_FILENAME, validHashChain}); + Assertions.fail(); + } catch (Exception e) { + Assertions.assertTrue(e instanceof MessageArchiveExtractor.InvalidLogArchiveException); + } + } +} diff --git a/src/addons/messagelog/messagelog-archive-verifier/src/test/resources/message-archive-0.zip b/src/addons/messagelog/messagelog-archive-verifier/src/test/resources/message-archive-0.zip new file mode 100644 index 0000000000000000000000000000000000000000..ddd17afb9984770343e44bddf390f83cb345669e GIT binary patch literal 9895 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 NK+$t$8?=AQ`#-Ta$<_b> literal 0 HcmV?d00001 diff --git a/src/addons/messagelog/messagelog-archive-verifier/src/test/resources/message-archive-1.zip b/src/addons/messagelog/messagelog-archive-verifier/src/test/resources/message-archive-1.zip new file mode 100644 index 0000000000000000000000000000000000000000..916080f0a15798ef066c51737e92aa5b6ea2b46b GIT binary patch literal 251479 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�o$%-6)a+H8+(TS)13E1G_-R z$UND!?jp^KrHjZ*Bc<4I-^GcPQ>)8SK@e2}5LLPpBV6}}P>237Mh1TvqmErb>k2?= z`ll4V(QxP{^yU#t&XJVXL3Fny^x+kgNvN^#4HE`T+8c=soMp|p(Tai~p(Q+H63;18 z1_J;$V>H)#Q5OG{S0k_#YYYb!T>~M8fB;SLZTumILk)Uj75ZI9TlX@RO3nfLv|*y& znf*jwC|3Wer7J(VgpNvH7$pN0GCZG>FAfRc~w2O1u4XL#9BpA9uF6twtz@ zYZiya3`uFCQn!xl;?-@D^o5J}Ry%25C6&|JtNUJUU}V_OvXWl?b2iU3QlKi;KNO=0 zwD0TXWv>`1M_eC@QPE$Dkzv~(#VG49#VFEn+_3E&EU7ac5wTJy!;`;d_cU#Wr zL1RmRY`H)v0%Ni2&+oez(QLQ|A05b9p#!8a;H2E%=`N%Z9^TTFg~(e07ONlN#V^Sd zz^Hw}^7$in-WI6%X1?Ve$k^X3FlDA&&}^gb|_Y04^ju zX=Un;t1%Wn-NC7(>~V;l1>Lu0H8z%92%W69XPlBE`bkMU$**ulLKaIP*`FMOrU4Nz z403%Z>nb|gSzMb5ec|g5BMkaWNqOqws`(WK9E3-C!QORSOO!3X@-G!Up-XD# zZl=sGk4(q??N0TGGQ324ReQc>L{S5={T^0jzx0X#aBKv0$O+q};W7$ThEx~7P!u>; zmmd6ntu-bN&V^^S)T>R4qRBExDdZu#f`KRwaFUG2&SocoxCx6|pJprmuMVa2)amU7~A%<{4&YjB~2k|Us{3CKCu+8Ygx$dJ4$hJaImVu4gv9ANVXJ z7*9uSL}i>Fzst-#w(k?2Z~i1Capeh7&Ti9&|HWG<%U`YRH%4tAW~W~7rmMOmD`r_q zwqO8o6E}>~(D(iP2e<~DxU1#-P@O=o_k*hNPu^pej;5^vByKW+jVN6w*p^w!c29Ff z9HG7yED=g=8r+CwsEkp|1te*nso@Q!V{W;+xAHf!XU^9Eq;y26nz?V9;N3?lyQ)vLXr3z0GEeQ#hqhnpD`;^Qeem5z zWO>}NTaN61f@WsQG2KDD`CGk5bGLfvW&W@(c=UsiYUG|Yy$<*4uxi4|6MjIRTbrSe zh$E#wsXxC$*WtCSTEW@fIt(i6^6G%a&G;?T^8T2=CF;Z5c#uTO*`!x%M()Y!cc0GOYip5 zg=hwNDh-78`Aug6?#ioa_C0>;eELe6a^piWVjVU{<4SrGRedKMxMx0Ne+(=bh+^%0 z(oc9deY=$QZcSJ*UVL{1PugUcY)8MZzep@SS8U_#&s2Xz8o?cFD1OTp#nWbOCB3ngjv#1B}i2xTXp}A7_I$J z#0d0O*@L}FS6jCSoTzG7V^k@iNK8_Rq<=pjx&?H`!w!)TYXSYz@4P9apnvyheO zQD>l9>NRGzWwvD5F9y_tP^+cGnNZ=NaA*v}CIzUXYlkryOnHnP-&)*|lU`r}Cwm+> zFe>epBx*QvEp2kE)ryYQL;}&pAUG6uxZ;Uf1hQ!WetmI)5!Y#FJv8mZzG@%0e8U=q zD!vu5&e9OwjVnQc$*XJs5!`gG_??m|jeL0F*Ew!w7`HE%v@jSQcBJ&0qJ+L35OD5V z^nskjaj>xogfP)w-*@1%<_@|SLsoH@tX(VUD9Xc(K>kj}5-!Hp@6x-zvUOU?%tD|9 zyk8bt3X`V7M|OjYM?=0A9E@Yx$VuKQEUL#V7_NH;ycS;l<}{v8=#?)m`PK~*GJ-^f zE}ZrQ%-iT*NHbi&Fl(+(6&x2R1xvXH#<4{%AXu3$2FvJGa>t6;HJW2# zeD#z+{g6(Pc&Qo@2~N-)u#1+%%I62p+SA32R866};hI!Hi*U>4kSUL&u^|AiKMW(B z55p)TrDwwA2W0mv$d|tvMxwoc3?mrZDqv41>r+iH>YvAL!kW2U-=&n1?^z7#{$UtR zo}PUeMiYMwquvo7LYbr2mp_Kl-jmn;n;XMdua@`zXSXsz3ybb~xH$Yr)Hrzz4sAg?hXDW2RQ71 zFV;FsV_FzOhI6k^eEFI4rBk&GVEf1MIBCHCs*wz3Noa{Qb1gjLR8Y+*Jayuk62jFa zcXYr5kBX&^1BI|EI-lt;zNVUF*NyEpIvqFbX%I85-EYgq00L1z2*mgANMxv-F;c-Lcuc$QI)90(uCf;HJA)XE=a%=|K}mJUzBjYlG!f1uX+YhC z4owfW`;ptt%DRO|5Pg zMq3@?clFi~#R=GcODx(4FkoTPj8)=PkW1t2KeBb4jF3@eG^N(g53>s?OY5tsnDeWC znfdm6+`#$d10y!TN$6;a=__g~| z7YZcb>`*qk7MLgSlk`lp)G&Hu zt^bz?Wz|mk2GUrCx?3^Uo)B^`_F&l5BUw$>#jkD1LGI`Uw)@Rzbs{z$R$`6jm>a*o zI4@pO;F_OCj2)}yn~rS~pPa2q`4+2xxm^C{Mv=E~tS$TgCT&Gm{YU91_a0*S}aWC;VMnw+){_d?%fXU|I_@FC>U zH~&f96?(8f-$>__QI_;ehAgbu+IVZuR?`F7gH-vtDSq99oBCk4*j(Qqco#%hWoth+ z=l>t}-U7CcEnBxX+liSuhM1X|nVFfH*^Zf+A%>VaW@cuL?Ue2A~5Z9$Wnb`Aj~JT7q_4BvDvp%Q%nfY zWzsaH+8;6oDxStrERh0+=yqB!=<2vsXGMFE_EE{tR45y!ow(z4ynu;@KWv-?F?A=+ zL(@9>7V1Kw)Kq1omv%cb@fc3(j7i23<5~xhWXBboOMh?NAEqbLt03c~ik`BU+E$3; zCR+BubqHr{D8FmRq{)j9rm0PE5ul!Wc^v@JicpNt);cJ;;2hUw^N$4`q`FHyaFa8D z+ARYuf?hMlVxAX5T>L`&>1xcgJHcmax^puMj{xYNvJU7KS`74=Sq9jL+u-TZ-$Pf_ z{_GX5zWim;hw}c>=l4ZSepaa_K!VZ#9*nPFdD$VC55a3vRc&V~+!rKHNlKy_%1w|T zWnJWJmyx}k3BtvZYJ$~Rp^G7la>+N=!gNQOtkc8h_Vx1k5i}F9f~Nj+=I9bWoP2^F z`H0k(N9BYPgpYPm@hH7$iUK_=>)I;@3Z3*oVM!SHTI{}h(*_0-^Q=^wD8l7tKc}e- zj&KI6GsZq43Hawq?y=wOoj+N6$kFJl1jI(cyLBVRG`AMxOdyAS#N*49Llutw0i17- zrLrWRXc9W`y;JUziWG+&K1nMcBh>So{yN_$XHJv~N-`_@=&$_&)eKi#(q;b#CE0|__^j0iZYi!kJS{8VrIJG~0e;k5% zZHLVwx0iQG5)IP6o98y`clgF6%5NButbEE50U|zGzGz3B#`~DjA$p)67$l9phm3(D ze`~fZQ+?;6EwLiP@ReAa@s@L9DDt(u5B|~R@VUskI4di7Af+&ecNVjix^fHEXzO7oN%XWtl zKdEy63V(>_XihSrDj_~!aw?umIV=*x(lT^}z**MfIg@JYf?DGI;i!SwV~*n{BJ;aP z9)Hb#fDryXqgFjc`04|2YXRkBu)Pg=Tk)$v>ubac;|YfsZ#%CmIxp~VcbRf=H)BA8 z5k7$A1CV?Gk`F-g>1zLc%wROB1dx2mN*SLtw{Rn+2#WG@T}Eh>Eti#~juyJpwYLMU zfz_<0(q|pd1dX<$(Hd+IhVW*Q=2Y*mJ63fCI;P25QAi2Ibz$2!=N;P&M^r-gyl6H`(aCKbDzWf7_UP2f>)$$AkKg zeEt0sf%%6K{{KucD#rRlt^YuRkvh&F>izc;j82LErwK+jTPm7fq(DG!@7urTB!rKBT2!7dBN|gtyX<+Z+>>`)hezuH1%6)C54C}(3ll~88__gT^v#aoy?Z$E zef!so+P}R}_@n;tPp=Thm9-sn=}^4RD)kQX6oFAGzD>*Q3i8RL2whMMd^D%W2S)XI zu~?oxm1)#v{I=K@_r>9~d4DbNX!(R8XO51PtRHE7Rz1z1O-wNGb6956l5l#V81Qc( zpI}%8evYl}L5ql#vR9$zRaB!@gtd@?V8Z*? zjMo-E&rtBC;A2M!3>TTSZ0A#~ra!&8iRCxA$r1$k5s8ApBiLX|T8ShamHI|~@^>&A zoW+_ecQX2X_pz9+!Y{Lz$@N5Xlaf3Mf(Uig71DBS&3ag0QbC@+z0f7ihq!O zlC3r^n2ZZ|_Y> z_Yvb}@K$@|3UOverndCf9wpd-I3jJv%GwMkdRr(?>rbT~lMtu2*gT3`ZHFW93<)>2 zpO_4*`ImaLn*}1UzNCu!Whd=9RqaF#@_au*Xu;c>D}^4VhhdR_)mxr0*|%;5w@(ja zmR=G$cFo8^^eXRj{R_xv=E(&+ZYwS5Gcue_5*!ic*Zb?6DpuF}y;0ei1LI*15t5{y zGmXA&|F38(s?ddTM_I>bBNmM^v|^2q!F1J0btd}S%EFraP;E~o=4Rejf=8Mx#p+$5 z_!Ij%khvC|XxGjy4s7(9XDxA}5Z^w5&P#m2ZD&g9Xr=`3|E?Ycw}Cd;5zwHR7&R~> zl1}B1i{7xTthc~xB6!4^V$fH}&Z{}199NJ=x>JFF*q*y6tP`@JKfb#(LDgs}W)7uR zE4{{8`*ZzTs~=lqI2t-0tvO>W&3xEpAJK&}<<9vf;_j794H%s5HmX|b?z9KPZ0wbN zAe+ol?C_~5{&l_7UH-+TRc2lGEi1iN_qRWK!Lr*TfRGP>@zDY>J^;oC!1w?dpFKT$ zwO>HTAOPd56;rK4GM12UpCvygFfhn(`njUn{Jk3Wx+a>{hCeCD1QkfmdDrN+46Nq|TW z?6<+Hvz|(yqu#ce-5plNZH;x4WF&}{Z2A0Rc?`{~vR))E-PD*jhc zD7kS(mGzR>k8`Ef4!K)f0ysl4D=CACXgop{0LB+^uFFm&FF`cmgCX*`&K3|a#6{$R z9S^|x02m(t#`L7pE{$CmSPP8>$mm8A3c{>Ft_Y1Un@}YEuB);FK z_SvUput<}*v~XNa3n#?(eQiX@r+&!k^kNZ%jzDLnlExNXw(!Hr0my#`7>JyN{>i{d2Gp*a&Zf#J?fJOnBTJ6w+btvY@y4I<=GAT-#w?ds{8#=AzE_fFZ@IB8UGfN`=U%iQ zMHhF`u@cd*GCp;>`P{zFE|NBV=*aT&e_AUjyPomQ%*cHEsrwYap8R7c9<8W)a$$H9 z&%5$WbXbuWj4Hi)~K#28pNY9bKf+}+sD=8_D+fEuvFP6 z^T%Zdgfe2%mE(OH+L^h!5b*ab&Gu^R&8=2rWL3PipVOU|LTER-o?N`7+6kwTi;dD| z*l0ndXFAKt;!Df#Hi`m&?{YHA^+&6vt8H-zc-aKkQF1#+$Gmm5n_~vpfNR)Rc&(7s zCs~#oT!Rj_lCmFeoDY+~CL7UB{q{eNSAJ_m?_AMBzMHo^yH3{1(4LXCee`)YfaS@m zp6S8$eBpXxkg0*!E!261u75eO?9xfa8%(mlxaAeqH5IK4f8*h?IcibpZJ2hCOHz;R z?_}ND>6?qXJ#9_#K3q>NrF6VgMw^iJ_7~^u`Fa&r!zGEi%HEkk6(w=d=5(1$PG17e zR%Code}jzCn8u$sbHx*zvmWKr`DyaB;?Y~>vL;QVED@+YeH>l7^=YUcPxZQQHixn9 zYF)>h%jaoRfDv|v@O<75caSKd*y)>}HAJ0zlY9Py7p}b`@@4xG6n4 z4&u*u<3o-jb9R%jU~tGXW#eAtk)7>6aU2Ee58=_Z{x%gTc=AygY3AApjzU92c5kXM zC%aAg;1DMBdVL8X4Gc|Mg*F3Ryqqu3zgGL-o)@K3cxk=4(S5H27+OSPM{<|g5g%Pc zJ?3{>}<@qVy^7x>(=s`juzfCeB8xB!>N(~d{N|Kn-XI75{D1TiI73&uywbKbJ^UiEB$o#$?=>JIen;bZJ5nF;T$)as@8@k@ePMDE18&vEi*QNan+YfPW8*}9j@%UKQ4V62{bRENIV8kBpvIR#9w4N~e<{N+cI4dut@ z1~4p<8*A5(<{dg!oG`y`!nm2F1|d9iinYl7h7#im(l{*OM=C^CW~KwY%bBYrT#R1|s2}AP_~r zY+Ss0(iI)hXtuiimP+48S+mPj`FuOUMj?)nByV{gp%1wemaV#7K$RHO zRs7U7Wo?zf(MVBhHN_%0Q zN?(TU$(psy^m@}RMha?}1;?8+&qEYaRlwe2mxtIL5CF~`5jF2i@E%&pS^OO{M zD)cvK|BIas5Pgc4d??E<)zV8?2(snC^1mN-!6Mtg{O7&h4LJl6)`B_C%;DB=vR|T_YDcQHPeuzxhU&Ok+A#eWneuuWc{rD ztQoe`YbkT61^0#b!I$Il^#uCriCgJg*b}Voi(p4~i(vhYXTi3YmmiatlHRKX*s{d! z(K-o}ca)=gA1G$BCcY^>kc{hA!QcDu?oTudjyCT1vMQ!^{`gDDE9t*|y_C-MvB3Mm z%YB}{bH~Vq*T<}gKGO0WrIqj$ZmYS}%s85xsHYeWGQc_*yZ6=Q{S@RKIi3lPRx9iq zH5dC6tj106!$CW6hHLWGx;SawOs@;t(UuRl4Yy@m&!;9j3s>+|^z3~gu_ka={p%Ra zp@&=Fhm5jr*CDPcw)S7wr1LCI4I}TlJkDzV051Cb*I`z7XhEEMI-v_|*7coT^q)QN z`Bkf)2`RdC%HI4J)}+7f%)H}g4!4czWp#fD+V_%++FIT|m)7y-$5qO^Z%BXtm7ou^ zvHp6P9ONun$H`uLn_DFZ+k4gb0=PI^#Q}mS>n>N)I&G@BIJv(cwAFsN@t1R{&>}$veI38>4rY@ zvVxlZIBpEf!l1n7T>)ydzqQYEUB~;1feTFPO~RXXTQ|Q=R>&b8Koz(Z&HMhe$kh}i z{o)_}TspRqOuLz+Gayy;kSM_Ye1Eg7d+^NFQZQJk|K%Bu%&l-TUhNKat*KUBJOah0 z&CTn1t3MfgV$@w~F>$)4<1EH#4?|qL|LzqAYrl2{-VAnDhm9j$csJx)P}v)!vq)TJ zY%-jX5{PJmB*ojV08*VJnnZasMLxO1?-uvY9P`?8;`%|j{QHKg+kBtTu z<<0vKH1IzM1el&|_R8CWVj#8d?sxXBy|Q$O;wH)szM{`WCbgjsZZKZHZJ?RuOq42x znDkIdSa7nXqGrEJXz-?)3cGU!^0wNnJ&7EIkb5G7dyB^mdXF7ckYYsKwb-k&+oRoA zXBJ$vQNz{aqXl=jjQ`M4Q~L;6k9f;GfoJxaYo1j?Jehf#>J7BQ-RrUjg38B$O3EkX zYiKo}6z#7ODf3}d7AVqzCejngnSO1E=jI}Ld2G=2CHTtp51P7D*m!T$PIgkzF3;nM zI_-H6FT@cbc2|;LSL)Qbt}AgT&y$0_f6>}>2CR#1T#;~8mt&1bt)o4h7@oy*ttq9> zl5)yI6x+WQ@m~6%gO~BPR~u)MQJyVwyh5$@P}elO;}BgPc<&Lsd7KUUHb{Tdn75B9 zO12?&dg9Lf{$`Ck2m8a-!*i-ow|4kRV|4bVzN9fFYCeT^ot#Qjf8@Ib*MQ_vn{m?> zwm);s4GY&a!mn5g2VL1aehPpYx+c@OfKJ zJ}2m2G~|cXftJvpGv7j+53PO{>VS0DlyZ>_v!pan#VF@LxI4+ceTBJs8Ow$o7jvB~ zUcBS^oHd2HE9)hb+g$o2+MvcHekM{aM_JhHzS^zj>7(<;R`sO>&OL=$@$OqQo*#x@ zQ2B0NoQHqX(D(2qp1$ui-|Na)if7xOdSX&5lhiYTZTGQ?7?P{$oJC2~#5(8Ilw*&5 zF%ObO(vq#m5{_e1QZTr!zgbnC-qJiEMLI=|*3{=%VJ`h#U(1I(3yFVP*L1P5y}FJ`H0ZxADRzcN+@z7abBOoV5*4ZWBV21n-m0k_Kq1+5+5H3QB^d| zAZ(AH;XMm1v!okgND3;;pp(I2VUDwdI8?BXO~OX>DO^80Bz|0$O%7{lhs%%4588cPH#T6l z%OCvgV|=MUg!iB{lCTra2z-33oNn^y!KYRg5S8)g`&>9MPBaEHQ;ypGs#<;^43r0A zRxaHYFw=6q!hxrq5D>nRuN)nn%q1@0Yer9xuuFqy34K!F&nlK0dP|6EG7A<>~sUyl;#rRP}M8!hNffh zI>K^%qYwOTXcnhRY#6YFf|C)Gj-6sPAl*Q#gi@BdWK1ibmwAou{7A~v>E&=Ud-$0yyjGb8@489GJ@_1 z^P`jPoLOyho^$Z=a)MGWlu@<}v=xYwL3a(uM6oXP78KAwLh7+=#3k7W(j(ooX*FdK za$>Q=LC2|Jau8^-eMt7Pye!~#Kobus3rb1YX)-gYvcN6IR z2R5xbGX@|G+TA@!pcMaap>heWvC=e=7!HxbSTXeblB8>VNKjfm(mRSmPgySR}BgGMh34M-hFQG>jgo1r@Siqd6jqY`}?dx1dq$Ro2mz(|jT`|#| zVs~~`*mU^K*(b>@%rn)>Dxmy2Yy)kIli$pB!sf!C7N|4`fr}*+laSHm627PbT5W`pBCl zLdHcB!v!ec+wdL_kyw$92y z&^%NuIv7WRgW)3uIzf;n6wTdEe@IDK1aw493`_vk$O!|V`v&z1(dNQpN`_2b4FwHj zUj-03a5+PMC=^_9mm9xn^oK&KCgMVH%P*cBj&oCGogDN^A?RT2@}OIp9k2+&1ZCeX z5;2$IjOuklvX5IGENY2+Uqn)K55gyooKcD^_De7n!{eNijMSosaU>+}ehNItdBA0> zC0+G?l#?bykJWx0g4yde5(5nn2u%G-0hVg?sthKS5RV)!$O{QM-@VHrw#aWtfvEtR zzS$ePr~KSjA!?X62n7T&JhwX}KNDr3*oAiern6hxi1yemq5vLH`wOG&z=| zm6jMkA^$=JK~ltr81s6-Fn>IrD<7B;0X^N$sE!o2)L%Y$;j1UI3~2^fh^e2`6^2|L zm0|dRXa3^&FC&fQ=8_x+U@i*nc;~piU6g`5KDcH@w7gqJ+fbZ=>NdW|QJh83#_)Tz zP^@76T2rH6ptk)y=*q3^1WU?w#4hmR{MbWgN~fe68-_<0aB&bjp?a^%_av;}8l#;o zpTW&L{2Pfk$?)xv$G5L^hL1foh%nbY61&rAO(vu2IE4BQ__K< zw~F&M%ZNl3GNL(SqiqNrB6R)qYmJ5zoCF}S_&*PTcG%}4#`~89a*a0L^JU_QXZQ%i zNYQ-_iKlk*p5~vZDu#jbmL#=lO;vXKsul?$HO2u`DJlQ;p)JFtq@bE1Q1+`ls3RuZ z=g&_yUE7#rL=t&@qN;{KB=nkc`g64Ut_@0`Ecm^;BNlz@d&Wm8ANNs2xV-#*OQv?PNJD?-wrx-1B~#klb#o@m>& zz~_SqZNre(>2%1V)gdDlf;CVg-LNfxQueCp(VD?SQWMY)Y4wS;&MWfJ48QJG_N-gz;7W1#c{8EBu z)>;C+L-Q71)tIBRtR4NfK0ujYx$2mtUzmE2!K>+p2|1gLn+nv4a8X!jcL}BxC~IN3 zl_l^n#`*R7KKB73r%p?bOg?uEa@Zd?fp)Der5qWb`SbuMdL^K$=AemC-HqynmS&taHChE73nxcfxf4)@h=NJ`RdDut-YCJsGnQdUiD=39q zF-uBa*dWs^Y;-DSLAz%&Pv?>_*FbYDN2FGy>9q@oPm|q2 zOD)WgUJzv;Psono6hB+!b|;RM5_S=_F_sxV3Z-BSoLqKdT=18`s9b+#ON>78jZgJ_ z;hY|`ZgBm+gF5+ub|LLoKFx4XLwSMf2cFJ&-dl}kC*Gu`M$ z$Jg=|`z^J`LfQ9}R%z&;EJjm+YzCatl?S<|tr1@}VCL+-icmT0#S~jTYlsJUP)?I15xC%_(hsMg7XEKv8%px1DO|;Ly zf~V!RFztNd@kk1~nw>QL#f+iL&iyd>_PbP(!H_Jy?EOt5n+5Q{L6HAj0Y)C`G0PG) zdtctd{o(1p`Yr9z#AO=l+MyGlelKPXf9i-Bt;AC)(W04WKV60$^P=Mu7V*Z!L`=oh zO?-QlXquIQtdU3d^GsJ#gQbc*ZUs6e39?% zel{2~@&wiJp1Y)!5G9P!<@zL+8glu#0>*r2wgPr*7=8d4xySxj?`{)zrIo~m-gcw3 zKvNnpDVBy~%@9t^a5%)!+asvJ>)CrAlI^6C4ed;$tq%xZ^3!0%&U<`Og>1I0?A~BJxoAP(LAT9E|DwkV*#$!fSV2&%q3GDOoYw{jBi9*KcsC&@*wo57cJkgm+u9G-MU7yJSEwsu7QHe zPAt=%!82RupxaLoWY7EBgs0;Yi1EAk8Ap?%9&Y7j&c#<9a3P2?8Nd;G=6`rJqE+(z z8Sj9r*saC|WzJ@NyWH_6fXAlB!b)$x_ZNCLjb&vMO* z^9&S%%vD}}{*YTyH8u@y%3nvvKcC(>`wI{23}VEd6ktD?tQJvD;4B)jYxOEde>nhe z-8O^5PGUdXn7wwNUpO0GuCLeqtca-yy~<9!XfWJZov&;z!%zBicVJ6_=4q_C44S2> zZ_WI!E3);QX@2U?P#*mcitxH#LR6^FKL)->{fI*w^wPwWw*X1tcY0|>q^kuYrA);c zL($Jm+h#`HdfH1HZ(py*fK@bc3bZBoN|{|Y7-^tVq|C#GP!!M?9U7Ac^(;6A7LOwGvm(V%OZVj(yOZub8B5u9C3wPBnbqM(P-^(S#T9Qe}|mcjT%a)84Ip=aq>h>kIs8>p(+ z>FacoAKM}DLO-sA0oUpHZXvPyp5|!F9I@K8j$7Aj2e-jVpnIet1;ySG`;HH4CL10=t=11Z3P(^>3D$xFE9HbiJ)Cdx*`KO zIWG8Sdvz{IiFUm+PX@ClT(}@q90IYxt_!%BDW>hEoHss+&NRC8fOEgg$(N9RGy<$? z^J*T+>ZRp7F2c)Zh!11$*+n}*6`&P7Ese8lchiTbyLaL<)oUM8a9{Yw3}?X;#js+C zqn=hY{Q9*{?!O_Q?lEjFUvIeABw>IwD6-Wj5UGPEBM*e*ixb!^^_j8aY6~b*^SR?+ zF3;qltWn453pr2hRAhNwClAPj?`iVP*==LUFzL4KMg}cMP|=s-$*>@W@TFzSAE~H1 z2THU|cJF{9CTC3J_X`;%Wha>-&O5JjTBQpS;CzVw@_TlXl25ltt)ryCwP-h|jwS5R z56eshFU4|$8l8%%uY5bjBNwoyIoNJ#=I1vzkE4#)Bwk)MzA=-j4x<7-_pkfVLHDIm zn*E=su}2@&>$p>O&_jAH7jHGLI}d%R&etST;b&KA4{c?SC*99b8~VrVU^;v8BRzw= zCg}_W&Q;CcP=!17@V#G<@4uf`&a8jgaNbeBetnX!^?G|#bn-4^A12mf+mewjx=J!j zfv!1%|ELywtZeEyx{|w+OieOYi}JAq7G*aLhVvx9s^7XHsUOaDUNBxK{pM7IK*9Gp zKO63Wb#@P4wQYS$kns8i!$oAFKa>@qC*twaqk zDEvltxBWQlnpMVaw8YhoH`%R>EN1sTO$e%^+Ju@bY}4YBzLp#K~=Ge z5i6Nemn*Ostayt0Y8sd0@-4 zqCLL2AH6i((O4bQzSivSrqF@uEP;)Get+K4WRON^S3hSsqrGkGeLInRdtb>A8(oij zmLlEYZQ|+OcqsMJI`WylXCL4uT|d9RzYtMdU%%|U=Jf^=TXueudg_GVYF`R_9sXM!pVPPuYX*G{Q+H>8z)yg#1~R2p6R>hr~VE{DGSEF|RpFjI^{nEkgTy zUAM%1OXR14>|oY`+n!mBxs>9^Zs?-n=PoEi=CA(QY_!}nVtU9(hb@<9Zk>bv!*6lyJsNReorq-Gyx(|pBC|uHA0a; zhx|Y*w9tD3t)gZ6$RhvnX_)g{)@GE9@z}%f=|vktNS`fMt1)AGKr1WMnOo=BP~^R9 z_HtHN-_wi2xnXf`hsbiiso*ddiCT1_z&f?{N}{B2MIQg?MYVJuY91+2$DL+jQ&6X# zccv!jt&{w~kx;;uDD+!;(Sjf3C02Z^x%u==IOk4{%wN)rZascaFLG5S$C9x2xJIjPl-f9nz~%wwu>RbR9gLmqt_qtwjV+N1{( zm}D@?&T!R6iC~{HHZ+>mm0n?$Dyr*SiRc&j=8_-%1_5p1^M;?+27nIusIWK@ep(M?z{EE6X#sBN>?~8sjm?7k%~uVM`GWt7FOp1W`11GoqT~1YqKV()iv~t{7-bI)-~2PF6t*7U zuAjdkp}w)bJq|jS`&n5D%(YI$UZ+pQmWiQw=u7D*e?3`YBqA(FBNDtJnaMOxu<95t z932U-9Lp>~3Y)v~+{2i5E0dRGx<0~+=aGIkgeMdn?mX3R&0-Rp`?OlZ%Ds2zkzVf4 z2faABhWRvdXn*OR5j{x@gBKo{dLbH43|GHH(h^86;eXbD>v_iAGc>El7mqMxUV$r2 zIyMW|&f)AUYM;JlIopbfkoy&BE?gpgy$y!ZHa|hWIeSuvJO_~>@uxAa8Lon#1MqR4 zy)oaXQhUN2ToE$*PhcR+;>xjt`$=)(YtC(P)9{4T3C>C~s(-Re&!o`#O`4Y+bQJ=&Nu=wblUMJ zqA58&leHM+UmSr}RB)B<=Q=wM9#<-eWtc?wW~FQ{77@iC@lNzpfKg|$dcjEK44WVA z#W<;tWLmW|>%#&sGab_I*y}%TguSmdshPc+6(URSu}VzUezDippGNP&uXCb>cfVMP zOn-UsNG%MXHR9{H)$NM9M&R4Qg*u;3u1BHH%FAC1jyFPe3%odO9d4FHmcHPGG9$z%hksxH( zwOh6S(VdM=EA8YC!U)Qd8Xkj0jO5|ziLCNN7_e!Lo!YQ`8j#(NA z8_l;0j!SxxO~`tXPY9lrWudvrZiNTS5@7!-z9C-PBl*uXqGxu^IPvF6=CK#5qLNA*0c5iwJJBP(OyK z)(J%2mg3St`1VLog+fa=%Y^G7&22meOL&&zoIr~}-%7G}Qq>pFN>wp)a~9H*h;7^> z7t$~AmJ4lne+e-9k?=8-ETO~bKsnQ>zL+*P*>YcQ@Gk*IW`7MZS_Fx4OO;|tyg(wr zi?2(xp<82eB6E^1SvbIFbn-}_#1L2D=R|NrdO&N#ZDOWSGTXm_WEU8Z6Fkw75`cjJ z>CIItE+(hu#N-Ud`m=R3OckW)PL+yrlDQdj_zwX_9I})OG%8zgEy&{cj9MVtE z5pAwD5+7ouSuVJ?9cgV@#@g$iIP=3;4-w5G?z9@abz36?3H(7|9lKNUCG|5Dx!o92 z-b6GcNsFA!(y3GTlT<-r8W|z>)fWBa7&^}bt;8d1$3-RxP^TeuS7$eq@A?(W#vOIT z8Ex5JJ?h=&ncVWi`b(q#*&FMd!MHAk@>;a0sKonT$z7kRRgF!Xtakj7PjrTL9QqGPne zbjFr>51E3(f^aCI5EBn@3?4UM58?Dr8!Yu@Z>jL)iJ^LsP7ocMjK4BTe<#<4{hYE1 z1O#J7XB-gVb(iLC(@xFnW8HWK8(E6Lpc7`Ab$;+fS?ZZ7hSF5OMdh_%tOoG_80 z=noCZFbY0;tUs1rWVTGI zIG3W&%Ur$#ZA8@Uor68bTdbh5#9lcNnyM+U1aWL(w|Vx|ow0}rLsAJY{$3g-p3-0S zP&wV@Lkg>x6=u|RSx&EELh)6gaCC@C0~_Q&y-ipLWhv1`O| z__e5QKRx=3cJrU`8;blCvq>%OVZ^7qHuN|??hBS9vS3sj<8Ub~j_Eo}Yd5Njuo#rK zM0XIG5v1UaF;F3W)CjvI8|-D7aT-4O9HXP;V_5Jed3wSXGDA4Xg>)9+?&aPfYr@L(0wRSR{^&S8 z$DS;SIo41!iBFWN&wqjCMKfd=z3gB1YT5b5q+Oa0{%QP29dpG<7}8R>n(VwExG2c? zBL8ka@-RX(@Fvh0+)_DJ)-bfQwc-`CLTX}7zJ0w6`_3D(PqVX(-Vk%?;I|82OwaTh z{SyH90lhn;6C^!G3%5Zk!~c8YZ&{D&a&S8EU$Hx za{PGm6cGvMz@Rl61Ke5d@$GR~$B$J@z9BKutef?ygOFRh$`uL+L1*906>Ra_onmpM z!eb8Uv||xgyvPrP(Kyng>4a4{XV?P`LCoY8x!XRFT>9K-UKF$gL*MmP^d$zpT|;QS zGak4q!UVzTLJ(bST|>JP-bNAnVs2Z})dAH;1|4eTtosK0B)Ecl8)0KcCX82MqTFN8T*OnKD8jdJ_Te zgSuTVWu5PJrV8i9nmUzF>yrw zO>Oj@oZo|o{^a`m$GD(B>H~jMGXDLeO!Mc|q5npN(I2NKe|8`A(*C*FzrCh^9bweQ z@P`rp(^<_wj;{t8^-cd>jY#=EW5WE?_!b%eQ0qSsVHD2%hkF0L2qQe6|7nC#Ex3AK z1s@Pl$@})N#RdP&ePH~L?t?r&Er9y~;64Dj4*>21fcpU8J^;860Pcf#Ap*dC0B|1w z+y?;n0l<9#a328N2LSg0z);N}{;rmqJ?Z{y9%bee^HDe8~- z)aL7z8>!?G50)BWPgs5i2_)xVXrGw%w|DSV+8OJ^oS7kD6=veod`PzNM@0==l3cNGTr62t(G2w>>FnWt@7U0QW& zEgvTN&3&+bk^yrU^Iz%%>9lf?H2)zuT)bv!4|-MGzo`$brrGTu2|Wo#-yV=Ncf&C*!Ng6hnsD#s7rzuI4lm`?dfN*s@QONIZjMOH{x zv;2rT#kmy(!Jc6X@`6h#&RP&WE)tjD5|=0(sNW0+R5*NljKYLV%Ff1uf@1C}Er;#4 zZn4dDtv17%9uJBWFH_444fN>?jBa()1n0Dj0bGC}-fbI1$dO?>?_>JMrYNn}!U1l> zI`sM?V7Y&RZH+&^>_&Y~f+m%+%Z%3~$aMCc#sT7&uw zv-o5u4w|Ks>wSF4ogB1Oatp&A`Z4yhX|QTigxlK1$69dWKeW(}ORKtay48*2+@ePxB8i4{uj?H=w^+50HGy&B_4Q1IG+MH{r$j z*T&tkv(?5y_;JqPew;rxO#SPwpx@e`{-%WZmkm$Oaq{msU<~2)J4!LHWQA|oSW^c- zrN5=+%=9%<1fk`8y%qeS%Nsd^fsD7DdA2swusE?j#70*jOo%Ha1&t|XgDgAL#ZP{3 zj9sruD_z>(FqIk+^C79n6f4p|=5WA$ogYVUy^Bq`$0$1}wHQeCux|j;Kt)PH;H|F6 z)+*W9M5R48*;xO3H1xm>Az6;)x)vDCRVqc`*NY=KT&7jA)efDEu60IUZ9>jA)e za7t?V?w9Y#23QYxl=g|rTcH#q(8Rz-O@EwLsuF}ALe*cMWp{WtI*3$kB@aYEYV5+z zS;ctg_7J*J2isM7PcQI(p!Emu2`{Z#PR--FQb$a=I)L{uLf% ziv}HV9Ax&VHl2l#l>SyQj%EqG7O1zFZwr@kXZf1bX>HNoMthyFsi#wl&Q7(7XkhZ? zY?`I^JHhf~-yGD5e8t19PH^GF2m4*GNhM)&n=u;l{RCi<=ECiYr|6uW`zd zUry25DFN1lzdzRgzpx(sacc5^#d^^2AG99K{D-Xvf&X*s0p|bMdLSjRc3k{!JjnaE z)&sit`Hhf(tecy?3xlDfq`RY}n2f7}po21#{Qt+^T}RcmE$D&=f)m``-3h_n-Ccvb zyA#}9g1ZNIcY?dSySvlm*63U3oVxectFHHYboF3o>_3@VYwfjV&h=a0r$i^HY-S^` zs7h^XVB=t5XHRYT*EobdQndMhK6e6tAKSvj!oc3e+CWhO1OSjqpUFU+imZP?LW*i& zcx;MxNPI$^ntXIxoN82JR&u6nkm`3r0~mM+{(~U?`yv?b`}3cV|2qoA!obc>$H?GM z(HJA~vQEi#XaQ$0$T+9?LHkM(`9^Yex7Rh6lU3D2jP5h$JjMvruTO%&g432qGYya~ z?R(;@cSLkeRFk>QK=|lmeL`bZ;WYYjzo=3o!}DC3xG@qNzCadav?X_XY=bO7BBb*d zsB18RL;u9SJ$q`Ufi%Z#thO#bxhEsr!nlP0Gm)gYE{*j^#l~5Q(Pw`be zauH5?432|YKApbT-_bTie{WWoUO$BMOIq-EapSXB43W=3XKLYt;Vz6i$p=;QThiR$ zivt~C^tNakQh>kcX}1E}OVUpbOOhZDkbUFE%E}pFis5?%?vf6QyB}ht2;N;za>e;n zhwZd}%l$(NaS_}NvG8ECKNYxA7isad>l@0-edn81xh@4}9upWckS1jQY*sob{Rl5y zUO9khSrCCiIf-?gB5^u+$-=FI;R)hJ`tU1jjZb%0lOzHtoh%WK%4S#Z=>ZhxvQYp!6KeK zjMhJ|K<&ZJ3~uC)V>VOtwtra=u}YEG%YKDgAGP{@zL?YgR6l(WEaCl^@s9sXWlCxb zwo76$9%tn;`$7`Kz)L_p07UDJj$n>HJ#7f?pDNFu_}pK3vZ;ouJet{cA3Nc{Da{uB z9R69%LH_m-+1QWUmw6IX{Co+{`8^Vr_dwB8PDmR^()Y!WlgqwU{n1h@zBBPxmFx4b zIqnsj3$6@^jENf}iWN^|-%}kyisrE~er=qswsP)I9pfa@ylceLikN`wD1mg}{L<^B z$8jUe4?XYlIV7j1fZGc#dEtP0uv8qLX@Xa4jOJjQ)-w57z`1j}rI*egH7_xp!C69m zPJ4MbJjDk0uw6U1=D1%@ua+WkoZp7@?oQ^m=Gr|lq21d)mpoYwQkO7XEOV$Xd){QB zUEAz%!?`HbisGWStF4Zoq8NX^F{! z^{PpGDhky^TJ-Fm_MtPLJNKMlEVxa1p2F~y-)iRo5*&B1MB*q7DrYZsGPk0@fZQtMComtx%TlI{X?r8g=<2Ap9pF=3_C|)7A!x0I(c?pzV@EA~FXY zdrzStgt4s>N`&8*_APazdf0oFlF!?nm1Iq(;T;e)BBpXoXiF5r$gu!^`&T0pck|c2=~1Q z&f=SiqPQF!TtiBMLAuorQe9-r-o8O!z72vGRK(SakrU?s&}aAIGz4(QSfLM-iXnF& z%~5Z)!*d(N*Q)06;^bl1q_tdKxrA!o`%>D+sVjkC*PdHBFhk%j6v@?3{Yy3(91jHw zO7*$RxW#)&{!!`I=YrLm7u5^ScmeQM<_0mAHTbRAm9NUJ<)aEEYT!lkIp*N5OTx`` z=m5A;MUChw_I5%pjNHo9sG953;^%$#GEhZO0_>U2Cl8-*4p+3)q6&RU+-h#?SO+y;09l!ValI43Ro70B=99rQzF1i}v%LOuP5MS42iBpFLa8{LzbL#0t7cncO zQ~Dy{Ovf|YUjJ%f2&7;t+vhM4?1%(UsY&ROk16@AaEh-#G}QIegW# zl_aq)d?cobj=*Pa?9IP65vrxu-Xn>Yu!&-l!&e|WBcd82$lIXE?~=TK3k-IkCc(E3 z2#_Qf`LnDlJAEc-#yShi7Lu^Pu38NyaqpkOKVQI+-6Gvh!4{}1%j83#?(*pz8|E{1 zBAUu%7=XhYfOB}Z7G}gV3LzkYhlt9#4w!nNlqeZKWRJyzOV1_Uba@s~D2Y^5J6sV1`b>Q)PM5F*8J?O83~Y zUH?MNV)!F8bpoE>r&J5$%CH#?XK%k*)25Yi)=Xc_!!$EGe(P(324b*jl0K2W0G4C_ zSg%Fm;@(ccElgW=3O1dd)X||R#o}b2ByaN|FUrs6v70ss)T1a&5S&o(`@B`v<1A z1+$X?8}`r(^mvd65rmKUSYMMHf!nBBMv{UUk(M3rCuBZOfUynyY$*Jg^-vh>A|}z| zrsll>_G}8`T698qI5ih)alQowS02O-J4Y=0=ndnp2oe6l5KW!yx@D;fxC*fTgRB1sFc4TomSlBsYYLuDxI=_2UuOryWw#QJHFo+AL=STm*$ zB-i12@>52eK&}Mj*JO|PLADSME-9U7?R?(eD+FakHTfdeT;&(4E@pRBJ;;pJk4*E0 z5E>vhuq$f2NL)0>L+?C7+v<^yRNBlSwxEDrcjSi9f(%o7L2QDS-9yNWP!lC#!=|YE@<)>|pWJAX4UPzR49K#7)P zW86ceJ}gJ6AYh`ez{{uCAR7=j*)&(LxoR;PXP<(+MF1&gDS0?VRnkBvk3u*4G_?xM zQ`BqEPOTCEWTS*2W<%i@QkjQQCaBpa>1uq-bR@r_!IvqeNeG5Q?KuSI9`=9?igqlq12*N zwMGIEwdET&Q&hqyFvV#mJ`GZzpt0u*0uj2!j7Ff7yjp%~5(V!1_Etf7v^F1G%qj0s_qsgpngm4$S@l|pNpA*8!UtEX$kYHqnS%J~Ir zY`Mw$jrN;+7F@=RPU(F2(x7b{ss(I7^K9bFU)z*mf43>!y|*dN_J-$zw^?>lKSKa< zTj+dR^bBy!fZvATzf0u)p5fq?`nvk5oNz4rZtX7loRJ*02cl4%U82 z2Hm&f#pm6SJN72=`!Y-)CD_HDk#7}i?a_>y!5iE#huKep95Rz@23I*U zOm8&pi7#o7U6)p@H!x>Q2zSVNSq-2k7@f>BxZ7*PuM;Bc9=YCLDC1|M3Om70TQ8aJ zN-jcg;a$z&BeTz{aZgFVy*yr$T`^81C12k=7!QppZhCndPBfG5L#V!WlGS*grq@|D zKMVk~so?JCdhWJs&uPHMayWyR+-^h(T=*i?964P`RN&6emqyyYp1+qVt(A`ig6*3; zajzvf!`_bywy$h-o@~C!M8x`jW~f0jthU_Qbtr{`QdAv<)2V`^8@n&9heiKX}P zEUdW4d|!F#Gw+Vk)kxJ7DWTT}HZ>aMSsvz1jH;Dw(qud?vBW{61M~Kg$5wlITZ={f z+)RmfQxiq=9!mdQ{Mm)3LUd1XcA@GXyG(`xX#WkFuosBE(*~(^G$D(KUH8ftw=`bFY9at-EwLN#h zf$J`XJ>kO>zglH)P{k-p)*NC<&-h0QORK#Q{WP1H7)*q?z|u>lp5p`;&1REf=ODgF zT?$p9G1nYs%Xu)!FGEZ^S^qiH;L{YHR4M|>5V79Cv}%th9X@Z04N*s(0TY|G zTr}?@&ZFm0PnKp~p9owTFui^)trT#bjA8kcs8?Z0Q=F;qPN(GLZ6yXt9AtAcLaeiS zDs`|C?S9hk=#p%|EwLSeu?qO!{N1w@6I9x6oGq2%kDt@ag*;u{HdDK{>_vhsI=b|D z3?BMYdd@j_^P<5M^!pN%H1epLc(hcS`+XP+!)s_sBL6xr;%7r`qZnV%fBqSkz>lH;b+C`K0q!X;~Rv^K^;b(1x5s#)e%#KWQ#t;-&EQ#MY4i&y9zTg4`o{i zU_%LnrA{^xn`0mCi-O2I24&zg&&7`Hx#=&?Dl|D+0OnqOMdJ`~Y&JSp6WnW0#Q6y5 zx@s{$jVm0G05%`oOb=KyWq!GQJFBvEDmR~~?#p6rLw3M4W+lmY)*rIBK$Ax{DL7kg z#eBqCP#vIxPJ1=XF%bCzWy$~%ee$|;brzz3ee!IEJ5~$H5Dl1g#>T&C#l{~)71N)@ zbg!B_XD5wV(eNV*Sg}OHBSA9ef+S@Wim-*jEg(!#Y^W+J58|awh*)ks(ky6^(dLd5 zoRR#cA@Igi4qvp@sbKYbf9YoayFtF z0mTq~9b)p-d}Bj8IXvtyz$jVsFW`<*CMB=>$#M-76zm;4 zzI@e=ASB(c5AFW;gS6U?g+I5aB&He_M00iW%JK*JuRh`zL%ZVU6$o>o($&EiVt;2? zQT-(`DnQvfu#&Z09#JM&?(g&pDG`qQu}YFlTZXZDl2in#l(>7ELNpxCL^2%!mPk%? zF~Rs%l;mayKO%<`&hI;5B}PVoq*!LUO}*+;3ySm=AY>{i=QXpG%1I9jd!(uvNu#Cf zq{vG^)JT)Wh<=>W$FEyhI8;yU*yd=KmwLvr%ofRtsp(6U4YdJoL@gc>gflk-$4h61 zW~MN9$aqyU`D%(y@>%6#T<2j{$6Ari-oC&%2*;Ba2%7ufpm-N`hJf%|m2LI|{K^VO zLxnLP_+hEFiewopLYIFjKh+zq{#kh)&(zp1<|hmo^aL@IjCqG_FMGYNQ9{hLjeQeh zoKKc!%xywc!(+&qH2qI|QR!U`_PRxeha-GsrhU-_E2Bg3h6wF*Dk5w}johG_SU*bM zP2QF}udm~H5T3R1=i07X6kQe3rs?3zYkG3ym5tM97EGc}*hXu1Se8`izyx zIy8B$u(Tn3U!o=fvVn-G#|{Pba0;~Tw}AMF(h@C~ZCYc!MUe%wH_1#T#b)#eL^)m$ zR|(+K2^1zfjR1Jr`&dxurD9yRF;51Sa!G<${8;N$B<@_Sb2XgnjYZ2I9%!UZM4&)B zZmkXD>;%z%8Q>6m*jZY;ZD|U4CbD4T;11OaHJLgJxL&>L69z*nDYiD_?YU=+bhDUa z|7ujA+g1DuSSxvA5(j&uF11UL*T|syH5e&xKDDBGLHQGDiIDF~el+b+I*gGa6k1$G z;AP*;n5lMzNzjalN*dmmDTT|9K1i{pF5Q_-bnIA?7z^P|=Dg+G1WybL%C%rVnISEq zWah37{zuoPIQr^tM>Po4eACKJ8tyRTW>&T4(vVShT1OYsW*j$antDVNnLVUNk=Wer z8FaZXH%P`RQJQ+(ssJ-EIuyoguCz((fRvj9K5|k$c^;`qn+~BfUy;u(H2YB|#Tnx@ z_7KJ3a@Vd|Py*8%HDQ+#b|GtQnp=?w`Z@@dhKp zl18z=sOxH+Z^gJ@Zp&Z#RZ#S;k9k!dVBN_a@E-LC=($@u&~sbw?T!CUTiqttGqx%A z(~KA8{iE0KRj?C9@u-H6E~WoDp0HPO$u^q@&f|BN5MtXWUMDILSo8b7gJL^1SV zZ(+&Fee|WtkHl!AVOc`@f|cV)S6o4zRMtZpEUyi>?YdBV$csC_-e!^$c)Iw=aHD(b z(DTN1U%l!biyp}PCBRG)paaF|-QaBj^=d)32)ler*dEu(kF+C<*8BCnm4%WV*~h?s zzcNa^fOR4EvIRK4uj3ON4H9cv0;tuEh7nCjea{h4Oh>k9g8E@68VJ8M&3q_w57znNg}pUu9{_?M;2-c6Fu)J*~9K^@sQfU3mxPcOT~EM93Nw8@-YhcrWEomPTPV~ zKP9Cexm9q}(fUU_Jt=YihS*XsCZuC^%qF}~v`lcZ=@V^A3Q2`l^=SGokg_>#F6T~% zdx?TDK(W*Pa-Uu%`a!b>ay?3lXs#Pu(J&Tkrjpzel1W--U<`hgFh#{4_CH7&nMEGT z^L^^0lSlM6rKa+a*zjPXA1iL3D0?Hg^L0#{i#!`!>HS+@TdR+mN%;pU{2+yFI~(@i zygmNF;ddm)Jbk$;G!bsQnZDOFFwEJX2O>oM%8NK5?du>GP;k0<6Io~6hl-*?4j6%| zWtw2Y61r8d%=Zt3q=5x{{Q#voau7j+5jwU=m5JtEImb{uh(}Dq6{5bM*(ETFsUCUE z)OX|8H@i63z~=5YyTk}vQF>NMX`3-8PD$0b$>=#LoRxDkZ&^)3m9VF5n`QhgS+!@v zD(aM`OCaSwldrwrQu{iLRS=9DqLqBVV7EMa%H47U_WK+2k3skU{5s=rf&X^{`j12E zYZcvC;*L-<&Qd}_zX+WUi&!@1wsrR43>uI{i_=u1?=TodS%02P7>?VhvDNAF}%zPX$I$vOCdiFB*V8lK4^jhiJe$#fQcBFb{#Y<(63|acC zP7jLC8?9e2D-<842>^IqfE?VH@2T>{d&?Ra98U+%4ubfi7cu-39LFw;4=W_SFb@C^ z{`ERIfNcO#8_st^Dx;SX+WekSavGYlUunHlxY#3-t7ZcC(G))vO3Y>v%g z?KUKw!|D(r4vYr=gBI|6$y6fRZqe2hO#JrM*>U*##sbUB0RkVS(BXp=evrZsQusj% zh5MQ2S7Cg^KS&`#I;s}}_!8q8Cbusq^-p_=$Eaf5Jw!I&0kI|{SuS?<+@!?X=uTA^ zS)Hg>8{5dv;NUN*f;V#cj@Db{82+OtCFwUbZS}~t!*rJtc6^WD+`9bXDj&nx)8~>o z$eI1cQjh8*PB8CTnWkCtDEJqn!=H|f9VGsYC zMM|iDteyI&_Z9th+p+_q$3?&a04m-$>(9kg{aAn4wtxH^RYn}-oksxxfWQBfcz>}p ziT|rbN&q4SA;+Wu0DJGxfBtj%zeEa+{z?kBNijc2;Rh-FAcY^K@Pib7kirjA_(2Lk zNZ|)5{2+xNr0|0jevrZsQusj%KS<#RDf}RXAEfYu6n>DxkBCCcKV8ijQPi|c=0Wlp zE4S{~%coh>B_YZo3&Jhr;c-{j0YTzbh1;1!jb+SFW0XvF%zx@zZQfh9J6+v5-KYpQ zb&K1i3l{V#jun9JwcPZtq(z9#f0o2EW$~>9%X#O6HUdAK8`_&f={=TwS)zc@`f4GG z`Uv3l7j99!v&jxYkUZlFJV|z(DMMA~R!UOU8@1>syJ(Z}{ zri-u{LtK#^`EhkEfE(~`&ZtFaJ zA4~P4cFl#!D+muQ=9Go>+>rY}em_SH0m;EiyUWlWi{}zHHlZDf;UZ$41^+^$kk;7o z6t|`)3UfxZmy#Ui~Q#pC$5E6UF9$g|t~N9rs(&7vsptFNzUEjRQ-XV`(9q z*v>8G_^*b>gqP8 zZ=&Lc=rkhq91Aivge^A;N(Oq!#Evrc=k>Fru^~*?Yr-oJy(BlmJlLIHrmk{Qtq@A)cK73u1nOVK)!z6*O_NWN_StqU7P;G9UKRMq@zQopQ23#VA zPOVPa^DT$mdxvMQx$F3Bp~HOzba#xuQ;QKPOo`>SgTpyJPldm=@yMkNsY}*9Q>6g+ z3{`eVN%fJDhR00e!4ZBuO#=J0g4vR!rU}5#h1!^PO(B0bF5%Iba_P;SY+l^*6F03b znp&0P#6tWiQ;)^3qy%C)wStgC%4n}wTv4lvtmMxyF9Gqks9lD%%ho2;Eehb zl(l$NiCr4TDX+c!6W`I@PcYFOMrN56V|j0|e$frd`yI{5i#}VKY8897Ywn#Dyp6rg zIQ?6Mz5@_i@9MVOW3l6;L%k%EzZ6 z-!NFmIF**S4$5-K*B5|H zEye#q4xEQi0WIT=6v#m2f*W4M>j`}44xr8Yyxkg!R74R_PsC3E*;^t^gb2|JB&@RE zPegmToz)`+Pt{gCWeZ0EcO!|kTwjG-GYl?mRCMS(vo z*wS^yTKgT>_UFfc2ygrApa1{b6aH~(@_)n=-u-X%gh>CJJz?*E-4m+)mp$PL2n^7{ zyCvNIm!6RR{k;5Nh$ytPwz9M{pf>&kD5QSR8wB*E`abo~vEqNoDE$35|A#XQfBzTn z>oiWu@3(&5DLe1$MN*L^Pv>mk^O{P8L!d2fhgTr>cF-J`g*@D7$`W)sFYXp`ZKS#F z4Qm(%%nBla?jX~h%1LjR*HrT0GTINfJ{>00KkIRcV zHw>tcZ-kRY#6KOuw{N8APHl=7Tlj2&3wP``R)}-Q3EXE?l1xoO2q>U19 zW8&;1o+Bm_OiLCEQi3pmG?3uH7uP3OrAjfhmemZ{fHn^!Nl0FM0MbTPbi764q2^6W zk^;Us*pJ~rtTZZUerjS(a`g$daq_2UM0>CjtlSzgl2E|?t)QqyAshoq;tAh zXr(YsvDjsT$=VobrTr(u#|-c z!$fz47R`k>^Mh+pfo`*p2xBFar2*>=%@OB(3;l>mijG>^%)s&`s(dUWlPY7#Ha)0&(BhL&alaL zypNCc5S&6^T;aatYh=0pUB)bRlMK82CML1}5^lc`y(H3l# zUGDWLxWD0#AKbBBXj_4n;6}?NAk-ThW|4ip!nKR$4%b=AQ+(L@bPe%*j+EeuoNMsB z<7;4xdjTu0c^3aYQQ6>rhhNp>{yiwMmF9*!qu={$7$Z%qr*ZeGNxXt%#+kS_7m6RLeYWD4y0>wvhq#ukh&97@U=8EUPB5yf*=C!!|w08jGNGRDUj{82}YA^)KTn6c|<|<$x;Qcyj}qD z-=6B(6u)-MU|Bp~?ntkvHMMifYkj&b?*n^0*Izw6rxiPo6!tH)Pz?s$dySPoW#+rrnEuP#od;FrhSp96H&Tl4D5frP z{LoK|+{gd%!5$c8XV1%VWAHS_(pxDW`wb(d=Cf=#Nl#qkiRY{I_I zL-;~0ZzXqcZx+7rlTw6A!wDSFY~w0RzE*9$H+BOziJq;dv#J9*u$Uv^O6pMKIsHw@ zhDm%{WP`L84#HCQ^-M*BSUxKTskBW?n$4hdJv~jefN{EXS21Uj@_`Di27vyZ9Iycb@YsYfwQR$1zCuB^gLj96sq1NW9bzx!5%dBQAn?x3^-zSe+YWzb+&@ohAZmea!%TLd+hF|yX7>xsBbN+Pp_eEbJjIl?k|J15I~qTjFKo~5>h~deL%hR zxe~pqvHIlF5_p29*uo6cf|E_bvl@M~jOl4GEjm>R0uUS!s#Mt0o86v)0bx+X20#US zT-hVf@%BY3b>vmCD(t7FJ|d%x25Hg^WEBj=6@JtQGd;0mG3WuC8WUV$WjVdD!Aw@P zfRgmdy!5;ApBo`sM4{M4l}!@LjwN-;tn$8(F@EvP6E)|Uf^u;-c9LXZ$HhS)PD}l9 zueuhE|Ed2A-nnIDE)?R^2n>VzSL3K*ksxEpFU?Vp{4oZTN#-F@=3=0gULuV6P9b_s z@gh+L;Q`EkP+i8y80?`$vfp({F55hbO1}1C5IUUnF3*SI^CWW0G|4Z~QSi@HwEpr5 z?13`SG{5*sR}d;3Hsj(WIG`19bH7yYxPD}iLc>yRbhUJfg~PDSFFhZWgKr+U+wvWC zYEM(InVM#=&vQV+L;{-8R;+3_#!6R|aw^ORrf>-Qp{T*4eAJ{-r&ZiM%@At1VaZj< zH6F`_&Q(n?I=@|%wF|uFLYJ_npjT%}!7VPiBNtWEixJ2WWnCXXHZ6(3T*0O#pU+)6 zqug$^jv;E=!q)=PE7B&)?g@=43+NKo$syVnNxe%b#GmsSd&688rN@8%1pOD ziKg=i3ucKXlxFp{+5*B?ZCLSFKGsizfFF?1UIysvCpld|hAvzwP*LC@qFM50E0d;G zc&t9zN7anJ^_Mh_SN;*`$62@E0b(LniV2MF?@ELtr7$udRiQIIU)5vTJ?<*IuLr_K zL}5({I&KSeDX;OVDXw;P&nv=8Wrq3m6K!o z&>-_N9w0l76cAQ#v+vcBmKL>FbEjt4RW_6MKkd4f0z5^Ab!R~0L@;ha!k?Dqd>%9` z@52!-cL_FA?Dt%%;?aQWWLawCiBvyXf`uXT#_%oIL`*m?Hv8qPd0$5L&k<#AuM$V= z2slJ+=cjmF$MnfU7@Bb^S)ZUuF=n(Z!9%&^C8Ev1l41t)<4HyqIus33@DZ=;>lM(C&x|&PpL1ASDwWEHivWJ2R=o4vCoJ~r2Ca60;=2axT*{z?o`zUr#P=wd zc@o1dDtV3Sm(AP491SnqFv;&soI5Jm+mC;|)CWAv__AXQ{qlO0F=oA4&Gd7{&0ZaT z>@NRg;ChkeSbMP!72v$XVUX8XOT;5LhA-QQm#)g`wMNaZ;WYYZc>*ht1P;?1>F}CjP;0B2ab?G zVvkjgz6@zpFC#&d3|AvT7C~?K#$02bWL7*F)WxS@TaGppan23xtKrA^KIdkRmN$)9 zWjP;B_!8K!z|{%O=WD&*sOMbb4X$F)slD1h7Ak9<>z6gB8(#(|yp^e(1&7=??NFbb zU871lmliQ!wiP)W#|3U8)R}>5t9oU6eR&cl{9c~~^s36&jw%~p@G1%3bvbIA_=*|8 z40R^D=ETh@)$w?<<4ZuNZ**`OSkABRSvI+Tg)M8v&6_cPgX_b4w0Dd6d^jRaLbvhA zQ*eU~<)vxHDRy;EUc6Y~@&09HI$yTdi*3$b+Nh4Z^L#J@ywR==3NJlQdhhkVHI(O) zL7qn&o`R)sSr`SNAo}R6gNEIsr9+FTD9KH!c$1rW-_nEC&yK$U&tv2w6jvuCkYmzY z*5UI|+tZ4iPBRfu4OGBQOxRf+lQ6$bm5(1tdvc|^3cE|H-#z8cAv*|WX`hujm7H0q zC}%t`sU>D~!8zlgPe*Eav_u*m; zdubeT+qr9Ro%YUgb9%M_&DPgH!&XOG0p;E_wRXRjYiaJ?AvVquSZ74IyW>Q}l&Nensx%{KOJ)LtO0Y-D|?I*4Z-;Y%rBgKEu?072Uq4H%z3INBMvP z-ZiP~hVV;jm(TKyn#;g`5Ym)Wj8HYA#T?UmZGG;bqV5?`S~17%*3YB+a9aE8(Kcj| zKQc?yJtT#{AVY@3D$$gteseO~2q#uabyQeeOP{EQ1N{YLw&+3JdP~kUC-^`N)42Mk z7(8ox?74;?=Q5YhgG)XwV!TE4&zT2wE&ADb*3-*YRd9e*5nTal%-g{n>#>rd+Eh)m z{VOtdmG}5W8l?m2hXhbZb^WMurJ=jzDSYH_A)stw=hPukI6_SOr(s{&wo`YysGLj? zkBiKRl@*EcUur}l9x23C$%4)O1S~25owiwtnBU_QVWCc=e#a-e5l9y<9;Er(Qpbmv z#mvPm-XGHJhE@A;SxDakoHHVyc-O4WDQXVZ4nVAvSUd@Y%Bk^lXiAb1 z&`Z}*SsNYqoRc~uRcnkaqhX*-a$dJqDE{pF=3I*vik?M5%}g2fIpVp7buB^-Ua~>q zb72?O{1)2E4{T2bMDx$=p|*o1fz(mB@i_Kd5=}^|ArA4fEciAy-U6IflaBRSs$qqf zI^c>m9CKebd;wxN#2WZ)m?@&S&_x7(r7WS5(sRtB^$l@B(eeY- z;GsZMgC8=1#i>x#;8kwd5L4<<1-0Q2*UW!n2%Y>kphQs{w(|<9{A^?A4`s9`pt2dr zs_gBD{i%#FVSYlfdA>I!Sbx{Qj>kO_I~4CGCl5={<)GY6xB6zxA>h=MtN%K<8~WN6 zobR}1#d_`=mZ}gs9P>dR(s*Pw@%eda<;JN7%bvP#lSn0P((m}hLGvOpxQ0`)skp#0 zqcxLRyHS1U#;$L-Fv3N5{LrpdBEd($;}b;{o=={S&ct@;Ef-=9?kvirgG z{;ImOc4JXNH7Ze`6)7c~r$`pu^CS!Wk+s*k#EB6~jTVOKb1%kaMH#PiU_>)WUN?OE zWiBJRe%{4`4lL^F-wghGPPeL6gfrfF^vvvQaWru*{BQ`u7%vn-HE zCn$PeI*;{hlrT&p9E1qsd)RI=uYH$<-2tjOzAG|5Jj9`BipTqpRw!9y^08Cs(~G!uS<1qhh_00V55_{q|k2x%JU z?7b_U?cQfcM^&slWXlM{pcoKIN2eHLGP*BTfx-6Jd`y-w?{&;d+YGMZN;p)?BIgqd zHpkN_vdF7TFT0R&3VPRwKX__)4xhLzYR%l{&8y5}Maa&`16@*NLjiC^KGS{2961}Y z*Bv&j(60Cb2g2(&>6DB`7^W)AW23XSGGDgmhU}t>OF(zE_ei}Z#K(!?O4!A2> zU1I_7szy zzHP_FeTrq!)(%>s=bffGDN42arKFwzjWc%>l$~PmL;x3H3>xyg@3yay2xFsA%(cGA zqIhIh1xzv$`OmtT&MQ0#epQ;;pM;{o>>4oaG>K1X-Fb5sfy!|d&{H)T>35ps6zL5i zH3^dof<}r4Dk2sDq9Bt>>z}JCVWwz>?D5HEPp^VbD^^82azznTFBn@<@(gXJiLgB# ztfC8fVlj3QzIf|mo8g4`WfpS43_JSM*~XSx;JX=L_#IrG^SJdpPE2XQURrn>;BjIB z{34x~9ZO*3!_*iW-|)EF|2LFFQIE5p0M8DxtQ_ z>#~JTT1xxN%x}(E0UMuk>Z|D(F-0HCrtVxOGVUaa5|%OwQ{LoloedT?`zN3c7T)_Z*74n@sHQyNy*Zbz0QF$umem?`t|3=t6-)nW>p59Z;%?PgNP z!3lbE@~@C(AAPjTlZqqEbjlJ=9qa-Sa!VyU^PUTLyw<}SctKL{S=32j6s@7w@rCIX ziOkGeXtu0lN#ULHpBud`XsVm5vnD`TK_N;rrXJ~7n#&Tz27wP;i?Ajd{V{kIj@@5bh#@b7am?BkUy=yH$*qThav~zYNSb6M7I&?? znoGnak)wr~c6<39zh?06YS&zsJ8w|~19%3aczXew0JQ%i?>O7D)XvB{A96ok!7Z4r z)qZLBEr0u48dTi(M)~3Q{KOu-e|3BN@6?0$c!Pgh$ozX{%ppqFtcwor*V+@gm^)Gm zlc{oEQGYR+W4DRoy!vbaQI4b#;?hBZwjVyG`JKJ>+tW)!s8NQ)PF>9epXg_xF)*5V ze+qwnG_1=VJfJcrfrMPS7+vcuj9~=Q1Pn=Kfh%DtzhzmEvM{&#QhIN-3c&iQx>93y&*6y;nzca}!o~%0An_}NN+qmR}3zN6x@NPEL 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 literal 0 HcmV?d00001 diff --git a/src/packages/src/xroad/redhat/SPECS/xroad-addon-messagelog.spec b/src/packages/src/xroad/redhat/SPECS/xroad-addon-messagelog.spec index afc0943e73..1422538add 100644 --- a/src/packages/src/xroad/redhat/SPECS/xroad-addon-messagelog.spec +++ b/src/packages/src/xroad/redhat/SPECS/xroad-addon-messagelog.spec @@ -48,8 +48,8 @@ cp -p %{srcdir}/common/addon/proxy/messagelog-archiver.conf %{buildroot}/etc/xro cp -p %{srcdir}/../../../addons/messagelog/messagelog-archiver/build/libs/messagelog-archiver.jar %{buildroot}/usr/share/xroad/jlib/addon/proxy/ cp -p %{srcdir}/../../../addons/messagelog/messagelog-archiver/scripts/archive-http-transporter.sh %{buildroot}/usr/share/xroad/scripts cp -p %{srcdir}/../../../addons/messagelog/messagelog-archiver/scripts/demo-upload.pl %{buildroot}/usr/share/doc/xroad-addon-messagelog/archive-server/ -cp -p %{srcdir}/../../../../doc/archive-hashchain-verifier.rb %{buildroot}/usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/ -cp -p %{srcdir}/../../../../doc/archive-hashchain-verifier.README %{buildroot}/usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/README +cp -p %{srcdir}/../../../addons/messagelog/messagelog-archive-verifier/build/libs/messagelog-archive-verifier.jar %{buildroot}/usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/ +cp -p %{srcdir}/../../../addons/messagelog/messagelog-archive-verifier/README.md %{buildroot}/usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/ cp -p %{srcdir}/../../../asicverifier/build/libs/asicverifier.jar %{buildroot}/usr/share/xroad/jlib/ cp -p %{srcdir}/../../../LICENSE.txt %{buildroot}/usr/share/doc/%{name}/ cp -p %{srcdir}/../../../3RD-PARTY-NOTICES.txt %{buildroot}/usr/share/doc/%{name}/ @@ -65,8 +65,8 @@ rm -rf %{buildroot} %config /etc/xroad/services/messagelog-archiver.conf %defattr(-,root,root,-) %{_unitdir}/%{name}.service -/usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/README -/usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/archive-hashchain-verifier.rb +/usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/README.md +/usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/messagelog-archive-verifier.jar /usr/share/doc/xroad-addon-messagelog/archive-server/demo-upload.pl /usr/share/xroad/db/messagelog-changelog.xml /usr/share/xroad/db/messagelog diff --git a/src/packages/src/xroad/ubuntu/generic/xroad-addon-messagelog.install b/src/packages/src/xroad/ubuntu/generic/xroad-addon-messagelog.install index f14973aa66..ec0e8016c0 100644 --- a/src/packages/src/xroad/ubuntu/generic/xroad-addon-messagelog.install +++ b/src/packages/src/xroad/ubuntu/generic/xroad-addon-messagelog.install @@ -13,8 +13,8 @@ ../../../../src/xroad/common/addon/proxy/setup_messagelog_db.sh usr/share/xroad/scripts/ ../../../../../addons/messagelog/messagelog-archiver/scripts/demo-upload.pl usr/share/doc/xroad-addon-messagelog/archive-server/ -../../../../../../doc/archive-hashchain-verifier.rb usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/ -../../../../../../doc/archive-hashchain-verifier.README usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/README +../../../../../addons/messagelog/messagelog-archive-verifier/build/libs/messagelog-archive-verifier.jar usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/ +../../../../../addons/messagelog/messagelog-archive-verifier/README.md usr/share/doc/xroad-addon-messagelog/archive-hashchain-verifier/ ../../../../../asicverifier/build/libs/asicverifier.jar usr/share/xroad/jlib/ ../../../../../LICENSE.txt usr/share/doc/xroad-addon-messagelog/ diff --git a/src/settings.gradle b/src/settings.gradle index a00e5d53b8..417d5db446 100644 --- a/src/settings.gradle +++ b/src/settings.gradle @@ -78,6 +78,7 @@ include "common:common-test" include "addons:hwtoken" include "addons:messagelog:messagelog-addon" include "addons:messagelog:messagelog-archiver" +include 'addons:messagelog:messagelog-archive-verifier' include "addons:messagelog:messagelog-db" include "addons:metaservice" @@ -90,4 +91,3 @@ project(":addons:proxymonitor-metaservice").projectDir = file('addons/proxymonit include "addons:op-monitoring" include "addons:wsdlvalidator" - From a1430683e6f8bca24688cca3d5ffb7c229e7922a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ri=C4=8Dardas=20Bu=C4=8Di=C5=ABnas?= Date: Wed, 25 Oct 2023 11:48:05 +0300 Subject: [PATCH 2/2] chore: update error message on invalid arguments Refs: XRDDEV-2403 --- .../main/java/org/niis/xroad/cli/ArchiveHashChainVerifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/ArchiveHashChainVerifier.java b/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/ArchiveHashChainVerifier.java index a97378364a..5fade0dfed 100644 --- a/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/ArchiveHashChainVerifier.java +++ b/src/addons/messagelog/messagelog-archive-verifier/src/main/java/org/niis/xroad/cli/ArchiveHashChainVerifier.java @@ -118,7 +118,7 @@ private static void printUsage() { private String[] parseArguments(String[] args) throws InputErrorException { if (args.length != 2) { - throw new InputErrorException("First argument must provide two arguments, but there is less."); + throw new InputErrorException("Invalid arguments. Expected 2 arguments, got " + args.length + "."); } String archiveFile = args[0];