Initial commit: code, paper, small artifacts

This commit is contained in:
2026-05-07 20:47:30 +08:00
commit fae2db8cff
322 changed files with 33159 additions and 0 deletions

BIN
paper/figures/figure1.pdf Normal file

Binary file not shown.

View File

@@ -0,0 +1,16 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) (preloaded format=pdfetex 2026.1.31) 2 MAY 2026 16:36
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**&pdfetex figure1_overview_v2.tex
(./figure1_overview_v2.tex
! Undefined control sequence.
l.24 \documentclass
[border=6pt]{standalone}
?
! Emergency stop.
l.24 \documentclass
[border=6pt]{standalone}
End of file on the terminal!
! ==> Fatal error occurred, no output PDF file produced!

View File

@@ -0,0 +1,736 @@
% Figure 1 (v2): Mixed_CFM — system overview.
% Compile: pdflatex figure1_overview_v2.tex
%
% Layout:
% row 1: (a) Tokenization ──x_1──→ (b) Mixed-state path ★
% │
% x_t
% ▼
% row 2: (c) Causal-Packet Velocity Field + joint loss ★
% │
% frozen
% ▼
% row 3: (d) Inference: score → Mahalanobis-OAS router ★
%
% Coordinate hygiene:
% - Each panel is its own sub-tikzpicture with a fixed bounding box
% (\useasboundingbox 0..W x 0..H, in mm). Editing one panel cannot
% disturb another.
% - The OUTER tikzpicture only chains panels with `right=of` / `below=of`
% and draws three inter-panel data-flow arrows.
% - Numbers in the figure are architecture descriptors only (T, 21-d,
% 10-d, lambda). No experimental result values.
\documentclass[border=6pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning, calc}
\usepackage{amsmath, amssymb}
% --- palette -----------------------------------------------------------------
\definecolor{cOrange}{RGB}{230, 126, 34} % discrete (DFM)
\definecolor{cBlue} {RGB}{ 52, 110, 180} % continuous (CFM)
\definecolor{cPurple}{RGB}{142, 68, 173}
\definecolor{cGray} {RGB}{170, 170, 170}
\definecolor{cBgPanel}{RGB}{252, 252, 250}
\definecolor{cBg} {RGB}{248, 248, 248}
\newcommand{\contrib}{\textcolor{cOrange}{\ensuremath{\bigstar}}}
\tikzset{
panel/.style ={rectangle, draw=black!35, line width=0.5pt, rounded corners=2pt,
fill=cBgPanel, inner sep=0pt},
novelpanel/.style ={rectangle, draw=cOrange, line width=1.0pt, rounded corners=2pt,
fill=cOrange!4, inner sep=0pt},
paneltag/.style ={font=\sffamily\bfseries\footnotesize, anchor=north west,
text=black!75, inner sep=0pt},
paneltagN/.style ={font=\sffamily\bfseries\footnotesize, anchor=north west,
text=cOrange!85!black, inner sep=0pt},
archbox/.style ={rectangle, draw=black!70, thick, rounded corners=2pt,
align=center, font=\scriptsize, fill=white,
minimum height=8mm},
novelbox/.style ={rectangle, draw=cOrange, line width=1.2pt, rounded corners=2pt,
align=center, font=\scriptsize, fill=cOrange!10,
minimum height=8mm},
arrow/.style ={->, thick, black!65, >={Stealth[length=2.4mm]}},
thinarrow/.style ={->, line width=0.5pt, black!55, >={Stealth[length=1.8mm]}},
flowarrow/.style ={->, line width=1.2pt, black!70, >={Stealth[length=2.8mm]}},
losseq/.style ={fill=cBg, draw=black!30, rounded corners=2pt,
inner sep=4pt, font=\scriptsize, align=left},
}
% =============================================================================
% Panel (a): Tokenization (W=70mm, H=42mm)
% =============================================================================
\newcommand{\panelAcontent}{%
\begin{tikzpicture}[x=1mm, y=1mm,
panelarrow/.style={->, line width=0.5pt, black!55,
>={Stealth[length=1.8mm]}}]
\useasboundingbox (0,0) rectangle (70, 42);
\node[paneltag] at (1, 41) {(a) Tokenization};
% --- pcap icon ------------------------------------------------------------
\begin{scope}[shift={(1, 14)}]
\fill[cBlue!12] (0,0) -- (0,18) -- (8,18) -- (10.8,15) -- (10.8,0) -- cycle;
\draw[cBlue!80, line width=0.5pt]
(0,0) -- (0,18) -- (8,18) -- (10.8,15) -- (10.8,0) -- cycle;
\fill[cBlue!30] (8,18) -- (8,15) -- (10.8,15) -- cycle;
\node[font=\bfseries\tiny, text=cBlue!90!black] at (5.4, 10) {flow.pcap};
\foreach \y/\rl in {7/7, 5.5/5.5, 4/7, 2.5/4.5, 1/6} {
\draw[cBlue!45, line width=0.25pt] (1, \y) -- (1+\rl, \y);
}
\end{scope}
% --- arrow: parse ---------------------------------------------------------
\draw[panelarrow] (12.5, 23) -- (16.5, 23)
node[midway, above=0.3mm, font=\tiny\itshape, text=black!65] {parse};
% --- packet stream (8 packets, each = 9-d feature vector) ----------------
% Color encoding consistent with panel (b):
% BLUE = 3 continuous channels (log_size, log_dt_ms, log_win)
% ORANGE = 6 discrete channels (direction + 5 TCP flag bits S/F/R/P/A)
\begin{scope}[shift={(17, 14)}]
\foreach \i in {0,...,7} {
\pgfmathsetmacro{\xx}{\i*3}
\draw[fill=white, draw=black!50, line width=0.3pt, rounded corners=0.4pt]
(\xx, 0) rectangle (\xx+2.5, 18);
% --- top: 3 BLUE continuous bands (size, IAT, win) ------------------
\fill[cBlue!65] (\xx+0.3, 14.3) rectangle (\xx+2.2, 16.6); % log_size
\fill[cBlue!65] (\xx+0.3, 11.7) rectangle (\xx+2.2, 14.0); % log_dt_ms (IAT)
\fill[cBlue!65] (\xx+0.3, 9.1) rectangle (\xx+2.2, 11.4); % log_win
% thin separator between cont and disc sections
\draw[black!25, line width=0.2pt] (\xx+0.3, 8.0) -- (\xx+2.2, 8.0);
% --- bottom: 6 ORANGE discrete cells (dir + 5 TCP flags) ------------
\foreach \k in {0,...,5} {
\pgfmathsetmacro{\fx}{\xx + 0.3 + \k*0.32}
\pgfmathsetmacro{\on}{int(mod(\i*3+\k,2))}
\ifnum\on=1
\fill[cOrange!75] (\fx, 1.5) rectangle (\fx+0.30, 7.0);
\else
\draw[cOrange!55, line width=0.2pt, fill=white]
(\fx, 1.5) rectangle (\fx+0.30, 7.0);
\fi
}
}
\draw[->, line width=0.3pt, black!55] (-0.3, -2.5) -- (24.3, -2.5)
node[anchor=west, font=\tiny, text=black!55, xshift=-0.5mm] {time};
\end{scope}
% --- inline mini-key showing what blue/orange mean inside one packet ----
% Placed in the empty band between the panel tag (y=41) and the packet
% stream top (y=32) so it does not crowd either.
\node[font=\tiny, text=cBlue!85!black, anchor=west] at (17, 38)
{\rule{1.6mm}{1.6mm}\,3 cont: size, IAT, win};
\node[font=\tiny, text=cOrange!85!black, anchor=west] at (17, 35)
{\rule{1.6mm}{1.6mm}\,6 disc: dir + S F R P A};
% --- arrow: tokenize ------------------------------------------------------
\draw[panelarrow] (43, 23) -- (47, 23)
node[midway, above=0.3mm, font=\tiny\itshape, text=black!65] {tokenize};
% --- token sequence: FLOW + 3 packet tokens + PAD ------------------------
\begin{scope}[shift={(48, 11)}]
\fill[cBlue!75] (0, 22) rectangle (3, 23.6);
\foreach \i in {0,...,19} {
\pgfmathsetmacro{\yp}{20.8 - \i*1.0}
\fill[cBlue!25] (0, \yp) rectangle (3, \yp+0.9);
}
\node[font=\tiny, text=cBlue!90!black, anchor=north] at (1.5, 0.3) {FLOW};
\foreach \k/\xoff/\lbl in {1/5/{$P_1$}, 2/9/{$P_2$}, 3/15/{$P_T$}} {
\fill[cOrange!75] (\xoff, 22) rectangle (\xoff+3, 23.6);
\foreach \i in {0,...,2} {
\pgfmathsetmacro{\yp}{20.8 - \i*1.0}
\fill[cBlue!25] (\xoff, \yp) rectangle (\xoff+3, \yp+0.9);
}
\foreach \i in {3,...,8} {
\pgfmathsetmacro{\yp}{20.8 - \i*1.0}
\fill[cOrange!30] (\xoff, \yp) rectangle (\xoff+3, \yp+0.9);
}
\foreach \i in {9,...,19} {
\pgfmathsetmacro{\yp}{20.8 - \i*1.0}
\fill[cGray!28] (\xoff, \yp) rectangle (\xoff+3, \yp+0.9);
}
\node[font=\tiny, anchor=north] at (\xoff+1.5, 0.3) {\lbl};
}
\node[font=\Large, text=black!55] at (13, 11) {$\cdots$};
\draw[fill=cGray!22, draw=cGray, dash pattern=on 0.6pt off 0.6pt, line width=0.3pt]
(19, 22) rectangle (22, 23.6);
\foreach \i in {0,...,19} {
\pgfmathsetmacro{\yp}{20.8 - \i*1.0}
\fill[cGray!22] (19, \yp) rectangle (22, \yp+0.9);
}
\draw[draw=black!50, dashed, line width=0.4pt] (18.85, 0.3) rectangle (22.15, 23.7);
\node[font=\tiny, anchor=north, text=black!65] at (20.5, 0.3) {PAD};
\end{scope}
\end{tikzpicture}%
}
% =============================================================================
% Panel (b): Mixed-state path (W=70mm, H=42mm)
%
% Conceptual layout (top → bottom):
% row 1 — 3 column headers naming the 3 t snapshots:
% x_0 (noise) | x_t (model input) | x_1 (data)
% row 2 — continuous lane (blue): 3 particles linearly interpolating
% from random Gaussian starts at t=0 to data values at t=1.
% row 3 — discrete lane (orange): 3 snapshots of a 6-bit vector
% (random at t=0, half kept at t=0.5, all kept at t=1).
% row 4 — shared t-axis with ticks at the 3 column positions.
%
% Faint vertical dashed guides at x=8 / x=35 / x=62 tie the column headers,
% both lanes, and the t-axis together so the eye can read top-to-bottom.
% =============================================================================
\newcommand{\panelBcontent}{%
\begin{tikzpicture}[x=1mm, y=1mm]
\useasboundingbox (0,0) rectangle (70, 42);
\node[paneltagN] at (1, 41) {(b) Mixed-state path \contrib};
% --- column headers at the 3 t positions --------------------------------
\node[font=\tiny\bfseries, anchor=south, text=black!70] at (8, 36)
{$x_0$: noise};
\node[font=\tiny\bfseries, anchor=south, text=cOrange!85!black] at (35, 36)
{$x_t$ : \textit{model input}};
\node[font=\tiny\bfseries, anchor=south, text=black!70] at (62, 36)
{$x_1$: data};
% --- vertical guides tying the 3 columns to the t-axis ------------------
\foreach \xc in {8, 35, 62} {
\draw[black!22, dashed, line width=0.3pt] (\xc, 5) -- (\xc, 35.5);
}
% ---- top: continuous track (linear interpolation x_0 → x_1) ------------
\fill[cBlue!4] (1, 22) rectangle (69, 33);
\draw[cBlue!30, line width=0.3pt] (1, 22) rectangle (69, 33);
% Three independent particles, one per continuous channel.
% Endpoint visual hierarchy: left small + faded (noise sample) →
% mid medium →
% right large + solid (data target).
% Path 1
\draw[cBlue, line width=1pt] (8, 30) -- (35, 28.25) -- (62, 26.5);
\fill[cBlue, opacity=0.65] (8, 30) circle [radius=0.8];
\fill[cBlue, opacity=0.9] (35, 28.25) circle [radius=0.9];
\fill[cBlue] (62, 26.5) circle [radius=1.2];
% Path 2
\draw[cPurple!75!cBlue, line width=1pt] (8, 25) -- (35, 27.5) -- (62, 30);
\fill[cPurple!75!cBlue, opacity=0.65] (8, 25) circle [radius=0.8];
\fill[cPurple!75!cBlue, opacity=0.9] (35, 27.5) circle [radius=0.9];
\fill[cPurple!75!cBlue] (62, 30) circle [radius=1.2];
% Path 3
\draw[cBlue!55!black, line width=1pt] (8, 28.5) -- (35, 26.7) -- (62, 24.9);
\fill[cBlue!55!black, opacity=0.65] (8, 28.5) circle [radius=0.8];
\fill[cBlue!55!black, opacity=0.9] (35, 26.7) circle [radius=0.9];
\fill[cBlue!55!black] (62, 24.9) circle [radius=1.2];
\node[font=\tiny, text=cBlue!85!black, anchor=west] at (1, 20.5)
{$x_t = (1{-}t)\,x_0 + t\,x_1, \quad x_0 \sim \mathcal{N}(0,I)$};
% ---- bottom: discrete track (uniform-corruption Bernoulli flip) -------
\fill[cOrange!4] (1, 10) rectangle (69, 19);
\draw[cOrange!35, line width=0.3pt] (1, 10) rectangle (69, 19);
% Three time snapshots of a 6-bit vector, centered on the t-tick columns.
% t=0 : 0 1 0 1 1 0 (random)
% t=0.5 : 1 1 1 0 0 1 (about half kept)
% t=1 : 1 0 1 0 1 1 (= data target)
\foreach \pattern/\xc in {{0,1,0,1,1,0}/8,
{1,1,1,0,0,1}/35,
{1,0,1,0,1,1}/62} {
\pgfmathsetmacro{\xs}{\xc - 6.5}
\foreach \v [count=\k from 0] in \pattern {
\pgfmathsetmacro{\fx}{\xs + \k*2.2}
\ifnum\v=1
\fill[cOrange!75] (\fx, 11.2) rectangle (\fx+1.8, 17.8);
\node[font=\tiny, text=white] at (\fx+0.9, 14.5) {1};
\else
\draw[cOrange!75, line width=0.4pt, fill=white]
(\fx, 11.2) rectangle (\fx+1.8, 17.8);
\node[font=\tiny, text=cOrange!90!black] at (\fx+0.9, 14.5) {0};
\fi
}
}
\node[font=\tiny, text=cOrange!85!black, anchor=west] at (1, 8)
{$x^{\mathrm{disc}}_t = x^{\mathrm{disc}}_1$ w.p.\ $t$, else $\mathrm{Unif}\{0,1\}$};
% ---- shared t-axis ----------------------------------------------------
\draw[->, line width=0.5pt, black!60] (1, 4) -- (69, 4)
node[anchor=west, font=\tiny, text=black!65, xshift=-0.5mm] {$t$};
\foreach \tval/\xc in {0/8, 0.5/35, 1/62} {
\draw[black!55, line width=0.4pt] (\xc, 3.6) -- (\xc, 4.4);
\node[font=\tiny, anchor=north, text=black!70] at (\xc, 3.4) {$t{=}\tval$};
}
\end{tikzpicture}%
}
% =============================================================================
% Panel (c): Causal Velocity Field + heads + joint loss (W=152mm, H=82mm)
%
% Visual layout (route C + A combined per user spec):
%
% ────────────── t conditioning subsystem (y=66..78) ──────────────
% t → sin embed (~) → MLP → cond cells [▓▒░] → cond_proj (Linear)
% │
% ┌──────────┼──────────┐
% ▼γ1 ▼β1 ▼α1
% ─────────── BACKBONE (y=2..62) ─────────────────────────────────
%
% LEFT col (tensor flow A): CENTER col (heatmap C):
%
% [tensor h_in] ▓▒░▓░▒ ★ MHSA + causal-packet
% │ ┌─────────────────────┐
% LN box │ █ █ █ █ █ █ █ █ █ █ │ ← FLOW row
% │ │ █ █ │
% [tensor h_LN] row-uniform │ █ █ █ │
% │ │ █ █ █ █ │ large 12×12
% ⊗γ_1 ◀──────── γ_1 (purple dashed) │ █ █ █ █ █ │ attention map
% │ │ █ █ █ █ █ █ │ (FLOW row+col
% [tensor h_γ] cols rescaled │ █ ... │ + lower-tri)
% │ └──────────┬──────────┘
% ⊕β_1 ◀──────── β_1 (green dashed) │
% │ ⊗α_1 ◀── α_1 (orange dashed)
% [tensor h_β] cells shifted │
% │ ⊕ ◀── residual from h_in
% └──────────────────────────────►──────────────┤
% ▼
% "MLP half (same)" → h'
% ▼
% [v_θ head]
% [logits head ★]
% [Joint loss eq]
% =============================================================================
\newcommand{\panelCcontent}{%
\begin{tikzpicture}[x=1mm, y=1mm,
opcirc/.style={circle, draw=black!70, fill=white,
line width=0.5pt, inner sep=0pt,
minimum size=2.6mm,
font=\tiny\bfseries, text=black!75},
rescirc/.style={circle, draw=black!70, fill=white,
line width=0.7pt, inner sep=0pt,
minimum size=3mm,
font=\tiny\bfseries},
pathline/.style={->, line width=0.5pt, black!65,
>={Stealth[length=1.4mm]}},
resarc/.style={->, line width=0.7pt, black!50,
>={Stealth[length=1.6mm]}},
gammaline/.style={->, dashed, line width=0.6pt, cPurple!85,
>={Stealth[length=1.4mm]}},
betaline/.style={->, dashed, line width=0.6pt, cGreen!75!black,
>={Stealth[length=1.4mm]}},
alphaline/.style={->, dashed, line width=0.6pt, cOrange!90,
>={Stealth[length=1.4mm]}}]
\useasboundingbox (0,0) rectangle (152, 82);
\node[paneltagN] at (1, 81)
{(c) Causal-Packet Velocity Field \contrib\ + joint loss};
% =========================================================================
% T CONDITIONING SUBSYSTEM (y=66..78) — sin embed + MLP + cond + cond_proj
% =========================================================================
% (1) t scalar
\draw[fill=cBlue!15, draw=cBlue!80, line width=0.5pt]
(8, 72) circle [radius=2.0];
\node[font=\tiny\bfseries, text=cBlue!90!black] at (8, 72) {$t$};
\node[font=\tiny, text=black!55, anchor=north] at (8, 69.5) {scalar};
\draw[pathline] (10.2, 72) -- (12, 72);
% (2) sin embed
\draw[fill=white, draw=cBlue!80, line width=0.5pt, rounded corners=0.6pt]
(12, 68.5) rectangle (28, 75.5);
\draw[cBlue!80, line width=0.55pt]
(13, 72) sin (14.5, 73.5) cos (16, 72) sin (17.5, 70.5) cos (19, 72)
sin (20.5, 73.5) cos (22, 72) sin (23.5, 70.5) cos (25, 72)
sin (26.5, 73.5) cos (27, 72.7);
\node[font=\tiny, text=cBlue!90!black, anchor=north] at (20, 68.5)
{sin embed $\to\mathbb{R}^{64}$};
\draw[pathline] (28.2, 72) -- (30, 72);
% (3) cond MLP trapezoid
\fill[white] (30, 69) -- (30, 75) -- (37, 75.5) -- (37, 68.5) -- cycle;
\draw[black!65, line width=0.5pt]
(30, 69) -- (30, 75) -- (37, 75.5) -- (37, 68.5) -- cycle;
\node[font=\tiny] at (33.5, 72) {MLP};
\draw[pathline] (37.2, 72) -- (39, 72);
% (4) cond vector cells
\begin{scope}[shift={(39, 69)}]
\foreach \k/\col in {0/cBlue, 1/cBlue!75!cPurple, 2/cPurple!75!cBlue, 3/cBlue!60!black,
4/cBlue, 5/cPurple!85, 6/cBlue!75, 7/cBlue!85!black,
8/cBlue!60!cPurple, 9/cBlue!70} {
\pgfmathsetmacro{\fx}{\k * 1.4}
\fill[\col] (\fx, 0) rectangle (\fx+1.2, 6);
\draw[black!30, line width=0.15pt] (\fx, 0) rectangle (\fx+1.2, 6);
}
\end{scope}
\node[font=\tiny, text=black!75, anchor=west] at (54, 72)
{$\mathrm{cond}\!\in\!\mathbb{R}^{d}$};
\draw[pathline] (66, 72) -- (68, 72);
% (5) cond_proj — Linear that produces (γ, β, α) modulation parameters
\node[rectangle, draw=black!65, fill=white, line width=0.5pt,
rounded corners=0.6pt, minimum width=22mm, minimum height=8mm,
inner sep=1pt, font=\tiny, align=center, anchor=west]
(cproj) at (68, 72)
{cond\_proj \\ $\mathbb{R}^d\!\to\!6d$};
% cond_proj output split: 3 colored mini-bars labelled γ_1, β_1, α_1
% (γ_2, β_2, α_2 are implied — same fanout for the MLP half)
\begin{scope}[shift={($(cproj.east)+(2mm, 4mm)$)}]
\fill[cPurple!75] (0, 0) rectangle (10, 1.2);
\draw[black!30, line width=0.15pt] (0, 0) rectangle (10, 1.2);
\node[font=\tiny\bfseries, text=cPurple!75, anchor=west] at (10.5, 0.6) {$\gamma_1$};
\end{scope}
\begin{scope}[shift={($(cproj.east)+(2mm, 1mm)$)}]
\fill[cGreen!75!black] (0, 0) rectangle (10, 1.2);
\draw[black!30, line width=0.15pt] (0, 0) rectangle (10, 1.2);
\node[font=\tiny\bfseries, text=cGreen!75!black, anchor=west] at (10.5, 0.6) {$\beta_1$};
\end{scope}
\begin{scope}[shift={($(cproj.east)+(2mm, -2mm)$)}]
\fill[cOrange!90] (0, 0) rectangle (10, 1.2);
\draw[black!30, line width=0.15pt] (0, 0) rectangle (10, 1.2);
\node[font=\tiny\bfseries, text=cOrange!85!black, anchor=west] at (10.5, 0.6) {$\alpha_1$};
\end{scope}
\node[font=\tiny\itshape, text=black!55, anchor=west] at (cproj.south) [yshift=-0.5mm, xshift=-3mm]
{(implied: $\gamma_2,\beta_2,\alpha_2$ for MLP half — same fanout)};
% =========================================================================
% LEFT COLUMN: AdaLN modulation tensor flow visualization
% Shows h transformed at each stage: h_in → LN → ⊗γ → ⊕β → h_β
% =========================================================================
\def\gxc{32} % left column tensor center x
\def\gw{1.4} % cell width
\def\gh{1.0} % cell height
% token seq input box (far left)
\node[archbox, minimum width=14mm, anchor=west] (toki) at (1, 50)
{token seq\\$x_t$};
\draw[pathline] (toki.east) -- ++(3mm, 0);
% --- (a) h_in tensor (top) ---
\node[font=\tiny\bfseries, text=black!75, anchor=south] at (\gxc, 60)
{$h$ (input)};
\begin{scope}[shift={(\gxc - 4.2, 55.5)}]
\foreach \op [count=\k from 0] in
{30, 80, 50, 40, 90, 60,
70, 20, 80, 50, 40, 90,
60, 50, 90, 30, 80, 40,
70, 30, 60, 80, 40, 70} {
\pgfmathsetmacro{\i}{int(mod(\k, 6))}
\pgfmathsetmacro{\j}{int(\k/6)}
\fill[cBlue!\op] (\i*\gw, \j*\gh) rectangle (\i*\gw+\gw-0.05, \j*\gh+\gh-0.05);
}
\end{scope}
\draw[pathline] (\gxc, 55.2) -- (\gxc, 54);
% LayerNorm box
\node[archbox, minimum width=14mm, minimum height=2mm, inner sep=0.5pt,
font=\tiny, anchor=north]
(ln1) at (\gxc, 53.8) {LayerNorm};
\draw[pathline] (\gxc, 51.7) -- (\gxc, 50.7);
% --- (b) h after LN (more uniform per col) ---
\node[font=\tiny, text=cBlue!85!black, anchor=south] at (\gxc, 50.5)
{$\mathrm{LN}(h)$};
\begin{scope}[shift={(\gxc - 4.2, 45.5)}]
\foreach \op [count=\k from 0] in
{50, 30, 70, 50, 40, 60,
40, 60, 50, 50, 40, 60,
50, 50, 60, 40, 60, 40,
50, 40, 50, 60, 40, 60} {
\pgfmathsetmacro{\i}{int(mod(\k, 6))}
\pgfmathsetmacro{\j}{int(\k/6)}
\fill[cBlue!\op] (\i*\gw, \j*\gh) rectangle (\i*\gw+\gw-0.05, \j*\gh+\gh-0.05);
}
\end{scope}
% ⊗γ_1 operator
\draw[pathline] (\gxc, 45.2) -- (\gxc, 44.2);
\node[opcirc, draw=cPurple!75, text=cPurple!75] (gamma1) at (\gxc, 43.1) {\(\times\)};
\node[font=\tiny, text=cPurple!75, anchor=west] at (gamma1.east) [xshift=0.3mm] {$\gamma_1$};
\draw[pathline] (\gxc, 41.8) -- (\gxc, 40.8);
% --- (c) h after ⊗γ (per-column scaling visible) ---
\node[font=\tiny, text=cPurple!75, anchor=south] at (\gxc, 40.5)
{$\gamma_1\!\odot\!\mathrm{LN}(h)$};
\begin{scope}[shift={(\gxc - 4.2, 35.5)}]
\foreach \op [count=\k from 0] in
{60, 12, 70, 25, 52, 60,
48, 24, 50, 25, 52, 60,
60, 20, 60, 20, 78, 40,
60, 16, 50, 30, 52, 60} {
\pgfmathsetmacro{\i}{int(mod(\k, 6))}
\pgfmathsetmacro{\j}{int(\k/6)}
\fill[cBlue!\op] (\i*\gw, \j*\gh) rectangle (\i*\gw+\gw-0.05, \j*\gh+\gh-0.05);
}
\end{scope}
% ⊕β_1 operator
\draw[pathline] (\gxc, 35.2) -- (\gxc, 34.2);
\node[opcirc, draw=cGreen!75!black, text=cGreen!75!black] (beta1) at (\gxc, 33.1) {\(+\)};
\node[font=\tiny, text=cGreen!75!black, anchor=west] at (beta1.east) [xshift=0.3mm] {$\beta_1$};
\draw[pathline] (\gxc, 31.8) -- (\gxc, 30.8);
% --- (d) h after ⊕β (uniform shift visible) ---
\node[font=\tiny, text=cGreen!75!black, anchor=south] at (\gxc, 30.5)
{$+\,\beta_1$};
\begin{scope}[shift={(\gxc - 4.2, 25.5)}]
\foreach \op [count=\k from 0] in
{80, 32, 90, 45, 72, 80,
68, 44, 70, 45, 72, 80,
80, 40, 80, 40, 90, 60,
80, 36, 70, 50, 72, 80} {
\pgfmathsetmacro{\i}{int(mod(\k, 6))}
\pgfmathsetmacro{\j}{int(\k/6)}
\fill[cBlue!\op] (\i*\gw, \j*\gh) rectangle (\i*\gw+\gw-0.05, \j*\gh+\gh-0.05);
}
\end{scope}
% arrow → MHSA (going right toward heatmap)
\draw[pathline] (\gxc + 4.5, 27.5) -- (62, 27.5);
% =========================================================================
% CENTER COLUMN: large causal-packet attention heatmap
% =========================================================================
\def\hxc{84} % heatmap center x
\def\hcell{2.5} % heatmap cell size
% heatmap occupies x = (\hxc - 15) .. (\hxc + 15) = 69..99, with 12 cells
% heatmap title
\node[font=\tiny\bfseries, text=cOrange!85!black, anchor=south]
at (\hxc, 60) {\contrib\ MHSA + causal-packet attention};
% heatmap top labels (FLOW + P_1 .. P_11) — only show subset for readability
\foreach \i/\lbl in {0/F, 1/{$P_1$}, 5/{$P_5$}, 11/{$P_{11}$}} {
\node[font=\tiny, text=black!60]
at ({\hxc - 15 + \i*\hcell + \hcell/2}, 58.7) {\lbl};
}
% left labels
\foreach \i/\lbl in {0/F, 1/{$P_1$}, 5/{$P_5$}, 11/{$P_{11}$}} {
\node[font=\tiny, text=black!60, anchor=east]
at ({\hxc - 15 - 0.4}, {57 - \i*\hcell - \hcell/2}) {\lbl};
}
% heatmap cells
\foreach \i in {0,...,11} {
\foreach \j in {0,...,11} {
\pgfmathsetmacro{\xx}{\hxc - 15 + \j * \hcell}
\pgfmathsetmacro{\yy}{57 - (\i + 1) * \hcell}
\ifnum\i=0
\fill[cOrange!85] (\xx, \yy) rectangle (\xx+\hcell-0.1, \yy+\hcell-0.1);
\else
\ifnum\j=0
\fill[cOrange!85] (\xx, \yy) rectangle (\xx+\hcell-0.1, \yy+\hcell-0.1);
\else
\ifnum\j>\i
\draw[fill=white, draw=black!25, line width=0.15pt]
(\xx, \yy) rectangle (\xx+\hcell-0.1, \yy+\hcell-0.1);
\else
\pgfmathsetmacro{\dist}{\i - \j}
\pgfmathsetmacro{\opa}{int(75 - \dist*4)}
\fill[cOrange!\opa] (\xx, \yy) rectangle (\xx+\hcell-0.1, \yy+\hcell-0.1);
\fi
\fi
\fi
}
}
% heatmap legend below
\node[font=\tiny\itshape, text=black!60, anchor=north, align=center]
at (\hxc, 26)
{row 0 / col 0 = FLOW token attends all\\
lower-tri = packet $i$ attends pkt $\le i$};
% α_1 gate + ⊕ residual to the RIGHT of heatmap, vertical column
\def\axc{106}
\node[opcirc, draw=cOrange!90, text=cOrange!90] (alpha1) at (\axc, 27) {\(\times\)};
\node[font=\tiny, text=cOrange!90, anchor=west] at (alpha1.east) [xshift=0.3mm] {$\alpha_1$};
% attention output → α gate
\draw[pathline] (99, 27) -- (alpha1.west);
\draw[pathline] (\axc, 25.7) -- (\axc, 24.7);
\node[rescirc] (res1) at (\axc, 23.5) {\(+\)};
% residual arc: from far-left (h_in) all the way over to res1 — long arc
\draw[resarc] (\gxc, 60) to[out=90, in=180, looseness=0.7]
($(res1.north) + (-3mm, 8mm)$) -- (res1.north);
\node[font=\tiny\itshape, text=black!55, anchor=south]
at ($(res1.north)+(0, 8mm)$) {residual from $h$};
% continuation → "MLP half" → output
\draw[pathline] (\axc, 22) -- (\axc, 19);
\node[archbox, dashed, minimum width=20mm, minimum height=4mm, inner sep=1pt,
font=\tiny\itshape, anchor=north]
(mlphalf) at (\axc, 18.5) {MLP half\\(same pattern)};
\draw[pathline] (\axc, 12.7) -- (\axc, 11.5);
\node[font=\tiny, text=black!75] at (\axc, 10.5) {$h'$};
% "× 4 layers" annotation at the bottom of the center area
\node[font=\tiny\itshape, text=cOrange!75!black, anchor=center]
at (\hxc, 7) {(this whole block stacks $\times\,4$ layers)};
% =========================================================================
% CONDITIONING LINES — γ_1 / β_1 / α_1 from cond_proj output bars to ops
% =========================================================================
% γ_1 (purple) → ⊗γ_1 in left column
\draw[gammaline]
($(cproj.east)+(12mm, 4.6mm)$) .. controls (90, 60) and (60, 55) .. (gamma1.north);
% β_1 (green) → ⊕β_1 in left column
\draw[betaline]
($(cproj.east)+(12mm, 1.6mm)$) .. controls (95, 55) and (55, 45) .. (beta1.north);
% α_1 (orange) → ⊗α_1 next to heatmap
\draw[alphaline]
($(cproj.east)+(12mm, -1.4mm)$) .. controls (105, 65) and (108, 35) .. (alpha1.north);
% =========================================================================
% RIGHT: heads + joint loss
% =========================================================================
\node[archbox, minimum width=22mm, anchor=west]
(vh) at (124, 28) {$v_\theta$ head\\(continuous)};
\node[novelbox, minimum width=22mm, anchor=west]
(dh) at (124, 17) {\contrib\ logits head\\(discrete)};
% from h' to heads (right-then-up branching)
\coordinate (hsplit) at (118, 10.5);
\draw[arrow] (\axc, 10.5) -- (hsplit);
\draw[arrow] (hsplit) |- (vh.west);
\draw[arrow] (hsplit) |- (dh.west);
\node[losseq, anchor=north west, minimum width=46mm]
at (124, 50)
{\textbf{Joint loss}\\[1pt]
$\mathcal{L} =
\underbrace{\lVert v_\theta - (x_1{-}x_0)\rVert^2}_{\text{\textcolor{cBlue!85!black}{cont CFM}}}$\\[2pt]
$\quad\;\;\,+\;\lambda
\underbrace{\mathrm{CE}(\mathrm{logits},\,x_1^{\text{disc}})}_{\text{\textcolor{cOrange!85!black}{discrete FM}}}$};
\end{tikzpicture}%
}
% =============================================================================
% Panel (d): Inference + Mahalanobis-OAS router (W=152mm, H=44mm)
% - "Why a router?" callout removed.
% - Score-space scatter is now wider and centered under svec/router/auroc.
% =============================================================================
\newcommand{\panelDcontent}{%
\begin{tikzpicture}[x=1mm, y=1mm]
\useasboundingbox (0,0) rectangle (152, 44);
\node[paneltagN] at (1, 43)
{(d) Inference \& Mahalanobis-OAS router \contrib};
% --- linear chain (upper portion) ----------------------------------------
\node[archbox, minimum width=16mm, fill=cGray!12, anchor=west]
(testflow) at (1, 32) {test\\flow};
\node[archbox, dashed, minimum width=22mm, anchor=west]
(frozen) at ($(testflow.east)+(3mm,0)$)
{\textsc{Frozen} backbone\\($v_\theta$, logits)};
\node[archbox, minimum width=30mm, anchor=west]
(svec) at ($(frozen.east)+(3mm,0)$)
{\textsc{Score} $s\in\mathbb{R}^{10}$\\
\scriptsize\texttt{terminal\_norm,}\\
\scriptsize\texttt{terminal\_packet,}\\
\scriptsize\texttt{disc\_nll\_total,}~$\dots$};
\node[novelbox, minimum width=42mm, minimum height=18mm, anchor=west]
(router) at ($(svec.east)+(3mm,0)$)
{\contrib\ \textbf{Mahalanobis-OAS}\\[1pt]
$D^2(s) = (s-\mu)^\top \Sigma_{\mathrm{OAS}}^{-1}(s-\mu)$\\[1pt]
\scriptsize\itshape $\mu, \Sigma$ fit on benign val\\[-0.2pt]
\scriptsize\itshape (no labels, no selection bias)};
\node[archbox, minimum width=14mm, fill=cBlue!10, anchor=west]
(auroc) at ($(router.east)+(3mm,0)$) {AUROC\\$s_{\text{anomaly}}$};
\draw[arrow] (testflow.east) -- (frozen.west);
\draw[arrow] (frozen.east) -- (svec.west);
\draw[arrow] (svec.east) -- (router.west);
\draw[arrow] (router.east) -- (auroc.west);
% --- score-space scatter (centered, sized to fill the lower band) -------
% Center under svec..auroc span. svec.left=45, auroc.right≈137.
% Center x ≈ (45+137)/2 = 91. Width = 90mm → x range 46..136.
\node[draw=black!40, line width=0.3pt, fill=white,
minimum width=90mm, minimum height=22mm, anchor=south,
inner sep=0pt]
(scatterbox) at (91, 1) {};
\node[font=\tiny\bfseries, text=black!75, anchor=north west]
at (scatterbox.north west) [xshift=1.5mm, yshift=-0.8mm]
{score space (2 of 10 dims, illustrative)};
% axes inside scatterbox
\begin{scope}[shift={($(scatterbox.south west)+(7mm,3mm)$)}]
\draw[->, line width=0.3pt, black!55] (0, 0) -- (76, 0);
\draw[->, line width=0.3pt, black!55] (0, 0) -- (0, 14);
\node[font=\tiny, text=black!60, anchor=west] at (60, -1.4)
{\texttt{terminal\_norm}};
\node[font=\tiny, text=black!60, rotate=90, anchor=south west] at (-1.6, 1)
{\texttt{disc\_nll}};
% benign cluster ellipse (Sigma_OAS) — wider since plot is wider
\draw[cBlue!75, line width=0.6pt, rotate around={20:(33,6)}]
(33,6) ellipse [x radius=14, y radius=4];
\draw[cBlue!50, line width=0.4pt, dashed, rotate around={20:(33,6)}]
(33,6) ellipse [x radius=21, y radius=6];
% benign points
\foreach \px/\py in {28/5.4, 32/6.6, 36/6.8, 30/4.8, 34/5.8,
38/7, 26/6, 34/5.4, 37/6.4, 24/5.4,
40/7.2, 22/4.8, 30/6.4, 35/7, 28/4.4} {
\fill[cBlue!75] (\px, \py) circle [radius=0.5];
}
% attack points (outside the ellipse)
\foreach \px/\py in {60/10, 56/4, 52/11, 64/8,
10/9, 6/6, 68/5, 8/3,
70/12, 14/2, 4/10, 66/2.5} {
\fill[cOrange] (\px, \py) circle [radius=0.7];
}
% legend
\fill[cBlue!75] (50, 12.5) circle [radius=0.5];
\node[font=\tiny, text=cBlue!85!black, anchor=west] at (51.3, 12.5) {benign};
\fill[cOrange] (62, 12.5) circle [radius=0.7];
\node[font=\tiny, text=cOrange!85!black, anchor=west] at (63.3, 12.5) {attack};
\end{scope}
\end{tikzpicture}%
}
% =============================================================================
% OUTER FIGURE — chains the four panels with positioning, then draws three
% inter-panel data-flow arrows that make the training/inference pipeline
% explicit:
%
% (a) ──x_1──→ (b)
% │ x_t
% ▼
% (c) [training]
% │ frozen
% ▼
% (d) [inference]
% =============================================================================
\begin{document}
\begin{tikzpicture}[node distance=8mm]
% row 1
\node[panel] (panA) {\panelAcontent};
\node[novelpanel, right=of panA] (panB) {\panelBcontent};
% row 2 — full width
\node[novelpanel, below=of panA.south west, anchor=north west] (panC)
{\panelCcontent};
% row 3 — full width
\node[panel, below=of panC.south west, anchor=north west] (panD)
{\panelDcontent};
% --- inter-panel data-flow arrows ---------------------------------------
% (a) → (b): clean tokens x_1 produced by tokenization feed the corruption
\draw[flowarrow] (panA.east) -- (panB.west)
node[midway, above=0.5mm, font=\scriptsize\itshape, text=black!75]
{$x_1$};
% (b) → (c): mixed-state corrupted x_t at random t ∈ [0,1] feeds the model
\draw[flowarrow] (panB.south) -- (panC.north -| panB.south)
node[midway, right=0.5mm, font=\scriptsize\itshape, text=black!75]
{$x_t$};
% (c) → (d): trained backbone weights are frozen at test time
\draw[flowarrow] (panC.south) -- (panD.north)
node[midway, right=0.5mm, font=\scriptsize\itshape, text=black!75]
{\textit{frozen}};
\end{tikzpicture}
\end{document}

View File

@@ -0,0 +1,338 @@
% Figure 1: A+C combo pipeline (full).
% Compile: pdflatex figure1_pipeline.tex
\documentclass[border=8pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning, calc, decorations.pathreplacing}
\usepackage{amsmath, amssymb}
\definecolor{myorange}{RGB}{230, 126, 34}
\definecolor{myblue}{RGB}{52, 110, 180}
\definecolor{mygreen}{RGB}{46, 139, 87}
\definecolor{mypurple}{RGB}{142, 68, 173}
\definecolor{mygray}{RGB}{170, 170, 170}
\definecolor{mybg}{RGB}{248, 248, 248}
\newcommand{\contrib}{\textcolor{myorange}{\ensuremath{\bigstar}}}
\begin{document}
\begin{tikzpicture}[
font=\small,
>={Stealth[length=2.5mm]},
databox/.style={rectangle, draw=mygray, rounded corners=2pt,
minimum height=12mm, minimum width=14mm, align=center, fill=mygray!20},
box/.style={rectangle, draw=black!70, thick, rounded corners=2pt,
minimum height=12mm, minimum width=22mm, align=center, fill=white},
novelbox/.style={rectangle, draw=myorange, line width=1.4pt, rounded corners=2pt,
minimum height=12mm, minimum width=22mm, align=center, fill=myorange!10},
arrow/.style={->, thick},
losseq/.style={fill=mybg, draw=black!30, rounded corners=2pt, inner sep=5pt}
]
% =========================================================================
% TRAINING ROW (no row title)
% =========================================================================
% ----- (1) PCAP file icon -----
\begin{scope}[shift={(0.0, -1.2)}]
\fill[myblue!12] (0,0) -- (0,2.4) -- (1.05,2.4) -- (1.45,2.0) -- (1.45,0) -- cycle;
\draw[myblue!80, line width=0.6pt]
(0,0) -- (0,2.4) -- (1.05,2.4) -- (1.45,2.0) -- (1.45,0) -- cycle;
\fill[myblue!30] (1.05,2.4) -- (1.05,2.0) -- (1.45,2.0) -- cycle;
\draw[myblue!80, line width=0.4pt] (1.05,2.4) -- (1.05,2.0) -- (1.45,2.0);
\node[font=\bfseries\scriptsize, text=myblue!90!black] at (0.7, 1.65) {flow.pcap};
\foreach \y/\rl in {1.30/0.95, 1.10/0.78, 0.90/1.05, 0.70/0.65, 0.50/0.90, 0.30/0.55} {
\draw[myblue!45, line width=0.3pt] (0.15, \y) -- (0.15+\rl, \y);
}
\end{scope}
% Arrow: parse (length = 1.4cm so label fits comfortably)
\draw[arrow, black!60] (1.6, 0) -- (3.0, 0)
node[midway, above=0.5mm, font=\scriptsize\itshape, text=black!70] {parse};
% ----- (2) Packet stream: pkt0, pkt1, pkt2, ..., pkt_T -----
\begin{scope}[shift={(3.1, -1.1)}]
% 4 packets at explicit x-offsets; first three are 0,1,2 then a gap with
% ellipsis and the final one labeled pkt_T.
\foreach \j/\xoff/\lbl in {0/0.00/0, 1/1.18/1, 2/2.36/2, 3/4.04/T} {
\pgfmathsetmacro{\xx}{\xoff}
\draw[fill=white, draw=black!55, line width=0.45pt, rounded corners=1pt]
(\xx, 0.05) rectangle (\xx+1.05, 2.25);
\draw[fill=myblue!35, draw=myblue, line width=0.3pt]
(\xx+0.07, 2.00) rectangle (\xx+0.32, 2.15);
\node[font=\tiny, anchor=west] at (\xx+0.34, 2.075) {size};
\draw[fill=mygreen!35, draw=mygreen, line width=0.3pt]
(\xx+0.07, 1.78) rectangle (\xx+0.32, 1.93);
\node[font=\tiny, anchor=west] at (\xx+0.34, 1.855) {IAT};
\draw[fill=mypurple!35, draw=mypurple, line width=0.3pt]
(\xx+0.07, 1.56) rectangle (\xx+0.20, 1.71);
\node[font=\tiny, anchor=west] at (\xx+0.22, 1.635) {dir};
\ifcase\j
\def\flagS{1}\def\flagF{0}\def\flagR{0}\def\flagP{0}\def\flagA{0}\or
\def\flagS{1}\def\flagF{0}\def\flagR{0}\def\flagP{0}\def\flagA{1}\or
\def\flagS{0}\def\flagF{0}\def\flagR{0}\def\flagP{0}\def\flagA{1}\or
\def\flagS{0}\def\flagF{0}\def\flagR{0}\def\flagP{1}\def\flagA{1}\fi
\foreach \fname/\fval/\k in {S/\flagS/0, F/\flagF/1, R/\flagR/2, P/\flagP/3, A/\flagA/4} {
\pgfmathsetmacro{\fx}{\xx + 0.07 + \k*0.18}
\ifnum\fval=1
\draw[fill=myorange!70, draw=myorange, line width=0.3pt]
(\fx, 1.30) rectangle (\fx+0.15, 1.46);
\node[font=\tiny, white] at (\fx+0.075, 1.38) {\fname};
\else
\draw[fill=white, draw=myorange!60, line width=0.3pt]
(\fx, 1.30) rectangle (\fx+0.15, 1.46);
\node[font=\tiny, text=myorange!80!black] at (\fx+0.075, 1.38) {\fname};
\fi
}
\draw[fill=myblue!20, draw=myblue!60, line width=0.3pt]
(\xx+0.07, 1.05) rectangle (\xx+0.32, 1.20);
\node[font=\tiny, anchor=west] at (\xx+0.34, 1.125) {win};
\draw[black!30, line width=0.3pt] (\xx+0.07, 0.80) -- (\xx+0.97, 0.80);
\draw[black!30, line width=0.3pt] (\xx+0.07, 0.65) -- (\xx+0.85, 0.65);
\draw[black!30, line width=0.3pt] (\xx+0.07, 0.50) -- (\xx+0.95, 0.50);
\draw[black!30, line width=0.3pt] (\xx+0.07, 0.35) -- (\xx+0.70, 0.35);
\node[font=\scriptsize, text=black!70] at (\xx+0.525, -0.13) {pkt$_{\lbl}$};
}
% Ellipsis between pkt_2 (ends at x=3.41) and pkt_T (starts at x=4.04)
\node[font=\Large, text=black!55] at (3.72, 1.15) {$\cdots$};
% Time axis spans full row
\draw[->, line width=0.35pt, black!55] (-0.05, -0.4) -- (5.20, -0.4);
\node[font=\tiny, anchor=west, text=black!55] at (5.20, -0.4) {time};
\end{scope}
% Arrow: tokenize (length = 1.4cm). Packet stream ends at x=3.1+5.09=8.19,
% so arrow must start after that.
\draw[arrow, black!60] (8.3, 0) -- (9.7, 0)
node[midway, above=0.5mm, font=\scriptsize\itshape, text=black!70] {tokenize};
% ----- (3) Token sequence: [FLOW | P_1 | P_2 | ... | P_n | PAD] -----
% All tokens are 21-d (1 type marker + 20 feature/pad cells). Two paddings:
% • channel-padding inside packet tokens (cells 10..20, since pkt has 9 feats)
% • sequence-padding tokens (entire token zeroed when actual flow length < T)
\begin{scope}[shift={(9.8, -1.45)}]
% --- helper macros for cell drawing inside this scope ---
% Each token: 1 type cell on top + 20 feature/pad cells below.
% Cell height 0.085, cell width 0.42.
% Token x-offsets: FLOW=0, P_1=0.62, P_2=1.22, P_n=2.30, PAD=2.92.
%
% FLOW token: type (dark blue) + 20 cont features (light blue), no padding
\draw[fill=myblue!75, draw=myblue, line width=0.25pt]
(0.0, 2.55) rectangle (0.42, 2.64);
\foreach \i in {0,...,19} {
\pgfmathsetmacro{\yp}{2.46 - \i*0.085}
\draw[fill=myblue!25, draw=myblue!80, line width=0.25pt]
(0.0, \yp) rectangle (0.42, \yp+0.075);
}
\node[font=\tiny, anchor=north, text=myblue!90!black] at (0.21, 0.72) {\textbf{FLOW}};
%
% P_1, P_2, P_n: type (orange) + 3 cont + 6 disc + 11 channel-pad
\foreach \subi/\xoff in {1/0.62, 2/1.22, n/2.30} {
% type marker (orange)
\draw[fill=myorange!75, draw=myorange, line width=0.25pt]
(\xoff, 2.55) rectangle (\xoff+0.42, 2.64);
% 3 cont (blue)
\foreach \i in {0,...,2} {
\pgfmathsetmacro{\yp}{2.46 - \i*0.085}
\draw[fill=myblue!25, draw=myblue!80, line width=0.25pt]
(\xoff, \yp) rectangle (\xoff+0.42, \yp+0.075);
}
% 6 disc (orange)
\foreach \i in {3,...,8} {
\pgfmathsetmacro{\yp}{2.46 - \i*0.085}
\draw[fill=myorange!30, draw=myorange!80, line width=0.25pt]
(\xoff, \yp) rectangle (\xoff+0.42, \yp+0.075);
}
% 11 channel-pad (gray hatched)
\foreach \i in {9,...,19} {
\pgfmathsetmacro{\yp}{2.46 - \i*0.085}
\draw[fill=mygray!30, draw=mygray, line width=0.2pt, dash pattern=on 0.4pt off 0.4pt]
(\xoff, \yp) rectangle (\xoff+0.42, \yp+0.075);
}
\node[font=\tiny, anchor=north] at (\xoff+0.21, 0.72) {$P_{\subi}$};
}
%
% Ellipsis centered in gap between P_2 (ends x=1.64) and P_n (starts x=2.30),
% vertically centered on token cell stack (top=2.64, bottom=0.86)
\node[font=\Large, text=black!55] at (1.97, 1.75) {$\cdots$};
%
% PAD token (sequence-padding): entire token grayed + dashed outer border
\draw[fill=mygray!20, draw=mygray, dash pattern=on 1pt off 1pt, line width=0.4pt]
(2.92, 2.55) rectangle (3.34, 2.64);
\foreach \i in {0,...,19} {
\pgfmathsetmacro{\yp}{2.46 - \i*0.085}
\draw[fill=mygray!25, draw=mygray, line width=0.2pt, dash pattern=on 0.5pt off 0.5pt]
(2.92, \yp) rectangle (3.34, \yp+0.075);
}
% outer dashed wrap to emphasize "this whole token is padding"
\draw[draw=black!50, dashed, line width=0.5pt]
(2.90, 0.72) rectangle (3.36, 2.66);
\node[font=\tiny, anchor=north, text=black!65] at (3.13, 0.72) {\textbf{PAD}};
%
% Bottom brace + sequence label (below the FLOW/P_i/PAD name labels)
\draw[decorate, decoration={brace, amplitude=3pt, mirror}, line width=0.4pt, black!60]
(-0.05, 0.30) -- (3.39, 0.30);
\node[font=\scriptsize\itshape, text=black!70] at (1.67, -0.05)
{token sequence (1 flow + $T$ packets, all 21-d)};
\end{scope}
% Arrow: token → velocity (sequence ends at x=9.8+3.34=13.14)
\draw[arrow, black!60] (13.3, 0) -- (14.0, 0);
% ----- (4) Velocity field (with detailed internals, DiT-style) -----
% Outer box at x=14.0..19.0, y=-2.5..2.5 (5cm × 5cm)
\begin{scope}[shift={(14.0, -2.5)}]
% Outer rounded box
\draw[fill=myorange!8, draw=myorange, line width=1.4pt, rounded corners=2pt]
(0, 0) rectangle (5.0, 5.0);
\node[font=\sffamily\bfseries\small, anchor=north, text=myorange!90!black]
at (2.5, 4.85) {Velocity Field};
%
% Time embedding sub-box (top-left)
\draw[fill=white, draw=black!55, line width=0.4pt, rounded corners=1pt]
(0.20, 3.60) rectangle (1.30, 4.45);
\node[font=\tiny\bfseries, anchor=north] at (0.75, 4.42) {time $t$};
\node[font=\tiny, anchor=north] at (0.75, 4.20) {sinusoidal};
\node[font=\tiny, anchor=north] at (0.75, 4.00) {emb + MLP};
%
% AdaLN-Zero block 1
\draw[fill=white, draw=black!60, line width=0.4pt, rounded corners=1pt]
(1.55, 3.95) rectangle (4.80, 4.45);
\node[font=\scriptsize] at (3.18, 4.20)
{AdaLN-Zero \,($\gamma_1, \beta_1, \alpha_1$)};
% Conditioning arrow from time emb to AdaLN-1
\draw[->, dashed, line width=0.4pt, black!50]
(1.30, 4.20) -- (1.55, 4.20);
%
% Arrow down
\draw[->, line width=0.4pt, black!60] (3.18, 3.95) -- (3.18, 3.65);
%
% MHA block with causal mask icon
\draw[fill=myorange!15, draw=myorange, line width=0.7pt, rounded corners=1pt]
(1.55, 2.05) rectangle (4.80, 3.65);
\node[font=\scriptsize\bfseries, anchor=north, text=myorange!85!black]
at (3.18, 3.55) {\contrib\ Multi-Head Self-Attn};
\node[font=\tiny\itshape, anchor=north, text=myorange!85!black]
at (3.18, 3.30) {causal-packet mask};
% Mini 5×5 lower-triangular mask grid
\begin{scope}[shift={(2.55, 2.30)}]
\foreach \i in {0,...,4} {
\foreach \j in {0,...,4} {
\ifnum\j>\i
\draw[fill=white, draw=black!40, line width=0.15pt]
(\j*0.22, -\i*0.16) rectangle (\j*0.22+0.20, -\i*0.16-0.14);
\else
\draw[fill=myorange!55, draw=myorange, line width=0.15pt]
(\j*0.22, -\i*0.16) rectangle (\j*0.22+0.20, -\i*0.16-0.14);
\fi
}
}
\end{scope}
%
% Arrow down
\draw[->, line width=0.4pt, black!60] (3.18, 2.05) -- (3.18, 1.75);
%
% AdaLN-Zero block 2
\draw[fill=white, draw=black!60, line width=0.4pt, rounded corners=1pt]
(1.55, 1.25) rectangle (4.80, 1.75);
\node[font=\scriptsize] at (3.18, 1.50)
{AdaLN-Zero \,($\gamma_2, \beta_2, \alpha_2$)};
% Curved conditioning arrow from time emb to AdaLN-2
\draw[->, dashed, line width=0.4pt, black!50]
(0.75, 3.60) .. controls (0.40, 2.30) and (0.80, 1.50) .. (1.55, 1.50);
%
% Arrow down
\draw[->, line width=0.4pt, black!60] (3.18, 1.25) -- (3.18, 0.95);
%
% MLP block
\draw[fill=white, draw=black!60, line width=0.4pt, rounded corners=1pt]
(1.55, 0.45) rectangle (4.80, 0.95);
\node[font=\scriptsize] at (3.18, 0.70)
{MLP \,($d \to 4d \to d$)};
%
% "× 4 layers" stacking annotation at the bottom
\node[font=\scriptsize\itshape, anchor=south, text=black!70]
at (2.5, 0.05) {(stacked $\times\,4$ layers)};
\end{scope}
% Helper coordinates for input/output of velocity field (so arrows still work)
\coordinate (vel_west) at (14.0, 0);
\coordinate (vel_east) at (19.0, 0);
% ----- (5) Two heads -----
\node[box, minimum width=22mm] (vh) at (20.5, 0.7) {%
$v_\theta$ head\\
{\scriptsize (continuous)}%
};
\node[novelbox, minimum width=22mm] (dh) at (20.5, -0.7) {%
\contrib\ logits head\\
{\scriptsize (discrete)}%
};
\draw[arrow] (vel_east) -- (vh.west);
\draw[arrow] (vel_east) -- (dh.west);
% ----- Loss equation -----
\node[losseq, minimum width=190mm, font=\small, align=center] (loss) at (9.85, -3.7) {%
$\mathcal{L} \;=\;
\underbrace{\| v_\theta(x_t,t) - (x_1 - x_0) \|^2}_{\text{continuous CFM}}
\;+\; \lambda \cdot
\underbrace{\mathrm{CE}(\mathrm{logits},\, x_{\mathrm{disc}})}_{\text{Discrete FM}\,\contrib}$%
};
% =========================================================================
% INFERENCE ROW (no row title)
% =========================================================================
\node[databox, minimum width=18mm] (testflow) at (1.5, -5.7) {%
{\scriptsize test}\\ flow%
};
\node[box, dashed, minimum width=28mm] (frozen) at (4.7, -5.7) {%
\textsc{Frozen}\\
\textsc{Backbone}\\
{\scriptsize $v_\theta$ + logits}%
};
\node[box, minimum width=34mm] (svec) at (8.6, -5.7) {%
\textsc{Score Vector} (10-d)\\[0.5mm]
{\scriptsize\texttt{terminal\_norm}}\\
{\scriptsize\texttt{terminal\_packet}}\\
{\scriptsize\texttt{disc\_nll\_total}, \dots}%
};
\node[novelbox, minimum width=46mm, minimum height=22mm] (mahal) at (13.7, -5.7) {%
\contrib\ \textsc{Mahalanobis-OAS Router}\\[1mm]
$D^2 = (s-\mu)^\top \Sigma^{-1}_{\mathrm{OAS}} (s-\mu)$\\[1mm]
{\scriptsize\itshape fit on benign val (no labels)}%
};
\node[databox, minimum width=18mm, fill=myblue!10] (out) at (18.5, -5.7) {%
AUROC\\
$s_{\text{anomaly}}$%
};
\draw[arrow] (testflow) -- (frozen);
\draw[arrow] (frozen) -- (svec);
\draw[arrow] (svec) -- (mahal);
\draw[arrow] (mahal) -- (out);
% =========================================================================
% LEGEND
% =========================================================================
\node[draw=black!40, rounded corners=2pt, fill=white, inner sep=5pt, align=left,
font=\scriptsize, anchor=north west] at (0, -7.3) {%
\contrib\ \textbf{Our contributions} \quad
\tikz\fill[myblue!25, draw=myblue, line width=0.4pt] (0,0) rectangle (0.22,0.16);
\ continuous \quad
\tikz\fill[myorange!30, draw=myorange, line width=0.4pt] (0,0) rectangle (0.22,0.16);
\ discrete (DFM bits) \quad
\tikz\fill[mygray!30, draw=mygray, line width=0.4pt, dash pattern=on 0.4pt off 0.4pt] (0,0) rectangle (0.22,0.16);
\ channel-pad (9-d feat in 21-d slot) \quad
\tikz\draw[dashed, draw=black!50, line width=0.4pt] (0,0) rectangle (0.22,0.16);
\ sequence-pad (whole token, $n<T$)\\[2pt]
\contrib\ Discrete-FM head on TCP flag bits + direction \quad
\contrib\ Causal-packet attention (protocol-causal prior) \quad
\contrib\ Mahalanobis-OAS auto-router (no selection bias)%
};
\end{tikzpicture}
\end{document}

View File

@@ -0,0 +1,145 @@
% Pcap → packet stream → 9-d feature token extraction visual.
% Compile: pdflatex pcap_extraction.tex
\documentclass[border=8pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning, calc, shapes.misc, decorations.pathreplacing}
\usepackage{amsmath, amssymb}
\definecolor{myorange}{RGB}{230, 126, 34}
\definecolor{myblue}{RGB}{52, 110, 180}
\definecolor{mygreen}{RGB}{46, 139, 87}
\definecolor{mypurple}{RGB}{142, 68, 173}
\definecolor{mygray}{RGB}{170, 170, 170}
\begin{document}
\begin{tikzpicture}[font=\small, >={Stealth[length=2.5mm]}]
% ============ 1. PCAP FILE ICON ============
\begin{scope}[shift={(0,0)}]
% file body with folded corner (drawn as polygon)
\fill[myblue!12] (0,0) -- (0,3.0) -- (1.4,3.0) -- (1.9,2.5) -- (1.9,0) -- cycle;
\draw[myblue!80, line width=0.7pt]
(0,0) -- (0,3.0) -- (1.4,3.0) -- (1.9,2.5) -- (1.9,0) -- cycle;
% the folded triangle on top-right corner
\fill[myblue!30] (1.4,3.0) -- (1.4,2.5) -- (1.9,2.5) -- cycle;
\draw[myblue!80, line width=0.5pt] (1.4,3.0) -- (1.4,2.5) -- (1.9,2.5);
% file title
\node[font=\bfseries\footnotesize, text=myblue!90!black] at (0.95, 2.1) {flow.pcap};
% decorative "byte" lines (deterministic widths)
\foreach \y/\rl in {1.65/1.30, 1.40/1.05, 1.15/1.40, 0.90/0.85, 0.65/1.20, 0.40/0.75} {
\draw[myblue!45, line width=0.35pt] (0.18, \y) -- (0.18+\rl, \y);
}
\node[font=\scriptsize, anchor=north] at (0.95, -0.1) {raw bytes};
\end{scope}
% Arrow 1: parse
\draw[->, thick, black!60]
(2.05, 1.5) -- (3.20, 1.5)
node[midway, above, font=\scriptsize\itshape, text=black!70] {dpkt parse};
% ============ 2. DECODED PACKET STREAM ============
\begin{scope}[shift={(3.4, 0)}]
% four packets along time axis
\foreach \j in {0,...,3} {
\pgfmathsetmacro{\xx}{\j * 1.45}
% packet frame
\draw[fill=white, draw=black!55, line width=0.5pt, rounded corners=1pt]
(\xx, 0.5) rectangle (\xx+1.25, 3.05);
% size field (myblue)
\draw[fill=myblue!35, draw=myblue, line width=0.4pt]
(\xx+0.08, 2.78) rectangle (\xx+0.42, 2.93);
\node[font=\tiny, anchor=west] at (\xx+0.45, 2.86) {size};
% IAT field (mygreen)
\draw[fill=mygreen!35, draw=mygreen, line width=0.4pt]
(\xx+0.08, 2.55) rectangle (\xx+0.42, 2.70);
\node[font=\tiny, anchor=west] at (\xx+0.45, 2.63) {IAT};
% direction (mypurple)
\draw[fill=mypurple!35, draw=mypurple, line width=0.4pt]
(\xx+0.08, 2.32) rectangle (\xx+0.22, 2.47);
\node[font=\tiny, anchor=west] at (\xx+0.25, 2.40) {dir};
% flag bits row — show a real TCP 3-way handshake + data:
% pkt0: SYN (client SYN)
% pkt1: SYN+ACK (server SYN-ACK)
% pkt2: ACK (client ACK, handshake done)
% pkt3: PSH+ACK (data segment)
\ifcase\j
\def\flagS{1}\def\flagF{0}\def\flagR{0}\def\flagP{0}\def\flagA{0}\or
\def\flagS{1}\def\flagF{0}\def\flagR{0}\def\flagP{0}\def\flagA{1}\or
\def\flagS{0}\def\flagF{0}\def\flagR{0}\def\flagP{0}\def\flagA{1}\or
\def\flagS{0}\def\flagF{0}\def\flagR{0}\def\flagP{1}\def\flagA{1}\fi
\foreach \fname/\fval/\k in {S/\flagS/0, F/\flagF/1, R/\flagR/2, P/\flagP/3, A/\flagA/4} {
\pgfmathsetmacro{\fx}{\xx + 0.08 + \k*0.22}
\ifnum\fval=1
\draw[fill=myorange!70, draw=myorange, line width=0.4pt]
(\fx, 2.05) rectangle (\fx+0.18, 2.22);
\node[font=\tiny, white] at (\fx+0.09, 2.135) {\fname};
\else
\draw[fill=white, draw=myorange!60, line width=0.4pt]
(\fx, 2.05) rectangle (\fx+0.18, 2.22);
\node[font=\tiny, text=myorange!80!black] at (\fx+0.09, 2.135) {\fname};
\fi
}
% win
\draw[fill=myblue!20, draw=myblue!60, line width=0.4pt]
(\xx+0.08, 1.78) rectangle (\xx+0.42, 1.93);
\node[font=\tiny, anchor=west] at (\xx+0.45, 1.86) {win};
% decorative "payload" content
\draw[black!30, line width=0.4pt] (\xx+0.08, 1.45) -- (\xx+1.17, 1.45);
\draw[black!30, line width=0.4pt] (\xx+0.08, 1.25) -- (\xx+0.95, 1.25);
\draw[black!30, line width=0.4pt] (\xx+0.08, 1.05) -- (\xx+1.10, 1.05);
\draw[black!30, line width=0.4pt] (\xx+0.08, 0.85) -- (\xx+0.75, 0.85);
% packet label below
\node[font=\scriptsize, text=black!70] at (\xx+0.625, 0.32) {pkt$_\j$};
}
% time axis arrow
\draw[->, line width=0.4pt, black!60] (-0.05, 0.05) -- (6.0, 0.05);
\node[font=\tiny, anchor=west, text=black!60] at (6.05, 0.05) {time};
\end{scope}
% Arrow 2: extract
\draw[->, thick, black!60]
(9.5, 1.7) -- (10.7, 1.7)
node[midway, above, font=\scriptsize\itshape, text=black!70] {extract};
% ============ 3. 9-D FEATURE TOKEN ============
\begin{scope}[shift={(10.85, -0.5)}]
% 9 channels stacked vertically with type-grouped coloring
% 0 = continuous (z-scored), 1 = discrete (DFM bit)
\foreach \name/\g/\i in {%
log\_size/0/0,
log\_dt/0/1,
direction/1/2,
SYN/1/3,
FIN/1/4,
RST/1/5,
PSH/1/6,
ACK/1/7,
log\_win/0/8} {
\pgfmathsetmacro{\yp}{3.5 - \i*0.36}
\ifnum\g=0
\draw[fill=myblue!25, draw=myblue, line width=0.5pt]
(0, \yp) rectangle (1.35, \yp+0.32);
\else
\draw[fill=myorange!30, draw=myorange, line width=0.5pt]
(0, \yp) rectangle (1.35, \yp+0.32);
\fi
\node[font=\scriptsize] at (0.675, \yp+0.16) {\name};
}
% brace + label
\draw[decorate, decoration={brace, amplitude=4pt}, line width=0.5pt, black!60]
(1.45, 3.82) -- (1.45, 0.62)
node[midway, right=4pt, font=\scriptsize, align=left, text=black!70]
{9-d packet token\\[1pt] {[}cont (3) + disc (6){]}};
\end{scope}
% Bottom legend
\node[draw=black!30, rounded corners=2pt, fill=white, inner sep=4pt, font=\scriptsize,
align=left, anchor=north]
at (7.5, -1.1) {%
\tikz\fill[myblue!25, draw=myblue, line width=0.4pt] (0,0) rectangle (0.25,0.18);
\ continuous (z-scored) \quad
\tikz\fill[myorange!30, draw=myorange, line width=0.4pt] (0,0) rectangle (0.25,0.18);
\ discrete (kept as bits, fed to DFM head)};
\end{tikzpicture}
\end{document}

View File

@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" width="306" height="206" viewBox="0 0 306 206">
<rect width="306" height="206" fill="white"/>
<rect x="3" y="3" width="50" height="50" fill="#C2D4E8" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="3" width="50" height="50" fill="#5D8BC3" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="3" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="3" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="3" width="50" height="50" fill="#487CBC" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="3" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="53" width="50" height="50" fill="#719ACA" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="53" width="50" height="50" fill="#D6E2F0" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="53" width="50" height="50" fill="#5D8BC3" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="53" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="53" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="53" width="50" height="50" fill="#487CBC" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="103" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="103" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="103" width="50" height="50" fill="#487CBC" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="103" width="50" height="50" fill="#C2D4E8" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="103" width="50" height="50" fill="#5D8BC3" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="103" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="153" width="50" height="50" fill="#719ACA" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="153" width="50" height="50" fill="#C2D4E8" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="153" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="153" width="50" height="50" fill="#5D8BC3" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="153" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="153" width="50" height="50" fill="#719ACA" stroke="#999" stroke-width="0.6"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" width="306" height="206" viewBox="0 0 306 206">
<rect width="306" height="206" fill="white"/>
<rect x="3" y="3" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="3" width="50" height="50" fill="#C2D4E8" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="3" width="50" height="50" fill="#719ACA" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="3" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="3" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="3" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="53" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="53" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="53" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="53" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="53" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="53" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="103" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="103" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="103" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="103" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="103" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="103" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="153" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="153" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="153" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="153" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="153" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="153" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" width="306" height="206" viewBox="0 0 306 206">
<rect width="306" height="206" fill="white"/>
<rect x="3" y="3" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="3" width="50" height="50" fill="#E7EEF6" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="3" width="50" height="50" fill="#719ACA" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="3" width="50" height="50" fill="#CCDBEC" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="3" width="50" height="50" fill="#95B4D8" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="3" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="53" width="50" height="50" fill="#9EB9DB" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="53" width="50" height="50" fill="#CEDCED" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="53" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="53" width="50" height="50" fill="#CCDBEC" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="53" width="50" height="50" fill="#95B4D8" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="53" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="103" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="103" width="50" height="50" fill="#D6E2F0" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="103" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="103" width="50" height="50" fill="#D6E2F0" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="103" width="50" height="50" fill="#618EC4" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="103" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="153" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="153" width="50" height="50" fill="#DFE8F3" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="153" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="153" width="50" height="50" fill="#C2D4E8" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="153" width="50" height="50" fill="#95B4D8" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="153" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" width="306" height="206" viewBox="0 0 306 206">
<rect width="306" height="206" fill="white"/>
<rect x="3" y="3" width="50" height="50" fill="#5D8BC3" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="3" width="50" height="50" fill="#BED1E7" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="3" width="50" height="50" fill="#487CBC" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="3" width="50" height="50" fill="#A4BEDD" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="3" width="50" height="50" fill="#6D97C9" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="3" width="50" height="50" fill="#5D8BC3" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="53" width="50" height="50" fill="#759CCC" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="53" width="50" height="50" fill="#A6BFDE" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="53" width="50" height="50" fill="#719ACA" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="53" width="50" height="50" fill="#A4BEDD" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="53" width="50" height="50" fill="#6D97C9" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="53" width="50" height="50" fill="#5D8BC3" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="103" width="50" height="50" fill="#5D8BC3" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="103" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="103" width="50" height="50" fill="#5D8BC3" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="103" width="50" height="50" fill="#AEC5E1" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="103" width="50" height="50" fill="#487CBC" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="103" width="50" height="50" fill="#85A8D2" stroke="#999" stroke-width="0.6"/>
<rect x="3" y="153" width="50" height="50" fill="#5D8BC3" stroke="#999" stroke-width="0.6"/>
<rect x="53" y="153" width="50" height="50" fill="#B6CBE4" stroke="#999" stroke-width="0.6"/>
<rect x="103" y="153" width="50" height="50" fill="#719ACA" stroke="#999" stroke-width="0.6"/>
<rect x="153" y="153" width="50" height="50" fill="#9AB6DA" stroke="#999" stroke-width="0.6"/>
<rect x="203" y="153" width="50" height="50" fill="#6D97C9" stroke="#999" stroke-width="0.6"/>
<rect x="253" y="153" width="50" height="50" fill="#5D8BC3" stroke="#999" stroke-width="0.6"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,147 @@
<svg xmlns="http://www.w3.org/2000/svg" width="394" height="394" viewBox="0 0 394 394">
<rect width="394" height="394" fill="white"/>
<rect x="6" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="70" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="102" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="134" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="166" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="198" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="230" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="262" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="294" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="326" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="358" y="6" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="6" y="38" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="38" width="30" height="30" rx="4" ry="4" fill="#EC9E59" stroke="#999999" stroke-width="0.3"/>
<rect x="70" y="38" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="102" y="38" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="134" y="38" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="166" y="38" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="198" y="38" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="230" y="38" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="262" y="38" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="294" y="38" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="326" y="38" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="358" y="38" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="6" y="70" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="70" width="30" height="30" rx="4" ry="4" fill="#EDA362" stroke="#999999" stroke-width="0.3"/>
<rect x="70" y="70" width="30" height="30" rx="4" ry="4" fill="#EC9E59" stroke="#999999" stroke-width="0.3"/>
<rect x="102" y="70" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="134" y="70" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="166" y="70" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="198" y="70" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="230" y="70" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="262" y="70" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="294" y="70" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="326" y="70" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="358" y="70" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="6" y="102" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="102" width="30" height="30" rx="4" ry="4" fill="#EEA96B" stroke="#999999" stroke-width="0.3"/>
<rect x="70" y="102" width="30" height="30" rx="4" ry="4" fill="#EDA362" stroke="#999999" stroke-width="0.3"/>
<rect x="102" y="102" width="30" height="30" rx="4" ry="4" fill="#EC9E59" stroke="#999999" stroke-width="0.3"/>
<rect x="134" y="102" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="166" y="102" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="198" y="102" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="230" y="102" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="262" y="102" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="294" y="102" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="326" y="102" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="358" y="102" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="6" y="134" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="134" width="30" height="30" rx="4" ry="4" fill="#EFAE74" stroke="#999999" stroke-width="0.3"/>
<rect x="70" y="134" width="30" height="30" rx="4" ry="4" fill="#EEA96B" stroke="#999999" stroke-width="0.3"/>
<rect x="102" y="134" width="30" height="30" rx="4" ry="4" fill="#EDA362" stroke="#999999" stroke-width="0.3"/>
<rect x="134" y="134" width="30" height="30" rx="4" ry="4" fill="#EC9E59" stroke="#999999" stroke-width="0.3"/>
<rect x="166" y="134" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="198" y="134" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="230" y="134" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="262" y="134" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="294" y="134" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="326" y="134" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="358" y="134" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="6" y="166" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="166" width="30" height="30" rx="4" ry="4" fill="#F0B37D" stroke="#999999" stroke-width="0.3"/>
<rect x="70" y="166" width="30" height="30" rx="4" ry="4" fill="#EFAE74" stroke="#999999" stroke-width="0.3"/>
<rect x="102" y="166" width="30" height="30" rx="4" ry="4" fill="#EEA96B" stroke="#999999" stroke-width="0.3"/>
<rect x="134" y="166" width="30" height="30" rx="4" ry="4" fill="#EDA362" stroke="#999999" stroke-width="0.3"/>
<rect x="166" y="166" width="30" height="30" rx="4" ry="4" fill="#EC9E59" stroke="#999999" stroke-width="0.3"/>
<rect x="198" y="166" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="230" y="166" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="262" y="166" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="294" y="166" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="326" y="166" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="358" y="166" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="6" y="198" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="198" width="30" height="30" rx="4" ry="4" fill="#F1B885" stroke="#999999" stroke-width="0.3"/>
<rect x="70" y="198" width="30" height="30" rx="4" ry="4" fill="#F0B37D" stroke="#999999" stroke-width="0.3"/>
<rect x="102" y="198" width="30" height="30" rx="4" ry="4" fill="#EFAE74" stroke="#999999" stroke-width="0.3"/>
<rect x="134" y="198" width="30" height="30" rx="4" ry="4" fill="#EEA96B" stroke="#999999" stroke-width="0.3"/>
<rect x="166" y="198" width="30" height="30" rx="4" ry="4" fill="#EDA362" stroke="#999999" stroke-width="0.3"/>
<rect x="198" y="198" width="30" height="30" rx="4" ry="4" fill="#EC9E59" stroke="#999999" stroke-width="0.3"/>
<rect x="230" y="198" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="262" y="198" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="294" y="198" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="326" y="198" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="358" y="198" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="6" y="230" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="230" width="30" height="30" rx="4" ry="4" fill="#F2BD8E" stroke="#999999" stroke-width="0.3"/>
<rect x="70" y="230" width="30" height="30" rx="4" ry="4" fill="#F1B885" stroke="#999999" stroke-width="0.3"/>
<rect x="102" y="230" width="30" height="30" rx="4" ry="4" fill="#F0B37D" stroke="#999999" stroke-width="0.3"/>
<rect x="134" y="230" width="30" height="30" rx="4" ry="4" fill="#EFAE74" stroke="#999999" stroke-width="0.3"/>
<rect x="166" y="230" width="30" height="30" rx="4" ry="4" fill="#EEA96B" stroke="#999999" stroke-width="0.3"/>
<rect x="198" y="230" width="30" height="30" rx="4" ry="4" fill="#EDA362" stroke="#999999" stroke-width="0.3"/>
<rect x="230" y="230" width="30" height="30" rx="4" ry="4" fill="#EC9E59" stroke="#999999" stroke-width="0.3"/>
<rect x="262" y="230" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="294" y="230" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="326" y="230" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="358" y="230" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="6" y="262" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="262" width="30" height="30" rx="4" ry="4" fill="#F3C297" stroke="#999999" stroke-width="0.3"/>
<rect x="70" y="262" width="30" height="30" rx="4" ry="4" fill="#F2BD8E" stroke="#999999" stroke-width="0.3"/>
<rect x="102" y="262" width="30" height="30" rx="4" ry="4" fill="#F1B885" stroke="#999999" stroke-width="0.3"/>
<rect x="134" y="262" width="30" height="30" rx="4" ry="4" fill="#F0B37D" stroke="#999999" stroke-width="0.3"/>
<rect x="166" y="262" width="30" height="30" rx="4" ry="4" fill="#EFAE74" stroke="#999999" stroke-width="0.3"/>
<rect x="198" y="262" width="30" height="30" rx="4" ry="4" fill="#EEA96B" stroke="#999999" stroke-width="0.3"/>
<rect x="230" y="262" width="30" height="30" rx="4" ry="4" fill="#EDA362" stroke="#999999" stroke-width="0.3"/>
<rect x="262" y="262" width="30" height="30" rx="4" ry="4" fill="#EC9E59" stroke="#999999" stroke-width="0.3"/>
<rect x="294" y="262" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="326" y="262" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="358" y="262" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="6" y="294" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="294" width="30" height="30" rx="4" ry="4" fill="#F4C8A0" stroke="#999999" stroke-width="0.3"/>
<rect x="70" y="294" width="30" height="30" rx="4" ry="4" fill="#F3C297" stroke="#999999" stroke-width="0.3"/>
<rect x="102" y="294" width="30" height="30" rx="4" ry="4" fill="#F2BD8E" stroke="#999999" stroke-width="0.3"/>
<rect x="134" y="294" width="30" height="30" rx="4" ry="4" fill="#F1B885" stroke="#999999" stroke-width="0.3"/>
<rect x="166" y="294" width="30" height="30" rx="4" ry="4" fill="#F0B37D" stroke="#999999" stroke-width="0.3"/>
<rect x="198" y="294" width="30" height="30" rx="4" ry="4" fill="#EFAE74" stroke="#999999" stroke-width="0.3"/>
<rect x="230" y="294" width="30" height="30" rx="4" ry="4" fill="#EEA96B" stroke="#999999" stroke-width="0.3"/>
<rect x="262" y="294" width="30" height="30" rx="4" ry="4" fill="#EDA362" stroke="#999999" stroke-width="0.3"/>
<rect x="294" y="294" width="30" height="30" rx="4" ry="4" fill="#EC9E59" stroke="#999999" stroke-width="0.3"/>
<rect x="326" y="294" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="358" y="294" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="6" y="326" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="326" width="30" height="30" rx="4" ry="4" fill="#F5CDA9" stroke="#999999" stroke-width="0.3"/>
<rect x="70" y="326" width="30" height="30" rx="4" ry="4" fill="#F4C8A0" stroke="#999999" stroke-width="0.3"/>
<rect x="102" y="326" width="30" height="30" rx="4" ry="4" fill="#F3C297" stroke="#999999" stroke-width="0.3"/>
<rect x="134" y="326" width="30" height="30" rx="4" ry="4" fill="#F2BD8E" stroke="#999999" stroke-width="0.3"/>
<rect x="166" y="326" width="30" height="30" rx="4" ry="4" fill="#F1B885" stroke="#999999" stroke-width="0.3"/>
<rect x="198" y="326" width="30" height="30" rx="4" ry="4" fill="#F0B37D" stroke="#999999" stroke-width="0.3"/>
<rect x="230" y="326" width="30" height="30" rx="4" ry="4" fill="#EFAE74" stroke="#999999" stroke-width="0.3"/>
<rect x="262" y="326" width="30" height="30" rx="4" ry="4" fill="#EEA96B" stroke="#999999" stroke-width="0.3"/>
<rect x="294" y="326" width="30" height="30" rx="4" ry="4" fill="#EDA362" stroke="#999999" stroke-width="0.3"/>
<rect x="326" y="326" width="30" height="30" rx="4" ry="4" fill="#EC9E59" stroke="#999999" stroke-width="0.3"/>
<rect x="358" y="326" width="30" height="30" rx="4" ry="4" fill="#FFFFFF" stroke="#BBBBBB" stroke-width="0.5"/>
<rect x="6" y="358" width="30" height="30" rx="4" ry="4" fill="#EA9143" stroke="#B8651F" stroke-width="0.6"/>
<rect x="38" y="358" width="30" height="30" rx="4" ry="4" fill="#F6D2B2" stroke="#999999" stroke-width="0.3"/>
<rect x="70" y="358" width="30" height="30" rx="4" ry="4" fill="#F5CDA9" stroke="#999999" stroke-width="0.3"/>
<rect x="102" y="358" width="30" height="30" rx="4" ry="4" fill="#F4C8A0" stroke="#999999" stroke-width="0.3"/>
<rect x="134" y="358" width="30" height="30" rx="4" ry="4" fill="#F3C297" stroke="#999999" stroke-width="0.3"/>
<rect x="166" y="358" width="30" height="30" rx="4" ry="4" fill="#F2BD8E" stroke="#999999" stroke-width="0.3"/>
<rect x="198" y="358" width="30" height="30" rx="4" ry="4" fill="#F1B885" stroke="#999999" stroke-width="0.3"/>
<rect x="230" y="358" width="30" height="30" rx="4" ry="4" fill="#F0B37D" stroke="#999999" stroke-width="0.3"/>
<rect x="262" y="358" width="30" height="30" rx="4" ry="4" fill="#EFAE74" stroke="#999999" stroke-width="0.3"/>
<rect x="294" y="358" width="30" height="30" rx="4" ry="4" fill="#EEA96B" stroke="#999999" stroke-width="0.3"/>
<rect x="326" y="358" width="30" height="30" rx="4" ry="4" fill="#EDA362" stroke="#999999" stroke-width="0.3"/>
<rect x="358" y="358" width="30" height="30" rx="4" ry="4" fill="#EC9E59" stroke="#999999" stroke-width="0.3"/>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,146 @@
<svg xmlns="http://www.w3.org/2000/svg" width="629" height="384" viewBox="0 0 629 384">
<polygon points="314.98,24.00 339.23,38.00 314.98,52.00 290.74,38.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,38.00 363.48,52.00 339.23,66.00 314.98,52.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="363.48,52.00 387.73,66.00 363.48,80.00 339.23,66.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="387.73,66.00 411.98,80.00 387.73,94.00 363.48,80.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="411.98,80.00 436.23,94.00 411.98,108.00 387.73,94.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="436.23,94.00 460.48,108.00 436.23,122.00 411.98,108.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="460.48,108.00 484.73,122.00 460.48,136.00 436.23,122.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="484.73,122.00 508.97,136.00 484.73,150.00 460.48,136.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="508.97,136.00 533.22,150.00 508.97,164.00 484.73,150.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="533.22,150.00 557.47,164.00 533.22,178.00 508.97,164.00" fill="#F5CDA9" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="557.47,164.00 581.72,178.00 557.47,192.00 533.22,178.00" fill="#F6D2B2" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="581.72,178.00 605.97,192.00 581.72,206.00 557.47,192.00" fill="#F7D7BA" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,38.00 314.98,52.00 290.74,66.00 266.49,52.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,52.00 339.23,66.00 314.98,80.00 290.74,66.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,66.00 363.48,80.00 339.23,94.00 314.98,80.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="363.48,80.00 387.73,94.00 363.48,108.00 339.23,94.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="387.73,94.00 411.98,108.00 387.73,122.00 363.48,108.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="411.98,108.00 436.23,122.00 411.98,136.00 387.73,122.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="436.23,122.00 460.48,136.00 436.23,150.00 411.98,136.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="460.48,136.00 484.73,150.00 460.48,164.00 436.23,150.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="484.73,150.00 508.97,164.00 484.73,178.00 460.48,164.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="508.97,164.00 533.22,178.00 508.97,192.00 484.73,178.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="533.22,178.00 557.47,192.00 533.22,206.00 508.97,192.00" fill="#F5CDA9" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="557.47,192.00 581.72,206.00 557.47,220.00 533.22,206.00" fill="#F6D2B2" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,52.00 290.74,66.00 266.49,80.00 242.24,66.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,66.00 314.98,80.00 290.74,94.00 266.49,80.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,80.00 339.23,94.00 314.98,108.00 290.74,94.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,94.00 363.48,108.00 339.23,122.00 314.98,108.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="363.48,108.00 387.73,122.00 363.48,136.00 339.23,122.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="387.73,122.00 411.98,136.00 387.73,150.00 363.48,136.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="411.98,136.00 436.23,150.00 411.98,164.00 387.73,150.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="436.23,150.00 460.48,164.00 436.23,178.00 411.98,164.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="460.48,164.00 484.73,178.00 460.48,192.00 436.23,178.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="484.73,178.00 508.97,192.00 484.73,206.00 460.48,192.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="508.97,192.00 533.22,206.00 508.97,220.00 484.73,206.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="533.22,206.00 557.47,220.00 533.22,234.00 508.97,220.00" fill="#F5CDA9" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,66.00 266.49,80.00 242.24,94.00 217.99,80.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,80.00 290.74,94.00 266.49,108.00 242.24,94.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,94.00 314.98,108.00 290.74,122.00 266.49,108.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,108.00 339.23,122.00 314.98,136.00 290.74,122.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,122.00 363.48,136.00 339.23,150.00 314.98,136.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="363.48,136.00 387.73,150.00 363.48,164.00 339.23,150.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="387.73,150.00 411.98,164.00 387.73,178.00 363.48,164.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="411.98,164.00 436.23,178.00 411.98,192.00 387.73,178.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="436.23,178.00 460.48,192.00 436.23,206.00 411.98,192.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="460.48,192.00 484.73,206.00 460.48,220.00 436.23,206.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="484.73,206.00 508.97,220.00 484.73,234.00 460.48,220.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="508.97,220.00 533.22,234.00 508.97,248.00 484.73,234.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,80.00 242.24,94.00 217.99,108.00 193.74,94.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,94.00 266.49,108.00 242.24,122.00 217.99,108.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,108.00 290.74,122.00 266.49,136.00 242.24,122.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,122.00 314.98,136.00 290.74,150.00 266.49,136.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,136.00 339.23,150.00 314.98,164.00 290.74,150.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,150.00 363.48,164.00 339.23,178.00 314.98,164.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="363.48,164.00 387.73,178.00 363.48,192.00 339.23,178.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="387.73,178.00 411.98,192.00 387.73,206.00 363.48,192.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="411.98,192.00 436.23,206.00 411.98,220.00 387.73,206.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="436.23,206.00 460.48,220.00 436.23,234.00 411.98,220.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="460.48,220.00 484.73,234.00 460.48,248.00 436.23,234.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="484.73,234.00 508.97,248.00 484.73,262.00 460.48,248.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,94.00 217.99,108.00 193.74,122.00 169.49,108.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,108.00 242.24,122.00 217.99,136.00 193.74,122.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,122.00 266.49,136.00 242.24,150.00 217.99,136.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,136.00 290.74,150.00 266.49,164.00 242.24,150.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,150.00 314.98,164.00 290.74,178.00 266.49,164.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,164.00 339.23,178.00 314.98,192.00 290.74,178.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,178.00 363.48,192.00 339.23,206.00 314.98,192.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="363.48,192.00 387.73,206.00 363.48,220.00 339.23,206.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="387.73,206.00 411.98,220.00 387.73,234.00 363.48,220.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="411.98,220.00 436.23,234.00 411.98,248.00 387.73,234.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="436.23,234.00 460.48,248.00 436.23,262.00 411.98,248.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="460.48,248.00 484.73,262.00 460.48,276.00 436.23,262.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="169.49,108.00 193.74,122.00 169.49,136.00 145.24,122.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,122.00 217.99,136.00 193.74,150.00 169.49,136.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,136.00 242.24,150.00 217.99,164.00 193.74,150.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,150.00 266.49,164.00 242.24,178.00 217.99,164.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,164.00 290.74,178.00 266.49,192.00 242.24,178.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,178.00 314.98,192.00 290.74,206.00 266.49,192.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,192.00 339.23,206.00 314.98,220.00 290.74,206.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,206.00 363.48,220.00 339.23,234.00 314.98,220.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="363.48,220.00 387.73,234.00 363.48,248.00 339.23,234.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="387.73,234.00 411.98,248.00 387.73,262.00 363.48,248.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="411.98,248.00 436.23,262.00 411.98,276.00 387.73,262.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="436.23,262.00 460.48,276.00 436.23,290.00 411.98,276.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="145.24,122.00 169.49,136.00 145.24,150.00 120.99,136.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="169.49,136.00 193.74,150.00 169.49,164.00 145.24,150.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,150.00 217.99,164.00 193.74,178.00 169.49,164.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,164.00 242.24,178.00 217.99,192.00 193.74,178.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,178.00 266.49,192.00 242.24,206.00 217.99,192.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,192.00 290.74,206.00 266.49,220.00 242.24,206.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,206.00 314.98,220.00 290.74,234.00 266.49,220.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,220.00 339.23,234.00 314.98,248.00 290.74,234.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,234.00 363.48,248.00 339.23,262.00 314.98,248.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="363.48,248.00 387.73,262.00 363.48,276.00 339.23,262.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="387.73,262.00 411.98,276.00 387.73,290.00 363.48,276.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="411.98,276.00 436.23,290.00 411.98,304.00 387.73,290.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="120.99,136.00 145.24,150.00 120.99,164.00 96.75,150.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="145.24,150.00 169.49,164.00 145.24,178.00 120.99,164.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="169.49,164.00 193.74,178.00 169.49,192.00 145.24,178.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,178.00 217.99,192.00 193.74,206.00 169.49,192.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,192.00 242.24,206.00 217.99,220.00 193.74,206.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,206.00 266.49,220.00 242.24,234.00 217.99,220.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,220.00 290.74,234.00 266.49,248.00 242.24,234.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,234.00 314.98,248.00 290.74,262.00 266.49,248.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,248.00 339.23,262.00 314.98,276.00 290.74,262.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,262.00 363.48,276.00 339.23,290.00 314.98,276.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="363.48,276.00 387.73,290.00 363.48,304.00 339.23,290.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="387.73,290.00 411.98,304.00 387.73,318.00 363.48,304.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="96.75,150.00 120.99,164.00 96.75,178.00 72.50,164.00" fill="#F5CDA9" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="120.99,164.00 145.24,178.00 120.99,192.00 96.75,178.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="145.24,178.00 169.49,192.00 145.24,206.00 120.99,192.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="169.49,192.00 193.74,206.00 169.49,220.00 145.24,206.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,206.00 217.99,220.00 193.74,234.00 169.49,220.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,220.00 242.24,234.00 217.99,248.00 193.74,234.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,234.00 266.49,248.00 242.24,262.00 217.99,248.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,248.00 290.74,262.00 266.49,276.00 242.24,262.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,262.00 314.98,276.00 290.74,290.00 266.49,276.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,276.00 339.23,290.00 314.98,304.00 290.74,290.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,290.00 363.48,304.00 339.23,318.00 314.98,304.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="363.48,304.00 387.73,318.00 363.48,332.00 339.23,318.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="72.50,164.00 96.75,178.00 72.50,192.00 48.25,178.00" fill="#F6D2B2" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="96.75,178.00 120.99,192.00 96.75,206.00 72.50,192.00" fill="#F5CDA9" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="120.99,192.00 145.24,206.00 120.99,220.00 96.75,206.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="145.24,206.00 169.49,220.00 145.24,234.00 120.99,220.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="169.49,220.00 193.74,234.00 169.49,248.00 145.24,234.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,234.00 217.99,248.00 193.74,262.00 169.49,248.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,248.00 242.24,262.00 217.99,276.00 193.74,262.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,262.00 266.49,276.00 242.24,290.00 217.99,276.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,276.00 290.74,290.00 266.49,304.00 242.24,290.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,290.00 314.98,304.00 290.74,318.00 266.49,304.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,304.00 339.23,318.00 314.98,332.00 290.74,318.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,318.00 363.48,332.00 339.23,346.00 314.98,332.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="48.25,178.00 72.50,192.00 48.25,206.00 24.00,192.00" fill="#F7D7BA" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="72.50,192.00 96.75,206.00 72.50,220.00 48.25,206.00" fill="#F6D2B2" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="96.75,206.00 120.99,220.00 96.75,234.00 72.50,220.00" fill="#F5CDA9" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="120.99,220.00 145.24,234.00 120.99,248.00 96.75,234.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="145.24,234.00 169.49,248.00 145.24,262.00 120.99,248.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="169.49,248.00 193.74,262.00 169.49,276.00 145.24,262.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,262.00 217.99,276.00 193.74,290.00 169.49,276.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,276.00 242.24,290.00 217.99,304.00 193.74,290.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,290.00 266.49,304.00 242.24,318.00 217.99,304.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,304.00 290.74,318.00 266.49,332.00 242.24,318.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,318.00 314.98,332.00 290.74,346.00 266.49,332.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,332.00 339.23,346.00 314.98,360.00 290.74,346.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,146 @@
<svg xmlns="http://www.w3.org/2000/svg" width="629" height="384" viewBox="0 0 629 384">
<polygon points="314.98,24.00 339.23,38.00 314.98,52.00 290.74,38.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="339.23,38.00 363.48,52.00 339.23,66.00 314.98,52.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="363.48,52.00 387.73,66.00 363.48,80.00 339.23,66.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="387.73,66.00 411.98,80.00 387.73,94.00 363.48,80.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="411.98,80.00 436.23,94.00 411.98,108.00 387.73,94.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="436.23,94.00 460.48,108.00 436.23,122.00 411.98,108.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="460.48,108.00 484.73,122.00 460.48,136.00 436.23,122.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="484.73,122.00 508.97,136.00 484.73,150.00 460.48,136.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="508.97,136.00 533.22,150.00 508.97,164.00 484.73,150.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="533.22,150.00 557.47,164.00 533.22,178.00 508.97,164.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="557.47,164.00 581.72,178.00 557.47,192.00 533.22,178.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="581.72,178.00 605.97,192.00 581.72,206.00 557.47,192.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="290.74,38.00 314.98,52.00 290.74,66.00 266.49,52.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="314.98,52.00 339.23,66.00 314.98,80.00 290.74,66.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="339.23,66.00 363.48,80.00 339.23,94.00 314.98,80.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="363.48,80.00 387.73,94.00 363.48,108.00 339.23,94.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="387.73,94.00 411.98,108.00 387.73,122.00 363.48,108.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="411.98,108.00 436.23,122.00 411.98,136.00 387.73,122.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="436.23,122.00 460.48,136.00 436.23,150.00 411.98,136.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="460.48,136.00 484.73,150.00 460.48,164.00 436.23,150.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="484.73,150.00 508.97,164.00 484.73,178.00 460.48,164.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="508.97,164.00 533.22,178.00 508.97,192.00 484.73,178.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="533.22,178.00 557.47,192.00 533.22,206.00 508.97,192.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="557.47,192.00 581.72,206.00 557.47,220.00 533.22,206.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="266.49,52.00 290.74,66.00 266.49,80.00 242.24,66.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="290.74,66.00 314.98,80.00 290.74,94.00 266.49,80.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="314.98,80.00 339.23,94.00 314.98,108.00 290.74,94.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="339.23,94.00 363.48,108.00 339.23,122.00 314.98,108.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="363.48,108.00 387.73,122.00 363.48,136.00 339.23,122.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="387.73,122.00 411.98,136.00 387.73,150.00 363.48,136.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="411.98,136.00 436.23,150.00 411.98,164.00 387.73,150.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="436.23,150.00 460.48,164.00 436.23,178.00 411.98,164.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="460.48,164.00 484.73,178.00 460.48,192.00 436.23,178.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="484.73,178.00 508.97,192.00 484.73,206.00 460.48,192.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="508.97,192.00 533.22,206.00 508.97,220.00 484.73,206.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="533.22,206.00 557.47,220.00 533.22,234.00 508.97,220.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="242.24,66.00 266.49,80.00 242.24,94.00 217.99,80.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="266.49,80.00 290.74,94.00 266.49,108.00 242.24,94.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="290.74,94.00 314.98,108.00 290.74,122.00 266.49,108.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="314.98,108.00 339.23,122.00 314.98,136.00 290.74,122.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="339.23,122.00 363.48,136.00 339.23,150.00 314.98,136.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="363.48,136.00 387.73,150.00 363.48,164.00 339.23,150.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="387.73,150.00 411.98,164.00 387.73,178.00 363.48,164.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="411.98,164.00 436.23,178.00 411.98,192.00 387.73,178.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="436.23,178.00 460.48,192.00 436.23,206.00 411.98,192.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="460.48,192.00 484.73,206.00 460.48,220.00 436.23,206.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="484.73,206.00 508.97,220.00 484.73,234.00 460.48,220.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="508.97,220.00 533.22,234.00 508.97,248.00 484.73,234.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="217.99,80.00 242.24,94.00 217.99,108.00 193.74,94.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="242.24,94.00 266.49,108.00 242.24,122.00 217.99,108.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="266.49,108.00 290.74,122.00 266.49,136.00 242.24,122.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="290.74,122.00 314.98,136.00 290.74,150.00 266.49,136.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="314.98,136.00 339.23,150.00 314.98,164.00 290.74,150.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="339.23,150.00 363.48,164.00 339.23,178.00 314.98,164.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="363.48,164.00 387.73,178.00 363.48,192.00 339.23,178.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="387.73,178.00 411.98,192.00 387.73,206.00 363.48,192.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="411.98,192.00 436.23,206.00 411.98,220.00 387.73,206.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="436.23,206.00 460.48,220.00 436.23,234.00 411.98,220.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="460.48,220.00 484.73,234.00 460.48,248.00 436.23,234.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="484.73,234.00 508.97,248.00 484.73,262.00 460.48,248.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="193.74,94.00 217.99,108.00 193.74,122.00 169.49,108.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="217.99,108.00 242.24,122.00 217.99,136.00 193.74,122.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="242.24,122.00 266.49,136.00 242.24,150.00 217.99,136.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="266.49,136.00 290.74,150.00 266.49,164.00 242.24,150.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="290.74,150.00 314.98,164.00 290.74,178.00 266.49,164.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="314.98,164.00 339.23,178.00 314.98,192.00 290.74,178.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="339.23,178.00 363.48,192.00 339.23,206.00 314.98,192.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="363.48,192.00 387.73,206.00 363.48,220.00 339.23,206.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="387.73,206.00 411.98,220.00 387.73,234.00 363.48,220.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="411.98,220.00 436.23,234.00 411.98,248.00 387.73,234.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="436.23,234.00 460.48,248.00 436.23,262.00 411.98,248.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="460.48,248.00 484.73,262.00 460.48,276.00 436.23,262.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="169.49,108.00 193.74,122.00 169.49,136.00 145.24,122.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="193.74,122.00 217.99,136.00 193.74,150.00 169.49,136.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="217.99,136.00 242.24,150.00 217.99,164.00 193.74,150.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="242.24,150.00 266.49,164.00 242.24,178.00 217.99,164.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="266.49,164.00 290.74,178.00 266.49,192.00 242.24,178.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="290.74,178.00 314.98,192.00 290.74,206.00 266.49,192.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="314.98,192.00 339.23,206.00 314.98,220.00 290.74,206.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="339.23,206.00 363.48,220.00 339.23,234.00 314.98,220.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="363.48,220.00 387.73,234.00 363.48,248.00 339.23,234.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="387.73,234.00 411.98,248.00 387.73,262.00 363.48,248.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="411.98,248.00 436.23,262.00 411.98,276.00 387.73,262.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="436.23,262.00 460.48,276.00 436.23,290.00 411.98,276.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="145.24,122.00 169.49,136.00 145.24,150.00 120.99,136.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="169.49,136.00 193.74,150.00 169.49,164.00 145.24,150.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="193.74,150.00 217.99,164.00 193.74,178.00 169.49,164.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="217.99,164.00 242.24,178.00 217.99,192.00 193.74,178.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="242.24,178.00 266.49,192.00 242.24,206.00 217.99,192.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="266.49,192.00 290.74,206.00 266.49,220.00 242.24,206.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="290.74,206.00 314.98,220.00 290.74,234.00 266.49,220.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="314.98,220.00 339.23,234.00 314.98,248.00 290.74,234.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="339.23,234.00 363.48,248.00 339.23,262.00 314.98,248.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="363.48,248.00 387.73,262.00 363.48,276.00 339.23,262.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="387.73,262.00 411.98,276.00 387.73,290.00 363.48,276.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="411.98,276.00 436.23,290.00 411.98,304.00 387.73,290.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="120.99,136.00 145.24,150.00 120.99,164.00 96.75,150.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="145.24,150.00 169.49,164.00 145.24,178.00 120.99,164.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="169.49,164.00 193.74,178.00 169.49,192.00 145.24,178.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="193.74,178.00 217.99,192.00 193.74,206.00 169.49,192.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="217.99,192.00 242.24,206.00 217.99,220.00 193.74,206.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="242.24,206.00 266.49,220.00 242.24,234.00 217.99,220.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="266.49,220.00 290.74,234.00 266.49,248.00 242.24,234.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="290.74,234.00 314.98,248.00 290.74,262.00 266.49,248.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="314.98,248.00 339.23,262.00 314.98,276.00 290.74,262.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="339.23,262.00 363.48,276.00 339.23,290.00 314.98,276.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="363.48,276.00 387.73,290.00 363.48,304.00 339.23,290.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="387.73,290.00 411.98,304.00 387.73,318.00 363.48,304.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="96.75,150.00 120.99,164.00 96.75,178.00 72.50,164.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="120.99,164.00 145.24,178.00 120.99,192.00 96.75,178.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="145.24,178.00 169.49,192.00 145.24,206.00 120.99,192.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="169.49,192.00 193.74,206.00 169.49,220.00 145.24,206.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="193.74,206.00 217.99,220.00 193.74,234.00 169.49,220.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="217.99,220.00 242.24,234.00 217.99,248.00 193.74,234.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="242.24,234.00 266.49,248.00 242.24,262.00 217.99,248.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="266.49,248.00 290.74,262.00 266.49,276.00 242.24,262.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="290.74,262.00 314.98,276.00 290.74,290.00 266.49,276.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="314.98,276.00 339.23,290.00 314.98,304.00 290.74,290.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="339.23,290.00 363.48,304.00 339.23,318.00 314.98,304.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="363.48,304.00 387.73,318.00 363.48,332.00 339.23,318.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="72.50,164.00 96.75,178.00 72.50,192.00 48.25,178.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="96.75,178.00 120.99,192.00 96.75,206.00 72.50,192.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="120.99,192.00 145.24,206.00 120.99,220.00 96.75,206.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="145.24,206.00 169.49,220.00 145.24,234.00 120.99,220.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="169.49,220.00 193.74,234.00 169.49,248.00 145.24,234.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="193.74,234.00 217.99,248.00 193.74,262.00 169.49,248.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="217.99,248.00 242.24,262.00 217.99,276.00 193.74,262.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="242.24,262.00 266.49,276.00 242.24,290.00 217.99,276.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="266.49,276.00 290.74,290.00 266.49,304.00 242.24,290.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="290.74,290.00 314.98,304.00 290.74,318.00 266.49,304.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="314.98,304.00 339.23,318.00 314.98,332.00 290.74,318.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="339.23,318.00 363.48,332.00 339.23,346.00 314.98,332.00" fill="#3A3A3A" stroke="#1F1F1F" stroke-width="0.5"/>
<polygon points="48.25,178.00 72.50,192.00 48.25,206.00 24.00,192.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="72.50,192.00 96.75,206.00 72.50,220.00 48.25,206.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="96.75,206.00 120.99,220.00 96.75,234.00 72.50,220.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="120.99,220.00 145.24,234.00 120.99,248.00 96.75,234.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="145.24,234.00 169.49,248.00 145.24,262.00 120.99,248.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="169.49,248.00 193.74,262.00 169.49,276.00 145.24,262.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="193.74,262.00 217.99,276.00 193.74,290.00 169.49,276.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="217.99,276.00 242.24,290.00 217.99,304.00 193.74,290.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="242.24,290.00 266.49,304.00 242.24,318.00 217.99,304.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="266.49,304.00 290.74,318.00 266.49,332.00 242.24,318.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="290.74,318.00 314.98,332.00 290.74,346.00 266.49,332.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
<polygon points="314.98,332.00 339.23,346.00 314.98,360.00 290.74,346.00" fill="#F0B27A" stroke="#B8651F" stroke-width="0.4"/>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,146 @@
<svg xmlns="http://www.w3.org/2000/svg" width="629" height="384" viewBox="0 0 629 384">
<polygon points="314.98,24.00 339.23,38.00 314.98,52.00 290.74,38.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,38.00 363.48,52.00 339.23,66.00 314.98,52.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="363.48,52.00 387.73,66.00 363.48,80.00 339.23,66.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="387.73,66.00 411.98,80.00 387.73,94.00 363.48,80.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="411.98,80.00 436.23,94.00 411.98,108.00 387.73,94.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="436.23,94.00 460.48,108.00 436.23,122.00 411.98,108.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="460.48,108.00 484.73,122.00 460.48,136.00 436.23,122.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="484.73,122.00 508.97,136.00 484.73,150.00 460.48,136.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="508.97,136.00 533.22,150.00 508.97,164.00 484.73,150.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="533.22,150.00 557.47,164.00 533.22,178.00 508.97,164.00" fill="#F5CDA9" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="557.47,164.00 581.72,178.00 557.47,192.00 533.22,178.00" fill="#F6D2B2" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="581.72,178.00 605.97,192.00 581.72,206.00 557.47,192.00" fill="#F7D7BA" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,38.00 314.98,52.00 290.74,66.00 266.49,52.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,52.00 339.23,66.00 314.98,80.00 290.74,66.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,66.00 363.48,80.00 339.23,94.00 314.98,80.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="363.48,80.00 387.73,94.00 363.48,108.00 339.23,94.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="387.73,94.00 411.98,108.00 387.73,122.00 363.48,108.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="411.98,108.00 436.23,122.00 411.98,136.00 387.73,122.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="436.23,122.00 460.48,136.00 436.23,150.00 411.98,136.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="460.48,136.00 484.73,150.00 460.48,164.00 436.23,150.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="484.73,150.00 508.97,164.00 484.73,178.00 460.48,164.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="508.97,164.00 533.22,178.00 508.97,192.00 484.73,178.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="533.22,178.00 557.47,192.00 533.22,206.00 508.97,192.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="557.47,192.00 581.72,206.00 557.47,220.00 533.22,206.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="266.49,52.00 290.74,66.00 266.49,80.00 242.24,66.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,66.00 314.98,80.00 290.74,94.00 266.49,80.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,80.00 339.23,94.00 314.98,108.00 290.74,94.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,94.00 363.48,108.00 339.23,122.00 314.98,108.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="363.48,108.00 387.73,122.00 363.48,136.00 339.23,122.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="387.73,122.00 411.98,136.00 387.73,150.00 363.48,136.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="411.98,136.00 436.23,150.00 411.98,164.00 387.73,150.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="436.23,150.00 460.48,164.00 436.23,178.00 411.98,164.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="460.48,164.00 484.73,178.00 460.48,192.00 436.23,178.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="484.73,178.00 508.97,192.00 484.73,206.00 460.48,192.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="508.97,192.00 533.22,206.00 508.97,220.00 484.73,206.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="533.22,206.00 557.47,220.00 533.22,234.00 508.97,220.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="242.24,66.00 266.49,80.00 242.24,94.00 217.99,80.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,80.00 290.74,94.00 266.49,108.00 242.24,94.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,94.00 314.98,108.00 290.74,122.00 266.49,108.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,108.00 339.23,122.00 314.98,136.00 290.74,122.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,122.00 363.48,136.00 339.23,150.00 314.98,136.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="363.48,136.00 387.73,150.00 363.48,164.00 339.23,150.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="387.73,150.00 411.98,164.00 387.73,178.00 363.48,164.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="411.98,164.00 436.23,178.00 411.98,192.00 387.73,178.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="436.23,178.00 460.48,192.00 436.23,206.00 411.98,192.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="460.48,192.00 484.73,206.00 460.48,220.00 436.23,206.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="484.73,206.00 508.97,220.00 484.73,234.00 460.48,220.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="508.97,220.00 533.22,234.00 508.97,248.00 484.73,234.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="217.99,80.00 242.24,94.00 217.99,108.00 193.74,94.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,94.00 266.49,108.00 242.24,122.00 217.99,108.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,108.00 290.74,122.00 266.49,136.00 242.24,122.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,122.00 314.98,136.00 290.74,150.00 266.49,136.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,136.00 339.23,150.00 314.98,164.00 290.74,150.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,150.00 363.48,164.00 339.23,178.00 314.98,164.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="363.48,164.00 387.73,178.00 363.48,192.00 339.23,178.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="387.73,178.00 411.98,192.00 387.73,206.00 363.48,192.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="411.98,192.00 436.23,206.00 411.98,220.00 387.73,206.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="436.23,206.00 460.48,220.00 436.23,234.00 411.98,220.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="460.48,220.00 484.73,234.00 460.48,248.00 436.23,234.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="484.73,234.00 508.97,248.00 484.73,262.00 460.48,248.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="193.74,94.00 217.99,108.00 193.74,122.00 169.49,108.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,108.00 242.24,122.00 217.99,136.00 193.74,122.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,122.00 266.49,136.00 242.24,150.00 217.99,136.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,136.00 290.74,150.00 266.49,164.00 242.24,150.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,150.00 314.98,164.00 290.74,178.00 266.49,164.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,164.00 339.23,178.00 314.98,192.00 290.74,178.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,178.00 363.48,192.00 339.23,206.00 314.98,192.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="363.48,192.00 387.73,206.00 363.48,220.00 339.23,206.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="387.73,206.00 411.98,220.00 387.73,234.00 363.48,220.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="411.98,220.00 436.23,234.00 411.98,248.00 387.73,234.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="436.23,234.00 460.48,248.00 436.23,262.00 411.98,248.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="460.48,248.00 484.73,262.00 460.48,276.00 436.23,262.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="169.49,108.00 193.74,122.00 169.49,136.00 145.24,122.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,122.00 217.99,136.00 193.74,150.00 169.49,136.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,136.00 242.24,150.00 217.99,164.00 193.74,150.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,150.00 266.49,164.00 242.24,178.00 217.99,164.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,164.00 290.74,178.00 266.49,192.00 242.24,178.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,178.00 314.98,192.00 290.74,206.00 266.49,192.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,192.00 339.23,206.00 314.98,220.00 290.74,206.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,206.00 363.48,220.00 339.23,234.00 314.98,220.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="363.48,220.00 387.73,234.00 363.48,248.00 339.23,234.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="387.73,234.00 411.98,248.00 387.73,262.00 363.48,248.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="411.98,248.00 436.23,262.00 411.98,276.00 387.73,262.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="436.23,262.00 460.48,276.00 436.23,290.00 411.98,276.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="145.24,122.00 169.49,136.00 145.24,150.00 120.99,136.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="169.49,136.00 193.74,150.00 169.49,164.00 145.24,150.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,150.00 217.99,164.00 193.74,178.00 169.49,164.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,164.00 242.24,178.00 217.99,192.00 193.74,178.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,178.00 266.49,192.00 242.24,206.00 217.99,192.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,192.00 290.74,206.00 266.49,220.00 242.24,206.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,206.00 314.98,220.00 290.74,234.00 266.49,220.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,220.00 339.23,234.00 314.98,248.00 290.74,234.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,234.00 363.48,248.00 339.23,262.00 314.98,248.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="363.48,248.00 387.73,262.00 363.48,276.00 339.23,262.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="387.73,262.00 411.98,276.00 387.73,290.00 363.48,276.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="411.98,276.00 436.23,290.00 411.98,304.00 387.73,290.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="120.99,136.00 145.24,150.00 120.99,164.00 96.75,150.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="145.24,150.00 169.49,164.00 145.24,178.00 120.99,164.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="169.49,164.00 193.74,178.00 169.49,192.00 145.24,178.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,178.00 217.99,192.00 193.74,206.00 169.49,192.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,192.00 242.24,206.00 217.99,220.00 193.74,206.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,206.00 266.49,220.00 242.24,234.00 217.99,220.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,220.00 290.74,234.00 266.49,248.00 242.24,234.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,234.00 314.98,248.00 290.74,262.00 266.49,248.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,248.00 339.23,262.00 314.98,276.00 290.74,262.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,262.00 363.48,276.00 339.23,290.00 314.98,276.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="363.48,276.00 387.73,290.00 363.48,304.00 339.23,290.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="387.73,290.00 411.98,304.00 387.73,318.00 363.48,304.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="96.75,150.00 120.99,164.00 96.75,178.00 72.50,164.00" fill="#F5CDA9" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="120.99,164.00 145.24,178.00 120.99,192.00 96.75,178.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="145.24,178.00 169.49,192.00 145.24,206.00 120.99,192.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="169.49,192.00 193.74,206.00 169.49,220.00 145.24,206.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,206.00 217.99,220.00 193.74,234.00 169.49,220.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,220.00 242.24,234.00 217.99,248.00 193.74,234.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,234.00 266.49,248.00 242.24,262.00 217.99,248.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,248.00 290.74,262.00 266.49,276.00 242.24,262.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,262.00 314.98,276.00 290.74,290.00 266.49,276.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,276.00 339.23,290.00 314.98,304.00 290.74,290.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,290.00 363.48,304.00 339.23,318.00 314.98,304.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="363.48,304.00 387.73,318.00 363.48,332.00 339.23,318.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="72.50,164.00 96.75,178.00 72.50,192.00 48.25,178.00" fill="#F6D2B2" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="96.75,178.00 120.99,192.00 96.75,206.00 72.50,192.00" fill="#F5CDA9" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="120.99,192.00 145.24,206.00 120.99,220.00 96.75,206.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="145.24,206.00 169.49,220.00 145.24,234.00 120.99,220.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="169.49,220.00 193.74,234.00 169.49,248.00 145.24,234.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,234.00 217.99,248.00 193.74,262.00 169.49,248.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,248.00 242.24,262.00 217.99,276.00 193.74,262.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,262.00 266.49,276.00 242.24,290.00 217.99,276.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,276.00 290.74,290.00 266.49,304.00 242.24,290.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,290.00 314.98,304.00 290.74,318.00 266.49,304.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,304.00 339.23,318.00 314.98,332.00 290.74,318.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="339.23,318.00 363.48,332.00 339.23,346.00 314.98,332.00" fill="#FFFFFF" stroke="#CCCCCC" stroke-width="0.4"/>
<polygon points="48.25,178.00 72.50,192.00 48.25,206.00 24.00,192.00" fill="#F7D7BA" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="72.50,192.00 96.75,206.00 72.50,220.00 48.25,206.00" fill="#F6D2B2" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="96.75,206.00 120.99,220.00 96.75,234.00 72.50,220.00" fill="#F5CDA9" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="120.99,220.00 145.24,234.00 120.99,248.00 96.75,234.00" fill="#F4C8A0" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="145.24,234.00 169.49,248.00 145.24,262.00 120.99,248.00" fill="#F3C297" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="169.49,248.00 193.74,262.00 169.49,276.00 145.24,262.00" fill="#F2BD8E" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="193.74,262.00 217.99,276.00 193.74,290.00 169.49,276.00" fill="#F1B885" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="217.99,276.00 242.24,290.00 217.99,304.00 193.74,290.00" fill="#F0B37D" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="242.24,290.00 266.49,304.00 242.24,318.00 217.99,304.00" fill="#EFAE74" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="266.49,304.00 290.74,318.00 266.49,332.00 242.24,318.00" fill="#EEA96B" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="290.74,318.00 314.98,332.00 290.74,346.00 266.49,332.00" fill="#EDA362" stroke="#9C9C9C" stroke-width="0.4"/>
<polygon points="314.98,332.00 339.23,346.00 314.98,360.00 290.74,346.00" fill="#EC9E59" stroke="#9C9C9C" stroke-width="0.4"/>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,68 @@
"""Generate the causal-packet MHSA attention heatmap SVG.
12 x 12 attention matrix, rounded-rectangle cells, no text labels:
- row 0 and col 0 (FLOW token): cOrange!85 (full attention)
- lower triangular within [1:, 1:]: cOrange decaying with distance
(cOrange!{75 - 4*dist})
- upper triangular (blocked): white + light grey border
Run:
python gen_attn_heatmap.py
"""
from pathlib import Path
CORANGE = (230, 126, 34) # RGB of cOrange palette
WHITE = (255, 255, 255)
CELL = 30 # px per cell (square)
GAP = 2 # px between cells
PAD = 6 # px outer padding
RADIUS = 4 # px corner radius for cells
N = 12 # 12 x 12 grid
STRIDE = CELL + GAP
SIZE = N * CELL + (N - 1) * GAP + 2 * PAD
def mix_orange(p: int) -> str:
"""cOrange mixed with white at p% (matches TikZ cOrange!p)."""
f = p / 100
r = round(CORANGE[0] * f + WHITE[0] * (1 - f))
g = round(CORANGE[1] * f + WHITE[1] * (1 - f))
b = round(CORANGE[2] * f + WHITE[2] * (1 - f))
return f"#{r:02X}{g:02X}{b:02X}"
def cell_style(i: int, j: int) -> tuple[str, str, float]:
"""(fill, stroke, stroke_width) for cell (row=i, col=j)."""
if i == 0 or j == 0: # FLOW row / col
return mix_orange(85), "#B8651F", 0.6
if j > i: # blocked (upper-tri)
return "#FFFFFF", "#BBBBBB", 0.5
opa = max(15, 75 - (i - j) * 4) # lower-tri decay
return mix_orange(opa), "#999999", 0.3
def make_svg() -> str:
parts = [
f'<svg xmlns="http://www.w3.org/2000/svg" '
f'width="{SIZE}" height="{SIZE}" viewBox="0 0 {SIZE} {SIZE}">',
f' <rect width="{SIZE}" height="{SIZE}" fill="white"/>',
]
for i in range(N):
for j in range(N):
x = PAD + j * STRIDE
y = PAD + i * STRIDE
fill, stroke, sw = cell_style(i, j)
parts.append(
f' <rect x="{x}" y="{y}" width="{CELL}" height="{CELL}" '
f'rx="{RADIUS}" ry="{RADIUS}" '
f'fill="{fill}" stroke="{stroke}" stroke-width="{sw}"/>'
)
parts.append('</svg>')
return '\n'.join(parts) + '\n'
OUT = Path(__file__).parent
(OUT / "05_attention_heatmap.svg").write_text(make_svg())
print(f"wrote 05_attention_heatmap.svg ({SIZE}x{SIZE})")

View File

@@ -0,0 +1,136 @@
"""Generate 3 perspective (isometric) SVGs for the MHSA attention story:
06_attn_raw.svg — raw attention pattern, no mask
07_attn_mask.svg — the causal-packet mask itself (binary shape)
08_attn_masked.svg — raw attention with the mask applied
Each cell is rendered as a parallelogram via a 30°/30° isometric projection.
All three SVGs share the same dimensions and the same projection so they can
be composed / cross-faded in drawio.
"""
from pathlib import Path
import math
# --- palette ----------------------------------------------------------------
CORANGE = (230, 126, 34)
WHITE = (255, 255, 255)
# --- geometry ---------------------------------------------------------------
CELL = 28 # local cell size (before projection)
N = 12 # 12 x 12 grid
PAD = 24
COS30 = math.sqrt(3) / 2 # ≈ 0.866
SIN30 = 0.5
def project(x: float, y: float) -> tuple[float, float]:
"""Map local (x, y) to screen (sx, sy) via 30°/30° isometric projection.
Local x-axis (cols) goes down-right, local y-axis (rows) goes down-left.
Origin (0, 0) ends up at the TOP of the projected diamond.
"""
sx = x * COS30 - y * COS30
sy = x * SIN30 + y * SIN30
return sx, sy
def _bbox() -> tuple[float, float, float, float]:
corners = [
project(0, 0),
project(N * CELL, 0),
project(0, N * CELL),
project(N * CELL, N * CELL),
]
xs, ys = [c[0] for c in corners], [c[1] for c in corners]
return min(xs), max(xs), min(ys), max(ys)
_xmin, _xmax, _ymin, _ymax = _bbox()
W = int(_xmax - _xmin + 2 * PAD)
H = int(_ymax - _ymin + 2 * PAD)
OX = -_xmin + PAD
OY = -_ymin + PAD
def mix_orange(p: int) -> str:
f = p / 100
r = round(CORANGE[0] * f + WHITE[0] * (1 - f))
g = round(CORANGE[1] * f + WHITE[1] * (1 - f))
b = round(CORANGE[2] * f + WHITE[2] * (1 - f))
return f"#{r:02X}{g:02X}{b:02X}"
def cell_poly(i: int, j: int) -> str:
"""Return SVG points string for the parallelogram at row i, col j."""
pts = []
for di, dj in [(0, 0), (0, 1), (1, 1), (1, 0)]:
x = (j + dj) * CELL
y = (i + di) * CELL
sx, sy = project(x, y)
pts.append(f"{sx + OX:.2f},{sy + OY:.2f}")
return " ".join(pts)
def make_svg(style_fn) -> str:
# No background rect — SVGs are transparent so they can be cleanly
# overlaid / placed on any drawio canvas color.
parts = [
f'<svg xmlns="http://www.w3.org/2000/svg" '
f'width="{W}" height="{H}" viewBox="0 0 {W} {H}">',
]
# draw row-by-row, far rows first so near rows overlay (depth order).
for i in range(N):
for j in range(N):
fill, stroke, sw = style_fn(i, j)
parts.append(
f' <polygon points="{cell_poly(i, j)}" '
f'fill="{fill}" stroke="{stroke}" stroke-width="{sw}"/>'
)
parts.append('</svg>')
return '\n'.join(parts) + '\n'
# ----------------------------------------------------------------------------
# Style functions for each of the 3 SVGs
# ----------------------------------------------------------------------------
def style_raw(i: int, j: int) -> tuple[str, str, float]:
"""Raw attention before any mask: band-matrix-like soft pattern.
Brightness peaks on the diagonal and decays with |i - j|, giving a
realistic-looking dense attention map.
"""
dist = abs(i - j)
opa = max(20, 75 - dist * 4)
return mix_orange(opa), "#9C9C9C", 0.4
def style_mask(i: int, j: int) -> tuple[str, str, float]:
"""The causal-packet mask itself, as a binary visual:
- allowed cells (FLOW row/col + lower-tri): orange-light
- blocked cells (upper-tri except FLOW): dark gray
"""
blocked = (i != 0) and (j != 0) and (j > i)
if blocked:
return "#3A3A3A", "#1F1F1F", 0.5
return mix_orange(60), "#B8651F", 0.4
def style_masked(i: int, j: int) -> tuple[str, str, float]:
"""Raw attention AFTER applying the causal-packet mask: blocked cells
are whited out, allowed cells keep EXACTLY their raw attention intensity
(i.e. masked == raw × mask, nothing else changes).
"""
blocked = (i != 0) and (j != 0) and (j > i)
if blocked:
return "#FFFFFF", "#CCCCCC", 0.4
return style_raw(i, j)
OUT = Path(__file__).parent
(OUT / "06_attn_raw.svg").write_text(make_svg(style_raw))
(OUT / "07_attn_mask.svg").write_text(make_svg(style_mask))
(OUT / "08_attn_masked.svg").write_text(make_svg(style_masked))
print(f"wrote 06_attn_raw.svg / 07_attn_mask.svg / 08_attn_masked.svg ({W}x{H})")

View File

@@ -0,0 +1,71 @@
"""Generate 4 SVG tensor visualisations for the AdaLN modulation flow.
Each SVG is a 6 col x 4 row grid where cell color = cBlue mixed with white at
the per-cell opacity (0..100). Same color values used in the TikZ panel (c).
Run:
python gen_tensors.py
"""
from pathlib import Path
CBLUE = (52, 110, 180) # RGB of cBlue palette in the TikZ figure
WHITE = (255, 255, 255)
CELL = 50 # px per cell
BORDER = 3 # outer padding (px)
COLS, ROWS = 6, 4
W = COLS * CELL + 2 * BORDER
H = ROWS * CELL + 2 * BORDER
def mix(p: int) -> str:
"""Mix cBlue with white at p% (matches TikZ cBlue!p)."""
f = p / 100
r = round(CBLUE[0] * f + WHITE[0] * (1 - f))
g = round(CBLUE[1] * f + WHITE[1] * (1 - f))
b = round(CBLUE[2] * f + WHITE[2] * (1 - f))
return f"#{r:02X}{g:02X}{b:02X}"
def make_svg(opacities: list[int]) -> str:
parts = [
f'<svg xmlns="http://www.w3.org/2000/svg" '
f'width="{W}" height="{H}" viewBox="0 0 {W} {H}">',
f' <rect width="{W}" height="{H}" fill="white"/>',
]
for k, op in enumerate(opacities):
i, j = k % COLS, k // COLS
x = BORDER + i * CELL
y = BORDER + j * CELL
parts.append(
f' <rect x="{x}" y="{y}" width="{CELL}" height="{CELL}" '
f'fill="{mix(op)}" stroke="#999" stroke-width="0.6"/>'
)
parts.append('</svg>')
return '\n'.join(parts) + '\n'
# Same opacity arrays used in the TikZ panel (c). Row-major: 6 cols * 4 rows.
TENSORS = {
"01_h_in": [30, 80, 50, 40, 90, 60,
70, 20, 80, 50, 40, 90,
60, 50, 90, 30, 80, 40,
70, 30, 60, 80, 40, 70],
"02_h_after_LN": [50, 30, 70, 50, 40, 60,
40, 60, 50, 50, 40, 60,
50, 50, 60, 40, 60, 40,
50, 40, 50, 60, 40, 60],
"03_h_after_gamma":[60, 12, 70, 25, 52, 60,
48, 24, 50, 25, 52, 60,
60, 20, 60, 20, 78, 40,
60, 16, 50, 30, 52, 60],
"04_h_after_beta": [80, 32, 90, 45, 72, 80,
68, 44, 70, 45, 72, 80,
80, 40, 80, 40, 90, 60,
80, 36, 70, 50, 72, 80],
}
OUT = Path(__file__).parent
for name, vals in TENSORS.items():
assert len(vals) == COLS * ROWS, f"{name}: need {COLS*ROWS} values"
(OUT / f"{name}.svg").write_text(make_svg(vals))
print(f"wrote {name}.svg ({W}x{H})")