<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>ttylab80387 · Research Notes</title>
        <link>https://ttylab80387.com/en/research/</link>
        <description>Tech research posts: sometimes a problem I solved at work, sometimes something I play around with in my spare time</description>
        <lastBuildDate>Mon, 19 Oct 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[LG V35 to LineageOS (Part 1): Backup and Upgrade to Android 10]]></title>
            <link>https://ttylab80387.com/en/research/lg-v35-lineageos-1/</link>
            <guid>https://ttylab80387.com/en/research/lg-v35-lineageos-1/</guid>
            <pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[There is no Android 10 KDZ for the AT&T LG V35, so the only way is the open-source edl tool in EDL mode: make a full backup first, then write the stock 30e partitions that someone online had read from their phone into slot b. Covers the button combo for getting into EDL, how the backup went from one big read to reading in batches, and the actual ARB value of 30e.]]></description>
            <content:encoded><![CDATA[
<p>I have an LG V35 (LM-V350AWM, AT&amp;T hardware) that I had cross-flashed to the US Open Pie 20f. This time I wanted to put LineageOS 22.2 (Android 15) on it as an app test phone, but the <a href="https://wiki.lineageos.org/devices/judyp/install/" target="_blank" rel="noopener noreferrer" class="">official LineageOS install guide</a> requires the "latest stock Android 10" first, and AT&amp;T only pushed Android 10 as an OTA, so there is no KDZ to flash with LGUP.</p>
<p>In the end I used the open-source edl tool to get into Qualcomm EDL (9008) mode, made a full backup of the partitions unique to this phone, and then wrote the AT&amp;T 30e stock partitions that someone else had read from their phone into slot b. This is part 1. It ends with Android 10 booting; flashing LineageOS is left for part 2.</p>
<!-- -->
<div class="theme-admonition theme-admonition-warning admonition_awr5 alert alert--warning"><div class="admonitionHeading_qgRS"><span class="admonitionIcon_Oc9R"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Disclaimer</div><div class="admonitionContent_zuXe"><p>This is a record of what I did on <em>one</em> phone, not a guide that is guaranteed to work. Flashing a phone's low-level partitions can leave the phone unable to boot (bricked) or make it lose its IMEI or Wi-Fi calibration data, and you won't get the manufacturer's warranty either. You do this at your own risk. <strong>Make a full backup before you start</strong>, and check that your situation matches the "Scope" section below.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="scope">Scope<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#scope" class="hash-link" aria-label="Direct link to Scope" title="Direct link to Scope" translate="no">​</a></h2>
<table><thead><tr><th>Item</th><th>My setup</th></tr></thead><tbody><tr><td>Phone model</td><td>LG V35 ThinQ LM-V350AWM (AT&amp;T hardware)</td></tr><tr><td>Firmware at the start</td><td>US Open Pie V350ULM20f (ARB00)</td></tr><tr><td>Firmware flashed before</td><td>AT&amp;T stock → right after I bought it, flashed to US Open Oreo V350ULM10h (<code>V350ULM10h_00_NAO_US_OP_1130.kdz</code>) → later flashed again to Pie 20f because the Roon app didn't support Android 8</td></tr><tr><td>Bootloader</td><td>Unlocked (unlocking isn't covered here)</td></tr><tr><td>Computer</td><td>macOS 27.0.1, Apple Silicon (arm64)</td></tr><tr><td>Tools</td><td>bkerler/edl commit <code>1cda1a6</code> (2026-09-19), Python 3.14.6, libusb 1.0.30</td></tr><tr><td>Date</td><td>2026-10-19</td></tr></tbody></table>
<p>Not tested, no guarantee it applies:</p>
<ul>
<li class="">Other V35 models (LM-V350N Korean, LM-V350ULM, LM-V350EAW…): the partition table may be different; the Korean and US versions are already known to have different partition sizes</li>
<li class="">Starting from AT&amp;T stock firmware, Oreo, or Korean firmware</li>
<li class="">Windows/Linux computers, other versions of edl</li>
<li class="">Phones that aren't unlocked yet</li>
</ul>
<p>Verification status of each step:</p>
<table><thead><tr><th>Step</th><th>Status</th></tr></thead><tbody><tr><td>Tool setup</td><td>✅ verified on the real phone</td></tr><tr><td>Getting into EDL</td><td>✅ (success comes down to feel; it took me many tries)</td></tr><tr><td>Reading the partition table</td><td>✅</td></tr><tr><td>Full backup (method)</td><td>✅; the cleaned-up <code>read_lun</code> commands 🧪</td></tr><tr><td>Backup verification script</td><td>✅ (run on the actual backup)</td></tr><tr><td>Pre-write self-check script</td><td>✅ (run against the actual partition table and 30e images)</td></tr><tr><td>Writing slot b (method)</td><td>✅; the cleaned-up <code>write_lun</code> commands 🧪</td></tr><tr><td>Booting Android 10</td><td>✅</td></tr><tr><td>LineageOS</td><td>⏳ part 2</td></tr></tbody></table>
<p>✅ means it was actually run in the setup above and worked. 🧪 means the command syntax and arguments were dry-run tested against a fake edl and match what was actually run, but these cleaned-up commands themselves haven't been run on the real phone yet. ⏳ means not done yet.</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="goals-and-constraints">Goals and constraints<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#goals-and-constraints" class="hash-link" aria-label="Direct link to Goals and constraints" title="Direct link to Goals and constraints" translate="no">​</a></h2>
<ul>
<li class="">Goal: LineageOS 22.2, keeping the Hi-Fi Quad DAC</li>
<li class="">Use: app test phone, Wi-Fi only, no SIM</li>
<li class="">Only open-source tools whose source code I can read. I once downloaded a fake "modified LGUP" and had my account stolen, so I didn't want to gamble again this time</li>
<li class="">Make a full backup before every write</li>
<li class="">Don't overwrite the partitions unique to this phone: persist, ftm, modemst1/2, fsg, fsc, etc.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="current-state-of-the-phone">Current state of the phone<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#current-state-of-the-phone" class="hash-link" aria-label="Direct link to Current state of the phone" title="Direct link to Current state of the phone" translate="no">​</a></h2>
<p>Read with adb on 2026-10-19:</p>
<table><thead><tr><th>Item</th><th>Value</th></tr></thead><tbody><tr><td>ro.boot.vendor.lge.model.name</td><td>LM-V350AWM</td></tr><tr><td>ro.vendor.lge.swversion</td><td>V350AWM20f</td></tr><tr><td>ro.vendor.lge.factoryversion</td><td>LMV350AT-00-V20f-LAO-COM-FEB-18-2020-ARB00+0</td></tr><tr><td>Matching KDZ</td><td>V350ULM20f_00_NAO_US_OP_0218.kdz</td></tr><tr><td>ro.boot.verifiedbootstate</td><td>orange (unlocked)</td></tr><tr><td>ro.boot.slot_suffix</td><td>_a</td></tr><tr><td>root</td><td>none</td></tr><tr><td>Battery (estimated from charge counter)</td><td>about 2,350 / 3,300 mAh, about 71%</td></tr></tbody></table>
<p>I unlocked the bootloader in 2024 following a tutorial on the Nemo community site, using EDL plus an engineering abl. The firehose file I used back then is still on my NAS.</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="tool-setup">Tool setup<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#tool-setup" class="hash-link" aria-label="Direct link to Tool setup" title="Direct link to Tool setup" translate="no">​</a></h2>
<div class="language-sh codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-sh codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain"># Open-source EDL tool (GPL-3.0)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">git clone --depth 1 https://github.com/bkerler/edl.git   # commit 1cda1a6</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">python3 -m venv venv &amp;&amp; ./venv/bin/pip install -r edl/requirements.txt</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># Download only the LG SDM845 firehose that's needed</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">curl -L -o edl/Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  https://raw.githubusercontent.com/bkerler/Loaders/main/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin</span><br></div></code></pre></div></div>
<ul>
<li class="">Before installing, I went through edl's dependencies and network calls: only the helper tools connect to the internet, the main program doesn't</li>
<li class="">I checked two things on the firehose: its git blob hash matches the one on GitHub (<code>2ed52868…</code>), and its SHA-256 is <code>82808c5e…1da13</code>, identical to the <code>prog_ufs_firehose_Sdm845_lge.elf</code> I used to unlock in 2024</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="why-i-couldnt-just-use-lgup">Why I couldn't just use LGUP<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#why-i-couldnt-just-use-lgup" class="hash-link" aria-label="Direct link to Why I couldn't just use LGUP" title="Direct link to Why I couldn't just use LGUP" translate="no">​</a></h2>
<table><thead><tr><th>File</th><th>Matches the phone?</th><th>Format</th><th>Can LGUP flash it?</th></tr></thead><tbody><tr><td>V350AWM30e.zip (Android 10)</td><td>✅ same hardware</td><td>Partition image pack someone read from their phone</td><td>❌ can only be written one partition at a time with EDL</td></tr><tr><td>V350ULM20f KDZ (Pie)</td><td>✅ the firmware the phone was already on</td><td>Official LG KDZ</td><td>✅ for unbricking</td></tr><tr><td>V350N 30a/30d KDZ (Android 10)</td><td>⚠️ Korean version</td><td>KDZ</td><td>Needs PARTITION DL in a modified LGUP</td></tr></tbody></table>
<p>When there's an official KDZ for the same model, LGUP's Upgrade mode is the same as an official update, and the risk is low. There's no Android 10 KDZ for the AWM, so EDL was the only way.</p>
<p>Also note that a KDZ itself <strong>contains</strong> images for partitions like persist, ftm and mpt (you can see them in the files the Feiyu (飞羽) ROM extracted from the Korean KDZ). If you select everything in PARTITION DL, the contents of the KDZ overwrite the phone's own. The only ones not in the KDZ are modemst1/2 and fsg.</p>
<p>Two routes I looked into but didn't take:</p>
<ul>
<li class=""><a href="https://www.link-nemo.com/u/10001/post/260876" target="_blank" rel="noopener noreferrer" class="">Feiyu ROM</a> (Chinese; a Korean 30a/30c recovery-flashable zip from the Nemo community): I read its update-binary and found it uses dd to overwrite partitions unique to the phone like persist, ftm, mpt, misc and persdata, so I didn't use it</li>
<li class="">Korean V350N 30d KDZ: needs a modified LGUP, and someone reported Wi-Fi and networking breaking after flashing it onto a US model, so I didn't use it</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="firmware-i-downloaded">Firmware I downloaded<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#firmware-i-downloaded" class="hash-link" aria-label="Direct link to Firmware I downloaded" title="Direct link to Firmware I downloaded" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="att-v350awm30e-android-10-partition-pack">AT&amp;T V350AWM30e (Android 10) partition pack<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#att-v350awm30e-android-10-partition-pack" class="hash-link" aria-label="Direct link to AT&amp;T V350AWM30e (Android 10) partition pack" title="Direct link to AT&amp;T V350AWM30e (Android 10) partition pack" translate="no">​</a></h3>
<ul>
<li class="">Source: "<a href="https://xdaforums.com/t/v350awm30e-att_us-stock-rooted-partitions.4322737/" target="_blank" rel="noopener noreferrer" class="">V350AWM30e ATT_US stock &amp; rooted partitions</a>", shared by jacob019 on XDA</li>
<li class="">3,698,834,161 bytes, SHA-256 <code>cb962c92…f876</code>, <code>unzip -t</code> reports no errors</li>
<li class="">No Windows executables inside: <code>partitions/</code> holds the stock partitions, <code>modified/</code> holds modified boot, dtbo and vendor (Magisk, TWRP, verity disabled), plus <code>sources/</code>, <code>notes.txt</code> and <code>load.sh</code></li>
<li class="">vendor fingerprint <code>lge/judyp_lao_com/judyp:10/QKQ1.191222.002</code>, security patch 2020-04-01</li>
</ul>
<p>What I noted after reading the notes and the thread:</p>
<ul>
<li class="">The author only writes <strong>slot b</strong> and keeps slot a as a fallback</li>
<li class=""><code>OP.bin</code> (650 MB) is bigger than the phone's OP partition (450 MB), so it can't be flashed</li>
<li class=""><code>persist.bin</code> is calibration data from the author's phone; never flash it</li>
<li class="">Someone reported the modified boot bricking their phone, so I only used the stock images</li>
<li class="">The ARB (anti-rollback) value can't be read from the strings in the images. Indirect evidence: <a href="https://xdaforums.com/t/v350awm30e-android-10-stuck-in-fastboot-no-recovery.4790905/" target="_blank" rel="noopener noreferrer" class="">someone on XDA flashed from 30e back to Pie 20f successfully</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="official-lineageos-files">Official LineageOS files<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#official-lineageos-files" class="hash-link" aria-label="Direct link to Official LineageOS files" title="Direct link to Official LineageOS files" translate="no">​</a></h3>
<p>All checked against the official SHA-256:</p>
<ul>
<li class="">lineage-22.2-20261015-nightly-judyp-signed.zip</li>
<li class="">boot.img (Lineage Recovery), dtbo.img, vbmeta.img</li>
<li class="">MindTheGapps-15.0.0-arm64-20260915_032013.zip</li>
<li class="">copy-partitions-20220613-signed.zip (SignApk signature)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="for-unbricking">For unbricking<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#for-unbricking" class="hash-link" aria-label="Direct link to For unbricking" title="Direct link to For unbricking" translate="no">​</a></h3>
<p>I keep two KDZs on my NAS: V350ULM20f (Pie 20f, same as what's on the phone now) and V350ULM10i (Oreo).</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="getting-into-edl-9008">Getting into EDL (9008)<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#getting-into-edl-9008" class="hash-link" aria-label="Direct link to Getting into EDL (9008)" title="Direct link to Getting into EDL (9008)" translate="no">​</a></h2>
<p>This is the step that took the most time. Failed attempts:</p>
<table><thead><tr><th>Attempt</th><th>Result</th><th>USB (vid<!-- -->:pid<!-- -->)</th></tr></thead><tbody><tr><td><code>adb reboot edl</code></td><td>Goes into LG Download mode; LG redirects it to LAF (no luck)</td><td>1004:633A</td></tr><tr><td>Hold power + volume down, "let go" when the screen goes black, then tap volume up repeatedly</td><td>Download mode, tried 2 times (no luck)</td><td>1004:633A</td></tr><tr><td>Power off, hold volume up + volume down, then plug in USB</td><td>Off-mode charging screen (no luck)</td><td>1004:6300</td></tr><tr><td>Same as above, slightly earlier timing</td><td>LG's IMEI barcode info screen, harmless, press power to leave (no luck)</td><td>1004:633E → disconnected</td></tr></tbody></table>
<p>The combo that worked (05C6:9008 detected at 14:00:23):</p>
<ol>
<li class="">The phone is connected to the Mac; starting from Download mode or with the phone booted both work</li>
<li class=""><strong>Hold power + volume down, and don't let go at any point</strong></li>
<li class="">As soon as the screen goes black, rapidly tap volume up with another finger</li>
<li class="">Only let go of all the buttons after the computer detects 9008</li>
</ol>
<p>At first I followed an English guide and read it as "let go of power + volume down when the screen goes black", so I kept ending up in Download mode. Then I read the <a href="https://www.link-nemo.com/u/10001/post/257028" target="_blank" rel="noopener noreferrer" class="">original post on the Nemo community</a> (Chinese), which spells it out: 「切記同時不要鬆開音量減和電源鍵」 ("be sure not to let go of volume down and power while you do this").</p>
<p>USB changes during the attempt that worked:</p>
<div class="language-text codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-text codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">13:59:55  1004:633A  Download mode</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">14:00:04  disconnected → 1004:633E</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">14:00:21  disconnected (screen black)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">14:00:23  05C6:9008  EDL ✔</span><br></div></code></pre></div></div>
<p>With both hands on the buttons it's hard to watch the screen at the same time, so I wrote a small loop that has the Mac say it out loud when 9008 shows up:</p>
<div class="language-sh codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-sh codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain"># Announce by voice when Qualcomm 9008 is detected, so you don't have to watch the screen</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">while :; do</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  ioreg -p IOUSB -l -w0 | grep -q '"idProduct" = 36872' &amp;&amp; { say "E D L"; break; }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  sleep 0.3</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">done</span><br></div></code></pre></div></div>
<p>36872 is 0x9008 (1478 is 0x05C6). When the Mac is muted you can't hear <code>say</code>, so later I also used <code>osascript</code> to pop up a window:</p>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">osascript -e 'display alert "偵測到 EDL！" message "立刻放開所有按鍵，不要再碰手機。" giving up after 15'</span><br></div></code></pre></div></div>
<p>(The title 「偵測到 EDL！」 means "EDL detected!" and the message 「立刻放開所有按鍵，不要再碰手機。」 means "Let go of all the buttons right now and don't touch the phone again.")</p>
<p>Two more gotchas:</p>
<ul>
<li class="">Holding power + volume down for about 10 seconds forces a reboot, and that also happens in EDL, so let go of everything the moment 9008 is detected</li>
<li class="">Once the phone gets into an error state in EDL, the only way out is to enter EDL again (reboot with power + volume down)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="reading-the-partition-table-read-only">Reading the partition table (read-only)<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#reading-the-partition-table-read-only" class="hash-link" aria-label="Direct link to Reading the partition table (read-only)" title="Direct link to Reading the partition table (read-only)" translate="no">​</a></h2>
<div class="language-sh codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-sh codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">python edl.py printgpt --memory=ufs --loader=Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin</span><br></div></code></pre></div></div>
<ul>
<li class="">The CPU is SDM845, and PK_HASH starts with <code>1030cd12ce708f29</code>, matching the loader file name</li>
<li class="">The firehose supports 14 commands: program, read, nop, patch, configure, setbootablestoragedrive, erase, power, firmwarewrite, getstorageinfo, benchmark, emmc, ufs, fixgpt</li>
<li class="">The UFS is a Toshiba THGAF8G9T43BAIRB0300, 7 LUNs, block size 4096</li>
<li class="">OP_a is 0x1c200000 (450 MB), smaller than 30e's OP.bin (650 MB), which confirms OP can't be flashed</li>
</ul>
<p>Full partition list for each LUN (in partition table order):</p>
<ul>
<li class="">LUN0: mpt, drm, sns, ssd, persist, misc, ftm, power, encrypt, eksst, rct, fota, srtc, pstore, els, carrier, persdata, oem_a, oem_b, vendor_a, vendor_b, system_a, system_b, OP_a, OP_b, userdata, grow</li>
<li class="">LUN1: xbl_a, xbl_config_a</li>
<li class="">LUN2: xbl_b, xbl_config_b</li>
<li class="">LUN3: ALIGN_TO_128K_1, cdt, ddr</li>
<li class="">LUN4: aop_a, tz_a, hyp_a, modem_a, mdtpsecapp_a, mdtp_a, abl_a, dsp_a, keymaster_a, akmu_a, boot_a, cmnlib_a, cmnlib64_a, devcfg_a, qupfw_a, laf_a, vbmeta_a, dtbo_a, storsec_a, raw_resources_a, sid_a, aop_b, tz_b, hyp_b, modem_b, mdtpsecapp_b, mdtp_b, abl_b, dsp_b, keymaster_b, akmu_b, boot_b, cmnlib_b, cmnlib64_b, devcfg_b, qupfw_b, laf_b, vbmeta_b, dtbo_b, storsec_b, raw_resources_b, sid_b, sec, devinfo, dip, apdp, msadp, spunvm, limits, toolsfv, logfs, sti, logdump</li>
<li class="">LUN5: ALIGN_TO_128K_2, modemst1, modemst2, fsg, fsc (IMEI and network settings)</li>
<li class="">LUN6: frp</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="full-backup-read-only">Full backup (read-only)<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#full-backup-read-only" class="hash-link" aria-label="Direct link to Full backup (read-only)" title="Direct link to Full backup (read-only)" translate="no">​</a></h2>
<p>My original plan was to read the whole phone in one go with <code>rl</code>, skipping userdata, and use <code>--genxml</code> to generate a rawprogram xml that could later write the whole phone back:</p>
<div class="language-sh codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-sh codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">python edl.py rl ~/LG-V35-backup/dumps \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  --memory=ufs --skip=userdata --genxml \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  --loader=Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin</span><br></div></code></pre></div></div>
<p>Reading it all in one go failed, and it took 6 trips into EDL to get everything:</p>
<table><thead><tr><th>EDL session</th><th>Method</th><th>Result</th></tr></thead><tbody><tr><td>1 (14:00)</td><td><code>rl</code> whole-phone read</td><td>Read about 187 MB, then hit <code>USBError(32, 'Pipe error')</code> at <code>els</code>, and the phone went into "Sahara error state" (no luck)</td></tr><tr><td>2 (14:11)</td><td>Waited about 1 minute after detection before starting to read</td><td>The phone had already rebooted back into Android on its own; maybe I waited too long, or held the power button too long (no luck)</td></tr><tr><td>3 (14:15)</td><td>One <code>edl r</code> call per partition</td><td>modemst1/2, fsg, fsc, devinfo, sec, abl_a/b succeeded; the phone rebooted while reading laf_a. My guess is the power button was still held for more than 10 seconds after I heard the alert</td></tr><tr><td>4 (14:21)</td><td>Same as above</td><td>laf_a/b, boot_a succeeded; Pipe error halfway through boot_b</td></tr><tr><td>5 (14:25)</td><td>Same as above</td><td>cdt, ddr, frp, carrier, persdata succeeded; <code>els</code> failed again (Input/Output Error)</td></tr><tr><td>6 (14:37)</td><td><strong>Read all the partitions on one LUN with a single <code>edl r</code></strong> (comma-separated list)</td><td>32 partitions succeeded in one go; reading the slot b firmware after that also worked, until another Pipe error while reading modem_a (worked)</td></tr></tbody></table>
<p>Calling edl again for every partition means reconnecting every time, and on this phone that easily triggers USB Overflow/Pipe error. On bkerler/edl, <a href="https://github.com/bkerler/edl/issues/752" target="_blank" rel="noopener noreferrer" class="">issue #752</a> also has someone reporting "overflow on the second connection". After switching to one call per LUN it was much more stable.</p>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="cleaned-up-backup-commands">Cleaned-up backup commands<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#cleaned-up-backup-commands" class="hash-link" aria-label="Direct link to Cleaned-up backup commands" title="Direct link to Cleaned-up backup commands" translate="no">​</a></h3>
<p>Below is the method above tidied up into a version you can run directly. The syntax and arguments were dry-run tested against a fake edl, but these commands themselves haven't been run on the real phone yet (🧪). I'll run them for real the next time I'm in EDL to confirm.</p>
<p>Run this inside the edl folder, with the phone already in EDL (9008). <code>edl r</code> accepts comma-separated lists of partitions and matching file names in one call, so first write a small function that joins the lists:</p>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">cd edl                                   # the bkerler/edl folder</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">PY=../venv/bin/python                    # the venv with edl's dependencies installed</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">LOADER=Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">OUT=~/LG-V35-backup/dumps                # where the backup is stored</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># Read several partitions on the same LUN (only one edl call); files that already exist are skipped</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun() {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  local lun=$1; shift</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  local names=() files=() p</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  mkdir -p "$OUT/lun$lun"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  for p in "$@"; do</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    [ -s "$OUT/lun$lun/$p.bin" ] &amp;&amp; continue</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    names+=("$p"); files+=("$OUT/lun$lun/$p.bin")</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  done</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  [ ${#names[@]} -eq 0 ] &amp;&amp; return 0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  (IFS=,; "$PY" edl.py r "${names[*]}" "${files[*]}" --memory=ufs --lun="$lun" --loader="$LOADER")</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">}</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 1. Unique to this phone: IMEI/network settings</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 5 modemst1 modemst2 fsg fsc</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 2. Unique to this phone: calibration, factory, unlock state (els can't be read, so it's not listed)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 0 mpt drm sns ssd persist misc ftm power encrypt eksst rct fota srtc pstore carrier persdata</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 3 cdt ddr</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 6 frp</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 4 devinfo sec apdp msadp spunvm limits toolsfv dip logfs sti</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 3. Boot chain (both a/b slots)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 1 xbl_a xbl_config_a</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 2 xbl_b xbl_config_b</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 4 abl_a abl_b laf_a laf_b boot_a boot_b vbmeta_a vbmeta_b dtbo_a dtbo_b</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 4. Firmware (both a/b slots)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 4 tz_a aop_a hyp_a keymaster_a cmnlib_a cmnlib64_a devcfg_a qupfw_a storsec_a \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">           sid_a akmu_a raw_resources_a mdtpsecapp_a mdtp_a dsp_a</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 4 tz_b aop_b hyp_b keymaster_b cmnlib_b cmnlib64_b devcfg_b qupfw_b storsec_b \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">           sid_b akmu_b raw_resources_b mdtpsecapp_b mdtp_b dsp_b</span><br></div></code></pre></div></div>
<p>A few things to watch for:</p>
<ul>
<li class="">Within one EDL session, the fewer edl calls the better. In my testing, Pipe error showed up again on the 5th call. If it gets interrupted, enter EDL again and run the same commands; anything already read is skipped automatically</li>
<li class="">A file that was interrupted halfway will have the wrong size; delete it before rerunning (or compare sizes as in the next section)</li>
<li class=""><code>els</code> (LUN0, 16 MB) failed at 3–4 MB both times, so I treated it as unreadable and skipped it. I kept the partial file separately and left it out of the hash list</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="verifying-the-backup">Verifying the backup<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#verifying-the-backup" class="hash-link" aria-label="Direct link to Verifying the backup" title="Direct link to Verifying the backup" translate="no">​</a></h3>
<p>Using the <code>printgpt</code> output as the reference, check whether each partition was backed up, whether its size is right, and whether its contents are completely empty:</p>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain"># First save the partition table to a file (run once while the phone is in EDL)</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">cd edl</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">../venv/bin/python edl.py printgpt --memory=ufs \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  --loader=Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin &gt; ~/LG-V35-backup/printgpt.log</span><br></div></code></pre></div></div>
<div class="language-python codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-python codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">#!/usr/bin/env python3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># verify_backup.py &lt;printgpt.log&gt; &lt;dumps folder&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sys</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">log</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dumps </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> sys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> parts </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> line </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">open</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">log</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    m </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token keyword" style="color:rgb(86, 156, 214)">match</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">r'Parsing Lun (\d+)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> line</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        lun </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    m </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token keyword" style="color:rgb(86, 156, 214)">match</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">r'(\S+):\s+Offset 0x[0-9a-f]+, Length 0x([0-9a-f]+)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> line</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> m </span><span class="token keyword" style="color:rgb(86, 156, 214)">and</span><span class="token plain"> lun </span><span class="token keyword" style="color:rgb(86, 156, 214)">is</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        parts</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">16</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">missing</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> wrong_size</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> empty </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> length </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> parts</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'userdata'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    path </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">dumps</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">.bin'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">exists</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        missing</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    size </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">getsize</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> size </span><span class="token operator" style="color:rgb(212, 212, 212)">!=</span><span class="token plain"> length</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        wrong_size</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> (</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">size</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> != </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">length</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    data </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">open</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'rb'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">read</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">any</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">i</span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token number" style="color:rgb(181, 206, 168)">4096</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">b'\x00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">and</span><span class="token plain"> data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">i</span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token number" style="color:rgb(181, 206, 168)">4096</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">b'\xff'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">               </span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> i </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">range</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">len</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4096</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        empty</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'missing:'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> missing</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'wrong size:'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> wrong_size</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'all zero/FF:'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> empty</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">python3 verify_backup.py ~/LG-V35-backup/printgpt.log ~/LG-V35-backup/dumps</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># Finally, generate a hash list; later you can use shasum -c to check whether the backup got corrupted</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">cd ~/LG-V35-backup/dumps &amp;&amp; find . -name '*.bin' -print0 | sort -z | xargs -0 shasum -a 256 &gt; ../SHA256SUMS.txt</span><br></div></code></pre></div></div>
<ul>
<li class="">"wrong size" usually means the read was interrupted halfway; delete that file and read it again</li>
<li class="">"all zero/FF" isn't necessarily an error, since some partitions really are empty, but go back and check the read log for errors</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="backup-results">Backup results<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#backup-results" class="hash-link" aria-label="Direct link to Backup results" title="Direct link to Backup results" translate="no">​</a></h3>
<p>77 partitions plus 2 partition table files (gpt_main0, gpt_backup0), about 1 GB. The SHA-256 list covers these 79 files (the partial els isn't included), and it's stored on the Mac together with the full partition table and the rawprogram xml:</p>
<table><thead><tr><th>Category</th><th>Partitions</th><th>Status</th></tr></thead><tbody><tr><td>IMEI/network settings (4)</td><td>modemst1, modemst2, fsg, fsc</td><td>✅ (fsc was empty to begin with)</td></tr><tr><td>Calibration/factory (15)</td><td>persist, ftm, mpt, cdt, ddr, carrier, persdata, power, drm, sns, ssd, rct, srtc, fota, pstore</td><td>✅</td></tr><tr><td>Unlock state (2)</td><td>devinfo, sec</td><td>✅</td></tr><tr><td>Boot chain (a/b slots, 14)</td><td>xbl, xbl_config, abl, laf, boot, vbmeta, dtbo</td><td>✅</td></tr><tr><td>Firmware (a/b slots, 30)</td><td>tz, aop, hyp, keymaster, cmnlib, cmnlib64, devcfg, qupfw, storsec, sid, akmu, raw_resources, mdtp, mdtpsecapp, dsp</td><td>✅</td></tr><tr><td>Other small partitions (12)</td><td>frp, apdp, msadp, spunvm, limits, toolsfv, dip, logfs, sti, misc, encrypt, eksst</td><td>✅</td></tr></tbody></table>
<p>12 are completely empty (all 0 or all FF): misc, eksst, cdt, fsc, mdtpsecapp_a, mdtpsecapp_b, mdtp_a, mdtp_b, dip, spunvm, toolsfv, sti. Their sizes are right and the reads had no errors, so I concluded they were empty to begin with.</p>
<p>Not backed up:</p>
<ul>
<li class="">The a/b slots of system, vendor, OP, oem and modem, about 12 GB in total; all of them are in the Pie 20f KDZ on my NAS</li>
<li class="">logdump (system logs), grow, ALIGN_TO_128K_* (empty partitions used for alignment)</li>
<li class="">els, which can't be read</li>
</ul>
<p>Every partition that's unique to this phone and can't be downloaded anywhere is now backed up.</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="writing-30e-to-slot-b">Writing 30e to slot b<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#writing-30e-to-slot-b" class="hash-link" aria-label="Direct link to Writing 30e to slot b" title="Direct link to Writing 30e to slot b" translate="no">​</a></h2>
<p>Preparation:</p>
<ul>
<li class="">From the 30e pack, extract only <code>partitions/</code>, leaving out <code>OP.bin</code> (bigger than the partition) and <code>persist.bin</code> (calibration data from the original author's phone)</li>
<li class="">Don't use <code>modified/</code>; only the stock images</li>
<li class="">The 26 images match the <code>_b</code> partitions listed in the GPT, and each image is exactly the same size as its partition</li>
<li class="">Sorted into folders by LUN: LUN4 (21 images), LUN2 (xbl_b, xbl_config_b), LUN0 (oem_b, system_b, vendor_b)</li>
</ul>
<p>Prepare the files by renaming the 30e images to their <code>_b</code> partition names and sorting them into folders by LUN:</p>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">ZIP=~/Downloads/V350AWM30e.zip</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">STAGE=~/LG-V35-work/30e_slot_b</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">mkdir -p "$STAGE" &amp;&amp; cd "$STAGE"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># Extract only the stock partitions, leaving out OP and persist</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">unzip -q "$ZIP" 'V350AWM30e/partitions/*' \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  -x 'V350AWM30e/partitions/OP.bin' 'V350AWM30e/partitions/persist.bin'</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">P=V350AWM30e/partitions</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">mkdir -p lun0 lun2 lun4</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">for n in oem system vendor;      do mv "$P/$n.bin" "lun0/${n}_b.bin"; done</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">for n in xbl xbl_config;         do mv "$P/$n.bin" "lun2/${n}_b.bin"; done</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">for n in abl akmu aop boot cmnlib cmnlib64 devcfg dsp dtbo hyp keymaster laf \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">         mdtp mdtpsecapp modem qupfw raw_resources sid storsec tz vbmeta; do</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  mv "$P/$n.bin" "lun4/${n}_b.bin"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">done</span><br></div></code></pre></div></div>
<p>Always run a self-check before writing: compare every image against the partition table of <strong>your own phone</strong>. If any one of them doesn't match, don't write; it means your phone is different from the setup in this post.</p>
<div class="language-python codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-python codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">#!/usr/bin/env python3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># precheck_30e.py &lt;printgpt.log&gt; &lt;staging folder&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Before writing: every staged image must map to an existing partition on THIS phone,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># sit on the expected LUN, and be EXACTLY the partition's size. Any mismatch -&gt; do not write.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sys</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">log</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> stage </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> sys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">NEVER </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string" style="color:rgb(206, 145, 120)">'persist'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'ftm'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'mpt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'misc'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'persdata'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'modemst1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'modemst2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'fsg'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'fsc'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">         </span><span class="token string" style="color:rgb(206, 145, 120)">'devinfo'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'frp'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'OP_a'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'OP_b'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> gpt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> line </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">open</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">log</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    m </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token keyword" style="color:rgb(86, 156, 214)">match</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">r'Parsing Lun (\d+)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> line</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        lun </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    m </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token keyword" style="color:rgb(86, 156, 214)">match</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">r'(\S+):\s+Offset 0x[0-9a-f]+, Length 0x([0-9a-f]+)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> line</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> m </span><span class="token keyword" style="color:rgb(86, 156, 214)">and</span><span class="token plain"> lun </span><span class="token keyword" style="color:rgb(86, 156, 214)">is</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gpt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">16</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> count </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> d </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">sorted</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">listdir</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">stage</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    m </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">fullmatch</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">r'lun(\d+)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    folder_lun </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> f </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">sorted</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">listdir</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">stage</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> f</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">endswith</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'.bin'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        count </span><span class="token operator" style="color:rgb(212, 212, 212)">+=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        name </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> f</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        size </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">getsize</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">stage</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> name </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> NEVER</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">d</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> must never be written'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">elif</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">endswith</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'_b'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">d</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">: not a slot-b partition'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">elif</span><span class="token plain"> name </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">d</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">: partition </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> does not exist on this phone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">elif</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">!=</span><span class="token plain"> folder_lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">d</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> is on lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">gpt</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string-interpolation interpolation number" style="color:rgb(181, 206, 168)">0</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">, not lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">folder_lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">elif</span><span class="token plain"> size </span><span class="token operator" style="color:rgb(212, 212, 212)">!=</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">d</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">: image </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">size</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> bytes != partition </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">gpt</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string-interpolation interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> bytes'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'checked </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">count</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> images'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'DO NOT WRITE:'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> p </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'  '</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    sys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">exit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'OK: every image matches a slot-b partition of exactly the same size'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">python3 precheck_30e.py ~/LG-V35-backup/printgpt.log ~/LG-V35-work/30e_slot_b</span><br></div></code></pre></div></div>
<p>The result on my phone:</p>
<div class="language-text codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-text codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">checked 26 images</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">OK: every image matches a slot-b partition of exactly the same size</span><br></div></code></pre></div></div>
<p>I also tested it with deliberately wrong input: including persist, a wrong LUN, and a size mismatch. Each one gets listed as a problem and the script returns exit code 1.</p>
<p>Writing also uses one edl call per LUN, all done within a single EDL session. This part is also the cleaned-up version (🧪):</p>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">cd edl</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">PY=../venv/bin/python</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">LOADER=Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">STAGE=~/LG-V35-work/30e_slot_b</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># Write every &lt;partition name&gt;.bin in one LUN folder in a single call</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">write_lun() {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  local lun=$1 names=() files=() f</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  for f in "$STAGE/lun$lun"/*.bin; do</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    names+=("$(basename "$f" .bin)"); files+=("$f")</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  done</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  (IFS=,; "$PY" edl.py w "${names[*]}" "${files[*]}" --memory=ufs --lun="$lun" --loader="$LOADER")</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">}</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">python3 ../precheck_30e.py ~/LG-V35-backup/printgpt.log "$STAGE" &amp;&amp; \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  write_lun 4 &amp;&amp; write_lun 2 &amp;&amp; write_lun 0 &amp;&amp; \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  "$PY" edl.py setactiveslot b --loader="$LOADER"</span><br></div></code></pre></div></div>
<ul>
<li class="">If the self-check fails, nothing gets written at all</li>
<li class="">Everything is chained with <code>&amp;&amp;</code>, so any failed step stops the rest, and the slot never gets switched after an incomplete write</li>
<li class="">Before writing, edl checks whether the image is bigger than the partition, and won't write it if it is</li>
</ul>
<table><thead><tr><th>Step</th><th>Time taken</th><th>Result</th></tr></thead><tbody><tr><td>The 21 partitions on LUN4</td><td>22 seconds</td><td>✅</td></tr><tr><td>LUN2</td><td>1 second</td><td>✅</td></tr><tr><td>LUN0 (including the 4.4 GB system_b)</td><td>3 min 7 s, about 30 MB/s</td><td>✅</td></tr><tr><td>setactiveslot b</td><td>13 seconds</td><td>✅</td></tr></tbody></table>
<p>After writing I checked the log: every write's start sector equals the start of the <code>_b</code> partition in the GPT (for example abl_b 155126, system_b 1754886, xbl_b 6), and nothing was written to slot a. Getting into EDL this time also took many tries.</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="first-boot-into-android-10">First boot into Android 10<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#first-boot-into-android-10" class="hash-link" aria-label="Direct link to First boot into Android 10" title="Direct link to First boot into Android 10" translate="no">​</a></h2>
<p>Long-press power + volume down to reboot, without pressing volume up this time. The LG logo stayed on screen for about 3 minutes (the first boot was upgrading the data left over from Pie), and adb came online at 15:03:49. I didn't wipe data; Pie's userdata was upgraded in place without problems.</p>
<table><thead><tr><th>Check</th><th>Result</th></tr></thead><tbody><tr><td>Android version/slot</td><td>10/_b</td></tr><tr><td>Software version</td><td>V350AWM30e</td></tr><tr><td>Factory string</td><td>LMV350AT-00-V30e-LAO-COM-JUL-28-2020-<strong>ARB00</strong>+0</td></tr><tr><td>Anti-rollback (ARB)</td><td>00, same as Pie 20f, so going back to Pie later is possible</td></tr><tr><td>Security patch</td><td>2020-04-01</td></tr><tr><td>Bootloader</td><td>Still unlocked (orange, flash.locked=0)</td></tr><tr><td>Baseband</td><td>MPSS.AT.4.0.c2.9-00088-SDM845_GEN_PACK</td></tr><tr><td>Wi-Fi</td><td>Connected, VALIDATED, ping works</td></tr><tr><td>IMEI</td><td>Readable, 15 digits</td></tr><tr><td>Hi-Fi Quad DAC</td><td>persist.lge.hifiquaddac=true, hifi_dac=ON</td></tr></tbody></table>
<p>I couldn't find 30e's ARB value anywhere online; this time I read it straight from the phone: <strong>ARB00</strong>.</p>
<div class="row_hQZc"><p><span class="figure_csq_"><img decoding="async" loading="lazy" alt="Home screen after upgrading to Android 10 (30e), taken at 16:26" src="https://ttylab80387.com/en/assets/images/android10-home-e3e145e866593bb7a17f07e1513ac402.jpg" width="1080" height="1440" class="img_QA5C"><span class="caption_yuVx" aria-hidden="true">Home screen after upgrading to Android 10 (30e), taken at 16:26</span></span></p><p><span class="figure_csq_"><img decoding="async" loading="lazy" alt="關於手機 (About phone): Android version 10, software version V30e-310-410, model LM-V350AWM (S/N and IMEI blanked out)" src="https://ttylab80387.com/en/assets/images/android10-about-f2417ad88b0c7749637bd98383cd5bd1.jpg" width="1080" height="1440" class="img_QA5C"><span class="caption_yuVx" aria-hidden="true">關於手機 (About phone): Android version 10, software version V30e-310-410, model LM-V350AWM (S/N and IMEI blanked out)</span></span></p></div>
<p>After moving to Android 10, scrolling through the UI feels smoother than it did on Android 9.</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="plans-for-part-2">Plans for part 2<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#plans-for-part-2" class="hash-link" aria-label="Direct link to Plans for part 2" title="Direct link to Plans for part 2" translate="no">​</a></h2>
<ul>
<li class="">Remove the Google account from the phone, so Factory Reset Protection doesn't get triggered</li>
<li class="">Use EDL to write Lineage Recovery (the official boot.img) to boot_a and boot_b; no root needed</li>
<li class="">In Lineage Recovery, sideload copy-partitions to copy slot b to slot a (this overwrites the Pie on slot a)</li>
<li class="">Format data, sideload LineageOS 22.2, then sideload MindTheGapps</li>
<li class="">Check the DAC panel, Wi-Fi, and whether the apps I want to test can be installed</li>
<li class="">Next time I'm in EDL, actually run the cleaned-up <code>read_lun</code> once (for example, re-read a small partition and compare its SHA-256), then change 🧪 to ✅</li>
</ul>
<p>Neither of the two things that took the most time this round was the writing itself: one was that you can't let go of the buttons at any point while getting into EDL, and the other was that edl reconnects on every call, so things only got stable once I read each LUN's partitions in one call.</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="references">References<a href="https://ttylab80387.com/en/research/lg-v35-lineageos-1/#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">​</a></h2>
<p>Official:</p>
<ul>
<li class=""><a href="https://wiki.lineageos.org/devices/judyp/" target="_blank" rel="noopener noreferrer" class="">LineageOS Wiki: LG V35 ThinQ (judyp)</a></li>
<li class=""><a href="https://wiki.lineageos.org/devices/judyp/install/" target="_blank" rel="noopener noreferrer" class="">LineageOS install guide</a> (Android 10 firmware requirement, root, copy-partitions)</li>
<li class=""><a href="https://download.lineageos.org/devices/judyp" target="_blank" rel="noopener noreferrer" class="">LineageOS downloads (judyp)</a></li>
<li class=""><a href="https://wiki.lineageos.org/gapps/" target="_blank" rel="noopener noreferrer" class="">LineageOS GApps page</a></li>
<li class=""><a href="https://github.com/MindTheGapps/15.0.0-arm64/releases" target="_blank" rel="noopener noreferrer" class="">MindTheGapps 15.0.0 arm64</a></li>
<li class="">LineageOS device source (Quad DAC support): <a href="https://github.com/LineageOS/android_device_lge_judyp" target="_blank" rel="noopener noreferrer" class="">android_device_lge_judyp</a>, <a href="https://github.com/LineageOS/android_device_lge_sdm845-common" target="_blank" rel="noopener noreferrer" class="">android_device_lge_sdm845-common</a>, <a href="https://github.com/LineageOS/android_hardware_lge" target="_blank" rel="noopener noreferrer" class="">android_hardware_lge</a> (dac_panel)</li>
</ul>
<p>Tools:</p>
<ul>
<li class=""><a href="https://github.com/bkerler/edl" target="_blank" rel="noopener noreferrer" class="">bkerler/edl</a> (open-source Qualcomm EDL tool, GPL-3.0)</li>
<li class=""><a href="https://github.com/bkerler/Loaders/tree/main/LG" target="_blank" rel="noopener noreferrer" class="">bkerler/Loaders</a> (LG SDM845 firehose)</li>
<li class=""><a href="https://github.com/bkerler/edl/issues/752" target="_blank" rel="noopener noreferrer" class="">edl issue #752</a> (reconnecting triggers USB Overflow)</li>
<li class=""><a href="https://github.com/bkerler/edl/issues/103" target="_blank" rel="noopener noreferrer" class="">edl issue #103</a> (USB Overflow on the LG G6)</li>
</ul>
<p>Guides and discussions:</p>
<ul>
<li class=""><a href="https://github.com/kaneorotar/LG-V35-Tinkering-Instructions/blob/master/README_EN.MD" target="_blank" rel="noopener noreferrer" class="">kaneorotar: LG V35 Tinkering Instructions</a> (EDL, unlocking, TWRP)</li>
<li class=""><a href="https://xdaforums.com/t/v350ulm-us-open-oreo-10i-ulm-pie-20f-awm30e-final-q-downloads.4791168/" target="_blank" rel="noopener noreferrer" class="">XDA: V350ULM Oreo 10i / ULM Pie 20f / AWM30e final Q download roundup</a></li>
<li class=""><a href="https://xdaforums.com/t/v350awm30e-att_us-stock-rooted-partitions.4322737/" target="_blank" rel="noopener noreferrer" class="">XDA: V350AWM30e ATT_US stock &amp; rooted partitions</a> (original source of the 30e partition pack)</li>
<li class=""><a href="https://xdaforums.com/t/v350awm30e-android-10-stuck-in-fastboot-no-recovery.4790905/" target="_blank" rel="noopener noreferrer" class="">XDA: V350AWM30e android 10 stuck in fastboot</a> (a case of going from 30e back to Pie 20f)</li>
<li class=""><a href="https://xdaforums.com/t/nightly-judyp-official-lineageos-for-the-lg-v35-thinq.4684490/" target="_blank" rel="noopener noreferrer" class="">XDA: Official LineageOS for the LG V35 ThinQ</a></li>
<li class=""><a href="https://www.link-nemo.com/u/10001/post/257028" target="_blank" rel="noopener noreferrer" class="">Nemo community: LG V35 bootloader unlock tutorial</a> (Chinese; EDL combo: hold power + volume down without letting go, tap volume up when the screen goes black)</li>
<li class=""><a href="https://www.link-nemo.com/u/10001/post/269932" target="_blank" rel="noopener noreferrer" class="">Nemo community: LG V35 9008 unbrick tutorial</a> (Chinese)</li>
<li class=""><a href="https://www.link-nemo.com/u/10001/post/260876" target="_blank" rel="noopener noreferrer" class="">Nemo community: Feiyu ROM 30a</a> (Chinese; looked into but not used)</li>
</ul>
<p>Firmware databases:</p>
<ul>
<li class=""><a href="https://lgrom.com/firmware/LMV350AWM" target="_blank" rel="noopener noreferrer" class="">LGROM: LM-V350AWM</a></li>
<li class=""><a href="https://www.lg-firmwares.com/lg-lmv350ulm-firmwares/" target="_blank" rel="noopener noreferrer" class="">LG-Firmwares: LM-V350ULM</a></li>
</ul>]]></content:encoded>
            <category>Android flashing</category>
            <category>LG phones</category>
            <category>LineageOS</category>
            <category>EDL (Qualcomm 9008)</category>
            <category>Backup</category>
            <category>macOS</category>
        </item>
    </channel>
</rss>