Stamp 2.57.0 native package.json, requirements, and unused Docker copies.

Frontend periscope-web manifests, pip requirements, and EDA logos/examples
overlay from src. Docker installs from those files. Unused PinScope public
blobs are dockerignored. Landing png/gif stay in dependency until native
captures exist.
This commit is contained in:
2026-09-20 21:00:21 +02:00
parent 7a377889ae
commit 3a666ea8ae
23 changed files with 12357 additions and 12 deletions
+7
View File
@@ -11,3 +11,10 @@ data/
.claude/plans/
.claude/memory/
simple_project/
periscope/dependency/frontend/public/faradworks-logo-white.png
periscope/dependency/frontend/public/power-tree.gif
periscope/dependency/frontend/public/file.svg
periscope/dependency/frontend/public/globe.svg
periscope/dependency/frontend/public/next.svg
periscope/dependency/frontend/public/vercel.svg
periscope/dependency/frontend/public/window.svg
+2 -2
View File
@@ -14,7 +14,7 @@ jobs:
with:
python-version: "3.12"
cache: pip
- run: pip install -r periscope/dependency/backend/requirements.txt pytest pytest-asyncio
- run: pip install -r periscope/src/backend/requirements.txt pytest pytest-asyncio
- run: pytest tests/ -q
frontend:
@@ -25,7 +25,7 @@ jobs:
with:
node-version: 22
cache: npm
cache-dependency-path: periscope/dependency/frontend/package-lock.json
cache-dependency-path: periscope/src/frontend/package-lock.json
- run: chmod +x scripts/materialize-frontend.sh && scripts/materialize-frontend.sh
- run: npm ci
working-directory: .merge/frontend
+6 -6
View File
@@ -23,7 +23,7 @@ Default routing:
| Per-IC datasheet review | `deepseek-flash` |
| Auto-resolve / normalize | `deepseek-flash` |
Override with `PROVIDER_*` and `MODEL_*_DEEPSEEK` in `.env`. See `periscope/dependency/backend/.env.example`.
Override with `PROVIDER_*` and `MODEL_*_DEEPSEEK` in `.env`. See `periscope/src/backend/.env.example`.
## Layout
@@ -54,22 +54,22 @@ You need Python 3.12+, Node 20+, and a [DeepSeek API key](https://platform.deeps
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r periscope/dependency/backend/requirements.txt
cp periscope/dependency/backend/.env.example .env # set DEEPSEEK_API_KEY
pip install -r periscope/src/backend/requirements.txt
cp periscope/src/backend/.env.example .env # set DEEPSEEK_API_KEY
python3 -m uvicorn backend.main:app --reload --host 127.0.0.1 --port 18741
# in another terminal
cd periscope/dependency/frontend && npm install
cd periscope/src/frontend && npm install
NEXT_PUBLIC_API_URL=http://127.0.0.1:18741 npm run dev -- --port 18742 --hostname 127.0.0.1
```
Open the frontend URL, create a project, and feed it the netlist and BOM from `periscope/dependency/simple_project/`. Datasheets are fetched automatically (LCSC, TI, optional DigiKey); you can still drop in PDFs by hand. Fetched PDFs and extracted pin tables land in the **Library** (sidebar) and are reused on later projects. Everything runs locally against your own DeepSeek key; projects and the extraction library live in `data/`. Skills are local `periscope/dependency/skills/*/SKILL.md` — do not run `periscope/dependency/scripts/upload_skills.py`.
Open the frontend URL, create a project, and feed it the netlist and BOM from `periscope/dependency/simple_project/`. Datasheets are fetched automatically (LCSC, TI, optional DigiKey); you can still drop in PDFs by hand. Fetched PDFs and extracted pin tables land in the **Library** (sidebar) and are reused on later projects. Everything runs locally against your own DeepSeek key; projects and the extraction library live in `data/`. Skills are local `periscope/src/skills/*/SKILL.md` — do not run `scripts/upload_skills.py`.
## Docker
```bash
cp periscope/dependency/backend/.env.example .env # set DEEPSEEK_API_KEY
cp periscope/src/backend/.env.example .env # set DEEPSEEK_API_KEY
docker compose up --build
```
+45
View File
@@ -0,0 +1,45 @@
# Periscope backend environment. Copy to the repo-root `.env`.
# Required: DEEPSEEK_API_KEY
# -- DeepSeek --------------------------------------------------------------
DEEPSEEK_API_KEY=sk-...
DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_MODEL=deepseek-flash
DEEPSEEK_VISION_MODEL=deepseek-flash
DEEPSEEK_THINKING=enabled
DEEPSEEK_REASONING_EFFORT=high
# PROVIDER_DEFAULT=deepseek
# MODEL_PINTABLE_DEEPSEEK=deepseek-flash
# MODEL_PATTERN_DEEPSEEK=deepseek-flash
# MODEL_SPECS_DEEPSEEK=deepseek-flash
# MODEL_VALIDATION_DEEPSEEK=deepseek-flash
# MODEL_AUTO_RESOLVE_DEEPSEEK=deepseek-flash
# MODEL_NORMALIZE_DEEPSEEK=deepseek-flash
# Anthropic is not used. Do not set ANTHROPIC_API_KEY.
# -- Storage ---------------------------------------------------------------
GCS_BUCKET=
# -- CORS ------------------------------------------------------------------
CORS_ORIGINS=["http://localhost:3000","http://127.0.0.1:3000","http://localhost:18742","http://127.0.0.1:18742"]
# -- Local JWT (self-host). Do not rotate AUTH_JWT_SECRET on a live box. ---
# AUTH_JWT_SECRET=change-me-to-a-long-random-string
# AUTH_ADMIN_EMAILS=you@example.com
# -- Clerk (optional leftover seam) ----------------------------------------
# CLERK_SECRET_KEY=
# CLERK_PUBLISHABLE_KEY=
# CLERK_JWKS_URL=
# DIGIKEY_CLIENT_ID=
# DIGIKEY_CLIENT_SECRET=
# DIGIKEY_ENVIRONMENT=production
# MOUSER_API_KEY=
# EMAIL_SENDER=
# EMAIL_FRONTEND_URL=
# EMAIL_ADMIN_NOTIFY=
# CONTACT_RECIPIENT=
+1 -1
View File
@@ -4,7 +4,7 @@ RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Overlay: PinScope inherited tree, then native Periscope modules.
COPY periscope/dependency/backend/requirements*.txt /app/backend/
COPY periscope/src/backend/requirements*.txt /app/backend/
RUN pip install --no-cache-dir -r /app/backend/requirements.txt \
&& if [ -f /app/backend/requirements-gateway.txt ]; then \
pip install --no-cache-dir -r /app/backend/requirements-gateway.txt; \
+23
View File
@@ -0,0 +1,23 @@
fastapi>=0.115
uvicorn[standard]
openai>=1.60
pydantic[email]>=2.0
pydantic-settings
python-multipart
sse-starlette
python-dotenv
openpyxl>=3.1
pypdf>=4.0
pymupdf>=1.24
PyJWT[crypto]>=2.8
cryptography>=42.0
httpx>=0.27
packaging>=24.0
shapely>=2.0
PyYAML>=6.0
# Optional leftover seams (GCS storage, Gmail/Sheets, unused LLM providers).
anthropic>=0.83
google-genai>=1.59
google-cloud-storage>=2.14
google-cloud-run>=0.10
google-api-python-client>=2.100
+25
View File
@@ -0,0 +1,25 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "base-nova",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/app/globals.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"iconLibrary": "lucide",
"rtl": false,
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"menuColor": "default",
"menuAccent": "subtle",
"registries": {}
}
@@ -2,6 +2,15 @@
What's new in Periscope.
## 2.57.0 — 2026-09-20 — Native package.json, requirements, and unused Docker copies
Frontend `package.json` (`periscope-web`) and lockfile, `components.json`, and backend `requirements.txt` overlay from `periscope/src`. Docker installs those files from src. Unused PinScope public blobs (Faradworks logo, power-tree.gif, create-next-app SVGs) are dockerignored. EDA logos and KiCad tutorial examples live under src `public/`. Landing `report.png` / `datasheet.gif` / `derating.png` stay in `dependency/` until native UI captures exist. Auth/JWT still inherited. Pad≠Via unchanged.
- [New] Native npm package name `periscope-web` at 2.57.0 with the same Next 16 scripts and dependency set.
- [New] Native pip requirements (DeepSeek stack first; leftover GCS/Gmail/LLM extras remain optional).
- [Changed] Frontend Docker `npm ci` and backend `pip install` read src manifests.
- [Changed] `.dockerignore` drops unused PinScope marketing blobs from the image.
## 2.56.0 — 2026-09-20 — Native taxonomy JSON and local skills overlay
Component taxonomy JSON and DeepSeek `skills/*/SKILL.md` (plus local `validate.py` / schema) live under `periscope/src`. `repo_paths` prefers src; Docker copies dependency then src; compose mounts `src/taxonomy`. Manifest `1.14.0`. App `favicon.ico` matches the Periscope mark. Auth/JWT, package.json, landing png/gif unchanged. Pad≠Via unchanged.
+1 -1
View File
@@ -7,7 +7,7 @@ ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
ARG NEXT_PUBLIC_AUTH_MODE
ENV NEXT_PUBLIC_AUTH_MODE=$NEXT_PUBLIC_AUTH_MODE
COPY periscope/dependency/frontend/package*.json ./
COPY periscope/src/frontend/package.json periscope/src/frontend/package-lock.json ./
RUN npm ci
COPY periscope/dependency/frontend/ ./
File diff suppressed because it is too large Load Diff
+43
View File
@@ -0,0 +1,43 @@
{
"name": "periscope-web",
"version": "2.57.0",
"private": true,
"scripts": {
"sync-version": "node scripts/sync-version.mjs",
"predev": "node scripts/sync-version.mjs",
"prebuild": "node scripts/sync-version.mjs",
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "eslint"
},
"dependencies": {
"@base-ui/react": "^1.3.0",
"@types/dagre": "^0.7.54",
"@xyflow/react": "^12.10.2",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"dagre": "^0.8.5",
"lucide-react": "^1.8.0",
"next": "16.2.3",
"next-themes": "^0.4.6",
"react": "19.2.4",
"react-dom": "19.2.4",
"react-markdown": "^10.1.0",
"react-pdf": "^10.4.1",
"shadcn": "^4.2.0",
"tailwind-merge": "^3.5.0",
"tw-animate-css": "^1.4.0",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "16.2.3",
"tailwindcss": "^4",
"typescript": "^5"
}
}
@@ -0,0 +1,18 @@
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="664.2135"
height="150.37209"
id="svg3361">
<defs
id="defs3363" />
<g
transform="translate(-16.464666,-437.17614)"
id="layer1">
<path
d="m 127.42714,438.17614 c -20.44972,0.74271 -37.638575,11.92912 -47.344393,28.94383 l -62.618081,116.69732 47.38449,-0.04 11.104486,-25.25569 35.438138,0 -1.363,25.29578 47.42457,0 -5.49211,-145.64114 -24.5341,0 z m 75.16575,0 -36.44036,145.64115 41.09061,0 36.56062,-145.64115 -41.21087,0 z m 60.65374,1.44319 -29.62532,117.41891 c -3.15651,11.84109 -2.20708,19.47656 2.80618,22.97065 4.46468,3.42658 12.95462,5.04904 25.49622,4.93087 7.22451,0 14.9718,-0.35023 23.25127,-1.04229 l 6.17362,-24.49401 -6.85512,0 c -6.84471,0.0844 -9.59593,-2.8103 -8.17803,-8.6591 l 13.1089,-52.59597 17.23802,0 6.13352,-24.73455 -17.11775,0 8.73928,-33.79451 -41.17079,0 z m -146.96406,30.22665 -3.36743,60.73392 -24.694449,0 28.061879,-60.73392 z m 471.68008,0.52115 c -15.07355,0 -26.79998,5.4961 -35.19762,16.47633 l -0.48106,0 3.28725,-13.4697 -41.53158,0 -27.70108,110.40344 41.21087,0 18.28031,-72.84062 c 2.26187,-8.84495 7.37188,-13.20386 15.31377,-13.06881 7.87436,-0.13505 10.62136,4.24707 8.25821,13.1089 l -18.28031,72.80053 41.09061,0 18.2803,-72.84062 c 2.30408,-8.84495 7.52169,-13.20386 15.67457,-13.06881 7.95033,-0.13505 10.68044,4.22386 8.25821,13.06881 l -18.20013,72.84062 18.16004,0 c 12.88763,0 25.1438,-8.52382 28.02179,-20.20455 l 15.83492,-63.09914 c 2.75982,-11.57101 1.54246,-19.60946 -3.64805,-24.13321 -5.3593,-4.05112 -12.89561,-6.02381 -22.60985,-5.97317 -6.54088,0 -12.93787,1.27855 -19.24243,3.76831 -6.524,2.59103 -12.29438,7.0069 -17.35828,13.26925 -1.01278,-5.72221 -3.6142,-10.01571 -7.81724,-12.86837 -4.279,-2.77671 -10.81735,-4.16919 -19.60322,-4.16919 z m -259.97326,3.0868 -27.58081,110.36336 41.05051,0 27.70109,-110.36336 -41.17079,0 z m 59.85198,0 -20.84597,83.38387 c -2.68387,11.52038 -1.29771,19.41957 4.12911,23.57198 5.08078,4.24523 12.34703,6.25168 21.80809,6.13352 14.98914,0 26.62063,-5.3252 34.91699,-16.03536 l 0.48106,0 -3.24716,13.34944 41.05052,0 27.58082,-110.40345 -41.1307,0 -18.28031,72.84062 c -2.27875,8.84495 -7.3993,13.23339 -15.43403,13.14899 -7.76466,0.0844 -10.46945,-4.30404 -8.09786,-13.14899 l 18.24022,-72.84062 -41.17078,0 z"
id="path278"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="100"
height="11"
viewBox="0 0 100 11"
fill="none"
version="1.1"
id="svg20"
sodipodi:docname="Autodesk_Logo_2021.svg"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title
id="title841">Autodesk logo</title>
<defs
id="defs24" />
<sodipodi:namedview
id="namedview22"
pagecolor="#ffffff"
bordercolor="#111111"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
showgrid="false"
width="100px"
height="11px"
inkscape:zoom="2.8183615"
inkscape:cx="125.42748"
inkscape:cy="-2.4837126"
inkscape:window-width="1366"
inkscape:window-height="746"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg20" />
<path
id="path2-1"
style="fill:#000000;stroke-width:0.296752"
d="m 54.504191,0.41597954 c -3.525698,0 -5.351957,2.16877246 -5.351957,5.08939746 0,2.9321968 1.826259,5.112582 5.351957,5.112579 3.537278,0 5.363544,-2.1803822 5.363544,-5.112579 0.0054,-2.920625 -1.826266,-5.08939746 -5.363544,-5.08939746 z m 30.563049,0 c -2.982345,0 -4.479086,1.18561256 -4.479086,3.28512686 0,1.7060221 0.994178,2.5097046 3.051548,2.7293003 l 2.288812,0.2434281 c 0.872746,0.098225 1.271625,0.4333787 1.271625,0.8728668 0,0.4973541 -0.583478,0.942995 -1.988,0.942995 -1.624116,0 -2.277541,-0.4109612 -2.387339,-1.238007 h -2.375166 c 0.109797,2.2324554 1.560273,3.3720664 4.675566,3.3720664 2.843469,0 4.432726,-1.2496001 4.432726,-3.1292201 0,-1.6365829 -0.94156,-2.6196485 -2.721769,-2.822033 L 84.582121,4.4180625 c -1.317874,-0.144517 -1.647204,-0.4743882 -1.647204,-0.9198126 0,-0.4973546 0.676088,-0.942416 1.999596,-0.942416 1.271582,0 1.936179,0.4745323 2.057548,1.1858441 h 2.422126 C 89.292518,1.6884566 87.575681,0.41597954 85.06724,0.41597954 Z M 29.755606,0.64723744 V 6.9282752 c 0,2.7989563 2.496536,3.6722948 4.588636,3.6722948 2.080821,0 4.566024,-0.8733385 4.566024,-3.6722948 V 0.64723744 H 36.436564 V 6.6448533 h 0.01161 c 0,1.260896 -0.774034,1.7694952 -2.09754,1.7694952 -1.283153,0 -2.121311,-0.5317461 -2.121311,-1.7694952 V 0.64723744 Z M 9.0004214,0.68201178 0.3482729,6.0600471 v 4.3202769 h 0.074775 L 9.098383,4.9791071 h 4.502271 c 0.138875,0 0.266028,0.109647 0.266028,0.2660354 0,0.127009 -0.05776,0.1793062 -0.126931,0.2196638 L 9.4797558,8.020806 C 9.2022887,8.188471 9.1041774,8.5180638 9.1041774,8.766741 l -0.00621,1.613583 H 14.513677 V 1.0175947 c 0,-0.17923705 -0.138574,-0.33558363 -0.346598,-0.33558363 z m 13.5305746,0 -3.716926,9.69889522 h 2.554841 l 0.64741,-1.8164438 h 4.149878 l 0.635812,1.8164438 h 2.641196 L 25.680495,0.68201208 Z m 17.512375,0 V 2.7812944 h 3.126898 v 7.5996126 h 2.4679 V 2.7812948 H 48.75348 V 0.68201208 Z m 21.170756,0 V 10.380907 h 4.531836 c 3.473762,0 4.432713,-1.2958946 4.432713,-4.9218961 0,-3.4064069 -0.918586,-4.77699912 -4.432713,-4.77699912 z m 10.346301,0 V 10.380907 h 7.802463 V 8.2810414 H 74.034122 V 6.5231422 h 4.288407 V 4.4180635 H 74.034122 V 2.7812948 h 5.328769 V 0.68201208 Z m 19.257526,0 0.01161,9.69889522 h 2.462678 V 6.6970171 l 3.340776,3.6838899 h 3.126888 L 95.251275,5.5923173 99.759904,0.68201208 H 96.817903 L 93.29224,4.620341 V 0.68201208 Z M 54.504191,2.5964075 c 1.843719,0 2.832466,1.1275738 2.832466,2.9089704 0.0054,1.8217553 -0.988747,2.9321552 -2.832466,2.9321552 -1.826506,0 -2.83189,-1.1163342 -2.83189,-2.9321552 0,-1.7813966 1.005384,-2.9089704 2.83189,-2.9089704 z m -30.395548,0.1043257 1.334803,3.7992237 h -2.693361 z m 39.573969,0.080563 h 1.964814 c 1.549048,0 2.011184,0.4221106 2.011184,2.6777164 0,2.0588589 -0.520007,2.8220306 -2.011184,2.8220306 h -1.964814 z" />
<metadata
id="metadata839">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>Autodesk logo</dc:title>
<dc:date>21 sep 2021</dc:date>
<cc:license
rdf:resource="http://scripts.sil.org/OFL" />
</cc:Work>
<cc:License
rdf:about="http://scripts.sil.org/OFL">
<cc:permits
rdf:resource="http://scripts.sil.org/pub/OFL/Reproduction" />
<cc:permits
rdf:resource="http://scripts.sil.org/pub/OFL/Distribution" />
<cc:permits
rdf:resource="http://scripts.sil.org/pub/OFL/Embedding" />
<cc:permits
rdf:resource="http://scripts.sil.org/pub/OFL/DerivativeWorks" />
<cc:requires
rdf:resource="http://scripts.sil.org/pub/OFL/Notice" />
<cc:requires
rdf:resource="http://scripts.sil.org/pub/OFL/Attribution" />
<cc:requires
rdf:resource="http://scripts.sil.org/pub/OFL/ShareAlike" />
<cc:requires
rdf:resource="http://scripts.sil.org/pub/OFL/DerivativeRenaming" />
<cc:requires
rdf:resource="http://scripts.sil.org/pub/OFL/BundlingWhenSelling" />
</cc:License>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 5.3 KiB

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="51.02mm" height="9.642mm" version="1.1" viewBox="0 0 51.02 9.642" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<title>Cadence Design Systems logo</title>
<desc>A software company based in San Jose, California, United States that specialised in EDA</desc>
<metadata>
<rdf:RDF>
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</rdf:RDF>
</metadata>
<g transform="translate(10.07 40.7)">
<path d="m-3.081-39.63h3.903v-1.074h-3.903z" style="fill:#d21c2e"/>
<g transform="matrix(.5857 0 0 -.5857 -6.335 -31.28)">
<path d="m0 0c-0.355-0.189-0.99-0.379-1.841-0.379-2.729 0-4.543 2.021-4.543 5.801 0 3.443 1.905 6.028 4.951 6.028 0.679 0 1.12-0.165 1.433-0.334v-2c-0.249 0.102-0.829 0.257-1.383 0.257-1.641 0-2.487-1.786-2.487-3.901 0-2.351 0.95-3.783 2.489-3.783 0.464 0 1.014 0.091 1.381 0.273v-1.962" style="fill:#231f20"/>
</g>
<g transform="matrix(.5857 0 0 -.5857 -.6332 -32.24)">
<path d="m0 0 1e-3 4.054c-0.98-0.013-2.759-0.284-2.759-2.285 0-1.299 0.692-1.768 1.246-1.768zm2.482 0.916c0-0.892 0.055-2.029 0.177-2.791h-4.931c-1.648 0-2.892 1.368-2.892 3.384 0 2.955 2.497 4.202 5.098 4.226v0.203c0 1.198-0.469 2.04-1.718 2.04-0.822 0-1.762-0.24-2.384-0.638v1.72c0.565 0.359 1.531 0.822 2.932 0.822 2.96 0 3.718-1.924 3.718-4.371v-4.595" style="fill:#231f20"/>
</g>
<g transform="matrix(.5857 0 0 -.5857 7.314 -32.25)">
<path d="m0 0h-1.468c-1.057 0-1.669 1.595-1.669 3.891 0 2.056 0.456 3.87 1.731 3.87 0.744 0 1.261-0.818 1.369-1.742 0.037-0.233 0.037-0.489 0.037-0.708zm2.511 0.901-5e-3 12.36h-2.506v-4.614h-0.048c-0.368 0.794-1.064 1.249-2.012 1.249-1.857 0-3.59-1.936-3.59-5.971 0-3.464 1.248-5.809 3.472-5.809l4.866-4e-3c-0.121 0.763-0.177 1.898-0.177 2.79" style="fill:#231f20"/>
</g>
<g transform="matrix(.5857 0 0 -.5857 15.23 -35.17)">
<path d="m0 0c0.019 1.845-0.586 2.941-1.48 2.941-1.095 0-1.588-1.593-1.638-2.941zm-3.129-1.794c0.027-2.57 1.22-3.268 2.562-3.268 0.84 0 1.73 0.189 2.241 0.408v-1.813c-0.717-0.338-1.647-0.541-2.698-0.541-2.964 0-4.555 2.15-4.555 5.709 0 3.803 1.823 6.118 4.278 6.118 2.418 0 3.636-2.185 3.636-5.267 0-0.656-0.026-1.026-0.066-1.341l-5.398-5e-3" style="fill:#231f20"/>
</g>
<g transform="matrix(.5857 0 0 -.5857 21.26 -36.74)">
<path d="m0 0v-9.564h-2.52v8.257c0 1.299-0.065 2.316-0.103 3.334h4.968c1.915 0 3.056-1.394 3.056-4.06v-7.531h-2.52v7.291c0 1.149-0.244 2.271-1.341 2.271l-1.54 2e-3" style="fill:#231f20"/>
</g>
<g transform="matrix(.5857 0 0 -.5857 31.3 -31.28)">
<path d="m0 0c-0.355-0.189-0.991-0.379-1.841-0.379-2.729 0-4.545 2.021-4.545 5.801 0 3.443 1.906 6.028 4.952 6.028 0.68 0 1.12-0.165 1.434-0.334v-2c-0.25 0.102-0.83 0.257-1.384 0.257-1.641 0-2.487-1.786-2.487-3.901 0-2.351 0.949-3.783 2.49-3.783 0.465 0 1.013 0.091 1.381 0.273v-1.962" style="fill:#231f20"/>
</g>
<g transform="matrix(.5857 0 0 -.5857 35.36 -35.17)">
<path d="m0 0c0.051 1.348 0.544 2.941 1.637 2.941 0.896 0 1.501-1.096 1.481-2.941zm5.452-0.448c0 3.083-1.217 5.267-3.635 5.267-2.454 0-4.279-2.315-4.279-6.118 0-3.559 1.591-5.709 4.555-5.709 1.053 0 1.983 0.203 2.699 0.541v1.813c-0.513-0.219-1.401-0.408-2.241-0.408-1.343 0-2.534 0.698-2.561 3.268l5.397 5e-3c0.04 0.315 0.065 0.685 0.065 1.341" style="fill:#231f20"/>
</g>
<g transform="matrix(.5857 0 0 -.5857 40.06 -40.42)">
<path d="m0 0c0.834 0 1.513-0.775 1.513-1.728 0-0.951-0.679-1.726-1.513-1.726-0.836 0-1.512 0.775-1.512 1.726 0 0.953 0.676 1.728 1.512 1.728zm5e-3 -3.196c0.696 0 1.219 0.641 1.219 1.468 0 0.829-0.523 1.469-1.219 1.469-0.704 0-1.228-0.64-1.228-1.469 0-0.827 0.524-1.468 1.228-1.468zm-0.584 2.483h0.68c0.406 0 0.608-0.186 0.608-0.569 0-0.326-0.181-0.559-0.459-0.559l0.504-0.895h-0.305l-0.496 0.895h-0.243v-0.895h-0.289zm0.289-0.87h0.343c0.224 0 0.366 0.052 0.366 0.315 0 0.23-0.18 0.297-0.366 0.297h-0.343v-0.612" style="fill:#231f20"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.2 KiB

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns="http://www.w3.org/2000/svg"
width="335.33405"
height="136.76263"
viewBox="0 0 335.33405 136.76263"
version="1.1">
<g transform="translate(-40.547253,-883.62366)" fill="#ffffff">
<!-- Rect with K, i, and orange-dot cut out via evenodd -->
<path
fill-rule="evenodd"
d="m 51.678648,901.97614 114.391972,0 c 0.51273,0 0.9255,0.43179 0.9255,0.96814 l 0,109.79552 c 0,0.5364 -0.41277,0.9682 -0.9255,0.9682 l -114.391972,0 c -0.512727,0 -0.925501,-0.4318 -0.925501,-0.9682 l 0,-109.79552 c 0,-0.53635 0.412774,-0.96814 0.925501,-0.96814 z M 80.269477,948.26032 l 16.927605,-21.41018 c 3.460178,-4.36453 5.190288,-7.62815 5.190348,-9.79088 -6e-5,-0.78633 -0.0984,-1.41546 -0.29491,-1.8874 l 29.54958,0 c -2.24136,1.25835 -5.0528,3.91251 -8.43431,7.96246 -0.90445,1.06175 -2.49694,3.00812 -4.77747,5.83914 l -22.176937,27.60321 26.482557,36.45038 c 1.61208,2.20197 3.65676,4.67918 6.13405,7.43165 0.66837,0.7078 1.63173,1.5532 2.89008,2.5362 l -30.31634,0 c 0.23587,-0.9044 0.35383,-1.7105 0.35389,-2.4183 -6e-5,-2.1626 -1.49425,-5.2886 -4.482575,-9.37797 l -17.045568,-23.23859 0,23.5335 c -3.2e-5,5.4656 1.100949,9.29936 3.302948,11.50136 l -27.721166,0 c 1.533502,-1.5335 2.516521,-3.28331 2.949061,-5.24935 0.235913,-1.10098 0.353875,-3.16532 0.353887,-6.19303 l 0,-64.9383 c -1.2e-5,-3.02763 -0.117974,-5.09197 -0.353887,-6.19303 -0.43254,-1.96596 -1.415559,-3.71573 -2.949061,-5.24933 l 27.721166,0 c -2.201999,2.20205 -3.30298,6.01617 -3.302948,11.44236 l 0,21.6461 z M 159.48123,938.46944 l 0,54.14474 c -3e-5,2.83111 0.0786,4.67918 0.23593,5.54423 0.31453,1.76944 1.14027,3.38159 2.47721,4.83649 l -25.95173,0 c 1.3369,-1.4549 2.16263,-3.06705 2.47721,-4.83649 0.15727,-0.86505 0.23591,-2.71312 0.23592,-5.54423 l 0,-43.88201 c -1e-5,-2.83104 -0.0787,-4.65946 -0.23592,-5.48526 -0.31458,-1.73005 -1.12065,-3.32254 -2.41823,-4.77747 l 23.17961,0 z M 149.2185,907.62227 c 3.26361,9e-5 6.03572,1.16006 8.31635,3.47989 2.3199,2.2807 3.47986,5.05281 3.47989,8.31635 -3e-5,3.34235 -1.14033,6.15378 -3.42091,8.43431 -2.24131,2.24136 -5.03308,3.362 -8.37533,3.36193 -3.26364,7e-5 -6.05541,-1.14023 -8.37533,-3.42091 -2.28061,-2.31985 -3.42092,-5.11162 -3.42091,-8.37533 -1e-5,-3.34218 1.12064,-6.13396 3.36193,-8.37533 2.28059,-2.28051 5.09203,-3.42082 8.43431,-3.42091 z M 161.16831,902.00507 c 0,6.60244 -5.36817,11.95472 -11.99015,11.95472 -6.62197,0 -11.99015,-5.35228 -11.99015,-11.95472 0,-6.60244 5.36818,-11.9548 11.99015,-11.9548 6.62198,0 11.99015,5.35236 11.99015,11.9548 z" />
<!-- C -->
<path
d="m 236.09782,999.10211 c -6.25207,3.53889 -13.25117,5.30829 -20.99731,5.30829 -12.30745,0 -22.11798,-4.56119 -29.43162,-13.68362 -6.80251,-8.45395 -10.20376,-18.99191 -10.20375,-31.61392 -1e-5,-14.15543 4.168,-25.40117 12.50402,-33.73725 7.70685,-7.70679 16.82926,-11.56023 27.36727,-11.56032 6.88109,9e-5 13.91951,2.00545 21.11527,6.01609 1.84801,1.02242 3.3422,1.59257 4.48258,1.71045 l -10.55764,15.33511 c -3.46029,-4.40385 -8.08048,-6.60582 -13.86058,-6.60589 -9.04382,7e-5 -14.94194,5.58362 -17.69436,16.75066 -0.90441,3.65689 -1.3566,7.68727 -1.35657,12.09115 -3e-5,12.50404 3.16529,21.03665 9.49597,25.59784 2.94902,2.12334 6.09468,3.185 9.437,3.18499 5.9767,1e-5 11.28501,-2.55584 15.92492,-7.66756 l 9.79088,16.04289 c -0.47192,-0.11796 -2.47728,0.82574 -6.01608,2.83109" />
<!-- a -->
<path
d="m 278.98304,984.88764 0,-10.20374 c -1.49423,-0.27522 -3.06706,-0.41284 -4.71849,-0.41287 -3.30298,3e-5 -6.13408,0.58984 -8.4933,1.76943 -2.9884,1.49422 -4.48259,3.7355 -4.48257,6.72386 -2e-5,2.2413 0.84537,4.0304 2.53619,5.36729 1.53349,1.21896 3.4602,1.82843 5.78016,1.82842 4.28593,1e-5 7.41193,-1.69078 9.37801,-5.07239 m 23.17962,18.10726 -21.99999,0 0,-5.01343 c -4.05008,4.12873 -9.26009,6.23233 -15.63002,6.31103 -4.52192,0.039 -8.63094,-0.9634 -12.32707,-3.0081 -3.89277,-2.16262 -6.72387,-5.22964 -8.4933,-9.20105 -1.25827,-2.83108 -1.8874,-6.03573 -1.8874,-9.61394 0,-8.17869 3.99106,-14.21443 11.97319,-18.10722 4.60051,-2.24125 11.04912,-3.36189 19.34583,-3.36193 1.17959,4e-5 3.22427,0.0787 6.13405,0.23592 -4e-5,-6.72381 -2.92944,-10.08573 -8.7882,-10.08578 -4.99377,5e-5 -10.24309,1.45492 -15.74798,4.3646 l -5.83914,-14.0965 c 1.29757,6e-5 3.83376,-0.47179 7.60857,-1.41555 l 8.02145,-2.00536 c 2.7131,-0.55043 5.66216,-0.82567 8.84718,-0.82574 12.58261,7e-5 20.48608,4.01078 23.71044,12.03217 1.57277,3.93213 2.35919,8.78824 2.35925,14.56835 l 0,28.84181 c -6e-5,2.83111 0.0786,4.67918 0.23592,5.54423 0.31451,1.76944 1.14024,3.38159 2.47722,4.83649" />
<!-- d -->
<path
d="m 347.28917,984.88764 0,-29.43162 c -2.59521,-2.20191 -5.48529,-3.30289 -8.67023,-3.30294 -6.92049,5e-5 -10.38072,6.7239 -10.38069,20.17157 -3e-5,10.85256 3.16529,16.27882 9.49597,16.27881 3.30291,10e-6 6.48789,-1.23859 9.55495,-3.71582 m -2.65415,-75.08307 23.17961,0 0,82.80961 c -6e-5,4.91511 0.90431,8.37532 2.71314,10.38072 l -22.05897,0 0,-5.01343 c -4.28601,4.20733 -9.7516,6.31103 -16.39678,6.31103 -5.6229,0 -10.49867,-1.6908 -14.62733,-5.07242 -3.89278,-3.18498 -6.74353,-7.52993 -8.55228,-13.03485 -1.25827,-3.85342 -1.8874,-8.13938 -1.8874,-12.8579 0,-15.64964 3.99106,-26.34488 11.97319,-32.08578 3.77477,-2.71307 8.11972,-4.06963 13.03484,-4.0697 6.4879,7e-5 11.57994,1.74984 15.27613,5.24933 l 0,-22.35388 c -4e-5,-2.83101 -0.0787,-4.65943 -0.23592,-5.48525 -0.31461,-1.73002 -1.12069,-3.32252 -2.41823,-4.77748" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="250px" height="100px" viewBox="0 0 250 100" enable-background="new 0 0 250 100" xml:space="preserve">
<rect display="none" fill="none" width="1368" height="1008"/>
<g>
<g>
<path fill="#231F20" d="M86.231,72.341c-0.185-0.096-0.495-0.272-1.05-0.272c-0.813,0-1.33,0.604-1.33,1.565
c0,0.928,0.583,1.553,1.353,1.553c0.591,0,0.938-0.205,1.057-0.25l0.044,0.993c-0.207,0.062-0.637,0.17-1.293,0.17
c-1.413,0-2.405-0.973-2.405-2.48c0-1.743,1.272-2.439,2.322-2.439c0.768,0,1.16,0.16,1.359,0.233L86.231,72.341z"/>
<path fill="#231F20" d="M91.178,74.955H89.56l-0.354,1.062h-1.171l1.717-4.753h1.33l1.656,4.753h-1.242L91.178,74.955z
M90.408,72.178h-0.016l-0.613,1.974h1.162L90.408,72.178z"/>
<path fill="#231F20" d="M94.749,71.264h1.833c1.161,0,2.306,0.627,2.306,2.417c0,1.643-1.159,2.336-2.461,2.336h-1.678V71.264
L94.749,71.264z M95.961,75.187h0.383c0.88,0,1.272-0.64,1.272-1.506c0-0.98-0.406-1.585-1.346-1.585H95.96L95.961,75.187
L95.961,75.187z"/>
<polygon fill="#231F20" points="101.012,71.264 103.99,71.264 103.99,72.096 102.18,72.096 102.18,73.158 103.904,73.158
103.904,73.988 102.18,73.988 102.18,75.187 104.08,75.187 104.08,76.017 101.012,76.017 "/>
<polygon fill="#231F20" points="106.305,71.264 107.726,71.264 109.227,74.562 109.242,74.562 109.242,71.264 110.305,71.264
110.305,76.017 108.872,76.017 107.383,72.579 107.371,72.579 107.371,76.017 106.305,76.017 "/>
<path fill="#231F20" d="M116.213,72.341c-0.185-0.096-0.494-0.272-1.048-0.272c-0.814,0-1.332,0.604-1.332,1.565
c0,0.928,0.584,1.553,1.354,1.553c0.592,0,0.939-0.205,1.057-0.25l0.045,0.993c-0.208,0.062-0.637,0.17-1.295,0.17
c-1.412,0-2.403-0.973-2.403-2.48c0-1.743,1.273-2.439,2.321-2.439c0.77,0,1.162,0.16,1.361,0.233L116.213,72.341z"/>
<polygon fill="#231F20" points="118.315,71.264 121.295,71.264 121.295,72.096 119.483,72.096 119.483,73.158 121.204,73.158
121.204,73.988 119.483,73.988 119.483,75.187 121.385,75.187 121.385,76.017 118.315,76.017 "/>
<path fill="#231F20" d="M127.031,71.264h1.651c1.099,0,1.764,0.484,1.764,1.511c0,0.812-0.486,1.508-1.616,1.508h-0.586v1.734
h-1.213V71.264L127.031,71.264z M128.584,73.45c0.376,0,0.651-0.239,0.651-0.68c0-0.472-0.237-0.677-0.718-0.677h-0.318v1.356
H128.584L128.584,73.45z"/>
<path fill="#231F20" d="M136.1,72.341c-0.188-0.096-0.499-0.272-1.052-0.272c-0.814,0-1.331,0.604-1.331,1.565
c0,0.928,0.584,1.553,1.352,1.553c0.593,0,0.941-0.205,1.059-0.25l0.043,0.993c-0.208,0.062-0.638,0.17-1.292,0.17
c-1.414,0-2.405-0.973-2.405-2.48c0-1.743,1.271-2.439,2.321-2.439c0.77,0,1.161,0.16,1.36,0.233L136.1,72.341z"/>
<path fill="#231F20" d="M138.346,71.264h1.921c1.088,0,1.428,0.677,1.428,1.186c0,0.756-0.637,1.057-0.932,1.088v0.017
c0.584,0.106,1.036,0.401,1.036,1.151c0,1.202-1.294,1.312-1.598,1.312h-1.854L138.346,71.264L138.346,71.264z M139.514,73.2
h0.294c0.695,0,0.717-0.5,0.717-0.587c0-0.17-0.105-0.573-0.693-0.573h-0.317V73.2L139.514,73.2z M139.514,75.213h0.34
c0.16,0,0.774,0,0.774-0.612c0-0.416-0.251-0.627-0.651-0.627h-0.463V75.213L139.514,75.213z"/>
<path fill="#231F20" d="M150.279,72.232c-0.288-0.139-0.695-0.246-1.022-0.246c-0.39,0-0.685,0.162-0.685,0.517
c0,0.864,2.033,0.464,2.033,2.154c0,0.896-0.777,1.44-1.804,1.44c-0.628,0-1.17-0.135-1.392-0.197l0.066-0.927
c0.363,0.13,0.681,0.291,1.132,0.291c0.383,0,0.754-0.178,0.754-0.562c0-0.92-2.032-0.471-2.032-2.167
c0-0.144,0.057-1.356,1.788-1.356c0.477,0,0.771,0.077,1.214,0.164L150.279,72.232z"/>
<path fill="#231F20" d="M154.96,71.184c1.485,0,2.194,1.062,2.194,2.457c0,1.397-0.709,2.457-2.194,2.457
c-1.484,0-2.189-1.062-2.189-2.457C152.77,72.245,153.475,71.184,154.96,71.184 M154.96,75.297c0.703,0,0.952-0.744,0.952-1.656
c0-0.913-0.249-1.654-0.952-1.654c-0.702,0-0.948,0.741-0.948,1.654C154.012,74.553,154.257,75.297,154.96,75.297"/>
<polygon fill="#231F20" points="159.462,71.264 160.675,71.264 160.675,75.16 162.383,75.16 162.383,76.017 159.462,76.017 "/>
<path fill="#231F20" d="M164.444,71.264h1.215v3.206c0,0.477,0.192,0.771,0.681,0.771c0.487,0,0.68-0.292,0.68-0.771v-3.206h1.215
v3.028c0,1.179-0.732,1.806-1.894,1.806c-1.163,0-1.894-0.627-1.894-1.806v-3.028H164.444z"/>
<polygon fill="#231F20" points="171.389,72.123 170.267,72.123 170.267,71.264 173.726,71.264 173.726,72.123 172.601,72.123
172.601,76.017 171.389,76.017 "/>
<rect x="175.812" y="71.264" fill="#231F20" width="1.213" height="4.753"/>
<path fill="#231F20" d="M181.518,71.184c1.485,0,2.196,1.062,2.196,2.457c0,1.397-0.711,2.457-2.196,2.457
s-2.188-1.062-2.188-2.457S180.032,71.184,181.518,71.184 M181.518,75.297c0.701,0,0.954-0.744,0.954-1.656
c0-0.913-0.253-1.654-0.954-1.654s-0.944,0.741-0.944,1.654C180.574,74.553,180.816,75.297,181.518,75.297"/>
<polygon fill="#231F20" points="185.999,71.264 187.419,71.264 188.92,74.562 188.936,74.562 188.936,71.264 190.001,71.264
190.001,76.017 188.565,76.017 187.079,72.579 187.066,72.579 187.066,76.017 185.999,76.017 "/>
<path fill="#231F20" d="M195.242,72.232c-0.287-0.139-0.695-0.246-1.021-0.246c-0.392,0-0.687,0.162-0.687,0.517
c0,0.864,2.033,0.464,2.033,2.154c0,0.896-0.776,1.44-1.803,1.44c-0.63,0-1.17-0.135-1.394-0.197l0.068-0.927
c0.36,0.13,0.679,0.291,1.13,0.291c0.384,0,0.754-0.178,0.754-0.562c0-0.92-2.034-0.471-2.034-2.167
c0-0.144,0.061-1.356,1.791-1.356c0.471,0,0.769,0.077,1.212,0.164L195.242,72.232z"/>
</g>
<g>
<g>
<path fill="#E31837" d="M58.978,23.971c11.006,0,16.192,9.015,16.089,18.919c-0.104,11.215-5.555,18.918-16.089,18.918
c-10.533,0-15.983-7.703-16.089-18.918C42.785,32.985,47.971,23.971,58.978,23.971z M46.504,42.89
c0,7.755,3.876,15.773,12.474,15.773c8.595,0,12.471-8.019,12.471-15.773c0-7.758-3.875-15.774-12.471-15.774
S46.504,35.132,46.504,42.89z"/>
<path fill="#E31837" d="M82.559,40.429c0-2.938,0-4.039-0.209-5.977h3.303v5.138h0.105c1.204-2.988,3.458-5.766,6.865-5.766
c0.786,0,1.729,0.157,2.306,0.313v3.461c-0.684-0.21-1.572-0.316-2.411-0.316c-5.239,0-6.654,5.868-6.654,10.692v13.207h-3.302
V40.429H82.559z"/>
<path fill="#E31837" d="M126.006,28.688c-2.309-1.207-5.609-1.572-8.176-1.572c-9.487,0-14.833,6.709-14.833,15.774
c0,9.224,5.189,15.775,14.833,15.775c2.409,0,6.077-0.313,8.176-1.572l0.205,3.145c-1.991,1.205-6.076,1.57-8.381,1.57
c-11.532,0-18.449-7.598-18.449-18.918c0-11.109,7.128-18.919,18.449-18.919c2.147,0,6.498,0.366,8.381,1.363L126.006,28.688z"/>
<path fill="#E31837" d="M146.998,24.6h4.087l14.514,36.582h-3.772l-3.93-9.802h-18.447l-3.93,9.802h-3.51L146.998,24.6z
M148.779,28.061l-7.967,20.175h15.88L148.779,28.061z"/>
<path fill="#E31837" d="M171.544,24.6h9.065c13.104,0,18.291,7.547,18.291,18.239c0,13.258-8.855,18.343-20.963,18.343h-6.393
L171.544,24.6L171.544,24.6z M175.161,58.034h2.986c10.375,0,17.138-4.192,17.138-15.406c0-11.162-6.655-14.883-14.832-14.883
h-5.292V58.034L175.161,58.034z"/>
</g>
<path d="M201.269,24.446h-0.989V23.9h2.574v0.546h-0.993v2.679h-0.592V24.446L201.269,24.446z M203.611,23.901h0.917l0.843,2.182
l0.825-2.182h0.917v3.226h-0.589v-2.464h-0.013l-0.909,2.464h-0.481l-0.905-2.464h-0.014v2.464h-0.591V23.901L203.611,23.901z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.3 KiB

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Creator: CorelDRAW -->
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="210mm" height="50mm" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
viewBox="0 0 210 50">
<defs>
<style type="text/css">
<![CDATA[
.fil0 {fill:#009999}
]]>
</style>
</defs>
<g id="Ebene_x0020_1">
<metadata id="CorelCorpID_0Corel-Layer"/>
<path class="fil0" d="M200.121 10.3466l0 5.8289c-3.0198,-1.14 -5.7084,-1.7164 -8.0615,-1.7164 -1.3938,0 -2.5037,0.2581 -3.3382,0.7571 -0.8346,0.5033 -1.2605,1.1228 -1.2605,1.8541 0,0.9722 0.9421,1.8368 2.8392,2.6112l5.4805 2.6671c4.4309,2.1122 6.6291,4.9169 6.6291,8.4401 0,2.9295 -1.1658,5.2654 -3.5189,6.9947 -2.3359,1.7466 -5.4805,2.6112 -9.3951,2.6112 -1.8068,0 -3.4285,-0.0774 -4.8696,-0.2409 -1.4411,-0.1548 -3.0973,-0.4732 -4.9342,-0.9292l0 -6.0999c3.3683,1.14 6.4355,1.7164 9.1972,1.7164 3.2952,0 4.9342,-0.955 4.9342,-2.8822 0,-0.9593 -0.6711,-1.7336 -2.0347,-2.3402l-6.0871 -2.594c-2.2455,-1.0152 -3.9146,-2.2455 -5.0073,-3.7038 -1.0754,-1.4712 -1.6218,-3.1575 -1.6218,-5.0847 0,-2.6973 1.1357,-4.8697 3.3812,-6.5216 2.2628,-1.639 5.2655,-2.4606 8.9994,-2.4606 1.2131,0 2.6112,0.1075 4.1599,0.3054 1.5615,0.2108 3.0628,0.4689 4.5082,0.7873z"/>
<path class="fil0" d="M27.7222 10.3466l0 5.8289c-3.0199,-1.14 -5.7042,-1.7164 -8.0573,-1.7164 -1.3981,0 -2.5036,0.2581 -3.3382,0.7571 -0.8345,0.5033 -1.2604,1.1228 -1.2604,1.8541 0,0.9722 0.955,1.8368 2.8521,2.6112l5.4805 2.6671c4.4136,2.1122 6.6162,4.9169 6.6162,8.4401 0,2.9295 -1.1701,5.2654 -3.506,6.9947 -2.3531,1.7466 -5.4805,2.6112 -9.408,2.6112 -1.8068,0 -3.4329,-0.0774 -4.874,-0.2409 -1.4411,-0.1548 -3.0801,-0.4732 -4.9298,-0.9292l0 -6.0999c3.3812,1.14 6.4484,1.7164 9.1929,1.7164 3.2952,0 4.9342,-0.955 4.9342,-2.8822 0,-0.9593 -0.6668,-1.7336 -2.0176,-2.3402l-6.087 -2.594c-2.2628,-1.0152 -3.9319,-2.2455 -5.0073,-3.7038 -1.0927,-1.4712 -1.6261,-3.1575 -1.6261,-5.0847 0,-2.6973 1.1271,-4.8697 3.3855,-6.5216 2.2456,-1.639 5.2525,-2.4606 8.9865,-2.4606 1.226,0 2.6069,0.1075 4.1727,0.3054 1.5487,0.2108 3.05,0.4689 4.4911,0.7873z"/>
<polygon class="fil0" points="34.0028,9.8002 42.9291,9.8002 42.9291,39.8483 34.0028,39.8483 "/>
<polygon class="fil0" points="71.6866,9.8002 71.6866,15.3539 58.4241,15.3539 58.4241,22.0173 69.9272,22.0173 69.9272,27.0246 58.4241,27.0246 58.4241,34.0194 71.9576,34.0194 71.9576,39.8483 49.8335,39.8483 49.8335,9.8002 "/>
<polygon class="fil0" points="113.358,9.8002 113.358,39.8483 105.025,39.8483 105.025,20.0299 96.3789,40.1236 91.234,40.1236 82.9186,20.0299 82.9186,39.8483 76.8918,39.8483 76.8918,9.8002 87.7882,9.8002 95.226,28.1947 103.008,9.8002 "/>
<polygon class="fil0" points="142.103,9.8002 142.103,15.3539 128.913,15.3539 128.913,22.0173 140.416,22.0173 140.416,27.0246 128.913,27.0246 128.913,34.0194 142.374,34.0194 142.374,39.8483 120.25,39.8483 120.25,9.8002 "/>
<polygon class="fil0" points="173.424,9.8002 173.424,39.8483 163.956,39.8483 153.331,20.5762 153.331,39.8483 147.308,39.8483 147.308,9.8002 157.052,9.8002 167.402,28.7411 167.402,9.8002 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

@@ -0,0 +1,122 @@
*PADS-PCB*
*PART*
MH2 MountingHole:MountingHole_2.2mm_M2_Pad_Via
FM2 Fiducial:Fiducial_1mm_Mask2mm
C12 Capacitor_SMD:C_0603_1608Metric
C9 Capacitor_SMD:C_0603_1608Metric
FM3 Fiducial:Fiducial_1mm_Mask2mm
C6 Capacitor_SMD:C_0603_1608Metric
R2 Resistor_SMD:R_0603_1608Metric
C11 Capacitor_SMD:C_0603_1608Metric
J1 Connector_USB:USB_C_Receptacle_GCT_USB4085
J3 Connector_PinHeader_2.54mm:PinHeader_2x05_P2.54mm_Horizontal
MH4 MountingHole:MountingHole_2.2mm_M2_Pad_Via
U3 Package_QFP:LQFP-48_7x7mm_P0.5mm
R8 Resistor_SMD:R_0603_1608Metric
J2 Connector:Tag-Connect_TC2030-IDC-FP_2x03_P1.27mm_Vertical
R6 Resistor_SMD:R_0603_1608Metric
R4 Resistor_SMD:R_0603_1608Metric
R7 Resistor_SMD:R_0603_1608Metric
C4 Capacitor_SMD:C_0805_2012Metric
C10 Capacitor_SMD:C_0603_1608Metric
C3 Capacitor_SMD:C_0805_2012Metric
FM1 Fiducial:Fiducial_1mm_Mask2mm
X1 Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm
R3 Resistor_SMD:R_0603_1608Metric
MH1 MountingHole:MountingHole_2.2mm_M2_Pad_Via
D1 Package_TO_SOT_SMD:SOT-23-6
C1 Capacitor_SMD:C_0603_1608Metric
U2 Package_SO:MSOP-10_3x3mm_P0.5mm
C2 Capacitor_SMD:C_0603_1608Metric
C5 Capacitor_SMD:C_0603_1608Metric
C8 Capacitor_SMD:C_0603_1608Metric
R1 Resistor_SMD:R_0603_1608Metric
D3 LED_SMD:LED_0603_1608Metric
U1 Package_TO_SOT_SMD:SOT-23-5
C7 Capacitor_SMD:C_0805_2012Metric
R5 Resistor_SMD:R_0603_1608Metric
D2 LED_SMD:LED_0603_1608Metric
MH3 MountingHole:MountingHole_2.2mm_M2_Pad_Via
*NET*
*SIGNAL* +1V35
C8.1 U3.48
*SIGNAL* +3V3
C4.1 C7.1 J2.1 J3.6 R8.1 U1.5 U3.6
*SIGNAL* +5V
C2.1 C3.1 C5.1 R3.2 U1.1 U1.3 U2.7
*SIGNAL* +VUSB
C1.1 D1.5 J1.A4 J1.A9 J1.B4 J1.B9 R3.1
*SIGNAL* /HFXIN
C9.1 U3.11 X1.1
*SIGNAL* /HFXOUT
C10.1 U3.12 X1.3
*SIGNAL* /I2C0.SCL
J3.10 U3.19
*SIGNAL* /I2C0.SDA
J3.8 U3.18
*SIGNAL* /LEDGK
D3.1 R7.1
*SIGNAL* /LEDRK
D2.1 R6.1
*SIGNAL* /NRST
C12.1 J2.3 R8.2 U3.4
*SIGNAL* /ROSC
R4.1 U3.8
*SIGNAL* /SPI0.CLK
J3.1 U3.37
*SIGNAL* /SPI0.CS0
J3.4 U3.16
*SIGNAL* /SPI0.MISO
J3.2 U3.38
*SIGNAL* /SPI0.MOSI
J3.3 U3.36
*SIGNAL* /SWCLK
J2.4 U3.35
*SIGNAL* /SWDIO
J2.2 U3.34
*SIGNAL* /TIMA0.CCP0
J3.7 U3.24
*SIGNAL* /TIMA0.CCP1
J3.9 U3.23
*SIGNAL* /TIMA1.CCP0
D2.2 U3.14
*SIGNAL* /TIMA1.CCP1
D3.2 U3.15
*SIGNAL* /UART0.NCTS
U2.4 U3.29
*SIGNAL* /UART0.NRTS
U2.5 U3.30
*SIGNAL* /UART0.RX
U2.8 U3.2
*SIGNAL* /UART0.TX
U2.9 U3.1
*SIGNAL* /UARTV3
C6.1 U2.10
*SIGNAL* /USB.D+
D1.3 U2.1
*SIGNAL* /USB.D-
D1.1 U2.2
*SIGNAL* /USBC.CC1
J1.A5 R2.1
*SIGNAL* /USBC.CC2
J1.B5 R1.1
*SIGNAL* /USBC.D+
D1.4 J1.A6 J1.B6
*SIGNAL* /USBC.D-
D1.6 J1.A7 J1.B7
*SIGNAL* /VREF+
C11.2 U3.43
*SIGNAL* /VREF-
C11.1 R5.1 U3.39
*SIGNAL* GND
C1.2 C10.2 C12.2 C2.2 C3.2 C4.2 C5.2
C6.2 C7.2 C8.2 C9.2 D1.2 J1.A1
J1.A12 J1.B1 J1.B12 J1.S1 J2.5 J3.5
MH1.1 MH2.1 MH3.1 MH4.1 R1.2 R2.2
R4.2 R5.2 R6.2 R7.2 U1.2 U2.3
U3.7 X1.2 X1.4
*END*
@@ -0,0 +1,17 @@
"Reference","Qty","Value","Footprint","Datasheet","LCSC","Manufacturer Part Number"
"C1,C2,C5,C6,C8,C11,C12","7","470n","Capacitor_SMD:C_0603_1608Metric","","C1623","CL10B474KA8NNNC"
"C3,C4,C7","3","10u","Capacitor_SMD:C_0805_2012Metric","","C15850","CL21A106KAYNNNE"
"C9,C10","2","18p","Capacitor_SMD:C_0603_1608Metric","","C1647","CL10C180JB8NNNC"
"D1","1","USBLC6-2SC6","Package_TO_SOT_SMD:SOT-23-6","https://www.st.com/resource/en/datasheet/usblc6-2.pdf","C7519","USBLC6-2SC6"
"D2","1","RED","LED_SMD:LED_0603_1608Metric","","C2286","KT-0603R"
"D3","1","WHITE","LED_SMD:LED_0603_1608Metric","","C2290","KT-0603W"
"J1","1","USB4085-GF-A","Connector_USB:USB_C_Receptacle_GCT_USB4085","https://www.usb.org/sites/default/files/documents/usb_type-c.zip","C7095263","USB4085-GF-A"
"J3","1","PH-00834","Connector_PinHeader_2.54mm:PinHeader_2x05_P2.54mm_Horizontal","","C2685185","PH-00834"
"R1,R2,R8","3","5k1","Resistor_SMD:R_0603_1608Metric","","C23186","0603WAF5101T5E"
"R3,R5","2","0R","Resistor_SMD:R_0603_1608Metric","","C21189","0603WAF0000T5E"
"R4","1","100k","Resistor_SMD:R_0603_1608Metric","","C25803","0603WAF1003T5E"
"R6,R7","2","1k","Resistor_SMD:R_0603_1608Metric","","C21190","0603WAF1001T5E"
"U1","1","SPX3819M5-L-3-3","Package_TO_SOT_SMD:SOT-23-5","https://www.exar.com/content/document.ashx?id=22106&languageid=1033&type=Datasheet&partnumber=SPX3819&filename=SPX3819.pdf&part=SPX3819","C9055","SPX3819M5-L-3-3/TR"
"U2","1","CH340E","Package_SO:MSOP-10_3x3mm_P0.5mm","https://www.mpja.com/download/35227cpdata.pdf","C99652","CH340E"
"U3","1","MSPM0G3507SPTR","Package_QFP:LQFP-48_7x7mm_P0.5mm","https://www.ti.com/lit/ds/symlink/mspm0g3507.pdf?ts=1747484513194&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FMSPM0G3507","C22362630","MSPM0G3507SPTR"
"X1","1","8MHz","Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm","","C189764","AV08000301"
1 Reference Qty Value Footprint Datasheet LCSC Manufacturer Part Number
2 C1,C2,C5,C6,C8,C11,C12 7 470n Capacitor_SMD:C_0603_1608Metric C1623 CL10B474KA8NNNC
3 C3,C4,C7 3 10u Capacitor_SMD:C_0805_2012Metric C15850 CL21A106KAYNNNE
4 C9,C10 2 18p Capacitor_SMD:C_0603_1608Metric C1647 CL10C180JB8NNNC
5 D1 1 USBLC6-2SC6 Package_TO_SOT_SMD:SOT-23-6 https://www.st.com/resource/en/datasheet/usblc6-2.pdf C7519 USBLC6-2SC6
6 D2 1 RED LED_SMD:LED_0603_1608Metric C2286 KT-0603R
7 D3 1 WHITE LED_SMD:LED_0603_1608Metric C2290 KT-0603W
8 J1 1 USB4085-GF-A Connector_USB:USB_C_Receptacle_GCT_USB4085 https://www.usb.org/sites/default/files/documents/usb_type-c.zip C7095263 USB4085-GF-A
9 J3 1 PH-00834 Connector_PinHeader_2.54mm:PinHeader_2x05_P2.54mm_Horizontal C2685185 PH-00834
10 R1,R2,R8 3 5k1 Resistor_SMD:R_0603_1608Metric C23186 0603WAF5101T5E
11 R3,R5 2 0R Resistor_SMD:R_0603_1608Metric C21189 0603WAF0000T5E
12 R4 1 100k Resistor_SMD:R_0603_1608Metric C25803 0603WAF1003T5E
13 R6,R7 2 1k Resistor_SMD:R_0603_1608Metric C21190 0603WAF1001T5E
14 U1 1 SPX3819M5-L-3-3 Package_TO_SOT_SMD:SOT-23-5 https://www.exar.com/content/document.ashx?id=22106&languageid=1033&type=Datasheet&partnumber=SPX3819&filename=SPX3819.pdf&part=SPX3819 C9055 SPX3819M5-L-3-3/TR
15 U2 1 CH340E Package_SO:MSOP-10_3x3mm_P0.5mm https://www.mpja.com/download/35227cpdata.pdf C99652 CH340E
16 U3 1 MSPM0G3507SPTR Package_QFP:LQFP-48_7x7mm_P0.5mm https://www.ti.com/lit/ds/symlink/mspm0g3507.pdf?ts=1747484513194&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FMSPM0G3507 C22362630 MSPM0G3507SPTR
17 X1 1 8MHz Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm C189764 AV08000301
@@ -28,9 +28,9 @@ def test_legal_pages_are_operator_not_faradworks_controller():
assert "This Service is **not** operated by Faradworks, Inc." in terms
def test_changelog_stamp_is_2_56_0_and_src_wins():
def test_changelog_stamp_is_2_57_0_and_src_wins():
text = (SRC / "changelog.md").read_text(encoding="utf-8")
assert "## 2.56.0 — 2026-09-20" in text
assert "## 2.57.0 — 2026-09-20" in text
first = changelog_paths()[0]
assert first.parts[-3:] == ("src", "frontend", "content") or first.name == "changelog.md"
assert first == SRC / "changelog.md"
@@ -0,0 +1,60 @@
"""Native frontend package.json and backend requirements live under src."""
from __future__ import annotations
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
PKG = ROOT / "periscope" / "src" / "frontend" / "package.json"
REQ = ROOT / "periscope" / "src" / "backend" / "requirements.txt"
LOCK = ROOT / "periscope" / "src" / "frontend" / "package-lock.json"
COMPONENTS = ROOT / "periscope" / "src" / "frontend" / "components.json"
FE_DOCKER = ROOT / "periscope" / "src" / "frontend" / "dockerfile"
BE_DOCKER = ROOT / "periscope" / "src" / "backend" / "Dockerfile"
DOCKERIGNORE = ROOT / ".dockerignore"
def test_package_json_is_periscope_web():
text = PKG.read_text(encoding="utf-8")
assert '"name": "periscope-web"' in text
assert '"version": "2.57.0"' in text
assert "Native Periscope overlay" not in text[:400]
assert LOCK.is_file()
lock = LOCK.read_text(encoding="utf-8")
assert '"name": "periscope-web"' in lock
def test_components_json_is_src():
text = COMPONENTS.read_text(encoding="utf-8")
assert "base-nova" in text
assert '"css": "src/app/globals.css"' in text
def test_requirements_are_src_and_deepseek_first():
text = REQ.read_text(encoding="utf-8")
assert "fastapi>=" in text
assert "openai>=" in text
assert "PyJWT" in text
lines = [ln.strip() for ln in text.splitlines() if ln.strip() and not ln.startswith("#")]
assert lines[0].startswith("fastapi")
def test_docker_installs_from_src():
fe = FE_DOCKER.read_text(encoding="utf-8")
be = BE_DOCKER.read_text(encoding="utf-8")
assert "COPY periscope/src/frontend/package.json" in fe
assert "periscope/src/frontend/package-lock.json" in fe
assert "COPY periscope/src/backend/requirements*.txt" in be
ignore = DOCKERIGNORE.read_text(encoding="utf-8")
assert "faradworks-logo-white.png" in ignore
assert "power-tree.gif" in ignore
assert "next.svg" in ignore
def test_eda_logos_and_examples_are_src():
logos = ROOT / "periscope" / "src" / "frontend" / "public" / "eda-logos"
examples = ROOT / "periscope" / "src" / "frontend" / "public" / "examples"
assert (logos / "kicad.svg").is_file()
assert (examples / "TI-MSP-KICAD9-TUTORIAL.asc").is_file()
assert not (ROOT / "periscope" / "src" / "frontend" / "public" / "faradworks-logo-white.png").exists()
assert not (ROOT / "periscope" / "src" / "frontend" / "public" / "power-tree.gif").exists()