From 1d7dcdad0338b0e655257d0476c66a35977ddefa Mon Sep 17 00:00:00 2001 From: Kyungwook Tak Date: Thu, 23 Jul 2015 15:05:49 +0900 Subject: [PATCH] Fix internal tests * Remove useless files * Remove dependency to dpl-test-efl Change-Id: I723c8c1edb6351260aa25cede0dc428dd8e36250 Signed-off-by: Kyungwook Tak --- CMakeLists.txt | 11 +- packaging/cert-svc.spec | 19 +- tests/CMakeLists.txt | 34 +- tests/capi/CMakeLists.txt | 8 +- tests/capi/api_tests.cpp | 7 +- tests/capi/api_tests.h | 3 - .../test-cases/keys => capi/data}/root_cacert0.pem | 6 +- tests/capi/test_suite_01.cpp | 14 +- tests/capi/test_suite_02.cpp | 1 - tests/cert-svc/CMakeLists.txt | 7 +- .../dpl}/include/dpl/abstract_input.h | 0 .../dpl}/include/dpl/abstract_input_output.h | 0 .../dpl}/include/dpl/abstract_output.h | 0 .../dpl/core => tests/dpl}/include/dpl/assert.h | 0 .../core => tests/dpl}/include/dpl/availability.h | 0 .../core => tests/dpl}/include/dpl/binary_queue.h | 0 .../dpl/core => tests/dpl}/include/dpl/colors.h | 0 .../core => tests/dpl}/include/dpl/errno_string.h | 0 .../dpl/core => tests/dpl}/include/dpl/exception.h | 0 .../dpl/core => tests/dpl}/include/dpl/foreach.h | 0 .../core => tests/dpl}/include/dpl/free_deleter.h | 0 .../core => tests/dpl}/include/dpl/lexical_cast.h | 0 .../core => tests/dpl}/include/dpl/noncopyable.h | 0 .../core => tests/dpl}/include/dpl/preprocessor.h | 0 .../core => tests/dpl}/include/dpl/scoped_fclose.h | 0 .../core => tests/dpl}/include/dpl/scoped_free.h | 0 .../dpl}/include/dpl/scoped_resource.h | 0 .../dpl/core => tests/dpl}/include/dpl/singleton.h | 0 .../dpl}/include/dpl/singleton_impl.h | 0 .../dpl}/include/dpl/test/abstract_input_parser.h | 0 .../dpl}/include/dpl/test/abstract_input_reader.h | 0 .../include/dpl/test/abstract_input_tokenizer.h | 0 .../dpl}/include/dpl/test/test_results_collector.h | 0 .../dpl}/include/dpl/test/test_runner.h | 0 .../dpl}/include/dpl/test/test_runner_child.h | 0 .../include/dpl/test/test_runner_multiprocess.h | 0 .../dpl}/include/dpl/test/value_separated_parser.h | 0 .../include/dpl/test/value_separated_policies.h | 0 .../dpl}/include/dpl/test/value_separated_reader.h | 0 .../include/dpl/test/value_separated_tokenizer.h | 0 .../dpl}/include/dpl/test/value_separated_tokens.h | 0 tests/dpl/src/assert.cpp | 59 + .../dpl/core => tests/dpl}/src/binary_queue.cpp | 0 {vcore/src/dpl/core => tests/dpl}/src/colors.cpp | 0 .../dpl/core => tests/dpl}/src/errno_string.cpp | 0 .../dpl/src/exception.cpp | 34 +- .../src/dpl/core => tests/dpl}/src/noncopyable.cpp | 0 .../src/dpl/core => tests/dpl}/src/singleton.cpp | 0 .../dpl}/src/test_results_collector.cpp | 0 .../src/dpl/test => tests/dpl}/src/test_runner.cpp | 0 .../test => tests/dpl}/src/test_runner_child.cpp | 0 .../dpl}/src/test_runner_multiprocess.cpp | 1 + .../dpl}/src/value_separated_policies.cpp | 0 .../dpl}/src/value_separated_tokens.cpp | 0 tests/pkcs12/CMakeLists.txt | 5 +- tests/pkcs12/new_test_cases.cpp | 1813 ++++------ tests/pkcs12/pkcs12_test.cpp | 4 +- tests/vcore/CMakeLists.txt | 54 +- tests/vcore/TestCRL.cpp | 95 - tests/vcore/TestCRL.h | 34 - tests/vcore/TestCases.cpp | 274 -- tests/vcore/cert-svc-tests-vcore-ocsp-server.sh | 30 - tests/vcore/certificate-generator/.gitignore | 28 - tests/vcore/certificate-generator/create_certs.sh | 94 - .../certificate-generator/demoCA.init/cacert.pem | 60 - .../certificate-generator/demoCA.init/careq.pem | 11 - .../certificate-generator/demoCA.init/index.txt | 1 - .../demoCA.init/index.txt.attr | 1 - .../demoCA.init/index.txt.old | 0 .../demoCA.init/newcerts/00.pem | 60 - .../demoCA.init/private/cakey.pem | 18 - .../vcore/certificate-generator/demoCA.init/serial | 1 - .../certificate-generator/demoCA.init/serial.old | 1 - .../vcore/certificate-generator/demoCA/cacert.pem | 60 - tests/vcore/certificate-generator/demoCA/careq.pem | 11 - tests/vcore/certificate-generator/demoCA/crlnumber | 1 - .../certificate-generator/demoCA/crlnumber.old | 1 - .../certificate-generator/demoCA/private/cakey.pem | 18 - tests/vcore/certificate-generator/demoCA/serial | 1 - .../vcore/certificate-generator/demoCA/serial.old | 1 - tests/vcore/certificate-generator/openssl.cnf | 327 -- tests/vcore/test-cases/config/fin_list.xml | 35 - tests/vcore/test-cases/config/fin_list.xsd | 21 - tests/vcore/test-cases/keys/CAbundle.crt | 3677 -------------------- tests/vcore/test-cases/keys/README | 2 - tests/vcore/test-cases/keys/filip_rsa_cert.pem | 62 - tests/vcore/test-cases/keys/filip_rsa_key.pem | 18 - tests/vcore/test-cases/keys/magda_dsa_cert.pem | 90 - tests/vcore/test-cases/keys/magda_dsa_key.pem | 12 - .../test-cases/keys/ocsp_level0deprecated.crt | 31 - tests/vcore/test-cases/keys/ocsp_level1.crt | 29 - tests/vcore/test-cases/keys/ocsp_level2.crt | 29 - tests/vcore/test-cases/keys/ocsp_rootca.crt | 18 - tests/vcore/test-cases/keys/operator.root.cert.pem | 66 - .../vcore/test-cases/keys/operator.second.cert.pem | 64 - .../vcore/test-cases/keys/operator.second.key.pem | 18 - tests/vcore/test-cases/keys/operator.second.p12 | Bin 2043 -> 0 bytes tests/vcore/test-cases/keys/root_cakey0.pem | 18 - tests/vcore/vcore_tests.cpp | 2 +- vcore/CMakeLists.txt | 149 +- vcore/{src => }/cert-svc/ccert.h | 6 +- vcore/{src => }/cert-svc/cerror.h | 0 vcore/{src => }/cert-svc/cinstance.h | 0 vcore/{src => }/cert-svc/cpkcs12.h | 0 vcore/{src => }/cert-svc/cprimitives.h | 0 vcore/{src => }/cert-svc/cstring.h | 0 vcore/dpl/core/include/dpl/assert.h | 51 + vcore/dpl/core/include/dpl/colors.h | 73 + vcore/dpl/core/include/dpl/exception.h | 390 +++ vcore/dpl/core/include/dpl/noncopyable.h | 38 + .../core/include/dpl/singleton.h} | 36 +- vcore/dpl/core/include/dpl/singleton_impl.h | 55 + vcore/{src => }/dpl/core/src/assert.cpp | 1 - vcore/dpl/core/src/colors.cpp | 70 + vcore/{src => }/dpl/core/src/exception.cpp | 0 vcore/dpl/core/src/noncopyable.cpp | 31 + .../type_list.cpp => dpl/core/src/singleton.cpp} | 8 +- .../log/include/dpl/log/abstract_log_provider.h | 0 .../dpl/log/include/dpl/log/dlog_log_provider.h | 0 .../dpl/log/include/dpl/log/journal_log_provider.h | 0 vcore/{src => }/dpl/log/include/dpl/log/log.h | 0 .../log/include/dpl/log/old_style_log_provider.h | 0 .../dpl/log/src/abstract_log_provider.cpp | 0 vcore/{src => }/dpl/log/src/dlog_log_provider.cpp | 0 .../{src => }/dpl/log/src/journal_log_provider.cpp | 0 vcore/{src => }/dpl/log/src/log.cpp | 0 .../dpl/log/src/old_style_log_provider.cpp | 0 vcore/{src => }/server/include/cert-server-logic.h | 0 vcore/{src => }/server/src/cert-server-logic.c | 2 +- vcore/{src => }/server/src/cert-server-main.c | 2 +- vcore/src/CMakeLists.txt | 195 -- vcore/src/cert-svc/ccrl.h | 75 - vcore/src/cert-svc/cocsp.h | 66 - vcore/src/dpl/core/include/dpl/char_traits.h | 38 - vcore/src/dpl/core/include/dpl/file_input.h | 62 - vcore/src/dpl/core/include/dpl/optional.h | 176 - vcore/src/dpl/core/include/dpl/optional_typedefs.h | 33 - vcore/src/dpl/core/include/dpl/scoped_array.h | 68 - vcore/src/dpl/core/include/dpl/string.h | 157 - vcore/src/dpl/core/include/dpl/thread.h | 394 --- vcore/src/dpl/core/include/dpl/type_list.h | 159 - vcore/src/dpl/core/include/dpl/waitable_event.h | 59 - vcore/src/dpl/core/include/dpl/waitable_handle.h | 115 - .../include/dpl/waitable_handle_watch_support.h | 149 - vcore/src/dpl/core/include/dpl/workaround.h | 43 - vcore/src/dpl/core/src/char_traits.cpp | 34 - vcore/src/dpl/core/src/file_input.cpp | 142 - vcore/src/dpl/core/src/string.cpp | 250 -- vcore/src/dpl/core/src/thread.cpp | 609 ---- vcore/src/dpl/core/src/waitable_event.cpp | 77 - vcore/src/dpl/core/src/waitable_handle.cpp | 161 - .../dpl/core/src/waitable_handle_watch_support.cpp | 375 -- .../include/dpl/db/naive_synchronization_object.h | 45 - vcore/src/dpl/db/include/dpl/db/orm.h | 1117 ------ vcore/src/dpl/db/include/dpl/db/orm_generator.h | 382 -- vcore/src/dpl/db/include/dpl/db/orm_interface.h | 48 - vcore/src/dpl/db/include/dpl/db/orm_macros.h | 34 - vcore/src/dpl/db/include/dpl/db/sql_connection.h | 519 --- .../db/include/dpl/db/thread_database_support.h | 300 -- vcore/src/dpl/db/src/orm.cpp | 102 - vcore/src/dpl/db/src/sql_connection.cpp | 896 ----- vcore/src/dpl/db/src/thread_database_support.cpp | 23 - vcore/src/dpl/test/include/dpl/test/process_pipe.h | 62 - vcore/src/dpl/test/src/process_pipe.cpp | 78 - vcore/src/vcore/CRLCacheInterface.h | 44 - vcore/src/vcore/CertificateStorage.h | 26 - vcore/src/vcore/IAbstractResponseCache.h | 47 - vcore/src/vcore/RevocationCheckerBase.cpp | 68 - vcore/src/vcore/RevocationCheckerBase.h | 44 - vcore/src/vcore/SSLContainers.h | 183 - vcore/src/vcore/VerificationStatus.cpp | 82 - vcore/src/vcore/VerificationStatus.h | 101 - vcore/src/vcore/WacOrigin.cpp | 151 - vcore/src/vcore/WacOrigin.h | 56 - vcore/{src => }/vcore/Base64.cpp | 41 +- vcore/{src => }/vcore/Base64.h | 0 vcore/{src => }/vcore/CertStoreType.cpp | 0 vcore/{src => }/vcore/CertStoreType.h | 0 vcore/{src => }/vcore/Certificate.cpp | 0 vcore/{src => }/vcore/Certificate.h | 0 vcore/{src => }/vcore/CertificateCollection.cpp | 46 +- vcore/{src => }/vcore/CertificateCollection.h | 10 - vcore/{src => }/vcore/CertificateConfigReader.cpp | 0 vcore/{src => }/vcore/CertificateConfigReader.h | 0 vcore/{src => }/vcore/CertificateIdentifier.h | 0 vcore/{src => }/vcore/CertificateLoader.cpp | 0 vcore/{src => }/vcore/CertificateLoader.h | 0 vcore/{src => }/vcore/ParserSchema.h | 0 vcore/{src => }/vcore/ReferenceValidator.cpp | 7 - vcore/{src => }/vcore/ReferenceValidator.h | 0 vcore/{src => }/vcore/SaxReader.cpp | 0 vcore/{src => }/vcore/SaxReader.h | 0 vcore/{src => }/vcore/SignatureData.cpp | 0 vcore/{src => }/vcore/SignatureData.h | 0 vcore/{src => }/vcore/SignatureFinder.cpp | 0 vcore/{src => }/vcore/SignatureFinder.h | 0 vcore/{src => }/vcore/SignatureReader.cpp | 0 vcore/{src => }/vcore/SignatureReader.h | 0 vcore/{src => }/vcore/SignatureValidator.cpp | 0 vcore/{src => }/vcore/SignatureValidator.h | 0 vcore/{src => }/vcore/TimeConversion.cpp | 0 vcore/{src => }/vcore/TimeConversion.h | 3 +- vcore/{src => }/vcore/ValidatorCommon.h | 0 vcore/{src => }/vcore/ValidatorFactories.cpp | 0 vcore/{src => }/vcore/ValidatorFactories.h | 2 +- vcore/{src => }/vcore/XmlsecAdapter.cpp | 0 vcore/{src => }/vcore/XmlsecAdapter.h | 0 vcore/{src => }/vcore/api.cpp | 9 +- vcore/{src => }/vcore/cert-svc-client.c | 2 +- vcore/{src => }/vcore/cert-svc-client.h | 0 vcore/{src => }/vcore/exception.cpp | 0 vcore/{src => }/vcore/exception.h | 0 vcore/{src => }/vcore/pkcs12.cpp | 5 +- vcore/{src => }/vcore/pkcs12.h | 0 vcore/{src => }/vcore/utils.c | 0 vcore/{src => }/vcore/utils.h | 0 216 files changed, 1743 insertions(+), 14539 deletions(-) rename tests/{vcore/test-cases/keys => capi/data}/root_cacert0.pem (96%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/abstract_input.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/abstract_input_output.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/abstract_output.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/assert.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/availability.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/binary_queue.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/colors.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/errno_string.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/exception.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/foreach.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/free_deleter.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/lexical_cast.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/noncopyable.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/preprocessor.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/scoped_fclose.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/scoped_free.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/scoped_resource.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/singleton.h (100%) rename {vcore/src/dpl/core => tests/dpl}/include/dpl/singleton_impl.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/abstract_input_parser.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/abstract_input_reader.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/abstract_input_tokenizer.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/test_results_collector.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/test_runner.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/test_runner_child.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/test_runner_multiprocess.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/value_separated_parser.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/value_separated_policies.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/value_separated_reader.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/value_separated_tokenizer.h (100%) rename {vcore/src/dpl/test => tests/dpl}/include/dpl/test/value_separated_tokens.h (100%) create mode 100644 tests/dpl/src/assert.cpp rename {vcore/src/dpl/core => tests/dpl}/src/binary_queue.cpp (100%) rename {vcore/src/dpl/core => tests/dpl}/src/colors.cpp (100%) rename {vcore/src/dpl/core => tests/dpl}/src/errno_string.cpp (100%) rename vcore/src/dpl/db/src/naive_synchronization_object.cpp => tests/dpl/src/exception.cpp (53%) rename {vcore/src/dpl/core => tests/dpl}/src/noncopyable.cpp (100%) rename {vcore/src/dpl/core => tests/dpl}/src/singleton.cpp (100%) rename {vcore/src/dpl/test => tests/dpl}/src/test_results_collector.cpp (100%) rename {vcore/src/dpl/test => tests/dpl}/src/test_runner.cpp (100%) rename {vcore/src/dpl/test => tests/dpl}/src/test_runner_child.cpp (100%) rename {vcore/src/dpl/test => tests/dpl}/src/test_runner_multiprocess.cpp (99%) rename {vcore/src/dpl/test => tests/dpl}/src/value_separated_policies.cpp (100%) rename {vcore/src/dpl/test => tests/dpl}/src/value_separated_tokens.cpp (100%) delete mode 100644 tests/vcore/TestCRL.cpp delete mode 100644 tests/vcore/TestCRL.h delete mode 100644 tests/vcore/cert-svc-tests-vcore-ocsp-server.sh delete mode 100644 tests/vcore/certificate-generator/.gitignore delete mode 100755 tests/vcore/certificate-generator/create_certs.sh delete mode 100644 tests/vcore/certificate-generator/demoCA.init/cacert.pem delete mode 100644 tests/vcore/certificate-generator/demoCA.init/careq.pem delete mode 100644 tests/vcore/certificate-generator/demoCA.init/index.txt delete mode 100644 tests/vcore/certificate-generator/demoCA.init/index.txt.attr delete mode 100644 tests/vcore/certificate-generator/demoCA.init/index.txt.old delete mode 100644 tests/vcore/certificate-generator/demoCA.init/newcerts/00.pem delete mode 100644 tests/vcore/certificate-generator/demoCA.init/private/cakey.pem delete mode 100644 tests/vcore/certificate-generator/demoCA.init/serial delete mode 100644 tests/vcore/certificate-generator/demoCA.init/serial.old delete mode 100644 tests/vcore/certificate-generator/demoCA/cacert.pem delete mode 100644 tests/vcore/certificate-generator/demoCA/careq.pem delete mode 100644 tests/vcore/certificate-generator/demoCA/crlnumber delete mode 100644 tests/vcore/certificate-generator/demoCA/crlnumber.old delete mode 100644 tests/vcore/certificate-generator/demoCA/private/cakey.pem delete mode 100644 tests/vcore/certificate-generator/demoCA/serial delete mode 100644 tests/vcore/certificate-generator/demoCA/serial.old delete mode 100644 tests/vcore/certificate-generator/openssl.cnf delete mode 100644 tests/vcore/test-cases/config/fin_list.xml delete mode 100644 tests/vcore/test-cases/config/fin_list.xsd delete mode 100644 tests/vcore/test-cases/keys/CAbundle.crt delete mode 100644 tests/vcore/test-cases/keys/README delete mode 100644 tests/vcore/test-cases/keys/filip_rsa_cert.pem delete mode 100644 tests/vcore/test-cases/keys/filip_rsa_key.pem delete mode 100644 tests/vcore/test-cases/keys/magda_dsa_cert.pem delete mode 100644 tests/vcore/test-cases/keys/magda_dsa_key.pem delete mode 100644 tests/vcore/test-cases/keys/ocsp_level0deprecated.crt delete mode 100644 tests/vcore/test-cases/keys/ocsp_level1.crt delete mode 100644 tests/vcore/test-cases/keys/ocsp_level2.crt delete mode 100644 tests/vcore/test-cases/keys/ocsp_rootca.crt delete mode 100644 tests/vcore/test-cases/keys/operator.root.cert.pem delete mode 100644 tests/vcore/test-cases/keys/operator.second.cert.pem delete mode 100644 tests/vcore/test-cases/keys/operator.second.key.pem delete mode 100644 tests/vcore/test-cases/keys/operator.second.p12 delete mode 100644 tests/vcore/test-cases/keys/root_cakey0.pem rename vcore/{src => }/cert-svc/ccert.h (99%) rename vcore/{src => }/cert-svc/cerror.h (100%) rename vcore/{src => }/cert-svc/cinstance.h (100%) rename vcore/{src => }/cert-svc/cpkcs12.h (100%) rename vcore/{src => }/cert-svc/cprimitives.h (100%) rename vcore/{src => }/cert-svc/cstring.h (100%) create mode 100644 vcore/dpl/core/include/dpl/assert.h create mode 100644 vcore/dpl/core/include/dpl/colors.h create mode 100644 vcore/dpl/core/include/dpl/exception.h create mode 100644 vcore/dpl/core/include/dpl/noncopyable.h rename vcore/{src/dpl/core/include/dpl/abstract_waitable_input.h => dpl/core/include/dpl/singleton.h} (61%) create mode 100644 vcore/dpl/core/include/dpl/singleton_impl.h rename vcore/{src => }/dpl/core/src/assert.cpp (98%) create mode 100644 vcore/dpl/core/src/colors.cpp rename vcore/{src => }/dpl/core/src/exception.cpp (100%) create mode 100644 vcore/dpl/core/src/noncopyable.cpp rename vcore/{src/dpl/core/src/type_list.cpp => dpl/core/src/singleton.cpp} (81%) rename vcore/{src => }/dpl/log/include/dpl/log/abstract_log_provider.h (100%) rename vcore/{src => }/dpl/log/include/dpl/log/dlog_log_provider.h (100%) rename vcore/{src => }/dpl/log/include/dpl/log/journal_log_provider.h (100%) rename vcore/{src => }/dpl/log/include/dpl/log/log.h (100%) rename vcore/{src => }/dpl/log/include/dpl/log/old_style_log_provider.h (100%) rename vcore/{src => }/dpl/log/src/abstract_log_provider.cpp (100%) rename vcore/{src => }/dpl/log/src/dlog_log_provider.cpp (100%) rename vcore/{src => }/dpl/log/src/journal_log_provider.cpp (100%) rename vcore/{src => }/dpl/log/src/log.cpp (100%) rename vcore/{src => }/dpl/log/src/old_style_log_provider.cpp (100%) rename vcore/{src => }/server/include/cert-server-logic.h (100%) rename vcore/{src => }/server/src/cert-server-logic.c (99%) rename vcore/{src => }/server/src/cert-server-main.c (99%) delete mode 100644 vcore/src/CMakeLists.txt delete mode 100644 vcore/src/cert-svc/ccrl.h delete mode 100644 vcore/src/cert-svc/cocsp.h delete mode 100644 vcore/src/dpl/core/include/dpl/char_traits.h delete mode 100644 vcore/src/dpl/core/include/dpl/file_input.h delete mode 100644 vcore/src/dpl/core/include/dpl/optional.h delete mode 100644 vcore/src/dpl/core/include/dpl/optional_typedefs.h delete mode 100644 vcore/src/dpl/core/include/dpl/scoped_array.h delete mode 100644 vcore/src/dpl/core/include/dpl/string.h delete mode 100644 vcore/src/dpl/core/include/dpl/thread.h delete mode 100644 vcore/src/dpl/core/include/dpl/type_list.h delete mode 100644 vcore/src/dpl/core/include/dpl/waitable_event.h delete mode 100644 vcore/src/dpl/core/include/dpl/waitable_handle.h delete mode 100644 vcore/src/dpl/core/include/dpl/waitable_handle_watch_support.h delete mode 100644 vcore/src/dpl/core/include/dpl/workaround.h delete mode 100644 vcore/src/dpl/core/src/char_traits.cpp delete mode 100644 vcore/src/dpl/core/src/file_input.cpp delete mode 100644 vcore/src/dpl/core/src/string.cpp delete mode 100644 vcore/src/dpl/core/src/thread.cpp delete mode 100644 vcore/src/dpl/core/src/waitable_event.cpp delete mode 100644 vcore/src/dpl/core/src/waitable_handle.cpp delete mode 100644 vcore/src/dpl/core/src/waitable_handle_watch_support.cpp delete mode 100644 vcore/src/dpl/db/include/dpl/db/naive_synchronization_object.h delete mode 100644 vcore/src/dpl/db/include/dpl/db/orm.h delete mode 100644 vcore/src/dpl/db/include/dpl/db/orm_generator.h delete mode 100644 vcore/src/dpl/db/include/dpl/db/orm_interface.h delete mode 100644 vcore/src/dpl/db/include/dpl/db/orm_macros.h delete mode 100644 vcore/src/dpl/db/include/dpl/db/sql_connection.h delete mode 100644 vcore/src/dpl/db/include/dpl/db/thread_database_support.h delete mode 100644 vcore/src/dpl/db/src/orm.cpp delete mode 100644 vcore/src/dpl/db/src/sql_connection.cpp delete mode 100644 vcore/src/dpl/db/src/thread_database_support.cpp delete mode 100644 vcore/src/dpl/test/include/dpl/test/process_pipe.h delete mode 100644 vcore/src/dpl/test/src/process_pipe.cpp delete mode 100644 vcore/src/vcore/CRLCacheInterface.h delete mode 100644 vcore/src/vcore/CertificateStorage.h delete mode 100644 vcore/src/vcore/IAbstractResponseCache.h delete mode 100644 vcore/src/vcore/RevocationCheckerBase.cpp delete mode 100644 vcore/src/vcore/RevocationCheckerBase.h delete mode 100644 vcore/src/vcore/SSLContainers.h delete mode 100644 vcore/src/vcore/VerificationStatus.cpp delete mode 100644 vcore/src/vcore/VerificationStatus.h delete mode 100644 vcore/src/vcore/WacOrigin.cpp delete mode 100644 vcore/src/vcore/WacOrigin.h rename vcore/{src => }/vcore/Base64.cpp (87%) rename vcore/{src => }/vcore/Base64.h (100%) rename vcore/{src => }/vcore/CertStoreType.cpp (100%) rename vcore/{src => }/vcore/CertStoreType.h (100%) rename vcore/{src => }/vcore/Certificate.cpp (100%) rename vcore/{src => }/vcore/Certificate.h (100%) rename vcore/{src => }/vcore/CertificateCollection.cpp (85%) rename vcore/{src => }/vcore/CertificateCollection.h (93%) rename vcore/{src => }/vcore/CertificateConfigReader.cpp (100%) rename vcore/{src => }/vcore/CertificateConfigReader.h (100%) rename vcore/{src => }/vcore/CertificateIdentifier.h (100%) rename vcore/{src => }/vcore/CertificateLoader.cpp (100%) rename vcore/{src => }/vcore/CertificateLoader.h (100%) rename vcore/{src => }/vcore/ParserSchema.h (100%) rename vcore/{src => }/vcore/ReferenceValidator.cpp (94%) rename vcore/{src => }/vcore/ReferenceValidator.h (100%) rename vcore/{src => }/vcore/SaxReader.cpp (100%) rename vcore/{src => }/vcore/SaxReader.h (100%) rename vcore/{src => }/vcore/SignatureData.cpp (100%) rename vcore/{src => }/vcore/SignatureData.h (100%) rename vcore/{src => }/vcore/SignatureFinder.cpp (100%) rename vcore/{src => }/vcore/SignatureFinder.h (100%) rename vcore/{src => }/vcore/SignatureReader.cpp (100%) rename vcore/{src => }/vcore/SignatureReader.h (100%) rename vcore/{src => }/vcore/SignatureValidator.cpp (100%) rename vcore/{src => }/vcore/SignatureValidator.h (100%) rename vcore/{src => }/vcore/TimeConversion.cpp (100%) rename vcore/{src => }/vcore/TimeConversion.h (97%) rename vcore/{src => }/vcore/ValidatorCommon.h (100%) rename vcore/{src => }/vcore/ValidatorFactories.cpp (100%) rename vcore/{src => }/vcore/ValidatorFactories.h (97%) rename vcore/{src => }/vcore/XmlsecAdapter.cpp (100%) rename vcore/{src => }/vcore/XmlsecAdapter.h (100%) rename vcore/{src => }/vcore/api.cpp (99%) rename vcore/{src => }/vcore/cert-svc-client.c (99%) rename vcore/{src => }/vcore/cert-svc-client.h (100%) rename vcore/{src => }/vcore/exception.cpp (100%) rename vcore/{src => }/vcore/exception.h (100%) rename vcore/{src => }/vcore/pkcs12.cpp (99%) rename vcore/{src => }/vcore/pkcs12.h (100%) rename vcore/{src => }/vcore/utils.c (100%) rename vcore/{src => }/vcore/utils.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index b4bfe53..057d99b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,8 +12,8 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GC_SECTIONS_FLAGS}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GC_SECTIONS_FLAGS}") SET(CMAKE_C_FLAGS_RELEASE "-g -O2") SET(CMAKE_CXX_FLAGS_RELEASE "-g -std=c++0x -O2") -SET(CMAKE_C_FLAGS_DEBUG "-g -O0") -SET(CMAKE_CXX_FLAGS_DEBUG "-g -std=c++0x -O0") +SET(CMAKE_C_FLAGS_DEBUG "-g -O0 -Wp,-U_FORTIFY_SOURCE") +SET(CMAKE_CXX_FLAGS_DEBUG "-g -std=c++0x -O0 -Wp,-U_FORTIFY_SOURCE") SET(CMAKE_C_FLAGS_CCOV "-g -O2 --coverage") SET(CMAKE_CXX_FLAGS_CCOV "-g -std=c++0x -O2 --coverage") SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--as-needed") @@ -30,14 +30,7 @@ SET(TARGET_CERT_SVC_LIB "cert-svc") SET(TARGET_VCORE_LIB "cert-svc-vcore") SET(TARGET_CERT_SERVER "cert-server") -# test binaries -SET(TARGET_VCOREC_TEST "cert-svc-tests-capi") -SET(TARGET_TEST_CERT_SVC_OGIG "cert-svc-tests-orig") -SET(TARGET_PKCS12_TEST "cert-svc-tests-pkcs12") -SET(TARGET_VCORE_TEST "cert-svc-tests-vcore") - ADD_DEFINITIONS("-DCERTSVC_SYSTEM_STORE_DB=\"${TZ_SYS_SHARE}/cert-svc/dbspace/certs-meta.db\"") -ADD_DEFINITIONS("-DCERTSVC_VCORE_DB=\"${TZ_SYS_DB}/.cert_svc_vcore.db\"") ADD_DEFINITIONS("-DCERTSVC_CRT_FILE_PATH=\"${TZ_SYS_SHARE}/cert-svc/ca-certificate.crt\"") ADD_DEFINITIONS("-DFINGERPRINT_LIST_PATH=\"${TZ_SYS_SHARE}/ca-certificates/fingerprint/fingerprint_list.xml\"") ADD_DEFINITIONS("-DFINGERPRINT_LIST_SCHEMA_PATH=\"${TZ_SYS_SHARE}/ca-certificates/fingerprint/fingerprint_list.xsd\"") diff --git a/packaging/cert-svc.spec b/packaging/cert-svc.spec index 047c0ad..7e89d4e 100644 --- a/packaging/cert-svc.spec +++ b/packaging/cert-svc.spec @@ -21,7 +21,6 @@ BuildRequires: pkgconfig(libsystemd-daemon) BuildRequires: pkgconfig(key-manager) BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(libsystemd-journal) -BuildRequires: boost-devel Requires: pkgconfig(libtzplatform-config) Requires: ca-certificates-tizen Requires: ca-certificates-mozilla @@ -43,8 +42,6 @@ Certification service (development files) %package test Summary: Certification service (tests) Group: Security/Testing -BuildRequires: pkgconfig(dpl-test-efl) -Requires: boost-devel Requires: ca-certificates-tizen Requires: %{name} = %{version}-%{release} @@ -75,13 +72,11 @@ export FFLAGS="$FFLAGS -DTIZEN_EMULATOR_MODE" cmake . -DPREFIX=%{_prefix} \ -DEXEC_PREFIX=%{_exec_prefix} \ -DLIBDIR=%{_libdir} \ - -DBINDIR=%{_bindir} \ -DINCLUDEDIR=%{_includedir} \ -DTZ_SYS_SHARE=%TZ_SYS_SHARE \ -DTZ_SYS_BIN=%TZ_SYS_BIN \ -DTZ_SYS_ETC=%TZ_SYS_ETC \ -DTZ_SYS_RO_WRT_ENGINE=%TZ_SYS_RO_WRT_ENGINE \ - -DTZ_SYS_DB=%TZ_SYS_DB \ %if 0%{?certsvc_test_build} -DCERTSVC_TEST_BUILD=1 \ -DTZ_SYS_RO_APP=%TZ_SYS_RO_APP \ @@ -180,22 +175,10 @@ rm %{TZ_SYS_BIN}/initialize_store_db.sh %files test %defattr(644,system,system,755) %attr(755,root,root) %{TZ_SYS_BIN}/cert-svc-test* -%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed/* -%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed_negative_hash/* -%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed_negative_signature/* -%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed_negative_certificate/* -%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed_partner/* -%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed_partner_operator/* -%{TZ_SYS_RO_APP}/widget/tests/vcore_keys/* -%{TZ_SYS_RO_APP}/widget/tests/vcore_certs/* -%{TZ_SYS_RO_APP}/widget/tests/vcore_config/* -%{TZ_SYS_RO_APP}/widget/tests/pkcs12/* -%{TZ_SYS_RO_APP}/widget/tests/reference/* +%{TZ_SYS_RO_APP}/widget/tests/* %{TZ_SYS_ETC}/ssl/certs/8956b9bc.0 -%{TZ_SYS_SHARE}/ca-certificates/wac/root_cacert0.pem %{TZ_SYS_SHARE}/cert-svc/pkcs12/* %{TZ_SYS_SHARE}/cert-svc/cert-type/* -%{TZ_SYS_SHARE}/cert-svc/tests/orig_c/data/caflag/* %{TZ_SYS_SHARE}/cert-svc/certs/root_ca*.der %{TZ_SYS_SHARE}/cert-svc/tests/* %endif diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ee84402..92c83f6 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -13,17 +13,41 @@ # limitations under the License. # -PKG_CHECK_MODULES(VCORE_TEST_DEP +SET(TARGET_VCOREC_TEST "cert-svc-tests-capi") +SET(TARGET_TEST_CERT_SVC_OGIG "cert-svc-tests-orig") +SET(TARGET_PKCS12_TEST "cert-svc-tests-pkcs12") +SET(TARGET_VCORE_TEST "cert-svc-tests-vcore") + +PKG_CHECK_MODULES(TEST_DEP REQUIRED - dpl-test-efl - sqlite3 + libpcrecpp + ) + +SET(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(DPL_TEST_SOURCES + ${TEST_DIR}/dpl/src/assert.cpp + ${TEST_DIR}/dpl/src/binary_queue.cpp + ${TEST_DIR}/dpl/src/colors.cpp + ${TEST_DIR}/dpl/src/errno_string.cpp + ${TEST_DIR}/dpl/src/exception.cpp + ${TEST_DIR}/dpl/src/noncopyable.cpp + ${TEST_DIR}/dpl/src/singleton.cpp + ${TEST_DIR}/dpl/src/test_results_collector.cpp + ${TEST_DIR}/dpl/src/test_runner.cpp + ${TEST_DIR}/dpl/src/test_runner_child.cpp + ${TEST_DIR}/dpl/src/test_runner_multiprocess.cpp + ${TEST_DIR}/dpl/src/value_separated_policies.cpp + ${TEST_DIR}/dpl/src/value_separated_tokens.cpp + ) INCLUDE_DIRECTORIES( SYSTEM - ${VCORE_TEST_DEP_INCLUDE_DIRS} + ${TEST_DEP_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/include - ${PROJECT_SOURCE_DIR}/vcore/src + ${PROJECT_SOURCE_DIR}/vcore + ${TEST_DIR}/dpl/include ) ADD_SUBDIRECTORY(capi) diff --git a/tests/capi/CMakeLists.txt b/tests/capi/CMakeLists.txt index 9c96275..265779c 100644 --- a/tests/capi/CMakeLists.txt +++ b/tests/capi/CMakeLists.txt @@ -29,13 +29,11 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include ) -ADD_EXECUTABLE(${TARGET_VCOREC_TEST} ${VCOREC_TESTS_SOURCES}) +ADD_EXECUTABLE(${TARGET_VCOREC_TEST} ${VCOREC_TESTS_SOURCES} ${DPL_TEST_SOURCES}) TARGET_LINK_LIBRARIES(${TARGET_VCOREC_TEST} ${TARGET_VCORE_LIB} - ${TARGET_CERT_SVC_LIB} - ${VCORE_TEST_DEP_LIBRARIES} - -ldl + ${TEST_DEP_LIBRARIES} ) INSTALL(TARGETS ${TARGET_VCOREC_TEST} @@ -64,9 +62,9 @@ INSTALL(FILES ${PROJECT_SOURCE_DIR}/tests/capi/data/cert1.der ${PROJECT_SOURCE_DIR}/tests/capi/data/cert2fake.pem ${PROJECT_SOURCE_DIR}/tests/capi/data/cert3fake.der + ${PROJECT_SOURCE_DIR}/tests/capi/data/root_cacert0.pem DESTINATION ${TZ_SYS_SHARE}/cert-svc/cert-type/ PERMISSIONS OWNER_READ GROUP_READ WORLD_READ ) - diff --git a/tests/capi/api_tests.cpp b/tests/capi/api_tests.cpp index 41d97d3..ab0702e 100644 --- a/tests/capi/api_tests.cpp +++ b/tests/capi/api_tests.cpp @@ -14,21 +14,22 @@ * limitations under the License. */ /* - * @file main.cpp + * @file api_tests.cpp * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) * @version 1.0 * @brief This file is the implementation file of main */ + #include -#include +#include CertSvcInstance vinstance; int main (int argc, char *argv[]) { certsvc_instance_new(&vinstance); - int status = DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); + int status = VcoreDPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); certsvc_instance_free(vinstance); return status; } diff --git a/tests/capi/api_tests.h b/tests/capi/api_tests.h index f62f3d2..54416e4 100644 --- a/tests/capi/api_tests.h +++ b/tests/capi/api_tests.h @@ -21,8 +21,5 @@ */ #include -#include -#include -#include extern CertSvcInstance vinstance; diff --git a/tests/vcore/test-cases/keys/root_cacert0.pem b/tests/capi/data/root_cacert0.pem similarity index 96% rename from tests/vcore/test-cases/keys/root_cacert0.pem rename to tests/capi/data/root_cacert0.pem index 7aa429f..572d525 100644 --- a/tests/vcore/test-cases/keys/root_cacert0.pem +++ b/tests/capi/data/root_cacert0.pem @@ -24,14 +24,14 @@ Certificate: ca:bc:44:d9:ce:7d:5a:f2:f3 Exponent: 65537 (0x10001) X509v3 extensions: - X509v3 Subject Key Identifier: + X509v3 Subject Key Identifier: 82:08:7F:DB:00:02:86:E8:53:2A:A5:FA:58:AE:67:7F:14:38:C8:60 - X509v3 Authority Key Identifier: + X509v3 Authority Key Identifier: keyid:82:08:7F:DB:00:02:86:E8:53:2A:A5:FA:58:AE:67:7F:14:38:C8:60 DirName:/C=PL/ST=Maz/O=Samsung/OU=SPRC/CN=Samsung/emailAddress=samsung@samsung.com serial:C7:4A:82:F6:9D:1B:F6:7D - X509v3 Basic Constraints: + X509v3 Basic Constraints: CA:TRUE Signature Algorithm: sha1WithRSAEncryption 0f:cb:a3:cd:25:02:00:17:a9:c5:21:4a:6e:bb:ce:d9:14:74: diff --git a/tests/capi/test_suite_01.cpp b/tests/capi/test_suite_01.cpp index 9138831..5bc0b02 100644 --- a/tests/capi/test_suite_01.cpp +++ b/tests/capi/test_suite_01.cpp @@ -14,11 +14,13 @@ * limitations under the License. */ #include - +#include #include - #include -#include + +#include +#include +#include #include @@ -35,7 +37,7 @@ RUNNER_TEST(test01_certificate_new_from_file) CertSvcCertificate cert; int result = certsvc_certificate_new_from_file( vinstance, - "/usr/share/ca-certificates/wac/root_cacert0.pem", + "/usr/share/cert-svc/cert-type/root_cacert0.pem", &cert); RUNNER_ASSERT_MSG(CERTSVC_TRUE == result, "Error reading certificate"); @@ -688,7 +690,6 @@ RUNNER_TEST(test14_certificate_verify) int result, status; for (int i=0; i #include -#include #include #include diff --git a/tests/cert-svc/CMakeLists.txt b/tests/cert-svc/CMakeLists.txt index ac7a2d9..e9a6ad4 100644 --- a/tests/cert-svc/CMakeLists.txt +++ b/tests/cert-svc/CMakeLists.txt @@ -29,12 +29,11 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include ) -ADD_EXECUTABLE(${TARGET_TEST_CERT_SVC_OGIG} ${CERT_SVC_OGIG_TESTS_SOURCES}) +ADD_EXECUTABLE(${TARGET_TEST_CERT_SVC_OGIG} ${CERT_SVC_OGIG_TESTS_SOURCES} ${DPL_TEST_SOURCES}) -TARGET_LINK_LIBRARIES( - ${TARGET_TEST_CERT_SVC_OGIG} +TARGET_LINK_LIBRARIES(${TARGET_TEST_CERT_SVC_OGIG} ${TARGET_CERT_SVC_LIB} - ${VCORE_TEST_DEP_LIBRARIES} + ${TEST_DEP_LIBRARIES} ) INSTALL(TARGETS ${TARGET_TEST_CERT_SVC_OGIG} diff --git a/vcore/src/dpl/core/include/dpl/abstract_input.h b/tests/dpl/include/dpl/abstract_input.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/abstract_input.h rename to tests/dpl/include/dpl/abstract_input.h diff --git a/vcore/src/dpl/core/include/dpl/abstract_input_output.h b/tests/dpl/include/dpl/abstract_input_output.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/abstract_input_output.h rename to tests/dpl/include/dpl/abstract_input_output.h diff --git a/vcore/src/dpl/core/include/dpl/abstract_output.h b/tests/dpl/include/dpl/abstract_output.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/abstract_output.h rename to tests/dpl/include/dpl/abstract_output.h diff --git a/vcore/src/dpl/core/include/dpl/assert.h b/tests/dpl/include/dpl/assert.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/assert.h rename to tests/dpl/include/dpl/assert.h diff --git a/vcore/src/dpl/core/include/dpl/availability.h b/tests/dpl/include/dpl/availability.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/availability.h rename to tests/dpl/include/dpl/availability.h diff --git a/vcore/src/dpl/core/include/dpl/binary_queue.h b/tests/dpl/include/dpl/binary_queue.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/binary_queue.h rename to tests/dpl/include/dpl/binary_queue.h diff --git a/vcore/src/dpl/core/include/dpl/colors.h b/tests/dpl/include/dpl/colors.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/colors.h rename to tests/dpl/include/dpl/colors.h diff --git a/vcore/src/dpl/core/include/dpl/errno_string.h b/tests/dpl/include/dpl/errno_string.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/errno_string.h rename to tests/dpl/include/dpl/errno_string.h diff --git a/vcore/src/dpl/core/include/dpl/exception.h b/tests/dpl/include/dpl/exception.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/exception.h rename to tests/dpl/include/dpl/exception.h diff --git a/vcore/src/dpl/core/include/dpl/foreach.h b/tests/dpl/include/dpl/foreach.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/foreach.h rename to tests/dpl/include/dpl/foreach.h diff --git a/vcore/src/dpl/core/include/dpl/free_deleter.h b/tests/dpl/include/dpl/free_deleter.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/free_deleter.h rename to tests/dpl/include/dpl/free_deleter.h diff --git a/vcore/src/dpl/core/include/dpl/lexical_cast.h b/tests/dpl/include/dpl/lexical_cast.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/lexical_cast.h rename to tests/dpl/include/dpl/lexical_cast.h diff --git a/vcore/src/dpl/core/include/dpl/noncopyable.h b/tests/dpl/include/dpl/noncopyable.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/noncopyable.h rename to tests/dpl/include/dpl/noncopyable.h diff --git a/vcore/src/dpl/core/include/dpl/preprocessor.h b/tests/dpl/include/dpl/preprocessor.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/preprocessor.h rename to tests/dpl/include/dpl/preprocessor.h diff --git a/vcore/src/dpl/core/include/dpl/scoped_fclose.h b/tests/dpl/include/dpl/scoped_fclose.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/scoped_fclose.h rename to tests/dpl/include/dpl/scoped_fclose.h diff --git a/vcore/src/dpl/core/include/dpl/scoped_free.h b/tests/dpl/include/dpl/scoped_free.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/scoped_free.h rename to tests/dpl/include/dpl/scoped_free.h diff --git a/vcore/src/dpl/core/include/dpl/scoped_resource.h b/tests/dpl/include/dpl/scoped_resource.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/scoped_resource.h rename to tests/dpl/include/dpl/scoped_resource.h diff --git a/vcore/src/dpl/core/include/dpl/singleton.h b/tests/dpl/include/dpl/singleton.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/singleton.h rename to tests/dpl/include/dpl/singleton.h diff --git a/vcore/src/dpl/core/include/dpl/singleton_impl.h b/tests/dpl/include/dpl/singleton_impl.h similarity index 100% rename from vcore/src/dpl/core/include/dpl/singleton_impl.h rename to tests/dpl/include/dpl/singleton_impl.h diff --git a/vcore/src/dpl/test/include/dpl/test/abstract_input_parser.h b/tests/dpl/include/dpl/test/abstract_input_parser.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/abstract_input_parser.h rename to tests/dpl/include/dpl/test/abstract_input_parser.h diff --git a/vcore/src/dpl/test/include/dpl/test/abstract_input_reader.h b/tests/dpl/include/dpl/test/abstract_input_reader.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/abstract_input_reader.h rename to tests/dpl/include/dpl/test/abstract_input_reader.h diff --git a/vcore/src/dpl/test/include/dpl/test/abstract_input_tokenizer.h b/tests/dpl/include/dpl/test/abstract_input_tokenizer.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/abstract_input_tokenizer.h rename to tests/dpl/include/dpl/test/abstract_input_tokenizer.h diff --git a/vcore/src/dpl/test/include/dpl/test/test_results_collector.h b/tests/dpl/include/dpl/test/test_results_collector.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/test_results_collector.h rename to tests/dpl/include/dpl/test/test_results_collector.h diff --git a/vcore/src/dpl/test/include/dpl/test/test_runner.h b/tests/dpl/include/dpl/test/test_runner.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/test_runner.h rename to tests/dpl/include/dpl/test/test_runner.h diff --git a/vcore/src/dpl/test/include/dpl/test/test_runner_child.h b/tests/dpl/include/dpl/test/test_runner_child.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/test_runner_child.h rename to tests/dpl/include/dpl/test/test_runner_child.h diff --git a/vcore/src/dpl/test/include/dpl/test/test_runner_multiprocess.h b/tests/dpl/include/dpl/test/test_runner_multiprocess.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/test_runner_multiprocess.h rename to tests/dpl/include/dpl/test/test_runner_multiprocess.h diff --git a/vcore/src/dpl/test/include/dpl/test/value_separated_parser.h b/tests/dpl/include/dpl/test/value_separated_parser.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/value_separated_parser.h rename to tests/dpl/include/dpl/test/value_separated_parser.h diff --git a/vcore/src/dpl/test/include/dpl/test/value_separated_policies.h b/tests/dpl/include/dpl/test/value_separated_policies.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/value_separated_policies.h rename to tests/dpl/include/dpl/test/value_separated_policies.h diff --git a/vcore/src/dpl/test/include/dpl/test/value_separated_reader.h b/tests/dpl/include/dpl/test/value_separated_reader.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/value_separated_reader.h rename to tests/dpl/include/dpl/test/value_separated_reader.h diff --git a/vcore/src/dpl/test/include/dpl/test/value_separated_tokenizer.h b/tests/dpl/include/dpl/test/value_separated_tokenizer.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/value_separated_tokenizer.h rename to tests/dpl/include/dpl/test/value_separated_tokenizer.h diff --git a/vcore/src/dpl/test/include/dpl/test/value_separated_tokens.h b/tests/dpl/include/dpl/test/value_separated_tokens.h similarity index 100% rename from vcore/src/dpl/test/include/dpl/test/value_separated_tokens.h rename to tests/dpl/include/dpl/test/value_separated_tokens.h diff --git a/tests/dpl/src/assert.cpp b/tests/dpl/src/assert.cpp new file mode 100644 index 0000000..74c41f3 --- /dev/null +++ b/tests/dpl/src/assert.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ +/* + * @file assert.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of assert + */ +#include +#include +#include +#include +#include +#include +#include + +namespace VcoreDPL { +void AssertProc(const char *condition, + const char *file, + int line, + const char *function) +{ + +#define INTERNAL_LOG(message) \ +do { \ + std::cerr << message << std::endl; \ +} while (0) + + // Try to log failed assertion to log system + Try { + INTERNAL_LOG("########################################################################"); + INTERNAL_LOG("### DPL assertion failed! ###"); + INTERNAL_LOG("########################################################################"); + INTERNAL_LOG("### Condition: " << condition); + INTERNAL_LOG("### File: " << file); + INTERNAL_LOG("### Line: " << line); + INTERNAL_LOG("### Function: " << function); + INTERNAL_LOG("########################################################################"); + } catch (Exception) { + // Just ignore possible double errors + } + + // Fail with c-library abort + abort(); +} +} // namespace VcoreDPL diff --git a/vcore/src/dpl/core/src/binary_queue.cpp b/tests/dpl/src/binary_queue.cpp similarity index 100% rename from vcore/src/dpl/core/src/binary_queue.cpp rename to tests/dpl/src/binary_queue.cpp diff --git a/vcore/src/dpl/core/src/colors.cpp b/tests/dpl/src/colors.cpp similarity index 100% rename from vcore/src/dpl/core/src/colors.cpp rename to tests/dpl/src/colors.cpp diff --git a/vcore/src/dpl/core/src/errno_string.cpp b/tests/dpl/src/errno_string.cpp similarity index 100% rename from vcore/src/dpl/core/src/errno_string.cpp rename to tests/dpl/src/errno_string.cpp diff --git a/vcore/src/dpl/db/src/naive_synchronization_object.cpp b/tests/dpl/src/exception.cpp similarity index 53% rename from vcore/src/dpl/db/src/naive_synchronization_object.cpp rename to tests/dpl/src/exception.cpp index f67694a..c12e794 100644 --- a/vcore/src/dpl/db/src/naive_synchronization_object.cpp +++ b/tests/dpl/src/exception.cpp @@ -14,31 +14,33 @@ * limitations under the License. */ /* - * @file naive_synchronization_object.cpp + * @file exception.cpp * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) * @version 1.0 - * @brief This file is the implementation file of SQL naive - * synchronization object + * @brief This file is the implementation of exception system */ #include -#include -#include - -namespace { - unsigned int seed = time(NULL); -} +#include +#include namespace VcoreDPL { -namespace DB { -void NaiveSynchronizationObject::Synchronize() +Exception* Exception::m_lastException = NULL; +unsigned int Exception::m_exceptionCount = 0; +void (*Exception::m_terminateHandler)() = NULL; + +void LogUnhandledException(const std::string &str) { - // Sleep for about 10ms - 30ms - Thread::MiliSleep(10 + rand_r(&seed) % 20); + std::cerr << str << std::endl; } -void NaiveSynchronizationObject::NotifyAll() +void LogUnhandledException(const std::string &str, + const char *filename, + int line, + const char *function) { - // No need to inform about anything + std::cerr << "Exception occured on file[" << filename + << "] line[" << line + << "] function[" << function + << "] msg[" << str << "]" << std::endl; } -} // namespace DB } // namespace VcoreDPL diff --git a/vcore/src/dpl/core/src/noncopyable.cpp b/tests/dpl/src/noncopyable.cpp similarity index 100% rename from vcore/src/dpl/core/src/noncopyable.cpp rename to tests/dpl/src/noncopyable.cpp diff --git a/vcore/src/dpl/core/src/singleton.cpp b/tests/dpl/src/singleton.cpp similarity index 100% rename from vcore/src/dpl/core/src/singleton.cpp rename to tests/dpl/src/singleton.cpp diff --git a/vcore/src/dpl/test/src/test_results_collector.cpp b/tests/dpl/src/test_results_collector.cpp similarity index 100% rename from vcore/src/dpl/test/src/test_results_collector.cpp rename to tests/dpl/src/test_results_collector.cpp diff --git a/vcore/src/dpl/test/src/test_runner.cpp b/tests/dpl/src/test_runner.cpp similarity index 100% rename from vcore/src/dpl/test/src/test_runner.cpp rename to tests/dpl/src/test_runner.cpp diff --git a/vcore/src/dpl/test/src/test_runner_child.cpp b/tests/dpl/src/test_runner_child.cpp similarity index 100% rename from vcore/src/dpl/test/src/test_runner_child.cpp rename to tests/dpl/src/test_runner_child.cpp diff --git a/vcore/src/dpl/test/src/test_runner_multiprocess.cpp b/tests/dpl/src/test_runner_multiprocess.cpp similarity index 99% rename from vcore/src/dpl/test/src/test_runner_multiprocess.cpp rename to tests/dpl/src/test_runner_multiprocess.cpp index f377b1e..4785888 100644 --- a/vcore/src/dpl/test/src/test_runner_multiprocess.cpp +++ b/tests/dpl/src/test_runner_multiprocess.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include diff --git a/vcore/src/dpl/test/src/value_separated_policies.cpp b/tests/dpl/src/value_separated_policies.cpp similarity index 100% rename from vcore/src/dpl/test/src/value_separated_policies.cpp rename to tests/dpl/src/value_separated_policies.cpp diff --git a/vcore/src/dpl/test/src/value_separated_tokens.cpp b/tests/dpl/src/value_separated_tokens.cpp similarity index 100% rename from vcore/src/dpl/test/src/value_separated_tokens.cpp rename to tests/dpl/src/value_separated_tokens.cpp diff --git a/tests/pkcs12/CMakeLists.txt b/tests/pkcs12/CMakeLists.txt index 50d2d84..3415e3b 100644 --- a/tests/pkcs12/CMakeLists.txt +++ b/tests/pkcs12/CMakeLists.txt @@ -28,12 +28,11 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/tests/pkcs12 ) -ADD_EXECUTABLE(${TARGET_PKCS12_TEST} ${PKCS12_TEST_SOURCES}) +ADD_EXECUTABLE(${TARGET_PKCS12_TEST} ${PKCS12_TEST_SOURCES} ${DPL_TEST_SOURCES}) TARGET_LINK_LIBRARIES(${TARGET_PKCS12_TEST} ${TARGET_VCORE_LIB} - ${VCORE_TEST_DEP_LIBRARIES} - -ldl + ${TEST_DEP_LIBRARIES} ) INSTALL(TARGETS ${TARGET_PKCS12_TEST} diff --git a/tests/pkcs12/new_test_cases.cpp b/tests/pkcs12/new_test_cases.cpp index c304ba2..818847b 100644 --- a/tests/pkcs12/new_test_cases.cpp +++ b/tests/pkcs12/new_test_cases.cpp @@ -16,102 +16,100 @@ /* * @file new_test_cases.cpp * @author Madhan A K (madhan.ak@samsung.com) - * @version 1.0 + * @author Kyungwook Tak (k.tak@samsung.com) + * @version 2.0 * @brief PKCS#12 test cases. */ -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include + #include #include #include #include #include -#include + +#include +#include +#include +#include +#include + +#include static CertSvcInstance instance; -#define CREATE_INSTANCE \ +static CertSvcString wrapper_certsvc_string_new(const char *cStr) +{ + CertSvcString certsvcStr; + + if (!cStr) { + certsvcStr.privateHandler = NULL; + return certsvcStr; + } + + RUNNER_ASSERT_MSG( + certsvc_string_new(instance, cStr, strlen(cStr), &certsvcStr) == CERTSVC_SUCCESS, + "Failed to certsvc_string_new"); + + return certsvcStr; +} + +const CertStoreType allStoreType = (CertStoreType)(WIFI_STORE | VPN_STORE | EMAIL_STORE); + +#define CREATE_INSTANCE \ certsvc_instance_new(&instance); -#define FREE_INSTANCE \ +#define FREE_INSTANCE \ certsvc_instance_free(instance); -/* Getting the certificate list from system_store */ -RUNNER_TEST(CERTSVC_PKCS12_1001_certsvc_get_root_cert_list) { - - CertStoreType storeType = SYSTEM_STORE; - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - int result; - int count = 0; +RUNNER_TEST(CERTSVC_PKCS12_1001_certsvc_get_root_cert_list) +{ CREATE_INSTANCE + CertSvcStoreCertList* certList = NULL; size_t length = 0; - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - if(result == CERTSVC_SUCCESS) - { - tmpNode = certList; - while(tmpNode != NULL) - { - count++; - tmpNode = tmpNode->next; - } - - result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); - } + int result = certsvc_pkcs12_get_certificate_list_from_store(instance, SYSTEM_STORE, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed"); + + result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); FREE_INSTANCE } -/* Set the status of the certificate to disabled/enabled in system store and get the status */ RUNNER_TEST(CERTSVC_PKCS12_1002_certsvc_set_cert_to_disabled_and_get_status_for_system_store) { - CertStoreType storeType = SYSTEM_STORE; - CertStatus Status; - CertStatus status; + CertStatus status = ENABLED; int result; - CertSvcString Alias; CREATE_INSTANCE - result = certsvc_string_new(instance, "Certum_Root_CA.pem", strlen("Certum_Root_CA.pem"), &Alias); - RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_string_new failed. result : " << result); + CertSvcString Alias = wrapper_certsvc_string_new("Certum_Root_CA.pem"); - result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed."); + result = certsvc_pkcs12_get_certificate_status_from_store(instance, SYSTEM_STORE, Alias, &status); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed."); // if status is already disabled, roll it back to enable and go on if (status == DISABLED) { - result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, ENABLED); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Roll back certificate status to system store failed."); + result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias, ENABLED); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Roll back certificate status to system store failed."); } - Status=DISABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to system store failed."); + result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias, DISABLED); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed."); - result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed."); + result = certsvc_pkcs12_get_certificate_status_from_store(instance, SYSTEM_STORE, Alias, &status); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed."); + RUNNER_ASSERT_MSG(status == DISABLED, "invalid status from system store cert"); - Status=ENABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to system store failed."); + result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias, ENABLED); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed."); - result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed."); + result = certsvc_pkcs12_get_certificate_status_from_store(instance, SYSTEM_STORE, Alias, &status); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed."); + RUNNER_ASSERT_MSG(status == ENABLED, "invalid status from system store cert"); certsvc_string_free(Alias); @@ -121,1231 +119,816 @@ RUNNER_TEST(CERTSVC_PKCS12_1002_certsvc_set_cert_to_disabled_and_get_status_for_ /* Install a CRT file to individual stores */ RUNNER_TEST(CERTSVC_PKCS12_1003_add_pem_file_in_individual_store) { - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - CertSvcStoreCertList* tmp = NULL; - CertStoreType type; int result; - size_t length = 0; - int count = 0; - - CertSvcStoreCertList* certList1 = NULL; - CertSvcString buffer1, gname; - CertSvcString buffer2; - const char *temp = NULL; - CertSvcCertificate certificate; - - CertSvcString Alias; - CertSvcString Path; - CertSvcString Pass; CREATE_INSTANCE - Pass.privateHandler = NULL; + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifi-server.pem"); + CertSvcString Pass = wrapper_certsvc_string_new(NULL); - const char *path = "/usr/share/cert-svc/tests/wifi-server.pem"; - result = certsvc_string_new(instance, path, strlen(path), &Path); - RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_string_new failed. result : " << result); - - type = WIFI_STORE; - const char *cAlias = "PEM-wifi-server-1"; - result = certsvc_string_new(instance, cAlias, strlen(cAlias), &Alias); - RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_string_new failed. result : " << result); - - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PEM file to WIFI store failed."); + CertSvcString Alias = wrapper_certsvc_string_new("PEM-wifi-server-1"); + result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to WIFI store failed."); certsvc_string_free(Alias); - type = VPN_STORE; - cAlias = "PEM-wifi-server-2"; - result = certsvc_string_new(instance, cAlias, strlen(cAlias), &Alias); - RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_string_new failed. result : " << result); - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PEM file to VPN store failed."); + Alias = wrapper_certsvc_string_new("PEM-wifi-server-2"); + result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to VPN store failed."); certsvc_string_free(Alias); - type = EMAIL_STORE; - cAlias = "PEM-wifi-server-3"; - result = certsvc_string_new(instance, cAlias, strlen(cAlias), &Alias); - RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_string_new failed. result : " << result); - - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PEM file to EMAIL store failed."); + Alias = wrapper_certsvc_string_new("PEM-wifi-server-3"); + result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to EMAIL store failed."); certsvc_string_free(Alias); - type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - - if(result == CERTSVC_SUCCESS) - { - - tmpNode = certList; - while(tmpNode != NULL) - { - count++; - tmp = tmpNode; - tmpNode = tmpNode->next; - } - result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); + certsvc_string_free(Path); - } + CertSvcStoreCertList *certList = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed."); - certList = NULL; - type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); - certList1=certList; - count = 0; + CertSvcStoreCertList *certListOrig = certList; + int count = 0; + CertSvcString strSubject; + CertSvcString strIssuer; + CertSvcCertificate certificate; while (certList) { result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get certificate from store."); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get certificate from store."); - result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &buffer1); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field."); - - result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &buffer2); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field."); + result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field."); - certsvc_string_to_cstring(buffer1, &temp, &length); - certsvc_string_to_cstring(buffer2, &temp, &length); + result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field."); - certsvc_string_free(buffer1); - certsvc_string_free(buffer2); + certsvc_string_free(strSubject); + certsvc_string_free(strIssuer); certsvc_certificate_free(certificate); certList = certList->next; count++; } - certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList1); - if (certList1 != NULL) - certList=NULL; - certList1=NULL; - - certsvc_string_free(Path); + certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig); FREE_INSTANCE } -/* Installing pem file in all store at once */ -RUNNER_TEST(CERTSVC_PKCS12_1004_add_pem_file_in_all_store) { - - const char path[] = "/usr/share/cert-svc/tests/wifi-server.pem"; - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - CertSvcStoreCertList* tmp = NULL; - char* pass = NULL; - char *alias = "PEM-wifi-server-all-store"; - CertStoreType type; +RUNNER_TEST(CERTSVC_PKCS12_1004_add_pem_file_in_all_store) +{ int result; - int count = 0; - size_t length = 0; CREATE_INSTANCE - CertSvcString Alias, Path, Pass; - - Alias.privateHandler = alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = pass; - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); - - type = (CertStoreType) (VPN_STORE | EMAIL_STORE | WIFI_STORE); - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PEM file to all store failed."); - - type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - - if(result == CERTSVC_SUCCESS) - { - tmpNode = certList; - while(tmpNode != NULL) - { - count++; - tmp = tmpNode; - tmpNode = tmpNode->next; - } - result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); - } - FREE_INSTANCE -} + CertSvcString Alias = wrapper_certsvc_string_new("PEM-wifi-server-all-store"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifi-server.pem"); + CertSvcString Pass = wrapper_certsvc_string_new(NULL); -/* Install a CRT file to individual stores */ -RUNNER_TEST(CERTSVC_PKCS12_1005_add_crt_file_in_individual_store) { + result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to all store failed."); - const char path[] = "/usr/share/cert-svc/tests/Testing.crt"; - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - CertSvcStoreCertList* tmp = NULL; - char* pass = NULL; - char *alias = "CRT-TestingCRT1"; - CertStoreType type; - int result; + CertSvcStoreCertList *certList = NULL; size_t length = 0; - int count = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list failed"); - CertSvcStoreCertList* certList1 = NULL; - CertSvcString buffer1, gname; - CertSvcString buffer2; - const char *temp = NULL; - CertSvcCertificate certificate; + result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list failed"); + + certsvc_string_free(Alias); + certsvc_string_free(Path); + + FREE_INSTANCE +} + +RUNNER_TEST(CERTSVC_PKCS12_1005_add_crt_file_in_individual_store) +{ + int result; CREATE_INSTANCE - CertSvcString Alias, Path, Pass; - - Alias.privateHandler = alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = pass; - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); - - type = WIFI_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing CRT file to WIFI store failed."); - - type = VPN_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing CRT file to VPN store failed."); - - type = EMAIL_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing CRT file to EMAIL store failed."); - - type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - - if(result == CERTSVC_SUCCESS) - { - tmpNode = certList; - while(tmpNode != NULL) - { - count++; - tmp = tmpNode; - tmpNode = tmpNode->next; - } - result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); - } - certList = NULL; - type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); - certList1=certList; - count = 0; - while(certList!=NULL) - { - gname.privateHandler = (char *)certList->gname; - gname.privateLength = strlen(certList->gname); + CertSvcString Alias = wrapper_certsvc_string_new("CRT-TestingCRT1"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/Testing.crt"); + CertSvcString Pass = wrapper_certsvc_string_new(NULL); + + result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to WIFI store failed."); + + result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to VPN store failed."); + + result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to EMAIL store failed."); + + CertSvcStoreCertList *certList = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed."); + + CertSvcStoreCertList *certListOrig = certList; + int count = 0; + CertSvcString strSubject; + CertSvcString strIssuer; + CertSvcCertificate certificate; + while (certList) { result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate); RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get certificate from store."); - result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &buffer1); + result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject); RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field."); - result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &buffer2); + result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer); RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field."); - certsvc_string_to_cstring(buffer1, &temp, &length); - certsvc_string_to_cstring(buffer2, &temp, &length); - - certsvc_string_free(buffer1); - certsvc_string_free(buffer2); + certsvc_string_free(strSubject); + certsvc_string_free(strIssuer); certsvc_certificate_free(certificate); certList = certList->next; count++; } - certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList1); - certList=NULL; - certList1=NULL; + + certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig); FREE_INSTANCE } -/* Install a CRT file to all store at once */ -RUNNER_TEST(CERTSVC_PKCS12_1006_add_crt_file_in_all_store) { - - const char path[] = "/usr/share/cert-svc/tests/Testing.crt"; - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - CertSvcStoreCertList* tmp = NULL; - char* pass = NULL; - char *alias = "CRT-TestingCRT1-all-store"; - CertStoreType type; +RUNNER_TEST(CERTSVC_PKCS12_1006_add_crt_file_in_all_store) +{ int result; - int count = 0; - size_t length = 0; CREATE_INSTANCE - CertSvcString Alias, Path, Pass; - - Alias.privateHandler = alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = pass; - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); - - type = (CertStoreType )(WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing CRT file to all store failed."); - - type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - - if(result == CERTSVC_SUCCESS) - { - tmpNode = certList; - while(tmpNode != NULL) - { - count++; - tmp = tmpNode; - tmpNode = tmpNode->next; - } - result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); - } + CertSvcString Alias = wrapper_certsvc_string_new("CRT-TestingCRT1-all-store"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/Testing.crt"); + CertSvcString Pass = wrapper_certsvc_string_new(NULL); + + result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to all store failed."); + + CertSvcStoreCertList *certList = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed"); + + result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); + + certsvc_string_free(Alias); + certsvc_string_free(Path); FREE_INSTANCE } -/* Import a P12 file to individual store */ -RUNNER_TEST(CERTSVC_PKCS12_1007_install_p12_file_to_individual_store) { - - const char path[] = "/usr/share/cert-svc/tests/wifiuser.p12"; - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - CertSvcStoreCertList* tmp = NULL; - const char pass[] = "wifi"; - char *alias = "P12-WifiUser"; - CertStoreType storeType; +RUNNER_TEST(CERTSVC_PKCS12_1007_install_p12_file_to_individual_store) +{ int result; - size_t length = 0; - int count = 0; CREATE_INSTANCE - CertSvcString Alias, Path, Pass; - Alias.privateHandler = (char *)alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = (char *)pass; - Pass.privateLength = strlen(pass); - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); + CertSvcString Alias = wrapper_certsvc_string_new("P12-WifiUser"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifiuser.p12"); + CertSvcString Pass = wrapper_certsvc_string_new("wifi"); -/* - result = certsvc_pkcs12_import_from_file(instance, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_pkcs12_import_from_file failed."); -*/ - - storeType = WIFI_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing p12 file to WIFI store failed."); - - storeType = VPN_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing p12 file to VPN store failed."); - - storeType = EMAIL_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing p12 file to EMAIL store failed."); - - storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - - if(result == CERTSVC_SUCCESS) - { - tmpNode = certList; - while(tmpNode != NULL) - { - count++; - tmp = tmpNode; - tmpNode = tmpNode->next; - } - result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); - } + result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to WIFI store failed."); - FREE_INSTANCE -} + result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to VPN store failed."); -/* Import a P12 file to all store */ -RUNNER_TEST(CERTSVC_PKCS12_1008_install_p12_file_to_all_store) { + result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to EMAIL store failed."); - const char path[] = "/usr/share/cert-svc/tests/wifiuser.p12"; CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - CertSvcStoreCertList* tmp = NULL; - const char pass[] = "wifi"; - char *alias = "P12-WifiUser-all-store"; - CertStoreType storeType; - int result; size_t length = 0; - int count =0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - CREATE_INSTANCE - CertSvcString Alias, Path, Pass; - - Alias.privateHandler = (char *)alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = (char *)pass; - Pass.privateLength = strlen(pass); - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); - - storeType = (CertStoreType )(WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing p12 file to WIFI store failed."); - - storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - - if(result == CERTSVC_SUCCESS) - { - tmpNode = certList; - while(tmpNode != NULL) - { - count++; - tmp = tmpNode; - tmpNode = tmpNode->next; - } - result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); - } + result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); + + certsvc_string_free(Alias); + certsvc_string_free(Path); + certsvc_string_free(Pass); FREE_INSTANCE } -/* Import a P12 file to individual store */ -RUNNER_TEST(CERTSVC_PKCS12_1009_install_pfx_file_to_individual_store) { +RUNNER_TEST(CERTSVC_PKCS12_1008_install_p12_file_to_all_store) +{ + int result; + + CREATE_INSTANCE + + CertSvcString Alias = wrapper_certsvc_string_new("P12-WifiUser-all-store"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifiuser.p12"); + CertSvcString Pass = wrapper_certsvc_string_new("wifi"); + + result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to WIFI store failed."); - const char path[] = "/usr/share/cert-svc/tests/wifiserver.pfx"; CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - CertSvcStoreCertList* tmp = NULL; - const char pass[] = "wifi"; - char *alias = "PFX-WifiServer"; - CertStoreType storeType; - int result; - int count = 0; size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - CREATE_INSTANCE - CertSvcString Alias, Path, Pass; - - Alias.privateHandler = (char *)alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = (char *)pass; - Pass.privateLength = strlen(pass); - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); - - storeType = WIFI_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed."); - - storeType = VPN_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to VPN store failed."); - - storeType = EMAIL_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to EMAIL store failed."); - - storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - - if(result == CERTSVC_SUCCESS) - { - tmpNode = certList; - while(tmpNode != NULL) - { - count++; - tmp = tmpNode; - tmpNode = tmpNode->next; - } - result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); - } + result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); + + certsvc_string_free(Alias); + certsvc_string_free(Path); + certsvc_string_free(Pass); FREE_INSTANCE } -RUNNER_TEST(CERTSVC_PKCS12_1010_install_pfx_file_to_all_store) { +RUNNER_TEST(CERTSVC_PKCS12_1009_install_pfx_file_to_individual_store) +{ + int result; + + CREATE_INSTANCE + + CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifiserver.pfx"); + CertSvcString Pass = wrapper_certsvc_string_new("wifi"); + + result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed."); + + result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to VPN store failed."); + + result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to EMAIL store failed."); - const char path[] = "/usr/share/cert-svc/tests/wifiserver.pfx"; - const char pass[] = "wifi"; - char *alias = "PFX-WifiServer-all-store"; - CertStoreType storeType; CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - CertSvcStoreCertList* tmp = NULL; size_t length = 0; - int count = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed"); + + result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); + + certsvc_string_free(Alias); + certsvc_string_free(Path); + certsvc_string_free(Pass); + + FREE_INSTANCE +} + +RUNNER_TEST(CERTSVC_PKCS12_1010_install_pfx_file_to_all_store) +{ int result; CREATE_INSTANCE - CertSvcString Alias, Path, Pass; - - Alias.privateHandler = (char *)alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = (char *)pass; - Pass.privateLength = strlen(pass); - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); - - storeType = (CertStoreType) (VPN_STORE | EMAIL_STORE | WIFI_STORE); - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed."); - - storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - - if(result == CERTSVC_SUCCESS) - { - - tmpNode = certList; - while(tmpNode != NULL) - { - count++; - tmp = tmpNode; - tmpNode = tmpNode->next; - } - result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); - } + + CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-all-store"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifiserver.pfx"); + CertSvcString Pass = wrapper_certsvc_string_new("wifi"); + + result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed."); + + CertSvcStoreCertList* certList = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed"); + + result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); + + certsvc_string_free(Alias); + certsvc_string_free(Path); + certsvc_string_free(Pass); FREE_INSTANCE } /* Getting all end user & root certificate list from WIFI,VPN,EMAIL store */ -RUNNER_TEST(CERTSVC_PKCS12_1011_get_all_end_user_certificate_from_store) { - - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - CertStoreType storeType = (CertStoreType) (WIFI_STORE); +RUNNER_TEST(CERTSVC_PKCS12_1011_get_all_end_user_certificate_from_store) +{ int result; - size_t length; CREATE_INSTANCE - result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, storeType, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed."); - tmpNode=certList; - while(tmpNode!=NULL) - { - tmpNode = tmpNode->next; - } + CertSvcStoreCertList *certList = NULL; + size_t length; + result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, WIFI_STORE, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting end user certificate list from WIFI_STORE failed."); certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - certList = NULL; - tmpNode = NULL; - - storeType = (CertStoreType) (VPN_STORE); - result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, storeType, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed."); - tmpNode=certList; - while(tmpNode!=NULL) - { - tmpNode = tmpNode->next; - } + + result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, VPN_STORE, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting end user certificate list from VPN_STORE failed."); certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - certList = NULL; - tmpNode = NULL; - - storeType = (CertStoreType) (EMAIL_STORE); - result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, storeType, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed."); - tmpNode=certList; - while(tmpNode!=NULL) - { - tmpNode = tmpNode->next; - } + + result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, EMAIL_STORE, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting end user certificate list from EMAIL_STORE failed."); certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - certList = NULL; - tmpNode = NULL; - - storeType = (CertStoreType) (WIFI_STORE); - result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, storeType, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed."); - tmpNode=certList; - while(tmpNode!=NULL) - { - tmpNode = tmpNode->next; - } + + result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, WIFI_STORE, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting root certificate list from WIFI_STORE failed."); certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - certList = NULL; - tmpNode = NULL; - - storeType = (CertStoreType) (VPN_STORE); - result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, storeType, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed."); - tmpNode=certList; - while(tmpNode!=NULL) - { - tmpNode = tmpNode->next; - } + + result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, VPN_STORE, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting root certificate list from VPN_STORE failed."); certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - certList = NULL; - tmpNode = NULL; - - storeType = (CertStoreType) (EMAIL_STORE); - result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, storeType, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed."); - tmpNode=certList; - while(tmpNode!=NULL) - { - tmpNode = tmpNode->next; - } + + result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, EMAIL_STORE, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting root certificate list from EMAIL_STORE failed."); certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - certList = NULL; - tmpNode = NULL; FREE_INSTANCE } -/* Delete all certificate from WIFI,VPN,EMAIL store */ -RUNNER_TEST(CERTSVC_PKCS12_1012_delete_all_cert_from_multiple_store) { - - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* certList1 = NULL; - CertStoreType storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); +RUNNER_TEST(CERTSVC_PKCS12_1012_delete_all_cert_from_multiple_store) +{ int result; - size_t length; CertSvcString gname; CREATE_INSTANCE - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); - certList1=certList; - while(certList1!=NULL) - { - gname.privateHandler = (char *)certList1->gname; - gname.privateLength = strlen(certList1->gname); - result = certsvc_pkcs12_delete_certificate_from_store(instance, (CertStoreType) certList1->storeType, gname); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Deleting certificate from store failed."); - certList1 = certList1->next; + CertSvcStoreCertList *certList = NULL; + size_t length; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed."); + + CertSvcStoreCertList *certListOrig = certList; + while (certList) { + gname = wrapper_certsvc_string_new(certList->gname); + result = certsvc_pkcs12_delete_certificate_from_store(instance, certList->storeType, gname); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Deleting certificate from store failed."); + + certsvc_string_free(gname); + + certList = certList->next; } - certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - certList=NULL; + + certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig); FREE_INSTANCE } -/* Import the file to one store and try to get the certlist from all store */ -RUNNER_TEST(CERTSVC_PKCS12_1013_install_pfx_file_to_one_store_and_get_list_from_multiple_store) { - - const char path[] = "/usr/share/cert-svc/tests/wifiserver.pfx"; - const char pass[] = "wifi"; - char *alias = "PFX-WifiServer-one-store"; - CertStoreType storeType; - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - CertSvcStoreCertList* tmp = NULL; - size_t length = 0; - int count = 0; - int result = -1; - gboolean exists = FALSE; +RUNNER_TEST(CERTSVC_PKCS12_1013_install_pfx_file_to_one_store_and_get_list_from_multiple_store) +{ + int result; CREATE_INSTANCE - CertSvcString Alias, Path, Pass; - - Alias.privateHandler = (char *)alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = (char *)pass; - Pass.privateLength = strlen(pass); - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); - - storeType = (CertStoreType) (VPN_STORE | WIFI_STORE | EMAIL_STORE); - result = certsvc_pkcs12_check_alias_exists_in_store(instance, storeType, Alias, &exists); - if (exists==TRUE) { - /* installing the pfx in one store and getting the list from multiple store */ - storeType = (CertStoreType) ( EMAIL_STORE ); - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed."); - - storeType = (CertStoreType) ( VPN_STORE | WIFI_STORE ); - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed."); - - storeType = (CertStoreType) ( VPN_STORE | WIFI_STORE | EMAIL_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed"); - - if(result == CERTSVC_SUCCESS) - { - tmpNode = certList; - while(tmpNode != NULL) - { - count++; - tmp = tmpNode; - tmpNode = tmpNode->next; - } - result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed"); - } + + CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-one-store"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifiserver.pfx"); + CertSvcString Pass = wrapper_certsvc_string_new("wifi"); + + int isUnique = 0; + result = certsvc_pkcs12_check_alias_exists_in_store(instance, allStoreType, Alias, &isUnique); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "check alias exists in store failed. result : " << result); + + if (!isUnique) { + /* TODO: remove certificate which already exists and test continue */ + RUNNER_ASSERT_MSG(0, "Remove certificate which already exists and test continue"); } + result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to EMAIL_STORE failed."); + + result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to WIFI_STORE failed."); + + CertSvcStoreCertList *certList = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from all store failed"); + + certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList); + + certsvc_string_free(Alias); + certsvc_string_free(Path); + certsvc_string_free(Pass); + FREE_INSTANCE } -/* Set the status of the certificate to disabled and trying to delete store */ -RUNNER_TEST(CERTSVC_PKCS12_1014_installing_pfx_without_password_to_individual_store) { - - const char path[] = "/usr/share/cert-svc/tests/without_pass.p12"; - const char pass[] = ""; - char *alias = "PFX-WifiServer-without-password"; - CertStoreType storeType; +RUNNER_TEST(CERTSVC_PKCS12_1014_installing_pfx_without_password_to_individual_store) +{ int result; - int exists; CREATE_INSTANCE - CertSvcString Alias, Path, Pass; - - Alias.privateHandler = (char *)alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = (char *)pass; - Pass.privateLength = strlen(pass); - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); - - storeType = (CertStoreType) (VPN_STORE | WIFI_STORE | EMAIL_STORE); - result = certsvc_pkcs12_check_alias_exists_in_store(instance, storeType, Alias, &exists); - if (exists==TRUE) { - storeType = (CertStoreType) (VPN_STORE | WIFI_STORE | EMAIL_STORE); - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed."); + + CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-without-password"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/without_pass.p12"); + CertSvcString Pass = wrapper_certsvc_string_new(""); + + int isUnique = 0; + result = certsvc_pkcs12_check_alias_exists_in_store(instance, allStoreType, Alias, &isUnique); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "check alias exists in store failed. result : " << result); + + if (!isUnique) { + /* TODO: remove certificate which already exists and test continue */ + RUNNER_ASSERT_MSG(0, "Remove certificate which already exists and test continue"); } + result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to all store failed. result : " << result ); + + certsvc_string_free(Alias); + certsvc_string_free(Path); + FREE_INSTANCE } -/* Get certificate from WIFI,VPN,EMAIL store */ RUNNER_TEST(CERTSVC_PKCS12_1015_get_certificate_from_store) { - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* certList1 = NULL; - CertStoreType storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE); int result; - size_t length; - CertSvcString buffer1, gname; - CertSvcString buffer2; - const char *temp = NULL; - CertSvcCertificate certificate; CREATE_INSTANCE - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); - certList1=certList; - while(certList!=NULL) - { - gname.privateHandler = (char *)certList->gname; - gname.privateLength = strlen(certList->gname); - result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get certificate from store."); + CertSvcStoreCertList *certList = NULL; + size_t length; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from all store failed."); + if (length == 0 || !certList) { + /* TODO: add any cert to store for testing */ + RUNNER_ASSERT_MSG(0, "add any cert in store for testing"); + } - result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &buffer1); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field."); + CertSvcStoreCertList *certListOrig = certList; + CertSvcString strSubject; + CertSvcString strIssuer; + CertSvcCertificate certificate; + while (certList) { + result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get certificate from store."); - certsvc_string_to_cstring(buffer1, &temp, &length); + result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field."); - result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &buffer2); + result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer); RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field."); - certsvc_string_to_cstring(buffer2, &temp, &length); - - certsvc_string_free(buffer1); - certsvc_string_free(buffer2); + certsvc_string_free(strSubject); + certsvc_string_free(strIssuer); certsvc_certificate_free(certificate); certList = certList->next; } - certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList1); - certList=NULL; - certList1=NULL; + + certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig); FREE_INSTANCE } -/* Get certificate from system store */ -RUNNER_TEST(CERTSVC_PKCS12_1016_get_certificate_from_system_store) { - - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* certList1 = NULL; - CertStoreType storeType = (CertStoreType) (SYSTEM_STORE); - int result = CERTSVC_SUCCESS; - size_t length = 0; - int count = 0; - CertSvcString buffer1, gname; - CertSvcString buffer2; - const char *temp = NULL; - CertSvcCertificate certificate; +RUNNER_TEST(CERTSVC_PKCS12_1016_get_certificate_from_system_store) +{ + int result; CREATE_INSTANCE - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); - certList1=certList; - while(certList!=NULL) - { - gname.privateHandler = (char *)certList->gname; - gname.privateLength = strlen(certList->gname); + CertSvcStoreCertList *certList = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, SYSTEM_STORE, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed."); + if (length == 0 || !certList) { + /* TODO: add any cert to store for testing */ + RUNNER_ASSERT_MSG(0, "add any cert in store for testing"); + } + + CertSvcStoreCertList *certListOrig = certList; + CertSvcString strSubject; + CertSvcString strIssuer; + CertSvcCertificate certificate; + while (certList) { result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate); RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get certificate from store."); - result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &buffer1); + result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject); RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field."); - result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &buffer2); + result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer); RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field."); - certsvc_string_to_cstring(buffer1, &temp, &length); - certsvc_string_to_cstring(buffer2, &temp, &length); - - certsvc_string_free(buffer1); - certsvc_string_free(buffer2); + certsvc_string_free(strSubject); + certsvc_string_free(strIssuer); certsvc_certificate_free(certificate); certList = certList->next; - count++; } - certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList1); - certList=NULL; - certList1=NULL; + certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig); FREE_INSTANCE } -/* Load certificate list form store for a certificate */ -RUNNER_TEST(CERTSVC_PKCS12_1017_load_cert_list_from_store) { - - CertStoreType storeType; - CertSvcCertificateList certList; - CertSvcStoreCertList* certList1 = NULL; - CertSvcCertificate cert; - int result = CERTSVC_SUCCESS; - size_t length = 0; - int i=0; - size_t certListlength = 0; - const char *temp = NULL; - CertSvcString buffer1,buffer2, gname; +RUNNER_TEST(CERTSVC_PKCS12_1017_load_cert_list_from_store) +{ + int result; CREATE_INSTANCE - storeType = (CertStoreType) (VPN_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList1, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); - while(certList1!=NULL) - { - gname.privateHandler = (char *)certList1->gname; - gname.privateLength = strlen(certList1->gname); + CertSvcStoreCertList *certListTemp = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, VPN_STORE, DISABLED, &certListTemp, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from VPN_STORE failed."); + if (length == 0 || !certListTemp) { + /* TODO: add any cert to store for testing */ + RUNNER_ASSERT_MSG(0, "add any cert in store for testing"); + } - result = certsvc_pkcs12_load_certificate_list_from_store(instance, storeType, gname, &certList); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Load certificate list form store failed."); + CertSvcString strSubject; + CertSvcString strIssuer; + CertSvcCertificate cert; + CertSvcString gname = wrapper_certsvc_string_new(certListTemp->gname); - result = certsvc_certificate_list_get_length(certList, &certListlength); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate list get length failed."); + CertSvcCertificateList certList; + result = certsvc_pkcs12_load_certificate_list_from_store(instance, VPN_STORE, gname, &certList); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Load certificate list form VPN_STORE failed."); + certsvc_string_free(gname); - for(i=0; i 0, "No certificate loaded."); - result = certsvc_certificate_get_string_field(cert, CERTSVC_SUBJECT, &buffer1); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field."); + for (size_t i = 0; i < length; i++) { + result = certsvc_certificate_list_get_one(certList, i, &cert); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_certificate_list_get_one failed."); - certsvc_string_to_cstring(buffer1, &temp, &length); + result = certsvc_certificate_get_string_field(cert, CERTSVC_SUBJECT, &strSubject); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field."); - result = certsvc_certificate_get_string_field(cert, CERTSVC_ISSUER_COMMON_NAME, &buffer2); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field."); + result = certsvc_certificate_get_string_field(cert, CERTSVC_ISSUER_COMMON_NAME, &strIssuer); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field."); - certsvc_string_to_cstring(buffer2, &temp, &length); - } - break; // Should run for only one time // + certsvc_string_free(strSubject); + certsvc_string_free(strIssuer); + certsvc_certificate_free(cert); } + certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListTemp); + FREE_INSTANCE } -/* Load certificate list form store for a certificate */ -RUNNER_TEST(CERTSVC_PKCS12_1018_get_duplicate_private_key) { - - CertStoreType storeType; - CertSvcStoreCertList* certList1 = NULL; - FILE *fp = NULL; - int result = CERTSVC_SUCCESS; - size_t length = 0; - CertSvcString gname; +RUNNER_TEST(CERTSVC_PKCS12_1018_get_duplicate_private_key) +{ const char *privatekey_path = "/usr/share/cert-svc/pkcs12/temp.txt"; - EVP_PKEY *privatekey = NULL; + int result; CREATE_INSTANCE - storeType = (CertStoreType) (VPN_STORE); - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList1, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); - while(certList1!=NULL) - { - gname.privateHandler = (char *)certList1->gname; - gname.privateLength = strlen(certList1->gname); - result = certsvc_pkcs12_dup_evp_pkey_from_store(instance, storeType, gname, &privatekey); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting duplicate private key from store failed."); - - if ((fp = fopen(privatekey_path, "w")) == NULL) { - result = CERTSVC_FAIL; - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to open file for writing."); - } + CertSvcStoreCertList *certListTemp = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, VPN_STORE, DISABLED, &certListTemp, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from VPN_STORE failed."); + if (length == 0 || !certListTemp) { + /* TODO: add any cert to store for testing */ + RUNNER_ASSERT_MSG(0, "add any cert in store for testing"); + } - result = PEM_write_PrivateKey(fp, privatekey, NULL, NULL, 0, NULL, NULL); - RUNNER_ASSERT_MSG(result!=0, "Failed to write private key onto file."); - fclose(fp); + CertSvcString gname = wrapper_certsvc_string_new(certListTemp->gname); + EVP_PKEY *privatekey = NULL; + result = certsvc_pkcs12_dup_evp_pkey_from_store(instance, VPN_STORE, gname, &privatekey); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting duplicate private key from store failed."); + certsvc_string_free(gname); - certsvc_pkcs12_free_evp_pkey(privatekey); + FILE *fp = NULL; + if (!(fp = fopen(privatekey_path, "w"))) + RUNNER_ASSERT_MSG(0, "Failed to open file for writing."); - break; // Should run for only one time // - } + result = PEM_write_PrivateKey(fp, privatekey, NULL, NULL, 0, NULL, NULL); + fclose(fp); + unlink(privatekey_path); + + RUNNER_ASSERT_MSG(result != 0, "Failed to write private key onto file."); + + certsvc_pkcs12_free_evp_pkey(privatekey); FREE_INSTANCE } -/* Get certificate from system store */ -RUNNER_TEST(CERTSVC_PKCS12_1019_check_alias_exists) { - - char *alias = "PFX-WifiServer-without-password"; - CertStoreType storeType; - int result = CERTSVC_SUCCESS; - gboolean exists = FALSE; +RUNNER_TEST(CERTSVC_PKCS12_1019_check_alias_exists) +{ + int result; CREATE_INSTANCE - CertSvcString Alias; - Alias.privateHandler = (char *)alias; - Alias.privateLength = strlen(alias); - storeType = (CertStoreType) (VPN_STORE | WIFI_STORE | EMAIL_STORE); - result = certsvc_pkcs12_check_alias_exists_in_store(instance, storeType, Alias, &exists); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); + CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-without-password"); + + int isUnique = 0; + result = certsvc_pkcs12_check_alias_exists_in_store(instance, allStoreType, Alias, &isUnique); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from all store failed."); + + certsvc_string_free(Alias); FREE_INSTANCE } -/* Set the status of the certificate to disabled/enabled in wifi,vpn,email store */ -RUNNER_TEST(CERTSVC_PKCS12_1020_certsvc_set_cert_to_disabled_and_get_status_for_individual_store) { - - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - int array[3]={VPN_STORE,WIFI_STORE,EMAIL_STORE}; - int result = CERTSVC_SUCCESS; - CertSvcString Alias; - CertStatus Status; - CertStatus status; - size_t length = 0; - int count = 0; - int i; +RUNNER_TEST(CERTSVC_PKCS12_1020_certsvc_set_cert_to_disabled_and_get_status_for_individual_store) +{ + CertStoreType storeTypeArr[3] = {VPN_STORE, WIFI_STORE, EMAIL_STORE}; + int result; CREATE_INSTANCE - for(int j=0;j<3;j++) - { - i = array[j]; + for (size_t j = 0; j < 3; j++) { + CertStoreType storeType = storeTypeArr[j]; - result = certsvc_pkcs12_get_certificate_list_from_store(instance, (CertStoreType)i, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); - tmpNode = certList; - while(certList!=NULL) - { - count++; - Alias.privateHandler = certList->gname; - Alias.privateLength = strlen((const char*)certList->gname); + CertSvcStoreCertList *certList = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed."); - result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed."); + CertSvcStoreCertList *certListOrig = certList; + while (certList) { + CertSvcString Alias = wrapper_certsvc_string_new(certList->gname); - Status=DISABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to system store failed."); + CertStatus status; + result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed."); - result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed."); + result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, DISABLED); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed."); - Status=ENABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to system store failed."); + result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed."); + RUNNER_ASSERT_MSG(status == DISABLED, "certificate status should be disabled"); - result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed."); + result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, ENABLED); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed."); + + result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed."); + RUNNER_ASSERT_MSG(status == ENABLED, "certificate status should be enabled"); + + certsvc_string_free(Alias); certList = certList->next; } - certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &tmpNode); + certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig); } FREE_INSTANCE } -/* Negative test case */ -/* Install a PEM file to invalid store */ -RUNNER_TEST(CERTSVC_PKCS12_1021_add_pem_file_to_invalid_store) { - - const char path[] = "/usr/share/cert-svc/tests/wifi-server.pem"; - char* pass = NULL; - char *alias = "PFX-WifiServer-one-store"; +RUNNER_TEST(CERTSVC_PKCS12_1021_add_pem_file_to_invalid_store) +{ int result; - CertStoreType storeType = (CertStoreType) (-1); - CertSvcString Alias, Path, Pass; CREATE_INSTANCE - Alias.privateHandler = alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = pass; - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); - - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_INVALID_STORE_TYPE, "Importing certifcate with existing alias to WIFI store failed."); - - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_INVALID_STORE_TYPE, "Importing certifcate with existing alias to VPN store failed."); + CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-one-store"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifi-server.pem"); + CertSvcString Pass = wrapper_certsvc_string_new(NULL); - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result==CERTSVC_INVALID_STORE_TYPE, "Importing certifcate with existing alias to EMAIL store failed."); + result = certsvc_pkcs12_import_from_file_to_store(instance, (CertStoreType)-1, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result == CERTSVC_INVALID_STORE_TYPE, "Importing certifcate should be failed with invalid store type"); - /* Installing a PEM certificate to system store should fail */ - storeType = SYSTEM_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PEM file to EMAIL store failed."); + result = certsvc_pkcs12_import_from_file_to_store(instance, SYSTEM_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing PEM file to SYSTEM_STORE should be failed"); - /* Removing certificate to system store should fail */ - result = certsvc_pkcs12_delete_certificate_from_store(instance, storeType, Alias); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Deleting certificate from store failed."); + result = certsvc_pkcs12_delete_certificate_from_store(instance, SYSTEM_STORE, Alias); + RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Deleting certificate from SYSTEM_STORE should be failed"); + certsvc_string_free(Alias); + certsvc_string_free(Path); FREE_INSTANCE } -/* Set the status of the certificate to disabled/enabled from invalid store */ -RUNNER_TEST(CERTSVC_PKCS12_1022_certsvc_set_cert_to_disabled_and_get_status_for_invalid_store) { - - char* gname = "eb375c3e.0"; - CertStoreType storeType = (CertStoreType) (DISABLED); - CertStatus Status; - CertStatus status; +RUNNER_TEST(CERTSVC_PKCS12_1022_certsvc_set_cert_to_disabled_and_get_status_for_invalid_store) +{ int result; - CertSvcString Alias; CREATE_INSTANCE - Alias.privateHandler = gname; - Alias.privateLength = strlen((const char*)gname); + CertSvcString Alias = wrapper_certsvc_string_new("eb375c3e.0"); - /* getting status from a invalid store should fail */ - result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed."); + CertStatus status; + result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status with invalid store type should be failed"); - /* setting status to a invalid store should fail */ - Status=DISABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed."); + result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, DISABLED); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status with invalid store type should be failed"); - /* getting status from a invalid store should fail */ - result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed."); + result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status with invalid store type should be failed"); - /* setting status to a invalid store should fail */ - Status=ENABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed."); + result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, ENABLED); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status with invalid store type should be failed"); - /* setting status to a invalid store should fail */ - result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed."); + result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status with invalid store type should be failed"); + certsvc_string_free(Alias); FREE_INSTANCE } -/* Set the status of the certificate to disabled/enabled in wifi,vpn,email store */ -RUNNER_TEST(CERTSVC_PKCS12_1023_certsvc_set_cert_to_disabled_and_get_status_for_invalid_store) { +RUNNER_TEST(CERTSVC_PKCS12_1023_certsvc_set_cert_to_disabled_and_get_status_for_invalid_store) +{ + CREATE_INSTANCE - CertStoreType storeType = (CertStoreType) (0); - CertSvcStoreCertList* certList = NULL; - CertStatus Status; - CertStatus status; - size_t length; + CertSvcStoreCertList *certList = NULL; + size_t length = 0; + int result = certsvc_pkcs12_get_certificate_list_from_store(instance, NONE_STORE, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Getting certificate list from invalid store should be failed"); + RUNNER_ASSERT_MSG((length == 0 && certList == NULL), "no output should be returned with invalid store"); + + FREE_INSTANCE +} + +RUNNER_TEST(CERTSVC_PKCS12_1024_certsvc_set_and_get_for_invalid_store) +{ int result; - CertSvcString Alias; CREATE_INSTANCE - /* Getting certificate list from invalid store should fail */ - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Getting certificate list from store failed."); - while(certList!=NULL) - { - Alias.privateHandler = certList->gname; - Alias.privateLength = strlen((const char*)certList->gname); - - result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed."); + CertSvcString Alias = wrapper_certsvc_string_new("TestingCRT1"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/Invalidcrt.crt"); + CertSvcString Pass = wrapper_certsvc_string_new(NULL); - Status=DISABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed."); + result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed."); - result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed."); + result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed."); - Status=ENABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed."); + result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed."); - result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed."); + result = certsvc_pkcs12_import_from_file_to_store(instance, NONE_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed."); - certList = certList->next; - } + certsvc_string_free(Alias); + certsvc_string_free(Path); FREE_INSTANCE } -/* Intsalling an invalid crt file to valid store & invalid store*/ -RUNNER_TEST(CERTSVC_PKCS12_1024_certsvc_set_and_get_for_invalid_store) { - - const char path[] = "/usr/share/cert-svc/tests/Invalidcrt.crt"; - char* pass = NULL; - char *alias = "TestingCRT1"; - CertStoreType type; +RUNNER_TEST(CERTSVC_PKCS12_1025_install_invalid_pfx_file_to_individual_and_all_store) +{ int result; CREATE_INSTANCE - CertSvcString Alias, Path, Pass; - - Alias.privateHandler = alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = pass; - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); - - /* Installing an invalid CRT file to valid store should fail */ - type = WIFI_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing CRT file to WIFI store failed."); - - /* Installing an invalid CRT file to valid store should fail */ - type = VPN_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing CRT file to VPN store failed."); - - /* Installing an invalid CRT file to valid store should fail */ - type = EMAIL_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing CRT file to EMAIL store failed."); - - /* Installing an invalid CRT file to valid store should fail */ - type = (CertStoreType) 0; - result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing CRT file to EMAIL store failed."); - FREE_INSTANCE -} + CertSvcString Alias = wrapper_certsvc_string_new("WifiServer-123"); + CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/test.pfx"); + CertSvcString Pass = wrapper_certsvc_string_new("wifi"); -/* Import a invalid P12 file to individual and all store */ -RUNNER_TEST(CERTSVC_PKCS12_1025_install_invalid_pfx_file_to_individual_and_all_store) { + result = certsvc_pkcs12_import_from_file_to_store(instance, SYSTEM_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed."); - const char path[] = "/usr/share/cert-svc/tests/test.pfx"; - const char pass[] = "wifi"; - char *alias = "WifiServer-123"; - CertStoreType storeType; - int result; + result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed."); - CREATE_INSTANCE - CertSvcString Alias, Path, Pass; - - Alias.privateHandler = (char *)alias; - Alias.privateLength = strlen(alias); - Pass.privateHandler = (char *)pass; - Pass.privateLength = strlen(pass); - Path.privateHandler = (char *)path; - Path.privateLength = strlen(path); - - /* importing p12/pfx to system store should fail */ - storeType = SYSTEM_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed."); - - /* Importing invalid pfx file to valid store should fail */ - storeType = WIFI_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed."); - - /* Importing invalid pfx file to valid store should fail */ - storeType = VPN_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PFX file to VPN store failed."); - - /* Importing invalid pfx file to valid store should fail */ - storeType = EMAIL_STORE; - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PFX file to EMAIL store failed."); - - /* Importing invalid pfx file to valid store should fail */ - storeType = (CertStoreType) (EMAIL_STORE | VPN_STORE | WIFI_STORE); - result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PFX file to EMAIL store failed."); + result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed."); + + result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed."); + + result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed."); + + certsvc_string_free(Alias); + certsvc_string_free(Path); + certsvc_string_free(Pass); FREE_INSTANCE } -/* Set the status of the certificate to disabled/enabled in wifi,vpn,email store */ -RUNNER_TEST(CERTSVC_PKCS12_1026_deleting_a_certificate_from_invalid_store) { - - CertStoreType storeType = (CertStoreType) (WIFI_STORE); - CertSvcStoreCertList* certList = NULL; - CertStatus Status; - CertStatus status; - size_t length; +RUNNER_TEST(CERTSVC_PKCS12_1026_enable_disable_status_certificate_from_invalid_store) +{ int result; - CertSvcString Alias; CREATE_INSTANCE - /* Getting certificate list from invalid store should fail */ - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); - while(certList!=NULL) - { - Alias.privateHandler = certList->gname; - Alias.privateLength = strlen((const char*)certList->gname); + CertSvcStoreCertList *certList = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, WIFI_STORE, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed."); + if (length == 0 || !certList) { + /* TODO: add any cert to store for testing */ + RUNNER_ASSERT_MSG(0, "add any cert in store for testing"); + } + + while (certList) { + CertSvcString Alias = wrapper_certsvc_string_new(certList->gname); - result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)-1, Alias, &status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed."); + CertStatus status; + result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status from invalid store should be failed."); - Status=DISABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)-1, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed."); + result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, DISABLED); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status to invalid store should be failed."); - result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)-1, Alias, &status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed."); + result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status from invalid store should be failed."); - Status=ENABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)-1, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed."); + result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, ENABLED); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status to invalid store should be failed."); - result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)-1, Alias, &status); - RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed."); + result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status); + RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status from invalid store should be failed."); + + certsvc_string_free(Alias); certList = certList->next; } @@ -1354,180 +937,152 @@ RUNNER_TEST(CERTSVC_PKCS12_1026_deleting_a_certificate_from_invalid_store) { } #define EAP_TLS_USER_CERT_PATH "user_cert.pem" -#define EAP_TLS_PATH "/tmp/" -#define EAP_TLS_CA_CERT_PATH "ca_cert.pem" +#define EAP_TLS_PATH "/tmp/" +#define EAP_TLS_CA_CERT_PATH "ca_cert.pem" #define EAP_TLS_PRIVATEKEY_PATH "privatekey.pem" -/* Set the status of the certificate to disabled/enabled in wifi,vpn,email store */ -RUNNER_TEST(CERTSVC_PKCS12_1027_get_alias_name_from_gname_from_store) { - - CertStoreType storeType = (CertStoreType) (WIFI_STORE); - CertSvcStoreCertList* certList = NULL; - CertSvcCertificate user_certificate; - CertSvcCertificateList cert_list; - CertSvcCertificate ca_certificate; - CertSvcCertificate *selected_certificate = NULL; - size_t length; +RUNNER_TEST(CERTSVC_PKCS12_1027_get_alias_name_from_gname_from_store) +{ int result; - int count=1; - int validity; - size_t cert_counts = 0; - CertSvcString Alias; - char *alias = NULL; - X509 *x509 = NULL; - FILE *fp = NULL; - EVP_PKEY *privatekey = NULL; - char privatekey_path[512]; - char ca_cert_path[512]; - char user_cert_path[512]; - int cert_index = 0; CREATE_INSTANCE - /* Getting certificate list from invalid store should fail */ - result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); - while(certList!=NULL) { - Alias.privateHandler = certList->gname; - Alias.privateLength = strlen((const char*)certList->gname); + CertSvcStoreCertList *certList = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, WIFI_STORE, DISABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list failed."); + int count = 1; + while (certList) { + CertSvcString Alias = wrapper_certsvc_string_new(certList->gname); + + char *alias = NULL; result = certsvc_pkcs12_get_alias_name_for_certificate_in_store(instance, certList->storeType, Alias, &alias); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting alias name from gname failed."); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting alias name from gname failed."); - result = certsvc_pkcs12_load_certificate_list_from_store(instance, certList->storeType, Alias, &cert_list); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "failed to certsvc_pkcs12_load_certificate_list"); + CertSvcCertificateList cert_list; + result = certsvc_pkcs12_load_certificate_list_from_store(instance, certList->storeType, Alias, &cert_list); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_pkcs12_load_certificate_list failed"); - result = certsvc_certificate_list_get_length(cert_list, &cert_counts); - RUNNER_ASSERT_MSG(cert_counts >= 1, "there is no certificates"); + size_t cert_counts = 0; + result = certsvc_certificate_list_get_length(cert_list, &cert_counts); + RUNNER_ASSERT_MSG(cert_counts > 0, "there is no certificates"); - selected_certificate = new CertSvcCertificate[cert_counts]; - RUNNER_ASSERT_MSG(selected_certificate != NULL, "failed to allocate memory"); + CertSvcCertificate *selected_certificate = new CertSvcCertificate[cert_counts]; + RUNNER_ASSERT_MSG(selected_certificate != NULL, "failed to allocate memory"); - result = certsvc_certificate_list_get_one(cert_list, 0, &user_certificate); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "failed to certsvc_certificate_list_get_one"); + CertSvcCertificate user_certificate; + result = certsvc_certificate_list_get_one(cert_list, 0, &user_certificate); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_certificate_list_get_one failed"); + X509 *x509 = NULL; result = certsvc_certificate_dup_x509(user_certificate, &x509); - sprintf(user_cert_path, "/usr/share/cert-svc/pkcs12/file_%d", count++); - fp = fopen(user_cert_path, "w"); - RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing"); + char user_cert_path[512]; + sprintf(user_cert_path, "/usr/share/cert-svc/pkcs12/file_%d", count++); + FILE *fp = fopen(user_cert_path, "w"); + RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing"); + + if (count == 5) + break; - if (count==5) break; + result = PEM_write_X509(fp, x509); + fclose(fp); - result = PEM_write_X509(fp, x509); - fclose(fp); - certsvc_certificate_free_x509(x509); + certsvc_certificate_free_x509(x509); certList = certList->next; - cert_index = cert_counts - 1; + int cert_index = cert_counts - 1; selected_certificate[0] = user_certificate; - sprintf(ca_cert_path, "%s%s_%s", EAP_TLS_PATH, certList->gname, EAP_TLS_CA_CERT_PATH); - while (cert_index) { - result = certsvc_certificate_list_get_one(cert_list, cert_index, &ca_certificate); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to certsvc_certificate_list_get_one"); + char ca_cert_path[512]; + sprintf(ca_cert_path, "%s%s_%s", EAP_TLS_PATH, certList->gname, EAP_TLS_CA_CERT_PATH); + while (cert_index) { + CertSvcCertificate ca_certificate; + result = certsvc_certificate_list_get_one(cert_list, cert_index, &ca_certificate); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to certsvc_certificate_list_get_one"); - selected_certificate[cert_counts-cert_index] = ca_certificate; - cert_index--; + selected_certificate[cert_counts-cert_index] = ca_certificate; + cert_index--; - result = certsvc_certificate_dup_x509(ca_certificate, &x509); + result = certsvc_certificate_dup_x509(ca_certificate, &x509); - fp = fopen(ca_cert_path, "a"); - RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing"); + fp = fopen(ca_cert_path, "a"); + RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing"); - result = PEM_write_X509(fp, x509); - fclose(fp); - certsvc_certificate_free_x509(x509); - } - result = certsvc_certificate_verify(selected_certificate[0], selected_certificate, cert_counts, NULL, 0, &validity); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to verify ca_certificate"); - RUNNER_ASSERT_MSG(validity != 0, "Invalid certificate"); + result = PEM_write_X509(fp, x509); + fclose(fp); - result = certsvc_pkcs12_dup_evp_pkey_from_store(instance, WIFI_STORE, Alias, &privatekey); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to duplicate the private key for a certificate from wifi store"); + certsvc_certificate_free_x509(x509); + } - sprintf(privatekey_path, "%s%s_%s", EAP_TLS_PATH, certList->gname, EAP_TLS_PRIVATEKEY_PATH); - fp = fopen(privatekey_path, "w"); - RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing"); + int validity = 0; + result = certsvc_certificate_verify(selected_certificate[0], selected_certificate, cert_counts, NULL, 0, &validity); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to verify ca_certificate"); + RUNNER_ASSERT_MSG(validity != 0, "Invalid certificate"); - result = PEM_write_PrivateKey(fp, privatekey, NULL, NULL, 0, NULL, NULL); - fclose(fp); - certsvc_pkcs12_free_evp_pkey(privatekey); - } + EVP_PKEY *privatekey = NULL; + result = certsvc_pkcs12_dup_evp_pkey_from_store(instance, WIFI_STORE, Alias, &privatekey); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to duplicate the private key for a certificate from wifi store"); - delete []selected_certificate; + char privatekey_path[512]; + sprintf(privatekey_path, "%s%s_%s", EAP_TLS_PATH, certList->gname, EAP_TLS_PRIVATEKEY_PATH); + fp = fopen(privatekey_path, "w"); + RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing"); - FREE_INSTANCE -} + result = PEM_write_PrivateKey(fp, privatekey, NULL, NULL, 0, NULL, NULL); + fclose(fp); -/* Set the status of the certificate to disabled/enabled in wifi,vpn,email store */ -RUNNER_TEST(CERTSVC_PKCS12_1028_certsvc_set_cert_to_disabled_and_get_status_for_individual_store) { + certsvc_pkcs12_free_evp_pkey(privatekey); - CertSvcStoreCertList* certList = NULL; - CertSvcStoreCertList* tmpNode = NULL; - int array[3]={VPN_STORE,WIFI_STORE,EMAIL_STORE}; - int result = CERTSVC_SUCCESS; - CertSvcString Alias; - CertStatus Status; - CertStatus status; - size_t length = 0; - int count = 0; - int i; + certsvc_string_free(Alias); + delete []selected_certificate; + } - CREATE_INSTANCE + FREE_INSTANCE +} - for(int j=0;j<3;j++) - { - i = array[j]; +RUNNER_TEST(CERTSVC_PKCS12_1028_certsvc_set_cert_to_disabled_and_get_status_for_individual_store) +{ + CertStoreType array[3] = {VPN_STORE, WIFI_STORE, EMAIL_STORE}; + int result; - result = certsvc_pkcs12_get_certificate_list_from_store(instance, (CertStoreType)i, ENABLED, &certList, &length); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed."); - tmpNode = certList; - while(certList!=NULL) - { - count++; - Alias.privateHandler = certList->gname; - Alias.privateLength = strlen((const char*)certList->gname); + CREATE_INSTANCE - result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from store failed."); + for (size_t j = 0; j < 3; j++) { + CertStoreType storeType = array[j]; - Status=DISABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, ENABLED, Alias, Status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to store failed."); + CertSvcStoreCertList *certList = NULL; + size_t length = 0; + result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, ENABLED, &certList, &length); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list failed."); - status = DISABLED; - result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from store failed."); + CertSvcStoreCertList *certListOrig = certList; + while (certList) { + CertSvcString Alias = wrapper_certsvc_string_new(certList->gname); - Status=ENABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, ENABLED, Alias, Status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to store failed."); + CertStatus status; + result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from store failed."); - status = DISABLED; - result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from store failed."); + result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, ENABLED, Alias, DISABLED); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to store failed."); - Status=DISABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to store failed."); + result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from store failed."); - status = DISABLED; - result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from store failed."); + result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, ENABLED, Alias, ENABLED); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to store failed."); - Status=ENABLED; - result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, DISABLED, Alias, Status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to store failed."); + result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status); + RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from store failed."); - status = DISABLED; - result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status); - RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from store failed."); + certsvc_string_free(Alias); certList = certList->next; } - certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &tmpNode); + certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig); } FREE_INSTANCE diff --git a/tests/pkcs12/pkcs12_test.cpp b/tests/pkcs12/pkcs12_test.cpp index 95debc4..9636524 100644 --- a/tests/pkcs12/pkcs12_test.cpp +++ b/tests/pkcs12/pkcs12_test.cpp @@ -20,13 +20,13 @@ * @brief PKCS#12 test runner. */ #include -#include +#include CertSvcInstance vinstance; int main (int argc, char *argv[]) { certsvc_instance_new(&vinstance); - int status = DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); + int status = VcoreDPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); certsvc_instance_free(vinstance); return status; } diff --git a/tests/vcore/CMakeLists.txt b/tests/vcore/CMakeLists.txt index ea1360e..af7d069 100644 --- a/tests/vcore/CMakeLists.txt +++ b/tests/vcore/CMakeLists.txt @@ -31,12 +31,10 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/tests/vcore ) -ADD_EXECUTABLE(${TARGET_VCORE_TEST} ${VCORE_TESTS_SOURCES}) +ADD_EXECUTABLE(${TARGET_VCORE_TEST} ${VCORE_TESTS_SOURCES} ${DPL_TEST_SOURCES}) TARGET_LINK_LIBRARIES(${TARGET_VCORE_TEST} - ${SYS_EFL_LIBRARIES} ${TARGET_VCORE_LIB} - ${VCORE_TEST_DEP_LIBRARIES} - -ldl + ${TEST_DEP_LIBRARIES} ) INSTALL(TARGETS ${TARGET_VCORE_TEST} @@ -50,12 +48,6 @@ INSTALL(TARGETS ${TARGET_VCORE_TEST} WORLD_EXECUTE ) -ADD_CUSTOM_COMMAND(TARGET ${TARGET_VCORE_TEST} POST_BUILD - COMMAND ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/create_certs.sh - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/ - COMMENT "Generate certificate chains" - ) - INSTALL(FILES ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/widget/author-signature.xml ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/widget/signature1.xml @@ -119,45 +111,3 @@ INSTALL(FILES ${TZ_SYS_RO_APP}/widget/tests/reference ) -INSTALL(FILES - ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/keys/operator.root.cert.pem - ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/keys/root_cacert0.pem - ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/keys/CAbundle.crt - DESTINATION - ${TZ_SYS_RO_APP}/widget/tests/vcore_keys - ) - -INSTALL(FILES - ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/config/fin_list.xml - ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/config/fin_list.xsd - DESTINATION - ${TZ_SYS_RO_APP}/widget/tests/vcore_config/ -) - -INSTALL(FILES - ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/keys/root_cacert0.pem - DESTINATION - ${TZ_SYS_SHARE}/ca-certificates/wac/ - ) - -INSTALL(FILES - ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/demoCA/cacert.pem - ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/1second_level.pem - ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/1third_level.pem - ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/2second_level.pem - ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/2third_level.pem - ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/3second_level.pem - ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/3third_level.pem - ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/respcert.pem - ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/respcert.key - ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/openssl.cnf - DESTINATION - ${TZ_SYS_RO_APP}/widget/tests/vcore_certs/ -) - -INSTALL(DIRECTORY - ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/demoCA - DESTINATION - ${TZ_SYS_RO_APP}/widget/tests/vcore_certs/ -) - diff --git a/tests/vcore/TestCRL.cpp b/tests/vcore/TestCRL.cpp deleted file mode 100644 index 6d76978..0000000 --- a/tests/vcore/TestCRL.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -#include -#include -#include -#include -#include -#include "TestCRL.h" - -using namespace ValidationCore; -using namespace std; - - -namespace { -const char *CRL_LOOKUP_DIR = "/opt/etc/ssl/certs/"; -const char *beginCertificate = "-----BEGIN CERTIFICATE-----"; -const char *endCertificate = "-----END CERTIFICATE-----"; -const char *beginTrustedCertificate = "-----BEGIN TRUSTED CERTIFICATE-----"; -const char *endTrustedCertificate = "-----END TRUSTED CERTIFICATE-----"; - - -bool whiteCharacter(char a){ - return a == '\n'; -} - -} - -TestCRL::TestCRL() - : CRLImpl (new CRLCacheDAO) -{ - //Add additional lookup dir - int rv = X509_LOOKUP_add_dir(m_lookup, CRL_LOOKUP_DIR, X509_FILETYPE_PEM); - if (!rv) { - LogError("Failed to add lookup dir for PEM files."); - ThrowMsg(CRLException::StorageError, - "Failed to add lookup dir for PEM files."); - } - LogInfo("CRL storage initialization complete."); -} - -std::string TestCRL::getFileContent(const std::string &filename) -{ - //Only PEM formatted files allowed - LogInfo("Read file: " << filename); - FileInputMapping file(filename); - string content(reinterpret_cast(file.GetAddress()), - file.GetSize()); - - size_t posBegin = content.find(beginCertificate); - size_t posEnd = content.find(endCertificate); - if (posBegin != string::npos && - posEnd != string::npos) { - posBegin += strlen(beginCertificate); - } else { - posBegin = content.find(beginTrustedCertificate); - posEnd = content.find(endTrustedCertificate); - if (posBegin != string::npos && - posEnd != string::npos) { - posBegin += strlen(beginTrustedCertificate); - } else { - LogError("Failed to parse PEM file"); - return string(); - } - } - //Remove whitespaces - string cert(content, posBegin, posEnd - posBegin); - cert.erase(std::remove_if(cert.begin(), cert.end(), whiteCharacter), - cert.end()); - - return cert; -} - -void TestCRL::addCRLToStore(const string &filename, const string &uri) -{ - LogInfo("Read file: " << filename); - //Only PEM formatted files allowed - FileInputMapping file(filename); - char *buffer = new char[file.GetSize()]; - memcpy(buffer, file.GetAddress(), file.GetSize()); - CRLDataPtr crl(new CRLData(buffer, file.GetSize(), uri)); - updateCRL(crl); -} diff --git a/tests/vcore/TestCRL.h b/tests/vcore/TestCRL.h deleted file mode 100644 index 9fd910b..0000000 --- a/tests/vcore/TestCRL.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -#ifndef _TEST_CRL_H -#define _TEST_CRL_H - -#include -#include -#include - -class TestCRL : public ValidationCore::CRLImpl -{ - public: - TestCRL(); - - void addCRLToStore(const std::string &filename, const std::string &uri); - - //convinient function - std::string getFileContent(const std::string &filename); -}; - -#endif diff --git a/tests/vcore/TestCases.cpp b/tests/vcore/TestCases.cpp index 90d8552..1d920cd 100644 --- a/tests/vcore/TestCases.cpp +++ b/tests/vcore/TestCases.cpp @@ -36,66 +36,6 @@ const std::string widget_partner_path = const std::string widget_partner_operator_path = "/usr/apps/widget/tests/vcore_widget_uncompressed_partner_operator/"; - -const std::string keys_path = "/usr/apps/widget/tests/vcore_keys/"; -const std::string widget_store_path = "/usr/apps/widget/tests/vcore_widgets/"; -const std::string cert_store_path = "/usr/apps/widget/tests/vcore_certs/"; - -const std::string anka_ec_key_type = "urn:oid:1.2.840.10045.3.1.7"; -const std::string anka_ec_public_key = - "BGi9RmTUjpqCpQjx6SSiKdfmtjQBFNSN7ghm6TuaH9r4x73WddeLxLioH3VEmFLC+QLiR"\ - "kPxDxL/6YmQdgfGrqk="; - -const std::string rsa_modulus = - "ocwjKEFaPxLNcPTz2PtT2Gyu5jzkWaPo4thjZo3rXuNbD4TzjY02UGnTxvflNeORLpSS1"\ - "PeYr/1E/Nhr7qQAzj9g0DwW7p8zQEdOUi3v76VykeB0pFJH+0Fxp6LVBX9Z+EvZk+dbOy"\ - "GJ4Njm9B6M09axXlV11Anj9B/HYUDfDX8="; -const std::string rsa_exponent = "AQAB"; - -const std::string magda_dsa_p = - "2BYIQj0ePUVxzrdBT41eCblraa9Dqag7QXFMCRM2PtyS22JPDKuV77tBc/jg0V3htHWdR"\ - "q9n6/kQDwrP7FIPoLATLIiC3oAYWj46Mr6d9k/tt/JZU6PvULmB2k1wrrmvKUi+U+I5Ro"\ - "qe8ui8lqR9pp9u2WCh2QmFfCohKNjN5qs="; -const std::string magda_dsa_q = "4p4JcDqz+S7CbWyd8txApZw0sik="; -const std::string magda_dsa_g = - "AQrLND1ZGFvzwBpPPXplmPh1ijPx1O2gQEvPvyjR88guWcGqQc0m7dTb6PEvbI/oZ0o91"\ - "k7VEkfthURnNR1WtOLT8dmAuKQfwTQLPwCwUM/QiuWSlCyKLTE4Ev8aOG7ZqWudsKm/td"\ - "n9pUNGtcod1wo1ZtP7PfEJ6rYZGQDOlz8="; - -const std::string tizen_partner = -"MIICozCCAgwCCQD9IBoOxzq2hjANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMC" -"S1IxDjAMBgNVBAgMBVN1d29uMQ4wDAYDVQQHDAVTdXdvbjEWMBQGA1UECgwNVGl6" -"ZW4gVGVzdCBDQTEiMCAGA1UECwwZVGl6ZW4gRGlzdHJpYnV0b3IgVGVzdCBDQTEq" -"MCgGA1UEAwwhVGl6ZW4gUGFydG5lciBEaXN0cmlidXRvciBSb290IENBMB4XDTEy" -"MTAyNjA4MTIzMVoXDTIyMTAyNDA4MTIzMVowgZUxCzAJBgNVBAYTAktSMQ4wDAYD" -"VQQIDAVTdXdvbjEOMAwGA1UEBwwFU3V3b24xFjAUBgNVBAoMDVRpemVuIFRlc3Qg" -"Q0ExIjAgBgNVBAsMGVRpemVuIERpc3RyaWJ1dG9yIFRlc3QgQ0ExKjAoBgNVBAMM" -"IVRpemVuIFBhcnRuZXIgRGlzdHJpYnV0b3IgUm9vdCBDQTCBnzANBgkqhkiG9w0B" -"AQEFAAOBjQAwgYkCgYEAnIBA2qQEaMzGalP0kzvwUxdCC6ybSC/fb+M9iGvt8QXp" -"ic2yARQB+bIhfbEu1XHwE1jCAGxKd6uT91b4FWr04YwnBPoRX4rBGIYlqo/dg+pS" -"rGyFjy7vfr0BOdWp2+WPlTe7SOS6bVauncrSoHxX0spiLaU5LU686BKr7YaABV0C" -"AwEAATANBgkqhkiG9w0BAQUFAAOBgQAX0Tcfmxcs1TUPBdr1U1dx/W/6Y4PcAF7n" -"DnMrR0ZNRPgeSCiVLax1bkHxcvW74WchdKIb24ZtAsFwyrsmUCRV842YHdfddjo6" -"xgUu7B8n7hQeV3EADh6ft/lE8nalzAl9tALTxAmLtYvEYA7thvDoKi1k7bN48izL" -"gS9G4WEAUg=="; - -const std::string tizen_partner_operator = -"MIICzDCCAjWgAwIBAgIJAJrv22F9wyp/MA0GCSqGSIb3DQEBBQUAMIGeMQswCQYD" -"VQQGEwJLUjEOMAwGA1UECAwFU3V3b24xDjAMBgNVBAcMBVN1d29uMRYwFAYDVQQK" -"DA1UaXplbiBUZXN0IENBMSIwIAYDVQQLDBlUaXplbiBEaXN0cmlidXRvciBUZXN0" -"IENBMTMwMQYDVQQDDCpUaXplbiBQYXJ0bmVyLU9wZXJhdG9yIERpc3RyaWJ1dG9y" -"IFJvb3QgQ0EwHhcNMTIxMjEzMDUzOTMyWhcNMjIxMjExMDUzOTMyWjCBnjELMAkG" -"A1UEBhMCS1IxDjAMBgNVBAgMBVN1d29uMQ4wDAYDVQQHDAVTdXdvbjEWMBQGA1UE" -"CgwNVGl6ZW4gVGVzdCBDQTEiMCAGA1UECwwZVGl6ZW4gRGlzdHJpYnV0b3IgVGVz" -"dCBDQTEzMDEGA1UEAwwqVGl6ZW4gUGFydG5lci1PcGVyYXRvciBEaXN0cmlidXRv" -"ciBSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9X0Hw0EfAuagg" -"De9h6Jtvh8Df4fyVbvLm9VNea/iVP3/qTbG8tNqoQ32lu0SwzAZBnjpvpbxzsWs9" -"pSYo7Ys1fymHlu+gf+kmTGTVscBrAHWkr4O0m33x2FYfy/wmu+IImnRDYDud83rN" -"tjQmMO6BihN9Lb6kLiEtVIa8ITwdQwIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0G" -"CSqGSIb3DQEBBQUAA4GBAHS2M2UnfEsZf80/sT84xTcfASXgpFL/1M5HiAVpR+1O" -"UwLpLyqHiGQaASuADDeGEfcIqEf8gP1SzvnAZqLx9GchbOrOKRleooVFH7PRxFBS" -"VWJ5Fq46dJ1mCgTWSkrL6dN5j9hWCzzGfv0Wco+NAf61n9kVbCv7AScIJwQNltOy"; - const std::string googleCA = "MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG" "A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz" @@ -188,38 +128,6 @@ const std::string certVerisign = "Q43GPhumSg9a6S3hnyw8DX5OiUGmqgQrtSeDRsNmWqtWizEQbe+fotZpEn/7zYTa" "tk1ni/k5jDH/QeuG"; -const std::string crlExampleCertificate = -"MIIFlDCCBHygAwIBAgIBADANBgkqhkiG9w0BAQUFADBDMRIwEAYKCZImiZPyLGQB" -"GRYCZXMxGDAWBgoJkiaJk/IsZAEZFghpcmlzZ3JpZDETMBEGA1UEAxMKSVJJU0dy" -"aWRDQTAeFw0wNTA2MjgwNTAyMjhaFw0xNTA2MjYwNTAyMjhaMEMxEjAQBgoJkiaJ" -"k/IsZAEZFgJlczEYMBYGCgmSJomT8ixkARkWCGlyaXNncmlkMRMwEQYDVQQDEwpJ" -"UklTR3JpZENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1CQiWlff" -"ajoMSTuismKqLQ+Mt33Tq4bBpCZvCBXhqan1R0ksILPtK1L7C8QWqPk6AZZpuNmY" -"cNVtJGc8ksgDWvX0EB3GKwZTZ8RrSRlSEe9Otq+Ur7S9uxM1JMmCr6zZTMFANzBS" -"4btnduV78C09IhFYG4OW8IPhNrbfPaeOR+PRPAa/qdSONAwTrM1sZkIvGpAkBWM6" -"Pn7TK9BAK6GLvwgii780fWj3Cwgmp8EDCTievBbWj+z8/apMEy9R0vyB2dWNNCnk" -"6q8VvrjgMsJt33O3BqOoBuZ8R/SS9OFWLFSU3s7cfrRaUSJk/Mx8OGFizRkcXSzX" -"0Nidcg7hX5i78wIDAQABo4ICkTCCAo0wDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E" -"FgQUnUJkLlupXvH/bMg8NtPxtkOYrRowawYDVR0jBGQwYoAUnUJkLlupXvH/bMg8" -"NtPxtkOYrRqhR6RFMEMxEjAQBgoJkiaJk/IsZAEZFgJlczEYMBYGCgmSJomT8ixk" -"ARkWCGlyaXNncmlkMRMwEQYDVQQDEwpJUklTR3JpZENBggEAMA4GA1UdDwEB/wQE" -"AwIBxjARBglghkgBhvhCAQEEBAMCAAcwOwYJYIZIAYb4QgENBC4WLElSSVNHcmlk" -"IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENlcnRpZmljYXRlMIGZBgNVHR8EgZEw" -"gY4wLqAsoCqGKGh0dHA6Ly93d3cuaXJpc2dyaWQuZXMvcGtpL2NybC9jYWNybC5w" -"ZW0wXKBaoFiGVmxkYXA6Ly9sZGFwLmlyaXNncmlkLmVzOjEzODAvY249SVJJU0dy" -"aWRDQSxkYz1pcmlzZ3JpZCxkYz1lcz9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0" -"MDcGCWCGSAGG+EIBAwQqFihodHRwOi8vd3d3LmlyaXNncmlkLmVzL3BraS9jcmwv" -"Y2FjcmwucGVtME4GCWCGSAGG+EIBCARBFj9odHRwOi8vd3d3LmlyaXNncmlkLmVz" -"L3BraS9wb2xpY3kvMS4zLjYuMS40LjEuNzU0Ny4yLjIuNC4xLjEuMS8waQYDVR0g" -"BGIwYDBeBg0rBgEEAbp7AgIEAQEBME0wSwYIKwYBBQUHAgEWP2h0dHA6Ly93d3cu" -"aXJpc2dyaWQuZXMvcGtpL3BvbGljeS8xLjMuNi4xLjQuMS43NTQ3LjIuMi40LjEu" -"MS4xLzANBgkqhkiG9w0BAQUFAAOCAQEAaqRfyLER+P2QOZLLdz66m7FGsgtFsAEx" -"wiNrIChFWfyHVZG7Ph1fn/GDD5LMsrU23lx3NBN5/feHuut1XNYKNs8vtV07D70r" -"DKjUlPbmWV0B+/GDxe1FDGop/tKQfyHSUaBuauXChFU/2INu5lhBerNl7QxNJ1ws" -"cWGiT7R+L/2EjgzWgH1V/0zmIOMep6kY7MUs8rlyF0O5MNFs232cA1trl9kvhAGU" -"9p58Enf5DWMrh17SPH586yIJeiWZtPez9G54ftY+XIqfn0X0zso0dnoXNJQYS043" -"/5vSnoHdRx/EmN8yjeEavZtC48moN0iJ38eB44uKgCD77rZW5s1XqA=="; - } // namespace anonymous using namespace ValidationCore; @@ -777,185 +685,3 @@ RUNNER_TEST(test08t04_Certificate_isCA) Certificate cert3(google3rd, Certificate::FORM_BASE64); RUNNER_ASSERT(cert3.isCA() == 0); } - -/* - * test: CertificateIdentifier::find(Fingerprint) - * description: Check implementation of fingerprint_list. - * expected: Google CA certificate was added to TIZEN_MEMBER group - * and ORANGE_LEGACY. Both domain should be found. - */ -/* -RUNNER_TEST(test90_certificate_identifier_find_fingerprint) -{ - CertificateIdentifier certIdent; - CertificateConfigReader reader; - reader.initialize( - "/usr/apps/widget/tests/vcore_config/fin_list.xml", - "/usr/apps/widget/tests/vcore_config/fin_list.xsd"); - reader.read(certIdent); - - Certificate cert(googleCA, Certificate::FORM_BASE64); - - CertStoreId::Set domain = - certIdent.find(cert.getFingerprint(Certificate::FINGERPRINT_SHA1)); - - RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_PUBLISHER)); - RUNNER_ASSERT(!domain.contains(CertStoreId::DEVELOPER)); - RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_ROOT)); - RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_MEMBER)); - RUNNER_ASSERT(domain.contains(CertStoreId::TIZEN_MEMBER)); - RUNNER_ASSERT(domain.contains(CertStoreId::ORANGE_LEGACY)); -} -*/ - -/* - * test: CertificateIdentifier::find(CertificatePtr) - * description: Check implementation of fingerprint_list. - * expected: Google CA certificate was added to TIZEN_MEMBER group - * and ORANGE_LEGACY. Both domain should be found. - */ -/* -RUNNER_TEST(test91_certificate_identifier_find_cert) -{ - CertificateIdentifier certIdent; - CertificateConfigReader reader; - reader.initialize( - "/usr/apps/widget/tests/vcore_config/fin_list.xml", - "/usr/apps/widget/tests/vcore_config/fin_list.xsd"); - reader.read(certIdent); - - CertificatePtr cert(new Certificate(googleCA, Certificate::FORM_BASE64)); - - CertStoreId::Set domain = certIdent.find(cert); - - RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_PUBLISHER)); - RUNNER_ASSERT(!domain.contains(CertStoreId::DEVELOPER)); - RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_ROOT)); - RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_MEMBER)); - RUNNER_ASSERT(domain.contains(CertStoreId::TIZEN_MEMBER)); - RUNNER_ASSERT(domain.contains(CertStoreId::ORANGE_LEGACY)); -} -*/ - -/* - * test: CertificateIdentifier::find(Fingerprint) - * description: Check implementation of fingerprint_list. - * expected: google2nd certificate was not added to any group so - * no domain should be found. - */ -/* -RUNNER_TEST(test92_certificate_identifier_negative) -{ - CertificateIdentifier certIdent; - CertificateConfigReader reader; - reader.initialize( - "/usr/apps/widget/tests/vcore_config/fin_list.xml", - "/usr/apps/widget/tests/vcore_config/fin_list.xsd"); - reader.read(certIdent); - - Certificate cert(google2nd, Certificate::FORM_BASE64); - - CertStoreId::Set domain = - certIdent.find(cert.getFingerprint(Certificate::FINGERPRINT_SHA1)); - - RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_PUBLISHER)); - RUNNER_ASSERT(!domain.contains(CertStoreId::DEVELOPER)); - RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_ROOT)); - RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_MEMBER)); - RUNNER_ASSERT(!domain.contains(CertStoreId::TIZEN_MEMBER)); - RUNNER_ASSERT(!domain.contains(CertStoreId::ORANGE_LEGACY)); -} -*/ -/* - * test: CertificateIdentifier::find(Fingerprint) - * description: Check implementation of fingerprint_list. - * expected: Google CA certificate was added to TIZEN_MEMBER group - * and ORANGE_LEGACY. Both domain should be found. - */ -/* -RUNNER_TEST(test93_certificate_identifier_find_fingerprint) -{ - CertificateIdentifier certIdent; - CertificateConfigReader reader; - reader.initialize( - "/usr/apps/widget/tests/vcore_config/fin_list.xml", - "/usr/apps/widget/tests/vcore_config/fin_list.xsd"); - reader.read(certIdent); - - Certificate cert(googleCA, Certificate::FORM_BASE64); - - CertStoreId::Set visibilityLevel = - certIdent.find(cert.getFingerprint(Certificate::FINGERPRINT_SHA1)); - - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_PUBLISHER)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::DEVELOPER)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_ROOT)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_MEMBER)); - RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::TIZEN_MEMBER)); - RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::ORANGE_LEGACY)); - - RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::VIS_PUBLIC)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER_OPERATOR)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER_MANUFACTURER)); -} -*/ - -/* - * test: CertificateIdentifier::find(CertificatePtr) - * description: Check implementation of fingerprint_list. - * expected: Google CA certificate was added to TIZEN_MEMBER group - * and ORANGE_LEGACY. Both domain should be found. - */ -/* -RUNNER_TEST(test94_certificate_identifier_find_cert) -{ - CertificateIdentifier certIdent; - CertificateConfigReader reader; - reader.initialize( - "/usr/apps/widget/tests/vcore_config/fin_list.xml", - "/usr/apps/widget/tests/vcore_config/fin_list.xsd"); - reader.read(certIdent); - - CertificatePtr cert(new Certificate(googleCA, Certificate::FORM_BASE64)); - - CertStoreId::Set visibilityLevel = certIdent.find(cert); - - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_PUBLISHER)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::DEVELOPER)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_ROOT)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_MEMBER)); - RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::TIZEN_MEMBER)); - RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::ORANGE_LEGACY)); - - RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::VIS_PUBLIC)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER_OPERATOR)); - RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER_MANUFACTURER)); -} -*/ - -/* - * test: CertificateIdentifier::find(Fingerprint) - * description: Check implementation of fingerprint_list. - * expected: google2nd certificate was not added to any group so - * no domain should be found. - */ -/* -RUNNER_TEST(test95_certificate_identifier_negative) -{ - CertificateIdentifier certIdent; - CertificateConfigReader reader; - reader.initialize( - "/usr/apps/widget/tests/vcore_config/fin_list.xml", - "/usr/apps/widget/tests/vcore_config/fin_list.xsd"); - reader.read(certIdent); - - Certificate cert(google2nd, Certificate::FORM_BASE64); - - CertStoreId::Set domain = - certIdent.find(cert.getFingerprint(Certificate::FINGERPRINT_SHA1)); - - RUNNER_ASSERT_MSG(domain.getTypeString().empty(), "Domain should be empty."); -} -*/ diff --git a/tests/vcore/cert-svc-tests-vcore-ocsp-server.sh b/tests/vcore/cert-svc-tests-vcore-ocsp-server.sh deleted file mode 100644 index 05daea2..0000000 --- a/tests/vcore/cert-svc-tests-vcore-ocsp-server.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh -# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved -# -# 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. -# -source /etc/tizen-platform.conf - -LOCAL_VCORE_OCSP_WORKSPACE=${TZ_SYS_RO_APP}/widget/tests/vcore_certs - -pkill -9 openssl # if previously it was launched and openssl didn't close sockets - -OPENSSL_CONF=${LOCAL_VCORE_OCSP_WORKSPACE}/openssl.cnf openssl ocsp \ --nrequest 5 \ --index ${LOCAL_VCORE_OCSP_WORKSPACE}/demoCA/index.txt \ --port 8881 \ --rsigner ${LOCAL_VCORE_OCSP_WORKSPACE}/respcert.pem \ --rkey ${LOCAL_VCORE_OCSP_WORKSPACE}/respcert.key \ --CA ${LOCAL_VCORE_OCSP_WORKSPACE}/demoCA/cacert.pem - -echo "--- OCSP server shutdown..." diff --git a/tests/vcore/certificate-generator/.gitignore b/tests/vcore/certificate-generator/.gitignore deleted file mode 100644 index 96be371..0000000 --- a/tests/vcore/certificate-generator/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -1second_level.csr -1second_level.key -1second_level.pem -1third_level.key -1third_level.pem -1third_level.request -2second_level.csr -2second_level.key -2second_level.pem -2third_level.key -2third_level.pem -2third_level.request -3second_level.csr -3second_level.key -3second_level.pem -3third_level.key -3third_level.pem -3third_level.request -cacrl1.pem -cacrl2.pem -demoCA/index.txt -demoCA/index.txt.attr -demoCA/index.txt.attr.old -demoCA/index.txt.old -demoCA/newcerts/ -respcert.csr -respcert.key -respcert.pem diff --git a/tests/vcore/certificate-generator/create_certs.sh b/tests/vcore/certificate-generator/create_certs.sh deleted file mode 100755 index 4d03927..0000000 --- a/tests/vcore/certificate-generator/create_certs.sh +++ /dev/null @@ -1,94 +0,0 @@ -#!/bin/bash -# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved -# -# 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. -# - -#Prerequisite to run script is to -#create root certificate and directory structure (demoCA) with command: -#/usr/lib/ssl/misc/CA.sh -newca -#for automated tests default structure is created in demoCA.init - -#make sure current dir has no files from previous generation -rm -r 1* 2* 3* ca* respcert* demoCA -cp -R demoCA.init demoCA -echo "01" > ./demoCA/crlnumber - -for index in 1 2 3 -do - #create certificate A - openssl genrsa -out ${index}second_level.key 1024 -passin pass:1234 -config ./openssl.cnf - openssl req -new -key ${index}second_level.key -out ${index}second_level.csr -passin pass:1234 -config ./openssl.cnf < - - - - - - - - - - 74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E2 - - - 74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E2 - - - 74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E2 - - - 74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E2 - 04:C5:A6:1D:75:BB:F5:5C:0F:A2:66:F6:09:4D:9B:2B:5F:3B:44:AE - - - 74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E0 - 67:37:DE:B7:B9:9D:D2:DB:A5:2C:42:DE:CB:2F:2C:3E:33:97:E1:85 - - - 74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E1 - B0:5F:40:43:71:1F:11:BC:9A:6A:62:FA:DA:92:54:79:92:16:11:DF - - - 74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E3 - 2A:74:E8:CF:9E:0F:C3:D9:80:48:8B:E7:86:F7:83:49:91:11:E1:E0 - - diff --git a/tests/vcore/test-cases/config/fin_list.xsd b/tests/vcore/test-cases/config/fin_list.xsd deleted file mode 100644 index b0fab23..0000000 --- a/tests/vcore/test-cases/config/fin_list.xsd +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/vcore/test-cases/keys/CAbundle.crt b/tests/vcore/test-cases/keys/CAbundle.crt deleted file mode 100644 index 4edaeda..0000000 --- a/tests/vcore/test-cases/keys/CAbundle.crt +++ /dev/null @@ -1,3677 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx -EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h -bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy -YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp -Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy -MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG -A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt -YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD -VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA -isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj -Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 -QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt -bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR -yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID -AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 -cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f -BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj -cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 -U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl -YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos -SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ -t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u -mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb -K+9A46sd33oqK8n8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO -BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi -MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ -ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ -8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 -zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y -fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 -w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc -G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k -epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q -laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ -QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU -fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 -YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w -ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY -gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe -MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 -IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy -dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw -czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 -dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl -aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC -AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg -b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB -ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc -nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg -18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c -gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl -Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY -sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T -SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF -CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum -GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk -zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW -omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS -BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v -cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 -4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB -Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J -0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ -FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx -bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q -SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb -6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV -m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g -eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG -kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 -6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG -CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc -aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB -gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w -aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 -tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 -nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M -77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV -Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L -ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM -zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU -rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF -YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT -oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu -FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB -0m6lG5kngOcLqagA ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV -BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK -EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq -b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow -djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx -EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG -9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa -F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1 -eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV -Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB -k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0 -ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV -dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO -txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD -VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD -QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY -S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+ -mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR -qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE -TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe -1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG -UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v -U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN -AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw -MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD -VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM -BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m -cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws -ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx -8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/ -s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c -9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V -pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+ -pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC -aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y -CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ -6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG -A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0 -MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF -AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob -sRQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT -AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ -TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG -9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw -MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM -BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO -MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 -LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI -s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 -xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 -u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b -F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx -Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd -PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV -HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx -NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF -AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ -L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY -YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a -NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R -0982gaEbeC9xs/FZTEYYKKuF0mBWWg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAw -gYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3Rv -bjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJv -b3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3RydXN0LmNvbTAeFw05 -OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYDVQQGEwJVUzELMAkG -A1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5FQ09N -LCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkB -FhVhZG1pbkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCx0xHgeVVDBwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM -0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFG -PR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGU -LOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZs -iSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU -+/94Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYB -Af8CAQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k -qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOir -vRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHegTYjHInYZ -w8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm/lowdiT/QHI8 -eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/ -O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 -MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U -0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI -TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf -RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF -zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh -BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA -AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY -PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ -BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn -9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT -Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF -Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX -n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW -H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz -NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ -7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb -m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY -xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ -YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq -JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx -I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz -kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh -EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S -Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM -gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu -rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO -1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu -h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP -yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q -7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT -RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ -ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB -M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ -my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO -AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT -9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H -hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 -fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw -MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD -VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul -CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n -tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl -dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch -PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC -+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O -BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X -7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz -43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl -pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA -WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx -MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB -ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV -BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV -6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX -GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP -dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH -1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF -62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW -BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv -b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 -IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ -iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh -4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm -XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 -MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK -EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh -BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq -xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G -87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i -2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U -WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 -0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G -A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr -pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm -aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv -hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm -hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 -P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y -iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no -xqE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk -hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym -1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW -OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb -2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko -O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU -AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb -LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir -oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C -MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC -206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci -KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 -JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 -BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e -Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B -PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 -Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq -Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 -+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj -FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn -xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 -LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc -obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 -CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe -IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA -DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F -AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX -Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb -AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl -Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw -RY8mkaKO/qk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp -ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow -fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV -BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM -cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S -HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 -CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk -3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz -6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV -HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw -Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww -DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 -5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI -gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ -aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl -izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 -aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla -MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO -BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD -VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW -fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt -TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL -fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW -1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 -kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G -A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo -dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu -Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ -HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS -jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ -xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn -dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBf -MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdp -Tm90YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmww -HhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgxOTIxWjBfMQswCQYDVQQGEwJOTDES -MBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEg -MB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B -8cp86Yxq7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXY -tsMW2YiwsYcdcNqGtA8Ui3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIl -HgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8ZkqQfioLBQftFl9VkHXYRskbg+IIvvEj -zJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEqbYRAhU52mXyC8/O3AlnU -JgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4iHomGgVM -ktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXv -a5pkXuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57p -K6kwe6AYHw4YC+VbqdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMi -puih2TkGl/VujQKQjBR7P4DNG5y6xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovT -yD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHcBmfFlHqabWJMfczgZICynkeO -owIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC -jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXy -fJ9oHbtdzno5wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBo -Y6pFITlIYXg23PFDk9Qlx/KAZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHo -M/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedTFLJgQT2EkTFoPSdE2+Xe9PpjRchM -Ppj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKfyvBovWsdst+Nbwed -2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoAZbwH -/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQl -nQ7KN+ZQ/YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jE -O1hZibCMjFCz2IbLaKPECudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU -9jQZjHkJNsphFyUXC4KYcwx3dMPVDceoEkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9 -j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV -UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL -EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ -BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x -ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg -bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ -j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV -Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG -SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx -JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI -RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw -MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 -fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i -+DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG -SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN -QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ -gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQsw -CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp -dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE -CxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0B -CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4NTVaFw0wODExMjgx -ODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO -U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 -IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdf -WvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uK -xBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBE -zUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F -5X5yP4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMv -OnNn7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+Legz -ZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvVWlHG4VME -lo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX8ngvYzZAOONG -Dx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q -gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2k -Ytdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV -UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL -EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ -BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x -ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ -k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso -LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o -TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG -SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx -JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI -RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 -MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C -TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 -WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG -SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR -xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL -B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQsw -CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp -dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE -CxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0B -CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2MTZaFw0wODExMjcy -MjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO -U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 -IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbV -p9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWw -BZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl -5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi -3sOP17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+ -QVCvbK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ -2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6HE3K1GjN -I3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV6YyDfFk/xPEL -553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q -10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbIN -uBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy -MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny -Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0 -iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn -5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd -BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0 -MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy -ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l -dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy -MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF -fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w -AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS -hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/ -GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd -zmVml64mXg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML -RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu -Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg -RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl -IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa -Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE -CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO -8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB -bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2 -dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4 -QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT -C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw -IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy -ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw -KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD -VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud -DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 -fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia -d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF -JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U -yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy -MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA -vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G -CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA -WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ -h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 -f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN -B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy -vUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u -ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh -Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU -MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D -bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq -RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G -CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo -6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux -5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm -AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC -ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 -cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m -by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp -IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg -Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg -KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV -HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E -BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE -FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 -pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz -wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a -EkP/TOYGJqibGapEPHayXOw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj -dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 -NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD -VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G -vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ -BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl -IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw -NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq -y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 -E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u -Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY -rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z -hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay -BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL -iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb -AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv -bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 -MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E -FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n -VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m -hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl -ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp -QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 -quGnM/b9Sh/22WA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJv -b3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQDExNHVEUgQ3liZXJU -cnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC45k+625h8cXyv -RLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH6X4M -ypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/5 -1KiOQswkwB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKz -dcZfHeFhVYAA1IFLezEPI2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWl -IjeaY8JIILTbcuPI9tl8vrGvU9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9Apy -bW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs -IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A -PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 -Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL -TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL -5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 -S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe -2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap -EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td -EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv -/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 -abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF -I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz -4iIprn2DQKi6bA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl -SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl -SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 -DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw -NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD -VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n -IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g -IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS -zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS -YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ -KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb -adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk -ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE -BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT -ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC -LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD -VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr -BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB -FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC -AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp -ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito -dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG -SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D -TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov -L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq -MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu -Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy -Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v -Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK -Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj -V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+ -hjM+5i9Ibq9UkE6tsSU= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl -SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl -SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 -DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx -MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD -VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n -IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g -IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ -H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY -8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr -SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj -mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk -ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE -BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT -ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC -LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD -VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr -BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB -FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC -AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp -ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito -dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG -SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D -TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov -L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq -MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu -Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy -Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v -Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD -qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9 -D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy -r33I6unUVtkOE7LFRVA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm -SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT -JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI -hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3 -MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8 -m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd -ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8 -eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47 -3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh -ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC -AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF -BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB -BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg -hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud -EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD -QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC -AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j -cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 -b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu -aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI -BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s -MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz -MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz -MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF -BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA -AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF -aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL -H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm -SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT -JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI -hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3 -MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN -G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU -VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn -6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8 -2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh -ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC -AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF -BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB -BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg -hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud -EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD -QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC -AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j -cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 -b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu -aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI -BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s -MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz -MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz -MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF -BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca -2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI -3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS -AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq -SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD -VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx -HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNTha -Fw0yNTEyMjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl -bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg -cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu -ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD -QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp -bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP -aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJ -spQgvJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB -hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nB -Bt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8wHQYDVR0O -BBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCCAUGAFKGtMbH5 -PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE -CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ -bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt -YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD -aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT -IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI -hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E -BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG -CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB -BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw -EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC -BglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg -aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlw -cy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMv -aXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3 -dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIB -BwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8w -NwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5 -Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5pcHMuZXMvaXBz -MjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz -L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF -BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1W -WKJBGyi3leGmGpVfp3hAK+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfN -HnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvN -b2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIwEAYD -VQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UEChMQSVBT -IFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQD -Ew5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVz -MB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1owgaMxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE -ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcw -FQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu -aXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyY -XZhkJAk8IbPMGbWOlI6H0fg3PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1 -gf/+rHhwLWjhOgeYlQJU3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4 -Nu+z4cYgjui0OLzhPvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lY -JN7GO9HgQmm47mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsU -dx+2/iU94aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14 -cJ58GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr -SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG -A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAx -OFoXDTI1MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy -Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l -dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw -cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh -bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU -aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B -CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -vLjuVqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 -Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFY -q6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAwggR8MB0G -A1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSCAUcwggFDgBSL -0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ -BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ -UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp -cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg -Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD -EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w -HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM -BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB -FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD -VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw -cy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl -IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwWGmh0 -dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8v -d3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCG -SAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25U -aW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBz -LmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGluZy5odG1sPzBABglghkgBhvhC -AQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1lc3RhbXBp -bmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy -MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFj -ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEF -BQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI -hvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk3 -6MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I -3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV -MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe -TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 -dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 -N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC -dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu -MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL -b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD -zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi -3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 -WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY -Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi -NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC -ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 -QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 -YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz -aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm -ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg -ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs -amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv -IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 -Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 -ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 -YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg -dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs -b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G -CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO -xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP -0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ -QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk -f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK -8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD -EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz -aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w -MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l -dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh -bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq -eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe -r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 -3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd -vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l -mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC -wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg -hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 -TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh -biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg -ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg -dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 -b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl -c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 -ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 -dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu -ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo -ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 -Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u -ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA -A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ -MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ -NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR -VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY -83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 -macqaJVmlaut74nLYKkGEsaUR+ko ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx -MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O -isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY -78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9 -zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd -BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA -Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN -T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD -mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy -MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp -eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg -/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl -wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh -AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 -PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu -AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR -MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc -HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ -Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO -rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch -6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 -7CAFYd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx -MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG -29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk -oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk -3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL -qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN -nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX -ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H -DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO -TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv -kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w -zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO -TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy -MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk -ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn -ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 -9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO -hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U -tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o -BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh -SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww -OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv -cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA -7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k -/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm -eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 -u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy -7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js -LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM -BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy -dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh -cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh -YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg -dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp -bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ -YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ -9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 -jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW -FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz -ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 -ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L -EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu -L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC -O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V -um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh -NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx -DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 -Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS -YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 -OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp -bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp -dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG -9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x -18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 -yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI -LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G -A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW -zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT -BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x -GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh -cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV -HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G -CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy -BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j -cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ -YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ -YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 -ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p -00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb -cCOxgN8aIDjnfg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu -IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw -WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD -ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y -IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn -IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ -6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob -jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw -izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl -+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY -zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP -pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF -KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW -ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB -AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 -ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW -IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA -A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 -uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ -FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 -jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ -u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D -YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 -puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa -icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG -DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x -kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z -Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 -m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih -FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ -TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F -EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco -kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu -HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF -vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo -19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC -L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW -bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX -JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc -K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf -ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik -Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB -sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e -3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR -ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip -mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH -b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf -rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms -hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y -zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 -MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 -c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y -AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw -TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8 -/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/ -jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms -Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 -c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF -Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw -Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW -w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE -Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD -2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE -SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg -Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV -BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl -cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA -vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu -Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a -0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 -4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN -eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD -R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG -A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu -dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME -Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 -WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ -KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO -Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX -wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 -9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 -jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 -aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE -SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw -ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU -REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr -2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s -2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU -GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj -dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r -TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB -AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv -c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl -ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu -MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg -T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud -HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD -VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny -bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ -J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG -SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom -JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO -inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y -caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB -mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ -YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 -BKNDLdr8C2LqL19iUw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg -MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz -MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy -dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD -VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg -xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu -xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 -XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k -heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J -YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C -urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 -JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 -b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV -9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 -kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh -fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA -aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS -RGQDJereW26fyfJOrN3H ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 -WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv -bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU -UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw -bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe -LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef -J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh -R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ -Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX -JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p -zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S -Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ -KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq -ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz -gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH -uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS -y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj -IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X -DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw -EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE -ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy -dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD -QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 -dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK -wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 -G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF -AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 -c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P -9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt -YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu -Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa -MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG -cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh -d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY -DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E -rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq -uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN -BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa -/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei -gQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p -dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv -bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa -QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY -BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u -IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl -bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu -Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs -Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI -Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD -ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH -b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh -KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN -BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd -BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN -MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g -Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG -A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l -c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT -6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa -Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL -8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC -9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ -pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ -CayJSdM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB -ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt -TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 -NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD -VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS -Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 -N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH -iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe -YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 -axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g -yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD -AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh -ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V -VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB -BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y -IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs -QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 -ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM -YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb -QErNaLly7HF27FSOH4UMAWr6pjisH8SE ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB -kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw -IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu -dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 -E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ -D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK -4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq -lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW -bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB -o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js -LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr -BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB -AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj -j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH -KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv -2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 -mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB -rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt -Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa -Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV -BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l -dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE -AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B -YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 -hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l -L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm -SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM -1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws -6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw -Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 -aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH -AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u -7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 -xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ -rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim -eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk -USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 -NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD -VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp -bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N -H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR -4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN -BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo -EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 -FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx -lA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK -VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm -Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J -h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 -DzFc6PLZ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 -nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO -8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV -ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb -PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr -n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a -qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 -wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs -pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 -E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh -YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 -FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg -J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc -r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns -YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y -aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe -Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj -IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx -KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM -HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw -DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji -nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn -jBJ7xUS0rg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy -aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp -Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g -Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt -IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU -J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO -JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY -wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o -koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E -Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe -xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u -7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI -sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP -cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM -HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK -qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj -cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP -T8qAkbYp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 -GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ -+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd -U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm -NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ -ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 -CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq -g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c -2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ -bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD -VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0 -MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV -BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy -dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ -ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII -0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI -uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI -hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3 -YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc -1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCB -wTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQL -EzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1 -dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UEChMO -VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsx -OzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5j -b20vcnBhIChjKTAwMSwwKgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1 -dGhvcml0eSBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVli -zrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU -/OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11 -S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/ -AgEAMEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0 -dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 -cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsG -AQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j -b20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2DcIBcBlK0lRW -HqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea -w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU -58dzq6wf7iWbwBbtt8pb8BQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx -DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2 -aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1 -MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT -QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp -b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX -ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i -/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU -58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g -halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E -1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ -ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb -mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ -kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN -dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ -ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn -B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx -IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs -cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 -MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl -bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD -DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r -WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU -Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs -HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj -z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf -SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl -AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG -KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P -AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j -BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC -VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX -ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB -ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd -/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB -A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn -k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 -iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv -2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 -MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww -KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G -A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 -5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE -SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O -JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu -ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE -AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB -AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB -CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw -b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo -7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ -0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 -nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ -33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli -ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq -YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy -MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk -MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl -ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i -805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6 -l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B -FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp -kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7 -eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa -MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A -AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig -dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu -dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk -IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g -UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l -bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl -LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k -ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By -b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc -cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud -DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA -WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6 -7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY -gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb -4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9 -CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJX -VzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBD -QXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoX -DTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNVBAoTCWJlVFJVU1Rl -ZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYDVQQDExFiZVRSVVNU -ZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0c3oT -CjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P -6j41ffgzeubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwM -jmVZxXH/YgmPqsWPzGCgc0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX -2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2N -R47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5j -rEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNV -HSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQa -gfFSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1 -bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 -ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHBy -YWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJlVFJVU1Rl -ZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0L3Rl -cm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0 -L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQx -CzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNV -HSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJ -KoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR+csVm8tpvuaBa58oH2U+3RGFktTo -Qb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2 -jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe -1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5 -mlWXKWWuGVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYc -tmBjRYoQtLpGEK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli -ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq -YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy -MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk -MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl -ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO -K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD -d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj -DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe -yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt -VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB -MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI -KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp -ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug -b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0 -aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg -Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 -cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF -BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz -L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug -eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv -b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w -bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw -ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA -FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw -qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE -kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ -5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB -evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz -ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k -XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh -xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi -MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB -czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp -b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli -ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm -YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn -HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I -1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk -tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU -GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er -cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY -MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+ -AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j -b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB -OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh -dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu -IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl -LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS -ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo -ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w -cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME -GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt -z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g -6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK -mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd -LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb -J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3 -SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw -OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu -ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h -gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K -5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy -9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE -gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 -eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs -YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp -aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp -dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb -sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB -FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy -f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W -+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 -uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf -tXncwKJrMiE3lvgOOBITRzcahirLer4c ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa -Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g -eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND -IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu -QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui -me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm -RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ -OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G -O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF -BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI -KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh -c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl -cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw -HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX -hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV -Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw -6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF -6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e -Pr3WHV1wA7EY6oT4zBx+2gT9XBTB ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE -ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE -AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ -BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT -aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl -KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX -GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj -93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ -P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow -ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g -ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN -W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB -IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB -ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA -ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb -MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv -J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW -pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J -HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu -dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD -QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG -A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV -BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln -bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo -VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs -Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI -iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD -VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 -oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey -LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF -BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi -UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg -T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 -b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS -C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt -iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M -eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 -iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp -ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv -hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg -U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN -MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G -A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD -ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts -YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO -4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF -KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL -/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw -EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3 -dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh -My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB -BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g -IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93 -IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5 -dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM -GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+ -MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq -bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ -xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU -upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk -GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug -5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma -M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ -HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW -Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 -JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x -W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE -82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx -UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan -ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 -2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV -tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue -Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA -iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE -OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db -w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC -3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM -ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 -7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG -dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF -JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz -1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw -OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu -ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks -ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX -REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D -CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU -YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP -l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 -MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz -dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg -Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg -Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt -L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf -BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN -AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI -cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 -CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW -ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB -KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX -DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 -IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg -U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd -uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v -LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c -ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w -bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM -MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH -AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr -YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC -ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf -MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO -Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz -+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB -vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE -ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z -dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq -hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3 -WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh -bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g -dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE -AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt -YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6 -rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL -VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40 -I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV -HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/ -vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ -bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl -IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe -BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW -iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms -1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD -VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz -MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD -VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx -JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz -MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh -cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe -MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 -GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 -fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx -Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u -jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx -ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp -/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ -co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s -zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo -+uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F -TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w -ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm -gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO -BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf -U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h -c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN -AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ -BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC -AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC -AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG -+EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV -HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN -BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y -PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M -AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP -qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP -sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v -dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ -O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P -+UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg -g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg -T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa -yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE -o2A= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx -ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw -MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH -QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j -b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j -b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H -KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm -VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR -SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT -cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ -6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu -MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS -kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB -BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f -BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv -c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH -AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO -BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG -OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU -A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o -0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX -RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH -qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV -U+4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh -bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe -BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX -DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE -YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC -ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q -N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO -r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN -f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH -U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU -TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb -VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg -SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv -biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg -MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw -AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv -ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu -Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd -IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv -bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1 -QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O -WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf -SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- diff --git a/tests/vcore/test-cases/keys/README b/tests/vcore/test-cases/keys/README deleted file mode 100644 index c7151d6..0000000 --- a/tests/vcore/test-cases/keys/README +++ /dev/null @@ -1,2 +0,0 @@ -This directory contains certificate/public keys/private keys used to create unittests. -Passwort to private keys is "1234" or "secret". \ No newline at end of file diff --git a/tests/vcore/test-cases/keys/filip_rsa_cert.pem b/tests/vcore/test-cases/keys/filip_rsa_cert.pem deleted file mode 100644 index 0abebc6..0000000 --- a/tests/vcore/test-cases/keys/filip_rsa_cert.pem +++ /dev/null @@ -1,62 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - c7:4a:82:f6:9d:1b:f6:7e - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=PL, ST=Maz, O=Samsung, OU=SPRC, CN=Samsung/emailAddress=samsung@samsung.com - Validity - Not Before: Oct 5 12:00:51 2011 GMT - Not After : Oct 2 12:00:51 2021 GMT - Subject: C=PL, ST=MAZ, L=Leg, O=Sam, OU=SPRC, CN=Filip/emailAddress=filip@samsung.com - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public Key: (1024 bit) - Modulus (1024 bit): - 00:d2:fe:c4:b4:c1:74:82:6f:7e:28:8c:df:1b:58: - 57:78:3e:5f:5e:4c:b1:e1:d7:c5:0d:1a:c3:e9:2e: - 9a:78:8a:d7:5f:b9:cf:ce:83:2a:9a:4a:80:f0:07: - 35:61:11:60:15:2c:24:f1:7b:15:1a:e0:d7:2f:6b: - ee:35:35:b9:16:e1:10:ac:17:37:86:b3:49:2d:a6: - ed:7e:f1:0f:af:d1:01:0e:1a:a5:45:da:b4:24:82: - 29:73:0c:5f:e8:3b:9e:85:c7:0f:6f:1b:53:80:fa: - a7:50:77:7c:8e:01:5d:84:a8:b3:41:3e:b1:18:07: - d2:b9:18:5c:9f:7e:b6:a4:49 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - OpenSSL Generated Certificate - X509v3 Subject Key Identifier: - 7B:2C:B7:89:5E:F9:2A:D3:A4:A4:F1:5D:EA:69:D1:F5:D1:46:64:CC - X509v3 Authority Key Identifier: - keyid:82:08:7F:DB:00:02:86:E8:53:2A:A5:FA:58:AE:67:7F:14:38:C8:60 - - Signature Algorithm: sha1WithRSAEncryption - 0e:db:f4:08:1a:d0:d5:00:8c:1f:d8:ca:16:3a:52:a6:ae:f3: - 14:a3:17:41:e5:6d:6f:f6:62:7b:cd:b7:ff:fc:28:89:c8:3c: - 93:19:cf:e6:c4:b8:74:95:8d:5c:d6:f5:88:c2:dd:86:05:7c: - d2:0d:72:b7:78:13:58:fc:53:b4:5c:e9:ad:0c:8d:88:91:d3: - 9a:b6:cd:59:72:d7:d6:ba:11:54:65:04:fc:8f:10:e3:17:b1: - aa:96:cd:94:92:16:d8:98:e6:fe:4a:a8:29:f9:ca:c4:e4:46: - e8:73:4f:5d:95:76:f4:d6:36:7c:34:4f:3c:e2:18:a0:54:33: - ad:72 ------BEGIN CERTIFICATE----- -MIIC4zCCAkygAwIBAgIJAMdKgvadG/Z+MA0GCSqGSIb3DQEBBQUAMHIxCzAJBgNV -BAYTAlBMMQwwCgYDVQQIEwNNYXoxEDAOBgNVBAoTB1NhbXN1bmcxDTALBgNVBAsT -BFNQUkMxEDAOBgNVBAMTB1NhbXN1bmcxIjAgBgkqhkiG9w0BCQEWE3NhbXN1bmdA -c2Ftc3VuZy5jb20wHhcNMTExMDA1MTIwMDUxWhcNMjExMDAyMTIwMDUxWjB4MQsw -CQYDVQQGEwJQTDEMMAoGA1UECBMDTUFaMQwwCgYDVQQHEwNMZWcxDDAKBgNVBAoT -A1NhbTENMAsGA1UECxMEU1BSQzEOMAwGA1UEAxMFRmlsaXAxIDAeBgkqhkiG9w0B -CQEWEWZpbGlwQHNhbXN1bmcuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB -gQDS/sS0wXSCb34ojN8bWFd4Pl9eTLHh18UNGsPpLpp4itdfuc/OgyqaSoDwBzVh -EWAVLCTxexUa4Ncva+41NbkW4RCsFzeGs0ktpu1+8Q+v0QEOGqVF2rQkgilzDF/o -O56Fxw9vG1OA+qdQd3yOAV2EqLNBPrEYB9K5GFyffrakSQIDAQABo3sweTAJBgNV -HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp -Y2F0ZTAdBgNVHQ4EFgQUeyy3iV75KtOkpPFd6mnR9dFGZMwwHwYDVR0jBBgwFoAU -ggh/2wAChuhTKqX6WK5nfxQ4yGAwDQYJKoZIhvcNAQEFBQADgYEADtv0CBrQ1QCM -H9jKFjpSpq7zFKMXQeVtb/Zie823//woicg8kxnP5sS4dJWNXNb1iMLdhgV80g1y -t3gTWPxTtFzprQyNiJHTmrbNWXLX1roRVGUE/I8Q4xexqpbNlJIW2Jjm/kqoKfnK -xORG6HNPXZV29NY2fDRPPOIYoFQzrXI= ------END CERTIFICATE----- diff --git a/tests/vcore/test-cases/keys/filip_rsa_key.pem b/tests/vcore/test-cases/keys/filip_rsa_key.pem deleted file mode 100644 index 6d0f4d8..0000000 --- a/tests/vcore/test-cases/keys/filip_rsa_key.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,FDE9F633EA955697 - -ASWLPmOFfKlo46nJXTJLCkhvD/q1MsHXPaaSByVzaavXxwMxOc2g7VkIR2D0yViQ -mxQFhJLVeq/1UI9pXL2+zk0awptHogwjTw81r2I+R6qkHsSjGjl4Ds6hOX3J211K -UqO4+3kf6JJOizXbH/y6WWbj9jEJeE7zzmhuyq8k6Kp47leZsle5y13usii323tz -OgAzZGsQBSkrlBNKKM58O7TkCO6UbZLjVEoBqcJU+p+UiKoGKdUV/MxkbGEKTEPN -wrFiqIxSk9KuV5iDAjnYCPz6iQIE+Q3NOW+MTw0yjWoMb7uXJexGM6VYkYFZUffe -16nAzJpYbG+CsJ5XTiGoiodazloVYdnDFnbDLDGS2kLgiuuHzF/DL1lFlbXwgpGj -sXFp6CemJ+KnMz4aIfC63Wuav+jvAVw26pl/cYxbhboSkl+H9ZKbk+KcIeMN1Rb7 -LD35tsjO5rnQ1QlG0WP6qT6O1SPG/4GgJTyzTwuw6i8jQw62ahKB5hTri/Z8Fmrn -kFh8F7gTJ+YnxrQuTK8r9QrZrXsE/YqUbHtVEI/m/6uydWdFHNWzJxe6oavuwks2 -3mumh1101mBEuEClzOzHP925oeXW+N8R+jFnA/7NkIjeOo+J9Z+QzBiq6DVJcuEY -5aqXcCIS9AciUoh3/ovtT637r25nhYwCruZLZ+4+Vkpv9n/gPSipHXgHt2cynaID -6O7xyoADa+zY1zTRd+A4aA+SWd/bxvKe+6sc/6iBlKA8bKwfPJcwg7il4bX4g5dk -dI8gTyM9puDoHrdTaLwY8+JL0MCguEvkk7LDttNfN0gxYvxXTpZ+Tg== ------END RSA PRIVATE KEY----- diff --git a/tests/vcore/test-cases/keys/magda_dsa_cert.pem b/tests/vcore/test-cases/keys/magda_dsa_cert.pem deleted file mode 100644 index 0348db8..0000000 --- a/tests/vcore/test-cases/keys/magda_dsa_cert.pem +++ /dev/null @@ -1,90 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - c7:4a:82:f6:9d:1b:f6:7f - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=PL, ST=Maz, O=Samsung, OU=SPRC, CN=Samsung/emailAddress=samsung@samsung.com - Validity - Not Before: Oct 5 12:11:33 2011 GMT - Not After : Oct 2 12:11:33 2021 GMT - Subject: C=PL, ST=Mazowieckie, L=legionowo, O=samsung, OU=sprc, CN=magda/emailAddress=magda@samsung.com - Subject Public Key Info: - Public Key Algorithm: dsaEncryption - DSA Public Key: - pub: - 00:ac:40:42:0e:cc:a8:28:24:0b:43:09:7e:d6:23: - 35:a2:8c:e6:7d:62:66:fe:23:d6:58:b8:f7:32:9f: - 63:99:d3:2c:ff:af:60:0b:e0:d2:8c:0b:35:8b:c9: - e6:77:0a:7d:8d:43:00:23:d4:e3:ff:ad:0b:b4:d3: - b9:af:79:c2:08:f9:af:0b:c0:5e:7c:e0:4b:23:86: - b9:2a:f4:7c:af:43:ca:b1:fa:13:42:df:5d:3f:96: - b8:84:07:6a:19:b6:89:26:f1:a8:fa:c2:86:59:e9: - e7:f1:17:0d:30:5a:3b:a4:1f:76:9a:b4:04:fe:3c: - 0a:56:5e:6f:17:00:f9:36:05 - P: - 00:b5:3c:23:9a:b0:58:65:7c:c7:35:ca:37:5c:a7: - bc:e4:cd:71:a2:5b:e3:29:56:e1:65:b1:d6:30:90: - 06:bd:b0:8b:cd:ad:02:e2:da:e9:71:72:73:41:78: - 21:ca:0d:b9:3b:53:e2:77:fd:0c:0e:d9:76:a7:6a: - 94:0c:52:ab:df:8d:f8:cb:d5:04:39:55:fe:c4:35: - 45:8f:34:fe:dc:12:fc:7c:d8:d6:f9:8d:67:47:c9: - 17:d5:ff:f4:dc:88:16:4d:f0:62:cd:11:b7:e1:b5: - 69:61:23:a0:9b:0d:6d:40:69:8d:27:3d:9f:3b:f6: - b4:88:93:bf:da:34:a6:77:15 - Q: - 00:b7:2b:f2:e4:00:9a:75:7e:dc:32:c8:03:99:d3: - a3:40:60:d1:b8:cb - G: - 24:6e:e6:79:4b:50:6c:cb:a5:44:c7:63:cd:e0:a8: - c9:ad:85:5d:d9:be:e1:a7:2f:22:71:3d:ff:e3:32: - 6d:74:c1:dd:b1:40:34:cc:b0:e9:64:ef:93:82:bd: - 44:af:2d:9b:9d:8d:f7:97:32:91:38:e9:01:bc:6a: - 4c:c6:97:c2:47:56:6c:e1:5d:54:a0:0a:9f:2c:62: - fd:42:ad:63:d4:3a:36:6c:09:07:68:5b:03:51:94: - ce:13:e4:a3:ca:c4:75:ae:ba:08:69:74:55:bc:8c: - d6:52:8c:26:30:3e:c2:9f:69:1b:5d:74:2f:4a:2f: - d7:d4:3d:7e:fa:8a:a7:95 - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - OpenSSL Generated Certificate - X509v3 Subject Key Identifier: - 99:2A:52:86:CC:2F:5A:D1:00:05:DF:A5:DD:6C:5C:71:17:02:C9:D5 - X509v3 Authority Key Identifier: - keyid:82:08:7F:DB:00:02:86:E8:53:2A:A5:FA:58:AE:67:7F:14:38:C8:60 - - Signature Algorithm: sha1WithRSAEncryption - 81:f9:c0:bb:f8:0c:25:10:bf:04:5c:24:82:fa:c7:2f:44:d5: - e1:f7:cf:54:07:fb:45:29:d9:4b:a8:9b:e0:81:c6:82:bb:d7: - 26:f2:fe:42:1e:ef:1f:29:2f:64:8a:83:d8:bf:7a:9d:8d:84: - 69:23:6b:d3:25:eb:4f:cd:58:44:e9:dd:39:05:09:37:1e:18: - fd:6f:26:e9:ab:2e:e2:1c:c0:34:d6:6a:58:26:c0:a4:f0:c8: - 30:ae:95:70:f0:35:c2:b2:a0:66:a6:d6:a7:6d:7c:58:1a:88: - da:ff:69:5d:5d:0e:fa:3a:73:c6:ad:7e:19:e4:15:d9:4b:1b: - 47:07 ------BEGIN CERTIFICATE----- -MIIEDzCCA3igAwIBAgIJAMdKgvadG/Z/MA0GCSqGSIb3DQEBBQUAMHIxCzAJBgNV -BAYTAlBMMQwwCgYDVQQIEwNNYXoxEDAOBgNVBAoTB1NhbXN1bmcxDTALBgNVBAsT -BFNQUkMxEDAOBgNVBAMTB1NhbXN1bmcxIjAgBgkqhkiG9w0BCQEWE3NhbXN1bmdA -c2Ftc3VuZy5jb20wHhcNMTExMDA1MTIxMTMzWhcNMjExMDAyMTIxMTMzWjCBijEL -MAkGA1UEBhMCUEwxFDASBgNVBAgTC01hem93aWVja2llMRIwEAYDVQQHEwlsZWdp -b25vd28xEDAOBgNVBAoTB3NhbXN1bmcxDTALBgNVBAsTBHNwcmMxDjAMBgNVBAMT -BW1hZ2RhMSAwHgYJKoZIhvcNAQkBFhFtYWdkYUBzYW1zdW5nLmNvbTCCAbcwggEr -BgcqhkjOOAQBMIIBHgKBgQC1PCOasFhlfMc1yjdcp7zkzXGiW+MpVuFlsdYwkAa9 -sIvNrQLi2ulxcnNBeCHKDbk7U+J3/QwO2XanapQMUqvfjfjL1QQ5Vf7ENUWPNP7c -Evx82Nb5jWdHyRfV//TciBZN8GLNEbfhtWlhI6CbDW1AaY0nPZ879rSIk7/aNKZ3 -FQIVALcr8uQAmnV+3DLIA5nTo0Bg0bjLAoGAJG7meUtQbMulRMdjzeCoya2FXdm+ -4acvInE9/+MybXTB3bFANMyw6WTvk4K9RK8tm52N95cykTjpAbxqTMaXwkdWbOFd -VKAKnyxi/UKtY9Q6NmwJB2hbA1GUzhPko8rEda66CGl0VbyM1lKMJjA+wp9pG110 -L0ov19Q9fvqKp5UDgYUAAoGBAKxAQg7MqCgkC0MJftYjNaKM5n1iZv4j1li49zKf -Y5nTLP+vYAvg0owLNYvJ5ncKfY1DACPU4/+tC7TTua95wgj5rwvAXnzgSyOGuSr0 -fK9DyrH6E0LfXT+WuIQHahm2iSbxqPrChlnp5/EXDTBaO6Qfdpq0BP48ClZebxcA -+TYFo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVy -YXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUmSpShswvWtEABd+l3WxccRcCydUw -HwYDVR0jBBgwFoAUggh/2wAChuhTKqX6WK5nfxQ4yGAwDQYJKoZIhvcNAQEFBQAD -gYEAgfnAu/gMJRC/BFwkgvrHL0TV4ffPVAf7RSnZS6ib4IHGgrvXJvL+Qh7vHykv -ZIqD2L96nY2EaSNr0yXrT81YROndOQUJNx4Y/W8m6asu4hzANNZqWCbApPDIMK6V -cPA1wrKgZqbWp218WBqI2v9pXV0O+jpzxq1+GeQV2UsbRwc= ------END CERTIFICATE----- diff --git a/tests/vcore/test-cases/keys/magda_dsa_key.pem b/tests/vcore/test-cases/keys/magda_dsa_key.pem deleted file mode 100644 index 7842af6..0000000 --- a/tests/vcore/test-cases/keys/magda_dsa_key.pem +++ /dev/null @@ -1,12 +0,0 @@ ------BEGIN DSA PRIVATE KEY----- -MIIBuwIBAAKBgQC1PCOasFhlfMc1yjdcp7zkzXGiW+MpVuFlsdYwkAa9sIvNrQLi -2ulxcnNBeCHKDbk7U+J3/QwO2XanapQMUqvfjfjL1QQ5Vf7ENUWPNP7cEvx82Nb5 -jWdHyRfV//TciBZN8GLNEbfhtWlhI6CbDW1AaY0nPZ879rSIk7/aNKZ3FQIVALcr -8uQAmnV+3DLIA5nTo0Bg0bjLAoGAJG7meUtQbMulRMdjzeCoya2FXdm+4acvInE9 -/+MybXTB3bFANMyw6WTvk4K9RK8tm52N95cykTjpAbxqTMaXwkdWbOFdVKAKnyxi -/UKtY9Q6NmwJB2hbA1GUzhPko8rEda66CGl0VbyM1lKMJjA+wp9pG110L0ov19Q9 -fvqKp5UCgYEArEBCDsyoKCQLQwl+1iM1oozmfWJm/iPWWLj3Mp9jmdMs/69gC+DS -jAs1i8nmdwp9jUMAI9Tj/60LtNO5r3nCCPmvC8BefOBLI4a5KvR8r0PKsfoTQt9d -P5a4hAdqGbaJJvGo+sKGWenn8RcNMFo7pB92mrQE/jwKVl5vFwD5NgUCFC0583uX -PgTY5e9pOTVpCwebt50S ------END DSA PRIVATE KEY----- diff --git a/tests/vcore/test-cases/keys/ocsp_level0deprecated.crt b/tests/vcore/test-cases/keys/ocsp_level0deprecated.crt deleted file mode 100644 index 67bfa31..0000000 --- a/tests/vcore/test-cases/keys/ocsp_level0deprecated.crt +++ /dev/null @@ -1,31 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFVTCCBD2gAwIBAgIHBBrt1FojCzANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY -BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydGlm -aWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkxMDAuBgNVBAMTJ0dvIERhZGR5 -IFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTERMA8GA1UEBRMIMDc5Njky -ODcwHhcNMTAwNjA5MDIwNzU3WhcNMTEwNjE5MTEwNDM2WjBRMRUwEwYDVQQKEwwq -LnVidW50dS5jb20xITAfBgNVBAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRlZDEV -MBMGA1UEAxMMKi51YnVudHUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAu8VcCeGdREV3PYYQukyrfUAay8Ic3fMhA+YUKzqbH8UuPhcjjS3izxaT -vHLh7v80HS4DXYu6CqoQugZndV4R9KqJN1HVK5acar91VOeQgTSoowTSFtyg6aXJ -JVdEETyftGHSpS4WjyQZ9FazTfC47c5lJr+3wCZ90UaxaWpNERpMc2L4ZxG1wGCw -XYWVONtV817NecZVAiytvNPSmcnFm/OC/5GtzxNhfYmsNt1+MiC3IUFe2XnQwFhG -rvn9IcG2RhEKOOu55pHM08FcnDbfyegBkEDAmQbFIUM+tFUI7nkDNQWy/Mgzuqtg -DjydGu8h7BObEFrqXtUpm9CbTFZgzwIDAQABo4IBtjCCAbIwDwYDVR0TAQH/BAUw -AwEBADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDgYDVR0PAQH/BAQD -AgWgMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZ29kYWRkeS5jb20vZ2Rz -MS0xOS5jcmwwUwYDVR0gBEwwSjBIBgtghkgBhv1tAQcXATA5MDcGCCsGAQUFBwIB -FitodHRwOi8vY2VydGlmaWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMIGA -BggrBgEFBQcBAQR0MHIwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmdvZGFkZHku -Y29tLzBKBggrBgEFBQcwAoY+aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv -bS9yZXBvc2l0b3J5L2dkX2ludGVybWVkaWF0ZS5jcnQwHwYDVR0jBBgwFoAU/axh -MpNsRdbi7oVfmrrndplozOcwIwYDVR0RBBwwGoIMKi51YnVudHUuY29tggp1YnVu -dHUuY29tMB0GA1UdDgQWBBTUVPFNlBiCNfPjhD8O8mDUv7MLUjANBgkqhkiG9w0B -AQUFAAOCAQEAUjuOqqu+vS0StsxVXj44hvPye1MC/MkanIrdce5BgYMc5a+8UJba -ay8h34vtsvfDsTifNY8ijDx79Hprh9V2LwfWWAiWK2SdrceIdGrxDvzmDHllO5YT -ig2XhAA7ll4toSnrUfsZmi/bgb1V6VNoq36xvK+riDGnPhc7tNDZZb1fBKE+nA1p -CZq80Liv1xri4Nj1YQ0kMQQnSHkUgEGg7bvtf+cNkIp3OXTNW8f7VFoaWVZNKW8c -cxNljypjJM+h7xXCG/YRKws8eCi+xpO1Oc41tnSvbCbc0B6+xwFjRx5tfja309QI -R2+uBFsmWtBCtn31o4CFNytEnwBOPVbZBA== ------END CERTIFICATE----- diff --git a/tests/vcore/test-cases/keys/ocsp_level1.crt b/tests/vcore/test-cases/keys/ocsp_level1.crt deleted file mode 100644 index b6276d4..0000000 --- a/tests/vcore/test-cases/keys/ocsp_level1.crt +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx -ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw -MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH -QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j -b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j -b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H -KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm -VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR -SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT -cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ -6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu -MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS -kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB -BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f -BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv -c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH -AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO -BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG -OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU -A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o -0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX -RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH -qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV -U+4= ------END CERTIFICATE----- diff --git a/tests/vcore/test-cases/keys/ocsp_level2.crt b/tests/vcore/test-cases/keys/ocsp_level2.crt deleted file mode 100644 index ec9fc33..0000000 --- a/tests/vcore/test-cases/keys/ocsp_level2.crt +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh -bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe -BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX -DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE -YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC -ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q -N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO -r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN -f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH -U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU -TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb -VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg -SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv -biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg -MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw -AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv -ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu -Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd -IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv -bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1 -QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O -WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf -SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw== ------END CERTIFICATE----- diff --git a/tests/vcore/test-cases/keys/ocsp_rootca.crt b/tests/vcore/test-cases/keys/ocsp_rootca.crt deleted file mode 100644 index 8417dc7..0000000 --- a/tests/vcore/test-cases/keys/ocsp_rootca.crt +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- diff --git a/tests/vcore/test-cases/keys/operator.root.cert.pem b/tests/vcore/test-cases/keys/operator.root.cert.pem deleted file mode 100644 index 343241f..0000000 --- a/tests/vcore/test-cases/keys/operator.root.cert.pem +++ /dev/null @@ -1,66 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 85:7d:e1:c5:d9:de:7a:1f - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=PL, ST=Mazowieckie, O=Samsung, OU=SPRC, CN=Operator Test Root Certificate/emailAddress=operator@samsung.com - Validity - Not Before: Jan 4 17:27:08 2011 GMT - Not After : Jan 3 17:27:08 2014 GMT - Subject: C=PL, ST=Mazowieckie, O=Samsung, OU=SPRC, CN=Operator Test Root Certificate/emailAddress=operator@samsung.com - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public Key: (1024 bit) - Modulus (1024 bit): - 00:c3:39:17:a8:f9:d0:69:37:9a:56:44:39:67:10: - 14:a9:4b:a2:0b:c7:fc:a1:e8:e8:f7:1c:06:f4:9c: - 83:f7:37:07:9d:9c:2c:1b:46:43:5f:f1:7b:91:a8: - cd:c0:76:00:d5:9c:c9:28:f7:91:28:b6:97:ec:85: - b1:10:0f:58:2e:f6:6f:98:b6:ab:7b:ca:08:10:7f: - 55:32:bf:32:db:a7:c2:86:83:03:ee:41:0a:24:de: - 17:e3:9d:8f:5b:fa:46:70:78:98:b4:c1:14:77:44: - ab:59:7c:4c:d3:4a:f7:54:f2:30:0d:38:73:95:9f: - 21:0e:a9:86:3e:fc:82:4e:0b - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Subject Key Identifier: - 25:A5:90:9F:4D:3A:A4:19:0A:80:46:5E:F3:FB:20:CE:56:30:33:DA - X509v3 Authority Key Identifier: - keyid:25:A5:90:9F:4D:3A:A4:19:0A:80:46:5E:F3:FB:20:CE:56:30:33:DA - DirName:/C=PL/ST=Mazowieckie/O=Samsung/OU=SPRC/CN=Operator Test Root Certificate/emailAddress=operator@samsung.com - serial:85:7D:E1:C5:D9:DE:7A:1F - - X509v3 Basic Constraints: - CA:TRUE - Signature Algorithm: sha1WithRSAEncryption - b9:d7:72:49:09:d8:6f:61:94:51:40:9d:c3:d3:23:53:97:b8: - 12:ee:cb:dd:57:e6:1f:a2:76:38:5d:42:51:bd:a9:30:19:f7: - 67:5b:a8:67:4a:9e:a1:f0:a9:22:14:94:77:32:27:79:37:9c: - 0a:0f:52:80:14:62:00:94:45:85:3b:fd:ad:b4:c3:20:45:ba: - b7:91:1a:9e:38:51:0f:9b:d5:ce:74:c7:bd:4a:21:9a:2d:b5: - 71:0b:42:d2:95:72:66:fe:eb:11:ad:62:44:6c:32:4e:b4:00: - 37:d7:b8:d5:4b:f6:74:36:78:d6:ae:66:b3:ca:6e:42:ff:cb: - c2:e6 ------BEGIN CERTIFICATE----- -MIIDnzCCAwigAwIBAgIJAIV94cXZ3nofMA0GCSqGSIb3DQEBBQUAMIGSMQswCQYD -VQQGEwJQTDEUMBIGA1UECBMLTWF6b3dpZWNraWUxEDAOBgNVBAoTB1NhbXN1bmcx -DTALBgNVBAsTBFNQUkMxJzAlBgNVBAMTHk9wZXJhdG9yIFRlc3QgUm9vdCBDZXJ0 -aWZpY2F0ZTEjMCEGCSqGSIb3DQEJARYUb3BlcmF0b3JAc2Ftc3VuZy5jb20wHhcN -MTEwMTA0MTcyNzA4WhcNMTQwMTAzMTcyNzA4WjCBkjELMAkGA1UEBhMCUEwxFDAS -BgNVBAgTC01hem93aWVja2llMRAwDgYDVQQKEwdTYW1zdW5nMQ0wCwYDVQQLEwRT -UFJDMScwJQYDVQQDEx5PcGVyYXRvciBUZXN0IFJvb3QgQ2VydGlmaWNhdGUxIzAh -BgkqhkiG9w0BCQEWFG9wZXJhdG9yQHNhbXN1bmcuY29tMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDDOReo+dBpN5pWRDlnEBSpS6ILx/yh6Oj3HAb0nIP3Nwed -nCwbRkNf8XuRqM3AdgDVnMko95EotpfshbEQD1gu9m+Ytqt7yggQf1UyvzLbp8KG -gwPuQQok3hfjnY9b+kZweJi0wRR3RKtZfEzTSvdU8jANOHOVnyEOqYY+/IJOCwID -AQABo4H6MIH3MB0GA1UdDgQWBBQlpZCfTTqkGQqARl7z+yDOVjAz2jCBxwYDVR0j -BIG/MIG8gBQlpZCfTTqkGQqARl7z+yDOVjAz2qGBmKSBlTCBkjELMAkGA1UEBhMC -UEwxFDASBgNVBAgTC01hem93aWVja2llMRAwDgYDVQQKEwdTYW1zdW5nMQ0wCwYD -VQQLEwRTUFJDMScwJQYDVQQDEx5PcGVyYXRvciBUZXN0IFJvb3QgQ2VydGlmaWNh -dGUxIzAhBgkqhkiG9w0BCQEWFG9wZXJhdG9yQHNhbXN1bmcuY29tggkAhX3hxdne -eh8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQC513JJCdhvYZRRQJ3D -0yNTl7gS7svdV+YfonY4XUJRvakwGfdnW6hnSp6h8KkiFJR3Mid5N5wKD1KAFGIA -lEWFO/2ttMMgRbq3kRqeOFEPm9XOdMe9SiGaLbVxC0LSlXJm/usRrWJEbDJOtAA3 -17jVS/Z0NnjWrmazym5C/8vC5g== ------END CERTIFICATE----- diff --git a/tests/vcore/test-cases/keys/operator.second.cert.pem b/tests/vcore/test-cases/keys/operator.second.cert.pem deleted file mode 100644 index f062d94..0000000 --- a/tests/vcore/test-cases/keys/operator.second.cert.pem +++ /dev/null @@ -1,64 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 85:7d:e1:c5:d9:de:7a:20 - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=PL, ST=Mazowieckie, O=Samsung, OU=SPRC, CN=Operator Test Root Certificate/emailAddress=operator@samsung.com - Validity - Not Before: Jan 4 17:34:31 2011 GMT - Not After : Jan 4 17:34:31 2012 GMT - Subject: C=PL, ST=Malopolskie, L=Krakow, O=Samsung, OU=N/A, CN=Operator Test Second Level Certificate/emailAddress=second.operator@samsung.com - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public Key: (1024 bit) - Modulus (1024 bit): - 00:ba:3c:58:ca:87:1e:59:68:54:8a:54:34:43:61: - f1:81:e6:35:c1:46:74:16:c7:ff:f9:15:9e:0c:5a: - 6a:89:c1:13:0c:61:2e:ba:00:e0:71:ea:7e:31:ae: - 4e:ef:93:58:51:98:97:f3:bf:8a:9b:b2:c1:b7:0c: - 5f:3f:56:b3:13:3b:d0:80:be:04:66:89:84:50:ca: - fe:f6:f7:6b:05:3b:30:4e:96:9c:5b:c5:80:bc:d6: - be:6e:69:f4:b9:9b:4c:06:7a:ed:37:67:b2:fe:45: - 69:57:62:54:cb:69:69:48:b9:7d:a0:42:f1:b6:dc: - f2:7f:eb:75:2a:d4:83:69:b9 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - OpenSSL Generated Certificate - X509v3 Subject Key Identifier: - D9:F3:11:BF:98:5A:60:12:7A:85:B5:E7:A7:38:4F:CF:51:1D:C6:B2 - X509v3 Authority Key Identifier: - keyid:25:A5:90:9F:4D:3A:A4:19:0A:80:46:5E:F3:FB:20:CE:56:30:33:DA - - Signature Algorithm: sha1WithRSAEncryption - 69:6c:26:81:51:91:a6:e6:11:dc:81:35:03:73:85:4f:2f:29: - 1f:20:f2:23:54:82:ca:8f:b8:a6:e3:3f:cd:72:5e:d7:e7:f5: - 84:8a:33:e2:51:9f:36:4b:30:85:f4:4f:87:c7:9a:69:0b:15: - 6e:92:c7:1f:2f:58:a4:57:f8:c2:cd:59:6c:d2:11:63:ae:bb: - b0:32:3f:09:e7:2e:ad:db:1b:fe:e7:a4:21:43:47:76:e1:de: - 36:bb:26:3f:16:76:20:ed:a4:68:c1:48:ae:2b:95:fb:f6:d2: - f2:7f:74:f6:83:e2:89:06:b5:89:54:6e:7f:cf:88:94:66:e8: - da:32 ------BEGIN CERTIFICATE----- -MIIDPjCCAqegAwIBAgIJAIV94cXZ3nogMA0GCSqGSIb3DQEBBQUAMIGSMQswCQYD -VQQGEwJQTDEUMBIGA1UECBMLTWF6b3dpZWNraWUxEDAOBgNVBAoTB1NhbXN1bmcx -DTALBgNVBAsTBFNQUkMxJzAlBgNVBAMTHk9wZXJhdG9yIFRlc3QgUm9vdCBDZXJ0 -aWZpY2F0ZTEjMCEGCSqGSIb3DQEJARYUb3BlcmF0b3JAc2Ftc3VuZy5jb20wHhcN -MTEwMTA0MTczNDMxWhcNMTIwMTA0MTczNDMxWjCBsTELMAkGA1UEBhMCUEwxFDAS -BgNVBAgTC01hbG9wb2xza2llMQ8wDQYDVQQHEwZLcmFrb3cxEDAOBgNVBAoTB1Nh -bXN1bmcxDDAKBgNVBAsTA04vQTEvMC0GA1UEAxMmT3BlcmF0b3IgVGVzdCBTZWNv -bmQgTGV2ZWwgQ2VydGlmaWNhdGUxKjAoBgkqhkiG9w0BCQEWG3NlY29uZC5vcGVy -YXRvckBzYW1zdW5nLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAujxY -yoceWWhUilQ0Q2HxgeY1wUZ0Fsf/+RWeDFpqicETDGEuugDgcep+Ma5O75NYUZiX -87+Km7LBtwxfP1azEzvQgL4EZomEUMr+9vdrBTswTpacW8WAvNa+bmn0uZtMBnrt -N2ey/kVpV2JUy2lpSLl9oELxttzyf+t1KtSDabkCAwEAAaN7MHkwCQYDVR0TBAIw -ADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUw -HQYDVR0OBBYEFNnzEb+YWmASeoW156c4T89RHcayMB8GA1UdIwQYMBaAFCWlkJ9N -OqQZCoBGXvP7IM5WMDPaMA0GCSqGSIb3DQEBBQUAA4GBAGlsJoFRkabmEdyBNQNz -hU8vKR8g8iNUgsqPuKbjP81yXtfn9YSKM+JRnzZLMIX0T4fHmmkLFW6Sxx8vWKRX -+MLNWWzSEWOuu7AyPwnnLq3bG/7npCFDR3bh3ja7Jj8WdiDtpGjBSK4rlfv20vJ/ -dPaD4okGtYlUbn/PiJRm6Noy ------END CERTIFICATE----- diff --git a/tests/vcore/test-cases/keys/operator.second.key.pem b/tests/vcore/test-cases/keys/operator.second.key.pem deleted file mode 100644 index ab1214a..0000000 --- a/tests/vcore/test-cases/keys/operator.second.key.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,44C051D8935528BB - -iISuf9ELdyP5M0vlWOK4msH09HRAhN+43qRu/RDznpsTs2lX2sJITXXEmJC4EJzS -Zk4jf3ScTj1JsMGlg5k0mZWLmDb4kUxTRVUqJX2W4uUYEmWav7LQHRAsPwNUSMs3 -DzZabSf1vplnKKoL9mMtX4E0mj79AkJp7tARQu4Zn2FDMg/UnCErzhGeoFysztmM -v0Biyrf8yTbatMMr7Ea6rIsKS8KbkEeYDk4LpxBXkMeOutnnUUdhUEXZ/mwgJq2e -+8LLPiWdFsrGxPdub7iuLXidXSpOd9VaC9LN/ORKF+EiJtF+twWSBotxYOtwmtgj -xUHfXBcbaFoPnLKNS0nxwsOHF07LUfsCHzfVm1uGyWFkkLrPfcSjb6PahFlfO6w5 -fv8HnUOgeAjlhK6X+xhmw1tpwMUlmcYmq31eC8rwxP59jNQbhH6GVr5+rEMRHNgp -loC1WqthoRtBEC0bi99VpIHVIepe9G+p40sIropoUWftfDSLl3RtONg5GyyZWQ4a -ROxsiLHDZ7+q8eKkJuYPkiZ61/5MHuOsH5k57PG7ppG6/0p+ED4bTwxxDb6PU4pA -08xUTZQ0CUn1x80o/lKw+1E9TJOTbCvrEJAnMksfOkNkNyedgDJaxfV63wYvnL4+ -BLzCqa6djpe0Mg2olQieV/piRUt7JaGA7bnaMAn+bJ56PzUnMl0/WlxzGTMtHjkf -zUqgLLdxZpJP7zl4XleSfRWlPgL1iN1s84x48ej+MGgOGi7xTgX/sfCLkN4No/8k -c5Po+lQU261XAYNuAjtjUFQP/FgIMM9CnJrDWp8xHZXUJBo0c5lOKg== ------END RSA PRIVATE KEY----- diff --git a/tests/vcore/test-cases/keys/operator.second.p12 b/tests/vcore/test-cases/keys/operator.second.p12 deleted file mode 100644 index 2add1dfa463581ac67177f943e0c60fcca843769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2043 zcmY*Zdpr~D9^Ym*W0pe3TTEfD*~lf=66P9KSdvs!L+*sEwz)Qy>zhl|$R*|yDUoYQ zkz1R>HeqskLxkdO=&bWO=XBmbzMt>q_j{hdp6839Lf1h+Aq*AT0)eR~+9a-v1ED}V z6tcri2mmWI1qwCfJM&BD~4WRvkE{U z5dfJA1}x~ge^hdObiup=OrB$+uuU?D7bi?@7H2XF6nvZ-@4NQ(<)Qk4%>{$eAw)1p zbp)4e?ai#M9wJPk4FjUkM-Xn2)^JbHS3&V~SI-}t=lHGCCuyRYUVh5_(O?S+d)M00 z;oG!_?!q_M3PbuCu`rYRI}?(~U@aZIT65*h_{l_-k%q&|8H)D84@ow_v_HP@sz(7m{*$UXGfYN=eYx+)2EC<1npfGi=h)75Y?b75x7E;}t}v*!vlwrd zb(1*aX&Zzelf^LM{5)-kcE^_}%93V{^0}jMn=>=TABgZjv3cDk6B_|6Mm8aHZ8iMv z^HdzJ3nxzzy3$0OWE=^pdlE4BaFo8eooh0(xw3%4wV%nJ$&#A9&PtYxRlj=U$VQhB zjXkGnvamGX7#3|Gb+2yivSW4LV^RvTR5YKETkN&ff8$#Poz#%Nm=S0wx)LNkI1+xs zSJOx2@Zf``@a?aM2Sr!Armhg;?}x=Ck7f-jqJJJ8BFzm3BaFAgKi{WUkV^$`}{LYqldXnf+4sCNzCB4-U!cbrNXBX>sc` zVkEwkvgvi?)VZP0wwYGPlenbdAfFX7fp&5~C!oz~rsYoF&rkcV8*1zVKVukXeRhD`DB7W9sQbO?E(EvR zlipM>RVZrvh*xLVO1@uXltO#q6@4H)BuRGMD5s+f#Z6$qgH@C%5$GHpf2N+stpQ~( zrI&ECLJfD(!jgV_YMd|kk(-cwLEs7xEX@U0zMedyUb-vrTcCJn1^oKH?GMBLlYaZ> z)Un1{nh~bik%b0nxASekusB_9ld~DjEJ9oJ$JORb+mK2fcxqurx9&v|t$Fw3e2V7{ z6KLf$T*7!vTIIP~l%1U}xl21o2qMHD+d14TX_^>f}S!zdjiE*zz) zhEJMa=Hlmol&qpD_tuz%CcOrePh*!PE0!_qu!?WD?$xv@@Lt*k0_Bq*96XL39=r1; zXnFp6y4NU7zaCa6lz4eNNFCgf^C8uZKm&3;?L2u#d;o@sp$fVGUt!RxLN;Kkkfk6# zEPx3_?7#IP3Ix%qAVKwjivH0mLcdzY6R}_FU8i~OuT}w5L1bbZ>MipRvrF3ZWq=em z&7xzVBVCh5a_N+-Wb`~oF86{h-7<(PX(yu3?7kT9ed*24D^dGOtJPVLBmFhd-=lRR z_)z^#_A0@QjI3)N#Pu5KFB>H8cBZwWo6i@HErTaigf*Wr3+`O?@2RTeh4QW`HjInB znP&KD$GnSiK5fNo2+`3t&ye{R{MKySzpAv{8)LAt6(Tk8`YQ4)?1wDXCilQ7a!9rP za{t*sSvyLG#Z3+E>QRMC#!oA55Mm_S0v^y8OIu=!)s-Rs3Q8)oe>u0X6Y&=PHIO%! z>8P(bZnwM^t*KX5*4pC+(xRuc2UCzCxDl} zYf?rt#}OMLoeCXesv}A5szn-$#_#3cz2@hxeor4RuMuN^Ntox6*&sx5qctZd=#=-q zLtvul2;+2;h_GE2G%-tK?PHznXO4r%T>{kjZ}rhW{Pd2ksB^65)>kQPp`nSaKKvm{ z@tY^+dzst=(tBSx;%dtoq%!UI2aRsBof4KhG?8be8uvB-v8%u|(xTaXHl^GZw zZ#*|WL6^V>Me?{+-w*46=nJt_;OK=O>^P@M*%K%v3UaNXYFIW37@ppTXswa}e5|#kp zD2rGM6|?_;&l)C;-3^vP>)^!PQL`n^Ao13MpMh5Ka(ikqr+zO0Gt590AD~T z;4B~<5F}s}AWY!T3v?jBN8kbkE>eI1fj%MNFu@)Qa8#f|1&Ro`Ai(*5pZ3LIF^U)% vL|6kM1dXx>p?B1Lw&a#HwUJ0;BIjpvXX_Yeb>+k#vvdo-i diff --git a/tests/vcore/test-cases/keys/root_cakey0.pem b/tests/vcore/test-cases/keys/root_cakey0.pem deleted file mode 100644 index ff33c13..0000000 --- a/tests/vcore/test-cases/keys/root_cakey0.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,D2942E015452A445 - -0M/tC+qVDqyhNsxZZB/dGLuNxsStSUA7TRDRiSBee9JsvcFZjq03D/VjBakNIeET -6efmKfAngomfvrWtxhped3RI4vasX05swfnr4qiUKjLPyftmNEepbNGeI8MaiD7a -fEOZuAacstyS5RMHRBXrktq+jtXW2meQTuvEMBJf1AeAIuaFNvr3OvvpCtDwRffi -1ijUVuG0ZQ6MpP7cGeqLYUZ9StTMxeiEesAPM4YrG7HIY13KaHwMr1ZRtENe7qZ8 -R8vwgW188FYkSSrcQjCVEuj/ztTg9eVuSKdTNgjfKzTWnlrjAzi8CKBsrkYoarwS -6Rv3TqVVnx4HHdo9RIUKZPeLOdcMD1OPK7aOUedPTAcht3Y7SQQphBQypLf6PLKB -DCo79B4TUA1W9MijT2d2GN7oJHqHax8zO2j+yCLkEcHF32JZsEFE63Bwss72FXMg -mTmpCwyzR+oN93687JDUBAP9zNVd76ZnpzwlMZirB6QTY/lrH+iXLH3R3PO6cl2R -0Jei4IQ1oB+SX6GOPt4tKGTqktUFhsJYbXyifj4O1ZyDVYTp0JafOLxJfU33oYTm -278yshFdyHRgfKIHvqctZ1xJN2ioVcWf+9DprHc5kGb6wUKRVfQpipTS2hgbMBz+ -UWRZWq+CUD5QkTz4cSQfhPWQF6TNWpTQc0dvAlo3Cmxrro1PriDItsCOeydeNWvn -Dyynx7ODp/F1rX5ekaXkVxsdGgD/HuNF+c7tEytD7U4/CmevytuXRIrFM0alj2OE -aBFTqKicBoKgDV9VUOTKwuFeNV7MSuVDUnngEBeYrinwGa7wuV7tzA== ------END RSA PRIVATE KEY----- diff --git a/tests/vcore/vcore_tests.cpp b/tests/vcore/vcore_tests.cpp index c234082..a8bd11b 100644 --- a/tests/vcore/vcore_tests.cpp +++ b/tests/vcore/vcore_tests.cpp @@ -23,7 +23,7 @@ int main (int argc, char *argv[]) { - DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); + VcoreDPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); return 0; } diff --git a/vcore/CMakeLists.txt b/vcore/CMakeLists.txt index 4b7537b..b2afd8d 100644 --- a/vcore/CMakeLists.txt +++ b/vcore/CMakeLists.txt @@ -1 +1,148 @@ -ADD_SUBDIRECTORY(src) +# compiler warning flags +ADD_DEFINITIONS("-Wall") +ADD_DEFINITIONS("-Wextra") +ADD_DEFINITIONS("-Werror") + +PKG_CHECK_MODULES(VCORE_DEPS + REQUIRED + libxml-2.0 + libpcrecpp + openssl + xmlsec1 + dlog + libsystemd-journal + ) + +ADD_DEFINITIONS(${VCORE_DEPS_CFLAGS}) +ADD_DEFINITIONS(${VCORE_DEPS_CFLAGS_OTHER}) + +SET(VCORE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(VCORE_SOURCES + ${VCORE_DIR}/dpl/core/src/assert.cpp + ${VCORE_DIR}/dpl/core/src/exception.cpp + ${VCORE_DIR}/dpl/core/src/noncopyable.cpp + ${VCORE_DIR}/dpl/core/src/singleton.cpp + ${VCORE_DIR}/dpl/core/src/colors.cpp + + ${VCORE_DIR}/dpl/log/src/abstract_log_provider.cpp + ${VCORE_DIR}/dpl/log/src/old_style_log_provider.cpp + ${VCORE_DIR}/dpl/log/src/dlog_log_provider.cpp + ${VCORE_DIR}/dpl/log/src/journal_log_provider.cpp + ${VCORE_DIR}/dpl/log/src/log.cpp + + ${VCORE_DIR}/vcore/api.cpp + ${VCORE_DIR}/vcore/Base64.cpp + ${VCORE_DIR}/vcore/Certificate.cpp + ${VCORE_DIR}/vcore/CertificateCollection.cpp + ${VCORE_DIR}/vcore/CertificateConfigReader.cpp + ${VCORE_DIR}/vcore/CertificateLoader.cpp + ${VCORE_DIR}/vcore/CertStoreType.cpp + ${VCORE_DIR}/vcore/ReferenceValidator.cpp + ${VCORE_DIR}/vcore/SaxReader.cpp + ${VCORE_DIR}/vcore/SignatureData.cpp + ${VCORE_DIR}/vcore/SignatureFinder.cpp + ${VCORE_DIR}/vcore/SignatureReader.cpp + ${VCORE_DIR}/vcore/TimeConversion.cpp + ${VCORE_DIR}/vcore/ValidatorFactories.cpp + ${VCORE_DIR}/vcore/SignatureValidator.cpp + ${VCORE_DIR}/vcore/XmlsecAdapter.cpp + ${VCORE_DIR}/vcore/pkcs12.cpp + ${VCORE_DIR}/vcore/exception.cpp + ${VCORE_DIR}/vcore/utils.c + ${VCORE_DIR}/vcore/cert-svc-client.c + ) + +SET(VCORE_INCLUDES + ${VCORE_DIR}/dpl/core/include + ${VCORE_DIR}/dpl/log/include + ${VCORE_DIR} + ) + +########### VCORE SOURCES ######## + +INCLUDE_DIRECTORIES( + SYSTEM + ${VCORE_DEPS_INCLUDE_DIRS} + ${PROJECT_SOURCE_DIR}/include + ${VCORE_INCLUDES} + ) + +ADD_LIBRARY(${TARGET_VCORE_LIB} SHARED ${VCORE_SOURCES}) + +# TODO: visibility needed to be hidden +SET_TARGET_PROPERTIES(${TARGET_VCORE_LIB} + PROPERTIES + COMPILE_FLAGS "-D_GNU_SOURCE -fPIC -fvisibility=default" + SOVERSION ${SO_VERSION} + VERSION ${VERSION}) + +TARGET_LINK_LIBRARIES(${TARGET_VCORE_LIB} + ${VCORE_DEPS_LIBRARIES} + ${TARGET_CERT_SVC_LIB} + ) + +########## cert-server ############# +PKG_CHECK_MODULES(CERT_SERVER_DEP + REQUIRED + dlog + sqlite3 + db-util + libsystemd-daemon + key-manager + ) + +SET(CERT_SERVER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/server) + +SET(CERT_SERVER_SRC + ${CERT_SERVER_DIR}/src/cert-server-main.c + ${CERT_SERVER_DIR}/src/cert-server-logic.c + ) + +INCLUDE_DIRECTORIES( + SYSTEM + ${CERT_SERVER_DEP_INCLUDE_DIRS} + ${PROJECT_SOURCE_DIR}/include + ${VCORE_DIR} + ${CERT_SERVER_DIR}/include + ) + +SET_SOURCE_FILES_PROPERTIES( + ${CERT_SERVER_SRC} + PROPERTIES + COMPILE_FLAGS "-D_GNU_SOURCE -fvisibility=hidden -fPIE" + ) + +ADD_EXECUTABLE(${TARGET_CERT_SERVER} ${CERT_SERVER_SRC}) + +TARGET_LINK_LIBRARIES(${TARGET_CERT_SERVER} + ${CERT_SERVER_DEP_LIBRARIES} + -pie + ) + +INSTALL(TARGETS ${TARGET_CERT_SERVER} DESTINATION ${TZ_SYS_BIN}) + +######################################################## +INSTALL(TARGETS ${TARGET_VCORE_LIB} + DESTINATION ${LIBDIR} + ) + +INSTALL(FILES + ${VCORE_DIR}/vcore/SignatureValidator.h + ${VCORE_DIR}/vcore/SignatureFinder.h + ${VCORE_DIR}/vcore/Certificate.h + ${VCORE_DIR}/vcore/SignatureData.h + ${VCORE_DIR}/vcore/CertStoreType.h + ${VCORE_DIR}/vcore/exception.h + DESTINATION ${INCLUDEDIR}/cert-svc/vcore + ) + +INSTALL(FILES + ${VCORE_DIR}/cert-svc/ccert.h + ${VCORE_DIR}/cert-svc/cinstance.h + ${VCORE_DIR}/cert-svc/cerror.h + ${VCORE_DIR}/cert-svc/cpkcs12.h + ${VCORE_DIR}/cert-svc/cprimitives.h + ${VCORE_DIR}/cert-svc/cstring.h + DESTINATION ${INCLUDEDIR}/cert-svc/cert-svc + ) diff --git a/vcore/src/cert-svc/ccert.h b/vcore/cert-svc/ccert.h similarity index 99% rename from vcore/src/cert-svc/ccert.h rename to vcore/cert-svc/ccert.h index 0715651..1ccfee1 100644 --- a/vcore/src/cert-svc/ccert.h +++ b/vcore/cert-svc/ccert.h @@ -53,7 +53,7 @@ typedef enum certImportType_t { typedef enum certStatus_t { DISABLED = 0, - ENABLED = 1, + ENABLED = 1 } CertStatus; typedef struct CertSvcStoreCertList_t{ @@ -62,7 +62,7 @@ typedef struct CertSvcStoreCertList_t{ CertStatus status; CertStoreType storeType; struct CertSvcStoreCertList_t *next; -}CertSvcStoreCertList; +} CertSvcStoreCertList; typedef enum certType_t { PEM_CRT = 1 << 0, @@ -70,7 +70,7 @@ typedef enum certType_t { P12_INTERMEDIATE = 1 << 2, P12_TRUSTED = 1 << 3, P12_PKEY = 1 << 4, - INVALID_DATA = 1 << 5, + INVALID_DATA = 1 << 5 } CertType; typedef enum CertSvcCertificateForm_t { diff --git a/vcore/src/cert-svc/cerror.h b/vcore/cert-svc/cerror.h similarity index 100% rename from vcore/src/cert-svc/cerror.h rename to vcore/cert-svc/cerror.h diff --git a/vcore/src/cert-svc/cinstance.h b/vcore/cert-svc/cinstance.h similarity index 100% rename from vcore/src/cert-svc/cinstance.h rename to vcore/cert-svc/cinstance.h diff --git a/vcore/src/cert-svc/cpkcs12.h b/vcore/cert-svc/cpkcs12.h similarity index 100% rename from vcore/src/cert-svc/cpkcs12.h rename to vcore/cert-svc/cpkcs12.h diff --git a/vcore/src/cert-svc/cprimitives.h b/vcore/cert-svc/cprimitives.h similarity index 100% rename from vcore/src/cert-svc/cprimitives.h rename to vcore/cert-svc/cprimitives.h diff --git a/vcore/src/cert-svc/cstring.h b/vcore/cert-svc/cstring.h similarity index 100% rename from vcore/src/cert-svc/cstring.h rename to vcore/cert-svc/cstring.h diff --git a/vcore/dpl/core/include/dpl/assert.h b/vcore/dpl/core/include/dpl/assert.h new file mode 100644 index 0000000..b2cb426 --- /dev/null +++ b/vcore/dpl/core/include/dpl/assert.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ +/* + * @file assert.h + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of assert + */ +#ifndef DPL_ASSERT_H +#define DPL_ASSERT_H + +namespace VcoreDPL { +// Assertion handler procedure +// Do not call directly +// Always use Assert macro +void AssertProc(const char *condition, + const char *file, + int line, + const char *function) __attribute__ ((__noreturn__)); +} // namespace VcoreDPL + +#define Assert(Condition) \ +do { \ + if (!(Condition)) { \ + VcoreDPL::AssertProc(#Condition, __FILE__, __LINE__, __FUNCTION__); \ + } \ +} while (0) + +#define AssertMsg(Condition, Msg) \ + do { \ + if (!(Condition)) { \ + VcoreDPL::AssertProc( \ + (std::string(std::string(#Condition)+" ") + Msg).c_str(), \ + __FILE__, __LINE__, __FUNCTION__); \ + } \ + } while (0) + +#endif // DPL_ASSERT_H diff --git a/vcore/dpl/core/include/dpl/colors.h b/vcore/dpl/core/include/dpl/colors.h new file mode 100644 index 0000000..4c22139 --- /dev/null +++ b/vcore/dpl/core/include/dpl/colors.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ +/* + * @file colors.h + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @version 1.0 + * @brief Some constants with definition of colors for Console + * and html output + */ + +#ifndef DPL_COLORS_H +#define DPL_COLORS_H + +namespace VcoreDPL { +namespace Colors { +namespace Text { +extern const char* BOLD_GREEN_BEGIN; +extern const char* BOLD_GREEN_END; +extern const char* PURPLE_BEGIN; +extern const char* PURPLE_END; +extern const char* RED_BEGIN; +extern const char* RED_END; +extern const char* GREEN_BEGIN; +extern const char* GREEN_END; +extern const char* CYAN_BEGIN; +extern const char* CYAN_END; +extern const char* BOLD_RED_BEGIN; +extern const char* BOLD_RED_END; +extern const char* BOLD_YELLOW_BEGIN; +extern const char* BOLD_YELLOW_END; +extern const char* BOLD_GOLD_BEGIN; +extern const char* BOLD_GOLD_END; +extern const char* BOLD_WHITE_BEGIN; +extern const char* BOLD_WHITE_END; +} //namespace Text + +namespace Html { +extern const char* BOLD_GREEN_BEGIN; +extern const char* BOLD_GREEN_END; +extern const char* PURPLE_BEGIN; +extern const char* PURPLE_END; +extern const char* RED_BEGIN; +extern const char* RED_END; +extern const char* GREEN_BEGIN; +extern const char* GREEN_END; +extern const char* CYAN_BEGIN; +extern const char* CYAN_END; +extern const char* BOLD_RED_BEGIN; +extern const char* BOLD_RED_END; +extern const char* BOLD_YELLOW_BEGIN; +extern const char* BOLD_YELLOW_END; +extern const char* BOLD_GOLD_BEGIN; +extern const char* BOLD_GOLD_END; +extern const char* BOLD_WHITE_BEGIN; +extern const char* BOLD_WHITE_END; +} //namespace Html +} //namespace Colors +} //namespace VcoreDPL + +#endif /* DPL_COLORS_H */ diff --git a/vcore/dpl/core/include/dpl/exception.h b/vcore/dpl/core/include/dpl/exception.h new file mode 100644 index 0000000..95ea4ac --- /dev/null +++ b/vcore/dpl/core/include/dpl/exception.h @@ -0,0 +1,390 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ +/* + * @file exception.h + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief Header file for base exception + */ +#ifndef VcoreDPL_EXCEPTION_H +#define VcoreDPL_EXCEPTION_H + +#include +#include +#include +#include +#include +#include + +namespace VcoreDPL { +void LogUnhandledException(const std::string &str); +void LogUnhandledException(const std::string &str, + const char *filename, + int line, + const char *function); +} + +namespace VcoreDPL { +class Exception { +private: + static unsigned int m_exceptionCount; + static Exception* m_lastException; + static void (*m_terminateHandler)(); + + static void AddRef(Exception* exception) + { + if (!m_exceptionCount) { + m_terminateHandler = std::set_terminate(&TerminateHandler); + } + + ++m_exceptionCount; + m_lastException = exception; + } + + static void UnRef(Exception* e) + { + if (m_lastException == e) { + m_lastException = NULL; + } + + --m_exceptionCount; + + if (!m_exceptionCount) { + std::set_terminate(m_terminateHandler); + m_terminateHandler = NULL; + } + } + + static void TerminateHandler() + { + if (m_lastException != NULL) { + DisplayKnownException(*m_lastException); + abort(); + } else { + DisplayUnknownException(); + abort(); + } + } + + Exception *m_reason; + std::string m_path; + std::string m_function; + int m_line; + +protected: + std::string m_message; + std::string m_className; + +public: + static std::string KnownExceptionToString(const Exception &e) + { + std::ostringstream message; + message << + "\033[1;5;31m\n=== Unhandled DPL exception occurred ===\033[m\n\n"; + message << "\033[1;33mException trace:\033[m\n\n"; + message << e.DumpToString(); + message << "\033[1;31m\n=== Will now abort ===\033[m\n"; + + return message.str(); + } + + static std::string UnknownExceptionToString() + { + std::ostringstream message; + message << + "\033[1;5;31m\n=== Unhandled non-DPL exception occurred ===\033[m\n\n"; + message << "\033[1;31m\n=== Will now abort ===\033[m\n"; + + return message.str(); + } + + static void DisplayKnownException(const Exception& e) + { + LogUnhandledException(KnownExceptionToString(e).c_str()); + } + + static void DisplayUnknownException() + { + LogUnhandledException(UnknownExceptionToString().c_str()); + } + + Exception(const Exception &other) + { + // Deep copy + if (other.m_reason != NULL) { + m_reason = new Exception(*other.m_reason); + } else { + m_reason = NULL; + } + + m_message = other.m_message; + m_path = other.m_path; + m_function = other.m_function; + m_line = other.m_line; + + m_className = other.m_className; + + AddRef(this); + } + + const Exception &operator =(const Exception &other) + { + if (this == &other) { + return *this; + } + + // Deep copy + if (other.m_reason != NULL) { + m_reason = new Exception(*other.m_reason); + } else { + m_reason = NULL; + } + + m_message = other.m_message; + m_path = other.m_path; + m_function = other.m_function; + m_line = other.m_line; + + m_className = other.m_className; + + AddRef(this); + + return *this; + } + + Exception(const char *path, + const char *function, + int line, + const std::string &message) : + m_reason(NULL), + m_path(path), + m_function(function), + m_line(line), + m_message(message) + { + AddRef(this); + } + + Exception(const char *path, + const char *function, + int line, + const Exception &reason, + const std::string &message) : + m_reason(new Exception(reason)), + m_path(path), + m_function(function), + m_line(line), + m_message(message) + { + AddRef(this); + } + + virtual ~Exception() throw() + { + if (m_reason != NULL) { + delete m_reason; + m_reason = NULL; + } + + UnRef(this); + } + + void Dump() const + { + // Show reason first + if (m_reason != NULL) { + m_reason->Dump(); + } + + // Afterward, dump exception + const char *file = strchr(m_path.c_str(), '/'); + + if (file == NULL) { + file = m_path.c_str(); + } else { + ++file; + } + + printf("\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n", + file, m_line, + m_function.c_str(), + m_className.c_str(), + m_message.empty() ? "" : m_message.c_str()); + } + + std::string DumpToString() const + { + std::string ret; + if (m_reason != NULL) { + ret = m_reason->DumpToString(); + } + + const char *file = strchr(m_path.c_str(), '/'); + + if (file == NULL) { + file = m_path.c_str(); + } else { + ++file; + } + + char buf[1024]; + snprintf(buf, + sizeof(buf), + "\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n", + file, + m_line, + m_function.c_str(), + m_className.c_str(), + m_message.empty() ? "" : m_message.c_str()); + + buf[sizeof(buf) - 1] = '\n'; + ret += buf; + + return ret; + } + + Exception *GetReason() const + { + return m_reason; + } + + std::string GetPath() const + { + return m_path; + } + + std::string GetFunction() const + { + return m_function; + } + + int GetLine() const + { + return m_line; + } + + std::string GetMessage() const + { + return m_message; + } + + std::string GetClassName() const + { + return m_className; + } +}; +} // namespace VcoreDPL + +#define Try try + +#define Throw(ClassName) \ + throw ClassName(__FILE__, __FUNCTION__, __LINE__) + +#define ThrowMsg(ClassName, Message) \ + do \ + { \ + std::ostringstream dplLoggingStream; \ + dplLoggingStream << Message; \ + throw ClassName(__FILE__, __FUNCTION__, __LINE__, dplLoggingStream.str()); \ + } while (0) + +#define ReThrow(ClassName) \ + throw ClassName(__FILE__, __FUNCTION__, __LINE__, _rethrown_exception) + +#define ReThrowMsg(ClassName, Message) \ + throw ClassName(__FILE__, \ + __FUNCTION__, \ + __LINE__, \ + _rethrown_exception, \ + Message) + +#define Catch(ClassName) \ + catch (const ClassName &_rethrown_exception) + +#define DECLARE_EXCEPTION_TYPE(BaseClass, Class) \ + class Class : public BaseClass { \ + public: \ + Class(const char *path, \ + const char *function, \ + int line, \ + const std::string & message = std::string()) \ + : BaseClass(path, function, line, message) { \ + \ + BaseClass::m_className = #Class; \ + } \ + \ + Class(const char *path, \ + const char *function, \ + int line, \ + const VcoreDPL::Exception & reason, \ + const std::string & message = std::string()) \ + : BaseClass(path, function, line, reason, message) { \ + BaseClass::m_className = #Class; \ + } \ + }; + +#define UNHANDLED_EXCEPTION_HANDLER_BEGIN try + +#define UNHANDLED_EXCEPTION_HANDLER_END \ + catch (const VcoreDPL::Exception &exception) \ + { \ + std::ostringstream msg; \ + msg << VcoreDPL::Exception::KnownExceptionToString(exception); \ + VcoreDPL::LogUnhandledException(msg.str(), \ + __FILE__, \ + __LINE__, \ + __FUNCTION__); \ + abort(); \ + } \ + catch (std::exception& e) \ + { \ + std::ostringstream msg; \ + msg << e.what(); \ + msg << "\n"; \ + msg << VcoreDPL::Exception::UnknownExceptionToString(); \ + VcoreDPL::LogUnhandledException(msg.str(), \ + __FILE__, \ + __LINE__, \ + __FUNCTION__); \ + abort(); \ + } \ + catch (...) \ + { \ + std::ostringstream msg; \ + msg << VcoreDPL::Exception::UnknownExceptionToString(); \ + VcoreDPL::LogUnhandledException(msg.str(), \ + __FILE__, \ + __LINE__, \ + __FUNCTION__); \ + abort(); \ + } + +namespace VcoreDPL { +namespace CommonException { +/** + * Internal exception definitions + * + * These should normally not happen. + * Usually, exception trace with internal error includes + * important messages. + */ +DECLARE_EXCEPTION_TYPE(Exception, InternalError) ///< Unexpected error from + // underlying libraries or + // kernel +} +} + +#endif // VcoreDPL_EXCEPTION_H diff --git a/vcore/dpl/core/include/dpl/noncopyable.h b/vcore/dpl/core/include/dpl/noncopyable.h new file mode 100644 index 0000000..89372d0 --- /dev/null +++ b/vcore/dpl/core/include/dpl/noncopyable.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ +/* + * @file noncopyable + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of noncopyable + */ +#ifndef DPL_NONCOPYABLE_H +#define DPL_NONCOPYABLE_H + +namespace VcoreDPL { +class Noncopyable +{ + private: + Noncopyable(const Noncopyable &); + const Noncopyable &operator=(const Noncopyable &); + + public: + Noncopyable(); + virtual ~Noncopyable(); +}; +} // namespace VcoreDPL + +#endif // DPL_NONCOPYABLE_H diff --git a/vcore/src/dpl/core/include/dpl/abstract_waitable_input.h b/vcore/dpl/core/include/dpl/singleton.h similarity index 61% rename from vcore/src/dpl/core/include/dpl/abstract_waitable_input.h rename to vcore/dpl/core/include/dpl/singleton.h index 6447690..57bbe33 100644 --- a/vcore/src/dpl/core/include/dpl/abstract_waitable_input.h +++ b/vcore/dpl/core/include/dpl/singleton.h @@ -14,26 +14,38 @@ * limitations under the License. */ /* - * @file abstract_waitable_input.h + * @file singleton.h * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) * @version 1.0 - * @brief This file is the header file of abstract waitable input + * @brief This file is the implementation file of singleton */ -#ifndef DPL_ABSTRACT_WAITABLE_INPUT_H -#define DPL_ABSTRACT_WAITABLE_INPUT_H - -#include -#include +#ifndef DPL_SINGLETON_H +#define DPL_SINGLETON_H namespace VcoreDPL { -class AbstractWaitableInput : - public AbstractInput +template +class Singleton : + private Class { + // + // Note: + // + // To remove posibility of instantiating directly Class, + // make Class' default constructor protected + // + + private: + Singleton() + {} + + static Singleton &InternalInstance(); + public: - virtual ~AbstractWaitableInput() {} + virtual ~Singleton() + {} - virtual WaitableHandle WaitableReadHandle() const = 0; + static Class &Instance(); }; } // namespace VcoreDPL -#endif // DPL_ABSTRACT_WAITABLE_INPUT_H +#endif // DPL_SINGLETON_H diff --git a/vcore/dpl/core/include/dpl/singleton_impl.h b/vcore/dpl/core/include/dpl/singleton_impl.h new file mode 100644 index 0000000..f8f9fd9 --- /dev/null +++ b/vcore/dpl/core/include/dpl/singleton_impl.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ +/* + * @file singleton_impl.h + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of singleton + */ +#ifndef DPL_SINGLETON_IMPL_H +#define DPL_SINGLETON_IMPL_H + +#include + +/* + * WARNING! + * + * If some singleton's implementation uses another singletons implementation, + * those templates make the second singleton a dubleton. Be warned. Try to use + * singleton_safe_impl.h if possible. + */ + +namespace VcoreDPL { +template +Singleton& Singleton::InternalInstance() +{ + static Singleton instance; + return instance; +} + +template +Class &Singleton::Instance() +{ + Singleton& instance = Singleton::InternalInstance(); + return instance; +} +} // namespace VcoreDPL + +#define IMPLEMENT_SINGLETON(Type) \ + template VcoreDPL::Singleton&VcoreDPL::Singleton::InternalInstance(); \ + template Type & VcoreDPL::Singleton::Instance(); \ + +#endif // DPL_SINGLETON_IMPL_H diff --git a/vcore/src/dpl/core/src/assert.cpp b/vcore/dpl/core/src/assert.cpp similarity index 98% rename from vcore/src/dpl/core/src/assert.cpp rename to vcore/dpl/core/src/assert.cpp index 22761a4..a90b4a3 100644 --- a/vcore/src/dpl/core/src/assert.cpp +++ b/vcore/dpl/core/src/assert.cpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #include diff --git a/vcore/dpl/core/src/colors.cpp b/vcore/dpl/core/src/colors.cpp new file mode 100644 index 0000000..e918453 --- /dev/null +++ b/vcore/dpl/core/src/colors.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ +/* + * @file colors.cpp + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @version 1.0 + * @brief Some constants with definition of colors for Console + * and html output + */ +#include +#include + +namespace VcoreDPL { +namespace Colors { +namespace Text { +const char* BOLD_GREEN_BEGIN = "\033[1;32m"; +const char* BOLD_GREEN_END = "\033[m"; +const char* RED_BEGIN = "\033[0;31m"; +const char* RED_END = "\033[m"; +const char* PURPLE_BEGIN = "\033[0;35m"; +const char* PURPLE_END = "\033[m"; +const char* GREEN_BEGIN = "\033[0;32m"; +const char* GREEN_END = "\033[m"; +const char* CYAN_BEGIN = "\033[0;36m"; +const char* CYAN_END = "\033[m"; +const char* BOLD_RED_BEGIN = "\033[1;31m"; +const char* BOLD_RED_END = "\033[m"; +const char* BOLD_YELLOW_BEGIN = "\033[1;33m"; +const char* BOLD_YELLOW_END = "\033[m"; +const char* BOLD_GOLD_BEGIN = "\033[0;33m"; +const char* BOLD_GOLD_END = "\033[m"; +const char* BOLD_WHITE_BEGIN = "\033[1;37m"; +const char* BOLD_WHITE_END = "\033[m"; +} //namespace Text + +namespace Html { +const char* BOLD_GREEN_BEGIN = ""; +const char* BOLD_GREEN_END = ""; +const char* PURPLE_BEGIN = ""; +const char* PURPLE_END = ""; +const char* RED_BEGIN = ""; +const char* RED_END = ""; +const char* GREEN_BEGIN = ""; +const char* GREEN_END = ""; +const char* CYAN_BEGIN = ""; +const char* CYAN_END = ""; +const char* BOLD_RED_BEGIN = ""; +const char* BOLD_RED_END = ""; +const char* BOLD_YELLOW_BEGIN = ""; +const char* BOLD_YELLOW_END = ""; +const char* BOLD_GOLD_BEGIN = ""; +const char* BOLD_GOLD_END = ""; +const char* BOLD_WHITE_BEGIN = ""; +const char* BOLD_WHITE_END = ""; +} //namespace Html +} //namespace Colors +} //namespace VcoreDPL diff --git a/vcore/src/dpl/core/src/exception.cpp b/vcore/dpl/core/src/exception.cpp similarity index 100% rename from vcore/src/dpl/core/src/exception.cpp rename to vcore/dpl/core/src/exception.cpp diff --git a/vcore/dpl/core/src/noncopyable.cpp b/vcore/dpl/core/src/noncopyable.cpp new file mode 100644 index 0000000..74fc9af --- /dev/null +++ b/vcore/dpl/core/src/noncopyable.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ +/* + * @file noncopyable.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of noncopyable + */ +#include +#include + +namespace VcoreDPL { +Noncopyable::Noncopyable() +{} + +Noncopyable::~Noncopyable() +{} +} // namespace VcoreDPL diff --git a/vcore/src/dpl/core/src/type_list.cpp b/vcore/dpl/core/src/singleton.cpp similarity index 81% rename from vcore/src/dpl/core/src/type_list.cpp rename to vcore/dpl/core/src/singleton.cpp index fa94806..54abd52 100644 --- a/vcore/src/dpl/core/src/type_list.cpp +++ b/vcore/dpl/core/src/singleton.cpp @@ -14,13 +14,13 @@ * limitations under the License. */ /* - * @file type_list.cpp - * @author Bartosz Janiak (b.janiak@samsung.com) + * @file singleton.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) * @version 1.0 - * @brief Generic type list template + * @brief This file is the implementation file of singleton */ #include -#include +#include // // Note: diff --git a/vcore/src/dpl/log/include/dpl/log/abstract_log_provider.h b/vcore/dpl/log/include/dpl/log/abstract_log_provider.h similarity index 100% rename from vcore/src/dpl/log/include/dpl/log/abstract_log_provider.h rename to vcore/dpl/log/include/dpl/log/abstract_log_provider.h diff --git a/vcore/src/dpl/log/include/dpl/log/dlog_log_provider.h b/vcore/dpl/log/include/dpl/log/dlog_log_provider.h similarity index 100% rename from vcore/src/dpl/log/include/dpl/log/dlog_log_provider.h rename to vcore/dpl/log/include/dpl/log/dlog_log_provider.h diff --git a/vcore/src/dpl/log/include/dpl/log/journal_log_provider.h b/vcore/dpl/log/include/dpl/log/journal_log_provider.h similarity index 100% rename from vcore/src/dpl/log/include/dpl/log/journal_log_provider.h rename to vcore/dpl/log/include/dpl/log/journal_log_provider.h diff --git a/vcore/src/dpl/log/include/dpl/log/log.h b/vcore/dpl/log/include/dpl/log/log.h similarity index 100% rename from vcore/src/dpl/log/include/dpl/log/log.h rename to vcore/dpl/log/include/dpl/log/log.h diff --git a/vcore/src/dpl/log/include/dpl/log/old_style_log_provider.h b/vcore/dpl/log/include/dpl/log/old_style_log_provider.h similarity index 100% rename from vcore/src/dpl/log/include/dpl/log/old_style_log_provider.h rename to vcore/dpl/log/include/dpl/log/old_style_log_provider.h diff --git a/vcore/src/dpl/log/src/abstract_log_provider.cpp b/vcore/dpl/log/src/abstract_log_provider.cpp similarity index 100% rename from vcore/src/dpl/log/src/abstract_log_provider.cpp rename to vcore/dpl/log/src/abstract_log_provider.cpp diff --git a/vcore/src/dpl/log/src/dlog_log_provider.cpp b/vcore/dpl/log/src/dlog_log_provider.cpp similarity index 100% rename from vcore/src/dpl/log/src/dlog_log_provider.cpp rename to vcore/dpl/log/src/dlog_log_provider.cpp diff --git a/vcore/src/dpl/log/src/journal_log_provider.cpp b/vcore/dpl/log/src/journal_log_provider.cpp similarity index 100% rename from vcore/src/dpl/log/src/journal_log_provider.cpp rename to vcore/dpl/log/src/journal_log_provider.cpp diff --git a/vcore/src/dpl/log/src/log.cpp b/vcore/dpl/log/src/log.cpp similarity index 100% rename from vcore/src/dpl/log/src/log.cpp rename to vcore/dpl/log/src/log.cpp diff --git a/vcore/src/dpl/log/src/old_style_log_provider.cpp b/vcore/dpl/log/src/old_style_log_provider.cpp similarity index 100% rename from vcore/src/dpl/log/src/old_style_log_provider.cpp rename to vcore/dpl/log/src/old_style_log_provider.cpp diff --git a/vcore/src/server/include/cert-server-logic.h b/vcore/server/include/cert-server-logic.h similarity index 100% rename from vcore/src/server/include/cert-server-logic.h rename to vcore/server/include/cert-server-logic.h diff --git a/vcore/src/server/src/cert-server-logic.c b/vcore/server/src/cert-server-logic.c similarity index 99% rename from vcore/src/server/src/cert-server-logic.c rename to vcore/server/src/cert-server-logic.c index 122d25f..a048acf 100644 --- a/vcore/src/server/src/cert-server-logic.c +++ b/vcore/server/src/cert-server-logic.c @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include diff --git a/vcore/src/server/src/cert-server-main.c b/vcore/server/src/cert-server-main.c similarity index 99% rename from vcore/src/server/src/cert-server-main.c rename to vcore/server/src/cert-server-main.c index 0311dfb..1a1109e 100644 --- a/vcore/src/server/src/cert-server-main.c +++ b/vcore/server/src/cert-server-main.c @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include diff --git a/vcore/src/CMakeLists.txt b/vcore/src/CMakeLists.txt deleted file mode 100644 index da69300..0000000 --- a/vcore/src/CMakeLists.txt +++ /dev/null @@ -1,195 +0,0 @@ -# compiler warning flags -ADD_DEFINITIONS("-Wall") -ADD_DEFINITIONS("-Wextra") -ADD_DEFINITIONS("-Werror") - -PKG_CHECK_MODULES(VCORE_DEPS - REQUIRED - libxml-2.0 - libpcrecpp - openssl - xmlsec1 - dlog - libsystemd-journal - ) - -ADD_DEFINITIONS(${VCORE_DEPS_CFLAGS}) -ADD_DEFINITIONS(${VCORE_DEPS_CFLAGS_OTHER}) - -SET(VCORE_DIR - ${PROJECT_SOURCE_DIR}/vcore - ) - -SET(VCORE_SRC_DIR - ${VCORE_DIR}/src/vcore - ) - -########### DPL SOURCES ########## -SET(VCORE_DPL_DIR - ${VCORE_DIR}/src/dpl - ) -SET(VCORE_DPL_CORE_SRC_DIR - ${VCORE_DPL_DIR}/core/src - ) -SET(VCORE_DPL_CORE_SOURCES - ${VCORE_DPL_CORE_SRC_DIR}/assert.cpp - ${VCORE_DPL_CORE_SRC_DIR}/binary_queue.cpp - ${VCORE_DPL_CORE_SRC_DIR}/char_traits.cpp - ${VCORE_DPL_CORE_SRC_DIR}/colors.cpp - ${VCORE_DPL_CORE_SRC_DIR}/errno_string.cpp - ${VCORE_DPL_CORE_SRC_DIR}/exception.cpp - ${VCORE_DPL_CORE_SRC_DIR}/file_input.cpp - ${VCORE_DPL_CORE_SRC_DIR}/noncopyable.cpp - ${VCORE_DPL_CORE_SRC_DIR}/singleton.cpp - ${VCORE_DPL_CORE_SRC_DIR}/string.cpp - ${VCORE_DPL_CORE_SRC_DIR}/type_list.cpp - ${VCORE_DPL_CORE_SRC_DIR}/thread.cpp - ${VCORE_DPL_CORE_SRC_DIR}/waitable_event.cpp - ${VCORE_DPL_CORE_SRC_DIR}/waitable_handle.cpp - ${VCORE_DPL_CORE_SRC_DIR}/waitable_handle_watch_support.cpp - ) - -SET(VCORE_DPL_LOG_SRC_DIR - ${VCORE_DPL_DIR}/log/src - ) -SET(VCORE_DPL_LOG_SOURCES - ${VCORE_DPL_LOG_SRC_DIR}/abstract_log_provider.cpp - ${VCORE_DPL_LOG_SRC_DIR}/old_style_log_provider.cpp - ${VCORE_DPL_LOG_SRC_DIR}/dlog_log_provider.cpp - ${VCORE_DPL_LOG_SRC_DIR}/journal_log_provider.cpp - ${VCORE_DPL_LOG_SRC_DIR}/log.cpp - ) -########### DPL SOURCES ########## - - -########### VCORE SOURCES ######## -SET(VCORE_SOURCES - ${VCORE_SRC_DIR}/api.cpp - ${VCORE_SRC_DIR}/Base64.cpp - ${VCORE_SRC_DIR}/Certificate.cpp - ${VCORE_SRC_DIR}/CertificateCollection.cpp - ${VCORE_SRC_DIR}/CertificateConfigReader.cpp - ${VCORE_SRC_DIR}/CertificateLoader.cpp - ${VCORE_SRC_DIR}/CertStoreType.cpp - ${VCORE_SRC_DIR}/ReferenceValidator.cpp - ${VCORE_SRC_DIR}/RevocationCheckerBase.cpp - ${VCORE_SRC_DIR}/SaxReader.cpp - ${VCORE_SRC_DIR}/SignatureData.cpp - ${VCORE_SRC_DIR}/SignatureFinder.cpp - ${VCORE_SRC_DIR}/SignatureReader.cpp - ${VCORE_SRC_DIR}/TimeConversion.cpp - ${VCORE_SRC_DIR}/VerificationStatus.cpp - ${VCORE_SRC_DIR}/ValidatorFactories.cpp - ${VCORE_SRC_DIR}/SignatureValidator.cpp - ${VCORE_SRC_DIR}/XmlsecAdapter.cpp - ${VCORE_SRC_DIR}/pkcs12.cpp - ${VCORE_SRC_DIR}/exception.cpp - - ${VCORE_SRC_DIR}/utils.c - ${VCORE_SRC_DIR}/cert-svc-client.c - ) - -SET(VCORE_INCLUDES - ${VCORE_DEPS_INCLUDE_DIRS} - ${VCORE_SRC_DIR} - ${VCORE_DIR}/src - ${VCORE_DIR}/src/legacy - ) - -########### VCORE SOURCES ######## - -SET(VCORE_ALL_SOURCES - ${VCORE_SOURCES} - ${VCORE_DPL_CORE_SOURCES} - ${VCORE_DPL_LOG_SOURCES} - ) -SET(VCORE_ALL_INCLUDES - ${PROJECT_SOURCE_DIR}/include - ${VCORE_INCLUDES} - ${VCORE_DPL_DIR}/core/include - ${VCORE_DPL_DIR}/log/include - ) - -INCLUDE_DIRECTORIES(SYSTEM ${VCORE_ALL_INCLUDES}) - -ADD_LIBRARY(${TARGET_VCORE_LIB} SHARED ${VCORE_ALL_SOURCES}) - -# TODO: visibility needed to be hidden -SET_TARGET_PROPERTIES(${TARGET_VCORE_LIB} - PROPERTIES - COMPILE_FLAGS "-D_GNU_SOURCE -fPIC -fvisibility=default" - SOVERSION ${SO_VERSION} - VERSION ${VERSION}) - -TARGET_LINK_LIBRARIES(${TARGET_VCORE_LIB} - ${VCORE_DEPS_LIBRARIES} - ${TARGET_CERT_SVC_LIB} - ) - -########## cert-server ############# -PKG_CHECK_MODULES(CERT_SERVER_DEP - REQUIRED - dlog - sqlite3 - db-util - libsystemd-daemon - key-manager - ) - -SET(CERT_SERVER_DIR - ${PROJECT_SOURCE_DIR}/vcore/src/server - ) - -SET(CERT_SERVER_SRCS - ${CERT_SERVER_DIR}/src/cert-server-main.c - ${CERT_SERVER_DIR}/src/cert-server-logic.c - ) - -INCLUDE_DIRECTORIES( - SYSTEM - ${CERT_SERVER_DEP_INCLUDE_DIRS} - ${PROJECT_SOURCE_DIR}/include - ${VCORE_DIR}/src - ${CERT_SERVER_DIR}/include - ) - -SET_SOURCE_FILES_PROPERTIES( - ${CERT_SERVER_SRCS} - PROPERTIES - COMPILE_FLAGS "-D_GNU_SOURCE -fvisibility=hidden -fPIE" - ) - -ADD_EXECUTABLE(${TARGET_CERT_SERVER} ${CERT_SERVER_SRCS}) - -TARGET_LINK_LIBRARIES(${TARGET_CERT_SERVER} - ${CERT_SERVER_DEP_LIBRARIES} - -pie - ) - -INSTALL(TARGETS ${TARGET_CERT_SERVER} DESTINATION ${BINDIR}) - -######################################################## -INSTALL(TARGETS ${TARGET_VCORE_LIB} - DESTINATION ${LIBDIR} - ) - -INSTALL(FILES - ${VCORE_SRC_DIR}/SignatureValidator.h - ${VCORE_SRC_DIR}/SignatureFinder.h - - ${VCORE_SRC_DIR}/Certificate.h - ${VCORE_SRC_DIR}/SignatureData.h - ${VCORE_SRC_DIR}/CertStoreType.h - ${VCORE_SRC_DIR}/exception.h - DESTINATION ${INCLUDEDIR}/cert-svc/vcore - ) - -INSTALL(FILES - ${VCORE_DIR}/src/cert-svc/ccert.h - ${VCORE_DIR}/src/cert-svc/cinstance.h - ${VCORE_DIR}/src/cert-svc/cerror.h - ${VCORE_DIR}/src/cert-svc/cpkcs12.h - ${VCORE_DIR}/src/cert-svc/cprimitives.h - ${VCORE_DIR}/src/cert-svc/cstring.h - DESTINATION ${INCLUDEDIR}/cert-svc/cert-svc - ) diff --git a/vcore/src/cert-svc/ccrl.h b/vcore/src/cert-svc/ccrl.h deleted file mode 100644 index 02f8a7a..0000000 --- a/vcore/src/cert-svc/ccrl.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file ccrl.h - * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) - * @version 1.0 - * @brief This is part of C api for ValidationCore. - */ -#ifndef _CERTSVC_CCRL_H_ -#define _CERTSVC_CCRL_H_ - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define CERTSVC_CRL_GOOD (1<<0) -#define CERTSVC_CRL_REVOKED (1<<1) -#define CERTSVC_CRL_VERIFICATION_ERROR (1<<3) -#define CERTSVC_CRL_NO_SUPPORT (1<<4) - -typedef void (*CertSvcCrlCacheWrite)( - const char *distributionPoint, - const char *body, - int bodySize, - time_t nextUpdateTime, - void *userParam); - -typedef int (*CertSvcCrlCacheRead)( - const char *distributionPoint, - char **body, - int *bodySize, - time_t *nextUpdateTime, - void *userParam); - -typedef void (*CertSvcCrlFree)( - char *buffer, - void *userParam); - -void certsvc_crl_cache_functions( - CertSvcInstance instance, - CertSvcCrlCacheWrite writePtr, - CertSvcCrlCacheRead readPtr, - CertSvcCrlFree freePtr); - -int certsvc_crl_check( - CertSvcCertificate certificate, - CertSvcCertificate *trustedStore, - int storeSize, - int force, - int *status, - void *userParam); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/vcore/src/cert-svc/cocsp.h b/vcore/src/cert-svc/cocsp.h deleted file mode 100644 index f86816d..0000000 --- a/vcore/src/cert-svc/cocsp.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file cocsp.h - * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) - * @version 1.0 - * @brief This is C api for ValidationCore. - */ -#ifndef _CERTSVC_OCSP_C_API_H_ -#define _CERTSVC_OCSP_C_API_H_ - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define CERTSVC_OCSP_GOOD (1<<0) -#define CERTSVC_OCSP_REVOKED (1<<1) -#define CERTSVC_OCSP_UNKNOWN (1<<2) -#define CERTSVC_OCSP_VERIFICATION_ERROR (1<<3) -#define CERTSVC_OCSP_NO_SUPPORT (1<<4) -#define CERTSVC_OCSP_CONNECTION_FAILED (1<<5) -#define CERTSVC_OCSP_ERROR (1<<6) -/** - * Implementation of ocsp call. - * - * Please note: to verify certificate you need certificate and his parrent. - * This function will always verify chain_size-1 certificates from the chain. - * - * @param[in] chain Certificate to check. - * @param[in] chain_size Size of certificate_array - * @param[in] trusted Store with trusted certificates (additional certificates - * that may by reqired during verification process). - * @param[in] trusted_size Size of trusted certificate store. - * @param[in] url Force OCSP to use specific server. Pass NULL to use OCSP server defined in certificate. - * @param[out] status Bit field with description of chain validation. - * @return CERTSVC_SUCCESS, CERTSVC_FAIL, CERTSVC_WRONG_ARGUMENT - */ -int certsvc_ocsp_check(CertSvcCertificate *chain, - int chainSize, - CertSvcCertificate *trusted, - int truestedSize, - const char *url, - int *status); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/vcore/src/dpl/core/include/dpl/char_traits.h b/vcore/src/dpl/core/include/dpl/char_traits.h deleted file mode 100644 index a9d0bc0..0000000 --- a/vcore/src/dpl/core/include/dpl/char_traits.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file char_traits.h - * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com) - * @version 1.0 - * @brief Char traits are used to create basic_string extended with - * additional features - * Current char traits could be extended in feature to boost - * performance - */ -#ifndef DPL_CHAR_TRAITS -#define DPL_CHAR_TRAITS - -#include -#include -#include -#include -#include - -namespace VcoreDPL { -typedef std::char_traits CharTraits; -} // namespace VcoreDPL - -#endif // DPL_CHAR_TRAITS diff --git a/vcore/src/dpl/core/include/dpl/file_input.h b/vcore/src/dpl/core/include/dpl/file_input.h deleted file mode 100644 index d982957..0000000 --- a/vcore/src/dpl/core/include/dpl/file_input.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file file_input.h - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of file input - */ -#ifndef DPL_FILE_INPUT_H -#define DPL_FILE_INPUT_H - -#include -#include -#include - -namespace VcoreDPL { -class FileInput : - private Noncopyable, - public AbstractWaitableInput -{ - public: - class Exception - { - public: - DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base) - DECLARE_EXCEPTION_TYPE(Base, OpenFailed) - DECLARE_EXCEPTION_TYPE(Base, CloseFailed) - }; - - protected: - int m_fd; - - public: - FileInput(); - FileInput(const std::string &fileName); - virtual ~FileInput(); - - void Open(const std::string &fileName); - void Close(); - - // AbstractInput - virtual BinaryQueueAutoPtr Read(size_t size); - - // AbstractWaitableInput - virtual WaitableHandle WaitableReadHandle() const; -}; -} // namespace VcoreDPL - -#endif // DPL_FILE_INPUT_H diff --git a/vcore/src/dpl/core/include/dpl/optional.h b/vcore/src/dpl/core/include/dpl/optional.h deleted file mode 100644 index 2f37aa1..0000000 --- a/vcore/src/dpl/core/include/dpl/optional.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file optional_value.h - * @author Lukasz Wrzosek (l.wrzosek@samsung.com) - * @version 1.0 - */ - -#ifndef DPL_OPTIONAL_H -#define DPL_OPTIONAL_H - -#include -#include - -namespace VcoreDPL { -template -class Optional -{ - class Exception - { - public: - DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base) - DECLARE_EXCEPTION_TYPE(Base, NullReference) - }; - - public: - Optional() : - m_null(true), - m_value() - {} - - Optional(const Type& t) : - m_null(false), - m_value(t) - {} - - bool IsNull() const - { - return m_null; - } - - Type& operator*() - { - if (m_null) { - Throw(typename Exception::NullReference); - } - return m_value; - } - - const Type& operator*() const - { - if (m_null) { - Throw(typename Exception::NullReference); - } - return m_value; - } - - const Type* operator->() const - { - if (m_null) { - Throw(typename Exception::NullReference); - } - return &m_value; - } - - Type* operator->() - { - if (m_null) { - Throw(typename Exception::NullReference); - } - return &m_value; - } - - bool operator!() const - { - return m_null; - } - - Optional& operator=(const Type& other) - { - m_null = false; - m_value = other; - return *this; - } - - bool operator==(const Optional& aSecond) const - { - return LogicalOperator(*this, aSecond, - std::equal_to(), std::equal_to()); - } - - bool operator==(const Type& aSecond) const - { - return Optional(aSecond) == *this; - } - - bool operator!=(const Optional& aSecond) const - { - return !(*this == aSecond); - } - - bool operator<(const Optional& aSecond) const - { - return LogicalOperator(*this, aSecond, - std::less(), std::less()); - } - - bool operator>(const Optional& aSecond) const - { - return LogicalOperator(*this, aSecond, - std::greater(), std::greater()); - } - - bool operator<=(const Optional& aSecond) const - { - return *this == aSecond || *this < aSecond; - } - - bool operator>=(const Optional& aSecond) const - { - return *this == aSecond || *this > aSecond; - } - - static Optional Null; - - private: - bool m_null; - Type m_value; - - template - static bool LogicalOperator(const Optional& aFirst, - const Optional& aSecond, - taComparator aComparator, - taNullComparator aNullComparator) - { - if (aFirst.m_null == aSecond.m_null) { - if (aFirst.m_null) { - return taEquality; - } else { - return aComparator(aFirst.m_value, aSecond.m_value); - } - } else { - return aNullComparator(aFirst.m_null, aSecond.m_null); - } - } -} DPL_DEPRECATED_WITH_MESSAGE("Use boost::optional instead"); - -template -Optional Optional::Null = Optional(); -} //namespace VcoreDPL - -template -std::ostream& operator<<(std::ostream& aStream, - const VcoreDPL::Optional& aOptional) -{ - if (aOptional.IsNull()) { - return aStream << "null optional"; - } else { - return aStream << *aOptional; - } -} - -#endif // DPL_OPTIONAL_VALUE_H diff --git a/vcore/src/dpl/core/include/dpl/optional_typedefs.h b/vcore/src/dpl/core/include/dpl/optional_typedefs.h deleted file mode 100644 index bd411f2..0000000 --- a/vcore/src/dpl/core/include/dpl/optional_typedefs.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -#ifndef DPL_OPTIONAL_TYPEDEFS_H -#define DPL_OPTIONAL_TYPEDEFS_H - -#include -#include -#include - -namespace VcoreDPL { -typedef boost::optional OptionalString; -typedef boost::optional OptionalInt; -typedef boost::optional OptionalUInt; -typedef boost::optional OptionalBool; -typedef boost::optional OptionalFloat; -typedef boost::optional OptionalStdString; -} //namespace VcoreDPL - -#endif /* DPL_OPTIONAL_TYPEDEFS_H */ - diff --git a/vcore/src/dpl/core/include/dpl/scoped_array.h b/vcore/src/dpl/core/include/dpl/scoped_array.h deleted file mode 100644 index e117f33..0000000 --- a/vcore/src/dpl/core/include/dpl/scoped_array.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/*! - * @file scoped_ptr.h - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of scoped array RAII - * - * This module is deprecated, please use standard C++11 feature: std::unique_ptr - */ -#ifndef DPL_SCOPED_ARRAY_H -#define DPL_SCOPED_ARRAY_H - -#include - -#include -#include -#include - -namespace VcoreDPL { -template -struct ScopedArrayPolicy -{ - typedef Class* Type; - static Type NullValue() - { - return NULL; - } - static void Destroy(Type ptr) - { - delete[] ptr; - } -}; - -template -class ScopedArray : public ScopedResource > -{ - typedef ScopedArrayPolicy Policy; - typedef ScopedResource BaseType; - - public: - explicit ScopedArray(Class *ptr = Policy::NullValue()) : BaseType(ptr) { } - - Class &operator [](std::ptrdiff_t k) const - { - Assert(this->m_value != Policy::NullValue() && - "Dereference of scoped NULL array!"); - Assert(k >= 0 && "Negative array index"); - - return this->m_value[k]; - } -} DPL_DEPRECATED_WITH_MESSAGE("use standard C++11 feature: std::unique_ptr"); -} // namespace VcoreDPL - -#endif // DPL_SCOPED_PTR_H diff --git a/vcore/src/dpl/core/include/dpl/string.h b/vcore/src/dpl/core/include/dpl/string.h deleted file mode 100644 index 68d6a09..0000000 --- a/vcore/src/dpl/core/include/dpl/string.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file string.h - * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com) - * @version 1.0 - */ -#ifndef DPL_STRING -#define DPL_STRING - -#include -#include -#include -#include -#include - -namespace VcoreDPL { -// @brief DPL string -typedef std::basic_string String; - -// @brief String exception class -class StringException -{ - public: - DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base) - - // @brief Invalid init for UTF8 to UTF32 converter - DECLARE_EXCEPTION_TYPE(Base, IconvInitErrorUTF8ToUTF32) - - // @brief Invalid taStdContainerinit for UTF32 to UTF32 converter - DECLARE_EXCEPTION_TYPE(Base, IconvInitErrorUTF32ToUTF8) - - // @brief Invalid conversion for UTF8 to UTF32 converter - DECLARE_EXCEPTION_TYPE(Base, IconvConvertErrorUTF8ToUTF32) - - // @brief Invalid conversion for UTF8 to UTF32 converter - DECLARE_EXCEPTION_TYPE(Base, IconvConvertErrorUTF32ToUTF8) - - // @brief Invalid ASCII character detected in FromASCII - DECLARE_EXCEPTION_TYPE(Base, InvalidASCIICharacter) - - // @brief Invalid ASCII character detected in FromASCII - DECLARE_EXCEPTION_TYPE(Base, ICUInvalidCharacterFound) -}; - -//!\brief convert ASCII string to VcoreDPL::String -String FromASCIIString(const std::string& aString); - -//!\brief convert UTF32 string to VcoreDPL::String -String FromUTF32String(const std::wstring& aString); - -//@brief Returns String object created from UTF8 string -//@param[in] aString input UTF-8 string -String FromUTF8String(const std::string& aString); - -//@brief Returns String content as std::string -std::string ToUTF8String(const String& aString); - -//@brief Compare two unicode strings -int StringCompare(const String &left, - const String &right, - bool caseInsensitive = false); - -//@brief Splits the string into substrings. -//@param[in] str Input string -//@param[in] delimiters array or string containing a sequence of substring -// delimiters. Can be also a single delimiter character. -//@param[in] it InserterIterator that is used to save the generated substrings. -template -void Tokenize(const StringType& str, - const Delimiters& delimiters, - InserterIterator it, - bool ignoreEmpty = false) -{ - typename StringType::size_type nextSearchStart = 0; - typename StringType::size_type pos; - typename StringType::size_type length; - - while (true) { - pos = str.find_first_of(delimiters, nextSearchStart); - length = - ((pos == StringType::npos) ? str.length() : pos) - nextSearchStart; - - if (!ignoreEmpty || length > 0) { - *it = str.substr(nextSearchStart, length); - it++; - } - - if (pos == StringType::npos) { - return; - } - - nextSearchStart = pos + 1; - } -} - -namespace Utils { - -template class ConcatFunc : public std::binary_function -{ -public: - explicit ConcatFunc(const T & val) : m_delim(val) {} - T operator()(const T & arg1, const T & arg2) const - { - return arg1 + m_delim + arg2; - } -private: - T m_delim; -}; - -} - -template -typename ForwardIterator::value_type Join(ForwardIterator begin, ForwardIterator end, typename ForwardIterator::value_type delim) -{ - typedef typename ForwardIterator::value_type value; - if(begin == end) return value(); - Utils::ConcatFunc func(delim); - ForwardIterator init = begin; - return std::accumulate(++begin, end, *init, func); -} - -template void TrimLeft(StringType & obj, typename StringType::const_pointer separators) -{ - obj.erase(0, obj.find_first_not_of(separators)); -} - -template void TrimRight(StringType & obj, typename StringType::const_pointer separators) -{ - obj.erase(obj.find_last_not_of(separators)+1); -} - -template void Trim(StringType & obj, typename StringType::const_pointer separators) -{ - TrimLeft(obj, separators); - TrimRight(obj, separators); -} - - -} //namespace VcoreDPL - -std::ostream& operator<<(std::ostream& aStream, const VcoreDPL::String& aString); - -#endif // DPL_STRING diff --git a/vcore/src/dpl/core/include/dpl/thread.h b/vcore/src/dpl/core/include/dpl/thread.h deleted file mode 100644 index d13740b..0000000 --- a/vcore/src/dpl/core/include/dpl/thread.h +++ /dev/null @@ -1,394 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file thread.h - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of thread - */ -#ifndef DPL_THREAD_H -#define DPL_THREAD_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace VcoreDPL { -class Thread : - private Noncopyable, - public WaitableHandleWatchSupport -{ - public: - class Exception - { - public: - DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base) - DECLARE_EXCEPTION_TYPE(Base, CreateFailed) - DECLARE_EXCEPTION_TYPE(Base, DestroyFailed) - DECLARE_EXCEPTION_TYPE(Base, RunFailed) - DECLARE_EXCEPTION_TYPE(Base, QuitFailed) - DECLARE_EXCEPTION_TYPE(Base, UnmanagedThread) - }; - - typedef void (*EventDeleteProc)(void *event, void *userParam); - typedef void (*EventDispatchProc)(void *event, void *userParam); - - protected: - /** - * Main thread entry - * The method is intended to be overloaded with custom code. - * Default implementation just executes Exec method to process - * all thread exents - */ - virtual int ThreadEntry(); - - /** - * Start processing of thread events - */ - int Exec(); - - private: - struct InternalEvent - { - void *event; - void *userParam; - EventDispatchProc eventDispatchProc; - EventDeleteProc eventDeleteProc; - - InternalEvent(void *eventArg, - void *userParamArg, - EventDispatchProc eventDispatchProcArg, - EventDeleteProc eventDeleteProcArg) : - event(eventArg), - userParam(userParamArg), - eventDispatchProc(eventDispatchProcArg), - eventDeleteProc(eventDeleteProcArg) - {} - }; - - struct InternalTimedEvent : - InternalEvent - { - unsigned long dueTimeMiliseconds; - unsigned long registerTimeMiliseconds; - - InternalTimedEvent(void *eventArg, - void *userParamArg, - unsigned long dueTimeMilisecondsArg, - unsigned long registerTimeMilisecondsArg, - EventDispatchProc eventDispatchProcArg, - EventDeleteProc eventDeleteProcArg) : - InternalEvent(eventArg, - userParamArg, - eventDispatchProcArg, - eventDeleteProcArg), - dueTimeMiliseconds(dueTimeMilisecondsArg), - registerTimeMiliseconds(registerTimeMilisecondsArg) - {} - - bool operator<(const InternalTimedEvent &other) - { - return registerTimeMiliseconds + dueTimeMiliseconds > - other.registerTimeMiliseconds + other.dueTimeMiliseconds; - } - }; - - // Internal event list - typedef std::list InternalEventList; - - // Internal timed event list - typedef std::vector InternalTimedEventVector; - - // State managment - std::thread m_thread; - volatile bool m_abandon; - volatile bool m_running; - std::mutex m_stateMutex; - WaitableEvent m_quitEvent; - - // Event processing - std::mutex m_eventMutex; - InternalEventList m_eventList; - WaitableEvent m_eventInvoker; - - // Timed events processing - std::mutex m_timedEventMutex; - InternalTimedEventVector m_timedEventVector; - WaitableEvent m_timedEventInvoker; - - // WaitableHandleWatchSupport - virtual Thread *GetInvokerThread(); - virtual void HandleDirectInvoker(); - bool m_directInvoke; - - // Internals - unsigned long GetCurrentTimeMiliseconds() const; - void ProcessEvents(); - void ProcessTimedEvents(); - - static void *StaticThreadEntry(void *param); - - public: - explicit Thread(); - virtual ~Thread(); - - /** - * Run thread. Does nothing if thread is already running - */ - void Run(); - - /** - * Send quit message to thread and wait for its end - * Does nothing is thread is not running - */ - void Quit(); - - /** - * Checks if current thread is main one - * Returns true if it is main program thread, false otherwise - */ - static bool IsMainThread(); - - /** - * Current thread retrieval - * Returns DPL thread handle or NULL if it is main program thread - */ - static Thread *GetCurrentThread(); - - /** - * Low-level event push, usually used only by EventSupport - */ - void PushEvent(void *event, - EventDispatchProc eventDispatchProc, - EventDeleteProc eventDeleteProc, - void *userParam); - - /** - * Low-level timed event push, usually used only by EventSupport - */ - void PushTimedEvent(void *event, - double dueTimeSeconds, - EventDispatchProc eventDispatchProc, - EventDeleteProc eventDeleteProc, - void *userParam); - - /** - * Sleep for a number of seconds - */ - static void Sleep(uint64_t seconds); - - /** - * Sleep for a number of miliseconds - */ - static void MiliSleep(uint64_t miliseconds); - - /** - * Sleep for a number of microseconds - */ - static void MicroSleep(uint64_t microseconds); - - /** - * Sleep for a number of nanoseconds - */ - static void NanoSleep(uint64_t nanoseconds); -}; - -extern bool g_TLSforMainCreated; - -// In case of using TLV in main thread, pthread_exit(NULL) has to be called in -// this thread explicitly. -// On the other hand, possibly, because of the kernel bug, there exist -// a problem, if any other thread than main exist during pthread_exit call -// (process can become non-responsive) -// TODO further investigation is required. -template -class ThreadLocalVariable : - public Noncopyable -{ - public: - typedef Type ValueType; - - class Exception - { - public: - DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base) - DECLARE_EXCEPTION_TYPE(Base, NullReference) - DECLARE_EXCEPTION_TYPE(Base, KeyCreateFailed) - }; - - private: - pthread_key_t m_key; - - struct ManagedValue - { - ValueType value; - boost::optional guardKey; - }; - - static void MainThreadExitClean() - { - // There is a possible bug in kernel. If this function is called - // before ALL threads are closed, process will hang! - // Because of that, by default this function has to be called in well - // known "threads state". - - // pthread_exit(NULL); - } - - static void InternalDestroy(void *specific) - { - // Destroy underlying type - ManagedValue *instance = static_cast(specific); - if (!instance->guardKey) { - delete instance; - } else { - int result = pthread_setspecific(*(instance->guardKey), instance); - - Assert(result == 0 && - "Failed to set thread local variable"); - } - } - - Type &Reference(bool allowInstantiate = false) - { - ManagedValue *instance = - static_cast(pthread_getspecific(m_key)); - - if (!instance) { - // Check if it is allowed to instantiate - if (!allowInstantiate) { - Throw(typename Exception::NullReference); - } - - // checking, if specific data is created for Main thread - // If yes, pthread_exit(NULL) is required - if (!g_TLSforMainCreated) { - if (Thread::IsMainThread()) { - g_TLSforMainCreated = true; - atexit(&MainThreadExitClean); - } - } - - // Need to instantiate underlying type - instance = new ManagedValue(); - - int result = pthread_setspecific(m_key, instance); - - Assert(result == 0 && - "Failed to set thread local variable"); - } - - return instance->value; - } - - public: - ThreadLocalVariable() - { - int result = pthread_key_create(&m_key, &InternalDestroy); - if (result != 0) { - ThrowMsg(typename Exception::KeyCreateFailed, - "Failed to allocate thread local variable: " << result); - } - } - - ~ThreadLocalVariable() - { - pthread_key_delete(m_key); - } - - Type &operator=(const Type &other) - { - Type &reference = Reference(true); - reference = other; - return reference; - } - - bool IsNull() const - { - return pthread_getspecific(m_key) == NULL; - } - - Type& operator*() - { - return Reference(); - } - - const Type& operator*() const - { - return Reference(); - } - - const Type* operator->() const - { - return &Reference(); - } - - Type* operator->() - { - return &Reference(); - } - - bool operator!() const - { - return IsNull(); - } - - void Reset() - { - ManagedValue *specific = - static_cast(pthread_getspecific(m_key)); - - if (!specific) { - return; - } - - // TODO Should be an assert? is it developers fault to Reset Guarded - // value? - specific->guardKey = boost::optional(); - - InternalDestroy(specific); - - int result = pthread_setspecific(m_key, NULL); - - Assert(result == 0 && - "Failed to reset thread local variable"); - } - - // GuardValue(true) allows to defer destroy (by pthread internal - // functionality) thread specific value until GuardValue(false) will be - // called. - void GuardValue(bool guard) - { - ManagedValue *instance = - static_cast(pthread_getspecific(m_key)); - - Assert(instance && "Failed to get the value"); - - instance->guardKey = guard ? m_key : boost::optional(); - } -}; -} // namespace VcoreDPL - -#endif // DPL_THREAD_H diff --git a/vcore/src/dpl/core/include/dpl/type_list.h b/vcore/src/dpl/core/include/dpl/type_list.h deleted file mode 100644 index e28172d..0000000 --- a/vcore/src/dpl/core/include/dpl/type_list.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file type_list.h - * @author Bartosz Janiak (b.janiak@samsung.com) - * @version 1.0 - * @brief Generic type list template - */ -#ifndef DPL_TYPE_LIST_H -#define DPL_TYPE_LIST_H - -#include - -namespace VcoreDPL { -class TypeListGuard -{ - public: - template - struct Element - { - struct ERROR_TypeListElementIndexIsOutOfBounds; - typedef ERROR_TypeListElementIndexIsOutOfBounds Type; - }; - - static const size_t Size = 0; -}; - -template -class TypeList -{ - private: - class DummyClass - {}; - - template - struct TypeCounter : public TypeCounter - {}; - - template - struct TypeCounter - { - static const size_t Size = Enum; - }; - - public: - typedef TailType Tail; - typedef HeadType Head; - typedef TypeList ThisType; - - template - struct Element - { - typedef typename TailType::template Element::Type Type; - }; - - template - struct Element<0, DummyType> - { - typedef HeadType Type; - }; - - template - struct Contains - { - typedef typename TailType::template Contains::Yes Yes; - }; - - template - struct Contains - { - typedef int Yes; - }; - - static const size_t Size = TypeCounter::Size; -}; - -template -struct TypeListDecl -{ - typedef TypeList::Type> Type; -}; - -template<> -struct TypeListDecl -{ - typedef TypeListGuard Type; -}; -} // namespace VcoreDPL - -#endif // DPL_TYPE_LIST_H diff --git a/vcore/src/dpl/core/include/dpl/waitable_event.h b/vcore/src/dpl/core/include/dpl/waitable_event.h deleted file mode 100644 index b6305b0..0000000 --- a/vcore/src/dpl/core/include/dpl/waitable_event.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file waitable_event.h - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of waitable event - */ -#ifndef DPL_WAITABLE_EVENT_H -#define DPL_WAITABLE_EVENT_H - -#include -#include -#include -#include - -namespace VcoreDPL { -class WaitableEvent : - private Noncopyable -{ - public: - class Exception - { - public: - DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base) - DECLARE_EXCEPTION_TYPE(Base, CreateFailed) - DECLARE_EXCEPTION_TYPE(Base, DestroyFailed) - DECLARE_EXCEPTION_TYPE(Base, SignalFailed) - DECLARE_EXCEPTION_TYPE(Base, ResetFailed) - }; - - private: - int m_pipe[2]; - - public: - WaitableEvent(); - virtual ~WaitableEvent(); - - WaitableHandle GetHandle() const; - - void Signal() const; - void Reset() const; -}; -} // namespace VcoreDPL - -#endif // DPL_WAITABLE_EVENT_H diff --git a/vcore/src/dpl/core/include/dpl/waitable_handle.h b/vcore/src/dpl/core/include/dpl/waitable_handle.h deleted file mode 100644 index 5ffd76c..0000000 --- a/vcore/src/dpl/core/include/dpl/waitable_handle.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file waitable_handle.h - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the header file of waitable handle - */ -#ifndef DPL_WAITABLE_HANDLE_H -#define DPL_WAITABLE_HANDLE_H - -#include -#include -#include - -namespace VcoreDPL { -/** - * Waitable unix wait handle definition - */ -typedef int WaitableHandle; - -/** - * Waitable handle list - */ -typedef std::vector WaitableHandleList; - -/** - * Wait mode - */ -class WaitMode -{ - public: - enum Type - { - Read, ///< Wait for readability state changes - Write ///< Wait for writability state changes - }; -}; - -/** - * Waitable handle list ex - */ -typedef std::vector > WaitableHandleListEx; - -/** - * Waitable handle index list - */ -typedef std::vector WaitableHandleIndexList; - -/** - * Wait exceptions - */ -DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, WaitFailed) - -/** - * Wait for single handle readability - * Convience function. - * - * @return Signaled waitable handle index list - * @throw WaitFailed Fatal error occurred while waiting for signal - */ -WaitableHandleIndexList WaitForSingleHandle( - WaitableHandle handle, - unsigned long miliseconds = - 0xFFFFFFFF); - -/** - * Wait for single handle - * Convience function. - * - * @return Signaled waitable handle index list - * @throw WaitFailed Fatal error occurred while waiting for signal - */ -WaitableHandleIndexList WaitForSingleHandle( - WaitableHandle handle, - WaitMode::Type mode, - unsigned long miliseconds = - 0xFFFFFFFF); - -/** - * Wait for multiple handles readability - * - * @return Signaled waitable handle index list - * @throw WaitFailed Fatal error occurred while waiting for signal - */ -WaitableHandleIndexList WaitForMultipleHandles( - const WaitableHandleList &handleList, - unsigned long miliseconds = 0xFFFFFFFF); - -/** - * Wait for multiple handles readability - * - * @return Signaled waitable handle index list - * @throw WaitFailed Fatal error occurred while waiting for signal - */ -WaitableHandleIndexList WaitForMultipleHandles( - const WaitableHandleListEx &handleListEx, - unsigned long miliseconds = 0xFFFFFFFF); -} // namespace VcoreDPL - -#endif // DPL_WAITABLE_HANDLE_H diff --git a/vcore/src/dpl/core/include/dpl/waitable_handle_watch_support.h b/vcore/src/dpl/core/include/dpl/waitable_handle_watch_support.h deleted file mode 100644 index 4f3f142..0000000 --- a/vcore/src/dpl/core/include/dpl/waitable_handle_watch_support.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file waitable_handle_watch_support.h - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of waitable handle watch - * support - */ -#ifndef DPL_WAITABLE_HANDLE_WATCH_SUPPORT_H -#define DPL_WAITABLE_HANDLE_WATCH_SUPPORT_H - -#include -#include -#include -#include -#include -#include - -namespace VcoreDPL { -class Thread; - -class WaitableHandleWatchSupport -{ - public: - class WaitableHandleListener - { - public: - virtual ~WaitableHandleListener() {} - - virtual void OnWaitableHandleEvent(WaitableHandle waitableHandle, - WaitMode::Type mode) = 0; - }; - - protected: - // Invoker waitable handle - // Signaled by Add/Remove methods - // After being signaled one must call Handle invoke to reset invoker - WaitableHandle WaitableInvokerHandle() const; - - // Waitable handle ex list - WaitableHandleListEx WaitableWatcherHandles() const; - - // Perform actions for signaled waitable handle - // Called in execution context, after - void HandleWatcher(WaitableHandle waitableHandle, WaitMode::Type mode); - - // Perform actions after invoker was signaled - void InvokerFinished(); - - // Get invoker context - virtual Thread *GetInvokerThread() = 0; - - // Invoke direct invoker - virtual void HandleDirectInvoker() = 0; - - private: - // Waitable event watchers - struct WaitableHandleWatcher - { - WaitableHandleListener *listener; - WaitMode::Type mode; - - WaitableHandleWatcher(WaitableHandleListener *l, WaitMode::Type m) : - listener(l), - mode(m) - {} - }; - - typedef std::list WaitableHandleListenerList; - - struct WaitableHandleWatchers - { - WaitableHandleListenerList listeners; - size_t readListenersCount; - size_t writeListenersCount; - - WaitableHandleWatchers() : - readListenersCount(0), - writeListenersCount(0) - {} - }; - - typedef std::map WaitableHandleWatchersMap; - - // Waitable event watch support - mutable std::recursive_mutex m_watchersMutex; - WaitableHandleWatchersMap m_watchersMap; - WaitableEvent m_watchersInvoker; - WaitableEvent m_watchersInvokerCommit; - - // Invoke call - void CommitInvoker(); - - public: - /** - * Constructor - */ - explicit WaitableHandleWatchSupport(); - - /** - * Destructor - */ - virtual ~WaitableHandleWatchSupport(); - - /** - * Adds listener for specific waitable event - * - * @param[in] listener Listener to attach - * @param[in] waitableHandle Waitable handle to listen for changes - * @param[in] mode Type of changes to listen to - * @return none - * @see WaitMode::Type - */ - void AddWaitableHandleWatch(WaitableHandleListener *listener, - WaitableHandle waitableHandle, - WaitMode::Type mode); - - /** - * Remove listener for specific waitable event - * - * @param[in] listener Listener to detach - * @param[in] waitableHandle Waitable handle to unlisten for changes - * @param[in] mode Type of changes to unlisten to - * @return none - * @see WaitMode::Type - */ - void RemoveWaitableHandleWatch(WaitableHandleListener *listener, - WaitableHandle waitableHandle, - WaitMode::Type mode); - -}; -} // namespace VcoreDPL - -#endif // DPL_WAITABLE_HANDLE_WATCH_SUPPORT_H diff --git a/vcore/src/dpl/core/include/dpl/workaround.h b/vcore/src/dpl/core/include/dpl/workaround.h deleted file mode 100644 index 19c26ef..0000000 --- a/vcore/src/dpl/core/include/dpl/workaround.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file workaround.h - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the header file of workaround - */ -#ifndef DPL_WORKAROUND_H -#define DPL_WORKAROUND_H - -/** - * Define following macro to track invalid waitable handles - * in WaitForSingle/WaitForMultiple functions - */ -#define DPL_ENABLE_WAITABLE_HANDLE_BADF_CHECK - -/** - * Define following macro to enable workaround for problem - * with GLIB loop integration and EBADF error handling - */ -#define DPL_ENABLE_GLIB_LOOP_INTEGRATION_WORKAROUND - -/** - * Define following macro to enable workaround for problem - * with invalid conversions in htons/ntohs macros - */ -#define DPL_ENABLE_HTONS_NTOHS_I386_WORKAROUND - -#endif // DPL_WORKAROUND_H diff --git a/vcore/src/dpl/core/src/char_traits.cpp b/vcore/src/dpl/core/src/char_traits.cpp deleted file mode 100644 index 32b9197..0000000 --- a/vcore/src/dpl/core/src/char_traits.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file char_traits.cpp - * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com) - * @version 1.0 - * @biref Char traits are used to create basic_string extended with - * additional features - * Current char traits could be extended in feature to boost - * performance - */ -#include -#include - -// -// Note: -// -// The file here is left blank to enable precompilation -// of templates in corresponding header file. -// Do not remove this file. -// diff --git a/vcore/src/dpl/core/src/file_input.cpp b/vcore/src/dpl/core/src/file_input.cpp deleted file mode 100644 index 18bef68..0000000 --- a/vcore/src/dpl/core/src/file_input.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file file_input.cpp - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of named input pipe - */ -#include -#include -#include -#include -#include -#include -#include -#include - -namespace VcoreDPL { -namespace // anonymous -{ -const size_t DEFAULT_READ_BUFFER_SIZE = 4096; -} // namespace anonymous - -FileInput::FileInput() : - m_fd(-1) -{} - -FileInput::FileInput(const std::string& fileName) : - m_fd(-1) -{ - Open(fileName); -} - -FileInput::~FileInput() -{ - Close(); -} - -void FileInput::Open(const std::string& fileName) -{ - // Open non-blocking - int fd = TEMP_FAILURE_RETRY(open(fileName.c_str(), O_RDONLY | O_NONBLOCK)); - - // Throw an exception if an error occurred - if (fd == -1) { - ThrowMsg(Exception::OpenFailed, fileName); - } - - // Close if any existing - Close(); - - // Save new descriptor - m_fd = fd; - - LogPedantic("Opened file: " << fileName); -} - -void FileInput::Close() -{ - if (m_fd == -1) { - return; - } - - if (TEMP_FAILURE_RETRY(close(m_fd)) == -1) { - Throw(Exception::CloseFailed); - } - - m_fd = -1; - - LogPedantic("Closed file"); -} - -BinaryQueueAutoPtr FileInput::Read(size_t size) -{ - size_t bytesToRead = size > - DEFAULT_READ_BUFFER_SIZE ? DEFAULT_READ_BUFFER_SIZE : size; - - // Malloc default read buffer size - // It is unmanaged, so it can be then attached directly to binary queue - void *buffer = malloc(bytesToRead); - - if (buffer == NULL) { - throw std::bad_alloc(); - } - - LogPedantic("Trying to read " << bytesToRead << " bytes"); - - ssize_t result = TEMP_FAILURE_RETRY(read(m_fd, buffer, bytesToRead)); - - LogPedantic("Read " << result << " bytes from file"); - - if (result > 0) { - // Succedded to read socket data - BinaryQueueAutoPtr binaryQueue(new BinaryQueue()); - - // Append unmanaged memory - binaryQueue->AppendUnmanaged(buffer, - result, - &BinaryQueue::BufferDeleterFree, - NULL); - - // Return buffer - return binaryQueue; - } else if (result == 0) { - // Socket was gracefuly closed - free(buffer); - - // Return empty buffer - return BinaryQueueAutoPtr(new BinaryQueue()); - } else { - // Must first save errno value, because it may be altered - int lastErrno = errno; - - // Free buffer - free(buffer); - - // Interpret error result - (void)lastErrno; - - // FIXME: Handle specific errno - Throw(AbstractInput::Exception::ReadFailed); - } -} - -WaitableHandle FileInput::WaitableReadHandle() const -{ - return static_cast(m_fd); -} -} // namespace VcoreDPL diff --git a/vcore/src/dpl/core/src/string.cpp b/vcore/src/dpl/core/src/string.cpp deleted file mode 100644 index 5679633..0000000 --- a/vcore/src/dpl/core/src/string.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file string.cpp - * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com) - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// TODO: Completely move to ICU -namespace VcoreDPL { -namespace //anonymous -{ -class ASCIIValidator -{ - const std::string& m_TestedString; - - public: - ASCIIValidator(const std::string& aTestedString); - - void operator()(char aCharacter) const; -}; - -ASCIIValidator::ASCIIValidator(const std::string& aTestedString) : - m_TestedString(aTestedString) -{} - -void ASCIIValidator::operator()(char aCharacter) const -{ - // Check for ASCII data range - if (aCharacter <= 0) { - ThrowMsg( - StringException::InvalidASCIICharacter, - "invalid character code " << static_cast(aCharacter) - << " from string [" << - m_TestedString - << "] passed as ASCII"); - } -} - -const iconv_t gc_IconvOperError = reinterpret_cast(-1); -const size_t gc_IconvConvertError = static_cast(-1); -} // namespace anonymous - -String FromUTF8String(const std::string& aIn) -{ - if (aIn.empty()) { - return String(); - } - - size_t inbytes = aIn.size(); - - // Default iconv UTF-32 module adds BOM (4 bytes) in from of string - // The worst case is when 8bit UTF-8 char converts to 32bit UTF-32 - // newsize = oldsize * 4 + end + bom - // newsize - bytes for UTF-32 string - // oldsize - letters in UTF-8 string - // end - end character for UTF-32 (\0) - // bom - Unicode header in front of string (0xfeff) - size_t outbytes = sizeof(wchar_t) * (inbytes + 2); - std::vector output(inbytes + 2, 0); - - size_t outbytesleft = outbytes; - char* inbuf = const_cast(aIn.c_str()); - - // vector is used to provide buffer for iconv which expects char* buffer - // but during conversion from UTF32 uses internaly wchar_t - char* outbuf = reinterpret_cast(&output[0]); - - iconv_t iconvHandle = iconv_open("UTF-32", "UTF-8"); - - if (gc_IconvOperError == iconvHandle) { - int error = errno; - - ThrowMsg(StringException::IconvInitErrorUTF8ToUTF32, - "iconv_open failed for " << "UTF-32 <- UTF-8" << - "error: " << GetErrnoString(error)); - } - - size_t iconvRet = iconv(iconvHandle, - &inbuf, - &inbytes, - &outbuf, - &outbytesleft); - - iconv_close(iconvHandle); - - if (gc_IconvConvertError == iconvRet) { - ThrowMsg(StringException::IconvConvertErrorUTF8ToUTF32, - "iconv failed for " << "UTF-32 <- UTF-8" << "error: " - << GetErrnoString()); - } - - // Ignore BOM in front of UTF-32 - return &output[1]; -} - -std::string ToUTF8String(const VcoreDPL::String& aIn) -{ - if (aIn.empty()) { - return std::string(); - } - - size_t inbytes = aIn.size() * sizeof(wchar_t); - size_t outbytes = inbytes + sizeof(char); - - // wstring returns wchar_t but iconv expects char* - // iconv internally is processing input as wchar_t - char* inbuf = reinterpret_cast(const_cast(aIn.c_str())); - std::vector output(inbytes, 0); - char* outbuf = &output[0]; - - size_t outbytesleft = outbytes; - - iconv_t iconvHandle = iconv_open("UTF-8", "UTF-32"); - - if (gc_IconvOperError == iconvHandle) { - ThrowMsg(StringException::IconvInitErrorUTF32ToUTF8, - "iconv_open failed for " << "UTF-8 <- UTF-32" - << "error: " << GetErrnoString()); - } - - size_t iconvRet = iconv(iconvHandle, - &inbuf, - &inbytes, - &outbuf, - &outbytesleft); - - iconv_close(iconvHandle); - - if (gc_IconvConvertError == iconvRet) { - ThrowMsg(StringException::IconvConvertErrorUTF32ToUTF8, - "iconv failed for " << "UTF-8 <- UTF-32" - << "error: " << GetErrnoString()); - } - - return &output[0]; -} - -String FromASCIIString(const std::string& aString) -{ - String output; - - std::for_each(aString.begin(), aString.end(), ASCIIValidator(aString)); - std::copy(aString.begin(), aString.end(), std::back_inserter(output)); - - return output; -} - -String FromUTF32String(const std::wstring& aString) -{ - return String(&aString[0]); -} - -static UChar *ConvertToICU(const String &inputString) -{ - std::unique_ptr outputString; - int32_t size = 0; - int32_t convertedSize = 0; - UErrorCode error = U_ZERO_ERROR; - - // Calculate size of output string - ::u_strFromWCS(NULL, - 0, - &size, - inputString.c_str(), - -1, - &error); - - if (error == U_ZERO_ERROR || - error == U_BUFFER_OVERFLOW_ERROR) - { - // What buffer size is ok ? - LogDebug("ICU: Output buffer size: " << size); - } else { - ThrowMsg(StringException::ICUInvalidCharacterFound, - "ICU: Failed to retrieve output string size. Error: " - << error); - } - - // Allocate proper buffer - outputString.reset(new UChar[size + 1]); - ::memset(outputString.get(), 0, sizeof(UChar) * (size + 1)); - - error = U_ZERO_ERROR; - - // Do conversion - ::u_strFromWCS(outputString.get(), - size + 1, - &convertedSize, - inputString.c_str(), - -1, - &error); - - if (!U_SUCCESS(error)) { - ThrowMsg(StringException::ICUInvalidCharacterFound, - "ICU: Failed to convert string. Error: " << error); - } - - // Done - return outputString.release(); -} - -int StringCompare(const String &left, - const String &right, - bool caseInsensitive) -{ - // Convert input strings - std::unique_ptr leftICU(ConvertToICU(left)); - std::unique_ptr rightICU(ConvertToICU(right)); - - if (caseInsensitive) { - return static_cast(u_strcasecmp(leftICU.get(), rightICU.get(), 0)); - } else { - return static_cast(u_strcmp(leftICU.get(), rightICU.get())); - } -} -} //namespace VcoreDPL - -std::ostream& operator<<(std::ostream& aStream, const VcoreDPL::String& aString) -{ - return aStream << VcoreDPL::ToUTF8String(aString); -} diff --git a/vcore/src/dpl/core/src/thread.cpp b/vcore/src/dpl/core/src/thread.cpp deleted file mode 100644 index 045880c..0000000 --- a/vcore/src/dpl/core/src/thread.cpp +++ /dev/null @@ -1,609 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file thread.cpp - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of thread - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace // anonymous -{ -static const size_t NANOSECONDS_PER_SECOND = - static_cast(1000 * 1000 * 1000); - -static const size_t NANOSECONDS_PER_MILISECOND = - static_cast(1000 * 1000); - -static const size_t NANOSECONDS_PER_MICROSECOND = - static_cast(1000); - -static const std::thread::id g_mainThread = std::this_thread::get_id(); - -class ThreadSpecific -{ - public: - pthread_key_t threadSpecific; - - ThreadSpecific() : - threadSpecific(0) - { - threadSpecific = 0; - pthread_key_create(&threadSpecific, NULL); - } - - virtual ~ThreadSpecific() - { - pthread_key_delete(threadSpecific); - } -}; - -static ThreadSpecific g_threadSpecific; -} // namespace anonymous - -namespace VcoreDPL { -bool g_TLSforMainCreated = false; - -Thread::Thread() : - m_thread(), - m_abandon(false), - m_running(false), - m_directInvoke(false) -{} - -Thread::~Thread() -{ - // Ensure that we quit thread - // Always wait thread by yourself; if thread is still running - // this may be sometimes very bad. When derived, some resources - // may leak or be doubly freed - Quit(); - - // Remove any remainig events - // Thread proc is surely not running now - for (InternalEventList::iterator iterator = m_eventList.begin(); - iterator != m_eventList.end(); - ++iterator) - { - iterator->eventDeleteProc(iterator->event, iterator->userParam); - } - - m_eventList.clear(); -} - -bool Thread::IsMainThread() -{ - return (std::this_thread::get_id() == g_mainThread); -} - -Thread *Thread::GetCurrentThread() -{ - if (std::this_thread::get_id() == g_mainThread) { - return NULL; - } - - void *threadSpecific = pthread_getspecific(g_threadSpecific.threadSpecific); - - // Is this a managed thread ? - if (threadSpecific == NULL) { - Throw(Exception::UnmanagedThread); - } - - return static_cast(threadSpecific); -} - -void *Thread::StaticThreadEntry(void *param) -{ - LogDebug("Entered static thread entry"); - - // Retrieve context - Thread *This = static_cast(param); - Assert(This != NULL); - - // Set thread specific - int result = pthread_setspecific(g_threadSpecific.threadSpecific, This); - - if (result) - LogError("Failed to set threadSpecific."); - - // Enter thread proc - // Do not allow exceptions to hit pthread core - UNHANDLED_EXCEPTION_HANDLER_BEGIN - { - This->ThreadEntry(); - } - UNHANDLED_EXCEPTION_HANDLER_END - - // Critical section - { - // Leave running state - std::lock_guard lock(This->m_stateMutex); - - This->m_running = false; - - // Abandon thread - if (This->m_abandon) { - LogDebug("Thread was abandoned"); - This->m_thread.detach(); - } else { - LogDebug("Thread is joinable"); - } - } - - return NULL; -} - -int Thread::ThreadEntry() -{ - LogDebug("Entered default thread entry"); - return Exec(); -} - -void Thread::ProcessEvents() -{ - LogDebug("Processing events"); - - // Steal current event list - InternalEventList stolenEvents; - - // Enter event list critical section - { - std::lock_guard lock(m_eventMutex); - m_eventList.swap(stolenEvents); - m_eventInvoker.Reset(); - } - - // Process event list - LogDebug("Stolen " << stolenEvents.size() << " internal events"); - - for (InternalEventList::iterator iterator = stolenEvents.begin(); - iterator != stolenEvents.end(); - ++iterator) - { - // Dispatch immediate event - iterator->eventDispatchProc(iterator->event, iterator->userParam); - - // Delete event - iterator->eventDeleteProc(iterator->event, iterator->userParam); - } -} - -void Thread::ProcessTimedEvents() -{ - // Critical section on timed events mutex - { - std::lock_guard lock(m_timedEventMutex); - - // Get current time - unsigned long currentTimeMiliseconds = GetCurrentTimeMiliseconds(); - - // Info - LogDebug("Processing timed events. Time now: " << currentTimeMiliseconds << " ms"); - - // All timed events are sorted chronologically - // Emit timed out events - while (!m_timedEventVector.empty() && - currentTimeMiliseconds >= - m_timedEventVector.begin()->registerTimeMiliseconds + - m_timedEventVector.begin()->dueTimeMiliseconds) - { - // Info - LogDebug("Transforming timed event into immediate event. Absolute due time: " << - (m_timedEventVector.begin()->registerTimeMiliseconds + - m_timedEventVector.begin()->dueTimeMiliseconds) << " ms"); - - // Emit immediate event - PushEvent(m_timedEventVector.begin()->event, - m_timedEventVector.begin()->eventDispatchProc, - m_timedEventVector.begin()->eventDeleteProc, - m_timedEventVector.begin()->userParam); - - // Remove timed eventand fix heap - std::pop_heap(m_timedEventVector.begin(), m_timedEventVector.end()); - m_timedEventVector.pop_back(); - } - } -} - -unsigned long Thread::GetCurrentTimeMiliseconds() const -{ - timeval tv; - gettimeofday(&tv, NULL); - return static_cast(tv.tv_sec) * 1000 + - static_cast(tv.tv_usec) / 1000; -} - -int Thread::Exec() -{ - LogDebug("Executing thread event processing"); - - const std::size_t MIN_HANDLE_LIST_SIZE = 4; - - // Start processing of events - WaitableHandleListEx handleList; - - // index 0: Quit waitable event handle - handleList.push_back(std::make_pair(m_quitEvent.GetHandle(), WaitMode::Read)); - - // index 1: Event occurred event handle - handleList.push_back(std::make_pair(m_eventInvoker.GetHandle(), - WaitMode::Read)); - - // index 2: Timed event occurred event handle - handleList.push_back(std::make_pair(m_timedEventInvoker.GetHandle(), - WaitMode::Read)); - - // index 3: Waitable handle watch support invoker - handleList.push_back(std::make_pair(WaitableHandleWatchSupport:: - WaitableInvokerHandle(), - WaitMode::Read)); - - // - // Watch list might have been initialized before threaded started - // Need to fill waitable event watch list in this case - // - { - WaitableHandleListEx waitableHandleWatchHandles = - WaitableHandleWatchSupport::WaitableWatcherHandles(); - std::copy( - waitableHandleWatchHandles.begin(), - waitableHandleWatchHandles.end(), std::back_inserter(handleList)); - } - - // Quit flag - bool quit = false; - - while (!quit) { - // Retrieve minimum wait time, according to timed events list - unsigned long minimumWaitTime; - - // Critical section on timed events mutex - { - std::lock_guard lock(m_timedEventMutex); - - if (!m_timedEventVector.empty()) { - unsigned long currentTimeMiliseconds = - GetCurrentTimeMiliseconds(); - unsigned long destinationTimeMiliseconds = - m_timedEventVector.begin()->registerTimeMiliseconds + - m_timedEventVector.begin()->dueTimeMiliseconds; - - // Are we already late with timed event ? - if (currentTimeMiliseconds > destinationTimeMiliseconds) { - minimumWaitTime = 0; - } else { - minimumWaitTime = destinationTimeMiliseconds - - currentTimeMiliseconds; - } - } else { - minimumWaitTime = 0xFFFFFFFF; // Infinity - } - } - - // Info - LogDebug("Thread loop minimum wait time: " << minimumWaitTime << " ms"); - - // Do thread waiting - WaitableHandleIndexList waitableHandleIndexList = - WaitForMultipleHandles(handleList, minimumWaitTime); - - if (waitableHandleIndexList.empty()) { - // Timeout occurred. Process timed events. - LogDebug("Timed event list elapsed invoker"); - ProcessTimedEvents(); - continue; - } - - // Go through each index - for (WaitableHandleIndexList::const_iterator - waitableHandleIndexIterator = waitableHandleIndexList.begin(); - waitableHandleIndexIterator != waitableHandleIndexList.end(); - ++waitableHandleIndexIterator) - { - size_t index = *waitableHandleIndexIterator; - - LogDebug("Event loop triggered with index: " << index); - - switch (index) { - case 0: - // Quit waitable event handle - quit = true; - break; - - case 1: - // Event occurred event handle - ProcessEvents(); - - // Handle direct invoker - if (m_directInvoke) { - m_directInvoke = false; - - LogDebug("Handling direct invoker"); - - // Update list - while (handleList.size() > MIN_HANDLE_LIST_SIZE) { - handleList.pop_back(); - } - - // Insert current waitable event handles instead - { - WaitableHandleListEx waitableHandleWatchHandles = - WaitableHandleWatchSupport::WaitableWatcherHandles(); - std::copy( - waitableHandleWatchHandles.begin(), - waitableHandleWatchHandles.end(), - std::back_inserter(handleList)); - } - } - - // Done - break; - - case 2: - // Timed event list changed - LogDebug("Timed event list changed invoker"); - ProcessTimedEvents(); - - // Reset timed event invoker - m_timedEventInvoker.Reset(); - - // Done - break; - - case 3: - // Waitable handle watch support invoker - LogDebug("Waitable handle watch invoker event occurred"); - - // First, remove all previous handles - while (handleList.size() > MIN_HANDLE_LIST_SIZE) { - handleList.pop_back(); - } - - // Insert current waitable event handles instead - { - WaitableHandleListEx waitableHandleWatchHandles = - WaitableHandleWatchSupport::WaitableWatcherHandles(); - std::copy( - waitableHandleWatchHandles.begin(), - waitableHandleWatchHandles.end(), - std::back_inserter(handleList)); - } - - // Handle invoker in waitable watch support - WaitableHandleWatchSupport::InvokerFinished(); - - LogDebug("Waitable handle watch invoker event handled"); - - // Done - break; - - default: - // Waitable event watch list - LogDebug("Waitable handle watch event occurred"); - - // Handle event in waitable handle watch - { - std::pair handle = handleList[index]; - WaitableHandleWatchSupport::HandleWatcher(handle.first, - handle.second); - } - - if (m_directInvoke) { - m_directInvoke = false; - - LogDebug("Handling direct invoker"); - - // Update list - while (handleList.size() > MIN_HANDLE_LIST_SIZE) { - handleList.pop_back(); - } - - // Insert current waitable event handles instead - { - WaitableHandleListEx waitableHandleWatchHandles = - WaitableHandleWatchSupport:: - WaitableWatcherHandles(); - std::copy(waitableHandleWatchHandles.begin(), - waitableHandleWatchHandles.end(), - std::back_inserter(handleList)); - } - } - - LogDebug("Waitable handle watch event handled"); - - // Done - break; - } - } - } - - LogDebug("Leaving thread event processing"); - return 0; -} - -void Thread::Run() -{ - LogDebug("Running thread"); - - // Critical section - { - std::lock_guard lock(m_stateMutex); - - if (m_running) { - return; - } - - try{ - m_thread = std::thread(StaticThreadEntry,this); - }catch(std::system_error e){ - Throw(Exception::RunFailed); - } - - // At default, we abandon thread - m_abandon = true; - - // Enter running state - m_running = true; - } - - LogDebug("Thread run"); -} - -void Thread::Quit() -{ - // Critical section - { - std::lock_guard lock(m_stateMutex); - - // Is thread running ? - if (!m_running) { - return; - } - - LogDebug("Quitting thread..."); - - // Do not abandon thread, we will join - m_abandon = false; - - // Singal quit waitable event - m_quitEvent.Signal(); - } - - try{ - m_thread.join(); - }catch(std::system_error e){ - Throw(Exception::QuitFailed); - } - - LogDebug("Thread quit"); -} - -void Thread::PushEvent(void *event, - EventDispatchProc eventDispatchProc, - EventDeleteProc eventDeleteProc, - void *userParam) -{ - // Enter event list critical section - std::lock_guard lock(m_eventMutex); - - // Push new event - m_eventList.push_back(InternalEvent(event, userParam, eventDispatchProc, - eventDeleteProc)); - - // Trigger invoker - m_eventInvoker.Signal(); - - LogDebug("Event pushed and invoker signaled"); -} - -void Thread::PushTimedEvent(void *event, - double dueTimeSeconds, - EventDispatchProc eventDispatchProc, - EventDeleteProc eventDeleteProc, - void *userParam) -{ - // Check for developer errors - Assert(dueTimeSeconds >= 0.0); - - // Enter timed event list critical section - std::lock_guard lock(m_timedEventMutex); - - // Get current time - unsigned long currentTimeMiliseconds = GetCurrentTimeMiliseconds(); - - // Convert to miliseconds - unsigned long dueTimeMiliseconds = - static_cast(1000.0 * dueTimeSeconds); - - // Push new timed event - m_timedEventVector.push_back(InternalTimedEvent(event, userParam, - dueTimeMiliseconds, - currentTimeMiliseconds, - eventDispatchProc, - eventDeleteProc)); - - // Heapify timed events - std::make_heap(m_timedEventVector.begin(), m_timedEventVector.end()); - - // Trigger invoker - m_timedEventInvoker.Signal(); - - LogDebug("Timed event pushed and invoker signaled: " - "due time: " << dueTimeMiliseconds << " ms, absolute due time: " << - (currentTimeMiliseconds + dueTimeMiliseconds) << " ms"); -} - -Thread *Thread::GetInvokerThread() -{ - return this; -} - -void Thread::HandleDirectInvoker() -{ - // We must be in ProcessEvents call stack - // Mark that situation to handle direct invoker - m_directInvoke = true; -} - -void Thread::Sleep(uint64_t seconds) -{ - NanoSleep(seconds * NANOSECONDS_PER_SECOND); -} - -void Thread::MiliSleep(uint64_t miliseconds) -{ - NanoSleep(miliseconds * NANOSECONDS_PER_MILISECOND); -} - -void Thread::MicroSleep(uint64_t microseconds) -{ - NanoSleep(microseconds * NANOSECONDS_PER_MICROSECOND); -} - -void Thread::NanoSleep(uint64_t nanoseconds) -{ - timespec requestedTime = { - static_cast( - nanoseconds / NANOSECONDS_PER_SECOND), - - static_cast( - nanoseconds % NANOSECONDS_PER_SECOND) - }; - - timespec remainingTime; - - for (;;) { - if (nanosleep(&requestedTime, &remainingTime) == 0) { - break; - } - - int error = errno; - Assert(error == EINTR); - - requestedTime = remainingTime; - } -} -} // namespace VcoreDPL diff --git a/vcore/src/dpl/core/src/waitable_event.cpp b/vcore/src/dpl/core/src/waitable_event.cpp deleted file mode 100644 index 8ff1417..0000000 --- a/vcore/src/dpl/core/src/waitable_event.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file waitable_event.cpp - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of waitable event - */ -#include -#include -#include -#include -#include -#include -#include - -namespace VcoreDPL { -WaitableEvent::WaitableEvent() -{ - if (pipe(m_pipe) == -1) { - Throw(Exception::CreateFailed); - } - - if (fcntl(m_pipe[0], F_SETFL, O_NONBLOCK | - fcntl(m_pipe[0], F_GETFL)) == -1) - { - Throw(Exception::CreateFailed); - } -} - -WaitableEvent::~WaitableEvent() -{ - if (TEMP_FAILURE_RETRY(close(m_pipe[0])) == -1) { - Throw(Exception::DestroyFailed); - } - - if (TEMP_FAILURE_RETRY(close(m_pipe[1])) == -1) { - Throw(Exception::DestroyFailed); - } -} - -WaitableHandle WaitableEvent::GetHandle() const -{ - return m_pipe[0]; -} - -void WaitableEvent::Signal() const -{ - char data = 0; - - if (TEMP_FAILURE_RETRY(write(m_pipe[1], &data, 1)) != 1) { - Throw(Exception::SignalFailed); - } -} - -void WaitableEvent::Reset() const -{ - char data; - - if (TEMP_FAILURE_RETRY(read(m_pipe[0], &data, 1)) != 1) { - Throw(Exception::ResetFailed); - } -} -} // namespace VcoreDPL diff --git a/vcore/src/dpl/core/src/waitable_handle.cpp b/vcore/src/dpl/core/src/waitable_handle.cpp deleted file mode 100644 index 58d0a35..0000000 --- a/vcore/src/dpl/core/src/waitable_handle.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file waitable_handle.cpp - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of waitable handle - */ -#include -#include -#include -#include -#include -#include -#include -#include - -namespace VcoreDPL { -namespace // anonymous -{ -void CheckWaitableHandle(WaitableHandle handle) -{ -#ifdef DPL_ENABLE_WAITABLE_HANDLE_BADF_CHECK - // Try to get descriptor flags - int result = fcntl(handle, F_GETFL); - - if (result == -1 && errno == EBADF) { - AssertMsg(0, "CheckWaitableHandle: Invalid WaitableHandle! (EBADF)"); - } - - AssertMsg(result != -1, "CheckWaitableHandle: Invalid WaitableHandle!"); -#endif // DPL_ENABLE_WAITABLE_HANDLE_BADF_CHECK -} -} // namespace anonymous - -WaitableHandleIndexList WaitForSingleHandle(WaitableHandle handle, - unsigned long miliseconds) -{ - WaitableHandleList waitHandles; - waitHandles.push_back(handle); - return WaitForMultipleHandles(waitHandles, miliseconds); -} - -WaitableHandleIndexList WaitForSingleHandle(WaitableHandle handle, - WaitMode::Type mode, - unsigned long miliseconds) -{ - WaitableHandleListEx waitHandles; - waitHandles.push_back(std::make_pair(handle, mode)); - return WaitForMultipleHandles(waitHandles, miliseconds); -} - -WaitableHandleIndexList WaitForMultipleHandles( - const WaitableHandleList &waitableHandleList, - unsigned long miliseconds) -{ - WaitableHandleListEx handleList; - - for (WaitableHandleList::const_iterator iterator = waitableHandleList.begin(); - iterator != waitableHandleList.end(); - ++iterator) - { - // Wait for multiple objects - handleList.push_back(std::make_pair(*iterator, WaitMode::Read)); - } - - // Do waiting - return WaitForMultipleHandles(handleList, miliseconds); -} - -WaitableHandleIndexList WaitForMultipleHandles( - const WaitableHandleListEx &waitableHandleListEx, - unsigned long miliseconds) -{ - fd_set readFds, writeFds, errorFds; - - // Fill sets - int maxFd = -1; - - FD_ZERO(&readFds); - FD_ZERO(&writeFds); - FD_ZERO(&errorFds); - - // Add read wait handles - for (WaitableHandleListEx::const_iterator iterator = - waitableHandleListEx.begin(); - iterator != waitableHandleListEx.end(); - ++iterator) - { - if (iterator->first > maxFd) { - maxFd = iterator->first; - } - - CheckWaitableHandle(iterator->first); - - // Handle errors along with read and write events - FD_SET(iterator->first, &errorFds); - - if (iterator->second == WaitMode::Read) { - FD_SET(iterator->first, &readFds); - } else if (iterator->second == WaitMode::Write) { - FD_SET(iterator->first, &writeFds); - } - } - - // Do select - timeval timeout; - timeval *effectiveTimeout = NULL; - if (miliseconds != 0xFFFFFFFF) { - timeout.tv_sec = miliseconds / 1000; - timeout.tv_usec = (miliseconds % 1000) * 1000; - effectiveTimeout = &timeout; - } - - if (TEMP_FAILURE_RETRY(select(maxFd + 1, &readFds, &writeFds, &errorFds, - effectiveTimeout)) == -1) - { - Throw(WaitFailed); - } - - // Check results - WaitableHandleIndexList indexes; - size_t index = 0; - - for (WaitableHandleListEx::const_iterator iterator = - waitableHandleListEx.begin(); - iterator != waitableHandleListEx.end(); - ++iterator) - { - // Always return errors, no matter what type of listening is set - if (FD_ISSET(iterator->first, &errorFds)) { - indexes.push_back(index); - } else if (iterator->second == WaitMode::Read) { - if (FD_ISSET(iterator->first, &readFds)) { - indexes.push_back(index); - } - } else if (iterator->second == WaitMode::Write) { - if (FD_ISSET(iterator->first, &writeFds)) { - indexes.push_back(index); - } - } - ++index; - } - - // Successfuly awaited some events or timeout occurred - return indexes; -} -} // namespace VcoreDPL diff --git a/vcore/src/dpl/core/src/waitable_handle_watch_support.cpp b/vcore/src/dpl/core/src/waitable_handle_watch_support.cpp deleted file mode 100644 index b7b2644..0000000 --- a/vcore/src/dpl/core/src/waitable_handle_watch_support.cpp +++ /dev/null @@ -1,375 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file waitable_handle_watch_support.cpp - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of waitable handle watch - * support - */ -#include -#include -#include -#include -#include -#include - -namespace VcoreDPL { -WaitableHandleWatchSupport::WaitableHandleWatchSupport() -{} - -WaitableHandleWatchSupport::~WaitableHandleWatchSupport() -{ - // Developer assertions - if (!m_watchersMap.empty()) { - LogWarning("### Leaked watchers map dump ###"); - - for (WaitableHandleWatchersMap::const_iterator iterator = - m_watchersMap.begin(); - iterator != m_watchersMap.end(); - ++iterator) - { - LogWarning("### Waitable handle: " << iterator->first); - - LogWarning("### Read listeners: " << iterator->second.readListenersCount); - LogWarning("### Write listeners: " << iterator->second.writeListenersCount); - - for (WaitableHandleListenerList::const_iterator listenersIterator = - iterator->second.listeners.begin(); - listenersIterator != iterator->second.listeners.end(); - ++listenersIterator) - { - LogWarning("### Mode: " << listenersIterator->mode - << ". Listener: " << listenersIterator->listener); - } - } - } -} - -WaitableHandle WaitableHandleWatchSupport::WaitableInvokerHandle() const -{ - return m_watchersInvoker.GetHandle(); -} - -WaitableHandleListEx WaitableHandleWatchSupport::WaitableWatcherHandles() const -{ - // Critical section - { - std::lock_guard lock(m_watchersMutex); - - WaitableHandleListEx handleList; - - for (WaitableHandleWatchersMap::const_iterator iterator = - m_watchersMap.begin(); - iterator != m_watchersMap.end(); - ++iterator) - { - // Register waitable event id for wait - // Check if there are any read listeners and write listeners - // and register for both if applicable - if (iterator->second.readListenersCount > 0) { - handleList.push_back(std::make_pair(iterator->first, - WaitMode::Read)); - } - - if (iterator->second.writeListenersCount > 0) { - handleList.push_back(std::make_pair(iterator->first, - WaitMode::Write)); - } - } - - return handleList; - } -} - -void WaitableHandleWatchSupport::InvokerFinished() -{ - LogDebug("Invoker finished called"); - - // Reset invoker - m_watchersInvoker.Reset(); - - // Commit invoke - m_watchersInvokerCommit.Signal(); -} - -void WaitableHandleWatchSupport::HandleWatcher(WaitableHandle waitableHandle, - WaitMode::Type mode) -{ - // - // Waitable event occurred - // Now call all listeners for that waitable event. It is possible - // that some of listeners early disappeared. This is not a problem. - // Warning: Listeners and/or watcher may also disappear during dispatching - // handlers! - // - LogDebug("Waitable event occurred"); - - // Critical section for other threads - { - std::lock_guard lock(m_watchersMutex); - - // Notice: We must carefully call watchers here as they may disappear - // (zero listeners) or be created during each of handler call - // All removed listeners are handled correctly. Adding - // additional listener to the same waitable handle - // during handler dispatch sequence is _not_ supported. - WaitableHandleWatchersMap trackedWatchers = m_watchersMap; - - for (WaitableHandleWatchersMap::const_iterator trackedWatchersIterator - = trackedWatchers.begin(); - trackedWatchersIterator != trackedWatchers.end(); - ++trackedWatchersIterator) - { - // Check if this watcher still exists - // If not, go to next tracked watcher - if (m_watchersMap.find(trackedWatchersIterator->first) == - m_watchersMap.end()) - { - LogDebug("Watcher disappeared during watcher handler"); - continue; - } - - // Is this is a waitable handle that we are searching for ? - if (waitableHandle != trackedWatchersIterator->first) { - continue; - } - - // Track watcher listeners list - WaitableHandleListenerList trackedListeners = - trackedWatchersIterator->second.listeners; - - LogDebug("Calling waitable event listeners (" << trackedListeners.size() << ")..."); - - // Notice: We must carefully call listeners here as they may - // disappear or be created during each of handler call - // All removed listeners are handled correctly. Adding - // additional listener to the same waitable handle - // during handler dispatch sequence is should be also - // handled, as an extremly case. - - // Call all waitable event listeners who listen for that event - for (WaitableHandleListenerList::const_iterator - trackedListenersIterator = trackedListeners.begin(); - trackedListenersIterator != trackedListeners.end(); - ++trackedListenersIterator) - { - // Check if this watcher still exists - // If not, there cannot be another one. Must exit now (after - // break, we actually exit) - if (m_watchersMap.find(trackedWatchersIterator->first) == - m_watchersMap.end()) - { - LogDebug("Watcher disappeared during watcher handler"); - break; - } - - // Check if this watcher listener still exists - // If not, go to next tracked watcher listener - bool listenerStillExists = false; - - for (WaitableHandleListenerList::const_iterator - searchListenerIterator = - trackedWatchersIterator->second.listeners.begin(); - searchListenerIterator != - trackedWatchersIterator->second.listeners.end(); - ++searchListenerIterator) - { - if (searchListenerIterator->listener == - trackedListenersIterator->listener && - searchListenerIterator->mode == - trackedListenersIterator->mode) - { - listenerStillExists = true; - break; - } - } - - if (!listenerStillExists) { - LogDebug("Watcher listener disappeared during watcher handler"); - break; - } - - // Is this is a listener mode that we are searching for ? - if (mode != trackedListenersIterator->mode) { - continue; - } - - // Call waitable event watch listener - LogDebug("Before tracker listener call..."); - trackedListenersIterator->listener->OnWaitableHandleEvent( - trackedWatchersIterator->first, - trackedListenersIterator->mode); - LogDebug("After tracker listener call..."); - } - - // Now call all those listeners who registered during listener calls - // FIXME: Implement! Notice, that scenario may be recursive! - - LogDebug("Waitable event listeners called"); - - // No more waitable events possible - consistency check - break; - } - } -} - -void WaitableHandleWatchSupport::AddWaitableHandleWatch( - WaitableHandleListener* listener, - WaitableHandle waitableHandle, - WaitMode::Type mode) -{ - // Enter waitable event list critical section - std::lock_guard lock(m_watchersMutex); - - // Find proper list to register into - WaitableHandleWatchersMap::iterator mapIterator = m_watchersMap.find( - waitableHandle); - - if (mapIterator != m_watchersMap.end()) { - // Assert if there is no such listener already that is listening in this - // mode - for (WaitableHandleListenerList::iterator listenersIterator = - mapIterator->second.listeners.begin(); - listenersIterator != mapIterator->second.listeners.end(); - ++listenersIterator) - { - // Must not insert same listener-mode pair - Assert( - listenersIterator->listener != listener || - listenersIterator->mode != mode); - } - } - - LogDebug("Adding waitable handle watch : " << waitableHandle); - - // Push new waitable event watch - if (mapIterator != m_watchersMap.end()) { - mapIterator->second.listeners.push_back(WaitableHandleWatcher(listener, - mode)); - } else { - m_watchersMap[waitableHandle].listeners.push_back(WaitableHandleWatcher( - listener, mode)); - } - - // Update counters - switch (mode) { - case WaitMode::Read: - m_watchersMap[waitableHandle].readListenersCount++; - break; - - case WaitMode::Write: - m_watchersMap[waitableHandle].writeListenersCount++; - break; - - default: - Assert(0); - } - - // Trigger waitable event invoker to commit changes - CommitInvoker(); - - LogDebug("Waitable event watch added and invoker signaled"); -} - -void WaitableHandleWatchSupport::RemoveWaitableHandleWatch( - WaitableHandleListener *listener, - WaitableHandle waitableHandle, - WaitMode::Type mode) -{ - // Enter waitable event list critical section - std::lock_guard lock(m_watchersMutex); - - // Find proper list with listener - WaitableHandleWatchersMap::iterator mapIterator = m_watchersMap.find( - waitableHandle); - - Assert(mapIterator != m_watchersMap.end()); - - // Assert if there is such listener and mode - WaitableHandleListenerList::iterator listIterator = - mapIterator->second.listeners.end(); - - for (WaitableHandleListenerList::iterator listenersIterator = - mapIterator->second.listeners.begin(); - listenersIterator != mapIterator->second.listeners.end(); - ++listenersIterator) - { - // Check same pair listener-mode - if (listenersIterator->listener == listener && - listenersIterator->mode == mode) - { - listIterator = listenersIterator; - break; - } - } - - // Same pair listener-mode must exist - Assert(listIterator != mapIterator->second.listeners.end()); - - LogDebug("Removing waitable handle watch : " << waitableHandle); - - // Remove waitable event watch - mapIterator->second.listeners.erase(listIterator); - - // Update counters - switch (mode) { - case WaitMode::Read: - mapIterator->second.readListenersCount--; - break; - - case WaitMode::Write: - mapIterator->second.writeListenersCount--; - break; - - default: - Assert(0); - } - - // If list is empty, remove it too - if (mapIterator->second.listeners.empty()) { - m_watchersMap.erase(mapIterator); - } - - // Trigger waitable event invoker to commit changes - CommitInvoker(); - - LogDebug("Waitable event watch removed and invoker signaled"); -} - -void WaitableHandleWatchSupport::CommitInvoker() -{ - // Check calling context and execute invoker - if (Thread::GetCurrentThread() == GetInvokerThread()) { - LogDebug("Calling direct invoker"); - - // Direct invoker call - HandleDirectInvoker(); - } else { - LogDebug("Calling indirect invoker"); - - // Indirect invoker call - m_watchersInvoker.Signal(); - - WaitableHandleList waitHandles; - waitHandles.push_back(m_watchersInvokerCommit.GetHandle()); - WaitForMultipleHandles(waitHandles); - - m_watchersInvokerCommit.Reset(); - } -} - -} // namespace VcoreDPL diff --git a/vcore/src/dpl/db/include/dpl/db/naive_synchronization_object.h b/vcore/src/dpl/db/include/dpl/db/naive_synchronization_object.h deleted file mode 100644 index d774ce0..0000000 --- a/vcore/src/dpl/db/include/dpl/db/naive_synchronization_object.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file naive_synchronization_object.h - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of SQL naive - * synchronization object - */ -#ifndef DPL_NAIVE_SYNCHRONIZATION_OBJECT_H -#define DPL_NAIVE_SYNCHRONIZATION_OBJECT_H - -#include - -namespace VcoreDPL { -namespace DB { -/** - * Naive synchronization object used to synchronize SQL connection - * to the same database across different threads and processes - */ -class NaiveSynchronizationObject : - public SqlConnection::SynchronizationObject -{ - public: - // [SqlConnection::SynchronizationObject] - virtual void Synchronize(); - virtual void NotifyAll(); -}; -} // namespace DB -} // namespace VcoreDPL - -#endif // DPL_NAIVE_SYNCHRONIZATION_OBJECT_H diff --git a/vcore/src/dpl/db/include/dpl/db/orm.h b/vcore/src/dpl/db/include/dpl/db/orm.h deleted file mode 100644 index 11df75f..0000000 --- a/vcore/src/dpl/db/include/dpl/db/orm.h +++ /dev/null @@ -1,1117 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file orm.h - * @author Bartosz Janiak (b.janiak@samsung.com) - * @version 1.0 - * @brief DPL-ORM: Object-relational mapping for sqlite database, written on top of DPL. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#ifndef DPL_ORM_H -#define DPL_ORM_H - -namespace VcoreDPL { -namespace DB { -namespace ORM { - -//TODO move to type utils -#define DPL_CHECK_TYPE_INSTANTIABILITY(type) \ - { \ - type _ignored_; \ - (void)_ignored_; \ - } - -#define DECLARE_COLUMN_TYPE_LIST() typedef VcoreDPL::TypeListDecl< -#define SELECTED_COLUMN(table_name, column_name) table_name::column_name, -#define DECLARE_COLUMN_TYPE_LIST_END(name) VcoreDPL::TypeListGuard>::Type name; - -typedef size_t ColumnIndex; -typedef size_t ArgumentIndex; -typedef boost::optional OptionalString; -typedef boost::optional OptionalInteger; -typedef VcoreDPL::DB::SqlConnection::DataCommand DataCommand; - -namespace RelationTypes { - extern const char Equal[]; - extern const char LessThan[]; - extern const char And[]; - extern const char Or[]; - extern const char Is[]; - extern const char In[]; - //TODO define more relation types -} - -namespace DataCommandUtils { - //TODO move to VcoreDPL::DataCommand? - void BindArgument(DataCommand *command, ArgumentIndex index, int argument); - void BindArgument(DataCommand *command, ArgumentIndex index, const OptionalInteger& argument); - void BindArgument(DataCommand *command, ArgumentIndex index, const VcoreDPL::String& argument); - void BindArgument(DataCommand *command, ArgumentIndex index, const OptionalString& argument); -} -class __attribute__ ((visibility("hidden"))) Expression { -public: - virtual ~Expression() {} - virtual std::string GetString() const = 0; - virtual ArgumentIndex BindTo(DataCommand *command, ArgumentIndex index) = 0; -}; - -typedef std::shared_ptr ExpressionPtr; - -namespace OrderingUtils { - -template inline std::string OrderByInternal() -{ - std::string order = OrderByInternal(); - if(!order.empty()) return CompoundType::Head::GetString() + ", " + order; - else return CompoundType::Head::GetString(); -} - -template<> inline std::string OrderByInternal() -{ - return std::string(); -} - -} - -template -class __attribute__ ((visibility("hidden"))) OrderingExpression { -protected: - static std::string GetSchemaAndName() - { - std::string statement; - statement += ColumnType::GetTableName(); - statement += "."; - statement += ColumnType::GetColumnName(); - statement += " "; - return statement; - } -public: - virtual ~OrderingExpression() {} -}; - -template -class __attribute__ ((visibility("hidden"))) BinaryExpression : public Expression { -protected: - LeftExpression m_leftExpression; - RightExpression m_rightExpression; - bool m_outerParenthesis; -public: - BinaryExpression(const LeftExpression& leftExpression, const RightExpression& rightExpression, bool outerParenthesis = true) : - m_leftExpression(leftExpression), - m_rightExpression(rightExpression), - m_outerParenthesis(outerParenthesis) - {} - - virtual std::string GetString() const - { - return (m_outerParenthesis ? "( " : " " ) + - m_leftExpression.GetString() + " " + Operator + " " + m_rightExpression.GetString() + - (m_outerParenthesis ? " )" : " " ) ; - } - - virtual ArgumentIndex BindTo(DataCommand *command, ArgumentIndex index) - { - index = m_leftExpression.BindTo(command, index); - return m_rightExpression.BindTo(command, index); - } - - template - struct ValidForTable { - typedef std::pair::Yes , - typename RightExpression::template ValidForTable::Yes > - Yes; - }; -}; - -template -BinaryExpression - And(const LeftExpression& leftExpression, const RightExpression& rightExpression) -{ - return BinaryExpression - (leftExpression, rightExpression); -} - -template -BinaryExpression - Or(const LeftExpression& leftExpression, const RightExpression& rightExpression) -{ - return BinaryExpression - (leftExpression, rightExpression); -} - -template -class __attribute__ ((visibility("hidden"))) ExpressionWithArgument : public Expression { -protected: - ArgumentType argument; - -public: - explicit ExpressionWithArgument(const ArgumentType& _argument) : argument(_argument) {} - - virtual ArgumentIndex BindTo(DataCommand *command, ArgumentIndex index) - { - DataCommandUtils::BindArgument(command, index, argument); - return index + 1; - } -}; - -template -class __attribute__ ((visibility("hidden"))) Compare : public ExpressionWithArgument { -public: - explicit Compare(typename ColumnData::ColumnType column) : - ExpressionWithArgument(column) - {} - - virtual std::string GetString() const - { - std::string statement; - statement += ColumnData::GetTableName(); - statement += "."; - statement += ColumnData::GetColumnName(); - statement += " "; - statement += Relation; - statement += " ?"; - return statement; - } - - template - struct ValidForTable { - typedef typename TableDefinition::ColumnList::template Contains Yes; - }; -}; -#define ORM_DEFINE_COMPARE_EXPRESSION(name, relationType) \ - template \ - class __attribute__ ((visibility("hidden"))) name : public Compare { \ - public: \ - name(typename ColumnData::ColumnType column) : \ - Compare(column) \ - {} \ - }; - -ORM_DEFINE_COMPARE_EXPRESSION(Equals, Equal) -ORM_DEFINE_COMPARE_EXPRESSION(Is, Is) - -#define ORM_DEFINE_ORDERING_EXPRESSION(name, value) \ - template \ - class __attribute__ ((visibility("hidden"))) name \ - : OrderingExpression { \ - public: \ - static std::string GetString() \ - { \ - std::string statement = OrderingExpression::GetSchemaAndName(); \ - statement += value; \ - return statement; \ - } \ - }; - -ORM_DEFINE_ORDERING_EXPRESSION(OrderingAscending, "ASC") -ORM_DEFINE_ORDERING_EXPRESSION(OrderingDescending, "DESC") - -template -class __attribute__ ((visibility("hidden"))) CompareBinaryColumn { -private: - std::string m_relation; -public: - CompareBinaryColumn(const char* Relation) : - m_relation(Relation) - {} - - virtual ~CompareBinaryColumn() {} - - virtual std::string GetString() const - { - std::string statement; - statement += ColumnData1::GetTableName(); - statement += "."; - statement += ColumnData1::GetColumnName(); - statement += " "; - statement += m_relation; - statement += " "; - statement += ColumnData2::GetTableName(); - statement += "."; - statement += ColumnData2::GetColumnName(); - - return statement; - } -}; - -template -CompareBinaryColumn - Equal() -{ - return CompareBinaryColumn(RelationTypes::Equal); -} - -template -class __attribute__ ((visibility("hidden"))) NumerousArguments : public Expression { -protected: - std::set m_argumentList; -public: - NumerousArguments(const std::set& argumentList) : m_argumentList(argumentList) {} - - virtual std::string GetString() const - { - std::string statement; - statement += ColumnData::GetColumnName(); - statement += " "; - statement += Relation; - statement += " ( "; - - int argumentCount = m_argumentList.size(); - while(argumentCount) - { - statement += "?"; - argumentCount--; - if (argumentCount) - { - statement += ", "; - } - } - - statement += " )"; - - return statement; - } - - virtual ArgumentIndex BindTo(DataCommand *command, ArgumentIndex index) - { - ArgumentIndex argumentIndex = index; - FOREACH(argumentIt, m_argumentList) - { - DataCommandUtils::BindArgument(command, argumentIndex, *argumentIt); - argumentIndex++; - } - return argumentIndex + 1; - } - - template - struct ValidForTable { - typedef typename TableDefinition::ColumnList::template Contains Yes; - }; -}; - -#define ORM_DEFINE_COMPARE_EXPRESSION_NUMEROUS_ARGUMENTS(name, relationType) \ - template \ - class __attribute__ ((visibility("hidden"))) name : public NumerousArguments { \ - public: \ - name(std::set column) : \ - NumerousArguments(column) \ - {} \ - }; - -ORM_DEFINE_COMPARE_EXPRESSION_NUMEROUS_ARGUMENTS(In, In) - -template -ColumnType GetColumnFromCommand(ColumnIndex columnIndex, DataCommand *command); - -class __attribute__ ((visibility("hidden"))) CustomColumnBase { -public: - CustomColumnBase() {} - virtual ~CustomColumnBase() {} -}; - -template -class __attribute__ ((visibility("hidden"))) CustomColumn : public CustomColumnBase { -private: - ColumnType m_columnData; - -public: - CustomColumn() {} - CustomColumn(ColumnType data) - { - m_columnData = data; - } - - void SetColumnData(ColumnType data) - { - m_columnData = data; - } - - ColumnType GetColumnData() const - { - return m_columnData; - } -}; - -template -class __attribute__ ((visibility("hidden"))) CustomRowUtil { -public: - static void MakeColumnList(std::vector& columnList) - { - typedef CustomColumn Type; - Type* pColumn = new Type(); - columnList.push_back(pColumn); - CustomRowUtil::MakeColumnList(columnList); - } - - static void CopyColumnList(const std::vector& srcList, std::vector& dstList) - { - CopyColumnList(srcList, dstList, 0); - } - - static ColumnIndex GetColumnIndex(const std::string& columnName) - { - return GetColumnIndex(columnName, 0); - } - -private: - static void CopyColumnList(const std::vector& srcList, std::vector& dstList, ColumnIndex index) - { - typedef CustomColumn Type; - Type* pColumn = new Type(((Type*)(srcList.at(index)))->GetColumnData()); - dstList.push_back(pColumn); - CustomRowUtil::CopyColumnList(srcList, dstList, index + 1); - } - - static ColumnIndex GetColumnIndex(const std::string& columnName, ColumnIndex index) - { - if (ColumnList::Head::GetColumnName() == columnName) - return index; - - return CustomRowUtil::GetColumnIndex(columnName, index + 1); - } - -template -friend class CustomRowUtil; -}; - -template<> -class __attribute__ ((visibility("hidden"))) CustomRowUtil { -public: - static void MakeColumnList(std::vector&) {} -private: - static void CopyColumnList(const std::vector&, std::vector&, ColumnIndex) {} - static ColumnIndex GetColumnIndex(const std::string&, ColumnIndex) { return -1; } - -template -friend class CustomRowUtil; -}; - -template -class __attribute__ ((visibility("hidden"))) CustomRow { -private: - std::vector m_columns; - -public: - CustomRow() - { - CustomRowUtil::MakeColumnList(m_columns); - } - - CustomRow(const CustomRow& r) - { - CustomRowUtil::CopyColumnList(r.m_columns, m_columns); - } - - virtual ~CustomRow() - { - while (!m_columns.empty()) - { - CustomColumnBase* pCustomColumn = m_columns.back(); - m_columns.pop_back(); - if (pCustomColumn) - delete pCustomColumn; - } - } - - template - void SetColumnData(ColumnIndex columnIndex, ColumnType data) - { - typedef CustomColumn Type; - Assert(columnIndex < m_columns.size()); - Type* pColumn = dynamic_cast(m_columns.at(columnIndex)); - Assert(pColumn); - pColumn->SetColumnData(data); - } - - template - typename ColumnData::ColumnType GetColumnData() - { - typedef CustomColumn Type; - ColumnIndex index = CustomRowUtil::GetColumnIndex(ColumnData::GetColumnName()); - Assert(index < m_columns.size()); - Type* pColumn = dynamic_cast(m_columns.at(index)); - Assert(pColumn); - return pColumn->GetColumnData(); - } -}; - -template -void SetColumnData(CustomRow& row, ColumnType columnData, ColumnIndex columnIndex) -{ - row.SetColumnData(columnIndex, columnData); -} - -template -class __attribute__ ((visibility("hidden"))) FillCustomRowUtil { -public: - static void FillCustomRow(CustomRow& row, DataCommand* command) - { - FillCustomRow(row, 0, command); - } - -private: - static void FillCustomRow(CustomRow& row, ColumnIndex columnIndex, DataCommand* command) - { - typename ColumnList::Head::ColumnType columnData; - columnData = GetColumnFromCommand(columnIndex, command); - SetColumnData(row, columnData, columnIndex); - FillCustomRowUtil::FillCustomRow(row, columnIndex + 1, command); - } - -template -friend class FillCustomRowUtil; -}; - -template -class __attribute__ ((visibility("hidden"))) FillCustomRowUtil { -private: - static void FillCustomRow(CustomRow&, ColumnIndex, DataCommand *) - { /* do nothing, we're past the last element of column list */ } - -template -friend class FillCustomRowUtil; -}; - -template -class __attribute__ ((visibility("hidden"))) FillRowUtil { -public: - static void FillRow(Row& row, DataCommand *command) - { - FillRow(row, 0, command); - } - -private: - static void FillRow(Row& row, ColumnIndex columnIndex, DataCommand *command) - { - typename ColumnList::Head::ColumnType rowField; - rowField = GetColumnFromCommand(columnIndex, command); - ColumnList::Head::SetRowField(row, rowField); - FillRowUtil::FillRow(row, columnIndex + 1, command); - } - -template -friend class FillRowUtil; -}; - -template -class __attribute__ ((visibility("hidden"))) FillRowUtil { -private: - static void FillRow(Row&, ColumnIndex, DataCommand *) - { /* do nothing, we're past the last element of column list */ } - -template -friend class FillRowUtil; -}; - -template -class __attribute__ ((visibility("hidden"))) JoinUtil { -public: - static std::string GetColumnNames() - { - std::string result; - result = ColumnList::Head::GetTableName(); - result += "."; - result += ColumnList::Head::GetColumnName(); - if (ColumnList::Tail::Size > 0) - result += ", "; - - return result += JoinUtil::GetColumnNames(); - } - - static std::string GetJoinTableName(const std::string& tableName) - { - std::string joinTableName = ColumnList::Head::GetTableName(); - if (tableName.find(joinTableName) == std::string::npos) - return joinTableName; - - return JoinUtil::GetJoinTableName(tableName); - } -}; - -template<> -class __attribute__ ((visibility("hidden"))) JoinUtil { -public: - static std::string GetColumnNames() { return ""; } - static std::string GetJoinTableName(std::string) { return ""; } -}; - -class Exception { -public: - DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base) - DECLARE_EXCEPTION_TYPE(Base, SelectReuseWithDifferentQuerySignature) - DECLARE_EXCEPTION_TYPE(Base, RowFieldNotInitialized) - DECLARE_EXCEPTION_TYPE(Base, EmptyUpdateStatement) -}; - -template -class __attribute__ ((visibility("hidden"))) Query -{ -protected: - explicit Query(IOrmInterface* interface) : - m_interface(interface), - m_command(NULL) - { - } - - virtual ~Query() - { - if (m_command == NULL) - return; - - TableDefinition::FreeTableDataCommand(m_command, m_interface); - } - - IOrmInterface* m_interface; - DataCommand *m_command; - std::string m_commandString; - ArgumentIndex m_bindArgumentIndex; -}; - -template -class __attribute__ ((visibility("hidden"))) QueryWithWhereClause : public Query -{ -protected: - ExpressionPtr m_whereExpression; - - void Prepare() - { - if ( !!m_whereExpression ) - { - this->m_commandString += " WHERE "; - this->m_commandString += m_whereExpression->GetString(); - } - } - - void Bind() - { - if ( !!m_whereExpression ) - { - this->m_bindArgumentIndex = m_whereExpression->BindTo( - this->m_command, this->m_bindArgumentIndex); - } - } - -public: - explicit QueryWithWhereClause(IOrmInterface* interface) : - Query(interface) - { - } - - template - void Where(const Expression& expression) - { - DPL_CHECK_TYPE_INSTANTIABILITY(typename Expression::template ValidForTable::Yes); - if ( !!m_whereExpression && ( typeid(Expression) != typeid(*m_whereExpression) ) ) - { - std::ostringstream str; - str << "Current ORM implementation doesn't allow to reuse Select" - " instance with different query signature (particularly " - "WHERE on different column).\n"; - str << "Query: "; - str << this->m_commandString; - ThrowMsg(Exception::SelectReuseWithDifferentQuerySignature, - str.str()); - } - //TODO maybe don't make a copy here but just generate the string part of the query. - m_whereExpression.reset(new Expression(expression)); - } - -}; - -template -class __attribute__ ((visibility("hidden"))) Delete : public QueryWithWhereClause -{ -protected: - void Prepare() - { - if ( !this->m_command) - { - this->m_commandString = "DELETE FROM "; - this->m_commandString += TableDefinition::GetName(); - - QueryWithWhereClause::Prepare(); - - this->m_command = TableDefinition::AllocTableDataCommand( - this->m_commandString.c_str(), - Query::m_interface); - LogDebug("Prepared SQL command " << this->m_commandString); - } - } - - void Bind() - { - this->m_bindArgumentIndex = 1; - QueryWithWhereClause::Bind(); - } - -public: - explicit Delete(IOrmInterface *interface = NULL) : - QueryWithWhereClause(interface) - { - } - - void Execute() - { - Prepare(); - Bind(); - this->m_command->Step(); - this->m_command->Reset(); - } -}; - -namespace { -class BindVisitor { -private: - DataCommand *m_command; -public: - ArgumentIndex m_bindArgumentIndex; - - BindVisitor(DataCommand *command) : - m_command(command), - m_bindArgumentIndex(1) - {} - - template - void Visit(const char*, const ColumnType& value, bool isSet) - { - if ( isSet ) - { - DataCommandUtils::BindArgument(m_command, m_bindArgumentIndex, value); - m_bindArgumentIndex++; - } - } -}; -} //anonymous namespace -template -class __attribute__ ((visibility("hidden"))) Insert : public Query -{ -public: - typedef typename TableDefinition::Row Row; - typedef VcoreDPL::DB::SqlConnection::RowID RowID; - -protected: - boost::optional m_orClause; - Row m_row; - - class PrepareVisitor { - public: - std::string m_columnNames; - std::string m_values; - - template - void Visit(const char* name, const ColumnType&, bool isSet) - { - if ( isSet ) - { - if ( !m_columnNames.empty() ) - { - m_columnNames += ", "; - m_values += ", "; - } - m_columnNames += name; - m_values += "?"; - } - } - }; - - void Prepare() - { - if ( !this->m_command ) - { - this->m_commandString = "INSERT "; - if ( !!m_orClause ) - { - this->m_commandString += " OR " + *m_orClause + " "; - } - this->m_commandString += "INTO "; - this->m_commandString += TableDefinition::GetName(); - - PrepareVisitor visitor; - m_row.VisitColumns(visitor); - - this->m_commandString += " ( " + visitor.m_columnNames + " ) "; - this->m_commandString += "VALUES ( " + visitor.m_values + " )"; - - LogDebug("Prepared SQL command " << this->m_commandString); - this->m_command = TableDefinition::AllocTableDataCommand( - this->m_commandString.c_str(), - Query::m_interface); - } - } - - void Bind() - { - BindVisitor visitor(this->m_command); - m_row.VisitColumns(visitor); - } - -public: - explicit Insert( - IOrmInterface* interface = NULL, - const boost::optional& orClause = boost::optional()) : - Query(interface), - m_orClause(orClause) - { - } - - void Values(const Row& row) - { - if ( this->m_command ) - { - if ( !row.IsSignatureMatching(m_row) ) - { - ThrowMsg(Exception::SelectReuseWithDifferentQuerySignature, - "Current ORM implementation doesn't allow to reuse Insert instance " - "with different query signature."); - } - } - m_row = row; - } - - RowID Execute() - { - Prepare(); - Bind(); - this->m_command->Step(); - - RowID result = TableDefinition::GetLastInsertRowID( - Query::m_interface); - - this->m_command->Reset(); - return result; - } -}; - -template -class __attribute__ ((visibility("hidden"))) Select : public QueryWithWhereClause -{ -public: - typedef typename TableDefinition::ColumnList ColumnList; - typedef typename TableDefinition::Row Row; - - typedef std::list RowList; -protected: - boost::optional m_orderBy; - std::string m_JoinClause; - bool m_distinctResults; - - void Prepare(const char* selectColumnName) - { - if ( !this->m_command ) - { - this->m_commandString = "SELECT "; - if (m_distinctResults) - this->m_commandString += "DISTINCT "; - this->m_commandString += selectColumnName; - this->m_commandString += " FROM "; - this->m_commandString += TableDefinition::GetName(); - - this->m_commandString += m_JoinClause; - - QueryWithWhereClause::Prepare(); - - if ( !!m_orderBy ) - { - this->m_commandString += " ORDER BY " + *m_orderBy; - } - - this->m_command = TableDefinition::AllocTableDataCommand( - this->m_commandString.c_str(), - Query::m_interface); - - LogDebug("Prepared SQL command " << this->m_commandString); - } - } - - void Bind() - { - this->m_bindArgumentIndex = 1; - QueryWithWhereClause::Bind(); - } - - template - ColumnType GetColumn(ColumnIndex columnIndex) - { - return GetColumnFromCommand(columnIndex, this->m_command); - } - - Row GetRow() - { - Row row; - FillRowUtil::FillRow(row, this->m_command); - return row; - } - - template - CustomRow GetCustomRow() - { - CustomRow row; - FillCustomRowUtil::FillCustomRow(row, this->m_command); - return row; - } - -public: - - explicit Select(IOrmInterface *interface = NULL) : - QueryWithWhereClause(interface), - m_distinctResults(false) - { - } - - void Distinct() - { - m_distinctResults = true; - } - - template - void OrderBy(const CompoundType&) - { - m_orderBy = OrderingUtils::OrderByInternal(); - } - - void OrderBy(const std::string & orderBy) //backward compatibility - { - m_orderBy = orderBy; - } - - void OrderBy(const char * orderBy) //backward compatibility - { - m_orderBy = std::string(orderBy); - } - - template - void Join(const Expression& expression) { - std::string usedTableNames = TableDefinition::GetName(); - if (!m_JoinClause.empty()) - usedTableNames += m_JoinClause; - - this->m_JoinClause += " JOIN "; - this->m_JoinClause += JoinUtil::GetJoinTableName(usedTableNames); - this->m_JoinClause += " ON "; - this->m_JoinClause += expression.GetString(); - } - - template - typename ColumnData::ColumnType GetSingleValue() - { - Prepare(ColumnData::GetColumnName()); - Bind(); - this->m_command->Step(); - - typename ColumnData::ColumnType result = - GetColumn(0); - - this->m_command->Reset(); - return result; - } - - //TODO return range - pair of custom iterators - template - std::list GetValueList() - { - Prepare(ColumnData::GetColumnName()); - Bind(); - - std::list resultList; - - while (this->m_command->Step()) - resultList.push_back(GetColumn(0)); - - this->m_command->Reset(); - return resultList; - } - - Row GetSingleRow() - { - Prepare("*"); - Bind(); - this->m_command->Step(); - - Row result = GetRow(); - - this->m_command->Reset(); - return result; - } - - //TODO return range - pair of custom iterators - RowList GetRowList() - { - Prepare("*"); - Bind(); - - RowList resultList; - - while (this->m_command->Step()) - resultList.push_back(GetRow()); - - this->m_command->Reset(); - return resultList; - } - - template - CustomRow GetCustomSingleRow() - { - Prepare(JoinUtil::GetColumnNames().c_str()); - Bind(); - this->m_command->Step(); - - CustomRow result = GetCustomRow(); - - this->m_command->Reset(); - return result; - } - - template - std::list GetCustomRowList() - { - Prepare(JoinUtil::GetColumnNames().c_str()); - Bind(); - - std::list resultList; - - while (this->m_command->Step()) - resultList.push_back(GetCustomRow()); - - this->m_command->Reset(); - return resultList; - } -}; - -template -class __attribute__ ((visibility("hidden"))) Update : public QueryWithWhereClause { -public: - typedef typename TableDefinition::Row Row; - -protected: - boost::optional m_orClause; - Row m_row; - - class PrepareVisitor { - public: - std::string m_setExpressions; - - template - void Visit(const char* name, const ColumnType&, bool isSet) - { - if ( isSet ) - { - if ( !m_setExpressions.empty() ) - { - m_setExpressions += ", "; - } - m_setExpressions += name; - m_setExpressions += " = "; - m_setExpressions += "?"; - } - } - }; - - void Prepare() - { - if ( !this->m_command ) - { - this->m_commandString = "UPDATE "; - if ( !!m_orClause ) - { - this->m_commandString += " OR " + *m_orClause + " "; - } - this->m_commandString += TableDefinition::GetName(); - this->m_commandString += " SET "; - - // got through row columns and values - PrepareVisitor visitor; - m_row.VisitColumns(visitor); - - if(visitor.m_setExpressions.empty()) - { - ThrowMsg(Exception::EmptyUpdateStatement, "No SET expressions in update statement"); - } - - this->m_commandString += visitor.m_setExpressions; - - // where - QueryWithWhereClause::Prepare(); - - this->m_command = TableDefinition::AllocTableDataCommand( - this->m_commandString.c_str(), - Query::m_interface); - LogDebug("Prepared SQL command " << this->m_commandString); - } - } - - void Bind() - { - BindVisitor visitor(this->m_command); - m_row.VisitColumns(visitor); - - this->m_bindArgumentIndex = visitor.m_bindArgumentIndex; - QueryWithWhereClause::Bind(); - } - - -public: - explicit Update(IOrmInterface *interface = NULL, - const boost::optional& orClause = boost::optional()) : - QueryWithWhereClause(interface), - m_orClause(orClause) - { - } - - void Values(const Row& row) - { - if ( this->m_command ) - { - if ( !row.IsSignatureMatching(m_row) ) - { - ThrowMsg(Exception::SelectReuseWithDifferentQuerySignature, - "Current ORM implementation doesn't allow to reuse Update instance " - "with different query signature."); - } - } - m_row = row; - } - - void Execute() - { - Prepare(); - Bind(); - this->m_command->Step(); - this->m_command->Reset(); - } -}; - -} //namespace ORM -} //namespace DB -} //namespace VcoreDPL - -#endif // DPL_ORM_H diff --git a/vcore/src/dpl/db/include/dpl/db/orm_generator.h b/vcore/src/dpl/db/include/dpl/db/orm_generator.h deleted file mode 100644 index dd1b0dd..0000000 --- a/vcore/src/dpl/db/include/dpl/db/orm_generator.h +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file orm_generator.h - * @author Bartosz Janiak (b.janiak@samsung.com) - * @version 1.0 - * @brief Macro definitions for generating the DPL-ORM table definitions from database definitions. - */ - -#ifndef ORM_GENERATOR_DATABASE_NAME -#error You need to define database name in ORM_GENERATOR_DATABASE_NAME define before you include orm_generator.h file -#endif - -#include - -#define ORM_GENERATOR_DATABASE_NAME_LOCAL - -#ifdef DPL_ORM_GENERATOR_H -#warning orm_generator.h is included multiply times. Make sure it has different ORM_GENERATOR_DATABASE_NAME set. -#endif - -#define DPL_ORM_GENERATOR_H - - -#include -#include -#include -#include -#include -#include -#include - -/* - -This is true only when exactly one db is available. - -#if (defined DECLARE_COLUMN) || (defined INT) || (defined TINYINT) || \ - (defined INTEGER) || (defined BIGINT) || defined(VARCHAR) || defined(TEXT) || \ - (defined SQL) || (defined TABLE_CONSTRAINTS) || (defined OPTIONAL) || \ - (defined DATABASE_START) || (defined DATABASE_END) || (defined CREATE_TABLE) || \ - (defined COLUMN) || (defined COLUMN_NOT_NULL) || (defined CREATE_TABLE_END) - -#error This file temporarily defines many macros with generic names. To avoid name clash please include \ - this file as early as possible. If this is not possible please report this problem to DPL developers. - -#endif -*/ - -namespace VcoreDPL { -namespace DB { -namespace ORM { - -// Global macros - -#define STRINGIFY(s) _str(s) -#define _str(s) #s -#define DECLARE_COLUMN(FIELD, TYPE) \ - struct FIELD { \ - typedef TYPE ColumnType; \ - static const char* GetTableName() { return GetName(); } \ - static const char* GetColumnName() { return STRINGIFY(FIELD); } \ - static void SetRowField(Row& row, const TYPE& _value) { row.Set_##FIELD(_value);} \ - }; - -#define INT int -#define TINYINT int -#define INTEGER int //TODO: should be long long? -#define BIGINT int //TODO: should be long long? -#define VARCHAR(x) VcoreDPL::String -#define TEXT VcoreDPL::String - -#define SQL(...) -#define TABLE_CONSTRAINTS(...) -#define OPTIONAL(type) boost::optional< type > -#define DATABASE_START(db_name) \ - namespace db_name \ - { \ - class ScopedTransaction \ - { \ - bool m_commited; \ - IOrmInterface *m_interface; \ - \ - public: \ - ScopedTransaction(IOrmInterface *interface) : \ - m_commited(false), \ - m_interface(interface) \ - { \ - Assert(interface != NULL); \ - m_interface->TransactionBegin(); \ - } \ - \ - ~ScopedTransaction() \ - { \ - if (!m_commited) \ - m_interface->TransactionRollback(); \ - } \ - \ - void Commit() \ - { \ - m_interface->TransactionCommit(); \ - m_commited = true; \ - } \ - }; - -#define DATABASE_END() } - -// RowBase ostream operator<< declaration - -#define CREATE_TABLE(name) \ - namespace name { \ - class RowBase; \ - inline std::ostream& operator<<(std::ostream& ostr, const RowBase& row); \ - } -#define COLUMN_NOT_NULL(name, type, ...) -#define COLUMN(name, type, ...) -#define CREATE_TABLE_END() - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - -#undef DATABASE_START -#define DATABASE_START(db_name) namespace db_name { - -// RowBase class - -#define CREATE_TABLE(name) namespace name { class RowBase { \ - public: friend std::ostream& operator<<(std::ostream&, const RowBase&); -#define COLUMN_NOT_NULL(name, type, ...) \ - protected: type name; bool m_##name##_set; \ - public: void Set_##name(const type& _value) { \ - m_##name##_set = true; \ - this->name = _value; \ - } \ - public: type Get_##name() const { \ - if ( !m_##name##_set ) { \ - ThrowMsg(Exception::RowFieldNotInitialized, \ - "You tried to read a row field that hasn't been set yet."); \ - } \ - return name; \ - } - -#define COLUMN(name, type, ...) \ - protected: OPTIONAL(type) name; bool m_##name##_set; \ - public: void Set_##name(const OPTIONAL(type)& _value) { \ - m_##name##_set = true; \ - this->name = _value; \ - } \ - public: OPTIONAL(type) Get_##name() const { \ - if ( !m_##name##_set ) { \ - ThrowMsg(Exception::RowFieldNotInitialized, \ - "You tried to read a row field that hasn't been set yet."); \ - } \ - return name; \ - } -#define CREATE_TABLE_END() }; } - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - -// RowBase ostream operator<< - -#define CREATE_TABLE(name) std::ostream& name::operator<<(std::ostream& ostr, const RowBase& row) { using ::operator<< ; ostr << STRINGIFY(name) << " ("; -#define COLUMN_NOT_NULL(name, type, ...) ostr << " '" << row.name << "'" ; -#define COLUMN(name, type, ...) ostr << " '" << row.name << "'" ; -#define CREATE_TABLE_END() ostr << " )" ; return ostr; } - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - -// RowBase2 class (== RowBase + operator==) - -#define CREATE_TABLE(name) namespace name { class RowBase2 : public RowBase { \ - public: bool operator==(const RowBase2& row) const { return true -#define COLUMN_NOT_NULL(name, type, ...) && (this->name == row.name) -#define COLUMN(name, type, ...) && (this->name == row.name) -#define CREATE_TABLE_END() ; } }; } - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - -// RowBase3 class (== RowBase2 + operator<) - -#define CREATE_TABLE(name) namespace name { class RowBase3 : public RowBase2 { \ - public: bool operator<(const RowBase3& row) const { -#define COLUMN_NOT_NULL(name, type, ...) if (this->name < row.name) { return true; } if (this->name > row.name) { return false; } -#define COLUMN(name, type, ...) if (this->name < row.name) { return true; } if (this->name > row.name) { return false; } -#define CREATE_TABLE_END() return false; } }; } - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - -// RowBase4 class (== RowBase3 + IsSignatureMatching ) - -#define CREATE_TABLE(name) namespace name { class RowBase4 : public RowBase3 { \ - public: bool IsSignatureMatching(const RowBase4& row) const { return true -#define COLUMN_NOT_NULL(name, type, ...) && (this->m_##name##_set == row.m_##name##_set) -#define COLUMN(name, type, ...) && (this->m_##name##_set == row.m_##name##_set) -#define CREATE_TABLE_END() ; } }; } - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - -// RowBase5 class (== RowBase4 + default constructor) - -#define CREATE_TABLE(name) namespace name { class RowBase5 : public RowBase4 { \ - public: RowBase5() { -#define COLUMN_NOT_NULL(name, type, ...) m_##name##_set = false; -#define COLUMN(name, type, ...) m_##name##_set = false; -#define CREATE_TABLE_END() } }; } - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - -// Row class (== RowBase5 + ForEachColumn ) - -#define CREATE_TABLE(name) namespace name { class Row : public RowBase5 { \ - public: template \ - void VisitColumns(Visitor& visitor) const { -#define COLUMN_NOT_NULL(name, type, ...) visitor.Visit(STRINGIFY(name), this->name, this->m_##name##_set); -#define COLUMN(name, type, ...) visitor.Visit(STRINGIFY(name), this->name, this->m_##name##_set); -#define CREATE_TABLE_END() } }; } - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - -// Field structure declarations - -#define CREATE_TABLE(name) namespace name { \ - static const char* GetName() { return STRINGIFY(name); } -#define COLUMN_NOT_NULL(name, type, ...) DECLARE_COLUMN(name, type) -#define COLUMN(name, type, ...) DECLARE_COLUMN(name, OPTIONAL(type)) -#define CREATE_TABLE_END() } - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - -// ColumnList typedef - -#define CREATE_TABLE(name) namespace name { typedef VcoreDPL::TypeListDecl< -#define COLUMN_NOT_NULL(name, type, ...) name, -#define COLUMN(name, type, ...) name, -#define CREATE_TABLE_END() VcoreDPL::TypeListGuard>::Type ColumnList; } - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - -// TableDefinition struct - -#define CREATE_TABLE(table_name) \ - namespace table_name { \ - struct TableDefinition { \ - typedef table_name::ColumnList ColumnList; \ - typedef table_name::Row Row; \ - static const char* GetName() { return STRINGIFY(table_name); } \ - static VcoreDPL::DB::SqlConnection::DataCommand *AllocTableDataCommand( \ - const std::string &statement, \ - IOrmInterface *interface) \ - { \ - Assert(interface != NULL); \ - return interface->AllocDataCommand(statement); \ - } \ - static void FreeTableDataCommand( \ - VcoreDPL::DB::SqlConnection::DataCommand *command, \ - IOrmInterface *interface) \ - { \ - Assert(interface != NULL); \ - interface->FreeDataCommand(command); \ - } \ - static VcoreDPL::DB::SqlConnection::RowID GetLastInsertRowID( \ - IOrmInterface *interface) \ - { \ - Assert(interface != NULL); \ - return interface->GetLastInsertRowID(); \ - } \ - }; \ - } - -#define COLUMN_NOT_NULL(name, type, ...) -#define COLUMN(name, type, ...) -#define CREATE_TABLE_END() - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - -// Query typedefs - -#define CREATE_TABLE(name) \ - namespace name { \ - typedef Select Select; \ - typedef Insert Insert; \ - typedef Delete Delete; \ - typedef Update Update; \ - } -#define COLUMN_NOT_NULL(name, type, ...) -#define COLUMN(name, type, ...) -#define CREATE_TABLE_END() - -#include ORM_GENERATOR_DATABASE_NAME_LOCAL - -#undef CREATE_TABLE -#undef COLUMN_NOT_NULL -#undef COLUMN -#undef CREATE_TABLE_END - - -// Global undefs -#undef INT -#undef TINYINT -#undef INTEGER -#undef BIGINT -#undef VARCHAR -#undef TEXT - -#undef SQL -#undef TABLE_CONSTRAINTS -#undef OPTIONAL -#undef DATABASE_START -#undef DATABASE_END - -} //namespace ORM -} //namespace DB -} //namespace VcoreDPL - -#undef ORM_GENERATOR_DATABASE_NAME -#undef ORM_GENERATOR_DATABASE_NAME_LOCAL diff --git a/vcore/src/dpl/db/include/dpl/db/orm_interface.h b/vcore/src/dpl/db/include/dpl/db/orm_interface.h deleted file mode 100644 index 025c642..0000000 --- a/vcore/src/dpl/db/include/dpl/db/orm_interface.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file orm_interface.h - * @author Lukasz Marek (l.marek@samsung.com) - * @version 1.0 - */ - -#include -#include - -#ifndef DPL_ORM_INTERFACE_H -#define DPL_ORM_INTERFACE_H - -namespace VcoreDPL { -namespace DB { -namespace ORM { -class IOrmInterface -{ - public: - virtual ~IOrmInterface() {} - virtual VcoreDPL::DB::SqlConnection::DataCommand *AllocDataCommand( - const std::string &statement) = 0; - virtual void FreeDataCommand(VcoreDPL::DB::SqlConnection::DataCommand *command) - = 0; - virtual void TransactionBegin() = 0; - virtual void TransactionCommit() = 0; - virtual void TransactionRollback() = 0; - virtual VcoreDPL::DB::SqlConnection::RowID GetLastInsertRowID() = 0; -}; -} -} -} - -#endif diff --git a/vcore/src/dpl/db/include/dpl/db/orm_macros.h b/vcore/src/dpl/db/include/dpl/db/orm_macros.h deleted file mode 100644 index a038523..0000000 --- a/vcore/src/dpl/db/include/dpl/db/orm_macros.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file orm_macros.h - * @author Bartosz Janiak (b.janiak@samsung.com) - * @version 1.0 - * @brief Macro definitions for generating the SQL input file from - * database definition. - */ - -//Do not include this file directly! It is used only for SQL code generation. - -#define CREATE_TABLE(name) CREATE TABLE name( -#define COLUMN(name, type, ...) name type __VA_ARGS__, -#define COLUMN_NOT_NULL(name, type, ...) name type __VA_ARGS__ not null, -#define SQL(...) __VA_ARGS__ -#define TABLE_CONSTRAINTS(...) __VA_ARGS__, -#define CREATE_TABLE_END() CHECK(1) ); -#define DATABASE_START(db_name) -#define DATABASE_END() - diff --git a/vcore/src/dpl/db/include/dpl/db/sql_connection.h b/vcore/src/dpl/db/include/dpl/db/sql_connection.h deleted file mode 100644 index 56714ee..0000000 --- a/vcore/src/dpl/db/include/dpl/db/sql_connection.h +++ /dev/null @@ -1,519 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file sql_connection.h - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of SQL connection - */ -#ifndef DPL_SQL_CONNECTION_H -#define DPL_SQL_CONNECTION_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace VcoreDPL { -namespace DB { -/** - * SQL connection class - */ -class SqlConnection -{ - public: - /** - * SQL Exception classes - */ - class Exception - { - public: - DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base) - DECLARE_EXCEPTION_TYPE(Base, SyntaxError) - DECLARE_EXCEPTION_TYPE(Base, ConnectionBroken) - DECLARE_EXCEPTION_TYPE(Base, InternalError) - DECLARE_EXCEPTION_TYPE(Base, InvalidColumn) - }; - - typedef int ColumnIndex; - typedef int ArgumentIndex; - - /* - * SQL processed data command - */ - class DataCommand : - private Noncopyable - { - private: - SqlConnection *m_masterConnection; - sqlite3_stmt *m_stmt; - - void CheckBindResult(int result); - void CheckColumnIndex(SqlConnection::ColumnIndex column); - - DataCommand(SqlConnection *connection, const char *buffer); - - friend class SqlConnection; - - public: - virtual ~DataCommand(); - - /** - * Bind null to the prepared statement argument - * - * @param position Index of argument to bind value to - */ - void BindNull(ArgumentIndex position); - - /** - * Bind int to the prepared statement argument - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindInteger(ArgumentIndex position, int value); - - /** - * Bind int8_t to the prepared statement argument - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindInt8(ArgumentIndex position, int8_t value); - - /** - * Bind int16 to the prepared statement argument - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindInt16(ArgumentIndex position, int16_t value); - - /** - * Bind int32 to the prepared statement argument - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindInt32(ArgumentIndex position, int32_t value); - - /** - * Bind int64 to the prepared statement argument - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindInt64(ArgumentIndex position, int64_t value); - - /** - * Bind float to the prepared statement argument - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindFloat(ArgumentIndex position, float value); - - /** - * Bind double to the prepared statement argument - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindDouble(ArgumentIndex position, double value); - - /** - * Bind string to the prepared statement argument - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindString(ArgumentIndex position, const char *value); - - /** - * Bind string to the prepared statement argument - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindString(ArgumentIndex position, const String& value); - - /** - * Bind optional int to the prepared statement argument. - * If optional is not set null will be bound - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindInteger(ArgumentIndex position, const boost::optional &value); - - /** - * Bind optional int8 to the prepared statement argument. - * If optional is not set null will be bound - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindInt8(ArgumentIndex position, const boost::optional &value); - - /** - * Bind optional int16 to the prepared statement argument. - * If optional is not set null will be bound - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindInt16(ArgumentIndex position, const boost::optional &value); - - /** - * Bind optional int32 to the prepared statement argument. - * If optional is not set null will be bound - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindInt32(ArgumentIndex position, const boost::optional &value); - - /** - * Bind optional int64 to the prepared statement argument. - * If optional is not set null will be bound - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindInt64(ArgumentIndex position, const boost::optional &value); - - /** - * Bind optional float to the prepared statement argument. - * If optional is not set null will be bound - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindFloat(ArgumentIndex position, const boost::optional &value); - - /** - * Bind optional double to the prepared statement argument. - * If optional is not set null will be bound - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindDouble(ArgumentIndex position, const boost::optional &value); - - /** - * Bind optional string to the prepared statement argument. - * If optional is not set null will be bound - * - * @param position Index of argument to bind value to - * @param value Value to bind - */ - void BindString(ArgumentIndex position, const boost::optional &value); - - /** - * Execute the prepared statement and/or move - * to the next row of the result - * - * @return True when there was a row returned - */ - bool Step(); - - /** - * Reset prepared statement's arguments - * All parameters will become null - */ - void Reset(); - - /** - * Checks whether column value is null - * - * @throw Exception::InvalidColumn - */ - bool IsColumnNull(ColumnIndex column); - - /** - * Get integer value from column in current row. - * - * @throw Exception::InvalidColumn - */ - int GetColumnInteger(ColumnIndex column); - - /** - * Get int8 value from column in current row. - * - * @throw Exception::InvalidColumn - */ - int8_t GetColumnInt8(ColumnIndex column); - - /** - * Get int16 value from column in current row. - * - * @throw Exception::InvalidColumn - */ - int16_t GetColumnInt16(ColumnIndex column); - /** - * Get int32 value from column in current row. - * - * @throw Exception::InvalidColumn - */ - int32_t GetColumnInt32(ColumnIndex column); - - /** - * Get int64 value from column in current row. - * - * @throw Exception::InvalidColumn - */ - int64_t GetColumnInt64(ColumnIndex column); - - /** - * Get float value from column in current row. - * - * @throw Exception::InvalidColumn - */ - float GetColumnFloat(ColumnIndex column); - - /** - * Get double value from column in current row. - * - * @throw Exception::InvalidColumn - */ - double GetColumnDouble(ColumnIndex column); - - /** - * Get string value from column in current row. - * - * @throw Exception::InvalidColumn - */ - std::string GetColumnString(ColumnIndex column); - - /** - * Get optional integer value from column in current row. - * - * @throw Exception::InvalidColumn - */ - boost::optional GetColumnOptionalInteger(ColumnIndex column); - - /** - * Get optional int8 value from column in current row. - * - * @throw Exception::InvalidColumn - */ - boost::optional GetColumnOptionalInt8(ColumnIndex column); - - /** - * Get optional int16value from column in current row. - * - * @throw Exception::InvalidColumn - */ - boost::optional GetColumnOptionalInt16(ColumnIndex column); - - /** - * Get optional int32 value from column in current row. - * - * @throw Exception::InvalidColumn - */ - boost::optional GetColumnOptionalInt32(ColumnIndex column); - - /** - * Get optional int64 value from column in current row. - * - * @throw Exception::InvalidColumn - */ - boost::optional GetColumnOptionalInt64(ColumnIndex column); - - /** - * Get optional float value from column in current row. - * - * @throw Exception::InvalidColumn - */ - boost::optional GetColumnOptionalFloat(ColumnIndex column); - - /** - * Get optional double value from column in current row. - * - * @throw Exception::InvalidColumn - */ - boost::optional GetColumnOptionalDouble(ColumnIndex column); - - /** - * Get optional string value from column in current row. - * - * @throw Exception::InvalidColumn - */ - boost::optional GetColumnOptionalString(ColumnIndex column); - }; - - // Move on copy semantics - typedef std::auto_ptr DataCommandAutoPtr; - - // Open flags - class Flag - { - public: - enum Type - { - None = 1 << 0, - UseLucene = 1 << 1 - }; - - enum Option - { - RO = SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READONLY, - /** - * *TODO: please remove CREATE option from RW flag when all places - * that need that switched do CRW - */ - RW = SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READWRITE | - SQLITE_OPEN_CREATE, - CRW = RW | SQLITE_OPEN_CREATE - }; - }; - - // RowID - typedef sqlite3_int64 RowID; - - /** - * Synchronization object used to synchronize SQL connection - * to the same database across different threads and processes - */ - class SynchronizationObject - { - public: - virtual ~SynchronizationObject() {} - - /** - * Synchronizes SQL connection for multiple clients. - */ - virtual void Synchronize() = 0; - - /** - * Notify all waiting clients that the connection is no longer locked. - */ - virtual void NotifyAll() = 0; - }; - - protected: - sqlite3 *m_connection; - - // Options - bool m_usingLucene; - - // Stored data procedures - int m_dataCommandsCount; - - // Synchronization object - std::unique_ptr m_synchronizationObject; - - virtual void Connect(const std::string &address, - Flag::Type = Flag::None, Flag::Option = Flag::RO); - virtual void Disconnect(); - - void TurnOnForeignKeys(); - - static SynchronizationObject *AllocDefaultSynchronizationObject(); - - public: - /** - * Open SQL connection - * - * Synchronization is archieved by using provided asynchronization object. - * If synchronizationObject is set to NULL, so synchronization is performed. - * Ownership of the synchronization object is transfered to sql connection - * object. - * - * @param address Database file name - * @param flags Open flags - * @param synchronizationObject A synchronization object to use. - */ - explicit SqlConnection(const std::string &address = std::string(), - Flag::Type flags = Flag::None, - Flag::Option options = Flag::RO, - SynchronizationObject *synchronizationObject = - AllocDefaultSynchronizationObject()); - - /** - * Destructor - */ - virtual ~SqlConnection(); - - /** - * Execute SQL command without result - * - * @param format - * @param ... - */ - void ExecCommand(const char *format, ...) DPL_DEPRECATED_WITH_MESSAGE( - "To prevent sql injection do not use this \ - method for direct sql execution"); - - /** - * Execute BEGIN; command to start new transaction - * - */ - void BeginTransaction(); - - /** - * Execute ROLLBACK; command to discard changes made - * - */ - void RollbackTransaction(); - - /** - * Execute COMMIT; command to commit changes in database - * - */ - void CommitTransaction(); - - /** - * Prepare stored procedure - * - * @param format SQL statement - * @return Data command representing stored procedure - */ - DataCommandAutoPtr PrepareDataCommand(const char *format, ...); - - /** - * Check whether given table exists - * - * @param tableName Name of the table to check - * @return True if given table name exists - */ - bool CheckTableExist(const char *tableName); - - /** - * Get last insert operation new row id - * - * @return Row ID - */ - RowID GetLastInsertRowID() const; - - private: - int db_util_open_with_options(const char *pszFilePath, sqlite3 **ppDB, - int flags, const char *zVfs); - int db_util_close(sqlite3 *pDB); - -}; -} // namespace DB -} // namespace VcoreDPL - -#endif // DPL_SQL_CONNECTION_H diff --git a/vcore/src/dpl/db/include/dpl/db/thread_database_support.h b/vcore/src/dpl/db/include/dpl/db/thread_database_support.h deleted file mode 100644 index ce8a11a..0000000 --- a/vcore/src/dpl/db/include/dpl/db/thread_database_support.h +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file thread_database_support.h - * @author Przemyslaw Dobrowolski (p.dobrowolsk) - * @version 1.0 - * @brief This file contains the declaration of thread database support - */ - -#ifndef DPL_THREAD_DATABASE_SUPPORT_H -#define DPL_THREAD_DATABASE_SUPPORT_H - -#include -#include -#include -#include -#include -#include - -namespace VcoreDPL { -namespace DB { -/** - * Thread database support - * - * Associate database connection with thread lifecycle - * - */ - -class ThreadDatabaseSupport : - public VcoreDPL::DB::ORM::IOrmInterface -{ - private: - typedef VcoreDPL::DB::SqlConnection *SqlConnectionPtr; - typedef VcoreDPL::ThreadLocalVariable TLVSqlConnectionPtr; - typedef VcoreDPL::ThreadLocalVariable TLVSizeT; - typedef VcoreDPL::ThreadLocalVariable TLVBool; - - TLVSqlConnectionPtr m_connection; - TLVBool m_linger; - TLVSizeT m_refCounter; - TLVSizeT m_transactionDepth; - TLVSizeT m_attachCount; - TLVBool m_transactionCancel; - std::string m_address; - VcoreDPL::DB::SqlConnection::Flag::Type m_flags; - - TLVSqlConnectionPtr &Connection() - { - return m_connection; - } - - TLVBool &Linger() - { - return m_linger; - } - - TLVSizeT &RefCounter() - { - return m_refCounter; - } - - TLVSizeT &TransactionDepth() - { - return m_transactionDepth; - } - - TLVSizeT &AttachCount() - { - return m_attachCount; - } - - TLVBool &TransactionCancel() - { - return m_transactionCancel; - } - - void CheckedConnectionDelete() - { - Assert(!Connection().IsNull()); - Assert(*Linger() == true); - - if (*RefCounter() > 0 || *AttachCount() > 0) { - return; - } - - // Destroy connection - LogDebug("Destroying thread database connection: " << m_address); - - delete *Connection(); - - // Blocking destroy - Connection().GuardValue(false); - Linger().GuardValue(false); - RefCounter().GuardValue(false); - TransactionCancel().GuardValue(false); - TransactionDepth().GuardValue(false); - AttachCount().GuardValue(false); - - Connection().Reset(); - Linger().Reset(); - RefCounter().Reset(); - TransactionCancel().Reset(); - TransactionDepth().Reset(); - AttachCount().Reset(); - } - - void TransactionUnref() - { - LogDebug("Unref transaction"); - - if (--(*TransactionDepth()) == 0) { - LogDebug("Transaction is finalized"); - - if (*TransactionCancel()) { - LogDebug("Transaction will be rolled back"); - (*Connection())->RollbackTransaction(); - } else { - LogDebug("Transaction will be commited"); - (*Connection())->CommitTransaction(); - } - } - } - - public: - ThreadDatabaseSupport(const std::string &address, - VcoreDPL::DB::SqlConnection::Flag::Type flags) : - m_address(address), - m_flags(flags) - {} - - virtual ~ThreadDatabaseSupport() - {} - - void AttachToThread( - VcoreDPL::DB::SqlConnection::Flag::Option options = - VcoreDPL::DB::SqlConnection::Flag::RO) - { - Linger() = false; - - if (!Connection().IsNull()) { - // Add reference - ++*AttachCount(); - return; - } - - // Initialize SQL connection described in traits - LogDebug("Attaching thread database connection: " << m_address); - - Connection() = new VcoreDPL::DB::SqlConnection( - m_address.c_str(), m_flags, options); - - RefCounter() = 0; - - AttachCount() = 1; - - //Init Transaction related variables - TransactionDepth() = 0; - TransactionCancel() = false; - - // Blocking destroy - Connection().GuardValue(true); - Linger().GuardValue(true); - RefCounter().GuardValue(true); - TransactionDepth().GuardValue(true); - AttachCount().GuardValue(true); - TransactionCancel().GuardValue(true); - } - - void DetachFromThread() - { - // Calling thread must support thread database connections - Assert(!Connection().IsNull()); - - // Remove reference - --*AttachCount(); - - if (*AttachCount() > 0) { - return; - } - - // It must not be in linger state yet - Assert(*Linger() == false); - - LogDebug("Detaching thread database connection: " << m_address); - - // Enter linger state - *Linger() = true; - - // Checked delete - CheckedConnectionDelete(); - } - - bool IsAttached() - { - return !AttachCount().IsNull() && *AttachCount() > 0; - } - - VcoreDPL::DB::SqlConnection::DataCommand *AllocDataCommand( - const std::string &statement) - { - // Calling thread must support thread database connections - Assert(!Connection().IsNull()); - - // Calling thread must not be in linger state - Assert(*Linger() == false); - - // Add reference - ++*RefCounter(); - - // Create new unmanaged data command - return (*Connection())->PrepareDataCommand(statement.c_str()).release(); - } - - void FreeDataCommand(VcoreDPL::DB::SqlConnection::DataCommand *command) - { - // Calling thread must support thread database connections - Assert(!Connection().IsNull()); - - // Delete data command - delete command; - - // Unreference SQL connection - --*RefCounter(); - - // If it is linger state, connection may be destroyed - if (*Linger() == true) { - CheckedConnectionDelete(); - } - } - - void TransactionBegin() - { - // Calling thread must support thread database connections - Assert(!Connection().IsNull()); - - LogDebug("Begin transaction"); - - // Addref transaction - if (++(*TransactionDepth()) == 1) { - LogDebug("Transaction is initialized"); - - TransactionCancel() = false; - (*Connection())->BeginTransaction(); - } - } - - void TransactionCommit() - { - // Calling thread must support thread database connections - Assert(!Connection().IsNull()); - - LogDebug("Commit transaction"); - - // Unref transation - TransactionUnref(); - } - - void TransactionRollback() - { - // Calling thread must support thread database connections - Assert(!Connection().IsNull()); - - // Cancel and unref transaction - TransactionCancel() = true; - TransactionUnref(); - } - - VcoreDPL::DB::SqlConnection::RowID GetLastInsertRowID() - { - // Calling thread must support thread database connections - Assert(!Connection().IsNull()); - - return (*Connection())->GetLastInsertRowID(); - } - - bool CheckTableExist(const char *name) - { - // Calling thread must support thread database connections - Assert(!Connection().IsNull()); - - return (*Connection())->CheckTableExist(name); - } -}; -} -} - -#endif // DPL_THREAD_DATABASE_SUPPORT_H diff --git a/vcore/src/dpl/db/src/orm.cpp b/vcore/src/dpl/db/src/orm.cpp deleted file mode 100644 index 6e79d46..0000000 --- a/vcore/src/dpl/db/src/orm.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file orm.cpp - * @author Bartosz Janiak (b.janiak@samsung.com) - * @version 1.0 - * @brief Static definitions and function template specialziations of - * DPL-ORM. - */ -#include -#include - -namespace VcoreDPL { -namespace DB { -namespace ORM { -namespace RelationTypes { -const char Equal[] = "="; -const char LessThan[] = "<"; -const char And[] = "AND"; -const char Or[] = "OR"; -const char Is[] = "IS"; -const char In[] = "IN"; -} - -template<> -int GetColumnFromCommand(ColumnIndex columnIndex, - DataCommand *command) -{ - return command->GetColumnInteger(columnIndex); -} - -template<> -VcoreDPL::String GetColumnFromCommand(ColumnIndex columnIndex, - DataCommand *command) -{ - return VcoreDPL::FromUTF8String(command->GetColumnString(columnIndex)); -} - -template<> -OptionalInteger GetColumnFromCommand(ColumnIndex columnIndex, - DataCommand *command) -{ - return command->GetColumnOptionalInteger(columnIndex); -} - -template<> -OptionalString GetColumnFromCommand(ColumnIndex columnIndex, - DataCommand *command) -{ - return command->GetColumnOptionalString(columnIndex); -} - -template<> -double GetColumnFromCommand(ColumnIndex columnIndex, - DataCommand *command) -{ - return command->GetColumnDouble(columnIndex); -} - -void DataCommandUtils::BindArgument(DataCommand *command, - ArgumentIndex index, - int argument) -{ - command->BindInteger(index, argument); -} - -void DataCommandUtils::BindArgument(DataCommand *command, - ArgumentIndex index, - const OptionalInteger& argument) -{ - command->BindInteger(index, argument); -} - -void DataCommandUtils::BindArgument(DataCommand *command, - ArgumentIndex index, - const VcoreDPL::String& argument) -{ - command->BindString(index, argument); -} - -void DataCommandUtils::BindArgument(DataCommand *command, - ArgumentIndex index, - const OptionalString& argument) -{ - command->BindString(index, argument); -} -} -} -} diff --git a/vcore/src/dpl/db/src/sql_connection.cpp b/vcore/src/dpl/db/src/sql_connection.cpp deleted file mode 100644 index fa238cd..0000000 --- a/vcore/src/dpl/db/src/sql_connection.cpp +++ /dev/null @@ -1,896 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file sql_connection.cpp - * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) - * @version 1.0 - * @brief This file is the implementation file of SQL connection - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace VcoreDPL { -namespace DB { -namespace // anonymous -{ -class ScopedNotifyAll : - public Noncopyable -{ - private: - SqlConnection::SynchronizationObject *m_synchronizationObject; - - public: - explicit ScopedNotifyAll( - SqlConnection::SynchronizationObject *synchronizationObject) : - m_synchronizationObject(synchronizationObject) - {} - - ~ScopedNotifyAll() - { - if (!m_synchronizationObject) { - return; - } - - LogDebug("Notifying after successful synchronize"); - m_synchronizationObject->NotifyAll(); - } -}; -} // namespace anonymous - -SqlConnection::DataCommand::DataCommand(SqlConnection *connection, - const char *buffer) : - m_masterConnection(connection), - m_stmt(NULL) -{ - Assert(connection != NULL); - - // Notify all after potentially synchronized database connection access - ScopedNotifyAll notifyAll(connection->m_synchronizationObject.get()); - - for (;;) { - int ret = sqlite3_prepare_v2(connection->m_connection, - buffer, strlen(buffer), - &m_stmt, NULL); - - if (ret == SQLITE_OK) { - LogDebug("Data command prepared successfuly"); - break; - } else if (ret == SQLITE_BUSY) { - LogDebug("Collision occurred while preparing SQL command"); - - // Synchronize if synchronization object is available - if (connection->m_synchronizationObject) { - LogDebug("Performing synchronization"); - connection->m_synchronizationObject->Synchronize(); - continue; - } - - // No synchronization object defined. Fail. - } - - // Fatal error - const char *error = sqlite3_errmsg(m_masterConnection->m_connection); - - LogDebug("SQL prepare data command failed"); - LogDebug(" Statement : " << buffer); - LogDebug(" Error : " << error); - - ThrowMsg(Exception::SyntaxError, error); - } - - LogDebug("Prepared data command : " << buffer); - - // Increment stored data command count - ++m_masterConnection->m_dataCommandsCount; -} - -SqlConnection::DataCommand::~DataCommand() -{ - LogDebug("SQL data command finalizing"); - - if (sqlite3_finalize(m_stmt) != SQLITE_OK) { - LogDebug("Failed to finalize data command"); - } - - // Decrement stored data command count - --m_masterConnection->m_dataCommandsCount; -} - -void SqlConnection::DataCommand::CheckBindResult(int result) -{ - if (result != SQLITE_OK) { - const char *error = sqlite3_errmsg( - m_masterConnection->m_connection); - - LogDebug("Failed to bind SQL statement parameter"); - LogDebug(" Error : " << error); - - ThrowMsg(Exception::SyntaxError, error); - } -} - -void SqlConnection::DataCommand::BindNull( - SqlConnection::ArgumentIndex position) -{ - CheckBindResult(sqlite3_bind_null(m_stmt, position)); - LogDebug("SQL data command bind null: [" << position << "]"); -} - -void SqlConnection::DataCommand::BindInteger( - SqlConnection::ArgumentIndex position, - int value) -{ - CheckBindResult(sqlite3_bind_int(m_stmt, position, value)); - LogDebug("SQL data command bind integer: [" << position << "] -> " << value); -} - -void SqlConnection::DataCommand::BindInt8( - SqlConnection::ArgumentIndex position, - int8_t value) -{ - CheckBindResult(sqlite3_bind_int(m_stmt, position, - static_cast(value))); - LogDebug("SQL data command bind int8: [" << position << "] -> " << value); -} - -void SqlConnection::DataCommand::BindInt16( - SqlConnection::ArgumentIndex position, - int16_t value) -{ - CheckBindResult(sqlite3_bind_int(m_stmt, position, - static_cast(value))); - LogDebug("SQL data command bind int16: [" << position << "] -> " << value);} - -void SqlConnection::DataCommand::BindInt32( - SqlConnection::ArgumentIndex position, - int32_t value) -{ - CheckBindResult(sqlite3_bind_int(m_stmt, position, - static_cast(value))); - LogDebug("SQL data command bind int32: [" << position << "] -> " << value); -} - -void SqlConnection::DataCommand::BindInt64( - SqlConnection::ArgumentIndex position, - int64_t value) -{ - CheckBindResult(sqlite3_bind_int64(m_stmt, position, - static_cast(value))); - LogDebug("SQL data command bind int64: [" << position << "] -> " << value); -} - -void SqlConnection::DataCommand::BindFloat( - SqlConnection::ArgumentIndex position, - float value) -{ - CheckBindResult(sqlite3_bind_double(m_stmt, position, - static_cast(value))); - LogDebug("SQL data command bind float: [" << position << "] -> " << value); -} - -void SqlConnection::DataCommand::BindDouble( - SqlConnection::ArgumentIndex position, - double value) -{ - CheckBindResult(sqlite3_bind_double(m_stmt, position, value)); - LogDebug("SQL data command bind double: [" << position << "] -> " << value); -} - -void SqlConnection::DataCommand::BindString( - SqlConnection::ArgumentIndex position, - const char *value) -{ - if (!value) { - BindNull(position); - return; - } - - // Assume that text may disappear - CheckBindResult(sqlite3_bind_text(m_stmt, position, - value, strlen(value), - SQLITE_TRANSIENT)); - - LogDebug("SQL data command bind string: [" << position << "] -> " << value); -} - -void SqlConnection::DataCommand::BindString( - SqlConnection::ArgumentIndex position, - const String &value) -{ - BindString(position, ToUTF8String(value).c_str()); -} - -void SqlConnection::DataCommand::BindInteger( - SqlConnection::ArgumentIndex position, - const boost::optional &value) -{ - if (!value) { - BindNull(position); - } else { - BindInteger(position, *value); - } -} - -void SqlConnection::DataCommand::BindInt8( - SqlConnection::ArgumentIndex position, - const boost::optional &value) -{ - if (!value) { - BindNull(position); - } else { - BindInt8(position, *value); - } -} - -void SqlConnection::DataCommand::BindInt16( - SqlConnection::ArgumentIndex position, - const boost::optional &value) -{ - if (!value) { - BindNull(position); - } else { - BindInt16(position, *value); - } -} - -void SqlConnection::DataCommand::BindInt32( - SqlConnection::ArgumentIndex position, - const boost::optional &value) -{ - if (!value) { - BindNull(position); - } else { - BindInt32(position, *value); - } -} - -void SqlConnection::DataCommand::BindInt64( - SqlConnection::ArgumentIndex position, - const boost::optional &value) -{ - if (!value) { - BindNull(position); - } else { - BindInt64(position, *value); - } -} - -void SqlConnection::DataCommand::BindFloat( - SqlConnection::ArgumentIndex position, - const boost::optional &value) -{ - if (!value) { - BindNull(position); - } else { - BindFloat(position, *value); - } -} - -void SqlConnection::DataCommand::BindDouble( - SqlConnection::ArgumentIndex position, - const boost::optional &value) -{ - if (!value) { - BindNull(position); - } else { - BindDouble(position, *value); - } -} - -void SqlConnection::DataCommand::BindString( - SqlConnection::ArgumentIndex position, - const boost::optional &value) -{ - if (!!value) { - BindString(position, ToUTF8String(*value).c_str()); - } else { - BindNull(position); - } -} - -bool SqlConnection::DataCommand::Step() -{ - // Notify all after potentially synchronized database connection access - ScopedNotifyAll notifyAll( - m_masterConnection->m_synchronizationObject.get()); - - for (;;) { - int ret = sqlite3_step(m_stmt); - - if (ret == SQLITE_ROW) { - LogDebug("SQL data command step ROW"); - return true; - } else if (ret == SQLITE_DONE) { - LogDebug("SQL data command step DONE"); - return false; - } else if (ret == SQLITE_BUSY) { - LogDebug("Collision occurred while executing SQL command"); - - // Synchronize if synchronization object is available - if (m_masterConnection->m_synchronizationObject) { - LogDebug("Performing synchronization"); - - m_masterConnection-> - m_synchronizationObject->Synchronize(); - - continue; - } - - // No synchronization object defined. Fail. - } - - // Fatal error - const char *error = sqlite3_errmsg(m_masterConnection->m_connection); - - LogDebug("SQL step data command failed"); - LogDebug(" Error : " << error); - - ThrowMsg(Exception::InternalError, error); - } -} - -void SqlConnection::DataCommand::Reset() -{ - /* - * According to: - * http://www.sqlite.org/c3ref/stmt.html - * - * if last sqlite3_step command on this stmt returned an error, - * then sqlite3_reset will return that error, althought it is not an error. - * So sqlite3_reset allways succedes. - */ - sqlite3_reset(m_stmt); - - LogDebug("SQL data command reset"); -} - -void SqlConnection::DataCommand::CheckColumnIndex( - SqlConnection::ColumnIndex column) -{ - if (column < 0 || column >= sqlite3_column_count(m_stmt)) { - ThrowMsg(Exception::InvalidColumn, "Column index is out of bounds"); - } -} - -bool SqlConnection::DataCommand::IsColumnNull( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column type: [" << column << "]"); - CheckColumnIndex(column); - return sqlite3_column_type(m_stmt, column) == SQLITE_NULL; -} - -int SqlConnection::DataCommand::GetColumnInteger( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column integer: [" << column << "]"); - CheckColumnIndex(column); - int value = sqlite3_column_int(m_stmt, column); - LogDebug(" Value : " << value); - return value; -} - -int8_t SqlConnection::DataCommand::GetColumnInt8( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column int8: [" << column << "]"); - CheckColumnIndex(column); - int8_t value = static_cast(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value : " << value); - return value; -} - -int16_t SqlConnection::DataCommand::GetColumnInt16( - SqlConnection::ColumnIndex column) -{ - LgDebug("SQL data command get column int16: [" << column << "]"); - CheckColumnIndex(column); - int16_t value = static_cast(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value : " << value); - return value; -} - -int32_t SqlConnection::DataCommand::GetColumnInt32( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column int32: [" << column << "]"); - CheckColumnIndex(column); - int32_t value = static_cast(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value : " << value); - return value; -} - -int64_t SqlConnection::DataCommand::GetColumnInt64( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column int64: [" << column << "]"); - CheckColumnIndex(column); - int64_t value = static_cast(sqlite3_column_int64(m_stmt, column)); - LogDebug(" Value : " << value); - return value; -} - -float SqlConnection::DataCommand::GetColumnFloat( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column float: [" << column << "]"); - CheckColumnIndex(column); - float value = static_cast(sqlite3_column_double(m_stmt, column)); - LogDebug(" Value : " << value); - return value; -} - -double SqlConnection::DataCommand::GetColumnDouble( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column double: [" << column << "]"); - CheckColumnIndex(column); - double value = sqlite3_column_double(m_stmt, column); - LogDebug(" Value : " << value); - return value; -} - -std::string SqlConnection::DataCommand::GetColumnString( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column string: [" << column << "]"); - CheckColumnIndex(column); - - const char *value = reinterpret_cast( - sqlite3_column_text(m_stmt, column)); - - LogDebug(" Value : " << value); - - if (value == NULL) { - return std::string(); - } - - return std::string(value); -} - -boost::optional SqlConnection::DataCommand::GetColumnOptionalInteger( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column optional integer: [" << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return boost::optional(); - } - int value = sqlite3_column_int(m_stmt, column); - LogDebug(" Value : " << value); - return boost::optional(value); -} - -boost::optional SqlConnection::DataCommand::GetColumnOptionalInt8( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column optional int8: [" << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return boost::optional(); - } - int8_t value = static_cast(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value: " << value); - return boost::optional(value); -} - -boost::optional SqlConnection::DataCommand::GetColumnOptionalInt16( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column optional int16: [" << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return boost::optional(); - } - int16_t value = static_cast(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value : " << value); - return boost::optional(value); -} - -boost::optional SqlConnection::DataCommand::GetColumnOptionalInt32( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column optional int32: [" << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return boost::optional(); - } - int32_t value = static_cast(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value : " << value); - return boost::optional(value); -} - -boost::optional SqlConnection::DataCommand::GetColumnOptionalInt64( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column optional int64: [" << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return boost::optional(); - } - int64_t value = static_cast(sqlite3_column_int64(m_stmt, column)); - LogDebug(" Value : " << value); - return boost::optional(value); -} - -boost::optional SqlConnection::DataCommand::GetColumnOptionalFloat( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column optional float: [" << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return boost::optional(); - } - float value = static_cast(sqlite3_column_double(m_stmt, column)); - LogDebug(" Value : " << value); - return boost::optional(value); -} - -boost::optional SqlConnection::DataCommand::GetColumnOptionalDouble( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column optional double: [" << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return boost::optional(); - } - double value = sqlite3_column_double(m_stmt, column); - LogDebug(" Value : " << value); - return boost::optional(value); -} - -boost::optional SqlConnection::DataCommand::GetColumnOptionalString( - SqlConnection::ColumnIndex column) -{ - LogDebug("SQL data command get column optional string: [" << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return boost::optional(); - } - const char *value = reinterpret_cast( - sqlite3_column_text(m_stmt, column)); - LogDebug(" Value : " << value); - String s = FromUTF8String(value); - return boost::optional(s); -} - -void SqlConnection::Connect(const std::string &address, - Flag::Type type, - Flag::Option flag) -{ - if (m_connection != NULL) { - LogDebug("Already connected."); - return; - } - LogDebug("Connecting to DB: " << address << "..."); - - // Connect to database - int result; - if (type & Flag::UseLucene) { - result = db_util_open_with_options( - address.c_str(), - &m_connection, - flag, - NULL); - - m_usingLucene = true; - LogDebug("Lucene index enabled"); - } else { - result = sqlite3_open_v2( - address.c_str(), - &m_connection, - flag, - NULL); - - m_usingLucene = false; - LogDebug("Lucene index disabled"); - } - - if (result == SQLITE_OK) { - LogDebug("Connected to DB"); - } else { - LogDebug("Failed to connect to DB!"); - ThrowMsg(Exception::ConnectionBroken, address); - } - - // Enable foreign keys - TurnOnForeignKeys(); -} - -void SqlConnection::Disconnect() -{ - if (m_connection == NULL) { - LogDebug("Already disconnected."); - return; - } - - LogDebug("Disconnecting from DB..."); - - // All stored data commands must be deleted before disconnect - AssertMsg(m_dataCommandsCount == 0, - "All stored procedures must be deleted" - " before disconnecting SqlConnection"); - - int result; - - if (m_usingLucene) { - result = db_util_close(m_connection); - } else { - result = sqlite3_close(m_connection); - } - - if (result != SQLITE_OK) { - const char *error = sqlite3_errmsg(m_connection); - LogDebug("SQL close failed"); - LogDebug(" Error : " << error); - Throw(Exception::InternalError); - } - - m_connection = NULL; - - LogDebug("Disconnected from DB"); -} - -bool SqlConnection::CheckTableExist(const char *tableName) -{ - if (m_connection == NULL) { - LogDebug("Cannot execute command. Not connected to DB!"); - return false; - } - - DataCommandAutoPtr command = - PrepareDataCommand("select tbl_name from sqlite_master where name=?;"); - - command->BindString(1, tableName); - - if (!command->Step()) { - LogDebug("No matching records in table"); - return false; - } - - return command->GetColumnString(0) == tableName; -} - -SqlConnection::SqlConnection(const std::string &address, - Flag::Type flag, - Flag::Option option, - SynchronizationObject *synchronizationObject) : - m_connection(NULL), - m_usingLucene(false), - m_dataCommandsCount(0), - m_synchronizationObject(synchronizationObject) -{ - LogDebug("Opening database connection to : " << address); - - // Connect to DB - SqlConnection::Connect(address, flag, option); - - if (!m_synchronizationObject) { - LogDebug("No synchronization object defined"); - } -} - -SqlConnection::~SqlConnection() -{ - LogDebug("Closing database connection"); - - // Disconnect from DB - Try - { - SqlConnection::Disconnect(); - } - Catch(Exception::Base) - { - LogDebug("Failed to disconnect from database"); - } -} - -void SqlConnection::ExecCommand(const char *format, ...) -{ - if (m_connection == NULL) { - LogDebug("Cannot execute command. Not connected to DB!"); - return; - } - - if (format == NULL) { - LogDebug("Null query!"); - ThrowMsg(Exception::SyntaxError, "Null statement"); - } - - char *rawBuffer; - - va_list args; - va_start(args, format); - - if (vasprintf(&rawBuffer, format, args) == -1) { - rawBuffer = NULL; - } - - va_end(args); - - std::unique_ptr buffer(rawBuffer); - - if (!buffer) { - LogDebug("Failed to allocate statement string"); - return; - } - - LogDebug("Executing SQL command : " << buffer.get()); - - // Notify all after potentially synchronized database connection access - ScopedNotifyAll notifyAll(m_synchronizationObject.get()); - - for (;;) { - char *errorBuffer; - - int ret = sqlite3_exec(m_connection, - buffer.get(), - NULL, - NULL, - &errorBuffer); - - std::string errorMsg; - - // Take allocated error buffer - if (errorBuffer != NULL) { - errorMsg = errorBuffer; - sqlite3_free(errorBuffer); - } - - if (ret == SQLITE_OK) { - return; - } - - if (ret == SQLITE_BUSY) { - LogDebug("Collision occurred while executing SQL command"); - - // Synchronize if synchronization object is available - if (m_synchronizationObject) { - LogDebug("Performing synchronization"); - m_synchronizationObject->Synchronize(); - continue; - } - - // No synchronization object defined. Fail. - } - - // Fatal error - LogDebug("Failed to execute SQL command. Error : " << errorMsg); - ThrowMsg(Exception::SyntaxError, errorMsg); - } -} - -SqlConnection::DataCommandAutoPtr SqlConnection::PrepareDataCommand( - const char *format, - ...) -{ - if (m_connection == NULL) { - LogDebug("Cannot execute data command. Not connected to DB!"); - return DataCommandAutoPtr(); - } - - char *rawBuffer; - - va_list args; - va_start(args, format); - - if (vasprintf(&rawBuffer, format, args) == -1) { - rawBuffer = NULL; - } - - va_end(args); - - std::unique_ptr buffer(rawBuffer); - - if (!buffer) { - LogDebug("Failed to allocate statement string"); - return DataCommandAutoPtr(); - } - - LogDebug("Executing SQL data command : " << buffer.get()); - - return DataCommandAutoPtr(new DataCommand(this, buffer.get())); -} - -SqlConnection::RowID SqlConnection::GetLastInsertRowID() const -{ - return static_cast(sqlite3_last_insert_rowid(m_connection)); -} - -void SqlConnection::TurnOnForeignKeys() -{ - ExecCommand("PRAGMA foreign_keys = ON;"); -} - -void SqlConnection::BeginTransaction() -{ - ExecCommand("BEGIN;"); -} - -void SqlConnection::RollbackTransaction() -{ - ExecCommand("ROLLBACK;"); -} - -void SqlConnection::CommitTransaction() -{ - ExecCommand("COMMIT;"); -} - -SqlConnection::SynchronizationObject * -SqlConnection::AllocDefaultSynchronizationObject() -{ - return new NaiveSynchronizationObject(); -} - -int SqlConnection::db_util_open_with_options(const char *pszFilePath, sqlite3 **ppDB, - int flags, const char *zVfs) -{ - int mode; - - if((pszFilePath == NULL) || (ppDB == NULL)) { - LogWarning("sqlite3 handle null error"); - return SQLITE_ERROR; - } - - mode = R_OK; - - if((geteuid() != 0) && (access(pszFilePath, mode))) { - if(errno == EACCES) { - LogDebug("file access permission error"); - return SQLITE_PERM; - } - } - - /* Open DB */ - int rc = sqlite3_open_v2(pszFilePath, ppDB, flags, zVfs); - if (SQLITE_OK != rc) { - LogError("sqlite3_open_v2 error(" << rc << ")"); - return rc; - } - - //rc = __db_util_open(*ppDB); - - return rc; -} - - -int SqlConnection::db_util_close(sqlite3 *pDB) -{ - char *pszErrorMsg = NULL; - - /* Close DB */ - int rc = sqlite3_close(pDB); - if (SQLITE_OK != rc) { - LogWarning("Fail to change journal mode : " << pszErrorMsg); - sqlite3_free(pszErrorMsg); - return rc; - } - - return SQLITE_OK; -} - -} // namespace DB -} // namespace VcoreDPL diff --git a/vcore/src/dpl/db/src/thread_database_support.cpp b/vcore/src/dpl/db/src/thread_database_support.cpp deleted file mode 100644 index 101640f..0000000 --- a/vcore/src/dpl/db/src/thread_database_support.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file thread_database_support.cpp - * @author Przemyslaw Dobrowolski (p.dobrowolsk) - * @version 1.0 - * @brief This file contains the definition of thread database support - */ -#include -#include \ No newline at end of file diff --git a/vcore/src/dpl/test/include/dpl/test/process_pipe.h b/vcore/src/dpl/test/include/dpl/test/process_pipe.h deleted file mode 100644 index bfc124b..0000000 --- a/vcore/src/dpl/test/include/dpl/test/process_pipe.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file process_pipe.h - * @author Tomasz Iwanek (t.iwanek@samsung.com) - * @version 1.0 - * @brief This file is the implementation pipe from process - */ -#ifndef PROCESS_PIPE_H -#define PROCESS_PIPE_H - -#include -#include - -#include - -namespace VcoreDPL { - -class ProcessPipe : public FileInput -{ -public: - class Exception - { - public: - DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base) - DECLARE_EXCEPTION_TYPE(Base, DoubleOpen) - }; - - enum class PipeErrorPolicy - { - NONE, - OFF, - PIPE - }; - - explicit ProcessPipe(PipeErrorPolicy err = PipeErrorPolicy::NONE); - virtual ~ProcessPipe(); - - void Open(const std::string &command); - void Close(); - -private: - FILE * m_file; - PipeErrorPolicy m_errPolicy; -}; - -} - -#endif // PROCESS_PIPE_H diff --git a/vcore/src/dpl/test/src/process_pipe.cpp b/vcore/src/dpl/test/src/process_pipe.cpp deleted file mode 100644 index 6e4fb74..0000000 --- a/vcore/src/dpl/test/src/process_pipe.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file process_pipe.cpp - * @author Tomasz Iwanek (t.iwanek@samsung.com) - * @version 1.0 - * @brief This file is the implementation pipe from process - */ - -#include - -namespace VcoreDPL { - -ProcessPipe::ProcessPipe(PipeErrorPolicy err) : m_file(NULL), m_errPolicy(err) -{ -} - -ProcessPipe::~ProcessPipe() -{ -} - -void ProcessPipe::Open(const std::string & command) -{ - if(m_file != NULL) - { - ThrowMsg(Exception::DoubleOpen, "Trying to open pipe second time. Close it first"); - } - - std::string stdErrRedirection; - switch(m_errPolicy) - { - case PipeErrorPolicy::NONE: break; - case PipeErrorPolicy::OFF: stdErrRedirection = " 2>/dev/null"; break; - case PipeErrorPolicy::PIPE: stdErrRedirection = " 2>&1"; break; - default: break; - } - - std::string fcommand = command + stdErrRedirection; - FILE * file = popen(fcommand.c_str(), "r"); - - // Throw an exception if an error occurred - if (file == NULL) { - ThrowMsg(FileInput::Exception::OpenFailed, fcommand); - } - - // Save new descriptor - m_file = file; - m_fd = fileno(m_file); -} - -void ProcessPipe::Close() -{ - if (m_fd == -1) { - return; - } - - if (pclose(m_file) == -1) { - Throw(FileInput::Exception::CloseFailed); - } - - m_fd = -1; - m_file = NULL; -} - -} diff --git a/vcore/src/vcore/CRLCacheInterface.h b/vcore/src/vcore/CRLCacheInterface.h deleted file mode 100644 index 1d17078..0000000 --- a/vcore/src/vcore/CRLCacheInterface.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/*! - * @author Bartlomiej Grzelewski(b.grzelewski@samsung.com) - * @version 0.1 - * @file CRLCacheInterface.h - * @brief CRLCacheInterface definition. - */ -#ifndef _CRLCACHEINTERFACE_H_ -#define _CRLCACHEINTERFACE_H_ - -#include - -namespace ValidationCore { - -struct CRLCachedData -{ - std::string distribution_point; - std::string crl_body; - time_t next_update_time; -}; - -class CRLCacheInterface { -public: - virtual bool getCRLResponse(CRLCachedData *ptr) = 0; - virtual void setCRLResponse(CRLCachedData *ptr) = 0; -}; - -} // namespace ValidationCore - -#endif diff --git a/vcore/src/vcore/CertificateStorage.h b/vcore/src/vcore/CertificateStorage.h deleted file mode 100644 index 7fbcb6b..0000000 --- a/vcore/src/vcore/CertificateStorage.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -#ifndef VCORE_SRC_VCORE_CERTIFICATESTORAGE_H -#define VCORE_SRC_VCORE_CERTIFICATESTORAGE_H - -#include -#include - -namespace ValidationCore { -typedef std::list < X509* > X509CertificatesList; -} - -#endif // VCORE_SRC_VCORE_CERTIFICATESTORAGE_H diff --git a/vcore/src/vcore/IAbstractResponseCache.h b/vcore/src/vcore/IAbstractResponseCache.h deleted file mode 100644 index 2495d27..0000000 --- a/vcore/src/vcore/IAbstractResponseCache.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/** - * - * - * @file AbstractResponseCache.h - * @author Tomasz Swierczek (t.swierczek@samsung.com) - * @version 0.1 - * @brief Common interface for OCSP/CRL caches - */ - -#ifndef _VALIDATION_CORE_IABSTRACT_RESPONSE_CACHE_H_ -#define _VALIDATION_CORE_IABSTRACT_RESPONSE_CACHE_H_ - -#include - -namespace ValidationCore { - -class CertificateCollection; - -class IAbstractResponseCache { - public: - virtual VerificationStatus check(const CertificateCollection &certs) = 0; - virtual VerificationStatus checkEndEntity(CertificateCollection &certs) = 0; - virtual void updateCache() = 0; - - virtual ~IAbstractResponseCache() - { - } -}; - -} // namespace ValidationCore - -#endif /* _VALIDATION_CORE_IABSTRACT_RESPONSE_CACHE_H_ */ diff --git a/vcore/src/vcore/RevocationCheckerBase.cpp b/vcore/src/vcore/RevocationCheckerBase.cpp deleted file mode 100644 index 777da78..0000000 --- a/vcore/src/vcore/RevocationCheckerBase.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/*! - * @author Piotr Marcinkiewicz(p.marcinkiew@samsung.com) - * @version 0.4 - * @file CommonCertValidator.cpp - * @brief Common routines for certificate validation over OCSP and CRL - */ - -#include "RevocationCheckerBase.h" - -#include - -#include - -#include - -#include "Certificate.h" -#include "CertificateCollection.h" - -namespace { -const char DefaultBundlePatch[] = "/opt/etc/ssl/certs/ca-certificates.crt"; -} //Anonymous name space - -namespace ValidationCore { -CertificatePtr RevocationCheckerBase::loadPEMFile(const char* fileName) -{ - VcoreDPL::ScopedFClose fd(fopen(fileName, "rb")); - - // no such file, return NULL - if (!fd.Get()) { - return CertificatePtr(); - } - - // create a new X509 certificate basing on file - CertificatePtr cert(new Certificate(PEM_read_X509(fd.Get(), - NULL, - NULL, - NULL))); - return cert; -} - -bool RevocationCheckerBase::sortCertList(CertificateList &lCertificates) -{ - CertificateCollection collection; - collection.load(lCertificates); - - if (collection.sort()) { - lCertificates = collection.getChain(); - return true; - } - return false; -} - -} // ValidationCore diff --git a/vcore/src/vcore/RevocationCheckerBase.h b/vcore/src/vcore/RevocationCheckerBase.h deleted file mode 100644 index 3ce934d..0000000 --- a/vcore/src/vcore/RevocationCheckerBase.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/*! - * @author Piotr Marcinkiewicz(p.marcinkiew@samsung.com) - * @version 0.4 - * @file CommonCertValidator.h - * @brief Common routines for certificate validation over OCSP and CRL - */ - -#ifndef WRT_ENGINE_SRC_VALIDATION_CORE_REVOCATIONCHECKERBASE_H_ -#define WRT_ENGINE_SRC_VALIDATION_CORE_REVOCATIONCHECKERBASE_H_ - -#include - -#include "Certificate.h" - -namespace ValidationCore { -class RevocationCheckerBase -{ - public: - //! Loads a PEM file and returns X509 certificate object. - static CertificatePtr loadPEMFile(const char* path); - - //! Sorts a list of certficates and verifies them if they form - //! a valid chain - static bool sortCertList(CertificateList &cert) __attribute__((deprecated)); -}; -} // ValidationCore - -#endif //ifndef WRT_ENGINE_SRC_VALIDATION_CORE_REVOCATIONCHECKERBASE_H_ - diff --git a/vcore/src/vcore/SSLContainers.h b/vcore/src/vcore/SSLContainers.h deleted file mode 100644 index e18cb00..0000000 --- a/vcore/src/vcore/SSLContainers.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -#ifndef _SSLCONTAINERS_H -#define _SSLCONTAINERS_H - -#include -#include - -/* - * default deleter functor with no overloaded operator() - */ -template -struct MySSLFree {}; - -/* - * macro for defining custom deleters for openssl structs - * usage DECLARE_DELETER(OpenSSLType) - */ -#define DECLARE_DELETER(Type) template<> \ - struct MySSLFree \ - { \ - void operator() (Type* p) \ - { \ - Type ## _free(p); \ - } \ - \ - }; - -/* - * declare custom deleter for X509 structs - */ -DECLARE_DELETER(X509) -/* - * declare custom deleter for OCSP_REQUEST structs - */ -DECLARE_DELETER(OCSP_REQUEST) -/* - * declare custom deleter for OCSP_RESPONSE structs - */ -DECLARE_DELETER(OCSP_RESPONSE) -/* - * declare custom deleter for OCSP_CERTID structs - */ -DECLARE_DELETER(OCSP_CERTID) -/* - * declare custom deleter for OCSP_BASICRESP structs - */ -DECLARE_DELETER(OCSP_BASICRESP) -/* - * declare custom deleter for X509_STORE structs - */ -DECLARE_DELETER(X509_STORE) - -/* - * undef it, so anyone could use that macro name - */ -#undef DECLARE_DELETER - -/* - * OpenSSL smart container - * usage SSLSmartContainer smartptr = ptrToOpenSSLType - * remember to add OpenSSLType to macro list few lines above - */ -template > -class SSLSmartContainer -{ - public: - SSLSmartContainer() : m_pData(NULL) - { - } - - /* - * explicit constructor, we don't want any auto casting - */ - explicit SSLSmartContainer(T* pData) - { - m_pData = pData; - } - - /* - * overloaded assignment operator - */ - SSLSmartContainer & operator=(SSLSmartContainer& pContainer) - { - /* - * check if no assignment was done before - */ - if (this != &pContainer) { - // if so, free internal data - deleter ssl_free; - ssl_free(m_pData); - - // and assign new - m_pData = pContainer.m_pData; - - pContainer.m_pData = NULL; - } - - return *this; - } - - SSLSmartContainer & operator=(T* pData) - { - /* - * check if no assignment was done before - */ - if (m_pData != pData) { - // if so, free internal data - deleter ssl_free; - ssl_free(m_pData); - - // and assign new - m_pData = pData; - } - - return *this; - } - - ~SSLSmartContainer() - { - deleter ssl_free; - ssl_free(m_pData); - } - - /* - * overloaded operators for standardptr - like usage - */ - SSLSmartContainer & operator*() - { - return *m_pData; - } - SSLSmartContainer* operator->() - { - return m_pData; - } - - /* - * auto cast to T operator - */ - operator T *() const { return m_pData; - } - - /* - * detachs internal pointer from smart pointer - */ - T* DetachPtr() - { - T* pData = m_pData; - m_pData = NULL; - return pData; - } - - private: - /* - * blocked assignment from another types operator - */ - template - T & operator = (S& pContainer) - { - return *this; - } - - /* - * internal data - */ - T* m_pData; -}; - -#endif /* _SSLCONTAINERS_H */ - diff --git a/vcore/src/vcore/VerificationStatus.cpp b/vcore/src/vcore/VerificationStatus.cpp deleted file mode 100644 index 8007c0c..0000000 --- a/vcore/src/vcore/VerificationStatus.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/*! - * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) - * @version 0.2 - * @file VerficationStatus.cpp - * @brief OCSP/CRL status. - */ -#include - -namespace ValidationCore { - -VerificationStatusSet::VerificationStatusSet() - : m_verdictMap(0) -{} - -void VerificationStatusSet::add(VerificationStatus status) { - m_verdictMap |= status; -} - -bool VerificationStatusSet::contains(VerificationStatus status) const { - return m_verdictMap & status; -} - -bool VerificationStatusSet::isEmpty() const { - return 0 == m_verdictMap; -} - -void VerificationStatusSet::operator+=(const VerificationStatusSet &second) { - m_verdictMap |= second.m_verdictMap; -} - -void VerificationStatusSet::reset() { - m_verdictMap = 0; -} - -VerificationStatus VerificationStatusSet::convertToStatus() const -{ - if (m_verdictMap & VERIFICATION_STATUS_REVOKED) { - return VERIFICATION_STATUS_REVOKED; - } - - if (m_verdictMap & VERIFICATION_STATUS_VERIFICATION_ERROR) { - return VERIFICATION_STATUS_VERIFICATION_ERROR; - } - - if (m_verdictMap & VERIFICATION_STATUS_ERROR) { - return VERIFICATION_STATUS_ERROR; - } - - if (m_verdictMap & VERIFICATION_STATUS_UNKNOWN) { - return VERIFICATION_STATUS_UNKNOWN; - } - - if (m_verdictMap & VERIFICATION_STATUS_CONNECTION_FAILED) { - return VERIFICATION_STATUS_CONNECTION_FAILED; - } - - if (m_verdictMap & VERIFICATION_STATUS_NOT_SUPPORT) { - return VERIFICATION_STATUS_NOT_SUPPORT; - } - - if (m_verdictMap & VERIFICATION_STATUS_GOOD) { - return VERIFICATION_STATUS_GOOD; - } - - return VERIFICATION_STATUS_ERROR; -} -} // namespace ValidationCore diff --git a/vcore/src/vcore/VerificationStatus.h b/vcore/src/vcore/VerificationStatus.h deleted file mode 100644 index c43981c..0000000 --- a/vcore/src/vcore/VerificationStatus.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/*! - * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) - * @version 0.2 - * @file VerificationStatus.h - * @brief OCSP/CRL status. - */ -#ifndef _VALIDATION_CORE_VERIFICATION_STATUS_H_ -#define _VALIDATION_CORE_VERIFICATION_STATUS_H_ - -namespace ValidationCore { -enum VerificationStatus -{ - //! The certificate has not been revoked. - /*! Connection to OCSP responder was successful and the certificate - * has not been revoked. - */ - VERIFICATION_STATUS_GOOD = 1, - - //! The certificate has been revoked. - /*! Connection to OCSP responder was successful and the certificate - * has been revoked. - * RFC2560: "The "revoked" state indicates that the certificate has - * been revoked (either permanantly or temporarily - * (on hold))." - */ - VERIFICATION_STATUS_REVOKED = 1 << 1, - - //! The certificate status is unknown. - /*! Connection to OCSP responder was successful and the certificate - * has unknown status. - * - * RFC2560: "The "unknown" state indicates that the responder - * doesn't know about the certificate being requested." - */ - VERIFICATION_STATUS_UNKNOWN = 1 << 2, - - //! The certificate status was not figure out. - /*! The response from ocsp/crl server contains broken signature. */ - VERIFICATION_STATUS_VERIFICATION_ERROR = 1 << 3, - - //! The certificate status was not figure out. - /*! The certificate does not contain ocsp/crl extension. */ - VERIFICATION_STATUS_NOT_SUPPORT = 1 << 4, - - //! The certificate status was not figure out. - /*! The CertMgr could not connect to OCSP responder. */ - VERIFICATION_STATUS_CONNECTION_FAILED = 1 << 5, - - //! The certificate status is unknown due to internal error inside OCSP - VERIFICATION_STATUS_ERROR = 1 << 6 -}; - -class VerificationStatusSet -{ - public: - VerificationStatusSet(); - - void add(VerificationStatus status); - - bool contains(VerificationStatus status) const; - - bool isEmpty() const; - - void operator+=(const VerificationStatusSet &second); - - void reset(); - - VerificationStatus convertToStatus() const; - - private: - unsigned int m_verdictMap; -}; - -/* TODO this status should be defined in wrt-engine sources */ -enum WidgetVerificationStatus -{ - // All certificate has been veficated and all certificates are good. - // Widget is able to be installed. - WIDGET_VERIFICATION_STATUS_GOOD, - // Some certificate has been revoked. Widget is not able to be installed. - WIDGET_VERIFICATION_STATUS_REVOKED, -}; - -} // namespace ValidationCore - -#endif // _VALIDATION_CORE_VERIFICATION_STATUS_H_ diff --git a/vcore/src/vcore/WacOrigin.cpp b/vcore/src/vcore/WacOrigin.cpp deleted file mode 100644 index 74ccd7c..0000000 --- a/vcore/src/vcore/WacOrigin.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file - * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) - * @version 1.0 - * @brief - */ -#include "WacOrigin.h" - -#include -#include -#include - -#include - -#include -#include "ValidatorCommon.h" - -namespace { -const std::string SCHEME_HTTP = "http"; -const std::string SCHEME_HTTPS = "https"; -const int PORT_HTTP = 80; -const int PORT_HTTPS = 443; -} - -namespace ValidationCore { -VC_DECLARE_DELETER(iri_struct, iri_destroy) - -WacOrigin::WacOrigin(const std::string &url) : - m_port(0), - m_parseFailed(false) -{ - parse(url.c_str()); -} - -WacOrigin::WacOrigin(const char *url) : - m_port(0), - m_parseFailed(false) -{ - parse(url); -} - -bool WacOrigin::operator==(const WacOrigin &second) const -{ - if (m_parseFailed || second.m_parseFailed) { - return false; - } - - return (m_scheme == second.m_scheme) && - (m_host == second.m_host) && - (m_port == second.m_port); -} - -void WacOrigin::parse(const char *url) -{ - // Step are taken from algorihtm: - // http://www.w3.org/TR/html5/origin-0.html#origin-0 - - // Step 1 - // Step 2 - AutoPtr iri(iri_parse(url)); - if (!iri.get()) { - m_parseFailed = true; - return; - } - - if (iri->scheme) { - m_scheme = iri->scheme; - } else { - m_parseFailed = true; - return; - } - - // Step 3 - Skip this point. - // WAC 2.0 PRV - we are suport only "http" and "https" schemas. - - // Step 4 - Todo - - // Step 5 - std::transform(m_scheme.begin(), m_scheme.end(), m_scheme.begin(), tolower); - - // Step 6 - we only support "http" and "https" schemas - if ((m_scheme != SCHEME_HTTP) && (m_scheme != SCHEME_HTTPS)) { - m_parseFailed = true; - return; - } - - // Step 7 - Skip. We do not support "file" schema. - - // Step 8 - if (iri->host) { - m_host = iri->host; - } else { - m_parseFailed = true; - return; - } - - // Step 9 - char *output = NULL; - if (IDNA_SUCCESS != - idna_to_ascii_lz(m_host.c_str(), &output, IDNA_USE_STD3_ASCII_RULES)) { - LogError("libidn error"); - m_parseFailed = true; - free(output); - return; - } - m_host = output; - free(output); - - // Step 10 - std::transform(m_host.begin(), m_host.end(), m_host.begin(), ::tolower); - - // Step 11 - if (iri->port) { - m_port = iri->port; - } else { - setPort(); - } - - // Step 12 - Skip it. We do not return anything. - // User should create geters if he need access to schema/host/port. -} - -void WacOrigin::setPort() -{ - if (SCHEME_HTTP == m_scheme) { - m_port = PORT_HTTP; - return; - } else if (SCHEME_HTTPS == m_scheme) { - m_port = PORT_HTTPS; - return; - } else { - LogDebug("Scheme %s is not support by WAC2.0 " << m_scheme); - m_parseFailed = true; - } -} -} // namespace ValidationCore diff --git a/vcore/src/vcore/WacOrigin.h b/vcore/src/vcore/WacOrigin.h deleted file mode 100644 index d706fe3..0000000 --- a/vcore/src/vcore/WacOrigin.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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. - */ -/* - * @file - * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) - * @version 1.0 - * @brief This is stub for HTML5Origin implementation. - * This implementation is compatible with WAC 2.0 PRV requirements - * and is _not_ full compatible with ORIGIN algorithm requirements - * defined in http://www.w3.org/TR/html5/origin-0.html#origin-0 - */ -#ifndef _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_HTML5ORIGIN_H_ -#define _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_HTML5ORIGIN_H_ - -#include - -namespace ValidationCore { -class WacOrigin -{ - public: - - WacOrigin(const std::string &url); - WacOrigin(const char *url); - - bool operator!=(const WacOrigin &second) const - { - return !(operator==(second)); - } - - bool operator==(const WacOrigin &second) const; - - private: - void parse(const char *url); - void setPort(); - - std::string m_scheme; - std::string m_host; - int m_port; - bool m_parseFailed; // if parsing failed we should return unique identifier -}; -} //namespace ValidationCore - -#endif // _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_HTML5ORIGIN_H_ diff --git a/vcore/src/vcore/Base64.cpp b/vcore/vcore/Base64.cpp similarity index 87% rename from vcore/src/vcore/Base64.cpp rename to vcore/vcore/Base64.cpp index 85edcae..3b844b5 100644 --- a/vcore/src/vcore/Base64.cpp +++ b/vcore/vcore/Base64.cpp @@ -15,6 +15,7 @@ */ #include #include +#include #include #include #include @@ -22,8 +23,6 @@ #include -#include - #include namespace ValidationCore { @@ -114,7 +113,9 @@ void Base64Decoder::append(const std::string &data) static bool whiteCharacter(char a) { - if (a == '\n') { return true; } + if (a == '\n') + return true; + return false; } @@ -137,34 +138,36 @@ bool Base64Decoder::finalize() || m_input[i] == '+' || m_input[i] == '/' || m_input[i] == '=') - { continue; - } LogError("Base64 input contains illegal chars: " << m_input[i]); return false; } BIO *b64, *bmem; size_t len = m_input.size(); - - VcoreDPL::ScopedFree buffer(static_cast(malloc(len))); - - if (!buffer) { - LogError("Error in malloc."); - VcoreThrowMsg(Exception::InternalError, "Error in malloc."); + std::shared_ptr buffer(new char[len], [](char *p){delete []p;}); + if (!buffer.get()) { + LogError("Error in new"); + VcoreThrowMsg(Exception::InternalError, "Error in new"); } - memset(buffer.Get(), 0, len); + memset(buffer.get(), 0, len); b64 = BIO_new(BIO_f_base64()); if (!b64) { LogError("Couldn't create BIO object."); VcoreThrowMsg(Exception::InternalError, "Couldn't create BIO object."); } BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); - VcoreDPL::ScopedFree tmp(strdup(m_input.c_str())); + + std::shared_ptr tmp(strdup(m_input.c_str()), [](char *p){free(p);}); + if (!tmp.get()) { + LogError("Error in strdup"); + VcoreThrowMsg(Exception::InternalError, "Error in strdup"); + } + m_input.clear(); - bmem = BIO_new_mem_buf(tmp.Get(), len); + bmem = BIO_new_mem_buf(tmp.get(), len); if (!bmem) { BIO_free(b64); @@ -180,18 +183,18 @@ bool Base64Decoder::finalize() VcoreThrowMsg(Exception::InternalError, "Internal error in BIO"); } - int readlen = BIO_read(bmem, buffer.Get(), len); + int readlen = BIO_read(bmem, buffer.get(), len); m_output.clear(); bool status = true; - if (readlen > 0) { - m_output.append(buffer.Get(), readlen); - } else { + if (readlen > 0) + m_output.append(buffer.get(), readlen); + else status = false; - } BIO_free_all(bmem); + return status; } diff --git a/vcore/src/vcore/Base64.h b/vcore/vcore/Base64.h similarity index 100% rename from vcore/src/vcore/Base64.h rename to vcore/vcore/Base64.h diff --git a/vcore/src/vcore/CertStoreType.cpp b/vcore/vcore/CertStoreType.cpp similarity index 100% rename from vcore/src/vcore/CertStoreType.cpp rename to vcore/vcore/CertStoreType.cpp diff --git a/vcore/src/vcore/CertStoreType.h b/vcore/vcore/CertStoreType.h similarity index 100% rename from vcore/src/vcore/CertStoreType.h rename to vcore/vcore/CertStoreType.h diff --git a/vcore/src/vcore/Certificate.cpp b/vcore/vcore/Certificate.cpp similarity index 100% rename from vcore/src/vcore/Certificate.cpp rename to vcore/vcore/Certificate.cpp diff --git a/vcore/src/vcore/Certificate.h b/vcore/vcore/Certificate.h similarity index 100% rename from vcore/src/vcore/Certificate.h rename to vcore/vcore/Certificate.h diff --git a/vcore/src/vcore/CertificateCollection.cpp b/vcore/vcore/CertificateCollection.cpp similarity index 85% rename from vcore/src/vcore/CertificateCollection.cpp rename to vcore/vcore/CertificateCollection.cpp index 80df380..5f27f8a 100644 --- a/vcore/src/vcore/CertificateCollection.cpp +++ b/vcore/vcore/CertificateCollection.cpp @@ -29,8 +29,6 @@ #include #include -#include -#include #include #include @@ -126,53 +124,13 @@ void CertificateCollection::load(const CertificateList &certList) std::back_inserter(m_certList)); } -bool CertificateCollection::load(const std::string &buffer) -{ - Base64Decoder base64; - base64.reset(); - base64.append(buffer); - if (!base64.finalize()) { - LogWarning("Error during chain decoding"); - return false; - } - std::string binaryData = base64.get(); - - VcoreDPL::BinaryQueue queue; - queue.AppendCopy(binaryData.c_str(), binaryData.size()); - - int certNum; - queue.FlattenConsume(&certNum, sizeof(int)); - - CertificateList list; - CertificatePtr certPtr; - - for (int i = 0; i < certNum; ++i) { - int certSize; - queue.FlattenConsume(&certSize, sizeof(int)); - std::vector rawDERCert; - rawDERCert.resize(certSize); - queue.FlattenConsume(&rawDERCert[0], certSize); - VcoreTry { - list.push_back(CertificatePtr(new Certificate(std::string( - rawDERCert.begin(), - rawDERCert.end())))); - } VcoreCatch (Certificate::Exception::Base) { - LogWarning("Error during certificate creation."); - return false; - } - - LogDebug("Loading certificate. Certificate common name: " << list.back()->getCommonName()); - } - load(list); - return true; -} - std::string CertificateCollection::toBase64String() const { std::ostringstream output; int certNum = m_certList.size(); output << toBinaryString(certNum); - FOREACH(i, m_certList){ + + for (auto i = m_certList.begin(); i != m_certList.end(); ++i) { std::string derCert = (*i)->getDER(); output << toBinaryString(derCert.size()); output << derCert; diff --git a/vcore/src/vcore/CertificateCollection.h b/vcore/vcore/CertificateCollection.h similarity index 93% rename from vcore/src/vcore/CertificateCollection.h rename to vcore/vcore/CertificateCollection.h index e47e3f6..a923b4d 100644 --- a/vcore/src/vcore/CertificateCollection.h +++ b/vcore/vcore/CertificateCollection.h @@ -64,16 +64,6 @@ public: void load(const CertificateList &certList); /* - * This function will return false if base64 string is broken - * (is not encoded in base64 format) or one from certificate - * is broken (is not encoded in der format). - * - * This function will add new certificate to collection. - * This function DOES NOT clean collection. - */ - bool load(const std::string &base64); - - /* * This function will return all certificates from * collection encoded in base64 format. */ diff --git a/vcore/src/vcore/CertificateConfigReader.cpp b/vcore/vcore/CertificateConfigReader.cpp similarity index 100% rename from vcore/src/vcore/CertificateConfigReader.cpp rename to vcore/vcore/CertificateConfigReader.cpp diff --git a/vcore/src/vcore/CertificateConfigReader.h b/vcore/vcore/CertificateConfigReader.h similarity index 100% rename from vcore/src/vcore/CertificateConfigReader.h rename to vcore/vcore/CertificateConfigReader.h diff --git a/vcore/src/vcore/CertificateIdentifier.h b/vcore/vcore/CertificateIdentifier.h similarity index 100% rename from vcore/src/vcore/CertificateIdentifier.h rename to vcore/vcore/CertificateIdentifier.h diff --git a/vcore/src/vcore/CertificateLoader.cpp b/vcore/vcore/CertificateLoader.cpp similarity index 100% rename from vcore/src/vcore/CertificateLoader.cpp rename to vcore/vcore/CertificateLoader.cpp diff --git a/vcore/src/vcore/CertificateLoader.h b/vcore/vcore/CertificateLoader.h similarity index 100% rename from vcore/src/vcore/CertificateLoader.h rename to vcore/vcore/CertificateLoader.h diff --git a/vcore/src/vcore/ParserSchema.h b/vcore/vcore/ParserSchema.h similarity index 100% rename from vcore/src/vcore/ParserSchema.h rename to vcore/vcore/ParserSchema.h diff --git a/vcore/src/vcore/ReferenceValidator.cpp b/vcore/vcore/ReferenceValidator.cpp similarity index 94% rename from vcore/src/vcore/ReferenceValidator.cpp rename to vcore/vcore/ReferenceValidator.cpp index d8b839e..8fd1a30 100644 --- a/vcore/src/vcore/ReferenceValidator.cpp +++ b/vcore/vcore/ReferenceValidator.cpp @@ -28,7 +28,6 @@ #include -#include #include namespace { @@ -89,7 +88,6 @@ class ReferenceValidator::Impl } std::string m_dirpath; - std::string m_errorDescription; pcrecpp::RE m_signatureRegexp; }; @@ -146,7 +144,6 @@ ReferenceValidator::Result ReferenceValidator::Impl::dfsCheckDirectories( if ((dp = opendir(currentDir.c_str())) == NULL) { LogError("Error opening directory : " << currentDir); - m_errorDescription = currentDir; return ERROR_OPENING_DIR; } @@ -188,20 +185,16 @@ ReferenceValidator::Result ReferenceValidator::Impl::dfsCheckDirectories( LogDebug("Found file : " << (directory + dirp->d_name)); LogError("Unknown ERROR_REFERENCE_NOT_FOUND."); closedir(dp); - m_errorDescription = directory + dirp->d_name; return ERROR_REFERENCE_NOT_FOUND; } } else { LogError("Unknown file type."); closedir(dp); - m_errorDescription = directory + dirp->d_name; return ERROR_UNSUPPORTED_FILE_TYPE; } } if (errno != 0) { - m_errorDescription = VcoreDPL::GetErrnoString(); - LogError("readdir failed. Errno code : " << errno << ", Description : " << m_errorDescription); closedir(dp); return ERROR_READING_DIR; } diff --git a/vcore/src/vcore/ReferenceValidator.h b/vcore/vcore/ReferenceValidator.h similarity index 100% rename from vcore/src/vcore/ReferenceValidator.h rename to vcore/vcore/ReferenceValidator.h diff --git a/vcore/src/vcore/SaxReader.cpp b/vcore/vcore/SaxReader.cpp similarity index 100% rename from vcore/src/vcore/SaxReader.cpp rename to vcore/vcore/SaxReader.cpp diff --git a/vcore/src/vcore/SaxReader.h b/vcore/vcore/SaxReader.h similarity index 100% rename from vcore/src/vcore/SaxReader.h rename to vcore/vcore/SaxReader.h diff --git a/vcore/src/vcore/SignatureData.cpp b/vcore/vcore/SignatureData.cpp similarity index 100% rename from vcore/src/vcore/SignatureData.cpp rename to vcore/vcore/SignatureData.cpp diff --git a/vcore/src/vcore/SignatureData.h b/vcore/vcore/SignatureData.h similarity index 100% rename from vcore/src/vcore/SignatureData.h rename to vcore/vcore/SignatureData.h diff --git a/vcore/src/vcore/SignatureFinder.cpp b/vcore/vcore/SignatureFinder.cpp similarity index 100% rename from vcore/src/vcore/SignatureFinder.cpp rename to vcore/vcore/SignatureFinder.cpp diff --git a/vcore/src/vcore/SignatureFinder.h b/vcore/vcore/SignatureFinder.h similarity index 100% rename from vcore/src/vcore/SignatureFinder.h rename to vcore/vcore/SignatureFinder.h diff --git a/vcore/src/vcore/SignatureReader.cpp b/vcore/vcore/SignatureReader.cpp similarity index 100% rename from vcore/src/vcore/SignatureReader.cpp rename to vcore/vcore/SignatureReader.cpp diff --git a/vcore/src/vcore/SignatureReader.h b/vcore/vcore/SignatureReader.h similarity index 100% rename from vcore/src/vcore/SignatureReader.h rename to vcore/vcore/SignatureReader.h diff --git a/vcore/src/vcore/SignatureValidator.cpp b/vcore/vcore/SignatureValidator.cpp similarity index 100% rename from vcore/src/vcore/SignatureValidator.cpp rename to vcore/vcore/SignatureValidator.cpp diff --git a/vcore/src/vcore/SignatureValidator.h b/vcore/vcore/SignatureValidator.h similarity index 100% rename from vcore/src/vcore/SignatureValidator.h rename to vcore/vcore/SignatureValidator.h diff --git a/vcore/src/vcore/TimeConversion.cpp b/vcore/vcore/TimeConversion.cpp similarity index 100% rename from vcore/src/vcore/TimeConversion.cpp rename to vcore/vcore/TimeConversion.cpp diff --git a/vcore/src/vcore/TimeConversion.h b/vcore/vcore/TimeConversion.h similarity index 97% rename from vcore/src/vcore/TimeConversion.h rename to vcore/vcore/TimeConversion.h index 6b50503..c3df017 100644 --- a/vcore/src/vcore/TimeConversion.h +++ b/vcore/vcore/TimeConversion.h @@ -23,8 +23,7 @@ #define _VALIDATION_CORE_TIMECONVERSION_H_ #include - -#include +#include namespace ValidationCore { // from OpenSSL asn1/a_utctm.c code diff --git a/vcore/src/vcore/ValidatorCommon.h b/vcore/vcore/ValidatorCommon.h similarity index 100% rename from vcore/src/vcore/ValidatorCommon.h rename to vcore/vcore/ValidatorCommon.h diff --git a/vcore/src/vcore/ValidatorFactories.cpp b/vcore/vcore/ValidatorFactories.cpp similarity index 100% rename from vcore/src/vcore/ValidatorFactories.cpp rename to vcore/vcore/ValidatorFactories.cpp diff --git a/vcore/src/vcore/ValidatorFactories.h b/vcore/vcore/ValidatorFactories.h similarity index 97% rename from vcore/src/vcore/ValidatorFactories.h rename to vcore/vcore/ValidatorFactories.h index 075eef1..6b75fe5 100644 --- a/vcore/src/vcore/ValidatorFactories.h +++ b/vcore/vcore/ValidatorFactories.h @@ -22,7 +22,7 @@ #ifndef _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_VALIDATORFACTORY_H_ #define _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_VALIDATORFACTORY_H_ -#include +#include namespace ValidationCore { // First use of CertificateIdentificator should initialized it. diff --git a/vcore/src/vcore/XmlsecAdapter.cpp b/vcore/vcore/XmlsecAdapter.cpp similarity index 100% rename from vcore/src/vcore/XmlsecAdapter.cpp rename to vcore/vcore/XmlsecAdapter.cpp diff --git a/vcore/src/vcore/XmlsecAdapter.h b/vcore/vcore/XmlsecAdapter.h similarity index 100% rename from vcore/src/vcore/XmlsecAdapter.h rename to vcore/vcore/XmlsecAdapter.h diff --git a/vcore/src/vcore/api.cpp b/vcore/vcore/api.cpp similarity index 99% rename from vcore/src/vcore/api.cpp rename to vcore/vcore/api.cpp index 6918dfc..5f05667 100644 --- a/vcore/src/vcore/api.cpp +++ b/vcore/vcore/api.cpp @@ -43,7 +43,6 @@ #include #include -#include #include #include @@ -79,9 +78,9 @@ public: {} ~CertSvcInstanceImpl(){ - FOREACH(it, m_allocatedStringSet) { + auto it = m_allocatedStringSet.begin(); + for (; it != m_allocatedStringSet.end(); ++it) delete[] *it; - } } inline void reset(){ @@ -92,9 +91,9 @@ public: m_stringListCounter = 0; m_stringListMap.clear(); - FOREACH(it, m_allocatedStringSet) { + auto it = m_allocatedStringSet.begin(); + for (; it != m_allocatedStringSet.end(); ++it) delete[] *it; - } m_allocatedStringSet.clear(); } diff --git a/vcore/src/vcore/cert-svc-client.c b/vcore/vcore/cert-svc-client.c similarity index 99% rename from vcore/src/vcore/cert-svc-client.c rename to vcore/vcore/cert-svc-client.c index 4dc5214..1da8b0d 100644 --- a/vcore/src/vcore/cert-svc-client.c +++ b/vcore/vcore/cert-svc-client.c @@ -32,7 +32,7 @@ #include -#include +#include void initialize_res_data(VcoreResponseData *pData) { diff --git a/vcore/src/vcore/cert-svc-client.h b/vcore/vcore/cert-svc-client.h similarity index 100% rename from vcore/src/vcore/cert-svc-client.h rename to vcore/vcore/cert-svc-client.h diff --git a/vcore/src/vcore/exception.cpp b/vcore/vcore/exception.cpp similarity index 100% rename from vcore/src/vcore/exception.cpp rename to vcore/vcore/exception.cpp diff --git a/vcore/src/vcore/exception.h b/vcore/vcore/exception.h similarity index 100% rename from vcore/src/vcore/exception.h rename to vcore/vcore/exception.h diff --git a/vcore/src/vcore/pkcs12.cpp b/vcore/vcore/pkcs12.cpp similarity index 99% rename from vcore/src/vcore/pkcs12.cpp rename to vcore/vcore/pkcs12.cpp index 9ee5483..448208c 100644 --- a/vcore/src/vcore/pkcs12.cpp +++ b/vcore/vcore/pkcs12.cpp @@ -35,10 +35,11 @@ #include #include #include -#include +#include #include -#include + +#include #define SYSCALL(call) while(((call) == -1) && (errno == EINTR)) diff --git a/vcore/src/vcore/pkcs12.h b/vcore/vcore/pkcs12.h similarity index 100% rename from vcore/src/vcore/pkcs12.h rename to vcore/vcore/pkcs12.h diff --git a/vcore/src/vcore/utils.c b/vcore/vcore/utils.c similarity index 100% rename from vcore/src/vcore/utils.c rename to vcore/vcore/utils.c diff --git a/vcore/src/vcore/utils.h b/vcore/vcore/utils.h similarity index 100% rename from vcore/src/vcore/utils.h rename to vcore/vcore/utils.h -- 2.7.4