vee1e

vee1e / d561fcadc2627cc3dcb115d18847a236

Last active 4 days ago

Like 0

vee1e revised this gist 2 weeks ago · d1a094e

1 file changed, 6 insertions, 2 deletions

gsoc-2026-final-submission.md
@@ -76,7 +76,11 @@ FLOSS tags strings by matching them against databases of known library strings.
76 76 - [#1309](https://github.com/mandiant/flare-floss/pull/1309): moved the string databases to Git LFS, saving roughly 24 MB per shallow clone.
77 77 - The library list was settled at around 60 open-source libraries, chosen by auditing false-positive rates against a global prevalence database built from 150,000 real-world samples.
78 78
79 - Building the databases surfaced a bug in the upstream lancelot string extractor, which the pipeline depends on. Two common C++ libraries (cryptopp and jsoncpp) triggered a crash on weak external symbols. I filed [issue #235](https://github.com/williballenthin/lancelot/issues/235) with a full reproduction and shipped the fix in [PR #237](https://github.com/williballenthin/lancelot/pull/237), which Willi merged.
79 + Building the databases surfaced several bugs in the upstream lancelot project, which the pipeline depends on. I filed reproductions and shipped fixes for all of them:
80 +
81 + - **Weak external symbols crash.** Two common C++ libraries (cryptopp and jsoncpp) triggered a crash on weak external symbols. I filed [issue #235](https://github.com/williballenthin/lancelot/issues/235) with a full reproduction and shipped the fix in [PR #237](https://github.com/williballenthin/lancelot/pull/237), which Willi merged.
82 + - **Fragile CSV output.** The `jh` string extractor emitted hand-rolled CSV that broke on commas, quotes, newlines, and C++ mangled names. I filed [issue #238](https://github.com/williballenthin/lancelot/issues/238) and replaced it with a proper JSONL output in [PR #239](https://github.com/williballenthin/lancelot/pull/239), which Willi merged.
83 + - **Deprecated zydis build config.** A stale zydis dependency broke newer CMake versions, which the flare-floss review of my database build surfaced. I filed [issue #240](https://github.com/williballenthin/lancelot/issues/240) and Willi fixed it in [PR #241](https://github.com/williballenthin/lancelot/pull/241).
80 84
81 85 The database builder lives in `scripts/build_oss_db.py` and the automated update workflow in `.github/workflows/build-oss-db.yml`.
82 86
@@ -156,7 +160,7 @@ None of these block the core functionality. The new pipeline, CLI, and cache are
156 160
157 161 The largest single risk was the big refactor in [#1337](https://github.com/mandiant/flare-floss/pull/1337). Moving 4,000 lines around risks quietly changing behavior. We addressed it with evidence instead of argument: a parity harness ran old and new code over a thousand random samples, and every output matched. That became the review bar for the rest of the project.
158 162
159 - The automated database pipeline surfaced a real bug in the upstream lancelot string extractor. Two common C++ libraries (cryptopp and jsoncpp) triggered a crash on weak external symbols. I filed a reproduction ([issue #235](https://github.com/williballenthin/lancelot/issues/235)) and shipped the fix upstream ([PR #237](https://github.com/williballenthin/lancelot/pull/237)), which is exactly the kind of problem a maintainer wants contributors to solve at the root.
163 + The automated database pipeline surfaced real bugs in the upstream lancelot string extractor, and fixing them became a theme of the project. A crash on weak external C++ symbols ([issue #235](https://github.com/williballenthin/lancelot/issues/235), fixed in [PR #237](https://github.com/williballenthin/lancelot/pull/237)), fragile CSV output that broke on special characters ([issue #238](https://github.com/williballenthin/lancelot/issues/238), fixed with JSONL output in [PR #239](https://github.com/williballenthin/lancelot/pull/239)), and a deprecated zydis build config ([issue #240](https://github.com/williballenthin/lancelot/issues/240), fixed by Willi in [PR #241](https://github.com/williballenthin/lancelot/pull/241)). This is exactly the kind of problem a maintainer wants contributors to solve at the root.
160 164
161 165 The planning document was the other hard part. A discussion doc and an implementation spec are different things, and it took a while to realize we needed the latter. Rewriting it as a spec that could be handed to coding agents unblocked the final months of the project. It also became the design reference for the new CLI and the caching module.
162 166

vee1e revised this gist 2 weeks ago · b17a8ca

1 file changed, 43 insertions, 43 deletions

gsoc-2026-final-submission.md

Diff is too large to be shown

vee1e revised this gist 2 weeks ago · aa13e99

1 file changed, 1 insertion, 1 deletion

gsoc-2026-final-submission.md
@@ -9,7 +9,7 @@
9 9
10 10 </div>
11 11
12 - **Organization:** FLARE (Mandiant, a Google Cloud company)
12 + **Organization:** FLARE / Mandiant
13 13
14 14 **Contributor:** Lakshit Verma ([@vee1e](https://github.com/vee1e))
15 15

vee1e revised this gist 2 weeks ago · bb6c642

1 file changed, 44 insertions, 44 deletions

gsoc-2026-final-submission.md

Diff is too large to be shown

vee1e revised this gist 2 weeks ago · 3f5ee75

1 file changed, 18 insertions, 9 deletions

gsoc-2026-final-submission.md
@@ -31,7 +31,7 @@ This submission is split into two parts. The pre-GSoC work below landed before t
31 31
32 32 The work is essentially complete. QS was refactored into first-class FLOSS modules, the unified pipeline is the default output path, the new command line is merged, caching ships with the tool, and the web viewer is merged. The final step is the merge of the QuantumStrand branch into master, which is open as [PR #1372](https://github.com/mandiant/flare-floss/pull/1372) at the time of writing.
33 33
34 - ## Pre-GSoC work (before the June coding period)
34 + ## Pre-GSoC work
35 35
36 36 These PRs landed between March and May, before the coding period. They fixed QS bugs, added format parsing, and covered community bonding tasks like CI hygiene.
37 37
@@ -58,7 +58,7 @@ These PRs landed between March and May, before the coding period. They fixed QS
58 58 - [PR #1304](https://github.com/mandiant/flare-floss/pull/1304): fixed a stale pinned SHA in the build workflow.
59 59 - [PR #1301](https://github.com/mandiant/flare-floss/pull/1301) (closed): a first, over-detailed AGENTS.md draft that we later rewrote into the slim version below.
60 60
61 - ## Coding-period deliverables (June onward)
61 + ## Coding-period deliverables
62 62
63 63 ### 1. Native ELF parsing
64 64
@@ -76,6 +76,8 @@ FLOSS tags strings by matching them against databases of known library strings.
76 76 - [PR #1309](https://github.com/mandiant/flare-floss/pull/1309): moved the string databases to Git LFS, saving roughly 24 MB per shallow clone.
77 77 - The library list was settled at around 60 open-source libraries, chosen by auditing false-positive rates against a global prevalence database built from 150,000 real-world samples.
78 78
79 + Building the databases surfaced a bug in the upstream lancelot string extractor, which the pipeline depends on. Two common C++ libraries (cryptopp and jsoncpp) triggered a crash on weak external symbols. I filed [issue #235](https://github.com/williballenthin/lancelot/issues/235) with a full reproduction and shipped the fix in [PR #237](https://github.com/williballenthin/lancelot/pull/237), which Willi merged.
80 +
79 81 The database builder lives in `scripts/build_oss_db.py` and the automated update workflow in `.github/workflows/build-oss-db.yml`.
80 82
81 83 ### 3. The QS to FLOSS integration
@@ -114,16 +116,23 @@ The viewer lives in the `viewer/` directory and is served from a Vercel deployme
114 116 - [PR #1308](https://github.com/mandiant/flare-floss/pull/1308): the slimmed-down AGENTS.md so AI coding tools have the context they need before generating code in this repo.
115 117 - [PR #1370](https://github.com/mandiant/flare-floss/pull/1370): deprecated all `qs` / QuantumStrand naming, renamed the viewer, retargeted CI to master, and cleaned up stale branches, preparing the branch for the final merge.
116 118
117 - ## Pull request index
119 + ## Timeline of feature work
120 +
121 + The coding period ran from June through August. This is how the work above landed, in order.
118 122
119 - | Period | PRs |
120 - |---|---|
121 - | Pre-GSoC (before June) | [#1217](https://github.com/mandiant/flare-floss/pull/1217), [#1221](https://github.com/mandiant/flare-floss/pull/1221), [#1224](https://github.com/mandiant/flare-floss/pull/1224), [#1225](https://github.com/mandiant/flare-floss/pull/1225), [#1229](https://github.com/mandiant/flare-floss/pull/1229), [#1230](https://github.com/mandiant/flare-floss/pull/1230), [#1231](https://github.com/mandiant/flare-floss/pull/1231), [#1233](https://github.com/mandiant/flare-floss/pull/1233), [#1242](https://github.com/mandiant/flare-floss/pull/1242), [#1243](https://github.com/mandiant/flare-floss/pull/1243), [#1244](https://github.com/mandiant/flare-floss/pull/1244), [#1259](https://github.com/mandiant/flare-floss/pull/1259), [#1301](https://github.com/mandiant/flare-floss/pull/1301), [#1303](https://github.com/mandiant/flare-floss/pull/1303), [#1304](https://github.com/mandiant/flare-floss/pull/1304) |
122 - | Coding period (June onward) | [#1308](https://github.com/mandiant/flare-floss/pull/1308), [#1309](https://github.com/mandiant/flare-floss/pull/1309), [#1312](https://github.com/mandiant/flare-floss/pull/1312), [#1327](https://github.com/mandiant/flare-floss/pull/1327), [#1332](https://github.com/mandiant/flare-floss/pull/1332), [#1334](https://github.com/mandiant/flare-floss/pull/1334), [#1337](https://github.com/mandiant/flare-floss/pull/1337), [#1347](https://github.com/mandiant/flare-floss/pull/1347), [#1355](https://github.com/mandiant/flare-floss/pull/1355), [#1358](https://github.com/mandiant/flare-floss/pull/1358), [#1360](https://github.com/mandiant/flare-floss/pull/1360), [#1367](https://github.com/mandiant/flare-floss/pull/1367), [#1370](https://github.com/mandiant/flare-floss/pull/1370), [#1372](https://github.com/mandiant/flare-floss/pull/1372) (open) |
123 + **June**
124 + - Early June: AGENTS.md for AI contributors ([PR #1308](https://github.com/mandiant/flare-floss/pull/1308)) and the move of the string databases to Git LFS ([PR #1309](https://github.com/mandiant/flare-floss/pull/1309)).
125 + - Mid-June: native ELF parsing ([PR #1312](https://github.com/mandiant/flare-floss/pull/1312)) completed the format coverage started before the coding period.
123 126
124 - The coding-period PRs map to deliverables as: format parsing ([#1312](https://github.com/mandiant/flare-floss/pull/1312)), string databases ([#1327](https://github.com/mandiant/flare-floss/pull/1327), [#1334](https://github.com/mandiant/flare-floss/pull/1334), [#1332](https://github.com/mandiant/flare-floss/pull/1332), [#1309](https://github.com/mandiant/flare-floss/pull/1309)), integration ([#1337](https://github.com/mandiant/flare-floss/pull/1337), [#1347](https://github.com/mandiant/flare-floss/pull/1347)), command line ([#1355](https://github.com/mandiant/flare-floss/pull/1355), [#1360](https://github.com/mandiant/flare-floss/pull/1360), [#1367](https://github.com/mandiant/flare-floss/pull/1367)), web viewer ([#1358](https://github.com/mandiant/flare-floss/pull/1358)), CI and hygiene ([#1308](https://github.com/mandiant/flare-floss/pull/1308), [#1370](https://github.com/mandiant/flare-floss/pull/1370)), and the merge to master ([#1372](https://github.com/mandiant/flare-floss/pull/1372)).
127 + **July**
128 + - Early July: the automated string database pipeline landed ([PR #1327](https://github.com/mandiant/flare-floss/pull/1327)), followed by dependency fixes ([PR #1332](https://github.com/mandiant/flare-floss/pull/1332)) and database-change diffs in the auto-generated PRs ([PR #1334](https://github.com/mandiant/flare-floss/pull/1334)).
129 + - Late July: the first big integration step, splitting QS into first-class `floss/layout` and `floss/tags` modules ([PR #1337](https://github.com/mandiant/flare-floss/pull/1337)).
125 130
126 - I also contributed to the upstream lancelot project, which the string extractor depends on: [issue #235](https://github.com/williballenthin/lancelot/issues/235) and [PR #237](https://github.com/williballenthin/lancelot/pull/237) fixed a crash on weak external C++ symbols during database builds.
131 + **August**
132 + - Early August: the unified pipeline became the default output path ([PR #1347](https://github.com/mandiant/flare-floss/pull/1347)).
133 + - Mid-August: the new command line landed in two parts, the string type flags and runtime timing ([PR #1355](https://github.com/mandiant/flare-floss/pull/1355)) then the render-time filters and summary output ([PR #1360](https://github.com/mandiant/flare-floss/pull/1360)). The web viewer was reworked to match the new results schema ([PR #1358](https://github.com/mandiant/flare-floss/pull/1358)).
134 + - Late August: result caching ([PR #1367](https://github.com/mandiant/flare-floss/pull/1367)) and the cleanup that deprecated the old `qs` naming ([PR #1370](https://github.com/mandiant/flare-floss/pull/1370)).
135 + - The final merge of QuantumStrand into master ([PR #1372](https://github.com/mandiant/flare-floss/pull/1372)) is open at the time of writing.
127 136
128 137 ## Reviews I contributed
129 138

vee1e revised this gist 2 weeks ago · 9eb12f2

1 file changed, 5 insertions, 6 deletions

gsoc-2026-final-submission.md
@@ -11,9 +11,9 @@
11 11
12 12 **Organization:** FLARE (Mandiant, a Google Cloud company)
13 13
14 - **Contributor:** Lakshit Verma (GitHub: [@vee1e](https://github.com/vee1e))
14 + **Contributor:** Lakshit Verma ([@vee1e](https://github.com/vee1e))
15 15
16 - **Mentor:** [Moritz Raabe](https://github.com/mr-tz)
16 + **Mentor:** Moritz Raabe ([@mr-tz](https://github.com/mr-tz))
17 17
18 18 **Repository:** [mandiant/flare-floss](https://github.com/mandiant/flare-floss)
19 19
@@ -31,8 +31,6 @@ This submission is split into two parts. The pre-GSoC work below landed before t
31 31
32 32 The work is essentially complete. QS was refactored into first-class FLOSS modules, the unified pipeline is the default output path, the new command line is merged, caching ships with the tool, and the web viewer is merged. The final step is the merge of the QuantumStrand branch into master, which is open as [PR #1372](https://github.com/mandiant/flare-floss/pull/1372) at the time of writing.
33 33
34 - A thousand-sample parity test proved the big refactor did not change behavior: 905 of 905 layout outputs matched upstream QS exactly, and 918 of 918 classic-mode outputs matched master exactly.
35 -
36 34 ## Pre-GSoC work (before the June coding period)
37 35
38 36 These PRs landed between March and May, before the coding period. They fixed QS bugs, added format parsing, and covered community bonding tasks like CI hygiene.
@@ -56,7 +54,6 @@ These PRs landed between March and May, before the coding period. They fixed QS
56 54 ### Exploratory and community bonding
57 55
58 56 - [PR #1224](https://github.com/mandiant/flare-floss/pull/1224) (closed): prototyped heuristics for junk strings in Rust binaries; we agreed a regex band-aid was not the right fix.
59 - - [PR #1226](https://github.com/mandiant/flare-floss/pull/1226) (closed): refactored Go and Rust CLI parsers to cut repetition; closed when another contributor took over the issue.
60 57 - [PR #1303](https://github.com/mandiant/flare-floss/pull/1303): a pinact workflow that verifies GitHub Actions are pinned to commit hashes, reducing supply chain risk.
61 58 - [PR #1304](https://github.com/mandiant/flare-floss/pull/1304): fixed a stale pinned SHA in the build workflow.
62 59 - [PR #1301](https://github.com/mandiant/flare-floss/pull/1301) (closed): a first, over-detailed AGENTS.md draft that we later rewrote into the slim version below.
@@ -88,6 +85,8 @@ This is the core of the project: turning QS's separate package into the default
88 85 - [PR #1337](https://github.com/mandiant/flare-floss/pull/1337): split the monolithic QS module into first-class `floss/layout` and `floss/tags` packages and unified the command line. Roughly 4,000 lines moved and rewritten with no behavior change.
89 86 - [PR #1347](https://github.com/mandiant/flare-floss/pull/1347): made the unified pipeline the default. Every string type flows through the same stages into one `ResultDocument`, and every output mode renders from that document.
90 87
88 + A thousand-sample parity test proved the refactor did not change behavior: 905 of 905 layout outputs matched upstream QS exactly, and 918 of 918 classic-mode outputs matched master exactly.
89 +
91 90 The pipeline is coordinated in `floss/pipeline.py`. The layout tree, tag engine, and renderers live in `floss/layout`, `floss/tags`, and `floss/render`. The results schema lives in `floss/results.py`.
92 91
93 92 ### 4. The redesigned command line
@@ -119,7 +118,7 @@ The viewer lives in the `viewer/` directory and is served from a Vercel deployme
119 118
120 119 | Period | PRs |
121 120 |---|---|
122 - | Pre-GSoC (before June) | [#1217](https://github.com/mandiant/flare-floss/pull/1217), [#1221](https://github.com/mandiant/flare-floss/pull/1221), [#1224](https://github.com/mandiant/flare-floss/pull/1224), [#1225](https://github.com/mandiant/flare-floss/pull/1225), [#1226](https://github.com/mandiant/flare-floss/pull/1226), [#1229](https://github.com/mandiant/flare-floss/pull/1229), [#1230](https://github.com/mandiant/flare-floss/pull/1230), [#1231](https://github.com/mandiant/flare-floss/pull/1231), [#1233](https://github.com/mandiant/flare-floss/pull/1233), [#1242](https://github.com/mandiant/flare-floss/pull/1242), [#1243](https://github.com/mandiant/flare-floss/pull/1243), [#1244](https://github.com/mandiant/flare-floss/pull/1244), [#1259](https://github.com/mandiant/flare-floss/pull/1259), [#1301](https://github.com/mandiant/flare-floss/pull/1301), [#1303](https://github.com/mandiant/flare-floss/pull/1303), [#1304](https://github.com/mandiant/flare-floss/pull/1304) |
121 + | Pre-GSoC (before June) | [#1217](https://github.com/mandiant/flare-floss/pull/1217), [#1221](https://github.com/mandiant/flare-floss/pull/1221), [#1224](https://github.com/mandiant/flare-floss/pull/1224), [#1225](https://github.com/mandiant/flare-floss/pull/1225), [#1229](https://github.com/mandiant/flare-floss/pull/1229), [#1230](https://github.com/mandiant/flare-floss/pull/1230), [#1231](https://github.com/mandiant/flare-floss/pull/1231), [#1233](https://github.com/mandiant/flare-floss/pull/1233), [#1242](https://github.com/mandiant/flare-floss/pull/1242), [#1243](https://github.com/mandiant/flare-floss/pull/1243), [#1244](https://github.com/mandiant/flare-floss/pull/1244), [#1259](https://github.com/mandiant/flare-floss/pull/1259), [#1301](https://github.com/mandiant/flare-floss/pull/1301), [#1303](https://github.com/mandiant/flare-floss/pull/1303), [#1304](https://github.com/mandiant/flare-floss/pull/1304) |
123 122 | Coding period (June onward) | [#1308](https://github.com/mandiant/flare-floss/pull/1308), [#1309](https://github.com/mandiant/flare-floss/pull/1309), [#1312](https://github.com/mandiant/flare-floss/pull/1312), [#1327](https://github.com/mandiant/flare-floss/pull/1327), [#1332](https://github.com/mandiant/flare-floss/pull/1332), [#1334](https://github.com/mandiant/flare-floss/pull/1334), [#1337](https://github.com/mandiant/flare-floss/pull/1337), [#1347](https://github.com/mandiant/flare-floss/pull/1347), [#1355](https://github.com/mandiant/flare-floss/pull/1355), [#1358](https://github.com/mandiant/flare-floss/pull/1358), [#1360](https://github.com/mandiant/flare-floss/pull/1360), [#1367](https://github.com/mandiant/flare-floss/pull/1367), [#1370](https://github.com/mandiant/flare-floss/pull/1370), [#1372](https://github.com/mandiant/flare-floss/pull/1372) (open) |
124 123
125 124 The coding-period PRs map to deliverables as: format parsing ([#1312](https://github.com/mandiant/flare-floss/pull/1312)), string databases ([#1327](https://github.com/mandiant/flare-floss/pull/1327), [#1334](https://github.com/mandiant/flare-floss/pull/1334), [#1332](https://github.com/mandiant/flare-floss/pull/1332), [#1309](https://github.com/mandiant/flare-floss/pull/1309)), integration ([#1337](https://github.com/mandiant/flare-floss/pull/1337), [#1347](https://github.com/mandiant/flare-floss/pull/1347)), command line ([#1355](https://github.com/mandiant/flare-floss/pull/1355), [#1360](https://github.com/mandiant/flare-floss/pull/1360), [#1367](https://github.com/mandiant/flare-floss/pull/1367)), web viewer ([#1358](https://github.com/mandiant/flare-floss/pull/1358)), CI and hygiene ([#1308](https://github.com/mandiant/flare-floss/pull/1308), [#1370](https://github.com/mandiant/flare-floss/pull/1370)), and the merge to master ([#1372](https://github.com/mandiant/flare-floss/pull/1372)).

vee1e revised this gist 2 weeks ago · dcc84c6

1 file changed, 6 insertions, 8 deletions

gsoc-2026-final-submission.md
@@ -5,19 +5,17 @@
5 5
6 6 <div align="center">
7 7
8 - # Google Summer of Code 2026 @ FLARE
8 + # Extend FLOSS to use the rendering techniques pioneered by QUANTUMSTRAND
9 9
10 - ## Integrating QuantumStrand into FLOSS
11 -
12 - Organization: FLARE (Mandiant, a Google Cloud company)
10 + </div>
13 11
14 - Contributor: Lakshit Verma (GitHub: [@vee1e](https://github.com/vee1e))
12 + **Organization:** FLARE (Mandiant, a Google Cloud company)
15 13
16 - Mentor: [Moritz Raabe](https://github.com/mr-tz)
14 + **Contributor:** Lakshit Verma (GitHub: [@vee1e](https://github.com/vee1e))
17 15
18 - Repository: [mandiant/flare-floss](https://github.com/mandiant/flare-floss)
16 + **Mentor:** [Moritz Raabe](https://github.com/mr-tz)
19 17
20 - </div>
18 + **Repository:** [mandiant/flare-floss](https://github.com/mandiant/flare-floss)
21 19
22 20 ## Project overview
23 21

vee1e revised this gist 2 weeks ago · 7e463bf

1 file changed, 2 insertions, 2 deletions

gsoc-2026-final-submission.md
@@ -1,6 +1,6 @@
1 1 <p align="center">
2 - <img src="https://gist.githubusercontent.com/vee1e/d561fcadc2627cc3dcb115d18847a236/raw/gsoc-logo.png" width="120">
3 - <img src="https://gist.githubusercontent.com/vee1e/d561fcadc2627cc3dcb115d18847a236/raw/flare-logo.png" width="220">
2 + <img src="https://gist.githubusercontent.com/vee1e/d561fcadc2627cc3dcb115d18847a236/raw/gsoc-logo.png" width="120" style="vertical-align: middle;">
3 + <img src="https://gist.githubusercontent.com/vee1e/d561fcadc2627cc3dcb115d18847a236/raw/flare-logo.png" width="220" style="vertical-align: middle;">
4 4 </p>
5 5
6 6 <div align="center">

vee1e revised this gist 2 weeks ago · 4993a56

1 file changed, 1 insertion, 1 deletion

gsoc-2026-final-submission.md
@@ -1,6 +1,6 @@
1 1 <p align="center">
2 - <img src="https://gist.githubusercontent.com/vee1e/d561fcadc2627cc3dcb115d18847a236/raw/flare-logo.png" width="220">
3 2 <img src="https://gist.githubusercontent.com/vee1e/d561fcadc2627cc3dcb115d18847a236/raw/gsoc-logo.png" width="120">
3 + <img src="https://gist.githubusercontent.com/vee1e/d561fcadc2627cc3dcb115d18847a236/raw/flare-logo.png" width="220">
4 4 </p>
5 5
6 6 <div align="center">

vee1e revised this gist 2 weeks ago · 2eb6da2

1 file changed, 2 insertions, 2 deletions

gsoc-2026-final-submission.md
@@ -1,6 +1,6 @@
1 1 <p align="center">
2 - <img src="./flare-logo.png" width="220" alt="FLARE logo">
3 - <img src="./gsoc-logo.png" width="120" alt="Google Summer of Code logo">
2 + <img src="https://gist.githubusercontent.com/vee1e/d561fcadc2627cc3dcb115d18847a236/raw/flare-logo.png" width="220">
3 + <img src="https://gist.githubusercontent.com/vee1e/d561fcadc2627cc3dcb115d18847a236/raw/gsoc-logo.png" width="120">
4 4 </p>
5 5
6 6 <div align="center">