From 7e4d7d0f42155fa29b48c9743e210c314dd3fbc3 Mon Sep 17 00:00:00 2001 From: Crementif <26669564+Crementif@users.noreply.github.com> Date: Sun, 12 May 2024 10:58:32 +0200 Subject: [PATCH] Revert "Add option to dump SpotBass data (#41)" This reverts commit f9179f0c1fe27d337fd31d553b7dfe896606093f, reversing changes made to 85eb42b93656eaced5b7b7263f1f10cb8034347e. --- Makefile | 2 +- README.md | 1 - source/app/common.h | 10 +- source/app/dumping.cpp | 139 +------------------------ source/app/dumping.h | 3 +- source/app/main.cpp | 4 +- source/app/menu.cpp | 7 +- source/app/users.cpp | 9 +- source/utils/http.cpp | 122 ---------------------- source/utils/http.h | 50 --------- source/utils/http_caroot.h | 206 ------------------------------------- 11 files changed, 10 insertions(+), 543 deletions(-) delete mode 100644 source/utils/http.cpp delete mode 100644 source/utils/http.h delete mode 100644 source/utils/http_caroot.h diff --git a/Makefile b/Makefile index 82e891c..ce65288 100644 --- a/Makefile +++ b/Makefile @@ -77,7 +77,7 @@ CXXFLAGS := $(CFLAGS) -std=c++20 ASFLAGS := -g $(ARCH) LDFLAGS = -g $(ARCH) $(RPXSPECS) -Wl,-Map,$(notdir $*.map) -LIBS := -lcurl -lmbedtls -lmbedcrypto -lmbedx509 -lz -lstdc++ -lwut -lmocha +LIBS := -lstdc++ -lwut -lmocha #------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level diff --git a/README.md b/README.md index 3982090..71fd974 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,6 @@ You don't need to run/have Mocha CFW or Haxchi, just launch Dumpling from the Ho ## How to compile - Install [DevkitPro](https://devkitpro.org/wiki/Getting_Started) for your platform. - Install freetype2 using DevkitPro's pacman (e.g. `(dkp-)pacman -Sy ppc-pkg-config ppc-freetype`). - - Install wiiu-curl using DevkitPro's pacman (e.g. `(dkp-)pacman -Sy wiiu-curl`) - Install [wut](https://github.com/devkitpro/wut) through DevkitPro's pacman or compile (and install) the latest source yourself. - Compile [libmocha](https://github.com/wiiu-env/libmocha). - Then, with all those dependencies installed, you can just run `make` to get the .rpx file that you can run on your Wii U. diff --git a/source/app/common.h b/source/app/common.h index 64e8fea..08782c5 100644 --- a/source/app/common.h +++ b/source/app/common.h @@ -188,7 +188,6 @@ struct userAccount { bool networkAccount; bool passwordCached; std::wstring miiName; - std::string accountId; std::string persistentIdString; nn::act::SlotNo slot; nn::act::PersistentId persistentId; @@ -242,7 +241,7 @@ struct titleEntry { std::wstring shortTitle; std::wstring productCode; std::string folderName; - + std::optional base; std::optional update; std::optional dlc; @@ -251,13 +250,6 @@ struct titleEntry { std::optional customFile; }; -struct dumpFileFilter { - std::vector fileNames; - std::vector extensions; - - std::vector outMatchedFiles; -}; - #if USE_DEBUG_STUBS #define IS_CEMU_PRESENT() (OSGetSystemMode() == 0) #define USE_WUT_DEVOPTAB() (IS_CEMU_PRESENT() && USE_RAMDISK == 0) diff --git a/source/app/dumping.cpp b/source/app/dumping.cpp index 496501e..c71f9fd 100644 --- a/source/app/dumping.cpp +++ b/source/app/dumping.cpp @@ -7,7 +7,6 @@ #include "users.h" #include "cfw.h" #include "gui.h" -#include "../utils/http.h" #include "interfaces/transfer.h" #include "interfaces/fat32.h" @@ -363,7 +362,7 @@ bool deleteTitleEntry(titleEntry& entry, dumpingConfig& config, const std::funct return true; } -bool dumpQueue(std::vector>& queue, dumpingConfig& config, std::optional filter) { +bool dumpQueue(std::vector>& queue, dumpingConfig& config) { // Delete previously dumped files if (config.dumpMethod == DUMP_METHOD::FAT && !USE_WUT_DEVOPTAB()) { uint64_t deletedCount = 0; @@ -474,7 +473,7 @@ bool dumpQueue(std::vector>& queue, dumpingConfig& c bool cancelledDumping = false; std::filesystem::path currDir; - bool dumpSuccess = processTitleEntry(queueEntry, config, [&currDir, &interface, &cancelledDumping, &queueEntry, &filter](WALK_EVENT event, const char *filename, const std::string &srcPath, const std::string &destPath) -> bool { + bool dumpSuccess = processTitleEntry(queueEntry, config, [&currDir, &interface, &cancelledDumping, &queueEntry](WALK_EVENT event, const char *filename, const std::string &srcPath, const std::string &destPath) -> bool { if (event == WALK_EVENT::MAKE_PATH) return callback_makeDir(interface.get(), destPath, true); else if (event == WALK_EVENT::DIR_ENTER) { @@ -486,36 +485,8 @@ bool dumpQueue(std::vector>& queue, dumpingConfig& c currDir = currDir.parent_path(); return callback_moveDir(interface.get(), currDir.string()); } - else if (event == WALK_EVENT::FILE) { - - if (filter.has_value()) { - auto& fileFilter = filter.value(); - bool hasMatched = false; - - std::string filenameStr(filename); - for (auto& ext : fileFilter->extensions) { - if (filenameStr.ends_with(ext)) { - hasMatched = true; - break; - } - } - - if (!hasMatched) { - for (auto& name : fileFilter->fileNames) { - if (filenameStr.compare(name) == 0) { - hasMatched = true; - break; - } - } - } - - if (hasMatched) - fileFilter->outMatchedFiles.push_back(srcPath); - - } - + else if (event == WALK_EVENT::FILE) return callback_copyFile(interface.get(), cancelledDumping, filename, srcPath, destPath); - } else if (event == WALK_EVENT::BUFFER) return callback_copyBuffer(interface.get(), cancelledDumping, filename, queueEntry.customFile->srcBuffer, queueEntry.customFile->srcBufferSize, destPath+"/"+filename); return true; @@ -701,110 +672,6 @@ void dumpOnlineFiles() { else showDialogPrompt(L"Failed to dump the online files...", L"OK"); } -void dumpSpotpass() { - std::vector> queue; - dumpingConfig spotpassConfig = { .dumpTypes = (DUMP_TYPE_FLAGS::CUSTOM) }; - - if (!showOptionMenu(spotpassConfig, false)) return; - - titleEntry slcSpotpassDir{ .shortTitle = L"SpotPass Directory", .customFolder = folderPart{.inputPath = convertToPosixPath("/vol/storage_mlc01/usr/save/system/boss"), .outputPath = "/SpotPass Files"} }; - queue.emplace_back(std::make_shared(slcSpotpassDir)); - - dumpFileFilter filter{ .fileNames = {"task.db"} }; - if (dumpQueue(queue, spotpassConfig, &filter)) showDialogPrompt(L"Successfully dumped all of the SpotPass files!", L"OK"); - else showDialogPrompt(L"Failed to dump the SpotPass files...", L"OK"); - - wchar_t promptMessage[512]; - swprintf(promptMessage, 512, L"Do you want to upload the files to the SpotPass Archival Project?\n" - "The files do not contain any personally identifiable information.\n" - "It will upload %d files of 1MB each!\n", filter.outMatchedFiles.size()); - - uint8_t doUploadFiles = showDialogPrompt(promptMessage, L"Yes", L"No"); - if (doUploadFiles == 0) { - - size_t currentUploadIdx = 0; - bool taskUploadError = false; - - struct userdata_upload_t { - bool* taskUploadError; - size_t* currentUploadIdx; - dumpFileFilter* filter; - } userdata = { &taskUploadError, ¤tUploadIdx, &filter }; - - auto uploadCallback = [](UploadQueueEntry& entry, float progress) { - bool has_started = entry.started; - bool has_finished = entry.finished; - bool has_error = entry.error; - - userdata_upload_t* userdata = (userdata_upload_t*)entry.userdata; - bool& taskUploadError = *userdata->taskUploadError; - size_t& currentUploadIdx = *userdata->currentUploadIdx; - dumpFileFilter& filter = *userdata->filter; - - if(has_started && has_error) { - taskUploadError = true; - return; - } - - if(has_started && has_finished) { - currentUploadIdx++; - return; - } - - WHBLogFreetypeStartScreen(); - WHBLogFreetypeScreenPrintBottom(L"==============================="); - WHBLogFreetypeScreenPrintBottom(L"SpotPass Uploader"); - - WHBLogFreetypePrintf(L"Uploading SpotPass task file ... (%d out %d)", currentUploadIdx + 1, filter.outMatchedFiles.size()); - WHBLogFreetypePrintf(L"File path: %s", filter.outMatchedFiles[currentUploadIdx].c_str()); - WHBLogFreetypePrint(L""); - WHBLogFreetypePrintf(L"Progress: %.1f%%", progress * 100.0f); - WHBLogFreetypePrint(L""); - if(!has_started && progress <= std::numeric_limits::epsilon()) { - WHBLogFreetypePrint(L"Status: Waiting for server to start upload..."); - } else { - WHBLogFreetypePrint(L"Status: Uploading..."); - } - - WHBLogFreetypeDrawScreen(); - }; - - for (size_t i = 0; i < filter.outMatchedFiles.size(); i++) { - std::string filePath = filter.outMatchedFiles[i]; - - std::ifstream instream(filePath, std::ios::binary | std::ios::ate); - if (!instream) { - taskUploadError = true; - break; - } - - auto fileSize = instream.tellg(); - instream.seekg(0, std::ios::beg); - - std::vector data(fileSize); - instream.read((char*)data.data(), fileSize); - - http_submitUploadQueue("https://bossarchive.raregamingdump.ca/api/upload/wup", data, uploadCallback, &userdata); - WHBLogPrintf("Submitting upload for SpotPass task file ... (%d out %d)", i + 1, filter.outMatchedFiles.size()); - } - - if (taskUploadError) { - showDialogPrompt(L"Failed to read the SpotPass files for upload...", L"OK"); - } - - while(!taskUploadError && currentUploadIdx < filter.outMatchedFiles.size()) { - std::this_thread::yield(); - } - - if (taskUploadError) { - showDialogPrompt(L"Failed to upload the SpotPass files...", L"OK"); - } else { - showDialogPrompt(L"Successfully uploaded all of the SpotPass files!", L"OK"); - } - } - -} - void cleanDumpingProcess() { WHBLogPrint("Cleaning up after dumping..."); WHBLogFreetypeDraw(); diff --git a/source/app/dumping.h b/source/app/dumping.h index 0eaea2c..68376cc 100644 --- a/source/app/dumping.h +++ b/source/app/dumping.h @@ -1,9 +1,8 @@ #include "common.h" -bool dumpQueue(std::vector>& queue, dumpingConfig& config, std::optional filter = std::nullopt); +bool dumpQueue(std::vector>& queue, dumpingConfig& config); bool dumpDisc(); void dumpMLC(); void dumpOnlineFiles(); void dumpAmiibo(); -void dumpSpotpass(); void cleanDumpingProcess(); \ No newline at end of file diff --git a/source/app/main.cpp b/source/app/main.cpp index 42abcd1..f9a050a 100644 --- a/source/app/main.cpp +++ b/source/app/main.cpp @@ -6,7 +6,6 @@ #include "titles.h" #include "users.h" #include "gui.h" -#include "../utils/http.h" // Initialize correct heaps for CustomRPXLoader extern "C" void __init_wut_malloc(); @@ -17,12 +16,12 @@ extern "C" [[maybe_unused]] void __preinit_user(MEMHeapHandle *outMem1, MEMHeapH int main() { // Initialize libraries initializeGUI(); + WHBLogCafeInit(); FSInit(); FSAInit(); nn::act::Initialize(); ACPInitialize(); initializeInputs(); - http_init(); IMDisableAPD(); // Disable auto-shutdown feature @@ -42,7 +41,6 @@ int main() { sleep_for(5s); // Close application properly - http_exit(); unmountSystemDrives(); shutdownCFW(); ACPFinalize(); diff --git a/source/app/menu.cpp b/source/app/menu.cpp index d76be99..bf4ef7b 100644 --- a/source/app/menu.cpp +++ b/source/app/menu.cpp @@ -45,8 +45,6 @@ void showMainMenu() { WHBLogFreetypePrintf(L"%C Dump only DLC files of a game", OPTION(6)); WHBLogFreetypePrintf(L"%C Dump only Save files of a game", OPTION(7)); WHBLogFreetypePrintf(L"%C Dump whole MLC (everything stored on internal storage)", OPTION(8)); - WHBLogFreetypePrint(L""); - WHBLogFreetypePrintf(L"%C Dump all SpotPass data", OPTION(9)); WHBLogFreetypeScreenPrintBottom(L"==============================="); WHBLogFreetypeScreenPrintBottom(L"\uE000 Button = Select Option \uE001 Button = Exit Dumpling"); WHBLogFreetypeScreenPrintBottom(L""); @@ -62,7 +60,7 @@ void showMainMenu() { selectedOption--; break; } - if (navigatedDown() && selectedOption < 9) { + if (navigatedDown() && selectedOption < 8) { selectedOption++; break; } @@ -112,7 +110,6 @@ void showMainMenu() { dumpMLC(); break; case 9: - dumpSpotpass(); break; case 10: break; @@ -149,7 +146,7 @@ bool showOptionMenu(dumpingConfig& config, bool showAccountOption) { WHBLogFreetypePrint(L"==============================="); WHBLogFreetypePrintf(L"%C Dump Destination: %S", OPTION(0), drives.empty() ? L"No Drives Detected" : toWstring(drives[selectedDrive].second).c_str()); WHBLogFreetypePrintf(L"%C Do Initial Scan For Required Empty Space: %S", OPTION(1), config.scanTitleSize ? L"Yes" : L"No"); - if (showAccountOption && dumpingOnlineFiles) WHBLogFreetypePrintf(L"%C Online Account: %S (NNID: %s)", OPTION(2), allUsers[selectedAccount].miiName.c_str(), allUsers[selectedAccount].networkAccount ? allUsers[selectedAccount].accountId.c_str() : ""); + if (showAccountOption && dumpingOnlineFiles) WHBLogFreetypePrintf(L"%C Online Account: %S", OPTION(2), allUsers[selectedAccount].miiName.c_str()); if (showAccountOption && !dumpingOnlineFiles) WHBLogFreetypePrintf(L"%C Account To Get Saves From: %S", OPTION(2), allUsers[selectedAccount].miiName.c_str()); if (showAccountOption && dumpingOnlineFiles) WHBLogFreetypePrintf(L"%C Merge Account To Default Cemu User: %S", OPTION(3), config.dumpAsDefaultUser ? L"Yes" : L"No"); if (showAccountOption && !dumpingOnlineFiles) WHBLogFreetypePrintf(L"%C Merge Saves To Default Cemu User: %S", OPTION(3), config.dumpAsDefaultUser ? L"Yes" : L"No"); diff --git a/source/app/users.cpp b/source/app/users.cpp index 70d310b..52bfa1b 100644 --- a/source/app/users.cpp +++ b/source/app/users.cpp @@ -13,19 +13,12 @@ bool loadUsers() { for (nn::act::SlotNo i=1; i<13; i++) { if (nn::act::IsSlotOccupied(i) == true) { userAccount newAccount; - + // Extract account info char16_t miiName[nn::act::MiiNameSize+1]; nn::Result res = nn::act::GetMiiNameEx((int16_t *)miiName, i); if (res.IsFailure()) continue; - if (nn::act::IsNetworkAccountEx(i)) { - char accountId[nn::act::AccountIdSize + 1]; - res = nn::act::GetAccountIdEx(accountId, i); - if (res.IsFailure()) continue; - newAccount.accountId = accountId; - } - // Convert mii name to normal string std::wstring_convert> convert; newAccount.miiName = convert.from_bytes(reinterpret_cast(miiName), reinterpret_cast(miiName + std::char_traits::length(miiName))); diff --git a/source/utils/http.cpp b/source/utils/http.cpp deleted file mode 100644 index e42a383..0000000 --- a/source/utils/http.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "http.h" - -static std::atomic is_http_initialized = false; - -static std::mutex uploadQueueAccessMutex; -static std::queue uploadQueue; - -static float currentUploadProgress = 0.0f; - -size_t http_curlWriteCallback(void* ptr, size_t size, size_t nmemb, void* userdata) { - return size * nmemb; -} - -int http_curlProgressCallback(void* clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) { - UploadQueueEntry* entry = (UploadQueueEntry*)clientp; - if (ultotal > 0) { - currentUploadProgress = (float)ulnow / (float)ultotal; - entry->callback(*entry, currentUploadProgress); - } - - return 0; -} - -bool http_handleUpload(UploadQueueEntry& entry) { - CURL* curl = curl_easy_init(); - struct curl_slist *slist = nullptr; - slist = curl_slist_append(slist, "Content-Type: application/octet-stream"); - - curl_easy_setopt(curl, CURLOPT_URL, entry.url.c_str()); - curl_easy_setopt(curl, CURLOPT_POST, 1L); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, entry.data.data()); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, entry.data.size()); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_curlWriteCallback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, nullptr); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); - curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L); - curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, http_curlProgressCallback); - curl_easy_setopt(curl, CURLOPT_XFERINFODATA, entry); - - struct curl_blob blob {}; - blob.data = (void*)caroot_pem; - blob.len = caroot_pem_len; - blob.flags = CURL_BLOB_COPY; - curl_easy_setopt(curl, CURLOPT_CAINFO_BLOB, &blob); - - entry.curl = curl; - entry.started = true; - currentUploadProgress = 0.0f; - entry.callback(entry, currentUploadProgress); - - CURLcode res = curl_easy_perform(curl); - if (res != CURLE_OK) { - WHBLogPrintf("curl_easy_perform() failed: %s (%d)", curl_easy_strerror(res), res); - entry.error = true; - entry.finished = true; - return false; - } - else { - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &entry.responseCode); - } - - curl_easy_cleanup(curl); - curl_global_cleanup(); - - entry.finished = true; - - return true; -} - -void http_uploadQueueWorker() { - while (is_http_initialized) { - uploadQueueAccessMutex.lock(); - if (uploadQueue.empty()) { - uploadQueueAccessMutex.unlock(); - std::this_thread::yield(); - continue; - } - - UploadQueueEntry entry = uploadQueue.front(); - uploadQueue.pop(); - - uploadQueueAccessMutex.unlock(); - - WHBLogPrintf("Uploading %lu bytes to %s", entry.data.size(), entry.url.c_str()); - http_handleUpload(entry); - entry.callback(entry, currentUploadProgress); - - } -} - -float http_getCurrentProgress() { - DCInvalidateRange(¤tUploadProgress, sizeof(currentUploadProgress)); - return currentUploadProgress; -} - -void http_submitUploadQueue(const std::string& url, const std::vector& data, UploadQueueCallback updateCallback, void* userdata) { - uploadQueueAccessMutex.lock(); - UploadQueueEntry entry { .curl = nullptr, .url = url, .data = data, .started = false, .finished = false, .error = false, .callback = updateCallback, .userdata = userdata}; - uploadQueue.push(entry); - uploadQueueAccessMutex.unlock(); -} - -void http_init() { - - if (is_http_initialized) - return; - - curl_global_init(CURL_GLOBAL_DEFAULT); - is_http_initialized = true; - - std::thread(http_uploadQueueWorker).detach(); -} - -void http_exit() { - - if (!is_http_initialized) - return; - - curl_global_cleanup(); - is_http_initialized = false; -} \ No newline at end of file diff --git a/source/utils/http.h b/source/utils/http.h deleted file mode 100644 index b52f023..0000000 --- a/source/utils/http.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "http_caroot.h" - -typedef struct UploadQueueEntry UploadQueueEntry; -typedef void (*UploadQueueCallback)(UploadQueueEntry& entry, float progress); - -struct UploadQueueEntry { - int handle; - CURL* curl; - std::string url; - std::vector data; - long responseCode; - bool started; - bool finished; - bool error; - UploadQueueCallback callback; - void* userdata; -}; - -void http_init(); - -/** - * @brief Submit a file to be uploaded to a server - * @param url The URL to upload the file to - * @param data The data to upload - * @param updateCallback A callback function that will be called when the upload has finished or when the progress has changed - * @note This function is thread-safe and you need to use the handle to check if the upload has finished / check progress - */ -void http_submitUploadQueue(const std::string& url, const std::vector& data, UploadQueueCallback updateCallback, void* userdata); - -void http_exit(); \ No newline at end of file diff --git a/source/utils/http_caroot.h b/source/utils/http_caroot.h deleted file mode 100644 index 1d7c86e..0000000 --- a/source/utils/http_caroot.h +++ /dev/null @@ -1,206 +0,0 @@ -#pragma once - -/* -This corresponds to ISRG Root X1 (the current SpotPass upload server is using a Let's Encrypt R3 cert) - -This cert: https://letsencrypt.org/certs/isrgrootx1.pem - ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- -*/ - -static const unsigned char caroot_pem[] = { - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, - 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x46, 0x61, 0x7a, 0x43, 0x43, - 0x41, 0x31, 0x4f, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x52, - 0x41, 0x49, 0x49, 0x51, 0x7a, 0x37, 0x44, 0x53, 0x51, 0x4f, 0x4e, 0x5a, - 0x52, 0x47, 0x50, 0x67, 0x75, 0x32, 0x4f, 0x43, 0x69, 0x77, 0x41, 0x77, - 0x44, 0x51, 0x59, 0x4a, 0x4b, 0x6f, 0x5a, 0x49, 0x68, 0x76, 0x63, 0x4e, - 0x41, 0x51, 0x45, 0x4c, 0x42, 0x51, 0x41, 0x77, 0x0a, 0x54, 0x7a, 0x45, - 0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, - 0x43, 0x56, 0x56, 0x4d, 0x78, 0x4b, 0x54, 0x41, 0x6e, 0x42, 0x67, 0x4e, - 0x56, 0x42, 0x41, 0x6f, 0x54, 0x49, 0x45, 0x6c, 0x75, 0x64, 0x47, 0x56, - 0x79, 0x62, 0x6d, 0x56, 0x30, 0x49, 0x46, 0x4e, 0x6c, 0x59, 0x33, 0x56, - 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x46, 0x4a, 0x6c, 0x63, 0x32, 0x56, - 0x68, 0x0a, 0x63, 0x6d, 0x4e, 0x6f, 0x49, 0x45, 0x64, 0x79, 0x62, 0x33, - 0x56, 0x77, 0x4d, 0x52, 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, - 0x51, 0x44, 0x45, 0x77, 0x78, 0x4a, 0x55, 0x31, 0x4a, 0x48, 0x49, 0x46, - 0x4a, 0x76, 0x62, 0x33, 0x51, 0x67, 0x57, 0x44, 0x45, 0x77, 0x48, 0x68, - 0x63, 0x4e, 0x4d, 0x54, 0x55, 0x77, 0x4e, 0x6a, 0x41, 0x30, 0x4d, 0x54, - 0x45, 0x77, 0x4e, 0x44, 0x4d, 0x34, 0x0a, 0x57, 0x68, 0x63, 0x4e, 0x4d, - 0x7a, 0x55, 0x77, 0x4e, 0x6a, 0x41, 0x30, 0x4d, 0x54, 0x45, 0x77, 0x4e, - 0x44, 0x4d, 0x34, 0x57, 0x6a, 0x42, 0x50, 0x4d, 0x51, 0x73, 0x77, 0x43, - 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4a, 0x56, 0x55, - 0x7a, 0x45, 0x70, 0x4d, 0x43, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, - 0x68, 0x4d, 0x67, 0x53, 0x57, 0x35, 0x30, 0x5a, 0x58, 0x4a, 0x75, 0x0a, - 0x5a, 0x58, 0x51, 0x67, 0x55, 0x32, 0x56, 0x6a, 0x64, 0x58, 0x4a, 0x70, - 0x64, 0x48, 0x6b, 0x67, 0x55, 0x6d, 0x56, 0x7a, 0x5a, 0x57, 0x46, 0x79, - 0x59, 0x32, 0x67, 0x67, 0x52, 0x33, 0x4a, 0x76, 0x64, 0x58, 0x41, 0x78, - 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x4d, 0x54, - 0x44, 0x45, 0x6c, 0x54, 0x55, 0x6b, 0x63, 0x67, 0x55, 0x6d, 0x39, 0x76, - 0x64, 0x43, 0x42, 0x59, 0x0a, 0x4d, 0x54, 0x43, 0x43, 0x41, 0x69, 0x49, - 0x77, 0x44, 0x51, 0x59, 0x4a, 0x4b, 0x6f, 0x5a, 0x49, 0x68, 0x76, 0x63, - 0x4e, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, - 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6f, 0x43, 0x67, 0x67, 0x49, - 0x42, 0x41, 0x4b, 0x33, 0x6f, 0x4a, 0x48, 0x50, 0x30, 0x46, 0x44, 0x66, - 0x7a, 0x6d, 0x35, 0x34, 0x72, 0x56, 0x79, 0x67, 0x63, 0x0a, 0x68, 0x37, - 0x37, 0x63, 0x74, 0x39, 0x38, 0x34, 0x6b, 0x49, 0x78, 0x75, 0x50, 0x4f, - 0x5a, 0x58, 0x6f, 0x48, 0x6a, 0x33, 0x64, 0x63, 0x4b, 0x69, 0x2f, 0x76, - 0x56, 0x71, 0x62, 0x76, 0x59, 0x41, 0x54, 0x79, 0x6a, 0x62, 0x33, 0x6d, - 0x69, 0x47, 0x62, 0x45, 0x53, 0x54, 0x74, 0x72, 0x46, 0x6a, 0x2f, 0x52, - 0x51, 0x53, 0x61, 0x37, 0x38, 0x66, 0x30, 0x75, 0x6f, 0x78, 0x6d, 0x79, - 0x46, 0x2b, 0x0a, 0x30, 0x54, 0x4d, 0x38, 0x75, 0x6b, 0x6a, 0x31, 0x33, - 0x58, 0x6e, 0x66, 0x73, 0x37, 0x6a, 0x2f, 0x45, 0x76, 0x45, 0x68, 0x6d, - 0x6b, 0x76, 0x42, 0x69, 0x6f, 0x5a, 0x78, 0x61, 0x55, 0x70, 0x6d, 0x5a, - 0x6d, 0x79, 0x50, 0x66, 0x6a, 0x78, 0x77, 0x76, 0x36, 0x30, 0x70, 0x49, - 0x67, 0x62, 0x7a, 0x35, 0x4d, 0x44, 0x6d, 0x67, 0x4b, 0x37, 0x69, 0x53, - 0x34, 0x2b, 0x33, 0x6d, 0x58, 0x36, 0x55, 0x0a, 0x41, 0x35, 0x2f, 0x54, - 0x52, 0x35, 0x64, 0x38, 0x6d, 0x55, 0x67, 0x6a, 0x55, 0x2b, 0x67, 0x34, - 0x72, 0x6b, 0x38, 0x4b, 0x62, 0x34, 0x4d, 0x75, 0x30, 0x55, 0x6c, 0x58, - 0x6a, 0x49, 0x42, 0x30, 0x74, 0x74, 0x6f, 0x76, 0x30, 0x44, 0x69, 0x4e, - 0x65, 0x77, 0x4e, 0x77, 0x49, 0x52, 0x74, 0x31, 0x38, 0x6a, 0x41, 0x38, - 0x2b, 0x6f, 0x2b, 0x75, 0x33, 0x64, 0x70, 0x6a, 0x71, 0x2b, 0x73, 0x57, - 0x0a, 0x54, 0x38, 0x4b, 0x4f, 0x45, 0x55, 0x74, 0x2b, 0x7a, 0x77, 0x76, - 0x6f, 0x2f, 0x37, 0x56, 0x33, 0x4c, 0x76, 0x53, 0x79, 0x65, 0x30, 0x72, - 0x67, 0x54, 0x42, 0x49, 0x6c, 0x44, 0x48, 0x43, 0x4e, 0x41, 0x79, 0x6d, - 0x67, 0x34, 0x56, 0x4d, 0x6b, 0x37, 0x42, 0x50, 0x5a, 0x37, 0x68, 0x6d, - 0x2f, 0x45, 0x4c, 0x4e, 0x4b, 0x6a, 0x44, 0x2b, 0x4a, 0x6f, 0x32, 0x46, - 0x52, 0x33, 0x71, 0x79, 0x48, 0x0a, 0x42, 0x35, 0x54, 0x30, 0x59, 0x33, - 0x48, 0x73, 0x4c, 0x75, 0x4a, 0x76, 0x57, 0x35, 0x69, 0x42, 0x34, 0x59, - 0x6c, 0x63, 0x4e, 0x48, 0x6c, 0x73, 0x64, 0x75, 0x38, 0x37, 0x6b, 0x47, - 0x4a, 0x35, 0x35, 0x74, 0x75, 0x6b, 0x6d, 0x69, 0x38, 0x6d, 0x78, 0x64, - 0x41, 0x51, 0x34, 0x51, 0x37, 0x65, 0x32, 0x52, 0x43, 0x4f, 0x46, 0x76, - 0x75, 0x33, 0x39, 0x36, 0x6a, 0x33, 0x78, 0x2b, 0x55, 0x43, 0x0a, 0x42, - 0x35, 0x69, 0x50, 0x4e, 0x67, 0x69, 0x56, 0x35, 0x2b, 0x49, 0x33, 0x6c, - 0x67, 0x30, 0x32, 0x64, 0x5a, 0x37, 0x37, 0x44, 0x6e, 0x4b, 0x78, 0x48, - 0x5a, 0x75, 0x38, 0x41, 0x2f, 0x6c, 0x4a, 0x42, 0x64, 0x69, 0x42, 0x33, - 0x51, 0x57, 0x30, 0x4b, 0x74, 0x5a, 0x42, 0x36, 0x61, 0x77, 0x42, 0x64, - 0x70, 0x55, 0x4b, 0x44, 0x39, 0x6a, 0x66, 0x31, 0x62, 0x30, 0x53, 0x48, - 0x7a, 0x55, 0x76, 0x0a, 0x4b, 0x42, 0x64, 0x73, 0x30, 0x70, 0x6a, 0x42, - 0x71, 0x41, 0x6c, 0x6b, 0x64, 0x32, 0x35, 0x48, 0x4e, 0x37, 0x72, 0x4f, - 0x72, 0x46, 0x6c, 0x65, 0x61, 0x4a, 0x31, 0x2f, 0x63, 0x74, 0x61, 0x4a, - 0x78, 0x51, 0x5a, 0x42, 0x4b, 0x54, 0x35, 0x5a, 0x50, 0x74, 0x30, 0x6d, - 0x39, 0x53, 0x54, 0x4a, 0x45, 0x61, 0x64, 0x61, 0x6f, 0x30, 0x78, 0x41, - 0x48, 0x30, 0x61, 0x68, 0x6d, 0x62, 0x57, 0x6e, 0x0a, 0x4f, 0x6c, 0x46, - 0x75, 0x68, 0x6a, 0x75, 0x65, 0x66, 0x58, 0x4b, 0x6e, 0x45, 0x67, 0x56, - 0x34, 0x57, 0x65, 0x30, 0x2b, 0x55, 0x58, 0x67, 0x56, 0x43, 0x77, 0x4f, - 0x50, 0x6a, 0x64, 0x41, 0x76, 0x42, 0x62, 0x49, 0x2b, 0x65, 0x30, 0x6f, - 0x63, 0x53, 0x33, 0x4d, 0x46, 0x45, 0x76, 0x7a, 0x47, 0x36, 0x75, 0x42, - 0x51, 0x45, 0x33, 0x78, 0x44, 0x6b, 0x33, 0x53, 0x7a, 0x79, 0x6e, 0x54, - 0x6e, 0x0a, 0x6a, 0x68, 0x38, 0x42, 0x43, 0x4e, 0x41, 0x77, 0x31, 0x46, - 0x74, 0x78, 0x4e, 0x72, 0x51, 0x48, 0x75, 0x73, 0x45, 0x77, 0x4d, 0x46, - 0x78, 0x49, 0x74, 0x34, 0x49, 0x37, 0x6d, 0x4b, 0x5a, 0x39, 0x59, 0x49, - 0x71, 0x69, 0x6f, 0x79, 0x6d, 0x43, 0x7a, 0x4c, 0x71, 0x39, 0x67, 0x77, - 0x51, 0x62, 0x6f, 0x6f, 0x4d, 0x44, 0x51, 0x61, 0x48, 0x57, 0x42, 0x66, - 0x45, 0x62, 0x77, 0x72, 0x62, 0x77, 0x0a, 0x71, 0x48, 0x79, 0x47, 0x4f, - 0x30, 0x61, 0x6f, 0x53, 0x43, 0x71, 0x49, 0x33, 0x48, 0x61, 0x61, 0x64, - 0x72, 0x38, 0x66, 0x61, 0x71, 0x55, 0x39, 0x47, 0x59, 0x2f, 0x72, 0x4f, - 0x50, 0x4e, 0x6b, 0x33, 0x73, 0x67, 0x72, 0x44, 0x51, 0x6f, 0x6f, 0x2f, - 0x2f, 0x66, 0x62, 0x34, 0x68, 0x56, 0x43, 0x31, 0x43, 0x4c, 0x51, 0x4a, - 0x31, 0x33, 0x68, 0x65, 0x66, 0x34, 0x59, 0x35, 0x33, 0x43, 0x49, 0x0a, - 0x72, 0x55, 0x37, 0x6d, 0x32, 0x59, 0x73, 0x36, 0x78, 0x74, 0x30, 0x6e, - 0x55, 0x57, 0x37, 0x2f, 0x76, 0x47, 0x54, 0x31, 0x4d, 0x30, 0x4e, 0x50, - 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x47, 0x6a, 0x51, 0x6a, 0x42, 0x41, - 0x4d, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, - 0x2f, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6a, 0x41, 0x50, - 0x42, 0x67, 0x4e, 0x56, 0x0a, 0x48, 0x52, 0x4d, 0x42, 0x41, 0x66, 0x38, - 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2f, 0x4d, 0x42, 0x30, - 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, - 0x35, 0x74, 0x46, 0x6e, 0x6d, 0x65, 0x37, 0x62, 0x6c, 0x35, 0x41, 0x46, - 0x7a, 0x67, 0x41, 0x69, 0x49, 0x79, 0x42, 0x70, 0x59, 0x39, 0x75, 0x6d, - 0x62, 0x62, 0x6a, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x0a, 0x68, 0x6b, - 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, - 0x4f, 0x43, 0x41, 0x67, 0x45, 0x41, 0x56, 0x52, 0x39, 0x59, 0x71, 0x62, - 0x79, 0x79, 0x71, 0x46, 0x44, 0x51, 0x44, 0x4c, 0x48, 0x59, 0x47, 0x6d, - 0x6b, 0x67, 0x4a, 0x79, 0x6b, 0x49, 0x72, 0x47, 0x46, 0x31, 0x58, 0x49, - 0x70, 0x75, 0x2b, 0x49, 0x4c, 0x6c, 0x61, 0x53, 0x2f, 0x56, 0x39, 0x6c, - 0x5a, 0x4c, 0x0a, 0x75, 0x62, 0x68, 0x7a, 0x45, 0x46, 0x6e, 0x54, 0x49, - 0x5a, 0x64, 0x2b, 0x35, 0x30, 0x78, 0x78, 0x2b, 0x37, 0x4c, 0x53, 0x59, - 0x4b, 0x30, 0x35, 0x71, 0x41, 0x76, 0x71, 0x46, 0x79, 0x46, 0x57, 0x68, - 0x66, 0x46, 0x51, 0x44, 0x6c, 0x6e, 0x72, 0x7a, 0x75, 0x42, 0x5a, 0x36, - 0x62, 0x72, 0x4a, 0x46, 0x65, 0x2b, 0x47, 0x6e, 0x59, 0x2b, 0x45, 0x67, - 0x50, 0x62, 0x6b, 0x36, 0x5a, 0x47, 0x51, 0x0a, 0x33, 0x42, 0x65, 0x62, - 0x59, 0x68, 0x74, 0x46, 0x38, 0x47, 0x61, 0x56, 0x30, 0x6e, 0x78, 0x76, - 0x77, 0x75, 0x6f, 0x37, 0x37, 0x78, 0x2f, 0x50, 0x79, 0x39, 0x61, 0x75, - 0x4a, 0x2f, 0x47, 0x70, 0x73, 0x4d, 0x69, 0x75, 0x2f, 0x58, 0x31, 0x2b, - 0x6d, 0x76, 0x6f, 0x69, 0x42, 0x4f, 0x76, 0x2f, 0x32, 0x58, 0x2f, 0x71, - 0x6b, 0x53, 0x73, 0x69, 0x73, 0x52, 0x63, 0x4f, 0x6a, 0x2f, 0x4b, 0x4b, - 0x0a, 0x4e, 0x46, 0x74, 0x59, 0x32, 0x50, 0x77, 0x42, 0x79, 0x56, 0x53, - 0x35, 0x75, 0x43, 0x62, 0x4d, 0x69, 0x6f, 0x67, 0x7a, 0x69, 0x55, 0x77, - 0x74, 0x68, 0x44, 0x79, 0x43, 0x33, 0x2b, 0x36, 0x57, 0x56, 0x77, 0x57, - 0x36, 0x4c, 0x4c, 0x76, 0x33, 0x78, 0x4c, 0x66, 0x48, 0x54, 0x6a, 0x75, - 0x43, 0x76, 0x6a, 0x48, 0x49, 0x49, 0x6e, 0x4e, 0x7a, 0x6b, 0x74, 0x48, - 0x43, 0x67, 0x4b, 0x51, 0x35, 0x0a, 0x4f, 0x52, 0x41, 0x7a, 0x49, 0x34, - 0x4a, 0x4d, 0x50, 0x4a, 0x2b, 0x47, 0x73, 0x6c, 0x57, 0x59, 0x48, 0x62, - 0x34, 0x70, 0x68, 0x6f, 0x77, 0x69, 0x6d, 0x35, 0x37, 0x69, 0x61, 0x7a, - 0x74, 0x58, 0x4f, 0x6f, 0x4a, 0x77, 0x54, 0x64, 0x77, 0x4a, 0x78, 0x34, - 0x6e, 0x4c, 0x43, 0x67, 0x64, 0x4e, 0x62, 0x4f, 0x68, 0x64, 0x6a, 0x73, - 0x6e, 0x76, 0x7a, 0x71, 0x76, 0x48, 0x75, 0x37, 0x55, 0x72, 0x0a, 0x54, - 0x6b, 0x58, 0x57, 0x53, 0x74, 0x41, 0x6d, 0x7a, 0x4f, 0x56, 0x79, 0x79, - 0x67, 0x68, 0x71, 0x70, 0x5a, 0x58, 0x6a, 0x46, 0x61, 0x48, 0x33, 0x70, - 0x4f, 0x33, 0x4a, 0x4c, 0x46, 0x2b, 0x6c, 0x2b, 0x2f, 0x2b, 0x73, 0x4b, - 0x41, 0x49, 0x75, 0x76, 0x74, 0x64, 0x37, 0x75, 0x2b, 0x4e, 0x78, 0x65, - 0x35, 0x41, 0x57, 0x30, 0x77, 0x64, 0x65, 0x52, 0x6c, 0x4e, 0x38, 0x4e, - 0x77, 0x64, 0x43, 0x0a, 0x6a, 0x4e, 0x50, 0x45, 0x6c, 0x70, 0x7a, 0x56, - 0x6d, 0x62, 0x55, 0x71, 0x34, 0x4a, 0x55, 0x61, 0x67, 0x45, 0x69, 0x75, - 0x54, 0x44, 0x6b, 0x48, 0x7a, 0x73, 0x78, 0x48, 0x70, 0x46, 0x4b, 0x56, - 0x4b, 0x37, 0x71, 0x34, 0x2b, 0x36, 0x33, 0x53, 0x4d, 0x31, 0x4e, 0x39, - 0x35, 0x52, 0x31, 0x4e, 0x62, 0x64, 0x57, 0x68, 0x73, 0x63, 0x64, 0x43, - 0x62, 0x2b, 0x5a, 0x41, 0x4a, 0x7a, 0x56, 0x63, 0x0a, 0x6f, 0x79, 0x69, - 0x33, 0x42, 0x34, 0x33, 0x6e, 0x6a, 0x54, 0x4f, 0x51, 0x35, 0x79, 0x4f, - 0x66, 0x2b, 0x31, 0x43, 0x63, 0x65, 0x57, 0x78, 0x47, 0x31, 0x62, 0x51, - 0x56, 0x73, 0x35, 0x5a, 0x75, 0x66, 0x70, 0x73, 0x4d, 0x6c, 0x6a, 0x71, - 0x34, 0x55, 0x69, 0x30, 0x2f, 0x31, 0x6c, 0x76, 0x68, 0x2b, 0x77, 0x6a, - 0x43, 0x68, 0x50, 0x34, 0x6b, 0x71, 0x4b, 0x4f, 0x4a, 0x32, 0x71, 0x78, - 0x71, 0x0a, 0x34, 0x52, 0x67, 0x71, 0x73, 0x61, 0x68, 0x44, 0x59, 0x56, - 0x76, 0x54, 0x48, 0x39, 0x77, 0x37, 0x6a, 0x58, 0x62, 0x79, 0x4c, 0x65, - 0x69, 0x4e, 0x64, 0x64, 0x38, 0x58, 0x4d, 0x32, 0x77, 0x39, 0x55, 0x2f, - 0x74, 0x37, 0x79, 0x30, 0x46, 0x66, 0x2f, 0x39, 0x79, 0x69, 0x30, 0x47, - 0x45, 0x34, 0x34, 0x5a, 0x61, 0x34, 0x72, 0x46, 0x32, 0x4c, 0x4e, 0x39, - 0x64, 0x31, 0x31, 0x54, 0x50, 0x41, 0x0a, 0x6d, 0x52, 0x47, 0x75, 0x6e, - 0x55, 0x48, 0x42, 0x63, 0x6e, 0x57, 0x45, 0x76, 0x67, 0x4a, 0x42, 0x51, - 0x6c, 0x39, 0x6e, 0x4a, 0x45, 0x69, 0x55, 0x30, 0x5a, 0x73, 0x6e, 0x76, - 0x67, 0x63, 0x2f, 0x75, 0x62, 0x68, 0x50, 0x67, 0x58, 0x52, 0x52, 0x34, - 0x58, 0x71, 0x33, 0x37, 0x5a, 0x30, 0x6a, 0x34, 0x72, 0x37, 0x67, 0x31, - 0x53, 0x67, 0x45, 0x45, 0x7a, 0x77, 0x78, 0x41, 0x35, 0x37, 0x64, 0x0a, - 0x65, 0x6d, 0x79, 0x50, 0x78, 0x67, 0x63, 0x59, 0x78, 0x6e, 0x2f, 0x65, - 0x52, 0x34, 0x34, 0x2f, 0x4b, 0x4a, 0x34, 0x45, 0x42, 0x73, 0x2b, 0x6c, - 0x56, 0x44, 0x52, 0x33, 0x76, 0x65, 0x79, 0x4a, 0x6d, 0x2b, 0x6b, 0x58, - 0x51, 0x39, 0x39, 0x62, 0x32, 0x31, 0x2f, 0x2b, 0x6a, 0x68, 0x35, 0x58, - 0x6f, 0x73, 0x31, 0x41, 0x6e, 0x58, 0x35, 0x69, 0x49, 0x74, 0x72, 0x65, - 0x47, 0x43, 0x63, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, - 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, - 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a -}; - -static const unsigned int caroot_pem_len = 1939;