From d9b66457917dc1bf7cf487f80796a9eee127839c Mon Sep 17 00:00:00 2001 From: Alexey Karimov Date: Thu, 8 Oct 2026 11:34:02 +0500 Subject: [PATCH 1/2] feat(elf): upgrade a stored symbol table to DWARF without --force MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A library first uploaded as an AGP SYMBOL_TABLE (.so.sym) and later available with debug info shares one GNU build-id, so the server skipped the richer file and the only remedy was --force, which re-sends every library in the run. Each native library now declares what it can symbolicate (`format_variant`: "dwarf" or "symtab", read from the file itself, never its name) and asks the server to replace a poorer stored copy (`replace_if_richer: true`). The server (bugsee-appserver#65-67) then decides: - stored symtab, local dwarf: replaced, bytes transferred once, logged as "upgraded SYMBOL_TABLE -> FULL" and counted in the run summary - same file again, or a symtab when the server holds dwarf: 16004, no PUT - --force is unchanged ("always replace") and still declares the variant The 16004 reply may now carry the stored variant. A dwarf library skipped without the server saying what it holds means a server that predates this, and only then is the "re-run with --force" advice still printed. Both new Metadata fields are omitted from every other flow's wire body, and an older server ignores them. `Outcome` and `presigned::upload` are unchanged; the ELF flow uses the new `upload_detailed`. Ship order: the appserver change is deployed first, then this release, then the Gradle plugin's version floor. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- README.md | 2 +- src/cli/debug_files.rs | 117 ++++++--- src/symbols/elf.rs | 54 ++++ src/upload/presigned.rs | 330 ++++++++++++++++++++++-- tests/elf_upload.rs | 211 +++++++++++++++ tests/fixtures/elf/libsymbol1.symtab.so | Bin 0 -> 427464 bytes 6 files changed, 663 insertions(+), 51 deletions(-) create mode 100644 tests/fixtures/elf/libsymbol1.symtab.so diff --git a/README.md b/README.md index ae02a61..4b5b1dd 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ The upload flow itself. ProGuard, Rust, ELF, dSYM, PDB, sourcemap, and Unity IL2 #### Android NDK — `--type elf` -Takes one or more paths: AGP's pre-built `native-debug-symbols.zip`, and/or directories, which are walked recursively for libraries (e.g. `build/intermediates/merged_native_libs/`) and read in place — nothing is re-zipped. Directory symlinks are not descended; an unreadable entry fails the run (exit 11) and a directory with no libraries exits 10. Every library found is uploaded as its own symbol, keyed by its GNU build-id — `--uuid` (the SDK's `BUILD_UUID`) is still required but only correlates logs. Built-in entry names are `.so`, `.so.dbg` (`ndk.debugSymbolLevel = 'FULL'`) and `.so.sym` (`'SYMBOL_TABLE'`, function names only — no `file:line`). A library without a build-id is warned about and skipped; two entries with the same build-id upload once (across all the given paths), preferring the one with DWARF. The server dedups on the build-id, so switching a library from `SYMBOL_TABLE` to `FULL` needs `--force` to replace the stored symbols. +Takes one or more paths: AGP's pre-built `native-debug-symbols.zip`, and/or directories, which are walked recursively for libraries (e.g. `build/intermediates/merged_native_libs/`) and read in place — nothing is re-zipped. Directory symlinks are not descended; an unreadable entry fails the run (exit 11) and a directory with no libraries exits 10. Every library found is uploaded as its own symbol, keyed by its GNU build-id — `--uuid` (the SDK's `BUILD_UUID`) is still required but only correlates logs. Built-in entry names are `.so`, `.so.dbg` (`ndk.debugSymbolLevel = 'FULL'`) and `.so.sym` (`'SYMBOL_TABLE'`, function names only — no `file:line`). A library without a build-id is warned about and skipped; two entries with the same build-id upload once (across all the given paths), preferring the one with DWARF. The server dedups on the build-id, and each library declares whether it carries debug info (`dwarf`) or only a symbol table (`symtab`), read from the file itself rather than its name. Switching a library from `SYMBOL_TABLE` to `FULL` therefore replaces the stored symbols on its own, transferring the bytes once (the run logs `upgraded SYMBOL_TABLE -> FULL`); re-running with the same file, or uploading a symbol table when the server holds debug info, transfers nothing. `--force` still means "always replace" and re-sends every library. A server that predates this behaviour skips the `FULL` upload as already present; the run then says so and `--force` is the only way to replace it. #### Unity IL2CPP — `--type il2cpp-linemap` diff --git a/src/cli/debug_files.rs b/src/cli/debug_files.rs index 068ca0c..aa53b47 100644 --- a/src/cli/debug_files.rs +++ b/src/cli/debug_files.rs @@ -102,11 +102,14 @@ pub enum DebugFilesCommand { /// `--type sourcemaps` — sets `overwrite` on the metadata POST so /// format-scoped peers are replaced. Proguard ignores this flag today. /// - /// For `--type elf` this is how richer symbols replace poorer ones: an - /// AGP `SYMBOL_TABLE` upload (`.so.sym`, function names only) and a later - /// `FULL` one (`.so.dbg`, with line info) of the same library share its - /// GNU build-id, so without `--force` the `FULL` upload is skipped as - /// already present. + /// For `--type elf` it is rarely needed: each library declares whether it + /// carries debug info or only a symbol table, and the server replaces a + /// stored symbol table with a later `FULL` one (`.so.dbg`, with line info) + /// of the same GNU build-id on its own — transferring it once, and nothing + /// when the server already holds the same or a richer copy (it never + /// downgrades). `--force` means "always replace", re-sending every + /// library, so use it only to replace a symbol a server that predates + /// that behaviour is still holding. #[arg(long)] force: bool, @@ -587,6 +590,8 @@ async fn run_proguard_upload( format: Some("mapping"), uuids: None, overwrite: None, + format_variant: None, + replace_if_richer: None, }; let client = client.as_ref().expect("client constructed when !dry_run"); let outcome = presigned::upload( @@ -821,6 +826,8 @@ async fn run_pdb_upload( format: Some("pdb"), uuids: None, overwrite: if force { Some(true) } else { None }, + format_variant: None, + replace_if_richer: None, }; let outcome = presigned::upload( client.as_ref().expect("client built when not dry-run"), @@ -1019,6 +1026,8 @@ async fn run_rust_elf_upload( format: Some("elf"), uuids: None, overwrite: if force { Some(true) } else { None }, + format_variant: None, + replace_if_richer: None, }; let outcome = presigned::upload( client.as_ref().expect("client built when not dry-run"), @@ -1182,6 +1191,7 @@ async fn run_elf_upload( // Skipped libraries that carry full debug info (`.so` / `.so.dbg`). The // server dedups on build-id alone, so one of these may have been skipped in // favour of an earlier `SYMBOL_TABLE` (`.so.sym`) upload of the same library. + let mut upgraded = 0u32; let mut full_already_existed = 0u32; let mut skipped_no_build_id = 0u32; @@ -1282,27 +1292,38 @@ async fn run_elf_upload( let client = client.as_ref().expect("client constructed when !dry_run"); // Run each `.so`'s pack → register → dedup-or-PUT pipeline concurrently. - let outcomes: Vec<(bool, anyhow::Result)> = - futures_util::stream::iter(uploadable.into_iter().enumerate()) - .map(|(i, lib)| { - let client = client.clone(); - let work = work_dir.path().to_path_buf(); - async move { - let symbol_table_only = lib.name.ends_with(".so.sym"); - let outcome = upload_one_so(&client, ctx, &lib, i, &work).await; - (symbol_table_only, outcome) - } - }) - .buffer_unordered(ELF_UPLOAD_CONCURRENCY) - .collect() - .await; + let outcomes: Vec<( + Option<&'static str>, + anyhow::Result, + )> = futures_util::stream::iter(uploadable.into_iter().enumerate()) + .map(|(i, lib)| { + let client = client.clone(); + let work = work_dir.path().to_path_buf(); + async move { + let variant = lib.format_variant(); + let detail = upload_one_so(&client, ctx, &lib, i, &work).await; + (variant, detail) + } + }) + .buffer_unordered(ELF_UPLOAD_CONCURRENCY) + .collect() + .await; - for (symbol_table_only, outcome) in outcomes { - match outcome? { - presigned::Outcome::Uploaded => uploaded += 1, + for (variant, detail) in outcomes { + let detail = detail?; + match detail.outcome { + presigned::Outcome::Uploaded => { + uploaded += 1; + if detail.upgraded { + upgraded += 1; + } + } presigned::Outcome::AlreadyExists => { already_existed += 1; - if !symbol_table_only { + // A full-debug-info library skipped WITHOUT the server saying what + // it holds: a server that predates `replace_if_richer` (a current + // one replaces a poorer copy, or reports the richer one it keeps). + if variant == Some("dwarf") && detail.stored.is_none() { full_already_existed += 1; } } @@ -1315,20 +1336,22 @@ async fn run_elf_upload( } else { tracing::info!( uploaded, + upgraded, already_existed, skipped_no_build_id, "native upload complete" ); - // Never overwrite automatically: that would re-upload every unchanged - // library on every build. The CLI cannot see what the server holds, so - // say how to replace it when that is what the caller wants. + // A current server replaces a poorer stored copy on its own, so this + // only fires against one that predates that: it skipped a library with + // debug info without saying what it holds, and `--force` is then the + // only way to replace it (it re-sends every library, so it is not the default). if full_already_existed > 0 && !force { tracing::info!( libraries = full_already_existed, "full-debug-info libraries were skipped as already on the server; if \ they were previously uploaded with ndk.debugSymbolLevel = \ - 'SYMBOL_TABLE' (.so.sym, no line info), re-run with --force to \ - replace them" + 'SYMBOL_TABLE' (.so.sym, no line info), this server cannot upgrade \ + them on its own — re-run with --force to replace them" ); } } @@ -1345,7 +1368,7 @@ async fn upload_one_so( lib: &elf::ElfLib, index: usize, work_dir: &Path, -) -> anyhow::Result { +) -> anyhow::Result { let build_id = lib .build_id .as_deref() @@ -1375,8 +1398,14 @@ async fn upload_one_so( format: Some("elf"), uuids: None, overwrite: if ctx.force { Some(true) } else { None }, + // Declare how rich this file is and let the server decide whether it + // beats what it holds: a `symtab` -> `dwarf` upgrade transfers once, an + // unchanged or poorer library transfers nothing. `--force` (overwrite) + // still means "always replace". + format_variant: lib.format_variant(), + replace_if_richer: Some(true), }; - let outcome = presigned::upload( + let detail = presigned::upload_detailed( client, RetryPolicy::default(), ctx.endpoint, @@ -1385,15 +1414,27 @@ async fn upload_one_so( &zip_path, ) .await?; - match outcome { + match detail.outcome { + presigned::Outcome::Uploaded if detail.upgraded => { + tracing::info!( + lib = %lib.name, + build_id, + "uploaded (upgraded SYMBOL_TABLE -> FULL)" + ) + } presigned::Outcome::Uploaded => { tracing::info!(lib = %lib.name, build_id, "uploaded") } presigned::Outcome::AlreadyExists => { - tracing::info!(lib = %lib.name, build_id, "already on server, skipped") + tracing::info!( + lib = %lib.name, + build_id, + stored = detail.stored.map(presigned::Variant::as_str), + "already on server at the same or better level, skipped" + ) } } - Ok(outcome) + Ok(detail) } /// Pack and upload a Unity IL2CPP LineNumberMappings bundle. @@ -1513,6 +1554,8 @@ async fn run_il2cpp_linemap_upload( format: Some("il2cpp-linemap"), uuids: Some(&uuids), overwrite: if force { Some(true) } else { None }, + format_variant: None, + replace_if_richer: None, }; let outcome = presigned::upload( client.as_ref().expect("client built when not dry-run"), @@ -1631,6 +1674,8 @@ async fn upload_one_sourcemap( format: Some("sourcemap"), uuids: None, overwrite: if ctx.force { Some(true) } else { None }, + format_variant: None, + replace_if_richer: None, }; let client = client.expect("client constructed when !dry_run"); let outcome = presigned::upload( @@ -2108,6 +2153,8 @@ pub(crate) async fn run_dsym_upload( format: Some("dsym"), uuids: Some(&slice_uuids), overwrite: if force { Some(true) } else { None }, + format_variant: None, + replace_if_richer: None, }; if dry_run { @@ -2132,7 +2179,7 @@ pub(crate) async fn run_dsym_upload( ) .await? { - presigned::Registration::AlreadyExists => { + presigned::Registration::AlreadyExists { .. } => { already_existed += 1; tracing::info!( bundle = bundle_name, @@ -2140,7 +2187,7 @@ pub(crate) async fn run_dsym_upload( ); continue; } - presigned::Registration::Proceed { presigned_url } => presigned_url, + presigned::Registration::Proceed { presigned_url, .. } => presigned_url, }; // The server wants it — only NOW pack the (possibly large) bundle. diff --git a/src/symbols/elf.rs b/src/symbols/elf.rs index dc20bfa..06ab364 100644 --- a/src/symbols/elf.rs +++ b/src/symbols/elf.rs @@ -74,6 +74,19 @@ pub struct ElfLib { richness: (bool, bool, u64), } +impl ElfLib { + /// What this library can symbolicate, as the server's `format_variant`: + /// `"dwarf"` (debug info), `"symtab"` (symbol table only), or `None` for a + /// library carrying neither — it has no richness to declare. + pub fn format_variant(&self) -> Option<&'static str> { + match self.richness { + (true, _, _) => Some("dwarf"), + (false, true, _) => Some("symtab"), + _ => None, + } + } +} + /// Extract every ELF `.so` from `archive_path` into `out_dir`, reading each /// library's GNU build-id. An entry counts as a library when its name ends in /// a built-in suffix (see [`is_native_lib_entry`]) or one of `extra`. The wire `code_id` is produced by the same @@ -782,6 +795,47 @@ mod tests { } } + #[test] + fn format_variant_reports_what_a_library_can_symbolicate() { + // Debug info wins whatever else the file carries; a symbol table alone is + // `symtab`; a library with neither has no richness to declare. + assert_eq!( + lib("a.so", None, (true, true, 1)).format_variant(), + Some("dwarf") + ); + assert_eq!( + lib("a.so", None, (true, false, 1)).format_variant(), + Some("dwarf") + ); + assert_eq!( + lib("a.so", None, (false, true, 1)).format_variant(), + Some("symtab") + ); + assert_eq!(lib("a.so", None, (false, false, 1)).format_variant(), None); + } + + /// The real fixtures, end to end through the identity reader: the unstripped + /// library is `dwarf`, the same library with its debug sections removed is + /// `symtab`, and both carry ONE build-id — which is exactly why the server needs + /// the variant to tell them apart. + #[test] + fn real_fixtures_classify_as_dwarf_and_symtab_with_one_build_id() { + let dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/elf"); + let scanned = scan_dir(&dir, &ExtraSuffixes::default()).unwrap(); + let variant_of = |name: &str| { + scanned + .iter() + .find(|l| l.name == name) + .unwrap_or_else(|| panic!("{name} not scanned")) + }; + let full = variant_of("libsymbol1.so"); + let table = variant_of("libsymbol1.symtab.so"); + assert_eq!(full.format_variant(), Some("dwarf")); + assert_eq!(table.format_variant(), Some("symtab")); + assert_eq!(full.build_id, table.build_id); + assert!(full.build_id.is_some()); + } + fn names(libs: &[ElfLib]) -> Vec<&str> { libs.iter().map(|l| l.name.as_str()).collect() } diff --git a/src/upload/presigned.rs b/src/upload/presigned.rs index 99711fb..1b62d89 100644 --- a/src/upload/presigned.rs +++ b/src/upload/presigned.rs @@ -71,6 +71,57 @@ pub struct Metadata<'a> { /// has these symbols (maps to the server's `overwrite`). #[serde(skip_serializing_if = "Option::is_none")] pub overwrite: Option, + + /// Native ELF only: what this file can symbolicate — `"symtab"` (symbol + /// table, function names) or `"dwarf"` (debug info, file:line). The server + /// stores it so a later upload of the same build-id can be compared with it. + /// Absent for a library that carries neither. + #[serde(skip_serializing_if = "Option::is_none")] + pub format_variant: Option<&'a str>, + + /// Native ELF only: replace the stored copy when this file is richer + /// (`symtab` -> `dwarf`), never otherwise. Unlike `overwrite` it does not + /// re-transfer a library the server already holds at the same or better level. + #[serde(skip_serializing_if = "Option::is_none")] + pub replace_if_richer: Option, +} + +/// What a stored native symbol can symbolicate (the server's `format_variant`). +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Variant { + /// Symbol table only (AGP `SYMBOL_TABLE`): function names, no file:line. + Symtab, + /// Full debug info. + Dwarf, +} + +impl Variant { + pub fn as_str(self) -> &'static str { + match self { + Variant::Symtab => "symtab", + Variant::Dwarf => "dwarf", + } + } + + fn parse(s: &str) -> Option { + match s { + "symtab" => Some(Variant::Symtab), + "dwarf" => Some(Variant::Dwarf), + _ => None, + } + } +} + +/// An upload attempt with the detail [`Outcome`] leaves out. Only the native ELF +/// flow reads it; every other flow uses [`upload`] and the plain `Outcome`. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct UploadDetail { + pub outcome: Outcome, + /// Uploaded AND replaced a poorer stored copy (`replace_if_richer`). + pub upgraded: bool, + /// On `AlreadyExists`: what the server holds, when it says. `None` means it + /// did not say — an older server, or a stored copy that predates the field. + pub stored: Option, } /// Outcome of a successful upload attempt. @@ -89,6 +140,9 @@ struct MetadataResponse { code: Option, #[serde(default)] endpoint: Option, + /// Set when the upload replaces a poorer stored copy (`replace_if_richer`). + #[serde(default)] + upgraded: Option, #[serde(default)] error: Option, } @@ -103,6 +157,15 @@ struct ErrorPayload { /// non-integer here must not fail the parse of an otherwise readable error. #[serde(default)] code: Option, + /// On a duplicate, the server's `{format_variant}` for the stored copy. + #[serde(default)] + params: Option, +} + +#[derive(Debug, Deserialize)] +struct ErrorParams { + #[serde(default)] + format_variant: Option, } /// Whether the metadata response says the server already has this symbol. @@ -129,9 +192,14 @@ fn is_already_exists(parsed: &MetadataResponse) -> bool { #[derive(Debug)] pub enum Registration { /// Server already has these symbols (`DuplicateSymbolsFoundError`, 16004). - AlreadyExists, - /// Proceed: PUT the payload to this presigned URL. - Proceed { presigned_url: String }, + /// `stored` is what it holds, when it says. + AlreadyExists { stored: Option }, + /// Proceed: PUT the payload to this presigned URL. `upgraded` is set when the + /// upload replaces a poorer stored copy. + Proceed { + presigned_url: String, + upgraded: bool, + }, } /// Stage 1: POST the metadata and interpret the response. Lets the caller dedup @@ -191,7 +259,13 @@ pub async fn register( if is_already_exists(&parsed) { tracing::debug!("server reports SymbolAlreadyExists ({CODE_ALREADY_EXISTS})"); - return Ok(Registration::AlreadyExists); + let stored = parsed + .error + .as_ref() + .and_then(|e| e.params.as_ref()) + .and_then(|p| p.format_variant.as_deref()) + .and_then(Variant::parse); + return Ok(Registration::AlreadyExists { stored }); } let presigned = match parsed.endpoint.as_deref() { @@ -217,6 +291,7 @@ pub async fn register( Ok(Registration::Proceed { presigned_url: presigned, + upgraded: parsed.upgraded == Some(true), }) } @@ -261,11 +336,39 @@ pub async fn upload( metadata: &Metadata<'_>, payload: &Path, ) -> Result { + Ok( + upload_detailed(client, policy, endpoint, app_token, metadata, payload) + .await? + .outcome, + ) +} + +/// [`upload`], also reporting whether it replaced a poorer stored copy and what +/// the server said it already held. +pub async fn upload_detailed( + client: &reqwest::Client, + policy: RetryPolicy, + endpoint: &str, + app_token: &str, + metadata: &Metadata<'_>, + payload: &Path, +) -> Result { match register(client, policy, endpoint, app_token, metadata).await? { - Registration::AlreadyExists => Ok(Outcome::AlreadyExists), - Registration::Proceed { presigned_url } => { + Registration::AlreadyExists { stored } => Ok(UploadDetail { + outcome: Outcome::AlreadyExists, + upgraded: false, + stored, + }), + Registration::Proceed { + presigned_url, + upgraded, + } => { put_payload(client, policy, &presigned_url, payload).await?; - Ok(Outcome::Uploaded) + Ok(UploadDetail { + outcome: Outcome::Uploaded, + upgraded, + stored: None, + }) } } } @@ -288,6 +391,8 @@ mod tests { format: None, uuids: Some(&uuids), overwrite: Some(true), + format_variant: None, + replace_if_richer: None, }; let v = serde_json::to_value(&m).unwrap(); assert_eq!(v["uuids"], serde_json::json!(["aaaa", "bbbb"])); @@ -308,6 +413,8 @@ mod tests { format: None, uuids: None, overwrite: None, + format_variant: None, + replace_if_richer: None, }; let v2 = serde_json::to_value(&m2).unwrap(); assert!(v2.get("uuids").is_none()); @@ -326,6 +433,8 @@ mod tests { format: Some("il2cpp-linemap"), uuids: Some(&uuids), overwrite: Some(true), + format_variant: None, + replace_if_richer: None, }; let v = serde_json::to_value(&m).unwrap(); assert_eq!(v["format"], "il2cpp-linemap"); @@ -333,6 +442,174 @@ mod tests { assert_eq!(v["overwrite"], true); } + fn elf_metadata<'a>(variant: Option<&'a str>, overwrite: Option) -> Metadata<'a> { + Metadata { + uuid: Some("bca64abfec40dbb631bb8f1c37414472"), + version: "1", + build: "1", + hash: Some("h"), + transform: Some("breakpad"), + format: Some("elf"), + uuids: None, + overwrite, + format_variant: variant, + replace_if_richer: Some(true), + } + } + + #[test] + fn metadata_serializes_the_richness_pair_and_omits_it_when_unset() { + let v = serde_json::to_value(elf_metadata(Some("dwarf"), None)).unwrap(); + assert_eq!(v["format_variant"], "dwarf"); + assert_eq!(v["replace_if_richer"], true); + assert!(v.get("overwrite").is_none()); + + // A library with neither debug info nor a symbol table declares no variant. + let v = serde_json::to_value(elf_metadata(None, None)).unwrap(); + assert!(v.get("format_variant").is_none(), "{v}"); + assert_eq!(v["replace_if_richer"], true); + } + + /// Every other flow leaves both fields off the wire entirely. + #[test] + fn metadata_without_the_richness_pair_is_unchanged_on_the_wire() { + let mut m = elf_metadata(None, None); + m.replace_if_richer = None; + let v = serde_json::to_value(&m).unwrap(); + assert!(v.get("format_variant").is_none()); + assert!(v.get("replace_if_richer").is_none()); + } + + async fn post_replying(body: serde_json::Value) -> (MockServer, reqwest::Client) { + let server = MockServer::start().await; + Mock::given(method("POST")) + .and(path("/apps/TKN/symbols")) + .respond_with(ResponseTemplate::new(200).set_body_json(body)) + .expect(1) + .mount(&server) + .await; + (server, http::build_client().unwrap()) + } + + #[tokio::test] + async fn register_reports_an_upgrade_when_the_server_says_so() { + let (server, client) = post_replying(serde_json::json!({ + "code": 0, "endpoint": "https://s3.example/put", "upgraded": true + })) + .await; + let reg = register( + &client, + RetryPolicy::none(), + &server.uri(), + "TKN", + &elf_metadata(Some("dwarf"), None), + ) + .await + .unwrap(); + assert!( + matches!(®, Registration::Proceed { upgraded: true, .. }), + "{reg:?}" + ); + } + + #[tokio::test] + async fn register_is_not_an_upgrade_when_the_server_does_not_say_so() { + for body in [ + serde_json::json!({"code": 0, "endpoint": "https://s3.example/put"}), + serde_json::json!({"code": 0, "endpoint": "https://s3.example/put", "upgraded": false}), + ] { + let (server, client) = post_replying(body).await; + let reg = register( + &client, + RetryPolicy::none(), + &server.uri(), + "TKN", + &elf_metadata(Some("dwarf"), None), + ) + .await + .unwrap(); + assert!( + matches!( + ®, + Registration::Proceed { + upgraded: false, + .. + } + ), + "{reg:?}" + ); + } + } + + #[tokio::test] + async fn register_reads_the_stored_variant_off_a_duplicate_reply() { + for (reported, expected) in [ + (Some("dwarf"), Some(Variant::Dwarf)), + (Some("symtab"), Some(Variant::Symtab)), + // A value this client does not know is "not said", never a guess. + (Some("future-kind"), None), + (None, None), + ] { + let mut error = + serde_json::json!({"type": "DuplicateSymbolsFoundError", "code": 16004}); + if let Some(v) = reported { + error["params"] = serde_json::json!({ "format_variant": v }); + } + let (server, client) = + post_replying(serde_json::json!({"ok": false, "error": error})).await; + let reg = register( + &client, + RetryPolicy::none(), + &server.uri(), + "TKN", + &elf_metadata(Some("symtab"), None), + ) + .await + .unwrap(); + assert!( + matches!(®, Registration::AlreadyExists { stored } if *stored == expected), + "reported {reported:?}: {reg:?}" + ); + } + } + + #[tokio::test] + async fn upload_detailed_carries_the_upgrade_and_the_stored_variant() { + let tmp = tempfile::tempdir().unwrap(); + let payload = tmp.path().join("p.zip"); + std::fs::write(&payload, b"zip").unwrap(); + + let server = MockServer::start().await; + let put_url = format!("{}/put", server.uri()); + Mock::given(method("POST")) + .and(path("/apps/TKN/symbols")) + .respond_with(ResponseTemplate::new(200).set_body_json( + serde_json::json!({"code": 0, "endpoint": put_url, "upgraded": true}), + )) + .mount(&server) + .await; + Mock::given(method("PUT")) + .and(path("/put")) + .respond_with(ResponseTemplate::new(200)) + .expect(1) + .mount(&server) + .await; + let client = http::build_client().unwrap(); + let detail = upload_detailed( + &client, + RetryPolicy::none(), + &server.uri(), + "TKN", + &elf_metadata(Some("dwarf"), None), + &payload, + ) + .await + .unwrap(); + assert_eq!(detail.outcome, Outcome::Uploaded); + assert!(detail.upgraded); + assert_eq!(detail.stored, None); + } + #[tokio::test] async fn register_sends_il2cpp_linemap_format_on_wire() { let server = MockServer::start().await; @@ -356,12 +633,14 @@ mod tests { format: Some("il2cpp-linemap"), uuids: Some(&uuids), overwrite: None, + format_variant: None, + replace_if_richer: None, }; let client = http::build_client().unwrap(); let reg = register(&client, RetryPolicy::none(), &server.uri(), "TKN", &m) .await .unwrap(); - assert!(matches!(reg, Registration::AlreadyExists)); + assert!(matches!(reg, Registration::AlreadyExists { .. })); let reqs = server.received_requests().await.unwrap(); let body: serde_json::Value = serde_json::from_slice(&reqs[0].body).unwrap(); @@ -392,12 +671,14 @@ mod tests { format: None, uuids: Some(&uuids), overwrite: None, + format_variant: None, + replace_if_richer: None, }; let client = http::build_client().unwrap(); let reg = register(&client, RetryPolicy::none(), &server.uri(), "TKN", &m) .await .unwrap(); - assert!(matches!(reg, Registration::AlreadyExists)); + assert!(matches!(reg, Registration::AlreadyExists { .. })); // The metadata POST carried the declared UUIDs (the dedup key). let reqs = server.received_requests().await.unwrap(); @@ -416,6 +697,8 @@ mod tests { format: Some("sourcemap"), uuids: None, overwrite: None, + format_variant: None, + replace_if_richer: None, } } @@ -455,7 +738,10 @@ mod tests { })) .await .unwrap(); - assert!(matches!(reg, Registration::AlreadyExists), "got {reg:?}"); + assert!( + matches!(reg, Registration::AlreadyExists { .. }), + "got {reg:?}" + ); } #[tokio::test] @@ -466,7 +752,10 @@ mod tests { })) .await .unwrap(); - assert!(matches!(reg, Registration::AlreadyExists), "got {reg:?}"); + assert!( + matches!(reg, Registration::AlreadyExists { .. }), + "got {reg:?}" + ); } #[tokio::test] @@ -477,7 +766,10 @@ mod tests { })) .await .unwrap(); - assert!(matches!(reg, Registration::AlreadyExists), "got {reg:?}"); + assert!( + matches!(reg, Registration::AlreadyExists { .. }), + "got {reg:?}" + ); } #[tokio::test] @@ -533,7 +825,10 @@ mod tests { })) .await .unwrap(); - assert!(matches!(reg, Registration::AlreadyExists), "got {reg:?}"); + assert!( + matches!(reg, Registration::AlreadyExists { .. }), + "got {reg:?}" + ); } /// A payload bigger than the 64 KiB stream chunk and not a multiple of it. @@ -705,7 +1000,10 @@ mod tests { let reg = register_against(serde_json::json!({ "code": 16004 })) .await .unwrap(); - assert!(matches!(reg, Registration::AlreadyExists), "got {reg:?}"); + assert!( + matches!(reg, Registration::AlreadyExists { .. }), + "got {reg:?}" + ); } #[tokio::test] @@ -728,13 +1026,15 @@ mod tests { format: None, uuids: None, overwrite: None, + format_variant: None, + replace_if_richer: None, }; let client = http::build_client().unwrap(); match register(&client, RetryPolicy::none(), &server.uri(), "TKN", &m) .await .unwrap() { - Registration::Proceed { presigned_url } => { + Registration::Proceed { presigned_url, .. } => { assert_eq!(presigned_url, "https://s3.example/put") } other => panic!("expected Proceed, got {other:?}"), diff --git a/tests/elf_upload.rs b/tests/elf_upload.rs index 62eeebd..45d9873 100644 --- a/tests/elf_upload.rs +++ b/tests/elf_upload.rs @@ -175,6 +175,217 @@ async fn elf_force_overwrites_a_library_already_on_the_server() { assert_eq!(posts[1]["uuid"], FIXTURE_BUILD_ID); } +/// Zip one of the ELF fixtures under `entry_name` (the unstripped library, or the same +/// library with its debug sections removed, which shares its build-id). +fn pack_fixture_zip(dir: &Path, fixture: &str, entry_name: &str) -> PathBuf { + let elf = Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests/fixtures/elf") + .join(fixture); + let zip_path = dir.join("native-debug-symbols.zip"); + let mut zw = zip::ZipWriter::new(std::fs::File::create(&zip_path).unwrap()); + zw.start_file(entry_name, zip::write::SimpleFileOptions::default()) + .unwrap(); + zw.write_all(&std::fs::read(elf).unwrap()).unwrap(); + zw.finish().unwrap(); + zip_path +} + +/// Run `debug-files upload --type elf` on `zip` against `endpoint`; returns stderr. +async fn run_elf_upload_of( + endpoint: String, + zip: PathBuf, + extra: &'static [&'static str], +) -> String { + tokio::task::spawn_blocking(move || { + let zip = zip.to_string_lossy().into_owned(); + let inputs = [zip]; + let out = common::cli() + .args(elf_args(&endpoint, &inputs)) + .args(extra) + .assert() + .success(); + String::from_utf8_lossy(&out.get_output().stderr).into_owned() + }) + .await + .unwrap() +} + +/// Drop ANSI colour sequences so a log line can be matched as plain text. +fn strip_ansi(s: &str) -> String { + let mut out = String::new(); + let mut chars = s.chars(); + while let Some(c) = chars.next() { + if c == '\u{1b}' { + for c in chars.by_ref() { + if c.is_ascii_alphabetic() { + break; + } + } + } else { + out.push(c); + } + } + out +} + +fn post_bodies(requests: &[wiremock::Request]) -> Vec { + requests + .iter() + .filter(|r| r.method.as_str() == "POST") + .map(|r| serde_json::from_slice(&r.body).unwrap()) + .collect() +} + +/// Every native upload declares how rich its file is and asks the server to replace a +/// poorer stored copy — no `--force`, so no `overwrite`. The declaration is read off the +/// FILE (debug info vs symbol table), never off its name. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn elf_upload_declares_its_richness_and_asks_for_replace_if_richer() { + for (fixture, entry, expected) in [ + ("libsymbol1.so", "arm64-v8a/libsymbol1.so", "dwarf"), + ( + "libsymbol1.symtab.so", + "arm64-v8a/libsymbol1.so.sym", + "symtab", + ), + // Name and content disagree: the content decides. + ("libsymbol1.symtab.so", "arm64-v8a/libsymbol1.so", "symtab"), + ("libsymbol1.so", "arm64-v8a/libsymbol1.so.sym", "dwarf"), + ] { + let server = MockServer::start().await; + let tmp = tempfile::tempdir().unwrap(); + let zip = pack_fixture_zip(tmp.path(), fixture, entry); + let put_url = format!("{}/put/sym", server.uri()); + Mock::given(method("POST")) + .respond_with( + ResponseTemplate::new(200).set_body_json(json!({"code": 0, "endpoint": put_url})), + ) + .mount(&server) + .await; + Mock::given(method("PUT")) + .respond_with(ResponseTemplate::new(200)) + .mount(&server) + .await; + + run_elf_upload_of(server.uri(), zip, &[]).await; + + let posts = post_bodies(&server.received_requests().await.unwrap()); + assert_eq!(posts.len(), 1, "{fixture} as {entry}"); + assert_eq!(posts[0]["format_variant"], expected, "{fixture} as {entry}"); + assert_eq!(posts[0]["replace_if_richer"], true, "{fixture} as {entry}"); + assert!(posts[0].get("overwrite").is_none(), "{}", posts[0]); + assert_eq!(posts[0]["uuid"], FIXTURE_BUILD_ID); + assert_eq!(posts[0]["transform"], "breakpad"); + } +} + +/// Acceptance: the server holds a symbol table for the build-id; the unstripped library +/// replaces it with NO `--force`, transfers its bytes once, and the run reports the upgrade. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn elf_upload_reports_an_upgrade_and_transfers_once() { + let server = MockServer::start().await; + let tmp = tempfile::tempdir().unwrap(); + let zip = pack_fixture_zip(tmp.path(), "libsymbol1.so", "arm64-v8a/libsymbol1.so"); + let put_url = format!("{}/put/sym", server.uri()); + Mock::given(method("POST")) + .and(body_string_contains(r#""format_variant":"dwarf""#)) + .respond_with( + ResponseTemplate::new(200) + .set_body_json(json!({"code": 0, "endpoint": put_url, "upgraded": true})), + ) + .expect(1) + .mount(&server) + .await; + Mock::given(method("PUT")) + .respond_with(ResponseTemplate::new(200)) + .expect(1) + .mount(&server) + .await; + + let stderr = strip_ansi(&run_elf_upload_of(server.uri(), zip, &[]).await); + + assert!(stderr.contains("upgraded SYMBOL_TABLE -> FULL"), "{stderr}"); + assert!(stderr.contains("uploaded=1 upgraded=1"), "{stderr}"); + assert!(!stderr.contains("re-run with --force"), "{stderr}"); +} + +/// Acceptance: re-running with the same file, or offering a symbol table when the server +/// holds DWARF, transfers nothing — the server answers 16004 and says what it keeps — and +/// the old "re-run with --force" advice does not appear, because it would be wrong. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn elf_upload_skips_without_transfer_when_the_server_keeps_the_richer_copy() { + for (fixture, entry, stored) in [ + ("libsymbol1.so", "arm64-v8a/libsymbol1.so", "dwarf"), + ( + "libsymbol1.symtab.so", + "arm64-v8a/libsymbol1.so.sym", + "dwarf", + ), + ( + "libsymbol1.symtab.so", + "arm64-v8a/libsymbol1.so.sym", + "symtab", + ), + ] { + let server = MockServer::start().await; + let tmp = tempfile::tempdir().unwrap(); + let zip = pack_fixture_zip(tmp.path(), fixture, entry); + Mock::given(method("POST")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "ok": false, + "error": { + "type": "DuplicateSymbolsFoundError", + "code": 16004, + "params": {"format_variant": stored} + } + }))) + .expect(1) + .mount(&server) + .await; + Mock::given(method("PUT")) + .respond_with(ResponseTemplate::new(200)) + .expect(0) // nothing is transferred + .mount(&server) + .await; + + let stderr = run_elf_upload_of(server.uri(), zip, &[]).await; + + assert!(stderr.contains("already on server"), "{stderr}"); + assert!(!stderr.contains("re-run with --force"), "{stderr}"); + } +} + +/// `--force` still means "always replace": it sends `overwrite` and still declares the +/// file's richness, so the record it creates is labelled for the next comparison. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn elf_force_still_overwrites_and_declares_richness() { + let server = MockServer::start().await; + let tmp = tempfile::tempdir().unwrap(); + let zip = pack_fixture_zip( + tmp.path(), + "libsymbol1.symtab.so", + "arm64-v8a/libsymbol1.so.sym", + ); + let put_url = format!("{}/put/sym", server.uri()); + Mock::given(method("POST")) + .respond_with( + ResponseTemplate::new(200).set_body_json(json!({"code": 0, "endpoint": put_url})), + ) + .mount(&server) + .await; + Mock::given(method("PUT")) + .respond_with(ResponseTemplate::new(200)) + .expect(1) + .mount(&server) + .await; + + run_elf_upload_of(server.uri(), zip, &["--force"]).await; + + let posts = post_bodies(&server.received_requests().await.unwrap()); + assert_eq!(posts[0]["overwrite"], true); + assert_eq!(posts[0]["format_variant"], "symtab"); +} + /// `--extension` lets a caller pick up a symbol spelling the CLI does not know /// yet: the entry is keyed by its real build-id exactly like a `.so`. Without /// the flag the same archive uploads nothing. diff --git a/tests/fixtures/elf/libsymbol1.symtab.so b/tests/fixtures/elf/libsymbol1.symtab.so new file mode 100644 index 0000000000000000000000000000000000000000..6abc83722bc571d3f072bced49ef2828343f2e23 GIT binary patch literal 427464 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 z zdCokF`*Hg|imIJervu-IIt7{XH2QyjmijN+MP9&pW=`z16F)x(vgCu*IR&rUU2g9e zZsfkbbq{$l`E{`kjMqt-CU3;gBj1Eu|1Z-|Mz->{-|y%BR}*ga52c@B%hUgC>R0Ee zj;%NIzP;s{^pno>f5$#@zf=Ek8P{w7{_N5&Xl{@ zzZ3AhbL6$m|03$Qo+r2c{x;u#+vAf*823xY4V*9U!#~1(7s!L-^bc?2BlG3My<{BnE*xBc~N zzSe)UU-@S8U*n}$$nA5g-{av$@_M#w0rd;6mPe>_?xw0gh^H}cC*h;D$`9d}TmB}w z-Dd{y$gOfW`}atEC@8o2zmR_Vm&!-zXI_xw<#u^DzFm#_j4Vs6Gnaf*y}X$GariK9 z=g%IO>J;Chd@1>He4l3+xBQ>voy(Q4CjSdwgBRl8+lcybUvoMi|sPcz^#tC4=>?-a?w5Nr|rqaI_BND zhx+Cj5#>AabEz|cSK)WX8jjy@l&w@gCn+Dmt$(W%!fo8MV+%N5X8^bLP=*&jrTUfZ zuj_i1kG9Bd|DHtN_pH2^d3gMDB-__*QMWf${fiaXyomfSHS*&B%6ssQ)XDxtZr9Tdm zymO7bi8@bSqx#`qdB*1Y57zuHZ~r>6&KlN3%{sa5_hI_?d?UB{e3<%OxIM>so<57d zRX#|cui(9SY;ljhw!T&U^nRzjhx{}?zn3*AuVcGzzD)VZ2D#NafqZ16Jcaxwtk2dV zc?R{T#>S5yU)^{yektdZtRIxO_52a}GTidDykBTGXWWPQx!CBBs^g>nIpoWK!pT?T zox}2U{3SlG*!Q!%ojNR11&d?)qS#%?g;^WgbSZhcmekKo1R zpJclne<)u;{Wm!8Rp37Is|r-VdsKPr(>&u(c_DRPCGW+ppU?0Pyo9`Y#$T%AWZa4L znfbTeu1Dq-cs}{l+1@5c>;^LSYQ}w^Xq^;qDsR9e^fR!T+_vi-Jl83=J~!gExb;)V zxLx=V_1B%Caiil^$By^KKg+8p$gR#v)ak&xsPj7ew_$VT?Ywsk`HG41vevd~amwmhvdR*GA=CTgh#E_XugfSKwjt_ZBFho~C>w{(fx7#n)j3ufel< zf1Nv7`EvYe{;o-@RS{tFK53$ z!hWyFkT;O;BJbQ$K8mL?&yJnsvG&GZAbo=LUe4z>ZfIAW`ccMp>?SY8 z516I(P>NUJPmpiNJ=AYKU-{HMRL7pToEF=V`1)~Y%WZ$nW}T<+DUVId*y}(%JU!75 z#S3!eVe$v?bL#%R<#yfg=D6tJM_x()op{N3wV z+sTiTZ#+Qb*5dCyx6so=X(qHlP3HIC9KXKFqqkb-wm{ z_+YuM+lHy?KYWNhmHF9;`YqL<^K}<#-&x{fEml$iK2y`Fgj!kowi^#~$2^ zuOgp6OL;p^_rG6tI**V?7IbZ{^GB=VRu_ zhuit;B97lEZpTGRmikPYqdGOzneWm(2k-!X6P{M2dKKzHta`!RHo3Fvc zc$j=P+gp6B@{OD5ABOu>XYe?AHuITDKK%r_hdSHgWq3DrzM7;uxh2ZmaXJ_8zz3)^ z2alYj{1AQs9y(cW+cgbOnJbTy-@)qRcAeUYkCZBJ=l=XZm zLU^=HZpX_a^V8)i^m8BQ&ko#`0QutU66?P~z8kmvMdb6ZSH6>e%I{SF&Ku;G zpGV$@*OEVi{9sakob?k>ojUScF`vD-?ML&R83vv#6RRh``G zn78BB=l$Hbcy3WXLO;7vX9Tx8=AK)XuOT0%P6ytHXHzG9oAP#Czd?QoxBBVi-9hE; z{A2FNZ9V)NyU@hfb3b0lxa)XskiArOs_-)EH{!OvBjk&2SH7A2iyU_&xSeNK;zi4p zxAV-S_yF#v&Mc0{?0V%r?8nXU$~)vu1Z0fJZeRvLj^-s#z<5~FScq{J1e;!gkbA{?>;u~-` zZs(KLcy&_#Ip(<$x9xqG{2-o7{leG;#Ud4E0fi1O*IpK;VleM}yp zP7TkO>hToDy%BGGT>0VHc|ZQzhC0C)@`JeT#~SjLuO#Lp+&^^TnVYH5yVMzKSKdYa8uBTx%dNiEsl#iiGtRB^M(SIM zb8uGW2kKnEN^|kyqNlz;pu&ez9aKoj=R}k3we&$^riA{>dem3Jon>1`kc!;Eb3R@kGC=Z?O)5w zsPhJOGS|tgle{s>kEI{iH_FEj=dssp^8xuFbqa9jw{lOC7vYwlOFnLBi>&I3F@@4~(K41NzN_ea%f!)M;3c^EWjTo>~Y9#-Do zFYJQn{30J>-aORL_)Tu>IsRwG;@j)RhZ*;9@+H43Z|8wcShrz(faC6Dt|LLm{$mw# zsnb1M^`p3r`}&aFxry>NZ!h9SxSeMn;QSoHyP1by`5yJ!%~U5JKbL%)Q{GHJ$K$?n z@(}(h_faY1<(c@0cs8Da+xIpU;(7R~dD>ro+^#PXel8ZoD>-kR&Ad4#YFx|T$#Lq! zE2;m*37WS6?qqv!BVV_L>O}CX@PbM5GWOTLY*)h+xt#}Q&`_@#WS}}^y#q!A-*#cdtV#oO^d>g5g zk6nhwUT;yyohi5Va5wj*t#~^5!>QA`i}E%Gn7#qrWf-kFP&|BU+C`^oFJQlo2PC(?MG z7Ps6>|10qHS@H<(_(l14ypru|nj+6DRNn5dK8@|Tc>U_xa@&uW)Bh0OMxSYT^HIv% zbBsgq$kFmf@*ccsj=TYXo$FeEkvyONH)X$M93#)fx8wT+3UD{x!2L-zUWfmlr|n8P zR&{J0o=3g{FCo7T_diiQg+3?Y9mlDT`4`mhDwfwKjazbj;kF_`U+8!^(?Yi?U=kqGuL;fYa4e!M7<$g7A zipI6=U5=-on&_v+7EF9y1@TJiyvy+pWO z{Q~99m*K$+<^9x|%lq`I3b~EDhdm#@NM20-X!0ev8+VegPs(4#xczvP{55QE)5WT9 z`~7C}1Gweav46w!l`o;rd9m|B{5TrL?YJnx+bfmtCO?V(8y3im@VPuk?Z@5tkyBJZ zYoYS7HpX5D;iXA_9A1ap@p3KOHH=58Gn4IVxkUBr@Evh?mE7j%KiqHB;w7xx&RD_t zJoH?uyxr%#j;CENuj2d}u{u{WE_Lpk%6(L|yo7$Xo}&8YxNX-2yfex7!t)lXj^(!+ zP@P6Rjr!H}(~NuRXFi^KwdypIADpW?VLTQ83U5jBPw{AyFQY(N)be;0{JncF1nK#Pq`jT6rydU>aCmWC6q`YlcCZ2w?yp#K=-V0Ty?-qHGI@j@Y zy~^9<-E5bOI)y=b0r_3I->X@QlTRbxhL@5bVBGX&%BSEdp1XIJWBuech+2Y zD(`39NqpWThyHR;N54;mn zz80?`{}JxINBJCl4W66i6Yf`?vLtulfh7NdIxR`Q9`8%?l3vwMy;uFzasD~>RvkwT z_si`#G9UdP?tS2&^X<5;=OV_<_>c0o9`S$8U6I7RdG-JBKHTQP z^7$)O$4fs~ZP0#iz}toi*9dh+@n(FJ`&2*trt=s^&7aB#nTLm{)9{(x zz87UJ^Xy(L&*OYGu|?Zk)i1a6+u!uxljN(&7kr(Ve~Nr4$)Cra>k{+JR%u*clHZMY z;&z@nWtR4D-Z#{t|HJo_H>{TzFb@}y?;e!f{{4V?$l4%pU_L*wb%^`%Le^W}_sVDC zZ<8;@>)Bu52i4EuM*6`|zDJ(@gM1V}1JC+NUPJxGu>}x6|1{w??s4QhlJb!bMw(=0;4qhpDyX3atQ;yJn9L8-vpRQJZbUWoo>1XDy%8z8oZU63t*Y3!;%x4Ck zwTrxsKEKLPoj%;w?c5JFZg^Ma1LXH*-g0-7hw&Wdrw4ChdrR=@-IcffvWokk(mmup z>RdoRiraRT;YHJwFC@PN58~G60^F6Ye2Dz+cq?vocEU$-+b>h`$eyZWo`#oCmv>R$ zf2-y#Z!dW{?z~0bfLEmGA9lf=dDLg#X5y^}%I$f}gB(XgGvr?Cuf1CPvG^c)30{CV z;q6K8%U3?xb7soZ>8JD(_3u7d9y?u(z4oKeF5E>vlW_+QNvv<)T=36cd8pjRy_fB+ zJxp%t;%XKQRRQY1+{K$2!Hp%U| zM>pO<{;0z=ZsRGcWA`E3(r5aqa=ULC%~8G?Pp8gT+$TiwdiK|McuAS+M9Du}tNojP zx;zX25YJEYUh0(LxzrD_y>(}(j-5B=9I8Iu^XQ-a>j!Gw9nE zSgyS7-%k2WKS%Ci{#WB=csBEvO+U5gD(@wK1NnZu6km)NoTt3GyxB35@yth($^9g(&sR#Ga&uP@jT&R46d6=-5>UZJQQr4WxAViPjjCVZmpjN$C0}rbyoY`+BcFby+&NzVu$Z4? zx@zQZ>Qp_b`lUKf(k_gM<5(_AaJyt)6n#QNqPcscb`FV%S? z=X&J_@!c+0pROC^HA&up+i_?4j)3wFS674`es-Y_1*H+@L+@3}{LTPM?URHp%NqyBprDPIy&zLq-XJ$Px7 z=iaY;O_E3Om;jL`7r(w+uMoTI{BW@Eo3~dd?({R!TEgP33(rN z<}z-_lX9CkFPGaW8c)ou&N}#qGLqBko+OI_>mxtd0AW+~(Ol?P7vGpZ9ioX1{YlK115H;>{)Z0{?q zht%g1xA!cLixS+eC!!{+w+H@u1bWc%FO z^U7!8KQIqPcwUm%;63>MoX1LEP@N9uVa^5}cbPBBZU0)n63^oNHp05Ce_45(XBYQ@ zy||rkuN|j#*#4^W1@!aDxf<8;n!JkUmYF5ssA!Qg1hnO@ceI;H~-{* z`oX)%&)-q=>{+jT2>!E%+J{~)MxL{@&@{u_ap1)7x^$g;ZM2mSGgD8g5#nCxAVyd?DvWh z<)h>;=e{fFH@U6<)$}=pkCIRcPQLRmc_-Uj$@`-Qhi2Yubso_6j^O$D zL(E(5Cd%8qE#Ft$o4={to=2_a{8PM{+^$D~66JevyHB3Zagj1k`84`8ca4`<(~o&Q zZuQMGCMa*~YF zXC6Fh%Dd=4jpNaaTmMJV&j4ObzM9YR=1*1~TMsGJAH}`&e>HW=wpPBMI+={?PM7!L zme1Tq?qPes;eN(9HF4apxnAeE%sc-1^D;b(I_5Ry z%2zV(c=p#2-iJ@(_YS(wQN9a5_hHRX=v=uSFSl_%44x++Az#h)DBzPf;R`vgbIzC7 z&}SRh>*fpO)_?rZImO?Hc3mj9>)K6+sGrDuc^UP$q@UDE`5^V5rJs=n@;dT8oDXXk z%57ZBhcA&2P-m3;V!b@x06Bg^YVK>)(&te%$GLZErhXPu{%L zuR7-2kRQaW$WOw(S19kp|9VsPJ8(bSby$boeU_$Prv4=IuB#L4U*}i83J+3e5$>!}K9xG--c>$riQM+@ADxVg+jeavKX{Gu zu{OqDSK=+#%47fe*y}9n)YK;C4_mAHp6leroDXN<4FP#Nb@s)Z@ofC(@v75}JJ_yi zvG*DAdF#GWbsF&Q8hORd@>c5XNIt7h?!$M*>+mXk9PYS9c{{FSLynC*gh$E$L7$OZ zmCvD{UrtoM_cnPt`3p;^gQwzUOXQf0|JU%j z$G(TSsr43%%WZ!(@Og|5ypj6ZtcUW~mACbl%Jrfx$*q3+8;SL|i5(#E z?XAT1uMWqzPs*E;@;0vHO(jd{XA*Tv@DzL;UY6v)QokIpBELR%;K%#v!EOHzkSs^2Y(Ad}zLWqqG;XbeH{W`vn$9de3z5ci#_xI_&$LBad=jZ%+T{D9pewpgD zzN&m5{yX{7;{`6?h<9;5*{+yAhg8S*%NBUP^NsLAJlK8l&pP-l-i#;WO>bq##peIF zyESf2?1CPAY<>>3JYL9gw-g^8R^Gtx-_<*Dx}KM)^15;>au z7;f{B6$E1IZ33UCKxj^?3pTwcg_^;{+&`Al9z{vEvNb9oi{QM~U9c^~-~@VW`PeQ!8tSoN#F zmM2o@V)C_<@_yXfP@=2Zg>HJCg;5AqL za~t`w|H`fY194QF{L^=}`srRto=P3_LEO$)=Qb#x zymB~io`KtS%Dfu4eoms!psQm(?&_Flt)g)UIR791sQQ^%RbD{6r0;z`NM7bNI^a4hp#oFcdVXkLlielhRChZ*;9>NKt&u4CSgTOIQ$+}88K)ajlV zu46ukTOIS%4U`|HpM9w_joWtZRIT|*N)6XHPsgpkc@^GF{cWj}uwl54c^YnY%q#Fp z>g->yeunW(*5{x39eX5A^=CQmwqV@ZO~T`vr)(;>am~x{3dX&d`5D0N{ZjL*T#q(W zoec6DGj2*WJg#{rZsVHQ;I=-u+)dk?JzsVDsBb=vH?qCkk+0h#oHx%)m)mnzHu>Z& z!+G-|+}`i)PQEBZdAmO}Z{0?2zoXlm{8XlVnEq?<{_W%y^nVGSxr4lv{AqXtUXE|T z`|U~G#?8R<{;WFVtdm>#-aLJ0xt*`9el>3O|F*H_e+18C+*|O}T~x>XUcAJ47v6&B zQs-HG*!iY-@&eV*C;#ZjQGerfU+-1`5OI$FLhD4 zPxCC?`ZTY_o2YXQb&`t0brq@b;Qlt&VvUZu9UWb)v=LI_5dJ)iJNfE7`86s59m2m?s{t`c}uh7_Xtu z@yyR4ZtKK+9Jh6KA^FTB!u^})<2J5&6JEr)3r^PYGKLSbp2yCScb2Gr75SSPH|?nK zxaQfojcZg3>Sd_kYM^?xeQSvAg=Ql|m8ey$BBD)zpv4YzetgQuOTaqT@@6`ol|KdjFR zy!(tS?F zMe zeXVH_1Ekvp6my&2rl>Z+xbHlJOz(Ki|lF;_c4sZ&n@iXFgG# zj9cVm653mC_jV$YmPkSR=MR5r%pAV!G5$lt+y$kk8k`O z+jV=mP7UMcwaUjCcMtOEcgSaP%SZ2&XHow!@o-up3%B~`lW%Sd*SCDr-QoH_ zlkdAnUP?bt+PvK>AHz3her9o-Ps>lYE1yaK?~{+-7q0&k^=onK|7Y@L_bYGnWBJk! zx!s3fPybC1gzMi%{Yl);GhO6|A5=a#N$u~T%yv?)a zd!LY3k$>b_t^drPaQ$Pb-+)iEe%>Zu`;_wb{QH0Tr{x9I|APF`GvWHDQa`g-ZvC&u z{1-kew|TI9{d4ka>aR}yndigx=TpD9FPzUJKk$M)g*uiW{inPVKZtxmf4F`g_1p1c z@~2rpFDajhTR!rN+|K`(k}n(x*FS{%9rz^ke<%6oSCzN(jOF{6%WZz@ztnj+XHcF( z9rHrm?z`?K-{SJ-op=Ft%%|~kJo25!EqPtz+Vy38C9Ss#ypjA|ws#u0>q5p0%6Gh> zI%VW{A)olBybJ%}Fpb-T+qgRq%Lnk_e;)sA&h@e3E!D}x&u!GW18>WV@a?FRIxKI) zk0RgmZaDuFzave2Umm5;Z}AMg24Awe#%;qB@dxk@=TG8Y&i{t@IIqR~od2ti`N3`8 ze&+Z2Bj()aJhYkmoLHglvg^(rc>V`+yYIRMZ^awfu6BMek^V2`i}5?~8t3=({rDi> z$^5tBH6N;u-RFEm|LGse?YQebP1{@bZ+Rwly7AUAc{}}_zn}7XAIqEZ%kg161wV`D z!3n$)ufdByQ62kT)=QVGe%9x5%MaqMxaDuWSoxZ-luxC;c@tjfd=wwVn`>34I~r4kNFsGb<8urQ5`#<)KjM#w>svHxYaQq!R>pETI$Sx8{RJS zl<(wL$Gi-;I@Q#vp9Ib1C^>RHuvW+CBJPL+m*#b5`C) zel2_uxBa^Vp7NXWcAmNY6xB(`ZNHo6;#TJZ^7VK%dZz2cGbqts9JT5>y&W$`=wzP05w)LF>;uAF3fKXnekXYpX!#6QR5HR~wf zgm29JB(5vBzi0K2{nStM`to|l-H|$}8_1*huGUYge3bgho)|(ysgjF>s6-_x8r)BUik>#MxBf*c}-MxX7L^I>iP0A%hS&=ZtGzO zyl@NUE6DGHcjMOQJG>{%NLPM}{CZ2&PwJoKcARdompltkV1FHZiS}3amda;a9qzj- z@Jf8X^^e;;|Gq-?lebcxHu4XX@50CN4!k)-dE4GS@L9Z;{JxMU5(qyZM~flOkiw%CS=M-6^~Ruru-N_jPFgpdpqS5Id2c1r+n`Y@)q*u z#aZ$a`Z4d^QC^1EGH%jNavS#`#vQ|L+@()w+=-pT`C{_DyM+Bq`fOStw|P63d~HrR zKZie0TC}S?nLZbjFWXIS=jSQT8y$Ef^Du#D@2Dz zt2*}Q+BRmL*X|{+qtEro&*sS|gX>xBGjp!$OypCC{KDV@5nB&Q`^je&kE}_Z#Qo(Z z_$qjr^M}_{{T{rO`uF202dGXn>*p@K;~=?RN0Pr*oyS}2EOXagm zyo~LN;I()z^LGDkY}fJ1+xhdgTjUjG@U%|LF&fmrdoi7Ux*w}uLo~Sy(Z9x1p zL4KlKKFzrIlOH`PoF60KezM%oKj)DjtdQIMtjN>2!+0aV2a7C}mz|+}5#xS(jl2s_ zbv}UGab)?FGgZgt?QPDJ6?h4C?&5i;4=-oGU-hK+OZqvgWA_QScgXXr<#rxeLY+oD z$_BqUSN(U^Dql+dU(b{$*2(RDX)DfG#h1y;>GRQf%J<-t__ue<+b>r>9j~PR0B-YR zo^plqP3-qI7`MG%-o|nF)Z?n3f3-X~4aPs4QojeUpCiAUdCt8~`8;vtQs$=?Ph{Nx z4yb2mCwbmrcOR?`^&roZ>Il?nCIMERLAZcm*5>sw=ijFK*3YWkU$x+s^s_7Pe-dt2 zJ{z~^tQ_3-%U;zw9{X_X)1If2T2;rcFDWgo6X$E;DR(Gu^M5OUZ$JZX_XBTm{cX8Z z`3$Z{`+ueSefP^}=zlM~r$au5-@%`&ZFxX$-wWI_sXD_C%I)|6b<`PHDo>-%A^13M zPJ z9}Cwx9Ix$`k5T9M%hhM;xqhY4f5FSjkC9)1XS^b>!PmmuaLaFu*9|Bi;k>cA`Kw{y z+I+cuocfQ_XZdUL0sMKsm&_cLPvNiQX|Ky|ojigkz9F~!!yY{0&2au@dc z@8Sg7^>uTwCTAw3$G5vfNT;O8sFmputZ2Tv@%=ryRtDj~(iF^azhF9RX zA4PrwZ^k=6(YUo6 zsJ^YYx2Q9N_mf|a_ojxo>s9JBY#8qIpZFl2Nu4vk*SIsdoyQjA0~@K%6!|r`RK90p zxjh%B;3=EPXIP(SEZ6!;+Du+Zom21<=SSh~xE_5qa^ z$8COgNRp3jr#klMCbqPER=ECpJlD+P+0;+PvvyQI3%~VBt)DWy7~h%t-MG#3{@l-3 z{#kWWn75Vix@>tfb?)j`{gj>McK)|jv8>-JH-1^)BpTsK}x1Qs-WDnJ`?LCp_yGh*grFhAn%A22x z_v7~Gcgi^)lNTyK$+*Yiv$$PnFQ%W4eU#^N6gd~~!bh3UWxs3Q8uwMc1OE^A`Puu+ z?SArQ^4SI9dd>GL!^`M|Ib@;y;Lp2N8PcI@XiyXb!uuQ^;^g@436OyEh>d6)e35z4oc z&*FZ&=}5U9cdH(zar^Le^1IwFAIHn^9q{}T)k(td+Ee)=+^(}f(dUTe>GP*+sehE} zR0s1C`}~HNoFE?&M`lh_KI^aYB76$3!yBpp4t0{sl~3ik`v6a0EFVo!p{s6D{m5x@ z+pbISB)pMv&%;~rY{oqUAFNazJFfFDQ2prX@)YV6oR!_ zbs~)0ftTZ@fL;|Wd5SKwdam3STA!u{JMZufg9vrZ~*P#xPZ$KzeN zt+x_9_eSM&slO{;gQu_#i}1#ql(*|w0Y20$FQ(2*c3j*nxAi}WXW@h7pW0CKGmAIl z{dm(Ys$;&G?={kw$j8Y~t*QN+*dn*{{DO3FZXvNOM)6U=G z->EOVUHL-t$tx@0iTB}?)URw+eiHu=UUG-r=Iv$1?ZnH-uQsOnNxCyUu6YUG$95fm zzVfMU%J);}NPHBxbz+`=xAHa*pS-6!O}MSM{NO|yo1dh6lpmn}H&19DhVg3r#&47_ zxL0|*541#_#P$|F7S8_#Z|;`c{Fsm7gVZ^ieCOlgy!i}1 zOg_o_e?s|8eBfhk*9_i_fBCY!@k!;Y@df<8CDJ2L#Ix*oFL_hm15rPydnt1Jo2>ib>z$NI(!;0!KR?&aB z8ZUiC`7-idzJEwQM&7*r zEqN_|XRxqi>n-}Wdajh!zBLsl>QrV>+>tT+45{xa`3_=ems7p zI>BKZ|LlNgJKr0xz@y}gf(BxB8t{6&08je2>Q8ZBmxs@OEbqqW2Mx@%p3b#6zA6qS4XMVosA!&8_DD$v@`V;sxZu!wQl+R|nR*+9l zlG{ALML+%cAayL?w3hOAKRJhf+Sir`hgNKW>>sUU2lW?7)-E`ha+f*LBzKDMk@#@Xw z!DTo8*-%eYfe^$Pj{Lx)Hj%M&Kd?DVklk&BAl=(@|mM7xvFRM-_ zZtLwDdA8czANX+UflA(lkZued>#42FIPV~IpIE^I!gO7 z57&Qbid<|YkohjyF1h@YGv9;{4k2g^&SpR!o_f;FOSOLGsC+x77??uQeLh+FZXc2H-3b?o&4>1!;$h7d?UOSkK)aEFJ6QX;YlT` zQ-a@`p+3uTTUTE`tv);OV0XknpHZjdDAlofp7Vn0D;&iBVt%ffYz z#4DUXkN4nqyqt-rpAfEdK3?toQoP^!B0S}<;W{Vd<<76hyPaQ;C!83rvji{3hgolT z;Th%O{QY>1^M~;P=TG9PCxz>L#5$?K?K<@b>uTENSEEk;;&7e0c(e20`SV}n&R1jH z?2}c;j`!5(bsRO}b<9H=o?M~4-EaRr*wL}`XZk5}yAL^#_ivea33bZxdb|vO`BEJh zVd;@OJI}cI6yHa`EUi0MB<*n4&`&DgMC!U6v zZz~_bGx0aMzD(nG-rI0e`NT6+-_BR&g}CkahyPH11fQmUWAOip&GX=y;XW50F0ZJP z7n1*U70pjKK8XMOaCzNX%D3T1waBAq%hNeut+S2l=U2;Z|1M(OLOho`<_);rZ|r}h z>I}I$D+f0ovF#ecZQd3xluzQ-)PI?A%g$9lRrpQ#5T1>{o1t+N&Qm^^#`tF$K7(7G zjaFwq&sX01e~|iJcn5X1-9-748s#hSkB^b};Wj@>Z0{^y#ClFHRle{-)v^5MjuzeXYnhbrHI2kpf_&y>r@@e=$6 z)_?9Ls$l-=rphdtLcX+^*xR1P^qvb<%lhxc>34$P?X;_jvD;OZTs@`5(lK*k5%#|E683IyMiBdG71@AD(@c@(t9f z$XEZp_^k7utCcsO%YN@}2#>oO$3@=X}{M(F3wt&~r^ zDO`V#wdE;z&_?{T8OLu9o{6uUp?o=>hF9}`qt4aen{gYRXKbVGYQd|i)6MrRNzLIt zFAq)>vGZ!G^Ar9ePj|jE{bV`clIQwd+}71ycxGT`>&}w-7bIXW%54f z4>NCrcn0@-brtG=`c92&*O7AGi;mwVZ=(O3{-gTUZSpGoYx*3=Z640#K4c2F{#W6= zk$iV}d$WI0{WQFS`okUSvmUqOx19Q!_k`=Lpni_?n}1XNe7uhO`v>oLW5-25KE{42 z?3A~+t9~Z=z0X!ZLwGN~JNMy@|4`oE`@MIC>a^Y$?(-*pU)SM$*Ey=+jSo`)RJ`tf z)ycz;{;q3O!JyI!O)(xM;!I=yO_&&8_W{;Yh2J`cfbpOa7Xy~YCSRQ*$)L7lbkSDls@ z<+b=x^qKOKJdgU{@LsMMw|TyT>qVLK)2UO5+xg^%Wg2%B&!GNg+f_24e#{TpQ~eL% zh4iyA=cSZa!~11*j>i(bfb}zv`;E5c%15aarA{ASj$afk$k@E4zoz^o$HiRgBoE1L z9x{Uk6U(RJY1ElV{T#dwpEyGGdt9Bbzg3-nyqWyBObLqz6*UW*Unw!ezb)wmXEp?h^9J&hNz2aI5nYp6l`*)Gu)U8|SxT=W|ljXPK-2G4<S&D%EQi}6PCHwGIX z+rMMZ2dPu}L%9EG>NMguZYTK(+{XPA`Dxt7y_Rw7{-gR$^z#^XlBeZ1|HZ+7kM)_2 zTm5o8&*f9*C|~Y;6aN0m20Y5Rzpko$2cC_8SEBhDb#-=ML;1*$;XZpFRz4jMPIvK7 zY@TBMXX4g>^+xg>=T|U4`MAy7Jmz!A`B!-9PwL0^%Tqt7eh+TrX7L`iA0MXAi|D82 zzp4|(zg(!bm;Wp4 zqzA8Hzo$Q-I?>3kacRMyqyHYf8UNF|$``Jrd>iNC-2Js~Cs&r+JlB$+!RukY!J{O;%p91DTJ29MJNS!?IhYpvY8!X7!{Yf`&>vJjfNAPHT??fWo;xn$! zg+dk$ zLH=OIt=%r1FUA}2DEZUbFC8xb>N(opZrsjG%bCwnm;apOZo+vr^{1U*gh#dy_qh~L za{djTivM5#7pTu1m#<*`=ezvhgZYlF|8keV0k6Vs{p9k#s~NZbz8&@Z@GRytIK9Q| zPr3Ss;>++Y+myhDT^z%37ttBfw&nf$By|p{v z9Ph%dpMP>6KIHOw+@Fj(x4-9V0xzYXdpRHG@2Gwn@gbfIhMezD{n9^&=jSNA7PtNN z;TD>QHkUtz_bq+6?XPj36Q}S*`gw%&&kSzI?;WiFgq_0k`Sev9HyNJ@_EYTB!gX^d zJDeYRU-^Wc<#zvU?-_=7k=IaXldY65%n8>SVjfDIzmJ#W(ReqJ$g6n0%Rh-X;dZ=_ z+4BNEN}a?1s`b;ntNO9|x4-wS2eMHvoAS2b2YIe+!)=~FU_ErY{L|b=qb>U(rvu^V9G?=a1rp&VOOt5$B2I z$DOZ)PdQ)8^VF>Kg~16fw!MjaX`XG~*5G+36Sw_!C!T{x*1K;nc$L{!Qa~bJlsp`rJF5fBs$VuN2&#XKyE;v`;wy&Kt_7;`ZEq9p4Z32l zXb2xBU$dO+&H<`p=Z9X-50L}qjpWBU4>UUenLbkwQr_mRk^AbNLb>&G6W)(UssA10 zj^ozPKgj1D9Ig{3Ux-_u4fHwUy!$cDTlpcX6WspAKkKj#a~H{znddR~V_{Kv+>^_dJ8@1Xy`1v@%+ z{MH?*yq#|^Bi~jcZzuolD_RfvN6Sm-=N0O-;{D{G6FLR#Bb-&X2=e$R%!Gpsv{`raL zh0)`~eKrLPJGNgYoZI`ZX*^gS@y|Eu+An=&s$=WwO6rXKHC*4`ACBWTZ!ZQrG&XL1 zc{ra(pH0rMT{Ahx4ffyn8NMfg}Kt+8=S7Zjr-wZ)yc*)sk0O3?J~R?zl1u& zcoP0S_p4*h6D!our1NxppWyt8puO0BOgJMv|A(=jlbtW&_)2rWXdl(dz}x6^K7ZbP z03X12UrqDSbf(6&^IjV78?&qA-Im8Ea9hupz|6wLF*4#0y>iV!RR$HZ%VDo^k73om+)@Qfy;NXzbc#` z&+oSzT%9#ox6RI%&}W+-*@rR&tF%a^P#pK$)Ao&TMuCMzGgGQ8jKXSbE=pzwhtx|L^;| z>(q~Ze^<)+A@PQApU>{3{hoo>aUS0NR(Z#b$`7)=7jb^5zA0R13C}gnxNYw|N z@K)+4Qa|@*)fvK%2@a6h`8jEcJUC3^pTqFV7Wv3}@+X*|{7!iheZI%{cg?u<^9J7L z{3iBSr}NC!)K8D|J=kCUc$9IA@Nt)4n5=o2a(*B_>*{QItHw=Rs_iPL{s8a!>u}qy zjk&%wy8JuAgv91^%H@|GqJCzbKY=GM)3~->haIeZ25#dXgJ-*Z9$xG`2d{Q@cEszP zKgsi8Bc8=PoJYRb)&IU&eU7?1Gx&tdUt`<*u(sE>E9pwjTMBM}U)Gzp{vQqJXF31W zIp3K5+vq$UZ^3PzuP9RgJubiE0C~UjZ}A~l=Q!$5xqK7v;b)z9T&?X*d`#O_x~e9+ z3oq}HPjNghK1}@-KOLTj7kU0F!(+dLjD1cgU)>kZSL1bfG@gz`4rPC};dUPW_#XAy zkK6m1xA`7+^q;C9rT;IOpV?Q!Gq1{n$A|c5G4t8?TDVRd=bu66 zr_%q3^Goq@+_tL*PaF)_KMPNBej*-qp0~61OC~f6|@*m3+SQbMbQL4S2ot+wpei%kX~Z^Xz*l+|FZJyoZ^> z$Jt+N1;=IVx-k5Xw#)Jb?3Xdz_Sbc+^T=>`9!l}3^I|*?xB6$`h0bg75?AM3yvF5U z;5u0E{22Oga&EteY<2!A$5Ds#arSSw^9!iohyUOFaQ+{2z7UVR8=mI_@Fd*o+)n*W z=VcFT{TJdXoR@Z^PT70m`iXd@^Y5r%gWGY}#C=h#%P+$_aO-n-?qdgBejj|;3>k3j@$dgjnCJ*jf^Ot$UL0)CD*SN^6^z7@y|2Cbs)CRCr88c z^QY}qe+HjaJaPl?6UIMOJ`?{l>m>Q3aGfprUN{YplAp)>v0U8lTV4+OiuF_J>fDdl zIDdfm%=OM6!JC{vg}36?PjApyY}{Vw|73nfU7bHx)%;B0!EK~IyuZ!)cX%G2I#c!Y zaeH5MFuyk_!-L1k_~$t8>#A{^=S1qax%w;4S3jM2BX#Do-g3s&PZYnF>rRRDdwI`X zgC~(c=^@px$Aia>_~$C>q<$RU-aR{&PseTDF5-Tp0FP4V#r>79aDF@9;QTnYtHXIl zm+B1Q!R0UhS&KR&pM?9|8y|PRJ3i$+8=rM<&*O=os(u^yS3i>Pmk5aGU1| zeAwkL;XE_#Jkj3MeyRF4&yR8b&%v#J1MiXYahw00dGA;5{73sf)cGG=ciNq2&}YB% z&aJfm$8qatQ`WCp`K$1}Jsun&vEwugw>s5$uJZ$^Q{d{{7p#g{oeGzKgy++0 z=da>*xXtrZc)QC#fOk260q=GGDc_q6;I?0m;eFAB^IcgdiC=4eY#w%FdsCdxJ4wey z)cN}C_e|WzeUtY;g)V$$}F?nSC!?&>^GoqCsVc}w%(gf|8IBlh`vu{=7d?FwFN z$3L6!Ubp<4@b-?fKCAGk;*q5%tDh!(7QYs6{8n`msJ|2MF`B*$*Uw>nwmM(N{CD6s z?(Mg${{fdjg6GO%=i|Kh8*_E;V!ubG)Q{Cai}PL-xBY$up6UEnJO4X>zC!bpkEbyY zb*#^_@5A$O@N3$xN_>cXWpE(Gj-%ZFg!?=RFU76T2I^Nhe~{}=wex+s-qkrj8gF!d z7~bOiY0ii3&gVX;dFaB+SSQc3-jb)o^N>AP`84Ny;2F5>ubscw{1jN8dHbDli+@!8 zPR9K=bs|57=QEP1aih3hf4Ahg>&9)K`#2Bu;lb%K{yFDR)fsmA2dOjW{0Z`t&L75S zoWDZ<3I7ex+eUUicfOeOUYhfp_`Wj3`ETU2aXSxx!S~B0E`JC4a_4*TeO#6E3)!w( z=NoZ-X>eXk{boGMJRiyPez(gXXYU7GewSd!#g3yfm%o5{m~{CBuBS;enrEAbMf9JA z+j>}t=Q`hx{a)bwERNG+=bJvP^;3o?v!3r~|5p7R-tXhouXVl|-r)Q+u1C$dZP%Kd zZ+mc?=T-0#S7*CmKg8y9+|}8VeBv+R<7-nq1GjlQoOPA$JdORH=X?q0`9kM6avm;m zKEd;5x$^<;ud19M%(%6<&BJEN+TK=||DOHW;rvg0zt-)1d*;8-c`f^E(D@-8Mr-s(JsIvvi(n1^oM-ec^_d3)UD?cZ~s!b^kmRP1x-tD679-!;#T;>c?Q z@)74dQosC<@P0Xs{;Qn7PM@{7_4y?0q0{Ae=xgmdbX>Q`b8_r?YN%GRKC>tWxHq|D)3tB{Ir&Q+~wa49voul|0#Tg{2|Nb11oD> zoB!*W|MXSlHvca%|6R_1XWZNb<)hSJ%zZ*BZrgRxE%cA~lK-S!+nc^>cph%pUY_N= z`ZU$a#T%$|67$*b^2gyr&a>H%qt1(YpEH4{QGW&JlY}|p?R}i}mX6!@KFYXR&fnnv zAs4sbM=d9x@ABW^Mb0m0+*0Qov7RfO@4|gowevmjIy}nuu8+65d>Y>A^0(2?pv$kq zb!x=4fcqVT1@E+H}LYH5k-%*!1 zUqGF5=ZD*Ky7MXCbJpU);UE7@a~Qa^R|@cgfttm8D@`DeTj$#TBlT#jq!YvKjY&*l9Q7=kqzAR6GBH{a)w%CC+1w z&ex=$7UvUqyYpuDZK*M+kXEWUh48s;a2-r{em>)7Ij<(4>wIV4 zBNaH$B46x0f|ogen{{64d^Pel&U?9z)H~mlewv)0MEzFhUy<){{x0>qoo`9L&-rm2 zzk|-7uheljf@kvQ(MqVFkQQFI2jJrSrokH{A|-x)7QFJ*W1PqDPM~>D;`v+Y zeA?#9SI0+*M9iC|!5^cKAHPXk zhWor=K>1X>k?l%iy|p{9`doFgwo;uz+rQMG#ciE@!F4$?BRuZroM%#;uZBmR2d9U4 z|CxA{aZjLrq08@wmpDHJFL!l*r2l&79~WudcHHJ?&M(Zv*4nNX`uT28`2cS7Kf6@( zT(phyc71u`Tjk5PmD}~Pc3R%Jo!shd$o+ZB_Hvu&`F7v#{KQGs$;7L<{vLb^>p4qx zGJ^SyeTwaQb4Pi8F=`o6C3Ooz7eF9`EaF9{TYv=DE}Q*(JQa?RcH@ zn}Qu0o6kn)_i$g)f@jkIc5GKaZrhcPkGnc+M>IcE&THvs)_FaixFFpBLh7eDKMs#N z|2awHX5tz2{{~)+r{i557d3bu^Z5hEW6!SYr-}SWg_^g5-Q@Ln!2$9?-13vQu67S^ zSIOS2D?EYY;@`)qPGzq0ZPb4nPue3q?z0>(O?c2={L_h#;*IzqUa_a@nAfnq)6VA{ zuYT(G3iq=K9?c8;-wxJx_2Eg3yAIdo!T;eS&JVv{Xzk{pIZ%HnIly$z!;UdoSN3PddK3kc!$NBkqzw?{$A?Jauc!BeWxNk3Zege-0WzK8xO6MyFCy>~2QRDpc2j%s+ z-KYH!+)&2yX^X=1^FE&8JdOUdooCu}jq|7Z{-w})H{VB;IRBL6uH5;5IKNdn-4Wh8H=1hB~Fr58`{k3g_MAtDPUqey?*rhxZ$e z&fn$y-{L$CZ+HGY-?w%-pXPT0z0PmM2b^!gdLDNE8S8V*`AgK9bbbT*8RvI%{Yp42 zyuU8Mlb!E{r#at`<08ZPBEEOXcD_BH=X@=^(D@|K-6hV~3q_FkF(C#>XcU&YkthPVx1Hn9-g;Hs9);*65fkeIKP;DH6CT$7QETz@8rIs&H0IV zr}KCD-m}N~dVIgx?|cd$a=r{7b$)P>=4ZnB$DGHeou9*cjvNu5x6=+$oh0Wuc&hXB z7Ac?Z{1QCN`CHV#)pugzq&foloI4&aY%W)H|=?y-<_$CcM>o zE9dzR=e2hJcb5$BEgxbwB?bISRldJe}>j&HmiM(b}$bw(EQHS$G=x#D`U<@EGO+f1K-GMQM0{ zH8DTc&UfRzXr1%>IA1m5cHi)1C2s3{W!@Xq;K{ttd6D0VHJljUu9X&PKAWBY zlk;ku^Jnl*=Q-Rz_c*_Y>r21$W_-x`pLre}bv{Y`3Fr3jV@^B2mim$M@b)I~yY3|1 z=5qr)!}<5zhvz%rhJ2Z;-*$!Ovl0)MS^P7?{Fj}iexmq(!T%?AUtNdWemnthbY4&W z7JQcd`xf<^E5h5`aD(c%;SH>-?<49n<5cAbsdF~}KKOK{ye^{8SCgt!eY(7b{OIHI zq^j_^M{g}pb-vnn@^sveyD83-%`X2e{j}kY^gqsf%gnPiu6=L#ZjQFA9k=#qnNz+>yGAGiJW8Q))&UJ}lKgIC~DwG)Zbe}nV2@eb$B zT(1Z4PU>8YS6`}e?fpQ6I!Sfmepa)2bAA_nraONX&vM?4=Q@7|FK|AD7du~ympOkQ zuXO$qUgP{eyx#fg?8heO)p)D(i|`KTFXP?Lm*RcS&tIZ-GKkl(u3lmO^DhtYmj?d6 zjw0tv@KWdZ;T6t<(?)!KRy#kHe4XT@wK=(vJfxBqj)i1=kld^qw{jS#nrhB?{Rti zd+hu1Hs)bR{ymQJ>%)B>vAMRZ%K52W_iLU16>o5UCEo1(Y`hJ(^Z)vIzsujlefSU_ zJZ{844_=@?$C}iC57*6XuA414$@`h-?b*Mj&GNKF{fBn`-l3XSc{la1Zc_csJLQ9T z759fTcggKKcs==qHhCubTkx#AGuo=Bg4c+I2X{PlR! zWAaJroWb+R3~uvw+FXsB(5<}r{=oxX>^z_B{O|1FH0L+q8F-X&8|bG1w|?xoGW&6j z+rxG}MSk)Lxt(uc!H1rdk5d2K9PP)>9{CV%^=qG!=Tm>3wY6P+Ps?q42k=4XH=U;X zBX}R@nUu9ur{&pjohOpy?amjI?{ePExV_G=AwPiIdRs>QlIOzX)-XTi_yqH?EAq-9olUn@ejK;+!0o|_BDPKuLahTDDhh17|@pnR12 z>D0-?ZNIETKZSTM`BLgMxO~Cs>ZcjE>%}p6`#&}A40SeSep+9Y+qhSrq&gkWPgthy z>c*}9CySNu?^m5d&Q}YmpS(O={{TGA`Hpyo^E*FM{cPvOH>;mKJe~D#PU3sv{FxQ<6z410k5T8}|5^D=ypew9GoL*!e|M(x{kU!K9UMm^@2j6O>a^oI zBXT=G-+~X~_V?nxz;$HoBjrcg-g2(Ly&s3S_e+lJ0p}<4yR2c{wkwJAL)jbE*y zYfaVZaDF`A?fgF8Gxs^aj{KnWCi)q1eiiS@$DQB7{pXbPyBK%Y`MHdnI2qoL4UC)O zyp#G-=f_^7dC0_TIIcIO&-QP__4lQpF6S$e?{&U9KHz*EeAxLm_C2`sSNQ&Y()qW1 zA3Edwe)0+5h5LUPPj)_+anqcC!F^_i^Bwr!Jlpx<92a@cH{$!>Lgy><{YZ)P!^oFA zA7#H+IX{j0taW|{`@O;W`qXK5J_m1e{yOvA>AaHfgL<5&@qJ&v^Wb%C{5&({d?)IR zI{%LA%Y^fv@M%2C`Rzr{GbvNy{r)xkCF=Y!@|n(`!E>CiLY;i)Pw>5Pk@J`FQs>X% z70%zot8v?|`|)O%Z{T~nHs`%JYo0st5$5NqV%@jYe;=NomwE5ngxhuJ5q^i6{)6)N zUZR)p5k{xObvp40=gT)zKhwBv*NScBDL<-?c^Ca;c0$c!nf*_PvH&t zV+YG?ehT;bBJUaMop<9+&i{e8I$svtU&OAP9nSB z-iM4k|0_P_d}%Nru{yKP@5B@T8=jv#sgvUTdOYg94$pLc`b`=)2k&9OZ1^wvl*^w> zeim;df8MC_tux_1-~C$NftQfCe|IMGv-0-u&dlX|x~yNrb%NL1@%hPh-pzIuIRBRQ zQ0#o2S6QF9-FICwAn(T;>GL_xt3|WnepchWUFv*oyux`C=l^QwKaj6;-j6pr--GLW zi}MS)PPIFaGH#dit?*vw+v5YycgBaE@4?p>v!666cG^mpeZeuX274_cOK5Te$yeaK1U->^uu^bG`uY zbiOCviaJj?mT zJZI%P{|+y3o_LbZ55>;s;$_Y=@k-~vZK?BEjq~+6-s_#`b9^;9-;eWBtMjvY9_(;F zH+YbYU0=GLe>5iVbN-^epTU!PKlA3t%8&jL-d~^bd#4FJ%K0-Ayr_wdn;6+WF6Qe8 zHw-b)aNf?J!!5vrw&S12PGkP@I=u8^)fsmAgj19s!)NIKo=cP;Sy}y9{eu?B$MN7c zEdEK_UUhO3l(+X+DR|MU@>2SFWq0K}ajSpaGpgT%M}zx`*k=+SNmQK@p6~vSr3y!>brKJ4y9t@E6lmKXa|{xGjvEgV!=Y#d!DH z$_KkU{&{*M)fvUD|3jI#34D+`6|A4`YsO#^7$#@`e))r&QHcmomca_mkQkOW3OIS<4!rhyjtVdtREitcnsdHM#7%RDT^vr^@4_^zCnhBhS6ek^-Kbw=?~@|%$F**KiP zgZlk=0_*wD7bllcYI{B&j;ru`8XBMBJ|BwEp?Hb=A zoUb82ggQv5eQ??G*pTm2|sPknhs-Nk6g7uu^Jgr3I z<~wgaUv-L{=i#N!+ul{a0#9ZBPoV$0ZNvR%^L*Xtd?n_y1&^|Re!E@udt81S&P)CH z0Qu4vwOx&w8n**)m{pzZ?c{~{Ioa|$ya|7n_tnYUD_@UqOZ{ft>My`^cTm2Ud;va# z+x{JUL48*3sC;nRjDOZ!NdLH<=WpYB)R|45buyEo{s(rJ+j;Ww3+2Pk=ip<`6V6qB z()rZR>SxCJR-MWx?4ohU>3=Eb{|Vgs+3#fKr=2fbERQS*_kT9;x09R?a6V6UUWlhV zUw~&h|HQt3cRq|4IDZ~5cK!%n=DZcJbpAn+wztN4>&NnX=lcco8oN$4Io}I!bw0-X zlMcL@{c;`m1Gzcjc|MDL0p3skP>$cEUBme`_f$WrxIK^Gnklbx`QMoTTIcui{Y!)M zr{<|nv-8fweO`g*?xsG2+wb_Nb4~KQhx<40bUw^;R*&;7&d~br$443WH13nz za>Mlx=Dxbq`8s%y^9}KS=kxI)=O?sjyGHTg^cDZC`>8y6k8nSBeM!T+nV)&=-=RIj zd3&!iiragYYr9lGX`%A=@A;0+kw^Cl*STg3&08jJfB)Ot+tX)(@-;qO>2#h>KRtLM^)on*5)KX5PvJb1j88J3S(~e$S(iVG{hs)j zaGf`)pW=Kweydft8J(Q@9`OCq99NS+BM~CZg^npCtc~`KIV)-<@jd^$t z@5QI_@9?f;RNu}U6)RM~u{1pHB|pkr@ILONK4-s_93Rf#$N9V*k23DbSF29F%U{g% zLX-1Pn739uSeEh6w%clZ+g<*Pf2)3%^R8{>y?B&5!}K}o@}u~K%OA=8Mq-(^w}(1C z9FKjt-B;|(@i>Slu;0%Q4$Rp88ahFB?0!2jU41tHzf#UWI?gGLjv#Ch1X*GgICLBH=9;yzu>w}%;lLc=kpPTCC)8^=R z_d3q^?{N6Jyg%)7_@gEA?}gibtr|g1YJf~kTUg_{Ncy zx9iJojmA(&d<9Rv$gYXvg=ipO$seG&-Plt~=d=>Zo*40XH z{)bR+gTn_{7n&Wua<1ZUgO_9|pnksBGh7$+Z$v)^&nM5t1@g)Iwe;TbPL~JgiN{xq zr{Mo){)t{GZh3gMOnDoETf34QwSmwXdE6QpRe7o{EYujdT$y`mt)C)&hN!74>jH!4}bh8;4$=fke@Ml4SBZfY~?ox z<5|Y|tb*J8&`-S+aGU4nvyLR!2YoKE^A2wP^17FBKhBI+=}W!+s9$bLikEE=Un3mK zUoJiX55q55sr-z=y=f<1mK92$-!321Z(;o^fqP-3%e(^Wb@WT^{XTpgz45Az@*jgA zjXrj}cnf(x9G*&ud)=KbVR-Z|ahnfsXMT>|EgnO^8s5?&9;V(GrYH|xaLe1{@W?&V z+r0V^d>r0~&zA^bUBavf=b}l@6$Q&%HSR7SFnyxIQrUBzB_t&_}g}2~;IJ^^X<7x%tv+W`In|>AVzam{hz5$;ehaZnV_Ha<22TwUX z8y^96tLZ>7(#b^85t%734n_^!dh{NPYi8hY#h+rx-rS_`GDPc;@3lpY^mW$KfBb z9}dIg%x{&%+4Qu0+APkf;t4+^o`k>6IyDHlJQrLceaiSW9dKGiagIJOAIs-)1=3gb z2jjnj`MCyOO})o5{|~_{;TNMXctJkKuZB0lE6~rO-VwOPznDCH22Y@$U>#|GF&Jkb zd1!NZ54^+Se}i|y>oQfrGlj}e{_FCurQVgSkF9Wg|JD{x8OV z(BYl5H|6ll;G+(I0{?M`m!qGA7wx8i7Qzev5zOZzcriRo{N_{X=wD`^7KeM&Y`V;3 zU(xuX{PWl^EgMvR5@X`+_%C}(y!d1BN%#Td;tM_zxA9#6fX??u_z?Pk;Zy#p^hMPB z9G_n|eJ*bK|8|vpTH!7D6tfS>|EKgrw5w$g=_j^`_wjz=R@SxdFM|FN){#DkpLC+y zHR$kRZ$s#>Unz%wg8!()hvDN6@8*8sNryiL&zuOx`5ZjQ;oG>sJ?!wW-~|rf0$~+f@S3C2yxxtG$(91>;!`k30Ml?w_f1`18BSzro>a`CPIYZtGWUiRvA7^n1d` z9e%wRuOI&;ypC~lC!agiZVkp?&Hkj`;itiy96p`v1Fa6Uj`Gms@JjUk4!@>UK0^-wAWMAM;TydD zpg&H=9KLwD^b-zWk3O_582{Z~`+T1)hkLghqAd)@!lBv{-qATfjn0@e4ZDuudjCa9C)q6 z_k`Cwe7V1pp&%#?Bz8^f{@Hu>bl!Pm*q0l2u+B9ceb}MeYxRK6n0r@!;^SJBb%M{9Qf=DTZgKM@uMlLz(I=b@bEQ2$^u3(#3#Q4Z7yqsB z33xyJeVZSq2ladJp?d3f61VtI<@3QvruZN}`*S`{z<6ynJTR=Qel+JQtsDiKiBB{rhE7@zleuzfSPJXyKpN(Ou=Az~^%K2)q^^ zhL`OoeG&Z6@J4tX{we%3xQ+^i+ToGxpwA5Atc06>Y?I<_gXiO4O?!JCel2{&;q&mx zm?h_N_EE9>1DSYbo6d$GDC-JGs70-q*dQd)bcprR^hr}a$Nk0HziGCd3 z3qKoua&PIazuqK2wLcP{K>tI0s`JFF;0M#Let0Q7`)V2i`!{>z#`Q+~>-V6T@{}G2DjJ`b_)Nh1W>>uRC#FKMCke8t!a`NZE714AhtR)EJWWSPZ{z<;;@J#uMt=?d zRX+~u_rO01H~mud3yOmJkMM7Vn|@dH*+)um?cHSggj>6&G0%*{^NF*Acyf-CkG1!0 z_$b`l_N2>3?}t#FKf9cn1EjqR%=u=<_5zCn_FBzuNp4 ziCaE5!848%w|ssHABHy(PY&&>K3;ljm+50A!Fq2Z{`d*v=F^D(ID8O)%Ukba>7&H| zG(M9jirc(>FFa>S(BJah4)4O>@>69(+FJ z{+7uzg7vOz(|)-4Eb&QvCK~0lpicO>hL8qq%XN37|%?*z6x){=Q#3E zaG~^T;A>w|oE`8<__hJ@#0u#%7$@(%j6NRZAEWPFDQ28b75}k|gWTRfes+m?3ZJt1%4h$j;$e7{`%6dRUiYO-_e;t{ zW^GVE9UgJ`VtCBqmt82IIJ^M=)-x1OtD|2?9=hRU=)1^6`>zy_@jCL*cv+Bt2d}wY z+~&Po@R@MpVtt7|4;;vz@H?~mGIb9yfd3w<>w&pKL4qq8KJ5^+KYZ6JPyx>XL$F=&I(NnMQMN6PxZoH@R0Yt1ivKK%}hU5 zdfy+J6`B(Ax-(tEdI(+a`OotDB^25d9K zjmxUZuqQlbd5?aR?f5a;V~;mD`b_6L&HJ(X z)4}*J&<_jz=U(B@?Z;a?&huXLJ?;1?LVNU&-LXV>{KI>GfcLZG@rjq!zyIra(zD&g z+BAJTQU8Xb+d<%oi~aA}_{UoNLX1m0zRG*eFV;TGpN(6;?|o*++jy^vdhmOS9d9qi zyeD?7G5^tyU$rCjp1a3;r{(t^KNQu0-QIk_~_6 literal 0 HcmV?d00001 From 9c97b31e1407767cd35fef85efd99a4a042bce5f Mon Sep 17 00:00:00 2001 From: Alexey Karimov Date: Thu, 8 Oct 2026 11:50:18 +0500 Subject: [PATCH 2/2] fix(elf): only claim same-or-better when the server said what it holds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- src/cli/debug_files.rs | 13 ++++++++++++- tests/elf_upload.rs | 25 ++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/cli/debug_files.rs b/src/cli/debug_files.rs index aa53b47..510be28 100644 --- a/src/cli/debug_files.rs +++ b/src/cli/debug_files.rs @@ -1403,6 +1403,11 @@ async fn upload_one_so( // unchanged or poorer library transfers nothing. `--force` (overwrite) // still means "always replace". format_variant: lib.format_variant(), + // Sent for EVERY library, not only `dwarf` ones. The server never lets a + // `symtab` replace anything (a stored copy with no variant is replaceable only + // by `dwarf`), so this cannot downgrade. It also opts a plain Android app out + // of the legacy find-or-update, which has no duplicate check: without it an + // unchanged symbol-table library would re-transfer on every build. replace_if_richer: Some(true), }; let detail = presigned::upload_detailed( @@ -1425,7 +1430,8 @@ async fn upload_one_so( presigned::Outcome::Uploaded => { tracing::info!(lib = %lib.name, build_id, "uploaded") } - presigned::Outcome::AlreadyExists => { + // The server said what it keeps: it is the same as, or richer than, this file. + presigned::Outcome::AlreadyExists if detail.stored.is_some() => { tracing::info!( lib = %lib.name, build_id, @@ -1433,6 +1439,11 @@ async fn upload_one_so( "already on server at the same or better level, skipped" ) } + // It did not say (a server that predates this, or a copy with no variant), so + // all that is known is that the build-id is held. + presigned::Outcome::AlreadyExists => { + tracing::info!(lib = %lib.name, build_id, "already on server, skipped") + } } Ok(detail) } diff --git a/tests/elf_upload.rs b/tests/elf_upload.rs index 45d9873..a9919eb 100644 --- a/tests/elf_upload.rs +++ b/tests/elf_upload.rs @@ -350,11 +350,34 @@ async fn elf_upload_skips_without_transfer_when_the_server_keeps_the_richer_copy let stderr = run_elf_upload_of(server.uri(), zip, &[]).await; - assert!(stderr.contains("already on server"), "{stderr}"); + assert!(stderr.contains("same or better level"), "{stderr}"); assert!(!stderr.contains("re-run with --force"), "{stderr}"); } } +/// When the server does not say what it holds (a server that predates this, or a copy +/// with no variant), the per-library line must not claim it is "the same or better". +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn elf_upload_does_not_claim_same_or_better_when_the_server_does_not_say() { + let server = MockServer::start().await; + let tmp = tempfile::tempdir().unwrap(); + let zip = pack_fixture_zip(tmp.path(), "libsymbol1.so", "arm64-v8a/libsymbol1.so"); + Mock::given(method("POST")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "ok": false, + "error": {"type": "DuplicateSymbolsFoundError", "code": 16004} + }))) + .mount(&server) + .await; + + let stderr = run_elf_upload_of(server.uri(), zip, &[]).await; + + assert!(stderr.contains("already on server, skipped"), "{stderr}"); + assert!(!stderr.contains("same or better"), "{stderr}"); + // The summary still tells the operator how to replace a copy this server cannot upgrade. + assert!(stderr.contains("re-run with --force"), "{stderr}"); +} + /// `--force` still means "always replace": it sends `overwrite` and still declares the /// file's richness, so the record it creates is labelled for the next comparison. #[tokio::test(flavor = "multi_thread", worker_threads = 2)]