{"_id":"@demo-charts/renderer-3d","_rev":"5-9163340ef1d05162fbf0d050ed5ec8bd","name":"@demo-charts/renderer-3d","dist-tags":{"latest":"0.1.34"},"versions":{"0.1.26":{"name":"@demo-charts/renderer-3d","version":"0.1.26","license":"MIT","_id":"@demo-charts/renderer-3d@0.1.26","maintainers":[{"name":"rm_charts","email":"dpandav@ruggedmonitoring.com"}],"dist":{"shasum":"cb53496404cc7d92cef7d751d3aaf2c57f9c8d74","tarball":"https://registry.npmjs.org/@demo-charts/renderer-3d/-/renderer-3d-0.1.26.tgz","fileCount":4,"integrity":"sha512-EjFpBMElNFziYP0hNECvsA5MB0r63Buq0Al5JwgiQwnoQAo0UmZJwqyxrmS/eP4oGxdQfnNBPW4l13pCMnAUwQ==","signatures":[{"sig":"MEUCIFgaLiBVguvYy/lB7RynIuEiC3k4UcQFugt9Zk7q/HsfAiEA11jNJpJR5klDDxgO/4qzorjHlj0QMmQxrjL6WrGssNA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189125},"main":"./dist/index.js","type":"module","_from":"file:demo-charts-renderer-3d-0.1.26.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"vitest run --passWithNoTests","build":"tsup","clean":"rm -rf dist"},"_npmUser":{"name":"rm_charts","email":"dpandav@ruggedmonitoring.com"},"_resolved":"C:\\Users\\dpandav\\AppData\\Local\\Temp\\05d19c1d5795dae697355b5322b75f2b\\demo-charts-renderer-3d-0.1.26.tgz","_integrity":"sha512-EjFpBMElNFziYP0hNECvsA5MB0r63Buq0Al5JwgiQwnoQAo0UmZJwqyxrmS/eP4oGxdQfnNBPW4l13pCMnAUwQ==","_npmVersion":"11.11.0","description":"Standalone 3D renderer and chart primitives","directories":{},"_nodeVersion":"24.14.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.2.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/renderer-3d_0.1.26_1779038301475_0.001357843384862667","host":"s3://npm-registry-packages-npm-production"}},"0.1.31":{"name":"@demo-charts/renderer-3d","version":"0.1.31","license":"MIT","_id":"@demo-charts/renderer-3d@0.1.31","maintainers":[{"name":"rm_charts","email":"dpandav@ruggedmonitoring.com"}],"dist":{"shasum":"ee3d0f137abd77704b500375912ac28d35ec664c","tarball":"https://registry.npmjs.org/@demo-charts/renderer-3d/-/renderer-3d-0.1.31.tgz","fileCount":5,"integrity":"sha512-BJlFWm9yYnjiC2ZD8kViRpAbfnV44ZculdmDkxZ9OoJKPVuQn6yg1pPKJh/0DSYlv75oowwGVdVg5U5TDuIzhg==","signatures":[{"sig":"MEUCIQD7f/Qs8G9Zp/FY6nl4kzYtiajMNp1rnO/qUQqP62YqBgIgL7rnJDTINR+FFu27kuU94d3WGzrY5u0x+0j1XSrn6Ig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":759252},"main":"./dist/index.js","type":"module","_from":"file:demo-charts-renderer-3d-0.1.31.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"vitest run --passWithNoTests","build":"tsup","clean":"rm -rf dist"},"_npmUser":{"name":"rm_charts","email":"dpandav@ruggedmonitoring.com"},"_resolved":"C:\\Users\\dpandav\\AppData\\Local\\Temp\\ee67b186ef207beab399a69ca8919394\\demo-charts-renderer-3d-0.1.31.tgz","_integrity":"sha512-BJlFWm9yYnjiC2ZD8kViRpAbfnV44ZculdmDkxZ9OoJKPVuQn6yg1pPKJh/0DSYlv75oowwGVdVg5U5TDuIzhg==","_npmVersion":"11.11.0","description":"Standalone 3D renderer and chart primitives","directories":{},"_nodeVersion":"24.14.1","dependencies":{"gl-matrix":"^3.4.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.2.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/renderer-3d_0.1.31_1779261894441_0.49996464290347875","host":"s3://npm-registry-packages-npm-production"}},"0.1.32":{"name":"@demo-charts/renderer-3d","version":"0.1.32","license":"MIT","_id":"@demo-charts/renderer-3d@0.1.32","maintainers":[{"name":"rm_charts","email":"dpandav@ruggedmonitoring.com"}],"dist":{"shasum":"8ed6a0f70c471d9c41ff4e9a192cf13d84c4aa48","tarball":"https://registry.npmjs.org/@demo-charts/renderer-3d/-/renderer-3d-0.1.32.tgz","fileCount":5,"integrity":"sha512-BvPN5XYb8/a53rRiepPLtBBDVs8wDVMKx7BvlO31LA1sLH34LpIQv6eCqTEnFJhWr4YPLgWnInMvN7N/F7RxOg==","signatures":[{"sig":"MEUCIQCVJ33yLHPOv8nou1X38S+ykyg6MccPFpkvxfm2wPIEMgIgNMtRvjZe4+Nl+Bm9Dp0oH362ilewFhUhGmy4k9AAF4Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":759252},"main":"./dist/index.js","type":"module","_from":"file:demo-charts-renderer-3d-0.1.32.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"vitest run --passWithNoTests","build":"tsup","clean":"rm -rf dist"},"_npmUser":{"name":"rm_charts","email":"dpandav@ruggedmonitoring.com"},"_resolved":"C:\\Users\\dpandav\\AppData\\Local\\Temp\\04254a0f18d51ce221af723f5aed67e4\\demo-charts-renderer-3d-0.1.32.tgz","_integrity":"sha512-BvPN5XYb8/a53rRiepPLtBBDVs8wDVMKx7BvlO31LA1sLH34LpIQv6eCqTEnFJhWr4YPLgWnInMvN7N/F7RxOg==","_npmVersion":"11.11.0","description":"Standalone 3D renderer and chart primitives","directories":{},"_nodeVersion":"24.14.1","dependencies":{"gl-matrix":"^3.4.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.2.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/renderer-3d_0.1.32_1780480876941_0.7475775571009551","host":"s3://npm-registry-packages-npm-production"}},"0.1.33":{"name":"@demo-charts/renderer-3d","version":"0.1.33","license":"MIT","_id":"@demo-charts/renderer-3d@0.1.33","maintainers":[{"name":"rm_charts","email":"dpandav@ruggedmonitoring.com"}],"dist":{"shasum":"caadb58411b85c8a50ea958e319cd1c8853666f5","tarball":"https://registry.npmjs.org/@demo-charts/renderer-3d/-/renderer-3d-0.1.33.tgz","fileCount":5,"integrity":"sha512-Ar1dm7dJOXB874ZFZdAz/NKm6vxNZLqVQj3nK1UY1PFw+vIK2zbZUaV/aFnN6AOMHDGiaX/ly5bbm6NiPX3m4g==","signatures":[{"sig":"MEUCIH1gdyHrx7jtRWpw2Zzfpws/Pk3VeewdVYQx86nEQUv6AiEAy6TrrPBmhuqdEL+p6byLX8YtgYC29p0RAjMwZ+2CLi4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":759252},"main":"./dist/index.js","type":"module","_from":"file:demo-charts-renderer-3d-0.1.33.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"vitest run --passWithNoTests","build":"tsup","clean":"rm -rf dist"},"_npmUser":{"name":"rm_charts","email":"dpandav@ruggedmonitoring.com"},"_resolved":"C:\\Users\\dpandav\\AppData\\Local\\Temp\\f490e6bb5f32e2f20136f8f7d2d163d7\\demo-charts-renderer-3d-0.1.33.tgz","_integrity":"sha512-Ar1dm7dJOXB874ZFZdAz/NKm6vxNZLqVQj3nK1UY1PFw+vIK2zbZUaV/aFnN6AOMHDGiaX/ly5bbm6NiPX3m4g==","_npmVersion":"11.11.0","description":"Standalone 3D renderer and chart primitives","directories":{},"_nodeVersion":"24.14.1","dependencies":{"gl-matrix":"^3.4.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.2.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/renderer-3d_0.1.33_1780482684890_0.4803723175135073","host":"s3://npm-registry-packages-npm-production"}},"0.1.34":{"name":"@demo-charts/renderer-3d","version":"0.1.34","description":"Standalone 3D renderer and chart primitives","license":"MIT","publishConfig":{"access":"public"},"type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"dependencies":{"gl-matrix":"^3.4.4"},"devDependencies":{"tsup":"^8.0.0","typescript":"^5.3.3","vitest":"^1.2.0"},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run --passWithNoTests","clean":"rm -rf dist"},"_id":"@demo-charts/renderer-3d@0.1.34","_integrity":"sha512-JwHIrLVm4F3+eDVFSo5aeLP5mXs9NFf0HNjIqSLvR9YddOVvseSAjnasi/1kGSK/aDENEbOdg8eMdgEpbD3Wfw==","_resolved":"C:\\Users\\dpandav\\AppData\\Local\\Temp\\2dd030d245c914ce783e5d7a62a19721\\demo-charts-renderer-3d-0.1.34.tgz","_from":"file:demo-charts-renderer-3d-0.1.34.tgz","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-JwHIrLVm4F3+eDVFSo5aeLP5mXs9NFf0HNjIqSLvR9YddOVvseSAjnasi/1kGSK/aDENEbOdg8eMdgEpbD3Wfw==","shasum":"410edae3790827b75207582a4bc77016112b8246","tarball":"https://registry.npmjs.org/@demo-charts/renderer-3d/-/renderer-3d-0.1.34.tgz","fileCount":5,"unpackedSize":765424,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCID+4xp5rz90Ysy8Nmduhyt+Lqbix2f1oEOAFJ3kR6cRdAiEAkjw7yxzGJhz67FPC9moG7hYH4gwoAzIejHdLThpLxiQ="}]},"_npmUser":{"name":"rm_charts","email":"dpandav@ruggedmonitoring.com"},"directories":{},"maintainers":[{"name":"rm_charts","email":"dpandav@ruggedmonitoring.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/renderer-3d_0.1.34_1780665072817_0.2644980151034153"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-17T17:18:21.374Z","modified":"2026-06-05T13:11:13.197Z","0.1.26":"2026-05-17T17:18:21.638Z","0.1.31":"2026-05-20T07:24:54.617Z","0.1.32":"2026-06-03T10:01:17.068Z","0.1.33":"2026-06-03T10:31:25.144Z","0.1.34":"2026-06-05T13:11:13.039Z"},"license":"MIT","description":"Standalone 3D renderer and chart primitives","maintainers":[{"name":"rm_charts","email":"dpandav@ruggedmonitoring.com"}],"readme":"# 3D chart (`@demo-charts/renderer-3d`)\r\n\r\nThis package implements the **phase-resolved 3D bar (“PRPD-style”)** chart: vertical **spikes** over a **phase × cycle** floor, with an optional **reference curve** on the back wall, orbit camera, and tooltips.\r\n\r\n---\r\n\r\n## High-level architecture\r\n\r\n```\r\nApp / React\r\n    │\r\n    ▼\r\nRmChart3D              ← thin facade: setSeries, updateOptions, resize, destroy\r\n    │\r\n    ▼\r\nChartController3D      ← DOM, input, camera state, tooltip, series transitions\r\n    │\r\n    ▼\r\nCanvas3DRenderer       ← single HTML canvas, 2D context: full scene draw + hit-test\r\n    │\r\n    ▼\r\nPhaseGraph3DSeries     ← normalized spike + wall-curve data, styles, bounds, interpolation\r\n```\r\n\r\nExported public API: `RmChart3D`, `ChartController3D`, `PhaseGraph3DSeries`, and types from `./types`.\r\n\r\nScene graph, coordinates, and WebGL background passes are described in **`PRPD_WEBGL_SCENE_ARCHITECTURE.md`**.\r\n\r\nThe React wrapper (`@demo-charts/react` → `RmChart3DComponent`) mounts a `div`, constructs `RmChart3D({ ...options, container })`, and calls `setSeries` when the series instance changes.\r\n\r\n---\r\n\r\n## Data model: `PhaseGraph3DSeries`\r\n\r\nA series is defined by parallel arrays of equal length:\r\n\r\n| Field | Role (typical PRPD mapping) |\r\n|--------|-----------------------------|\r\n| `phase` | X on the floor (e.g. phase angle 0…360°) |\r\n| `cycle` | Z on the floor (e.g. cycle index) |\r\n| `amplitude` | Height of the bar (Y) |\r\n\r\nOptional **`wallCurve`**: `phase[]` + `amplitude[]` — a polyline on the **back vertical wall** (phase vs amplitude), e.g. a sine reference.\r\n\r\n**Style** (`PhaseGraph3DSeriesStyle`): bar color, stroke, wall curve color, **spike width / depth**, **spike radius** (0 = rectangular pillar, higher = rounder cap toward “cylinder”), wall line width.\r\n\r\nThe constructor normalizes inputs to `number[]` and truncates to the common length. **`getBounds()`** computes min/max over spikes (and wall curve for phase/amplitude) for axis scaling.\r\n\r\n**`PhaseGraph3DSeries.interpolate(from, to, t)`** blends two series for smooth transitions when `ChartController3D` animates a data update.\r\n\r\n---\r\n\r\n## Controller: `ChartController3D`\r\n\r\n**Responsibilities:**\r\n\r\n1. **Container** — Resolves `container` from a CSS selector or `HTMLElement`, positions it `relative`, injects:\r\n   - One **`canvas`** (full size of container).\r\n   - One **`tooltip`** `div` (absolute, non-interactive, high z-index).\r\n\r\n2. **Camera** — Orbital parameters (degrees / distance):\r\n   - **`yaw`**, **`pitch`** — updated by drag (pointer delta → clamped angles).\r\n   - **`distance`** — dollies in/out with the mouse wheel (clamped to `minDistance` / `maxDistance` from options).\r\n\r\n3. **Interaction** (see `Chart3DInteractionOptions`):\r\n   - Rotate: pointer drag on canvas (unless `interaction.rotate === false`).\r\n   - Zoom: wheel (unless `interaction.zoom === false`).\r\n   - Double-click: resets camera toward options defaults (`camera.yaw`, `pitch`, `distance`).\r\n   - Tooltip: pointer move runs hit-test; if a spike is hit, shows phase / amplitude / cycle (unless `interaction.tooltip === false`).\r\n\r\n4. **Pointer wiring** — Uses `pointerdown` / `pointermove` / `pointerup` / `pointerleave` on the canvas; `pointermove` / `pointerup` are registered on **`window`** so dragging continues outside the element.\r\n\r\n5. **Resize** — `ResizeObserver` on the container calls `resize()` → matches canvas backing store (with **devicePixelRatio** cap) and re-renders.\r\n\r\n6. **Series updates** — `setSeries(series)`:\r\n   - First series: immediate assign + render.\r\n   - Later updates: starts a short **transition** (~220 ms) interpolating from the previous series to the new one via `PhaseGraph3DSeries.interpolate`, driven by `requestAnimationFrame`.\r\n\r\n---\r\n\r\n## Rendering: `Canvas3DRenderer`\r\n\r\nUses **`getContext('2d')` only** for the shipped path: no WebGL in this pipeline.\r\n\r\n**`render(series, options, state, hoverHit?)` pipeline (order matters for painter’s algorithm):**\r\n\r\n1. Clear and fill **background** (from theme / `darkMode`).\r\n2. **`buildProjection`** — Builds a simple perspective state from canvas size + `yaw` / `pitch` / `distance` (focal length, camera Z, center on screen). This is **custom** projection math (not a full scene graph).\r\n3. **`drawFloor`** — Floor plane with grid, striped cells (light/dark), clipped to the chart volume.\r\n4. **`drawHoverFloorGuide`** — On spike hover: **L-shaped** floor guides `(phaseₘᵢₙ,cycle)→(phase,cycle)→(phase,cycleₘᵢₙ)`. Colour **`theme.hoverFloorGuideColor`** (default **`#ff6a14`** in `resolveChart3DTheme`). Stroke thickness follows pillars (~half the narrower pillar semi-axis → `pillarGraphHalfExtents`). WebGL: **`renderHoverFloorCrosshair`** uses ribbon quads; same `hoverHit` as the tooltip.\r\n5. **`drawWall`** — Back wall quads + grid (behind the data volume).\r\n6. **`drawWallCurve`** — The reference polyline on the wall from `series.getWallCurve()`.\r\n7. **`drawSpikes`** — For each spike, project base + top to screen; **sort by depth** (back to front); draw each spike as a **filled trapezoid** (body) + **strokes** + optional **rounded cap** at the top (pillar vs rounded style from `spikeRadius`).\r\n8. **`drawAxesAndLabels`** — Axis titles, ticks, numeric labels (from `xAxis` / `yAxis` / `zAxis` in options), using resolved theme and typography.\r\n\r\n**HiDPI:** The canvas bitmap is scaled by `dpr` (capped at 2); drawing uses logical coordinates after `ctx.scale(dpr, dpr)`.\r\n\r\n**Hit-test (`hitTest`)** — Rebuilds the same projected spike segments as `buildSpikeItems`, iterates **front to back** (reverse of draw order), finds the closest spike whose **screen-space distance** from the pointer to the **base–top segment** is within a tolerance. Returns `Chart3DHitResult`: `phase`, `cycle`, `amplitude`, `index`, and screen `point` at the top.\r\n\r\n---\r\n\r\n## Options (`Chart3DOptions`)\r\n\r\n- **`container`** — Selector string or element (required).\r\n- **`width` / `height`** — Optional explicit size; else container client size on resize.\r\n- **`darkMode` + `theme`** — Background, **floor** checkerboard tiles (`floorStripeA` / `floorStripeB`), **wall** amplitude bands (`wallStripeA` / `wallStripeB`; `wallFill` still overrides stripe A in the WebGL adapter only), grid (`floorGrid` / `wallGrid`), axis and default spike colors.\r\n- **`xAxis`, `yAxis`, `zAxis`** — Labels, min/max, tick count or tick values, `formatLabel`, per-axis typography colors/sizes/fonts.\r\n- **`camera`** — Initial / reset yaw, pitch, distance, min/max distance for zoom.\r\n- **`interaction`** — Toggle rotate, zoom, tooltip.\r\n- **`tooltip`** — Colors, font.\r\n\r\nAxis **mapping in the 3D scene** is handled inside the renderer (phase/cycle/amplitude bounds vs. the fixed “graph box” in projection space); see `resolveBounds` / projection helpers in `Canvas3DRenderer.ts`.\r\n\r\n---\r\n\r\n## Optional / internal GPU path\r\n\r\nThe default **`rendererBackend`** is **`auto`**, which prefers **WebGL2 instanced pillars** + a **transparent Canvas2D overlay** for axis labels. Set **`rendererBackend: 'canvas2d'`** to force the legacy full Canvas2D path.\r\n\r\nInternals: **`WebGLPhaseSpikeRenderer`**, **`WebGLChart3DAdapter`**, GPU picking, chunking, **`renderPassGraph.ts`** (explicit background → pillar passes), **`gpuGraphProjection.ts`**, interleave worker (`gpuInterleaveWorkerSource.ts`), optional **`prpdAggregationLod`** (phase×cycle bins), data-prep worker string (**`prpdDataPrepWorkerSource.ts`**), and **`WebGPUComputeBackend`** (stub for future compute).\r\n\r\n---\r\n\r\n## Package entry\r\n\r\n`src/index.ts` exports:\r\n\r\n- `./types`\r\n- `./PhaseGraph3DSeries`\r\n- `./ChartController3D`\r\n- `./Canvas3DRenderer`\r\n- `./RmChart3D`\r\n\r\n---\r\n\r\n## Typical usage (vanilla)\r\n\r\n```ts\r\nimport { RmChart3D, PhaseGraph3DSeries } from '@demo-charts/renderer-3d';\r\n\r\nconst chart = new RmChart3D({\r\n  container: '#chart-3d',\r\n  xAxis: { label: 'Phase Angle (deg)', min: 0, max: 360, /* ... */ },\r\n  yAxis: { label: 'Amplitude (mVp)', min: 0, max: 2000, /* ... */ },\r\n  zAxis: { label: 'Cycle', min: 0, max: 50, /* ... */ },\r\n  camera: { yaw: -50, pitch: 32, distance: 3.65, maxDistance: 28 },\r\n  interaction: { rotate: true, zoom: true, tooltip: true },\r\n});\r\n\r\nchart.setSeries(\r\n  new PhaseGraph3DSeries({\r\n    name: '3D Phase Distribution',\r\n    spikes: { phase, cycle, amplitude },\r\n    wallCurve: { phase: wallPhase, amplitude: wallAmp },\r\n    style: { spikeColor: '#42a5f5', spikeStroke: '#1565c0', /* ... */ },\r\n  })\r\n);\r\n```\r\n\r\nOptional camera tuning: `orbitRadiusBase` overrides the additive orbit radius base, `orbitTarget` sets a graph-space look-at pivot (ignored when `autoFit: 'spikes'`), and `autoFit: 'spikes'` recenters on sampled spike centroids with a gentle zoom scale for tight clouds.\r\n\r\n---\r\n\r\n## Files (reference)\r\n\r\n| File | Role |\r\n|------|------|\r\n| `RmChart3D.ts` | Public API entry |\r\n| `ChartController3D.ts` | Layout, events, camera, tooltip, transitions |\r\n| `Canvas3DRenderer.ts` | 2D canvas drawing + projection + hit-test |\r\n| `PhaseGraph3DSeries.ts` | Data + styles + bounds + interpolation |\r\n| `math.ts` | Angles, color shading helpers |\r\n| `types.ts` | Options and data typings |\r\n| `WebGLPhaseSpikeRenderer.ts` | Optional WebGL instanced pillars (not in default bundle export) |\r\n","readmeFilename":"README.md"}