diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..dc629d8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,336 @@ +# Changelog + +All notable changes to the Knowledge Base project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Changed + +#### BREAKING: MCP Protocol Rebranding +- **All MCP URIs, tool names, and prompts updated to KOGRAL namespace** + - **URI Scheme**: `kb://` → `kogral://` + - `kb://project/notes` → `kogral://project/notes` + - `kb://project/decisions` → `kogral://project/decisions` + - `kb://project/guidelines` → `kogral://project/guidelines` + - `kb://project/patterns` → `kogral://project/patterns` + - `kb://shared/guidelines` → `kogral://shared/guidelines` + - `kb://shared/patterns` → `kogral://shared/patterns` + - **Tool Names**: `kb/*` → `kogral/*` + - `kb/search` → `kogral/search` + - `kb/add_note` → `kogral/add_note` + - `kb/add_decision` → `kogral/add_decision` + - `kb/link` → `kogral/link` + - `kb/get_guidelines` → `kogral/get_guidelines` + - `kb/list_graphs` → `kogral/list_graphs` + - `kb/export` → `kogral/export` + - `kb/find_blocks` → `kogral/find_blocks` + - `kb/find_todos` → `kogral/find_todos` + - `kb/find_cards` → `kogral/find_cards` + - **Prompt Names**: `kb/*` → `kogral/*` + - `kb/summarize_project` → `kogral/summarize_project` + - `kb/find_related` → `kogral/find_related` + - **Server Name**: `kb-mcp` → `kogral-mcp` + - **Migration Required**: Users must update `~/.config/claude/config.json`: + + ```diff + { + "mcpServers": { + - "kb-mcp": { + - "command": "/path/to/kb-mcp", + + "kogral-mcp": { + + "command": "/path/to/kogral-mcp", + - "env": { "KB_DIR": "/path/to/.kb" } + + "env": { "KOGRAL_DIR": "/path/to/.kogral" } + } + } + } + ``` + + - **Rationale**: Complete branding consistency across all interfaces. Pre-release status (v0.x) allows breaking changes without user pain. + - **Files updated**: + - `crates/kb-mcp/src/resources.rs`: All URI definitions and parsing + - `crates/kb-mcp/src/tools.rs`: All tool name definitions and dispatch + - `crates/kb-mcp/src/prompts.rs`: All prompt name definitions and dispatch + - `crates/kb-mcp/src/main.rs`: Server name registration + - `crates/kb-mcp/tests/integration_test.rs`: Test assertions updated + - `docs/apps/mcp-quickguide.md`: All examples and references + - `docs/kogral/core-concepts.md`: MCP protocol documentation + - `docs/api/mcp-tools.md`: API reference documentation + - `README.md`: MCP integration examples + +#### Branding +- **Rebranded to KOGRAL** (**KO**wledge **GRA**phs, **L**ocal-first) + - Updated project name from "Knowledge Base" to "KOGRAL" across all documentation + - New tagline: "Git-native knowledge graphs for developer teams" + - Updated description emphasizing structured knowledge management for developers + - Documentation folder renamed: `docs/kb/` → `docs/kogral/` + - Documentation files renamed: + - `docs/kogral/what-is-kb.md` → `what-is-kogral.md` + - `docs/kogral/why-kb.md` → `why-kogral.md` + - Technical names maintained for compatibility: `kb-core`, `kb-cli`, `kb-mcp` (crate names), `kb` (CLI binary) + - Hybrid naming strategy: KOGRAL as primary brand, `kb.vapora.dev` as future alias + - Files updated: + - `README.md`: Title, description, and branding + - `Cargo.toml` (workspace): Homepage, description, repository metadata + - `crates/kb-core/Cargo.toml`: Package description + - `crates/kb-cli/Cargo.toml`: Package description + - `crates/kb-mcp/Cargo.toml`: Package description + - `crates/kb-core/src/lib.rs`: Module documentation comments + - `crates/kb-core/src/models.rs`: Type documentation comments + - `crates/kb-cli/src/main.rs`: CLI description and messages + - `docs/kogral/what-is-kogral.md`: Full KOGRAL branding with acronym explanation + - `docs/kogral/core-concepts.md`: All "KB" references replaced with "KOGRAL" + - `docs/README.md`: Title and section headers + - `docs/book.toml`: mdBook title and description + - `docs/SUMMARY.md`: Navigation titles + - `.claude/CLAUDE.md`: Project description and documentation links + +#### BREAKING: Filesystem Paths and Environment Variables +- **Directory structure renamed from `.kb/` to `.kogral/`** + - Project directory: `.kb/` → `.kogral/` + - Shared directory: `.kb-shared/` → `.kogral-shared/` + - Configuration paths updated throughout codebase + - All storage paths use `.kogral/` prefix +- **Environment variable renamed from `KB_DIR` to `KOGRAL_DIR`** + - MCP server configuration requires `KOGRAL_DIR` environment variable + - CLI tools respect `KOGRAL_DIR` for custom directory location +- **Migration Required**: + 1. Rename existing directory: `mv .kb .kogral` + 2. Update environment variables: `KB_DIR` → `KOGRAL_DIR` + 3. Update config files referencing `.kb/` paths +- **Rationale**: Complete branding consistency across all filesystem operations. Pre-release status allows breaking changes. +- **Files updated**: + - All Rust source files in `crates/`: Path constants and variable names + - `crates/kb-core/src/config/loader.rs`: Configuration path discovery + - `crates/kb-core/src/storage/filesystem.rs`: Storage paths + - `crates/kb-cli/src/main.rs`: CLI messages and examples + - `crates/kb-mcp/src/main.rs`: Environment variable handling + - All documentation in `docs/`: Examples and instructions + - `README.md`: Setup and usage examples + - `.claude/CLAUDE.md`: Project configuration paths + +### Added + +#### Core Infrastructure +- Initial project structure with Cargo workspace (kb-core, kb-cli, kb-mcp) +- Core graph models (Node, Edge, Graph) with 6 node types and 6 relationship types +- Config-driven architecture using Nickel schemas (NCL → JSON → Rust) +- Markdown parser with Logseq compatibility (YAML frontmatter + wikilinks) +- Storage backends: Filesystem (default), In-Memory, SurrealDB (feature-gated) +- Embedding integration via rig-core (OpenAI, Claude, Ollama) + fastembed local fallback +- Tera template engine for document generation and export + +#### Logseq Blocks Support (ADR-004) +- **Block Data Structures** (`crates/kb-core/src/models.rs`): + - `TaskStatus` enum: TODO, DOING, DONE, LATER, NOW, WAITING, CANCELLED + - `BlockProperties` struct: tags, task status, custom properties, block/page references + - `Block` struct: hierarchical content blocks with properties and children + - `Node.blocks` field: Optional cached block structure (lazy parsing) +- **BlockParser** (`crates/kb-core/src/block_parser.rs`): + - Bidirectional parser: Markdown outliner ↔ Block structures + - Supports: task markers, #tags, custom properties (key:: value), ((block-refs)), [[page-refs]] + - Hierarchical parsing based on indentation + - Round-trip fidelity for Logseq import/export + - 15 comprehensive tests covering parsing, serialization, and round-trips +- **Block Query API**: + - `Node::get_blocks()`: Lazy parsing from content with caching + - `Node::find_blocks_by_tag()`: Find blocks with specific tag + - `Node::find_all_todos()`: Find all task blocks + - `Node::find_blocks_by_status()`: Find blocks by task status + - `Node::find_blocks_by_property()`: Find blocks with custom property + - `Graph::find_blocks_by_tag()`: Search blocks across all nodes + - `Graph::find_all_todos()`: Find TODOs across entire graph + - 6 integration tests for Node and Graph block queries +- **SurrealDB Schema** (`schemas/surrealdb/blocks.surql`): + - `block` table with indexes on node_id, block_id, tags, status, parent_id + - Full-text search index on content + - Support for hierarchical queries and tag-based filtering + - Migration queries and example usage patterns +- **Logseq Import/Export** (`crates/kb-core/src/import/logseq.rs`, `crates/kb-core/src/export/logseq.rs`): + - Round-trip import: Logseq markdown → KB Node with blocks + - Property parsing: key:: value format, tags ([[tag]] and #tag), references, timestamps + - Export to Logseq page/journal formats with block serialization + - 12 comprehensive tests covering import/export round-trips +- **MCP Block Tools** (`crates/kb-mcp/src/tools.rs`): + - `kb/find_blocks`: Search blocks by tag, task status, or custom property + - `kb/find_todos`: Find all TODO blocks across KB + - `kb/find_cards`: Find all flashcard blocks (#card tag) + - Fixed borrowing issues with two-phase data collection pattern +- **Configuration Schema** (`schemas/kb-config.ncl`, `config/*.ncl`): + - Added `BlocksConfig` schema with 4 settings: + - `enabled`: Enable/disable Logseq blocks parsing (default: false, opt-in) + - `parse_on_import`: Auto-parse blocks from Logseq imports (default: true) + - `serialize_on_export`: Serialize blocks to outliner format on export (default: true) + - `enable_mcp_tools`: Enable block-related MCP tools (default: true) + - Updated all config files (defaults.ncl, production.ncl, minimal.ncl) + - Validated: All configs export to JSON successfully +- **Documentation**: + - Complete technical design: `docs/architecture/logseq-blocks-design.md` + - Architectural Decision Record: `docs/architecture/adrs/004-logseq-blocks-support.md` + - 6-phase implementation plan documented + - Use cases and examples for flashcards, task tracking, and block references + +#### Applications +- CLI tool (kb-cli) with 13 commands (init, add, search, link, sync, serve, etc.) +- MCP server (kb-mcp) with 10 tools (7 core + 3 block tools), 6 resources, 2 prompts for Claude Code integration +- NuShell maintenance scripts (6 scripts: sync, backup, reindex, import/export Logseq, stats) + +#### Configuration System (Nickel) +- Complete Nickel configuration schema following typedialog/provisioning pattern +- Schema contracts (`schemas/kb/contracts.ncl`) - Type definitions with validation +- Default values (`schemas/kb/defaults.ncl`) - Base configuration values +- Composition helpers (`schemas/kb/helpers.ncl`) - merge_with_override, compose_config +- Mode overlays (`schemas/kb/modes/{dev,prod,test}.ncl`) - Environment-specific tuning +- Runtime configurations (`.kb-config/core/kb.ncl`, `.kb-config/platform/*.ncl`) +- Double validation pattern: Nickel contracts + serde deserialization +- Config export to JSON for Rust consumption (`.kb-config/targets/*.json`) + +#### Templates +- Tera templates for 6 document types (note, decision, guideline, pattern, journal, execution) +- 4 export format templates (Logseq page/journal, summary, JSON) +- Customizable template system with frontmatter generation + +#### Documentation (mdBook) +- Complete mdBook documentation structure with SUMMARY.md navigation +- 4 SVG diagrams for visual guides: + - `architecture-overview.svg` - Complete system architecture + - `core-concepts.svg` - Node types and relationships + - `config-composition.svg` - Configuration flow (Schema → Defaults → Mode → User → JSON) + - `storage-architecture.svg` - Hybrid storage strategy +- 11 major documentation sections (kb/, guides/, architecture/, setup/, config/, storage/, ai/, templates/, cli/, apps/, api/, contributing/) +- ADR documentation (ADR-001: Nickel vs TOML, ADR-002: FastEmbed + AI providers, ADR-003: Hybrid storage) +- Use cases documentation (8 real-world scenarios) +- MCP quick guide (5-minute setup for Claude Code) +- Config-driven architecture deep dive +- Storage architecture deep dive with code examples +- docs/README.md - Comprehensive guide for using and building documentation + +#### Build System +- Modular justfile system (7 modules: build, test, dev, ci, nickel, docs, scripts) +- Nickel validation and export recipes (`just nickel::validate-all`, `just nickel::export-all`) +- mdBook documentation recipes (`just docs::serve`, `just docs::build`, `just docs::test`) +- CI/CD pipeline recipes (format, lint, test, build validation) +- NuShell script validation and execution recipes + +#### Project Documentation +- Enhanced README.md with complete documentation links and visual diagram references +- Directory structure documentation with detailed explanations +- Quick start guide with MCP integration +- Integration guides (Vapora, Logseq, Claude Code) +- CHANGELOG.md following Keep a Changelog format + +### Changed +- Updated README.md with comprehensive documentation links (mdBook, guides, architecture, config) +- Enhanced directory structure documentation with .kb-config/ and schemas/kb/ details +- Improved documentation section with visual diagrams and just recipe references +- **Blocks Feature Documentation**: + - README.md: Added Logseq blocks section with examples, features, and configuration + - README.md: Updated architecture diagram to include BlockParser + - README.md: Added 3 new MCP tools to integration section + - docs/kb/core-concepts.md: Added comprehensive "Logseq Content Blocks" section with examples, use cases, and queries + - docs/api/mcp-tools.md: Added "Block Tools" section documenting kb/find_blocks, kb/find_todos, kb/find_cards + - docs/api/mcp-tools.md: Updated overview from 7 to 10 tools + +### Infrastructure +- Cargo workspace with 3 crates +- Feature flags: `filesystem` (default), `surrealdb`, `fastembed`, `full` +- 90 tests across workspace (81 kb-core + 5 kb-mcp + 4 kb-cli) + - 15 tests for block parser + - 12 tests for Logseq import/export + - 6 tests for block queries +- mdBook integration for documentation (serves on [http://localhost:3000](http://localhost:3000)) +- Nickel → JSON → Rust configuration pipeline +- Justfile modules: build, test, dev, ci, nickel, docs, scripts +- CI/CD pipeline recipes (format, lint, test, build validation) +- mdBook documentation structure with SUMMARY.md +- NuShell script validation recipes + +## [1.0.0] - TBD + +Initial release (planned). + +### Planned Features +- Full FilesystemStorage implementation with file watching +- Complete Query Engine with semantic search +- Guideline inheritance resolution (shared → local override priority) +- SurrealDB schema and complete backend implementation +- Sync mechanism: bidirectional Filesystem ↔ SurrealDB +- FastEmbed local embeddings integration +- API provider integrations (OpenAI, Claude, Ollama) for embeddings +- Cross-graph queries (project + shared knowledge bases) +- Template customization system +- Export to multiple formats (Logseq, JSON, Markdown) +- Import from Logseq graphs +- MCP protocol compliance testing +- Production-ready CLI tool +- Performance benchmarks +- Security audit + +--- + +## Version History + +### Version Numbering + +This project follows semantic versioning (MAJOR.MINOR.PATCH): + +- **MAJOR**: Incompatible API changes +- **MINOR**: New features (backward compatible) +- **PATCH**: Bug fixes (backward compatible) + +### Release Schedule + +- **Alpha** (0.x.x): API unstable, features incomplete +- **Beta** (1.0.0-beta.x): API stable, features complete, testing phase +- **Stable** (1.0.0+): Production ready + +### Feature Roadmap + +#### Phase 1: Foundation ✅ (Completed) +- [x] Core models and graph structure +- [x] Nickel configuration system +- [x] Markdown parser with Logseq compatibility +- [x] Storage trait abstraction +- [x] CLI structure with clap +- [x] MCP server protocol implementation +- [x] NuShell maintenance scripts +- [x] Documentation structure + +#### Phase 2: Integration (In Progress) +- [ ] Full FilesystemStorage with file watching +- [ ] SurrealDB backend implementation +- [ ] Query engine with text + semantic search +- [ ] Embedding provider integrations +- [ ] Guideline inheritance resolution +- [ ] Sync mechanism implementation + +#### Phase 3: Polish (Planned) +- [ ] Performance optimization +- [ ] Comprehensive error handling +- [ ] Production testing +- [ ] Security audit +- [ ] API stabilization +- [ ] Release preparation + +--- + +## Migration Guides + +### Upgrading from 0.x to 1.0 + +(To be documented when 1.0 is released) + +--- + +## Contributing + +See [CONTRIBUTING.md](docs/contributing/development.md) for development setup and guidelines. + +--- + +## License + +(To be determined) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..f3eaea2 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,105 @@ +# Code of Conduct + +## Our Pledge + +We, as members, contributors, and leaders, pledge to make participation in our project and +community a harassment-free experience for everyone, regardless of: + +- Age +- Body size +- Visible or invisible disability +- Ethnicity +- Sex characteristics +- Gender identity and expression +- Level of experience +- Education +- Socioeconomic status +- Nationality +- Personal appearance +- Race +- Caste +- Color +- Religion +- Sexual identity and orientation + +We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by mistakes +- Focusing on what is best not just for us as individuals, but for the overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery +- Trolling, insulting, or derogatory comments +- Personal or political attacks +- Public or private harassment +- Publishing others' private information (doxing) +- Other conduct which could reasonably be considered inappropriate in a professional setting + +## Enforcement Responsibilities + +Project maintainers are responsible for clarifying and enforcing our standards of acceptable +behavior and will take appropriate corrective action in response to unacceptable behavior. + +Maintainers have the right and responsibility to: + +- Remove, edit, or reject comments, commits, code, and other contributions +- Ban contributors for behavior they deem inappropriate, threatening, or harmful + +## Scope + +This Code of Conduct applies to: + +- All community spaces (GitHub, forums, chat, events, etc.) +- Official project channels and representations +- Interactions between community members related to the project + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to project maintainers: + +- Email: [project contact] +- GitHub: Private security advisory +- Issues: Report with `conduct` label (public discussions only) + +All complaints will be reviewed and investigated promptly and fairly. + +### Enforcement Guidelines + +**1. Correction** +- Community impact: Use of inappropriate language or unwelcoming behavior +- Action: Private written warning with explanation and clarity on impact +- Consequence: Warning and no further violations + +**2. Warning** +- Community impact: Violation through single incident or series of actions +- Action: Written warning with severity consequences for continued behavior +- Consequence: Suspension from community interaction + +**3. Temporary Ban** +- Community impact: Serious violation of standards +- Action: Temporary ban from community interaction +- Consequence: Revocation of ban after reflection period + +**4. Permanent Ban** +- Community impact: Pattern of violating community standards +- Action: Permanent ban from community interaction + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1. + +For answers to common questions about this code of conduct, see the [FAQ](https://www.contributor-covenant.org/faq). + +--- + +**Thank you for being part of our community!** + +We believe in creating a welcoming and inclusive space where everyone can contribute their best work. Together, we make this project better. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..0dd1ff8 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,130 @@ +# Contributing + +Thank you for your interest in contributing! This document provides guidelines and instructions for contributing to this project. + +## Code of Conduct + +This project adheres to a Code of Conduct. By participating, you are expected to uphold this code. +Please see [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for details. + +## Getting Started + +### Prerequisites + +- Rust 1.70+ (if project uses Rust) +- NuShell (if project uses Nushell scripts) +- Git + +### Development Setup + +1. Fork the repository +2. Clone your fork: `git clone ` +3. Add upstream: `git remote add upstream ` +4. Create a branch: `git checkout -b feature/your-feature` + +## Development Workflow + +### Before You Code + +- Check existing issues and pull requests to avoid duplication +- Create an issue to discuss major changes before implementing +- Assign yourself to let others know you're working on it + +### Code Standards + +#### Rust + +- Run `cargo fmt --all` before committing +- All code must pass `cargo clippy -- -D warnings` +- Write tests for new functionality +- Maintain 100% documentation coverage for public APIs + +#### Nushell + +- Validate scripts with `nu --ide-check 100 script.nu` +- Follow consistent naming conventions +- Use type hints where applicable + +#### Nickel + +- Type check schemas with `nickel typecheck` +- Document schema fields with comments +- Test schema validation + +### Commit Guidelines + +- Write clear, descriptive commit messages +- Reference issues with `Fixes #123` or `Related to #123` +- Keep commits focused on a single concern +- Use imperative mood: "Add feature" not "Added feature" + +### Testing + +All changes must include tests: + +```bash +# Run all tests +cargo test --workspace + +# Run with coverage +cargo llvm-cov --all-features --lcov + +# Run locally before pushing +just ci-full +``` + +### Pull Request Process + +1. Update documentation for any changed functionality +2. Add tests for new code +3. Ensure all CI checks pass +4. Request review from maintainers +5. Be responsive to feedback and iterate quickly + +## Review Process + +- Maintainers will review your PR within 3-5 business days +- Feedback is constructive and meant to improve the code +- All discussions should be respectful and professional +- Once approved, maintainers will merge the PR + +## Reporting Bugs + +Found a bug? Please file an issue with: + +- **Title**: Clear, descriptive title +- **Description**: What happened and what you expected +- **Steps to reproduce**: Minimal reproducible example +- **Environment**: OS, Rust version, etc. +- **Screenshots**: If applicable + +## Suggesting Enhancements + +Have an idea? Please file an issue with: + +- **Title**: Clear feature title +- **Description**: What, why, and how +- **Use cases**: Real-world scenarios where this would help +- **Alternative approaches**: If you've considered any + +## Documentation + +- Keep README.md up to date +- Document public APIs with rustdoc comments +- Add examples for non-obvious functionality +- Update CHANGELOG.md with your changes + +## Release Process + +Maintainers handle releases following semantic versioning: +- MAJOR: Breaking changes +- MINOR: New features (backward compatible) +- PATCH: Bug fixes + +## Questions + +- Check existing documentation and issues +- Ask in discussions or open an issue +- Join our community channels + +Thank you for contributing! diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..08a5f7a --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,98 @@ +# Security Policy + +## Supported Versions + +This project provides security updates for the following versions: + +| Version | Supported | +|---------|-----------| +| 1.x | ✅ Yes | +| 0.x | ❌ No | + +Only the latest major version receives security patches. Users are encouraged to upgrade to the latest version. + +## Reporting a Vulnerability + +**Do not open public GitHub issues for security vulnerabilities.** + +Instead, please report security issues to the maintainers privately: + +### Reporting Process + +1. Email security details to the maintainers (see project README for contact) +2. Include: + - Description of the vulnerability + - Steps to reproduce (if possible) + - Potential impact + - Suggested fix (if you have one) + +3. Expect acknowledgment within 48 hours +4. We will work on a fix and coordinate disclosure timing + +### Responsible Disclosure + +- Allow reasonable time for a fix before public disclosure +- Work with us to understand and validate the issue +- Maintain confidentiality until the fix is released + +## Security Best Practices + +### For Users + +- Keep dependencies up to date +- Use the latest version of this project +- Review security advisories regularly +- Report vulnerabilities responsibly + +### For Contributors + +- Run `cargo audit` before submitting PRs +- Use `cargo deny` to check license compliance +- Follow secure coding practices +- Don't hardcode secrets or credentials +- Validate all external inputs + +## Dependency Security + +We use automated tools to monitor dependencies: + +- **cargo-audit**: Scans for known security vulnerabilities +- **cargo-deny**: Checks licenses and bans unsafe dependencies + +These run in CI on every push and PR. + +## Code Review + +All code changes go through review before merging: +- At least one maintainer review required +- Security implications considered +- Tests required for all changes +- CI checks must pass + +## Known Vulnerabilities + +We maintain transparency about known issues: +- Documented in GitHub security advisories +- Announced in release notes +- Tracked in issues with `security` label + +## Security Contact + +For security inquiries, please contact: +- Email: [project maintainers] +- Issue: Open a private security advisory on GitHub + +## Changelog + +Security fixes are highlighted in CHANGELOG.md with [SECURITY] prefix. + +## Resources + +- [OWASP Top 10](https://owasp.org/www-project-top-ten/) +- [CWE: Common Weakness Enumeration](https://cwe.mitre.org/) +- [Rust Security](https://www.rust-lang.org/governance/security-disclosures) +- [npm Security](https://docs.npmjs.com/about-npm/security) + +## Questions + +If you have security questions (not vulnerabilities), open a discussion or issue with the `security` label. diff --git a/assets/branding/README.md b/assets/branding/README.md new file mode 100644 index 0000000..df13acb --- /dev/null +++ b/assets/branding/README.md @@ -0,0 +1,147 @@ +# KOGRAL Branding Assets + +Complete branding system for KOGRAL (KOwledge GRAphs, Local-first) - Git-native knowledge graphs for developer teams. + +## Directory Structure + +```text +branding/ +├── README.md # This file +├── index.html # Quick reference showcase +└── kogral-assets-showcase.html # Comprehensive assets catalog +``` + +## Quick Start + +Open either HTML file in your browser to view the interactive branding showcase: + +- **`index.html`** - Compact version with dark/light mode toggle +- **`kogral-assets-showcase.html`** - Full-featured showcase with navigation, comparison tables, and detailed guidelines + +## Logo Variants + +All logos are available in the `../logos/` directory with these suffixes: + +| Suffix | Variant | Dimensions | Use Case | +|--------|---------|------------|----------| +| (none) | Full logo | 610×200px | Primary branding | +| `-h` | Horizontal | 1000×300px | Banners, headers | +| `-s` | Square | 200×200px | Apps, UI, icons | +| `-h-s` | Horizontal small | 500×150px | Navbars, sidebars | +| `-bn` | Black & white | 610×200px | Print, documents | + +## Icon Variants + +All icons are available in the `../icons/` directory: + +| Variant | Dimensions | Use Case | +|---------|------------|----------| +| `kogral-icon.svg` | 200×200px | Standard favicon, UI elements | +| `kogral-icon-s.svg` | 100×100px | Compact spaces, mobile UI | +| `kogral-icon-bn.svg` | 200×200px | Print, monochrome contexts | + +## Color Palette + +Core brand colors with semantic meaning: + +- **Primary Blue** (`#4a9eff`) - Knowledge, connectivity, main interactions +- **Accent Green** (`#3dd68d`) - Active states, growth, highlights +- **Gold** (`#fbbf24`) - Important elements, central focal point +- **Slate Secondary** (`#64748b`) - Secondary elements, borders +- **Dark Primary** (`#1a2744`) - UI backgrounds, primary dark +- **Dark Secondary** (`#2a3f6a`) - UI emphasis, secondary dark + +## Usage Guidelines + +### Logo Sizing +- Use the full logo for primary brand identification +- Maintain minimum 20px whitespace around all sides +- Never distort or rotate the logo +- For small spaces, prefer square or horizontal-small variants + +### Color Usage +- Primary Blue for main interactions and hierarchy +- Accent Green highlights active states and positive actions +- Gold emphasizes central knowledge nodes and critical elements +- Use monochrome variants on dark/light backgrounds for accessibility + +### Digital Applications +- All assets are SVG format for infinite scalability +- Use in web apps, mobile interfaces, and digital signage +- Animations are preserved and scale responsively +- Export to PNG at 2x resolution for high-DPI displays + +### Print Production +- Always use black & white variants for print materials +- Ensure minimum 1/4" clear space around logo +- Test colors on actual materials before final production +- Monochrome is preferred for single-color prints + +### Social Media +- Use square logo (200×200px) for profile pictures +- Horizontal variants (1000×300px) for banners and covers +- Export PNG at 2x scale for high-DPI displays +- Use full logo for primary brand identification + +### Accessibility +- All color combinations meet WCAG AA standards +- Monochrome variants ensure colorblind accessibility +- Use descriptive alt-text: "KOGRAL - Git-native knowledge graphs" + +## Asset Features + +✨ **Interactive HTML Showcases** +- Dark/light mode toggle with persistent storage +- Responsive grid layouts +- One-click filename copy +- Sticky navigation (showcase version) +- Color palette visualization +- Comparison tables + +🎨 **SVG Animations** +- Pulsing central node +- Flowing connection lines +- Rotating hexagon outlines +- Synchronized glow effects + +📊 **Format & Scalability** +- All assets in SVG format +- Infinite scalability without quality loss +- Animations preserved across all sizes +- Print-ready monochrome variants + +## File Sizes + +- Full logos: ~3-5KB each +- Icons: ~2-3KB each +- HTML showcases: ~20-29KB + +## Version Information + +- **Last Updated:** 2026-01-18 +- **Version:** 1.0 +- **Format:** SVG + HTML5 +- **Compatibility:** All modern browsers + +## Brand Identity + +**KOGRAL** represents: +- 🧠 Knowledge graphs for intelligent organization +- 🔗 Connected nodes and relationships +- 💾 Git-native, local-first architecture +- 🌍 Distributed, team-friendly knowledge management +- ✨ Elegant, animated visual identity + +## Related Assets + +- Logos: `/assets/logos/` +- Icons: `/assets/icons/` +- Main logo file: `/assets/kogral-logo.svg` + +## Contact & Updates + +For asset requests or updates, refer to the KOGRAL project documentation. + +--- + +**All assets in KOGRAL branding system are optimized for scalability, accessibility, and brand consistency.** diff --git a/assets/branding/index.html b/assets/branding/index.html new file mode 100644 index 0000000..591bf23 --- /dev/null +++ b/assets/branding/index.html @@ -0,0 +1,1304 @@ + + + + + + KOGRAL Branding Assets + + + + + + + + +
+ +
+

Color Palette

+
+
+
+
Primary Blue
+
#4a9eff
+
+
+
+
Accent Green
+
#3dd68d
+
+
+
+
Gold Highlight
+
#fbbf24
+
+
+
+
Slate Secondary
+
#64748b
+
+
+
+
Dark Primary
+
#1a2744
+
+
+
+
Dark Secondary
+
#2a3f6a
+
+
+
+ + +
+

Logo Variants

+ +
+ + +
+

Icon Variants

+ +
+ + +
+

Scalability Test

+
+

Icon clarity at different sizes - from favicon to app icons

+
+
+
+
+ 16×16 Icon +
+
16×16
+
Favicon
+
+ +
+
+ 32×32 Icon +
+
32×32
+
Browser tab
+
+ +
+
+ 64×64 Icon +
+
64×64
+
App icon
+
+ +
+
+ 128×128 Icon +
+
128×128
+
Apple touch
+
+ +
+
+ 256×256 Icon +
+
256×256
+
PWA icon
+
+
+
+ + +
+

Typography

+
+
+
Display / Headings
+
+ KOGRAL +
+
+
+ Family + Inter +
+
+ Weight + 800 +
+
+ Size + 32px+ +
+
+ Use + Hero, H1 +
+
+
+ +
+
Headings / Titles
+
+ Knowledge Graphs +
+
+
+ Family + Inter +
+
+ Weight + 700 +
+
+ Size + 24px +
+
+ Use + H2, H3 +
+
+
+ +
+
Body / Regular
+
+ Git-native knowledge graphs for developer teams with structured + knowledge management. +
+
+
+ Family + Inter +
+
+ Weight + 400 +
+
+ Size + 16px +
+
+ Use + Body text +
+
+
+ +
+
Emphasis / Semibold
+
+ Local-first architecture with config-driven behavior +
+
+
+ Family + Inter +
+
+ Weight + 600 +
+
+ Size + 16px +
+
+ Use + Emphasis +
+
+
+ +
+
Small / UI Elements
+
+ Markdown · Nickel · SurrealDB +
+
+
+ Family + Inter +
+
+ Weight + 500 +
+
+ Size + 14px +
+
+ Use + Labels, UI +
+
+
+ +
+
Code / Monospace
+
+ kogral-h.svg +
+
+
+ Family + Courier +
+
+ Weight + 400 +
+
+ Size + 14px +
+
+ Use + Code, files +
+
+
+
+ +
+

Font Usage

+

+ Inter is used for all typography in KOGRAL branding. The font is + clean, modern, and highly readable at all sizes. +

+
+
+ Import from Google Fonts: +
+
+ @import + url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap'); + +
+
+
+
+ + +
+

Usage Guidelines

+
+

Logo Usage

+

+ Use the full logo for primary brand identification on + websites, marketing materials, and product pages. The horizontal variant + works well for header areas and social media. For small spaces, use the + square or horizontal-small variants. Always maintain sufficient whitespace + around the logo (minimum 20px). +

+
+ +
+

Color Palette

+

+ Primary Blue (#4a9eff) is the main brand color + representing knowledge and connectivity. Accent Green (#3dd68d) + highlights active states and interactions. Gold (#fbbf24) + emphasizes important elements like the central knowledge node. Use the + black & white variants for print and high-contrast applications. +

+
+ +
+

Typography

+

+ Use Inter font family from Google Fonts for all text. + Weight 800 for display/hero text, 700 for headings, 600 for subheadings, + 400 for body text, and 500 for UI elements. Use + Courier New monospace for code, filenames, and HEX values. + Maintain line height of 1.3-1.7 for optimal readability. +

+
+ +
+

Icon Usage

+

+ Use kogral-icon.svg (200x200px) for most applications + including favicons and UI elements. The small variant is + optimized for tight spaces and mobile interfaces. The monochrome versions + are suitable for print, document headers, and accessibility contexts. +

+
+
+ +
+

+ KOGRAL Branding System • All assets are SVG format for maximum + scalability • Last updated 2026-01-23 +

+
+
+ + + + diff --git a/assets/branding/kogral-assets-showcase.html b/assets/branding/kogral-assets-showcase.html new file mode 100644 index 0000000..02dde32 --- /dev/null +++ b/assets/branding/kogral-assets-showcase.html @@ -0,0 +1,1552 @@ + + + + + + KOGRAL Assets Showcase + + + + + + + + + +
+
+

KOGRAL Branding Assets

+

Complete design system for git-native knowledge graphs

+
+
+
13
+
Total Assets
+
+
+
10
+
Logo Variants
+
+
+
3
+
Icon Variants
+
+
+
6
+
Brand Colors
+
+
+
SVG
+
Format
+
+
+
+
+ +
+ +
+
+
+

Color Palette

+

Core brand colors with semantic meaning

+
+ +
+
+
+
+
Primary Blue
+
#4a9eff
+
Knowledge & Connection
+
+
+ +
+
+
+
Accent Green
+
#3dd68d
+
Active & Growth
+
+
+ +
+
+
+
Gold Highlight
+
#fbbf24
+
Important & Central
+
+
+ +
+
+
+
Slate Secondary
+
#64748b
+
Secondary & Border
+
+
+ +
+
+
+
Dark Primary
+
#1a2744
+
UI Background
+
+
+ +
+
+
+
Dark Secondary
+
#2a3f6a
+
UI Emphasis
+
+
+
+
+
+ + +
+
+
+

Logo Variants

+

Full brand identity in multiple formats

+
+ +
+ +
+
+ Full Logo +
+
+
Full Logo
+
Primary
+
+
+
Dimensions
+
610×200px
+
+
+
Format
+
SVG
+
+
+
+ kogral-h.svg + +
+
+
+ + +
+
+ Horizontal Logo +
+
+
Horizontal
+
Layout
+
+
+
Dimensions
+
1000×300px
+
+
+
Use Case
+
Banners
+
+
+
+ kogral-v.svg + +
+
+
+ + +
+
+ Square Logo +
+
+
Square
+
Compact
+
+
+
Dimensions
+
200×200px
+
+
+
Use Case
+
Apps & UI
+
+
+
+ kogral-h-static.svg + +
+
+
+ + +
+
+ Horizontal Small Logo +
+
+
Horizontal Small
+
Compact
+
+
+
Dimensions
+
500×150px
+
+
+
Use Case
+
Navbars
+
+
+
+ kogral-v-static.svg + +
+
+
+ + +
+
+ Mono Black H Logo +
+
+
Mono Black H
+
Mono
+
+
+
Dimensions
+
610×200px
+
+
+
Use Case
+
Print, Fax
+
+
+
+ kogral-mono-black-h.svg + +
+
+
+ + +
+
+ Mono White H Logo +
+
+
Mono White H
+
Mono
+
+
+
Dimensions
+
610×200px
+
+
+
Use Case
+
Dark Mode
+
+
+
+ kogral-mono-white-h.svg + +
+
+
+ + +
+
+ Mono Black V Logo +
+
+
Mono Black V
+
Mono
+
+
+
Dimensions
+
450×315px
+
+
+
Use Case
+
Print Vertical
+
+
+
+ kogral-mono-black-v.svg + +
+
+
+ + +
+
+ Mono White V Logo +
+
+
Mono White V
+
Mono
+
+
+
Dimensions
+
450×315px
+
+
+
Use Case
+
Dark Mode V
+
+
+
+ kogral-mono-white-v.svg + +
+
+
+
+
+
+ + +
+
+
+

Icon Variants

+

Scalable icons for every use case

+
+ +
+ +
+
+ Main Icon +
+
+
Main Icon
+
Standard
+
+
+
Dimensions
+
200×200px
+
+
+
Use Case
+
Favicons
+
+
+
+ kogral-icon.svg + +
+
+
+ + +
+
+ Small Icon +
+
+
Small Icon
+
Compact
+
+
+
Dimensions
+
100×100px
+
+
+
Use Case
+
UI Elements
+
+
+
+ kogral-icon-static.svg + +
+
+
+ + +
+
+ Black & White Icon +
+
+
Black & White Icon
+
Mono
+
+
+
Dimensions
+
200×200px
+
+
+
Use Case
+
Print
+
+
+
+ kogral-icon-mono-black.svg + +
+
+
+
+
+
+ + +
+
+
+

Scalability Test

+

+ Icon clarity at different sizes - from favicon to app icons +

+
+ +
+
+
+ 16×16 Icon +
+
16×16
+
Favicon
+
+ +
+
+ 32×32 Icon +
+
32×32
+
Browser tab
+
+ +
+
+ 64×64 Icon +
+
64×64
+
App icon
+
+ +
+
+ 128×128 Icon +
+
128×128
+
Apple touch
+
+ +
+
+ 256×256 Icon +
+
256×256
+
PWA icon
+
+
+
+
+ + +
+
+
+

Typography

+

Font family, weights, and usage guidelines

+
+ +
+
+
Display / Hero
+
+ KOGRAL +
+
+
+ Family + Inter +
+
+ Weight + 800 (ExtraBold) +
+
+ Size + 32-48px +
+
+ Use Case + Hero, H1 +
+
+
+ +
+
Headings / Titles
+
+ Knowledge Graphs +
+
+
+ Family + Inter +
+
+ Weight + 700 (Bold) +
+
+ Size + 20-28px +
+
+ Use Case + H2, H3, Sections +
+
+
+ +
+
Subheadings
+
+ Git-native and local-first +
+
+
+ Family + Inter +
+
+ Weight + 600 (SemiBold) +
+
+ Size + 16-20px +
+
+ Use Case + H4, Cards +
+
+
+ +
+
Body Text / Regular
+
+ Structured knowledge management that scales from solo projects to + organizations. Config-driven architecture for capturing architectural + decisions, coding guidelines, and reusable patterns. +
+
+
+ Family + Inter +
+
+ Weight + 400 (Regular) +
+
+ Size + 16px +
+
+ Use Case + Paragraphs, Body +
+
+
+ +
+
Small / UI Elements
+
+ Markdown · Nickel · SurrealDB · Logseq +
+
+
+ Family + Inter +
+
+ Weight + 500 (Medium) +
+
+ Size + 14px +
+
+ Use Case + Labels, Badges, UI +
+
+
+ +
+
Code / Monospace
+
+ kogral-h.svg
+ #4a9eff +
+
+
+ Family + Courier New +
+
+ Weight + 400 (Regular) +
+
+ Size + 13-14px +
+
+ Use Case + Code, Files, HEX +
+
+
+
+
+
+ + +
+
+
+

Usage Guidelines

+

Best practices for brand consistency

+
+ +
+
+

📐 Logo Sizing

+

+ Use horizontal variants for banners and headers. Square variants work + best for apps and compact spaces. Maintain minimum 20px clear space + around all logos. Never distort, rotate, or modify the aspect ratio. +

+
+ +
+

🎨 Color Usage

+

+ Primary Blue (#4a9eff) is the main brand color. Green (#3dd68d) + highlights active states and growth. Gold (#fbbf24) emphasizes central + knowledge nodes. Use monochrome variants for print and high-contrast + applications. +

+
+ +
+

🔤 Typography

+

+ Use Inter font family from Google Fonts. Weight 800 for display/hero + text, 700 for headings, 600 for subheadings, 400 for body text, and 500 + for UI elements. Courier New monospace for code and filenames. Line + height 1.3-1.7 for readability. +

+
+ +
+

📱 Digital Applications

+

+ All assets are SVG format for infinite scalability. Use favicon variants + for browser tabs. Icons scale from 16×16 to 512×512 without quality + loss. Perfect for web apps, mobile interfaces, and digital signage. +

+
+ +
+

🖨️ Print Production

+

+ Use black & white variants for print materials. Ensure minimum 1/4" + clear space around logo. Test colors on actual materials before + production. Monochrome is preferred for single-color prints. +

+
+ +
+

♿ Accessibility

+

+ All color combinations meet WCAG AA standards. Monochrome variants + ensure colorblind accessibility. Always provide alt-text: "KOGRAL - + Git-native knowledge graphs". +

+
+
+
+
+ + +
+
+
+

Variant Comparison

+

Complete overview of all 8 asset variations

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CategoryVariantDimensionsBest ForFilename
LogosFull610×200pxPrimary brandingkogral-h.svg
Horizontal1000×300pxBanners, headerskogral-v.svg
Square200×200pxApps, UI elementskogral-h-static.svg
Horizontal Small500×150pxNavbars, sidebarskogral-v-static.svg
Black & White610×200pxPrint, documentskogral-mono-black-h.svg
IconsMain200×200pxFavicons, UIkogral-icon.svg
Small100×100pxCompact spaceskogral-icon-static.svg
Black & White200×200pxPrint, monochromekogral-icon-mono-black.svg
+
+
+
+ + +
+
+

KOGRAL Branding System

+

+ 8 Total Assets • 5 Logo Variants • 3 Icon Variants • 6 Brand Colors +

+

+ All assets in SVG format • Fully scalable • Print-ready • Accessible +

+

+ Last updated: 2026-01-23 • Version 1.0 +

+
+
+ + + + diff --git a/assets/icons/kogral-icon-mono-black.svg b/assets/icons/kogral-icon-mono-black.svg new file mode 100644 index 0000000..07c4cd0 --- /dev/null +++ b/assets/icons/kogral-icon-mono-black.svg @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/kogral-icon-static.svg b/assets/icons/kogral-icon-static.svg new file mode 100644 index 0000000..18bb6d4 --- /dev/null +++ b/assets/icons/kogral-icon-static.svg @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/kogral-icon.svg b/assets/icons/kogral-icon.svg new file mode 100644 index 0000000..d0bfe66 --- /dev/null +++ b/assets/icons/kogral-icon.svg @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/kogral-logo.svg b/assets/kogral-logo.svg new file mode 100644 index 0000000..ef28420 --- /dev/null +++ b/assets/kogral-logo.svg @@ -0,0 +1,354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logos/kogral-favicon-16.svg b/assets/logos/kogral-favicon-16.svg new file mode 100644 index 0000000..af99a8b --- /dev/null +++ b/assets/logos/kogral-favicon-16.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logos/kogral-favicon-32.svg b/assets/logos/kogral-favicon-32.svg new file mode 100644 index 0000000..f75bf59 --- /dev/null +++ b/assets/logos/kogral-favicon-32.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logos/kogral-h-static.svg b/assets/logos/kogral-h-static.svg new file mode 100644 index 0000000..b724dcb --- /dev/null +++ b/assets/logos/kogral-h-static.svg @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logos/kogral-h.svg b/assets/logos/kogral-h.svg new file mode 100644 index 0000000..ef28420 --- /dev/null +++ b/assets/logos/kogral-h.svg @@ -0,0 +1,354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logos/kogral-mono-black-h.svg b/assets/logos/kogral-mono-black-h.svg new file mode 100644 index 0000000..87aad48 --- /dev/null +++ b/assets/logos/kogral-mono-black-h.svg @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logos/kogral-mono-black-v.svg b/assets/logos/kogral-mono-black-v.svg new file mode 100644 index 0000000..e762f15 --- /dev/null +++ b/assets/logos/kogral-mono-black-v.svg @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logos/kogral-mono-white-h.svg b/assets/logos/kogral-mono-white-h.svg new file mode 100644 index 0000000..a3e89f4 --- /dev/null +++ b/assets/logos/kogral-mono-white-h.svg @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logos/kogral-mono-white-v.svg b/assets/logos/kogral-mono-white-v.svg new file mode 100644 index 0000000..f3e3eda --- /dev/null +++ b/assets/logos/kogral-mono-white-v.svg @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logos/kogral-v-static.svg b/assets/logos/kogral-v-static.svg new file mode 100644 index 0000000..b2d0712 --- /dev/null +++ b/assets/logos/kogral-v-static.svg @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logos/kogral-v.svg b/assets/logos/kogral-v.svg new file mode 100644 index 0000000..c3a4820 --- /dev/null +++ b/assets/logos/kogral-v.svg @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/web/README.md b/assets/web/README.md new file mode 100644 index 0000000..5b9fdc8 --- /dev/null +++ b/assets/web/README.md @@ -0,0 +1,328 @@ +# KOGRAL Web Assets + +Web-based landing page and static content for KOGRAL. + +## Directory Structure + +```text +assets/web/ +├── src/ +│ ├── index.html # Source HTML (readable) +│ └── kogral.svg # Logo for landing page +├── index.html # Minified/Production HTML +├── kogral.svg # Logo for landing page +├── minify.sh # Minification script +└── README.md # This file +``` + +## Files + +### `src/index.html` - Source Version + +- **Purpose**: Development and maintenance +- **Content**: + - Full formatting and indentation + - Inline CSS and JavaScript + - Bilingual (English/Spanish) content + - Language-aware dynamic switching + - Knowledge graph showcase + - Technology stack display + - Core components grid + +**Use for:** + +- Editing content +- Understanding structure +- Version control +- Making translation updates + +### `index.html` - Production Version + +- **Purpose**: Served to browsers (fast loading) +- **Optimizations**: + - Removed all comments + - Compressed CSS (removed spaces, combined rules) + - Minified JavaScript (single line) + - Removed whitespace between tags + - Preserved all functionality + +**Use for:** + +- Production web server +- CDN distribution +- Browser caching +- Fast load times + +### `kogral.svg` - Logo + +- **Purpose**: Landing page branding +- **Source**: Copy of `../logos/kogral-h.svg` (horizontal logo) +- **Dimensions**: 610×200px (viewBox 0 0 610 200) +- **Features**: Animated knowledge graph nodes, connections, and text + +## How to Use + +### Development + +Edit `src/index.html`: + +```bash +# Edit source file +nano assets/web/src/index.html + +# Regenerate minified version (see below) +./assets/web/minify.sh +``` + +### Update Minified Version + +When you update `src/index.html`, regenerate `index.html`: + +```bash +# Using minify.sh script +cd /path/to/kogral +./assets/web/minify.sh + +# Or manually +cd /path/to/kogral +perl -e ' +use strict; +use warnings; + +open(my $fh, "<", "assets/web/src/index.html") or die $!; +my $content = do { local $/; <$fh> }; +close($fh); + +# Remove comments +$content =~ s///gs; + +# Compress whitespace in style tags +$content =~ s/(]*>)(.*?)(<\/style>)/ + my $before = $1; + my $style = $2; + my $after = $3; + $style =~ s{\/\*.*?\*\/}{}gs; + $style =~ s{\s+}{ }gs; + $style =~ s{\s*([{}:;,>+~])\s*}{$1}gs; + $before . $style . $after; +/gies; + +# Compress whitespace in script tags +$content =~ s/(]*>)(.*?)(<\/script>)/ + my $before = $1; + my $script = $2; + my $after = $3; + $script =~ s{\/\/.*$}{}gm; + $script =~ s{\s+}{ }gs; + $script =~ s{\s*([{}();,])\s*}{$1}gs; + $before . $script . $after; +/gies; + +# Remove whitespace between tags +$content =~ s/>\s+", "assets/web/index.html") or die $!; +print $out $content; +close($out); + +print "✅ Minified version created\n"; +' +``` + +### Deployment + +Serve `index.html` from your web server: + +```bash +# Using Rust +cargo install static-web-server +static-web-server -d assets/web/ + +# Using Python +python3 -m http.server --directory assets/web + +# Using Node.js +npx http-server assets/web + +# Using nginx +# Point root to assets/web/ +# Serve index.html as default +``` + +## Features + +### Responsive Design + +- Mobile-first approach +- Flexbox and Grid layouts +- Media queries for mobile +- Touch-friendly navigation + +### Performance + +- Inline CSS (no separate requests) +- Inline JavaScript (no blocking external scripts) +- Minimal dependencies (no frameworks) +- Optimized minified size + +### Bilingual + +- English and Spanish +- LocalStorage persistence +- Data attributes for translations +- Dynamic language switching + +### Modern CSS + +- CSS Gradients +- Animations (fadeInUp) +- Hover effects +- Grid and Flexbox layouts + +### Styling + +- KOGRAL color scheme (Blue #4a9eff, Green #3dd68d, Gold #fbbf24) +- Gradient backgrounds +- Inter font family +- Smooth transitions + +## Content Sections + +1. **Hero** - Title, tagline, logo, version badge +2. **Problems** - 4 knowledge management problems KOGRAL solves + - Scattered documentation + - No version control for decisions + - Lost context over time + - Isolated team knowledge +3. **How It Works** - Feature overview (Markdown-native, Semantic Search, Config-driven, Claude Code) +4. **Technology Stack** - Tech badges (Rust, Nickel, SurrealDB, fastembed, MCP, Logseq, etc.) +5. **Core Components** - Component showcase (kogral-core, kogral-cli, kogral-mcp, etc.) +6. **CTA** - Call-to-action button linking to GitHub +7. **Footer** - Credits and tagline + +## Translations + +All text content is bilingual. Edit data attributes in `src/index.html`: + +```html + +Knowledge Graphs +``` + +The JavaScript automatically updates based on selected language. + +## Color Scheme + +KOGRAL branding colors: + +- **Primary Blue**: `#4a9eff` - Main brand color +- **Secondary Green**: `#3dd68d` - Highlights and active states +- **Gold Accent**: `#fbbf24` - Gradient accents +- **Slate**: `#64748b` - Secondary text +- **Dark Background**: `#0a0a14` - Main background + +## Maintenance + +- Source edits go in `src/index.html` +- Regenerate `index.html` when source changes +- Both files are versioned in git +- Keep them in sync + +## Git Workflow + +```bash +# Edit source +nano assets/web/src/index.html + +# Regenerate minified version +./assets/web/minify.sh + +# Commit changes +git add assets/web/src/index.html +git add assets/web/index.html +git commit -m "Update landing page content" +git push +``` + +## File Sizes + +Source and production versions: + +| File | Type | +|------|------| +| `src/index.html` | Source (readable, formatted) | +| `index.html` | Production (minified, optimized) | +| `kogral.svg` | ~15KB (animated horizontal logo) | + +## Version Information + +- **Last Updated**: 2026-01-23 +- **Version**: 0.1.0 +- **Format**: HTML5 + CSS3 + ES6 +- **Compatibility**: All modern browsers +- **Languages**: English, Spanish + +## Technology Focus + +**KOGRAL** landing page emphasizes: + +- 📝 Git-native knowledge management +- 🔍 Semantic search with embeddings +- ⚙️ Config-driven architecture (Nickel) +- 🤖 Claude Code integration (MCP) +- 📊 6 node types, 6 relationships +- 🗄️ Multi-backend storage (Filesystem, SurrealDB, Memory) + +## Features Highlighted + +### 4 Core Problems Solved + +1. **Scattered Documentation** - Unifies notes, decisions, guidelines across tools +2. **No Version Control** - Git-tracked ADRs with full history +3. **Lost Context** - Semantic search and relationship tracking +4. **Isolated Knowledge** - Multi-graph architecture with inheritance + +### How It Works + +1. **Markdown-Native** - YAML frontmatter, wikilinks, code references +2. **Semantic Search** - Vector embeddings, local or cloud +3. **Config-Driven** - Nickel schemas, 3 modes (dev/prod/test) +4. **Claude Code** - MCP server with 7 tools, 6 resources, 2 prompts + +### Technology Stack + +- Rust Edition 2021 +- Nickel Config +- SurrealDB +- fastembed (local embeddings) +- rig-core (cloud embeddings) +- MCP Protocol +- Logseq Compatible +- Nushell Scripts + +### Core Components + +- **kogral-core** - Core library +- **kogral-cli** - 13 commands +- **kogral-mcp** - MCP server +- **Config System** - Nickel schemas +- **3 Storage Backends** - Filesystem, SurrealDB, Memory +- **2 Embedding Providers** - FastEmbed, rig-core +- **6 Node Types** - Note, Decision, Guideline, Pattern, Journal, Execution +- **6 Relationships** - relates_to, depends_on, implements, extends, supersedes, explains + +## Quality Metrics + +- 3 Rust crates +- 56 tests passing +- 15K lines of code +- 0 unsafe blocks +- 100% documentation coverage +- 0 clippy warnings + +--- + +**Last Updated**: 2026-01-23 +**Version**: 0.1.0 (matches KOGRAL release) diff --git a/assets/web/index.html b/assets/web/index.html new file mode 100644 index 0000000..5576cf1 --- /dev/null +++ b/assets/web/index.html @@ -0,0 +1 @@ + KOGRAL
✅ v0.1.0
KOGRAL - Git-Native Knowledge Graphs

Git-Native Knowledge Management

Knowledge Graphs

Structured knowledge management that scales from solo projects to organizations. Config-driven architecture for capturing architectural decisions, coding guidelines, and reusable patterns in version-controlled markdown.
100% Rust. Zero compromises.

The 4 Problems It Solves

01

Scattered Documentation

  • Notes in Notion
  • Decisions in Slack
  • Guidelines in wikis—all disconnected
  • KOGRAL unifies with git-native markdown + MCP
02

No Version Control for Decisions

  • Architectural decisions lost in chat history
  • No traceability for why code exists
  • KOGRAL: Git-tracked ADRs with full history
  • Link decisions directly to code with @file:line
03

Lost Context Over Time

  • Team members join and can't find past decisions
  • Outdated documentation causes repeated mistakes
  • KOGRAL: Semantic search across your knowledge base
  • Relationship tracking shows why patterns exist
04

Isolated Team Knowledge

  • Every project reinvents the wheel
  • Patterns can't be shared across teams
  • KOGRAL: Multi-graph architecture
  • Shared organizational knowledge + project-specific overrides
  • Inheritance system for guidelines

How It Works

📝

Markdown-Native

  • YAML frontmatter for metadata
  • Wikilinks [[like-this]] for relationships
  • Code references @file.rs:42
  • Logseq-compatible format
  • Human-readable, Git-friendly
🔍

Semantic Search

  • Text search across all nodes
  • Vector embeddings for semantic queries
  • Local embeddings (fastembed, no API costs)
  • Cloud APIs supported (OpenAI, Claude, Ollama)
  • Find related knowledge automatically
⚙️

Config-Driven

  • Nickel schemas with validation
  • 3 modes: dev, prod, test
  • Storage backend selection (filesystem, SurrealDB, in-memory)
  • Embedding provider configuration
  • No hardcoded paths or settings
🤖

Claude Code Integration

  • MCP server (Model Context Protocol)
  • 7 tools: search, add notes/decisions, link, export
  • 6 resources: project/shared graphs
  • 2 prompts: summarize project, find related
  • JSON-RPC 2.0 over stdio

Technology Stack

Rust Edition 2021Nickel ConfigSurrealDBfastembedrig-coreMCP ProtocolLogseq CompatibleTera TemplatesClap CLIDashMapNushell ScriptsmdBook Docs

Core Components

kogral-coreCore library
kogral-cli13 commands
kogral-mcpMCP server
Config SystemNickel schemas
3 Storage BackendsFilesystem, SurrealDB, Memory
2 Embedding ProvidersFastEmbed, rig-core
6 Node TypesNote, Decision, Guideline, Pattern, Journal, Execution
6 Relationshipsrelates_to, depends_on, implements, extends, supersedes, explains
Multi-GraphProject + Shared
56 Tests PassingQuality assurance
0 Unsafe CodeMemory safety
100% Doc CoveragePublic APIs documented

Ready to organize your knowledge?

3 Crates | 56 Tests | 15K LOC | 100% Rust 🦀

Get Started →

KOGRAL v0.1.0

Built with Rust • Configuration with Nickel

Git-Native Knowledge Graphs for Developer Teams

\ No newline at end of file diff --git a/assets/web/kogral.svg b/assets/web/kogral.svg new file mode 100644 index 0000000..ef28420 --- /dev/null +++ b/assets/web/kogral.svg @@ -0,0 +1,354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/web/minify.sh b/assets/web/minify.sh new file mode 100755 index 0000000..c42d733 --- /dev/null +++ b/assets/web/minify.sh @@ -0,0 +1,87 @@ +#!/bin/bash +# Minify index.html from src/ to production version +# Usage: ./minify.sh + +set -e + +SRC_FILE="$(dirname "$0")/src/index.html" +OUT_FILE="$(dirname "$0")/index.html" +TEMP_FILE="${OUT_FILE}.tmp" + +if [ ! -f "$SRC_FILE" ]; then + echo "❌ Source file not found: $SRC_FILE" + exit 1 +fi + +echo "🔨 Minifying HTML..." +echo " Input: $SRC_FILE" +echo " Output: $OUT_FILE" + +perl -e " +use strict; +use warnings; + +open(my \$fh, '<', '$SRC_FILE') or die \$!; +my \$content = do { local \$/; <\$fh> }; +close(\$fh); + +# Remove HTML comments +\$content =~ s///gs; + +# Compress CSS (remove spaces and comments) +\$content =~ s/(]*>)(.*?)(<\/style>)/ + my \$before = \$1; + my \$style = \$2; + my \$after = \$3; + \$style =~ s{\/\*.*?\*\/}{}gs; + \$style =~ s{\s+}{ }gs; + \$style =~ s{\s*([{}:;,>+~])\s*}{\$1}gs; + \$before . \$style . \$after; +/gies; + +# Compress JavaScript (remove comments and extra spaces) +\$content =~ s/(]*>)(.*?)(<\/script>)/ + my \$before = \$1; + my \$script = \$2; + my \$after = \$3; + \$script =~ s{\/\/.*\$}{}gm; + \$script =~ s{\s+}{ }gs; + \$script =~ s{\s*([{}();,])\s*}{\$1}gs; + \$before . \$script . \$after; +/gies; + +# Remove whitespace between tags +\$content =~ s/>\s+', '$TEMP_FILE') or die \$!; +print \$out \$content; +close(\$out); +" || { + echo "❌ Minification failed" + rm -f "$TEMP_FILE" + exit 1 +} + +mv "$TEMP_FILE" "$OUT_FILE" + +# Show statistics +original=$(wc -c < "$SRC_FILE") +minified=$(wc -c < "$OUT_FILE") +saved=$((original - minified)) +percent=$((saved * 100 / original)) + +echo "" +echo "✅ Minification complete!" +echo "" +echo "📊 Compression statistics:" +printf " Original: %6d bytes\n" "$original" +printf " Minified: %6d bytes\n" "$minified" +printf " Saved: %6d bytes (%d%%)\n" "$saved" "$percent" +echo "" +echo "✅ $OUT_FILE is ready for production" diff --git a/assets/web/src/index.html b/assets/web/src/index.html new file mode 100644 index 0000000..1e4f96e --- /dev/null +++ b/assets/web/src/index.html @@ -0,0 +1,956 @@ + + + + + + + KOGRAL + + + + + +
+ +
+ + +
+ +
+
+ ✅ v0.1.0 +
+ KOGRAL - Git-Native Knowledge Graphs +
+

Git-Native Knowledge Management

+

+ Knowledge Graphs +

+

+ Structured knowledge management that scales from solo projects to organizations. Config-driven architecture for capturing architectural decisions, coding guidelines, and reusable patterns in version-controlled markdown. + +
100% Rust. Zero compromises. + +

+
+ +
+

+ The 4 Problems It Solves +

+
+
+
01
+

+ Scattered Documentation +

+
    +
  • Notes in Notion
  • +
  • Decisions in Slack
  • +
  • Guidelines in wikis—all disconnected
  • +
  • KOGRAL unifies with git-native markdown + MCP
  • +
+
+
+
02
+

+ No Version Control for Decisions +

+
    +
  • Architectural decisions lost in chat history
  • +
  • No traceability for why code exists
  • +
  • KOGRAL: Git-tracked ADRs with full history
  • +
  • Link decisions directly to code with @file:line
  • +
+
+
+
03
+

+ Lost Context Over Time +

+
    +
  • Team members join and can't find past decisions
  • +
  • Outdated documentation causes repeated mistakes
  • +
  • KOGRAL: Semantic search across your knowledge base
  • +
  • Relationship tracking shows why patterns exist
  • +
+
+
+
04
+

+ Isolated Team Knowledge +

+
    +
  • Every project reinvents the wheel
  • +
  • Patterns can't be shared across teams
  • +
  • KOGRAL: Multi-graph architecture
  • +
  • Shared organizational knowledge + project-specific overrides
  • +
  • Inheritance system for guidelines
  • +
+
+
+
+ +
+

+ How It Works +

+
+
+
📝
+

+ Markdown-Native +

+
    +
  • YAML frontmatter for metadata
  • +
  • Wikilinks [[like-this]] for relationships
  • +
  • Code references @file.rs:42
  • +
  • Logseq-compatible format
  • +
  • Human-readable, Git-friendly
  • +
+
+
+
🔍
+

+ Semantic Search +

+
    +
  • Text search across all nodes
  • +
  • Vector embeddings for semantic queries
  • +
  • Local embeddings (fastembed, no API costs)
  • +
  • Cloud APIs supported (OpenAI, Claude, Ollama)
  • +
  • Find related knowledge automatically
  • +
+
+
+
⚙️
+

+ Config-Driven +

+
    +
  • Nickel schemas with validation
  • +
  • 3 modes: dev, prod, test
  • +
  • Storage backend selection (filesystem, SurrealDB, in-memory)
  • +
  • Embedding provider configuration
  • +
  • No hardcoded paths or settings
  • +
+
+
+
🤖
+

+ Claude Code Integration +

+
    +
  • MCP server (Model Context Protocol)
  • +
  • 7 tools: search, add notes/decisions, link, export
  • +
  • 6 resources: project/shared graphs
  • +
  • 2 prompts: summarize project, find related
  • +
  • JSON-RPC 2.0 over stdio
  • +
+
+
+
+ +
+

+ Technology Stack +

+
+ Rust Edition 2021 + Nickel Config + SurrealDB + fastembed + rig-core + MCP Protocol + Logseq Compatible + Tera Templates + Clap CLI + DashMap + Nushell Scripts + mdBook Docs +
+
+ +
+

+ Core Components +

+
+
+ kogral-coreCore library +
+
+ kogral-cli13 commands +
+
+ kogral-mcpMCP server +
+
+ Config SystemNickel schemas +
+
+ 3 Storage BackendsFilesystem, SurrealDB, Memory +
+
+ 2 Embedding ProvidersFastEmbed, rig-core +
+
+ 6 Node TypesNote, Decision, Guideline, Pattern, Journal, Execution +
+
+ 6 Relationshipsrelates_to, depends_on, implements, extends, supersedes, explains +
+
+ Multi-GraphProject + Shared +
+
+ 56 Tests PassingQuality assurance +
+
+ 0 Unsafe CodeMemory safety +
+
+ 100% Doc CoveragePublic APIs documented +
+
+
+ +
+

+ Ready to organize your knowledge? +

+

+ 3 Crates | 56 Tests | 15K LOC | 100% Rust 🦀 +

+ Get Started → +
+ +
+

KOGRAL v0.1.0

+

+ Built with Rust • Configuration with Nickel +

+

+ Git-Native Knowledge Graphs for Developer Teams +

+
+
+ + + + diff --git a/assets/web/src/kogral.svg b/assets/web/src/kogral.svg new file mode 100644 index 0000000..ef28420 --- /dev/null +++ b/assets/web/src/kogral.svg @@ -0,0 +1,354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..4aad622 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,354 @@ +# KOGRAL Documentation + +
KoGraL Logo
+ +Welcome to the KOGRAL documentation! This directory contains comprehensive documentation for KOGRAL (**KO**wledge **GRA**phs, **L**ocal-first), built with [mdBook](https://rust-lang.github.io/mdBook/). + +## 📚 Reading the Documentation + +You have several options for reading the documentation: + +### Option 1: Serve Locally with mdBook (Recommended) + +The best reading experience with navigation, search, and live reload: + +```bash +# Serve documentation at http://localhost:3000 +just docs::serve +``` + +This will: +- Build the mdBook +- Start a local web server on port 3000 +- Open your browser automatically +- Watch for changes and auto-reload + +### Option 2: Build Static HTML + +Generate static HTML files you can browse offline: + +```bash +# Build mdBook to docs/book/ +just docs::build +``` + +Then open `docs/book/index.html` in your browser. + +### Option 3: Read Markdown Files Directly + +All documentation is written in Markdown and can be read directly: + +- Browse via GitHub/GitLab web interface +- Use your editor's Markdown preview +- Read from terminal with `bat`, `glow`, or similar tools + +**Navigation**: See [SUMMARY.md](SUMMARY.md) for the complete table of contents. + +## 🛠️ Documentation Commands + +We use `just` recipes for documentation tasks. All commands assume you're in the project root directory. + +### Build and Serve + +```bash +# Serve documentation locally (recommended) +just docs::serve + +# Build static HTML +just docs::build + +# Watch and rebuild on file changes +just docs::watch +``` + +### Validation + +```bash +# Test code examples in documentation +just docs::test + +# Check for broken links +just docs::check-links +``` + +### Cleanup + +```bash +# Remove build artifacts +just docs::clean +``` + +### View All Documentation Commands + +```bash +just docs::help +``` + +## 📦 Installing mdBook + +mdBook is required to build and serve the documentation. + +### Install via Cargo + +```bash +cargo install mdbook +``` + +### Install Optional Tools + +For enhanced functionality: + +```bash +# Link checker (validates internal/external links) +cargo install mdbook-linkcheck + +# Mermaid diagram support +cargo install mdbook-mermaid + +# PlantUML diagram support +cargo install mdbook-plantuml +``` + +### Verify Installation + +```bash +mdbook --version +# Should output: mdbook v0.4.x or later +``` + +## 📖 Documentation Structure + +The documentation is organized into the following sections: + +### 1. **KOGRAL Definition** (`kogral/`) +- What is KOGRAL and why it exists +- Core concepts (nodes, edges, graphs) +- Design philosophy + +### 2. **Guides** (`guides/`) +- Quick start (5 minutes) +- Installation guide +- Use cases with examples + +### 3. **Architecture** (`architecture/`) +- System overview with diagrams +- Config-driven architecture +- Graph model details +- ADRs (Architectural Decision Records) + +### 4. **Setup** (`setup/`) +- Initial setup +- Development environment +- Production deployment +- Testing environment +- CI/CD integration + +### 5. **Configuration** (`config/`) +- Configuration overview +- Nickel schema reference +- Runtime configuration +- Environment modes (dev/prod/test) + +### 6. **Storage** (`storage/`) +- Storage architecture (hybrid strategy) +- Filesystem backend +- SurrealDB backend +- In-memory backend +- Sync mechanism + +### 7. **AI & Embeddings** (`ai/`) +- Semantic search +- Embedding providers +- Provider comparison +- Configuration examples + +### 8. **Templates** (`templates/`) +- Template system (Tera) +- Document templates +- Export templates +- Custom templates + +### 9. **CLI Reference** (`cli/`) +- All kogral-cli commands +- Common workflows +- Advanced usage +- Troubleshooting + +### 10. **Apps & Integrations** (`apps/`) +- MCP quick guide (Claude Code) +- Logseq integration +- Vapora integration + +### 11. **API Reference** (`api/`) +- MCP tools specification +- Storage trait +- Embedding trait +- REST API (future) + +### 12. **Contributing** (`contributing/`) +- Development setup +- Code guidelines +- Testing standards +- Documentation guidelines + +## 🎨 Visual Diagrams + +The documentation includes SVG diagrams for visual understanding: + +- **[architecture-overview.svg](diagrams/architecture-overview.svg)** - Complete system architecture +- **[core-concepts.svg](diagrams/core-concepts.svg)** - Node types and relationships +- **[config-composition.svg](diagrams/config-composition.svg)** - Configuration flow (Nickel → JSON → Rust) +- **[storage-architecture.svg](diagrams/storage-architecture.svg)** - Hybrid storage strategy + +These diagrams are embedded in relevant documentation pages and can be viewed standalone in a browser. + +## 🔍 Searching the Documentation + +When using `just docs::serve`, you get a built-in search feature: + +1. Click the search icon (🔍) in the top-left corner +2. Type your query +3. Press Enter to navigate results + +The search indexes all documentation content including: +- Page titles +- Headers +- Body text +- Code examples (optionally) + +## ✏️ Editing Documentation + +### File Format + +All documentation is written in **GitHub Flavored Markdown** with mdBook extensions. + +See [contributing/documentation.md](contributing/documentation.md) for detailed editing guidelines. + +### Adding a New Page + +1. Create the markdown file in the appropriate directory +2. Add it to `SUMMARY.md` for navigation +3. Build to verify: `just docs::build` + +### Adding a New Section + +1. Create the directory +2. Add a `README.md` for the section landing page +3. Add section to `SUMMARY.md` + +## 🧪 Testing Documentation + +### Test Code Examples + +```bash +just docs::test +``` + +This runs all Rust code examples in the documentation to ensure they compile. + +### Check Links + +```bash +just docs::check-links +``` + +This validates all internal and external links. + +## 📝 Documentation Standards + +When contributing to documentation: + +1. **Use clear, concise language** - Write for developers and AI agents +2. **Include code examples** - Show, don't just tell +3. **Add diagrams where helpful** - Visual aids improve understanding +4. **Link related concepts** - Help readers discover related content +5. **Test code examples** - Ensure code compiles and works +6. **Use consistent formatting** - Follow existing page structure +7. **Update SUMMARY.md** - New pages must be in navigation +8. **Run checks before committing**: + +```bash +just docs::build +just docs::test +just docs::check-links +``` + +## 💡 Tips + +### Live Reload While Writing + +```bash +just docs::watch +``` + +This watches for changes and rebuilds automatically. Open in your browser to see updates in real-time. + +### Markdown Preview in Editor + +Most editors have Markdown preview: + +- **VS Code**: `Ctrl+Shift+V` (Cmd+Shift+V on Mac) +- **IntelliJ/CLion**: Preview pane (right side) +- **Vim/Neovim**: Use plugins like `markdown-preview.nvim` + +### Quick Reference + +- **SUMMARY.md** - Table of contents (edit to add/remove pages) +- **book.toml** - mdBook configuration +- **theme/** - Custom CSS/JS (if needed) +- **diagrams/** - SVG diagrams + +## 🐛 Troubleshooting + +### mdbook command not found + +```bash +# Install mdBook +cargo install mdbook + +# Verify installation +mdbook --version +``` + +### Port 3000 already in use + +```bash +# Serve on different port +cd docs +mdbook serve --port 3001 +``` + +### Links broken after moving files + +```bash +# Check all links +just docs::check-links + +# Update internal links in affected files +# Then rebuild +just docs::build +``` + +## 📚 Resources + +- [mdBook User Guide](https://rust-lang.github.io/mdBook/) +- [GitHub Flavored Markdown Spec](https://github.github.com/gfm/) +- [Markdown Guide](https://www.markdownguide.org/) + +## 🤝 Contributing to Documentation + +Documentation improvements are always welcome! To contribute: + +1. Fork the repository +2. Create a feature branch +3. Make your changes +4. Test with `just docs::build` and `just docs::test` +5. Submit a pull request + +See [contributing/documentation.md](contributing/documentation.md) for detailed guidelines. + +--- + +**Happy documenting! 📖** + +If you have questions or need help, please open an issue or reach out to the maintainers. diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md new file mode 100644 index 0000000..53ef1b0 --- /dev/null +++ b/docs/SUMMARY.md @@ -0,0 +1,103 @@ +# Summary + +[Introduction](README.md) + +# Project Definition + +- [What is KOGRAL?](kogral/what-is-kogral.md) +- [Core Concepts](kogral/core-concepts.md) +- [Why KOGRAL?](kogral/why-kogral.md) +- [Design Philosophy](kogral/design-philosophy.md) + +# Guides + +- [Installation](guides/installation.md) +- [Quick Start](guides/quickstart.md) +- [Daily Workflows](guides/daily-workflows.md) +- [Use Cases](guides/use-cases.md) +- [Best Practices](guides/best-practices.md) + +# Architecture + +- [System Overview](architecture/overview.md) +- [Graph Model](architecture/graph-model.md) +- [Config-Driven Design](architecture/config-driven.md) +- [Storage Architecture](architecture/storage-architecture.md) +- [Logseq Blocks Design](architecture/logseq-blocks-design.md) + +## ADRs + +- [ADR-001: Nickel vs TOML for Configuration](architecture/adrs/001-nickel-vs-toml.md) +- [ADR-002: FastEmbed via AI Providers](architecture/adrs/002-fastembed-ai-providers.md) +- [ADR-003: Hybrid Storage Strategy](architecture/adrs/003-hybrid-storage.md) +- [ADR-004: Logseq Blocks Support](architecture/adrs/004-logseq-blocks-support.md) +- [ADR-005: MCP Protocol for AI Integration](architecture/adrs/005-mcp-protocol.md) + +# Setup + +- [Prerequisites](setup/prerequisites.md) +- [Installation Methods](setup/installation.md) +- [Project Initialization](setup/project-init.md) +- [Environment Configuration](setup/environment.md) +- [Verification](setup/verification.md) + +# Configuration + +- [Configuration Overview](config/overview.md) +- [Nickel Schemas](config/nickel-schemas.md) +- [Graph Settings](config/graph-settings.md) +- [Inheritance](config/inheritance.md) +- [Examples](config/examples.md) + +# Storage + +- [Storage Backends](storage/backends.md) +- [Filesystem Storage](storage/filesystem.md) +- [SurrealDB Storage](storage/surrealdb.md) +- [In-Memory Storage](storage/memory.md) +- [Sync Strategies](storage/sync.md) + +# AI & Embeddings + +- [Embeddings Overview](ai/embeddings-overview.md) +- [Provider Configuration](ai/providers.md) +- [FastEmbed Local](ai/fastembed.md) +- [OpenAI Integration](ai/openai.md) +- [Claude Integration](ai/claude.md) +- [Ollama Integration](ai/ollama.md) +- [Semantic Search](ai/semantic-search.md) + +# Templates + +- [Template System](templates/overview.md) +- [Document Templates](templates/documents.md) +- [Export Templates](templates/export.md) +- [Customization](templates/customization.md) + +# CLI + +- [CLI Overview](cli/overview.md) +- [Commands Reference](cli/commands.md) +- [Workflows](cli/workflows.md) +- [NuShell Scripts](cli/nushell-scripts.md) + +# Apps & Connections + +- [MCP Quick Guide](apps/mcp-quickguide.md) +- [Claude Code Integration](apps/claude-code.md) +- [Logseq Integration](apps/logseq.md) +- [Obsidian Compatibility](apps/obsidian.md) +- [Git Workflows](apps/git.md) + +# API Reference + +- [MCP Protocol](api/mcp-protocol.md) +- [Tools Reference](api/mcp-tools.md) +- [Resources](api/mcp-resources.md) +- [Rust API](api/rust-api.md) + +# Contributing + +- [Development Setup](contributing/development.md) +- [Code Standards](contributing/standards.md) +- [Testing](contributing/testing.md) diff --git a/docs/ai/embeddings-overview.md b/docs/ai/embeddings-overview.md new file mode 100644 index 0000000..5d1c7ad --- /dev/null +++ b/docs/ai/embeddings-overview.md @@ -0,0 +1 @@ +# Embeddings Overview diff --git a/docs/ai/fastembed.md b/docs/ai/fastembed.md new file mode 100644 index 0000000..46b26bf --- /dev/null +++ b/docs/ai/fastembed.md @@ -0,0 +1 @@ +# FastEmbed Local diff --git a/docs/ai/ollama.md b/docs/ai/ollama.md new file mode 100644 index 0000000..481249e --- /dev/null +++ b/docs/ai/ollama.md @@ -0,0 +1 @@ +# Ollama Integration diff --git a/docs/ai/openai.md b/docs/ai/openai.md new file mode 100644 index 0000000..71042f0 --- /dev/null +++ b/docs/ai/openai.md @@ -0,0 +1 @@ +# OpenAI Integration diff --git a/docs/ai/providers.md b/docs/ai/providers.md new file mode 100644 index 0000000..d687c56 --- /dev/null +++ b/docs/ai/providers.md @@ -0,0 +1 @@ +# Provider Configuration diff --git a/docs/ai/semantic-search.md b/docs/ai/semantic-search.md new file mode 100644 index 0000000..95a7eed --- /dev/null +++ b/docs/ai/semantic-search.md @@ -0,0 +1 @@ +# Semantic Search diff --git a/docs/api/README.md b/docs/api/README.md new file mode 100644 index 0000000..da69370 --- /dev/null +++ b/docs/api/README.md @@ -0,0 +1,229 @@ +# API Reference + +API documentation for the Knowledge Base system. + +## Available APIs + +- [MCP Tools](mcp-tools.md) - Model Context Protocol tools and resources for Claude Code integration +- [Rust API](rust-api.md) - kogral-core library API for programmatic access + +## Overview + +The Knowledge Base system provides multiple API layers: + +### MCP Protocol + +JSON-RPC 2.0 protocol for Claude Code integration: +- 7 Tools for interacting with knowledge base +- 6 Resources for accessing knowledge graphs +- 2 Prompts for guided workflows + +See [MCP Tools](mcp-tools.md) for complete reference. + +### Rust Library + +Direct programmatic access via kogral-core: + +```rust +use kb_core::prelude::*; + +// Load a graph +let storage = FilesystemStorage::new(".kogral")?; +let graph = storage.load_graph("default").await?; + +// Query nodes +let results = graph.nodes.values() + .filter(|n| n.tags.contains(&"rust".to_string())) + .collect::>(); +``` + +See [Rust API](rust-api.md) for complete reference. + +## Quick Reference + +### Common MCP Operations + +```json +// Search knowledge base +{ + "jsonrpc": "2.0", + "method": "kogral/search", + "params": { + "query": "error handling", + "type": "guideline", + "semantic": true + } +} + +// Add a note +{ + "jsonrpc": "2.0", + "method": "kogral/add_note", + "params": { + "title": "New Discovery", + "content": "Interesting finding about...", + "tags": ["research", "rust"] + } +} + +// Get guidelines +{ + "jsonrpc": "2.0", + "method": "kogral/get_guidelines", + "params": { + "language": "rust", + "category": "error-handling" + } +} +``` + +### Common Rust Operations + +```rust +// Create a new graph +let mut graph = Graph::new("my-project".to_string()); + +// Add a node +let node = Node { + id: "note-1".to_string(), + node_type: NodeType::Note, + title: "Example Note".to_string(), + content: "Note content".to_string(), + tags: vec!["rust".to_string()], + status: NodeStatus::Active, + // ... +}; +graph.add_node(node)?; + +// Create a relationship +let edge = Edge::new( + "note-1".to_string(), + "note-2".to_string(), + EdgeType::RelatesTo, +); +graph.add_edge(edge)?; + +// Save graph +storage.save_graph(&graph).await?; +``` + +## Authentication + +### MCP Server + +No authentication required for stdio transport (local use). + +For remote access (SSE transport), configure API keys in environment: + +```bash +export KB_API_KEY="your-api-key" +``` + +### Rust Library + +No authentication needed for local filesystem access. + +For SurrealDB backend, configure credentials: + +```rust +let config = SurrealDbConfig { + url: "ws://localhost:8000".to_string(), + namespace: "kb".to_string(), + database: "default".to_string(), + username: Some("root".to_string()), + password: Some("root".to_string()), +}; +let storage = SurrealDbStorage::new(config).await?; +``` + +## Error Handling + +All APIs use structured error types: + +### MCP Errors + +JSON-RPC error responses: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "error": { + "code": -32600, + "message": "Invalid request", + "data": { + "details": "Missing required parameter: query" + } + } +} +``` + +Error codes: +- `-32700`: Parse error +- `-32600`: Invalid request +- `-32601`: Method not found +- `-32602`: Invalid params +- `-32603`: Internal error + +### Rust Errors + +`KbError` enum with thiserror: + +```rust +pub enum KbError { + #[error("Storage error: {0}")] + Storage(String), + + #[error("Node not found: {0}")] + NodeNotFound(String), + + #[error("Invalid configuration: {0}")] + Config(String), + + #[error("Parse error: {0}")] + Parse(String), +} +``` + +## Rate Limiting + +MCP server has no rate limiting for local stdio use. + +For production deployments with remote access, configure rate limits: + +```nickel +mcp = { + rate_limit = { + enabled = true, + requests_per_minute = 60, + }, +} +``` + +## Versioning + +API follows semantic versioning: + +- **Major version**: Breaking changes to API +- **Minor version**: New features, backward compatible +- **Patch version**: Bug fixes, backward compatible + +Current version: `1.0.0` + +## Deprecation Policy + +- Deprecated features marked in documentation +- Minimum 1 major version before removal +- Migration guide provided + +## Support + +- File issues on GitHub +- Check documentation updates +- Join community discussions + +## See Also + +- [MCP Specification](https://modelcontextprotocol.io/docs) +- [kogral-core Documentation](../../crates/kogral-core/README.md) +- [Configuration Reference](../user-guide/configuration.md) diff --git a/docs/api/mcp-protocol.md b/docs/api/mcp-protocol.md new file mode 100644 index 0000000..3d7fbf8 --- /dev/null +++ b/docs/api/mcp-protocol.md @@ -0,0 +1 @@ +# MCP Protocol diff --git a/docs/api/mcp-resources.md b/docs/api/mcp-resources.md new file mode 100644 index 0000000..3c1229e --- /dev/null +++ b/docs/api/mcp-resources.md @@ -0,0 +1 @@ +# Resources diff --git a/docs/api/mcp-tools.md b/docs/api/mcp-tools.md new file mode 100644 index 0000000..6b90ead --- /dev/null +++ b/docs/api/mcp-tools.md @@ -0,0 +1,902 @@ +# MCP Tools API Reference + +Complete reference for the Model Context Protocol (MCP) server tools and resources. + +## Overview + +The kogral-mcp server implements the MCP protocol (JSON-RPC 2.0) for Claude Code integration. It provides: + +- **10 Tools**: Operations for querying and modifying knowledge base (7 core + 3 block tools) +- **6 Resources**: Access to knowledge graph content via URIs +- **2 Prompts**: Guided workflows for common tasks + +## Server Configuration + +### Start MCP Server + +```bash +# Stdio transport (local use) +kogral serve + +# Or run directly +kogral-mcp serve +``` + +### Claude Code Configuration + +Add to `~/.config/claude/config.json`: + +```json +{ + "mcpServers": { + "kogral-mcp": { + "command": "/path/to/kogral-mcp", + "args": ["serve"], + "env": { + "KOGRAL_DIR": "/path/to/project/.kogral" + } + } + } +} +``` + +## Tools + +### kogral/search + +Search the knowledge base using text and/or semantic similarity. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Search query" + }, + "type": { + "type": "string", + "enum": ["note", "decision", "guideline", "pattern", "journal", "execution", "all"], + "description": "Filter by node type", + "default": "all" + }, + "project": { + "type": "string", + "description": "Limit search to specific project graph" + }, + "semantic": { + "type": "boolean", + "description": "Enable semantic similarity search", + "default": true + }, + "threshold": { + "type": "number", + "description": "Minimum similarity threshold (0-1)", + "default": 0.4 + }, + "limit": { + "type": "integer", + "description": "Maximum number of results", + "default": 10 + } + }, + "required": ["query"] +} +``` + +**Example Request**: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "kogral/search", + "params": { + "query": "error handling patterns in Rust", + "type": "pattern", + "semantic": true, + "threshold": 0.6, + "limit": 5 + } +} +``` + +**Example Response**: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "type": "text", + "text": "Found 3 result(s):\n\n1. Error Handling with thiserror (pattern, score: 0.85)\n Tags: rust, error-handling\n Created: 2026-01-15\n \n2. Result Type Best Practices (guideline, score: 0.72)\n Tags: rust, error-handling, best-practices\n Created: 2026-01-10\n\n3. Custom Error Types (note, score: 0.65)\n Tags: rust, error-handling\n Created: 2026-01-08" + } +} +``` + +### kogral/add_note + +Add a new note to the knowledge base. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Note title" + }, + "content": { + "type": "string", + "description": "Note content (markdown)" + }, + "tags": { + "type": "array", + "items": { "type": "string" }, + "description": "Tags for categorization", + "default": [] + }, + "relates_to": { + "type": "array", + "items": { "type": "string" }, + "description": "Related node IDs", + "default": [] + }, + "project": { + "type": "string", + "description": "Project graph name", + "default": "default" + } + }, + "required": ["title", "content"] +} +``` + +**Example Request**: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "method": "kogral/add_note", + "params": { + "title": "Async Trait Patterns", + "content": "Common patterns for using async traits in Rust:\n\n1. Use `async-trait` crate\n2. Box return types for flexibility\n3. Consider Send + Sync bounds", + "tags": ["rust", "async", "patterns"], + "relates_to": ["pattern-error-handling"] + } +} +``` + +**Example Response**: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "result": { + "type": "text", + "text": "Note added successfully: note-async-trait-patterns (ID: note-abc123)" + } +} +``` + +### kogral/add_decision + +Create an Architectural Decision Record (ADR). + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Decision title" + }, + "context": { + "type": "string", + "description": "Decision context and background" + }, + "decision": { + "type": "string", + "description": "The decision made" + }, + "consequences": { + "type": "array", + "items": { "type": "string" }, + "description": "List of consequences", + "default": [] + }, + "status": { + "type": "string", + "enum": ["proposed", "accepted", "rejected", "deprecated", "superseded"], + "default": "proposed" + }, + "tags": { + "type": "array", + "items": { "type": "string" }, + "default": [] + } + }, + "required": ["title", "context", "decision"] +} +``` + +**Example Request**: + +```json +{ + "jsonrpc": "2.0", + "id": 3, + "method": "kogral/add_decision", + "params": { + "title": "Use SurrealDB for Knowledge Graph Storage", + "context": "Need a scalable storage solution that supports graph queries and can handle growing knowledge base", + "decision": "Adopt SurrealDB as the primary storage backend for production deployments", + "consequences": [ + "Better query performance for graph traversal", + "Native support for relationships", + "Additional infrastructure dependency", + "Team needs to learn SurrealDB query language" + ], + "status": "accepted", + "tags": ["architecture", "storage", "surrealdb"] + } +} +``` + +**Example Response**: + +```json +{ + "jsonrpc": "2.0", + "id": 3, + "result": { + "type": "text", + "text": "Decision added: decision-use-surrealdb (ID: decision-xyz789)\nStatus: accepted" + } +} +``` + +### kogral/link + +Create a relationship between two nodes. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "Source node ID" + }, + "to": { + "type": "string", + "description": "Target node ID" + }, + "relation": { + "type": "string", + "enum": ["relates_to", "depends_on", "implements", "extends", "supersedes", "explains"], + "description": "Relationship type" + }, + "strength": { + "type": "number", + "description": "Relationship strength (0-1)", + "minimum": 0, + "maximum": 1, + "default": 1.0 + } + }, + "required": ["from", "to", "relation"] +} +``` + +**Example Request**: + +```json +{ + "jsonrpc": "2.0", + "id": 4, + "method": "kogral/link", + "params": { + "from": "note-async-trait-patterns", + "to": "pattern-error-handling", + "relation": "relates_to", + "strength": 0.8 + } +} +``` + +**Example Response**: + +```json +{ + "jsonrpc": "2.0", + "id": 4, + "result": { + "type": "text", + "text": "Link created: note-async-trait-patterns --[relates_to]--> pattern-error-handling (strength: 0.8)" + } +} +``` + +**Relationship Types**: + +- `relates_to`: General conceptual relationship +- `depends_on`: Dependency (from depends on to) +- `implements`: Implementation of concept/pattern +- `extends`: Inherits or extends another node +- `supersedes`: Replaces an older version +- `explains`: Provides documentation/clarification + +### kogral/get_guidelines + +Retrieve guidelines for current project with inheritance resolution. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "language": { + "type": "string", + "description": "Programming language (e.g., rust, nushell)" + }, + "category": { + "type": "string", + "description": "Guideline category (e.g., error-handling, testing)" + }, + "include_base": { + "type": "boolean", + "description": "Include shared/base guidelines", + "default": true + } + } +} +``` + +**Example Request**: + +```json +{ + "jsonrpc": "2.0", + "id": 5, + "method": "kogral/get_guidelines", + "params": { + "language": "rust", + "category": "error-handling", + "include_base": true + } +} +``` + +**Example Response**: + +```json +{ + "jsonrpc": "2.0", + "id": 5, + "result": { + "type": "text", + "text": "Guidelines for rust/error-handling:\n\n## Project Guidelines (priority: 150)\n\n1. Custom Error Types (guideline-custom-errors)\n - Use thiserror for error definitions\n - Implement From traits for conversions\n - Source: .kogral/guidelines/rust-errors.md\n\n## Shared Guidelines (priority: 50)\n\n1. Result Type Best Practices (guideline-result-best-practices)\n - Always use Result for fallible operations\n - Never use unwrap() in production\n - Source: ~/Tools/.kogral-shared/guidelines/rust-errors.md\n\n2. Error Propagation (guideline-error-propagation)\n - Use ? operator for error propagation\n - Add context with .context()\n - Source: ~/Tools/.kogral-shared/guidelines/rust-errors.md" + } +} +``` + +### kogral/list_graphs + +List available knowledge graphs. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": {} +} +``` + +**Example Request**: + +```json +{ + "jsonrpc": "2.0", + "id": 6, + "method": "kogral/list_graphs" +} +``` + +**Example Response**: + +```json +{ + "jsonrpc": "2.0", + "id": 6, + "result": { + "type": "text", + "text": "Available graphs:\n\n- default (Current project)\n Path: /path/to/project/.kogral\n Nodes: 42\n Last modified: 2026-01-17T10:30:00Z\n\n- shared (Shared guidelines)\n Path: ~/Tools/.kogral-shared\n Nodes: 156\n Last modified: 2026-01-15T14:20:00Z" + } +} +``` + +### kogral/export + +Export knowledge base to various formats. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "format": { + "type": "string", + "enum": ["logseq", "json", "markdown"], + "description": "Export format" + }, + "output_path": { + "type": "string", + "description": "Output file or directory path" + }, + "include_types": { + "type": "array", + "items": { + "type": "string", + "enum": ["note", "decision", "guideline", "pattern", "journal", "execution"] + }, + "description": "Node types to include", + "default": ["note", "decision", "guideline", "pattern"] + }, + "skip_journals": { + "type": "boolean", + "default": true + } + }, + "required": ["format", "output_path"] +} +``` + +**Example Request**: + +```json +{ + "jsonrpc": "2.0", + "id": 7, + "method": "kogral/export", + "params": { + "format": "logseq", + "output_path": "/Users/akasha/logseq-graph", + "include_types": ["note", "decision", "guideline"], + "skip_journals": true + } +} +``` + +**Example Response**: + +```json +{ + "jsonrpc": "2.0", + "id": 7, + "result": { + "type": "text", + "text": "Export completed:\n\nFormat: Logseq\nOutput: /Users/akasha/logseq-graph\nExported: 42 nodes\n - 23 notes\n - 12 decisions\n - 7 guidelines\n\nLogseq graph ready to open." + } +} +``` + +## Block Tools + +Tools for querying Logseq content blocks. Requires `blocks.enable_mcp_tools = true` in configuration. + +### kogral/find_blocks + +Find blocks by tag, task status, or custom property across the knowledge base. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "tag": { + "type": "string", + "description": "Find blocks with this tag (e.g., 'card', 'important')" + }, + "status": { + "type": "string", + "enum": ["TODO", "DOING", "DONE", "LATER", "NOW", "WAITING", "CANCELLED"], + "description": "Find blocks with this task status" + }, + "property_key": { + "type": "string", + "description": "Custom property key to search for" + }, + "property_value": { + "type": "string", + "description": "Custom property value to match" + }, + "limit": { + "type": "integer", + "description": "Maximum number of results", + "default": 20 + } + } +} +``` + +**Note**: Provide one of: `tag`, `status`, or both `property_key` and `property_value`. + +**Example Request** (find blocks by tag): + +```json +{ + "jsonrpc": "2.0", + "id": 8, + "method": "kogral/find_blocks", + "params": { + "tag": "high-priority", + "limit": 10 + } +} +``` + +**Example Response**: + +```json +{ + "jsonrpc": "2.0", + "id": 8, + "result": { + "type": "text", + "text": "Found 3 blocks with tag '#high-priority':\n\n**Project Tasks** (project-tasks-123)\n - TODO Implement authentication #high-priority\n - TODO Fix security vulnerability #high-priority\n\n**Sprint Planning** (sprint-planning-456)\n - DOING Refactor database layer #high-priority" + } +} +``` + +**Example Request** (find blocks by property): + +```json +{ + "jsonrpc": "2.0", + "id": 9, + "method": "kogral/find_blocks", + "params": { + "property_key": "priority", + "property_value": "high", + "limit": 15 + } +} +``` + +### kogral/find_todos + +Find all TODO blocks across the knowledge base. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "limit": { + "type": "integer", + "description": "Maximum number of results", + "default": 20 + } + } +} +``` + +**Example Request**: + +```json +{ + "jsonrpc": "2.0", + "id": 10, + "method": "kogral/find_todos", + "params": { + "limit": 25 + } +} +``` + +**Example Response**: + +```json +{ + "jsonrpc": "2.0", + "id": 10, + "result": { + "type": "text", + "text": "Found 8 TODO blocks:\n\n**Project Tasks** (project-tasks-123)\n - TODO Implement authentication\n - TODO Write integration tests\n - TODO Update documentation\n\n**Bug Fixes** (bug-fixes-456)\n - TODO Fix race condition in cache\n - TODO Address memory leak\n\n**Research** (research-789)\n - TODO Evaluate GraphQL alternatives\n - TODO Benchmark new approach\n - TODO Document findings" + } +} +``` + +### kogral/find_cards + +Find all flashcard blocks (blocks tagged with #card) for spaced repetition learning. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "limit": { + "type": "integer", + "description": "Maximum number of flashcards", + "default": 10 + } + } +} +``` + +**Example Request**: + +```json +{ + "jsonrpc": "2.0", + "id": 11, + "method": "kogral/find_cards", + "params": { + "limit": 5 + } +} +``` + +**Example Response**: + +```json +{ + "jsonrpc": "2.0", + "id": 11, + "result": { + "type": "text", + "text": "Found 3 flashcards:\n\n**Rust Learning** (rust-learning-123)\n - What is Rust's ownership model? #card #rust\n - Ownership prevents data races at compile time\n - Each value has a single owner\n\n**System Design** (system-design-456)\n - What is the CAP theorem? #card #distributed-systems\n - Consistency, Availability, Partition tolerance\n - Can only guarantee 2 of 3\n\n**Algorithms** (algorithms-789)\n - What is the time complexity of quicksort? #card #algorithms\n - Average: O(n log n)\n - Worst case: O(n²)" + } +} +``` + +**Use Cases**: +- **kogral/find_blocks**: General block search by metadata +- **kogral/find_todos**: Task management and tracking +- **kogral/find_cards**: Spaced repetition learning system + +**See Also**: +- [Logseq Blocks Support](../kogral/core-concepts.md#logseq-content-blocks) +- [ADR-004: Logseq Blocks Support](../architecture/adrs/004-logseq-blocks-support.md) + +## Resources + +Resources provide read-only access to knowledge graph content via URIs. + +### kogral://project/notes + +Access project notes. + +**URI**: `kogral://project/notes` or `kogral://project/notes/{note-id}` + +**Example**: Read all project notes + +```text +kogral://project/notes +``` + +**Example**: Read specific note + +```text +kogral://project/notes/async-trait-patterns +``` + +### kogral://project/decisions + +Access project decisions (ADRs). + +**URI**: `kogral://project/decisions` or `kogral://project/decisions/{decision-id}` + +### kogral://project/guidelines + +Access project-specific guidelines. + +**URI**: `kogral://project/guidelines` or `kogral://project/guidelines/{guideline-id}` + +### kogral://project/patterns + +Access project patterns. + +**URI**: `kogral://project/patterns` or `kogral://project/patterns/{pattern-id}` + +### kogral://shared/guidelines + +Access shared guidelines (inherited). + +**URI**: `kogral://shared/guidelines` or `kogral://shared/guidelines/{guideline-id}` + +### kogral://shared/patterns + +Access shared patterns (inherited). + +**URI**: `kogral://shared/patterns` or `kogral://shared/patterns/{pattern-id}` + +## Prompts + +Prompts provide guided workflows for common tasks. + +### kogral/summarize_project + +Generate a comprehensive project knowledge summary. + +**Arguments**: + +```json +{ + "project": { + "type": "string", + "description": "Project graph name", + "default": "default" + } +} +``` + +**Example Request**: + +```json +{ + "jsonrpc": "2.0", + "id": 8, + "method": "kogral/summarize_project", + "params": { + "project": "default" + } +} +``` + +**Returns**: Prompt messages with project summary including: +- Total node counts by type +- Recent additions +- Top tags +- Key decisions +- Active patterns + +### kogral/find_related + +Find nodes related to a specific topic or node. + +**Arguments**: + +```json +{ + "node_id": { + "type": "string", + "description": "Node ID to find relations for" + }, + "depth": { + "type": "integer", + "description": "Maximum traversal depth", + "default": 2 + } +} +``` + +**Example Request**: + +```json +{ + "jsonrpc": "2.0", + "id": 9, + "method": "kogral/find_related", + "params": { + "node_id": "pattern-error-handling", + "depth": 2 + } +} +``` + +**Returns**: Prompt messages with: +- Direct relationships +- Indirect relationships (depth 2+) +- Common tags +- Related guidelines + +## Error Handling + +### Error Codes + +Standard JSON-RPC 2.0 error codes: + +| Code | Meaning | Description | +| ------ | --------- | ------------- | +| -32700 | Parse error | Invalid JSON | +| -32600 | Invalid Request | Missing required fields | +| -32601 | Method not found | Unknown tool/resource | +| -32602 | Invalid params | Parameter validation failed | +| -32603 | Internal error | Server-side error | + +### Example Error Response + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "error": { + "code": -32602, + "message": "Invalid params", + "data": { + "details": "Field 'query' is required but missing", + "field": "query" + } + } +} +``` + +## Best Practices + +### 1. Use Semantic Search for Discovery + +```json +{ + "method": "kogral/search", + "params": { + "query": "how to handle database connection errors", + "semantic": true, + "threshold": 0.5 + } +} +``` + +### 2. Link Related Concepts + +```json +{ + "method": "kogral/link", + "params": { + "from": "note-new-discovery", + "to": "pattern-related-pattern", + "relation": "implements" + } +} +``` + +### 3. Query Guidelines Before Implementation + +```json +{ + "method": "kogral/get_guidelines", + "params": { + "language": "rust", + "category": "testing" + } +} +``` + +### 4. Document Decisions with ADRs + +```json +{ + "method": "kogral/add_decision", + "params": { + "title": "Use X for Y", + "context": "Background...", + "decision": "We will...", + "consequences": ["Pro 1", "Con 1"] + } +} +``` + +## See Also + +- [MCP Specification](https://modelcontextprotocol.io/docs) +- [Quick Start Guide](../user-guide/quickstart.md) +- [Configuration Reference](../user-guide/configuration.md) +- [kogral-mcp Source Code](../../crates/kogral-mcp/src/) diff --git a/docs/api/rust-api.md b/docs/api/rust-api.md new file mode 100644 index 0000000..f8c2ce9 --- /dev/null +++ b/docs/api/rust-api.md @@ -0,0 +1 @@ +# Rust API diff --git a/docs/apps/claude-code.md b/docs/apps/claude-code.md new file mode 100644 index 0000000..5210fc2 --- /dev/null +++ b/docs/apps/claude-code.md @@ -0,0 +1 @@ +# Claude Code Integration diff --git a/docs/apps/git.md b/docs/apps/git.md new file mode 100644 index 0000000..e3a50b7 --- /dev/null +++ b/docs/apps/git.md @@ -0,0 +1 @@ +# Git Workflows diff --git a/docs/apps/logseq.md b/docs/apps/logseq.md new file mode 100644 index 0000000..38fbabe --- /dev/null +++ b/docs/apps/logseq.md @@ -0,0 +1 @@ +# Logseq Integration diff --git a/docs/apps/mcp-quickguide.md b/docs/apps/mcp-quickguide.md new file mode 100644 index 0000000..28ddead --- /dev/null +++ b/docs/apps/mcp-quickguide.md @@ -0,0 +1,488 @@ +# MCP Quick Guide + +Fast-track guide to integrating KOGRAL with Claude Code via the Model Context Protocol (MCP). + +## What is MCP + +MCP (Model Context Protocol) is a protocol that allows Claude Code to interact with external tools and data sources. The kogral-mcp server exposes your KOGRAL knowledge base to Claude Code for AI-assisted knowledge management. + +## Quick Setup (5 Minutes) + +### Step 1: Build MCP Server + +```bash +# Build kogral-mcp server +cargo build --package kogral-mcp --release + +# Verify binary +ls -lh target/release/kogral-mcp +``` + +### Step 2: Configure Claude Code + +Add to `~/.config/claude/config.json`: + +```json +{ + "mcpServers": { + "kogral-mcp": { + "command": "/path/to/knowledge-base/target/release/kogral-mcp", + "args": ["serve"], + "env": { + "KOGRAL_DIR": "/path/to/your/project/.kogral" + } + } + } +} +``` + +Replace `/path/to/knowledge-base` and `/path/to/your/project/.kogral` with your actual paths. + +### Step 3: Initialize KOGRAL + +```bash +# Navigate to your project +cd /path/to/your/project + +# Initialize .kogral directory +kogral init +``` + +### Step 4: Start Claude Code + +```bash +# Start Claude Code (will auto-connect to kogral-mcp) +claude-code +``` + +### Step 5: Test Connection + +In Claude Code, try: + +```text +Search for "error handling" +``` + +Claude will use the `kogral/search` tool to query your knowledge base. + +--- + +## Essential Commands + +### Search Knowledge Base + +**Natural language**: + +```text +Find notes about Rust error handling +``` + +**Claude translates to**: + +```json +{ + "tool": "kogral/search", + "params": { + "query": "error handling", + "type": "note", + "semantic": true + } +} +``` + +### Add Note + +**Natural language**: + +```text +Add a note about async Rust patterns with tags rust, async, patterns +``` + +**Claude translates to**: + +```json +{ + "tool": "kogral/add_note", + "params": { + "title": "Async Rust Patterns", + "content": "...", + "tags": ["rust", "async", "patterns"] + } +} +``` + +### Add Decision + +**Natural language**: + +```text +Document decision to use SurrealDB for storage +``` + +**Claude translates to**: + +```json +{ + "tool": "kogral/add_decision", + "params": { + "title": "Use SurrealDB for Storage", + "context": "Need scalable graph database", + "decision": "Adopt SurrealDB as primary storage backend", + "consequences": ["Better query performance", "Additional infrastructure"] + } +} +``` + +### Get Guidelines + +**Natural language**: + +```text +What are our Rust error handling guidelines? +``` + +**Claude translates to**: + +```json +{ + "tool": "kogral/get_guidelines", + "params": { + "language": "rust", + "category": "error-handling" + } +} +``` + +### Link Concepts + +**Natural language**: + +```text +Link note-async-patterns to decision-use-tokio as implements +``` + +**Claude translates to**: + +```json +{ + "tool": "kogral/link", + "params": { + "from": "note-async-patterns", + "to": "decision-use-tokio", + "relation": "implements" + } +} +``` + +--- + +## Common Workflows + +### Capture Meeting Notes + +**You**: + +```text +We just decided in our meeting to migrate from REST to GraphQL. +Context: current REST API is too chatty, requires multiple round trips. +Consequences: better client performance, but team needs to learn GraphQL. +Create a decision record. +``` + +**Claude** (uses `kogral/add_decision`): + +```text +Created decision: decision-migrate-to-graphql + +Status: proposed +Context: Current REST API requires multiple round trips (chatty) +Decision: Migrate from REST to GraphQL API +Consequences: + - ✅ Better client performance + - ❌ Team learning curve for GraphQL +``` + +### Find Related Knowledge + +**You**: + +```text +I'm working on error handling. What related notes and patterns do we have? +``` + +**Claude** (uses `kogral/search` with semantic=true): + +```text +Found 5 related items: + +1. **Error Handling with thiserror** (pattern) + Tags: rust, error-handling + Created: 2026-01-15 + +2. **Result Type Best Practices** (guideline) + Tags: rust, error-handling, best-practices + Created: 2026-01-10 + +3. **Decision: Use anyhow for Application Errors** (decision) + Status: accepted + Created: 2026-01-08 + +4. **Custom Error Types** (note) + Tags: rust, error-handling + Created: 2026-01-05 + +5. **Error Propagation Patterns** (pattern) + Tags: rust, error-handling + Created: 2026-01-03 + +Would you like me to link your current work to any of these? +``` + +### Document Implementation + +**You**: + +```text +I just implemented the user authentication module following our security guidelines. +Add a note and link it to our security guideline. +``` + +**Claude** (uses `kogral/add_note` + `kogral/link`): + +```text +Created note: note-user-auth-implementation +Tags: security, authentication, implementation + +Linked: + note-user-auth-implementation --[implements]--> guideline-security-practices + +Done! Your implementation is now documented and connected to our guidelines. +``` + +### Review Project Knowledge + +**You**: + +```text +Summarize our project knowledge: what decisions have we made, what patterns are we using? +``` + +**Claude** (uses `kogral/summarize_project` prompt): + +```text +# Project Knowledge Summary + +**Total Nodes**: 42 + +## Recent Decisions (5) +- Use SurrealDB for Storage (accepted, 2 days ago) +- Adopt MCP for AI Integration (accepted, 5 days ago) +- Nickel for Configuration (accepted, 1 week ago) + +## Active Patterns (8) +- Error Handling with thiserror +- Repository Pattern for DB +- Builder Pattern for Complex Objects +- ... + +## Top Tags +1. rust (23 nodes) +2. architecture (12 nodes) +3. error-handling (8 nodes) +4. patterns (7 nodes) + +## Guideline Coverage +- Rust: 5 guidelines +- Testing: 3 guidelines +- Security: 2 guidelines +``` + +--- + +## Advanced Usage + +### Conditional Queries + +**You**: + +```text +Find all decisions made in the last week that are still proposed (not accepted) +``` + +**Claude** (combines `kogral/search` with filtering): + +```text +Found 2 proposed decisions from last week: + +1. **Migrate to GraphQL** (proposed) + Created: 3 days ago + Context: REST API is too chatty... + +2. **Add Redis Caching** (proposed) + Created: 5 days ago + Context: Database queries are slow... + +Would you like to review these and update their status? +``` + +### Cross-Reference Check + +**You**: + +```text +Before I implement X, check if we have any decisions or guidelines about it +``` + +**Claude** (uses `kogral/search` + `kogral/get_guidelines`): + +```text +Checking existing knowledge about X... + +**Decisions**: None found +**Guidelines**: 1 relevant guideline found + - guideline-module-structure: "Keep modules focused and small" + +**Related Notes**: 2 notes mention similar topics + - note-module-design-patterns + - note-separation-of-concerns + +Recommendation: Your implementation of X looks aligned with our guidelines. +Consider linking it to guideline-module-structure when done. +``` + +### Export for Sharing + +**You**: + +```text +Export our architectural decisions to Logseq so I can review them visually +``` + +**Claude** (uses `kogral/export`): + +```text +Exporting to Logseq format... + +✓ Exported 12 decisions to /Users/akasha/logseq-export/ + - 12 decision records + - Preserved wikilinks + - Added Logseq properties + +You can now open /Users/akasha/logseq-export/ in Logseq to visualize the decision graph. +``` + +--- + +## Tips and Tricks + +### 1. Use Natural Language + +Don't worry about exact tool syntax. Claude understands: + +❌ **Don't say**: "Use kogral/search with query='rust' and type='pattern'" +✅ **Do say**: "Find Rust patterns in KOGRAL" + +### 2. Be Specific with Tags + +When adding notes, use consistent tags: + +✅ **Good**: `tags: rust, error-handling, pattern` +❌ **Bad**: `tags: Rust, ErrorHandling, patterns` + +### 3. Link as You Go + +After creating notes, ask Claude to link them: + +```text +Link this note to our error handling guideline as 'implements' +``` + +### 4. Review Regularly + +Ask Claude for summaries: + +```text +What have we documented this week? +``` + +### 5. Use Semantic Search + +For conceptual queries: + +```text +Find anything related to "making code maintainable" +``` + +Not just keyword "maintainable", but concepts like refactoring, clean code, patterns, etc. + +--- + +## Troubleshooting + +### "MCP server not responding" + +```bash +# Check kogral-mcp is built +ls target/release/kogral-mcp + +# Test manually +echo '{"jsonrpc":"2.0","id":1,"method":"kogral/search","params":{"query":"test"}}' \ + | target/release/kogral-mcp serve +``` + +### "KB directory not found" + +```bash +# Verify .kogral exists +ls -la /path/to/project/.kogral + +# Initialize if missing +cd /path/to/project +kogral init +``` + +### "Permission denied" + +```bash +# Make binary executable +chmod +x target/release/kogral-mcp + +# Check environment variable +echo $KOGRAL_DIR +``` + +### "Empty search results" + +```bash +# Add some test content +kogral add note "Test Note" --content "Test content" + +# Try search again in Claude Code +``` + +--- + +## Next Steps + +- **Read**: [MCP Tools API Reference](../api/mcp-tools.md) for all available tools +- **Explore**: [Use Cases](../guides/use-cases.md) for more examples +- **Configure**: [Configuration Reference](../config/overview.md) to customize behavior +- **Integrate**: [Claude Code Integration](claude-code.md) for advanced setup + +--- + +## Quick Reference Card + +| Task | Say to Claude | +| ------ | --------------- | +| Search | "Find notes about X" | +| Add note | "Add a note about X with tags Y, Z" | +| Add decision | "Document decision to use X for Y" | +| Get guidelines | "What are our X guidelines?" | +| Link nodes | "Link A to B as implements" | +| Summarize | "Summarize project knowledge" | +| Export | "Export to Logseq format" | + +--- + +**Remember**: Claude Code with MCP turns KOGRAL into an active participant in your development workflow. Ask questions, capture decisions, and let AI help you maintain your project's knowledge graph. diff --git a/docs/apps/obsidian.md b/docs/apps/obsidian.md new file mode 100644 index 0000000..97298c4 --- /dev/null +++ b/docs/apps/obsidian.md @@ -0,0 +1 @@ +# Obsidian Compatibility diff --git a/docs/architecture/adrs/001-nickel-vs-toml.md b/docs/architecture/adrs/001-nickel-vs-toml.md new file mode 100644 index 0000000..42e969f --- /dev/null +++ b/docs/architecture/adrs/001-nickel-vs-toml.md @@ -0,0 +1,313 @@ +# ADR-001: Nickel vs TOML for Configuration + +**Status**: Accepted + +**Date**: 2026-01-17 + +**Deciders**: Architecture Team + +**Context**: Configuration Strategy for Knowledge Base System + +--- + +## Context + +The KOGRAL requires a flexible, type-safe configuration format that supports: + +1. **Complex nested structures** (graph settings, storage configs, embedding providers) +2. **Type validation** (prevent runtime errors from config mistakes) +3. **Composition and inheritance** (shared configs, environment-specific overrides) +4. **Documentation** (self-documenting schemas) +5. **Validation before runtime** (catch errors early) + +We evaluated two primary options: + +### Option 1: TOML (Traditional Config Format) + +**Pros**: +- Widely adopted in Rust ecosystem (`Cargo.toml`) +- Simple, human-readable syntax +- Native `serde` support +- IDE support (syntax highlighting, completion) + +**Cons**: +- No type system (validation only at runtime) +- Limited composition (no imports, no functions) +- No schema validation (errors discovered during execution) +- Verbose for complex nested structures +- No documentation in config files + +**Example TOML**: + +```toml +[graph] +name = "my-project" +version = "1.0.0" + +[storage] +primary = "filesystem" # String, not validated as enum + +[storage.secondary] +enabled = true +type = "surrealdb" # Typo would fail at runtime +url = "ws://localhost:8000" + +[embeddings] +enabled = true +provider = "openai" # No validation of valid providers +model = "text-embedding-3-small" +``` + +**Problems**: +- Typos in enum values (`"surrealdb"` vs `"surealdb"`) fail at runtime +- No validation that `provider = "openai"` requires `api_key_env` +- No documentation of valid options +- No way to compose configs (e.g., base config + environment override) + +### Option 2: Nickel (Functional Configuration Language) + +**Pros**: +- **Type system** with contracts (validate before runtime) +- **Composition** via imports and merging +- **Documentation** in schemas (self-documenting) +- **Validation** at export time (catch errors early) +- **Functions** for conditional logic +- **Default values** in schema definitions + +**Cons**: +- Less familiar to Rust developers +- Requires separate `nickel` CLI tool +- Smaller ecosystem +- Steeper learning curve + +**Example Nickel**: + +```nickel +# schemas/kogral-config.ncl +{ + KbConfig = { + graph | GraphConfig, + storage | StorageConfig, + embeddings | EmbeddingConfig, + }, + + StorageConfig = { + primary | [| 'filesystem, 'memory |], # Enum validated at export + + secondary | { + enabled | Bool, + type | [| 'surrealdb, 'sqlite |], # Typos caught immediately + url | String, + } | optional, + }, + + EmbeddingConfig = { + enabled | Bool, + provider | [| 'openai, 'claude, 'fastembed |], # Valid providers enforced + model | String, + api_key_env | String | doc "Environment variable for API key", + }, +} +``` + +**Benefits**: +- Typos in enum values caught at `nickel export` time +- Schema enforces required fields based on provider +- Documentation embedded in schema +- Config can be composed: `import "base.ncl" & { /* overrides */ }` + +--- + +## Decision + +**We will use Nickel for configuration.** + +**Implementation**: + +1. Define schemas in `schemas/*.ncl` with type contracts +2. Users write configs in `.kogral/config.ncl` +3. Export to JSON via CLI: `nickel export --format json config.ncl` +4. Load JSON in Rust via `serde_json` into typed structs + +**Pattern** (double validation): + +```text +Nickel Config (.ncl) + ↓ [nickel export] +JSON (validated by Nickel contracts) + ↓ [serde_json::from_str] +Rust Struct (validated by serde) + ↓ +Runtime (guaranteed valid config) +``` + +**Bridge Code** (`kogral-core/src/config/nickel.rs`): + +```rust +pub fn load_config>(path: P) -> Result { + // Export Nickel to JSON + let json = export_nickel_to_json(path)?; + + // Deserialize to Rust struct + let config: KbConfig = serde_json::from_str(&json)?; + + Ok(config) +} + +fn export_nickel_to_json>(path: P) -> Result { + let output = Command::new("nickel") + .arg("export") + .arg("--format").arg("json") + .arg(path.as_ref()) + .output()?; + + Ok(String::from_utf8(output.stdout)?) +} +``` + +--- + +## Consequences + +### Positive + +✅ **Type Safety**: Config errors caught before runtime +- Invalid enum values fail at export: `'filesystm` → error +- Missing required fields detected: no `graph.name` → error +- Type mismatches prevented: `enabled = "yes"` → error (expects Bool) + +✅ **Self-Documenting**: Schemas serve as documentation +- `| doc "Environment variable for API key"` describes fields +- Enum options visible in schema: `[| 'openai, 'claude, 'fastembed |]` +- Default values explicit: `| default = 'filesystem` + +✅ **Composition**: Config reuse and overrides + +```nickel +# base.ncl +{ graph = { version = "1.0.0" } } + +# project.ncl +import "base.ncl" & { graph = { name = "my-project" } } +``` + +✅ **Validation Before Deployment**: Catch errors in CI + +```bash +# CI pipeline +nickel typecheck config.ncl +nickel export --format json config.ncl > /dev/null +``` + +✅ **Conditional Logic**: Environment-specific configs + +```nickel +let is_prod = std.string.is_match "prod" (std.env.get "ENV") in +{ + embeddings = { + provider = if is_prod then 'openai else 'fastembed, + }, +} +``` + +### Negative + +❌ **Learning Curve**: Team must learn Nickel syntax +- **Mitigation**: Provide comprehensive examples in `config/` directory +- **Mitigation**: Document common patterns in `docs/config/` + +❌ **Tool Dependency**: Requires `nickel` CLI installed +- **Mitigation**: Document installation in setup guide +- **Mitigation**: Check `nickel` availability in `kogral init` command + +❌ **IDE Support**: Limited compared to TOML +- **Mitigation**: Use LSP (nickel-lang-lsp) for VSCode/Neovim +- **Mitigation**: Syntax highlighting available for major editors + +❌ **Ecosystem Size**: Smaller than TOML +- **Mitigation**: Nickel actively developed by Tweag +- **Mitigation**: Stable language specification (v1.0+) + +### Neutral + +⚪ **Two-Stage Loading**: Nickel → JSON → Rust +- Not a performance concern (config loaded once at startup) +- Adds resilience (double validation) +- Allows runtime config inspection (read JSON directly) + +--- + +## Alternatives Considered + +### JSON Schema + +**Rejected**: Not ergonomic for humans to write +- No comments +- Verbose syntax (`{"key": "value"}` vs `key = value`) +- JSON Schema separate from config (duplication) + +### YAML + +**Rejected**: No type system, ambiguous parsing +- Boolean confusion: `yes`/`no`/`on`/`off`/`true`/`false` +- Indentation-sensitive (error-prone) +- No validation without external tools + +### Dhall + +**Rejected**: More complex than needed +- Turing-incomplete by design (limits use cases) +- Smaller ecosystem than Nickel +- Steeper learning curve + +### KCL (KusionStack Configuration Language) + +**Rejected**: Kubernetes-focused, less general-purpose +- Designed for K8s manifests +- Less mature than Nickel for general config + +--- + +## Implementation Timeline + +1. ✅ Define base schemas (`schemas/kogral-config.ncl`) +2. ✅ Implement Nickel loader (`kogral-core/src/config/nickel.rs`) +3. ✅ Create example configs (`config/defaults.ncl`, `config/production.ncl`) +4. ✅ Document Nickel usage (`docs/config/nickel-schemas.md`) +5. ⏳ Add LSP recommendations to setup guide +6. ⏳ Create Nickel → TOML migration tool (for existing users) + +--- + +## Monitoring + +**Success Criteria**: +- Config errors caught at export time (not runtime) +- Users can compose configs for different environments +- Team comfortable with Nickel syntax within 2 weeks + +**Metrics**: +- Number of config validation errors caught before runtime +- Time to diagnose config issues (should decrease) +- User feedback on config complexity + +--- + +## References + +- [Nickel Language](https://nickel-lang.org/) +- [Nickel User Manual](https://nickel-lang.org/user-manual/introduction) +- [platform-config pattern](../../crates/kogral-core/src/config/README.md) (reference implementation) +- [TOML Specification](https://toml.io/) + +--- + +## Revision History + +| Date | Author | Change | +| ---------- | ------------------ | ---------------- | +| 2026-01-17 | Architecture Team | Initial decision | + +--- + +**Next ADR**: [ADR-002: FastEmbed via AI Providers](002-fastembed-ai-providers.md) diff --git a/docs/architecture/adrs/002-fastembed-ai-providers.md b/docs/architecture/adrs/002-fastembed-ai-providers.md new file mode 100644 index 0000000..96b9c49 --- /dev/null +++ b/docs/architecture/adrs/002-fastembed-ai-providers.md @@ -0,0 +1,357 @@ +# ADR-002: FastEmbed via AI Providers for Embeddings + +**Status**: Accepted + +**Date**: 2026-01-17 + +**Deciders**: Architecture Team + +**Context**: Embedding Strategy for Semantic Search + +--- + +## Context + +The KOGRAL requires embedding generation for semantic search capabilities. Embeddings convert text into numerical vectors that capture semantic meaning, enabling "find concepts" rather than just "find keywords". + +**Requirements**: + +1. **Local-First Option**: Must work offline without external API dependencies +2. **Production Scalability**: Support cloud AI providers for large-scale deployments +3. **Multiple Providers**: Flexibility to choose based on cost, quality, privacy +4. **Cost-Effective Development**: Free local embeddings for development and testing +5. **Quality**: Good enough embeddings for finding related concepts + +**Options Evaluated**: + +### Option 1: Only Local Embeddings (fastembed) + +**Pros**: +- No API costs +- Works offline +- Privacy-preserving (no data leaves machine) +- Fast (local GPU acceleration possible) + +**Cons**: +- Limited model quality compared to cloud providers +- Resource-intensive (requires download ~100MB models) +- Single provider lock-in (fastembed library) + +**Example**: + +```rust +use fastembed::{TextEmbedding, InitOptions}; + +let model = TextEmbedding::try_new(InitOptions { + model_name: "BAAI/bge-small-en-v1.5", + ..Default::default() +})?; + +let embeddings = model.embed(vec!["Hello world"], None)?; +// Output: Vec> with 384 dimensions +``` + +### Option 2: Only Cloud AI Providers (OpenAI, Claude, etc.) + +**Pros**: +- State-of-the-art embedding quality +- No local resource usage +- Latest models available +- Scalable to millions of documents + +**Cons**: +- Requires API keys (cost per embedding) +- Network dependency (no offline mode) +- Privacy concerns (data sent to third parties) +- Vendor lock-in risk + +**Example**: + +```rust +use rig::providers::openai; + +let client = openai::Client::new("sk-..."); +let embeddings = client.embeddings("text-embedding-3-small") + .embed_documents(vec!["Hello world"]).await?; +// Output: Vec> with 1536 dimensions +``` + +### Option 3: Hybrid Strategy (fastembed + AI providers via rig-core) + +**Pros**: +- ✅ Best of both worlds: local dev, cloud production +- ✅ User choice: privacy-first or quality-first +- ✅ Cost flexibility: free for small projects, paid for scale +- ✅ Unified interface via `rig-core` library +- ✅ Easy provider switching (config-driven) + +**Cons**: +- ❌ More complex implementation (multiple providers) +- ❌ Dimension mismatch between providers (384 vs 1536) +- ❌ Additional dependencies (`rig-core`, `fastembed`) + +--- + +## Decision + +**We will use a hybrid strategy: fastembed (local) + AI providers (via rig-core).** + +**Implementation**: + +1. **Default**: `fastembed` with `BAAI/bge-small-en-v1.5` (384 dimensions) +2. **Optional**: OpenAI, Claude, Ollama via `rig-core` (configurable) +3. **Interface**: `EmbeddingProvider` trait abstracts provider details +4. **Config-Driven**: Provider selection via Nickel configuration + +**Architecture**: + +```rust +#[async_trait] +pub trait EmbeddingProvider: Send + Sync { + async fn embed(&self, texts: Vec) -> Result>>; + fn dimensions(&self) -> usize; + fn model_name(&self) -> &str; +} + +// Local implementation +pub struct FastEmbedProvider { + model: TextEmbedding, +} + +impl FastEmbedProvider { + pub fn new(model_name: &str) -> Result { + let model = TextEmbedding::try_new(InitOptions { + model_name: model_name.into(), + ..Default::default() + })?; + Ok(Self { model }) + } +} + +#[async_trait] +impl EmbeddingProvider for FastEmbedProvider { + async fn embed(&self, texts: Vec) -> Result>> { + Ok(self.model.embed(texts, None)?) + } + + fn dimensions(&self) -> usize { 384 } + fn model_name(&self) -> &str { "BAAI/bge-small-en-v1.5" } +} + +// Cloud provider implementation (via rig-core) +pub struct RigEmbeddingProvider { + client: rig::Client, + model: String, + dimensions: usize, +} + +#[async_trait] +impl EmbeddingProvider for RigEmbeddingProvider { + async fn embed(&self, texts: Vec) -> Result>> { + let embeddings = self.client + .embeddings(&self.model) + .embed_documents(texts) + .await?; + Ok(embeddings) + } + + fn dimensions(&self) -> usize { self.dimensions } + fn model_name(&self) -> &str { &self.model } +} +``` + +**Configuration** (Nickel): + +```nickel +# Local development (default) +{ + embeddings = { + enabled = true, + provider = 'fastembed, + model = "BAAI/bge-small-en-v1.5", + dimensions = 384, + }, +} + +# Production with OpenAI +{ + embeddings = { + enabled = true, + provider = 'openai, + model = "text-embedding-3-small", + dimensions = 1536, + api_key_env = "OPENAI_API_KEY", + }, +} + +# Self-hosted with Ollama +{ + embeddings = { + enabled = true, + provider = 'ollama, + model = "nomic-embed-text", + dimensions = 768, + }, +} +``` + +**Provider Selection** (`kogral-core/src/embeddings/mod.rs`): + +```rust +pub fn create_provider(config: &EmbeddingConfig) -> Result> { + match config.provider { + EmbeddingProviderType::FastEmbed => { + Ok(Box::new(FastEmbedProvider::new(&config.model)?)) + } + EmbeddingProviderType::OpenAI => { + let api_key = std::env::var(&config.api_key_env)?; + Ok(Box::new(RigEmbeddingProvider::new_openai(api_key, &config.model)?)) + } + EmbeddingProviderType::Claude => { + let api_key = std::env::var(&config.api_key_env)?; + Ok(Box::new(RigEmbeddingProvider::new_claude(api_key, &config.model)?)) + } + EmbeddingProviderType::Ollama => { + Ok(Box::new(RigEmbeddingProvider::new_ollama(&config.model)?)) + } + } +} +``` + +--- + +## Consequences + +### Positive + +✅ **Development Flexibility**: +- Developers can use `fastembed` without API keys +- Fast feedback loop (local embeddings, no network calls) +- Works offline (train trips, flights) + +✅ **Production Quality**: +- Production deployments can use OpenAI/Claude for better quality +- Latest embedding models available +- Scalable to millions of documents + +✅ **Privacy Control**: +- Privacy-sensitive projects use local embeddings +- Public projects can use cloud providers +- User choice via configuration + +✅ **Cost Optimization**: +- Small projects: free (fastembed) +- Large projects: pay for quality (cloud providers) +- Hybrid: important docs via cloud, bulk via local + +✅ **Unified Interface**: +- `EmbeddingProvider` trait abstracts provider details +- Query code doesn't know/care about provider +- Easy to add new providers + +### Negative + +❌ **Dimension Mismatch**: +- fastembed: 384 dimensions +- OpenAI: 1536 dimensions +- Cannot mix in same index + +**Mitigation**: +- Store provider + dimensions in node metadata +- Rebuild index when changing providers +- Document dimension constraints + +❌ **Model Download**: +- First use of fastembed downloads ~100MB model +- Slow initial startup + +**Mitigation**: +- Pre-download in Docker images +- Document model download in setup guide +- Cache models in `~/.cache/fastembed` + +❌ **Complex Configuration**: +- Multiple provider options may confuse users + +**Mitigation**: +- Sane default (fastembed) +- Clear examples for each provider +- Validation errors explain misconfigurations + +### Neutral + +⚪ **Dependency Trade-off**: +- `fastembed` adds ~5MB to binary +- `rig-core` adds ~2MB +- Total: ~7MB overhead + +Not a concern for CLI/MCP server use case. + +--- + +## Provider Comparison + +| Provider | Dimensions | Quality | Cost | Privacy | Offline | +| -------------- | ---------- | --------- | ------------- | --------- | ------- | +| **fastembed** | 384 | Good | Free | ✅ Local | ✅ Yes | +| **OpenAI** | 1536 | Excellent | $0.0001/1K | ❌ Cloud | ❌ No | +| **Claude** | 1024 | Excellent | $0.00025/1K | ❌ Cloud | ❌ No | +| **Ollama** | 768 | Very Good | Free | ✅ Local | ✅ Yes | + +**Recommendation by Use Case**: + +- **Development**: fastembed (fast, free, offline) +- **Small Teams**: fastembed or Ollama (privacy, no costs) +- **Enterprise**: OpenAI or Claude (best quality, scalable) +- **Self-Hosted**: Ollama (good quality, local control) + +--- + +## Implementation Timeline + +1. ✅ Define `EmbeddingProvider` trait +2. ✅ Implement FastEmbedProvider (stub, feature-gated) +3. ✅ Implement RigEmbeddingProvider (stub, feature-gated) +4. ⏳ Complete FastEmbed integration with model download +5. ⏳ Complete rig-core integration (OpenAI, Claude, Ollama) +6. ⏳ Add query engine with similarity search +7. ⏳ Document provider selection and trade-offs + +--- + +## Monitoring + +**Success Criteria**: +- Users can switch providers via config change +- Local embeddings work without API keys +- Production deployments use cloud providers successfully +- Query quality acceptable for both local and cloud embeddings + +**Metrics**: +- Embedding generation latency (local vs cloud) +- Query accuracy (precision@10 for semantic search) +- API costs (cloud providers) +- User satisfaction (feedback on search quality) + +--- + +## References + +- [fastembed Documentation](https://github.com/Anush008/fastembed-rs) +- [rig-core Documentation](https://github.com/0xPlaygrounds/rig) +- [OpenAI Embeddings API](https://platform.openai.com/docs/guides/embeddings) +- [BAAI/bge Models](https://huggingface.co/BAAI/bge-small-en-v1.5) +- [Ollama Embeddings](https://ollama.com/blog/embedding-models) + +--- + +## Revision History + +| Date | Author | Change | +| ---------- | ------------------ | ---------------- | +| 2026-01-17 | Architecture Team | Initial decision | + +--- + +**Previous ADR**: [ADR-001: Nickel vs TOML](001-nickel-vs-toml.md) +**Next ADR**: [ADR-003: Hybrid Storage Strategy](003-hybrid-storage.md) diff --git a/docs/architecture/adrs/003-hybrid-storage.md b/docs/architecture/adrs/003-hybrid-storage.md new file mode 100644 index 0000000..ddd19a3 --- /dev/null +++ b/docs/architecture/adrs/003-hybrid-storage.md @@ -0,0 +1,449 @@ +# ADR-003: Hybrid Storage Strategy + +**Status**: Accepted + +**Date**: 2026-01-17 + +**Deciders**: Architecture Team + +**Context**: Storage Backend Strategy for Knowledge Base + +--- + +## Context + +The KOGRAL needs to store knowledge graphs with these requirements: + +1. **Git-Friendly**: Knowledge should version alongside code +2. **Scalable**: Support small projects (10s of nodes) to large organizations (10,000+ nodes) +3. **Queryable**: Efficient graph queries and relationship traversal +4. **Offline-Capable**: Work without network access +5. **Collaborative**: Support shared organizational knowledge +6. **Cost-Effective**: Free for small projects, reasonable cost at scale + +**Constraints**: + +- Developers want to edit knowledge in text editors +- Organizations want centralized guideline management +- Git workflows essential for code-adjacent knowledge +- Large graphs need database performance + +### Option 1: Filesystem Only + +**Approach**: Store everything as markdown files + +**Pros**: +- ✅ Git-native (perfect for versioning) +- ✅ Text editor friendly +- ✅ No dependencies +- ✅ Works offline +- ✅ Free + +**Cons**: +- ❌ Poor performance for large graphs (100 0+ nodes) +- ❌ No efficient graph queries +- ❌ Difficult to share across projects +- ❌ Manual sync for collaboration + +**Scalability**: Good for < 100 nodes, poor beyond + +### Option 2: Database Only (SurrealDB) + +**Approach**: Store all knowledge in SurrealDB graph database + +**Pros**: +- ✅ Excellent query performance +- ✅ Native graph relationships +- ✅ Scalable to millions of nodes +- ✅ Centralized for collaboration + +**Cons**: +- ❌ Not git-trackable +- ❌ Requires running database server +- ❌ Can't edit with text editor +- ❌ Network dependency +- ❌ Infrastructure cost + +**Scalability**: Excellent, but loses developer workflow benefits + +### Option 3: Hybrid (Filesystem + SurrealDB) + +**Approach**: Filesystem for local project knowledge, SurrealDB for shared organizational knowledge + +**Pros**: +- ✅ Git-friendly for project knowledge +- ✅ Text editor friendly +- ✅ Scalable for shared knowledge +- ✅ Works offline (local graph) +- ✅ Collaborative (shared graph) +- ✅ Cost-effective (DB only for shared) + +**Cons**: +- ❌ More complex implementation +- ❌ Sync mechanism needed +- ❌ Two storage systems to manage + +**Scalability**: Excellent - best of both worlds + +--- + +## Decision + +**We will use a hybrid storage strategy: Filesystem (local) + SurrealDB (shared).** + +**Architecture**: + +```text +┌─────────────────────────────────────────────────────────────┐ +│ Project A (.kogral/) │ +│ Storage: Filesystem (git-tracked) │ +│ Scope: Project-specific notes, decisions, patterns │ +│ Access: Local only │ +└──────────────────┬──────────────────────────────────────────┘ + │ + │ [inherits] + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ Shared KB (SurrealDB or synced filesystem) │ +│ Storage: SurrealDB (scalable) or filesystem (synced) │ +│ Scope: Organization-wide guidelines, patterns │ +│ Access: All projects │ +└─────────────────────────────────────────────────────────────┘ +``` + +**Implementation**: + +```nickel +# Project config +{ + storage = { + primary = 'filesystem, # Local project knowledge + secondary = { + enabled = true, + type = 'surrealdb, # Shared knowledge + url = "ws://kb-central.company.com:8000", + namespace = "organization", + database = "shared-kb", + }, + }, + + inheritance = { + base = "surrealdb://organization/shared-kb", # Inherit from shared + priority = 100, # Project overrides shared + }, +} +``` + +**Sync Strategy**: + +```text +.kogral/ (Filesystem) + ↓ [on save] +Watch for changes + ↓ [debounced] +Sync to SurrealDB + ↓ +Shared graph updated + ↓ [on query] +Merge local + shared results +``` + +--- + +## Consequences + +### Positive + +✅ **Developer Workflow Preserved**: + +```bash +# Local knowledge workflow (unchanged) +vim .kogral/notes/my-note.md +git add .kogral/notes/my-note.md +git commit -m "Add implementation note" +git push +``` + +✅ **Git Integration**: +- Project knowledge versioned with code +- Branches include relevant knowledge +- Merges resolve knowledge conflicts +- PR reviews include knowledge changes + +✅ **Offline Development**: +- Full functionality without network +- Shared guidelines cached locally +- Sync when reconnected + +✅ **Scalability**: +- Projects: filesystem (100s of nodes, fine performance) +- Organization: SurrealDB (10,000+ nodes, excellent performance) + +✅ **Collaboration**: +- Shared guidelines accessible to all projects +- Updates to shared knowledge propagate automatically +- Consistent practices across organization + +✅ **Cost-Effective**: +- Small projects: free (filesystem only) +- Organizations: SurrealDB for shared only (not all project knowledge) + +✅ **Gradual Adoption**: +- Start with filesystem only +- Add SurrealDB when needed +- Feature-gated (`--features surrealdb`) + +### Negative + +❌ **Complexity**: +- Two storage implementations +- Sync mechanism required +- Conflict resolution needed + +**Mitigation**: +- Storage trait abstracts differences +- Sync is optional (can disable) +- Conflicts rare (guidelines change infrequently) + +❌ **Sync Latency**: +- Changes to shared KOGRAL not instant in all projects + +**Mitigation**: +- Acceptable latency (guidelines don't change rapidly) +- Manual sync command available (`kogral sync`) +- Auto-sync on query (fetch latest) + +❌ **Infrastructure Requirement**: +- SurrealDB server needed for shared KOGRAL + +**Mitigation**: +- Optional (can use synced filesystem instead) +- Docker Compose for easy setup +- Managed SurrealDB Cloud option + +### Neutral + +⚪ **Storage Trait Implementation**: + +```rust +#[async_trait] +pub trait Storage { + async fn save_graph(&self, graph: &Graph) -> Result<()>; + async fn load_graph(&self, name: &str) -> Result; + async fn list_graphs(&self) -> Result>; +} + +// Three implementations +impl Storage for FilesystemStorage { /* ... */ } +impl Storage for SurrealDbStorage { /* ... */ } +impl Storage for MemoryStorage { /* ... */ } +``` + +Abstraction makes multi-backend manageable. + +--- + +## Use Cases + +### Small Project (Solo Developer) + +**Config**: + +```nickel +{ storage = { primary = 'filesystem } } +``` + +**Behavior**: +- All knowledge in `.kogral/` directory +- Git-tracked with code +- No database required +- Works offline + +### Medium Project (Team) + +**Config**: + +```nickel +{ + storage = { + primary = 'filesystem, + secondary = { + enabled = true, + type = 'surrealdb, + url = "ws://team-kb.local:8000", + }, + }, +} +``` + +**Behavior**: +- Project knowledge in `.kogral/` (git-tracked) +- Shared team patterns in SurrealDB +- Automatic sync +- Offline fallback to cached + +### Large Organization + +**Config**: + +```nickel +{ + storage = { + primary = 'filesystem, + secondary = { + enabled = true, + type = 'surrealdb, + url = "ws://kb.company.com:8000", + namespace = "engineering", + database = "shared-kb", + }, + }, + + inheritance = { + base = "surrealdb://engineering/shared-kb", + guidelines = [ + "surrealdb://engineering/rust-guidelines", + "surrealdb://engineering/security-policies", + ], + }, +} +``` + +**Behavior**: +- Project-specific in `.kogral/` +- Organization guidelines in SurrealDB +- Security policies enforced +- Automatic guideline updates + +--- + +## Sync Mechanism + +### Filesystem → SurrealDB + +**Trigger**: File changes detected (via `notify` crate) + +**Process**: +1. Parse changed markdown file +2. Convert to Node struct +3. Upsert to SurrealDB +4. Update relationships + +**Debouncing**: 500ms (configurable) + +### SurrealDB → Filesystem + +**Trigger**: Query for shared knowledge + +**Process**: +1. Query SurrealDB for shared nodes +2. Cache locally (in-memory or filesystem) +3. Merge with local results +4. Return combined + +**Caching**: TTL-based (5 minutes default) + +### Conflict Resolution + +**Strategy**: Last-write-wins with version tracking + +**Example**: + +```text +Project A: Updates shared guideline (v1 → v2) +Project B: Has cached v1 + +On Project B query: + - Detects v2 available + - Fetches v2 + - Updates cache + - Uses v2 going forward +``` + +--- + +## Alternatives Considered + +### Git Submodules for Shared Knowledge + +**Rejected**: Cumbersome workflow +- Requires manual submodule update +- Merge conflicts in shared submodule +- Not discoverable (need to know submodule exists) + +### Syncthing for Filesystem Sync + +**Rejected**: Not designed for this use case +- No query optimization +- No relationship indexes +- Sync conflicts difficult to resolve + +### PostgreSQL with JSON + +**Rejected**: Not a graph database +- Poor graph query performance +- Relationship traversal requires complex SQL joins +- No native graph features + +--- + +## Migration Path + +### Phase 1: Filesystem Only (Current) +- All storage via filesystem +- Git-tracked +- No database required + +### Phase 2: Optional SurrealDB +- Add SurrealDB support (feature-gated) +- Manual sync command +- Shared KB opt-in + +### Phase 3: Automatic Sync +- File watching +- Auto-sync on changes +- Background sync + +### Phase 4: Multi-Tenant SurrealDB +- Organization namespaces +- Access control +- Audit logs + +--- + +## Monitoring + +**Success Criteria**: +- Developers don't notice hybrid complexity +- Sync completes < 1 second for typical changes +- Shared guidelines accessible in < 100ms +- Zero data loss in sync + +**Metrics**: +- Sync latency (P50, P95, P99) +- Cache hit rate (shared knowledge) +- Conflict rate (expect < 0.1%) +- User satisfaction + +--- + +## References + +- [SurrealDB Documentation](https://surrealdb.com/docs) +- [Storage Trait Implementation](../../crates/kogral-core/src/storage/mod.rs) +- [FilesystemStorage](../../crates/kogral-core/src/storage/filesystem.rs) +- [SurrealDbStorage](../../crates/kogral-core/src/storage/surrealdb.rs) +- [Sync Mechanism](../../scripts/kogral-sync.nu) + +--- + +## Revision History + +| Date | Author | Change | +| ---------- | ------------------ | ---------------- | +| 2026-01-17 | Architecture Team | Initial decision | + +--- + +**Previous ADR**: [ADR-002: FastEmbed via AI Providers](002-fastembed-ai-providers.md) +**Next ADR**: [ADR-004: Logseq Compatibility](004-logseq-compatibility.md) diff --git a/docs/architecture/adrs/004-logseq-blocks-support.md b/docs/architecture/adrs/004-logseq-blocks-support.md new file mode 100644 index 0000000..d7c0dc0 --- /dev/null +++ b/docs/architecture/adrs/004-logseq-blocks-support.md @@ -0,0 +1,196 @@ +# ADR-004: Logseq Blocks Support + +## Status + +**Proposed** (Design phase) + +## Context + +Logseq uses **content blocks** as the fundamental unit of information, not full documents. KB currently treats `Node.content` as flat markdown string, which loses block-level features on import/export: + +**Lost features**: +- Block properties (`#card`, `TODO`, custom properties) +- Block hierarchy (outliner nesting) +- Block references (`((block-uuid))`) +- Block-level queries (find all flashcards, TODOs) + +**User requirement**: Round-trip Logseq import/export with full fidelity: + +```text +Logseq → KOGRAL Import → KOGRAL Storage → KOGRAL Export → Logseq + (blocks preserved at every step) +``` + +## Decision + +Implement **Hybrid Block Support** (structured + markdown): + +### 1. Add Block Data Structure + +```rust +pub struct Block { + pub id: String, // UUID + pub content: String, // Block text + pub properties: BlockProperties, // Tags, status, custom + pub children: Vec, // Nested blocks + // ... timestamps ... +} + +pub struct BlockProperties { + pub tags: Vec, // #card, #important + pub status: Option, // TODO, DONE, etc. + pub custom: HashMap, // property:: value + pub block_refs: Vec, // ((uuid)) + pub page_refs: Vec, // [[page]] +} +``` + +### 2. Extend Node Model + +```rust +pub struct Node { + // ... existing fields ... + pub content: String, // Source of truth (markdown) + pub blocks: Option>, // Cached structure (optional) +} +``` + +### 3. Bidirectional Parser + +- **Parse**: Markdown → `Vec` (lazy, on-demand) +- **Serialize**: `Vec` → Markdown (for export) + +### 4. Storage Strategy + +**Filesystem** (git-friendly, Logseq-compatible): + +```markdown +- Block 1 #card + - Nested answer +- TODO Block 2 + priority:: high +``` + +**SurrealDB** (queryable): + +```sql +DEFINE TABLE block; +DEFINE FIELD node_id ON block TYPE record(node); +DEFINE FIELD block_id ON block TYPE string; +DEFINE FIELD properties ON block TYPE object; +DEFINE INDEX block_tags ON block COLUMNS properties.tags; +``` + +### 5. Query Extensions + +```rust +// Find all flashcards +graph.find_blocks_by_tag("card") + +// Find all TODOs +graph.find_all_todos() + +// Find blocks with custom property +node.find_blocks_by_property("priority", "high") +``` + +## Consequences + +### Positive + +✅ **Full Logseq Compatibility** - Import/export preserves all block features +✅ **Queryable Blocks** - Find #card, TODO, custom properties across KOGRAL +✅ **Backward Compatible** - Existing nodes without blocks still work +✅ **Type-Safe** - Structured data instead of regex parsing everywhere +✅ **Extensible** - Custom block properties supported +✅ **Hierarchy Preserved** - Nested blocks maintain parent-child relationships + +### Negative + +⚠️ **Added Complexity** - New data structures, parser, sync logic +⚠️ **Dual Representation** - Must keep `content` and `blocks` in sync +⚠️ **Storage Overhead** - SurrealDB stores both markdown and structure +⚠️ **Migration Required** - Existing data needs parsing to populate blocks + +### Neutral + +⚙️ **Lazy Parsing** - Blocks parsed on-demand (not stored by default) +⚙️ **Opt-In** - Config flag `blocks.enabled` to activate features +⚙️ **Gradual Adoption** - Can implement in phases + +## Implementation Phases + +**Phase 1: Foundation** (No behavior change) +- Add `Block` struct to `models/block.rs` +- Add optional `blocks` field to `Node` +- Add config: `blocks.enabled = false` (default off) + +**Phase 2: Parser** +- Implement `BlockParser::parse()` (markdown → blocks) +- Implement `BlockParser::serialize()` (blocks → markdown) +- Add `Node::get_blocks()` method (lazy parsing) + +**Phase 3: Logseq Integration** +- Update `LogseqImporter` to parse blocks +- Update `LogseqExporter` to serialize blocks +- Test round-trip (Logseq → KB → Logseq) + +**Phase 4: Query API** +- Add `Graph::find_blocks_by_tag()` +- Add `Graph::find_all_todos()` +- Add `Node::find_blocks_by_property()` + +**Phase 5: MCP/CLI Integration** +- Add `kb/find_blocks` MCP tool +- Add `kogral find-cards` CLI command +- Add `kogral find-todos` CLI command + +**Phase 6: SurrealDB Backend** +- Create `block` table schema +- Index on tags, status, properties +- Store blocks alongside nodes + +## Alternatives Considered + +### Alternative 1: Blocks as First-Class Nodes + +Convert each Logseq block to a separate KOGRAL Node. + +**Rejected**: Too granular, explosion of nodes, loses document context. + +### Alternative 2: Parser-Only (No Storage) + +Keep `content: String`, parse blocks on every access. + +**Rejected**: Can't query blocks in database, parse overhead, can't index. + +### Alternative 3: Metadata Field + +Store blocks in `metadata: HashMap`. + +**Rejected**: Not type-safe, harder to query, no schema validation. + +## References + +- [Logseq Block Format](https://docs.logseq.com/#/page/blocks) +- [Full Design Document](../logseq-blocks-design.md) +- [Implementation Tracking](https://github.com/.../issues/XXX) + +## Notes + +**Backward Compatibility Strategy**: +- `content` remains source of truth +- `blocks` is optional enhancement +- Old code works unchanged +- New features opt-in via config + +**Migration Path**: +- Existing users: blocks disabled by default +- New users: blocks enabled, parsed on import +- Manual: `kogral reindex --parse-blocks` to populate + +--- + +**Decision Date**: 2026-01-17 +**Approvers**: TBD +**Review Date**: After Phase 2 implementation diff --git a/docs/architecture/adrs/005-mcp-protocol.md b/docs/architecture/adrs/005-mcp-protocol.md new file mode 100644 index 0000000..73e8f4b --- /dev/null +++ b/docs/architecture/adrs/005-mcp-protocol.md @@ -0,0 +1 @@ +# ADR-005: MCP Protocol for AI Integration diff --git a/docs/architecture/config-driven.md b/docs/architecture/config-driven.md new file mode 100644 index 0000000..ec82a18 --- /dev/null +++ b/docs/architecture/config-driven.md @@ -0,0 +1,539 @@ +# Config-Driven Architecture + +The KOGRAL follows a **config-driven architecture** where all behavior is defined through Nickel configuration files rather than hardcoded in Rust. + +## Philosophy + +**"Configuration, not code, defines behavior"** + +Instead of hardcoding storage backends, embedding providers, or query parameters, KOGRAL uses a layered configuration system that composes settings from multiple sources: + +1. **Schema contracts** (type definitions) +2. **Defaults** (base values) +3. **Mode overlays** (dev/prod/test optimizations) +4. **User customizations** (project-specific overrides) + +This approach provides: + +- ✅ **Type safety** - Nickel contracts validate configuration before runtime +- ✅ **Composability** - Mix and match configurations for different environments +- ✅ **Discoverability** - Self-documenting schemas with inline documentation +- ✅ **Hot-reload** - Change behavior without recompiling Rust code +- ✅ **Double validation** - Nickel contracts + serde ensure correctness + +## Configuration Composition Flow + +![Configuration Composition](../diagrams/config-composition.svg) + +The configuration system uses a **four-layer composition pattern**: + +### Layer 1: Schema Contracts + +**Location**: `schemas/contracts.ncl` + +**Purpose**: Define types and validation rules using Nickel contracts. + +**Example**: + +```nickel +{ + StorageType = [| 'filesystem, 'memory, 'surrealdb |], + + StorageConfig = { + primary | StorageType + | doc "Primary storage backend" + | default = 'filesystem, + + secondary | SecondaryStorageConfig + | doc "Optional secondary storage" + | default = { enabled = false }, + }, +} +``` + +**Benefits**: +- Enum validation (only valid storage types accepted) +- Required vs optional fields +- Default values for optional fields +- Documentation attached to types + +### Layer 2: Defaults + +**Location**: `schemas/defaults.ncl` + +**Purpose**: Provide sensible base values for all configuration options. + +**Example**: + +```nickel +{ + base = { + storage = { + primary = 'filesystem, + secondary = { + enabled = false, + type = 'surrealdb, + url = "ws://localhost:8000", + }, + }, + embeddings = { + enabled = true, + provider = 'fastembed, + model = "BAAI/bge-small-en-v1.5", + dimensions = 384, + }, + } | contracts.KbConfig, +} +``` + +**Validated by**: `contracts.KbConfig` contract ensures defaults are valid. + +### Layer 3: Mode Overlays + +**Location**: `schemas/modes/{dev,prod,test}.ncl` + +**Purpose**: Environment-specific optimizations and tuning. + +#### Development Mode (`dev.ncl`) + +Optimized for: Fast iteration, local development, debugging + +```nickel +{ + storage = { + primary = 'filesystem, + secondary = { enabled = false }, # No database overhead + }, + embeddings = { + provider = 'fastembed, # Local, no API costs + }, + sync = { + auto_index = false, # Manual control + }, +} +``` + +#### Production Mode (`prod.ncl`) + +Optimized for: Performance, reliability, scalability + +```nickel +{ + storage = { + secondary = { enabled = true }, # SurrealDB for scale + }, + embeddings = { + provider = 'openai, # High-quality cloud embeddings + model = "text-embedding-3-small", + dimensions = 1536, + }, + sync = { + auto_index = true, + debounce_ms = 300, # Fast response + }, +} +``` + +#### Test Mode (`test.ncl`) + +Optimized for: Fast tests, isolation, determinism + +```nickel +{ + storage = { + primary = 'memory, # Ephemeral, no disk I/O + }, + embeddings = { + enabled = false, # Disable for speed + }, + sync = { + auto_index = false, + debounce_ms = 0, # No delays in tests + }, +} +``` + +### Layer 4: User Customizations + +**Location**: `.kogral-config/core/kogral.ncl` or `.kogral-config/platform/{dev,prod,test}.ncl` + +**Purpose**: Project-specific or deployment-specific overrides. + +**Example** (user project config): + +```nickel +let mode = import "../../schemas/modes/dev.ncl" in + +let user_custom = { + graph = { + name = "my-project", + }, + embeddings = { + provider = 'claude, # Override to use Claude + model = "claude-3-haiku-20240307", + }, + query = { + similarity_threshold = 0.7, # Stricter threshold + }, +} in + +helpers.compose_config defaults.base mode user_custom + | contracts.KbConfig +``` + +## Composition Mechanism + +The `helpers.ncl` module provides the composition function: + +```nickel +{ + # Recursively merge with override precedence + merge_with_override = fun base override => /* ... */, + + # Compose three layers + compose_config = fun defaults mode_config user_custom => + let with_mode = merge_with_override defaults mode_config in + merge_with_override with_mode user_custom, +} +``` + +**Merge behavior**: +- Records are merged recursively +- Override values take precedence over base values +- Arrays are not merged, override replaces base +- Null in override keeps base value + +**Example merge**: + +```nickel +base = { storage = { primary = 'filesystem }, embeddings = { enabled = true } } +override = { storage = { primary = 'memory } } +# Result: { storage = { primary = 'memory }, embeddings = { enabled = true } } +``` + +## Export to JSON + +Once composed, the Nickel configuration is exported to JSON for Rust consumption: + +```bash +nickel export --format json .kogral-config/core/kogral.ncl > .kogral-config/targets/kogral-core.json +``` + +**Output** (`.kogral-config/targets/kogral-core.json`): + +```json +{ + "graph": { + "name": "my-project", + "version": "1.0.0" + }, + "storage": { + "primary": "memory", + "secondary": { + "enabled": false + } + }, + "embeddings": { + "enabled": true, + "provider": "claude", + "model": "claude-3-haiku-20240307", + "dimensions": 768 + } +} +``` + +## Rust Integration + +The Rust code deserializes the JSON into typed structs using serde: + +```rust +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize, Serialize)] +pub struct KbConfig { + pub graph: GraphConfig, + pub storage: StorageConfig, + pub embeddings: EmbeddingConfig, + pub templates: TemplateConfig, + pub query: QueryConfig, + pub mcp: McpConfig, + pub sync: SyncConfig, +} + +impl KbConfig { + pub fn from_file(path: &Path) -> Result { + let json = std::fs::read_to_string(path)?; + let config: KbConfig = serde_json::from_str(&json)?; + Ok(config) + } +} +``` + +**Usage in kogral-core**: + +```rust +let config = KbConfig::from_file(".kogral-config/targets/kogral-core.json")?; + +// Config drives behavior +let storage: Box = match config.storage.primary { + StorageType::Filesystem => Box::new(FilesystemStorage::new(&config)?), + StorageType::Memory => Box::new(MemoryStorage::new()), + StorageType::SurrealDb => Box::new(SurrealDbStorage::new(&config).await?), +}; + +let embeddings: Box = match config.embeddings.provider { + EmbeddingProviderType::FastEmbed => Box::new(FastEmbedProvider::new()?), + EmbeddingProviderType::OpenAI => Box::new(RigEmbeddingProvider::openai(&config)?), + EmbeddingProviderType::Claude => Box::new(RigEmbeddingProvider::claude(&config)?), + EmbeddingProviderType::Ollama => Box::new(RigEmbeddingProvider::ollama(&config)?), +}; +``` + +## Double Validation + +Configuration is validated **twice**: + +### 1. Nickel Contract Validation + +At export time, Nickel validates: +- ✅ Types match contracts (e.g., `primary | StorageType`) +- ✅ Required fields are present +- ✅ Enums have valid values +- ✅ Nested structure is correct + +**Error example**: + +```text +error: contract broken by a value + ┌─ .kogral-config/core/kogral.ncl:15:5 + │ +15│ primary = 'invalid, + │ ^^^^^^^^^^^^^^^^^^^ applied to this expression + │ + = This value is not in the enum ['filesystem, 'memory, 'surrealdb] +``` + +### 2. Serde Deserialization Validation + +At runtime, serde validates: +- ✅ JSON structure matches Rust types +- ✅ Field names match (with rename support) +- ✅ Values can be converted to Rust types +- ✅ Required fields are not null + +**Error example**: + +```rust +Error: missing field `graph` at line 1 column 123 +``` + +## Benefits of Config-Driven Architecture + +### 1. Zero Hardcoding + +**Bad** (hardcoded): + +```rust +// Hardcoded - requires recompilation to change +let storage = FilesystemStorage::new("/fixed/path"); +let threshold = 0.6; +``` + +**Good** (config-driven): + +```rust +// Config-driven - change via .ncl file +let storage = create_storage(&config)?; +let threshold = config.query.similarity_threshold; +``` + +### 2. Environment Flexibility + +Same codebase, different behavior: + +```bash +# Development +nickel export .kogral-config/platform/dev.ncl > targets/kogral-core.json +# → Filesystem storage, fastembed, no auto-sync + +# Production +nickel export .kogral-config/platform/prod.ncl > targets/kogral-core.json +# → SurrealDB enabled, OpenAI embeddings, auto-sync + +# Testing +nickel export .kogral-config/platform/test.ncl > targets/kogral-core.json +# → In-memory storage, no embeddings, isolated +``` + +### 3. Self-Documenting + +Nickel contracts include inline documentation: + +```nickel +StorageType = [| 'filesystem, 'memory, 'surrealdb |] + | doc "Storage backend type: filesystem (git-tracked), memory (ephemeral), surrealdb (scalable)", +``` + +IDEs can show this documentation when editing `.ncl` files. + +### 4. Type-Safe Evolution + +When adding new features: + +1. Update contract in `contracts.ncl` +2. Add default in `defaults.ncl` +3. Export validates existing configs +4. Rust compilation validates deserialization + +Breaking changes are caught **before runtime**. + +### 5. Testability + +Different test scenarios without code changes: + +```nickel +# test-semantic-search.ncl +let test_config = defaults.base & { + embeddings = { enabled = true, provider = 'fastembed }, + query = { similarity_threshold = 0.3 }, +} in test_config +``` + +```rust +#[test] +fn test_semantic_search() { + let config = KbConfig::from_file("test-semantic-search.json")?; + // Config drives test behavior +} +``` + +## Configuration Discovery + +KOGRAL tools automatically discover configuration: + +1. **Check `.kogral-config/targets/kogral-core.json`** (pre-exported) +2. **Check `.kogral-config/core/kogral.ncl`** (export on-demand) +3. **Check environment variable `KOGRAL_CONFIG`** +4. **Fall back to embedded defaults** + +```rust +impl KbConfig { + pub fn discover() -> Result { + if let Ok(config) = Self::from_file(".kogral-config/targets/kogral-core.json") { + return Ok(config); + } + + if Path::new(".kogral-config/core/kogral.ncl").exists() { + // Export and load + let output = Command::new("nickel") + .args(["export", "--format", "json", ".kogral-config/core/kogral.ncl"]) + .output()?; + return serde_json::from_slice(&output.stdout)?; + } + + if let Ok(path) = std::env::var("KOGRAL_CONFIG") { + return Self::from_file(&path); + } + + Ok(Self::default()) // Embedded defaults + } +} +``` + +## Integration with justfile + +The `justfile` integrates configuration validation: + +```just +# Validate all Nickel configs +nickel-validate-all: + @echo "Validating Nickel schemas..." + nickel typecheck schemas/contracts.ncl + nickel typecheck schemas/defaults.ncl + nickel typecheck schemas/helpers.ncl + nickel typecheck schemas/modes/dev.ncl + nickel typecheck schemas/modes/prod.ncl + nickel typecheck schemas/modes/test.ncl + nickel typecheck .kogral-config/core/kogral.ncl + +# Export all platform configs +nickel-export-all: + @echo "Exporting platform configs to JSON..." + @mkdir -p .kogral-config/targets + nickel export --format json .kogral-config/platform/dev.ncl > .kogral-config/targets/kogral-dev.json + nickel export --format json .kogral-config/platform/prod.ncl > .kogral-config/targets/kogral-prod.json + nickel export --format json .kogral-config/platform/test.ncl > .kogral-config/targets/kogral-test.json + @echo "Exported 3 configurations to .kogral-config/targets/" +``` + +Usage: + +```bash +just nickel::validate-all # Check configs are valid +just nickel::export-all # Generate JSON for all environments +``` + +## Best Practices + +### 1. Never Hardcode + +If it's behavior, it's config: +- Storage paths +- API endpoints +- Thresholds +- Timeouts +- Feature flags +- Provider selection + +### 2. Use Modes for Environment Differences + +Don't put environment-specific values in user config: + +**Bad**: + +```nickel +# user config with env-specific values +{ + storage = { + url = if env == "prod" then "prod-url" else "dev-url" # Don't do this + } +} +``` + +**Good**: + +```nickel +# modes/prod.ncl +{ storage = { url = "prod-url" } } + +# modes/dev.ncl +{ storage = { url = "dev-url" } } + +# user config is environment-agnostic +{ graph = { name = "my-project" } } +``` + +### 3. Document Complex Fields + +Use Nickel's `doc` metadata: + +```nickel +similarity_threshold | Number + | doc "Minimum cosine similarity (0-1) for semantic search matches. Higher = stricter." + | default = 0.6, +``` + +### 4. Validate Early + +Run `nickel typecheck` in CI/CD before building Rust code. + +### 5. Version Configs + +Track `.ncl` files in git, ignore `.kogral-config/targets/*.json` (generated). + +## See Also + +- **Schema Reference**: [Configuration Schema](../config/schema.md) +- **User Guide**: [Configuration Guide](../config/overview.md) +- **ADR**: [Why Nickel vs TOML](adrs/001-nickel-vs-toml.md) +- **Examples**: `.kogral-config/core/kogral.ncl`, `.kogral-config/platform/*.ncl` diff --git a/docs/architecture/graph-model.md b/docs/architecture/graph-model.md new file mode 100644 index 0000000..52302dd --- /dev/null +++ b/docs/architecture/graph-model.md @@ -0,0 +1 @@ +# Graph Model diff --git a/docs/architecture/logseq-blocks-design.md b/docs/architecture/logseq-blocks-design.md new file mode 100644 index 0000000..f844744 --- /dev/null +++ b/docs/architecture/logseq-blocks-design.md @@ -0,0 +1,935 @@ +# Logseq Blocks Support - Architecture Design + +## Problem Statement + +Logseq uses **content blocks** as the fundamental unit of information, not full documents. Each block can have: + +- **Properties**: `#card`, `TODO`, `DONE`, custom properties +- **Tags**: Inline tags like `#flashcard`, `#important` +- **References**: Block references `((block-id))`, page references `[[page]]` +- **Nesting**: Outliner-style hierarchy (parent-child blocks) +- **Metadata**: Block-level properties (unlike page-level frontmatter) + +**Current KB limitation**: Nodes only have `content: String` (flat markdown). Importing from Logseq loses block structure and properties. + +**Requirement**: Support round-trip import/export with full block fidelity: + +```text +Logseq Graph → KOGRAL Import → KOGRAL Storage → KOGRAL Export → Logseq Graph + (blocks preserved) (blocks preserved) +``` + +## Use Cases + +### 1. Flashcards (`#card`) + +**Logseq**: + +```markdown +- What is Rust's ownership model? #card + - Rust uses ownership, borrowing, and lifetimes + - Three rules: one owner, many borrows XOR one mutable +``` + +**KB needs to preserve**: +- Block with `#card` property +- Nested answer blocks +- Ability to query all cards + +### 2. Task Tracking (`TODO`/`DONE`) + +**Logseq**: + +```markdown +- TODO Implement block parser #rust + - DONE Research block structure + - TODO Write parser tests +``` + +**KB needs to preserve**: +- Task status per block +- Hierarchical task breakdown +- Tags on tasks + +### 3. Block References + +**Logseq**: + +```markdown +- Core concept: ((block-uuid-123)) + - See also: [[Related Page]] +``` + +**KB needs to preserve**: +- Block-to-block links (not just page-to-page) +- UUID references + +### 4. Block Properties + +**Logseq**: + +```markdown +- This is a block with properties + property1:: value1 + property2:: value2 +``` + +**KB needs to preserve**: +- Custom key-value properties per block +- Property inheritance/override + +## Design Options + +### Option A: Blocks as First-Class Data Structure + +**Add `blocks` field to Node**: + +```rust +pub struct Node { + // ... existing fields ... + pub content: String, // Backward compat: flat markdown + pub blocks: Option>, // NEW: Structured blocks +} + +pub struct Block { + pub id: String, // UUID or auto-generated + pub content: String, // Block text + pub properties: BlockProperties, // Tags, status, custom props + pub children: Vec, // Nested blocks + pub created: DateTime, + pub modified: DateTime, +} + +pub struct BlockProperties { + pub tags: Vec, // #card, #important + pub status: Option, // TODO, DONE, WAITING + pub custom: HashMap, // property:: value +} + +pub enum TaskStatus { + Todo, + Doing, + Done, + Waiting, + Cancelled, +} +``` + +**Pros**: +- ✅ Type-safe, explicit structure +- ✅ Queryable (find all #card blocks) +- ✅ Preserves hierarchy +- ✅ Supports block-level operations + +**Cons**: +- ❌ Adds complexity to Node +- ❌ Dual representation (content + blocks) +- ❌ Requires migration of existing data + +### Option B: Parser-Only Approach + +**Keep `content: String`, parse blocks on-demand**: + +```rust +pub struct BlockParser; + +impl BlockParser { + // Parse markdown content into block structure + fn parse(content: &str) -> Vec; + + // Serialize blocks back to markdown + fn serialize(blocks: &[Block]) -> String; +} + +// Usage +let blocks = BlockParser::parse(&node.content); +let filtered = blocks.iter().filter(|b| b.properties.tags.contains("card")); +``` + +**Pros**: +- ✅ No schema changes +- ✅ Backward compatible +- ✅ Simple storage (still just String) + +**Cons**: +- ❌ Parse overhead on every access +- ❌ Can't query blocks in database (SurrealDB) +- ❌ Harder to index/search blocks + +### Option C: Hybrid Approach (RECOMMENDED) + +**Combine both: structured storage + lazy parsing**: + +```rust +pub struct Node { + // ... existing fields ... + pub content: String, // Source of truth (markdown) + + #[serde(skip_serializing_if = "Option::is_none")] + pub blocks: Option>, // Cached structure (parsed) +} + +impl Node { + // Parse blocks from content if not already cached + pub fn get_blocks(&mut self) -> &Vec { + if self.blocks.is_none() { + self.blocks = Some(BlockParser::parse(&self.content)); + } + self.blocks.as_ref().unwrap() + } + + // Update content from blocks (when blocks modified) + pub fn sync_blocks_to_content(&mut self) { + if let Some(ref blocks) = self.blocks { + self.content = BlockParser::serialize(blocks); + } + } +} +``` + +**Storage Strategy**: + +1. **Filesystem** - Store as markdown (Logseq compatible): + + ```markdown + - Block 1 #card + - Nested block + - Block 2 TODO + ``` + +2. **SurrealDB** - Store both: + + ```sql + DEFINE TABLE block SCHEMAFULL; + DEFINE FIELD node_id ON block TYPE record(node); + DEFINE FIELD block_id ON block TYPE string; + DEFINE FIELD content ON block TYPE string; + DEFINE FIELD properties ON block TYPE object; + DEFINE FIELD parent_id ON block TYPE option; + + -- Index for queries + DEFINE INDEX block_tags ON block COLUMNS properties.tags; + DEFINE INDEX block_status ON block COLUMNS properties.status; + ``` + +**Pros**: +- ✅ Best of both worlds +- ✅ Filesystem stays Logseq-compatible +- ✅ SurrealDB can query blocks +- ✅ Lazy parsing (only when needed) +- ✅ Backward compatible + +**Cons**: +- ⚠️ Need to keep content/blocks in sync +- ⚠️ More complex implementation + +## Recommended Implementation + +**Phase 1: Data Model** + +```rust +// crates/kogral-core/src/models/block.rs + +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +/// A content block (Logseq-style) +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Block { + /// Unique block identifier (UUID) + pub id: String, + + /// Block content (markdown text, excluding nested blocks) + pub content: String, + + /// Block properties (tags, status, custom) + pub properties: BlockProperties, + + /// Child blocks (nested hierarchy) + #[serde(default)] + pub children: Vec, + + /// Creation timestamp + pub created: DateTime, + + /// Last modification timestamp + pub modified: DateTime, + + /// Parent block ID (if nested) + #[serde(skip_serializing_if = "Option::is_none")] + pub parent_id: Option, +} + +/// Block-level properties +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +pub struct BlockProperties { + /// Tags (e.g., #card, #important) + #[serde(default)] + pub tags: Vec, + + /// Task status (TODO, DONE, etc.) + #[serde(skip_serializing_if = "Option::is_none")] + pub status: Option, + + /// Custom properties (property:: value) + #[serde(default)] + pub custom: HashMap, + + /// Block references ((uuid)) + #[serde(default)] + pub block_refs: Vec, + + /// Page references ([[page]]) + #[serde(default)] + pub page_refs: Vec, +} + +/// Task status for TODO blocks +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "UPPERCASE")] +pub enum TaskStatus { + Todo, + Doing, + Done, + Later, + Now, + Waiting, + Cancelled, +} + +impl Block { + /// Create a new block with content + pub fn new(content: String) -> Self { + use uuid::Uuid; + Self { + id: Uuid::new_v4().to_string(), + content, + properties: BlockProperties::default(), + children: Vec::new(), + created: Utc::now(), + modified: Utc::now(), + parent_id: None, + } + } + + /// Add a child block + pub fn add_child(&mut self, mut child: Block) { + child.parent_id = Some(self.id.clone()); + self.children.push(child); + self.modified = Utc::now(); + } + + /// Add a tag to this block + pub fn add_tag(&mut self, tag: String) { + if !self.properties.tags.contains(&tag) { + self.properties.tags.push(tag); + self.modified = Utc::now(); + } + } + + /// Set task status + pub fn set_status(&mut self, status: TaskStatus) { + self.properties.status = Some(status); + self.modified = Utc::now(); + } + + /// Get all blocks (self + descendants) as flat list + pub fn flatten(&self) -> Vec<&Block> { + let mut result = vec![self]; + for child in &self.children { + result.extend(child.flatten()); + } + result + } + + /// Find block by ID in tree + pub fn find(&self, id: &str) -> Option<&Block> { + if self.id == id { + return Some(self); + } + for child in &self.children { + if let Some(found) = child.find(id) { + return Some(found); + } + } + None + } +} +``` + +**Phase 2: Update Node Model** + +```rust +// crates/kogral-core/src/models.rs (modifications) + +use crate::models::block::Block; + +pub struct Node { + // ... existing fields ... + pub content: String, + + /// Structured blocks (optional, parsed from content) + #[serde(skip_serializing_if = "Option::is_none")] + pub blocks: Option>, +} + +impl Node { + /// Get blocks, parsing from content if needed + pub fn get_blocks(&mut self) -> Result<&Vec> { + if self.blocks.is_none() { + self.blocks = Some(crate::parser::BlockParser::parse(&self.content)?); + } + Ok(self.blocks.as_ref().unwrap()) + } + + /// Update content from blocks + pub fn sync_blocks_to_content(&mut self) { + if let Some(ref blocks) = self.blocks { + self.content = crate::parser::BlockParser::serialize(blocks); + } + } + + /// Find all blocks with a specific tag + pub fn find_blocks_by_tag(&mut self, tag: &str) -> Result> { + let blocks = self.get_blocks()?; + let mut result = Vec::new(); + for block in blocks { + for b in block.flatten() { + if b.properties.tags.iter().any(|t| t == tag) { + result.push(b); + } + } + } + Ok(result) + } + + /// Find all TODO blocks + pub fn find_todos(&mut self) -> Result> { + let blocks = self.get_blocks()?; + let mut result = Vec::new(); + for block in blocks { + for b in block.flatten() { + if matches!(b.properties.status, Some(TaskStatus::Todo)) { + result.push(b); + } + } + } + Ok(result) + } +} +``` + +**Phase 3: Block Parser** + +```rust +// crates/kogral-core/src/parser/block_parser.rs + +use crate::models::block::{Block, BlockProperties, TaskStatus}; +use regex::Regex; + +pub struct BlockParser; + +impl BlockParser { + /// Parse markdown content into block structure + /// + /// Handles: + /// - Outliner format (- prefix with indentation) + /// - Tags (#card, #important) + /// - Task status (TODO, DONE) + /// - Properties (property:: value) + /// - Block references (((uuid))) + /// - Page references ([[page]]) + pub fn parse(content: &str) -> Result> { + let mut blocks = Vec::new(); + let mut stack: Vec<(usize, Block)> = Vec::new(); // (indent_level, block) + + for line in content.lines() { + // Detect indentation level + let indent = count_indent(line); + let trimmed = line.trim_start(); + + // Skip empty lines + if trimmed.is_empty() { + continue; + } + + // Parse block line + if let Some(block_content) = trimmed.strip_prefix("- ") { + let mut block = Self::parse_block_line(block_content)?; + + // Pop stack until we find parent level + while let Some((level, _)) = stack.last() { + if *level < indent { + break; + } + stack.pop(); + } + + // Add as child to parent or as root + if let Some((_, parent)) = stack.last_mut() { + parent.add_child(block.clone()); + } else { + blocks.push(block.clone()); + } + + stack.push((indent, block)); + } + } + + Ok(blocks) + } + + /// Parse a single block line (after "- " prefix) + fn parse_block_line(line: &str) -> Result { + let mut block = Block::new(String::new()); + let mut properties = BlockProperties::default(); + + // Extract task status (TODO, DONE, etc.) + let (status, remaining) = Self::extract_task_status(line); + properties.status = status; + + // Extract tags (#card, #important) + let (tags, remaining) = Self::extract_tags(remaining); + properties.tags = tags; + + // Extract properties (property:: value) + let (custom_props, remaining) = Self::extract_properties(remaining); + properties.custom = custom_props; + + // Extract block references (((uuid))) + let (block_refs, remaining) = Self::extract_block_refs(remaining); + properties.block_refs = block_refs; + + // Extract page references ([[page]]) + let (page_refs, content) = Self::extract_page_refs(remaining); + properties.page_refs = page_refs; + + block.content = content.trim().to_string(); + block.properties = properties; + + Ok(block) + } + + /// Serialize blocks back to markdown + pub fn serialize(blocks: &[Block]) -> String { + let mut result = String::new(); + for block in blocks { + Self::serialize_block(&mut result, block, 0); + } + result + } + + fn serialize_block(output: &mut String, block: &Block, indent: usize) { + // Write indent + for _ in 0..indent { + output.push_str(" "); + } + + // Write prefix + output.push_str("- "); + + // Write task status + if let Some(status) = block.properties.status { + output.push_str(&format!("{:?} ", status).to_uppercase()); + } + + // Write content + output.push_str(&block.content); + + // Write tags + for tag in &block.properties.tags { + output.push_str(&format!(" #{}", tag)); + } + + // Write properties + if !block.properties.custom.is_empty() { + output.push('\n'); + for (key, value) in &block.properties.custom { + for _ in 0..=indent { + output.push_str(" "); + } + output.push_str(&format!("{}:: {}\n", key, value)); + } + } + + output.push('\n'); + + // Write children recursively + for child in &block.children { + Self::serialize_block(output, child, indent + 1); + } + } + + // Helper methods for extraction + fn extract_task_status(line: &str) -> (Option, &str) { + let line = line.trim_start(); + if let Some(rest) = line.strip_prefix("TODO ") { + (Some(TaskStatus::Todo), rest) + } else if let Some(rest) = line.strip_prefix("DONE ") { + (Some(TaskStatus::Done), rest) + } else if let Some(rest) = line.strip_prefix("DOING ") { + (Some(TaskStatus::Doing), rest) + } else if let Some(rest) = line.strip_prefix("LATER ") { + (Some(TaskStatus::Later), rest) + } else if let Some(rest) = line.strip_prefix("NOW ") { + (Some(TaskStatus::Now), rest) + } else if let Some(rest) = line.strip_prefix("WAITING ") { + (Some(TaskStatus::Waiting), rest) + } else if let Some(rest) = line.strip_prefix("CANCELLED ") { + (Some(TaskStatus::Cancelled), rest) + } else { + (None, line) + } + } + + fn extract_tags(line: &str) -> (Vec, String) { + let tag_regex = Regex::new(r"#(\w+)").unwrap(); + let mut tags = Vec::new(); + let mut result = line.to_string(); + + for cap in tag_regex.captures_iter(line) { + if let Some(tag) = cap.get(1) { + tags.push(tag.as_str().to_string()); + result = result.replace(&format!("#{}", tag.as_str()), ""); + } + } + + (tags, result.trim().to_string()) + } + + fn extract_properties(line: &str) -> (HashMap, String) { + let prop_regex = Regex::new(r"(\w+)::\s*([^\n]+)").unwrap(); + let mut props = HashMap::new(); + let mut result = line.to_string(); + + for cap in prop_regex.captures_iter(line) { + if let (Some(key), Some(value)) = (cap.get(1), cap.get(2)) { + props.insert(key.as_str().to_string(), value.as_str().trim().to_string()); + result = result.replace(&cap[0], ""); + } + } + + (props, result.trim().to_string()) + } + + fn extract_block_refs(line: &str) -> (Vec, String) { + let ref_regex = Regex::new(r"\(\(([^)]+)\)\)").unwrap(); + let mut refs = Vec::new(); + let mut result = line.to_string(); + + for cap in ref_regex.captures_iter(line) { + if let Some(uuid) = cap.get(1) { + refs.push(uuid.as_str().to_string()); + result = result.replace(&cap[0], ""); + } + } + + (refs, result.trim().to_string()) + } + + fn extract_page_refs(line: &str) -> (Vec, String) { + let page_regex = Regex::new(r"\[\[([^\]]+)\]\]").unwrap(); + let mut pages = Vec::new(); + let result = line.to_string(); + + for cap in page_regex.captures_iter(line) { + if let Some(page) = cap.get(1) { + pages.push(page.as_str().to_string()); + // Keep [[page]] in content for now (backward compat) + } + } + + (pages, result) + } +} + +fn count_indent(line: &str) -> usize { + line.chars().take_while(|c| c.is_whitespace()).count() / 2 +} +``` + +**Phase 4: Logseq Import/Export** + +```rust +// crates/kogral-core/src/logseq.rs + +use crate::models::{Node, NodeType}; +use crate::models::block::Block; +use crate::parser::BlockParser; + +pub struct LogseqImporter; + +impl LogseqImporter { + /// Import a Logseq page (markdown file) as a Node + pub fn import_page(path: &Path) -> Result { + let content = std::fs::read_to_string(path)?; + + // Extract frontmatter if present + let (frontmatter, body) = Self::split_frontmatter(&content); + + // Parse blocks from body + let blocks = BlockParser::parse(&body)?; + + // Create node with blocks + let mut node = Node::new(NodeType::Note, Self::extract_title(path)); + node.content = body; + node.blocks = Some(blocks); + + // Apply frontmatter properties + if let Some(fm) = frontmatter { + Self::apply_frontmatter(&mut node, &fm)?; + } + + Ok(node) + } + + fn split_frontmatter(content: &str) -> (Option, String) { + if content.starts_with("---\n") { + if let Some(end) = content[4..].find("\n---\n") { + let frontmatter = content[4..4 + end].to_string(); + let body = content[4 + end + 5..].to_string(); + return (Some(frontmatter), body); + } + } + (None, content.to_string()) + } + + fn extract_title(path: &Path) -> String { + path.file_stem() + .and_then(|s| s.to_str()) + .unwrap_or("Untitled") + .to_string() + } + + fn apply_frontmatter(node: &mut Node, frontmatter: &str) -> Result<()> { + // Parse YAML frontmatter and apply to node + // ... implementation ... + Ok(()) + } +} + +pub struct LogseqExporter; + +impl LogseqExporter { + /// Export a Node to Logseq page format + pub fn export_page(node: &Node, path: &Path) -> Result<()> { + let mut output = String::new(); + + // Generate frontmatter + output.push_str("---\n"); + output.push_str(&Self::generate_frontmatter(node)?); + output.push_str("---\n\n"); + + // Serialize blocks or use content + if let Some(ref blocks) = node.blocks { + output.push_str(&BlockParser::serialize(blocks)); + } else { + output.push_str(&node.content); + } + + std::fs::write(path, output)?; + Ok(()) + } + + fn generate_frontmatter(node: &Node) -> Result { + let mut fm = String::new(); + fm.push_str(&format!("title: {}\n", node.title)); + fm.push_str(&format!("tags: {}\n", node.tags.join(", "))); + // ... more frontmatter fields ... + Ok(fm) + } +} +``` + +## Query API Extensions + +```rust +// New methods in Graph or Query module + +impl Graph { + /// Find all blocks with a specific tag across all nodes + pub fn find_blocks_by_tag(&mut self, tag: &str) -> Vec<(&Node, &Block)> { + let mut results = Vec::new(); + for node in self.nodes.values_mut() { + if let Ok(blocks) = node.find_blocks_by_tag(tag) { + for block in blocks { + results.push((node as &Node, block)); + } + } + } + results + } + + /// Find all flashcards (#card blocks) + pub fn find_flashcards(&mut self) -> Vec<(&Node, &Block)> { + self.find_blocks_by_tag("card") + } + + /// Find all TODO items across knowledge base + pub fn find_all_todos(&mut self) -> Vec<(&Node, &Block)> { + let mut results = Vec::new(); + for node in self.nodes.values_mut() { + if let Ok(todos) = node.find_todos() { + for block in todos { + results.push((node as &Node, block)); + } + } + } + results + } +} +``` + +## MCP Tool Extensions + +```json +{ + "name": "kogral/find_blocks", + "description": "Find blocks by tag, status, or properties", + "inputSchema": { + "type": "object", + "properties": { + "tag": { "type": "string", "description": "Filter by tag (e.g., 'card')" }, + "status": { "type": "string", "enum": ["TODO", "DONE", "DOING"] }, + "property": { "type": "string", "description": "Custom property key" }, + "value": { "type": "string", "description": "Property value to match" } + } + } +} +``` + +## Configuration + +```nickel +# schemas/contracts.ncl (additions) + +BlockConfig = { + enabled | Bool + | doc "Enable block-level parsing and storage" + | default = true, + + preserve_hierarchy | Bool + | doc "Preserve block nesting on import/export" + | default = true, + + parse_on_load | Bool + | doc "Automatically parse blocks when loading nodes" + | default = false, # Lazy parsing by default + + supported_statuses | Array String + | doc "Supported task statuses" + | default = ["TODO", "DONE", "DOING", "LATER", "NOW", "WAITING", "CANCELLED"], +} + +KbConfig = { + # ... existing fields ... + + blocks | BlockConfig + | doc "Block-level features configuration" + | default = {}, +} +``` + +## Migration Path + +**Phase 1**: Add Block models (no behavior change) +**Phase 2**: Add BlockParser (opt-in via config) +**Phase 3**: Update Logseq import/export +**Phase 4**: Add block queries to CLI/MCP +**Phase 5**: SurrealDB block indexing + +**Backward Compatibility**: +- Existing nodes without `blocks` field work as before +- `content` remains source of truth +- `blocks` is optional cache/structure +- Config flag `blocks.enabled` to opt-in + +## Testing Strategy + +```rust +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_simple_block() { + let content = "- This is a block #card"; + let blocks = BlockParser::parse(content).unwrap(); + + assert_eq!(blocks.len(), 1); + assert_eq!(blocks[0].content, "This is a block"); + assert_eq!(blocks[0].properties.tags, vec!["card"]); + } + + #[test] + fn test_parse_nested_blocks() { + let content = r#" +- Parent block + - Child block 1 + - Child block 2 + - Grandchild +"#; + let blocks = BlockParser::parse(content).unwrap(); + + assert_eq!(blocks.len(), 1); + assert_eq!(blocks[0].children.len(), 2); + assert_eq!(blocks[0].children[1].children.len(), 1); + } + + #[test] + fn test_parse_todo() { + let content = "- TODO Implement feature #rust"; + let blocks = BlockParser::parse(content).unwrap(); + + assert_eq!(blocks[0].properties.status, Some(TaskStatus::Todo)); + assert_eq!(blocks[0].content, "Implement feature"); + assert_eq!(blocks[0].properties.tags, vec!["rust"]); + } + + #[test] + fn test_roundtrip() { + let original = r#"- Block 1 #card + - Nested +- TODO Block 2 + priority:: high +"#; + let blocks = BlockParser::parse(original).unwrap(); + let serialized = BlockParser::serialize(&blocks); + let reparsed = BlockParser::parse(&serialized).unwrap(); + + assert_eq!(blocks.len(), reparsed.len()); + assert_eq!(blocks[0].properties, reparsed[0].properties); + } +} +``` + +## Summary + +**Recommended Approach**: Hybrid (Option C) + +- **Add** `Block` struct with properties, hierarchy +- **Extend** `Node` with optional `blocks: Option>` +- **Implement** bidirectional parser (markdown ↔ blocks) +- **Preserve** `content` as source of truth (backward compat) +- **Enable** block queries in CLI/MCP +- **Support** round-trip Logseq import/export + +**Benefits**: +- ✅ Full Logseq compatibility +- ✅ Queryable blocks (find #card, TODO, etc.) +- ✅ Backward compatible +- ✅ Extensible (custom properties) +- ✅ Type-safe structure + +**Trade-offs**: +- ⚠️ Added complexity +- ⚠️ Need to sync content ↔ blocks +- ⚠️ More storage for SurrealDB backend + +**Next Steps**: +1. Review and approve design +2. Implement Phase 1 (Block models) +3. Implement Phase 2 (BlockParser) +4. Update Logseq import/export +5. Add block queries to MCP/CLI diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md new file mode 100644 index 0000000..de2668c --- /dev/null +++ b/docs/architecture/overview.md @@ -0,0 +1,486 @@ +# System Architecture + +Comprehensive overview of the KOGRAL architecture. + +## High-Level Architecture + +![Architecture Overview](../diagrams/architecture-overview.svg) + +The KOGRAL consists of three main layers: + +1. **User Interfaces**: kogral-cli (terminal), kogral-mcp (AI integration), NuShell scripts (automation) +2. **Core Library (kogral-core)**: Rust library with graph engine, storage abstraction, embeddings, query engine +3. **Storage Backends**: Filesystem (git-friendly), SurrealDB (scalable), In-Memory (cache/testing) + +## Component Details + +### kogral-cli (Command-Line Interface) + +**Purpose**: Primary user interface for local knowledge management. + +**Commands** (13 total): +- `init`: Initialize `.kogral/` directory +- `add`: Create nodes (note, decision, guideline, pattern, journal) +- `search`: Text and semantic search +- `link`: Create relationships between nodes +- `list`: List all nodes +- `show`: Display node details +- `delete`: Remove nodes +- `graph`: Visualize knowledge graph +- `sync`: Sync filesystem ↔ SurrealDB +- `serve`: Start MCP server +- `import`: Import from Logseq +- `export`: Export to Logseq/JSON +- `config`: Manage configuration + +**Technology**: Rust + clap (derive API) + +**Features**: +- Colored terminal output +- Interactive prompts +- Dry-run modes +- Validation before operations + +### kogral-mcp (MCP Server) + +**Purpose**: AI integration via Model Context Protocol. + +**Protocol**: JSON-RPC 2.0 over stdio + +**Components**: + +1. **Tools** (7): + - `kogral/search`: Query knowledge base + - `kogral/add_note`: Create notes + - `kogral/add_decision`: Create ADRs + - `kogral/link`: Create relationships + - `kogral/get_guidelines`: Retrieve guidelines with inheritance + - `kb/list_graphs`: List available graphs + - `kogral/export`: Export to formats + +2. **Resources** (6 URIs): + - `kogral://project/notes` + - `kogral://project/decisions` + - `kogral://project/guidelines` + - `kogral://project/patterns` + - `kogral://shared/guidelines` + - `kogral://shared/patterns` + +3. **Prompts** (2): + - `kogral/summarize_project`: Generate project summary + - `kogral/find_related`: Find related nodes + +**Integration**: Claude Code via `~/.config/claude/config.json` + +### NuShell Scripts + +**Purpose**: Automation and maintenance tasks. + +**Scripts** (6): +- `kogral-sync.nu`: Filesystem ↔ SurrealDB sync +- `kogral-backup.nu`: Archive knowledge base +- `kogral-reindex.nu`: Rebuild embeddings +- `kogral-import-logseq.nu`: Import from Logseq +- `kogral-export-logseq.nu`: Export to Logseq +- `kogral-stats.nu`: Graph statistics + +**Features**: +- Colored output +- Dry-run modes +- Progress indicators +- Error handling + +## Core Library (kogral-core) + +### Models + +**Graph**: + +```rust +pub struct Graph { + pub name: String, + pub version: String, + pub nodes: HashMap, // ID → Node + pub edges: Vec, + pub metadata: HashMap, +} +``` + +**Node**: + +```rust +pub struct Node { + pub id: String, + pub node_type: NodeType, + pub title: String, + pub content: String, + pub tags: Vec, + pub status: NodeStatus, + pub created: DateTime, + pub modified: DateTime, + // ... relationships, metadata +} +``` + +**Edge**: + +```rust +pub struct Edge { + pub from: String, + pub to: String, + pub relation: EdgeType, + pub strength: f32, + pub created: DateTime, +} +``` + +### Storage Trait + +```rust +#[async_trait] +pub trait Storage: Send + Sync { + /// Save a complete graph to storage + async fn save_graph(&mut self, graph: &Graph) -> Result<()>; + + /// Load a graph from storage + async fn load_graph(&self, name: &str) -> Result; + + /// Save a single node to storage + async fn save_node(&mut self, node: &Node) -> Result<()>; + + /// Load a node by ID + async fn load_node(&self, graph_name: &str, node_id: &str) -> Result; + + /// Delete a node + async fn delete_node(&mut self, graph_name: &str, node_id: &str) -> Result<()>; + + /// List all graphs + async fn list_graphs(&self) -> Result>; + + /// List nodes in a graph, optionally filtered by type + async fn list_nodes(&self, graph_name: &str, node_type: Option<&str>) -> Result>; +} +``` + +**Implementations**: +1. `FilesystemStorage`: Git-friendly markdown files +2. `MemoryStorage`: In-memory with DashMap +3. `SurrealDbStorage`: Scalable graph database + +### Embedding Provider Trait + +```rust +#[async_trait] +pub trait EmbeddingProvider: Send + Sync { + async fn embed(&self, texts: Vec) -> Result>>; + fn dimensions(&self) -> usize; + fn model_name(&self) -> &str; +} +``` + +**Implementations**: +1. `FastEmbedProvider`: Local fastembed +2. `RigEmbeddingProvider`: OpenAI, Claude, Ollama (via rig-core) + +### Parser + +**Input**: Markdown file with YAML frontmatter + +**Output**: `Node` struct + +**Features**: +- YAML frontmatter extraction +- Markdown body parsing +- Wikilink detection (`[[linked-note]]`) +- Code reference parsing (`@file.rs:42`) + +**Example**: + +```markdown +--- +id: note-123 +type: note +title: My Note +tags: [rust, async] +--- + +# My Note + +Content with [[other-note]] and @src/main.rs:10 +``` + +→ + +```rust +Node { + id: "note-123", + node_type: NodeType::Note, + title: "My Note", + content: "Content with [[other-note]] and @src/main.rs:10", + tags: vec!["rust", "async"], + // ... parsed wikilinks, code refs +} +``` + +## Configuration System + +### Nickel Schema + +```nickel +# schemas/kogral-config.ncl +{ + KbConfig = { + graph | GraphConfig, + storage | StorageConfig, + embeddings | EmbeddingConfig, + templates | TemplateConfig, + query | QueryConfig, + mcp | McpConfig, + sync | SyncConfig, + }, +} +``` + +### Loading Process + +```text +User writes: .kogral/config.ncl + ↓ [nickel export --format json] +JSON intermediate + ↓ [serde_json::from_str] +KbConfig struct (Rust) + ↓ +Runtime behavior +``` + +**Double Validation**: +1. Nickel contracts: Type-safe, enum validation +2. Serde deserialization: Rust type checking + +**Benefits**: +- Errors caught at export time +- Runtime guaranteed valid config +- Self-documenting schemas + +## Storage Architecture + +### Hybrid Strategy + +**Local Graph** (per project): +- Storage: Filesystem (`.kogral/` directory) +- Format: Markdown + YAML frontmatter +- Version control: Git +- Scope: Project-specific knowledge + +**Shared Graph** (organization): +- Storage: SurrealDB (or synced filesystem) +- Format: Same markdown (for compatibility) +- Version control: Optional +- Scope: Organization-wide guidelines + +**Sync**: + +```text +Filesystem (.kogral/) + ↕ [bidirectional sync] +SurrealDB (central) +``` + +### File Layout + +```text +.kogral/ +├── config.toml # Graph metadata +├── notes/ +│ ├── async-patterns.md # Individual note +│ └── error-handling.md +├── decisions/ +│ ├── 0001-use-rust.md # ADR format +│ └── 0002-surrealdb.md +├── guidelines/ +│ ├── rust-errors.md # Project guideline +│ └── testing.md +├── patterns/ +│ └── repository.md +└── journal/ + ├── 2026-01-17.md # Daily journal + └── 2026-01-18.md +``` + +## Query Engine + +### Text Search + +```rust +let results = graph.nodes.values() + .filter(|node| { + node.title.contains(&query) || + node.content.contains(&query) || + node.tags.iter().any(|tag| tag.contains(&query)) + }) + .collect(); +``` + +### Semantic Search + +```rust +let query_embedding = embeddings.embed(vec![query]).await?; +let mut scored: Vec<_> = graph.nodes.values() + .filter_map(|node| { + let node_embedding = node.embedding.as_ref()?; + let similarity = cosine_similarity(&query_embedding[0], node_embedding); + (similarity >= threshold).then_some((node, similarity)) + }) + .collect(); +scored.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); +``` + +### Cross-Graph Query + +```rust +// Query both project and shared graphs +let project_results = project_graph.search(&query).await?; +let shared_results = shared_graph.search(&query).await?; + +// Merge with deduplication +let combined = merge_results(project_results, shared_results); +``` + +## MCP Protocol Flow + +```text +Claude Code kogral-mcp kogral-core + │ │ │ + ├─ JSON-RPC request ───→ │ │ + │ kogral/search │ │ + │ {"query": "rust"} │ │ + │ ├─ search() ──────────→ │ + │ │ │ + │ │ Query engine + │ │ Text + semantic + │ │ │ + │ │ ←──── results ─────────┤ + │ │ │ + │ ←─ JSON-RPC response ──┤ │ + │ {"results": [...]} │ │ +``` + +## Template System + +**Engine**: Tera (Jinja2-like) + +**Templates**: + +1. **Document Templates** (6): + - `note.md.tera` + - `decision.md.tera` + - `guideline.md.tera` + - `pattern.md.tera` + - `journal.md.tera` + - `execution.md.tera` + +2. **Export Templates** (4): + - `logseq-page.md.tera` + - `logseq-journal.md.tera` + - `summary.md.tera` + - `graph.json.tera` + +**Usage**: + +```rust +let mut tera = Tera::new("templates/**/*.tera")?; +let rendered = tera.render("note.md.tera", &context)?; +``` + +## Error Handling + +**Strategy**: `thiserror` for structured errors + +```rust +#[derive(Error, Debug)] +pub enum KbError { + #[error("Storage error: {0}")] + Storage(String), + + #[error("Node not found: {0}")] + NodeNotFound(String), + + #[error("Configuration error: {0}")] + Config(String), + + #[error("Parse error: {0}")] + Parse(String), + + #[error("Embedding error: {0}")] + Embedding(String), +} +``` + +**Propagation**: `?` operator throughout + +## Testing Strategy + +**Unit Tests**: Per module (models, parser, storage) + +**Integration Tests**: Full workflow (add → save → load → query) + +**Test Coverage**: +- kogral-core: 48 tests +- kogral-mcp: 5 tests +- Total: 56 tests + +**Test Data**: Fixtures in `tests/fixtures/` + +## Performance Considerations + +**Node Lookup**: O(1) via HashMap + +**Semantic Search**: O(n) with early termination (threshold filter) + +**Storage**: +- Filesystem: Lazy loading (load on demand) +- Memory: Full graph in RAM +- SurrealDB: Query optimization (indexes) + +**Embeddings**: +- Cache embeddings in node metadata +- Batch processing (configurable batch size) +- Async generation (non-blocking) + +## Security + +**No unsafe code**: `#![forbid(unsafe_code)]` + +**Input validation**: +- Nickel contracts validate config +- serde validates JSON +- Custom validation for user input + +**File operations**: +- Path sanitization (no `../` traversal) +- Permissions checking +- Atomic writes (temp file + rename) + +## Scalability + +**Small Projects** (< 1000 nodes): +- Filesystem storage +- In-memory search +- Local embeddings (fastembed) + +**Medium Projects** (1000-10,000 nodes): +- Filesystem + SurrealDB sync +- Semantic search with caching +- Cloud embeddings (OpenAI/Claude) + +**Large Organizations** (> 10,000 nodes): +- SurrealDB primary +- Distributed embeddings +- Multi-graph federation + +## Next Steps + +- **Graph Model Details**: [Graph Model](graph-model.md) +- **Storage Deep Dive**: [Storage Architecture](storage-architecture.md) +- **ADRs**: [Architectural Decisions](adrs/001-nickel-vs-toml.md) +- **Implementation**: [Development Guide](../contributing/development.md) diff --git a/docs/architecture/storage-architecture.md b/docs/architecture/storage-architecture.md new file mode 100644 index 0000000..4485cee --- /dev/null +++ b/docs/architecture/storage-architecture.md @@ -0,0 +1 @@ +# Storage Architecture diff --git a/docs/book.toml b/docs/book.toml new file mode 100644 index 0000000..401b311 --- /dev/null +++ b/docs/book.toml @@ -0,0 +1,38 @@ +[book] +title = "KOGRAL Documentation" +authors = ["KOGRAL Team"] +description = "Complete documentation for KOGRAL - Git-native knowledge graphs for developer teams" +language = "en" +multilingual = false +src = "." + +[build] +build-dir = "book" +create-missing = true + +[output.html] +default-theme = "rust" +preferred-dark-theme = "navy" +git-repository-url = "https://github.com/your-org/knowledge-base" +edit-url-template = "https://github.com/your-org/knowledge-base/edit/main/docs/{path}" + +[output.html.print] +enable = true + +[output.html.fold] +enable = true +level = 1 + +[output.html.search] +enable = true +limit-results = 30 +teaser-word-count = 30 +use-boolean-and = true +boost-title = 2 +boost-hierarchy = 1 +boost-paragraph = 1 +expand = true +heading-split-level = 3 + +[preprocessor.links] +[preprocessor.index] diff --git a/docs/book/.nojekyll b/docs/book/.nojekyll new file mode 100644 index 0000000..f173110 --- /dev/null +++ b/docs/book/.nojekyll @@ -0,0 +1 @@ +This file makes sure that Github Pages doesn't process mdBook's output. diff --git a/docs/book/404.html b/docs/book/404.html new file mode 100644 index 0000000..732ad4a --- /dev/null +++ b/docs/book/404.html @@ -0,0 +1,214 @@ + + + + + + Page not found - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Document not found (404)

+

This URL is invalid, sorry. Please use the navigation bar or search to continue.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/FontAwesome/css/font-awesome.css b/docs/book/FontAwesome/css/font-awesome.css new file mode 100644 index 0000000..540440c --- /dev/null +++ b/docs/book/FontAwesome/css/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/docs/book/FontAwesome/fonts/FontAwesome.ttf b/docs/book/FontAwesome/fonts/FontAwesome.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/docs/book/FontAwesome/fonts/FontAwesome.ttf differ diff --git a/docs/book/FontAwesome/fonts/fontawesome-webfont.eot b/docs/book/FontAwesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/docs/book/FontAwesome/fonts/fontawesome-webfont.eot differ diff --git a/docs/book/FontAwesome/fonts/fontawesome-webfont.svg b/docs/book/FontAwesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/docs/book/FontAwesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/book/FontAwesome/fonts/fontawesome-webfont.ttf b/docs/book/FontAwesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/docs/book/FontAwesome/fonts/fontawesome-webfont.ttf differ diff --git a/docs/book/FontAwesome/fonts/fontawesome-webfont.woff b/docs/book/FontAwesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/docs/book/FontAwesome/fonts/fontawesome-webfont.woff differ diff --git a/docs/book/FontAwesome/fonts/fontawesome-webfont.woff2 b/docs/book/FontAwesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/docs/book/FontAwesome/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/book/ai/claude.html b/docs/book/ai/claude.html new file mode 100644 index 0000000..9ce9826 --- /dev/null +++ b/docs/book/ai/claude.html @@ -0,0 +1,227 @@ + + + + + + Claude Integration - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Claude Integration

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/ai/embeddings-overview.html b/docs/book/ai/embeddings-overview.html new file mode 100644 index 0000000..52631c0 --- /dev/null +++ b/docs/book/ai/embeddings-overview.html @@ -0,0 +1,227 @@ + + + + + + Embeddings Overview - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Embeddings Overview

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/ai/fastembed.html b/docs/book/ai/fastembed.html new file mode 100644 index 0000000..be3eb3b --- /dev/null +++ b/docs/book/ai/fastembed.html @@ -0,0 +1,227 @@ + + + + + + FastEmbed Local - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

FastEmbed Local

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/ai/ollama.html b/docs/book/ai/ollama.html new file mode 100644 index 0000000..ba46fc8 --- /dev/null +++ b/docs/book/ai/ollama.html @@ -0,0 +1,227 @@ + + + + + + Ollama Integration - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Ollama Integration

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/ai/openai.html b/docs/book/ai/openai.html new file mode 100644 index 0000000..8381c23 --- /dev/null +++ b/docs/book/ai/openai.html @@ -0,0 +1,227 @@ + + + + + + OpenAI Integration - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

OpenAI Integration

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/ai/providers.html b/docs/book/ai/providers.html new file mode 100644 index 0000000..b6715bb --- /dev/null +++ b/docs/book/ai/providers.html @@ -0,0 +1,227 @@ + + + + + + Provider Configuration - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Provider Configuration

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/ai/semantic-search.html b/docs/book/ai/semantic-search.html new file mode 100644 index 0000000..f0fa41d --- /dev/null +++ b/docs/book/ai/semantic-search.html @@ -0,0 +1,227 @@ + + + + + + Semantic Search - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Semantic Search

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/api/mcp-protocol.html b/docs/book/api/mcp-protocol.html new file mode 100644 index 0000000..68e72c0 --- /dev/null +++ b/docs/book/api/mcp-protocol.html @@ -0,0 +1,227 @@ + + + + + + MCP Protocol - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

MCP Protocol

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/api/mcp-resources.html b/docs/book/api/mcp-resources.html new file mode 100644 index 0000000..19b976f --- /dev/null +++ b/docs/book/api/mcp-resources.html @@ -0,0 +1,227 @@ + + + + + + Resources - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Resources

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/api/mcp-tools.html b/docs/book/api/mcp-tools.html new file mode 100644 index 0000000..ecb0cdb --- /dev/null +++ b/docs/book/api/mcp-tools.html @@ -0,0 +1,942 @@ + + + + + + Tools Reference - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

MCP Tools API Reference

+

Complete reference for the Model Context Protocol (MCP) server tools and resources.

+

Overview

+

The kogral-mcp server implements the MCP protocol (JSON-RPC 2.0) for Claude Code integration. It provides:

+
    +
  • 10 Tools: Operations for querying and modifying knowledge base (7 core + 3 block tools)
  • +
  • 6 Resources: Access to knowledge graph content via URIs
  • +
  • 2 Prompts: Guided workflows for common tasks
  • +
+

Server Configuration

+

Start MCP Server

+
# Stdio transport (local use)
+kb serve
+
+# Or run directly
+kb-mcp serve
+
+

Claude Code Configuration

+

Add to ~/.config/claude/config.json:

+
{
+  "mcpServers": {
+    "kogral-mcp": {
+      "command": "/path/to/kb-mcp",
+      "args": ["serve"],
+      "env": {
+        "KOGRAL_DIR": "/path/to/project/.kogral"
+      }
+    }
+  }
+}
+
+

Tools

+

kb/search

+

Search the knowledge base using text and/or semantic similarity.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "query": {
+      "type": "string",
+      "description": "Search query"
+    },
+    "type": {
+      "type": "string",
+      "enum": ["note", "decision", "guideline", "pattern", "journal", "execution", "all"],
+      "description": "Filter by node type",
+      "default": "all"
+    },
+    "project": {
+      "type": "string",
+      "description": "Limit search to specific project graph"
+    },
+    "semantic": {
+      "type": "boolean",
+      "description": "Enable semantic similarity search",
+      "default": true
+    },
+    "threshold": {
+      "type": "number",
+      "description": "Minimum similarity threshold (0-1)",
+      "default": 0.4
+    },
+    "limit": {
+      "type": "integer",
+      "description": "Maximum number of results",
+      "default": 10
+    }
+  },
+  "required": ["query"]
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 1,
+  "method": "kogral/search",
+  "params": {
+    "query": "error handling patterns in Rust",
+    "type": "pattern",
+    "semantic": true,
+    "threshold": 0.6,
+    "limit": 5
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 1,
+  "result": {
+    "type": "text",
+    "text": "Found 3 result(s):\n\n1. Error Handling with thiserror (pattern, score: 0.85)\n   Tags: rust, error-handling\n   Created: 2026-01-15\n   \n2. Result Type Best Practices (guideline, score: 0.72)\n   Tags: rust, error-handling, best-practices\n   Created: 2026-01-10\n\n3. Custom Error Types (note, score: 0.65)\n   Tags: rust, error-handling\n   Created: 2026-01-08"
+  }
+}
+
+

kb/add_note

+

Add a new note to the knowledge base.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "title": {
+      "type": "string",
+      "description": "Note title"
+    },
+    "content": {
+      "type": "string",
+      "description": "Note content (markdown)"
+    },
+    "tags": {
+      "type": "array",
+      "items": { "type": "string" },
+      "description": "Tags for categorization",
+      "default": []
+    },
+    "relates_to": {
+      "type": "array",
+      "items": { "type": "string" },
+      "description": "Related node IDs",
+      "default": []
+    },
+    "project": {
+      "type": "string",
+      "description": "Project graph name",
+      "default": "default"
+    }
+  },
+  "required": ["title", "content"]
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 2,
+  "method": "kogral/add_note",
+  "params": {
+    "title": "Async Trait Patterns",
+    "content": "Common patterns for using async traits in Rust:\n\n1. Use `async-trait` crate\n2. Box return types for flexibility\n3. Consider Send + Sync bounds",
+    "tags": ["rust", "async", "patterns"],
+    "relates_to": ["pattern-error-handling"]
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 2,
+  "result": {
+    "type": "text",
+    "text": "Note added successfully: note-async-trait-patterns (ID: note-abc123)"
+  }
+}
+
+

kb/add_decision

+

Create an Architectural Decision Record (ADR).

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "title": {
+      "type": "string",
+      "description": "Decision title"
+    },
+    "context": {
+      "type": "string",
+      "description": "Decision context and background"
+    },
+    "decision": {
+      "type": "string",
+      "description": "The decision made"
+    },
+    "consequences": {
+      "type": "array",
+      "items": { "type": "string" },
+      "description": "List of consequences",
+      "default": []
+    },
+    "status": {
+      "type": "string",
+      "enum": ["proposed", "accepted", "rejected", "deprecated", "superseded"],
+      "default": "proposed"
+    },
+    "tags": {
+      "type": "array",
+      "items": { "type": "string" },
+      "default": []
+    }
+  },
+  "required": ["title", "context", "decision"]
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 3,
+  "method": "kogral/add_decision",
+  "params": {
+    "title": "Use SurrealDB for Knowledge Graph Storage",
+    "context": "Need a scalable storage solution that supports graph queries and can handle growing knowledge base",
+    "decision": "Adopt SurrealDB as the primary storage backend for production deployments",
+    "consequences": [
+      "Better query performance for graph traversal",
+      "Native support for relationships",
+      "Additional infrastructure dependency",
+      "Team needs to learn SurrealDB query language"
+    ],
+    "status": "accepted",
+    "tags": ["architecture", "storage", "surrealdb"]
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 3,
+  "result": {
+    "type": "text",
+    "text": "Decision added: decision-use-surrealdb (ID: decision-xyz789)\nStatus: accepted"
+  }
+}
+
+ +

Create a relationship between two nodes.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "from": {
+      "type": "string",
+      "description": "Source node ID"
+    },
+    "to": {
+      "type": "string",
+      "description": "Target node ID"
+    },
+    "relation": {
+      "type": "string",
+      "enum": ["relates_to", "depends_on", "implements", "extends", "supersedes", "explains"],
+      "description": "Relationship type"
+    },
+    "strength": {
+      "type": "number",
+      "description": "Relationship strength (0-1)",
+      "minimum": 0,
+      "maximum": 1,
+      "default": 1.0
+    }
+  },
+  "required": ["from", "to", "relation"]
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 4,
+  "method": "kogral/link",
+  "params": {
+    "from": "note-async-trait-patterns",
+    "to": "pattern-error-handling",
+    "relation": "relates_to",
+    "strength": 0.8
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 4,
+  "result": {
+    "type": "text",
+    "text": "Link created: note-async-trait-patterns --[relates_to]--> pattern-error-handling (strength: 0.8)"
+  }
+}
+
+

Relationship Types:

+
    +
  • relates_to: General conceptual relationship
  • +
  • depends_on: Dependency (from depends on to)
  • +
  • implements: Implementation of concept/pattern
  • +
  • extends: Inherits or extends another node
  • +
  • supersedes: Replaces an older version
  • +
  • explains: Provides documentation/clarification
  • +
+

kb/get_guidelines

+

Retrieve guidelines for current project with inheritance resolution.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "language": {
+      "type": "string",
+      "description": "Programming language (e.g., rust, nushell)"
+    },
+    "category": {
+      "type": "string",
+      "description": "Guideline category (e.g., error-handling, testing)"
+    },
+    "include_base": {
+      "type": "boolean",
+      "description": "Include shared/base guidelines",
+      "default": true
+    }
+  }
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 5,
+  "method": "kogral/get_guidelines",
+  "params": {
+    "language": "rust",
+    "category": "error-handling",
+    "include_base": true
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 5,
+  "result": {
+    "type": "text",
+    "text": "Guidelines for rust/error-handling:\n\n## Project Guidelines (priority: 150)\n\n1. Custom Error Types (guideline-custom-errors)\n   - Use thiserror for error definitions\n   - Implement From traits for conversions\n   - Source: .kogral/guidelines/rust-errors.md\n\n## Shared Guidelines (priority: 50)\n\n1. Result Type Best Practices (guideline-result-best-practices)\n   - Always use Result<T> for fallible operations\n   - Never use unwrap() in production\n   - Source: ~/Tools/.kogral-shared/guidelines/rust-errors.md\n\n2. Error Propagation (guideline-error-propagation)\n   - Use ? operator for error propagation\n   - Add context with .context()\n   - Source: ~/Tools/.kogral-shared/guidelines/rust-errors.md"
+  }
+}
+
+

kb/list_graphs

+

List available knowledge graphs.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {}
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 6,
+  "method": "kb/list_graphs"
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 6,
+  "result": {
+    "type": "text",
+    "text": "Available graphs:\n\n- default (Current project)\n  Path: /path/to/project/.kogral\n  Nodes: 42\n  Last modified: 2026-01-17T10:30:00Z\n\n- shared (Shared guidelines)\n  Path: ~/Tools/.kogral-shared\n  Nodes: 156\n  Last modified: 2026-01-15T14:20:00Z"
+  }
+}
+
+

kb/export

+

Export knowledge base to various formats.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "format": {
+      "type": "string",
+      "enum": ["logseq", "json", "markdown"],
+      "description": "Export format"
+    },
+    "output_path": {
+      "type": "string",
+      "description": "Output file or directory path"
+    },
+    "include_types": {
+      "type": "array",
+      "items": {
+        "type": "string",
+        "enum": ["note", "decision", "guideline", "pattern", "journal", "execution"]
+      },
+      "description": "Node types to include",
+      "default": ["note", "decision", "guideline", "pattern"]
+    },
+    "skip_journals": {
+      "type": "boolean",
+      "default": true
+    }
+  },
+  "required": ["format", "output_path"]
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 7,
+  "method": "kogral/export",
+  "params": {
+    "format": "logseq",
+    "output_path": "/Users/akasha/logseq-graph",
+    "include_types": ["note", "decision", "guideline"],
+    "skip_journals": true
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 7,
+  "result": {
+    "type": "text",
+    "text": "Export completed:\n\nFormat: Logseq\nOutput: /Users/akasha/logseq-graph\nExported: 42 nodes\n  - 23 notes\n  - 12 decisions\n  - 7 guidelines\n\nLogseq graph ready to open."
+  }
+}
+
+

Block Tools

+

Tools for querying Logseq content blocks. Requires blocks.enable_mcp_tools = true in configuration.

+

kb/find_blocks

+

Find blocks by tag, task status, or custom property across the knowledge base.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "tag": {
+      "type": "string",
+      "description": "Find blocks with this tag (e.g., 'card', 'important')"
+    },
+    "status": {
+      "type": "string",
+      "enum": ["TODO", "DOING", "DONE", "LATER", "NOW", "WAITING", "CANCELLED"],
+      "description": "Find blocks with this task status"
+    },
+    "property_key": {
+      "type": "string",
+      "description": "Custom property key to search for"
+    },
+    "property_value": {
+      "type": "string",
+      "description": "Custom property value to match"
+    },
+    "limit": {
+      "type": "integer",
+      "description": "Maximum number of results",
+      "default": 20
+    }
+  }
+}
+
+

Note: Provide one of: tag, status, or both property_key and property_value.

+

Example Request (find blocks by tag):

+
{
+  "jsonrpc": "2.0",
+  "id": 8,
+  "method": "kogral/find_blocks",
+  "params": {
+    "tag": "high-priority",
+    "limit": 10
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 8,
+  "result": {
+    "type": "text",
+    "text": "Found 3 blocks with tag '#high-priority':\n\n**Project Tasks** (project-tasks-123)\n  - TODO Implement authentication #high-priority\n  - TODO Fix security vulnerability #high-priority\n\n**Sprint Planning** (sprint-planning-456)\n  - DOING Refactor database layer #high-priority"
+  }
+}
+
+

Example Request (find blocks by property):

+
{
+  "jsonrpc": "2.0",
+  "id": 9,
+  "method": "kogral/find_blocks",
+  "params": {
+    "property_key": "priority",
+    "property_value": "high",
+    "limit": 15
+  }
+}
+
+

kb/find_todos

+

Find all TODO blocks across the knowledge base.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "limit": {
+      "type": "integer",
+      "description": "Maximum number of results",
+      "default": 20
+    }
+  }
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 10,
+  "method": "kogral/find_todos",
+  "params": {
+    "limit": 25
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 10,
+  "result": {
+    "type": "text",
+    "text": "Found 8 TODO blocks:\n\n**Project Tasks** (project-tasks-123)\n  - TODO Implement authentication\n  - TODO Write integration tests\n  - TODO Update documentation\n\n**Bug Fixes** (bug-fixes-456)\n  - TODO Fix race condition in cache\n  - TODO Address memory leak\n\n**Research** (research-789)\n  - TODO Evaluate GraphQL alternatives\n  - TODO Benchmark new approach\n  - TODO Document findings"
+  }
+}
+
+

kb/find_cards

+

Find all flashcard blocks (blocks tagged with #card) for spaced repetition learning.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "limit": {
+      "type": "integer",
+      "description": "Maximum number of flashcards",
+      "default": 10
+    }
+  }
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 11,
+  "method": "kogral/find_cards",
+  "params": {
+    "limit": 5
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 11,
+  "result": {
+    "type": "text",
+    "text": "Found 3 flashcards:\n\n**Rust Learning** (rust-learning-123)\n  - What is Rust's ownership model? #card #rust\n    - Ownership prevents data races at compile time\n    - Each value has a single owner\n\n**System Design** (system-design-456)\n  - What is the CAP theorem? #card #distributed-systems\n    - Consistency, Availability, Partition tolerance\n    - Can only guarantee 2 of 3\n\n**Algorithms** (algorithms-789)\n  - What is the time complexity of quicksort? #card #algorithms\n    - Average: O(n log n)\n    - Worst case: O(n²)"
+  }
+}
+
+

Use Cases:

+
    +
  • kb/find_blocks: General block search by metadata
  • +
  • kb/find_todos: Task management and tracking
  • +
  • kb/find_cards: Spaced repetition learning system
  • +
+

See Also:

+ +

Resources

+

Resources provide read-only access to knowledge graph content via URIs.

+

kogral://project/notes

+

Access project notes.

+

URI: kogral://project/notes or kogral://project/notes/{note-id}

+

Example: Read all project notes

+
kogral://project/notes
+
+

Example: Read specific note

+
kogral://project/notes/async-trait-patterns
+
+

kogral://project/decisions

+

Access project decisions (ADRs).

+

URI: kogral://project/decisions or kogral://project/decisions/{decision-id}

+

kogral://project/guidelines

+

Access project-specific guidelines.

+

URI: kogral://project/guidelines or kogral://project/guidelines/{guideline-id}

+

kogral://project/patterns

+

Access project patterns.

+

URI: kogral://project/patterns or kogral://project/patterns/{pattern-id}

+

kogral://shared/guidelines

+

Access shared guidelines (inherited).

+

URI: kogral://shared/guidelines or kogral://shared/guidelines/{guideline-id}

+

kogral://shared/patterns

+

Access shared patterns (inherited).

+

URI: kogral://shared/patterns or kogral://shared/patterns/{pattern-id}

+

Prompts

+

Prompts provide guided workflows for common tasks.

+

kb/summarize_project

+

Generate a comprehensive project knowledge summary.

+

Arguments:

+
{
+  "project": {
+    "type": "string",
+    "description": "Project graph name",
+    "default": "default"
+  }
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 8,
+  "method": "kogral/summarize_project",
+  "params": {
+    "project": "default"
+  }
+}
+
+

Returns: Prompt messages with project summary including:

+
    +
  • Total node counts by type
  • +
  • Recent additions
  • +
  • Top tags
  • +
  • Key decisions
  • +
  • Active patterns
  • +
+ +

Find nodes related to a specific topic or node.

+

Arguments:

+
{
+  "node_id": {
+    "type": "string",
+    "description": "Node ID to find relations for"
+  },
+  "depth": {
+    "type": "integer",
+    "description": "Maximum traversal depth",
+    "default": 2
+  }
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 9,
+  "method": "kb/find_related",
+  "params": {
+    "node_id": "pattern-error-handling",
+    "depth": 2
+  }
+}
+
+

Returns: Prompt messages with:

+
    +
  • Direct relationships
  • +
  • Indirect relationships (depth 2+)
  • +
  • Common tags
  • +
  • Related guidelines
  • +
+

Error Handling

+

Error Codes

+

Standard JSON-RPC 2.0 error codes:

+
+ + + + + +
CodeMeaningDescription
-32700Parse errorInvalid JSON
-32600Invalid RequestMissing required fields
-32601Method not foundUnknown tool/resource
-32602Invalid paramsParameter validation failed
-32603Internal errorServer-side error
+
+

Example Error Response

+
{
+  "jsonrpc": "2.0",
+  "id": 1,
+  "error": {
+    "code": -32602,
+    "message": "Invalid params",
+    "data": {
+      "details": "Field 'query' is required but missing",
+      "field": "query"
+    }
+  }
+}
+
+

Best Practices

+

1. Use Semantic Search for Discovery

+
{
+  "method": "kogral/search",
+  "params": {
+    "query": "how to handle database connection errors",
+    "semantic": true,
+    "threshold": 0.5
+  }
+}
+
+ +
{
+  "method": "kogral/link",
+  "params": {
+    "from": "note-new-discovery",
+    "to": "pattern-related-pattern",
+    "relation": "implements"
+  }
+}
+
+

3. Query Guidelines Before Implementation

+
{
+  "method": "kogral/get_guidelines",
+  "params": {
+    "language": "rust",
+    "category": "testing"
+  }
+}
+
+

4. Document Decisions with ADRs

+
{
+  "method": "kogral/add_decision",
+  "params": {
+    "title": "Use X for Y",
+    "context": "Background...",
+    "decision": "We will...",
+    "consequences": ["Pro 1", "Con 1"]
+  }
+}
+
+

See Also

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/api/rust-api.html b/docs/book/api/rust-api.html new file mode 100644 index 0000000..9a5bc98 --- /dev/null +++ b/docs/book/api/rust-api.html @@ -0,0 +1,227 @@ + + + + + + Rust API - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Rust API

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/apps/claude-code.html b/docs/book/apps/claude-code.html new file mode 100644 index 0000000..6eb1429 --- /dev/null +++ b/docs/book/apps/claude-code.html @@ -0,0 +1,227 @@ + + + + + + Claude Code Integration - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Claude Code Integration

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/apps/git.html b/docs/book/apps/git.html new file mode 100644 index 0000000..3cf791c --- /dev/null +++ b/docs/book/apps/git.html @@ -0,0 +1,227 @@ + + + + + + Git Workflows - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Git Workflows

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/apps/logseq.html b/docs/book/apps/logseq.html new file mode 100644 index 0000000..15536d5 --- /dev/null +++ b/docs/book/apps/logseq.html @@ -0,0 +1,227 @@ + + + + + + Logseq Integration - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Logseq Integration

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/apps/mcp-quickguide.html b/docs/book/apps/mcp-quickguide.html new file mode 100644 index 0000000..21b5b85 --- /dev/null +++ b/docs/book/apps/mcp-quickguide.html @@ -0,0 +1,561 @@ + + + + + + MCP Quick Guide - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

MCP Quick Guide

+

Fast-track guide to integrating KOGRAL with Claude Code via the Model Context Protocol (MCP).

+

What is MCP?

+

MCP (Model Context Protocol) is a protocol that allows Claude Code to interact with external tools and data sources. The kogral-mcp server exposes your KOGRAL knowledge base to Claude Code for AI-assisted knowledge management.

+

Quick Setup (5 Minutes)

+

Step 1: Build MCP Server

+
# Build kogral-mcp server
+cargo build --package kb-mcp --release
+
+# Verify binary
+ls -lh target/release/kb-mcp
+
+

Step 2: Configure Claude Code

+

Add to ~/.config/claude/config.json:

+
{
+  "mcpServers": {
+    "kogral-mcp": {
+      "command": "/path/to/knowledge-base/target/release/kb-mcp",
+      "args": ["serve"],
+      "env": {
+        "KOGRAL_DIR": "/path/to/your/project/.kogral"
+      }
+    }
+  }
+}
+
+

Replace /path/to/knowledge-base and /path/to/your/project/.kogral with your actual paths.

+

Step 3: Initialize KOGRAL

+
# Navigate to your project
+cd /path/to/your/project
+
+# Initialize .kb directory
+kb init
+
+

Step 4: Start Claude Code

+
# Start Claude Code (will auto-connect to kb-mcp)
+claude-code
+
+

Step 5: Test Connection

+

In Claude Code, try:

+
Search for "error handling"
+
+

Claude will use the kogral/search tool to query your knowledge base.

+
+

Essential Commands

+

Search Knowledge Base

+

Natural language:

+
Find notes about Rust error handling
+
+

Claude translates to:

+
{
+  "tool": "kogral/search",
+  "params": {
+    "query": "error handling",
+    "type": "note",
+    "semantic": true
+  }
+}
+
+

Add Note

+

Natural language:

+
Add a note about async Rust patterns with tags rust, async, patterns
+
+

Claude translates to:

+
{
+  "tool": "kogral/add_note",
+  "params": {
+    "title": "Async Rust Patterns",
+    "content": "...",
+    "tags": ["rust", "async", "patterns"]
+  }
+}
+
+

Add Decision

+

Natural language:

+
Document decision to use SurrealDB for storage
+
+

Claude translates to:

+
{
+  "tool": "kogral/add_decision",
+  "params": {
+    "title": "Use SurrealDB for Storage",
+    "context": "Need scalable graph database",
+    "decision": "Adopt SurrealDB as primary storage backend",
+    "consequences": ["Better query performance", "Additional infrastructure"]
+  }
+}
+
+

Get Guidelines

+

Natural language:

+
What are our Rust error handling guidelines?
+
+

Claude translates to:

+
{
+  "tool": "kogral/get_guidelines",
+  "params": {
+    "language": "rust",
+    "category": "error-handling"
+  }
+}
+
+ +

Natural language:

+
Link note-async-patterns to decision-use-tokio as implements
+
+

Claude translates to:

+
{
+  "tool": "kogral/link",
+  "params": {
+    "from": "note-async-patterns",
+    "to": "decision-use-tokio",
+    "relation": "implements"
+  }
+}
+
+
+

Common Workflows

+

Capture Meeting Notes

+

You:

+
We just decided in our meeting to migrate from REST to GraphQL.
+Context: current REST API is too chatty, requires multiple round trips.
+Consequences: better client performance, but team needs to learn GraphQL.
+Create a decision record.
+
+

Claude (uses kb/add_decision):

+
Created decision: decision-migrate-to-graphql
+
+Status: proposed
+Context: Current REST API requires multiple round trips (chatty)
+Decision: Migrate from REST to GraphQL API
+Consequences:
+  - ✅ Better client performance
+  - ❌ Team learning curve for GraphQL
+
+ +

You:

+
I'm working on error handling. What related notes and patterns do we have?
+
+

Claude (uses kogral/search with semantic=true):

+
Found 5 related items:
+
+1. **Error Handling with thiserror** (pattern)
+   Tags: rust, error-handling
+   Created: 2026-01-15
+
+2. **Result Type Best Practices** (guideline)
+   Tags: rust, error-handling, best-practices
+   Created: 2026-01-10
+
+3. **Decision: Use anyhow for Application Errors** (decision)
+   Status: accepted
+   Created: 2026-01-08
+
+4. **Custom Error Types** (note)
+   Tags: rust, error-handling
+   Created: 2026-01-05
+
+5. **Error Propagation Patterns** (pattern)
+   Tags: rust, error-handling
+   Created: 2026-01-03
+
+Would you like me to link your current work to any of these?
+
+

Document Implementation

+

You:

+
I just implemented the user authentication module following our security guidelines.
+Add a note and link it to our security guideline.
+
+

Claude (uses kb/add_note + kb/link):

+
Created note: note-user-auth-implementation
+Tags: security, authentication, implementation
+
+Linked:
+  note-user-auth-implementation --[implements]--> guideline-security-practices
+
+Done! Your implementation is now documented and connected to our guidelines.
+
+

Review Project Knowledge

+

You:

+
Summarize our project knowledge: what decisions have we made, what patterns are we using?
+
+

Claude (uses kb/summarize_project prompt):

+
# Project Knowledge Summary
+
+**Total Nodes**: 42
+
+## Recent Decisions (5)
+- Use SurrealDB for Storage (accepted, 2 days ago)
+- Adopt MCP for AI Integration (accepted, 5 days ago)
+- Nickel for Configuration (accepted, 1 week ago)
+
+## Active Patterns (8)
+- Error Handling with thiserror
+- Repository Pattern for DB
+- Builder Pattern for Complex Objects
+- ...
+
+## Top Tags
+1. rust (23 nodes)
+2. architecture (12 nodes)
+3. error-handling (8 nodes)
+4. patterns (7 nodes)
+
+## Guideline Coverage
+- Rust: 5 guidelines
+- Testing: 3 guidelines
+- Security: 2 guidelines
+
+
+

Advanced Usage

+

Conditional Queries

+

You:

+
Find all decisions made in the last week that are still proposed (not accepted)
+
+

Claude (combines kogral/search with filtering):

+
Found 2 proposed decisions from last week:
+
+1. **Migrate to GraphQL** (proposed)
+   Created: 3 days ago
+   Context: REST API is too chatty...
+
+2. **Add Redis Caching** (proposed)
+   Created: 5 days ago
+   Context: Database queries are slow...
+
+Would you like to review these and update their status?
+
+

Cross-Reference Check

+

You:

+
Before I implement X, check if we have any decisions or guidelines about it
+
+

Claude (uses kogral/search + kogral/get_guidelines):

+
Checking existing knowledge about X...
+
+**Decisions**: None found
+**Guidelines**: 1 relevant guideline found
+  - guideline-module-structure: "Keep modules focused and small"
+
+**Related Notes**: 2 notes mention similar topics
+  - note-module-design-patterns
+  - note-separation-of-concerns
+
+Recommendation: Your implementation of X looks aligned with our guidelines.
+Consider linking it to guideline-module-structure when done.
+
+

Export for Sharing

+

You:

+
Export our architectural decisions to Logseq so I can review them visually
+
+

Claude (uses kb/export):

+
Exporting to Logseq format...
+
+✓ Exported 12 decisions to /Users/akasha/logseq-export/
+  - 12 decision records
+  - Preserved wikilinks
+  - Added Logseq properties
+
+You can now open /Users/akasha/logseq-export/ in Logseq to visualize the decision graph.
+
+
+

Tips and Tricks

+

1. Use Natural Language

+

Don't worry about exact tool syntax. Claude understands:

+

Don't say: "Use kb/search with query='rust' and type='pattern'" +✅ Do say: "Find Rust patterns in KOGRAL"

+

2. Be Specific with Tags

+

When adding notes, use consistent tags:

+

Good: tags: rust, error-handling, pattern +❌ Bad: tags: Rust, ErrorHandling, patterns

+ +

After creating notes, ask Claude to link them:

+
Link this note to our error handling guideline as 'implements'
+
+

4. Review Regularly

+

Ask Claude for summaries:

+
What have we documented this week?
+
+ +

For conceptual queries:

+
Find anything related to "making code maintainable"
+
+

Not just keyword "maintainable", but concepts like refactoring, clean code, patterns, etc.

+
+

Troubleshooting

+

"MCP server not responding"

+
# Check kb-mcp is built
+ls target/release/kb-mcp
+
+# Test manually
+echo '{"jsonrpc":"2.0","id":1,"method":"kogral/search","params":{"query":"test"}}' \
+  | target/release/kb-mcp serve
+
+

"KB directory not found"

+
# Verify .kb exists
+ls -la /path/to/project/.kogral
+
+# Initialize if missing
+cd /path/to/project
+kb init
+
+

"Permission denied"

+
# Make binary executable
+chmod +x target/release/kb-mcp
+
+# Check environment variable
+echo $KOGRAL_DIR
+
+

"Empty search results"

+
# Add some test content
+kb add note "Test Note" --content "Test content"
+
+# Try search again in Claude Code
+
+
+

Next Steps

+ +
+

Quick Reference Card

+
+ + + + + + + +
TaskSay to Claude
Search"Find notes about X"
Add note"Add a note about X with tags Y, Z"
Add decision"Document decision to use X for Y"
Get guidelines"What are our X guidelines?"
Link nodes"Link A to B as implements"
Summarize"Summarize project knowledge"
Export"Export to Logseq format"
+
+
+

Remember: Claude Code with MCP turns KOGRAL into an active participant in your development workflow. Ask questions, capture decisions, and let AI help you maintain your project's knowledge graph.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/apps/obsidian.html b/docs/book/apps/obsidian.html new file mode 100644 index 0000000..c79e6fe --- /dev/null +++ b/docs/book/apps/obsidian.html @@ -0,0 +1,227 @@ + + + + + + Obsidian Compatibility - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Obsidian Compatibility

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/architecture/adrs/001-nickel-vs-toml.html b/docs/book/architecture/adrs/001-nickel-vs-toml.html new file mode 100644 index 0000000..de565b1 --- /dev/null +++ b/docs/book/architecture/adrs/001-nickel-vs-toml.html @@ -0,0 +1,508 @@ + + + + + + ADR-001: Nickel vs TOML for Configuration - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

ADR-001: Nickel vs TOML for Configuration

+

Status: Accepted

+

Date: 2026-01-17

+

Deciders: Architecture Team

+

Context: Configuration Strategy for Knowledge Base System

+
+

Context

+

The KOGRAL requires a flexible, type-safe configuration format that supports:

+
    +
  1. Complex nested structures (graph settings, storage configs, embedding providers)
  2. +
  3. Type validation (prevent runtime errors from config mistakes)
  4. +
  5. Composition and inheritance (shared configs, environment-specific overrides)
  6. +
  7. Documentation (self-documenting schemas)
  8. +
  9. Validation before runtime (catch errors early)
  10. +
+

We evaluated two primary options:

+

Option 1: TOML (Traditional Config Format)

+

Pros:

+
    +
  • Widely adopted in Rust ecosystem (Cargo.toml)
  • +
  • Simple, human-readable syntax
  • +
  • Native serde support
  • +
  • IDE support (syntax highlighting, completion)
  • +
+

Cons:

+
    +
  • No type system (validation only at runtime)
  • +
  • Limited composition (no imports, no functions)
  • +
  • No schema validation (errors discovered during execution)
  • +
  • Verbose for complex nested structures
  • +
  • No documentation in config files
  • +
+

Example TOML:

+
[graph]
+name = "my-project"
+version = "1.0.0"
+
+[storage]
+primary = "filesystem"  # String, not validated as enum
+
+[storage.secondary]
+enabled = true
+type = "surrealdb"  # Typo would fail at runtime
+url = "ws://localhost:8000"
+
+[embeddings]
+enabled = true
+provider = "openai"  # No validation of valid providers
+model = "text-embedding-3-small"
+
+

Problems:

+
    +
  • Typos in enum values ("surrealdb" vs "surealdb") fail at runtime
  • +
  • No validation that provider = "openai" requires api_key_env
  • +
  • No documentation of valid options
  • +
  • No way to compose configs (e.g., base config + environment override)
  • +
+

Option 2: Nickel (Functional Configuration Language)

+

Pros:

+
    +
  • Type system with contracts (validate before runtime)
  • +
  • Composition via imports and merging
  • +
  • Documentation in schemas (self-documenting)
  • +
  • Validation at export time (catch errors early)
  • +
  • Functions for conditional logic
  • +
  • Default values in schema definitions
  • +
+

Cons:

+
    +
  • Less familiar to Rust developers
  • +
  • Requires separate nickel CLI tool
  • +
  • Smaller ecosystem
  • +
  • Steeper learning curve
  • +
+

Example Nickel:

+
# schemas/kb-config.ncl
+{
+  KbConfig = {
+    graph | GraphConfig,
+    storage | StorageConfig,
+    embeddings | EmbeddingConfig,
+  },
+
+  StorageConfig = {
+    primary | [| 'filesystem, 'memory |],  # Enum validated at export
+
+    secondary | {
+      enabled | Bool,
+      type | [| 'surrealdb, 'sqlite |],  # Typos caught immediately
+      url | String,
+    } | optional,
+  },
+
+  EmbeddingConfig = {
+    enabled | Bool,
+    provider | [| 'openai, 'claude, 'fastembed |],  # Valid providers enforced
+    model | String,
+    api_key_env | String | doc "Environment variable for API key",
+  },
+}
+
+

Benefits:

+
    +
  • Typos in enum values caught at nickel export time
  • +
  • Schema enforces required fields based on provider
  • +
  • Documentation embedded in schema
  • +
  • Config can be composed: import "base.ncl" & { /* overrides */ }
  • +
+
+

Decision

+

We will use Nickel for configuration.

+

Implementation:

+
    +
  1. Define schemas in schemas/*.ncl with type contracts
  2. +
  3. Users write configs in .kogral/config.ncl
  4. +
  5. Export to JSON via CLI: nickel export --format json config.ncl
  6. +
  7. Load JSON in Rust via serde_json into typed structs
  8. +
+

Pattern (double validation):

+
Nickel Config (.ncl)
+    ↓ [nickel export]
+JSON (validated by Nickel contracts)
+    ↓ [serde_json::from_str]
+Rust Struct (validated by serde)
+    ↓
+Runtime (guaranteed valid config)
+
+

Bridge Code (kb-core/src/config/nickel.rs):

+
#![allow(unused)]
+fn main() {
+pub fn load_config<P: AsRef<Path>>(path: P) -> Result<KbConfig> {
+    // Export Nickel to JSON
+    let json = export_nickel_to_json(path)?;
+
+    // Deserialize to Rust struct
+    let config: KbConfig = serde_json::from_str(&json)?;
+
+    Ok(config)
+}
+
+fn export_nickel_to_json<P: AsRef<Path>>(path: P) -> Result<String> {
+    let output = Command::new("nickel")
+        .arg("export")
+        .arg("--format").arg("json")
+        .arg(path.as_ref())
+        .output()?;
+
+    Ok(String::from_utf8(output.stdout)?)
+}
+}
+
+

Consequences

+

Positive

+

Type Safety: Config errors caught before runtime

+
    +
  • Invalid enum values fail at export: 'filesystm → error
  • +
  • Missing required fields detected: no graph.name → error
  • +
  • Type mismatches prevented: enabled = "yes" → error (expects Bool)
  • +
+

Self-Documenting: Schemas serve as documentation

+
    +
  • | doc "Environment variable for API key" describes fields
  • +
  • Enum options visible in schema: [| 'openai, 'claude, 'fastembed |]
  • +
  • Default values explicit: | default = 'filesystem
  • +
+

Composition: Config reuse and overrides

+
# base.ncl
+{ graph = { version = "1.0.0" } }
+
+# project.ncl
+import "base.ncl" & { graph = { name = "my-project" } }
+
+

Validation Before Deployment: Catch errors in CI

+
# CI pipeline
+nickel typecheck config.ncl
+nickel export --format json config.ncl > /dev/null
+
+

Conditional Logic: Environment-specific configs

+
let is_prod = std.string.is_match "prod" (std.env.get "ENV") in
+{
+  embeddings = {
+    provider = if is_prod then 'openai else 'fastembed,
+  },
+}
+
+

Negative

+

Learning Curve: Team must learn Nickel syntax

+
    +
  • Mitigation: Provide comprehensive examples in config/ directory
  • +
  • Mitigation: Document common patterns in docs/config/
  • +
+

Tool Dependency: Requires nickel CLI installed

+
    +
  • Mitigation: Document installation in setup guide
  • +
  • Mitigation: Check nickel availability in kb init command
  • +
+

IDE Support: Limited compared to TOML

+
    +
  • Mitigation: Use LSP (nickel-lang-lsp) for VSCode/Neovim
  • +
  • Mitigation: Syntax highlighting available for major editors
  • +
+

Ecosystem Size: Smaller than TOML

+
    +
  • Mitigation: Nickel actively developed by Tweag
  • +
  • Mitigation: Stable language specification (v1.0+)
  • +
+

Neutral

+

Two-Stage Loading: Nickel → JSON → Rust

+
    +
  • Not a performance concern (config loaded once at startup)
  • +
  • Adds resilience (double validation)
  • +
  • Allows runtime config inspection (read JSON directly)
  • +
+
+

Alternatives Considered

+

JSON Schema

+

Rejected: Not ergonomic for humans to write

+
    +
  • No comments
  • +
  • Verbose syntax ({"key": "value"} vs key = value)
  • +
  • JSON Schema separate from config (duplication)
  • +
+

YAML

+

Rejected: No type system, ambiguous parsing

+
    +
  • Boolean confusion: yes/no/on/off/true/false
  • +
  • Indentation-sensitive (error-prone)
  • +
  • No validation without external tools
  • +
+

Dhall

+

Rejected: More complex than needed

+
    +
  • Turing-incomplete by design (limits use cases)
  • +
  • Smaller ecosystem than Nickel
  • +
  • Steeper learning curve
  • +
+

KCL (KusionStack Configuration Language)

+

Rejected: Kubernetes-focused, less general-purpose

+
    +
  • Designed for K8s manifests
  • +
  • Less mature than Nickel for general config
  • +
+
+

Implementation Timeline

+
    +
  1. ✅ Define base schemas (schemas/kb-config.ncl)
  2. +
  3. ✅ Implement Nickel loader (kb-core/src/config/nickel.rs)
  4. +
  5. ✅ Create example configs (config/defaults.ncl, config/production.ncl)
  6. +
  7. ✅ Document Nickel usage (docs/config/nickel-schemas.md)
  8. +
  9. ⏳ Add LSP recommendations to setup guide
  10. +
  11. ⏳ Create Nickel → TOML migration tool (for existing users)
  12. +
+
+

Monitoring

+

Success Criteria:

+
    +
  • Config errors caught at export time (not runtime)
  • +
  • Users can compose configs for different environments
  • +
  • Team comfortable with Nickel syntax within 2 weeks
  • +
+

Metrics:

+
    +
  • Number of config validation errors caught before runtime
  • +
  • Time to diagnose config issues (should decrease)
  • +
  • User feedback on config complexity
  • +
+
+

References

+ +
+

Revision History

+
+ +
DateAuthorChange
2026-01-17Architecture TeamInitial decision
+
+
+

Next ADR: ADR-002: FastEmbed via AI Providers

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/architecture/adrs/002-fastembed-ai-providers.html b/docs/book/architecture/adrs/002-fastembed-ai-providers.html new file mode 100644 index 0000000..906eb76 --- /dev/null +++ b/docs/book/architecture/adrs/002-fastembed-ai-providers.html @@ -0,0 +1,566 @@ + + + + + + ADR-002: FastEmbed via AI Providers - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

ADR-002: FastEmbed via AI Providers for Embeddings

+

Status: Accepted

+

Date: 2026-01-17

+

Deciders: Architecture Team

+

Context: Embedding Strategy for Semantic Search

+
+

Context

+

The KOGRAL requires embedding generation for semantic search capabilities. Embeddings convert text into numerical vectors that capture semantic meaning, enabling "find concepts" rather than just "find keywords".

+

Requirements:

+
    +
  1. Local-First Option: Must work offline without external API dependencies
  2. +
  3. Production Scalability: Support cloud AI providers for large-scale deployments
  4. +
  5. Multiple Providers: Flexibility to choose based on cost, quality, privacy
  6. +
  7. Cost-Effective Development: Free local embeddings for development and testing
  8. +
  9. Quality: Good enough embeddings for finding related concepts
  10. +
+

Options Evaluated:

+

Option 1: Only Local Embeddings (fastembed)

+

Pros:

+
    +
  • No API costs
  • +
  • Works offline
  • +
  • Privacy-preserving (no data leaves machine)
  • +
  • Fast (local GPU acceleration possible)
  • +
+

Cons:

+
    +
  • Limited model quality compared to cloud providers
  • +
  • Resource-intensive (requires download ~100MB models)
  • +
  • Single provider lock-in (fastembed library)
  • +
+

Example:

+
#![allow(unused)]
+fn main() {
+use fastembed::{TextEmbedding, InitOptions};
+
+let model = TextEmbedding::try_new(InitOptions {
+    model_name: "BAAI/bge-small-en-v1.5",
+    ..Default::default()
+})?;
+
+let embeddings = model.embed(vec!["Hello world"], None)?;
+// Output: Vec<Vec<f32>> with 384 dimensions
+}
+

Option 2: Only Cloud AI Providers (OpenAI, Claude, etc.)

+

Pros:

+
    +
  • State-of-the-art embedding quality
  • +
  • No local resource usage
  • +
  • Latest models available
  • +
  • Scalable to millions of documents
  • +
+

Cons:

+
    +
  • Requires API keys (cost per embedding)
  • +
  • Network dependency (no offline mode)
  • +
  • Privacy concerns (data sent to third parties)
  • +
  • Vendor lock-in risk
  • +
+

Example:

+
#![allow(unused)]
+fn main() {
+use rig::providers::openai;
+
+let client = openai::Client::new("sk-...");
+let embeddings = client.embeddings("text-embedding-3-small")
+    .embed_documents(vec!["Hello world"]).await?;
+// Output: Vec<Vec<f32>> with 1536 dimensions
+}
+

Option 3: Hybrid Strategy (fastembed + AI providers via rig-core)

+

Pros:

+
    +
  • ✅ Best of both worlds: local dev, cloud production
  • +
  • ✅ User choice: privacy-first or quality-first
  • +
  • ✅ Cost flexibility: free for small projects, paid for scale
  • +
  • ✅ Unified interface via rig-core library
  • +
  • ✅ Easy provider switching (config-driven)
  • +
+

Cons:

+
    +
  • ❌ More complex implementation (multiple providers)
  • +
  • ❌ Dimension mismatch between providers (384 vs 1536)
  • +
  • ❌ Additional dependencies (rig-core, fastembed)
  • +
+
+

Decision

+

We will use a hybrid strategy: fastembed (local) + AI providers (via rig-core).

+

Implementation:

+
    +
  1. Default: fastembed with BAAI/bge-small-en-v1.5 (384 dimensions)
  2. +
  3. Optional: OpenAI, Claude, Ollama via rig-core (configurable)
  4. +
  5. Interface: EmbeddingProvider trait abstracts provider details
  6. +
  7. Config-Driven: Provider selection via Nickel configuration
  8. +
+

Architecture:

+
#![allow(unused)]
+fn main() {
+#[async_trait]
+pub trait EmbeddingProvider: Send + Sync {
+    async fn embed(&self, texts: Vec<String>) -> Result<Vec<Vec<f32>>>;
+    fn dimensions(&self) -> usize;
+    fn model_name(&self) -> &str;
+}
+
+// Local implementation
+pub struct FastEmbedProvider {
+    model: TextEmbedding,
+}
+
+impl FastEmbedProvider {
+    pub fn new(model_name: &str) -> Result<Self> {
+        let model = TextEmbedding::try_new(InitOptions {
+            model_name: model_name.into(),
+            ..Default::default()
+        })?;
+        Ok(Self { model })
+    }
+}
+
+#[async_trait]
+impl EmbeddingProvider for FastEmbedProvider {
+    async fn embed(&self, texts: Vec<String>) -> Result<Vec<Vec<f32>>> {
+        Ok(self.model.embed(texts, None)?)
+    }
+
+    fn dimensions(&self) -> usize { 384 }
+    fn model_name(&self) -> &str { "BAAI/bge-small-en-v1.5" }
+}
+
+// Cloud provider implementation (via rig-core)
+pub struct RigEmbeddingProvider {
+    client: rig::Client,
+    model: String,
+    dimensions: usize,
+}
+
+#[async_trait]
+impl EmbeddingProvider for RigEmbeddingProvider {
+    async fn embed(&self, texts: Vec<String>) -> Result<Vec<Vec<f32>>> {
+        let embeddings = self.client
+            .embeddings(&self.model)
+            .embed_documents(texts)
+            .await?;
+        Ok(embeddings)
+    }
+
+    fn dimensions(&self) -> usize { self.dimensions }
+    fn model_name(&self) -> &str { &self.model }
+}
+}
+

Configuration (Nickel):

+
# Local development (default)
+{
+  embeddings = {
+    enabled = true,
+    provider = 'fastembed,
+    model = "BAAI/bge-small-en-v1.5",
+    dimensions = 384,
+  },
+}
+
+# Production with OpenAI
+{
+  embeddings = {
+    enabled = true,
+    provider = 'openai,
+    model = "text-embedding-3-small",
+    dimensions = 1536,
+    api_key_env = "OPENAI_API_KEY",
+  },
+}
+
+# Self-hosted with Ollama
+{
+  embeddings = {
+    enabled = true,
+    provider = 'ollama,
+    model = "nomic-embed-text",
+    dimensions = 768,
+  },
+}
+
+

Provider Selection (kb-core/src/embeddings/mod.rs):

+
#![allow(unused)]
+fn main() {
+pub fn create_provider(config: &EmbeddingConfig) -> Result<Box<dyn EmbeddingProvider>> {
+    match config.provider {
+        EmbeddingProviderType::FastEmbed => {
+            Ok(Box::new(FastEmbedProvider::new(&config.model)?))
+        }
+        EmbeddingProviderType::OpenAI => {
+            let api_key = std::env::var(&config.api_key_env)?;
+            Ok(Box::new(RigEmbeddingProvider::new_openai(api_key, &config.model)?))
+        }
+        EmbeddingProviderType::Claude => {
+            let api_key = std::env::var(&config.api_key_env)?;
+            Ok(Box::new(RigEmbeddingProvider::new_claude(api_key, &config.model)?))
+        }
+        EmbeddingProviderType::Ollama => {
+            Ok(Box::new(RigEmbeddingProvider::new_ollama(&config.model)?))
+        }
+    }
+}
+}
+
+

Consequences

+

Positive

+

Development Flexibility:

+
    +
  • Developers can use fastembed without API keys
  • +
  • Fast feedback loop (local embeddings, no network calls)
  • +
  • Works offline (train trips, flights)
  • +
+

Production Quality:

+
    +
  • Production deployments can use OpenAI/Claude for better quality
  • +
  • Latest embedding models available
  • +
  • Scalable to millions of documents
  • +
+

Privacy Control:

+
    +
  • Privacy-sensitive projects use local embeddings
  • +
  • Public projects can use cloud providers
  • +
  • User choice via configuration
  • +
+

Cost Optimization:

+
    +
  • Small projects: free (fastembed)
  • +
  • Large projects: pay for quality (cloud providers)
  • +
  • Hybrid: important docs via cloud, bulk via local
  • +
+

Unified Interface:

+
    +
  • EmbeddingProvider trait abstracts provider details
  • +
  • Query code doesn't know/care about provider
  • +
  • Easy to add new providers
  • +
+

Negative

+

Dimension Mismatch:

+
    +
  • fastembed: 384 dimensions
  • +
  • OpenAI: 1536 dimensions
  • +
  • Cannot mix in same index
  • +
+

Mitigation:

+
    +
  • Store provider + dimensions in node metadata
  • +
  • Rebuild index when changing providers
  • +
  • Document dimension constraints
  • +
+

Model Download:

+
    +
  • First use of fastembed downloads ~100MB model
  • +
  • Slow initial startup
  • +
+

Mitigation:

+
    +
  • Pre-download in Docker images
  • +
  • Document model download in setup guide
  • +
  • Cache models in ~/.cache/fastembed
  • +
+

Complex Configuration:

+
    +
  • Multiple provider options may confuse users
  • +
+

Mitigation:

+
    +
  • Sane default (fastembed)
  • +
  • Clear examples for each provider
  • +
  • Validation errors explain misconfigurations
  • +
+

Neutral

+

Dependency Trade-off:

+
    +
  • fastembed adds ~5MB to binary
  • +
  • rig-core adds ~2MB
  • +
  • Total: ~7MB overhead
  • +
+

Not a concern for CLI/MCP server use case.

+
+

Provider Comparison

+
+ + + + +
ProviderDimensionsQualityCostPrivacyOffline
fastembed384GoodFree✅ Local✅ Yes
OpenAI1536Excellent$0.0001/1K❌ Cloud❌ No
Claude1024Excellent$0.00025/1K❌ Cloud❌ No
Ollama768Very GoodFree✅ Local✅ Yes
+
+

Recommendation by Use Case:

+
    +
  • Development: fastembed (fast, free, offline)
  • +
  • Small Teams: fastembed or Ollama (privacy, no costs)
  • +
  • Enterprise: OpenAI or Claude (best quality, scalable)
  • +
  • Self-Hosted: Ollama (good quality, local control)
  • +
+
+

Implementation Timeline

+
    +
  1. ✅ Define EmbeddingProvider trait
  2. +
  3. ✅ Implement FastEmbedProvider (stub, feature-gated)
  4. +
  5. ✅ Implement RigEmbeddingProvider (stub, feature-gated)
  6. +
  7. ⏳ Complete FastEmbed integration with model download
  8. +
  9. ⏳ Complete rig-core integration (OpenAI, Claude, Ollama)
  10. +
  11. ⏳ Add query engine with similarity search
  12. +
  13. ⏳ Document provider selection and trade-offs
  14. +
+
+

Monitoring

+

Success Criteria:

+
    +
  • Users can switch providers via config change
  • +
  • Local embeddings work without API keys
  • +
  • Production deployments use cloud providers successfully
  • +
  • Query quality acceptable for both local and cloud embeddings
  • +
+

Metrics:

+
    +
  • Embedding generation latency (local vs cloud)
  • +
  • Query accuracy (precision@10 for semantic search)
  • +
  • API costs (cloud providers)
  • +
  • User satisfaction (feedback on search quality)
  • +
+
+

References

+ +
+

Revision History

+
+ +
DateAuthorChange
2026-01-17Architecture TeamInitial decision
+
+
+

Previous ADR: ADR-001: Nickel vs TOML +Next ADR: ADR-003: Hybrid Storage Strategy

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/architecture/adrs/003-hybrid-storage.html b/docs/book/architecture/adrs/003-hybrid-storage.html new file mode 100644 index 0000000..71f7604 --- /dev/null +++ b/docs/book/architecture/adrs/003-hybrid-storage.html @@ -0,0 +1,629 @@ + + + + + + ADR-003: Hybrid Storage Strategy - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

ADR-003: Hybrid Storage Strategy

+

Status: Accepted

+

Date: 2026-01-17

+

Deciders: Architecture Team

+

Context: Storage Backend Strategy for Knowledge Base

+
+

Context

+

The KOGRAL needs to store knowledge graphs with these requirements:

+
    +
  1. Git-Friendly: Knowledge should version alongside code
  2. +
  3. Scalable: Support small projects (10s of nodes) to large organizations (10,000+ nodes)
  4. +
  5. Queryable: Efficient graph queries and relationship traversal
  6. +
  7. Offline-Capable: Work without network access
  8. +
  9. Collaborative: Support shared organizational knowledge
  10. +
  11. Cost-Effective: Free for small projects, reasonable cost at scale
  12. +
+

Constraints:

+
    +
  • Developers want to edit knowledge in text editors
  • +
  • Organizations want centralized guideline management
  • +
  • Git workflows essential for code-adjacent knowledge
  • +
  • Large graphs need database performance
  • +
+

Option 1: Filesystem Only

+

Approach: Store everything as markdown files

+

Pros:

+
    +
  • ✅ Git-native (perfect for versioning)
  • +
  • ✅ Text editor friendly
  • +
  • ✅ No dependencies
  • +
  • ✅ Works offline
  • +
  • ✅ Free
  • +
+

Cons:

+
    +
  • ❌ Poor performance for large graphs (100 0+ nodes)
  • +
  • ❌ No efficient graph queries
  • +
  • ❌ Difficult to share across projects
  • +
  • ❌ Manual sync for collaboration
  • +
+

Scalability: Good for < 100 nodes, poor beyond

+

Option 2: Database Only (SurrealDB)

+

Approach: Store all knowledge in SurrealDB graph database

+

Pros:

+
    +
  • ✅ Excellent query performance
  • +
  • ✅ Native graph relationships
  • +
  • ✅ Scalable to millions of nodes
  • +
  • ✅ Centralized for collaboration
  • +
+

Cons:

+
    +
  • ❌ Not git-trackable
  • +
  • ❌ Requires running database server
  • +
  • ❌ Can't edit with text editor
  • +
  • ❌ Network dependency
  • +
  • ❌ Infrastructure cost
  • +
+

Scalability: Excellent, but loses developer workflow benefits

+

Option 3: Hybrid (Filesystem + SurrealDB)

+

Approach: Filesystem for local project knowledge, SurrealDB for shared organizational knowledge

+

Pros:

+
    +
  • ✅ Git-friendly for project knowledge
  • +
  • ✅ Text editor friendly
  • +
  • ✅ Scalable for shared knowledge
  • +
  • ✅ Works offline (local graph)
  • +
  • ✅ Collaborative (shared graph)
  • +
  • ✅ Cost-effective (DB only for shared)
  • +
+

Cons:

+
    +
  • ❌ More complex implementation
  • +
  • ❌ Sync mechanism needed
  • +
  • ❌ Two storage systems to manage
  • +
+

Scalability: Excellent - best of both worlds

+
+

Decision

+

We will use a hybrid storage strategy: Filesystem (local) + SurrealDB (shared).

+

Architecture:

+
┌─────────────────────────────────────────────────────────────┐
+│                    Project A (.kogral/)                          │
+│  Storage: Filesystem (git-tracked)                          │
+│  Scope: Project-specific notes, decisions, patterns         │
+│  Access: Local only                                         │
+└──────────────────┬──────────────────────────────────────────┘
+                   │
+                   │ [inherits]
+                   ↓
+┌─────────────────────────────────────────────────────────────┐
+│           Shared KB (SurrealDB or synced filesystem)         │
+│  Storage: SurrealDB (scalable) or filesystem (synced)       │
+│  Scope: Organization-wide guidelines, patterns              │
+│  Access: All projects                                       │
+└─────────────────────────────────────────────────────────────┘
+
+

Implementation:

+
# Project config
+{
+  storage = {
+    primary = 'filesystem,  # Local project knowledge
+    secondary = {
+      enabled = true,
+      type = 'surrealdb,   # Shared knowledge
+      url = "ws://kb-central.company.com:8000",
+      namespace = "organization",
+      database = "shared-kb",
+    },
+  },
+
+  inheritance = {
+    base = "surrealdb://organization/shared-kb",  # Inherit from shared
+    priority = 100,  # Project overrides shared
+  },
+}
+
+

Sync Strategy:

+
.kogral/ (Filesystem)
+    ↓ [on save]
+Watch for changes
+    ↓ [debounced]
+Sync to SurrealDB
+    ↓
+Shared graph updated
+    ↓ [on query]
+Merge local + shared results
+
+
+

Consequences

+

Positive

+

Developer Workflow Preserved:

+
# Local knowledge workflow (unchanged)
+vim .kogral/notes/my-note.md
+git add .kogral/notes/my-note.md
+git commit -m "Add implementation note"
+git push
+
+

Git Integration:

+
    +
  • Project knowledge versioned with code
  • +
  • Branches include relevant knowledge
  • +
  • Merges resolve knowledge conflicts
  • +
  • PR reviews include knowledge changes
  • +
+

Offline Development:

+
    +
  • Full functionality without network
  • +
  • Shared guidelines cached locally
  • +
  • Sync when reconnected
  • +
+

Scalability:

+
    +
  • Projects: filesystem (100s of nodes, fine performance)
  • +
  • Organization: SurrealDB (10,000+ nodes, excellent performance)
  • +
+

Collaboration:

+
    +
  • Shared guidelines accessible to all projects
  • +
  • Updates to shared knowledge propagate automatically
  • +
  • Consistent practices across organization
  • +
+

Cost-Effective:

+
    +
  • Small projects: free (filesystem only)
  • +
  • Organizations: SurrealDB for shared only (not all project knowledge)
  • +
+

Gradual Adoption:

+
    +
  • Start with filesystem only
  • +
  • Add SurrealDB when needed
  • +
  • Feature-gated (--features surrealdb)
  • +
+

Negative

+

Complexity:

+
    +
  • Two storage implementations
  • +
  • Sync mechanism required
  • +
  • Conflict resolution needed
  • +
+

Mitigation:

+
    +
  • Storage trait abstracts differences
  • +
  • Sync is optional (can disable)
  • +
  • Conflicts rare (guidelines change infrequently)
  • +
+

Sync Latency:

+
    +
  • Changes to shared KB not instant in all projects
  • +
+

Mitigation:

+
    +
  • Acceptable latency (guidelines don't change rapidly)
  • +
  • Manual sync command available (kb sync)
  • +
  • Auto-sync on query (fetch latest)
  • +
+

Infrastructure Requirement:

+
    +
  • SurrealDB server needed for shared KB
  • +
+

Mitigation:

+
    +
  • Optional (can use synced filesystem instead)
  • +
  • Docker Compose for easy setup
  • +
  • Managed SurrealDB Cloud option
  • +
+

Neutral

+

Storage Trait Implementation:

+
#![allow(unused)]
+fn main() {
+#[async_trait]
+pub trait Storage {
+    async fn save_graph(&self, graph: &Graph) -> Result<()>;
+    async fn load_graph(&self, name: &str) -> Result<Graph>;
+    async fn list_graphs(&self) -> Result<Vec<String>>;
+}
+
+// Three implementations
+impl Storage for FilesystemStorage { /* ... */ }
+impl Storage for SurrealDbStorage { /* ... */ }
+impl Storage for MemoryStorage { /* ... */ }
+}
+

Abstraction makes multi-backend manageable.

+
+

Use Cases

+

Small Project (Solo Developer)

+

Config:

+
{ storage = { primary = 'filesystem } }
+
+

Behavior:

+
    +
  • All knowledge in .kogral/ directory
  • +
  • Git-tracked with code
  • +
  • No database required
  • +
  • Works offline
  • +
+

Medium Project (Team)

+

Config:

+
{
+  storage = {
+    primary = 'filesystem,
+    secondary = {
+      enabled = true,
+      type = 'surrealdb,
+      url = "ws://team-kb.local:8000",
+    },
+  },
+}
+
+

Behavior:

+
    +
  • Project knowledge in .kogral/ (git-tracked)
  • +
  • Shared team patterns in SurrealDB
  • +
  • Automatic sync
  • +
  • Offline fallback to cached
  • +
+

Large Organization

+

Config:

+
{
+  storage = {
+    primary = 'filesystem,
+    secondary = {
+      enabled = true,
+      type = 'surrealdb,
+      url = "ws://kb.company.com:8000",
+      namespace = "engineering",
+      database = "shared-kb",
+    },
+  },
+
+  inheritance = {
+    base = "surrealdb://engineering/shared-kb",
+    guidelines = [
+      "surrealdb://engineering/rust-guidelines",
+      "surrealdb://engineering/security-policies",
+    ],
+  },
+}
+
+

Behavior:

+
    +
  • Project-specific in .kogral/
  • +
  • Organization guidelines in SurrealDB
  • +
  • Security policies enforced
  • +
  • Automatic guideline updates
  • +
+
+

Sync Mechanism

+

Filesystem → SurrealDB

+

Trigger: File changes detected (via notify crate)

+

Process:

+
    +
  1. Parse changed markdown file
  2. +
  3. Convert to Node struct
  4. +
  5. Upsert to SurrealDB
  6. +
  7. Update relationships
  8. +
+

Debouncing: 500ms (configurable)

+

SurrealDB → Filesystem

+

Trigger: Query for shared knowledge

+

Process:

+
    +
  1. Query SurrealDB for shared nodes
  2. +
  3. Cache locally (in-memory or filesystem)
  4. +
  5. Merge with local results
  6. +
  7. Return combined
  8. +
+

Caching: TTL-based (5 minutes default)

+

Conflict Resolution

+

Strategy: Last-write-wins with version tracking

+

Example:

+
Project A: Updates shared guideline (v1 → v2)
+Project B: Has cached v1
+
+On Project B query:
+  - Detects v2 available
+  - Fetches v2
+  - Updates cache
+  - Uses v2 going forward
+
+
+

Alternatives Considered

+

Git Submodules for Shared Knowledge

+

Rejected: Cumbersome workflow

+
    +
  • Requires manual submodule update
  • +
  • Merge conflicts in shared submodule
  • +
  • Not discoverable (need to know submodule exists)
  • +
+

Syncthing for Filesystem Sync

+

Rejected: Not designed for this use case

+
    +
  • No query optimization
  • +
  • No relationship indexes
  • +
  • Sync conflicts difficult to resolve
  • +
+

PostgreSQL with JSON

+

Rejected: Not a graph database

+
    +
  • Poor graph query performance
  • +
  • Relationship traversal requires complex SQL joins
  • +
  • No native graph features
  • +
+
+

Migration Path

+

Phase 1: Filesystem Only (Current)

+
    +
  • All storage via filesystem
  • +
  • Git-tracked
  • +
  • No database required
  • +
+

Phase 2: Optional SurrealDB

+
    +
  • Add SurrealDB support (feature-gated)
  • +
  • Manual sync command
  • +
  • Shared KB opt-in
  • +
+

Phase 3: Automatic Sync

+
    +
  • File watching
  • +
  • Auto-sync on changes
  • +
  • Background sync
  • +
+

Phase 4: Multi-Tenant SurrealDB

+
    +
  • Organization namespaces
  • +
  • Access control
  • +
  • Audit logs
  • +
+
+

Monitoring

+

Success Criteria:

+
    +
  • Developers don't notice hybrid complexity
  • +
  • Sync completes < 1 second for typical changes
  • +
  • Shared guidelines accessible in < 100ms
  • +
  • Zero data loss in sync
  • +
+

Metrics:

+
    +
  • Sync latency (P50, P95, P99)
  • +
  • Cache hit rate (shared knowledge)
  • +
  • Conflict rate (expect < 0.1%)
  • +
  • User satisfaction
  • +
+
+

References

+ +
+

Revision History

+
+ +
DateAuthorChange
2026-01-17Architecture TeamInitial decision
+
+
+

Previous ADR: ADR-002: FastEmbed via AI Providers +Next ADR: ADR-004: Logseq Compatibility

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/architecture/adrs/004-logseq-blocks-support.html b/docs/book/architecture/adrs/004-logseq-blocks-support.html new file mode 100644 index 0000000..1fd7f29 --- /dev/null +++ b/docs/book/architecture/adrs/004-logseq-blocks-support.html @@ -0,0 +1,391 @@ + + + + + + ADR-004: Logseq Blocks Support - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

ADR-004: Logseq Blocks Support

+

Status

+

Proposed (Design phase)

+

Context

+

Logseq uses content blocks as the fundamental unit of information, not full documents. KB currently treats Node.content as flat markdown string, which loses block-level features on import/export:

+

Lost features:

+
    +
  • Block properties (#card, TODO, custom properties)
  • +
  • Block hierarchy (outliner nesting)
  • +
  • Block references (((block-uuid)))
  • +
  • Block-level queries (find all flashcards, TODOs)
  • +
+

User requirement: Round-trip Logseq import/export with full fidelity:

+
Logseq → KOGRAL Import → KOGRAL Storage → KOGRAL Export → Logseq
+  (blocks preserved at every step)
+
+

Decision

+

Implement Hybrid Block Support (structured + markdown):

+

1. Add Block Data Structure

+
#![allow(unused)]
+fn main() {
+pub struct Block {
+    pub id: String,                   // UUID
+    pub content: String,              // Block text
+    pub properties: BlockProperties,  // Tags, status, custom
+    pub children: Vec<Block>,         // Nested blocks
+    // ... timestamps ...
+}
+
+pub struct BlockProperties {
+    pub tags: Vec<String>,            // #card, #important
+    pub status: Option<TaskStatus>,   // TODO, DONE, etc.
+    pub custom: HashMap<String, String>, // property:: value
+    pub block_refs: Vec<String>,      // ((uuid))
+    pub page_refs: Vec<String>,       // [[page]]
+}
+}
+

2. Extend Node Model

+
#![allow(unused)]
+fn main() {
+pub struct Node {
+    // ... existing fields ...
+    pub content: String,              // Source of truth (markdown)
+    pub blocks: Option<Vec<Block>>,   // Cached structure (optional)
+}
+}
+

3. Bidirectional Parser

+
    +
  • Parse: Markdown → Vec<Block> (lazy, on-demand)
  • +
  • Serialize: Vec<Block> → Markdown (for export)
  • +
+

4. Storage Strategy

+

Filesystem (git-friendly, Logseq-compatible):

+
- Block 1 #card
+  - Nested answer
+- TODO Block 2
+  priority:: high
+
+

SurrealDB (queryable):

+
DEFINE TABLE block;
+DEFINE FIELD node_id ON block TYPE record(node);
+DEFINE FIELD block_id ON block TYPE string;
+DEFINE FIELD properties ON block TYPE object;
+DEFINE INDEX block_tags ON block COLUMNS properties.tags;
+
+

5. Query Extensions

+
#![allow(unused)]
+fn main() {
+// Find all flashcards
+graph.find_blocks_by_tag("card")
+
+// Find all TODOs
+graph.find_all_todos()
+
+// Find blocks with custom property
+node.find_blocks_by_property("priority", "high")
+}
+

Consequences

+

Positive

+

Full Logseq Compatibility - Import/export preserves all block features +✅ Queryable Blocks - Find #card, TODO, custom properties across KOGRAL +✅ Backward Compatible - Existing nodes without blocks still work +✅ Type-Safe - Structured data instead of regex parsing everywhere +✅ Extensible - Custom block properties supported +✅ Hierarchy Preserved - Nested blocks maintain parent-child relationships

+

Negative

+

⚠️ Added Complexity - New data structures, parser, sync logic +⚠️ Dual Representation - Must keep content and blocks in sync +⚠️ Storage Overhead - SurrealDB stores both markdown and structure +⚠️ Migration Required - Existing data needs parsing to populate blocks

+

Neutral

+

⚙️ Lazy Parsing - Blocks parsed on-demand (not stored by default) +⚙️ Opt-In - Config flag blocks.enabled to activate features +⚙️ Gradual Adoption - Can implement in phases

+

Implementation Phases

+

Phase 1: Foundation (No behavior change)

+
    +
  • Add Block struct to models/block.rs
  • +
  • Add optional blocks field to Node
  • +
  • Add config: blocks.enabled = false (default off)
  • +
+

Phase 2: Parser

+
    +
  • Implement BlockParser::parse() (markdown → blocks)
  • +
  • Implement BlockParser::serialize() (blocks → markdown)
  • +
  • Add Node::get_blocks() method (lazy parsing)
  • +
+

Phase 3: Logseq Integration

+
    +
  • Update LogseqImporter to parse blocks
  • +
  • Update LogseqExporter to serialize blocks
  • +
  • Test round-trip (Logseq → KB → Logseq)
  • +
+

Phase 4: Query API

+
    +
  • Add Graph::find_blocks_by_tag()
  • +
  • Add Graph::find_all_todos()
  • +
  • Add Node::find_blocks_by_property()
  • +
+

Phase 5: MCP/CLI Integration

+
    +
  • Add kb/find_blocks MCP tool
  • +
  • Add kb find-cards CLI command
  • +
  • Add kb find-todos CLI command
  • +
+

Phase 6: SurrealDB Backend

+
    +
  • Create block table schema
  • +
  • Index on tags, status, properties
  • +
  • Store blocks alongside nodes
  • +
+

Alternatives Considered

+

Alternative 1: Blocks as First-Class Nodes

+

Convert each Logseq block to a separate KOGRAL Node.

+

Rejected: Too granular, explosion of nodes, loses document context.

+

Alternative 2: Parser-Only (No Storage)

+

Keep content: String, parse blocks on every access.

+

Rejected: Can't query blocks in database, parse overhead, can't index.

+

Alternative 3: Metadata Field

+

Store blocks in metadata: HashMap<String, Value>.

+

Rejected: Not type-safe, harder to query, no schema validation.

+

References

+ +

Notes

+

Backward Compatibility Strategy:

+
    +
  • content remains source of truth
  • +
  • blocks is optional enhancement
  • +
  • Old code works unchanged
  • +
  • New features opt-in via config
  • +
+

Migration Path:

+
    +
  • Existing users: blocks disabled by default
  • +
  • New users: blocks enabled, parsed on import
  • +
  • Manual: kb reindex --parse-blocks to populate
  • +
+
+

Decision Date: 2026-01-17 +Approvers: TBD +Review Date: After Phase 2 implementation

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/architecture/adrs/005-mcp-protocol.html b/docs/book/architecture/adrs/005-mcp-protocol.html new file mode 100644 index 0000000..82b30d9 --- /dev/null +++ b/docs/book/architecture/adrs/005-mcp-protocol.html @@ -0,0 +1,227 @@ + + + + + + ADR-005: MCP Protocol for AI Integration - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/architecture/config-driven.html b/docs/book/architecture/config-driven.html new file mode 100644 index 0000000..37ff70c --- /dev/null +++ b/docs/book/architecture/config-driven.html @@ -0,0 +1,660 @@ + + + + + + Config-Driven Design - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Config-Driven Architecture

+

The KOGRAL follows a config-driven architecture where all behavior is defined through Nickel configuration files rather than hardcoded in Rust.

+

Philosophy

+

"Configuration, not code, defines behavior"

+

Instead of hardcoding storage backends, embedding providers, or query parameters, KB uses a layered configuration system that composes settings from multiple sources:

+
    +
  1. Schema contracts (type definitions)
  2. +
  3. Defaults (base values)
  4. +
  5. Mode overlays (dev/prod/test optimizations)
  6. +
  7. User customizations (project-specific overrides)
  8. +
+

This approach provides:

+
    +
  • Type safety - Nickel contracts validate configuration before runtime
  • +
  • Composability - Mix and match configurations for different environments
  • +
  • Discoverability - Self-documenting schemas with inline documentation
  • +
  • Hot-reload - Change behavior without recompiling Rust code
  • +
  • Double validation - Nickel contracts + serde ensure correctness
  • +
+

Configuration Composition Flow

+

Configuration Composition

+

The configuration system uses a four-layer composition pattern:

+

Layer 1: Schema Contracts

+

Location: schemas/kb/contracts.ncl

+

Purpose: Define types and validation rules using Nickel contracts.

+

Example:

+
{
+  StorageType = [| 'filesystem, 'memory, 'surrealdb |],
+
+  StorageConfig = {
+    primary | StorageType
+      | doc "Primary storage backend"
+      | default = 'filesystem,
+
+    secondary | SecondaryStorageConfig
+      | doc "Optional secondary storage"
+      | default = { enabled = false },
+  },
+}
+
+

Benefits:

+
    +
  • Enum validation (only valid storage types accepted)
  • +
  • Required vs optional fields
  • +
  • Default values for optional fields
  • +
  • Documentation attached to types
  • +
+

Layer 2: Defaults

+

Location: schemas/kb/defaults.ncl

+

Purpose: Provide sensible base values for all configuration options.

+

Example:

+
{
+  base = {
+    storage = {
+      primary = 'filesystem,
+      secondary = {
+        enabled = false,
+        type = 'surrealdb,
+        url = "ws://localhost:8000",
+      },
+    },
+    embeddings = {
+      enabled = true,
+      provider = 'fastembed,
+      model = "BAAI/bge-small-en-v1.5",
+      dimensions = 384,
+    },
+  } | contracts.KbConfig,
+}
+
+

Validated by: contracts.KbConfig contract ensures defaults are valid.

+

Layer 3: Mode Overlays

+

Location: schemas/kb/modes/{dev,prod,test}.ncl

+

Purpose: Environment-specific optimizations and tuning.

+

Development Mode (dev.ncl)

+

Optimized for: Fast iteration, local development, debugging

+
{
+  storage = {
+    primary = 'filesystem,
+    secondary = { enabled = false },  # No database overhead
+  },
+  embeddings = {
+    provider = 'fastembed,  # Local, no API costs
+  },
+  sync = {
+    auto_index = false,  # Manual control
+  },
+}
+
+

Production Mode (prod.ncl)

+

Optimized for: Performance, reliability, scalability

+
{
+  storage = {
+    secondary = { enabled = true },  # SurrealDB for scale
+  },
+  embeddings = {
+    provider = 'openai,  # High-quality cloud embeddings
+    model = "text-embedding-3-small",
+    dimensions = 1536,
+  },
+  sync = {
+    auto_index = true,
+    debounce_ms = 300,  # Fast response
+  },
+}
+
+

Test Mode (test.ncl)

+

Optimized for: Fast tests, isolation, determinism

+
{
+  storage = {
+    primary = 'memory,  # Ephemeral, no disk I/O
+  },
+  embeddings = {
+    enabled = false,  # Disable for speed
+  },
+  sync = {
+    auto_index = false,
+    debounce_ms = 0,  # No delays in tests
+  },
+}
+
+

Layer 4: User Customizations

+

Location: .kb-config/core/kb.ncl or .kb-config/platform/{dev,prod,test}.ncl

+

Purpose: Project-specific or deployment-specific overrides.

+

Example (user project config):

+
let mode = import "../../schemas/kb/modes/dev.ncl" in
+
+let user_custom = {
+  graph = {
+    name = "my-project",
+  },
+  embeddings = {
+    provider = 'claude,  # Override to use Claude
+    model = "claude-3-haiku-20240307",
+  },
+  query = {
+    similarity_threshold = 0.7,  # Stricter threshold
+  },
+} in
+
+helpers.compose_config defaults.base mode user_custom
+  | contracts.KbConfig
+
+

Composition Mechanism

+

The helpers.ncl module provides the composition function:

+
{
+  # Recursively merge with override precedence
+  merge_with_override = fun base override => /* ... */,
+
+  # Compose three layers
+  compose_config = fun defaults mode_config user_custom =>
+    let with_mode = merge_with_override defaults mode_config in
+    merge_with_override with_mode user_custom,
+}
+
+

Merge behavior:

+
    +
  • Records are merged recursively
  • +
  • Override values take precedence over base values
  • +
  • Arrays are not merged, override replaces base
  • +
  • Null in override keeps base value
  • +
+

Example merge:

+
base = { storage = { primary = 'filesystem }, embeddings = { enabled = true } }
+override = { storage = { primary = 'memory } }
+# Result: { storage = { primary = 'memory }, embeddings = { enabled = true } }
+
+

Export to JSON

+

Once composed, the Nickel configuration is exported to JSON for Rust consumption:

+
nickel export --format json .kb-config/core/kb.ncl > .kb-config/targets/kb-core.json
+
+

Output (.kb-config/targets/kb-core.json):

+
{
+  "graph": {
+    "name": "my-project",
+    "version": "1.0.0"
+  },
+  "storage": {
+    "primary": "memory",
+    "secondary": {
+      "enabled": false
+    }
+  },
+  "embeddings": {
+    "enabled": true,
+    "provider": "claude",
+    "model": "claude-3-haiku-20240307",
+    "dimensions": 768
+  }
+}
+
+

Rust Integration

+

The Rust code deserializes the JSON into typed structs using serde:

+
#![allow(unused)]
+fn main() {
+use serde::{Deserialize, Serialize};
+
+#[derive(Debug, Deserialize, Serialize)]
+pub struct KbConfig {
+    pub graph: GraphConfig,
+    pub storage: StorageConfig,
+    pub embeddings: EmbeddingConfig,
+    pub templates: TemplateConfig,
+    pub query: QueryConfig,
+    pub mcp: McpConfig,
+    pub sync: SyncConfig,
+}
+
+impl KbConfig {
+    pub fn from_file(path: &Path) -> Result<Self> {
+        let json = std::fs::read_to_string(path)?;
+        let config: KbConfig = serde_json::from_str(&json)?;
+        Ok(config)
+    }
+}
+}
+

Usage in kb-core:

+
#![allow(unused)]
+fn main() {
+let config = KbConfig::from_file(".kb-config/targets/kb-core.json")?;
+
+// Config drives behavior
+let storage: Box<dyn Storage> = match config.storage.primary {
+    StorageType::Filesystem => Box::new(FilesystemStorage::new(&config)?),
+    StorageType::Memory => Box::new(MemoryStorage::new()),
+    StorageType::SurrealDb => Box::new(SurrealDbStorage::new(&config).await?),
+};
+
+let embeddings: Box<dyn EmbeddingProvider> = match config.embeddings.provider {
+    EmbeddingProviderType::FastEmbed => Box::new(FastEmbedProvider::new()?),
+    EmbeddingProviderType::OpenAI => Box::new(RigEmbeddingProvider::openai(&config)?),
+    EmbeddingProviderType::Claude => Box::new(RigEmbeddingProvider::claude(&config)?),
+    EmbeddingProviderType::Ollama => Box::new(RigEmbeddingProvider::ollama(&config)?),
+};
+}
+

Double Validation

+

Configuration is validated twice:

+

1. Nickel Contract Validation

+

At export time, Nickel validates:

+
    +
  • ✅ Types match contracts (e.g., primary | StorageType)
  • +
  • ✅ Required fields are present
  • +
  • ✅ Enums have valid values
  • +
  • ✅ Nested structure is correct
  • +
+

Error example:

+
error: contract broken by a value
+  ┌─ .kb-config/core/kb.ncl:15:5
+  │
+15│     primary = 'invalid,
+  │     ^^^^^^^^^^^^^^^^^^^ applied to this expression
+  │
+  = This value is not in the enum ['filesystem, 'memory, 'surrealdb]
+
+

2. Serde Deserialization Validation

+

At runtime, serde validates:

+
    +
  • ✅ JSON structure matches Rust types
  • +
  • ✅ Field names match (with rename support)
  • +
  • ✅ Values can be converted to Rust types
  • +
  • ✅ Required fields are not null
  • +
+

Error example:

+
#![allow(unused)]
+fn main() {
+Error: missing field `graph` at line 1 column 123
+}
+

Benefits of Config-Driven Architecture

+

1. Zero Hardcoding

+

Bad (hardcoded):

+
#![allow(unused)]
+fn main() {
+// Hardcoded - requires recompilation to change
+let storage = FilesystemStorage::new("/fixed/path");
+let threshold = 0.6;
+}
+

Good (config-driven):

+
#![allow(unused)]
+fn main() {
+// Config-driven - change via .ncl file
+let storage = create_storage(&config)?;
+let threshold = config.query.similarity_threshold;
+}
+

2. Environment Flexibility

+

Same codebase, different behavior:

+
# Development
+nickel export .kb-config/platform/dev.ncl > targets/kb-core.json
+# → Filesystem storage, fastembed, no auto-sync
+
+# Production
+nickel export .kb-config/platform/prod.ncl > targets/kb-core.json
+# → SurrealDB enabled, OpenAI embeddings, auto-sync
+
+# Testing
+nickel export .kb-config/platform/test.ncl > targets/kb-core.json
+# → In-memory storage, no embeddings, isolated
+
+

3. Self-Documenting

+

Nickel contracts include inline documentation:

+
StorageType = [| 'filesystem, 'memory, 'surrealdb |]
+  | doc "Storage backend type: filesystem (git-tracked), memory (ephemeral), surrealdb (scalable)",
+
+

IDEs can show this documentation when editing .ncl files.

+

4. Type-Safe Evolution

+

When adding new features:

+
    +
  1. Update contract in contracts.ncl
  2. +
  3. Add default in defaults.ncl
  4. +
  5. Export validates existing configs
  6. +
  7. Rust compilation validates deserialization
  8. +
+

Breaking changes are caught before runtime.

+

5. Testability

+

Different test scenarios without code changes:

+
# test-semantic-search.ncl
+let test_config = defaults.base & {
+  embeddings = { enabled = true, provider = 'fastembed },
+  query = { similarity_threshold = 0.3 },
+} in test_config
+
+
#![allow(unused)]
+fn main() {
+#[test]
+fn test_semantic_search() {
+    let config = KbConfig::from_file("test-semantic-search.json")?;
+    // Config drives test behavior
+}
+}
+

Configuration Discovery

+

KB tools automatically discover configuration:

+
    +
  1. Check .kb-config/targets/kb-core.json (pre-exported)
  2. +
  3. Check .kb-config/core/kb.ncl (export on-demand)
  4. +
  5. Check environment variable KB_CONFIG
  6. +
  7. Fall back to embedded defaults
  8. +
+
#![allow(unused)]
+fn main() {
+impl KbConfig {
+    pub fn discover() -> Result<Self> {
+        if let Ok(config) = Self::from_file(".kb-config/targets/kb-core.json") {
+            return Ok(config);
+        }
+
+        if Path::new(".kb-config/core/kb.ncl").exists() {
+            // Export and load
+            let output = Command::new("nickel")
+                .args(["export", "--format", "json", ".kb-config/core/kb.ncl"])
+                .output()?;
+            return serde_json::from_slice(&output.stdout)?;
+        }
+
+        if let Ok(path) = std::env::var("KB_CONFIG") {
+            return Self::from_file(&path);
+        }
+
+        Ok(Self::default())  // Embedded defaults
+    }
+}
+}
+

Integration with justfile

+

The justfile integrates configuration validation:

+
# Validate all Nickel configs
+nickel-validate-all:
+    @echo "Validating Nickel schemas..."
+    nickel typecheck schemas/kb/contracts.ncl
+    nickel typecheck schemas/kb/defaults.ncl
+    nickel typecheck schemas/kb/helpers.ncl
+    nickel typecheck schemas/kb/modes/dev.ncl
+    nickel typecheck schemas/kb/modes/prod.ncl
+    nickel typecheck schemas/kb/modes/test.ncl
+    nickel typecheck .kb-config/core/kb.ncl
+
+# Export all platform configs
+nickel-export-all:
+    @echo "Exporting platform configs to JSON..."
+    @mkdir -p .kb-config/targets
+    nickel export --format json .kb-config/platform/dev.ncl > .kb-config/targets/kb-dev.json
+    nickel export --format json .kb-config/platform/prod.ncl > .kb-config/targets/kb-prod.json
+    nickel export --format json .kb-config/platform/test.ncl > .kb-config/targets/kb-test.json
+    @echo "Exported 3 configurations to .kb-config/targets/"
+
+

Usage:

+
just nickel::validate-all  # Check configs are valid
+just nickel::export-all    # Generate JSON for all environments
+
+

Best Practices

+

1. Never Hardcode

+

If it's behavior, it's config:

+
    +
  • Storage paths
  • +
  • API endpoints
  • +
  • Thresholds
  • +
  • Timeouts
  • +
  • Feature flags
  • +
  • Provider selection
  • +
+

2. Use Modes for Environment Differences

+

Don't put environment-specific values in user config:

+

Bad:

+
# user config with env-specific values
+{
+  storage = {
+    url = if env == "prod" then "prod-url" else "dev-url"  # Don't do this
+  }
+}
+
+

Good:

+
# modes/prod.ncl
+{ storage = { url = "prod-url" } }
+
+# modes/dev.ncl
+{ storage = { url = "dev-url" } }
+
+# user config is environment-agnostic
+{ graph = { name = "my-project" } }
+
+

3. Document Complex Fields

+

Use Nickel's doc metadata:

+
similarity_threshold | Number
+  | doc "Minimum cosine similarity (0-1) for semantic search matches. Higher = stricter."
+  | default = 0.6,
+
+

4. Validate Early

+

Run nickel typecheck in CI/CD before building Rust code.

+

5. Version Configs

+

Track .ncl files in git, ignore .kb-config/targets/*.json (generated).

+

See Also

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/architecture/graph-model.html b/docs/book/architecture/graph-model.html new file mode 100644 index 0000000..f76edad --- /dev/null +++ b/docs/book/architecture/graph-model.html @@ -0,0 +1,227 @@ + + + + + + Graph Model - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Graph Model

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/architecture/logseq-blocks-design.html b/docs/book/architecture/logseq-blocks-design.html new file mode 100644 index 0000000..7de1c3d --- /dev/null +++ b/docs/book/architecture/logseq-blocks-design.html @@ -0,0 +1,1129 @@ + + + + + + Logseq Blocks Design - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Logseq Blocks Support - Architecture Design

+

Problem Statement

+

Logseq uses content blocks as the fundamental unit of information, not full documents. Each block can have:

+
    +
  • Properties: #card, TODO, DONE, custom properties
  • +
  • Tags: Inline tags like #flashcard, #important
  • +
  • References: Block references ((block-id)), page references [[page]]
  • +
  • Nesting: Outliner-style hierarchy (parent-child blocks)
  • +
  • Metadata: Block-level properties (unlike page-level frontmatter)
  • +
+

Current KB limitation: Nodes only have content: String (flat markdown). Importing from Logseq loses block structure and properties.

+

Requirement: Support round-trip import/export with full block fidelity:

+
Logseq Graph → KOGRAL Import → KOGRAL Storage → KOGRAL Export → Logseq Graph
+     (blocks preserved)                    (blocks preserved)
+
+

Use Cases

+

1. Flashcards (#card)

+

Logseq:

+
- What is Rust's ownership model? #card
+  - Rust uses ownership, borrowing, and lifetimes
+  - Three rules: one owner, many borrows XOR one mutable
+
+

KB needs to preserve:

+
    +
  • Block with #card property
  • +
  • Nested answer blocks
  • +
  • Ability to query all cards
  • +
+

2. Task Tracking (TODO/DONE)

+

Logseq:

+
- TODO Implement block parser #rust
+  - DONE Research block structure
+  - TODO Write parser tests
+
+

KB needs to preserve:

+
    +
  • Task status per block
  • +
  • Hierarchical task breakdown
  • +
  • Tags on tasks
  • +
+

3. Block References

+

Logseq:

+
- Core concept: ((block-uuid-123))
+  - See also: [[Related Page]]
+
+

KB needs to preserve:

+
    +
  • Block-to-block links (not just page-to-page)
  • +
  • UUID references
  • +
+

4. Block Properties

+

Logseq:

+
- This is a block with properties
+  property1:: value1
+  property2:: value2
+
+

KB needs to preserve:

+
    +
  • Custom key-value properties per block
  • +
  • Property inheritance/override
  • +
+

Design Options

+

Option A: Blocks as First-Class Data Structure

+

Add blocks field to Node:

+
#![allow(unused)]
+fn main() {
+pub struct Node {
+    // ... existing fields ...
+    pub content: String,              // Backward compat: flat markdown
+    pub blocks: Option<Vec<Block>>,   // NEW: Structured blocks
+}
+
+pub struct Block {
+    pub id: String,                   // UUID or auto-generated
+    pub content: String,              // Block text
+    pub properties: BlockProperties,  // Tags, status, custom props
+    pub children: Vec<Block>,         // Nested blocks
+    pub created: DateTime<Utc>,
+    pub modified: DateTime<Utc>,
+}
+
+pub struct BlockProperties {
+    pub tags: Vec<String>,            // #card, #important
+    pub status: Option<TaskStatus>,   // TODO, DONE, WAITING
+    pub custom: HashMap<String, String>, // property:: value
+}
+
+pub enum TaskStatus {
+    Todo,
+    Doing,
+    Done,
+    Waiting,
+    Cancelled,
+}
+}
+

Pros:

+
    +
  • ✅ Type-safe, explicit structure
  • +
  • ✅ Queryable (find all #card blocks)
  • +
  • ✅ Preserves hierarchy
  • +
  • ✅ Supports block-level operations
  • +
+

Cons:

+
    +
  • ❌ Adds complexity to Node
  • +
  • ❌ Dual representation (content + blocks)
  • +
  • ❌ Requires migration of existing data
  • +
+

Option B: Parser-Only Approach

+

Keep content: String, parse blocks on-demand:

+
#![allow(unused)]
+fn main() {
+pub struct BlockParser;
+
+impl BlockParser {
+    // Parse markdown content into block structure
+    fn parse(content: &str) -> Vec<Block>;
+
+    // Serialize blocks back to markdown
+    fn serialize(blocks: &[Block]) -> String;
+}
+
+// Usage
+let blocks = BlockParser::parse(&node.content);
+let filtered = blocks.iter().filter(|b| b.properties.tags.contains("card"));
+}
+

Pros:

+
    +
  • ✅ No schema changes
  • +
  • ✅ Backward compatible
  • +
  • ✅ Simple storage (still just String)
  • +
+

Cons:

+
    +
  • ❌ Parse overhead on every access
  • +
  • ❌ Can't query blocks in database (SurrealDB)
  • +
  • ❌ Harder to index/search blocks
  • +
+ +

Combine both: structured storage + lazy parsing:

+
#![allow(unused)]
+fn main() {
+pub struct Node {
+    // ... existing fields ...
+    pub content: String,              // Source of truth (markdown)
+
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub blocks: Option<Vec<Block>>,   // Cached structure (parsed)
+}
+
+impl Node {
+    // Parse blocks from content if not already cached
+    pub fn get_blocks(&mut self) -> &Vec<Block> {
+        if self.blocks.is_none() {
+            self.blocks = Some(BlockParser::parse(&self.content));
+        }
+        self.blocks.as_ref().unwrap()
+    }
+
+    // Update content from blocks (when blocks modified)
+    pub fn sync_blocks_to_content(&mut self) {
+        if let Some(ref blocks) = self.blocks {
+            self.content = BlockParser::serialize(blocks);
+        }
+    }
+}
+}
+

Storage Strategy:

+
    +
  1. +

    Filesystem - Store as markdown (Logseq compatible):

    +
    - Block 1 #card
    +  - Nested block
    +- Block 2 TODO
    +
    +
  2. +
  3. +

    SurrealDB - Store both:

    +
    DEFINE TABLE block SCHEMAFULL;
    +DEFINE FIELD node_id ON block TYPE record(node);
    +DEFINE FIELD block_id ON block TYPE string;
    +DEFINE FIELD content ON block TYPE string;
    +DEFINE FIELD properties ON block TYPE object;
    +DEFINE FIELD parent_id ON block TYPE option<string>;
    +
    +-- Index for queries
    +DEFINE INDEX block_tags ON block COLUMNS properties.tags;
    +DEFINE INDEX block_status ON block COLUMNS properties.status;
    +
    +
  4. +
+

Pros:

+
    +
  • ✅ Best of both worlds
  • +
  • ✅ Filesystem stays Logseq-compatible
  • +
  • ✅ SurrealDB can query blocks
  • +
  • ✅ Lazy parsing (only when needed)
  • +
  • ✅ Backward compatible
  • +
+

Cons:

+
    +
  • ⚠️ Need to keep content/blocks in sync
  • +
  • ⚠️ More complex implementation
  • +
+ +

Phase 1: Data Model

+
#![allow(unused)]
+fn main() {
+// crates/kb-core/src/models/block.rs
+
+use chrono::{DateTime, Utc};
+use serde::{Deserialize, Serialize};
+use std::collections::HashMap;
+
+/// A content block (Logseq-style)
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct Block {
+    /// Unique block identifier (UUID)
+    pub id: String,
+
+    /// Block content (markdown text, excluding nested blocks)
+    pub content: String,
+
+    /// Block properties (tags, status, custom)
+    pub properties: BlockProperties,
+
+    /// Child blocks (nested hierarchy)
+    #[serde(default)]
+    pub children: Vec<Block>,
+
+    /// Creation timestamp
+    pub created: DateTime<Utc>,
+
+    /// Last modification timestamp
+    pub modified: DateTime<Utc>,
+
+    /// Parent block ID (if nested)
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parent_id: Option<String>,
+}
+
+/// Block-level properties
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+pub struct BlockProperties {
+    /// Tags (e.g., #card, #important)
+    #[serde(default)]
+    pub tags: Vec<String>,
+
+    /// Task status (TODO, DONE, etc.)
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<TaskStatus>,
+
+    /// Custom properties (property:: value)
+    #[serde(default)]
+    pub custom: HashMap<String, String>,
+
+    /// Block references ((uuid))
+    #[serde(default)]
+    pub block_refs: Vec<String>,
+
+    /// Page references ([[page]])
+    #[serde(default)]
+    pub page_refs: Vec<String>,
+}
+
+/// Task status for TODO blocks
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "UPPERCASE")]
+pub enum TaskStatus {
+    Todo,
+    Doing,
+    Done,
+    Later,
+    Now,
+    Waiting,
+    Cancelled,
+}
+
+impl Block {
+    /// Create a new block with content
+    pub fn new(content: String) -> Self {
+        use uuid::Uuid;
+        Self {
+            id: Uuid::new_v4().to_string(),
+            content,
+            properties: BlockProperties::default(),
+            children: Vec::new(),
+            created: Utc::now(),
+            modified: Utc::now(),
+            parent_id: None,
+        }
+    }
+
+    /// Add a child block
+    pub fn add_child(&mut self, mut child: Block) {
+        child.parent_id = Some(self.id.clone());
+        self.children.push(child);
+        self.modified = Utc::now();
+    }
+
+    /// Add a tag to this block
+    pub fn add_tag(&mut self, tag: String) {
+        if !self.properties.tags.contains(&tag) {
+            self.properties.tags.push(tag);
+            self.modified = Utc::now();
+        }
+    }
+
+    /// Set task status
+    pub fn set_status(&mut self, status: TaskStatus) {
+        self.properties.status = Some(status);
+        self.modified = Utc::now();
+    }
+
+    /// Get all blocks (self + descendants) as flat list
+    pub fn flatten(&self) -> Vec<&Block> {
+        let mut result = vec![self];
+        for child in &self.children {
+            result.extend(child.flatten());
+        }
+        result
+    }
+
+    /// Find block by ID in tree
+    pub fn find(&self, id: &str) -> Option<&Block> {
+        if self.id == id {
+            return Some(self);
+        }
+        for child in &self.children {
+            if let Some(found) = child.find(id) {
+                return Some(found);
+            }
+        }
+        None
+    }
+}
+}
+

Phase 2: Update Node Model

+
#![allow(unused)]
+fn main() {
+// crates/kb-core/src/models.rs (modifications)
+
+use crate::models::block::Block;
+
+pub struct Node {
+    // ... existing fields ...
+    pub content: String,
+
+    /// Structured blocks (optional, parsed from content)
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub blocks: Option<Vec<Block>>,
+}
+
+impl Node {
+    /// Get blocks, parsing from content if needed
+    pub fn get_blocks(&mut self) -> Result<&Vec<Block>> {
+        if self.blocks.is_none() {
+            self.blocks = Some(crate::parser::BlockParser::parse(&self.content)?);
+        }
+        Ok(self.blocks.as_ref().unwrap())
+    }
+
+    /// Update content from blocks
+    pub fn sync_blocks_to_content(&mut self) {
+        if let Some(ref blocks) = self.blocks {
+            self.content = crate::parser::BlockParser::serialize(blocks);
+        }
+    }
+
+    /// Find all blocks with a specific tag
+    pub fn find_blocks_by_tag(&mut self, tag: &str) -> Result<Vec<&Block>> {
+        let blocks = self.get_blocks()?;
+        let mut result = Vec::new();
+        for block in blocks {
+            for b in block.flatten() {
+                if b.properties.tags.iter().any(|t| t == tag) {
+                    result.push(b);
+                }
+            }
+        }
+        Ok(result)
+    }
+
+    /// Find all TODO blocks
+    pub fn find_todos(&mut self) -> Result<Vec<&Block>> {
+        let blocks = self.get_blocks()?;
+        let mut result = Vec::new();
+        for block in blocks {
+            for b in block.flatten() {
+                if matches!(b.properties.status, Some(TaskStatus::Todo)) {
+                    result.push(b);
+                }
+            }
+        }
+        Ok(result)
+    }
+}
+}
+

Phase 3: Block Parser

+
#![allow(unused)]
+fn main() {
+// crates/kb-core/src/parser/block_parser.rs
+
+use crate::models::block::{Block, BlockProperties, TaskStatus};
+use regex::Regex;
+
+pub struct BlockParser;
+
+impl BlockParser {
+    /// Parse markdown content into block structure
+    ///
+    /// Handles:
+    /// - Outliner format (- prefix with indentation)
+    /// - Tags (#card, #important)
+    /// - Task status (TODO, DONE)
+    /// - Properties (property:: value)
+    /// - Block references (((uuid)))
+    /// - Page references ([[page]])
+    pub fn parse(content: &str) -> Result<Vec<Block>> {
+        let mut blocks = Vec::new();
+        let mut stack: Vec<(usize, Block)> = Vec::new(); // (indent_level, block)
+
+        for line in content.lines() {
+            // Detect indentation level
+            let indent = count_indent(line);
+            let trimmed = line.trim_start();
+
+            // Skip empty lines
+            if trimmed.is_empty() {
+                continue;
+            }
+
+            // Parse block line
+            if let Some(block_content) = trimmed.strip_prefix("- ") {
+                let mut block = Self::parse_block_line(block_content)?;
+
+                // Pop stack until we find parent level
+                while let Some((level, _)) = stack.last() {
+                    if *level < indent {
+                        break;
+                    }
+                    stack.pop();
+                }
+
+                // Add as child to parent or as root
+                if let Some((_, parent)) = stack.last_mut() {
+                    parent.add_child(block.clone());
+                } else {
+                    blocks.push(block.clone());
+                }
+
+                stack.push((indent, block));
+            }
+        }
+
+        Ok(blocks)
+    }
+
+    /// Parse a single block line (after "- " prefix)
+    fn parse_block_line(line: &str) -> Result<Block> {
+        let mut block = Block::new(String::new());
+        let mut properties = BlockProperties::default();
+
+        // Extract task status (TODO, DONE, etc.)
+        let (status, remaining) = Self::extract_task_status(line);
+        properties.status = status;
+
+        // Extract tags (#card, #important)
+        let (tags, remaining) = Self::extract_tags(remaining);
+        properties.tags = tags;
+
+        // Extract properties (property:: value)
+        let (custom_props, remaining) = Self::extract_properties(remaining);
+        properties.custom = custom_props;
+
+        // Extract block references (((uuid)))
+        let (block_refs, remaining) = Self::extract_block_refs(remaining);
+        properties.block_refs = block_refs;
+
+        // Extract page references ([[page]])
+        let (page_refs, content) = Self::extract_page_refs(remaining);
+        properties.page_refs = page_refs;
+
+        block.content = content.trim().to_string();
+        block.properties = properties;
+
+        Ok(block)
+    }
+
+    /// Serialize blocks back to markdown
+    pub fn serialize(blocks: &[Block]) -> String {
+        let mut result = String::new();
+        for block in blocks {
+            Self::serialize_block(&mut result, block, 0);
+        }
+        result
+    }
+
+    fn serialize_block(output: &mut String, block: &Block, indent: usize) {
+        // Write indent
+        for _ in 0..indent {
+            output.push_str("  ");
+        }
+
+        // Write prefix
+        output.push_str("- ");
+
+        // Write task status
+        if let Some(status) = block.properties.status {
+            output.push_str(&format!("{:?} ", status).to_uppercase());
+        }
+
+        // Write content
+        output.push_str(&block.content);
+
+        // Write tags
+        for tag in &block.properties.tags {
+            output.push_str(&format!(" #{}", tag));
+        }
+
+        // Write properties
+        if !block.properties.custom.is_empty() {
+            output.push('\n');
+            for (key, value) in &block.properties.custom {
+                for _ in 0..=indent {
+                    output.push_str("  ");
+                }
+                output.push_str(&format!("{}:: {}\n", key, value));
+            }
+        }
+
+        output.push('\n');
+
+        // Write children recursively
+        for child in &block.children {
+            Self::serialize_block(output, child, indent + 1);
+        }
+    }
+
+    // Helper methods for extraction
+    fn extract_task_status(line: &str) -> (Option<TaskStatus>, &str) {
+        let line = line.trim_start();
+        if let Some(rest) = line.strip_prefix("TODO ") {
+            (Some(TaskStatus::Todo), rest)
+        } else if let Some(rest) = line.strip_prefix("DONE ") {
+            (Some(TaskStatus::Done), rest)
+        } else if let Some(rest) = line.strip_prefix("DOING ") {
+            (Some(TaskStatus::Doing), rest)
+        } else if let Some(rest) = line.strip_prefix("LATER ") {
+            (Some(TaskStatus::Later), rest)
+        } else if let Some(rest) = line.strip_prefix("NOW ") {
+            (Some(TaskStatus::Now), rest)
+        } else if let Some(rest) = line.strip_prefix("WAITING ") {
+            (Some(TaskStatus::Waiting), rest)
+        } else if let Some(rest) = line.strip_prefix("CANCELLED ") {
+            (Some(TaskStatus::Cancelled), rest)
+        } else {
+            (None, line)
+        }
+    }
+
+    fn extract_tags(line: &str) -> (Vec<String>, String) {
+        let tag_regex = Regex::new(r"#(\w+)").unwrap();
+        let mut tags = Vec::new();
+        let mut result = line.to_string();
+
+        for cap in tag_regex.captures_iter(line) {
+            if let Some(tag) = cap.get(1) {
+                tags.push(tag.as_str().to_string());
+                result = result.replace(&format!("#{}", tag.as_str()), "");
+            }
+        }
+
+        (tags, result.trim().to_string())
+    }
+
+    fn extract_properties(line: &str) -> (HashMap<String, String>, String) {
+        let prop_regex = Regex::new(r"(\w+)::\s*([^\n]+)").unwrap();
+        let mut props = HashMap::new();
+        let mut result = line.to_string();
+
+        for cap in prop_regex.captures_iter(line) {
+            if let (Some(key), Some(value)) = (cap.get(1), cap.get(2)) {
+                props.insert(key.as_str().to_string(), value.as_str().trim().to_string());
+                result = result.replace(&cap[0], "");
+            }
+        }
+
+        (props, result.trim().to_string())
+    }
+
+    fn extract_block_refs(line: &str) -> (Vec<String>, String) {
+        let ref_regex = Regex::new(r"\(\(([^)]+)\)\)").unwrap();
+        let mut refs = Vec::new();
+        let mut result = line.to_string();
+
+        for cap in ref_regex.captures_iter(line) {
+            if let Some(uuid) = cap.get(1) {
+                refs.push(uuid.as_str().to_string());
+                result = result.replace(&cap[0], "");
+            }
+        }
+
+        (refs, result.trim().to_string())
+    }
+
+    fn extract_page_refs(line: &str) -> (Vec<String>, String) {
+        let page_regex = Regex::new(r"\[\[([^\]]+)\]\]").unwrap();
+        let mut pages = Vec::new();
+        let result = line.to_string();
+
+        for cap in page_regex.captures_iter(line) {
+            if let Some(page) = cap.get(1) {
+                pages.push(page.as_str().to_string());
+                // Keep [[page]] in content for now (backward compat)
+            }
+        }
+
+        (pages, result)
+    }
+}
+
+fn count_indent(line: &str) -> usize {
+    line.chars().take_while(|c| c.is_whitespace()).count() / 2
+}
+}
+

Phase 4: Logseq Import/Export

+
#![allow(unused)]
+fn main() {
+// crates/kb-core/src/logseq.rs
+
+use crate::models::{Node, NodeType};
+use crate::models::block::Block;
+use crate::parser::BlockParser;
+
+pub struct LogseqImporter;
+
+impl LogseqImporter {
+    /// Import a Logseq page (markdown file) as a Node
+    pub fn import_page(path: &Path) -> Result<Node> {
+        let content = std::fs::read_to_string(path)?;
+
+        // Extract frontmatter if present
+        let (frontmatter, body) = Self::split_frontmatter(&content);
+
+        // Parse blocks from body
+        let blocks = BlockParser::parse(&body)?;
+
+        // Create node with blocks
+        let mut node = Node::new(NodeType::Note, Self::extract_title(path));
+        node.content = body;
+        node.blocks = Some(blocks);
+
+        // Apply frontmatter properties
+        if let Some(fm) = frontmatter {
+            Self::apply_frontmatter(&mut node, &fm)?;
+        }
+
+        Ok(node)
+    }
+
+    fn split_frontmatter(content: &str) -> (Option<String>, String) {
+        if content.starts_with("---\n") {
+            if let Some(end) = content[4..].find("\n---\n") {
+                let frontmatter = content[4..4 + end].to_string();
+                let body = content[4 + end + 5..].to_string();
+                return (Some(frontmatter), body);
+            }
+        }
+        (None, content.to_string())
+    }
+
+    fn extract_title(path: &Path) -> String {
+        path.file_stem()
+            .and_then(|s| s.to_str())
+            .unwrap_or("Untitled")
+            .to_string()
+    }
+
+    fn apply_frontmatter(node: &mut Node, frontmatter: &str) -> Result<()> {
+        // Parse YAML frontmatter and apply to node
+        // ... implementation ...
+        Ok(())
+    }
+}
+
+pub struct LogseqExporter;
+
+impl LogseqExporter {
+    /// Export a Node to Logseq page format
+    pub fn export_page(node: &Node, path: &Path) -> Result<()> {
+        let mut output = String::new();
+
+        // Generate frontmatter
+        output.push_str("---\n");
+        output.push_str(&Self::generate_frontmatter(node)?);
+        output.push_str("---\n\n");
+
+        // Serialize blocks or use content
+        if let Some(ref blocks) = node.blocks {
+            output.push_str(&BlockParser::serialize(blocks));
+        } else {
+            output.push_str(&node.content);
+        }
+
+        std::fs::write(path, output)?;
+        Ok(())
+    }
+
+    fn generate_frontmatter(node: &Node) -> Result<String> {
+        let mut fm = String::new();
+        fm.push_str(&format!("title: {}\n", node.title));
+        fm.push_str(&format!("tags: {}\n", node.tags.join(", ")));
+        // ... more frontmatter fields ...
+        Ok(fm)
+    }
+}
+}
+

Query API Extensions

+
#![allow(unused)]
+fn main() {
+// New methods in Graph or Query module
+
+impl Graph {
+    /// Find all blocks with a specific tag across all nodes
+    pub fn find_blocks_by_tag(&mut self, tag: &str) -> Vec<(&Node, &Block)> {
+        let mut results = Vec::new();
+        for node in self.nodes.values_mut() {
+            if let Ok(blocks) = node.find_blocks_by_tag(tag) {
+                for block in blocks {
+                    results.push((node as &Node, block));
+                }
+            }
+        }
+        results
+    }
+
+    /// Find all flashcards (#card blocks)
+    pub fn find_flashcards(&mut self) -> Vec<(&Node, &Block)> {
+        self.find_blocks_by_tag("card")
+    }
+
+    /// Find all TODO items across knowledge base
+    pub fn find_all_todos(&mut self) -> Vec<(&Node, &Block)> {
+        let mut results = Vec::new();
+        for node in self.nodes.values_mut() {
+            if let Ok(todos) = node.find_todos() {
+                for block in todos {
+                    results.push((node as &Node, block));
+                }
+            }
+        }
+        results
+    }
+}
+}
+

MCP Tool Extensions

+
{
+  "name": "kogral/find_blocks",
+  "description": "Find blocks by tag, status, or properties",
+  "inputSchema": {
+    "type": "object",
+    "properties": {
+      "tag": { "type": "string", "description": "Filter by tag (e.g., 'card')" },
+      "status": { "type": "string", "enum": ["TODO", "DONE", "DOING"] },
+      "property": { "type": "string", "description": "Custom property key" },
+      "value": { "type": "string", "description": "Property value to match" }
+    }
+  }
+}
+
+

Configuration

+
# schemas/kb/contracts.ncl (additions)
+
+BlockConfig = {
+  enabled | Bool
+    | doc "Enable block-level parsing and storage"
+    | default = true,
+
+  preserve_hierarchy | Bool
+    | doc "Preserve block nesting on import/export"
+    | default = true,
+
+  parse_on_load | Bool
+    | doc "Automatically parse blocks when loading nodes"
+    | default = false,  # Lazy parsing by default
+
+  supported_statuses | Array String
+    | doc "Supported task statuses"
+    | default = ["TODO", "DONE", "DOING", "LATER", "NOW", "WAITING", "CANCELLED"],
+}
+
+KbConfig = {
+  # ... existing fields ...
+
+  blocks | BlockConfig
+    | doc "Block-level features configuration"
+    | default = {},
+}
+
+

Migration Path

+

Phase 1: Add Block models (no behavior change) +Phase 2: Add BlockParser (opt-in via config) +Phase 3: Update Logseq import/export +Phase 4: Add block queries to CLI/MCP +Phase 5: SurrealDB block indexing

+

Backward Compatibility:

+
    +
  • Existing nodes without blocks field work as before
  • +
  • content remains source of truth
  • +
  • blocks is optional cache/structure
  • +
  • Config flag blocks.enabled to opt-in
  • +
+

Testing Strategy

+
#![allow(unused)]
+fn main() {
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_parse_simple_block() {
+        let content = "- This is a block #card";
+        let blocks = BlockParser::parse(content).unwrap();
+
+        assert_eq!(blocks.len(), 1);
+        assert_eq!(blocks[0].content, "This is a block");
+        assert_eq!(blocks[0].properties.tags, vec!["card"]);
+    }
+
+    #[test]
+    fn test_parse_nested_blocks() {
+        let content = r#"
+- Parent block
+  - Child block 1
+  - Child block 2
+    - Grandchild
+"#;
+        let blocks = BlockParser::parse(content).unwrap();
+
+        assert_eq!(blocks.len(), 1);
+        assert_eq!(blocks[0].children.len(), 2);
+        assert_eq!(blocks[0].children[1].children.len(), 1);
+    }
+
+    #[test]
+    fn test_parse_todo() {
+        let content = "- TODO Implement feature #rust";
+        let blocks = BlockParser::parse(content).unwrap();
+
+        assert_eq!(blocks[0].properties.status, Some(TaskStatus::Todo));
+        assert_eq!(blocks[0].content, "Implement feature");
+        assert_eq!(blocks[0].properties.tags, vec!["rust"]);
+    }
+
+    #[test]
+    fn test_roundtrip() {
+        let original = r#"- Block 1 #card
+  - Nested
+- TODO Block 2
+  priority:: high
+"#;
+        let blocks = BlockParser::parse(original).unwrap();
+        let serialized = BlockParser::serialize(&blocks);
+        let reparsed = BlockParser::parse(&serialized).unwrap();
+
+        assert_eq!(blocks.len(), reparsed.len());
+        assert_eq!(blocks[0].properties, reparsed[0].properties);
+    }
+}
+}
+

Summary

+

Recommended Approach: Hybrid (Option C)

+
    +
  • Add Block struct with properties, hierarchy
  • +
  • Extend Node with optional blocks: Option<Vec<Block>>
  • +
  • Implement bidirectional parser (markdown ↔ blocks)
  • +
  • Preserve content as source of truth (backward compat)
  • +
  • Enable block queries in CLI/MCP
  • +
  • Support round-trip Logseq import/export
  • +
+

Benefits:

+
    +
  • ✅ Full Logseq compatibility
  • +
  • ✅ Queryable blocks (find #card, TODO, etc.)
  • +
  • ✅ Backward compatible
  • +
  • ✅ Extensible (custom properties)
  • +
  • ✅ Type-safe structure
  • +
+

Trade-offs:

+
    +
  • ⚠️ Added complexity
  • +
  • ⚠️ Need to sync content ↔ blocks
  • +
  • ⚠️ More storage for SurrealDB backend
  • +
+

Next Steps:

+
    +
  1. Review and approve design
  2. +
  3. Implement Phase 1 (Block models)
  4. +
  5. Implement Phase 2 (BlockParser)
  6. +
  7. Update Logseq import/export
  8. +
  9. Add block queries to MCP/CLI
  10. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/architecture/overview.html b/docs/book/architecture/overview.html new file mode 100644 index 0000000..116af42 --- /dev/null +++ b/docs/book/architecture/overview.html @@ -0,0 +1,667 @@ + + + + + + System Overview - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

System Architecture

+

Comprehensive overview of the KOGRAL architecture.

+

High-Level Architecture

+

Architecture Overview

+

The KOGRAL consists of three main layers:

+
    +
  1. User Interfaces: kb-cli (terminal), kb-mcp (AI integration), NuShell scripts (automation)
  2. +
  3. Core Library (kb-core): Rust library with graph engine, storage abstraction, embeddings, query engine
  4. +
  5. Storage Backends: Filesystem (git-friendly), SurrealDB (scalable), In-Memory (cache/testing)
  6. +
+

Component Details

+

kb-cli (Command-Line Interface)

+

Purpose: Primary user interface for local knowledge management.

+

Commands (13 total):

+
    +
  • init: Initialize .kogral/ directory
  • +
  • add: Create nodes (note, decision, guideline, pattern, journal)
  • +
  • search: Text and semantic search
  • +
  • link: Create relationships between nodes
  • +
  • list: List all nodes
  • +
  • show: Display node details
  • +
  • delete: Remove nodes
  • +
  • graph: Visualize knowledge graph
  • +
  • sync: Sync filesystem ↔ SurrealDB
  • +
  • serve: Start MCP server
  • +
  • import: Import from Logseq
  • +
  • export: Export to Logseq/JSON
  • +
  • config: Manage configuration
  • +
+

Technology: Rust + clap (derive API)

+

Features:

+
    +
  • Colored terminal output
  • +
  • Interactive prompts
  • +
  • Dry-run modes
  • +
  • Validation before operations
  • +
+

kb-mcp (MCP Server)

+

Purpose: AI integration via Model Context Protocol.

+

Protocol: JSON-RPC 2.0 over stdio

+

Components:

+
    +
  1. +

    Tools (7):

    +
      +
    • kogral/search: Query knowledge base
    • +
    • kb/add_note: Create notes
    • +
    • kb/add_decision: Create ADRs
    • +
    • kb/link: Create relationships
    • +
    • kb/get_guidelines: Retrieve guidelines with inheritance
    • +
    • kb/list_graphs: List available graphs
    • +
    • kb/export: Export to formats
    • +
    +
  2. +
  3. +

    Resources (6 URIs):

    +
      +
    • kogral://project/notes
    • +
    • kogral://project/decisions
    • +
    • kogral://project/guidelines
    • +
    • kogral://project/patterns
    • +
    • kogral://shared/guidelines
    • +
    • kogral://shared/patterns
    • +
    +
  4. +
  5. +

    Prompts (2):

    +
      +
    • kb/summarize_project: Generate project summary
    • +
    • kb/find_related: Find related nodes
    • +
    +
  6. +
+

Integration: Claude Code via ~/.config/claude/config.json

+

NuShell Scripts

+

Purpose: Automation and maintenance tasks.

+

Scripts (6):

+
    +
  • kb-sync.nu: Filesystem ↔ SurrealDB sync
  • +
  • kb-backup.nu: Archive knowledge base
  • +
  • kb-reindex.nu: Rebuild embeddings
  • +
  • kb-import-logseq.nu: Import from Logseq
  • +
  • kb-export-logseq.nu: Export to Logseq
  • +
  • kb-stats.nu: Graph statistics
  • +
+

Features:

+
    +
  • Colored output
  • +
  • Dry-run modes
  • +
  • Progress indicators
  • +
  • Error handling
  • +
+

Core Library (kb-core)

+

Models

+

Graph:

+
#![allow(unused)]
+fn main() {
+pub struct Graph {
+    pub name: String,
+    pub version: String,
+    pub nodes: HashMap<String, Node>,  // ID → Node
+    pub edges: Vec<Edge>,
+    pub metadata: HashMap<String, Value>,
+}
+}
+

Node:

+
#![allow(unused)]
+fn main() {
+pub struct Node {
+    pub id: String,
+    pub node_type: NodeType,
+    pub title: String,
+    pub content: String,
+    pub tags: Vec<String>,
+    pub status: NodeStatus,
+    pub created: DateTime<Utc>,
+    pub modified: DateTime<Utc>,
+    // ... relationships, metadata
+}
+}
+

Edge:

+
#![allow(unused)]
+fn main() {
+pub struct Edge {
+    pub from: String,
+    pub to: String,
+    pub relation: EdgeType,
+    pub strength: f32,
+    pub created: DateTime<Utc>,
+}
+}
+

Storage Trait

+
#![allow(unused)]
+fn main() {
+#[async_trait]
+pub trait Storage: Send + Sync {
+    async fn save_graph(&self, graph: &Graph) -> Result<()>;
+    async fn load_graph(&self, name: &str) -> Result<Graph>;
+    async fn delete_graph(&self, name: &str) -> Result<()>;
+    async fn list_graphs(&self) -> Result<Vec<String>>;
+}
+}
+

Implementations:

+
    +
  1. FilesystemStorage: Git-friendly markdown files
  2. +
  3. MemoryStorage: In-memory with DashMap
  4. +
  5. SurrealDbStorage: Scalable graph database
  6. +
+

Embedding Provider Trait

+
#![allow(unused)]
+fn main() {
+#[async_trait]
+pub trait EmbeddingProvider: Send + Sync {
+    async fn embed(&self, texts: Vec<String>) -> Result<Vec<Vec<f32>>>;
+    fn dimensions(&self) -> usize;
+    fn model_name(&self) -> &str;
+}
+}
+

Implementations:

+
    +
  1. FastEmbedProvider: Local fastembed
  2. +
  3. RigEmbeddingProvider: OpenAI, Claude, Ollama (via rig-core)
  4. +
+

Parser

+

Input: Markdown file with YAML frontmatter

+

Output: Node struct

+

Features:

+
    +
  • YAML frontmatter extraction
  • +
  • Markdown body parsing
  • +
  • Wikilink detection ([[linked-note]])
  • +
  • Code reference parsing (@file.rs:42)
  • +
+

Example:

+
---
+id: note-123
+type: note
+title: My Note
+tags: [rust, async]
+---
+
+# My Note
+
+Content with [[other-note]] and @src/main.rs:10
+
+

+
#![allow(unused)]
+fn main() {
+Node {
+    id: "note-123",
+    node_type: NodeType::Note,
+    title: "My Note",
+    content: "Content with [[other-note]] and @src/main.rs:10",
+    tags: vec!["rust", "async"],
+    // ... parsed wikilinks, code refs
+}
+}
+

Configuration System

+

Nickel Schema

+
# schemas/kb-config.ncl
+{
+  KbConfig = {
+    graph | GraphConfig,
+    storage | StorageConfig,
+    embeddings | EmbeddingConfig,
+    templates | TemplateConfig,
+    query | QueryConfig,
+    mcp | McpConfig,
+    sync | SyncConfig,
+  },
+}
+
+

Loading Process

+
User writes: .kogral/config.ncl
+    ↓ [nickel export --format json]
+JSON intermediate
+    ↓ [serde_json::from_str]
+KbConfig struct (Rust)
+    ↓
+Runtime behavior
+
+

Double Validation:

+
    +
  1. Nickel contracts: Type-safe, enum validation
  2. +
  3. Serde deserialization: Rust type checking
  4. +
+

Benefits:

+
    +
  • Errors caught at export time
  • +
  • Runtime guaranteed valid config
  • +
  • Self-documenting schemas
  • +
+

Storage Architecture

+

Hybrid Strategy

+

Local Graph (per project):

+
    +
  • Storage: Filesystem (.kogral/ directory)
  • +
  • Format: Markdown + YAML frontmatter
  • +
  • Version control: Git
  • +
  • Scope: Project-specific knowledge
  • +
+

Shared Graph (organization):

+
    +
  • Storage: SurrealDB (or synced filesystem)
  • +
  • Format: Same markdown (for compatibility)
  • +
  • Version control: Optional
  • +
  • Scope: Organization-wide guidelines
  • +
+

Sync:

+
Filesystem (.kogral/)
+    ↕ [bidirectional sync]
+SurrealDB (central)
+
+

File Layout

+
.kogral/
+├── config.toml              # Graph metadata
+├── notes/
+│   ├── async-patterns.md    # Individual note
+│   └── error-handling.md
+├── decisions/
+│   ├── 0001-use-rust.md     # ADR format
+│   └── 0002-surrealdb.md
+├── guidelines/
+│   ├── rust-errors.md       # Project guideline
+│   └── testing.md
+├── patterns/
+│   └── repository.md
+└── journal/
+    ├── 2026-01-17.md        # Daily journal
+    └── 2026-01-18.md
+
+

Query Engine

+ +
#![allow(unused)]
+fn main() {
+let results = graph.nodes.values()
+    .filter(|node| {
+        node.title.contains(&query) ||
+        node.content.contains(&query) ||
+        node.tags.iter().any(|tag| tag.contains(&query))
+    })
+    .collect();
+}
+ +
#![allow(unused)]
+fn main() {
+let query_embedding = embeddings.embed(vec![query]).await?;
+let mut scored: Vec<_> = graph.nodes.values()
+    .filter_map(|node| {
+        let node_embedding = node.embedding.as_ref()?;
+        let similarity = cosine_similarity(&query_embedding[0], node_embedding);
+        (similarity >= threshold).then_some((node, similarity))
+    })
+    .collect();
+scored.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap());
+}
+

Cross-Graph Query

+
#![allow(unused)]
+fn main() {
+// Query both project and shared graphs
+let project_results = project_graph.search(&query).await?;
+let shared_results = shared_graph.search(&query).await?;
+
+// Merge with deduplication
+let combined = merge_results(project_results, shared_results);
+}
+

MCP Protocol Flow

+
Claude Code                kb-mcp                    kb-core
+    │                         │                         │
+    ├─ JSON-RPC request ───→ │                         │
+    │  kb/search              │                         │
+    │  {"query": "rust"}      │                         │
+    │                         ├─ search() ──────────→  │
+    │                         │                         │
+    │                         │                    Query engine
+    │                         │                    Text + semantic
+    │                         │                         │
+    │                         │ ←──── results ─────────┤
+    │                         │                         │
+    │ ←─ JSON-RPC response ──┤                         │
+    │  {"results": [...]}     │                         │
+
+

Template System

+

Engine: Tera (Jinja2-like)

+

Templates:

+
    +
  1. +

    Document Templates (6):

    +
      +
    • note.md.tera
    • +
    • decision.md.tera
    • +
    • guideline.md.tera
    • +
    • pattern.md.tera
    • +
    • journal.md.tera
    • +
    • execution.md.tera
    • +
    +
  2. +
  3. +

    Export Templates (4):

    +
      +
    • logseq-page.md.tera
    • +
    • logseq-journal.md.tera
    • +
    • summary.md.tera
    • +
    • graph.json.tera
    • +
    +
  4. +
+

Usage:

+
#![allow(unused)]
+fn main() {
+let mut tera = Tera::new("templates/**/*.tera")?;
+let rendered = tera.render("note.md.tera", &context)?;
+}
+

Error Handling

+

Strategy: thiserror for structured errors

+
#![allow(unused)]
+fn main() {
+#[derive(Error, Debug)]
+pub enum KbError {
+    #[error("Storage error: {0}")]
+    Storage(String),
+
+    #[error("Node not found: {0}")]
+    NodeNotFound(String),
+
+    #[error("Configuration error: {0}")]
+    Config(String),
+
+    #[error("Parse error: {0}")]
+    Parse(String),
+
+    #[error("Embedding error: {0}")]
+    Embedding(String),
+}
+}
+

Propagation: ? operator throughout

+

Testing Strategy

+

Unit Tests: Per module (models, parser, storage)

+

Integration Tests: Full workflow (add → save → load → query)

+

Test Coverage:

+
    +
  • kb-core: 48 tests
  • +
  • kb-mcp: 5 tests
  • +
  • Total: 56 tests
  • +
+

Test Data: Fixtures in tests/fixtures/

+

Performance Considerations

+

Node Lookup: O(1) via HashMap

+

Semantic Search: O(n) with early termination (threshold filter)

+

Storage:

+
    +
  • Filesystem: Lazy loading (load on demand)
  • +
  • Memory: Full graph in RAM
  • +
  • SurrealDB: Query optimization (indexes)
  • +
+

Embeddings:

+
    +
  • Cache embeddings in node metadata
  • +
  • Batch processing (configurable batch size)
  • +
  • Async generation (non-blocking)
  • +
+

Security

+

No unsafe code: #![forbid(unsafe_code)]

+

Input validation:

+
    +
  • Nickel contracts validate config
  • +
  • serde validates JSON
  • +
  • Custom validation for user input
  • +
+

File operations:

+
    +
  • Path sanitization (no ../ traversal)
  • +
  • Permissions checking
  • +
  • Atomic writes (temp file + rename)
  • +
+

Scalability

+

Small Projects (< 1000 nodes):

+
    +
  • Filesystem storage
  • +
  • In-memory search
  • +
  • Local embeddings (fastembed)
  • +
+

Medium Projects (1000-10,000 nodes):

+
    +
  • Filesystem + SurrealDB sync
  • +
  • Semantic search with caching
  • +
  • Cloud embeddings (OpenAI/Claude)
  • +
+

Large Organizations (> 10,000 nodes):

+
    +
  • SurrealDB primary
  • +
  • Distributed embeddings
  • +
  • Multi-graph federation
  • +
+

Next Steps

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/architecture/storage-architecture.html b/docs/book/architecture/storage-architecture.html new file mode 100644 index 0000000..33e0ab9 --- /dev/null +++ b/docs/book/architecture/storage-architecture.html @@ -0,0 +1,227 @@ + + + + + + Storage Architecture - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Storage Architecture

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/ayu-highlight.css b/docs/book/ayu-highlight.css new file mode 100644 index 0000000..32c9432 --- /dev/null +++ b/docs/book/ayu-highlight.css @@ -0,0 +1,78 @@ +/* +Based off of the Ayu theme +Original by Dempfi (https://github.com/dempfi/ayu) +*/ + +.hljs { + display: block; + overflow-x: auto; + background: #191f26; + color: #e6e1cf; +} + +.hljs-comment, +.hljs-quote { + color: #5c6773; + font-style: italic; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-regexp, +.hljs-link, +.hljs-selector-id, +.hljs-selector-class { + color: #ff7733; +} + +.hljs-number, +.hljs-meta, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ffee99; +} + +.hljs-string, +.hljs-bullet { + color: #b8cc52; +} + +.hljs-title, +.hljs-built_in, +.hljs-section { + color: #ffb454; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-symbol { + color: #ff7733; +} + +.hljs-name { + color: #36a3d9; +} + +.hljs-tag { + color: #00568d; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #91b362; +} + +.hljs-deletion { + color: #d96c75; +} diff --git a/docs/book/book.js b/docs/book/book.js new file mode 100644 index 0000000..5df2096 --- /dev/null +++ b/docs/book/book.js @@ -0,0 +1,818 @@ +'use strict'; + +/* global default_theme, default_dark_theme, default_light_theme, hljs, ClipboardJS */ + +// Fix back button cache problem +window.onunload = function() { }; + +// Global variable, shared between modules +function playground_text(playground, hidden = true) { + const code_block = playground.querySelector('code'); + + if (window.ace && code_block.classList.contains('editable')) { + const editor = window.ace.edit(code_block); + return editor.getValue(); + } else if (hidden) { + return code_block.textContent; + } else { + return code_block.innerText; + } +} + +(function codeSnippets() { + function fetch_with_timeout(url, options, timeout = 6000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)), + ]); + } + + const playgrounds = Array.from(document.querySelectorAll('.playground')); + if (playgrounds.length > 0) { + fetch_with_timeout('https://play.rust-lang.org/meta/crates', { + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + mode: 'cors', + }) + .then(response => response.json()) + .then(response => { + // get list of crates available in the rust playground + const playground_crates = response.crates.map(item => item['id']); + playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); + }); + } + + function handle_crate_list_update(playground_block, playground_crates) { + // update the play buttons after receiving the response + update_play_button(playground_block, playground_crates); + + // and install on change listener to dynamically update ACE editors + if (window.ace) { + const code_block = playground_block.querySelector('code'); + if (code_block.classList.contains('editable')) { + const editor = window.ace.edit(code_block); + editor.addEventListener('change', () => { + update_play_button(playground_block, playground_crates); + }); + // add Ctrl-Enter command to execute rust code + editor.commands.addCommand({ + name: 'run', + bindKey: { + win: 'Ctrl-Enter', + mac: 'Ctrl-Enter', + }, + exec: _editor => run_rust_code(playground_block), + }); + } + } + } + + // updates the visibility of play button based on `no_run` class and + // used crates vs ones available on https://play.rust-lang.org + function update_play_button(pre_block, playground_crates) { + const play_button = pre_block.querySelector('.play-button'); + + // skip if code is `no_run` + if (pre_block.querySelector('code').classList.contains('no_run')) { + play_button.classList.add('hidden'); + return; + } + + // get list of `extern crate`'s from snippet + const txt = playground_text(pre_block); + const re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; + const snippet_crates = []; + let item; + // eslint-disable-next-line no-cond-assign + while (item = re.exec(txt)) { + snippet_crates.push(item[1]); + } + + // check if all used crates are available on play.rust-lang.org + const all_available = snippet_crates.every(function(elem) { + return playground_crates.indexOf(elem) > -1; + }); + + if (all_available) { + play_button.classList.remove('hidden'); + } else { + play_button.classList.add('hidden'); + } + } + + function run_rust_code(code_block) { + let result_block = code_block.querySelector('.result'); + if (!result_block) { + result_block = document.createElement('code'); + result_block.className = 'result hljs language-bash'; + + code_block.append(result_block); + } + + const text = playground_text(code_block); + const classes = code_block.querySelector('code').classList; + let edition = '2015'; + classes.forEach(className => { + if (className.startsWith('edition')) { + edition = className.slice(7); + } + }); + const params = { + version: 'stable', + optimize: '0', + code: text, + edition: edition, + }; + + if (text.indexOf('#![feature') !== -1) { + params.version = 'nightly'; + } + + result_block.innerText = 'Running...'; + + fetch_with_timeout('https://play.rust-lang.org/evaluate.json', { + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + mode: 'cors', + body: JSON.stringify(params), + }) + .then(response => response.json()) + .then(response => { + if (response.result.trim() === '') { + result_block.innerText = 'No output'; + result_block.classList.add('result-no-output'); + } else { + result_block.innerText = response.result; + result_block.classList.remove('result-no-output'); + } + }) + .catch(error => result_block.innerText = 'Playground Communication: ' + error.message); + } + + // Syntax highlighting Configuration + hljs.configure({ + tabReplace: ' ', // 4 spaces + languages: [], // Languages used for auto-detection + }); + + const code_nodes = Array + .from(document.querySelectorAll('code')) + // Don't highlight `inline code` blocks in headers. + .filter(function(node) { + return !node.parentElement.classList.contains('header'); + }); + + if (window.ace) { + // language-rust class needs to be removed for editable + // blocks or highlightjs will capture events + code_nodes + .filter(function(node) { + return node.classList.contains('editable'); + }) + .forEach(function(block) { + block.classList.remove('language-rust'); + }); + + code_nodes + .filter(function(node) { + return !node.classList.contains('editable'); + }) + .forEach(function(block) { + hljs.highlightBlock(block); + }); + } else { + code_nodes.forEach(function(block) { + hljs.highlightBlock(block); + }); + } + + // Adding the hljs class gives code blocks the color css + // even if highlighting doesn't apply + code_nodes.forEach(function(block) { + block.classList.add('hljs'); + }); + + Array.from(document.querySelectorAll('code.hljs')).forEach(function(block) { + + const lines = Array.from(block.querySelectorAll('.boring')); + // If no lines were hidden, return + if (!lines.length) { + return; + } + block.classList.add('hide-boring'); + + const buttons = document.createElement('div'); + buttons.className = 'buttons'; + buttons.innerHTML = ''; + + // add expand button + const pre_block = block.parentNode; + pre_block.insertBefore(buttons, pre_block.firstChild); + + pre_block.querySelector('.buttons').addEventListener('click', function(e) { + if (e.target.classList.contains('fa-eye')) { + e.target.classList.remove('fa-eye'); + e.target.classList.add('fa-eye-slash'); + e.target.title = 'Hide lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.remove('hide-boring'); + } else if (e.target.classList.contains('fa-eye-slash')) { + e.target.classList.remove('fa-eye-slash'); + e.target.classList.add('fa-eye'); + e.target.title = 'Show hidden lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.add('hide-boring'); + } + }); + }); + + if (window.playground_copyable) { + Array.from(document.querySelectorAll('pre code')).forEach(function(block) { + const pre_block = block.parentNode; + if (!pre_block.classList.contains('playground')) { + let buttons = pre_block.querySelector('.buttons'); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + const clipButton = document.createElement('button'); + clipButton.className = 'clip-button'; + clipButton.title = 'Copy to clipboard'; + clipButton.setAttribute('aria-label', clipButton.title); + clipButton.innerHTML = ''; + + buttons.insertBefore(clipButton, buttons.firstChild); + } + }); + } + + // Process playground code blocks + Array.from(document.querySelectorAll('.playground')).forEach(function(pre_block) { + // Add play button + let buttons = pre_block.querySelector('.buttons'); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + const runCodeButton = document.createElement('button'); + runCodeButton.className = 'fa fa-play play-button'; + runCodeButton.hidden = true; + runCodeButton.title = 'Run this code'; + runCodeButton.setAttribute('aria-label', runCodeButton.title); + + buttons.insertBefore(runCodeButton, buttons.firstChild); + runCodeButton.addEventListener('click', () => { + run_rust_code(pre_block); + }); + + if (window.playground_copyable) { + const copyCodeClipboardButton = document.createElement('button'); + copyCodeClipboardButton.className = 'clip-button'; + copyCodeClipboardButton.innerHTML = ''; + copyCodeClipboardButton.title = 'Copy to clipboard'; + copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); + + buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); + } + + const code_block = pre_block.querySelector('code'); + if (window.ace && code_block.classList.contains('editable')) { + const undoChangesButton = document.createElement('button'); + undoChangesButton.className = 'fa fa-history reset-button'; + undoChangesButton.title = 'Undo changes'; + undoChangesButton.setAttribute('aria-label', undoChangesButton.title); + + buttons.insertBefore(undoChangesButton, buttons.firstChild); + + undoChangesButton.addEventListener('click', function() { + const editor = window.ace.edit(code_block); + editor.setValue(editor.originalCode); + editor.clearSelection(); + }); + } + }); +})(); + +(function themes() { + const html = document.querySelector('html'); + const themeToggleButton = document.getElementById('theme-toggle'); + const themePopup = document.getElementById('theme-list'); + const themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); + const themeIds = []; + themePopup.querySelectorAll('button.theme').forEach(function(el) { + themeIds.push(el.id); + }); + const stylesheets = { + ayuHighlight: document.querySelector('#ayu-highlight-css'), + tomorrowNight: document.querySelector('#tomorrow-night-css'), + highlight: document.querySelector('#highlight-css'), + }; + + function showThemes() { + themePopup.style.display = 'block'; + themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector('button#' + get_theme()).focus(); + } + + function updateThemeSelected() { + themePopup.querySelectorAll('.theme-selected').forEach(function(el) { + el.classList.remove('theme-selected'); + }); + const selected = get_saved_theme() ?? 'default_theme'; + let element = themePopup.querySelector('button#' + selected); + if (element === null) { + // Fall back in case there is no "Default" item. + element = themePopup.querySelector('button#' + get_theme()); + } + element.classList.add('theme-selected'); + } + + function hideThemes() { + themePopup.style.display = 'none'; + themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); + } + + function get_saved_theme() { + let theme = null; + try { + theme = localStorage.getItem('mdbook-theme'); + } catch (e) { + // ignore error. + } + return theme; + } + + function delete_saved_theme() { + localStorage.removeItem('mdbook-theme'); + } + + function get_theme() { + const theme = get_saved_theme(); + if (theme === null || theme === undefined || !themeIds.includes(theme)) { + if (typeof default_dark_theme === 'undefined') { + // A customized index.hbs might not define this, so fall back to + // old behavior of determining the default on page load. + return default_theme; + } + return window.matchMedia('(prefers-color-scheme: dark)').matches + ? default_dark_theme + : default_light_theme; + } else { + return theme; + } + } + + let previousTheme = default_theme; + function set_theme(theme, store = true) { + let ace_theme; + + if (theme === 'coal' || theme === 'navy') { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = false; + stylesheets.highlight.disabled = true; + + ace_theme = 'ace/theme/tomorrow_night'; + } else if (theme === 'ayu') { + stylesheets.ayuHighlight.disabled = false; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = true; + ace_theme = 'ace/theme/tomorrow_night'; + } else { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = false; + ace_theme = 'ace/theme/dawn'; + } + + setTimeout(function() { + themeColorMetaTag.content = getComputedStyle(document.documentElement).backgroundColor; + }, 1); + + if (window.ace && window.editors) { + window.editors.forEach(function(editor) { + editor.setTheme(ace_theme); + }); + } + + if (store) { + try { + localStorage.setItem('mdbook-theme', theme); + } catch (e) { + // ignore error. + } + } + + html.classList.remove(previousTheme); + html.classList.add(theme); + previousTheme = theme; + updateThemeSelected(); + } + + const query = window.matchMedia('(prefers-color-scheme: dark)'); + query.onchange = function() { + set_theme(get_theme(), false); + }; + + // Set theme. + set_theme(get_theme(), false); + + themeToggleButton.addEventListener('click', function() { + if (themePopup.style.display === 'block') { + hideThemes(); + } else { + showThemes(); + } + }); + + themePopup.addEventListener('click', function(e) { + let theme; + if (e.target.className === 'theme') { + theme = e.target.id; + } else if (e.target.parentElement.className === 'theme') { + theme = e.target.parentElement.id; + } else { + return; + } + if (theme === 'default_theme' || theme === null) { + delete_saved_theme(); + set_theme(get_theme(), false); + } else { + set_theme(theme); + } + }); + + themePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && + !themeToggleButton.contains(e.relatedTarget) && + !themePopup.contains(e.relatedTarget) + ) { + hideThemes(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: + // https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (themePopup.style.display === 'block' && + !themeToggleButton.contains(e.target) && + !themePopup.contains(e.target) + ) { + hideThemes(); + } + }); + + document.addEventListener('keydown', function(e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { + return; + } + if (!themePopup.contains(e.target)) { + return; + } + + let li; + switch (e.key) { + case 'Escape': + e.preventDefault(); + hideThemes(); + break; + case 'ArrowUp': + e.preventDefault(); + li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; + } + }); +})(); + +(function sidebar() { + const body = document.querySelector('body'); + const sidebar = document.getElementById('sidebar'); + const sidebarLinks = document.querySelectorAll('#sidebar a'); + const sidebarToggleButton = document.getElementById('sidebar-toggle'); + const sidebarToggleAnchor = document.getElementById('sidebar-toggle-anchor'); + const sidebarResizeHandle = document.getElementById('sidebar-resize-handle'); + let firstContact = null; + + function showSidebar() { + body.classList.remove('sidebar-hidden'); + body.classList.add('sidebar-visible'); + Array.from(sidebarLinks).forEach(function(link) { + link.setAttribute('tabIndex', 0); + }); + sidebarToggleButton.setAttribute('aria-expanded', true); + sidebar.setAttribute('aria-hidden', false); + try { + localStorage.setItem('mdbook-sidebar', 'visible'); + } catch (e) { + // Ignore error. + } + } + + function hideSidebar() { + body.classList.remove('sidebar-visible'); + body.classList.add('sidebar-hidden'); + Array.from(sidebarLinks).forEach(function(link) { + link.setAttribute('tabIndex', -1); + }); + sidebarToggleButton.setAttribute('aria-expanded', false); + sidebar.setAttribute('aria-hidden', true); + try { + localStorage.setItem('mdbook-sidebar', 'hidden'); + } catch (e) { + // Ignore error. + } + } + + // Toggle sidebar + sidebarToggleAnchor.addEventListener('change', function sidebarToggle() { + if (sidebarToggleAnchor.checked) { + const current_width = parseInt( + document.documentElement.style.getPropertyValue('--sidebar-target-width'), 10); + if (current_width < 150) { + document.documentElement.style.setProperty('--sidebar-target-width', '150px'); + } + showSidebar(); + } else { + hideSidebar(); + } + }); + + sidebarResizeHandle.addEventListener('mousedown', initResize, false); + + function initResize() { + window.addEventListener('mousemove', resize, false); + window.addEventListener('mouseup', stopResize, false); + body.classList.add('sidebar-resizing'); + } + function resize(e) { + let pos = e.clientX - sidebar.offsetLeft; + if (pos < 20) { + hideSidebar(); + } else { + if (body.classList.contains('sidebar-hidden')) { + showSidebar(); + } + pos = Math.min(pos, window.innerWidth - 100); + document.documentElement.style.setProperty('--sidebar-target-width', pos + 'px'); + } + } + //on mouseup remove windows functions mousemove & mouseup + function stopResize() { + body.classList.remove('sidebar-resizing'); + window.removeEventListener('mousemove', resize, false); + window.removeEventListener('mouseup', stopResize, false); + } + + document.addEventListener('touchstart', function(e) { + firstContact = { + x: e.touches[0].clientX, + time: Date.now(), + }; + }, { passive: true }); + + document.addEventListener('touchmove', function(e) { + if (!firstContact) { + return; + } + + const curX = e.touches[0].clientX; + const xDiff = curX - firstContact.x, + tDiff = Date.now() - firstContact.time; + + if (tDiff < 250 && Math.abs(xDiff) >= 150) { + if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) { + showSidebar(); + } else if (xDiff < 0 && curX < 300) { + hideSidebar(); + } + + firstContact = null; + } + }, { passive: true }); +})(); + +(function chapterNavigation() { + document.addEventListener('keydown', function(e) { + if (e.altKey || e.ctrlKey || e.metaKey) { + return; + } + if (window.search && window.search.hasFocus()) { + return; + } + const html = document.querySelector('html'); + + function next() { + const nextButton = document.querySelector('.nav-chapters.next'); + if (nextButton) { + window.location.href = nextButton.href; + } + } + function prev() { + const previousButton = document.querySelector('.nav-chapters.previous'); + if (previousButton) { + window.location.href = previousButton.href; + } + } + function showHelp() { + const container = document.getElementById('mdbook-help-container'); + const overlay = document.getElementById('mdbook-help-popup'); + container.style.display = 'flex'; + + // Clicking outside the popup will dismiss it. + const mouseHandler = event => { + if (overlay.contains(event.target)) { + return; + } + if (event.button !== 0) { + return; + } + event.preventDefault(); + event.stopPropagation(); + document.removeEventListener('mousedown', mouseHandler); + hideHelp(); + }; + + // Pressing esc will dismiss the popup. + const escapeKeyHandler = event => { + if (event.key === 'Escape') { + event.preventDefault(); + event.stopPropagation(); + document.removeEventListener('keydown', escapeKeyHandler, true); + hideHelp(); + } + }; + document.addEventListener('keydown', escapeKeyHandler, true); + document.getElementById('mdbook-help-container') + .addEventListener('mousedown', mouseHandler); + } + function hideHelp() { + document.getElementById('mdbook-help-container').style.display = 'none'; + } + + // Usually needs the Shift key to be pressed + switch (e.key) { + case '?': + e.preventDefault(); + showHelp(); + break; + } + + // Rest of the keys are only active when the Shift key is not pressed + if (e.shiftKey) { + return; + } + + switch (e.key) { + case 'ArrowRight': + e.preventDefault(); + if (html.dir === 'rtl') { + prev(); + } else { + next(); + } + break; + case 'ArrowLeft': + e.preventDefault(); + if (html.dir === 'rtl') { + next(); + } else { + prev(); + } + break; + } + }); +})(); + +(function clipboard() { + const clipButtons = document.querySelectorAll('.clip-button'); + + function hideTooltip(elem) { + elem.firstChild.innerText = ''; + elem.className = 'clip-button'; + } + + function showTooltip(elem, msg) { + elem.firstChild.innerText = msg; + elem.className = 'clip-button tooltipped'; + } + + const clipboardSnippets = new ClipboardJS('.clip-button', { + text: function(trigger) { + hideTooltip(trigger); + const playground = trigger.closest('pre'); + return playground_text(playground, false); + }, + }); + + Array.from(clipButtons).forEach(function(clipButton) { + clipButton.addEventListener('mouseout', function(e) { + hideTooltip(e.currentTarget); + }); + }); + + clipboardSnippets.on('success', function(e) { + e.clearSelection(); + showTooltip(e.trigger, 'Copied!'); + }); + + clipboardSnippets.on('error', function(e) { + showTooltip(e.trigger, 'Clipboard error!'); + }); +})(); + +(function scrollToTop() { + const menuTitle = document.querySelector('.menu-title'); + + menuTitle.addEventListener('click', function() { + document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); + }); +})(); + +(function controllMenu() { + const menu = document.getElementById('menu-bar'); + + (function controllPosition() { + let scrollTop = document.scrollingElement.scrollTop; + let prevScrollTop = scrollTop; + const minMenuY = -menu.clientHeight - 50; + // When the script loads, the page can be at any scroll (e.g. if you reforesh it). + menu.style.top = scrollTop + 'px'; + // Same as parseInt(menu.style.top.slice(0, -2), but faster + let topCache = menu.style.top.slice(0, -2); + menu.classList.remove('sticky'); + let stickyCache = false; // Same as menu.classList.contains('sticky'), but faster + document.addEventListener('scroll', function() { + scrollTop = Math.max(document.scrollingElement.scrollTop, 0); + // `null` means that it doesn't need to be updated + let nextSticky = null; + let nextTop = null; + const scrollDown = scrollTop > prevScrollTop; + const menuPosAbsoluteY = topCache - scrollTop; + if (scrollDown) { + nextSticky = false; + if (menuPosAbsoluteY > 0) { + nextTop = prevScrollTop; + } + } else { + if (menuPosAbsoluteY > 0) { + nextSticky = true; + } else if (menuPosAbsoluteY < minMenuY) { + nextTop = prevScrollTop + minMenuY; + } + } + if (nextSticky === true && stickyCache === false) { + menu.classList.add('sticky'); + stickyCache = true; + } else if (nextSticky === false && stickyCache === true) { + menu.classList.remove('sticky'); + stickyCache = false; + } + if (nextTop !== null) { + menu.style.top = nextTop + 'px'; + topCache = nextTop; + } + prevScrollTop = scrollTop; + }, { passive: true }); + })(); + (function controllBorder() { + function updateBorder() { + if (menu.offsetTop === 0) { + menu.classList.remove('bordered'); + } else { + menu.classList.add('bordered'); + } + } + updateBorder(); + document.addEventListener('scroll', updateBorder, { passive: true }); + })(); +})(); diff --git a/docs/book/book.toml b/docs/book/book.toml new file mode 100644 index 0000000..401b311 --- /dev/null +++ b/docs/book/book.toml @@ -0,0 +1,38 @@ +[book] +title = "KOGRAL Documentation" +authors = ["KOGRAL Team"] +description = "Complete documentation for KOGRAL - Git-native knowledge graphs for developer teams" +language = "en" +multilingual = false +src = "." + +[build] +build-dir = "book" +create-missing = true + +[output.html] +default-theme = "rust" +preferred-dark-theme = "navy" +git-repository-url = "https://github.com/your-org/knowledge-base" +edit-url-template = "https://github.com/your-org/knowledge-base/edit/main/docs/{path}" + +[output.html.print] +enable = true + +[output.html.fold] +enable = true +level = 1 + +[output.html.search] +enable = true +limit-results = 30 +teaser-word-count = 30 +use-boolean-and = true +boost-title = 2 +boost-hierarchy = 1 +boost-paragraph = 1 +expand = true +heading-split-level = 3 + +[preprocessor.links] +[preprocessor.index] diff --git a/docs/book/cli/commands.html b/docs/book/cli/commands.html new file mode 100644 index 0000000..b93bb4f --- /dev/null +++ b/docs/book/cli/commands.html @@ -0,0 +1,227 @@ + + + + + + Commands Reference - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Commands Reference

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/cli/overview.html b/docs/book/cli/overview.html new file mode 100644 index 0000000..e4fcb44 --- /dev/null +++ b/docs/book/cli/overview.html @@ -0,0 +1,227 @@ + + + + + + CLI Overview - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

CLI Overview

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/cli/workflows.html b/docs/book/cli/workflows.html new file mode 100644 index 0000000..cc558b0 --- /dev/null +++ b/docs/book/cli/workflows.html @@ -0,0 +1,227 @@ + + + + + + Workflows - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Workflows

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/clipboard.min.js b/docs/book/clipboard.min.js new file mode 100644 index 0000000..02c549e --- /dev/null +++ b/docs/book/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.4 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n + + + + + Examples - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Examples

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/config/graph-settings.html b/docs/book/config/graph-settings.html new file mode 100644 index 0000000..eb492de --- /dev/null +++ b/docs/book/config/graph-settings.html @@ -0,0 +1,227 @@ + + + + + + Graph Settings - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Graph Settings

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/config/inheritance.html b/docs/book/config/inheritance.html new file mode 100644 index 0000000..eb296bd --- /dev/null +++ b/docs/book/config/inheritance.html @@ -0,0 +1,227 @@ + + + + + + Inheritance - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Inheritance

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/config/nickel-schemas.html b/docs/book/config/nickel-schemas.html new file mode 100644 index 0000000..60e6fb8 --- /dev/null +++ b/docs/book/config/nickel-schemas.html @@ -0,0 +1,227 @@ + + + + + + Nickel Schemas - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Nickel Schemas

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/config/overview.html b/docs/book/config/overview.html new file mode 100644 index 0000000..f4d0366 --- /dev/null +++ b/docs/book/config/overview.html @@ -0,0 +1,227 @@ + + + + + + Configuration Overview - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Configuration Overview

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/contributing/development.html b/docs/book/contributing/development.html new file mode 100644 index 0000000..7757908 --- /dev/null +++ b/docs/book/contributing/development.html @@ -0,0 +1,227 @@ + + + + + + Development Setup - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Development Setup

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/contributing/standards.html b/docs/book/contributing/standards.html new file mode 100644 index 0000000..d04f9ba --- /dev/null +++ b/docs/book/contributing/standards.html @@ -0,0 +1,227 @@ + + + + + + Code Standards - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Code Standards

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/contributing/testing.html b/docs/book/contributing/testing.html new file mode 100644 index 0000000..40763d2 --- /dev/null +++ b/docs/book/contributing/testing.html @@ -0,0 +1,221 @@ + + + + + + Testing - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Testing

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/css/chrome.css b/docs/book/css/chrome.css new file mode 100644 index 0000000..360a653 --- /dev/null +++ b/docs/book/css/chrome.css @@ -0,0 +1,701 @@ +/* CSS for UI elements (a.k.a. chrome) */ + +html { + scrollbar-color: var(--scrollbar) var(--bg); +} +#searchresults a, +.content a:link, +a:visited, +a > .hljs { + color: var(--links); +} + +/* + body-container is necessary because mobile browsers don't seem to like + overflow-x on the body tag when there is a tag. +*/ +#body-container { + /* + This is used when the sidebar pushes the body content off the side of + the screen on small screens. Without it, dragging on mobile Safari + will want to reposition the viewport in a weird way. + */ + overflow-x: clip; +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-block-end-color: var(--bg); + border-block-end-width: 1px; + border-block-end-style: solid; +} +#menu-bar.sticky, +#menu-bar-hover-placeholder:hover + #menu-bar, +#menu-bar:hover, +html.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-block-end-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +.icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +.icon-button i { + margin: 0; +} + +.right-buttons { + margin: 0 15px; +} +.right-buttons a { + text-decoration: none; +} + +.left-buttons { + display: flex; + margin: 0 5px; +} +html:not(.js) .left-buttons button { + display: none; +} + +.menu-title { + display: inline-block; + font-weight: 200; + font-size: 2.4rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.menu-title { + cursor: pointer; +} + +.menu-bar, +.menu-bar:visited, +.nav-chapters, +.nav-chapters:visited, +.mobile-nav-chapters, +.mobile-nav-chapters:visited, +.menu-bar .icon-button, +.menu-bar a i { + color: var(--icons); +} + +.menu-bar i:hover, +.menu-bar .icon-button:hover, +.nav-chapters:hover, +.mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +.nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: fixed; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +.nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +.nav-wrapper { + margin-block-start: 50px; + display: none; +} + +.mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +/* Only Firefox supports flow-relative values */ +.previous { float: left; } +[dir=rtl] .previous { float: right; } + +/* Only Firefox supports flow-relative values */ +.next { + float: right; + right: var(--page-padding); +} +[dir=rtl] .next { + float: left; + right: unset; + left: var(--page-padding); +} + +/* Use the correct buttons for RTL layouts*/ +[dir=rtl] .previous i.fa-angle-left:before {content:"\f105";} +[dir=rtl] .next i.fa-angle-right:before { content:"\f104"; } + +@media only screen and (max-width: 1080px) { + .nav-wide-wrapper { display: none; } + .nav-wrapper { display: block; } +} + +/* sidebar-visible */ +@media only screen and (max-width: 1380px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; } + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; } +} + +/* Inline code */ + +:not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +:not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +a:hover > .hljs { + text-decoration: underline; +} + +pre { + position: relative; +} +pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +pre > .buttons i { + margin-inline-start: 8px; +} +pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 4px 4px 3px 5px; + font-size: 23px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} + +pre > .buttons button.clip-button { + padding: 2px 4px 0px 6px; +} +pre > .buttons button.clip-button::before { + /* clipboard image from octicons (https://github.com/primer/octicons/tree/v2.0.0) MIT license + */ + content: url('data:image/svg+xml,\ +\ +\ +'); + filter: var(--copy-button-filter); +} +pre > .buttons button.clip-button:hover::before { + filter: var(--copy-button-filter-hover); +} + +@media (pointer: coarse) { + pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } + + .sidebar-resize-indicator { + /* Hide resize indicator on devices with limited accuracy */ + display: none; + } +} +pre > code { + display: block; + padding: 1rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +.hljs.ace_editor { + padding: 0rem 0rem; +} + +pre > .result { + margin-block-start: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +mark { + border-radius: 2px; + padding-block-start: 0; + padding-block-end: 1px; + padding-inline-start: 3px; + padding-inline-end: 3px; + margin-block-start: 0; + margin-block-end: -1px; + margin-inline-start: -3px; + margin-inline-end: -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +.searchbar-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: auto; + margin-inline-end: auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +.searchresults-header { + font-weight: bold; + font-size: 1em; + padding-block-start: 18px; + padding-block-end: 0; + padding-inline-start: 5px; + padding-inline-end: 0; + color: var(--searchresults-header-fg); +} + +.searchresults-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); + border-block-end: 1px dashed var(--searchresults-border-color); +} + +ul#searchresults { + list-style: none; + padding-inline-start: 20px; +} +ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +ul#searchresults span.teaser { + display: block; + clear: both; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: 20px; + margin-inline-end: 0; + font-size: 0.8em; +} +ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ + +.sidebar { + position: fixed; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +.sidebar-iframe-inner { + --padding: 10px; + + background-color: var(--sidebar-bg); + padding: var(--padding); + margin: 0; + font-size: 1.4rem; + color: var(--sidebar-fg); + min-height: calc(100vh - var(--padding) * 2); +} +.sidebar-iframe-outer { + border: none; + height: 100%; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} +[dir=rtl] .sidebar { left: unset; right: 0; } +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +html:not(.sidebar-resizing) .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +.sidebar code { + line-height: 2em; +} +.sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +.sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: calc(var(--sidebar-resize-indicator-width) * -1); + top: 0; + bottom: 0; + display: flex; + align-items: center; +} + +.sidebar-resize-handle .sidebar-resize-indicator { + width: 100%; + height: 16px; + color: var(--icons); + margin-inline-start: var(--sidebar-resize-indicator-space); + display: flex; + align-items: center; + justify-content: flex-start; +} +.sidebar-resize-handle .sidebar-resize-indicator::before { + content: ""; + width: 2px; + height: 12px; + border-left: dotted 2px currentColor; +} +.sidebar-resize-handle .sidebar-resize-indicator::after { + content: ""; + width: 2px; + height: 16px; + border-left: dotted 2px currentColor; +} + +[dir=rtl] .sidebar .sidebar-resize-handle { + left: calc(var(--sidebar-resize-indicator-width) * -1); + right: unset; +} +.js .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space)); +} +/* sidebar-hidden */ +#sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); + z-index: -1; +} +[dir=rtl] #sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +.sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +.sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +/* sidebar-visible */ +#sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +[dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); +} +@media only screen and (min-width: 620px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)); + } + [dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + } +} + +.chapter { + list-style: none outside none; + padding-inline-start: 0; + line-height: 2.2em; +} + +.chapter ol { + width: 100%; +} + +.chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +.chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +.chapter li a:hover { + color: var(--sidebar-active); +} + +.chapter li a.active { + color: var(--sidebar-active); +} + +.chapter li > a.toggle { + cursor: pointer; + display: block; + margin-inline-start: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +.chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +.chapter li:not(.expanded) + li > ol { + display: none; +} + +.chapter li.chapter-item { + line-height: 1.5em; + margin-block-start: 0.6em; +} + +.chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +.spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +.chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + .chapter li a { padding: 5px 0; } + .spacer { margin: 10px 0; } +} + +.section { + list-style: none outside none; + padding-inline-start: 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +.theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; + /* Don't let the children's background extend past the rounded corners. */ + overflow: hidden; +} +[dir=rtl] .theme-popup { left: unset; right: 10px; } +.theme-popup .default { + color: var(--icons); +} +.theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 20px; + line-height: 25px; + white-space: nowrap; + text-align: start; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +.theme-popup .theme:hover { + background-color: var(--theme-hover); +} + +.theme-selected::before { + display: inline-block; + content: "✓"; + margin-inline-start: -14px; + width: 14px; +} + +/* The container for the help popup that covers the whole window. */ +#mdbook-help-container { + /* Position and size for the whole window. */ + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + /* This uses flex layout (which is set in book.js), and centers the popup + in the window.*/ + display: none; + align-items: center; + justify-content: center; + z-index: 1000; + /* Dim out the book while the popup is visible. */ + background: var(--overlay-bg); +} + +/* The popup help box. */ +#mdbook-help-popup { + box-shadow: 0 4px 24px rgba(0,0,0,0.15); + min-width: 300px; + max-width: 500px; + width: 100%; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: center; + background-color: var(--bg); + color: var(--fg); + border-width: 1px; + border-color: var(--theme-popup-border); + border-style: solid; + border-radius: 8px; + padding: 10px; +} + +.mdbook-help-title { + text-align: center; + /* mdbook's margin for h2 is way too large. */ + margin: 10px; +} diff --git a/docs/book/css/general.css b/docs/book/css/general.css new file mode 100644 index 0000000..9946cfc --- /dev/null +++ b/docs/book/css/general.css @@ -0,0 +1,279 @@ +/* Base styles and content styles */ + +:root { + /* Browser default font-size is 16px, this way 1 rem = 10px */ + font-size: 62.5%; + color-scheme: var(--color-scheme); +} + +html { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; +} + +body { + margin: 0; + font-size: 1.6rem; + overflow-x: hidden; +} + +code { + font-family: var(--mono-font) !important; + font-size: var(--code-font-size); + direction: ltr !important; +} + +/* make long words/inline code not x overflow */ +main { + overflow-wrap: break-word; +} + +/* make wide tables scroll if they overflow */ +.table-wrapper { + overflow-x: auto; +} + +/* Don't change font size in headers. */ +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + font-size: unset; +} + +.left { float: left; } +.right { float: right; } +.boring { opacity: 0.6; } +.hide-boring .boring { display: none; } +.hidden { display: none !important; } + +h2, h3 { margin-block-start: 2.5em; } +h4, h5 { margin-block-start: 2em; } + +.header + .header h3, +.header + .header h4, +.header + .header h5 { + margin-block-start: 1em; +} + +h1:target::before, +h2:target::before, +h3:target::before, +h4:target::before, +h5:target::before, +h6:target::before { + display: inline-block; + content: "»"; + margin-inline-start: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + /* Safari does not support logical properties */ + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +.page { + outline: 0; + padding: 0 var(--page-padding); + margin-block-start: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +.page-wrapper { + box-sizing: border-box; + background-color: var(--bg); +} +.no-js .page-wrapper, +.js:not(.sidebar-resizing) .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} +[dir=rtl] .js:not(.sidebar-resizing) .page-wrapper { + transition: margin-right 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +.content { + overflow-y: auto; + padding: 0 5px 50px 5px; +} +.content main { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} +.content p { line-height: 1.45em; } +.content ol { line-height: 1.45em; } +.content ul { line-height: 1.45em; } +.content a { text-decoration: none; } +.content a:hover { text-decoration: underline; } +.content img, .content video { max-width: 100%; } +.content .header:link, +.content .header:visited { + color: var(--fg); +} +.content .header:link, +.content .header:visited:hover { + text-decoration: none; +} + +table { + margin: 0 auto; + border-collapse: collapse; +} +table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +table thead { + background: var(--table-header-bg); +} +table thead td { + font-weight: 700; + border: none; +} +table thead th { + padding: 3px 20px; +} +table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-block-start: .1em solid var(--quote-border); + border-block-end: .1em solid var(--quote-border); +} + +.warning { + margin: 20px; + padding: 0 20px; + border-inline-start: 2px solid var(--warning-border); +} + +.warning:before { + position: absolute; + width: 3rem; + height: 3rem; + margin-inline-start: calc(-1.5rem - 21px); + content: "ⓘ"; + text-align: center; + background-color: var(--bg); + color: var(--warning-border); + font-weight: bold; + font-size: 2rem; +} + +blockquote .warning:before { + background-color: var(--quote-bg); +} + +kbd { + background-color: var(--table-border-color); + border-radius: 4px; + border: solid 1px var(--theme-popup-border); + box-shadow: inset 0 -1px 0 var(--theme-hover); + display: inline-block; + font-size: var(--code-font-size); + font-family: var(--mono-font); + line-height: 10px; + padding: 4px 5px; + vertical-align: middle; +} + +sup { + /* Set the line-height for superscript and footnote references so that there + isn't an awkward space appearing above lines that contain the footnote. + + See https://github.com/rust-lang/mdBook/pull/2443#discussion_r1813773583 + for an explanation. + */ + line-height: 0; +} + +.footnote-definition { + font-size: 0.9em; +} +/* The default spacing for a list is a little too large. */ +.footnote-definition ul, +.footnote-definition ol { + padding-left: 20px; +} +.footnote-definition > li { + /* Required to position the ::before target */ + position: relative; +} +.footnote-definition > li:target { + scroll-margin-top: 50vh; +} +.footnote-reference:target { + scroll-margin-top: 50vh; +} +/* Draws a border around the footnote (including the marker) when it is selected. + TODO: If there are multiple linkbacks, highlight which one you just came + from so you know which one to click. +*/ +.footnote-definition > li:target::before { + border: 2px solid var(--footnote-highlight); + border-radius: 6px; + position: absolute; + top: -8px; + right: -8px; + bottom: -8px; + left: -32px; + pointer-events: none; + content: ""; +} +/* Pulses the footnote reference so you can quickly see where you left off reading. + This could use some improvement. +*/ +@media not (prefers-reduced-motion) { + .footnote-reference:target { + animation: fn-highlight 0.8s; + border-radius: 2px; + } + + @keyframes fn-highlight { + from { + background-color: var(--footnote-highlight); + } + } +} + +.tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +.tooltipped .tooltiptext { + visibility: visible; +} + +.chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} + +.result-no-output { + font-style: italic; +} diff --git a/docs/book/css/print.css b/docs/book/css/print.css new file mode 100644 index 0000000..80ec3a5 --- /dev/null +++ b/docs/book/css/print.css @@ -0,0 +1,50 @@ + +#sidebar, +#menu-bar, +.nav-chapters, +.mobile-nav-chapters { + display: none; +} + +#page-wrapper.page-wrapper { + transform: none !important; + margin-inline-start: 0px; + overflow-y: initial; +} + +#content { + max-width: none; + margin: 0; + padding: 0; +} + +.page { + overflow-y: initial; +} + +code { + direction: ltr !important; +} + +pre > .buttons { + z-index: 2; +} + +a, a:visited, a:active, a:hover { + color: #4183c4; + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +pre, code { + page-break-inside: avoid; + white-space: pre-wrap; +} + +.fa { + display: none !important; +} diff --git a/docs/book/css/variables.css b/docs/book/css/variables.css new file mode 100644 index 0000000..5742d24 --- /dev/null +++ b/docs/book/css/variables.css @@ -0,0 +1,330 @@ + +/* Globals */ + +:root { + --sidebar-target-width: 300px; + --sidebar-width: min(var(--sidebar-target-width), 80vw); + --sidebar-resize-indicator-width: 8px; + --sidebar-resize-indicator-space: 2px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; + --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; + --code-font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */ +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(45%) sepia(6%) saturate(621%) hue-rotate(198deg) brightness(99%) contrast(85%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(68%) sepia(55%) saturate(531%) hue-rotate(341deg) brightness(104%) contrast(101%); + + --footnote-highlight: #2668a6; + + --overlay-bg: rgba(33, 40, 48, 0.4); +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%); + + --footnote-highlight: #4079ae; + + --overlay-bg: rgba(33, 40, 48, 0.4); +} + +.light, html:not(.js) { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #20609f; + + --inline-code-color: #301900; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; + + --color-scheme: light; + + /* Same as `--icons` */ + --copy-button-filter: invert(45.49%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(14%) sepia(93%) saturate(4250%) hue-rotate(243deg) brightness(99%) contrast(130%); + + --footnote-highlight: #7e7eff; + + --overlay-bg: rgba(200, 200, 205, 0.4); +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(46%) sepia(20%) saturate(1537%) hue-rotate(156deg) brightness(85%) contrast(90%); + + --footnote-highlight: #4079ae; + + --overlay-bg: rgba(33, 40, 48, 0.4); +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; + + /* Same as `--icons` */ + --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(77%) sepia(16%) saturate(1798%) hue-rotate(328deg) brightness(98%) contrast(83%); + + --footnote-highlight: #d3a17a; + + --overlay-bg: rgba(150, 150, 150, 0.25); +} + +@media (prefers-color-scheme: dark) { + html:not(.js) { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%); + } +} diff --git a/docs/book/diagrams/architecture-overview.svg b/docs/book/diagrams/architecture-overview.svg new file mode 100644 index 0000000..1a7efb6 --- /dev/null +++ b/docs/book/diagrams/architecture-overview.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + Knowledge Base Architecture + + + + kogral-core (Rust Library) + + + + Config Layer + Nickel → JSON → KbConfig + + + + Storage Layer (Hybrid) + + FileSystem + + SurrealDB + + In-Memory + + + + Graph Engine + Nodes: Note, Decision, Guideline, Pattern, Journal, Execution + Edges: relates_to, depends_on, implements, extends, supersedes, explains + Multi-graph: local (project) + shared (central) + + + + Parser + Markdown + Frontmatter + + + Embeddings + rig-core + fastembed + + + Query + Text+Vector + Cross-graph + + + + kogral-mcp (MCP Server) + + Tools: + kogral/search, kogral/add_note, kogral/add_decision + kogral/link, kogral/get_guidelines, kogral/export + + Resources: + kogral://project/notes, kogral://project/decisions + kogral://shared/guidelines, kogral://shared/patterns + + Prompts: + kogral/summarize_project, kogral/find_related + + + + kogral-cli (Command Line) + + Commands: + init, add, search, link, sync + serve, graph, import, export + get-guidelines, list, show, stats + + Features: + Interactive prompts + Template-based document creation + Graph visualization + + + + NuShell Scripts & Plugins + + Scripts: + kogral-sync.nu, kogral-backup.nu, kogral-reindex.nu + + Plugins: + kogral-import-logseq.nu, kogral-stats.nu + + + + + + + + + + + JSON-RPC + Direct API + CLI invocation + + diff --git a/docs/book/diagrams/config-composition.svg b/docs/book/diagrams/config-composition.svg new file mode 100644 index 0000000..d665e80 --- /dev/null +++ b/docs/book/diagrams/config-composition.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + Configuration Composition Flow + Nickel Schema → Validated Config → Rust Struct + + + + Layer 1: Schema Contracts (Type Definitions) + + + schemas/contracts.ncl + KbConfig = { + graph | GraphConfig, + storage | StorageConfig, + + + Defines types: + StorageType = [| 'filesystem, + 'memory, 'surrealdb |] + + + + validates + + + + Layer 2: Default Values + + + schemas/defaults.ncl + base = { + storage = { primary = 'filesystem, secondary = { enabled = false } }, + embeddings = { provider = 'fastembed, model = "BAAI/bge-small-en-v1.5" }, + + + + base for + + + + Layer 3: Mode Overlay (Environment-Specific) + + + + modes/dev.ncl + storage = { + primary = 'filesystem, + secondary.enabled + = false + } + + + + modes/prod.ncl + storage = { + primary = 'filesystem, + secondary.enabled + = true + } + + + + modes/test.ncl + storage = { + primary = 'memory, + secondary.enabled + = false + } + + + + select one + + + + Layer 4: User Customization (Project-Specific) + + + .kogral-config/core/kogral.ncl + { graph = { name = "my-project" }, embeddings = { model = "custom-model" } } + + + + Composition (helpers.ncl) + merge_with_override(defaults, + mode_overlay, user_custom) + + + + + + + nickel export + + + + Exported JSON (.kogral-config/targets/kogral-core.json) + + + {"graph":{"name":"my-project"},"storage":{"primary":"filesystem"},...} + + + + serde deserialize + + + + Rust: KbConfig Struct + let config = KbConfig::from_file(".kogral-config/targets/kogral-core.json")?; + + diff --git a/docs/book/diagrams/core-concepts.svg b/docs/book/diagrams/core-concepts.svg new file mode 100644 index 0000000..4fb8d34 --- /dev/null +++ b/docs/book/diagrams/core-concepts.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + Knowledge Base: Node Types & Relationships + + + + Node Types + + + + Note + General knowledge, observations + Fields: title, content, tags + + + + Decision (ADR) + Architectural decisions + Fields: context, decision, consequences, status + + + + Guideline + Code standards, practices + Fields: language, category, rules, examples + + + + Pattern + Reusable solutions + Fields: problem, solution, context, forces + + + + Journal + Daily notes (auto-dated) + Fields: date, content, highlights + + + + Execution + Agent task records (from Vapora KG) + Fields: task_type, agent, outcome, duration + + + + Relationship Types (Edges) + + + + Error Handling + (Note) + + + Logging Best + Practices (Note) + + + Rust Error + Guidelines (Guideline) + + + + relates_to + + + + Result Pattern + (Pattern) + + + Error Handling + Rules (Guideline) + + + + depends_on + + + + Task: Fix Bug + (Execution) + + + Debugging + Pattern (Pattern) + + + + implements + + + + Project Rules + (Guideline) + + + Base Rust + Guidelines (Guideline) + + + + extends + + + + ADR-002 + (Decision) + + + ADR-001 + (Decision) + + + + supersedes + + + + Edge Types + • relates_to - Conceptual link + • depends_on - Required prerequisite + • implements - Concrete realization + • extends - Inherits + overrides + • supersedes - Replaces older version + + diff --git a/docs/book/diagrams/storage-architecture.svg b/docs/book/diagrams/storage-architecture.svg new file mode 100644 index 0000000..77c9952 --- /dev/null +++ b/docs/book/diagrams/storage-architecture.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + Hybrid Storage Architecture + Filesystem (git-friendly) + SurrealDB (scalable) + In-Memory (cache) + + + + Graph Engine (kogral-core) + Unified API: add_node, get_node, query + HashMap<String, Node> for O(1) access + Multi-graph: local (project) + shared (central) + + + + Storage Trait + trait Storage: save(), load(), delete(), list(), search() + Abstraction for all backends + + + + + + + + + Filesystem Storage + + Purpose: + • Git-friendly + • Human-readable + • Logseq compatible + + Format: + .kogral/notes/2026-01-17-topic.md + --- + id: note-123 + type: note + tags: [rust, architecture] + --- + # Title + Content with [[wikilinks]] + + Watch: + notify crate (file system events) + + + + SurrealDB Storage + + Purpose: + • Scalable queries + • Advanced graph operations + • Shared organizational knowledge + + Schema: + DEFINE TABLE node SCHEMAFULL; + DEFINE FIELD id ON node TYPE string; + DEFINE FIELD type ON node TYPE string; + DEFINE FIELD embedding ON node + TYPE array<number>; + + Features: + • Graph queries (RELATE) + • Vector search (embeddings) + • Full-text search + • Multi-tenancy (namespace/db) + + + + In-Memory Storage + + Purpose: + • Fast development + • Testing (ephemeral) + • Cache layer + + Implementation: + DashMap<String, Node> + Concurrent HashMap + + Features: + • O(1) access + • No persistence + • Thread-safe + • No setup required + + Use Cases: + • cargo test (test mode) + • Session cache + + + + + + + + + Sync Mechanism + Bidirectional sync + • File change → SurrealDB + • SurrealDB update → File + + + + sync + + + + 💡 Configured via .kogral-config/core/kogral.ncl: primary storage + optional secondary (SurrealDB) + sync settings + + diff --git a/docs/book/elasticlunr.min.js b/docs/book/elasticlunr.min.js new file mode 100644 index 0000000..94b20dd --- /dev/null +++ b/docs/book/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o + + + + diff --git a/docs/book/fonts/OPEN-SANS-LICENSE.txt b/docs/book/fonts/OPEN-SANS-LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/docs/book/fonts/OPEN-SANS-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/docs/book/fonts/SOURCE-CODE-PRO-LICENSE.txt b/docs/book/fonts/SOURCE-CODE-PRO-LICENSE.txt new file mode 100644 index 0000000..366206f --- /dev/null +++ b/docs/book/fonts/SOURCE-CODE-PRO-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/book/fonts/fonts.css b/docs/book/fonts/fonts.css new file mode 100644 index 0000000..698e1e1 --- /dev/null +++ b/docs/book/fonts/fonts.css @@ -0,0 +1,100 @@ +/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ +/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ + +/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), + url('../fonts/open-sans-v17-all-charsets-300.woff2') format('woff2'); +} + +/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300; + src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), + url('../fonts/open-sans-v17-all-charsets-300italic.woff2') format('woff2'); +} + +/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), + url('../fonts/open-sans-v17-all-charsets-regular.woff2') format('woff2'); +} + +/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), + url('../fonts/open-sans-v17-all-charsets-italic.woff2') format('woff2'); +} + +/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), + url('../fonts/open-sans-v17-all-charsets-600.woff2') format('woff2'); +} + +/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 600; + src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), + url('../fonts/open-sans-v17-all-charsets-600italic.woff2') format('woff2'); +} + +/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), + url('../fonts/open-sans-v17-all-charsets-700.woff2') format('woff2'); +} + +/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 700; + src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), + url('../fonts/open-sans-v17-all-charsets-700italic.woff2') format('woff2'); +} + +/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 800; + src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), + url('../fonts/open-sans-v17-all-charsets-800.woff2') format('woff2'); +} + +/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 800; + src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), + url('../fonts/open-sans-v17-all-charsets-800italic.woff2') format('woff2'); +} + +/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: url('../fonts/source-code-pro-v11-all-charsets-500.woff2') format('woff2'); +} diff --git a/docs/book/fonts/open-sans-v17-all-charsets-300.woff2 b/docs/book/fonts/open-sans-v17-all-charsets-300.woff2 new file mode 100644 index 0000000..9f51be3 Binary files /dev/null and b/docs/book/fonts/open-sans-v17-all-charsets-300.woff2 differ diff --git a/docs/book/fonts/open-sans-v17-all-charsets-300italic.woff2 b/docs/book/fonts/open-sans-v17-all-charsets-300italic.woff2 new file mode 100644 index 0000000..2f54544 Binary files /dev/null and b/docs/book/fonts/open-sans-v17-all-charsets-300italic.woff2 differ diff --git a/docs/book/fonts/open-sans-v17-all-charsets-600.woff2 b/docs/book/fonts/open-sans-v17-all-charsets-600.woff2 new file mode 100644 index 0000000..f503d55 Binary files /dev/null and b/docs/book/fonts/open-sans-v17-all-charsets-600.woff2 differ diff --git a/docs/book/fonts/open-sans-v17-all-charsets-600italic.woff2 b/docs/book/fonts/open-sans-v17-all-charsets-600italic.woff2 new file mode 100644 index 0000000..c99aabe Binary files /dev/null and b/docs/book/fonts/open-sans-v17-all-charsets-600italic.woff2 differ diff --git a/docs/book/fonts/open-sans-v17-all-charsets-700.woff2 b/docs/book/fonts/open-sans-v17-all-charsets-700.woff2 new file mode 100644 index 0000000..421a1ab Binary files /dev/null and b/docs/book/fonts/open-sans-v17-all-charsets-700.woff2 differ diff --git a/docs/book/fonts/open-sans-v17-all-charsets-700italic.woff2 b/docs/book/fonts/open-sans-v17-all-charsets-700italic.woff2 new file mode 100644 index 0000000..12ce3d2 Binary files /dev/null and b/docs/book/fonts/open-sans-v17-all-charsets-700italic.woff2 differ diff --git a/docs/book/fonts/open-sans-v17-all-charsets-800.woff2 b/docs/book/fonts/open-sans-v17-all-charsets-800.woff2 new file mode 100644 index 0000000..c94a223 Binary files /dev/null and b/docs/book/fonts/open-sans-v17-all-charsets-800.woff2 differ diff --git a/docs/book/fonts/open-sans-v17-all-charsets-800italic.woff2 b/docs/book/fonts/open-sans-v17-all-charsets-800italic.woff2 new file mode 100644 index 0000000..eed7d3c Binary files /dev/null and b/docs/book/fonts/open-sans-v17-all-charsets-800italic.woff2 differ diff --git a/docs/book/fonts/open-sans-v17-all-charsets-italic.woff2 b/docs/book/fonts/open-sans-v17-all-charsets-italic.woff2 new file mode 100644 index 0000000..398b68a Binary files /dev/null and b/docs/book/fonts/open-sans-v17-all-charsets-italic.woff2 differ diff --git a/docs/book/fonts/open-sans-v17-all-charsets-regular.woff2 b/docs/book/fonts/open-sans-v17-all-charsets-regular.woff2 new file mode 100644 index 0000000..8383e94 Binary files /dev/null and b/docs/book/fonts/open-sans-v17-all-charsets-regular.woff2 differ diff --git a/docs/book/fonts/source-code-pro-v11-all-charsets-500.woff2 b/docs/book/fonts/source-code-pro-v11-all-charsets-500.woff2 new file mode 100644 index 0000000..7222456 Binary files /dev/null and b/docs/book/fonts/source-code-pro-v11-all-charsets-500.woff2 differ diff --git a/docs/book/guides/best-practices.html b/docs/book/guides/best-practices.html new file mode 100644 index 0000000..e57afb9 --- /dev/null +++ b/docs/book/guides/best-practices.html @@ -0,0 +1,227 @@ + + + + + + Best Practices - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Best Practices

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/guides/daily-workflows.html b/docs/book/guides/daily-workflows.html new file mode 100644 index 0000000..1dbd4ec --- /dev/null +++ b/docs/book/guides/daily-workflows.html @@ -0,0 +1,227 @@ + + + + + + Daily Workflows - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Daily Workflows

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/guides/installation.html b/docs/book/guides/installation.html new file mode 100644 index 0000000..052f444 --- /dev/null +++ b/docs/book/guides/installation.html @@ -0,0 +1,510 @@ + + + + + + Installation - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Installation

+

This guide covers installing and setting up the KOGRAL.

+

Prerequisites

+

Required

+
    +
  • +

    Rust 1.70 or later

    +
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    +
    +
  • +
  • +

    Nickel CLI for configuration management

    +
    cargo install nickel-lang-cli
    +
    +
  • +
+

Optional

+
    +
  • +

    NuShell for maintenance scripts

    +
    cargo install nu
    +
    +
  • +
  • +

    SurrealDB for scalable storage backend

    +
    # macOS
    +brew install surrealdb/tap/surreal
    +
    +# Linux/Windows
    +curl -sSf https://install.surrealdb.com | sh
    +
    +
  • +
+

Installation Methods

+ +
# Clone the repository
+git clone <repository-url> knowledge-base
+cd knowledge-base
+
+# Build the workspace
+cargo build --release
+
+# Install CLI tool
+cargo install --path crates/kb-cli
+
+# Verify installation
+kb --version
+
+

Method 2: Build Specific Crates

+
# Build only kb-core library
+cargo build --package kb-core --release
+
+# Build only kb-cli
+cargo build --package kb-cli --release
+
+# Build only kogral-mcp server
+cargo build --package kb-mcp --release
+
+

Method 3: Build with Features

+
# Build with all features (filesystem + SurrealDB + fastembed)
+cargo build --workspace --all-features --release
+
+# Build with specific features
+cargo build --package kb-core --features "surrealdb,fastembed" --release
+
+

Feature Flags

+

kb-core supports optional features:

+
+ + + + +
FeatureDescriptionDefault
filesystemFilesystem storage backend✅ Yes
surrealdbSurrealDB storage backend❌ No
fastembedLocal embedding generation❌ No
fullAll features enabled❌ No
+
+

Example usage:

+
# Enable SurrealDB backend
+cargo build --features surrealdb
+
+# Enable all features
+cargo build --features full
+
+

Environment Setup

+

1. Initialize a Knowledge Base

+
# Navigate to your project
+cd /path/to/your/project
+
+# Initialize .kb directory
+kb init
+
+# Or initialize with custom name
+kb init --name "My Project" --description "Project knowledge base"
+
+

This creates:

+
your-project/
+└── .kogral/
+    ├── config.toml
+    ├── notes/
+    ├── decisions/
+    ├── guidelines/
+    ├── patterns/
+    └── journal/
+
+

2. Configure Nickel Schemas (Optional)

+

If you want advanced configuration:

+
# Copy default config
+cp /path/to/knowledge-base/config/defaults.ncl .kogral/config.ncl
+
+# Edit configuration
+$EDITOR .kogral/config.ncl
+
+# Export to TOML (for kb-cli compatibility)
+nickel export --format json .kogral/config.ncl | kb config import
+
+

3. Set Up Shared Knowledge Base (Optional)

+

For shared guidelines and patterns across projects:

+
# Create shared KB location
+mkdir -p ~/Tools/.kogral-shared
+cd ~/Tools/.kogral-shared
+
+# Initialize shared KB
+kb init --name "Shared Knowledge" --description "Cross-project guidelines"
+
+# Configure inheritance in project
+kb config set inheritance.base ~/Tools/.kogral-shared
+
+

Verify Installation

+

Test CLI

+
# Check version
+kb --version
+
+# Show help
+kb --help
+
+# Test initialization (dry-run)
+kb init --dry-run
+
+

Test MCP Server

+
# Start MCP server in test mode
+kb serve --transport stdio
+
+# In another terminal, test with echo
+echo '{"jsonrpc":"2.0","id":1,"method":"kogral/search","params":{"query":"test"}}' | kb serve
+
+

Run Tests

+
# Run all tests
+cargo test --workspace
+
+# Run integration tests
+cargo test --package kb-core --test '*'
+
+# Run with all features
+cargo test --workspace --all-features
+
+

SurrealDB Setup (Optional)

+

If using SurrealDB backend:

+

Start SurrealDB Server

+
# Start server
+surreal start --log trace --user root --pass root file://data.db
+
+# Or use memory backend for testing
+surreal start --log trace --user root --pass root memory
+
+

Configure kb-core

+

Edit .kogral/config.ncl:

+
{
+  storage = {
+    primary = 'filesystem,
+    secondary = {
+      enabled = true,
+      type = 'surrealdb,
+      url = "ws://localhost:8000",
+      namespace = "kb",
+      database = "default",
+      username = "root",
+      password = "root",
+    },
+  },
+}
+
+

Initialize Schema

+
# Run migration script
+nu scripts/kb-migrate.nu --target latest
+
+# Or manually import schema
+surreal import --conn ws://localhost:8000 --user root --pass root --ns kb --db default schema.surql
+
+

Embedding Provider Setup (Optional)

+

Local fastembed

+
# Build with fastembed feature
+cargo build --package kb-core --features fastembed
+
+# Models will be downloaded on first use
+
+

API Providers (OpenAI, Claude, Ollama)

+

Set environment variables:

+
# OpenAI
+export OPENAI_API_KEY="sk-..."
+
+# Claude (Anthropic)
+export ANTHROPIC_API_KEY="sk-ant-..."
+
+# Ollama (local)
+export OLLAMA_API_BASE="http://localhost:11434"
+
+

Configure provider in .kogral/config.ncl:

+
{
+  embeddings = {
+    enabled = true,
+    provider = 'openai,  # or 'claude, 'ollama, 'fastembed
+    model = "text-embedding-3-small",
+    api_key_env = "OPENAI_API_KEY",
+  },
+}
+
+

Claude Code Integration

+

To use kb-mcp with Claude Code:

+

1. Build MCP Server

+
cargo build --package kb-mcp --release
+
+

2. Configure Claude Code

+

Add to ~/.config/claude/config.json:

+
{
+  "mcpServers": {
+    "kogral-mcp": {
+      "command": "/path/to/knowledge-base/target/release/kb-mcp",
+      "args": ["serve"],
+      "env": {}
+    }
+  }
+}
+
+

3. Test Connection

+

Start Claude Code and verify:

+
> kb/search "test"
+
+

Troubleshooting

+

Nickel Not Found

+
# Verify nickel is installed
+nickel --version
+
+# If not, install
+cargo install nickel-lang-cli
+
+# Add cargo bin to PATH
+export PATH="$HOME/.cargo/bin:$PATH"
+
+

Compilation Errors

+
# Update Rust
+rustup update stable
+
+# Clean and rebuild
+cargo clean
+cargo build --workspace
+
+

SurrealDB Connection Failed

+
# Check SurrealDB is running
+curl http://localhost:8000/health
+
+# Start SurrealDB with correct settings
+surreal start --bind 0.0.0.0:8000 --user root --pass root memory
+
+

MCP Server Not Responding

+
# Test stdio communication
+echo '{"jsonrpc":"2.0","id":1,"method":"ping"}' | kb serve
+
+# Check logs
+kb serve --log-level debug
+
+

Next Steps

+ +

Uninstallation

+
# Remove installed binary
+cargo uninstall kb-cli
+
+# Remove project knowledge base
+rm -rf /path/to/project/.kogral
+
+# Remove shared knowledge base
+rm -rf ~/Tools/.kogral-shared
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/guides/quickstart.html b/docs/book/guides/quickstart.html new file mode 100644 index 0000000..9e0622b --- /dev/null +++ b/docs/book/guides/quickstart.html @@ -0,0 +1,495 @@ + + + + + + Quick Start - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Quick Start Guide

+

Get up and running with the KOGRAL in 5 minutes.

+

Prerequisites

+
    +
  • Rust 1.70+ installed
  • +
  • Nickel CLI installed (cargo install nickel-lang-cli)
  • +
  • kb-cli installed (see Installation)
  • +
+

Step 1: Initialize Your Knowledge Base

+

Navigate to your project directory and initialize:

+
cd /path/to/your/project
+kb init
+
+

This creates a .kogral/ directory with the following structure:

+
.kogral/
+├── config.toml       # Configuration
+├── notes/            # General notes
+├── decisions/        # Architectural decisions
+├── guidelines/       # Project guidelines
+├── patterns/         # Reusable patterns
+└── journal/          # Daily journal entries
+
+

Step 2: Create Your First Note

+

Add a note to your knowledge base:

+
kb add note "Getting Started with Rust" \
+  --tags rust,programming,learning \
+  --content "Key concepts for learning Rust effectively."
+
+

Or create interactively:

+
kb add note
+# Follow the prompts to enter title, tags, and content
+
+

Step 3: Create a Decision Record

+

Document an architectural decision:

+
kb add decision "Use SurrealDB for Storage" \
+  --context "Need scalable storage for knowledge graph" \
+  --decision "Adopt SurrealDB for its graph capabilities" \
+  --consequence "Better query performance" \
+  --consequence "Additional infrastructure dependency"
+
+ +

Create relationships between nodes:

+
# Find node IDs
+kb list
+
+# Create a relationship
+kb link <note-id> <decision-id> relates_to
+
+

Available relationship types:

+
    +
  • relates_to - General conceptual link
  • +
  • depends_on - Dependency relationship
  • +
  • implements - Implementation of a concept
  • +
  • extends - Inheritance/extension
  • +
  • supersedes - Replaces older version
  • +
  • explains - Documentation/clarification
  • +
+

Step 5: Search Your Knowledge Base

+

Search by text:

+
# Simple search
+kb search "rust"
+
+# Filter by type
+kb search "architecture" --type decision
+
+# Limit results
+kb search "error handling" --limit 5
+
+

Search semantically (requires embeddings):

+
# Semantic search finds conceptually related content
+kb search "memory safety" --semantic --threshold 0.7
+
+

Step 6: View Node Details

+
# Show node by ID
+kb show <node-id>
+
+# Show node with relationships
+kb show <node-id> --with-relationships
+
+

Step 7: Edit Documents Directly

+

All knowledge base documents are markdown files you can edit:

+
# Open in your editor
+$EDITOR .kogral/notes/getting-started-with-rust.md
+
+# Or use your favorite markdown editor
+code .kogral/notes/
+
+

Document format:

+
---
+id: unique-id
+type: note
+title: Getting Started with Rust
+created: 2026-01-17T10:30:00Z
+modified: 2026-01-17T10:30:00Z
+tags: [rust, programming, learning]
+status: active
+---
+
+# Getting Started with Rust
+
+Content goes here with [[wikilinks]] to other nodes.
+
+## Key Concepts
+
+- Ownership
+- Borrowing
+- Lifetimes
+
+

Step 8: Create a Daily Journal Entry

+

Start journaling your development progress:

+
kb add journal "Today's Progress" \
+  --content "Learned about trait objects and dynamic dispatch in Rust."
+
+

Or open today's journal directly:

+
$EDITOR .kogral/journal/$(date +%Y-%m-%d).md
+
+

Step 9: Export to Logseq (Optional)

+

If you use Logseq, export your knowledge base:

+
nu scripts/kb-export-logseq.nu /path/to/logseq-graph
+
+

This creates a Logseq-compatible graph you can open in Logseq for visual editing.

+

Step 10: Start MCP Server for Claude Code

+

Integrate with Claude Code for AI-assisted knowledge management:

+
# Start MCP server
+kb serve
+
+# Configure in ~/.config/claude/config.json
+# Then use in Claude Code:
+# > kb/search "rust ownership"
+
+

Common Workflows

+

Capture Quick Notes

+
# Quick note
+kb add note "Remember to check error handling in parser module" --tags todo,parser
+
+

Document Architectural Decisions

+
# Create ADR
+kb add decision "Adopt Async Rust for I/O Operations" \
+  --status accepted \
+  --tags architecture,async
+
+

Build a Pattern Library

+
# Add a pattern
+kb add pattern "Error Handling with thiserror" \
+  --tags rust,error-handling \
+  --content "Standard pattern for error types in this project."
+
+

Track Daily Progress

+
# Add journal entry
+kb add journal --content "Implemented search functionality. Need to add semantic search next."
+
+

Next Steps

+

Customize Configuration

+

Edit .kogral/config.ncl for advanced configuration:

+
{
+  graph = {
+    name = "My Project",
+    version = "1.0.0",
+  },
+
+  embeddings = {
+    enabled = true,
+    provider = 'fastembed,
+  },
+
+  templates = {
+    templates_dir = "templates",
+  },
+}
+
+

See Configuration Reference for all options.

+

Set Up Shared Guidelines

+

Create a shared knowledge base for organization-wide standards:

+
# Create shared KB
+mkdir -p ~/Tools/.kogral-shared
+cd ~/Tools/.kogral-shared
+kb init --name "Shared Guidelines"
+
+# Add guidelines
+kb add guideline "Rust Error Handling" \
+  --language rust \
+  --category error-handling
+
+# Configure inheritance in projects
+kb config set inheritance.base ~/Tools/.kogral-shared
+
+

Automate with NuShell Scripts

+
# Backup regularly
+nu scripts/kb-backup.nu --compress
+
+# Sync with SurrealDB
+nu scripts/kb-sync.nu --direction bidirectional
+
+# Generate statistics
+nu scripts/kb-stats.nu --show-tags
+
+

Integrate with Git

+
# Add to version control
+git add .kogral/
+git commit -m "docs: Add knowledge base"
+
+# Add to .gitignore (optional: exclude certain types)
+echo ".kogral/journal/" >> .gitignore
+
+

Tips and Tricks

+ +

Link to other nodes naturally in markdown:

+
See [[getting-started-with-rust]] for basics.
+Related decision: [[use-surrealdb-for-storage]].
+
+

Reference Code

+

Link to specific code locations:

+
Error handling implementation: @src/parser.rs:42
+
+

Tag Consistently

+

Use consistent tagging for better searchability:

+
# Good tagging
+--tags rust,error-handling,pattern
+
+# Avoid
+--tags Rust,ErrorHandling,patterns
+
+

Leverage Templates

+

Customize templates for your workflow:

+
# Copy template
+cp templates/note.md.tera templates/meeting-notes.md.tera
+
+# Edit for meeting notes format
+$EDITOR templates/meeting-notes.md.tera
+
+

Troubleshooting

+

"KB directory not found"

+
# Make sure you initialized
+kb init
+
+# Or specify KB directory
+kb --kb-dir /path/to/.kb search "query"
+
+

"Node not found"

+
# List all nodes to find ID
+kb list
+
+# Search for node
+kb search "partial title"
+
+

"Failed to parse frontmatter"

+

Check your markdown file has valid YAML frontmatter:

+
---
+id: my-note
+type: note
+title: My Note
+---
+
+

Further Reading

+ +

Getting Help

+
    +
  • Check kb --help for command usage
  • +
  • Read inline help: kb add --help
  • +
  • Report issues on GitHub
  • +
  • Join community discussions
  • +
+
+

Congratulations! You've created your first knowledge base. Start capturing knowledge and building connections.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/guides/use-cases.html b/docs/book/guides/use-cases.html new file mode 100644 index 0000000..48c0eeb --- /dev/null +++ b/docs/book/guides/use-cases.html @@ -0,0 +1,674 @@ + + + + + + Use Cases - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Use Cases

+

Real-world scenarios showing how KOGRAL solves common development challenges.

+

Use Case 1: Onboarding New Team Members

+

Problem

+

New developer joins the team. Needs to understand:

+
    +
  • Why we chose SurrealDB over PostgreSQL
  • +
  • How error handling works in this project
  • +
  • What coding patterns we follow
  • +
  • Recent architectural decisions
  • +
+

Solution with KOGRAL

+

Team lead:

+
# Export project knowledge to Logseq for visual exploration
+kb export logseq ~/onboarding-docs
+
+

New developer (with Claude Code):

+
Summarize our architectural decisions from the last 6 months
+
+

Claude (via MCP):

+
Found 8 decisions:
+
+1. **Use SurrealDB for Storage** (accepted, 3 months ago)
+   - Context: Need graph database for knowledge relationships
+   - Consequences: Better queries, additional infrastructure
+
+2. **Adopt Rust for Core Logic** (accepted, 5 months ago)
+   - Context: Type safety and performance critical
+   - Consequences: Steeper learning curve, excellent reliability
+
+... [6 more decisions]
+
+

New developer:

+
What are our error handling guidelines?
+
+

Claude (via kb/get_guidelines):

+
## Rust Error Handling Guidelines
+
+### Project Guidelines (priority: 150)
+- Use thiserror for custom error types
+- Never unwrap() in production
+- Propagate with ? operator
+
+### Shared Guidelines (priority: 50)
+- Always use Result<T> for fallible operations
+- Add context with .context()
+
+[Links to full guideline documents]
+
+

Result: New developer productive in days, not weeks.

+
+

Use Case 2: Architectural Decision Records (ADR)

+

Problem

+

Team discussing whether to add Redis caching. Multiple opinions, need to document the decision for future reference.

+

Solution with KOGRAL

+

During meeting:

+
Document decision: Add Redis caching for API responses
+
+Context:
+- Current database queries average 200ms
+- 80% of queries are repeated within 5 minutes
+- Need sub-50ms response times for user experience
+
+Decision:
+- Add Redis with 5-minute TTL for GET endpoints
+- Cache invalidation on POST/PUT/DELETE
+
+Consequences:
+- ✅ Expected 80% reduction in database load
+- ✅ Sub-50ms response times achieved
+- ❌ Additional infrastructure (Redis server)
+- ❌ Cache consistency challenges
+- ❌ Debugging complexity increases
+
+Status: proposed (pending infrastructure setup)
+
+

Claude (creates ADR):

+
Created: decision-add-redis-caching
+Type: decision
+Status: proposed
+
+Added relationships:
+  - Relates to: note-performance-requirements
+  - Depends on: decision-use-docker-compose (infrastructure)
+
+Decision documented and linked to related knowledge.
+
+

Two months later, someone asks "Why Redis?":

+
kb show decision-add-redis-caching
+
+

Full context available instantly.

+
+

Use Case 3: Pattern Library

+

Problem

+

Team solves the same problems repeatedly:

+
    +
  • How to structure error types
  • +
  • Database connection patterns
  • +
  • Testing strategies
  • +
+

Each developer rediscovers solutions.

+

Solution with KOGRAL

+

First time solving error handling:

+
kb add pattern "Error Handling with thiserror" \
+  --tags rust,error-handling,pattern \
+  --content "$(cat docs/error-pattern.md)"
+
+

Next time someone needs error handling:

+
I'm implementing a new module with errors. What's our standard pattern?
+
+

Claude (via kogral/search):

+
Found pattern: Error Handling with thiserror
+
+## Pattern: Error Handling with thiserror
+
+### Problem
+Need structured, type-safe error handling with good error messages.
+
+### Solution
+```rust
+use thiserror::Error;
+
+#[derive(Error, Debug)]
+pub enum ModuleError {
+    #[error("Database connection failed: {0}")]
+    Database(#[from] sqlx::Error),
+
+    #[error("Validation failed: {0}")]
+    Validation(String),
+}
+
+

Usage

+
#![allow(unused)]
+fn main() {
+fn do_work() -> Result<(), ModuleError> {
+    let conn = connect_db()?; // Auto-converts via #[from]
+    validate_input()?;
+    Ok(())
+}
+}
+

[Full pattern with examples]

+

Would you like me to create a new error module following this pattern?

+

+**Result**: Consistent error handling across codebase, zero time wasted rediscovering patterns.
+
+---
+
+## Use Case 4: Daily Development Journal
+
+### Problem
+
+Developer wants to track:
+- What they worked on each day
+- Blockers encountered
+- Solutions discovered
+- Ideas for future work
+
+### Solution with KOGRAL
+
+**End of each day**:
+
+```bash
+kb add journal "2026-01-17" --content "
+## Progress
+- Implemented user authentication
+- Fixed race condition in cache layer
+- Started work on API rate limiting
+
+## Blockers
+- SurrealDB migration tool not working with nested objects
+- Need to discuss API versioning strategy with team
+
+## Learnings
+- tokio::select! is perfect for timeout patterns
+- serde_json::Value useful for dynamic JSON handling
+
+## Tomorrow
+- Finish rate limiting implementation
+- Review PR #234
+- Team meeting: discuss API versioning
+"
+
+

With Claude Code (even easier):

+
End of day journal:
+
+Implemented authentication, fixed cache race condition, started rate limiting.
+Blocked on SurrealDB migrations and need API versioning discussion.
+Learned about tokio::select! for timeouts.
+Tomorrow: finish rate limiting, review PR #234, versioning meeting.
+
+

Claude (creates journal entry):

+
Created journal entry: 2026-01-17
+
+Tags auto-detected: authentication, cache, rate-limiting, surrealdb
+
+Linked to:
+  - pattern-timeout-handling (implements)
+  - decision-use-surrealdb (relates_to)
+
+Journal entry saved.
+
+

Two weeks later (forgot how you solved that race condition):

+
How did I fix the cache race condition?
+
+

Claude (semantic search):

+
From your journal entry on 2026-01-17:
+
+"Fixed race condition in cache layer by using DashMap instead of
+RwLock<HashMap>. DashMap provides lock-free concurrent access."
+
+[Link to full journal entry]
+
+

Result: Development history preserved, solutions easy to recall.

+
+

Use Case 5: Code Review Preparation

+

Problem

+

Preparing for code review. Need to:

+
    +
  • Document why certain decisions were made
  • +
  • Link implementation to requirements
  • +
  • Explain trade-offs to reviewers
  • +
+

Solution with KOGRAL

+

Before creating PR:

+
I just implemented the caching layer.
+Add a note documenting the implementation and link it to our caching decision.
+
+

Claude (via kb/add_note + kb/link):

+
Created note: note-caching-layer-implementation
+
+Content:
+# Caching Layer Implementation
+
+## Approach
+- Redis with 5-minute TTL
+- Cache-aside pattern
+- Invalidation on mutations
+
+## Trade-offs
+- Chose simplicity over advanced features (no LRU eviction)
+- 5-minute TTL balances freshness vs cache hit rate
+- Cache-aside pattern chosen over write-through (simpler)
+
+## Testing
+- Unit tests for cache logic
+- Integration tests with real Redis
+- Load test: 1000 req/s sustained
+
+Links:
+  - Implements: decision-add-redis-caching
+  - Follows: pattern-cache-aside
+  - Tests: guideline-integration-testing
+
+Note added and linked to decision-add-redis-caching.
+
+

In PR description:

+
## Implementation
+
+Implements caching layer per decision-add-redis-caching.
+
+See note-caching-layer-implementation for detailed rationale.
+
+## Trade-offs
+
+[Copy from note]
+
+

Reviewers:

+
kb show decision-add-redis-caching
+kb show note-caching-layer-implementation
+
+

Full context available, review focuses on code quality not "why this approach?"

+
+

Use Case 6: Cross-Project Guidelines

+

Problem

+

Organization has 10 projects. Each should follow:

+
    +
  • Same Rust error handling patterns
  • +
  • Same security guidelines
  • +
  • Same testing standards
  • +
+

Currently: duplicated wikis, inconsistent practices.

+

Solution with KOGRAL

+

Setup shared KOGRAL:

+
# Create organization-wide shared KB
+mkdir -p ~/org/.kogral-shared
+cd ~/org/.kogral-shared
+kb init --name "Organization Guidelines"
+
+# Add shared guidelines
+kb add guideline "Rust Error Handling" \
+  --language rust \
+  --category error-handling \
+  --content "$(cat org-rust-errors.md)"
+
+kb add guideline "Security Best Practices" \
+  --category security \
+  --content "$(cat org-security.md)"
+
+

In each project:

+
# project/.kogral/config.ncl
+{
+  inheritance = {
+    base = "~/org/.kogral-shared",
+    priority = 100,  # Project overrides shared
+  },
+}
+
+

Developer in Project A:

+
What are our error handling guidelines?
+
+

Claude (via kb/get_guidelines with inheritance):

+
## Rust Error Handling Guidelines
+
+### Shared Guidelines (priority: 50)
+From ~/org/.kogral-shared:
+- Use thiserror for custom errors
+- Never unwrap() in production
+- Always propagate with ?
+
+### Project Guidelines (priority: 100)
+From project .kogral/:
+- Additionally: log all errors with tracing
+- Use anyhow for application-level errors
+
+[Combined effective guidelines]
+
+

Result:

+
    +
  • Consistent practices across organization
  • +
  • Projects can specialize where needed
  • +
  • Single source of truth for shared knowledge
  • +
+
+

Use Case 7: Bug Investigation

+

Problem

+

Bug in production. Developer needs to:

+
    +
  • Understand relevant decisions
  • +
  • Find related code patterns
  • +
  • Check if similar issues were solved before
  • +
+

Solution with KOGRAL

+

Developer:

+
We have a race condition in the cache layer.
+What past decisions or patterns might be relevant?
+
+

Claude (semantic search):

+
Found 4 relevant items:
+
+1. **Decision: Use DashMap for Concurrent Access** (accepted, 1 month ago)
+   "Chose DashMap over RwLock<HashMap> to avoid race conditions in cache"
+
+2. **Pattern: Safe Concurrent Cache Access**
+   "Always use lock-free data structures for high-contention caches"
+
+3. **Note: Cache Race Condition Fix** (from 2026-01-17 journal)
+   "Fixed race in cache by switching to DashMap"
+
+4. **Guideline: Concurrency Safety**
+   "Use atomic operations and lock-free structures where possible"
+
+It looks like we've seen this before! Check the journal entry from 2026-01-17.
+
+

Developer reads journal:

+
kb show journal-2026-01-17
+
+

Finds:

+
    +
  • Exact same issue
  • +
  • Solution: switch to DashMap
  • +
  • Code example included
  • +
  • Performance benchmarks
  • +
+

Applies fix in 10 minutes instead of 2 hours of debugging.

+
+

Use Case 8: API Design Collaboration

+

Problem

+

Team discussing new API design. Multiple approaches:

+
    +
  • REST vs GraphQL
  • +
  • Versioning strategy
  • +
  • Authentication method
  • +
+

Need to capture discussion and decision.

+

Solution with KOGRAL

+

During design meeting (using Claude Code):

+
We're designing the new API. Let me capture this discussion:
+
+Approaches discussed:
+1. REST with versioned endpoints (/v1/, /v2/)
+2. GraphQL with schema versioning
+3. gRPC for internal services
+
+Team consensus:
+- REST for public API (easier for partners)
+- GraphQL for internal admin tools (flexibility)
+- gRPC for service-to-service (performance)
+
+Create a decision record for each, linking them together.
+
+

Claude (creates 3 linked ADRs):

+
Created 3 decisions:
+
+1. decision-rest-public-api
+   Status: accepted
+   Context: Public API needs broad compatibility
+   Decision: REST with /v1/, /v2/ versioning
+
+2. decision-graphql-admin
+   Status: accepted
+   Context: Admin tools need flexible queries
+   Decision: GraphQL with schema evolution
+
+3. decision-grpc-internal
+   Status: accepted
+   Context: Service-to-service needs performance
+   Decision: gRPC with protobuf
+
+Linked:
+  decision-rest-public-api --[relates_to]--> decision-graphql-admin
+  decision-rest-public-api --[relates_to]--> decision-grpc-internal
+  decision-graphql-admin --[relates_to]--> decision-grpc-internal
+
+All decisions documented and interconnected.
+
+

Two months later, someone asks "Why REST not GraphQL for public API?":

+
kb show decision-rest-public-api
+
+

Full context preserved, including relationship to GraphQL decision.

+
+

Summary

+

Knowledge Base excels at:

+

Onboarding: Historical context instantly available +✅ Decision Making: ADRs preserve rationale +✅ Pattern Reuse: Solutions documented once, used forever +✅ Daily Tracking: Development journal with semantic search +✅ Code Review: Implementation rationale linked to decisions +✅ Cross-Project: Shared guidelines with project overrides +✅ Bug Investigation: Past solutions easily discovered +✅ Collaboration: Discussions captured and interconnected

+

Common Theme: Knowledge captured during work, queryable when needed, connected to related concepts.

+
+

Next Steps

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/highlight.css b/docs/book/highlight.css new file mode 100644 index 0000000..352c79b --- /dev/null +++ b/docs/book/highlight.css @@ -0,0 +1,83 @@ +/* + * An increased contrast highlighting scheme loosely based on the + * "Base16 Atelier Dune Light" theme by Bram de Haan + * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) + * Original Base16 color scheme by Chris Kempson + * (https://github.com/chriskempson/base16) + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #575757; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d70025; +} + +/* Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b21e00; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #008200; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #0030f2; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #9d00ec; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f6f7f6; + color: #000; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} + +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} diff --git a/docs/book/highlight.js b/docs/book/highlight.js new file mode 100644 index 0000000..18d2434 --- /dev/null +++ b/docs/book/highlight.js @@ -0,0 +1,54 @@ +/* + Highlight.js 10.1.1 (93fd0d73) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){s+=""}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); +hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}()); +hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}()); +hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}()); +hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}()); +hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}()); +hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}()); +hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}()); +hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}()); +hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}()); +hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}()); +hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:""},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}()); +hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}()); +hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}()); +hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}()); +hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); +hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[c],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}()); +hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}()); +hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}()); +hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}()); +hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}()); +hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}()); +hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}()); +hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}()); +hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}()); +hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}()); +hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}()); +hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}()); +hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}}()); +hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}()); +hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}()); +hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}()); +hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}()); +hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}()); +hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}()); +hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}()); +hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}()); +hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}()); +hljs.registerLanguage("nim",function(){"use strict";return function(e){return{name:"Nim",aliases:["nim"],keywords:{keyword:"addr and as asm bind block break case cast const continue converter discard distinct div do elif else end enum except export finally for from func generic if import in include interface is isnot iterator let macro method mixin mod nil not notin object of or out proc ptr raise ref return shl shr static template try tuple type using var when while with without xor yield",literal:"shared guarded stdin stdout stderr result true false",built_in:"int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 bool char string cstring pointer expr stmt void auto any range array openarray varargs seq set clong culong cchar cschar cshort cint csize clonglong cfloat cdouble clongdouble cuchar cushort cuint culonglong cstringarray semistatic"},contains:[{className:"meta",begin:/{\./,end:/\.}/,relevance:10},{className:"string",begin:/[a-zA-Z]\w*"/,end:/"/,contains:[{begin:/""/}]},{className:"string",begin:/([a-zA-Z]\w*)?"""/,end:/"""/},e.QUOTE_STRING_MODE,{className:"type",begin:/\b[A-Z]\w+\b/,relevance:0},{className:"number",relevance:0,variants:[{begin:/\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/},{begin:/\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(\d[_\d]*)('?[iIuUfF](8|16|32|64))?/}]},e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("nix",function(){"use strict";return function(e){var n={keyword:"rec with let in inherit assert if else then",literal:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"},i={className:"subst",begin:/\$\{/,end:/}/,keywords:n},t={className:"string",contains:[i],variants:[{begin:"''",end:"''"},{begin:'"',end:'"'}]},s=[e.NUMBER_MODE,e.HASH_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t,{begin:/[a-zA-Z0-9-_]+(\s*=)/,returnBegin:!0,relevance:0,contains:[{className:"attr",begin:/\S+/}]}];return i.contains=s,{name:"Nix",aliases:["nixos"],keywords:n,contains:s}}}()); +hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}()); +hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}()); +hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}()); \ No newline at end of file diff --git a/docs/book/index.html b/docs/book/index.html new file mode 100644 index 0000000..6413128 --- /dev/null +++ b/docs/book/index.html @@ -0,0 +1,504 @@ + + + + + + Introduction - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

KOGRAL Documentation

+

Welcome to the KOGRAL documentation! This directory contains comprehensive documentation for KOGRAL (KOwledge GRAphs, Local-first), built with mdBook.

+

📚 Reading the Documentation

+

You have several options for reading the documentation:

+ +

The best reading experience with navigation, search, and live reload:

+
# Serve documentation at http://localhost:3000
+just docs::serve
+
+

This will:

+
    +
  • Build the mdBook
  • +
  • Start a local web server on port 3000
  • +
  • Open your browser automatically
  • +
  • Watch for changes and auto-reload
  • +
+

Option 2: Build Static HTML

+

Generate static HTML files you can browse offline:

+
# Build mdBook to docs/book/
+just docs::build
+
+

Then open docs/book/index.html in your browser.

+

Option 3: Read Markdown Files Directly

+

All documentation is written in Markdown and can be read directly:

+
    +
  • Browse via GitHub/GitLab web interface
  • +
  • Use your editor's Markdown preview
  • +
  • Read from terminal with bat, glow, or similar tools
  • +
+

Navigation: See SUMMARY.md for the complete table of contents.

+

🛠️ Documentation Commands

+

We use just recipes for documentation tasks. All commands assume you're in the project root directory.

+

Build and Serve

+
# Serve documentation locally (recommended)
+just docs::serve
+
+# Build static HTML
+just docs::build
+
+# Watch and rebuild on file changes
+just docs::watch
+
+

Validation

+
# Test code examples in documentation
+just docs::test
+
+# Check for broken links
+just docs::check-links
+
+

Cleanup

+
# Remove build artifacts
+just docs::clean
+
+

View All Documentation Commands

+
just docs::help
+
+

📦 Installing mdBook

+

mdBook is required to build and serve the documentation.

+

Install via Cargo

+
cargo install mdbook
+
+

Install Optional Tools

+

For enhanced functionality:

+
# Link checker (validates internal/external links)
+cargo install mdbook-linkcheck
+
+# Mermaid diagram support
+cargo install mdbook-mermaid
+
+# PlantUML diagram support
+cargo install mdbook-plantuml
+
+

Verify Installation

+
mdbook --version
+# Should output: mdbook v0.4.x or later
+
+

📖 Documentation Structure

+

The documentation is organized into the following sections:

+

1. KOGRAL Definition (kogral/)

+
    +
  • What is KOGRAL and why it exists
  • +
  • Core concepts (nodes, edges, graphs)
  • +
  • Design philosophy
  • +
+

2. Guides (guides/)

+
    +
  • Quick start (5 minutes)
  • +
  • Installation guide
  • +
  • Use cases with examples
  • +
+

3. Architecture (architecture/)

+
    +
  • System overview with diagrams
  • +
  • Config-driven architecture
  • +
  • Graph model details
  • +
  • ADRs (Architectural Decision Records)
  • +
+

4. Setup (setup/)

+
    +
  • Initial setup
  • +
  • Development environment
  • +
  • Production deployment
  • +
  • Testing environment
  • +
  • CI/CD integration
  • +
+

5. Configuration (config/)

+
    +
  • Configuration overview
  • +
  • Nickel schema reference
  • +
  • Runtime configuration
  • +
  • Environment modes (dev/prod/test)
  • +
+

6. Storage (storage/)

+
    +
  • Storage architecture (hybrid strategy)
  • +
  • Filesystem backend
  • +
  • SurrealDB backend
  • +
  • In-memory backend
  • +
  • Sync mechanism
  • +
+

7. AI & Embeddings (ai/)

+
    +
  • Semantic search
  • +
  • Embedding providers
  • +
  • Provider comparison
  • +
  • Configuration examples
  • +
+

8. Templates (templates/)

+
    +
  • Template system (Tera)
  • +
  • Document templates
  • +
  • Export templates
  • +
  • Custom templates
  • +
+

9. CLI Reference (cli/)

+
    +
  • All kb-cli commands
  • +
  • Common workflows
  • +
  • Advanced usage
  • +
  • Troubleshooting
  • +
+

10. Apps & Integrations (apps/)

+
    +
  • MCP quick guide (Claude Code)
  • +
  • Logseq integration
  • +
  • Vapora integration
  • +
+

11. API Reference (api/)

+
    +
  • MCP tools specification
  • +
  • Storage trait
  • +
  • Embedding trait
  • +
  • REST API (future)
  • +
+

12. Contributing (contributing/)

+
    +
  • Development setup
  • +
  • Code guidelines
  • +
  • Testing standards
  • +
  • Documentation guidelines
  • +
+

🎨 Visual Diagrams

+

The documentation includes SVG diagrams for visual understanding:

+ +

These diagrams are embedded in relevant documentation pages and can be viewed standalone in a browser.

+

🔍 Searching the Documentation

+

When using just docs::serve, you get a built-in search feature:

+
    +
  1. Click the search icon (🔍) in the top-left corner
  2. +
  3. Type your query
  4. +
  5. Press Enter to navigate results
  6. +
+

The search indexes all documentation content including:

+
    +
  • Page titles
  • +
  • Headers
  • +
  • Body text
  • +
  • Code examples (optionally)
  • +
+

✏️ Editing Documentation

+

File Format

+

All documentation is written in GitHub Flavored Markdown with mdBook extensions.

+

See contributing/documentation.md for detailed editing guidelines.

+

Adding a New Page

+
    +
  1. Create the markdown file in the appropriate directory
  2. +
  3. Add it to SUMMARY.md for navigation
  4. +
  5. Build to verify: just docs::build
  6. +
+

Adding a New Section

+
    +
  1. Create the directory
  2. +
  3. Add a README.md for the section landing page
  4. +
  5. Add section to SUMMARY.md
  6. +
+

🧪 Testing Documentation

+

Test Code Examples

+
just docs::test
+
+

This runs all Rust code examples in the documentation to ensure they compile.

+ +
just docs::check-links
+
+

This validates all internal and external links.

+

📝 Documentation Standards

+

When contributing to documentation:

+
    +
  1. Use clear, concise language - Write for developers and AI agents
  2. +
  3. Include code examples - Show, don't just tell
  4. +
  5. Add diagrams where helpful - Visual aids improve understanding
  6. +
  7. Link related concepts - Help readers discover related content
  8. +
  9. Test code examples - Ensure code compiles and works
  10. +
  11. Use consistent formatting - Follow existing page structure
  12. +
  13. Update SUMMARY.md - New pages must be in navigation
  14. +
  15. Run checks before committing:
  16. +
+
just docs::build
+just docs::test
+just docs::check-links
+
+

💡 Tips

+

Live Reload While Writing

+
just docs::watch
+
+

This watches for changes and rebuilds automatically. Open http://localhost:3000 in your browser to see updates in real-time.

+

Markdown Preview in Editor

+

Most editors have Markdown preview:

+
    +
  • VS Code: Ctrl+Shift+V (Cmd+Shift+V on Mac)
  • +
  • IntelliJ/CLion: Preview pane (right side)
  • +
  • Vim/Neovim: Use plugins like markdown-preview.nvim
  • +
+

Quick Reference

+
    +
  • SUMMARY.md - Table of contents (edit to add/remove pages)
  • +
  • book.toml - mdBook configuration
  • +
  • theme/ - Custom CSS/JS (if needed)
  • +
  • diagrams/ - SVG diagrams
  • +
+

🐛 Troubleshooting

+

mdbook command not found

+
# Install mdBook
+cargo install mdbook
+
+# Verify installation
+mdbook --version
+
+

Port 3000 already in use

+
# Serve on different port
+cd docs
+mdbook serve --port 3001
+
+ +
# Check all links
+just docs::check-links
+
+# Update internal links in affected files
+# Then rebuild
+just docs::build
+
+

📚 Resources

+ +

🤝 Contributing to Documentation

+

Documentation improvements are always welcome! To contribute:

+
    +
  1. Fork the repository
  2. +
  3. Create a feature branch
  4. +
  5. Make your changes
  6. +
  7. Test with just docs::build and just docs::test
  8. +
  9. Submit a pull request
  10. +
+

See contributing/documentation.md for detailed guidelines.

+
+

Happy documenting! 📖

+

If you have questions or need help, please open an issue or reach out to the maintainers.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/kogral/core-concepts.html b/docs/book/kogral/core-concepts.html new file mode 100644 index 0000000..d598c9f --- /dev/null +++ b/docs/book/kogral/core-concepts.html @@ -0,0 +1,709 @@ + + + + + + Core Concepts - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Core Concepts

+

Understanding the fundamental concepts behind KOGRAL.

+

The Knowledge Graph

+

At its core, KOGRAL is a directed graph where:

+
    +
  • Nodes = pieces of knowledge (notes, decisions, guidelines, patterns)
  • +
  • Edges = typed relationships between concepts
  • +
+

Node Types and Relationships

+

This graph structure enables:

+
    +
  • Discovery: Find related concepts through traversal
  • +
  • Context: Understand how ideas connect
  • +
  • Evolution: Track how knowledge changes over time
  • +
+

Node Types

+

1. Note

+

Purpose: Capture general observations, learnings, and discoveries.

+

When to use:

+
    +
  • Documenting a concept you learned
  • +
  • Recording implementation details
  • +
  • Capturing meeting notes
  • +
  • Quick knowledge capture
  • +
+

Example:

+
---
+type: note
+title: Async Trait Patterns in Rust
+tags: [rust, async, patterns]
+---
+
+# Async Trait Patterns in Rust
+
+Using async traits with the async-trait crate...
+
+

2. Decision (ADR)

+

Purpose: Record architectural decisions with full context.

+

When to use:

+
    +
  • Choosing between alternatives (REST vs GraphQL)
  • +
  • Major technical decisions (database selection)
  • +
  • Trade-off analysis
  • +
  • Explaining "why" for future reference
  • +
+

Structure:

+
    +
  • Context: Background and problem
  • +
  • Decision: What was chosen
  • +
  • Consequences: Positive and negative outcomes
  • +
  • Alternatives: What was considered but rejected
  • +
+

Example:

+
---
+type: decision
+title: Use SurrealDB for Storage
+status: accepted
+---
+
+## Context
+Need a graph database that supports our relationship model...
+
+## Decision
+Adopt SurrealDB as the primary storage backend.
+
+## Consequences
++ Better graph query performance
++ Native relationship support
+- Additional infrastructure dependency
+- Team learning curve
+
+

3. Guideline

+

Purpose: Define coding standards, best practices, and conventions.

+

When to use:

+
    +
  • Code style rules
  • +
  • Architecture patterns to follow
  • +
  • Security requirements
  • +
  • Testing standards
  • +
+

Can be:

+
    +
  • Shared: Organization-wide (in shared KOGRAL)
  • +
  • Project-specific: Overrides shared guidelines
  • +
+

Example:

+
---
+type: guideline
+language: rust
+category: error-handling
+---
+
+# Rust Error Handling Guidelines
+
+1. Use `thiserror` for custom error types
+2. Never use `unwrap()` in production code
+3. Always propagate errors with `?`
+
+

4. Pattern

+

Purpose: Document reusable solutions to common problems.

+

When to use:

+
    +
  • Recurring implementation patterns
  • +
  • Tested solutions
  • +
  • Best practice implementations
  • +
  • Code templates
  • +
+

Structure:

+
    +
  • Problem: What challenge does this solve?
  • +
  • Solution: The pattern/approach
  • +
  • Context: When to use/not use
  • +
  • Example: Working code
  • +
+

Example:

+
---
+type: pattern
+title: Repository Pattern for Database Access
+tags: [architecture, database, pattern]
+---
+
+## Problem
+Need consistent database access across modules.
+
+## Solution
+Repository pattern with trait abstraction...
+
+## Example
+\`\`\`rust
+trait UserRepository {
+    async fn find_by_id(&self, id: Uuid) -> Result<User>;
+}
+\`\`\`
+
+

5. Journal

+

Purpose: Daily development log for tracking progress and reflections.

+

When to use:

+
    +
  • End of day summaries
  • +
  • Daily standup notes
  • +
  • Progress tracking
  • +
  • Blocker documentation
  • +
+

Auto-linked: KOGRAL can auto-link journal entries to mentioned concepts.

+

Example:

+
---
+type: journal
+date: 2026-01-17
+---
+
+## Progress
+- Implemented authentication module
+- Fixed cache race condition
+
+## Blockers
+- Need API versioning discussion
+
+## Learnings
+- tokio::select! perfect for timeouts
+
+

6. Execution

+

Purpose: Record AI agent execution results (from Vapora integration).

+

When to use:

+
    +
  • Agent task completion
  • +
  • Execution metrics
  • +
  • Agent decision history
  • +
  • Audit trail
  • +
+

Example:

+
---
+type: execution
+task_type: code_generation
+agent: rust-expert
+outcome: success
+duration: 45s
+---
+
+Generated authentication module following project guidelines.
+
+

Relationship Types

+

1. relates_to

+

Meaning: General conceptual relationship.

+

Use: Connect related ideas without specific dependency.

+

Example:

+
[Note: Async Patterns] --relates_to--> [Note: Tokio Runtime]
+
+

2. depends_on

+

Meaning: Prerequisite relationship. Source requires target to exist/be understood first.

+

Use: Learning paths, implementation order.

+

Example:

+
[Pattern: Advanced Error Handling] --depends_on--> [Guideline: Basic Errors]
+
+

3. implements

+

Meaning: Concrete implementation of an abstract concept.

+

Use: Connect code to patterns/guidelines.

+

Example:

+
[Note: Auth Module Implementation] --implements--> [Pattern: Repository Pattern]
+
+

4. extends

+

Meaning: Inheritance/extension relationship.

+

Use: Guideline overrides, pattern variations.

+

Example:

+
[Guideline: Project Error Handling] --extends--> [Guideline: Shared Error Handling]
+
+

5. supersedes

+

Meaning: Replacement relationship. Source replaces target.

+

Use: Track evolution of decisions/patterns.

+

Example:

+
[Decision: Use GraphQL v2] --supersedes--> [Decision: Use REST]
+
+

6. explains

+

Meaning: Documentation/clarification relationship.

+

Use: Connect notes to implementations, executions to rationale.

+

Example:

+
[Note: Why We Chose Rust] --explains--> [Decision: Adopt Rust]
+
+

Multi-Graph Architecture

+

KB supports multiple knowledge graphs:

+

Local Graph (Project-Specific)

+

Location: .kogral/ in project directory

+

Purpose: Project-specific knowledge

+
    +
  • Project decisions
  • +
  • Implementation notes
  • +
  • Local patterns
  • +
  • Daily journals
  • +
+

Storage: Filesystem (git-tracked)

+

Scope: Single project

+

Shared Graph (Organization-Wide)

+

Location: Configurable (e.g., ~/org/.kogral-shared)

+

Purpose: Shared organizational knowledge

+
    +
  • Coding guidelines
  • +
  • Standard patterns
  • +
  • Architecture principles
  • +
  • Security policies
  • +
+

Storage: SurrealDB (centralized) or filesystem (synced)

+

Scope: All projects

+

Inheritance Model

+
Shared Guidelines (priority: 50)
+        ↓ [inherited by]
+Project Guidelines (priority: 100)
+        ↓ [effective]
+Combined Guidelines (higher priority wins)
+
+

Example:

+

Shared guideline: "Use Result for errors" +Project override: "Use Result + log all errors with tracing" +Effective: Both rules apply, project adds requirement

+

Config-Driven Behavior

+

Everything is configurable via Nickel schemas:

+
{
+  graph = { name = "my-project" },          # Graph metadata
+  storage = { primary = 'filesystem },       # Where to store
+  embeddings = { provider = 'fastembed },    # AI provider
+  templates = { /* ... */ },                 # Document templates
+  query = { similarity_threshold = 0.6 },    # Search behavior
+}
+
+

No hardcoding: Change behavior without code changes.

+ +

Beyond keyword matching, KOGRAL uses embeddings to find concepts:

+

Keyword search: "Find 'error handling'"

+
    +
  • Matches exact phrase "error handling"
  • +
+

Semantic search: "How to handle failures gracefully?"

+
    +
  • Finds: error handling, exception patterns, Result types, panic recovery
  • +
  • Understands: "failures" = errors, "gracefully" = best practices
  • +
+

How it works:

+
    +
  1. Text → Embedding (384 or 1536 dimensional vector)
  2. +
  3. Similarity search (cosine distance)
  4. +
  5. Return nodes above threshold (e.g., 0.6)
  6. +
+

Providers:

+
    +
  • fastembed: Local, free, offline (384d)
  • +
  • OpenAI: Cloud, best quality (1536d)
  • +
  • Claude: Cloud, excellent (1024d)
  • +
  • Ollama: Self-hosted (768d)
  • +
+

Templates

+

Tera templates generate consistent documents:

+
---
+id: {{ id }}
+type: {{ type }}
+title: {{ title }}
+tags: [{% for tag in tags %}"{{ tag }}"{% endfor %}]
+---
+
+# {{ title }}
+
+{{ content }}
+
+

Customizable: Override templates per project.

+

Export formats: Logseq, JSON, Markdown.

+

MCP Integration

+

Model Context Protocol connects KOGRAL to Claude Code:

+
Claude Code
+    ↓ [JSON-RPC 2.0]
+kb-mcp Server
+    ↓ [Rust API]
+kb-core Library
+    ↓ [Storage]
+Knowledge Graph
+
+

Tools: kogral/search, kogral/add_note, kogral/get_guidelines, etc.

+

Resources: kogral://project/notes, kogral://shared/guidelines

+

Prompts: kogral/summarize_project, kogral/find_related

+

Git-Friendly Storage

+

Markdown + YAML frontmatter = git-tracked knowledge:

+
---
+id: note-123
+type: note
+title: My Note
+---
+
+# Content here
+
+

Benefits:

+
    +
  • ✅ Diffs in PRs (reviewable changes)
  • +
  • ✅ Branches (experiment with knowledge)
  • +
  • ✅ Merges (combine knowledge from feature branches)
  • +
  • ✅ History (track evolution over time)
  • +
  • ✅ Blame (who added this knowledge?)
  • +
+

Logseq Content Blocks

+

KOGRAL provides full support for Logseq-style outliner blocks with rich metadata and structure.

+

What are Blocks?

+

Blocks are the fundamental unit of content in Logseq's outliner format:

+
    +
  • Each bullet point is a block
  • +
  • Blocks can have children (nested blocks)
  • +
  • Blocks support tasks, tags, and custom properties
  • +
  • Blocks can reference other blocks or pages
  • +
+

Block Features

+

Task Status:

+
- TODO Implement authentication #high-priority
+- DOING Write tests
+- DONE Deploy to staging
+- LATER Consider GraphQL API
+- NOW Fix critical bug
+- WAITING Code review from @alice
+- CANCELLED Old approach
+
+

Inline Tags:

+
- Learning Rust ownership #rust #learning #card
+  - Prevents data races at compile time
+  - Borrowing rules enforce safety
+
+

Custom Properties:

+
- Research paper summary
+  priority:: high
+  reviewed:: 2026-01-17
+  source:: https://example.com/paper.pdf
+  - Key findings...
+
+

Block and Page References:

+
- Meeting notes from [[2026-01-17]]
+  - Discussed architecture ((block-ref-123))
+  - Action items: [[Project Roadmap]]
+
+

Hierarchical Structure:

+
- Parent block #top-level
+  - Child block 1
+    - Nested child
+  - Child block 2
+
+

Configuration

+

Blocks support is opt-in via configuration:

+
{
+  blocks = {
+    enabled = true,              # Enable blocks parsing
+    parse_on_import = true,      # Auto-parse from Logseq imports
+    serialize_on_export = true,  # Serialize to outliner format
+    enable_mcp_tools = true,     # Enable block-related MCP tools
+  },
+}
+
+

Use Cases

+

1. Task Management:

+
- TODO Weekly sprint planning #meeting
+  - DONE Review last sprint
+  - DOING Plan current sprint
+  - TODO Assign tasks
+
+

2. Flashcards (Spaced Repetition):

+
- What is Rust's ownership model? #card #rust
+  - Ownership prevents data races at compile time
+  - Each value has a single owner
+  - When owner goes out of scope, value is dropped
+
+

3. Knowledge Capture with Metadata:

+
- Tokio async runtime patterns #rust #async
+  category:: architecture
+  difficulty:: intermediate
+  - Use tokio::select! for concurrent operations
+  - spawn_blocking() for CPU-intensive work
+
+

4. Linked Notes:

+
- Discussed [[ADR-001]] in architecture meeting
+  - Decided on SurrealDB
+  - See ((meeting-notes-block-id)) for details
+
+

Block Queries (MCP Tools)

+

Query blocks across your knowledge base:

+

Find blocks by tag:

+
{
+  "tool": "kogral/find_blocks",
+  "arguments": { "tag": "card" }
+}
+
+

Find all TODOs:

+
{
+  "tool": "kogral/find_todos",
+  "arguments": { "limit": 20 }
+}
+
+

Find flashcards:

+
{
+  "tool": "kogral/find_cards",
+  "arguments": { "limit": 10 }
+}
+
+

Find blocks by property:

+
{
+  "tool": "kogral/find_blocks",
+  "arguments": {
+    "property_key": "priority",
+    "property_value": "high"
+  }
+}
+
+

Architecture

+

Hybrid Model:

+
    +
  • Content stored as markdown string (source of truth)
  • +
  • Blocks lazily parsed on first access
  • +
  • Cached block structure for fast queries
  • +
  • Bidirectional: markdown ↔ blocks
  • +
+

BlockParser:

+
    +
  • Parse outliner markdown → Block structures
  • +
  • Serialize Block structures → outliner markdown
  • +
  • Preserve all metadata (tags, status, properties, references)
  • +
  • Round-trip fidelity for Logseq compatibility
  • +
+

Storage:

+
    +
  • Filesystem: markdown with blocks inline
  • +
  • SurrealDB: dedicated block table with indexes
  • +
  • Indexes: tags, status, parent_id, full-text search
  • +
+

See Also:

+ +

Key Principles

+
    +
  1. Capture During Work: Don't wait, document as you go
  2. +
  3. Link as You Learn: Connect related concepts immediately
  4. +
  5. Query When Needed: AI-assisted discovery of relevant knowledge
  6. +
  7. Evolve Over Time: Update decisions, supersede patterns
  8. +
  9. Share Wisely: Shared guidelines, local specifics
  10. +
+

Next Steps

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/kogral/design-philosophy.html b/docs/book/kogral/design-philosophy.html new file mode 100644 index 0000000..96a9cd3 --- /dev/null +++ b/docs/book/kogral/design-philosophy.html @@ -0,0 +1,622 @@ + + + + + + Design Philosophy - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Design Philosophy

+

The principles and values guiding Knowledge Base design and implementation.

+

Core Tenets

+

1. Config-Driven, Not Hardcoded

+

Principle: All behavior should be configurable via schemas, not baked into code.

+

Why: Flexibility without code changes. Users adapt KB to their workflows, not vice versa.

+

Example:

+
#![allow(unused)]
+fn main() {
+// ❌ Bad: Hardcoded
+impl EmbeddingProvider {
+    fn new() -> Self {
+        FastEmbedProvider::new("BAAI/bge-small-en-v1.5") // Can't change
+    }
+}
+
+// ✅ Good: Config-driven
+impl EmbeddingProvider {
+    fn from_config(config: &EmbeddingConfig) -> Result<Box<dyn EmbeddingProvider>> {
+        match config.provider {
+            'fastembed => Ok(Box::new(FastEmbedProvider::new(&config.model)?)),
+            'openai => Ok(Box::new(OpenAIProvider::new(&config.model)?)),
+        }
+    }
+}
+}
+

Benefits:

+
    +
  • Switch embedding providers without recompilation
  • +
  • Different configs for dev/prod
  • +
  • User choice, not developer mandate
  • +
+

2. Type-Safe Configuration

+

Principle: Validate configuration before runtime, not during.

+

Why: Catch errors early, reduce runtime failures.

+

Implementation: Nickel contracts + serde validation = double validation

+
# Schema defines valid values
+EmbeddingProvider = [| 'openai, 'claude, 'fastembed |]
+
+# Typo caught at export time, not runtime
+{ provider = 'opena1 }  # Error: Invalid variant
+
+

Benefits:

+
    +
  • Errors found during nickel export, not during execution
  • +
  • Self-documenting: schema is the spec
  • +
  • Refactoring safe: change schema, find all usages
  • +
+

3. Local-First, Cloud-Optional

+

Principle: Core functionality works offline, cloud is enhancement.

+

Why: Privacy, cost control, offline development.

+

Examples:

+
+ + + +
FeatureLocalCloud
StorageFilesystemSurrealDB
EmbeddingsfastembedOpenAI/Claude
SearchText-basedSemantic
+
+

Benefits:

+
    +
  • Works on planes, trains, areas with poor internet
  • +
  • No API costs for small projects
  • +
  • Privacy-sensitive projects keep data local
  • +
  • Production can use cloud for scale
  • +
+

4. Git-Friendly by Default

+

Principle: Knowledge should version alongside code.

+

Why: Knowledge describes code, should evolve with it.

+

Implementation:

+
    +
  • Markdown + YAML frontmatter (text-based, diffable)
  • +
  • One file per node (granular commits)
  • +
  • Wikilinks preserved (works in Logseq, Obsidian)
  • +
+

Benefits:

+
# Review knowledge changes in PRs
+git diff .kogral/decisions/
+
+# Knowledge follows branches
+git checkout feature-x
+# .kogral/ reflects feature-x decisions
+
+# Knowledge merges
+git merge feature-x
+# Merge conflicts = knowledge conflicts (resolve intentionally)
+
+

5. AI-Native, Human-Readable

+

Principle: Optimized for AI consumption, readable by humans.

+

Why: Best of both worlds - AI-assisted discovery, human verification.

+

Implementation:

+
    +
  • Structured: YAML frontmatter for AI parsing
  • +
  • Semantic: Embeddings for AI queries
  • +
  • Readable: Markdown for human consumption
  • +
  • Linked: Typed relationships for AI traversal
  • +
+

Example:

+
---
+id: note-auth
+type: note
+title: Authentication Implementation
+tags: [security, auth]
+relates_to: [guideline-security, pattern-jwt]
+---
+
+# Authentication Implementation
+
+Humans read this markdown normally.
+
+AI can:
+- Parse frontmatter for metadata
+- Extract tags for filtering
+- Follow relates_to links
+- Generate embeddings for semantic search
+
+

6. Composition Over Inheritance

+

Principle: Build systems by composing small, focused components.

+

Why: Flexibility, testability, maintainability.

+

Implementation:

+
#![allow(unused)]
+fn main() {
+// Small, focused traits
+trait Storage { ... }
+trait EmbeddingProvider { ... }
+trait TemplateEngine { ... }
+
+// Compose into systems
+struct KnowledgeBase {
+    storage: Box<dyn Storage>,
+    embeddings: Option<Box<dyn EmbeddingProvider>>,
+    templates: TemplateEngine,
+}
+}
+

Benefits:

+
    +
  • Swap storage without affecting embeddings
  • +
  • Disable embeddings without breaking storage
  • +
  • Test components in isolation
  • +
  • Add new providers by implementing trait
  • +
+

7. Fail Fast, Fail Clearly

+

Principle: Detect errors early, provide clear messages.

+

Why: Developer experience - fast feedback, actionable errors.

+

Implementation:

+
#![allow(unused)]
+fn main() {
+// ❌ Bad: Silent failure
+fn load_config(path: &Path) -> Option<Config> {
+    std::fs::read_to_string(path)
+        .ok()
+        .and_then(|s| serde_json::from_str(&s).ok())
+}
+
+// ✅ Good: Explicit errors
+fn load_config(path: &Path) -> Result<Config, ConfigError> {
+    let content = std::fs::read_to_string(path)
+        .map_err(|e| ConfigError::ReadFailed(path.to_path_buf(), e))?;
+
+    serde_json::from_str(&content)
+        .map_err(|e| ConfigError::ParseFailed(path.to_path_buf(), e))
+}
+}
+

Error messages:

+
❌ "Failed to load config"
+✅ "Failed to read config file '/path/to/config.ncl': Permission denied"
+
+

8. Convention Over Configuration (With Escape Hatches)

+

Principle: Sane defaults, but everything customizable.

+

Why: Easy to start, flexible as you grow.

+

Examples:

+
# Minimal config (uses conventions)
+{ graph = { name = "my-project" } }
+# Defaults: filesystem storage, no embeddings, standard templates
+
+# Full config (explicit everything)
+{
+  graph = { name = "my-project" },
+  storage = { primary = 'surrealdb, /* ... */ },
+  embeddings = { provider = 'openai, /* ... */ },
+  templates = { templates_dir = "custom" },
+}
+
+

Conventions:

+
    +
  • .kogral/ directory in project root
  • +
  • Filesystem storage by default
  • +
  • YAML frontmatter + markdown body
  • +
  • Standard template names (note.md.tera, decision.md.tera)
  • +
+

Escape hatches:

+
    +
  • --kb-dir to use different location
  • +
  • Configure alternative storage backends
  • +
  • Custom frontmatter schemas
  • +
  • Override any template
  • +
+

9. Documentation as Code

+

Principle: Documentation lives with code, versioned together.

+

Why: Outdated docs are worse than no docs.

+

Implementation:

+
    +
  • ADRs in .kogral/decisions/ (alongside code)
  • +
  • Guidelines in .kogral/guidelines/ (versioned with code)
  • +
  • Patterns in .kogral/patterns/ (evolve with implementations)
  • +
+

Benefits:

+
# Code and docs branch together
+git checkout old-version
+# .kogral/ reflects that version's decisions
+
+# Code and docs merge together
+git merge feature
+# Merge includes new patterns, updated guidelines
+
+# Code and docs reviewed together
+# PR shows code + decision + guideline updates
+
+

10. Optimize for Discoverability

+

Principle: Knowledge is useless if you can't find it.

+

Why: The point is to use knowledge, not just store it.

+

Features:

+
    +
  • Text search: Find exact keywords
  • +
  • Semantic search: Find related concepts
  • +
  • Graph traversal: Follow relationships
  • +
  • Tag filtering: Narrow by category
  • +
  • MCP integration: AI-assisted discovery
  • +
+

Example:

+

User doesn't remember exact term, but knows the concept:

+
"Find anything about handling errors gracefully"
+
+

KB finds (semantically):

+
    +
  • "Error Handling with thiserror" (pattern)
  • +
  • "Result Type Best Practices" (guideline)
  • +
  • "Panic Recovery" (note)
  • +
  • "Graceful Degradation" (pattern)
  • +
+

No exact keyword match needed, concept match sufficient.

+

11. Build for Humans, Enable AI

+

Principle: Humans are the primary users, AI is the assistant.

+

Why: AI should enhance human workflows, not replace them.

+

Implementation:

+
    +
  • Human-readable formats: Markdown, YAML
  • +
  • Human-editable: Any text editor works
  • +
  • Human-discoverable: ls .kogral/notes/ shows files
  • +
  • AI-enhanced: MCP for AI-assisted queries
  • +
+

Example:

+
# Human workflow
+vim .kogral/notes/my-note.md    # Edit directly
+git add .kogral/notes/my-note.md
+git commit -m "Add note about X"
+
+# AI-enhanced workflow
+# (in Claude Code)
+"Add a note about X with tags Y, Z"
+# AI creates file, human reviews
+
+

12. Embrace the Graph

+

Principle: Knowledge is interconnected, embrace the relationships.

+

Why: Context comes from connections, not isolation.

+

Implementation:

+
    +
  • Typed relationships (not just "related")
  • +
  • Bidirectional traversal
  • +
  • Relationship strength (0.0-1.0)
  • +
  • Multi-hop queries
  • +
+

Example:

+
Find all patterns that:
+  - Are implemented by current project
+  - Depend on shared guidelines
+  - Were added in the last 6 months
+
+# Graph query, not sequential file search
+
+

Anti-Patterns to Avoid

+

1. ❌ Hardcoding Behavior

+
#![allow(unused)]
+fn main() {
+// Don't
+const EMBEDDING_MODEL: &str = "BAAI/bge-small-en-v1.5";
+
+// Do
+let model = config.embeddings.model.as_str();
+}
+

2. ❌ Runtime Schema Validation

+
// Don't validate at runtime
+let provider = config.provider; // Might be invalid
+
+// Do validate at export time (Nickel contracts)
+provider | [| 'openai, 'claude, 'fastembed |]
+
+

3. ❌ Opaque Errors

+
#![allow(unused)]
+fn main() {
+// Don't
+Err("Failed".into())
+
+// Do
+Err(KbError::NodeNotFound(id.to_string()))
+}
+

4. ❌ Coupling Components

+
#![allow(unused)]
+fn main() {
+// Don't
+impl KnowledgeBase {
+    fn search(&self) -> Vec<Node> {
+        let embeddings = FastEmbedProvider::new(); // Hardcoded!
+        // ...
+    }
+}
+
+// Do
+impl KnowledgeBase {
+    fn search(&self) -> Vec<Node> {
+        if let Some(provider) = &self.embeddings {
+            // Use configured provider
+        }
+    }
+}
+}
+

5. ❌ Proprietary Formats

+
// Don't
+Binary blob: [0x4B, 0x42, 0x01, ...]
+
+// Do
+Markdown + YAML:
+---
+id: note-1
+---
+# Content
+
+

Influences

+

KB draws inspiration from:

+
    +
  • Logseq: Outliner, graph view, wikilinks
  • +
  • Obsidian: Markdown-first, local storage, plugins
  • +
  • Zettelkasten: Atomic notes, links, emergence
  • +
  • ADR: Decision records, context preservation
  • +
  • Git: Version control, branching, merging
  • +
  • Nickel: Type-safe configuration, contracts
  • +
  • MCP: AI integration protocol
  • +
  • SurrealDB: Graph database, relationships
  • +
+

Implementation Principles

+

Rust

+
    +
  • Zero unsafe code (#![forbid(unsafe_code)])
  • +
  • No unwrap() in production code
  • +
  • Always use Result<T> for fallibility
  • +
  • Comprehensive error types with thiserror
  • +
  • Full test coverage (100+ tests)
  • +
+

Nickel

+
    +
  • Contracts for validation
  • +
  • Defaults in schemas
  • +
  • Documentation in contracts
  • +
  • Composition via imports
  • +
+

NuShell

+
    +
  • Structured data pipelines
  • +
  • Error handling in scripts
  • +
  • Colored output for UX
  • +
  • Dry-run modes
  • +
+

Evolution Strategy

+

KB follows these guidelines for evolution:

+
    +
  1. Backward Compatibility: Don't break existing configs
  2. +
  3. Deprecation Period: Warn before removal (1 major version)
  4. +
  5. Migration Tools: Provide automated migrations
  6. +
  7. Semantic Versioning: MAJOR.MINOR.PATCH strictly
  8. +
+

Conclusion

+

These principles guide every decision:

+

Config-driven: Behavior in schemas, not code +✅ Type-safe: Validate before runtime +✅ Local-first: Works offline, cloud optional +✅ Git-friendly: Knowledge versions with code +✅ AI-native: Optimized for AI, readable by humans +✅ Composable: Small pieces, loosely coupled +✅ Fast feedback: Fail early, clear errors +✅ Discoverable: Easy to find what you need

+

The goal: Knowledge management that developers actually use.

+

Next Steps

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/kogral/what-is-kogral.html b/docs/book/kogral/what-is-kogral.html new file mode 100644 index 0000000..5854fd8 --- /dev/null +++ b/docs/book/kogral/what-is-kogral.html @@ -0,0 +1,423 @@ + + + + + + What is KOGRAL? - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

What is KOGRAL?

+

KOGRAL (KOwledge GRAphs, Local-first) is a git-native knowledge graph system designed for developer teams to capture, connect, and query structured knowledge.

+

Purpose

+

KOGRAL solves the problem of knowledge fragmentation in software development:

+
    +
  • 📝 Notes scattered across tools
  • +
  • 🤔 Decisions lost in chat histories
  • +
  • 📚 Guidelines buried in wikis
  • +
  • 🔄 Patterns rediscovered repeatedly
  • +
  • 🤖 AI agents lacking project context
  • +
+

Solution

+

KOGRAL provides a unified, queryable knowledge graph that:

+
    +
  1. Captures knowledge in structured, git-friendly markdown
  2. +
  3. Connects concepts through typed relationships
  4. +
  5. Queries via text and semantic similarity
  6. +
  7. Integrates with AI tools (Claude Code via MCP)
  8. +
  9. Syncs across local (filesystem) and shared (SurrealDB) storage
  10. +
+

Core Philosophy

+

Config-Driven

+

Behavior defined in Nickel schemas, not hardcoded:

+
{
+  graph = { name = "my-project" },
+  storage = { primary = 'filesystem },
+  embeddings = { provider = 'fastembed },
+  templates = { templates_dir = "templates" },
+}
+
+

Every aspect configurable: storage, embeddings, templates, query behavior.

+

Git-Friendly

+

Knowledge stored as markdown files with YAML frontmatter:

+
---
+id: note-123
+type: note
+title: Error Handling Patterns
+tags: [rust, error-handling]
+---
+
+# Error Handling Patterns
+
+Use `thiserror` for custom error types...
+
+

Changes tracked via git, reviewable in PRs, mergeable across branches.

+

AI-Native

+

Built for agent collaboration:

+
    +
  • MCP Protocol: Native integration with Claude Code
  • +
  • Semantic Search: Find concepts, not just keywords
  • +
  • Auto-Linking: Suggest relationships based on content
  • +
  • Context Injection: Agents query relevant guidelines before coding
  • +
+

Key Concepts

+

Nodes

+

6 types of knowledge nodes:

+
+ + + + + + +
TypePurposeExample
NoteGeneral observations"Rust ownership patterns"
DecisionADRs (Architectural Decision Records)"Use SurrealDB for storage"
GuidelineCode standards"Error handling with thiserror"
PatternReusable solutions"Repository pattern for DB access"
JournalDaily reflections"2026-01-17 progress notes"
ExecutionAgent task records"Implemented auth module"
+
+

Relationships

+

6 typed edges connecting nodes:

+
+ + + + + + +
RelationMeaningExample
relates_toConceptual linkNote ↔ Note
depends_onPrerequisitePattern → Guideline
implementsConcrete realizationCode → Pattern
extendsInheritanceProjectGuideline → BaseGuideline
supersedesReplacementDecisionV2 → DecisionV1
explainsDocumentationNote → Execution
+
+

Multi-Graph Architecture

+

Local Graph (per project):

+
    +
  • Stored in .kogral/ directory
  • +
  • Git-tracked for version control
  • +
  • Project-specific knowledge
  • +
+

Shared Graph (organization-wide):

+
    +
  • Centralized guidelines and patterns
  • +
  • SurrealDB for scalability
  • +
  • Inherited by projects
  • +
+

Inheritance Resolution:

+
Shared Guidelines (priority: 50)
+    ↓
+Project Guidelines (priority: 100)
+    ↓
+Effective Guidelines (higher priority wins)
+
+

Use Cases

+

For Developers

+
    +
  • Capture decisions as you make them (ADRs)
  • +
  • Document patterns for future reference
  • +
  • Track daily progress in journal entries
  • +
  • Query past decisions before new implementations
  • +
+

For Teams

+
    +
  • Share guidelines across projects
  • +
  • Standardize patterns organization-wide
  • +
  • Onboard new members with searchable knowledge
  • +
  • Review decisions in context with git history
  • +
+

For AI Agents

+
    +
  • Query guidelines before generating code
  • +
  • Check past decisions for context
  • +
  • Document executions for audit trails
  • +
  • Suggest related patterns during implementation
  • +
+

Comparison with Other Tools

+

vs. Logseq

+
+ + + + + + +
FeatureKOGRALLogseq
StorageGit-friendly markdown + DBLocal markdown
AI IntegrationNative MCP protocolPlugin-based
ConfigType-safe Nickel schemasJSON files
Multi-BackendFilesystem + SurrealDBFilesystem only
Semantic SearchMultiple AI providersLocal only
Graph QueriesSurrealDB graph queriesBlock references
+
+

Compatibility: KOGRAL can import/export Logseq graphs for visual editing.

+

vs. Obsidian

+
+ + + + + +
FeatureKOGRALObsidian
Target AudienceDevelopers + AI agentsKnowledge workers
FocusStructured knowledge graphFlexible note-taking
ConfigurationConfig-driven (Nickel)Settings UI
CLIFull CLI + MCP serverLimited CLI
Version ControlGit-nativeGit plugin
+
+

Use Case: KOGRAL for developer knowledge, Obsidian for personal notes.

+

vs. Notion/Confluence

+
+ + + + + +
FeatureKOGRALNotion/Confluence
StorageLocal-firstCloud-only
FormatPlain markdownProprietary
AI AccessProgrammatic APIWeb scraping
OfflineFull functionalityLimited
PrivacySelf-hostedThird-party servers
+
+

Advantage: KOGRAL keeps sensitive knowledge on-premises.

+

Architecture Overview

+
┌─────────────────────────────────────────────────────┐
+│                    kb-core                          │
+│  (Rust library: graph, storage, config, query)     │
+└──────────────┬─────────────┬────────────────────────┘
+               │             │
+     ┌─────────┴──────┐  ┌──┴─────────┐
+     │                │  │            │
+┌────▼─────┐  ┌──────▼──▼───┐  ┌─────▼─────┐
+│  kb-cli  │  │   kb-mcp     │  │  NuShell  │
+│ (13 cmds)│  │ (MCP server) │  │ (scripts) │
+└──────────┘  └──────────────┘  └───────────┘
+
+

Layers:

+
    +
  1. kb-core: Core library (models, storage, query)
  2. +
  3. kb-cli: Command-line interface
  4. +
  5. kb-mcp: MCP server for AI integration
  6. +
  7. Scripts: NuShell automation (sync, backup, etc.)
  8. +
+

When to Use KOGRAL

+

Good fit:

+
    +
  • Developer teams building software
  • +
  • Projects with architectural decisions
  • +
  • Organizations standardizing patterns
  • +
  • AI-assisted development workflows
  • +
  • Knowledge requiring version control
  • +
+

Not ideal for:

+
    +
  • Personal journaling (use Obsidian)
  • +
  • Team wikis (use Notion)
  • +
  • Customer documentation (use mdBook)
  • +
  • Simple note-taking (use Logseq)
  • +
+

Next Steps

+ +
+
+

"Knowledge is only valuable when it's accessible, connected, and queryable."

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/kogral/why-kogral.html b/docs/book/kogral/why-kogral.html new file mode 100644 index 0000000..7c1d5e2 --- /dev/null +++ b/docs/book/kogral/why-kogral.html @@ -0,0 +1,461 @@ + + + + + + Why KOGRAL? - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Why KB?

+

Understanding the motivation behind the Knowledge Base system.

+

The Problem: Knowledge Fragmentation

+

Modern software development generates enormous amounts of knowledge:

+

📝 Notes: Implementation details, learnings, discoveries +🤔 Decisions: Why we chose X over Y +📚 Guidelines: How we write code, architecture patterns +🔄 Patterns: Reusable solutions we've discovered +💭 Discussions: Slack threads, meeting notes, PR comments +🐛 Bug Fixes: How we solved issues

+

But where does this knowledge live?

+
    +
  • Meeting notes in Google Docs
  • +
  • Decisions buried in Slack threads
  • +
  • Guidelines in a wiki nobody updates
  • +
  • Patterns in someone's head
  • +
  • PR discussions lost in GitHub history
  • +
  • Bug solutions in closed Jira tickets
  • +
+

The result?

+

Rediscovering solutions to problems we've already solved +❌ Inconsistent practices because guidelines aren't accessible +❌ Slow onboarding as new developers lack context +❌ Lost context when team members leave +❌ Repeated mistakes because past lessons aren't preserved

+

The Solution: Unified, Queryable Knowledge Graph

+

Knowledge Base provides a single source of truth for project knowledge:

+

Capture once: Notes, decisions, guidelines, patterns +✅ Connect concepts: Typed relationships between ideas +✅ Query naturally: Text and semantic search +✅ AI-assisted: Claude Code integration via MCP +✅ Git-tracked: Version control for knowledge +✅ Shared wisdom: Organization-wide guidelines + project-specific

+

What Makes KB Different?

+

1. Git-Native

+

Other tools: Notion, Confluence, wikis in web apps

+

KB: Markdown files in .kogral/ directory

+

Benefits:

+
# Review knowledge changes in PRs
+git diff .kogral/decisions/
+
+# Branch knowledge with code
+git checkout feature-branch
+# .kogral/ follows the branch
+
+# Merge knowledge from feature work
+git merge feature-branch
+# Knowledge merges like code
+
+

Result: Knowledge versioned alongside code it describes.

+

2. AI-Native

+

Other tools: Manual search, browse folders

+

KB: AI queries via Claude Code

+

Example:

+
You: "Find anything about error handling"
+
+Claude: [Searches semantically, not just keywords]
+Found 5 concepts:
+- Pattern: Error Handling with thiserror
+- Guideline: Result Type Best Practices
+- Decision: Use anyhow for Application Errors
+- Note: Custom Error Types
+- Journal: Fixed error propagation bug
+
+[All related, even without exact keyword match]
+
+

Result: Find concepts, not just documents with keywords.

+

3. Config-Driven

+

Other tools: Hardcoded behavior, limited customization

+

KB: Nickel schemas define everything

+

Example:

+
# Development: local embeddings, no costs
+{ embeddings = { provider = 'fastembed } }
+
+# Production: cloud embeddings, best quality
+{ embeddings = { provider = 'openai, model = "text-embedding-3-large" } }
+
+

Result: Adapt behavior without code changes.

+

4. Multi-Graph

+

Other tools: One knowledge base per project

+

KB: Shared organizational knowledge + project-specific

+

Structure:

+
Organization Shared KB
+  ├── Rust Guidelines (applies to all projects)
+  ├── Security Patterns (applies to all projects)
+  └── Testing Standards (applies to all projects)
+
+Project A KB
+  ├── Inherits shared guidelines
+  ├── Project-specific decisions
+  └── Can override shared guidelines
+
+Project B KB
+  ├── Inherits same shared guidelines
+  ├── Different project decisions
+  └── Different overrides
+
+

Result: Consistency across organization, flexibility per project.

+

5. Structured Relationships

+

Other tools: Backlinks, tags, folders

+

KB: Typed relationships with meaning

+

Example:

+
Pattern: Repository Pattern
+    ↑ [implements]
+Note: User Service Implementation
+    ↑ [relates_to]
+Decision: Use PostgreSQL
+    ↑ [depends_on]
+Guideline: Database Access Patterns
+
+

Result: Understand how knowledge connects, not just that it connects.

+

Real-World Impact

+

Before KB

+

New developer joins:

+
    +
  1. Read outdated wiki (2 hours)
  2. +
  3. Ask teammates for context (1 hour per question × 10 questions)
  4. +
  5. Discover guidelines by reading code (days)
  6. +
  7. Miss important decisions (leads to mistakes)
  8. +
+

Time to productivity: 2-4 weeks

+

With KB

+

New developer joins:

+
    +
  1. kb search "architectural decisions" → finds all ADRs
  2. +
  3. Ask Claude: "What are our coding guidelines?" → gets current guidelines with inheritance
  4. +
  5. Browse related notes via graph traversal
  6. +
  7. Full context available, no tribal knowledge
  8. +
+

Time to productivity: 3-5 days

+

Before KB

+

Team makes decision:

+
    +
  1. Discussion in Slack (lost after a week)
  2. +
  3. Someone documents in wiki (maybe)
  4. +
  5. 6 months later: "Why did we choose X?" → nobody remembers
  6. +
  7. Re-debate the same decision
  8. +
+

With KB

+

Team makes decision:

+
    +
  1. Discussion captured as ADR during meeting
  2. +
  3. Context, decision, consequences documented
  4. +
  5. Linked to related patterns and guidelines
  6. +
  7. 6 months later: kb show decision-use-x → full context instantly
  8. +
+

Before KB

+

Solving a bug:

+
    +
  1. Encounter race condition in cache
  2. +
  3. Debug for 2 hours
  4. +
  5. Fix it
  6. +
  7. Solution lost in PR comments
  8. +
+

Two months later: Different developer, same bug, 2 more hours

+

With KB

+

Solving a bug:

+
    +
  1. Encounter race condition
  2. +
  3. Ask Claude: "Have we seen cache race conditions before?"
  4. +
  5. Claude finds journal entry from 2 months ago with solution
  6. +
  7. Apply fix in 10 minutes
  8. +
+

Two months later: Same query, same instant solution

+

Who Benefits?

+

Individual Developers

+

Personal knowledge base: Capture learnings, build expertise +✅ Quick recall: "How did I solve this before?" +✅ Context switching: Return to old projects with full context +✅ Career growth: Document what you learn, portfolio of knowledge

+

Teams

+

Shared context: Everyone has access to team knowledge +✅ Onboarding: New members ramp up faster +✅ Consistency: Follow shared guidelines and patterns +✅ Collaboration: Build on each other's knowledge

+

Organizations

+

Institutional memory: Knowledge persists beyond individual tenure +✅ Best practices: Standardize across teams +✅ Compliance: Document security and architecture decisions +✅ Efficiency: Stop solving the same problems repeatedly

+

AI Agents

+

Context injection: Agents query guidelines before generating code +✅ Decision awareness: Agents check past decisions +✅ Pattern following: Agents use documented patterns +✅ Execution tracking: Agent actions documented automatically

+

When NOT to Use KB

+

KB is not ideal for:

+

Personal journaling: Use Obsidian or Logseq +❌ Team wikis: Use Notion or Confluence +❌ Customer docs: Use mdBook or Docusaurus +❌ Project management: Use Jira or Linear +❌ Code comments: Use inline documentation

+

KB is perfect for:

+

✅ Developer knowledge graphs +✅ Architectural decision records +✅ Pattern libraries +✅ Coding guidelines +✅ Technical context +✅ AI-assisted development

+

The Vision

+

Today's development:

+
Developer → writes code → commits
+
+

With KB:

+
Developer → writes code → documents decisions → links to patterns → commits code + knowledge
+                    ↓
+            AI Agent queries knowledge → generates better code
+                    ↓
+            Team discovers patterns → reuses solutions → faster development
+
+

Knowledge becomes an active participant in development, not an afterthought.

+

Design Philosophy

+

Three core principles drive KB:

+

1. Knowledge should be captured during work, not after

+

❌ "I'll document this later" → never happens +✅ "Claude, document this decision" → done in 30 seconds

+

2. Knowledge should be connected, not isolated

+

❌ Standalone documents in folders +✅ Graph of interconnected concepts

+

3. Knowledge should be queryable, not browsable

+

❌ "Let me look through 50 docs to find..." +✅ "Find anything related to error handling" → instant semantic results

+

Get Started

+

Ready to stop losing knowledge?

+ +
+
+

"The best time to document was during implementation. The second best time is now."

+
+

But with KB + AI, "now" is instant.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/mark.min.js b/docs/book/mark.min.js new file mode 100644 index 0000000..1636231 --- /dev/null +++ b/docs/book/mark.min.js @@ -0,0 +1,7 @@ +/*!*************************************************** +* mark.js v8.11.1 +* https://markjs.io/ +* Copyright (c) 2014–2018, Julian Kühnel +* Released under the MIT license https://git.io/vwTVl +*****************************************************/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Mark=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&o(c)};s||u(),a.forEach(function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach(function(e,t){e.val===n&&(i=t,o=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o,a=this,s=this.createIterator(t,e,r),c=[],u=[],l=void 0,h=void 0;void 0,o=a.getIteratorNode(s),h=o.prevNode,l=o.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(l,h,e,c)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return u.push(e)},r)}),u.push(l);u.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(c,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach(function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,function(){--a<=0&&i()})};r.iframes?r.waitForIframes(o,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),o=function(){function e(n){t(this,e),this.opt=r({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},n)}return n(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm"+(this.opt.caseSensitive?"":"i"))}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynonyms(a)+"|"+this.processSynonyms(s)+")"+r))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="";switch(("string"==typeof n?[]:n.limiters).forEach(function(e){i+="|"+t.escapeStr(e)}),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=o.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,i){for(var o=t.length,a=1;a-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,i))}return e}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];){if(o.opt.separateGroups)t=o.separateGroups(t,i,a,n,r);else{if(!n(i[a],t))continue;var s=i.index;if(0!==a)for(var c=1;c + + + + + KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

KOGRAL Documentation

+

Welcome to the KOGRAL documentation! This directory contains comprehensive documentation for KOGRAL (KOwledge GRAphs, Local-first), built with mdBook.

+

📚 Reading the Documentation

+

You have several options for reading the documentation:

+ +

The best reading experience with navigation, search, and live reload:

+
# Serve documentation at http://localhost:3000
+just docs::serve
+
+

This will:

+
    +
  • Build the mdBook
  • +
  • Start a local web server on port 3000
  • +
  • Open your browser automatically
  • +
  • Watch for changes and auto-reload
  • +
+

Option 2: Build Static HTML

+

Generate static HTML files you can browse offline:

+
# Build mdBook to docs/book/
+just docs::build
+
+

Then open docs/book/index.html in your browser.

+

Option 3: Read Markdown Files Directly

+

All documentation is written in Markdown and can be read directly:

+
    +
  • Browse via GitHub/GitLab web interface
  • +
  • Use your editor's Markdown preview
  • +
  • Read from terminal with bat, glow, or similar tools
  • +
+

Navigation: See SUMMARY.md for the complete table of contents.

+

🛠️ Documentation Commands

+

We use just recipes for documentation tasks. All commands assume you're in the project root directory.

+

Build and Serve

+
# Serve documentation locally (recommended)
+just docs::serve
+
+# Build static HTML
+just docs::build
+
+# Watch and rebuild on file changes
+just docs::watch
+
+

Validation

+
# Test code examples in documentation
+just docs::test
+
+# Check for broken links
+just docs::check-links
+
+

Cleanup

+
# Remove build artifacts
+just docs::clean
+
+

View All Documentation Commands

+
just docs::help
+
+

📦 Installing mdBook

+

mdBook is required to build and serve the documentation.

+

Install via Cargo

+
cargo install mdbook
+
+

Install Optional Tools

+

For enhanced functionality:

+
# Link checker (validates internal/external links)
+cargo install mdbook-linkcheck
+
+# Mermaid diagram support
+cargo install mdbook-mermaid
+
+# PlantUML diagram support
+cargo install mdbook-plantuml
+
+

Verify Installation

+
mdbook --version
+# Should output: mdbook v0.4.x or later
+
+

📖 Documentation Structure

+

The documentation is organized into the following sections:

+

1. KOGRAL Definition (kogral/)

+
    +
  • What is KOGRAL and why it exists
  • +
  • Core concepts (nodes, edges, graphs)
  • +
  • Design philosophy
  • +
+

2. Guides (guides/)

+
    +
  • Quick start (5 minutes)
  • +
  • Installation guide
  • +
  • Use cases with examples
  • +
+

3. Architecture (architecture/)

+
    +
  • System overview with diagrams
  • +
  • Config-driven architecture
  • +
  • Graph model details
  • +
  • ADRs (Architectural Decision Records)
  • +
+

4. Setup (setup/)

+
    +
  • Initial setup
  • +
  • Development environment
  • +
  • Production deployment
  • +
  • Testing environment
  • +
  • CI/CD integration
  • +
+

5. Configuration (config/)

+
    +
  • Configuration overview
  • +
  • Nickel schema reference
  • +
  • Runtime configuration
  • +
  • Environment modes (dev/prod/test)
  • +
+

6. Storage (storage/)

+
    +
  • Storage architecture (hybrid strategy)
  • +
  • Filesystem backend
  • +
  • SurrealDB backend
  • +
  • In-memory backend
  • +
  • Sync mechanism
  • +
+

7. AI & Embeddings (ai/)

+
    +
  • Semantic search
  • +
  • Embedding providers
  • +
  • Provider comparison
  • +
  • Configuration examples
  • +
+

8. Templates (templates/)

+
    +
  • Template system (Tera)
  • +
  • Document templates
  • +
  • Export templates
  • +
  • Custom templates
  • +
+

9. CLI Reference (cli/)

+
    +
  • All kb-cli commands
  • +
  • Common workflows
  • +
  • Advanced usage
  • +
  • Troubleshooting
  • +
+

10. Apps & Integrations (apps/)

+
    +
  • MCP quick guide (Claude Code)
  • +
  • Logseq integration
  • +
  • Vapora integration
  • +
+

11. API Reference (api/)

+
    +
  • MCP tools specification
  • +
  • Storage trait
  • +
  • Embedding trait
  • +
  • REST API (future)
  • +
+

12. Contributing (contributing/)

+
    +
  • Development setup
  • +
  • Code guidelines
  • +
  • Testing standards
  • +
  • Documentation guidelines
  • +
+

🎨 Visual Diagrams

+

The documentation includes SVG diagrams for visual understanding:

+ +

These diagrams are embedded in relevant documentation pages and can be viewed standalone in a browser.

+

🔍 Searching the Documentation

+

When using just docs::serve, you get a built-in search feature:

+
    +
  1. Click the search icon (🔍) in the top-left corner
  2. +
  3. Type your query
  4. +
  5. Press Enter to navigate results
  6. +
+

The search indexes all documentation content including:

+
    +
  • Page titles
  • +
  • Headers
  • +
  • Body text
  • +
  • Code examples (optionally)
  • +
+

✏️ Editing Documentation

+

File Format

+

All documentation is written in GitHub Flavored Markdown with mdBook extensions.

+

See contributing/documentation.md for detailed editing guidelines.

+

Adding a New Page

+
    +
  1. Create the markdown file in the appropriate directory
  2. +
  3. Add it to SUMMARY.md for navigation
  4. +
  5. Build to verify: just docs::build
  6. +
+

Adding a New Section

+
    +
  1. Create the directory
  2. +
  3. Add a README.md for the section landing page
  4. +
  5. Add section to SUMMARY.md
  6. +
+

🧪 Testing Documentation

+

Test Code Examples

+
just docs::test
+
+

This runs all Rust code examples in the documentation to ensure they compile.

+ +
just docs::check-links
+
+

This validates all internal and external links.

+

📝 Documentation Standards

+

When contributing to documentation:

+
    +
  1. Use clear, concise language - Write for developers and AI agents
  2. +
  3. Include code examples - Show, don't just tell
  4. +
  5. Add diagrams where helpful - Visual aids improve understanding
  6. +
  7. Link related concepts - Help readers discover related content
  8. +
  9. Test code examples - Ensure code compiles and works
  10. +
  11. Use consistent formatting - Follow existing page structure
  12. +
  13. Update SUMMARY.md - New pages must be in navigation
  14. +
  15. Run checks before committing:
  16. +
+
just docs::build
+just docs::test
+just docs::check-links
+
+

💡 Tips

+

Live Reload While Writing

+
just docs::watch
+
+

This watches for changes and rebuilds automatically. Open http://localhost:3000 in your browser to see updates in real-time.

+

Markdown Preview in Editor

+

Most editors have Markdown preview:

+
    +
  • VS Code: Ctrl+Shift+V (Cmd+Shift+V on Mac)
  • +
  • IntelliJ/CLion: Preview pane (right side)
  • +
  • Vim/Neovim: Use plugins like markdown-preview.nvim
  • +
+

Quick Reference

+
    +
  • SUMMARY.md - Table of contents (edit to add/remove pages)
  • +
  • book.toml - mdBook configuration
  • +
  • theme/ - Custom CSS/JS (if needed)
  • +
  • diagrams/ - SVG diagrams
  • +
+

🐛 Troubleshooting

+

mdbook command not found

+
# Install mdBook
+cargo install mdbook
+
+# Verify installation
+mdbook --version
+
+

Port 3000 already in use

+
# Serve on different port
+cd docs
+mdbook serve --port 3001
+
+ +
# Check all links
+just docs::check-links
+
+# Update internal links in affected files
+# Then rebuild
+just docs::build
+
+

📚 Resources

+ +

🤝 Contributing to Documentation

+

Documentation improvements are always welcome! To contribute:

+
    +
  1. Fork the repository
  2. +
  3. Create a feature branch
  4. +
  5. Make your changes
  6. +
  7. Test with just docs::build and just docs::test
  8. +
  9. Submit a pull request
  10. +
+

See contributing/documentation.md for detailed guidelines.

+
+

Happy documenting! 📖

+

If you have questions or need help, please open an issue or reach out to the maintainers.

+

What is KOGRAL?

+

KOGRAL (KOwledge GRAphs, Local-first) is a git-native knowledge graph system designed for developer teams to capture, connect, and query structured knowledge.

+

Purpose

+

KOGRAL solves the problem of knowledge fragmentation in software development:

+
    +
  • 📝 Notes scattered across tools
  • +
  • 🤔 Decisions lost in chat histories
  • +
  • 📚 Guidelines buried in wikis
  • +
  • 🔄 Patterns rediscovered repeatedly
  • +
  • 🤖 AI agents lacking project context
  • +
+

Solution

+

KOGRAL provides a unified, queryable knowledge graph that:

+
    +
  1. Captures knowledge in structured, git-friendly markdown
  2. +
  3. Connects concepts through typed relationships
  4. +
  5. Queries via text and semantic similarity
  6. +
  7. Integrates with AI tools (Claude Code via MCP)
  8. +
  9. Syncs across local (filesystem) and shared (SurrealDB) storage
  10. +
+

Core Philosophy

+

Config-Driven

+

Behavior defined in Nickel schemas, not hardcoded:

+
{
+  graph = { name = "my-project" },
+  storage = { primary = 'filesystem },
+  embeddings = { provider = 'fastembed },
+  templates = { templates_dir = "templates" },
+}
+
+

Every aspect configurable: storage, embeddings, templates, query behavior.

+

Git-Friendly

+

Knowledge stored as markdown files with YAML frontmatter:

+
---
+id: note-123
+type: note
+title: Error Handling Patterns
+tags: [rust, error-handling]
+---
+
+# Error Handling Patterns
+
+Use `thiserror` for custom error types...
+
+

Changes tracked via git, reviewable in PRs, mergeable across branches.

+

AI-Native

+

Built for agent collaboration:

+
    +
  • MCP Protocol: Native integration with Claude Code
  • +
  • Semantic Search: Find concepts, not just keywords
  • +
  • Auto-Linking: Suggest relationships based on content
  • +
  • Context Injection: Agents query relevant guidelines before coding
  • +
+

Key Concepts

+

Nodes

+

6 types of knowledge nodes:

+
+ + + + + + +
TypePurposeExample
NoteGeneral observations"Rust ownership patterns"
DecisionADRs (Architectural Decision Records)"Use SurrealDB for storage"
GuidelineCode standards"Error handling with thiserror"
PatternReusable solutions"Repository pattern for DB access"
JournalDaily reflections"2026-01-17 progress notes"
ExecutionAgent task records"Implemented auth module"
+
+

Relationships

+

6 typed edges connecting nodes:

+
+ + + + + + +
RelationMeaningExample
relates_toConceptual linkNote ↔ Note
depends_onPrerequisitePattern → Guideline
implementsConcrete realizationCode → Pattern
extendsInheritanceProjectGuideline → BaseGuideline
supersedesReplacementDecisionV2 → DecisionV1
explainsDocumentationNote → Execution
+
+

Multi-Graph Architecture

+

Local Graph (per project):

+
    +
  • Stored in .kogral/ directory
  • +
  • Git-tracked for version control
  • +
  • Project-specific knowledge
  • +
+

Shared Graph (organization-wide):

+
    +
  • Centralized guidelines and patterns
  • +
  • SurrealDB for scalability
  • +
  • Inherited by projects
  • +
+

Inheritance Resolution:

+
Shared Guidelines (priority: 50)
+    ↓
+Project Guidelines (priority: 100)
+    ↓
+Effective Guidelines (higher priority wins)
+
+

Use Cases

+

For Developers

+
    +
  • Capture decisions as you make them (ADRs)
  • +
  • Document patterns for future reference
  • +
  • Track daily progress in journal entries
  • +
  • Query past decisions before new implementations
  • +
+

For Teams

+
    +
  • Share guidelines across projects
  • +
  • Standardize patterns organization-wide
  • +
  • Onboard new members with searchable knowledge
  • +
  • Review decisions in context with git history
  • +
+

For AI Agents

+
    +
  • Query guidelines before generating code
  • +
  • Check past decisions for context
  • +
  • Document executions for audit trails
  • +
  • Suggest related patterns during implementation
  • +
+

Comparison with Other Tools

+

vs. Logseq

+
+ + + + + + +
FeatureKOGRALLogseq
StorageGit-friendly markdown + DBLocal markdown
AI IntegrationNative MCP protocolPlugin-based
ConfigType-safe Nickel schemasJSON files
Multi-BackendFilesystem + SurrealDBFilesystem only
Semantic SearchMultiple AI providersLocal only
Graph QueriesSurrealDB graph queriesBlock references
+
+

Compatibility: KOGRAL can import/export Logseq graphs for visual editing.

+

vs. Obsidian

+
+ + + + + +
FeatureKOGRALObsidian
Target AudienceDevelopers + AI agentsKnowledge workers
FocusStructured knowledge graphFlexible note-taking
ConfigurationConfig-driven (Nickel)Settings UI
CLIFull CLI + MCP serverLimited CLI
Version ControlGit-nativeGit plugin
+
+

Use Case: KOGRAL for developer knowledge, Obsidian for personal notes.

+

vs. Notion/Confluence

+
+ + + + + +
FeatureKOGRALNotion/Confluence
StorageLocal-firstCloud-only
FormatPlain markdownProprietary
AI AccessProgrammatic APIWeb scraping
OfflineFull functionalityLimited
PrivacySelf-hostedThird-party servers
+
+

Advantage: KOGRAL keeps sensitive knowledge on-premises.

+

Architecture Overview

+
┌─────────────────────────────────────────────────────┐
+│                    kb-core                          │
+│  (Rust library: graph, storage, config, query)     │
+└──────────────┬─────────────┬────────────────────────┘
+               │             │
+     ┌─────────┴──────┐  ┌──┴─────────┐
+     │                │  │            │
+┌────▼─────┐  ┌──────▼──▼───┐  ┌─────▼─────┐
+│  kb-cli  │  │   kb-mcp     │  │  NuShell  │
+│ (13 cmds)│  │ (MCP server) │  │ (scripts) │
+└──────────┘  └──────────────┘  └───────────┘
+
+

Layers:

+
    +
  1. kb-core: Core library (models, storage, query)
  2. +
  3. kb-cli: Command-line interface
  4. +
  5. kb-mcp: MCP server for AI integration
  6. +
  7. Scripts: NuShell automation (sync, backup, etc.)
  8. +
+

When to Use KOGRAL

+

Good fit:

+
    +
  • Developer teams building software
  • +
  • Projects with architectural decisions
  • +
  • Organizations standardizing patterns
  • +
  • AI-assisted development workflows
  • +
  • Knowledge requiring version control
  • +
+

Not ideal for:

+
    +
  • Personal journaling (use Obsidian)
  • +
  • Team wikis (use Notion)
  • +
  • Customer documentation (use mdBook)
  • +
  • Simple note-taking (use Logseq)
  • +
+

Next Steps

+ +
+
+

"Knowledge is only valuable when it's accessible, connected, and queryable."

+
+

Core Concepts

+

Understanding the fundamental concepts behind KOGRAL.

+

The Knowledge Graph

+

At its core, KOGRAL is a directed graph where:

+
    +
  • Nodes = pieces of knowledge (notes, decisions, guidelines, patterns)
  • +
  • Edges = typed relationships between concepts
  • +
+

Node Types and Relationships

+

This graph structure enables:

+
    +
  • Discovery: Find related concepts through traversal
  • +
  • Context: Understand how ideas connect
  • +
  • Evolution: Track how knowledge changes over time
  • +
+

Node Types

+

1. Note

+

Purpose: Capture general observations, learnings, and discoveries.

+

When to use:

+
    +
  • Documenting a concept you learned
  • +
  • Recording implementation details
  • +
  • Capturing meeting notes
  • +
  • Quick knowledge capture
  • +
+

Example:

+
---
+type: note
+title: Async Trait Patterns in Rust
+tags: [rust, async, patterns]
+---
+
+# Async Trait Patterns in Rust
+
+Using async traits with the async-trait crate...
+
+

2. Decision (ADR)

+

Purpose: Record architectural decisions with full context.

+

When to use:

+
    +
  • Choosing between alternatives (REST vs GraphQL)
  • +
  • Major technical decisions (database selection)
  • +
  • Trade-off analysis
  • +
  • Explaining "why" for future reference
  • +
+

Structure:

+
    +
  • Context: Background and problem
  • +
  • Decision: What was chosen
  • +
  • Consequences: Positive and negative outcomes
  • +
  • Alternatives: What was considered but rejected
  • +
+

Example:

+
---
+type: decision
+title: Use SurrealDB for Storage
+status: accepted
+---
+
+## Context
+Need a graph database that supports our relationship model...
+
+## Decision
+Adopt SurrealDB as the primary storage backend.
+
+## Consequences
++ Better graph query performance
++ Native relationship support
+- Additional infrastructure dependency
+- Team learning curve
+
+

3. Guideline

+

Purpose: Define coding standards, best practices, and conventions.

+

When to use:

+
    +
  • Code style rules
  • +
  • Architecture patterns to follow
  • +
  • Security requirements
  • +
  • Testing standards
  • +
+

Can be:

+
    +
  • Shared: Organization-wide (in shared KOGRAL)
  • +
  • Project-specific: Overrides shared guidelines
  • +
+

Example:

+
---
+type: guideline
+language: rust
+category: error-handling
+---
+
+# Rust Error Handling Guidelines
+
+1. Use `thiserror` for custom error types
+2. Never use `unwrap()` in production code
+3. Always propagate errors with `?`
+
+

4. Pattern

+

Purpose: Document reusable solutions to common problems.

+

When to use:

+
    +
  • Recurring implementation patterns
  • +
  • Tested solutions
  • +
  • Best practice implementations
  • +
  • Code templates
  • +
+

Structure:

+
    +
  • Problem: What challenge does this solve?
  • +
  • Solution: The pattern/approach
  • +
  • Context: When to use/not use
  • +
  • Example: Working code
  • +
+

Example:

+
---
+type: pattern
+title: Repository Pattern for Database Access
+tags: [architecture, database, pattern]
+---
+
+## Problem
+Need consistent database access across modules.
+
+## Solution
+Repository pattern with trait abstraction...
+
+## Example
+\`\`\`rust
+trait UserRepository {
+    async fn find_by_id(&self, id: Uuid) -> Result<User>;
+}
+\`\`\`
+
+

5. Journal

+

Purpose: Daily development log for tracking progress and reflections.

+

When to use:

+
    +
  • End of day summaries
  • +
  • Daily standup notes
  • +
  • Progress tracking
  • +
  • Blocker documentation
  • +
+

Auto-linked: KOGRAL can auto-link journal entries to mentioned concepts.

+

Example:

+
---
+type: journal
+date: 2026-01-17
+---
+
+## Progress
+- Implemented authentication module
+- Fixed cache race condition
+
+## Blockers
+- Need API versioning discussion
+
+## Learnings
+- tokio::select! perfect for timeouts
+
+

6. Execution

+

Purpose: Record AI agent execution results (from Vapora integration).

+

When to use:

+
    +
  • Agent task completion
  • +
  • Execution metrics
  • +
  • Agent decision history
  • +
  • Audit trail
  • +
+

Example:

+
---
+type: execution
+task_type: code_generation
+agent: rust-expert
+outcome: success
+duration: 45s
+---
+
+Generated authentication module following project guidelines.
+
+

Relationship Types

+

1. relates_to

+

Meaning: General conceptual relationship.

+

Use: Connect related ideas without specific dependency.

+

Example:

+
[Note: Async Patterns] --relates_to--> [Note: Tokio Runtime]
+
+

2. depends_on

+

Meaning: Prerequisite relationship. Source requires target to exist/be understood first.

+

Use: Learning paths, implementation order.

+

Example:

+
[Pattern: Advanced Error Handling] --depends_on--> [Guideline: Basic Errors]
+
+

3. implements

+

Meaning: Concrete implementation of an abstract concept.

+

Use: Connect code to patterns/guidelines.

+

Example:

+
[Note: Auth Module Implementation] --implements--> [Pattern: Repository Pattern]
+
+

4. extends

+

Meaning: Inheritance/extension relationship.

+

Use: Guideline overrides, pattern variations.

+

Example:

+
[Guideline: Project Error Handling] --extends--> [Guideline: Shared Error Handling]
+
+

5. supersedes

+

Meaning: Replacement relationship. Source replaces target.

+

Use: Track evolution of decisions/patterns.

+

Example:

+
[Decision: Use GraphQL v2] --supersedes--> [Decision: Use REST]
+
+

6. explains

+

Meaning: Documentation/clarification relationship.

+

Use: Connect notes to implementations, executions to rationale.

+

Example:

+
[Note: Why We Chose Rust] --explains--> [Decision: Adopt Rust]
+
+

Multi-Graph Architecture

+

KB supports multiple knowledge graphs:

+

Local Graph (Project-Specific)

+

Location: .kogral/ in project directory

+

Purpose: Project-specific knowledge

+
    +
  • Project decisions
  • +
  • Implementation notes
  • +
  • Local patterns
  • +
  • Daily journals
  • +
+

Storage: Filesystem (git-tracked)

+

Scope: Single project

+

Shared Graph (Organization-Wide)

+

Location: Configurable (e.g., ~/org/.kogral-shared)

+

Purpose: Shared organizational knowledge

+
    +
  • Coding guidelines
  • +
  • Standard patterns
  • +
  • Architecture principles
  • +
  • Security policies
  • +
+

Storage: SurrealDB (centralized) or filesystem (synced)

+

Scope: All projects

+

Inheritance Model

+
Shared Guidelines (priority: 50)
+        ↓ [inherited by]
+Project Guidelines (priority: 100)
+        ↓ [effective]
+Combined Guidelines (higher priority wins)
+
+

Example:

+

Shared guideline: "Use Result for errors" +Project override: "Use Result + log all errors with tracing" +Effective: Both rules apply, project adds requirement

+

Config-Driven Behavior

+

Everything is configurable via Nickel schemas:

+
{
+  graph = { name = "my-project" },          # Graph metadata
+  storage = { primary = 'filesystem },       # Where to store
+  embeddings = { provider = 'fastembed },    # AI provider
+  templates = { /* ... */ },                 # Document templates
+  query = { similarity_threshold = 0.6 },    # Search behavior
+}
+
+

No hardcoding: Change behavior without code changes.

+ +

Beyond keyword matching, KOGRAL uses embeddings to find concepts:

+

Keyword search: "Find 'error handling'"

+
    +
  • Matches exact phrase "error handling"
  • +
+

Semantic search: "How to handle failures gracefully?"

+
    +
  • Finds: error handling, exception patterns, Result types, panic recovery
  • +
  • Understands: "failures" = errors, "gracefully" = best practices
  • +
+

How it works:

+
    +
  1. Text → Embedding (384 or 1536 dimensional vector)
  2. +
  3. Similarity search (cosine distance)
  4. +
  5. Return nodes above threshold (e.g., 0.6)
  6. +
+

Providers:

+
    +
  • fastembed: Local, free, offline (384d)
  • +
  • OpenAI: Cloud, best quality (1536d)
  • +
  • Claude: Cloud, excellent (1024d)
  • +
  • Ollama: Self-hosted (768d)
  • +
+

Templates

+

Tera templates generate consistent documents:

+
---
+id: {{ id }}
+type: {{ type }}
+title: {{ title }}
+tags: [{% for tag in tags %}"{{ tag }}"{% endfor %}]
+---
+
+# {{ title }}
+
+{{ content }}
+
+

Customizable: Override templates per project.

+

Export formats: Logseq, JSON, Markdown.

+

MCP Integration

+

Model Context Protocol connects KOGRAL to Claude Code:

+
Claude Code
+    ↓ [JSON-RPC 2.0]
+kb-mcp Server
+    ↓ [Rust API]
+kb-core Library
+    ↓ [Storage]
+Knowledge Graph
+
+

Tools: kogral/search, kogral/add_note, kogral/get_guidelines, etc.

+

Resources: kogral://project/notes, kogral://shared/guidelines

+

Prompts: kogral/summarize_project, kogral/find_related

+

Git-Friendly Storage

+

Markdown + YAML frontmatter = git-tracked knowledge:

+
---
+id: note-123
+type: note
+title: My Note
+---
+
+# Content here
+
+

Benefits:

+
    +
  • ✅ Diffs in PRs (reviewable changes)
  • +
  • ✅ Branches (experiment with knowledge)
  • +
  • ✅ Merges (combine knowledge from feature branches)
  • +
  • ✅ History (track evolution over time)
  • +
  • ✅ Blame (who added this knowledge?)
  • +
+

Logseq Content Blocks

+

KOGRAL provides full support for Logseq-style outliner blocks with rich metadata and structure.

+

What are Blocks?

+

Blocks are the fundamental unit of content in Logseq's outliner format:

+
    +
  • Each bullet point is a block
  • +
  • Blocks can have children (nested blocks)
  • +
  • Blocks support tasks, tags, and custom properties
  • +
  • Blocks can reference other blocks or pages
  • +
+

Block Features

+

Task Status:

+
- TODO Implement authentication #high-priority
+- DOING Write tests
+- DONE Deploy to staging
+- LATER Consider GraphQL API
+- NOW Fix critical bug
+- WAITING Code review from @alice
+- CANCELLED Old approach
+
+

Inline Tags:

+
- Learning Rust ownership #rust #learning #card
+  - Prevents data races at compile time
+  - Borrowing rules enforce safety
+
+

Custom Properties:

+
- Research paper summary
+  priority:: high
+  reviewed:: 2026-01-17
+  source:: https://example.com/paper.pdf
+  - Key findings...
+
+

Block and Page References:

+
- Meeting notes from [[2026-01-17]]
+  - Discussed architecture ((block-ref-123))
+  - Action items: [[Project Roadmap]]
+
+

Hierarchical Structure:

+
- Parent block #top-level
+  - Child block 1
+    - Nested child
+  - Child block 2
+
+

Configuration

+

Blocks support is opt-in via configuration:

+
{
+  blocks = {
+    enabled = true,              # Enable blocks parsing
+    parse_on_import = true,      # Auto-parse from Logseq imports
+    serialize_on_export = true,  # Serialize to outliner format
+    enable_mcp_tools = true,     # Enable block-related MCP tools
+  },
+}
+
+

Use Cases

+

1. Task Management:

+
- TODO Weekly sprint planning #meeting
+  - DONE Review last sprint
+  - DOING Plan current sprint
+  - TODO Assign tasks
+
+

2. Flashcards (Spaced Repetition):

+
- What is Rust's ownership model? #card #rust
+  - Ownership prevents data races at compile time
+  - Each value has a single owner
+  - When owner goes out of scope, value is dropped
+
+

3. Knowledge Capture with Metadata:

+
- Tokio async runtime patterns #rust #async
+  category:: architecture
+  difficulty:: intermediate
+  - Use tokio::select! for concurrent operations
+  - spawn_blocking() for CPU-intensive work
+
+

4. Linked Notes:

+
- Discussed [[ADR-001]] in architecture meeting
+  - Decided on SurrealDB
+  - See ((meeting-notes-block-id)) for details
+
+

Block Queries (MCP Tools)

+

Query blocks across your knowledge base:

+

Find blocks by tag:

+
{
+  "tool": "kogral/find_blocks",
+  "arguments": { "tag": "card" }
+}
+
+

Find all TODOs:

+
{
+  "tool": "kogral/find_todos",
+  "arguments": { "limit": 20 }
+}
+
+

Find flashcards:

+
{
+  "tool": "kogral/find_cards",
+  "arguments": { "limit": 10 }
+}
+
+

Find blocks by property:

+
{
+  "tool": "kogral/find_blocks",
+  "arguments": {
+    "property_key": "priority",
+    "property_value": "high"
+  }
+}
+
+

Architecture

+

Hybrid Model:

+
    +
  • Content stored as markdown string (source of truth)
  • +
  • Blocks lazily parsed on first access
  • +
  • Cached block structure for fast queries
  • +
  • Bidirectional: markdown ↔ blocks
  • +
+

BlockParser:

+
    +
  • Parse outliner markdown → Block structures
  • +
  • Serialize Block structures → outliner markdown
  • +
  • Preserve all metadata (tags, status, properties, references)
  • +
  • Round-trip fidelity for Logseq compatibility
  • +
+

Storage:

+
    +
  • Filesystem: markdown with blocks inline
  • +
  • SurrealDB: dedicated block table with indexes
  • +
  • Indexes: tags, status, parent_id, full-text search
  • +
+

See Also:

+ +

Key Principles

+
    +
  1. Capture During Work: Don't wait, document as you go
  2. +
  3. Link as You Learn: Connect related concepts immediately
  4. +
  5. Query When Needed: AI-assisted discovery of relevant knowledge
  6. +
  7. Evolve Over Time: Update decisions, supersede patterns
  8. +
  9. Share Wisely: Shared guidelines, local specifics
  10. +
+

Next Steps

+ +

Why KB?

+

Understanding the motivation behind the Knowledge Base system.

+

The Problem: Knowledge Fragmentation

+

Modern software development generates enormous amounts of knowledge:

+

📝 Notes: Implementation details, learnings, discoveries +🤔 Decisions: Why we chose X over Y +📚 Guidelines: How we write code, architecture patterns +🔄 Patterns: Reusable solutions we've discovered +💭 Discussions: Slack threads, meeting notes, PR comments +🐛 Bug Fixes: How we solved issues

+

But where does this knowledge live?

+
    +
  • Meeting notes in Google Docs
  • +
  • Decisions buried in Slack threads
  • +
  • Guidelines in a wiki nobody updates
  • +
  • Patterns in someone's head
  • +
  • PR discussions lost in GitHub history
  • +
  • Bug solutions in closed Jira tickets
  • +
+

The result?

+

Rediscovering solutions to problems we've already solved +❌ Inconsistent practices because guidelines aren't accessible +❌ Slow onboarding as new developers lack context +❌ Lost context when team members leave +❌ Repeated mistakes because past lessons aren't preserved

+

The Solution: Unified, Queryable Knowledge Graph

+

Knowledge Base provides a single source of truth for project knowledge:

+

Capture once: Notes, decisions, guidelines, patterns +✅ Connect concepts: Typed relationships between ideas +✅ Query naturally: Text and semantic search +✅ AI-assisted: Claude Code integration via MCP +✅ Git-tracked: Version control for knowledge +✅ Shared wisdom: Organization-wide guidelines + project-specific

+

What Makes KB Different?

+

1. Git-Native

+

Other tools: Notion, Confluence, wikis in web apps

+

KB: Markdown files in .kogral/ directory

+

Benefits:

+
# Review knowledge changes in PRs
+git diff .kogral/decisions/
+
+# Branch knowledge with code
+git checkout feature-branch
+# .kogral/ follows the branch
+
+# Merge knowledge from feature work
+git merge feature-branch
+# Knowledge merges like code
+
+

Result: Knowledge versioned alongside code it describes.

+

2. AI-Native

+

Other tools: Manual search, browse folders

+

KB: AI queries via Claude Code

+

Example:

+
You: "Find anything about error handling"
+
+Claude: [Searches semantically, not just keywords]
+Found 5 concepts:
+- Pattern: Error Handling with thiserror
+- Guideline: Result Type Best Practices
+- Decision: Use anyhow for Application Errors
+- Note: Custom Error Types
+- Journal: Fixed error propagation bug
+
+[All related, even without exact keyword match]
+
+

Result: Find concepts, not just documents with keywords.

+

3. Config-Driven

+

Other tools: Hardcoded behavior, limited customization

+

KB: Nickel schemas define everything

+

Example:

+
# Development: local embeddings, no costs
+{ embeddings = { provider = 'fastembed } }
+
+# Production: cloud embeddings, best quality
+{ embeddings = { provider = 'openai, model = "text-embedding-3-large" } }
+
+

Result: Adapt behavior without code changes.

+

4. Multi-Graph

+

Other tools: One knowledge base per project

+

KB: Shared organizational knowledge + project-specific

+

Structure:

+
Organization Shared KB
+  ├── Rust Guidelines (applies to all projects)
+  ├── Security Patterns (applies to all projects)
+  └── Testing Standards (applies to all projects)
+
+Project A KB
+  ├── Inherits shared guidelines
+  ├── Project-specific decisions
+  └── Can override shared guidelines
+
+Project B KB
+  ├── Inherits same shared guidelines
+  ├── Different project decisions
+  └── Different overrides
+
+

Result: Consistency across organization, flexibility per project.

+

5. Structured Relationships

+

Other tools: Backlinks, tags, folders

+

KB: Typed relationships with meaning

+

Example:

+
Pattern: Repository Pattern
+    ↑ [implements]
+Note: User Service Implementation
+    ↑ [relates_to]
+Decision: Use PostgreSQL
+    ↑ [depends_on]
+Guideline: Database Access Patterns
+
+

Result: Understand how knowledge connects, not just that it connects.

+

Real-World Impact

+

Before KB

+

New developer joins:

+
    +
  1. Read outdated wiki (2 hours)
  2. +
  3. Ask teammates for context (1 hour per question × 10 questions)
  4. +
  5. Discover guidelines by reading code (days)
  6. +
  7. Miss important decisions (leads to mistakes)
  8. +
+

Time to productivity: 2-4 weeks

+

With KB

+

New developer joins:

+
    +
  1. kb search "architectural decisions" → finds all ADRs
  2. +
  3. Ask Claude: "What are our coding guidelines?" → gets current guidelines with inheritance
  4. +
  5. Browse related notes via graph traversal
  6. +
  7. Full context available, no tribal knowledge
  8. +
+

Time to productivity: 3-5 days

+

Before KB

+

Team makes decision:

+
    +
  1. Discussion in Slack (lost after a week)
  2. +
  3. Someone documents in wiki (maybe)
  4. +
  5. 6 months later: "Why did we choose X?" → nobody remembers
  6. +
  7. Re-debate the same decision
  8. +
+

With KB

+

Team makes decision:

+
    +
  1. Discussion captured as ADR during meeting
  2. +
  3. Context, decision, consequences documented
  4. +
  5. Linked to related patterns and guidelines
  6. +
  7. 6 months later: kb show decision-use-x → full context instantly
  8. +
+

Before KB

+

Solving a bug:

+
    +
  1. Encounter race condition in cache
  2. +
  3. Debug for 2 hours
  4. +
  5. Fix it
  6. +
  7. Solution lost in PR comments
  8. +
+

Two months later: Different developer, same bug, 2 more hours

+

With KB

+

Solving a bug:

+
    +
  1. Encounter race condition
  2. +
  3. Ask Claude: "Have we seen cache race conditions before?"
  4. +
  5. Claude finds journal entry from 2 months ago with solution
  6. +
  7. Apply fix in 10 minutes
  8. +
+

Two months later: Same query, same instant solution

+

Who Benefits?

+

Individual Developers

+

Personal knowledge base: Capture learnings, build expertise +✅ Quick recall: "How did I solve this before?" +✅ Context switching: Return to old projects with full context +✅ Career growth: Document what you learn, portfolio of knowledge

+

Teams

+

Shared context: Everyone has access to team knowledge +✅ Onboarding: New members ramp up faster +✅ Consistency: Follow shared guidelines and patterns +✅ Collaboration: Build on each other's knowledge

+

Organizations

+

Institutional memory: Knowledge persists beyond individual tenure +✅ Best practices: Standardize across teams +✅ Compliance: Document security and architecture decisions +✅ Efficiency: Stop solving the same problems repeatedly

+

AI Agents

+

Context injection: Agents query guidelines before generating code +✅ Decision awareness: Agents check past decisions +✅ Pattern following: Agents use documented patterns +✅ Execution tracking: Agent actions documented automatically

+

When NOT to Use KB

+

KB is not ideal for:

+

Personal journaling: Use Obsidian or Logseq +❌ Team wikis: Use Notion or Confluence +❌ Customer docs: Use mdBook or Docusaurus +❌ Project management: Use Jira or Linear +❌ Code comments: Use inline documentation

+

KB is perfect for:

+

✅ Developer knowledge graphs +✅ Architectural decision records +✅ Pattern libraries +✅ Coding guidelines +✅ Technical context +✅ AI-assisted development

+

The Vision

+

Today's development:

+
Developer → writes code → commits
+
+

With KB:

+
Developer → writes code → documents decisions → links to patterns → commits code + knowledge
+                    ↓
+            AI Agent queries knowledge → generates better code
+                    ↓
+            Team discovers patterns → reuses solutions → faster development
+
+

Knowledge becomes an active participant in development, not an afterthought.

+

Design Philosophy

+

Three core principles drive KB:

+

1. Knowledge should be captured during work, not after

+

❌ "I'll document this later" → never happens +✅ "Claude, document this decision" → done in 30 seconds

+

2. Knowledge should be connected, not isolated

+

❌ Standalone documents in folders +✅ Graph of interconnected concepts

+

3. Knowledge should be queryable, not browsable

+

❌ "Let me look through 50 docs to find..." +✅ "Find anything related to error handling" → instant semantic results

+

Get Started

+

Ready to stop losing knowledge?

+ +
+
+

"The best time to document was during implementation. The second best time is now."

+
+

But with KB + AI, "now" is instant.

+

Design Philosophy

+

The principles and values guiding Knowledge Base design and implementation.

+

Core Tenets

+

1. Config-Driven, Not Hardcoded

+

Principle: All behavior should be configurable via schemas, not baked into code.

+

Why: Flexibility without code changes. Users adapt KB to their workflows, not vice versa.

+

Example:

+
#![allow(unused)]
+fn main() {
+// ❌ Bad: Hardcoded
+impl EmbeddingProvider {
+    fn new() -> Self {
+        FastEmbedProvider::new("BAAI/bge-small-en-v1.5") // Can't change
+    }
+}
+
+// ✅ Good: Config-driven
+impl EmbeddingProvider {
+    fn from_config(config: &EmbeddingConfig) -> Result<Box<dyn EmbeddingProvider>> {
+        match config.provider {
+            'fastembed => Ok(Box::new(FastEmbedProvider::new(&config.model)?)),
+            'openai => Ok(Box::new(OpenAIProvider::new(&config.model)?)),
+        }
+    }
+}
+}
+

Benefits:

+
    +
  • Switch embedding providers without recompilation
  • +
  • Different configs for dev/prod
  • +
  • User choice, not developer mandate
  • +
+

2. Type-Safe Configuration

+

Principle: Validate configuration before runtime, not during.

+

Why: Catch errors early, reduce runtime failures.

+

Implementation: Nickel contracts + serde validation = double validation

+
# Schema defines valid values
+EmbeddingProvider = [| 'openai, 'claude, 'fastembed |]
+
+# Typo caught at export time, not runtime
+{ provider = 'opena1 }  # Error: Invalid variant
+
+

Benefits:

+
    +
  • Errors found during nickel export, not during execution
  • +
  • Self-documenting: schema is the spec
  • +
  • Refactoring safe: change schema, find all usages
  • +
+

3. Local-First, Cloud-Optional

+

Principle: Core functionality works offline, cloud is enhancement.

+

Why: Privacy, cost control, offline development.

+

Examples:

+
+ + + +
FeatureLocalCloud
StorageFilesystemSurrealDB
EmbeddingsfastembedOpenAI/Claude
SearchText-basedSemantic
+
+

Benefits:

+
    +
  • Works on planes, trains, areas with poor internet
  • +
  • No API costs for small projects
  • +
  • Privacy-sensitive projects keep data local
  • +
  • Production can use cloud for scale
  • +
+

4. Git-Friendly by Default

+

Principle: Knowledge should version alongside code.

+

Why: Knowledge describes code, should evolve with it.

+

Implementation:

+
    +
  • Markdown + YAML frontmatter (text-based, diffable)
  • +
  • One file per node (granular commits)
  • +
  • Wikilinks preserved (works in Logseq, Obsidian)
  • +
+

Benefits:

+
# Review knowledge changes in PRs
+git diff .kogral/decisions/
+
+# Knowledge follows branches
+git checkout feature-x
+# .kogral/ reflects feature-x decisions
+
+# Knowledge merges
+git merge feature-x
+# Merge conflicts = knowledge conflicts (resolve intentionally)
+
+

5. AI-Native, Human-Readable

+

Principle: Optimized for AI consumption, readable by humans.

+

Why: Best of both worlds - AI-assisted discovery, human verification.

+

Implementation:

+
    +
  • Structured: YAML frontmatter for AI parsing
  • +
  • Semantic: Embeddings for AI queries
  • +
  • Readable: Markdown for human consumption
  • +
  • Linked: Typed relationships for AI traversal
  • +
+

Example:

+
---
+id: note-auth
+type: note
+title: Authentication Implementation
+tags: [security, auth]
+relates_to: [guideline-security, pattern-jwt]
+---
+
+# Authentication Implementation
+
+Humans read this markdown normally.
+
+AI can:
+- Parse frontmatter for metadata
+- Extract tags for filtering
+- Follow relates_to links
+- Generate embeddings for semantic search
+
+

6. Composition Over Inheritance

+

Principle: Build systems by composing small, focused components.

+

Why: Flexibility, testability, maintainability.

+

Implementation:

+
#![allow(unused)]
+fn main() {
+// Small, focused traits
+trait Storage { ... }
+trait EmbeddingProvider { ... }
+trait TemplateEngine { ... }
+
+// Compose into systems
+struct KnowledgeBase {
+    storage: Box<dyn Storage>,
+    embeddings: Option<Box<dyn EmbeddingProvider>>,
+    templates: TemplateEngine,
+}
+}
+

Benefits:

+
    +
  • Swap storage without affecting embeddings
  • +
  • Disable embeddings without breaking storage
  • +
  • Test components in isolation
  • +
  • Add new providers by implementing trait
  • +
+

7. Fail Fast, Fail Clearly

+

Principle: Detect errors early, provide clear messages.

+

Why: Developer experience - fast feedback, actionable errors.

+

Implementation:

+
#![allow(unused)]
+fn main() {
+// ❌ Bad: Silent failure
+fn load_config(path: &Path) -> Option<Config> {
+    std::fs::read_to_string(path)
+        .ok()
+        .and_then(|s| serde_json::from_str(&s).ok())
+}
+
+// ✅ Good: Explicit errors
+fn load_config(path: &Path) -> Result<Config, ConfigError> {
+    let content = std::fs::read_to_string(path)
+        .map_err(|e| ConfigError::ReadFailed(path.to_path_buf(), e))?;
+
+    serde_json::from_str(&content)
+        .map_err(|e| ConfigError::ParseFailed(path.to_path_buf(), e))
+}
+}
+

Error messages:

+
❌ "Failed to load config"
+✅ "Failed to read config file '/path/to/config.ncl': Permission denied"
+
+

8. Convention Over Configuration (With Escape Hatches)

+

Principle: Sane defaults, but everything customizable.

+

Why: Easy to start, flexible as you grow.

+

Examples:

+
# Minimal config (uses conventions)
+{ graph = { name = "my-project" } }
+# Defaults: filesystem storage, no embeddings, standard templates
+
+# Full config (explicit everything)
+{
+  graph = { name = "my-project" },
+  storage = { primary = 'surrealdb, /* ... */ },
+  embeddings = { provider = 'openai, /* ... */ },
+  templates = { templates_dir = "custom" },
+}
+
+

Conventions:

+
    +
  • .kogral/ directory in project root
  • +
  • Filesystem storage by default
  • +
  • YAML frontmatter + markdown body
  • +
  • Standard template names (note.md.tera, decision.md.tera)
  • +
+

Escape hatches:

+
    +
  • --kb-dir to use different location
  • +
  • Configure alternative storage backends
  • +
  • Custom frontmatter schemas
  • +
  • Override any template
  • +
+

9. Documentation as Code

+

Principle: Documentation lives with code, versioned together.

+

Why: Outdated docs are worse than no docs.

+

Implementation:

+
    +
  • ADRs in .kogral/decisions/ (alongside code)
  • +
  • Guidelines in .kogral/guidelines/ (versioned with code)
  • +
  • Patterns in .kogral/patterns/ (evolve with implementations)
  • +
+

Benefits:

+
# Code and docs branch together
+git checkout old-version
+# .kogral/ reflects that version's decisions
+
+# Code and docs merge together
+git merge feature
+# Merge includes new patterns, updated guidelines
+
+# Code and docs reviewed together
+# PR shows code + decision + guideline updates
+
+

10. Optimize for Discoverability

+

Principle: Knowledge is useless if you can't find it.

+

Why: The point is to use knowledge, not just store it.

+

Features:

+
    +
  • Text search: Find exact keywords
  • +
  • Semantic search: Find related concepts
  • +
  • Graph traversal: Follow relationships
  • +
  • Tag filtering: Narrow by category
  • +
  • MCP integration: AI-assisted discovery
  • +
+

Example:

+

User doesn't remember exact term, but knows the concept:

+
"Find anything about handling errors gracefully"
+
+

KB finds (semantically):

+
    +
  • "Error Handling with thiserror" (pattern)
  • +
  • "Result Type Best Practices" (guideline)
  • +
  • "Panic Recovery" (note)
  • +
  • "Graceful Degradation" (pattern)
  • +
+

No exact keyword match needed, concept match sufficient.

+

11. Build for Humans, Enable AI

+

Principle: Humans are the primary users, AI is the assistant.

+

Why: AI should enhance human workflows, not replace them.

+

Implementation:

+
    +
  • Human-readable formats: Markdown, YAML
  • +
  • Human-editable: Any text editor works
  • +
  • Human-discoverable: ls .kogral/notes/ shows files
  • +
  • AI-enhanced: MCP for AI-assisted queries
  • +
+

Example:

+
# Human workflow
+vim .kogral/notes/my-note.md    # Edit directly
+git add .kogral/notes/my-note.md
+git commit -m "Add note about X"
+
+# AI-enhanced workflow
+# (in Claude Code)
+"Add a note about X with tags Y, Z"
+# AI creates file, human reviews
+
+

12. Embrace the Graph

+

Principle: Knowledge is interconnected, embrace the relationships.

+

Why: Context comes from connections, not isolation.

+

Implementation:

+
    +
  • Typed relationships (not just "related")
  • +
  • Bidirectional traversal
  • +
  • Relationship strength (0.0-1.0)
  • +
  • Multi-hop queries
  • +
+

Example:

+
Find all patterns that:
+  - Are implemented by current project
+  - Depend on shared guidelines
+  - Were added in the last 6 months
+
+# Graph query, not sequential file search
+
+

Anti-Patterns to Avoid

+

1. ❌ Hardcoding Behavior

+
#![allow(unused)]
+fn main() {
+// Don't
+const EMBEDDING_MODEL: &str = "BAAI/bge-small-en-v1.5";
+
+// Do
+let model = config.embeddings.model.as_str();
+}
+

2. ❌ Runtime Schema Validation

+
// Don't validate at runtime
+let provider = config.provider; // Might be invalid
+
+// Do validate at export time (Nickel contracts)
+provider | [| 'openai, 'claude, 'fastembed |]
+
+

3. ❌ Opaque Errors

+
#![allow(unused)]
+fn main() {
+// Don't
+Err("Failed".into())
+
+// Do
+Err(KbError::NodeNotFound(id.to_string()))
+}
+

4. ❌ Coupling Components

+
#![allow(unused)]
+fn main() {
+// Don't
+impl KnowledgeBase {
+    fn search(&self) -> Vec<Node> {
+        let embeddings = FastEmbedProvider::new(); // Hardcoded!
+        // ...
+    }
+}
+
+// Do
+impl KnowledgeBase {
+    fn search(&self) -> Vec<Node> {
+        if let Some(provider) = &self.embeddings {
+            // Use configured provider
+        }
+    }
+}
+}
+

5. ❌ Proprietary Formats

+
// Don't
+Binary blob: [0x4B, 0x42, 0x01, ...]
+
+// Do
+Markdown + YAML:
+---
+id: note-1
+---
+# Content
+
+

Influences

+

KB draws inspiration from:

+
    +
  • Logseq: Outliner, graph view, wikilinks
  • +
  • Obsidian: Markdown-first, local storage, plugins
  • +
  • Zettelkasten: Atomic notes, links, emergence
  • +
  • ADR: Decision records, context preservation
  • +
  • Git: Version control, branching, merging
  • +
  • Nickel: Type-safe configuration, contracts
  • +
  • MCP: AI integration protocol
  • +
  • SurrealDB: Graph database, relationships
  • +
+

Implementation Principles

+

Rust

+
    +
  • Zero unsafe code (#![forbid(unsafe_code)])
  • +
  • No unwrap() in production code
  • +
  • Always use Result<T> for fallibility
  • +
  • Comprehensive error types with thiserror
  • +
  • Full test coverage (100+ tests)
  • +
+

Nickel

+
    +
  • Contracts for validation
  • +
  • Defaults in schemas
  • +
  • Documentation in contracts
  • +
  • Composition via imports
  • +
+

NuShell

+
    +
  • Structured data pipelines
  • +
  • Error handling in scripts
  • +
  • Colored output for UX
  • +
  • Dry-run modes
  • +
+

Evolution Strategy

+

KB follows these guidelines for evolution:

+
    +
  1. Backward Compatibility: Don't break existing configs
  2. +
  3. Deprecation Period: Warn before removal (1 major version)
  4. +
  5. Migration Tools: Provide automated migrations
  6. +
  7. Semantic Versioning: MAJOR.MINOR.PATCH strictly
  8. +
+

Conclusion

+

These principles guide every decision:

+

Config-driven: Behavior in schemas, not code +✅ Type-safe: Validate before runtime +✅ Local-first: Works offline, cloud optional +✅ Git-friendly: Knowledge versions with code +✅ AI-native: Optimized for AI, readable by humans +✅ Composable: Small pieces, loosely coupled +✅ Fast feedback: Fail early, clear errors +✅ Discoverable: Easy to find what you need

+

The goal: Knowledge management that developers actually use.

+

Next Steps

+ +

Installation

+

This guide covers installing and setting up the KOGRAL.

+

Prerequisites

+

Required

+
    +
  • +

    Rust 1.70 or later

    +
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    +
    +
  • +
  • +

    Nickel CLI for configuration management

    +
    cargo install nickel-lang-cli
    +
    +
  • +
+

Optional

+
    +
  • +

    NuShell for maintenance scripts

    +
    cargo install nu
    +
    +
  • +
  • +

    SurrealDB for scalable storage backend

    +
    # macOS
    +brew install surrealdb/tap/surreal
    +
    +# Linux/Windows
    +curl -sSf https://install.surrealdb.com | sh
    +
    +
  • +
+

Installation Methods

+ +
# Clone the repository
+git clone <repository-url> knowledge-base
+cd knowledge-base
+
+# Build the workspace
+cargo build --release
+
+# Install CLI tool
+cargo install --path crates/kb-cli
+
+# Verify installation
+kb --version
+
+

Method 2: Build Specific Crates

+
# Build only kb-core library
+cargo build --package kb-core --release
+
+# Build only kb-cli
+cargo build --package kb-cli --release
+
+# Build only kogral-mcp server
+cargo build --package kb-mcp --release
+
+

Method 3: Build with Features

+
# Build with all features (filesystem + SurrealDB + fastembed)
+cargo build --workspace --all-features --release
+
+# Build with specific features
+cargo build --package kb-core --features "surrealdb,fastembed" --release
+
+

Feature Flags

+

kb-core supports optional features:

+
+ + + + +
FeatureDescriptionDefault
filesystemFilesystem storage backend✅ Yes
surrealdbSurrealDB storage backend❌ No
fastembedLocal embedding generation❌ No
fullAll features enabled❌ No
+
+

Example usage:

+
# Enable SurrealDB backend
+cargo build --features surrealdb
+
+# Enable all features
+cargo build --features full
+
+

Environment Setup

+

1. Initialize a Knowledge Base

+
# Navigate to your project
+cd /path/to/your/project
+
+# Initialize .kb directory
+kb init
+
+# Or initialize with custom name
+kb init --name "My Project" --description "Project knowledge base"
+
+

This creates:

+
your-project/
+└── .kogral/
+    ├── config.toml
+    ├── notes/
+    ├── decisions/
+    ├── guidelines/
+    ├── patterns/
+    └── journal/
+
+

2. Configure Nickel Schemas (Optional)

+

If you want advanced configuration:

+
# Copy default config
+cp /path/to/knowledge-base/config/defaults.ncl .kogral/config.ncl
+
+# Edit configuration
+$EDITOR .kogral/config.ncl
+
+# Export to TOML (for kb-cli compatibility)
+nickel export --format json .kogral/config.ncl | kb config import
+
+

3. Set Up Shared Knowledge Base (Optional)

+

For shared guidelines and patterns across projects:

+
# Create shared KB location
+mkdir -p ~/Tools/.kogral-shared
+cd ~/Tools/.kogral-shared
+
+# Initialize shared KB
+kb init --name "Shared Knowledge" --description "Cross-project guidelines"
+
+# Configure inheritance in project
+kb config set inheritance.base ~/Tools/.kogral-shared
+
+

Verify Installation

+

Test CLI

+
# Check version
+kb --version
+
+# Show help
+kb --help
+
+# Test initialization (dry-run)
+kb init --dry-run
+
+

Test MCP Server

+
# Start MCP server in test mode
+kb serve --transport stdio
+
+# In another terminal, test with echo
+echo '{"jsonrpc":"2.0","id":1,"method":"kogral/search","params":{"query":"test"}}' | kb serve
+
+

Run Tests

+
# Run all tests
+cargo test --workspace
+
+# Run integration tests
+cargo test --package kb-core --test '*'
+
+# Run with all features
+cargo test --workspace --all-features
+
+

SurrealDB Setup (Optional)

+

If using SurrealDB backend:

+

Start SurrealDB Server

+
# Start server
+surreal start --log trace --user root --pass root file://data.db
+
+# Or use memory backend for testing
+surreal start --log trace --user root --pass root memory
+
+

Configure kb-core

+

Edit .kogral/config.ncl:

+
{
+  storage = {
+    primary = 'filesystem,
+    secondary = {
+      enabled = true,
+      type = 'surrealdb,
+      url = "ws://localhost:8000",
+      namespace = "kb",
+      database = "default",
+      username = "root",
+      password = "root",
+    },
+  },
+}
+
+

Initialize Schema

+
# Run migration script
+nu scripts/kb-migrate.nu --target latest
+
+# Or manually import schema
+surreal import --conn ws://localhost:8000 --user root --pass root --ns kb --db default schema.surql
+
+

Embedding Provider Setup (Optional)

+

Local fastembed

+
# Build with fastembed feature
+cargo build --package kb-core --features fastembed
+
+# Models will be downloaded on first use
+
+

API Providers (OpenAI, Claude, Ollama)

+

Set environment variables:

+
# OpenAI
+export OPENAI_API_KEY="sk-..."
+
+# Claude (Anthropic)
+export ANTHROPIC_API_KEY="sk-ant-..."
+
+# Ollama (local)
+export OLLAMA_API_BASE="http://localhost:11434"
+
+

Configure provider in .kogral/config.ncl:

+
{
+  embeddings = {
+    enabled = true,
+    provider = 'openai,  # or 'claude, 'ollama, 'fastembed
+    model = "text-embedding-3-small",
+    api_key_env = "OPENAI_API_KEY",
+  },
+}
+
+

Claude Code Integration

+

To use kb-mcp with Claude Code:

+

1. Build MCP Server

+
cargo build --package kb-mcp --release
+
+

2. Configure Claude Code

+

Add to ~/.config/claude/config.json:

+
{
+  "mcpServers": {
+    "kogral-mcp": {
+      "command": "/path/to/knowledge-base/target/release/kb-mcp",
+      "args": ["serve"],
+      "env": {}
+    }
+  }
+}
+
+

3. Test Connection

+

Start Claude Code and verify:

+
> kb/search "test"
+
+

Troubleshooting

+

Nickel Not Found

+
# Verify nickel is installed
+nickel --version
+
+# If not, install
+cargo install nickel-lang-cli
+
+# Add cargo bin to PATH
+export PATH="$HOME/.cargo/bin:$PATH"
+
+

Compilation Errors

+
# Update Rust
+rustup update stable
+
+# Clean and rebuild
+cargo clean
+cargo build --workspace
+
+

SurrealDB Connection Failed

+
# Check SurrealDB is running
+curl http://localhost:8000/health
+
+# Start SurrealDB with correct settings
+surreal start --bind 0.0.0.0:8000 --user root --pass root memory
+
+

MCP Server Not Responding

+
# Test stdio communication
+echo '{"jsonrpc":"2.0","id":1,"method":"ping"}' | kb serve
+
+# Check logs
+kb serve --log-level debug
+
+

Next Steps

+ +

Uninstallation

+
# Remove installed binary
+cargo uninstall kb-cli
+
+# Remove project knowledge base
+rm -rf /path/to/project/.kogral
+
+# Remove shared knowledge base
+rm -rf ~/Tools/.kogral-shared
+
+

Quick Start Guide

+

Get up and running with the KOGRAL in 5 minutes.

+

Prerequisites

+
    +
  • Rust 1.70+ installed
  • +
  • Nickel CLI installed (cargo install nickel-lang-cli)
  • +
  • kb-cli installed (see Installation)
  • +
+

Step 1: Initialize Your Knowledge Base

+

Navigate to your project directory and initialize:

+
cd /path/to/your/project
+kb init
+
+

This creates a .kogral/ directory with the following structure:

+
.kogral/
+├── config.toml       # Configuration
+├── notes/            # General notes
+├── decisions/        # Architectural decisions
+├── guidelines/       # Project guidelines
+├── patterns/         # Reusable patterns
+└── journal/          # Daily journal entries
+
+

Step 2: Create Your First Note

+

Add a note to your knowledge base:

+
kb add note "Getting Started with Rust" \
+  --tags rust,programming,learning \
+  --content "Key concepts for learning Rust effectively."
+
+

Or create interactively:

+
kb add note
+# Follow the prompts to enter title, tags, and content
+
+

Step 3: Create a Decision Record

+

Document an architectural decision:

+
kb add decision "Use SurrealDB for Storage" \
+  --context "Need scalable storage for knowledge graph" \
+  --decision "Adopt SurrealDB for its graph capabilities" \
+  --consequence "Better query performance" \
+  --consequence "Additional infrastructure dependency"
+
+ +

Create relationships between nodes:

+
# Find node IDs
+kb list
+
+# Create a relationship
+kb link <note-id> <decision-id> relates_to
+
+

Available relationship types:

+
    +
  • relates_to - General conceptual link
  • +
  • depends_on - Dependency relationship
  • +
  • implements - Implementation of a concept
  • +
  • extends - Inheritance/extension
  • +
  • supersedes - Replaces older version
  • +
  • explains - Documentation/clarification
  • +
+

Step 5: Search Your Knowledge Base

+

Search by text:

+
# Simple search
+kb search "rust"
+
+# Filter by type
+kb search "architecture" --type decision
+
+# Limit results
+kb search "error handling" --limit 5
+
+

Search semantically (requires embeddings):

+
# Semantic search finds conceptually related content
+kb search "memory safety" --semantic --threshold 0.7
+
+

Step 6: View Node Details

+
# Show node by ID
+kb show <node-id>
+
+# Show node with relationships
+kb show <node-id> --with-relationships
+
+

Step 7: Edit Documents Directly

+

All knowledge base documents are markdown files you can edit:

+
# Open in your editor
+$EDITOR .kogral/notes/getting-started-with-rust.md
+
+# Or use your favorite markdown editor
+code .kogral/notes/
+
+

Document format:

+
---
+id: unique-id
+type: note
+title: Getting Started with Rust
+created: 2026-01-17T10:30:00Z
+modified: 2026-01-17T10:30:00Z
+tags: [rust, programming, learning]
+status: active
+---
+
+# Getting Started with Rust
+
+Content goes here with [[wikilinks]] to other nodes.
+
+## Key Concepts
+
+- Ownership
+- Borrowing
+- Lifetimes
+
+

Step 8: Create a Daily Journal Entry

+

Start journaling your development progress:

+
kb add journal "Today's Progress" \
+  --content "Learned about trait objects and dynamic dispatch in Rust."
+
+

Or open today's journal directly:

+
$EDITOR .kogral/journal/$(date +%Y-%m-%d).md
+
+

Step 9: Export to Logseq (Optional)

+

If you use Logseq, export your knowledge base:

+
nu scripts/kb-export-logseq.nu /path/to/logseq-graph
+
+

This creates a Logseq-compatible graph you can open in Logseq for visual editing.

+

Step 10: Start MCP Server for Claude Code

+

Integrate with Claude Code for AI-assisted knowledge management:

+
# Start MCP server
+kb serve
+
+# Configure in ~/.config/claude/config.json
+# Then use in Claude Code:
+# > kb/search "rust ownership"
+
+

Common Workflows

+

Capture Quick Notes

+
# Quick note
+kb add note "Remember to check error handling in parser module" --tags todo,parser
+
+

Document Architectural Decisions

+
# Create ADR
+kb add decision "Adopt Async Rust for I/O Operations" \
+  --status accepted \
+  --tags architecture,async
+
+

Build a Pattern Library

+
# Add a pattern
+kb add pattern "Error Handling with thiserror" \
+  --tags rust,error-handling \
+  --content "Standard pattern for error types in this project."
+
+

Track Daily Progress

+
# Add journal entry
+kb add journal --content "Implemented search functionality. Need to add semantic search next."
+
+

Next Steps

+

Customize Configuration

+

Edit .kogral/config.ncl for advanced configuration:

+
{
+  graph = {
+    name = "My Project",
+    version = "1.0.0",
+  },
+
+  embeddings = {
+    enabled = true,
+    provider = 'fastembed,
+  },
+
+  templates = {
+    templates_dir = "templates",
+  },
+}
+
+

See Configuration Reference for all options.

+

Set Up Shared Guidelines

+

Create a shared knowledge base for organization-wide standards:

+
# Create shared KB
+mkdir -p ~/Tools/.kogral-shared
+cd ~/Tools/.kogral-shared
+kb init --name "Shared Guidelines"
+
+# Add guidelines
+kb add guideline "Rust Error Handling" \
+  --language rust \
+  --category error-handling
+
+# Configure inheritance in projects
+kb config set inheritance.base ~/Tools/.kogral-shared
+
+

Automate with NuShell Scripts

+
# Backup regularly
+nu scripts/kb-backup.nu --compress
+
+# Sync with SurrealDB
+nu scripts/kb-sync.nu --direction bidirectional
+
+# Generate statistics
+nu scripts/kb-stats.nu --show-tags
+
+

Integrate with Git

+
# Add to version control
+git add .kogral/
+git commit -m "docs: Add knowledge base"
+
+# Add to .gitignore (optional: exclude certain types)
+echo ".kogral/journal/" >> .gitignore
+
+

Tips and Tricks

+ +

Link to other nodes naturally in markdown:

+
See [[getting-started-with-rust]] for basics.
+Related decision: [[use-surrealdb-for-storage]].
+
+

Reference Code

+

Link to specific code locations:

+
Error handling implementation: @src/parser.rs:42
+
+

Tag Consistently

+

Use consistent tagging for better searchability:

+
# Good tagging
+--tags rust,error-handling,pattern
+
+# Avoid
+--tags Rust,ErrorHandling,patterns
+
+

Leverage Templates

+

Customize templates for your workflow:

+
# Copy template
+cp templates/note.md.tera templates/meeting-notes.md.tera
+
+# Edit for meeting notes format
+$EDITOR templates/meeting-notes.md.tera
+
+

Troubleshooting

+

"KB directory not found"

+
# Make sure you initialized
+kb init
+
+# Or specify KB directory
+kb --kb-dir /path/to/.kb search "query"
+
+

"Node not found"

+
# List all nodes to find ID
+kb list
+
+# Search for node
+kb search "partial title"
+
+

"Failed to parse frontmatter"

+

Check your markdown file has valid YAML frontmatter:

+
---
+id: my-note
+type: note
+title: My Note
+---
+
+

Further Reading

+ +

Getting Help

+
    +
  • Check kb --help for command usage
  • +
  • Read inline help: kb add --help
  • +
  • Report issues on GitHub
  • +
  • Join community discussions
  • +
+
+

Congratulations! You've created your first knowledge base. Start capturing knowledge and building connections.

+

Daily Workflows

+

Use Cases

+

Real-world scenarios showing how KOGRAL solves common development challenges.

+

Use Case 1: Onboarding New Team Members

+

Problem

+

New developer joins the team. Needs to understand:

+
    +
  • Why we chose SurrealDB over PostgreSQL
  • +
  • How error handling works in this project
  • +
  • What coding patterns we follow
  • +
  • Recent architectural decisions
  • +
+

Solution with KOGRAL

+

Team lead:

+
# Export project knowledge to Logseq for visual exploration
+kb export logseq ~/onboarding-docs
+
+

New developer (with Claude Code):

+
Summarize our architectural decisions from the last 6 months
+
+

Claude (via MCP):

+
Found 8 decisions:
+
+1. **Use SurrealDB for Storage** (accepted, 3 months ago)
+   - Context: Need graph database for knowledge relationships
+   - Consequences: Better queries, additional infrastructure
+
+2. **Adopt Rust for Core Logic** (accepted, 5 months ago)
+   - Context: Type safety and performance critical
+   - Consequences: Steeper learning curve, excellent reliability
+
+... [6 more decisions]
+
+

New developer:

+
What are our error handling guidelines?
+
+

Claude (via kb/get_guidelines):

+
## Rust Error Handling Guidelines
+
+### Project Guidelines (priority: 150)
+- Use thiserror for custom error types
+- Never unwrap() in production
+- Propagate with ? operator
+
+### Shared Guidelines (priority: 50)
+- Always use Result<T> for fallible operations
+- Add context with .context()
+
+[Links to full guideline documents]
+
+

Result: New developer productive in days, not weeks.

+
+

Use Case 2: Architectural Decision Records (ADR)

+

Problem

+

Team discussing whether to add Redis caching. Multiple opinions, need to document the decision for future reference.

+

Solution with KOGRAL

+

During meeting:

+
Document decision: Add Redis caching for API responses
+
+Context:
+- Current database queries average 200ms
+- 80% of queries are repeated within 5 minutes
+- Need sub-50ms response times for user experience
+
+Decision:
+- Add Redis with 5-minute TTL for GET endpoints
+- Cache invalidation on POST/PUT/DELETE
+
+Consequences:
+- ✅ Expected 80% reduction in database load
+- ✅ Sub-50ms response times achieved
+- ❌ Additional infrastructure (Redis server)
+- ❌ Cache consistency challenges
+- ❌ Debugging complexity increases
+
+Status: proposed (pending infrastructure setup)
+
+

Claude (creates ADR):

+
Created: decision-add-redis-caching
+Type: decision
+Status: proposed
+
+Added relationships:
+  - Relates to: note-performance-requirements
+  - Depends on: decision-use-docker-compose (infrastructure)
+
+Decision documented and linked to related knowledge.
+
+

Two months later, someone asks "Why Redis?":

+
kb show decision-add-redis-caching
+
+

Full context available instantly.

+
+

Use Case 3: Pattern Library

+

Problem

+

Team solves the same problems repeatedly:

+
    +
  • How to structure error types
  • +
  • Database connection patterns
  • +
  • Testing strategies
  • +
+

Each developer rediscovers solutions.

+

Solution with KOGRAL

+

First time solving error handling:

+
kb add pattern "Error Handling with thiserror" \
+  --tags rust,error-handling,pattern \
+  --content "$(cat docs/error-pattern.md)"
+
+

Next time someone needs error handling:

+
I'm implementing a new module with errors. What's our standard pattern?
+
+

Claude (via kogral/search):

+
Found pattern: Error Handling with thiserror
+
+## Pattern: Error Handling with thiserror
+
+### Problem
+Need structured, type-safe error handling with good error messages.
+
+### Solution
+```rust
+use thiserror::Error;
+
+#[derive(Error, Debug)]
+pub enum ModuleError {
+    #[error("Database connection failed: {0}")]
+    Database(#[from] sqlx::Error),
+
+    #[error("Validation failed: {0}")]
+    Validation(String),
+}
+
+

Usage

+
#![allow(unused)]
+fn main() {
+fn do_work() -> Result<(), ModuleError> {
+    let conn = connect_db()?; // Auto-converts via #[from]
+    validate_input()?;
+    Ok(())
+}
+}
+

[Full pattern with examples]

+

Would you like me to create a new error module following this pattern?

+

+**Result**: Consistent error handling across codebase, zero time wasted rediscovering patterns.
+
+---
+
+## Use Case 4: Daily Development Journal
+
+### Problem
+
+Developer wants to track:
+- What they worked on each day
+- Blockers encountered
+- Solutions discovered
+- Ideas for future work
+
+### Solution with KOGRAL
+
+**End of each day**:
+
+```bash
+kb add journal "2026-01-17" --content "
+## Progress
+- Implemented user authentication
+- Fixed race condition in cache layer
+- Started work on API rate limiting
+
+## Blockers
+- SurrealDB migration tool not working with nested objects
+- Need to discuss API versioning strategy with team
+
+## Learnings
+- tokio::select! is perfect for timeout patterns
+- serde_json::Value useful for dynamic JSON handling
+
+## Tomorrow
+- Finish rate limiting implementation
+- Review PR #234
+- Team meeting: discuss API versioning
+"
+
+

With Claude Code (even easier):

+
End of day journal:
+
+Implemented authentication, fixed cache race condition, started rate limiting.
+Blocked on SurrealDB migrations and need API versioning discussion.
+Learned about tokio::select! for timeouts.
+Tomorrow: finish rate limiting, review PR #234, versioning meeting.
+
+

Claude (creates journal entry):

+
Created journal entry: 2026-01-17
+
+Tags auto-detected: authentication, cache, rate-limiting, surrealdb
+
+Linked to:
+  - pattern-timeout-handling (implements)
+  - decision-use-surrealdb (relates_to)
+
+Journal entry saved.
+
+

Two weeks later (forgot how you solved that race condition):

+
How did I fix the cache race condition?
+
+

Claude (semantic search):

+
From your journal entry on 2026-01-17:
+
+"Fixed race condition in cache layer by using DashMap instead of
+RwLock<HashMap>. DashMap provides lock-free concurrent access."
+
+[Link to full journal entry]
+
+

Result: Development history preserved, solutions easy to recall.

+
+

Use Case 5: Code Review Preparation

+

Problem

+

Preparing for code review. Need to:

+
    +
  • Document why certain decisions were made
  • +
  • Link implementation to requirements
  • +
  • Explain trade-offs to reviewers
  • +
+

Solution with KOGRAL

+

Before creating PR:

+
I just implemented the caching layer.
+Add a note documenting the implementation and link it to our caching decision.
+
+

Claude (via kb/add_note + kb/link):

+
Created note: note-caching-layer-implementation
+
+Content:
+# Caching Layer Implementation
+
+## Approach
+- Redis with 5-minute TTL
+- Cache-aside pattern
+- Invalidation on mutations
+
+## Trade-offs
+- Chose simplicity over advanced features (no LRU eviction)
+- 5-minute TTL balances freshness vs cache hit rate
+- Cache-aside pattern chosen over write-through (simpler)
+
+## Testing
+- Unit tests for cache logic
+- Integration tests with real Redis
+- Load test: 1000 req/s sustained
+
+Links:
+  - Implements: decision-add-redis-caching
+  - Follows: pattern-cache-aside
+  - Tests: guideline-integration-testing
+
+Note added and linked to decision-add-redis-caching.
+
+

In PR description:

+
## Implementation
+
+Implements caching layer per decision-add-redis-caching.
+
+See note-caching-layer-implementation for detailed rationale.
+
+## Trade-offs
+
+[Copy from note]
+
+

Reviewers:

+
kb show decision-add-redis-caching
+kb show note-caching-layer-implementation
+
+

Full context available, review focuses on code quality not "why this approach?"

+
+

Use Case 6: Cross-Project Guidelines

+

Problem

+

Organization has 10 projects. Each should follow:

+
    +
  • Same Rust error handling patterns
  • +
  • Same security guidelines
  • +
  • Same testing standards
  • +
+

Currently: duplicated wikis, inconsistent practices.

+

Solution with KOGRAL

+

Setup shared KOGRAL:

+
# Create organization-wide shared KB
+mkdir -p ~/org/.kogral-shared
+cd ~/org/.kogral-shared
+kb init --name "Organization Guidelines"
+
+# Add shared guidelines
+kb add guideline "Rust Error Handling" \
+  --language rust \
+  --category error-handling \
+  --content "$(cat org-rust-errors.md)"
+
+kb add guideline "Security Best Practices" \
+  --category security \
+  --content "$(cat org-security.md)"
+
+

In each project:

+
# project/.kogral/config.ncl
+{
+  inheritance = {
+    base = "~/org/.kogral-shared",
+    priority = 100,  # Project overrides shared
+  },
+}
+
+

Developer in Project A:

+
What are our error handling guidelines?
+
+

Claude (via kb/get_guidelines with inheritance):

+
## Rust Error Handling Guidelines
+
+### Shared Guidelines (priority: 50)
+From ~/org/.kogral-shared:
+- Use thiserror for custom errors
+- Never unwrap() in production
+- Always propagate with ?
+
+### Project Guidelines (priority: 100)
+From project .kogral/:
+- Additionally: log all errors with tracing
+- Use anyhow for application-level errors
+
+[Combined effective guidelines]
+
+

Result:

+
    +
  • Consistent practices across organization
  • +
  • Projects can specialize where needed
  • +
  • Single source of truth for shared knowledge
  • +
+
+

Use Case 7: Bug Investigation

+

Problem

+

Bug in production. Developer needs to:

+
    +
  • Understand relevant decisions
  • +
  • Find related code patterns
  • +
  • Check if similar issues were solved before
  • +
+

Solution with KOGRAL

+

Developer:

+
We have a race condition in the cache layer.
+What past decisions or patterns might be relevant?
+
+

Claude (semantic search):

+
Found 4 relevant items:
+
+1. **Decision: Use DashMap for Concurrent Access** (accepted, 1 month ago)
+   "Chose DashMap over RwLock<HashMap> to avoid race conditions in cache"
+
+2. **Pattern: Safe Concurrent Cache Access**
+   "Always use lock-free data structures for high-contention caches"
+
+3. **Note: Cache Race Condition Fix** (from 2026-01-17 journal)
+   "Fixed race in cache by switching to DashMap"
+
+4. **Guideline: Concurrency Safety**
+   "Use atomic operations and lock-free structures where possible"
+
+It looks like we've seen this before! Check the journal entry from 2026-01-17.
+
+

Developer reads journal:

+
kb show journal-2026-01-17
+
+

Finds:

+
    +
  • Exact same issue
  • +
  • Solution: switch to DashMap
  • +
  • Code example included
  • +
  • Performance benchmarks
  • +
+

Applies fix in 10 minutes instead of 2 hours of debugging.

+
+

Use Case 8: API Design Collaboration

+

Problem

+

Team discussing new API design. Multiple approaches:

+
    +
  • REST vs GraphQL
  • +
  • Versioning strategy
  • +
  • Authentication method
  • +
+

Need to capture discussion and decision.

+

Solution with KOGRAL

+

During design meeting (using Claude Code):

+
We're designing the new API. Let me capture this discussion:
+
+Approaches discussed:
+1. REST with versioned endpoints (/v1/, /v2/)
+2. GraphQL with schema versioning
+3. gRPC for internal services
+
+Team consensus:
+- REST for public API (easier for partners)
+- GraphQL for internal admin tools (flexibility)
+- gRPC for service-to-service (performance)
+
+Create a decision record for each, linking them together.
+
+

Claude (creates 3 linked ADRs):

+
Created 3 decisions:
+
+1. decision-rest-public-api
+   Status: accepted
+   Context: Public API needs broad compatibility
+   Decision: REST with /v1/, /v2/ versioning
+
+2. decision-graphql-admin
+   Status: accepted
+   Context: Admin tools need flexible queries
+   Decision: GraphQL with schema evolution
+
+3. decision-grpc-internal
+   Status: accepted
+   Context: Service-to-service needs performance
+   Decision: gRPC with protobuf
+
+Linked:
+  decision-rest-public-api --[relates_to]--> decision-graphql-admin
+  decision-rest-public-api --[relates_to]--> decision-grpc-internal
+  decision-graphql-admin --[relates_to]--> decision-grpc-internal
+
+All decisions documented and interconnected.
+
+

Two months later, someone asks "Why REST not GraphQL for public API?":

+
kb show decision-rest-public-api
+
+

Full context preserved, including relationship to GraphQL decision.

+
+

Summary

+

Knowledge Base excels at:

+

Onboarding: Historical context instantly available +✅ Decision Making: ADRs preserve rationale +✅ Pattern Reuse: Solutions documented once, used forever +✅ Daily Tracking: Development journal with semantic search +✅ Code Review: Implementation rationale linked to decisions +✅ Cross-Project: Shared guidelines with project overrides +✅ Bug Investigation: Past solutions easily discovered +✅ Collaboration: Discussions captured and interconnected

+

Common Theme: Knowledge captured during work, queryable when needed, connected to related concepts.

+
+

Next Steps

+ +

Best Practices

+

System Architecture

+

Comprehensive overview of the KOGRAL architecture.

+

High-Level Architecture

+

Architecture Overview

+

The KOGRAL consists of three main layers:

+
    +
  1. User Interfaces: kb-cli (terminal), kb-mcp (AI integration), NuShell scripts (automation)
  2. +
  3. Core Library (kb-core): Rust library with graph engine, storage abstraction, embeddings, query engine
  4. +
  5. Storage Backends: Filesystem (git-friendly), SurrealDB (scalable), In-Memory (cache/testing)
  6. +
+

Component Details

+

kb-cli (Command-Line Interface)

+

Purpose: Primary user interface for local knowledge management.

+

Commands (13 total):

+
    +
  • init: Initialize .kogral/ directory
  • +
  • add: Create nodes (note, decision, guideline, pattern, journal)
  • +
  • search: Text and semantic search
  • +
  • link: Create relationships between nodes
  • +
  • list: List all nodes
  • +
  • show: Display node details
  • +
  • delete: Remove nodes
  • +
  • graph: Visualize knowledge graph
  • +
  • sync: Sync filesystem ↔ SurrealDB
  • +
  • serve: Start MCP server
  • +
  • import: Import from Logseq
  • +
  • export: Export to Logseq/JSON
  • +
  • config: Manage configuration
  • +
+

Technology: Rust + clap (derive API)

+

Features:

+
    +
  • Colored terminal output
  • +
  • Interactive prompts
  • +
  • Dry-run modes
  • +
  • Validation before operations
  • +
+

kb-mcp (MCP Server)

+

Purpose: AI integration via Model Context Protocol.

+

Protocol: JSON-RPC 2.0 over stdio

+

Components:

+
    +
  1. +

    Tools (7):

    +
      +
    • kogral/search: Query knowledge base
    • +
    • kb/add_note: Create notes
    • +
    • kb/add_decision: Create ADRs
    • +
    • kb/link: Create relationships
    • +
    • kb/get_guidelines: Retrieve guidelines with inheritance
    • +
    • kb/list_graphs: List available graphs
    • +
    • kb/export: Export to formats
    • +
    +
  2. +
  3. +

    Resources (6 URIs):

    +
      +
    • kogral://project/notes
    • +
    • kogral://project/decisions
    • +
    • kogral://project/guidelines
    • +
    • kogral://project/patterns
    • +
    • kogral://shared/guidelines
    • +
    • kogral://shared/patterns
    • +
    +
  4. +
  5. +

    Prompts (2):

    +
      +
    • kb/summarize_project: Generate project summary
    • +
    • kb/find_related: Find related nodes
    • +
    +
  6. +
+

Integration: Claude Code via ~/.config/claude/config.json

+

NuShell Scripts

+

Purpose: Automation and maintenance tasks.

+

Scripts (6):

+
    +
  • kb-sync.nu: Filesystem ↔ SurrealDB sync
  • +
  • kb-backup.nu: Archive knowledge base
  • +
  • kb-reindex.nu: Rebuild embeddings
  • +
  • kb-import-logseq.nu: Import from Logseq
  • +
  • kb-export-logseq.nu: Export to Logseq
  • +
  • kb-stats.nu: Graph statistics
  • +
+

Features:

+
    +
  • Colored output
  • +
  • Dry-run modes
  • +
  • Progress indicators
  • +
  • Error handling
  • +
+

Core Library (kb-core)

+

Models

+

Graph:

+
#![allow(unused)]
+fn main() {
+pub struct Graph {
+    pub name: String,
+    pub version: String,
+    pub nodes: HashMap<String, Node>,  // ID → Node
+    pub edges: Vec<Edge>,
+    pub metadata: HashMap<String, Value>,
+}
+}
+

Node:

+
#![allow(unused)]
+fn main() {
+pub struct Node {
+    pub id: String,
+    pub node_type: NodeType,
+    pub title: String,
+    pub content: String,
+    pub tags: Vec<String>,
+    pub status: NodeStatus,
+    pub created: DateTime<Utc>,
+    pub modified: DateTime<Utc>,
+    // ... relationships, metadata
+}
+}
+

Edge:

+
#![allow(unused)]
+fn main() {
+pub struct Edge {
+    pub from: String,
+    pub to: String,
+    pub relation: EdgeType,
+    pub strength: f32,
+    pub created: DateTime<Utc>,
+}
+}
+

Storage Trait

+
#![allow(unused)]
+fn main() {
+#[async_trait]
+pub trait Storage: Send + Sync {
+    async fn save_graph(&self, graph: &Graph) -> Result<()>;
+    async fn load_graph(&self, name: &str) -> Result<Graph>;
+    async fn delete_graph(&self, name: &str) -> Result<()>;
+    async fn list_graphs(&self) -> Result<Vec<String>>;
+}
+}
+

Implementations:

+
    +
  1. FilesystemStorage: Git-friendly markdown files
  2. +
  3. MemoryStorage: In-memory with DashMap
  4. +
  5. SurrealDbStorage: Scalable graph database
  6. +
+

Embedding Provider Trait

+
#![allow(unused)]
+fn main() {
+#[async_trait]
+pub trait EmbeddingProvider: Send + Sync {
+    async fn embed(&self, texts: Vec<String>) -> Result<Vec<Vec<f32>>>;
+    fn dimensions(&self) -> usize;
+    fn model_name(&self) -> &str;
+}
+}
+

Implementations:

+
    +
  1. FastEmbedProvider: Local fastembed
  2. +
  3. RigEmbeddingProvider: OpenAI, Claude, Ollama (via rig-core)
  4. +
+

Parser

+

Input: Markdown file with YAML frontmatter

+

Output: Node struct

+

Features:

+
    +
  • YAML frontmatter extraction
  • +
  • Markdown body parsing
  • +
  • Wikilink detection ([[linked-note]])
  • +
  • Code reference parsing (@file.rs:42)
  • +
+

Example:

+
---
+id: note-123
+type: note
+title: My Note
+tags: [rust, async]
+---
+
+# My Note
+
+Content with [[other-note]] and @src/main.rs:10
+
+

+
#![allow(unused)]
+fn main() {
+Node {
+    id: "note-123",
+    node_type: NodeType::Note,
+    title: "My Note",
+    content: "Content with [[other-note]] and @src/main.rs:10",
+    tags: vec!["rust", "async"],
+    // ... parsed wikilinks, code refs
+}
+}
+

Configuration System

+

Nickel Schema

+
# schemas/kb-config.ncl
+{
+  KbConfig = {
+    graph | GraphConfig,
+    storage | StorageConfig,
+    embeddings | EmbeddingConfig,
+    templates | TemplateConfig,
+    query | QueryConfig,
+    mcp | McpConfig,
+    sync | SyncConfig,
+  },
+}
+
+

Loading Process

+
User writes: .kogral/config.ncl
+    ↓ [nickel export --format json]
+JSON intermediate
+    ↓ [serde_json::from_str]
+KbConfig struct (Rust)
+    ↓
+Runtime behavior
+
+

Double Validation:

+
    +
  1. Nickel contracts: Type-safe, enum validation
  2. +
  3. Serde deserialization: Rust type checking
  4. +
+

Benefits:

+
    +
  • Errors caught at export time
  • +
  • Runtime guaranteed valid config
  • +
  • Self-documenting schemas
  • +
+

Storage Architecture

+

Hybrid Strategy

+

Local Graph (per project):

+
    +
  • Storage: Filesystem (.kogral/ directory)
  • +
  • Format: Markdown + YAML frontmatter
  • +
  • Version control: Git
  • +
  • Scope: Project-specific knowledge
  • +
+

Shared Graph (organization):

+
    +
  • Storage: SurrealDB (or synced filesystem)
  • +
  • Format: Same markdown (for compatibility)
  • +
  • Version control: Optional
  • +
  • Scope: Organization-wide guidelines
  • +
+

Sync:

+
Filesystem (.kogral/)
+    ↕ [bidirectional sync]
+SurrealDB (central)
+
+

File Layout

+
.kogral/
+├── config.toml              # Graph metadata
+├── notes/
+│   ├── async-patterns.md    # Individual note
+│   └── error-handling.md
+├── decisions/
+│   ├── 0001-use-rust.md     # ADR format
+│   └── 0002-surrealdb.md
+├── guidelines/
+│   ├── rust-errors.md       # Project guideline
+│   └── testing.md
+├── patterns/
+│   └── repository.md
+└── journal/
+    ├── 2026-01-17.md        # Daily journal
+    └── 2026-01-18.md
+
+

Query Engine

+ +
#![allow(unused)]
+fn main() {
+let results = graph.nodes.values()
+    .filter(|node| {
+        node.title.contains(&query) ||
+        node.content.contains(&query) ||
+        node.tags.iter().any(|tag| tag.contains(&query))
+    })
+    .collect();
+}
+

Semantic Search

+
#![allow(unused)]
+fn main() {
+let query_embedding = embeddings.embed(vec![query]).await?;
+let mut scored: Vec<_> = graph.nodes.values()
+    .filter_map(|node| {
+        let node_embedding = node.embedding.as_ref()?;
+        let similarity = cosine_similarity(&query_embedding[0], node_embedding);
+        (similarity >= threshold).then_some((node, similarity))
+    })
+    .collect();
+scored.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap());
+}
+

Cross-Graph Query

+
#![allow(unused)]
+fn main() {
+// Query both project and shared graphs
+let project_results = project_graph.search(&query).await?;
+let shared_results = shared_graph.search(&query).await?;
+
+// Merge with deduplication
+let combined = merge_results(project_results, shared_results);
+}
+

MCP Protocol Flow

+
Claude Code                kb-mcp                    kb-core
+    │                         │                         │
+    ├─ JSON-RPC request ───→ │                         │
+    │  kb/search              │                         │
+    │  {"query": "rust"}      │                         │
+    │                         ├─ search() ──────────→  │
+    │                         │                         │
+    │                         │                    Query engine
+    │                         │                    Text + semantic
+    │                         │                         │
+    │                         │ ←──── results ─────────┤
+    │                         │                         │
+    │ ←─ JSON-RPC response ──┤                         │
+    │  {"results": [...]}     │                         │
+
+

Template System

+

Engine: Tera (Jinja2-like)

+

Templates:

+
    +
  1. +

    Document Templates (6):

    +
      +
    • note.md.tera
    • +
    • decision.md.tera
    • +
    • guideline.md.tera
    • +
    • pattern.md.tera
    • +
    • journal.md.tera
    • +
    • execution.md.tera
    • +
    +
  2. +
  3. +

    Export Templates (4):

    +
      +
    • logseq-page.md.tera
    • +
    • logseq-journal.md.tera
    • +
    • summary.md.tera
    • +
    • graph.json.tera
    • +
    +
  4. +
+

Usage:

+
#![allow(unused)]
+fn main() {
+let mut tera = Tera::new("templates/**/*.tera")?;
+let rendered = tera.render("note.md.tera", &context)?;
+}
+

Error Handling

+

Strategy: thiserror for structured errors

+
#![allow(unused)]
+fn main() {
+#[derive(Error, Debug)]
+pub enum KbError {
+    #[error("Storage error: {0}")]
+    Storage(String),
+
+    #[error("Node not found: {0}")]
+    NodeNotFound(String),
+
+    #[error("Configuration error: {0}")]
+    Config(String),
+
+    #[error("Parse error: {0}")]
+    Parse(String),
+
+    #[error("Embedding error: {0}")]
+    Embedding(String),
+}
+}
+

Propagation: ? operator throughout

+

Testing Strategy

+

Unit Tests: Per module (models, parser, storage)

+

Integration Tests: Full workflow (add → save → load → query)

+

Test Coverage:

+
    +
  • kb-core: 48 tests
  • +
  • kb-mcp: 5 tests
  • +
  • Total: 56 tests
  • +
+

Test Data: Fixtures in tests/fixtures/

+

Performance Considerations

+

Node Lookup: O(1) via HashMap

+

Semantic Search: O(n) with early termination (threshold filter)

+

Storage:

+
    +
  • Filesystem: Lazy loading (load on demand)
  • +
  • Memory: Full graph in RAM
  • +
  • SurrealDB: Query optimization (indexes)
  • +
+

Embeddings:

+
    +
  • Cache embeddings in node metadata
  • +
  • Batch processing (configurable batch size)
  • +
  • Async generation (non-blocking)
  • +
+

Security

+

No unsafe code: #![forbid(unsafe_code)]

+

Input validation:

+
    +
  • Nickel contracts validate config
  • +
  • serde validates JSON
  • +
  • Custom validation for user input
  • +
+

File operations:

+
    +
  • Path sanitization (no ../ traversal)
  • +
  • Permissions checking
  • +
  • Atomic writes (temp file + rename)
  • +
+

Scalability

+

Small Projects (< 1000 nodes):

+
    +
  • Filesystem storage
  • +
  • In-memory search
  • +
  • Local embeddings (fastembed)
  • +
+

Medium Projects (1000-10,000 nodes):

+
    +
  • Filesystem + SurrealDB sync
  • +
  • Semantic search with caching
  • +
  • Cloud embeddings (OpenAI/Claude)
  • +
+

Large Organizations (> 10,000 nodes):

+
    +
  • SurrealDB primary
  • +
  • Distributed embeddings
  • +
  • Multi-graph federation
  • +
+

Next Steps

+ +

Graph Model

+

Config-Driven Architecture

+

The KOGRAL follows a config-driven architecture where all behavior is defined through Nickel configuration files rather than hardcoded in Rust.

+

Philosophy

+

"Configuration, not code, defines behavior"

+

Instead of hardcoding storage backends, embedding providers, or query parameters, KB uses a layered configuration system that composes settings from multiple sources:

+
    +
  1. Schema contracts (type definitions)
  2. +
  3. Defaults (base values)
  4. +
  5. Mode overlays (dev/prod/test optimizations)
  6. +
  7. User customizations (project-specific overrides)
  8. +
+

This approach provides:

+
    +
  • Type safety - Nickel contracts validate configuration before runtime
  • +
  • Composability - Mix and match configurations for different environments
  • +
  • Discoverability - Self-documenting schemas with inline documentation
  • +
  • Hot-reload - Change behavior without recompiling Rust code
  • +
  • Double validation - Nickel contracts + serde ensure correctness
  • +
+

Configuration Composition Flow

+

Configuration Composition

+

The configuration system uses a four-layer composition pattern:

+

Layer 1: Schema Contracts

+

Location: schemas/kb/contracts.ncl

+

Purpose: Define types and validation rules using Nickel contracts.

+

Example:

+
{
+  StorageType = [| 'filesystem, 'memory, 'surrealdb |],
+
+  StorageConfig = {
+    primary | StorageType
+      | doc "Primary storage backend"
+      | default = 'filesystem,
+
+    secondary | SecondaryStorageConfig
+      | doc "Optional secondary storage"
+      | default = { enabled = false },
+  },
+}
+
+

Benefits:

+
    +
  • Enum validation (only valid storage types accepted)
  • +
  • Required vs optional fields
  • +
  • Default values for optional fields
  • +
  • Documentation attached to types
  • +
+

Layer 2: Defaults

+

Location: schemas/kb/defaults.ncl

+

Purpose: Provide sensible base values for all configuration options.

+

Example:

+
{
+  base = {
+    storage = {
+      primary = 'filesystem,
+      secondary = {
+        enabled = false,
+        type = 'surrealdb,
+        url = "ws://localhost:8000",
+      },
+    },
+    embeddings = {
+      enabled = true,
+      provider = 'fastembed,
+      model = "BAAI/bge-small-en-v1.5",
+      dimensions = 384,
+    },
+  } | contracts.KbConfig,
+}
+
+

Validated by: contracts.KbConfig contract ensures defaults are valid.

+

Layer 3: Mode Overlays

+

Location: schemas/kb/modes/{dev,prod,test}.ncl

+

Purpose: Environment-specific optimizations and tuning.

+

Development Mode (dev.ncl)

+

Optimized for: Fast iteration, local development, debugging

+
{
+  storage = {
+    primary = 'filesystem,
+    secondary = { enabled = false },  # No database overhead
+  },
+  embeddings = {
+    provider = 'fastembed,  # Local, no API costs
+  },
+  sync = {
+    auto_index = false,  # Manual control
+  },
+}
+
+

Production Mode (prod.ncl)

+

Optimized for: Performance, reliability, scalability

+
{
+  storage = {
+    secondary = { enabled = true },  # SurrealDB for scale
+  },
+  embeddings = {
+    provider = 'openai,  # High-quality cloud embeddings
+    model = "text-embedding-3-small",
+    dimensions = 1536,
+  },
+  sync = {
+    auto_index = true,
+    debounce_ms = 300,  # Fast response
+  },
+}
+
+

Test Mode (test.ncl)

+

Optimized for: Fast tests, isolation, determinism

+
{
+  storage = {
+    primary = 'memory,  # Ephemeral, no disk I/O
+  },
+  embeddings = {
+    enabled = false,  # Disable for speed
+  },
+  sync = {
+    auto_index = false,
+    debounce_ms = 0,  # No delays in tests
+  },
+}
+
+

Layer 4: User Customizations

+

Location: .kb-config/core/kb.ncl or .kb-config/platform/{dev,prod,test}.ncl

+

Purpose: Project-specific or deployment-specific overrides.

+

Example (user project config):

+
let mode = import "../../schemas/kb/modes/dev.ncl" in
+
+let user_custom = {
+  graph = {
+    name = "my-project",
+  },
+  embeddings = {
+    provider = 'claude,  # Override to use Claude
+    model = "claude-3-haiku-20240307",
+  },
+  query = {
+    similarity_threshold = 0.7,  # Stricter threshold
+  },
+} in
+
+helpers.compose_config defaults.base mode user_custom
+  | contracts.KbConfig
+
+

Composition Mechanism

+

The helpers.ncl module provides the composition function:

+
{
+  # Recursively merge with override precedence
+  merge_with_override = fun base override => /* ... */,
+
+  # Compose three layers
+  compose_config = fun defaults mode_config user_custom =>
+    let with_mode = merge_with_override defaults mode_config in
+    merge_with_override with_mode user_custom,
+}
+
+

Merge behavior:

+
    +
  • Records are merged recursively
  • +
  • Override values take precedence over base values
  • +
  • Arrays are not merged, override replaces base
  • +
  • Null in override keeps base value
  • +
+

Example merge:

+
base = { storage = { primary = 'filesystem }, embeddings = { enabled = true } }
+override = { storage = { primary = 'memory } }
+# Result: { storage = { primary = 'memory }, embeddings = { enabled = true } }
+
+

Export to JSON

+

Once composed, the Nickel configuration is exported to JSON for Rust consumption:

+
nickel export --format json .kb-config/core/kb.ncl > .kb-config/targets/kb-core.json
+
+

Output (.kb-config/targets/kb-core.json):

+
{
+  "graph": {
+    "name": "my-project",
+    "version": "1.0.0"
+  },
+  "storage": {
+    "primary": "memory",
+    "secondary": {
+      "enabled": false
+    }
+  },
+  "embeddings": {
+    "enabled": true,
+    "provider": "claude",
+    "model": "claude-3-haiku-20240307",
+    "dimensions": 768
+  }
+}
+
+

Rust Integration

+

The Rust code deserializes the JSON into typed structs using serde:

+
#![allow(unused)]
+fn main() {
+use serde::{Deserialize, Serialize};
+
+#[derive(Debug, Deserialize, Serialize)]
+pub struct KbConfig {
+    pub graph: GraphConfig,
+    pub storage: StorageConfig,
+    pub embeddings: EmbeddingConfig,
+    pub templates: TemplateConfig,
+    pub query: QueryConfig,
+    pub mcp: McpConfig,
+    pub sync: SyncConfig,
+}
+
+impl KbConfig {
+    pub fn from_file(path: &Path) -> Result<Self> {
+        let json = std::fs::read_to_string(path)?;
+        let config: KbConfig = serde_json::from_str(&json)?;
+        Ok(config)
+    }
+}
+}
+

Usage in kb-core:

+
#![allow(unused)]
+fn main() {
+let config = KbConfig::from_file(".kb-config/targets/kb-core.json")?;
+
+// Config drives behavior
+let storage: Box<dyn Storage> = match config.storage.primary {
+    StorageType::Filesystem => Box::new(FilesystemStorage::new(&config)?),
+    StorageType::Memory => Box::new(MemoryStorage::new()),
+    StorageType::SurrealDb => Box::new(SurrealDbStorage::new(&config).await?),
+};
+
+let embeddings: Box<dyn EmbeddingProvider> = match config.embeddings.provider {
+    EmbeddingProviderType::FastEmbed => Box::new(FastEmbedProvider::new()?),
+    EmbeddingProviderType::OpenAI => Box::new(RigEmbeddingProvider::openai(&config)?),
+    EmbeddingProviderType::Claude => Box::new(RigEmbeddingProvider::claude(&config)?),
+    EmbeddingProviderType::Ollama => Box::new(RigEmbeddingProvider::ollama(&config)?),
+};
+}
+

Double Validation

+

Configuration is validated twice:

+

1. Nickel Contract Validation

+

At export time, Nickel validates:

+
    +
  • ✅ Types match contracts (e.g., primary | StorageType)
  • +
  • ✅ Required fields are present
  • +
  • ✅ Enums have valid values
  • +
  • ✅ Nested structure is correct
  • +
+

Error example:

+
error: contract broken by a value
+  ┌─ .kb-config/core/kb.ncl:15:5
+  │
+15│     primary = 'invalid,
+  │     ^^^^^^^^^^^^^^^^^^^ applied to this expression
+  │
+  = This value is not in the enum ['filesystem, 'memory, 'surrealdb]
+
+

2. Serde Deserialization Validation

+

At runtime, serde validates:

+
    +
  • ✅ JSON structure matches Rust types
  • +
  • ✅ Field names match (with rename support)
  • +
  • ✅ Values can be converted to Rust types
  • +
  • ✅ Required fields are not null
  • +
+

Error example:

+
#![allow(unused)]
+fn main() {
+Error: missing field `graph` at line 1 column 123
+}
+

Benefits of Config-Driven Architecture

+

1. Zero Hardcoding

+

Bad (hardcoded):

+
#![allow(unused)]
+fn main() {
+// Hardcoded - requires recompilation to change
+let storage = FilesystemStorage::new("/fixed/path");
+let threshold = 0.6;
+}
+

Good (config-driven):

+
#![allow(unused)]
+fn main() {
+// Config-driven - change via .ncl file
+let storage = create_storage(&config)?;
+let threshold = config.query.similarity_threshold;
+}
+

2. Environment Flexibility

+

Same codebase, different behavior:

+
# Development
+nickel export .kb-config/platform/dev.ncl > targets/kb-core.json
+# → Filesystem storage, fastembed, no auto-sync
+
+# Production
+nickel export .kb-config/platform/prod.ncl > targets/kb-core.json
+# → SurrealDB enabled, OpenAI embeddings, auto-sync
+
+# Testing
+nickel export .kb-config/platform/test.ncl > targets/kb-core.json
+# → In-memory storage, no embeddings, isolated
+
+

3. Self-Documenting

+

Nickel contracts include inline documentation:

+
StorageType = [| 'filesystem, 'memory, 'surrealdb |]
+  | doc "Storage backend type: filesystem (git-tracked), memory (ephemeral), surrealdb (scalable)",
+
+

IDEs can show this documentation when editing .ncl files.

+

4. Type-Safe Evolution

+

When adding new features:

+
    +
  1. Update contract in contracts.ncl
  2. +
  3. Add default in defaults.ncl
  4. +
  5. Export validates existing configs
  6. +
  7. Rust compilation validates deserialization
  8. +
+

Breaking changes are caught before runtime.

+

5. Testability

+

Different test scenarios without code changes:

+
# test-semantic-search.ncl
+let test_config = defaults.base & {
+  embeddings = { enabled = true, provider = 'fastembed },
+  query = { similarity_threshold = 0.3 },
+} in test_config
+
+
#![allow(unused)]
+fn main() {
+#[test]
+fn test_semantic_search() {
+    let config = KbConfig::from_file("test-semantic-search.json")?;
+    // Config drives test behavior
+}
+}
+

Configuration Discovery

+

KB tools automatically discover configuration:

+
    +
  1. Check .kb-config/targets/kb-core.json (pre-exported)
  2. +
  3. Check .kb-config/core/kb.ncl (export on-demand)
  4. +
  5. Check environment variable KB_CONFIG
  6. +
  7. Fall back to embedded defaults
  8. +
+
#![allow(unused)]
+fn main() {
+impl KbConfig {
+    pub fn discover() -> Result<Self> {
+        if let Ok(config) = Self::from_file(".kb-config/targets/kb-core.json") {
+            return Ok(config);
+        }
+
+        if Path::new(".kb-config/core/kb.ncl").exists() {
+            // Export and load
+            let output = Command::new("nickel")
+                .args(["export", "--format", "json", ".kb-config/core/kb.ncl"])
+                .output()?;
+            return serde_json::from_slice(&output.stdout)?;
+        }
+
+        if let Ok(path) = std::env::var("KB_CONFIG") {
+            return Self::from_file(&path);
+        }
+
+        Ok(Self::default())  // Embedded defaults
+    }
+}
+}
+

Integration with justfile

+

The justfile integrates configuration validation:

+
# Validate all Nickel configs
+nickel-validate-all:
+    @echo "Validating Nickel schemas..."
+    nickel typecheck schemas/kb/contracts.ncl
+    nickel typecheck schemas/kb/defaults.ncl
+    nickel typecheck schemas/kb/helpers.ncl
+    nickel typecheck schemas/kb/modes/dev.ncl
+    nickel typecheck schemas/kb/modes/prod.ncl
+    nickel typecheck schemas/kb/modes/test.ncl
+    nickel typecheck .kb-config/core/kb.ncl
+
+# Export all platform configs
+nickel-export-all:
+    @echo "Exporting platform configs to JSON..."
+    @mkdir -p .kb-config/targets
+    nickel export --format json .kb-config/platform/dev.ncl > .kb-config/targets/kb-dev.json
+    nickel export --format json .kb-config/platform/prod.ncl > .kb-config/targets/kb-prod.json
+    nickel export --format json .kb-config/platform/test.ncl > .kb-config/targets/kb-test.json
+    @echo "Exported 3 configurations to .kb-config/targets/"
+
+

Usage:

+
just nickel::validate-all  # Check configs are valid
+just nickel::export-all    # Generate JSON for all environments
+
+

Best Practices

+

1. Never Hardcode

+

If it's behavior, it's config:

+
    +
  • Storage paths
  • +
  • API endpoints
  • +
  • Thresholds
  • +
  • Timeouts
  • +
  • Feature flags
  • +
  • Provider selection
  • +
+

2. Use Modes for Environment Differences

+

Don't put environment-specific values in user config:

+

Bad:

+
# user config with env-specific values
+{
+  storage = {
+    url = if env == "prod" then "prod-url" else "dev-url"  # Don't do this
+  }
+}
+
+

Good:

+
# modes/prod.ncl
+{ storage = { url = "prod-url" } }
+
+# modes/dev.ncl
+{ storage = { url = "dev-url" } }
+
+# user config is environment-agnostic
+{ graph = { name = "my-project" } }
+
+

3. Document Complex Fields

+

Use Nickel's doc metadata:

+
similarity_threshold | Number
+  | doc "Minimum cosine similarity (0-1) for semantic search matches. Higher = stricter."
+  | default = 0.6,
+
+

4. Validate Early

+

Run nickel typecheck in CI/CD before building Rust code.

+

5. Version Configs

+

Track .ncl files in git, ignore .kb-config/targets/*.json (generated).

+

See Also

+ +

Storage Architecture

+

Logseq Blocks Support - Architecture Design

+

Problem Statement

+

Logseq uses content blocks as the fundamental unit of information, not full documents. Each block can have:

+
    +
  • Properties: #card, TODO, DONE, custom properties
  • +
  • Tags: Inline tags like #flashcard, #important
  • +
  • References: Block references ((block-id)), page references [[page]]
  • +
  • Nesting: Outliner-style hierarchy (parent-child blocks)
  • +
  • Metadata: Block-level properties (unlike page-level frontmatter)
  • +
+

Current KB limitation: Nodes only have content: String (flat markdown). Importing from Logseq loses block structure and properties.

+

Requirement: Support round-trip import/export with full block fidelity:

+
Logseq Graph → KOGRAL Import → KOGRAL Storage → KOGRAL Export → Logseq Graph
+     (blocks preserved)                    (blocks preserved)
+
+

Use Cases

+

1. Flashcards (#card)

+

Logseq:

+
- What is Rust's ownership model? #card
+  - Rust uses ownership, borrowing, and lifetimes
+  - Three rules: one owner, many borrows XOR one mutable
+
+

KB needs to preserve:

+
    +
  • Block with #card property
  • +
  • Nested answer blocks
  • +
  • Ability to query all cards
  • +
+

2. Task Tracking (TODO/DONE)

+

Logseq:

+
- TODO Implement block parser #rust
+  - DONE Research block structure
+  - TODO Write parser tests
+
+

KB needs to preserve:

+
    +
  • Task status per block
  • +
  • Hierarchical task breakdown
  • +
  • Tags on tasks
  • +
+

3. Block References

+

Logseq:

+
- Core concept: ((block-uuid-123))
+  - See also: [[Related Page]]
+
+

KB needs to preserve:

+
    +
  • Block-to-block links (not just page-to-page)
  • +
  • UUID references
  • +
+

4. Block Properties

+

Logseq:

+
- This is a block with properties
+  property1:: value1
+  property2:: value2
+
+

KB needs to preserve:

+
    +
  • Custom key-value properties per block
  • +
  • Property inheritance/override
  • +
+

Design Options

+

Option A: Blocks as First-Class Data Structure

+

Add blocks field to Node:

+
#![allow(unused)]
+fn main() {
+pub struct Node {
+    // ... existing fields ...
+    pub content: String,              // Backward compat: flat markdown
+    pub blocks: Option<Vec<Block>>,   // NEW: Structured blocks
+}
+
+pub struct Block {
+    pub id: String,                   // UUID or auto-generated
+    pub content: String,              // Block text
+    pub properties: BlockProperties,  // Tags, status, custom props
+    pub children: Vec<Block>,         // Nested blocks
+    pub created: DateTime<Utc>,
+    pub modified: DateTime<Utc>,
+}
+
+pub struct BlockProperties {
+    pub tags: Vec<String>,            // #card, #important
+    pub status: Option<TaskStatus>,   // TODO, DONE, WAITING
+    pub custom: HashMap<String, String>, // property:: value
+}
+
+pub enum TaskStatus {
+    Todo,
+    Doing,
+    Done,
+    Waiting,
+    Cancelled,
+}
+}
+

Pros:

+
    +
  • ✅ Type-safe, explicit structure
  • +
  • ✅ Queryable (find all #card blocks)
  • +
  • ✅ Preserves hierarchy
  • +
  • ✅ Supports block-level operations
  • +
+

Cons:

+
    +
  • ❌ Adds complexity to Node
  • +
  • ❌ Dual representation (content + blocks)
  • +
  • ❌ Requires migration of existing data
  • +
+

Option B: Parser-Only Approach

+

Keep content: String, parse blocks on-demand:

+
#![allow(unused)]
+fn main() {
+pub struct BlockParser;
+
+impl BlockParser {
+    // Parse markdown content into block structure
+    fn parse(content: &str) -> Vec<Block>;
+
+    // Serialize blocks back to markdown
+    fn serialize(blocks: &[Block]) -> String;
+}
+
+// Usage
+let blocks = BlockParser::parse(&node.content);
+let filtered = blocks.iter().filter(|b| b.properties.tags.contains("card"));
+}
+

Pros:

+
    +
  • ✅ No schema changes
  • +
  • ✅ Backward compatible
  • +
  • ✅ Simple storage (still just String)
  • +
+

Cons:

+
    +
  • ❌ Parse overhead on every access
  • +
  • ❌ Can't query blocks in database (SurrealDB)
  • +
  • ❌ Harder to index/search blocks
  • +
+ +

Combine both: structured storage + lazy parsing:

+
#![allow(unused)]
+fn main() {
+pub struct Node {
+    // ... existing fields ...
+    pub content: String,              // Source of truth (markdown)
+
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub blocks: Option<Vec<Block>>,   // Cached structure (parsed)
+}
+
+impl Node {
+    // Parse blocks from content if not already cached
+    pub fn get_blocks(&mut self) -> &Vec<Block> {
+        if self.blocks.is_none() {
+            self.blocks = Some(BlockParser::parse(&self.content));
+        }
+        self.blocks.as_ref().unwrap()
+    }
+
+    // Update content from blocks (when blocks modified)
+    pub fn sync_blocks_to_content(&mut self) {
+        if let Some(ref blocks) = self.blocks {
+            self.content = BlockParser::serialize(blocks);
+        }
+    }
+}
+}
+

Storage Strategy:

+
    +
  1. +

    Filesystem - Store as markdown (Logseq compatible):

    +
    - Block 1 #card
    +  - Nested block
    +- Block 2 TODO
    +
    +
  2. +
  3. +

    SurrealDB - Store both:

    +
    DEFINE TABLE block SCHEMAFULL;
    +DEFINE FIELD node_id ON block TYPE record(node);
    +DEFINE FIELD block_id ON block TYPE string;
    +DEFINE FIELD content ON block TYPE string;
    +DEFINE FIELD properties ON block TYPE object;
    +DEFINE FIELD parent_id ON block TYPE option<string>;
    +
    +-- Index for queries
    +DEFINE INDEX block_tags ON block COLUMNS properties.tags;
    +DEFINE INDEX block_status ON block COLUMNS properties.status;
    +
    +
  4. +
+

Pros:

+
    +
  • ✅ Best of both worlds
  • +
  • ✅ Filesystem stays Logseq-compatible
  • +
  • ✅ SurrealDB can query blocks
  • +
  • ✅ Lazy parsing (only when needed)
  • +
  • ✅ Backward compatible
  • +
+

Cons:

+
    +
  • ⚠️ Need to keep content/blocks in sync
  • +
  • ⚠️ More complex implementation
  • +
+ +

Phase 1: Data Model

+
#![allow(unused)]
+fn main() {
+// crates/kb-core/src/models/block.rs
+
+use chrono::{DateTime, Utc};
+use serde::{Deserialize, Serialize};
+use std::collections::HashMap;
+
+/// A content block (Logseq-style)
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct Block {
+    /// Unique block identifier (UUID)
+    pub id: String,
+
+    /// Block content (markdown text, excluding nested blocks)
+    pub content: String,
+
+    /// Block properties (tags, status, custom)
+    pub properties: BlockProperties,
+
+    /// Child blocks (nested hierarchy)
+    #[serde(default)]
+    pub children: Vec<Block>,
+
+    /// Creation timestamp
+    pub created: DateTime<Utc>,
+
+    /// Last modification timestamp
+    pub modified: DateTime<Utc>,
+
+    /// Parent block ID (if nested)
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parent_id: Option<String>,
+}
+
+/// Block-level properties
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+pub struct BlockProperties {
+    /// Tags (e.g., #card, #important)
+    #[serde(default)]
+    pub tags: Vec<String>,
+
+    /// Task status (TODO, DONE, etc.)
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<TaskStatus>,
+
+    /// Custom properties (property:: value)
+    #[serde(default)]
+    pub custom: HashMap<String, String>,
+
+    /// Block references ((uuid))
+    #[serde(default)]
+    pub block_refs: Vec<String>,
+
+    /// Page references ([[page]])
+    #[serde(default)]
+    pub page_refs: Vec<String>,
+}
+
+/// Task status for TODO blocks
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "UPPERCASE")]
+pub enum TaskStatus {
+    Todo,
+    Doing,
+    Done,
+    Later,
+    Now,
+    Waiting,
+    Cancelled,
+}
+
+impl Block {
+    /// Create a new block with content
+    pub fn new(content: String) -> Self {
+        use uuid::Uuid;
+        Self {
+            id: Uuid::new_v4().to_string(),
+            content,
+            properties: BlockProperties::default(),
+            children: Vec::new(),
+            created: Utc::now(),
+            modified: Utc::now(),
+            parent_id: None,
+        }
+    }
+
+    /// Add a child block
+    pub fn add_child(&mut self, mut child: Block) {
+        child.parent_id = Some(self.id.clone());
+        self.children.push(child);
+        self.modified = Utc::now();
+    }
+
+    /// Add a tag to this block
+    pub fn add_tag(&mut self, tag: String) {
+        if !self.properties.tags.contains(&tag) {
+            self.properties.tags.push(tag);
+            self.modified = Utc::now();
+        }
+    }
+
+    /// Set task status
+    pub fn set_status(&mut self, status: TaskStatus) {
+        self.properties.status = Some(status);
+        self.modified = Utc::now();
+    }
+
+    /// Get all blocks (self + descendants) as flat list
+    pub fn flatten(&self) -> Vec<&Block> {
+        let mut result = vec![self];
+        for child in &self.children {
+            result.extend(child.flatten());
+        }
+        result
+    }
+
+    /// Find block by ID in tree
+    pub fn find(&self, id: &str) -> Option<&Block> {
+        if self.id == id {
+            return Some(self);
+        }
+        for child in &self.children {
+            if let Some(found) = child.find(id) {
+                return Some(found);
+            }
+        }
+        None
+    }
+}
+}
+

Phase 2: Update Node Model

+
#![allow(unused)]
+fn main() {
+// crates/kb-core/src/models.rs (modifications)
+
+use crate::models::block::Block;
+
+pub struct Node {
+    // ... existing fields ...
+    pub content: String,
+
+    /// Structured blocks (optional, parsed from content)
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub blocks: Option<Vec<Block>>,
+}
+
+impl Node {
+    /// Get blocks, parsing from content if needed
+    pub fn get_blocks(&mut self) -> Result<&Vec<Block>> {
+        if self.blocks.is_none() {
+            self.blocks = Some(crate::parser::BlockParser::parse(&self.content)?);
+        }
+        Ok(self.blocks.as_ref().unwrap())
+    }
+
+    /// Update content from blocks
+    pub fn sync_blocks_to_content(&mut self) {
+        if let Some(ref blocks) = self.blocks {
+            self.content = crate::parser::BlockParser::serialize(blocks);
+        }
+    }
+
+    /// Find all blocks with a specific tag
+    pub fn find_blocks_by_tag(&mut self, tag: &str) -> Result<Vec<&Block>> {
+        let blocks = self.get_blocks()?;
+        let mut result = Vec::new();
+        for block in blocks {
+            for b in block.flatten() {
+                if b.properties.tags.iter().any(|t| t == tag) {
+                    result.push(b);
+                }
+            }
+        }
+        Ok(result)
+    }
+
+    /// Find all TODO blocks
+    pub fn find_todos(&mut self) -> Result<Vec<&Block>> {
+        let blocks = self.get_blocks()?;
+        let mut result = Vec::new();
+        for block in blocks {
+            for b in block.flatten() {
+                if matches!(b.properties.status, Some(TaskStatus::Todo)) {
+                    result.push(b);
+                }
+            }
+        }
+        Ok(result)
+    }
+}
+}
+

Phase 3: Block Parser

+
#![allow(unused)]
+fn main() {
+// crates/kb-core/src/parser/block_parser.rs
+
+use crate::models::block::{Block, BlockProperties, TaskStatus};
+use regex::Regex;
+
+pub struct BlockParser;
+
+impl BlockParser {
+    /// Parse markdown content into block structure
+    ///
+    /// Handles:
+    /// - Outliner format (- prefix with indentation)
+    /// - Tags (#card, #important)
+    /// - Task status (TODO, DONE)
+    /// - Properties (property:: value)
+    /// - Block references (((uuid)))
+    /// - Page references ([[page]])
+    pub fn parse(content: &str) -> Result<Vec<Block>> {
+        let mut blocks = Vec::new();
+        let mut stack: Vec<(usize, Block)> = Vec::new(); // (indent_level, block)
+
+        for line in content.lines() {
+            // Detect indentation level
+            let indent = count_indent(line);
+            let trimmed = line.trim_start();
+
+            // Skip empty lines
+            if trimmed.is_empty() {
+                continue;
+            }
+
+            // Parse block line
+            if let Some(block_content) = trimmed.strip_prefix("- ") {
+                let mut block = Self::parse_block_line(block_content)?;
+
+                // Pop stack until we find parent level
+                while let Some((level, _)) = stack.last() {
+                    if *level < indent {
+                        break;
+                    }
+                    stack.pop();
+                }
+
+                // Add as child to parent or as root
+                if let Some((_, parent)) = stack.last_mut() {
+                    parent.add_child(block.clone());
+                } else {
+                    blocks.push(block.clone());
+                }
+
+                stack.push((indent, block));
+            }
+        }
+
+        Ok(blocks)
+    }
+
+    /// Parse a single block line (after "- " prefix)
+    fn parse_block_line(line: &str) -> Result<Block> {
+        let mut block = Block::new(String::new());
+        let mut properties = BlockProperties::default();
+
+        // Extract task status (TODO, DONE, etc.)
+        let (status, remaining) = Self::extract_task_status(line);
+        properties.status = status;
+
+        // Extract tags (#card, #important)
+        let (tags, remaining) = Self::extract_tags(remaining);
+        properties.tags = tags;
+
+        // Extract properties (property:: value)
+        let (custom_props, remaining) = Self::extract_properties(remaining);
+        properties.custom = custom_props;
+
+        // Extract block references (((uuid)))
+        let (block_refs, remaining) = Self::extract_block_refs(remaining);
+        properties.block_refs = block_refs;
+
+        // Extract page references ([[page]])
+        let (page_refs, content) = Self::extract_page_refs(remaining);
+        properties.page_refs = page_refs;
+
+        block.content = content.trim().to_string();
+        block.properties = properties;
+
+        Ok(block)
+    }
+
+    /// Serialize blocks back to markdown
+    pub fn serialize(blocks: &[Block]) -> String {
+        let mut result = String::new();
+        for block in blocks {
+            Self::serialize_block(&mut result, block, 0);
+        }
+        result
+    }
+
+    fn serialize_block(output: &mut String, block: &Block, indent: usize) {
+        // Write indent
+        for _ in 0..indent {
+            output.push_str("  ");
+        }
+
+        // Write prefix
+        output.push_str("- ");
+
+        // Write task status
+        if let Some(status) = block.properties.status {
+            output.push_str(&format!("{:?} ", status).to_uppercase());
+        }
+
+        // Write content
+        output.push_str(&block.content);
+
+        // Write tags
+        for tag in &block.properties.tags {
+            output.push_str(&format!(" #{}", tag));
+        }
+
+        // Write properties
+        if !block.properties.custom.is_empty() {
+            output.push('\n');
+            for (key, value) in &block.properties.custom {
+                for _ in 0..=indent {
+                    output.push_str("  ");
+                }
+                output.push_str(&format!("{}:: {}\n", key, value));
+            }
+        }
+
+        output.push('\n');
+
+        // Write children recursively
+        for child in &block.children {
+            Self::serialize_block(output, child, indent + 1);
+        }
+    }
+
+    // Helper methods for extraction
+    fn extract_task_status(line: &str) -> (Option<TaskStatus>, &str) {
+        let line = line.trim_start();
+        if let Some(rest) = line.strip_prefix("TODO ") {
+            (Some(TaskStatus::Todo), rest)
+        } else if let Some(rest) = line.strip_prefix("DONE ") {
+            (Some(TaskStatus::Done), rest)
+        } else if let Some(rest) = line.strip_prefix("DOING ") {
+            (Some(TaskStatus::Doing), rest)
+        } else if let Some(rest) = line.strip_prefix("LATER ") {
+            (Some(TaskStatus::Later), rest)
+        } else if let Some(rest) = line.strip_prefix("NOW ") {
+            (Some(TaskStatus::Now), rest)
+        } else if let Some(rest) = line.strip_prefix("WAITING ") {
+            (Some(TaskStatus::Waiting), rest)
+        } else if let Some(rest) = line.strip_prefix("CANCELLED ") {
+            (Some(TaskStatus::Cancelled), rest)
+        } else {
+            (None, line)
+        }
+    }
+
+    fn extract_tags(line: &str) -> (Vec<String>, String) {
+        let tag_regex = Regex::new(r"#(\w+)").unwrap();
+        let mut tags = Vec::new();
+        let mut result = line.to_string();
+
+        for cap in tag_regex.captures_iter(line) {
+            if let Some(tag) = cap.get(1) {
+                tags.push(tag.as_str().to_string());
+                result = result.replace(&format!("#{}", tag.as_str()), "");
+            }
+        }
+
+        (tags, result.trim().to_string())
+    }
+
+    fn extract_properties(line: &str) -> (HashMap<String, String>, String) {
+        let prop_regex = Regex::new(r"(\w+)::\s*([^\n]+)").unwrap();
+        let mut props = HashMap::new();
+        let mut result = line.to_string();
+
+        for cap in prop_regex.captures_iter(line) {
+            if let (Some(key), Some(value)) = (cap.get(1), cap.get(2)) {
+                props.insert(key.as_str().to_string(), value.as_str().trim().to_string());
+                result = result.replace(&cap[0], "");
+            }
+        }
+
+        (props, result.trim().to_string())
+    }
+
+    fn extract_block_refs(line: &str) -> (Vec<String>, String) {
+        let ref_regex = Regex::new(r"\(\(([^)]+)\)\)").unwrap();
+        let mut refs = Vec::new();
+        let mut result = line.to_string();
+
+        for cap in ref_regex.captures_iter(line) {
+            if let Some(uuid) = cap.get(1) {
+                refs.push(uuid.as_str().to_string());
+                result = result.replace(&cap[0], "");
+            }
+        }
+
+        (refs, result.trim().to_string())
+    }
+
+    fn extract_page_refs(line: &str) -> (Vec<String>, String) {
+        let page_regex = Regex::new(r"\[\[([^\]]+)\]\]").unwrap();
+        let mut pages = Vec::new();
+        let result = line.to_string();
+
+        for cap in page_regex.captures_iter(line) {
+            if let Some(page) = cap.get(1) {
+                pages.push(page.as_str().to_string());
+                // Keep [[page]] in content for now (backward compat)
+            }
+        }
+
+        (pages, result)
+    }
+}
+
+fn count_indent(line: &str) -> usize {
+    line.chars().take_while(|c| c.is_whitespace()).count() / 2
+}
+}
+

Phase 4: Logseq Import/Export

+
#![allow(unused)]
+fn main() {
+// crates/kb-core/src/logseq.rs
+
+use crate::models::{Node, NodeType};
+use crate::models::block::Block;
+use crate::parser::BlockParser;
+
+pub struct LogseqImporter;
+
+impl LogseqImporter {
+    /// Import a Logseq page (markdown file) as a Node
+    pub fn import_page(path: &Path) -> Result<Node> {
+        let content = std::fs::read_to_string(path)?;
+
+        // Extract frontmatter if present
+        let (frontmatter, body) = Self::split_frontmatter(&content);
+
+        // Parse blocks from body
+        let blocks = BlockParser::parse(&body)?;
+
+        // Create node with blocks
+        let mut node = Node::new(NodeType::Note, Self::extract_title(path));
+        node.content = body;
+        node.blocks = Some(blocks);
+
+        // Apply frontmatter properties
+        if let Some(fm) = frontmatter {
+            Self::apply_frontmatter(&mut node, &fm)?;
+        }
+
+        Ok(node)
+    }
+
+    fn split_frontmatter(content: &str) -> (Option<String>, String) {
+        if content.starts_with("---\n") {
+            if let Some(end) = content[4..].find("\n---\n") {
+                let frontmatter = content[4..4 + end].to_string();
+                let body = content[4 + end + 5..].to_string();
+                return (Some(frontmatter), body);
+            }
+        }
+        (None, content.to_string())
+    }
+
+    fn extract_title(path: &Path) -> String {
+        path.file_stem()
+            .and_then(|s| s.to_str())
+            .unwrap_or("Untitled")
+            .to_string()
+    }
+
+    fn apply_frontmatter(node: &mut Node, frontmatter: &str) -> Result<()> {
+        // Parse YAML frontmatter and apply to node
+        // ... implementation ...
+        Ok(())
+    }
+}
+
+pub struct LogseqExporter;
+
+impl LogseqExporter {
+    /// Export a Node to Logseq page format
+    pub fn export_page(node: &Node, path: &Path) -> Result<()> {
+        let mut output = String::new();
+
+        // Generate frontmatter
+        output.push_str("---\n");
+        output.push_str(&Self::generate_frontmatter(node)?);
+        output.push_str("---\n\n");
+
+        // Serialize blocks or use content
+        if let Some(ref blocks) = node.blocks {
+            output.push_str(&BlockParser::serialize(blocks));
+        } else {
+            output.push_str(&node.content);
+        }
+
+        std::fs::write(path, output)?;
+        Ok(())
+    }
+
+    fn generate_frontmatter(node: &Node) -> Result<String> {
+        let mut fm = String::new();
+        fm.push_str(&format!("title: {}\n", node.title));
+        fm.push_str(&format!("tags: {}\n", node.tags.join(", ")));
+        // ... more frontmatter fields ...
+        Ok(fm)
+    }
+}
+}
+

Query API Extensions

+
#![allow(unused)]
+fn main() {
+// New methods in Graph or Query module
+
+impl Graph {
+    /// Find all blocks with a specific tag across all nodes
+    pub fn find_blocks_by_tag(&mut self, tag: &str) -> Vec<(&Node, &Block)> {
+        let mut results = Vec::new();
+        for node in self.nodes.values_mut() {
+            if let Ok(blocks) = node.find_blocks_by_tag(tag) {
+                for block in blocks {
+                    results.push((node as &Node, block));
+                }
+            }
+        }
+        results
+    }
+
+    /// Find all flashcards (#card blocks)
+    pub fn find_flashcards(&mut self) -> Vec<(&Node, &Block)> {
+        self.find_blocks_by_tag("card")
+    }
+
+    /// Find all TODO items across knowledge base
+    pub fn find_all_todos(&mut self) -> Vec<(&Node, &Block)> {
+        let mut results = Vec::new();
+        for node in self.nodes.values_mut() {
+            if let Ok(todos) = node.find_todos() {
+                for block in todos {
+                    results.push((node as &Node, block));
+                }
+            }
+        }
+        results
+    }
+}
+}
+

MCP Tool Extensions

+
{
+  "name": "kogral/find_blocks",
+  "description": "Find blocks by tag, status, or properties",
+  "inputSchema": {
+    "type": "object",
+    "properties": {
+      "tag": { "type": "string", "description": "Filter by tag (e.g., 'card')" },
+      "status": { "type": "string", "enum": ["TODO", "DONE", "DOING"] },
+      "property": { "type": "string", "description": "Custom property key" },
+      "value": { "type": "string", "description": "Property value to match" }
+    }
+  }
+}
+
+

Configuration

+
# schemas/kb/contracts.ncl (additions)
+
+BlockConfig = {
+  enabled | Bool
+    | doc "Enable block-level parsing and storage"
+    | default = true,
+
+  preserve_hierarchy | Bool
+    | doc "Preserve block nesting on import/export"
+    | default = true,
+
+  parse_on_load | Bool
+    | doc "Automatically parse blocks when loading nodes"
+    | default = false,  # Lazy parsing by default
+
+  supported_statuses | Array String
+    | doc "Supported task statuses"
+    | default = ["TODO", "DONE", "DOING", "LATER", "NOW", "WAITING", "CANCELLED"],
+}
+
+KbConfig = {
+  # ... existing fields ...
+
+  blocks | BlockConfig
+    | doc "Block-level features configuration"
+    | default = {},
+}
+
+

Migration Path

+

Phase 1: Add Block models (no behavior change) +Phase 2: Add BlockParser (opt-in via config) +Phase 3: Update Logseq import/export +Phase 4: Add block queries to CLI/MCP +Phase 5: SurrealDB block indexing

+

Backward Compatibility:

+
    +
  • Existing nodes without blocks field work as before
  • +
  • content remains source of truth
  • +
  • blocks is optional cache/structure
  • +
  • Config flag blocks.enabled to opt-in
  • +
+

Testing Strategy

+
#![allow(unused)]
+fn main() {
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_parse_simple_block() {
+        let content = "- This is a block #card";
+        let blocks = BlockParser::parse(content).unwrap();
+
+        assert_eq!(blocks.len(), 1);
+        assert_eq!(blocks[0].content, "This is a block");
+        assert_eq!(blocks[0].properties.tags, vec!["card"]);
+    }
+
+    #[test]
+    fn test_parse_nested_blocks() {
+        let content = r#"
+- Parent block
+  - Child block 1
+  - Child block 2
+    - Grandchild
+"#;
+        let blocks = BlockParser::parse(content).unwrap();
+
+        assert_eq!(blocks.len(), 1);
+        assert_eq!(blocks[0].children.len(), 2);
+        assert_eq!(blocks[0].children[1].children.len(), 1);
+    }
+
+    #[test]
+    fn test_parse_todo() {
+        let content = "- TODO Implement feature #rust";
+        let blocks = BlockParser::parse(content).unwrap();
+
+        assert_eq!(blocks[0].properties.status, Some(TaskStatus::Todo));
+        assert_eq!(blocks[0].content, "Implement feature");
+        assert_eq!(blocks[0].properties.tags, vec!["rust"]);
+    }
+
+    #[test]
+    fn test_roundtrip() {
+        let original = r#"- Block 1 #card
+  - Nested
+- TODO Block 2
+  priority:: high
+"#;
+        let blocks = BlockParser::parse(original).unwrap();
+        let serialized = BlockParser::serialize(&blocks);
+        let reparsed = BlockParser::parse(&serialized).unwrap();
+
+        assert_eq!(blocks.len(), reparsed.len());
+        assert_eq!(blocks[0].properties, reparsed[0].properties);
+    }
+}
+}
+

Summary

+

Recommended Approach: Hybrid (Option C)

+
    +
  • Add Block struct with properties, hierarchy
  • +
  • Extend Node with optional blocks: Option<Vec<Block>>
  • +
  • Implement bidirectional parser (markdown ↔ blocks)
  • +
  • Preserve content as source of truth (backward compat)
  • +
  • Enable block queries in CLI/MCP
  • +
  • Support round-trip Logseq import/export
  • +
+

Benefits:

+
    +
  • ✅ Full Logseq compatibility
  • +
  • ✅ Queryable blocks (find #card, TODO, etc.)
  • +
  • ✅ Backward compatible
  • +
  • ✅ Extensible (custom properties)
  • +
  • ✅ Type-safe structure
  • +
+

Trade-offs:

+
    +
  • ⚠️ Added complexity
  • +
  • ⚠️ Need to sync content ↔ blocks
  • +
  • ⚠️ More storage for SurrealDB backend
  • +
+

Next Steps:

+
    +
  1. Review and approve design
  2. +
  3. Implement Phase 1 (Block models)
  4. +
  5. Implement Phase 2 (BlockParser)
  6. +
  7. Update Logseq import/export
  8. +
  9. Add block queries to MCP/CLI
  10. +
+

ADR-001: Nickel vs TOML for Configuration

+

Status: Accepted

+

Date: 2026-01-17

+

Deciders: Architecture Team

+

Context: Configuration Strategy for Knowledge Base System

+
+

Context

+

The KOGRAL requires a flexible, type-safe configuration format that supports:

+
    +
  1. Complex nested structures (graph settings, storage configs, embedding providers)
  2. +
  3. Type validation (prevent runtime errors from config mistakes)
  4. +
  5. Composition and inheritance (shared configs, environment-specific overrides)
  6. +
  7. Documentation (self-documenting schemas)
  8. +
  9. Validation before runtime (catch errors early)
  10. +
+

We evaluated two primary options:

+

Option 1: TOML (Traditional Config Format)

+

Pros:

+
    +
  • Widely adopted in Rust ecosystem (Cargo.toml)
  • +
  • Simple, human-readable syntax
  • +
  • Native serde support
  • +
  • IDE support (syntax highlighting, completion)
  • +
+

Cons:

+
    +
  • No type system (validation only at runtime)
  • +
  • Limited composition (no imports, no functions)
  • +
  • No schema validation (errors discovered during execution)
  • +
  • Verbose for complex nested structures
  • +
  • No documentation in config files
  • +
+

Example TOML:

+
[graph]
+name = "my-project"
+version = "1.0.0"
+
+[storage]
+primary = "filesystem"  # String, not validated as enum
+
+[storage.secondary]
+enabled = true
+type = "surrealdb"  # Typo would fail at runtime
+url = "ws://localhost:8000"
+
+[embeddings]
+enabled = true
+provider = "openai"  # No validation of valid providers
+model = "text-embedding-3-small"
+
+

Problems:

+
    +
  • Typos in enum values ("surrealdb" vs "surealdb") fail at runtime
  • +
  • No validation that provider = "openai" requires api_key_env
  • +
  • No documentation of valid options
  • +
  • No way to compose configs (e.g., base config + environment override)
  • +
+

Option 2: Nickel (Functional Configuration Language)

+

Pros:

+
    +
  • Type system with contracts (validate before runtime)
  • +
  • Composition via imports and merging
  • +
  • Documentation in schemas (self-documenting)
  • +
  • Validation at export time (catch errors early)
  • +
  • Functions for conditional logic
  • +
  • Default values in schema definitions
  • +
+

Cons:

+
    +
  • Less familiar to Rust developers
  • +
  • Requires separate nickel CLI tool
  • +
  • Smaller ecosystem
  • +
  • Steeper learning curve
  • +
+

Example Nickel:

+
# schemas/kb-config.ncl
+{
+  KbConfig = {
+    graph | GraphConfig,
+    storage | StorageConfig,
+    embeddings | EmbeddingConfig,
+  },
+
+  StorageConfig = {
+    primary | [| 'filesystem, 'memory |],  # Enum validated at export
+
+    secondary | {
+      enabled | Bool,
+      type | [| 'surrealdb, 'sqlite |],  # Typos caught immediately
+      url | String,
+    } | optional,
+  },
+
+  EmbeddingConfig = {
+    enabled | Bool,
+    provider | [| 'openai, 'claude, 'fastembed |],  # Valid providers enforced
+    model | String,
+    api_key_env | String | doc "Environment variable for API key",
+  },
+}
+
+

Benefits:

+
    +
  • Typos in enum values caught at nickel export time
  • +
  • Schema enforces required fields based on provider
  • +
  • Documentation embedded in schema
  • +
  • Config can be composed: import "base.ncl" & { /* overrides */ }
  • +
+
+

Decision

+

We will use Nickel for configuration.

+

Implementation:

+
    +
  1. Define schemas in schemas/*.ncl with type contracts
  2. +
  3. Users write configs in .kogral/config.ncl
  4. +
  5. Export to JSON via CLI: nickel export --format json config.ncl
  6. +
  7. Load JSON in Rust via serde_json into typed structs
  8. +
+

Pattern (double validation):

+
Nickel Config (.ncl)
+    ↓ [nickel export]
+JSON (validated by Nickel contracts)
+    ↓ [serde_json::from_str]
+Rust Struct (validated by serde)
+    ↓
+Runtime (guaranteed valid config)
+
+

Bridge Code (kb-core/src/config/nickel.rs):

+
#![allow(unused)]
+fn main() {
+pub fn load_config<P: AsRef<Path>>(path: P) -> Result<KbConfig> {
+    // Export Nickel to JSON
+    let json = export_nickel_to_json(path)?;
+
+    // Deserialize to Rust struct
+    let config: KbConfig = serde_json::from_str(&json)?;
+
+    Ok(config)
+}
+
+fn export_nickel_to_json<P: AsRef<Path>>(path: P) -> Result<String> {
+    let output = Command::new("nickel")
+        .arg("export")
+        .arg("--format").arg("json")
+        .arg(path.as_ref())
+        .output()?;
+
+    Ok(String::from_utf8(output.stdout)?)
+}
+}
+
+

Consequences

+

Positive

+

Type Safety: Config errors caught before runtime

+
    +
  • Invalid enum values fail at export: 'filesystm → error
  • +
  • Missing required fields detected: no graph.name → error
  • +
  • Type mismatches prevented: enabled = "yes" → error (expects Bool)
  • +
+

Self-Documenting: Schemas serve as documentation

+
    +
  • | doc "Environment variable for API key" describes fields
  • +
  • Enum options visible in schema: [| 'openai, 'claude, 'fastembed |]
  • +
  • Default values explicit: | default = 'filesystem
  • +
+

Composition: Config reuse and overrides

+
# base.ncl
+{ graph = { version = "1.0.0" } }
+
+# project.ncl
+import "base.ncl" & { graph = { name = "my-project" } }
+
+

Validation Before Deployment: Catch errors in CI

+
# CI pipeline
+nickel typecheck config.ncl
+nickel export --format json config.ncl > /dev/null
+
+

Conditional Logic: Environment-specific configs

+
let is_prod = std.string.is_match "prod" (std.env.get "ENV") in
+{
+  embeddings = {
+    provider = if is_prod then 'openai else 'fastembed,
+  },
+}
+
+

Negative

+

Learning Curve: Team must learn Nickel syntax

+
    +
  • Mitigation: Provide comprehensive examples in config/ directory
  • +
  • Mitigation: Document common patterns in docs/config/
  • +
+

Tool Dependency: Requires nickel CLI installed

+
    +
  • Mitigation: Document installation in setup guide
  • +
  • Mitigation: Check nickel availability in kb init command
  • +
+

IDE Support: Limited compared to TOML

+
    +
  • Mitigation: Use LSP (nickel-lang-lsp) for VSCode/Neovim
  • +
  • Mitigation: Syntax highlighting available for major editors
  • +
+

Ecosystem Size: Smaller than TOML

+
    +
  • Mitigation: Nickel actively developed by Tweag
  • +
  • Mitigation: Stable language specification (v1.0+)
  • +
+

Neutral

+

Two-Stage Loading: Nickel → JSON → Rust

+
    +
  • Not a performance concern (config loaded once at startup)
  • +
  • Adds resilience (double validation)
  • +
  • Allows runtime config inspection (read JSON directly)
  • +
+
+

Alternatives Considered

+

JSON Schema

+

Rejected: Not ergonomic for humans to write

+
    +
  • No comments
  • +
  • Verbose syntax ({"key": "value"} vs key = value)
  • +
  • JSON Schema separate from config (duplication)
  • +
+

YAML

+

Rejected: No type system, ambiguous parsing

+
    +
  • Boolean confusion: yes/no/on/off/true/false
  • +
  • Indentation-sensitive (error-prone)
  • +
  • No validation without external tools
  • +
+

Dhall

+

Rejected: More complex than needed

+
    +
  • Turing-incomplete by design (limits use cases)
  • +
  • Smaller ecosystem than Nickel
  • +
  • Steeper learning curve
  • +
+

KCL (KusionStack Configuration Language)

+

Rejected: Kubernetes-focused, less general-purpose

+
    +
  • Designed for K8s manifests
  • +
  • Less mature than Nickel for general config
  • +
+
+

Implementation Timeline

+
    +
  1. ✅ Define base schemas (schemas/kb-config.ncl)
  2. +
  3. ✅ Implement Nickel loader (kb-core/src/config/nickel.rs)
  4. +
  5. ✅ Create example configs (config/defaults.ncl, config/production.ncl)
  6. +
  7. ✅ Document Nickel usage (docs/config/nickel-schemas.md)
  8. +
  9. ⏳ Add LSP recommendations to setup guide
  10. +
  11. ⏳ Create Nickel → TOML migration tool (for existing users)
  12. +
+
+

Monitoring

+

Success Criteria:

+
    +
  • Config errors caught at export time (not runtime)
  • +
  • Users can compose configs for different environments
  • +
  • Team comfortable with Nickel syntax within 2 weeks
  • +
+

Metrics:

+
    +
  • Number of config validation errors caught before runtime
  • +
  • Time to diagnose config issues (should decrease)
  • +
  • User feedback on config complexity
  • +
+
+

References

+ +
+

Revision History

+
+ +
DateAuthorChange
2026-01-17Architecture TeamInitial decision
+
+
+

Next ADR: ADR-002: FastEmbed via AI Providers

+

ADR-002: FastEmbed via AI Providers for Embeddings

+

Status: Accepted

+

Date: 2026-01-17

+

Deciders: Architecture Team

+

Context: Embedding Strategy for Semantic Search

+
+

Context

+

The KOGRAL requires embedding generation for semantic search capabilities. Embeddings convert text into numerical vectors that capture semantic meaning, enabling "find concepts" rather than just "find keywords".

+

Requirements:

+
    +
  1. Local-First Option: Must work offline without external API dependencies
  2. +
  3. Production Scalability: Support cloud AI providers for large-scale deployments
  4. +
  5. Multiple Providers: Flexibility to choose based on cost, quality, privacy
  6. +
  7. Cost-Effective Development: Free local embeddings for development and testing
  8. +
  9. Quality: Good enough embeddings for finding related concepts
  10. +
+

Options Evaluated:

+

Option 1: Only Local Embeddings (fastembed)

+

Pros:

+
    +
  • No API costs
  • +
  • Works offline
  • +
  • Privacy-preserving (no data leaves machine)
  • +
  • Fast (local GPU acceleration possible)
  • +
+

Cons:

+
    +
  • Limited model quality compared to cloud providers
  • +
  • Resource-intensive (requires download ~100MB models)
  • +
  • Single provider lock-in (fastembed library)
  • +
+

Example:

+
#![allow(unused)]
+fn main() {
+use fastembed::{TextEmbedding, InitOptions};
+
+let model = TextEmbedding::try_new(InitOptions {
+    model_name: "BAAI/bge-small-en-v1.5",
+    ..Default::default()
+})?;
+
+let embeddings = model.embed(vec!["Hello world"], None)?;
+// Output: Vec<Vec<f32>> with 384 dimensions
+}
+

Option 2: Only Cloud AI Providers (OpenAI, Claude, etc.)

+

Pros:

+
    +
  • State-of-the-art embedding quality
  • +
  • No local resource usage
  • +
  • Latest models available
  • +
  • Scalable to millions of documents
  • +
+

Cons:

+
    +
  • Requires API keys (cost per embedding)
  • +
  • Network dependency (no offline mode)
  • +
  • Privacy concerns (data sent to third parties)
  • +
  • Vendor lock-in risk
  • +
+

Example:

+
#![allow(unused)]
+fn main() {
+use rig::providers::openai;
+
+let client = openai::Client::new("sk-...");
+let embeddings = client.embeddings("text-embedding-3-small")
+    .embed_documents(vec!["Hello world"]).await?;
+// Output: Vec<Vec<f32>> with 1536 dimensions
+}
+

Option 3: Hybrid Strategy (fastembed + AI providers via rig-core)

+

Pros:

+
    +
  • ✅ Best of both worlds: local dev, cloud production
  • +
  • ✅ User choice: privacy-first or quality-first
  • +
  • ✅ Cost flexibility: free for small projects, paid for scale
  • +
  • ✅ Unified interface via rig-core library
  • +
  • ✅ Easy provider switching (config-driven)
  • +
+

Cons:

+
    +
  • ❌ More complex implementation (multiple providers)
  • +
  • ❌ Dimension mismatch between providers (384 vs 1536)
  • +
  • ❌ Additional dependencies (rig-core, fastembed)
  • +
+
+

Decision

+

We will use a hybrid strategy: fastembed (local) + AI providers (via rig-core).

+

Implementation:

+
    +
  1. Default: fastembed with BAAI/bge-small-en-v1.5 (384 dimensions)
  2. +
  3. Optional: OpenAI, Claude, Ollama via rig-core (configurable)
  4. +
  5. Interface: EmbeddingProvider trait abstracts provider details
  6. +
  7. Config-Driven: Provider selection via Nickel configuration
  8. +
+

Architecture:

+
#![allow(unused)]
+fn main() {
+#[async_trait]
+pub trait EmbeddingProvider: Send + Sync {
+    async fn embed(&self, texts: Vec<String>) -> Result<Vec<Vec<f32>>>;
+    fn dimensions(&self) -> usize;
+    fn model_name(&self) -> &str;
+}
+
+// Local implementation
+pub struct FastEmbedProvider {
+    model: TextEmbedding,
+}
+
+impl FastEmbedProvider {
+    pub fn new(model_name: &str) -> Result<Self> {
+        let model = TextEmbedding::try_new(InitOptions {
+            model_name: model_name.into(),
+            ..Default::default()
+        })?;
+        Ok(Self { model })
+    }
+}
+
+#[async_trait]
+impl EmbeddingProvider for FastEmbedProvider {
+    async fn embed(&self, texts: Vec<String>) -> Result<Vec<Vec<f32>>> {
+        Ok(self.model.embed(texts, None)?)
+    }
+
+    fn dimensions(&self) -> usize { 384 }
+    fn model_name(&self) -> &str { "BAAI/bge-small-en-v1.5" }
+}
+
+// Cloud provider implementation (via rig-core)
+pub struct RigEmbeddingProvider {
+    client: rig::Client,
+    model: String,
+    dimensions: usize,
+}
+
+#[async_trait]
+impl EmbeddingProvider for RigEmbeddingProvider {
+    async fn embed(&self, texts: Vec<String>) -> Result<Vec<Vec<f32>>> {
+        let embeddings = self.client
+            .embeddings(&self.model)
+            .embed_documents(texts)
+            .await?;
+        Ok(embeddings)
+    }
+
+    fn dimensions(&self) -> usize { self.dimensions }
+    fn model_name(&self) -> &str { &self.model }
+}
+}
+

Configuration (Nickel):

+
# Local development (default)
+{
+  embeddings = {
+    enabled = true,
+    provider = 'fastembed,
+    model = "BAAI/bge-small-en-v1.5",
+    dimensions = 384,
+  },
+}
+
+# Production with OpenAI
+{
+  embeddings = {
+    enabled = true,
+    provider = 'openai,
+    model = "text-embedding-3-small",
+    dimensions = 1536,
+    api_key_env = "OPENAI_API_KEY",
+  },
+}
+
+# Self-hosted with Ollama
+{
+  embeddings = {
+    enabled = true,
+    provider = 'ollama,
+    model = "nomic-embed-text",
+    dimensions = 768,
+  },
+}
+
+

Provider Selection (kb-core/src/embeddings/mod.rs):

+
#![allow(unused)]
+fn main() {
+pub fn create_provider(config: &EmbeddingConfig) -> Result<Box<dyn EmbeddingProvider>> {
+    match config.provider {
+        EmbeddingProviderType::FastEmbed => {
+            Ok(Box::new(FastEmbedProvider::new(&config.model)?))
+        }
+        EmbeddingProviderType::OpenAI => {
+            let api_key = std::env::var(&config.api_key_env)?;
+            Ok(Box::new(RigEmbeddingProvider::new_openai(api_key, &config.model)?))
+        }
+        EmbeddingProviderType::Claude => {
+            let api_key = std::env::var(&config.api_key_env)?;
+            Ok(Box::new(RigEmbeddingProvider::new_claude(api_key, &config.model)?))
+        }
+        EmbeddingProviderType::Ollama => {
+            Ok(Box::new(RigEmbeddingProvider::new_ollama(&config.model)?))
+        }
+    }
+}
+}
+
+

Consequences

+

Positive

+

Development Flexibility:

+
    +
  • Developers can use fastembed without API keys
  • +
  • Fast feedback loop (local embeddings, no network calls)
  • +
  • Works offline (train trips, flights)
  • +
+

Production Quality:

+
    +
  • Production deployments can use OpenAI/Claude for better quality
  • +
  • Latest embedding models available
  • +
  • Scalable to millions of documents
  • +
+

Privacy Control:

+
    +
  • Privacy-sensitive projects use local embeddings
  • +
  • Public projects can use cloud providers
  • +
  • User choice via configuration
  • +
+

Cost Optimization:

+
    +
  • Small projects: free (fastembed)
  • +
  • Large projects: pay for quality (cloud providers)
  • +
  • Hybrid: important docs via cloud, bulk via local
  • +
+

Unified Interface:

+
    +
  • EmbeddingProvider trait abstracts provider details
  • +
  • Query code doesn't know/care about provider
  • +
  • Easy to add new providers
  • +
+

Negative

+

Dimension Mismatch:

+
    +
  • fastembed: 384 dimensions
  • +
  • OpenAI: 1536 dimensions
  • +
  • Cannot mix in same index
  • +
+

Mitigation:

+
    +
  • Store provider + dimensions in node metadata
  • +
  • Rebuild index when changing providers
  • +
  • Document dimension constraints
  • +
+

Model Download:

+
    +
  • First use of fastembed downloads ~100MB model
  • +
  • Slow initial startup
  • +
+

Mitigation:

+
    +
  • Pre-download in Docker images
  • +
  • Document model download in setup guide
  • +
  • Cache models in ~/.cache/fastembed
  • +
+

Complex Configuration:

+
    +
  • Multiple provider options may confuse users
  • +
+

Mitigation:

+
    +
  • Sane default (fastembed)
  • +
  • Clear examples for each provider
  • +
  • Validation errors explain misconfigurations
  • +
+

Neutral

+

Dependency Trade-off:

+
    +
  • fastembed adds ~5MB to binary
  • +
  • rig-core adds ~2MB
  • +
  • Total: ~7MB overhead
  • +
+

Not a concern for CLI/MCP server use case.

+
+

Provider Comparison

+
+ + + + +
ProviderDimensionsQualityCostPrivacyOffline
fastembed384GoodFree✅ Local✅ Yes
OpenAI1536Excellent$0.0001/1K❌ Cloud❌ No
Claude1024Excellent$0.00025/1K❌ Cloud❌ No
Ollama768Very GoodFree✅ Local✅ Yes
+
+

Recommendation by Use Case:

+
    +
  • Development: fastembed (fast, free, offline)
  • +
  • Small Teams: fastembed or Ollama (privacy, no costs)
  • +
  • Enterprise: OpenAI or Claude (best quality, scalable)
  • +
  • Self-Hosted: Ollama (good quality, local control)
  • +
+
+

Implementation Timeline

+
    +
  1. ✅ Define EmbeddingProvider trait
  2. +
  3. ✅ Implement FastEmbedProvider (stub, feature-gated)
  4. +
  5. ✅ Implement RigEmbeddingProvider (stub, feature-gated)
  6. +
  7. ⏳ Complete FastEmbed integration with model download
  8. +
  9. ⏳ Complete rig-core integration (OpenAI, Claude, Ollama)
  10. +
  11. ⏳ Add query engine with similarity search
  12. +
  13. ⏳ Document provider selection and trade-offs
  14. +
+
+

Monitoring

+

Success Criteria:

+
    +
  • Users can switch providers via config change
  • +
  • Local embeddings work without API keys
  • +
  • Production deployments use cloud providers successfully
  • +
  • Query quality acceptable for both local and cloud embeddings
  • +
+

Metrics:

+
    +
  • Embedding generation latency (local vs cloud)
  • +
  • Query accuracy (precision@10 for semantic search)
  • +
  • API costs (cloud providers)
  • +
  • User satisfaction (feedback on search quality)
  • +
+
+

References

+ +
+

Revision History

+
+ +
DateAuthorChange
2026-01-17Architecture TeamInitial decision
+
+
+

Previous ADR: ADR-001: Nickel vs TOML +Next ADR: ADR-003: Hybrid Storage Strategy

+

ADR-003: Hybrid Storage Strategy

+

Status: Accepted

+

Date: 2026-01-17

+

Deciders: Architecture Team

+

Context: Storage Backend Strategy for Knowledge Base

+
+

Context

+

The KOGRAL needs to store knowledge graphs with these requirements:

+
    +
  1. Git-Friendly: Knowledge should version alongside code
  2. +
  3. Scalable: Support small projects (10s of nodes) to large organizations (10,000+ nodes)
  4. +
  5. Queryable: Efficient graph queries and relationship traversal
  6. +
  7. Offline-Capable: Work without network access
  8. +
  9. Collaborative: Support shared organizational knowledge
  10. +
  11. Cost-Effective: Free for small projects, reasonable cost at scale
  12. +
+

Constraints:

+
    +
  • Developers want to edit knowledge in text editors
  • +
  • Organizations want centralized guideline management
  • +
  • Git workflows essential for code-adjacent knowledge
  • +
  • Large graphs need database performance
  • +
+

Option 1: Filesystem Only

+

Approach: Store everything as markdown files

+

Pros:

+
    +
  • ✅ Git-native (perfect for versioning)
  • +
  • ✅ Text editor friendly
  • +
  • ✅ No dependencies
  • +
  • ✅ Works offline
  • +
  • ✅ Free
  • +
+

Cons:

+
    +
  • ❌ Poor performance for large graphs (100 0+ nodes)
  • +
  • ❌ No efficient graph queries
  • +
  • ❌ Difficult to share across projects
  • +
  • ❌ Manual sync for collaboration
  • +
+

Scalability: Good for < 100 nodes, poor beyond

+

Option 2: Database Only (SurrealDB)

+

Approach: Store all knowledge in SurrealDB graph database

+

Pros:

+
    +
  • ✅ Excellent query performance
  • +
  • ✅ Native graph relationships
  • +
  • ✅ Scalable to millions of nodes
  • +
  • ✅ Centralized for collaboration
  • +
+

Cons:

+
    +
  • ❌ Not git-trackable
  • +
  • ❌ Requires running database server
  • +
  • ❌ Can't edit with text editor
  • +
  • ❌ Network dependency
  • +
  • ❌ Infrastructure cost
  • +
+

Scalability: Excellent, but loses developer workflow benefits

+

Option 3: Hybrid (Filesystem + SurrealDB)

+

Approach: Filesystem for local project knowledge, SurrealDB for shared organizational knowledge

+

Pros:

+
    +
  • ✅ Git-friendly for project knowledge
  • +
  • ✅ Text editor friendly
  • +
  • ✅ Scalable for shared knowledge
  • +
  • ✅ Works offline (local graph)
  • +
  • ✅ Collaborative (shared graph)
  • +
  • ✅ Cost-effective (DB only for shared)
  • +
+

Cons:

+
    +
  • ❌ More complex implementation
  • +
  • ❌ Sync mechanism needed
  • +
  • ❌ Two storage systems to manage
  • +
+

Scalability: Excellent - best of both worlds

+
+

Decision

+

We will use a hybrid storage strategy: Filesystem (local) + SurrealDB (shared).

+

Architecture:

+
┌─────────────────────────────────────────────────────────────┐
+│                    Project A (.kogral/)                          │
+│  Storage: Filesystem (git-tracked)                          │
+│  Scope: Project-specific notes, decisions, patterns         │
+│  Access: Local only                                         │
+└──────────────────┬──────────────────────────────────────────┘
+                   │
+                   │ [inherits]
+                   ↓
+┌─────────────────────────────────────────────────────────────┐
+│           Shared KB (SurrealDB or synced filesystem)         │
+│  Storage: SurrealDB (scalable) or filesystem (synced)       │
+│  Scope: Organization-wide guidelines, patterns              │
+│  Access: All projects                                       │
+└─────────────────────────────────────────────────────────────┘
+
+

Implementation:

+
# Project config
+{
+  storage = {
+    primary = 'filesystem,  # Local project knowledge
+    secondary = {
+      enabled = true,
+      type = 'surrealdb,   # Shared knowledge
+      url = "ws://kb-central.company.com:8000",
+      namespace = "organization",
+      database = "shared-kb",
+    },
+  },
+
+  inheritance = {
+    base = "surrealdb://organization/shared-kb",  # Inherit from shared
+    priority = 100,  # Project overrides shared
+  },
+}
+
+

Sync Strategy:

+
.kogral/ (Filesystem)
+    ↓ [on save]
+Watch for changes
+    ↓ [debounced]
+Sync to SurrealDB
+    ↓
+Shared graph updated
+    ↓ [on query]
+Merge local + shared results
+
+
+

Consequences

+

Positive

+

Developer Workflow Preserved:

+
# Local knowledge workflow (unchanged)
+vim .kogral/notes/my-note.md
+git add .kogral/notes/my-note.md
+git commit -m "Add implementation note"
+git push
+
+

Git Integration:

+
    +
  • Project knowledge versioned with code
  • +
  • Branches include relevant knowledge
  • +
  • Merges resolve knowledge conflicts
  • +
  • PR reviews include knowledge changes
  • +
+

Offline Development:

+
    +
  • Full functionality without network
  • +
  • Shared guidelines cached locally
  • +
  • Sync when reconnected
  • +
+

Scalability:

+
    +
  • Projects: filesystem (100s of nodes, fine performance)
  • +
  • Organization: SurrealDB (10,000+ nodes, excellent performance)
  • +
+

Collaboration:

+
    +
  • Shared guidelines accessible to all projects
  • +
  • Updates to shared knowledge propagate automatically
  • +
  • Consistent practices across organization
  • +
+

Cost-Effective:

+
    +
  • Small projects: free (filesystem only)
  • +
  • Organizations: SurrealDB for shared only (not all project knowledge)
  • +
+

Gradual Adoption:

+
    +
  • Start with filesystem only
  • +
  • Add SurrealDB when needed
  • +
  • Feature-gated (--features surrealdb)
  • +
+

Negative

+

Complexity:

+
    +
  • Two storage implementations
  • +
  • Sync mechanism required
  • +
  • Conflict resolution needed
  • +
+

Mitigation:

+
    +
  • Storage trait abstracts differences
  • +
  • Sync is optional (can disable)
  • +
  • Conflicts rare (guidelines change infrequently)
  • +
+

Sync Latency:

+
    +
  • Changes to shared KB not instant in all projects
  • +
+

Mitigation:

+
    +
  • Acceptable latency (guidelines don't change rapidly)
  • +
  • Manual sync command available (kb sync)
  • +
  • Auto-sync on query (fetch latest)
  • +
+

Infrastructure Requirement:

+
    +
  • SurrealDB server needed for shared KB
  • +
+

Mitigation:

+
    +
  • Optional (can use synced filesystem instead)
  • +
  • Docker Compose for easy setup
  • +
  • Managed SurrealDB Cloud option
  • +
+

Neutral

+

Storage Trait Implementation:

+
#![allow(unused)]
+fn main() {
+#[async_trait]
+pub trait Storage {
+    async fn save_graph(&self, graph: &Graph) -> Result<()>;
+    async fn load_graph(&self, name: &str) -> Result<Graph>;
+    async fn list_graphs(&self) -> Result<Vec<String>>;
+}
+
+// Three implementations
+impl Storage for FilesystemStorage { /* ... */ }
+impl Storage for SurrealDbStorage { /* ... */ }
+impl Storage for MemoryStorage { /* ... */ }
+}
+

Abstraction makes multi-backend manageable.

+
+

Use Cases

+

Small Project (Solo Developer)

+

Config:

+
{ storage = { primary = 'filesystem } }
+
+

Behavior:

+
    +
  • All knowledge in .kogral/ directory
  • +
  • Git-tracked with code
  • +
  • No database required
  • +
  • Works offline
  • +
+

Medium Project (Team)

+

Config:

+
{
+  storage = {
+    primary = 'filesystem,
+    secondary = {
+      enabled = true,
+      type = 'surrealdb,
+      url = "ws://team-kb.local:8000",
+    },
+  },
+}
+
+

Behavior:

+
    +
  • Project knowledge in .kogral/ (git-tracked)
  • +
  • Shared team patterns in SurrealDB
  • +
  • Automatic sync
  • +
  • Offline fallback to cached
  • +
+

Large Organization

+

Config:

+
{
+  storage = {
+    primary = 'filesystem,
+    secondary = {
+      enabled = true,
+      type = 'surrealdb,
+      url = "ws://kb.company.com:8000",
+      namespace = "engineering",
+      database = "shared-kb",
+    },
+  },
+
+  inheritance = {
+    base = "surrealdb://engineering/shared-kb",
+    guidelines = [
+      "surrealdb://engineering/rust-guidelines",
+      "surrealdb://engineering/security-policies",
+    ],
+  },
+}
+
+

Behavior:

+
    +
  • Project-specific in .kogral/
  • +
  • Organization guidelines in SurrealDB
  • +
  • Security policies enforced
  • +
  • Automatic guideline updates
  • +
+
+

Sync Mechanism

+

Filesystem → SurrealDB

+

Trigger: File changes detected (via notify crate)

+

Process:

+
    +
  1. Parse changed markdown file
  2. +
  3. Convert to Node struct
  4. +
  5. Upsert to SurrealDB
  6. +
  7. Update relationships
  8. +
+

Debouncing: 500ms (configurable)

+

SurrealDB → Filesystem

+

Trigger: Query for shared knowledge

+

Process:

+
    +
  1. Query SurrealDB for shared nodes
  2. +
  3. Cache locally (in-memory or filesystem)
  4. +
  5. Merge with local results
  6. +
  7. Return combined
  8. +
+

Caching: TTL-based (5 minutes default)

+

Conflict Resolution

+

Strategy: Last-write-wins with version tracking

+

Example:

+
Project A: Updates shared guideline (v1 → v2)
+Project B: Has cached v1
+
+On Project B query:
+  - Detects v2 available
+  - Fetches v2
+  - Updates cache
+  - Uses v2 going forward
+
+
+

Alternatives Considered

+

Git Submodules for Shared Knowledge

+

Rejected: Cumbersome workflow

+
    +
  • Requires manual submodule update
  • +
  • Merge conflicts in shared submodule
  • +
  • Not discoverable (need to know submodule exists)
  • +
+

Syncthing for Filesystem Sync

+

Rejected: Not designed for this use case

+
    +
  • No query optimization
  • +
  • No relationship indexes
  • +
  • Sync conflicts difficult to resolve
  • +
+

PostgreSQL with JSON

+

Rejected: Not a graph database

+
    +
  • Poor graph query performance
  • +
  • Relationship traversal requires complex SQL joins
  • +
  • No native graph features
  • +
+
+

Migration Path

+

Phase 1: Filesystem Only (Current)

+
    +
  • All storage via filesystem
  • +
  • Git-tracked
  • +
  • No database required
  • +
+

Phase 2: Optional SurrealDB

+
    +
  • Add SurrealDB support (feature-gated)
  • +
  • Manual sync command
  • +
  • Shared KB opt-in
  • +
+

Phase 3: Automatic Sync

+
    +
  • File watching
  • +
  • Auto-sync on changes
  • +
  • Background sync
  • +
+

Phase 4: Multi-Tenant SurrealDB

+
    +
  • Organization namespaces
  • +
  • Access control
  • +
  • Audit logs
  • +
+
+

Monitoring

+

Success Criteria:

+
    +
  • Developers don't notice hybrid complexity
  • +
  • Sync completes < 1 second for typical changes
  • +
  • Shared guidelines accessible in < 100ms
  • +
  • Zero data loss in sync
  • +
+

Metrics:

+
    +
  • Sync latency (P50, P95, P99)
  • +
  • Cache hit rate (shared knowledge)
  • +
  • Conflict rate (expect < 0.1%)
  • +
  • User satisfaction
  • +
+
+

References

+ +
+

Revision History

+
+ +
DateAuthorChange
2026-01-17Architecture TeamInitial decision
+
+
+

Previous ADR: ADR-002: FastEmbed via AI Providers +Next ADR: ADR-004: Logseq Compatibility

+

ADR-004: Logseq Blocks Support

+

Status

+

Proposed (Design phase)

+

Context

+

Logseq uses content blocks as the fundamental unit of information, not full documents. KB currently treats Node.content as flat markdown string, which loses block-level features on import/export:

+

Lost features:

+
    +
  • Block properties (#card, TODO, custom properties)
  • +
  • Block hierarchy (outliner nesting)
  • +
  • Block references (((block-uuid)))
  • +
  • Block-level queries (find all flashcards, TODOs)
  • +
+

User requirement: Round-trip Logseq import/export with full fidelity:

+
Logseq → KOGRAL Import → KOGRAL Storage → KOGRAL Export → Logseq
+  (blocks preserved at every step)
+
+

Decision

+

Implement Hybrid Block Support (structured + markdown):

+

1. Add Block Data Structure

+
#![allow(unused)]
+fn main() {
+pub struct Block {
+    pub id: String,                   // UUID
+    pub content: String,              // Block text
+    pub properties: BlockProperties,  // Tags, status, custom
+    pub children: Vec<Block>,         // Nested blocks
+    // ... timestamps ...
+}
+
+pub struct BlockProperties {
+    pub tags: Vec<String>,            // #card, #important
+    pub status: Option<TaskStatus>,   // TODO, DONE, etc.
+    pub custom: HashMap<String, String>, // property:: value
+    pub block_refs: Vec<String>,      // ((uuid))
+    pub page_refs: Vec<String>,       // [[page]]
+}
+}
+

2. Extend Node Model

+
#![allow(unused)]
+fn main() {
+pub struct Node {
+    // ... existing fields ...
+    pub content: String,              // Source of truth (markdown)
+    pub blocks: Option<Vec<Block>>,   // Cached structure (optional)
+}
+}
+

3. Bidirectional Parser

+
    +
  • Parse: Markdown → Vec<Block> (lazy, on-demand)
  • +
  • Serialize: Vec<Block> → Markdown (for export)
  • +
+

4. Storage Strategy

+

Filesystem (git-friendly, Logseq-compatible):

+
- Block 1 #card
+  - Nested answer
+- TODO Block 2
+  priority:: high
+
+

SurrealDB (queryable):

+
DEFINE TABLE block;
+DEFINE FIELD node_id ON block TYPE record(node);
+DEFINE FIELD block_id ON block TYPE string;
+DEFINE FIELD properties ON block TYPE object;
+DEFINE INDEX block_tags ON block COLUMNS properties.tags;
+
+

5. Query Extensions

+
#![allow(unused)]
+fn main() {
+// Find all flashcards
+graph.find_blocks_by_tag("card")
+
+// Find all TODOs
+graph.find_all_todos()
+
+// Find blocks with custom property
+node.find_blocks_by_property("priority", "high")
+}
+

Consequences

+

Positive

+

Full Logseq Compatibility - Import/export preserves all block features +✅ Queryable Blocks - Find #card, TODO, custom properties across KOGRAL +✅ Backward Compatible - Existing nodes without blocks still work +✅ Type-Safe - Structured data instead of regex parsing everywhere +✅ Extensible - Custom block properties supported +✅ Hierarchy Preserved - Nested blocks maintain parent-child relationships

+

Negative

+

⚠️ Added Complexity - New data structures, parser, sync logic +⚠️ Dual Representation - Must keep content and blocks in sync +⚠️ Storage Overhead - SurrealDB stores both markdown and structure +⚠️ Migration Required - Existing data needs parsing to populate blocks

+

Neutral

+

⚙️ Lazy Parsing - Blocks parsed on-demand (not stored by default) +⚙️ Opt-In - Config flag blocks.enabled to activate features +⚙️ Gradual Adoption - Can implement in phases

+

Implementation Phases

+

Phase 1: Foundation (No behavior change)

+
    +
  • Add Block struct to models/block.rs
  • +
  • Add optional blocks field to Node
  • +
  • Add config: blocks.enabled = false (default off)
  • +
+

Phase 2: Parser

+
    +
  • Implement BlockParser::parse() (markdown → blocks)
  • +
  • Implement BlockParser::serialize() (blocks → markdown)
  • +
  • Add Node::get_blocks() method (lazy parsing)
  • +
+

Phase 3: Logseq Integration

+
    +
  • Update LogseqImporter to parse blocks
  • +
  • Update LogseqExporter to serialize blocks
  • +
  • Test round-trip (Logseq → KB → Logseq)
  • +
+

Phase 4: Query API

+
    +
  • Add Graph::find_blocks_by_tag()
  • +
  • Add Graph::find_all_todos()
  • +
  • Add Node::find_blocks_by_property()
  • +
+

Phase 5: MCP/CLI Integration

+
    +
  • Add kb/find_blocks MCP tool
  • +
  • Add kb find-cards CLI command
  • +
  • Add kb find-todos CLI command
  • +
+

Phase 6: SurrealDB Backend

+
    +
  • Create block table schema
  • +
  • Index on tags, status, properties
  • +
  • Store blocks alongside nodes
  • +
+

Alternatives Considered

+

Alternative 1: Blocks as First-Class Nodes

+

Convert each Logseq block to a separate KOGRAL Node.

+

Rejected: Too granular, explosion of nodes, loses document context.

+

Alternative 2: Parser-Only (No Storage)

+

Keep content: String, parse blocks on every access.

+

Rejected: Can't query blocks in database, parse overhead, can't index.

+

Alternative 3: Metadata Field

+

Store blocks in metadata: HashMap<String, Value>.

+

Rejected: Not type-safe, harder to query, no schema validation.

+

References

+ +

Notes

+

Backward Compatibility Strategy:

+
    +
  • content remains source of truth
  • +
  • blocks is optional enhancement
  • +
  • Old code works unchanged
  • +
  • New features opt-in via config
  • +
+

Migration Path:

+
    +
  • Existing users: blocks disabled by default
  • +
  • New users: blocks enabled, parsed on import
  • +
  • Manual: kb reindex --parse-blocks to populate
  • +
+
+

Decision Date: 2026-01-17 +Approvers: TBD +Review Date: After Phase 2 implementation

+

ADR-005: MCP Protocol for AI Integration

+

Prerequisites

+

Installation Methods

+

Project Initialization

+

Environment Configuration

+

Verification

+

Configuration Overview

+

Nickel Schemas

+

Graph Settings

+

Inheritance

+

Examples

+

Storage Backends

+

Filesystem Storage

+

SurrealDB Storage

+

In-Memory Storage

+

Sync Strategies

+

Embeddings Overview

+

Provider Configuration

+

FastEmbed Local

+

OpenAI Integration

+

Claude Integration

+

Ollama Integration

+

Semantic Search

+

Template System

+

Document Templates

+

Export Templates

+

Customization

+

CLI Overview

+

Commands Reference

+

Workflows

+

NuShell Scripts

+

MCP Quick Guide

+

Fast-track guide to integrating KOGRAL with Claude Code via the Model Context Protocol (MCP).

+

What is MCP?

+

MCP (Model Context Protocol) is a protocol that allows Claude Code to interact with external tools and data sources. The kogral-mcp server exposes your KOGRAL knowledge base to Claude Code for AI-assisted knowledge management.

+

Quick Setup (5 Minutes)

+

Step 1: Build MCP Server

+
# Build kogral-mcp server
+cargo build --package kb-mcp --release
+
+# Verify binary
+ls -lh target/release/kb-mcp
+
+

Step 2: Configure Claude Code

+

Add to ~/.config/claude/config.json:

+
{
+  "mcpServers": {
+    "kogral-mcp": {
+      "command": "/path/to/knowledge-base/target/release/kb-mcp",
+      "args": ["serve"],
+      "env": {
+        "KOGRAL_DIR": "/path/to/your/project/.kogral"
+      }
+    }
+  }
+}
+
+

Replace /path/to/knowledge-base and /path/to/your/project/.kogral with your actual paths.

+

Step 3: Initialize KOGRAL

+
# Navigate to your project
+cd /path/to/your/project
+
+# Initialize .kb directory
+kb init
+
+

Step 4: Start Claude Code

+
# Start Claude Code (will auto-connect to kb-mcp)
+claude-code
+
+

Step 5: Test Connection

+

In Claude Code, try:

+
Search for "error handling"
+
+

Claude will use the kogral/search tool to query your knowledge base.

+
+

Essential Commands

+

Search Knowledge Base

+

Natural language:

+
Find notes about Rust error handling
+
+

Claude translates to:

+
{
+  "tool": "kogral/search",
+  "params": {
+    "query": "error handling",
+    "type": "note",
+    "semantic": true
+  }
+}
+
+

Add Note

+

Natural language:

+
Add a note about async Rust patterns with tags rust, async, patterns
+
+

Claude translates to:

+
{
+  "tool": "kogral/add_note",
+  "params": {
+    "title": "Async Rust Patterns",
+    "content": "...",
+    "tags": ["rust", "async", "patterns"]
+  }
+}
+
+

Add Decision

+

Natural language:

+
Document decision to use SurrealDB for storage
+
+

Claude translates to:

+
{
+  "tool": "kogral/add_decision",
+  "params": {
+    "title": "Use SurrealDB for Storage",
+    "context": "Need scalable graph database",
+    "decision": "Adopt SurrealDB as primary storage backend",
+    "consequences": ["Better query performance", "Additional infrastructure"]
+  }
+}
+
+

Get Guidelines

+

Natural language:

+
What are our Rust error handling guidelines?
+
+

Claude translates to:

+
{
+  "tool": "kogral/get_guidelines",
+  "params": {
+    "language": "rust",
+    "category": "error-handling"
+  }
+}
+
+ +

Natural language:

+
Link note-async-patterns to decision-use-tokio as implements
+
+

Claude translates to:

+
{
+  "tool": "kogral/link",
+  "params": {
+    "from": "note-async-patterns",
+    "to": "decision-use-tokio",
+    "relation": "implements"
+  }
+}
+
+
+

Common Workflows

+

Capture Meeting Notes

+

You:

+
We just decided in our meeting to migrate from REST to GraphQL.
+Context: current REST API is too chatty, requires multiple round trips.
+Consequences: better client performance, but team needs to learn GraphQL.
+Create a decision record.
+
+

Claude (uses kb/add_decision):

+
Created decision: decision-migrate-to-graphql
+
+Status: proposed
+Context: Current REST API requires multiple round trips (chatty)
+Decision: Migrate from REST to GraphQL API
+Consequences:
+  - ✅ Better client performance
+  - ❌ Team learning curve for GraphQL
+
+ +

You:

+
I'm working on error handling. What related notes and patterns do we have?
+
+

Claude (uses kogral/search with semantic=true):

+
Found 5 related items:
+
+1. **Error Handling with thiserror** (pattern)
+   Tags: rust, error-handling
+   Created: 2026-01-15
+
+2. **Result Type Best Practices** (guideline)
+   Tags: rust, error-handling, best-practices
+   Created: 2026-01-10
+
+3. **Decision: Use anyhow for Application Errors** (decision)
+   Status: accepted
+   Created: 2026-01-08
+
+4. **Custom Error Types** (note)
+   Tags: rust, error-handling
+   Created: 2026-01-05
+
+5. **Error Propagation Patterns** (pattern)
+   Tags: rust, error-handling
+   Created: 2026-01-03
+
+Would you like me to link your current work to any of these?
+
+

Document Implementation

+

You:

+
I just implemented the user authentication module following our security guidelines.
+Add a note and link it to our security guideline.
+
+

Claude (uses kb/add_note + kb/link):

+
Created note: note-user-auth-implementation
+Tags: security, authentication, implementation
+
+Linked:
+  note-user-auth-implementation --[implements]--> guideline-security-practices
+
+Done! Your implementation is now documented and connected to our guidelines.
+
+

Review Project Knowledge

+

You:

+
Summarize our project knowledge: what decisions have we made, what patterns are we using?
+
+

Claude (uses kb/summarize_project prompt):

+
# Project Knowledge Summary
+
+**Total Nodes**: 42
+
+## Recent Decisions (5)
+- Use SurrealDB for Storage (accepted, 2 days ago)
+- Adopt MCP for AI Integration (accepted, 5 days ago)
+- Nickel for Configuration (accepted, 1 week ago)
+
+## Active Patterns (8)
+- Error Handling with thiserror
+- Repository Pattern for DB
+- Builder Pattern for Complex Objects
+- ...
+
+## Top Tags
+1. rust (23 nodes)
+2. architecture (12 nodes)
+3. error-handling (8 nodes)
+4. patterns (7 nodes)
+
+## Guideline Coverage
+- Rust: 5 guidelines
+- Testing: 3 guidelines
+- Security: 2 guidelines
+
+
+

Advanced Usage

+

Conditional Queries

+

You:

+
Find all decisions made in the last week that are still proposed (not accepted)
+
+

Claude (combines kogral/search with filtering):

+
Found 2 proposed decisions from last week:
+
+1. **Migrate to GraphQL** (proposed)
+   Created: 3 days ago
+   Context: REST API is too chatty...
+
+2. **Add Redis Caching** (proposed)
+   Created: 5 days ago
+   Context: Database queries are slow...
+
+Would you like to review these and update their status?
+
+

Cross-Reference Check

+

You:

+
Before I implement X, check if we have any decisions or guidelines about it
+
+

Claude (uses kogral/search + kogral/get_guidelines):

+
Checking existing knowledge about X...
+
+**Decisions**: None found
+**Guidelines**: 1 relevant guideline found
+  - guideline-module-structure: "Keep modules focused and small"
+
+**Related Notes**: 2 notes mention similar topics
+  - note-module-design-patterns
+  - note-separation-of-concerns
+
+Recommendation: Your implementation of X looks aligned with our guidelines.
+Consider linking it to guideline-module-structure when done.
+
+

Export for Sharing

+

You:

+
Export our architectural decisions to Logseq so I can review them visually
+
+

Claude (uses kb/export):

+
Exporting to Logseq format...
+
+✓ Exported 12 decisions to /Users/akasha/logseq-export/
+  - 12 decision records
+  - Preserved wikilinks
+  - Added Logseq properties
+
+You can now open /Users/akasha/logseq-export/ in Logseq to visualize the decision graph.
+
+
+

Tips and Tricks

+

1. Use Natural Language

+

Don't worry about exact tool syntax. Claude understands:

+

Don't say: "Use kb/search with query='rust' and type='pattern'" +✅ Do say: "Find Rust patterns in KOGRAL"

+

2. Be Specific with Tags

+

When adding notes, use consistent tags:

+

Good: tags: rust, error-handling, pattern +❌ Bad: tags: Rust, ErrorHandling, patterns

+ +

After creating notes, ask Claude to link them:

+
Link this note to our error handling guideline as 'implements'
+
+

4. Review Regularly

+

Ask Claude for summaries:

+
What have we documented this week?
+
+ +

For conceptual queries:

+
Find anything related to "making code maintainable"
+
+

Not just keyword "maintainable", but concepts like refactoring, clean code, patterns, etc.

+
+

Troubleshooting

+

"MCP server not responding"

+
# Check kb-mcp is built
+ls target/release/kb-mcp
+
+# Test manually
+echo '{"jsonrpc":"2.0","id":1,"method":"kogral/search","params":{"query":"test"}}' \
+  | target/release/kb-mcp serve
+
+

"KB directory not found"

+
# Verify .kb exists
+ls -la /path/to/project/.kogral
+
+# Initialize if missing
+cd /path/to/project
+kb init
+
+

"Permission denied"

+
# Make binary executable
+chmod +x target/release/kb-mcp
+
+# Check environment variable
+echo $KOGRAL_DIR
+
+

"Empty search results"

+
# Add some test content
+kb add note "Test Note" --content "Test content"
+
+# Try search again in Claude Code
+
+
+

Next Steps

+ +
+

Quick Reference Card

+
+ + + + + + + +
TaskSay to Claude
Search"Find notes about X"
Add note"Add a note about X with tags Y, Z"
Add decision"Document decision to use X for Y"
Get guidelines"What are our X guidelines?"
Link nodes"Link A to B as implements"
Summarize"Summarize project knowledge"
Export"Export to Logseq format"
+
+
+

Remember: Claude Code with MCP turns KOGRAL into an active participant in your development workflow. Ask questions, capture decisions, and let AI help you maintain your project's knowledge graph.

+

Claude Code Integration

+

Logseq Integration

+

Obsidian Compatibility

+

Git Workflows

+

MCP Protocol

+

MCP Tools API Reference

+

Complete reference for the Model Context Protocol (MCP) server tools and resources.

+

Overview

+

The kogral-mcp server implements the MCP protocol (JSON-RPC 2.0) for Claude Code integration. It provides:

+
    +
  • 10 Tools: Operations for querying and modifying knowledge base (7 core + 3 block tools)
  • +
  • 6 Resources: Access to knowledge graph content via URIs
  • +
  • 2 Prompts: Guided workflows for common tasks
  • +
+

Server Configuration

+

Start MCP Server

+
# Stdio transport (local use)
+kb serve
+
+# Or run directly
+kb-mcp serve
+
+

Claude Code Configuration

+

Add to ~/.config/claude/config.json:

+
{
+  "mcpServers": {
+    "kogral-mcp": {
+      "command": "/path/to/kb-mcp",
+      "args": ["serve"],
+      "env": {
+        "KOGRAL_DIR": "/path/to/project/.kogral"
+      }
+    }
+  }
+}
+
+

Tools

+

kb/search

+

Search the knowledge base using text and/or semantic similarity.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "query": {
+      "type": "string",
+      "description": "Search query"
+    },
+    "type": {
+      "type": "string",
+      "enum": ["note", "decision", "guideline", "pattern", "journal", "execution", "all"],
+      "description": "Filter by node type",
+      "default": "all"
+    },
+    "project": {
+      "type": "string",
+      "description": "Limit search to specific project graph"
+    },
+    "semantic": {
+      "type": "boolean",
+      "description": "Enable semantic similarity search",
+      "default": true
+    },
+    "threshold": {
+      "type": "number",
+      "description": "Minimum similarity threshold (0-1)",
+      "default": 0.4
+    },
+    "limit": {
+      "type": "integer",
+      "description": "Maximum number of results",
+      "default": 10
+    }
+  },
+  "required": ["query"]
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 1,
+  "method": "kogral/search",
+  "params": {
+    "query": "error handling patterns in Rust",
+    "type": "pattern",
+    "semantic": true,
+    "threshold": 0.6,
+    "limit": 5
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 1,
+  "result": {
+    "type": "text",
+    "text": "Found 3 result(s):\n\n1. Error Handling with thiserror (pattern, score: 0.85)\n   Tags: rust, error-handling\n   Created: 2026-01-15\n   \n2. Result Type Best Practices (guideline, score: 0.72)\n   Tags: rust, error-handling, best-practices\n   Created: 2026-01-10\n\n3. Custom Error Types (note, score: 0.65)\n   Tags: rust, error-handling\n   Created: 2026-01-08"
+  }
+}
+
+

kb/add_note

+

Add a new note to the knowledge base.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "title": {
+      "type": "string",
+      "description": "Note title"
+    },
+    "content": {
+      "type": "string",
+      "description": "Note content (markdown)"
+    },
+    "tags": {
+      "type": "array",
+      "items": { "type": "string" },
+      "description": "Tags for categorization",
+      "default": []
+    },
+    "relates_to": {
+      "type": "array",
+      "items": { "type": "string" },
+      "description": "Related node IDs",
+      "default": []
+    },
+    "project": {
+      "type": "string",
+      "description": "Project graph name",
+      "default": "default"
+    }
+  },
+  "required": ["title", "content"]
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 2,
+  "method": "kogral/add_note",
+  "params": {
+    "title": "Async Trait Patterns",
+    "content": "Common patterns for using async traits in Rust:\n\n1. Use `async-trait` crate\n2. Box return types for flexibility\n3. Consider Send + Sync bounds",
+    "tags": ["rust", "async", "patterns"],
+    "relates_to": ["pattern-error-handling"]
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 2,
+  "result": {
+    "type": "text",
+    "text": "Note added successfully: note-async-trait-patterns (ID: note-abc123)"
+  }
+}
+
+

kb/add_decision

+

Create an Architectural Decision Record (ADR).

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "title": {
+      "type": "string",
+      "description": "Decision title"
+    },
+    "context": {
+      "type": "string",
+      "description": "Decision context and background"
+    },
+    "decision": {
+      "type": "string",
+      "description": "The decision made"
+    },
+    "consequences": {
+      "type": "array",
+      "items": { "type": "string" },
+      "description": "List of consequences",
+      "default": []
+    },
+    "status": {
+      "type": "string",
+      "enum": ["proposed", "accepted", "rejected", "deprecated", "superseded"],
+      "default": "proposed"
+    },
+    "tags": {
+      "type": "array",
+      "items": { "type": "string" },
+      "default": []
+    }
+  },
+  "required": ["title", "context", "decision"]
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 3,
+  "method": "kogral/add_decision",
+  "params": {
+    "title": "Use SurrealDB for Knowledge Graph Storage",
+    "context": "Need a scalable storage solution that supports graph queries and can handle growing knowledge base",
+    "decision": "Adopt SurrealDB as the primary storage backend for production deployments",
+    "consequences": [
+      "Better query performance for graph traversal",
+      "Native support for relationships",
+      "Additional infrastructure dependency",
+      "Team needs to learn SurrealDB query language"
+    ],
+    "status": "accepted",
+    "tags": ["architecture", "storage", "surrealdb"]
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 3,
+  "result": {
+    "type": "text",
+    "text": "Decision added: decision-use-surrealdb (ID: decision-xyz789)\nStatus: accepted"
+  }
+}
+
+ +

Create a relationship between two nodes.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "from": {
+      "type": "string",
+      "description": "Source node ID"
+    },
+    "to": {
+      "type": "string",
+      "description": "Target node ID"
+    },
+    "relation": {
+      "type": "string",
+      "enum": ["relates_to", "depends_on", "implements", "extends", "supersedes", "explains"],
+      "description": "Relationship type"
+    },
+    "strength": {
+      "type": "number",
+      "description": "Relationship strength (0-1)",
+      "minimum": 0,
+      "maximum": 1,
+      "default": 1.0
+    }
+  },
+  "required": ["from", "to", "relation"]
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 4,
+  "method": "kogral/link",
+  "params": {
+    "from": "note-async-trait-patterns",
+    "to": "pattern-error-handling",
+    "relation": "relates_to",
+    "strength": 0.8
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 4,
+  "result": {
+    "type": "text",
+    "text": "Link created: note-async-trait-patterns --[relates_to]--> pattern-error-handling (strength: 0.8)"
+  }
+}
+
+

Relationship Types:

+
    +
  • relates_to: General conceptual relationship
  • +
  • depends_on: Dependency (from depends on to)
  • +
  • implements: Implementation of concept/pattern
  • +
  • extends: Inherits or extends another node
  • +
  • supersedes: Replaces an older version
  • +
  • explains: Provides documentation/clarification
  • +
+

kb/get_guidelines

+

Retrieve guidelines for current project with inheritance resolution.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "language": {
+      "type": "string",
+      "description": "Programming language (e.g., rust, nushell)"
+    },
+    "category": {
+      "type": "string",
+      "description": "Guideline category (e.g., error-handling, testing)"
+    },
+    "include_base": {
+      "type": "boolean",
+      "description": "Include shared/base guidelines",
+      "default": true
+    }
+  }
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 5,
+  "method": "kogral/get_guidelines",
+  "params": {
+    "language": "rust",
+    "category": "error-handling",
+    "include_base": true
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 5,
+  "result": {
+    "type": "text",
+    "text": "Guidelines for rust/error-handling:\n\n## Project Guidelines (priority: 150)\n\n1. Custom Error Types (guideline-custom-errors)\n   - Use thiserror for error definitions\n   - Implement From traits for conversions\n   - Source: .kogral/guidelines/rust-errors.md\n\n## Shared Guidelines (priority: 50)\n\n1. Result Type Best Practices (guideline-result-best-practices)\n   - Always use Result<T> for fallible operations\n   - Never use unwrap() in production\n   - Source: ~/Tools/.kogral-shared/guidelines/rust-errors.md\n\n2. Error Propagation (guideline-error-propagation)\n   - Use ? operator for error propagation\n   - Add context with .context()\n   - Source: ~/Tools/.kogral-shared/guidelines/rust-errors.md"
+  }
+}
+
+

kb/list_graphs

+

List available knowledge graphs.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {}
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 6,
+  "method": "kb/list_graphs"
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 6,
+  "result": {
+    "type": "text",
+    "text": "Available graphs:\n\n- default (Current project)\n  Path: /path/to/project/.kogral\n  Nodes: 42\n  Last modified: 2026-01-17T10:30:00Z\n\n- shared (Shared guidelines)\n  Path: ~/Tools/.kogral-shared\n  Nodes: 156\n  Last modified: 2026-01-15T14:20:00Z"
+  }
+}
+
+

kb/export

+

Export knowledge base to various formats.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "format": {
+      "type": "string",
+      "enum": ["logseq", "json", "markdown"],
+      "description": "Export format"
+    },
+    "output_path": {
+      "type": "string",
+      "description": "Output file or directory path"
+    },
+    "include_types": {
+      "type": "array",
+      "items": {
+        "type": "string",
+        "enum": ["note", "decision", "guideline", "pattern", "journal", "execution"]
+      },
+      "description": "Node types to include",
+      "default": ["note", "decision", "guideline", "pattern"]
+    },
+    "skip_journals": {
+      "type": "boolean",
+      "default": true
+    }
+  },
+  "required": ["format", "output_path"]
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 7,
+  "method": "kogral/export",
+  "params": {
+    "format": "logseq",
+    "output_path": "/Users/akasha/logseq-graph",
+    "include_types": ["note", "decision", "guideline"],
+    "skip_journals": true
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 7,
+  "result": {
+    "type": "text",
+    "text": "Export completed:\n\nFormat: Logseq\nOutput: /Users/akasha/logseq-graph\nExported: 42 nodes\n  - 23 notes\n  - 12 decisions\n  - 7 guidelines\n\nLogseq graph ready to open."
+  }
+}
+
+

Block Tools

+

Tools for querying Logseq content blocks. Requires blocks.enable_mcp_tools = true in configuration.

+

kb/find_blocks

+

Find blocks by tag, task status, or custom property across the knowledge base.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "tag": {
+      "type": "string",
+      "description": "Find blocks with this tag (e.g., 'card', 'important')"
+    },
+    "status": {
+      "type": "string",
+      "enum": ["TODO", "DOING", "DONE", "LATER", "NOW", "WAITING", "CANCELLED"],
+      "description": "Find blocks with this task status"
+    },
+    "property_key": {
+      "type": "string",
+      "description": "Custom property key to search for"
+    },
+    "property_value": {
+      "type": "string",
+      "description": "Custom property value to match"
+    },
+    "limit": {
+      "type": "integer",
+      "description": "Maximum number of results",
+      "default": 20
+    }
+  }
+}
+
+

Note: Provide one of: tag, status, or both property_key and property_value.

+

Example Request (find blocks by tag):

+
{
+  "jsonrpc": "2.0",
+  "id": 8,
+  "method": "kogral/find_blocks",
+  "params": {
+    "tag": "high-priority",
+    "limit": 10
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 8,
+  "result": {
+    "type": "text",
+    "text": "Found 3 blocks with tag '#high-priority':\n\n**Project Tasks** (project-tasks-123)\n  - TODO Implement authentication #high-priority\n  - TODO Fix security vulnerability #high-priority\n\n**Sprint Planning** (sprint-planning-456)\n  - DOING Refactor database layer #high-priority"
+  }
+}
+
+

Example Request (find blocks by property):

+
{
+  "jsonrpc": "2.0",
+  "id": 9,
+  "method": "kogral/find_blocks",
+  "params": {
+    "property_key": "priority",
+    "property_value": "high",
+    "limit": 15
+  }
+}
+
+

kb/find_todos

+

Find all TODO blocks across the knowledge base.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "limit": {
+      "type": "integer",
+      "description": "Maximum number of results",
+      "default": 20
+    }
+  }
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 10,
+  "method": "kogral/find_todos",
+  "params": {
+    "limit": 25
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 10,
+  "result": {
+    "type": "text",
+    "text": "Found 8 TODO blocks:\n\n**Project Tasks** (project-tasks-123)\n  - TODO Implement authentication\n  - TODO Write integration tests\n  - TODO Update documentation\n\n**Bug Fixes** (bug-fixes-456)\n  - TODO Fix race condition in cache\n  - TODO Address memory leak\n\n**Research** (research-789)\n  - TODO Evaluate GraphQL alternatives\n  - TODO Benchmark new approach\n  - TODO Document findings"
+  }
+}
+
+

kb/find_cards

+

Find all flashcard blocks (blocks tagged with #card) for spaced repetition learning.

+

Input Schema:

+
{
+  "type": "object",
+  "properties": {
+    "limit": {
+      "type": "integer",
+      "description": "Maximum number of flashcards",
+      "default": 10
+    }
+  }
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 11,
+  "method": "kogral/find_cards",
+  "params": {
+    "limit": 5
+  }
+}
+
+

Example Response:

+
{
+  "jsonrpc": "2.0",
+  "id": 11,
+  "result": {
+    "type": "text",
+    "text": "Found 3 flashcards:\n\n**Rust Learning** (rust-learning-123)\n  - What is Rust's ownership model? #card #rust\n    - Ownership prevents data races at compile time\n    - Each value has a single owner\n\n**System Design** (system-design-456)\n  - What is the CAP theorem? #card #distributed-systems\n    - Consistency, Availability, Partition tolerance\n    - Can only guarantee 2 of 3\n\n**Algorithms** (algorithms-789)\n  - What is the time complexity of quicksort? #card #algorithms\n    - Average: O(n log n)\n    - Worst case: O(n²)"
+  }
+}
+
+

Use Cases:

+
    +
  • kb/find_blocks: General block search by metadata
  • +
  • kb/find_todos: Task management and tracking
  • +
  • kb/find_cards: Spaced repetition learning system
  • +
+

See Also:

+ +

Resources

+

Resources provide read-only access to knowledge graph content via URIs.

+

kogral://project/notes

+

Access project notes.

+

URI: kogral://project/notes or kogral://project/notes/{note-id}

+

Example: Read all project notes

+
kogral://project/notes
+
+

Example: Read specific note

+
kogral://project/notes/async-trait-patterns
+
+

kogral://project/decisions

+

Access project decisions (ADRs).

+

URI: kogral://project/decisions or kogral://project/decisions/{decision-id}

+

kogral://project/guidelines

+

Access project-specific guidelines.

+

URI: kogral://project/guidelines or kogral://project/guidelines/{guideline-id}

+

kogral://project/patterns

+

Access project patterns.

+

URI: kogral://project/patterns or kogral://project/patterns/{pattern-id}

+

kogral://shared/guidelines

+

Access shared guidelines (inherited).

+

URI: kogral://shared/guidelines or kogral://shared/guidelines/{guideline-id}

+

kogral://shared/patterns

+

Access shared patterns (inherited).

+

URI: kogral://shared/patterns or kogral://shared/patterns/{pattern-id}

+

Prompts

+

Prompts provide guided workflows for common tasks.

+

kb/summarize_project

+

Generate a comprehensive project knowledge summary.

+

Arguments:

+
{
+  "project": {
+    "type": "string",
+    "description": "Project graph name",
+    "default": "default"
+  }
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 8,
+  "method": "kogral/summarize_project",
+  "params": {
+    "project": "default"
+  }
+}
+
+

Returns: Prompt messages with project summary including:

+
    +
  • Total node counts by type
  • +
  • Recent additions
  • +
  • Top tags
  • +
  • Key decisions
  • +
  • Active patterns
  • +
+ +

Find nodes related to a specific topic or node.

+

Arguments:

+
{
+  "node_id": {
+    "type": "string",
+    "description": "Node ID to find relations for"
+  },
+  "depth": {
+    "type": "integer",
+    "description": "Maximum traversal depth",
+    "default": 2
+  }
+}
+
+

Example Request:

+
{
+  "jsonrpc": "2.0",
+  "id": 9,
+  "method": "kb/find_related",
+  "params": {
+    "node_id": "pattern-error-handling",
+    "depth": 2
+  }
+}
+
+

Returns: Prompt messages with:

+
    +
  • Direct relationships
  • +
  • Indirect relationships (depth 2+)
  • +
  • Common tags
  • +
  • Related guidelines
  • +
+

Error Handling

+

Error Codes

+

Standard JSON-RPC 2.0 error codes:

+
+ + + + + +
CodeMeaningDescription
-32700Parse errorInvalid JSON
-32600Invalid RequestMissing required fields
-32601Method not foundUnknown tool/resource
-32602Invalid paramsParameter validation failed
-32603Internal errorServer-side error
+
+

Example Error Response

+
{
+  "jsonrpc": "2.0",
+  "id": 1,
+  "error": {
+    "code": -32602,
+    "message": "Invalid params",
+    "data": {
+      "details": "Field 'query' is required but missing",
+      "field": "query"
+    }
+  }
+}
+
+

Best Practices

+

1. Use Semantic Search for Discovery

+
{
+  "method": "kogral/search",
+  "params": {
+    "query": "how to handle database connection errors",
+    "semantic": true,
+    "threshold": 0.5
+  }
+}
+
+ +
{
+  "method": "kogral/link",
+  "params": {
+    "from": "note-new-discovery",
+    "to": "pattern-related-pattern",
+    "relation": "implements"
+  }
+}
+
+

3. Query Guidelines Before Implementation

+
{
+  "method": "kogral/get_guidelines",
+  "params": {
+    "language": "rust",
+    "category": "testing"
+  }
+}
+
+

4. Document Decisions with ADRs

+
{
+  "method": "kogral/add_decision",
+  "params": {
+    "title": "Use X for Y",
+    "context": "Background...",
+    "decision": "We will...",
+    "consequences": ["Pro 1", "Con 1"]
+  }
+}
+
+

See Also

+ +

Resources

+

Rust API

+

Development Setup

+

Code Standards

+

Testing

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/searcher.js b/docs/book/searcher.js new file mode 100644 index 0000000..fc65604 --- /dev/null +++ b/docs/book/searcher.js @@ -0,0 +1,529 @@ +'use strict'; + +/* global Mark, elasticlunr, path_to_root */ + +window.search = window.search || {}; +(function search() { + // Search functionality + // + // You can use !hasFocus() to prevent keyhandling in your key + // event handlers while the user is typing their search. + + if (!Mark || !elasticlunr) { + return; + } + + // eslint-disable-next-line max-len + // IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(search, pos) { + return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; + }; + } + + const search_wrap = document.getElementById('search-wrapper'), + searchbar = document.getElementById('searchbar'), + searchresults = document.getElementById('searchresults'), + searchresults_outer = document.getElementById('searchresults-outer'), + searchresults_header = document.getElementById('searchresults-header'), + searchicon = document.getElementById('search-toggle'), + content = document.getElementById('content'), + + // SVG text elements don't render if inside a tag. + mark_exclude = ['text'], + marker = new Mark(content), + URL_SEARCH_PARAM = 'search', + URL_MARK_PARAM = 'highlight'; + + let current_searchterm = '', + doc_urls = [], + search_options = { + bool: 'AND', + expand: true, + fields: { + title: {boost: 1}, + body: {boost: 1}, + breadcrumbs: {boost: 0}, + }, + }, + searchindex = null, + results_options = { + teaser_word_count: 30, + limit_results: 30, + }, + teaser_count = 0; + + function hasFocus() { + return searchbar === document.activeElement; + } + + function removeChildren(elem) { + while (elem.firstChild) { + elem.removeChild(elem.firstChild); + } + } + + // Helper to parse a url into its building blocks. + function parseURL(url) { + const a = document.createElement('a'); + a.href = url; + return { + source: url, + protocol: a.protocol.replace(':', ''), + host: a.hostname, + port: a.port, + params: (function() { + const ret = {}; + const seg = a.search.replace(/^\?/, '').split('&'); + for (const part of seg) { + if (!part) { + continue; + } + const s = part.split('='); + ret[s[0]] = s[1]; + } + return ret; + })(), + file: (a.pathname.match(/\/([^/?#]+)$/i) || ['', ''])[1], + hash: a.hash.replace('#', ''), + path: a.pathname.replace(/^([^/])/, '/$1'), + }; + } + + // Helper to recreate a url string from its building blocks. + function renderURL(urlobject) { + let url = urlobject.protocol + '://' + urlobject.host; + if (urlobject.port !== '') { + url += ':' + urlobject.port; + } + url += urlobject.path; + let joiner = '?'; + for (const prop in urlobject.params) { + if (Object.prototype.hasOwnProperty.call(urlobject.params, prop)) { + url += joiner + prop + '=' + urlobject.params[prop]; + joiner = '&'; + } + } + if (urlobject.hash !== '') { + url += '#' + urlobject.hash; + } + return url; + } + + // Helper to escape html special chars for displaying the teasers + const escapeHTML = (function() { + const MAP = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + }; + const repl = function(c) { + return MAP[c]; + }; + return function(s) { + return s.replace(/[&<>'"]/g, repl); + }; + })(); + + function formatSearchMetric(count, searchterm) { + if (count === 1) { + return count + ' search result for \'' + searchterm + '\':'; + } else if (count === 0) { + return 'No search results for \'' + searchterm + '\'.'; + } else { + return count + ' search results for \'' + searchterm + '\':'; + } + } + + function formatSearchResult(result, searchterms) { + const teaser = makeTeaser(escapeHTML(result.doc.body), searchterms); + teaser_count++; + + // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor + const url = doc_urls[result.ref].split('#'); + if (url.length === 1) { // no anchor found + url.push(''); + } + + // encodeURIComponent escapes all chars that could allow an XSS except + // for '. Due to that we also manually replace ' with its url-encoded + // representation (%27). + const encoded_search = encodeURIComponent(searchterms.join(' ')).replace(/'/g, '%27'); + + return '' + + result.doc.breadcrumbs + '' + '' + teaser + ''; + } + + function makeTeaser(body, searchterms) { + // The strategy is as follows: + // First, assign a value to each word in the document: + // Words that correspond to search terms (stemmer aware): 40 + // Normal words: 2 + // First word in a sentence: 8 + // Then use a sliding window with a constant number of words and count the + // sum of the values of the words within the window. Then use the window that got the + // maximum sum. If there are multiple maximas, then get the last one. + // Enclose the terms in . + const stemmed_searchterms = searchterms.map(function(w) { + return elasticlunr.stemmer(w.toLowerCase()); + }); + const searchterm_weight = 40; + const weighted = []; // contains elements of ["word", weight, index_in_document] + // split in sentences, then words + const sentences = body.toLowerCase().split('. '); + let index = 0; + let value = 0; + let searchterm_found = false; + for (const sentenceindex in sentences) { + const words = sentences[sentenceindex].split(' '); + value = 8; + for (const wordindex in words) { + const word = words[wordindex]; + if (word.length > 0) { + for (const searchtermindex in stemmed_searchterms) { + if (elasticlunr.stemmer(word).startsWith( + stemmed_searchterms[searchtermindex]) + ) { + value = searchterm_weight; + searchterm_found = true; + } + } + weighted.push([word, value, index]); + value = 2; + } + index += word.length; + index += 1; // ' ' or '.' if last word in sentence + } + index += 1; // because we split at a two-char boundary '. ' + } + + if (weighted.length === 0) { + return body; + } + + const window_weight = []; + const window_size = Math.min(weighted.length, results_options.teaser_word_count); + + let cur_sum = 0; + for (let wordindex = 0; wordindex < window_size; wordindex++) { + cur_sum += weighted[wordindex][1]; + } + window_weight.push(cur_sum); + for (let wordindex = 0; wordindex < weighted.length - window_size; wordindex++) { + cur_sum -= weighted[wordindex][1]; + cur_sum += weighted[wordindex + window_size][1]; + window_weight.push(cur_sum); + } + + let max_sum_window_index = 0; + if (searchterm_found) { + let max_sum = 0; + // backwards + for (let i = window_weight.length - 1; i >= 0; i--) { + if (window_weight[i] > max_sum) { + max_sum = window_weight[i]; + max_sum_window_index = i; + } + } + } else { + max_sum_window_index = 0; + } + + // add around searchterms + const teaser_split = []; + index = weighted[max_sum_window_index][2]; + for (let i = max_sum_window_index; i < max_sum_window_index + window_size; i++) { + const word = weighted[i]; + if (index < word[2]) { + // missing text from index to start of `word` + teaser_split.push(body.substring(index, word[2])); + index = word[2]; + } + if (word[1] === searchterm_weight) { + teaser_split.push(''); + } + index = word[2] + word[0].length; + teaser_split.push(body.substring(word[2], index)); + if (word[1] === searchterm_weight) { + teaser_split.push(''); + } + } + + return teaser_split.join(''); + } + + function init(config) { + results_options = config.results_options; + search_options = config.search_options; + doc_urls = config.doc_urls; + searchindex = elasticlunr.Index.load(config.index); + + // Set up events + searchicon.addEventListener('click', () => { + searchIconClickHandler(); + }, false); + searchbar.addEventListener('keyup', () => { + searchbarKeyUpHandler(); + }, false); + document.addEventListener('keydown', e => { + globalKeyHandler(e); + }, false); + // If the user uses the browser buttons, do the same as if a reload happened + window.onpopstate = () => { + doSearchOrMarkFromUrl(); + }; + // Suppress "submit" events so the page doesn't reload when the user presses Enter + document.addEventListener('submit', e => { + e.preventDefault(); + }, false); + + // If reloaded, do the search or mark again, depending on the current url parameters + doSearchOrMarkFromUrl(); + + // Exported functions + config.hasFocus = hasFocus; + } + + function unfocusSearchbar() { + // hacky, but just focusing a div only works once + const tmp = document.createElement('input'); + tmp.setAttribute('style', 'position: absolute; opacity: 0;'); + searchicon.appendChild(tmp); + tmp.focus(); + tmp.remove(); + } + + // On reload or browser history backwards/forwards events, parse the url and do search or mark + function doSearchOrMarkFromUrl() { + // Check current URL for search request + const url = parseURL(window.location.href); + if (Object.prototype.hasOwnProperty.call(url.params, URL_SEARCH_PARAM) + && url.params[URL_SEARCH_PARAM] !== '') { + showSearch(true); + searchbar.value = decodeURIComponent( + (url.params[URL_SEARCH_PARAM] + '').replace(/\+/g, '%20')); + searchbarKeyUpHandler(); // -> doSearch() + } else { + showSearch(false); + } + + if (Object.prototype.hasOwnProperty.call(url.params, URL_MARK_PARAM)) { + const words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' '); + marker.mark(words, { + exclude: mark_exclude, + }); + + const markers = document.querySelectorAll('mark'); + const hide = () => { + for (let i = 0; i < markers.length; i++) { + markers[i].classList.add('fade-out'); + window.setTimeout(() => { + marker.unmark(); + }, 300); + } + }; + + for (let i = 0; i < markers.length; i++) { + markers[i].addEventListener('click', hide); + } + } + } + + // Eventhandler for keyevents on `document` + function globalKeyHandler(e) { + if (e.altKey || + e.ctrlKey || + e.metaKey || + e.shiftKey || + e.target.type === 'textarea' || + e.target.type === 'text' || + !hasFocus() && /^(?:input|select|textarea)$/i.test(e.target.nodeName) + ) { + return; + } + + if (e.key === 'Escape') { + e.preventDefault(); + searchbar.classList.remove('active'); + setSearchUrlParameters('', + searchbar.value.trim() !== '' ? 'push' : 'replace'); + if (hasFocus()) { + unfocusSearchbar(); + } + showSearch(false); + marker.unmark(); + } else if (!hasFocus() && (e.key === 's' || e.key === '/')) { + e.preventDefault(); + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else if (hasFocus() && (e.key === 'ArrowDown' + || e.key === 'Enter')) { + e.preventDefault(); + const first = searchresults.firstElementChild; + if (first !== null) { + unfocusSearchbar(); + first.classList.add('focus'); + if (e.key === 'Enter') { + window.location.assign(first.querySelector('a')); + } + } + } else if (!hasFocus() && (e.key === 'ArrowDown' + || e.key === 'ArrowUp' + || e.key === 'Enter')) { + // not `:focus` because browser does annoying scrolling + const focused = searchresults.querySelector('li.focus'); + if (!focused) { + return; + } + e.preventDefault(); + if (e.key === 'ArrowDown') { + const next = focused.nextElementSibling; + if (next) { + focused.classList.remove('focus'); + next.classList.add('focus'); + } + } else if (e.key === 'ArrowUp') { + focused.classList.remove('focus'); + const prev = focused.previousElementSibling; + if (prev) { + prev.classList.add('focus'); + } else { + searchbar.select(); + } + } else { // Enter + window.location.assign(focused.querySelector('a')); + } + } + } + + function showSearch(yes) { + if (yes) { + search_wrap.classList.remove('hidden'); + searchicon.setAttribute('aria-expanded', 'true'); + } else { + search_wrap.classList.add('hidden'); + searchicon.setAttribute('aria-expanded', 'false'); + const results = searchresults.children; + for (let i = 0; i < results.length; i++) { + results[i].classList.remove('focus'); + } + } + } + + function showResults(yes) { + if (yes) { + searchresults_outer.classList.remove('hidden'); + } else { + searchresults_outer.classList.add('hidden'); + } + } + + // Eventhandler for search icon + function searchIconClickHandler() { + if (search_wrap.classList.contains('hidden')) { + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else { + showSearch(false); + } + } + + // Eventhandler for keyevents while the searchbar is focused + function searchbarKeyUpHandler() { + const searchterm = searchbar.value.trim(); + if (searchterm !== '') { + searchbar.classList.add('active'); + doSearch(searchterm); + } else { + searchbar.classList.remove('active'); + showResults(false); + removeChildren(searchresults); + } + + setSearchUrlParameters(searchterm, 'push_if_new_search_else_replace'); + + // Remove marks + marker.unmark(); + } + + // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and + // `#heading-anchor`. `action` can be one of "push", "replace", + // "push_if_new_search_else_replace" and replaces or pushes a new browser history item. + // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet. + function setSearchUrlParameters(searchterm, action) { + const url = parseURL(window.location.href); + const first_search = !Object.prototype.hasOwnProperty.call(url.params, URL_SEARCH_PARAM); + + if (searchterm !== '' || action === 'push_if_new_search_else_replace') { + url.params[URL_SEARCH_PARAM] = searchterm; + delete url.params[URL_MARK_PARAM]; + url.hash = ''; + } else { + delete url.params[URL_MARK_PARAM]; + delete url.params[URL_SEARCH_PARAM]; + } + // A new search will also add a new history item, so the user can go back + // to the page prior to searching. A updated search term will only replace + // the url. + if (action === 'push' || action === 'push_if_new_search_else_replace' && first_search ) { + history.pushState({}, document.title, renderURL(url)); + } else if (action === 'replace' || + action === 'push_if_new_search_else_replace' && + !first_search + ) { + history.replaceState({}, document.title, renderURL(url)); + } + } + + function doSearch(searchterm) { + // Don't search the same twice + if (current_searchterm === searchterm) { + return; + } else { + current_searchterm = searchterm; + } + + if (searchindex === null) { + return; + } + + // Do the actual search + const results = searchindex.search(searchterm, search_options); + const resultcount = Math.min(results.length, results_options.limit_results); + + // Display search metrics + searchresults_header.innerText = formatSearchMetric(resultcount, searchterm); + + // Clear and insert results + const searchterms = searchterm.split(' '); + removeChildren(searchresults); + for (let i = 0; i < resultcount ; i++) { + const resultElem = document.createElement('li'); + resultElem.innerHTML = formatSearchResult(results[i], searchterms); + searchresults.appendChild(resultElem); + } + + // Display results + showResults(true); + } + + function loadScript(url, id) { + const script = document.createElement('script'); + script.src = url; + script.id = id; + script.onload = () => init(window.search); + script.onerror = error => { + console.error(`Failed to load \`${url}\`: ${error}`); + }; + document.head.append(script); + } + + loadScript(path_to_root + 'searchindex.js', 'search-index'); + +})(window.search); diff --git a/docs/book/searchindex.js b/docs/book/searchindex.js new file mode 100644 index 0000000..8f09e5b --- /dev/null +++ b/docs/book/searchindex.js @@ -0,0 +1 @@ +window.search = JSON.parse('{"doc_urls":["index.html#kogral-documentation","index.html#-reading-the-documentation","index.html#option-1-serve-locally-with-mdbook-recommended","index.html#option-2-build-static-html","index.html#option-3-read-markdown-files-directly","index.html#-documentation-commands","index.html#build-and-serve","index.html#validation","index.html#cleanup","index.html#view-all-documentation-commands","index.html#-installing-mdbook","index.html#install-via-cargo","index.html#install-optional-tools","index.html#verify-installation","index.html#-documentation-structure","index.html#1--kogral-definition--kogral","index.html#2--guides--guides","index.html#3--architecture--architecture","index.html#4--setup--setup","index.html#5--configuration--config","index.html#6--storage--storage","index.html#7--ai--embeddings--ai","index.html#8--templates--templates","index.html#9--cli-reference--cli","index.html#10--apps--integrations--apps","index.html#11--api-reference--api","index.html#12--contributing--contributing","index.html#-visual-diagrams","index.html#-searching-the-documentation","index.html#-editing-documentation","index.html#file-format","index.html#adding-a-new-page","index.html#adding-a-new-section","index.html#-testing-documentation","index.html#test-code-examples","index.html#check-links","index.html#-documentation-standards","index.html#-tips","index.html#live-reload-while-writing","index.html#markdown-preview-in-editor","index.html#quick-reference","index.html#-troubleshooting","index.html#mdbook-command-not-found","index.html#port-3000-already-in-use","index.html#links-broken-after-moving-files","index.html#-resources","index.html#-contributing-to-documentation","kogral/what-is-kogral.html#what-is-kogral","kogral/what-is-kogral.html#purpose","kogral/what-is-kogral.html#solution","kogral/what-is-kogral.html#core-philosophy","kogral/what-is-kogral.html#config-driven","kogral/what-is-kogral.html#git-friendly","kogral/what-is-kogral.html#ai-native","kogral/what-is-kogral.html#key-concepts","kogral/what-is-kogral.html#nodes","kogral/what-is-kogral.html#relationships","kogral/what-is-kogral.html#multi-graph-architecture","kogral/what-is-kogral.html#use-cases","kogral/what-is-kogral.html#for-developers","kogral/what-is-kogral.html#for-teams","kogral/what-is-kogral.html#for-ai-agents","kogral/what-is-kogral.html#comparison-with-other-tools","kogral/what-is-kogral.html#vs-logseq","kogral/what-is-kogral.html#vs-obsidian","kogral/what-is-kogral.html#vs-notionconfluence","kogral/what-is-kogral.html#architecture-overview","kogral/what-is-kogral.html#when-to-use-kogral","kogral/what-is-kogral.html#next-steps","kogral/core-concepts.html#core-concepts","kogral/core-concepts.html#the-knowledge-graph","kogral/core-concepts.html#node-types","kogral/core-concepts.html#1-note","kogral/core-concepts.html#2-decision-adr","kogral/core-concepts.html#3-guideline","kogral/core-concepts.html#4-pattern","kogral/core-concepts.html#5-journal","kogral/core-concepts.html#6-execution","kogral/core-concepts.html#relationship-types","kogral/core-concepts.html#1-relates_to","kogral/core-concepts.html#2-depends_on","kogral/core-concepts.html#3-implements","kogral/core-concepts.html#4-extends","kogral/core-concepts.html#5-supersedes","kogral/core-concepts.html#6-explains","kogral/core-concepts.html#multi-graph-architecture","kogral/core-concepts.html#local-graph-project-specific","kogral/core-concepts.html#shared-graph-organization-wide","kogral/core-concepts.html#inheritance-model","kogral/core-concepts.html#config-driven-behavior","kogral/core-concepts.html#semantic-search","kogral/core-concepts.html#templates","kogral/core-concepts.html#mcp-integration","kogral/core-concepts.html#git-friendly-storage","kogral/core-concepts.html#logseq-content-blocks","kogral/core-concepts.html#what-are-blocks","kogral/core-concepts.html#block-features","kogral/core-concepts.html#configuration","kogral/core-concepts.html#use-cases","kogral/core-concepts.html#block-queries-mcp-tools","kogral/core-concepts.html#architecture","kogral/core-concepts.html#key-principles","kogral/core-concepts.html#next-steps","kogral/why-kogral.html#why-kb","kogral/why-kogral.html#the-problem-knowledge-fragmentation","kogral/why-kogral.html#the-solution-unified-queryable-knowledge-graph","kogral/why-kogral.html#what-makes-kb-different","kogral/why-kogral.html#1-git-native","kogral/why-kogral.html#2-ai-native","kogral/why-kogral.html#3-config-driven","kogral/why-kogral.html#4-multi-graph","kogral/why-kogral.html#5-structured-relationships","kogral/why-kogral.html#real-world-impact","kogral/why-kogral.html#before-kb","kogral/why-kogral.html#with-kb","kogral/why-kogral.html#before-kb-1","kogral/why-kogral.html#with-kb-1","kogral/why-kogral.html#before-kb-2","kogral/why-kogral.html#with-kb-2","kogral/why-kogral.html#who-benefits","kogral/why-kogral.html#individual-developers","kogral/why-kogral.html#teams","kogral/why-kogral.html#organizations","kogral/why-kogral.html#ai-agents","kogral/why-kogral.html#when-not-to-use-kb","kogral/why-kogral.html#the-vision","kogral/why-kogral.html#design-philosophy","kogral/why-kogral.html#1--knowledge-should-be-captured-during-work-not-after","kogral/why-kogral.html#2--knowledge-should-be-connected-not-isolated","kogral/why-kogral.html#3--knowledge-should-be-queryable-not-browsable","kogral/why-kogral.html#get-started","kogral/design-philosophy.html#design-philosophy","kogral/design-philosophy.html#core-tenets","kogral/design-philosophy.html#1-config-driven-not-hardcoded","kogral/design-philosophy.html#2-type-safe-configuration","kogral/design-philosophy.html#3-local-first-cloud-optional","kogral/design-philosophy.html#4-git-friendly-by-default","kogral/design-philosophy.html#5-ai-native-human-readable","kogral/design-philosophy.html#6-composition-over-inheritance","kogral/design-philosophy.html#7-fail-fast-fail-clearly","kogral/design-philosophy.html#8-convention-over-configuration-with-escape-hatches","kogral/design-philosophy.html#9-documentation-as-code","kogral/design-philosophy.html#10-optimize-for-discoverability","kogral/design-philosophy.html#11-build-for-humans-enable-ai","kogral/design-philosophy.html#12-embrace-the-graph","kogral/design-philosophy.html#anti-patterns-to-avoid","kogral/design-philosophy.html#1--hardcoding-behavior","kogral/design-philosophy.html#2--runtime-schema-validation","kogral/design-philosophy.html#3--opaque-errors","kogral/design-philosophy.html#4--coupling-components","kogral/design-philosophy.html#5--proprietary-formats","kogral/design-philosophy.html#influences","kogral/design-philosophy.html#implementation-principles","kogral/design-philosophy.html#rust","kogral/design-philosophy.html#nickel","kogral/design-philosophy.html#nushell","kogral/design-philosophy.html#evolution-strategy","kogral/design-philosophy.html#conclusion","kogral/design-philosophy.html#next-steps","guides/installation.html#installation","guides/installation.html#prerequisites","guides/installation.html#required","guides/installation.html#optional","guides/installation.html#installation-methods","guides/installation.html#method-1-install-from-source-recommended","guides/installation.html#method-2-build-specific-crates","guides/installation.html#method-3-build-with-features","guides/installation.html#feature-flags","guides/installation.html#environment-setup","guides/installation.html#1-initialize-a-knowledge-base","guides/installation.html#2-configure-nickel-schemas-optional","guides/installation.html#3-set-up-shared-knowledge-base-optional","guides/installation.html#verify-installation","guides/installation.html#test-cli","guides/installation.html#test-mcp-server","guides/installation.html#run-tests","guides/installation.html#surrealdb-setup-optional","guides/installation.html#start-surrealdb-server","guides/installation.html#configure-kb-core","guides/installation.html#initialize-schema","guides/installation.html#embedding-provider-setup-optional","guides/installation.html#local-fastembed","guides/installation.html#api-providers-openai-claude-ollama","guides/installation.html#claude-code-integration","guides/installation.html#1-build-mcp-server","guides/installation.html#2-configure-claude-code","guides/installation.html#3-test-connection","guides/installation.html#troubleshooting","guides/installation.html#nickel-not-found","guides/installation.html#compilation-errors","guides/installation.html#surrealdb-connection-failed","guides/installation.html#mcp-server-not-responding","guides/installation.html#next-steps","guides/installation.html#uninstallation","guides/quickstart.html#quick-start-guide","guides/quickstart.html#prerequisites","guides/quickstart.html#step-1-initialize-your-knowledge-base","guides/quickstart.html#step-2-create-your-first-note","guides/quickstart.html#step-3-create-a-decision-record","guides/quickstart.html#step-4-link-nodes-together","guides/quickstart.html#step-5-search-your-knowledge-base","guides/quickstart.html#step-6-view-node-details","guides/quickstart.html#step-7-edit-documents-directly","guides/quickstart.html#step-8-create-a-daily-journal-entry","guides/quickstart.html#step-9-export-to-logseq-optional","guides/quickstart.html#step-10-start-mcp-server-for-claude-code","guides/quickstart.html#common-workflows","guides/quickstart.html#capture-quick-notes","guides/quickstart.html#document-architectural-decisions","guides/quickstart.html#build-a-pattern-library","guides/quickstart.html#track-daily-progress","guides/quickstart.html#next-steps","guides/quickstart.html#customize-configuration","guides/quickstart.html#set-up-shared-guidelines","guides/quickstart.html#automate-with-nushell-scripts","guides/quickstart.html#integrate-with-git","guides/quickstart.html#tips-and-tricks","guides/quickstart.html#use-wikilinks","guides/quickstart.html#reference-code","guides/quickstart.html#tag-consistently","guides/quickstart.html#leverage-templates","guides/quickstart.html#troubleshooting","guides/quickstart.html#kb-directory-not-found","guides/quickstart.html#node-not-found","guides/quickstart.html#failed-to-parse-frontmatter","guides/quickstart.html#further-reading","guides/quickstart.html#getting-help","guides/daily-workflows.html#daily-workflows","guides/use-cases.html#use-cases","guides/use-cases.html#use-case-1-onboarding-new-team-members","guides/use-cases.html#problem","guides/use-cases.html#solution-with-kogral","guides/use-cases.html#use-case-2-architectural-decision-records-adr","guides/use-cases.html#problem-1","guides/use-cases.html#solution-with-kogral-1","guides/use-cases.html#use-case-3-pattern-library","guides/use-cases.html#problem-2","guides/use-cases.html#solution-with-kogral-2","guides/use-cases.html#usage","guides/use-cases.html#use-case-5-code-review-preparation","guides/use-cases.html#problem-3","guides/use-cases.html#solution-with-kogral-3","guides/use-cases.html#use-case-6-cross-project-guidelines","guides/use-cases.html#problem-4","guides/use-cases.html#solution-with-kogral-4","guides/use-cases.html#use-case-7-bug-investigation","guides/use-cases.html#problem-5","guides/use-cases.html#solution-with-kogral-5","guides/use-cases.html#use-case-8-api-design-collaboration","guides/use-cases.html#problem-6","guides/use-cases.html#solution-with-kogral-6","guides/use-cases.html#summary","guides/use-cases.html#next-steps","guides/best-practices.html#best-practices","architecture/overview.html#system-architecture","architecture/overview.html#high-level-architecture","architecture/overview.html#component-details","architecture/overview.html#kb-cli-command-line-interface","architecture/overview.html#kb-mcp-mcp-server","architecture/overview.html#nushell-scripts","architecture/overview.html#core-library-kb-core","architecture/overview.html#models","architecture/overview.html#storage-trait","architecture/overview.html#embedding-provider-trait","architecture/overview.html#parser","architecture/overview.html#configuration-system","architecture/overview.html#nickel-schema","architecture/overview.html#loading-process","architecture/overview.html#storage-architecture","architecture/overview.html#hybrid-strategy","architecture/overview.html#file-layout","architecture/overview.html#query-engine","architecture/overview.html#text-search","architecture/overview.html#semantic-search","architecture/overview.html#cross-graph-query","architecture/overview.html#mcp-protocol-flow","architecture/overview.html#template-system","architecture/overview.html#error-handling","architecture/overview.html#testing-strategy","architecture/overview.html#performance-considerations","architecture/overview.html#security","architecture/overview.html#scalability","architecture/overview.html#next-steps","architecture/graph-model.html#graph-model","architecture/config-driven.html#config-driven-architecture","architecture/config-driven.html#philosophy","architecture/config-driven.html#configuration-composition-flow","architecture/config-driven.html#layer-1-schema-contracts","architecture/config-driven.html#layer-2-defaults","architecture/config-driven.html#layer-3-mode-overlays","architecture/config-driven.html#layer-4-user-customizations","architecture/config-driven.html#composition-mechanism","architecture/config-driven.html#export-to-json","architecture/config-driven.html#rust-integration","architecture/config-driven.html#double-validation","architecture/config-driven.html#1-nickel-contract-validation","architecture/config-driven.html#2-serde-deserialization-validation","architecture/config-driven.html#benefits-of-config-driven-architecture","architecture/config-driven.html#1-zero-hardcoding","architecture/config-driven.html#2-environment-flexibility","architecture/config-driven.html#3-self-documenting","architecture/config-driven.html#4-type-safe-evolution","architecture/config-driven.html#5-testability","architecture/config-driven.html#configuration-discovery","architecture/config-driven.html#integration-with-justfile","architecture/config-driven.html#best-practices","architecture/config-driven.html#1-never-hardcode","architecture/config-driven.html#2-use-modes-for-environment-differences","architecture/config-driven.html#3-document-complex-fields","architecture/config-driven.html#4-validate-early","architecture/config-driven.html#5-version-configs","architecture/config-driven.html#see-also","architecture/storage-architecture.html#storage-architecture","architecture/logseq-blocks-design.html#logseq-blocks-support---architecture-design","architecture/logseq-blocks-design.html#problem-statement","architecture/logseq-blocks-design.html#use-cases","architecture/logseq-blocks-design.html#1-flashcards-card","architecture/logseq-blocks-design.html#2-task-tracking-tododone","architecture/logseq-blocks-design.html#3-block-references","architecture/logseq-blocks-design.html#4-block-properties","architecture/logseq-blocks-design.html#design-options","architecture/logseq-blocks-design.html#option-a-blocks-as-first-class-data-structure","architecture/logseq-blocks-design.html#option-b-parser-only-approach","architecture/logseq-blocks-design.html#option-c-hybrid-approach-recommended","architecture/logseq-blocks-design.html#recommended-implementation","architecture/logseq-blocks-design.html#query-api-extensions","architecture/logseq-blocks-design.html#mcp-tool-extensions","architecture/logseq-blocks-design.html#configuration","architecture/logseq-blocks-design.html#migration-path","architecture/logseq-blocks-design.html#testing-strategy","architecture/logseq-blocks-design.html#summary","architecture/adrs/001-nickel-vs-toml.html#adr-001-nickel-vs-toml-for-configuration","architecture/adrs/001-nickel-vs-toml.html#context","architecture/adrs/001-nickel-vs-toml.html#option-1-toml-traditional-config-format","architecture/adrs/001-nickel-vs-toml.html#option-2-nickel-functional-configuration-language","architecture/adrs/001-nickel-vs-toml.html#decision","architecture/adrs/001-nickel-vs-toml.html#consequences","architecture/adrs/001-nickel-vs-toml.html#positive","architecture/adrs/001-nickel-vs-toml.html#negative","architecture/adrs/001-nickel-vs-toml.html#neutral","architecture/adrs/001-nickel-vs-toml.html#alternatives-considered","architecture/adrs/001-nickel-vs-toml.html#json-schema","architecture/adrs/001-nickel-vs-toml.html#yaml","architecture/adrs/001-nickel-vs-toml.html#dhall","architecture/adrs/001-nickel-vs-toml.html#kcl-kusionstack-configuration-language","architecture/adrs/001-nickel-vs-toml.html#implementation-timeline","architecture/adrs/001-nickel-vs-toml.html#monitoring","architecture/adrs/001-nickel-vs-toml.html#references","architecture/adrs/001-nickel-vs-toml.html#revision-history","architecture/adrs/002-fastembed-ai-providers.html#adr-002-fastembed-via-ai-providers-for-embeddings","architecture/adrs/002-fastembed-ai-providers.html#context","architecture/adrs/002-fastembed-ai-providers.html#option-1-only-local-embeddings-fastembed","architecture/adrs/002-fastembed-ai-providers.html#option-2-only-cloud-ai-providers-openai-claude-etc","architecture/adrs/002-fastembed-ai-providers.html#option-3-hybrid-strategy-fastembed--ai-providers-via-rig-core","architecture/adrs/002-fastembed-ai-providers.html#decision","architecture/adrs/002-fastembed-ai-providers.html#consequences","architecture/adrs/002-fastembed-ai-providers.html#positive","architecture/adrs/002-fastembed-ai-providers.html#negative","architecture/adrs/002-fastembed-ai-providers.html#neutral","architecture/adrs/002-fastembed-ai-providers.html#provider-comparison","architecture/adrs/002-fastembed-ai-providers.html#implementation-timeline","architecture/adrs/002-fastembed-ai-providers.html#monitoring","architecture/adrs/002-fastembed-ai-providers.html#references","architecture/adrs/002-fastembed-ai-providers.html#revision-history","architecture/adrs/003-hybrid-storage.html#adr-003-hybrid-storage-strategy","architecture/adrs/003-hybrid-storage.html#context","architecture/adrs/003-hybrid-storage.html#option-1-filesystem-only","architecture/adrs/003-hybrid-storage.html#option-2-database-only-surrealdb","architecture/adrs/003-hybrid-storage.html#option-3-hybrid-filesystem--surrealdb","architecture/adrs/003-hybrid-storage.html#decision","architecture/adrs/003-hybrid-storage.html#consequences","architecture/adrs/003-hybrid-storage.html#positive","architecture/adrs/003-hybrid-storage.html#negative","architecture/adrs/003-hybrid-storage.html#neutral","architecture/adrs/003-hybrid-storage.html#use-cases","architecture/adrs/003-hybrid-storage.html#small-project-solo-developer","architecture/adrs/003-hybrid-storage.html#medium-project-team","architecture/adrs/003-hybrid-storage.html#large-organization","architecture/adrs/003-hybrid-storage.html#sync-mechanism","architecture/adrs/003-hybrid-storage.html#filesystem--surrealdb","architecture/adrs/003-hybrid-storage.html#surrealdb--filesystem","architecture/adrs/003-hybrid-storage.html#conflict-resolution","architecture/adrs/003-hybrid-storage.html#alternatives-considered","architecture/adrs/003-hybrid-storage.html#git-submodules-for-shared-knowledge","architecture/adrs/003-hybrid-storage.html#syncthing-for-filesystem-sync","architecture/adrs/003-hybrid-storage.html#postgresql-with-json","architecture/adrs/003-hybrid-storage.html#migration-path","architecture/adrs/003-hybrid-storage.html#phase-1-filesystem-only-current","architecture/adrs/003-hybrid-storage.html#phase-2-optional-surrealdb","architecture/adrs/003-hybrid-storage.html#phase-3-automatic-sync","architecture/adrs/003-hybrid-storage.html#phase-4-multi-tenant-surrealdb","architecture/adrs/003-hybrid-storage.html#monitoring","architecture/adrs/003-hybrid-storage.html#references","architecture/adrs/003-hybrid-storage.html#revision-history","architecture/adrs/004-logseq-blocks-support.html#adr-004-logseq-blocks-support","architecture/adrs/004-logseq-blocks-support.html#status","architecture/adrs/004-logseq-blocks-support.html#context","architecture/adrs/004-logseq-blocks-support.html#decision","architecture/adrs/004-logseq-blocks-support.html#1-add-block-data-structure","architecture/adrs/004-logseq-blocks-support.html#2-extend-node-model","architecture/adrs/004-logseq-blocks-support.html#3-bidirectional-parser","architecture/adrs/004-logseq-blocks-support.html#4-storage-strategy","architecture/adrs/004-logseq-blocks-support.html#5-query-extensions","architecture/adrs/004-logseq-blocks-support.html#consequences","architecture/adrs/004-logseq-blocks-support.html#positive","architecture/adrs/004-logseq-blocks-support.html#negative","architecture/adrs/004-logseq-blocks-support.html#neutral","architecture/adrs/004-logseq-blocks-support.html#implementation-phases","architecture/adrs/004-logseq-blocks-support.html#alternatives-considered","architecture/adrs/004-logseq-blocks-support.html#alternative-1-blocks-as-first-class-nodes","architecture/adrs/004-logseq-blocks-support.html#alternative-2-parser-only-no-storage","architecture/adrs/004-logseq-blocks-support.html#alternative-3-metadata-field","architecture/adrs/004-logseq-blocks-support.html#references","architecture/adrs/004-logseq-blocks-support.html#notes","architecture/adrs/005-mcp-protocol.html#adr-005-mcp-protocol-for-ai-integration","setup/prerequisites.html#prerequisites","setup/installation.html#installation-methods","setup/project-init.html#project-initialization","setup/environment.html#environment-configuration","setup/verification.html#verification","config/overview.html#configuration-overview","config/nickel-schemas.html#nickel-schemas","config/graph-settings.html#graph-settings","config/inheritance.html#inheritance","config/examples.html#examples","storage/backends.html#storage-backends","storage/filesystem.html#filesystem-storage","storage/surrealdb.html#surrealdb-storage","storage/memory.html#in-memory-storage","storage/sync.html#sync-strategies","ai/embeddings-overview.html#embeddings-overview","ai/providers.html#provider-configuration","ai/fastembed.html#fastembed-local","ai/openai.html#openai-integration","ai/claude.html#claude-integration","ai/ollama.html#ollama-integration","ai/semantic-search.html#semantic-search","templates/overview.html#template-system","templates/documents.html#document-templates","templates/export.html#export-templates","templates/customization.html#customization","cli/overview.html#cli-overview","cli/commands.html#commands-reference","cli/workflows.html#workflows","cli/nushell-scripts.html#nushell-scripts","apps/mcp-quickguide.html#mcp-quick-guide","apps/mcp-quickguide.html#what-is-mcp","apps/mcp-quickguide.html#quick-setup-5-minutes","apps/mcp-quickguide.html#step-1-build-mcp-server","apps/mcp-quickguide.html#step-2-configure-claude-code","apps/mcp-quickguide.html#step-3-initialize-kogral","apps/mcp-quickguide.html#step-4-start-claude-code","apps/mcp-quickguide.html#step-5-test-connection","apps/mcp-quickguide.html#essential-commands","apps/mcp-quickguide.html#search-knowledge-base","apps/mcp-quickguide.html#add-note","apps/mcp-quickguide.html#add-decision","apps/mcp-quickguide.html#get-guidelines","apps/mcp-quickguide.html#link-concepts","apps/mcp-quickguide.html#common-workflows","apps/mcp-quickguide.html#capture-meeting-notes","apps/mcp-quickguide.html#find-related-knowledge","apps/mcp-quickguide.html#document-implementation","apps/mcp-quickguide.html#review-project-knowledge","apps/mcp-quickguide.html#advanced-usage","apps/mcp-quickguide.html#conditional-queries","apps/mcp-quickguide.html#cross-reference-check","apps/mcp-quickguide.html#export-for-sharing","apps/mcp-quickguide.html#tips-and-tricks","apps/mcp-quickguide.html#1-use-natural-language","apps/mcp-quickguide.html#2-be-specific-with-tags","apps/mcp-quickguide.html#3-link-as-you-go","apps/mcp-quickguide.html#4-review-regularly","apps/mcp-quickguide.html#5-use-semantic-search","apps/mcp-quickguide.html#troubleshooting","apps/mcp-quickguide.html#mcp-server-not-responding","apps/mcp-quickguide.html#kb-directory-not-found","apps/mcp-quickguide.html#permission-denied","apps/mcp-quickguide.html#empty-search-results","apps/mcp-quickguide.html#next-steps","apps/mcp-quickguide.html#quick-reference-card","apps/claude-code.html#claude-code-integration","apps/logseq.html#logseq-integration","apps/obsidian.html#obsidian-compatibility","apps/git.html#git-workflows","api/mcp-protocol.html#mcp-protocol","api/mcp-tools.html#mcp-tools-api-reference","api/mcp-tools.html#overview","api/mcp-tools.html#server-configuration","api/mcp-tools.html#start-mcp-server","api/mcp-tools.html#claude-code-configuration","api/mcp-tools.html#tools","api/mcp-tools.html#kbsearch","api/mcp-tools.html#kbadd_note","api/mcp-tools.html#kbadd_decision","api/mcp-tools.html#kblink","api/mcp-tools.html#kbget_guidelines","api/mcp-tools.html#kblist_graphs","api/mcp-tools.html#kbexport","api/mcp-tools.html#block-tools","api/mcp-tools.html#kbfind_blocks","api/mcp-tools.html#kbfind_todos","api/mcp-tools.html#kbfind_cards","api/mcp-tools.html#resources","api/mcp-tools.html#kogralprojectnotes","api/mcp-tools.html#kogralprojectdecisions","api/mcp-tools.html#kogralprojectguidelines","api/mcp-tools.html#kogralprojectpatterns","api/mcp-tools.html#kogralsharedguidelines","api/mcp-tools.html#kogralsharedpatterns","api/mcp-tools.html#prompts","api/mcp-tools.html#kbsummarize_project","api/mcp-tools.html#kbfind_related","api/mcp-tools.html#error-handling","api/mcp-tools.html#error-codes","api/mcp-tools.html#example-error-response","api/mcp-tools.html#best-practices","api/mcp-tools.html#1-use-semantic-search-for-discovery","api/mcp-tools.html#2-link-related-concepts","api/mcp-tools.html#3-query-guidelines-before-implementation","api/mcp-tools.html#4-document-decisions-with-adrs","api/mcp-tools.html#see-also","api/mcp-resources.html#resources","api/rust-api.html#rust-api","contributing/development.html#development-setup","contributing/standards.html#code-standards","contributing/testing.html#testing"],"index":{"documentStore":{"docInfo":{"0":{"body":17,"breadcrumbs":3,"title":2},"1":{"body":4,"breadcrumbs":3,"title":2},"10":{"body":5,"breadcrumbs":3,"title":2},"100":{"body":72,"breadcrumbs":3,"title":1},"101":{"body":33,"breadcrumbs":4,"title":2},"102":{"body":15,"breadcrumbs":4,"title":2},"103":{"body":6,"breadcrumbs":2,"title":1},"104":{"body":94,"breadcrumbs":4,"title":3},"105":{"body":44,"breadcrumbs":6,"title":5},"106":{"body":0,"breadcrumbs":4,"title":3},"107":{"body":46,"breadcrumbs":4,"title":3},"108":{"body":57,"breadcrumbs":4,"title":3},"109":{"body":37,"breadcrumbs":4,"title":3},"11":{"body":3,"breadcrumbs":4,"title":3},"110":{"body":57,"breadcrumbs":4,"title":3},"111":{"body":31,"breadcrumbs":4,"title":3},"112":{"body":0,"breadcrumbs":4,"title":3},"113":{"body":32,"breadcrumbs":3,"title":2},"114":{"body":33,"breadcrumbs":2,"title":1},"115":{"body":22,"breadcrumbs":3,"title":2},"116":{"body":27,"breadcrumbs":2,"title":1},"117":{"body":24,"breadcrumbs":3,"title":2},"118":{"body":32,"breadcrumbs":2,"title":1},"119":{"body":0,"breadcrumbs":2,"title":1},"12":{"body":25,"breadcrumbs":4,"title":3},"120":{"body":24,"breadcrumbs":3,"title":2},"121":{"body":22,"breadcrumbs":2,"title":1},"122":{"body":22,"breadcrumbs":2,"title":1},"123":{"body":26,"breadcrumbs":3,"title":2},"124":{"body":44,"breadcrumbs":3,"title":2},"125":{"body":37,"breadcrumbs":2,"title":1},"126":{"body":5,"breadcrumbs":3,"title":2},"127":{"body":11,"breadcrumbs":6,"title":5},"128":{"body":6,"breadcrumbs":5,"title":4},"129":{"body":13,"breadcrumbs":5,"title":4},"13":{"body":6,"breadcrumbs":3,"title":2},"130":{"body":34,"breadcrumbs":2,"title":1},"131":{"body":7,"breadcrumbs":4,"title":2},"132":{"body":0,"breadcrumbs":4,"title":2},"133":{"body":60,"breadcrumbs":6,"title":4},"134":{"body":55,"breadcrumbs":6,"title":4},"135":{"body":47,"breadcrumbs":7,"title":5},"136":{"body":59,"breadcrumbs":6,"title":4},"137":{"body":70,"breadcrumbs":7,"title":5},"138":{"body":51,"breadcrumbs":6,"title":4},"139":{"body":54,"breadcrumbs":7,"title":5},"14":{"body":4,"breadcrumbs":3,"title":2},"140":{"body":72,"breadcrumbs":8,"title":6},"141":{"body":59,"breadcrumbs":5,"title":3},"142":{"body":71,"breadcrumbs":5,"title":3},"143":{"body":68,"breadcrumbs":7,"title":5},"144":{"body":40,"breadcrumbs":5,"title":3},"145":{"body":0,"breadcrumbs":5,"title":3},"146":{"body":10,"breadcrumbs":5,"title":3},"147":{"body":15,"breadcrumbs":6,"title":4},"148":{"body":3,"breadcrumbs":5,"title":3},"149":{"body":19,"breadcrumbs":5,"title":3},"15":{"body":9,"breadcrumbs":5,"title":4},"150":{"body":12,"breadcrumbs":5,"title":3},"151":{"body":42,"breadcrumbs":3,"title":1},"152":{"body":0,"breadcrumbs":4,"title":2},"153":{"body":20,"breadcrumbs":3,"title":1},"154":{"body":9,"breadcrumbs":3,"title":1},"155":{"body":12,"breadcrumbs":3,"title":1},"156":{"body":27,"breadcrumbs":4,"title":2},"157":{"body":51,"breadcrumbs":3,"title":1},"158":{"body":12,"breadcrumbs":4,"title":2},"159":{"body":6,"breadcrumbs":2,"title":1},"16":{"body":9,"breadcrumbs":4,"title":3},"160":{"body":0,"breadcrumbs":2,"title":1},"161":{"body":19,"breadcrumbs":2,"title":1},"162":{"body":19,"breadcrumbs":2,"title":1},"163":{"body":0,"breadcrumbs":3,"title":2},"164":{"body":28,"breadcrumbs":6,"title":5},"165":{"body":29,"breadcrumbs":6,"title":5},"166":{"body":21,"breadcrumbs":5,"title":4},"167":{"body":39,"breadcrumbs":3,"title":2},"168":{"body":0,"breadcrumbs":3,"title":2},"169":{"body":29,"breadcrumbs":5,"title":4},"17":{"body":13,"breadcrumbs":4,"title":3},"170":{"body":27,"breadcrumbs":6,"title":5},"171":{"body":36,"breadcrumbs":8,"title":7},"172":{"body":0,"breadcrumbs":3,"title":2},"173":{"body":16,"breadcrumbs":3,"title":2},"174":{"body":17,"breadcrumbs":4,"title":3},"175":{"body":20,"breadcrumbs":3,"title":2},"176":{"body":3,"breadcrumbs":4,"title":3},"177":{"body":24,"breadcrumbs":4,"title":3},"178":{"body":20,"breadcrumbs":4,"title":3},"179":{"body":24,"breadcrumbs":3,"title":2},"18":{"body":10,"breadcrumbs":4,"title":3},"180":{"body":0,"breadcrumbs":5,"title":4},"181":{"body":14,"breadcrumbs":3,"title":2},"182":{"body":33,"breadcrumbs":6,"title":5},"183":{"body":5,"breadcrumbs":4,"title":3},"184":{"body":6,"breadcrumbs":5,"title":4},"185":{"body":12,"breadcrumbs":5,"title":4},"186":{"body":6,"breadcrumbs":4,"title":3},"187":{"body":0,"breadcrumbs":2,"title":1},"188":{"body":17,"breadcrumbs":3,"title":2},"189":{"body":12,"breadcrumbs":3,"title":2},"19":{"body":10,"breadcrumbs":4,"title":3},"190":{"body":18,"breadcrumbs":4,"title":3},"191":{"body":14,"breadcrumbs":4,"title":3},"192":{"body":16,"breadcrumbs":3,"title":2},"193":{"body":22,"breadcrumbs":2,"title":1},"194":{"body":5,"breadcrumbs":5,"title":3},"195":{"body":16,"breadcrumbs":3,"title":1},"196":{"body":32,"breadcrumbs":7,"title":5},"197":{"body":29,"breadcrumbs":7,"title":5},"198":{"body":28,"breadcrumbs":7,"title":5},"199":{"body":39,"breadcrumbs":7,"title":5},"2":{"body":26,"breadcrumbs":7,"title":6},"20":{"body":12,"breadcrumbs":4,"title":3},"200":{"body":39,"breadcrumbs":7,"title":5},"201":{"body":15,"breadcrumbs":7,"title":5},"202":{"body":56,"breadcrumbs":7,"title":5},"203":{"body":25,"breadcrumbs":8,"title":6},"204":{"body":19,"breadcrumbs":7,"title":5},"205":{"body":20,"breadcrumbs":9,"title":7},"206":{"body":0,"breadcrumbs":4,"title":2},"207":{"body":13,"breadcrumbs":5,"title":3},"208":{"body":14,"breadcrumbs":5,"title":3},"209":{"body":17,"breadcrumbs":5,"title":3},"21":{"body":8,"breadcrumbs":5,"title":4},"210":{"body":15,"breadcrumbs":5,"title":3},"211":{"body":0,"breadcrumbs":4,"title":2},"212":{"body":21,"breadcrumbs":4,"title":2},"213":{"body":44,"breadcrumbs":6,"title":4},"214":{"body":20,"breadcrumbs":5,"title":3},"215":{"body":22,"breadcrumbs":4,"title":2},"216":{"body":0,"breadcrumbs":4,"title":2},"217":{"body":14,"breadcrumbs":4,"title":2},"218":{"body":8,"breadcrumbs":4,"title":2},"219":{"body":13,"breadcrumbs":4,"title":2},"22":{"body":9,"breadcrumbs":4,"title":3},"220":{"body":16,"breadcrumbs":4,"title":2},"221":{"body":0,"breadcrumbs":3,"title":1},"222":{"body":14,"breadcrumbs":5,"title":3},"223":{"body":12,"breadcrumbs":4,"title":2},"224":{"body":12,"breadcrumbs":5,"title":3},"225":{"body":19,"breadcrumbs":4,"title":2},"226":{"body":28,"breadcrumbs":4,"title":2},"227":{"body":0,"breadcrumbs":4,"title":2},"228":{"body":9,"breadcrumbs":4,"title":2},"229":{"body":0,"breadcrumbs":9,"title":7},"23":{"body":8,"breadcrumbs":5,"title":4},"230":{"body":20,"breadcrumbs":3,"title":1},"231":{"body":119,"breadcrumbs":4,"title":2},"232":{"body":0,"breadcrumbs":9,"title":7},"233":{"body":13,"breadcrumbs":3,"title":1},"234":{"body":109,"breadcrumbs":4,"title":2},"235":{"body":0,"breadcrumbs":7,"title":5},"236":{"body":17,"breadcrumbs":3,"title":1},"237":{"body":73,"breadcrumbs":4,"title":2},"238":{"body":222,"breadcrumbs":3,"title":1},"239":{"body":0,"breadcrumbs":8,"title":6},"24":{"body":9,"breadcrumbs":5,"title":4},"240":{"body":15,"breadcrumbs":3,"title":1},"241":{"body":141,"breadcrumbs":4,"title":2},"242":{"body":0,"breadcrumbs":8,"title":6},"243":{"body":21,"breadcrumbs":3,"title":1},"244":{"body":121,"breadcrumbs":4,"title":2},"245":{"body":0,"breadcrumbs":7,"title":5},"246":{"body":16,"breadcrumbs":3,"title":1},"247":{"body":114,"breadcrumbs":4,"title":2},"248":{"body":0,"breadcrumbs":8,"title":6},"249":{"body":18,"breadcrumbs":3,"title":1},"25":{"body":10,"breadcrumbs":5,"title":4},"250":{"body":155,"breadcrumbs":4,"title":2},"251":{"body":59,"breadcrumbs":3,"title":1},"252":{"body":14,"breadcrumbs":4,"title":2},"253":{"body":0,"breadcrumbs":4,"title":2},"254":{"body":4,"breadcrumbs":4,"title":2},"255":{"body":41,"breadcrumbs":5,"title":3},"256":{"body":0,"breadcrumbs":4,"title":2},"257":{"body":79,"breadcrumbs":7,"title":5},"258":{"body":64,"breadcrumbs":6,"title":4},"259":{"body":44,"breadcrumbs":4,"title":2},"26":{"body":8,"breadcrumbs":4,"title":3},"260":{"body":0,"breadcrumbs":6,"title":4},"261":{"body":70,"breadcrumbs":3,"title":1},"262":{"body":41,"breadcrumbs":4,"title":2},"263":{"body":29,"breadcrumbs":5,"title":3},"264":{"body":57,"breadcrumbs":3,"title":1},"265":{"body":0,"breadcrumbs":4,"title":2},"266":{"body":17,"breadcrumbs":4,"title":2},"267":{"body":40,"breadcrumbs":4,"title":2},"268":{"body":0,"breadcrumbs":4,"title":2},"269":{"body":44,"breadcrumbs":4,"title":2},"27":{"body":36,"breadcrumbs":3,"title":2},"270":{"body":36,"breadcrumbs":4,"title":2},"271":{"body":0,"breadcrumbs":4,"title":2},"272":{"body":8,"breadcrumbs":4,"title":2},"273":{"body":19,"breadcrumbs":4,"title":2},"274":{"body":14,"breadcrumbs":5,"title":3},"275":{"body":22,"breadcrumbs":5,"title":3},"276":{"body":29,"breadcrumbs":4,"title":2},"277":{"body":32,"breadcrumbs":4,"title":2},"278":{"body":32,"breadcrumbs":4,"title":2},"279":{"body":40,"breadcrumbs":4,"title":2},"28":{"body":30,"breadcrumbs":3,"title":2},"280":{"body":28,"breadcrumbs":3,"title":1},"281":{"body":36,"breadcrumbs":3,"title":1},"282":{"body":16,"breadcrumbs":4,"title":2},"283":{"body":0,"breadcrumbs":4,"title":2},"284":{"body":13,"breadcrumbs":6,"title":3},"285":{"body":74,"breadcrumbs":4,"title":1},"286":{"body":9,"breadcrumbs":6,"title":3},"287":{"body":51,"breadcrumbs":7,"title":4},"288":{"body":40,"breadcrumbs":6,"title":3},"289":{"body":95,"breadcrumbs":7,"title":4},"29":{"body":0,"breadcrumbs":3,"title":2},"290":{"body":43,"breadcrumbs":7,"title":4},"291":{"body":70,"breadcrumbs":5,"title":2},"292":{"body":44,"breadcrumbs":5,"title":2},"293":{"body":85,"breadcrumbs":5,"title":2},"294":{"body":3,"breadcrumbs":5,"title":2},"295":{"body":37,"breadcrumbs":7,"title":4},"296":{"body":30,"breadcrumbs":7,"title":4},"297":{"body":0,"breadcrumbs":7,"title":4},"298":{"body":23,"breadcrumbs":6,"title":3},"299":{"body":40,"breadcrumbs":6,"title":3},"3":{"body":13,"breadcrumbs":6,"title":5},"30":{"body":12,"breadcrumbs":3,"title":2},"300":{"body":26,"breadcrumbs":6,"title":3},"301":{"body":22,"breadcrumbs":7,"title":4},"302":{"body":31,"breadcrumbs":5,"title":2},"303":{"body":57,"breadcrumbs":5,"title":2},"304":{"body":91,"breadcrumbs":5,"title":2},"305":{"body":0,"breadcrumbs":5,"title":2},"306":{"body":14,"breadcrumbs":6,"title":3},"307":{"body":40,"breadcrumbs":8,"title":5},"308":{"body":19,"breadcrumbs":7,"title":4},"309":{"body":8,"breadcrumbs":6,"title":3},"31":{"body":11,"breadcrumbs":4,"title":3},"310":{"body":8,"breadcrumbs":6,"title":3},"311":{"body":17,"breadcrumbs":4,"title":1},"312":{"body":0,"breadcrumbs":4,"title":2},"313":{"body":0,"breadcrumbs":8,"title":5},"314":{"body":81,"breadcrumbs":5,"title":2},"315":{"body":0,"breadcrumbs":5,"title":2},"316":{"body":31,"breadcrumbs":6,"title":3},"317":{"body":26,"breadcrumbs":7,"title":4},"318":{"body":19,"breadcrumbs":6,"title":3},"319":{"body":18,"breadcrumbs":6,"title":3},"32":{"body":10,"breadcrumbs":4,"title":3},"320":{"body":0,"breadcrumbs":5,"title":2},"321":{"body":109,"breadcrumbs":9,"title":6},"322":{"body":55,"breadcrumbs":7,"title":4},"323":{"body":145,"breadcrumbs":8,"title":5},"324":{"body":912,"breadcrumbs":5,"title":2},"325":{"body":68,"breadcrumbs":6,"title":3},"326":{"body":41,"breadcrumbs":6,"title":3},"327":{"body":61,"breadcrumbs":4,"title":1},"328":{"body":50,"breadcrumbs":5,"title":2},"329":{"body":82,"breadcrumbs":5,"title":2},"33":{"body":0,"breadcrumbs":3,"title":2},"330":{"body":86,"breadcrumbs":4,"title":1},"331":{"body":15,"breadcrumbs":12,"title":6},"332":{"body":45,"breadcrumbs":7,"title":1},"333":{"body":101,"breadcrumbs":12,"title":6},"334":{"body":114,"breadcrumbs":12,"title":6},"335":{"body":85,"breadcrumbs":7,"title":1},"336":{"body":0,"breadcrumbs":7,"title":1},"337":{"body":98,"breadcrumbs":7,"title":1},"338":{"body":67,"breadcrumbs":7,"title":1},"339":{"body":23,"breadcrumbs":7,"title":1},"34":{"body":8,"breadcrumbs":4,"title":3},"340":{"body":0,"breadcrumbs":8,"title":2},"341":{"body":17,"breadcrumbs":8,"title":2},"342":{"body":16,"breadcrumbs":7,"title":1},"343":{"body":16,"breadcrumbs":7,"title":1},"344":{"body":14,"breadcrumbs":10,"title":4},"345":{"body":32,"breadcrumbs":8,"title":2},"346":{"body":37,"breadcrumbs":7,"title":1},"347":{"body":12,"breadcrumbs":7,"title":1},"348":{"body":18,"breadcrumbs":8,"title":2},"349":{"body":14,"breadcrumbs":13,"title":7},"35":{"body":6,"breadcrumbs":3,"title":2},"350":{"body":64,"breadcrumbs":7,"title":1},"351":{"body":53,"breadcrumbs":11,"title":5},"352":{"body":50,"breadcrumbs":14,"title":8},"353":{"body":50,"breadcrumbs":16,"title":10},"354":{"body":215,"breadcrumbs":7,"title":1},"355":{"body":0,"breadcrumbs":7,"title":1},"356":{"body":88,"breadcrumbs":7,"title":1},"357":{"body":67,"breadcrumbs":7,"title":1},"358":{"body":18,"breadcrumbs":7,"title":1},"359":{"body":56,"breadcrumbs":8,"title":2},"36":{"body":58,"breadcrumbs":3,"title":2},"360":{"body":35,"breadcrumbs":8,"title":2},"361":{"body":48,"breadcrumbs":7,"title":1},"362":{"body":12,"breadcrumbs":7,"title":1},"363":{"body":24,"breadcrumbs":8,"title":2},"364":{"body":15,"breadcrumbs":10,"title":5},"365":{"body":70,"breadcrumbs":6,"title":1},"366":{"body":40,"breadcrumbs":8,"title":3},"367":{"body":39,"breadcrumbs":9,"title":4},"368":{"body":47,"breadcrumbs":10,"title":5},"369":{"body":94,"breadcrumbs":6,"title":1},"37":{"body":0,"breadcrumbs":2,"title":1},"370":{"body":0,"breadcrumbs":6,"title":1},"371":{"body":101,"breadcrumbs":6,"title":1},"372":{"body":69,"breadcrumbs":6,"title":1},"373":{"body":39,"breadcrumbs":6,"title":1},"374":{"body":0,"breadcrumbs":7,"title":2},"375":{"body":15,"breadcrumbs":9,"title":4},"376":{"body":27,"breadcrumbs":8,"title":3},"377":{"body":38,"breadcrumbs":7,"title":2},"378":{"body":0,"breadcrumbs":7,"title":2},"379":{"body":22,"breadcrumbs":7,"title":2},"38":{"body":12,"breadcrumbs":4,"title":3},"380":{"body":24,"breadcrumbs":7,"title":2},"381":{"body":31,"breadcrumbs":7,"title":2},"382":{"body":0,"breadcrumbs":7,"title":2},"383":{"body":16,"breadcrumbs":9,"title":4},"384":{"body":12,"breadcrumbs":8,"title":3},"385":{"body":16,"breadcrumbs":7,"title":2},"386":{"body":0,"breadcrumbs":7,"title":2},"387":{"body":7,"breadcrumbs":9,"title":4},"388":{"body":11,"breadcrumbs":9,"title":4},"389":{"body":7,"breadcrumbs":9,"title":4},"39":{"body":18,"breadcrumbs":4,"title":3},"390":{"body":6,"breadcrumbs":10,"title":5},"391":{"body":38,"breadcrumbs":6,"title":1},"392":{"body":9,"breadcrumbs":6,"title":1},"393":{"body":24,"breadcrumbs":7,"title":2},"394":{"body":0,"breadcrumbs":10,"title":5},"395":{"body":3,"breadcrumbs":6,"title":1},"396":{"body":62,"breadcrumbs":6,"title":1},"397":{"body":6,"breadcrumbs":6,"title":1},"398":{"body":52,"breadcrumbs":10,"title":5},"399":{"body":17,"breadcrumbs":9,"title":4},"4":{"body":26,"breadcrumbs":7,"title":6},"40":{"body":16,"breadcrumbs":3,"title":2},"400":{"body":9,"breadcrumbs":8,"title":3},"401":{"body":44,"breadcrumbs":8,"title":3},"402":{"body":12,"breadcrumbs":8,"title":3},"403":{"body":0,"breadcrumbs":6,"title":1},"404":{"body":44,"breadcrumbs":6,"title":1},"405":{"body":29,"breadcrumbs":6,"title":1},"406":{"body":17,"breadcrumbs":6,"title":1},"407":{"body":99,"breadcrumbs":7,"title":2},"408":{"body":0,"breadcrumbs":7,"title":2},"409":{"body":14,"breadcrumbs":11,"title":6},"41":{"body":0,"breadcrumbs":2,"title":1},"410":{"body":15,"breadcrumbs":9,"title":4},"411":{"body":12,"breadcrumbs":9,"title":4},"412":{"body":8,"breadcrumbs":6,"title":1},"413":{"body":50,"breadcrumbs":6,"title":1},"414":{"body":0,"breadcrumbs":12,"title":6},"415":{"body":0,"breadcrumbs":2,"title":1},"416":{"body":0,"breadcrumbs":4,"title":2},"417":{"body":0,"breadcrumbs":4,"title":2},"418":{"body":0,"breadcrumbs":4,"title":2},"419":{"body":0,"breadcrumbs":2,"title":1},"42":{"body":9,"breadcrumbs":4,"title":3},"420":{"body":0,"breadcrumbs":4,"title":2},"421":{"body":0,"breadcrumbs":4,"title":2},"422":{"body":0,"breadcrumbs":4,"title":2},"423":{"body":0,"breadcrumbs":2,"title":1},"424":{"body":0,"breadcrumbs":2,"title":1},"425":{"body":0,"breadcrumbs":4,"title":2},"426":{"body":0,"breadcrumbs":4,"title":2},"427":{"body":0,"breadcrumbs":4,"title":2},"428":{"body":0,"breadcrumbs":4,"title":2},"429":{"body":0,"breadcrumbs":4,"title":2},"43":{"body":9,"breadcrumbs":5,"title":4},"430":{"body":0,"breadcrumbs":4,"title":2},"431":{"body":0,"breadcrumbs":4,"title":2},"432":{"body":0,"breadcrumbs":4,"title":2},"433":{"body":0,"breadcrumbs":4,"title":2},"434":{"body":0,"breadcrumbs":4,"title":2},"435":{"body":0,"breadcrumbs":4,"title":2},"436":{"body":0,"breadcrumbs":4,"title":2},"437":{"body":0,"breadcrumbs":4,"title":2},"438":{"body":0,"breadcrumbs":4,"title":2},"439":{"body":0,"breadcrumbs":4,"title":2},"44":{"body":11,"breadcrumbs":5,"title":4},"440":{"body":0,"breadcrumbs":2,"title":1},"441":{"body":0,"breadcrumbs":4,"title":2},"442":{"body":0,"breadcrumbs":4,"title":2},"443":{"body":0,"breadcrumbs":2,"title":1},"444":{"body":0,"breadcrumbs":4,"title":2},"445":{"body":12,"breadcrumbs":6,"title":3},"446":{"body":26,"breadcrumbs":4,"title":1},"447":{"body":0,"breadcrumbs":7,"title":4},"448":{"body":16,"breadcrumbs":8,"title":5},"449":{"body":20,"breadcrumbs":8,"title":5},"45":{"body":9,"breadcrumbs":2,"title":1},"450":{"body":9,"breadcrumbs":7,"title":4},"451":{"body":9,"breadcrumbs":8,"title":5},"452":{"body":13,"breadcrumbs":7,"title":4},"453":{"body":0,"breadcrumbs":5,"title":2},"454":{"body":19,"breadcrumbs":6,"title":3},"455":{"body":25,"breadcrumbs":5,"title":2},"456":{"body":33,"breadcrumbs":5,"title":2},"457":{"body":16,"breadcrumbs":4,"title":1},"458":{"body":23,"breadcrumbs":5,"title":2},"459":{"body":0,"breadcrumbs":5,"title":2},"46":{"body":33,"breadcrumbs":3,"title":2},"460":{"body":57,"breadcrumbs":6,"title":3},"461":{"body":86,"breadcrumbs":6,"title":3},"462":{"body":41,"breadcrumbs":5,"title":2},"463":{"body":84,"breadcrumbs":6,"title":3},"464":{"body":0,"breadcrumbs":5,"title":2},"465":{"body":46,"breadcrumbs":5,"title":2},"466":{"body":55,"breadcrumbs":6,"title":3},"467":{"body":33,"breadcrumbs":5,"title":2},"468":{"body":0,"breadcrumbs":5,"title":2},"469":{"body":16,"breadcrumbs":7,"title":4},"47":{"body":21,"breadcrumbs":2,"title":1},"470":{"body":16,"breadcrumbs":6,"title":3},"471":{"body":11,"breadcrumbs":6,"title":3},"472":{"body":5,"breadcrumbs":6,"title":3},"473":{"body":16,"breadcrumbs":7,"title":4},"474":{"body":0,"breadcrumbs":4,"title":1},"475":{"body":14,"breadcrumbs":6,"title":3},"476":{"body":12,"breadcrumbs":6,"title":3},"477":{"body":12,"breadcrumbs":5,"title":2},"478":{"body":16,"breadcrumbs":6,"title":3},"479":{"body":23,"breadcrumbs":5,"title":2},"48":{"body":25,"breadcrumbs":2,"title":1},"480":{"body":57,"breadcrumbs":6,"title":3},"481":{"body":0,"breadcrumbs":6,"title":3},"482":{"body":0,"breadcrumbs":4,"title":2},"483":{"body":0,"breadcrumbs":4,"title":2},"484":{"body":0,"breadcrumbs":4,"title":2},"485":{"body":0,"breadcrumbs":4,"title":2},"486":{"body":9,"breadcrumbs":6,"title":4},"487":{"body":39,"breadcrumbs":3,"title":1},"488":{"body":0,"breadcrumbs":4,"title":2},"489":{"body":11,"breadcrumbs":5,"title":3},"49":{"body":35,"breadcrumbs":2,"title":1},"490":{"body":13,"breadcrumbs":5,"title":3},"491":{"body":0,"breadcrumbs":3,"title":1},"492":{"body":156,"breadcrumbs":3,"title":1},"493":{"body":116,"breadcrumbs":3,"title":1},"494":{"body":139,"breadcrumbs":3,"title":1},"495":{"body":117,"breadcrumbs":3,"title":1},"496":{"body":129,"breadcrumbs":3,"title":1},"497":{"body":54,"breadcrumbs":3,"title":1},"498":{"body":104,"breadcrumbs":3,"title":1},"499":{"body":9,"breadcrumbs":4,"title":2},"5":{"body":10,"breadcrumbs":3,"title":2},"50":{"body":0,"breadcrumbs":3,"title":2},"500":{"body":149,"breadcrumbs":3,"title":1},"501":{"body":84,"breadcrumbs":3,"title":1},"502":{"body":121,"breadcrumbs":3,"title":1},"503":{"body":9,"breadcrumbs":3,"title":1},"504":{"body":19,"breadcrumbs":3,"title":1},"505":{"body":8,"breadcrumbs":3,"title":1},"506":{"body":8,"breadcrumbs":3,"title":1},"507":{"body":7,"breadcrumbs":3,"title":1},"508":{"body":8,"breadcrumbs":3,"title":1},"509":{"body":8,"breadcrumbs":3,"title":1},"51":{"body":24,"breadcrumbs":3,"title":2},"510":{"body":6,"breadcrumbs":3,"title":1},"511":{"body":44,"breadcrumbs":3,"title":1},"512":{"body":52,"breadcrumbs":3,"title":1},"513":{"body":0,"breadcrumbs":4,"title":2},"514":{"body":37,"breadcrumbs":4,"title":2},"515":{"body":18,"breadcrumbs":5,"title":3},"516":{"body":0,"breadcrumbs":4,"title":2},"517":{"body":12,"breadcrumbs":7,"title":5},"518":{"body":11,"breadcrumbs":6,"title":4},"519":{"body":7,"breadcrumbs":7,"title":5},"52":{"body":35,"breadcrumbs":3,"title":2},"520":{"body":15,"breadcrumbs":6,"title":4},"521":{"body":11,"breadcrumbs":3,"title":1},"522":{"body":0,"breadcrumbs":2,"title":1},"523":{"body":0,"breadcrumbs":4,"title":2},"524":{"body":0,"breadcrumbs":4,"title":2},"525":{"body":0,"breadcrumbs":4,"title":2},"526":{"body":0,"breadcrumbs":2,"title":1},"53":{"body":28,"breadcrumbs":3,"title":2},"54":{"body":0,"breadcrumbs":3,"title":2},"55":{"body":49,"breadcrumbs":2,"title":1},"56":{"body":34,"breadcrumbs":2,"title":1},"57":{"body":40,"breadcrumbs":4,"title":3},"58":{"body":0,"breadcrumbs":3,"title":2},"59":{"body":19,"breadcrumbs":2,"title":1},"6":{"body":14,"breadcrumbs":3,"title":2},"60":{"body":17,"breadcrumbs":2,"title":1},"61":{"body":18,"breadcrumbs":3,"title":2},"62":{"body":0,"breadcrumbs":3,"title":2},"63":{"body":49,"breadcrumbs":3,"title":2},"64":{"body":44,"breadcrumbs":3,"title":2},"65":{"body":33,"breadcrumbs":3,"title":2},"66":{"body":43,"breadcrumbs":3,"title":2},"67":{"body":38,"breadcrumbs":3,"title":2},"68":{"body":22,"breadcrumbs":3,"title":2},"69":{"body":5,"breadcrumbs":4,"title":2},"7":{"body":10,"breadcrumbs":2,"title":1},"70":{"body":38,"breadcrumbs":4,"title":2},"71":{"body":0,"breadcrumbs":4,"title":2},"72":{"body":41,"breadcrumbs":4,"title":2},"73":{"body":72,"breadcrumbs":5,"title":3},"74":{"body":56,"breadcrumbs":4,"title":2},"75":{"body":62,"breadcrumbs":4,"title":2},"76":{"body":51,"breadcrumbs":4,"title":2},"77":{"body":37,"breadcrumbs":4,"title":2},"78":{"body":0,"breadcrumbs":4,"title":2},"79":{"body":19,"breadcrumbs":4,"title":2},"8":{"body":4,"breadcrumbs":2,"title":1},"80":{"body":23,"breadcrumbs":4,"title":2},"81":{"body":18,"breadcrumbs":4,"title":2},"82":{"body":18,"breadcrumbs":4,"title":2},"83":{"body":19,"breadcrumbs":4,"title":2},"84":{"body":17,"breadcrumbs":4,"title":2},"85":{"body":5,"breadcrumbs":5,"title":3},"86":{"body":23,"breadcrumbs":6,"title":4},"87":{"body":24,"breadcrumbs":6,"title":4},"88":{"body":35,"breadcrumbs":4,"title":2},"89":{"body":33,"breadcrumbs":5,"title":3},"9":{"body":1,"breadcrumbs":4,"title":3},"90":{"body":74,"breadcrumbs":4,"title":2},"91":{"body":28,"breadcrumbs":3,"title":1},"92":{"body":34,"breadcrumbs":4,"title":2},"93":{"body":36,"breadcrumbs":5,"title":3},"94":{"body":11,"breadcrumbs":5,"title":3},"95":{"body":25,"breadcrumbs":3,"title":1},"96":{"body":91,"breadcrumbs":4,"title":2},"97":{"body":29,"breadcrumbs":3,"title":1},"98":{"body":82,"breadcrumbs":4,"title":2},"99":{"body":36,"breadcrumbs":6,"title":4}},"docs":{"0":{"body":"Welcome to the KOGRAL documentation! This directory contains comprehensive documentation for KOGRAL ( KO wledge GRA phs, L ocal-first), built with mdBook .","breadcrumbs":"Introduction » KOGRAL Documentation","id":"0","title":"KOGRAL Documentation"},"1":{"body":"You have several options for reading the documentation:","breadcrumbs":"Introduction » 📚 Reading the Documentation","id":"1","title":"📚 Reading the Documentation"},"10":{"body":"mdBook is required to build and serve the documentation.","breadcrumbs":"Introduction » 📦 Installing mdBook","id":"10","title":"📦 Installing mdBook"},"100":{"body":"Hybrid Model : Content stored as markdown string (source of truth) Blocks lazily parsed on first access Cached block structure for fast queries Bidirectional: markdown ↔ blocks BlockParser : Parse outliner markdown → Block structures Serialize Block structures → outliner markdown Preserve all metadata (tags, status, properties, references) Round-trip fidelity for Logseq compatibility Storage : Filesystem: markdown with blocks inline SurrealDB: dedicated block table with indexes Indexes: tags, status, parent_id, full-text search See Also : ADR-004: Logseq Blocks Support Logseq Blocks Design MCP Block Tools","breadcrumbs":"Core Concepts » Architecture","id":"100","title":"Architecture"},"101":{"body":"Capture During Work : Don\'t wait, document as you go Link as You Learn : Connect related concepts immediately Query When Needed : AI-assisted discovery of relevant knowledge Evolve Over Time : Update decisions, supersede patterns Share Wisely : Shared guidelines, local specifics","breadcrumbs":"Core Concepts » Key Principles","id":"101","title":"Key Principles"},"102":{"body":"Understand motivation : Why KOGRAL? Learn philosophy : Design Philosophy See architecture : System Overview Start using : Quick Start","breadcrumbs":"Core Concepts » Next Steps","id":"102","title":"Next Steps"},"103":{"body":"Understanding the motivation behind the Knowledge Base system.","breadcrumbs":"Why KOGRAL? » Why KB?","id":"103","title":"Why KB?"},"104":{"body":"Modern software development generates enormous amounts of knowledge: 📝 Notes : Implementation details, learnings, discoveries 🤔 Decisions : Why we chose X over Y 📚 Guidelines : How we write code, architecture patterns 🔄 Patterns : Reusable solutions we\'ve discovered 💭 Discussions : Slack threads, meeting notes, PR comments 🐛 Bug Fixes : How we solved issues But where does this knowledge live? Meeting notes in Google Docs Decisions buried in Slack threads Guidelines in a wiki nobody updates Patterns in someone\'s head PR discussions lost in GitHub history Bug solutions in closed Jira tickets The result? ❌ Rediscovering solutions to problems we\'ve already solved ❌ Inconsistent practices because guidelines aren\'t accessible ❌ Slow onboarding as new developers lack context ❌ Lost context when team members leave ❌ Repeated mistakes because past lessons aren\'t preserved","breadcrumbs":"Why KOGRAL? » The Problem: Knowledge Fragmentation","id":"104","title":"The Problem: Knowledge Fragmentation"},"105":{"body":"Knowledge Base provides a single source of truth for project knowledge: ✅ Capture once : Notes, decisions, guidelines, patterns ✅ Connect concepts : Typed relationships between ideas ✅ Query naturally : Text and semantic search ✅ AI-assisted : Claude Code integration via MCP ✅ Git-tracked : Version control for knowledge ✅ Shared wisdom : Organization-wide guidelines + project-specific","breadcrumbs":"Why KOGRAL? » The Solution: Unified, Queryable Knowledge Graph","id":"105","title":"The Solution: Unified, Queryable Knowledge Graph"},"106":{"body":"","breadcrumbs":"Why KOGRAL? » What Makes KB Different?","id":"106","title":"What Makes KB Different?"},"107":{"body":"Other tools : Notion, Confluence, wikis in web apps KB : Markdown files in .kogral/ directory Benefits : # Review knowledge changes in PRs\\ngit diff .kogral/decisions/ # Branch knowledge with code\\ngit checkout feature-branch\\n# .kogral/ follows the branch # Merge knowledge from feature work\\ngit merge feature-branch\\n# Knowledge merges like code Result : Knowledge versioned alongside code it describes.","breadcrumbs":"Why KOGRAL? » 1. Git-Native","id":"107","title":"1. Git-Native"},"108":{"body":"Other tools : Manual search, browse folders KB : AI queries via Claude Code Example : You: \\"Find anything about error handling\\" Claude: [Searches semantically, not just keywords]\\nFound 5 concepts:\\n- Pattern: Error Handling with thiserror\\n- Guideline: Result Type Best Practices\\n- Decision: Use anyhow for Application Errors\\n- Note: Custom Error Types\\n- Journal: Fixed error propagation bug [All related, even without exact keyword match] Result : Find concepts, not just documents with keywords.","breadcrumbs":"Why KOGRAL? » 2. AI-Native","id":"108","title":"2. AI-Native"},"109":{"body":"Other tools : Hardcoded behavior, limited customization KB : Nickel schemas define everything Example : # Development: local embeddings, no costs\\n{ embeddings = { provider = \'fastembed } } # Production: cloud embeddings, best quality\\n{ embeddings = { provider = \'openai, model = \\"text-embedding-3-large\\" } } Result : Adapt behavior without code changes.","breadcrumbs":"Why KOGRAL? » 3. Config-Driven","id":"109","title":"3. Config-Driven"},"11":{"body":"cargo install mdbook","breadcrumbs":"Introduction » Install via Cargo","id":"11","title":"Install via Cargo"},"110":{"body":"Other tools : One knowledge base per project KB : Shared organizational knowledge + project-specific Structure : Organization Shared KB ├── Rust Guidelines (applies to all projects) ├── Security Patterns (applies to all projects) └── Testing Standards (applies to all projects) Project A KB ├── Inherits shared guidelines ├── Project-specific decisions └── Can override shared guidelines Project B KB ├── Inherits same shared guidelines ├── Different project decisions └── Different overrides Result : Consistency across organization, flexibility per project.","breadcrumbs":"Why KOGRAL? » 4. Multi-Graph","id":"110","title":"4. Multi-Graph"},"111":{"body":"Other tools : Backlinks, tags, folders KB : Typed relationships with meaning Example : Pattern: Repository Pattern ↑ [implements]\\nNote: User Service Implementation ↑ [relates_to]\\nDecision: Use PostgreSQL ↑ [depends_on]\\nGuideline: Database Access Patterns Result : Understand how knowledge connects, not just that it connects.","breadcrumbs":"Why KOGRAL? » 5. Structured Relationships","id":"111","title":"5. Structured Relationships"},"112":{"body":"","breadcrumbs":"Why KOGRAL? » Real-World Impact","id":"112","title":"Real-World Impact"},"113":{"body":"New developer joins : Read outdated wiki (2 hours) Ask teammates for context (1 hour per question × 10 questions) Discover guidelines by reading code (days) Miss important decisions (leads to mistakes) Time to productivity : 2-4 weeks","breadcrumbs":"Why KOGRAL? » Before KB","id":"113","title":"Before KB"},"114":{"body":"New developer joins : kb search \\"architectural decisions\\" → finds all ADRs Ask Claude: \\"What are our coding guidelines?\\" → gets current guidelines with inheritance Browse related notes via graph traversal Full context available, no tribal knowledge Time to productivity : 3-5 days","breadcrumbs":"Why KOGRAL? » With KB","id":"114","title":"With KB"},"115":{"body":"Team makes decision : Discussion in Slack (lost after a week) Someone documents in wiki (maybe) 6 months later: \\"Why did we choose X?\\" → nobody remembers Re-debate the same decision","breadcrumbs":"Why KOGRAL? » Before KB","id":"115","title":"Before KB"},"116":{"body":"Team makes decision : Discussion captured as ADR during meeting Context, decision, consequences documented Linked to related patterns and guidelines 6 months later: kb show decision-use-x → full context instantly","breadcrumbs":"Why KOGRAL? » With KB","id":"116","title":"With KB"},"117":{"body":"Solving a bug : Encounter race condition in cache Debug for 2 hours Fix it Solution lost in PR comments Two months later : Different developer, same bug, 2 more hours","breadcrumbs":"Why KOGRAL? » Before KB","id":"117","title":"Before KB"},"118":{"body":"Solving a bug : Encounter race condition Ask Claude: \\"Have we seen cache race conditions before?\\" Claude finds journal entry from 2 months ago with solution Apply fix in 10 minutes Two months later : Same query, same instant solution","breadcrumbs":"Why KOGRAL? » With KB","id":"118","title":"With KB"},"119":{"body":"","breadcrumbs":"Why KOGRAL? » Who Benefits?","id":"119","title":"Who Benefits?"},"12":{"body":"For enhanced functionality: # Link checker (validates internal/external links)\\ncargo install mdbook-linkcheck # Mermaid diagram support\\ncargo install mdbook-mermaid # PlantUML diagram support\\ncargo install mdbook-plantuml","breadcrumbs":"Introduction » Install Optional Tools","id":"12","title":"Install Optional Tools"},"120":{"body":"✅ Personal knowledge base : Capture learnings, build expertise ✅ Quick recall : \\"How did I solve this before?\\" ✅ Context switching : Return to old projects with full context ✅ Career growth : Document what you learn, portfolio of knowledge","breadcrumbs":"Why KOGRAL? » Individual Developers","id":"120","title":"Individual Developers"},"121":{"body":"✅ Shared context : Everyone has access to team knowledge ✅ Onboarding : New members ramp up faster ✅ Consistency : Follow shared guidelines and patterns ✅ Collaboration : Build on each other\'s knowledge","breadcrumbs":"Why KOGRAL? » Teams","id":"121","title":"Teams"},"122":{"body":"✅ Institutional memory : Knowledge persists beyond individual tenure ✅ Best practices : Standardize across teams ✅ Compliance : Document security and architecture decisions ✅ Efficiency : Stop solving the same problems repeatedly","breadcrumbs":"Why KOGRAL? » Organizations","id":"122","title":"Organizations"},"123":{"body":"✅ Context injection : Agents query guidelines before generating code ✅ Decision awareness : Agents check past decisions ✅ Pattern following : Agents use documented patterns ✅ Execution tracking : Agent actions documented automatically","breadcrumbs":"Why KOGRAL? » AI Agents","id":"123","title":"AI Agents"},"124":{"body":"KB is not ideal for: ❌ Personal journaling : Use Obsidian or Logseq ❌ Team wikis : Use Notion or Confluence ❌ Customer docs : Use mdBook or Docusaurus ❌ Project management : Use Jira or Linear ❌ Code comments : Use inline documentation KB is perfect for: ✅ Developer knowledge graphs ✅ Architectural decision records ✅ Pattern libraries ✅ Coding guidelines ✅ Technical context ✅ AI-assisted development","breadcrumbs":"Why KOGRAL? » When NOT to Use KB","id":"124","title":"When NOT to Use KB"},"125":{"body":"Today\'s development : Developer → writes code → commits With KB : Developer → writes code → documents decisions → links to patterns → commits code + knowledge ↓ AI Agent queries knowledge → generates better code ↓ Team discovers patterns → reuses solutions → faster development Knowledge becomes an active participant in development , not an afterthought.","breadcrumbs":"Why KOGRAL? » The Vision","id":"125","title":"The Vision"},"126":{"body":"Three core principles drive KB:","breadcrumbs":"Why KOGRAL? » Design Philosophy","id":"126","title":"Design Philosophy"},"127":{"body":"❌ \\"I\'ll document this later\\" → never happens ✅ \\"Claude, document this decision\\" → done in 30 seconds","breadcrumbs":"Why KOGRAL? » 1. Knowledge should be captured during work, not after","id":"127","title":"1. Knowledge should be captured during work, not after"},"128":{"body":"❌ Standalone documents in folders ✅ Graph of interconnected concepts","breadcrumbs":"Why KOGRAL? » 2. Knowledge should be connected, not isolated","id":"128","title":"2. Knowledge should be connected, not isolated"},"129":{"body":"❌ \\"Let me look through 50 docs to find...\\" ✅ \\"Find anything related to error handling\\" → instant semantic results","breadcrumbs":"Why KOGRAL? » 3. Knowledge should be queryable, not browsable","id":"129","title":"3. Knowledge should be queryable, not browsable"},"13":{"body":"mdbook --version\\n# Should output: mdbook v0.4.x or later","breadcrumbs":"Introduction » Verify Installation","id":"13","title":"Verify Installation"},"130":{"body":"Ready to stop losing knowledge? Understand concepts : Core Concepts Learn philosophy : Design Philosophy Quick start : Quick Start Guide See examples : Use Cases \\"The best time to document was during implementation. The second best time is now.\\" But with KB + AI, \\"now\\" is instant.","breadcrumbs":"Why KOGRAL? » Get Started","id":"130","title":"Get Started"},"131":{"body":"The principles and values guiding Knowledge Base design and implementation.","breadcrumbs":"Design Philosophy » Design Philosophy","id":"131","title":"Design Philosophy"},"132":{"body":"","breadcrumbs":"Design Philosophy » Core Tenets","id":"132","title":"Core Tenets"},"133":{"body":"Principle : All behavior should be configurable via schemas, not baked into code. Why : Flexibility without code changes. Users adapt KB to their workflows, not vice versa. Example : // ❌ Bad: Hardcoded\\nimpl EmbeddingProvider { fn new() -> Self { FastEmbedProvider::new(\\"BAAI/bge-small-en-v1.5\\") // Can\'t change }\\n} // ✅ Good: Config-driven\\nimpl EmbeddingProvider { fn from_config(config: &EmbeddingConfig) -> Result> { match config.provider { \'fastembed => Ok(Box::new(FastEmbedProvider::new(&config.model)?)), \'openai => Ok(Box::new(OpenAIProvider::new(&config.model)?)), } }\\n} Benefits : Switch embedding providers without recompilation Different configs for dev/prod User choice, not developer mandate","breadcrumbs":"Design Philosophy » 1. Config-Driven, Not Hardcoded","id":"133","title":"1. Config-Driven, Not Hardcoded"},"134":{"body":"Principle : Validate configuration before runtime, not during. Why : Catch errors early, reduce runtime failures. Implementation : Nickel contracts + serde validation = double validation # Schema defines valid values\\nEmbeddingProvider = [| \'openai, \'claude, \'fastembed |] # Typo caught at export time, not runtime\\n{ provider = \'opena1 } # Error: Invalid variant Benefits : Errors found during nickel export, not during execution Self-documenting: schema is the spec Refactoring safe: change schema, find all usages","breadcrumbs":"Design Philosophy » 2. Type-Safe Configuration","id":"134","title":"2. Type-Safe Configuration"},"135":{"body":"Principle : Core functionality works offline, cloud is enhancement. Why : Privacy, cost control, offline development. Examples : Feature Local Cloud Storage Filesystem SurrealDB Embeddings fastembed OpenAI/Claude Search Text-based Semantic Benefits : Works on planes, trains, areas with poor internet No API costs for small projects Privacy-sensitive projects keep data local Production can use cloud for scale","breadcrumbs":"Design Philosophy » 3. Local-First, Cloud-Optional","id":"135","title":"3. Local-First, Cloud-Optional"},"136":{"body":"Principle : Knowledge should version alongside code. Why : Knowledge describes code, should evolve with it. Implementation : Markdown + YAML frontmatter (text-based, diffable) One file per node (granular commits) Wikilinks preserved (works in Logseq, Obsidian) Benefits : # Review knowledge changes in PRs\\ngit diff .kogral/decisions/ # Knowledge follows branches\\ngit checkout feature-x\\n# .kogral/ reflects feature-x decisions # Knowledge merges\\ngit merge feature-x\\n# Merge conflicts = knowledge conflicts (resolve intentionally)","breadcrumbs":"Design Philosophy » 4. Git-Friendly by Default","id":"136","title":"4. Git-Friendly by Default"},"137":{"body":"Principle : Optimized for AI consumption, readable by humans. Why : Best of both worlds - AI-assisted discovery, human verification. Implementation : Structured : YAML frontmatter for AI parsing Semantic : Embeddings for AI queries Readable : Markdown for human consumption Linked : Typed relationships for AI traversal Example : ---\\nid: note-auth\\ntype: note\\ntitle: Authentication Implementation\\ntags: [security, auth]\\nrelates_to: [guideline-security, pattern-jwt]\\n--- # Authentication Implementation Humans read this markdown normally. AI can:\\n- Parse frontmatter for metadata\\n- Extract tags for filtering\\n- Follow relates_to links\\n- Generate embeddings for semantic search","breadcrumbs":"Design Philosophy » 5. AI-Native, Human-Readable","id":"137","title":"5. AI-Native, Human-Readable"},"138":{"body":"Principle : Build systems by composing small, focused components. Why : Flexibility, testability, maintainability. Implementation : // Small, focused traits\\ntrait Storage { ... }\\ntrait EmbeddingProvider { ... }\\ntrait TemplateEngine { ... } // Compose into systems\\nstruct KnowledgeBase { storage: Box, embeddings: Option>, templates: TemplateEngine,\\n} Benefits : Swap storage without affecting embeddings Disable embeddings without breaking storage Test components in isolation Add new providers by implementing trait","breadcrumbs":"Design Philosophy » 6. Composition Over Inheritance","id":"138","title":"6. Composition Over Inheritance"},"139":{"body":"Principle : Detect errors early, provide clear messages. Why : Developer experience - fast feedback, actionable errors. Implementation : // ❌ Bad: Silent failure\\nfn load_config(path: &Path) -> Option { std::fs::read_to_string(path) .ok() .and_then(|s| serde_json::from_str(&s).ok())\\n} // ✅ Good: Explicit errors\\nfn load_config(path: &Path) -> Result { let content = std::fs::read_to_string(path) .map_err(|e| ConfigError::ReadFailed(path.to_path_buf(), e))?; serde_json::from_str(&content) .map_err(|e| ConfigError::ParseFailed(path.to_path_buf(), e))\\n} Error messages : ❌ \\"Failed to load config\\"\\n✅ \\"Failed to read config file \'/path/to/config.ncl\': Permission denied\\"","breadcrumbs":"Design Philosophy » 7. Fail Fast, Fail Clearly","id":"139","title":"7. Fail Fast, Fail Clearly"},"14":{"body":"The documentation is organized into the following sections:","breadcrumbs":"Introduction » 📖 Documentation Structure","id":"14","title":"📖 Documentation Structure"},"140":{"body":"Principle : Sane defaults, but everything customizable. Why : Easy to start, flexible as you grow. Examples : # Minimal config (uses conventions)\\n{ graph = { name = \\"my-project\\" } }\\n# Defaults: filesystem storage, no embeddings, standard templates # Full config (explicit everything)\\n{ graph = { name = \\"my-project\\" }, storage = { primary = \'surrealdb, /* ... */ }, embeddings = { provider = \'openai, /* ... */ }, templates = { templates_dir = \\"custom\\" },\\n} Conventions : .kogral/ directory in project root Filesystem storage by default YAML frontmatter + markdown body Standard template names (note.md.tera, decision.md.tera) Escape hatches : --kb-dir to use different location Configure alternative storage backends Custom frontmatter schemas Override any template","breadcrumbs":"Design Philosophy » 8. Convention Over Configuration (With Escape Hatches)","id":"140","title":"8. Convention Over Configuration (With Escape Hatches)"},"141":{"body":"Principle : Documentation lives with code, versioned together. Why : Outdated docs are worse than no docs. Implementation : ADRs in .kogral/decisions/ (alongside code) Guidelines in .kogral/guidelines/ (versioned with code) Patterns in .kogral/patterns/ (evolve with implementations) Benefits : # Code and docs branch together\\ngit checkout old-version\\n# .kogral/ reflects that version\'s decisions # Code and docs merge together\\ngit merge feature\\n# Merge includes new patterns, updated guidelines # Code and docs reviewed together\\n# PR shows code + decision + guideline updates","breadcrumbs":"Design Philosophy » 9. Documentation as Code","id":"141","title":"9. Documentation as Code"},"142":{"body":"Principle : Knowledge is useless if you can\'t find it. Why : The point is to use knowledge, not just store it. Features : Text search : Find exact keywords Semantic search : Find related concepts Graph traversal : Follow relationships Tag filtering : Narrow by category MCP integration : AI-assisted discovery Example : User doesn\'t remember exact term, but knows the concept: \\"Find anything about handling errors gracefully\\" KB finds (semantically): \\"Error Handling with thiserror\\" (pattern) \\"Result Type Best Practices\\" (guideline) \\"Panic Recovery\\" (note) \\"Graceful Degradation\\" (pattern) No exact keyword match needed, concept match sufficient.","breadcrumbs":"Design Philosophy » 10. Optimize for Discoverability","id":"142","title":"10. Optimize for Discoverability"},"143":{"body":"Principle : Humans are the primary users, AI is the assistant. Why : AI should enhance human workflows, not replace them. Implementation : Human-readable formats : Markdown, YAML Human-editable : Any text editor works Human-discoverable : ls .kogral/notes/ shows files AI-enhanced : MCP for AI-assisted queries Example : # Human workflow\\nvim .kogral/notes/my-note.md # Edit directly\\ngit add .kogral/notes/my-note.md\\ngit commit -m \\"Add note about X\\" # AI-enhanced workflow\\n# (in Claude Code)\\n\\"Add a note about X with tags Y, Z\\"\\n# AI creates file, human reviews","breadcrumbs":"Design Philosophy » 11. Build for Humans, Enable AI","id":"143","title":"11. Build for Humans, Enable AI"},"144":{"body":"Principle : Knowledge is interconnected, embrace the relationships. Why : Context comes from connections, not isolation. Implementation : Typed relationships (not just \\"related\\") Bidirectional traversal Relationship strength (0.0-1.0) Multi-hop queries Example : Find all patterns that: - Are implemented by current project - Depend on shared guidelines - Were added in the last 6 months # Graph query, not sequential file search","breadcrumbs":"Design Philosophy » 12. Embrace the Graph","id":"144","title":"12. Embrace the Graph"},"145":{"body":"","breadcrumbs":"Design Philosophy » Anti-Patterns to Avoid","id":"145","title":"Anti-Patterns to Avoid"},"146":{"body":"// Don\'t\\nconst EMBEDDING_MODEL: &str = \\"BAAI/bge-small-en-v1.5\\"; // Do\\nlet model = config.embeddings.model.as_str();","breadcrumbs":"Design Philosophy » 1. ❌ Hardcoding Behavior","id":"146","title":"1. ❌ Hardcoding Behavior"},"147":{"body":"// Don\'t validate at runtime\\nlet provider = config.provider; // Might be invalid // Do validate at export time (Nickel contracts)\\nprovider | [| \'openai, \'claude, \'fastembed |]","breadcrumbs":"Design Philosophy » 2. ❌ Runtime Schema Validation","id":"147","title":"2. ❌ Runtime Schema Validation"},"148":{"body":"// Don\'t\\nErr(\\"Failed\\".into()) // Do\\nErr(KbError::NodeNotFound(id.to_string()))","breadcrumbs":"Design Philosophy » 3. ❌ Opaque Errors","id":"148","title":"3. ❌ Opaque Errors"},"149":{"body":"// Don\'t\\nimpl KnowledgeBase { fn search(&self) -> Vec { let embeddings = FastEmbedProvider::new(); // Hardcoded! // ... }\\n} // Do\\nimpl KnowledgeBase { fn search(&self) -> Vec { if let Some(provider) = &self.embeddings { // Use configured provider } }\\n}","breadcrumbs":"Design Philosophy » 4. ❌ Coupling Components","id":"149","title":"4. ❌ Coupling Components"},"15":{"body":"What is KOGRAL and why it exists Core concepts (nodes, edges, graphs) Design philosophy","breadcrumbs":"Introduction » 1. KOGRAL Definition (kogral/)","id":"15","title":"1. KOGRAL Definition (kogral/)"},"150":{"body":"// Don\'t\\nBinary blob: [0x4B, 0x42, 0x01, ...] // Do\\nMarkdown + YAML:\\n---\\nid: note-1\\n---\\n# Content","breadcrumbs":"Design Philosophy » 5. ❌ Proprietary Formats","id":"150","title":"5. ❌ Proprietary Formats"},"151":{"body":"KB draws inspiration from: Logseq : Outliner, graph view, wikilinks Obsidian : Markdown-first, local storage, plugins Zettelkasten : Atomic notes, links, emergence ADR : Decision records, context preservation Git : Version control, branching, merging Nickel : Type-safe configuration, contracts MCP : AI integration protocol SurrealDB : Graph database, relationships","breadcrumbs":"Design Philosophy » Influences","id":"151","title":"Influences"},"152":{"body":"","breadcrumbs":"Design Philosophy » Implementation Principles","id":"152","title":"Implementation Principles"},"153":{"body":"Zero unsafe code (#![forbid(unsafe_code)]) No unwrap() in production code Always use Result for fallibility Comprehensive error types with thiserror Full test coverage (100+ tests)","breadcrumbs":"Design Philosophy » Rust","id":"153","title":"Rust"},"154":{"body":"Contracts for validation Defaults in schemas Documentation in contracts Composition via imports","breadcrumbs":"Design Philosophy » Nickel","id":"154","title":"Nickel"},"155":{"body":"Structured data pipelines Error handling in scripts Colored output for UX Dry-run modes","breadcrumbs":"Design Philosophy » NuShell","id":"155","title":"NuShell"},"156":{"body":"KB follows these guidelines for evolution: Backward Compatibility : Don\'t break existing configs Deprecation Period : Warn before removal (1 major version) Migration Tools : Provide automated migrations Semantic Versioning : MAJOR.MINOR.PATCH strictly","breadcrumbs":"Design Philosophy » Evolution Strategy","id":"156","title":"Evolution Strategy"},"157":{"body":"These principles guide every decision: ✅ Config-driven : Behavior in schemas, not code ✅ Type-safe : Validate before runtime ✅ Local-first : Works offline, cloud optional ✅ Git-friendly : Knowledge versions with code ✅ AI-native : Optimized for AI, readable by humans ✅ Composable : Small pieces, loosely coupled ✅ Fast feedback : Fail early, clear errors ✅ Discoverable : Easy to find what you need The goal: Knowledge management that developers actually use.","breadcrumbs":"Design Philosophy » Conclusion","id":"157","title":"Conclusion"},"158":{"body":"See it in action : Use Cases Understand architecture : System Overview Start using : Quick Start","breadcrumbs":"Design Philosophy » Next Steps","id":"158","title":"Next Steps"},"159":{"body":"This guide covers installing and setting up the KOGRAL.","breadcrumbs":"Installation » Installation","id":"159","title":"Installation"},"16":{"body":"Quick start (5 minutes) Installation guide Use cases with examples","breadcrumbs":"Introduction » 2. Guides (guides/)","id":"16","title":"2. Guides (guides/)"},"160":{"body":"","breadcrumbs":"Installation » Prerequisites","id":"160","title":"Prerequisites"},"161":{"body":"Rust 1.70 or later curl --proto \'=https\' --tlsv1.2 -sSf https://sh.rustup.rs | sh Nickel CLI for configuration management cargo install nickel-lang-cli","breadcrumbs":"Installation » Required","id":"161","title":"Required"},"162":{"body":"NuShell for maintenance scripts cargo install nu SurrealDB for scalable storage backend # macOS\\nbrew install surrealdb/tap/surreal # Linux/Windows\\ncurl -sSf https://install.surrealdb.com | sh","breadcrumbs":"Installation » Optional","id":"162","title":"Optional"},"163":{"body":"","breadcrumbs":"Installation » Installation Methods","id":"163","title":"Installation Methods"},"164":{"body":"# Clone the repository\\ngit clone knowledge-base\\ncd knowledge-base # Build the workspace\\ncargo build --release # Install CLI tool\\ncargo install --path crates/kb-cli # Verify installation\\nkb --version","breadcrumbs":"Installation » Method 1: Install from Source (Recommended)","id":"164","title":"Method 1: Install from Source (Recommended)"},"165":{"body":"# Build only kb-core library\\ncargo build --package kb-core --release # Build only kb-cli\\ncargo build --package kb-cli --release # Build only kogral-mcp server\\ncargo build --package kb-mcp --release","breadcrumbs":"Installation » Method 2: Build Specific Crates","id":"165","title":"Method 2: Build Specific Crates"},"166":{"body":"# Build with all features (filesystem + SurrealDB + fastembed)\\ncargo build --workspace --all-features --release # Build with specific features\\ncargo build --package kb-core --features \\"surrealdb,fastembed\\" --release","breadcrumbs":"Installation » Method 3: Build with Features","id":"166","title":"Method 3: Build with Features"},"167":{"body":"kb-core supports optional features: Feature Description Default filesystem Filesystem storage backend ✅ Yes surrealdb SurrealDB storage backend ❌ No fastembed Local embedding generation ❌ No full All features enabled ❌ No Example usage: # Enable SurrealDB backend\\ncargo build --features surrealdb # Enable all features\\ncargo build --features full","breadcrumbs":"Installation » Feature Flags","id":"167","title":"Feature Flags"},"168":{"body":"","breadcrumbs":"Installation » Environment Setup","id":"168","title":"Environment Setup"},"169":{"body":"# Navigate to your project\\ncd /path/to/your/project # Initialize .kb directory\\nkb init # Or initialize with custom name\\nkb init --name \\"My Project\\" --description \\"Project knowledge base\\" This creates: your-project/\\n└── .kogral/ ├── config.toml ├── notes/ ├── decisions/ ├── guidelines/ ├── patterns/ └── journal/","breadcrumbs":"Installation » 1. Initialize a Knowledge Base","id":"169","title":"1. Initialize a Knowledge Base"},"17":{"body":"System overview with diagrams Config-driven architecture Graph model details ADRs (Architectural Decision Records)","breadcrumbs":"Introduction » 3. Architecture (architecture/)","id":"17","title":"3. Architecture (architecture/)"},"170":{"body":"If you want advanced configuration: # Copy default config\\ncp /path/to/knowledge-base/config/defaults.ncl .kogral/config.ncl # Edit configuration\\n$EDITOR .kogral/config.ncl # Export to TOML (for kb-cli compatibility)\\nnickel export --format json .kogral/config.ncl | kb config import","breadcrumbs":"Installation » 2. Configure Nickel Schemas (Optional)","id":"170","title":"2. Configure Nickel Schemas (Optional)"},"171":{"body":"For shared guidelines and patterns across projects: # Create shared KB location\\nmkdir -p ~/Tools/.kogral-shared\\ncd ~/Tools/.kogral-shared # Initialize shared KB\\nkb init --name \\"Shared Knowledge\\" --description \\"Cross-project guidelines\\" # Configure inheritance in project\\nkb config set inheritance.base ~/Tools/.kogral-shared","breadcrumbs":"Installation » 3. Set Up Shared Knowledge Base (Optional)","id":"171","title":"3. Set Up Shared Knowledge Base (Optional)"},"172":{"body":"","breadcrumbs":"Installation » Verify Installation","id":"172","title":"Verify Installation"},"173":{"body":"# Check version\\nkb --version # Show help\\nkb --help # Test initialization (dry-run)\\nkb init --dry-run","breadcrumbs":"Installation » Test CLI","id":"173","title":"Test CLI"},"174":{"body":"# Start MCP server in test mode\\nkb serve --transport stdio # In another terminal, test with echo\\necho \'{\\"jsonrpc\\":\\"2.0\\",\\"id\\":1,\\"method\\":\\"kogral/search\\",\\"params\\":{\\"query\\":\\"test\\"}}\' | kb serve","breadcrumbs":"Installation » Test MCP Server","id":"174","title":"Test MCP Server"},"175":{"body":"# Run all tests\\ncargo test --workspace # Run integration tests\\ncargo test --package kb-core --test \'*\' # Run with all features\\ncargo test --workspace --all-features","breadcrumbs":"Installation » Run Tests","id":"175","title":"Run Tests"},"176":{"body":"If using SurrealDB backend:","breadcrumbs":"Installation » SurrealDB Setup (Optional)","id":"176","title":"SurrealDB Setup (Optional)"},"177":{"body":"# Start server\\nsurreal start --log trace --user root --pass root file://data.db # Or use memory backend for testing\\nsurreal start --log trace --user root --pass root memory","breadcrumbs":"Installation » Start SurrealDB Server","id":"177","title":"Start SurrealDB Server"},"178":{"body":"Edit .kogral/config.ncl: { storage = { primary = \'filesystem, secondary = { enabled = true, type = \'surrealdb, url = \\"ws://localhost:8000\\", namespace = \\"kb\\", database = \\"default\\", username = \\"root\\", password = \\"root\\", }, },\\n}","breadcrumbs":"Installation » Configure kb-core","id":"178","title":"Configure kb-core"},"179":{"body":"# Run migration script\\nnu scripts/kb-migrate.nu --target latest # Or manually import schema\\nsurreal import --conn ws://localhost:8000 --user root --pass root --ns kb --db default schema.surql","breadcrumbs":"Installation » Initialize Schema","id":"179","title":"Initialize Schema"},"18":{"body":"Initial setup Development environment Production deployment Testing environment CI/CD integration","breadcrumbs":"Introduction » 4. Setup (setup/)","id":"18","title":"4. Setup (setup/)"},"180":{"body":"","breadcrumbs":"Installation » Embedding Provider Setup (Optional)","id":"180","title":"Embedding Provider Setup (Optional)"},"181":{"body":"# Build with fastembed feature\\ncargo build --package kb-core --features fastembed # Models will be downloaded on first use","breadcrumbs":"Installation » Local fastembed","id":"181","title":"Local fastembed"},"182":{"body":"Set environment variables: # OpenAI\\nexport OPENAI_API_KEY=\\"sk-...\\" # Claude (Anthropic)\\nexport ANTHROPIC_API_KEY=\\"sk-ant-...\\" # Ollama (local)\\nexport OLLAMA_API_BASE=\\"http://localhost:11434\\" Configure provider in .kogral/config.ncl: { embeddings = { enabled = true, provider = \'openai, # or \'claude, \'ollama, \'fastembed model = \\"text-embedding-3-small\\", api_key_env = \\"OPENAI_API_KEY\\", },\\n}","breadcrumbs":"Installation » API Providers (OpenAI, Claude, Ollama)","id":"182","title":"API Providers (OpenAI, Claude, Ollama)"},"183":{"body":"To use kb-mcp with Claude Code:","breadcrumbs":"Installation » Claude Code Integration","id":"183","title":"Claude Code Integration"},"184":{"body":"cargo build --package kb-mcp --release","breadcrumbs":"Installation » 1. Build MCP Server","id":"184","title":"1. Build MCP Server"},"185":{"body":"Add to ~/.config/claude/config.json: { \\"mcpServers\\": { \\"kogral-mcp\\": { \\"command\\": \\"/path/to/knowledge-base/target/release/kb-mcp\\", \\"args\\": [\\"serve\\"], \\"env\\": {} } }\\n}","breadcrumbs":"Installation » 2. Configure Claude Code","id":"185","title":"2. Configure Claude Code"},"186":{"body":"Start Claude Code and verify: > kb/search \\"test\\"","breadcrumbs":"Installation » 3. Test Connection","id":"186","title":"3. Test Connection"},"187":{"body":"","breadcrumbs":"Installation » Troubleshooting","id":"187","title":"Troubleshooting"},"188":{"body":"# Verify nickel is installed\\nnickel --version # If not, install\\ncargo install nickel-lang-cli # Add cargo bin to PATH\\nexport PATH=\\"$HOME/.cargo/bin:$PATH\\"","breadcrumbs":"Installation » Nickel Not Found","id":"188","title":"Nickel Not Found"},"189":{"body":"# Update Rust\\nrustup update stable # Clean and rebuild\\ncargo clean\\ncargo build --workspace","breadcrumbs":"Installation » Compilation Errors","id":"189","title":"Compilation Errors"},"19":{"body":"Configuration overview Nickel schema reference Runtime configuration Environment modes (dev/prod/test)","breadcrumbs":"Introduction » 5. Configuration (config/)","id":"19","title":"5. Configuration (config/)"},"190":{"body":"# Check SurrealDB is running\\ncurl http://localhost:8000/health # Start SurrealDB with correct settings\\nsurreal start --bind 0.0.0.0:8000 --user root --pass root memory","breadcrumbs":"Installation » SurrealDB Connection Failed","id":"190","title":"SurrealDB Connection Failed"},"191":{"body":"# Test stdio communication\\necho \'{\\"jsonrpc\\":\\"2.0\\",\\"id\\":1,\\"method\\":\\"ping\\"}\' | kb serve # Check logs\\nkb serve --log-level debug","breadcrumbs":"Installation » MCP Server Not Responding","id":"191","title":"MCP Server Not Responding"},"192":{"body":"Quick Start Guide - Create your first knowledge base Configuration Reference - Customize behavior MCP Tools - Integrate with Claude Code","breadcrumbs":"Installation » Next Steps","id":"192","title":"Next Steps"},"193":{"body":"# Remove installed binary\\ncargo uninstall kb-cli # Remove project knowledge base\\nrm -rf /path/to/project/.kogral # Remove shared knowledge base\\nrm -rf ~/Tools/.kogral-shared","breadcrumbs":"Installation » Uninstallation","id":"193","title":"Uninstallation"},"194":{"body":"Get up and running with the KOGRAL in 5 minutes.","breadcrumbs":"Quick Start » Quick Start Guide","id":"194","title":"Quick Start Guide"},"195":{"body":"Rust 1.70+ installed Nickel CLI installed (cargo install nickel-lang-cli) kb-cli installed (see Installation )","breadcrumbs":"Quick Start » Prerequisites","id":"195","title":"Prerequisites"},"196":{"body":"Navigate to your project directory and initialize: cd /path/to/your/project\\nkb init This creates a .kogral/ directory with the following structure: .kogral/\\n├── config.toml # Configuration\\n├── notes/ # General notes\\n├── decisions/ # Architectural decisions\\n├── guidelines/ # Project guidelines\\n├── patterns/ # Reusable patterns\\n└── journal/ # Daily journal entries","breadcrumbs":"Quick Start » Step 1: Initialize Your Knowledge Base","id":"196","title":"Step 1: Initialize Your Knowledge Base"},"197":{"body":"Add a note to your knowledge base: kb add note \\"Getting Started with Rust\\" \\\\ --tags rust,programming,learning \\\\ --content \\"Key concepts for learning Rust effectively.\\" Or create interactively: kb add note\\n# Follow the prompts to enter title, tags, and content","breadcrumbs":"Quick Start » Step 2: Create Your First Note","id":"197","title":"Step 2: Create Your First Note"},"198":{"body":"Document an architectural decision: kb add decision \\"Use SurrealDB for Storage\\" \\\\ --context \\"Need scalable storage for knowledge graph\\" \\\\ --decision \\"Adopt SurrealDB for its graph capabilities\\" \\\\ --consequence \\"Better query performance\\" \\\\ --consequence \\"Additional infrastructure dependency\\"","breadcrumbs":"Quick Start » Step 3: Create a Decision Record","id":"198","title":"Step 3: Create a Decision Record"},"199":{"body":"Create relationships between nodes: # Find node IDs\\nkb list # Create a relationship\\nkb link relates_to Available relationship types: relates_to - General conceptual link depends_on - Dependency relationship implements - Implementation of a concept extends - Inheritance/extension supersedes - Replaces older version explains - Documentation/clarification","breadcrumbs":"Quick Start » Step 4: Link Nodes Together","id":"199","title":"Step 4: Link Nodes Together"},"2":{"body":"The best reading experience with navigation, search, and live reload: # Serve documentation at http://localhost:3000\\njust docs::serve This will: Build the mdBook Start a local web server on port 3000 Open your browser automatically Watch for changes and auto-reload","breadcrumbs":"Introduction » Option 1: Serve Locally with mdBook (Recommended)","id":"2","title":"Option 1: Serve Locally with mdBook (Recommended)"},"20":{"body":"Storage architecture (hybrid strategy) Filesystem backend SurrealDB backend In-memory backend Sync mechanism","breadcrumbs":"Introduction » 6. Storage (storage/)","id":"20","title":"6. Storage (storage/)"},"200":{"body":"Search by text: # Simple search\\nkb search \\"rust\\" # Filter by type\\nkb search \\"architecture\\" --type decision # Limit results\\nkb search \\"error handling\\" --limit 5 Search semantically (requires embeddings): # Semantic search finds conceptually related content\\nkb search \\"memory safety\\" --semantic --threshold 0.7","breadcrumbs":"Quick Start » Step 5: Search Your Knowledge Base","id":"200","title":"Step 5: Search Your Knowledge Base"},"201":{"body":"# Show node by ID\\nkb show # Show node with relationships\\nkb show --with-relationships","breadcrumbs":"Quick Start » Step 6: View Node Details","id":"201","title":"Step 6: View Node Details"},"202":{"body":"All knowledge base documents are markdown files you can edit: # Open in your editor\\n$EDITOR .kogral/notes/getting-started-with-rust.md # Or use your favorite markdown editor\\ncode .kogral/notes/ Document format: ---\\nid: unique-id\\ntype: note\\ntitle: Getting Started with Rust\\ncreated: 2026-01-17T10:30:00Z\\nmodified: 2026-01-17T10:30:00Z\\ntags: [rust, programming, learning]\\nstatus: active\\n--- # Getting Started with Rust Content goes here with [[wikilinks]] to other nodes. ## Key Concepts - Ownership\\n- Borrowing\\n- Lifetimes","breadcrumbs":"Quick Start » Step 7: Edit Documents Directly","id":"202","title":"Step 7: Edit Documents Directly"},"203":{"body":"Start journaling your development progress: kb add journal \\"Today\'s Progress\\" \\\\ --content \\"Learned about trait objects and dynamic dispatch in Rust.\\" Or open today\'s journal directly: $EDITOR .kogral/journal/$(date +%Y-%m-%d).md","breadcrumbs":"Quick Start » Step 8: Create a Daily Journal Entry","id":"203","title":"Step 8: Create a Daily Journal Entry"},"204":{"body":"If you use Logseq, export your knowledge base: nu scripts/kb-export-logseq.nu /path/to/logseq-graph This creates a Logseq-compatible graph you can open in Logseq for visual editing.","breadcrumbs":"Quick Start » Step 9: Export to Logseq (Optional)","id":"204","title":"Step 9: Export to Logseq (Optional)"},"205":{"body":"Integrate with Claude Code for AI-assisted knowledge management: # Start MCP server\\nkb serve # Configure in ~/.config/claude/config.json\\n# Then use in Claude Code:\\n# > kb/search \\"rust ownership\\"","breadcrumbs":"Quick Start » Step 10: Start MCP Server for Claude Code","id":"205","title":"Step 10: Start MCP Server for Claude Code"},"206":{"body":"","breadcrumbs":"Quick Start » Common Workflows","id":"206","title":"Common Workflows"},"207":{"body":"# Quick note\\nkb add note \\"Remember to check error handling in parser module\\" --tags todo,parser","breadcrumbs":"Quick Start » Capture Quick Notes","id":"207","title":"Capture Quick Notes"},"208":{"body":"# Create ADR\\nkb add decision \\"Adopt Async Rust for I/O Operations\\" \\\\ --status accepted \\\\ --tags architecture,async","breadcrumbs":"Quick Start » Document Architectural Decisions","id":"208","title":"Document Architectural Decisions"},"209":{"body":"# Add a pattern\\nkb add pattern \\"Error Handling with thiserror\\" \\\\ --tags rust,error-handling \\\\ --content \\"Standard pattern for error types in this project.\\"","breadcrumbs":"Quick Start » Build a Pattern Library","id":"209","title":"Build a Pattern Library"},"21":{"body":"Semantic search Embedding providers Provider comparison Configuration examples","breadcrumbs":"Introduction » 7. AI & Embeddings (ai/)","id":"21","title":"7. AI & Embeddings (ai/)"},"210":{"body":"# Add journal entry\\nkb add journal --content \\"Implemented search functionality. Need to add semantic search next.\\"","breadcrumbs":"Quick Start » Track Daily Progress","id":"210","title":"Track Daily Progress"},"211":{"body":"","breadcrumbs":"Quick Start » Next Steps","id":"211","title":"Next Steps"},"212":{"body":"Edit .kogral/config.ncl for advanced configuration: { graph = { name = \\"My Project\\", version = \\"1.0.0\\", }, embeddings = { enabled = true, provider = \'fastembed, }, templates = { templates_dir = \\"templates\\", },\\n} See Configuration Reference for all options.","breadcrumbs":"Quick Start » Customize Configuration","id":"212","title":"Customize Configuration"},"213":{"body":"Create a shared knowledge base for organization-wide standards: # Create shared KB\\nmkdir -p ~/Tools/.kogral-shared\\ncd ~/Tools/.kogral-shared\\nkb init --name \\"Shared Guidelines\\" # Add guidelines\\nkb add guideline \\"Rust Error Handling\\" \\\\ --language rust \\\\ --category error-handling # Configure inheritance in projects\\nkb config set inheritance.base ~/Tools/.kogral-shared","breadcrumbs":"Quick Start » Set Up Shared Guidelines","id":"213","title":"Set Up Shared Guidelines"},"214":{"body":"# Backup regularly\\nnu scripts/kb-backup.nu --compress # Sync with SurrealDB\\nnu scripts/kb-sync.nu --direction bidirectional # Generate statistics\\nnu scripts/kb-stats.nu --show-tags","breadcrumbs":"Quick Start » Automate with NuShell Scripts","id":"214","title":"Automate with NuShell Scripts"},"215":{"body":"# Add to version control\\ngit add .kogral/\\ngit commit -m \\"docs: Add knowledge base\\" # Add to .gitignore (optional: exclude certain types)\\necho \\".kogral/journal/\\" >> .gitignore","breadcrumbs":"Quick Start » Integrate with Git","id":"215","title":"Integrate with Git"},"216":{"body":"","breadcrumbs":"Quick Start » Tips and Tricks","id":"216","title":"Tips and Tricks"},"217":{"body":"Link to other nodes naturally in markdown: See [[getting-started-with-rust]] for basics.\\nRelated decision: [[use-surrealdb-for-storage]].","breadcrumbs":"Quick Start » Use Wikilinks","id":"217","title":"Use Wikilinks"},"218":{"body":"Link to specific code locations: Error handling implementation: @src/parser.rs:42","breadcrumbs":"Quick Start » Reference Code","id":"218","title":"Reference Code"},"219":{"body":"Use consistent tagging for better searchability: # Good tagging\\n--tags rust,error-handling,pattern # Avoid\\n--tags Rust,ErrorHandling,patterns","breadcrumbs":"Quick Start » Tag Consistently","id":"219","title":"Tag Consistently"},"22":{"body":"Template system (Tera) Document templates Export templates Custom templates","breadcrumbs":"Introduction » 8. Templates (templates/)","id":"22","title":"8. Templates (templates/)"},"220":{"body":"Customize templates for your workflow: # Copy template\\ncp templates/note.md.tera templates/meeting-notes.md.tera # Edit for meeting notes format\\n$EDITOR templates/meeting-notes.md.tera","breadcrumbs":"Quick Start » Leverage Templates","id":"220","title":"Leverage Templates"},"221":{"body":"","breadcrumbs":"Quick Start » Troubleshooting","id":"221","title":"Troubleshooting"},"222":{"body":"# Make sure you initialized\\nkb init # Or specify KB directory\\nkb --kb-dir /path/to/.kb search \\"query\\"","breadcrumbs":"Quick Start » \\"KB directory not found\\"","id":"222","title":"\\"KB directory not found\\""},"223":{"body":"# List all nodes to find ID\\nkb list # Search for node\\nkb search \\"partial title\\"","breadcrumbs":"Quick Start » \\"Node not found\\"","id":"223","title":"\\"Node not found\\""},"224":{"body":"Check your markdown file has valid YAML frontmatter: ---\\nid: my-note\\ntype: note\\ntitle: My Note\\n---","breadcrumbs":"Quick Start » \\"Failed to parse frontmatter\\"","id":"224","title":"\\"Failed to parse frontmatter\\""},"225":{"body":"Configuration Reference - Full configuration options CLI Commands - All available commands Document Format - Markdown and frontmatter details MCP Tools - Claude Code integration","breadcrumbs":"Quick Start » Further Reading","id":"225","title":"Further Reading"},"226":{"body":"Check kb --help for command usage Read inline help: kb add --help Report issues on GitHub Join community discussions Congratulations! You\'ve created your first knowledge base. Start capturing knowledge and building connections.","breadcrumbs":"Quick Start » Getting Help","id":"226","title":"Getting Help"},"227":{"body":"","breadcrumbs":"Daily Workflows » Daily Workflows","id":"227","title":"Daily Workflows"},"228":{"body":"Real-world scenarios showing how KOGRAL solves common development challenges.","breadcrumbs":"Use Cases » Use Cases","id":"228","title":"Use Cases"},"229":{"body":"","breadcrumbs":"Use Cases » Use Case 1: Onboarding New Team Members","id":"229","title":"Use Case 1: Onboarding New Team Members"},"23":{"body":"All kb-cli commands Common workflows Advanced usage Troubleshooting","breadcrumbs":"Introduction » 9. CLI Reference (cli/)","id":"23","title":"9. CLI Reference (cli/)"},"230":{"body":"New developer joins the team. Needs to understand: Why we chose SurrealDB over PostgreSQL How error handling works in this project What coding patterns we follow Recent architectural decisions","breadcrumbs":"Use Cases » Problem","id":"230","title":"Problem"},"231":{"body":"Team lead : # Export project knowledge to Logseq for visual exploration\\nkb export logseq ~/onboarding-docs New developer (with Claude Code): Summarize our architectural decisions from the last 6 months Claude (via MCP): Found 8 decisions: 1. **Use SurrealDB for Storage** (accepted, 3 months ago) - Context: Need graph database for knowledge relationships - Consequences: Better queries, additional infrastructure 2. **Adopt Rust for Core Logic** (accepted, 5 months ago) - Context: Type safety and performance critical - Consequences: Steeper learning curve, excellent reliability ... [6 more decisions] New developer : What are our error handling guidelines? Claude (via kb/get_guidelines): ## Rust Error Handling Guidelines ### Project Guidelines (priority: 150)\\n- Use thiserror for custom error types\\n- Never unwrap() in production\\n- Propagate with ? operator ### Shared Guidelines (priority: 50)\\n- Always use Result for fallible operations\\n- Add context with .context() [Links to full guideline documents] Result : New developer productive in days, not weeks.","breadcrumbs":"Use Cases » Solution with KOGRAL","id":"231","title":"Solution with KOGRAL"},"232":{"body":"","breadcrumbs":"Use Cases » Use Case 2: Architectural Decision Records (ADR)","id":"232","title":"Use Case 2: Architectural Decision Records (ADR)"},"233":{"body":"Team discussing whether to add Redis caching. Multiple opinions, need to document the decision for future reference.","breadcrumbs":"Use Cases » Problem","id":"233","title":"Problem"},"234":{"body":"During meeting : Document decision: Add Redis caching for API responses Context:\\n- Current database queries average 200ms\\n- 80% of queries are repeated within 5 minutes\\n- Need sub-50ms response times for user experience Decision:\\n- Add Redis with 5-minute TTL for GET endpoints\\n- Cache invalidation on POST/PUT/DELETE Consequences:\\n- ✅ Expected 80% reduction in database load\\n- ✅ Sub-50ms response times achieved\\n- ❌ Additional infrastructure (Redis server)\\n- ❌ Cache consistency challenges\\n- ❌ Debugging complexity increases Status: proposed (pending infrastructure setup) Claude (creates ADR): Created: decision-add-redis-caching\\nType: decision\\nStatus: proposed Added relationships: - Relates to: note-performance-requirements - Depends on: decision-use-docker-compose (infrastructure) Decision documented and linked to related knowledge. Two months later , someone asks \\"Why Redis?\\": kb show decision-add-redis-caching Full context available instantly.","breadcrumbs":"Use Cases » Solution with KOGRAL","id":"234","title":"Solution with KOGRAL"},"235":{"body":"","breadcrumbs":"Use Cases » Use Case 3: Pattern Library","id":"235","title":"Use Case 3: Pattern Library"},"236":{"body":"Team solves the same problems repeatedly: How to structure error types Database connection patterns Testing strategies Each developer rediscovers solutions.","breadcrumbs":"Use Cases » Problem","id":"236","title":"Problem"},"237":{"body":"First time solving error handling: kb add pattern \\"Error Handling with thiserror\\" \\\\ --tags rust,error-handling,pattern \\\\ --content \\"$(cat docs/error-pattern.md)\\" Next time someone needs error handling: I\'m implementing a new module with errors. What\'s our standard pattern? Claude (via kogral/search): Found pattern: Error Handling with thiserror ## Pattern: Error Handling with thiserror ### Problem\\nNeed structured, type-safe error handling with good error messages. ### Solution\\n```rust\\nuse thiserror::Error; #[derive(Error, Debug)]\\npub enum ModuleError { #[error(\\"Database connection failed: {0}\\")] Database(#[from] sqlx::Error), #[error(\\"Validation failed: {0}\\")] Validation(String),\\n}","breadcrumbs":"Use Cases » Solution with KOGRAL","id":"237","title":"Solution with KOGRAL"},"238":{"body":"fn do_work() -> Result<(), ModuleError> { let conn = connect_db()?; // Auto-converts via #[from] validate_input()?; Ok(())\\n} [Full pattern with examples] Would you like me to create a new error module following this pattern? **Result**: Consistent error handling across codebase, zero time wasted rediscovering patterns. --- ## Use Case 4: Daily Development Journal ### Problem Developer wants to track:\\n- What they worked on each day\\n- Blockers encountered\\n- Solutions discovered\\n- Ideas for future work ### Solution with KOGRAL **End of each day**: ```bash\\nkb add journal \\"2026-01-17\\" --content \\"\\n## Progress\\n- Implemented user authentication\\n- Fixed race condition in cache layer\\n- Started work on API rate limiting ## Blockers\\n- SurrealDB migration tool not working with nested objects\\n- Need to discuss API versioning strategy with team ## Learnings\\n- tokio::select! is perfect for timeout patterns\\n- serde_json::Value useful for dynamic JSON handling ## Tomorrow\\n- Finish rate limiting implementation\\n- Review PR #234\\n- Team meeting: discuss API versioning\\n\\" With Claude Code (even easier): End of day journal: Implemented authentication, fixed cache race condition, started rate limiting.\\nBlocked on SurrealDB migrations and need API versioning discussion.\\nLearned about tokio::select! for timeouts.\\nTomorrow: finish rate limiting, review PR #234, versioning meeting. Claude (creates journal entry): Created journal entry: 2026-01-17 Tags auto-detected: authentication, cache, rate-limiting, surrealdb Linked to: - pattern-timeout-handling (implements) - decision-use-surrealdb (relates_to) Journal entry saved. Two weeks later (forgot how you solved that race condition): How did I fix the cache race condition? Claude (semantic search): From your journal entry on 2026-01-17: \\"Fixed race condition in cache layer by using DashMap instead of\\nRwLock. DashMap provides lock-free concurrent access.\\" [Link to full journal entry] Result : Development history preserved, solutions easy to recall.","breadcrumbs":"Use Cases » Usage","id":"238","title":"Usage"},"239":{"body":"","breadcrumbs":"Use Cases » Use Case 5: Code Review Preparation","id":"239","title":"Use Case 5: Code Review Preparation"},"24":{"body":"MCP quick guide (Claude Code) Logseq integration Vapora integration","breadcrumbs":"Introduction » 10. Apps & Integrations (apps/)","id":"24","title":"10. Apps & Integrations (apps/)"},"240":{"body":"Preparing for code review. Need to: Document why certain decisions were made Link implementation to requirements Explain trade-offs to reviewers","breadcrumbs":"Use Cases » Problem","id":"240","title":"Problem"},"241":{"body":"Before creating PR : I just implemented the caching layer.\\nAdd a note documenting the implementation and link it to our caching decision. Claude (via kb/add_note + kb/link): Created note: note-caching-layer-implementation Content:\\n# Caching Layer Implementation ## Approach\\n- Redis with 5-minute TTL\\n- Cache-aside pattern\\n- Invalidation on mutations ## Trade-offs\\n- Chose simplicity over advanced features (no LRU eviction)\\n- 5-minute TTL balances freshness vs cache hit rate\\n- Cache-aside pattern chosen over write-through (simpler) ## Testing\\n- Unit tests for cache logic\\n- Integration tests with real Redis\\n- Load test: 1000 req/s sustained Links: - Implements: decision-add-redis-caching - Follows: pattern-cache-aside - Tests: guideline-integration-testing Note added and linked to decision-add-redis-caching. In PR description : ## Implementation Implements caching layer per decision-add-redis-caching. See note-caching-layer-implementation for detailed rationale. ## Trade-offs [Copy from note] Reviewers : kb show decision-add-redis-caching\\nkb show note-caching-layer-implementation Full context available, review focuses on code quality not \\"why this approach?\\"","breadcrumbs":"Use Cases » Solution with KOGRAL","id":"241","title":"Solution with KOGRAL"},"242":{"body":"","breadcrumbs":"Use Cases » Use Case 6: Cross-Project Guidelines","id":"242","title":"Use Case 6: Cross-Project Guidelines"},"243":{"body":"Organization has 10 projects. Each should follow: Same Rust error handling patterns Same security guidelines Same testing standards Currently: duplicated wikis, inconsistent practices.","breadcrumbs":"Use Cases » Problem","id":"243","title":"Problem"},"244":{"body":"Setup shared KOGRAL : # Create organization-wide shared KB\\nmkdir -p ~/org/.kogral-shared\\ncd ~/org/.kogral-shared\\nkb init --name \\"Organization Guidelines\\" # Add shared guidelines\\nkb add guideline \\"Rust Error Handling\\" \\\\ --language rust \\\\ --category error-handling \\\\ --content \\"$(cat org-rust-errors.md)\\" kb add guideline \\"Security Best Practices\\" \\\\ --category security \\\\ --content \\"$(cat org-security.md)\\" In each project : # project/.kogral/config.ncl\\n{ inheritance = { base = \\"~/org/.kogral-shared\\", priority = 100, # Project overrides shared },\\n} Developer in Project A : What are our error handling guidelines? Claude (via kb/get_guidelines with inheritance): ## Rust Error Handling Guidelines ### Shared Guidelines (priority: 50)\\nFrom ~/org/.kogral-shared:\\n- Use thiserror for custom errors\\n- Never unwrap() in production\\n- Always propagate with ? ### Project Guidelines (priority: 100)\\nFrom project .kogral/:\\n- Additionally: log all errors with tracing\\n- Use anyhow for application-level errors [Combined effective guidelines] Result : Consistent practices across organization Projects can specialize where needed Single source of truth for shared knowledge","breadcrumbs":"Use Cases » Solution with KOGRAL","id":"244","title":"Solution with KOGRAL"},"245":{"body":"","breadcrumbs":"Use Cases » Use Case 7: Bug Investigation","id":"245","title":"Use Case 7: Bug Investigation"},"246":{"body":"Bug in production. Developer needs to: Understand relevant decisions Find related code patterns Check if similar issues were solved before","breadcrumbs":"Use Cases » Problem","id":"246","title":"Problem"},"247":{"body":"Developer : We have a race condition in the cache layer.\\nWhat past decisions or patterns might be relevant? Claude (semantic search): Found 4 relevant items: 1. **Decision: Use DashMap for Concurrent Access** (accepted, 1 month ago) \\"Chose DashMap over RwLock to avoid race conditions in cache\\" 2. **Pattern: Safe Concurrent Cache Access** \\"Always use lock-free data structures for high-contention caches\\" 3. **Note: Cache Race Condition Fix** (from 2026-01-17 journal) \\"Fixed race in cache by switching to DashMap\\" 4. **Guideline: Concurrency Safety** \\"Use atomic operations and lock-free structures where possible\\" It looks like we\'ve seen this before! Check the journal entry from 2026-01-17. Developer reads journal : kb show journal-2026-01-17 Finds : Exact same issue Solution: switch to DashMap Code example included Performance benchmarks Applies fix in 10 minutes instead of 2 hours of debugging.","breadcrumbs":"Use Cases » Solution with KOGRAL","id":"247","title":"Solution with KOGRAL"},"248":{"body":"","breadcrumbs":"Use Cases » Use Case 8: API Design Collaboration","id":"248","title":"Use Case 8: API Design Collaboration"},"249":{"body":"Team discussing new API design. Multiple approaches: REST vs GraphQL Versioning strategy Authentication method Need to capture discussion and decision.","breadcrumbs":"Use Cases » Problem","id":"249","title":"Problem"},"25":{"body":"MCP tools specification Storage trait Embedding trait REST API (future)","breadcrumbs":"Introduction » 11. API Reference (api/)","id":"25","title":"11. API Reference (api/)"},"250":{"body":"During design meeting (using Claude Code): We\'re designing the new API. Let me capture this discussion: Approaches discussed:\\n1. REST with versioned endpoints (/v1/, /v2/)\\n2. GraphQL with schema versioning\\n3. gRPC for internal services Team consensus:\\n- REST for public API (easier for partners)\\n- GraphQL for internal admin tools (flexibility)\\n- gRPC for service-to-service (performance) Create a decision record for each, linking them together. Claude (creates 3 linked ADRs): Created 3 decisions: 1. decision-rest-public-api Status: accepted Context: Public API needs broad compatibility Decision: REST with /v1/, /v2/ versioning 2. decision-graphql-admin Status: accepted Context: Admin tools need flexible queries Decision: GraphQL with schema evolution 3. decision-grpc-internal Status: accepted Context: Service-to-service needs performance Decision: gRPC with protobuf Linked: decision-rest-public-api --[relates_to]--> decision-graphql-admin decision-rest-public-api --[relates_to]--> decision-grpc-internal decision-graphql-admin --[relates_to]--> decision-grpc-internal All decisions documented and interconnected. Two months later , someone asks \\"Why REST not GraphQL for public API?\\": kb show decision-rest-public-api Full context preserved, including relationship to GraphQL decision.","breadcrumbs":"Use Cases » Solution with KOGRAL","id":"250","title":"Solution with KOGRAL"},"251":{"body":"Knowledge Base excels at: ✅ Onboarding : Historical context instantly available ✅ Decision Making : ADRs preserve rationale ✅ Pattern Reuse : Solutions documented once, used forever ✅ Daily Tracking : Development journal with semantic search ✅ Code Review : Implementation rationale linked to decisions ✅ Cross-Project : Shared guidelines with project overrides ✅ Bug Investigation : Past solutions easily discovered ✅ Collaboration : Discussions captured and interconnected Common Theme : Knowledge captured during work, queryable when needed, connected to related concepts.","breadcrumbs":"Use Cases » Summary","id":"251","title":"Summary"},"252":{"body":"Start simple : Quick Start Guide Integrate AI : MCP Quick Guide Advanced features : Configuration Reference","breadcrumbs":"Use Cases » Next Steps","id":"252","title":"Next Steps"},"253":{"body":"","breadcrumbs":"Best Practices » Best Practices","id":"253","title":"Best Practices"},"254":{"body":"Comprehensive overview of the KOGRAL architecture.","breadcrumbs":"System Overview » System Architecture","id":"254","title":"System Architecture"},"255":{"body":"Architecture Overview The KOGRAL consists of three main layers: User Interfaces : kb-cli (terminal), kb-mcp (AI integration), NuShell scripts (automation) Core Library (kb-core) : Rust library with graph engine, storage abstraction, embeddings, query engine Storage Backends : Filesystem (git-friendly), SurrealDB (scalable), In-Memory (cache/testing)","breadcrumbs":"System Overview » High-Level Architecture","id":"255","title":"High-Level Architecture"},"256":{"body":"","breadcrumbs":"System Overview » Component Details","id":"256","title":"Component Details"},"257":{"body":"Purpose : Primary user interface for local knowledge management. Commands (13 total): init: Initialize .kogral/ directory add: Create nodes (note, decision, guideline, pattern, journal) search: Text and semantic search link: Create relationships between nodes list: List all nodes show: Display node details delete: Remove nodes graph: Visualize knowledge graph sync: Sync filesystem ↔ SurrealDB serve: Start MCP server import: Import from Logseq export: Export to Logseq/JSON config: Manage configuration Technology : Rust + clap (derive API) Features : Colored terminal output Interactive prompts Dry-run modes Validation before operations","breadcrumbs":"System Overview » kb-cli (Command-Line Interface)","id":"257","title":"kb-cli (Command-Line Interface)"},"258":{"body":"Purpose : AI integration via Model Context Protocol. Protocol : JSON-RPC 2.0 over stdio Components : Tools (7): kogral/search: Query knowledge base kb/add_note: Create notes kb/add_decision: Create ADRs kb/link: Create relationships kb/get_guidelines: Retrieve guidelines with inheritance kb/list_graphs: List available graphs kb/export: Export to formats Resources (6 URIs): kogral://project/notes kogral://project/decisions kogral://project/guidelines kogral://project/patterns kogral://shared/guidelines kogral://shared/patterns Prompts (2): kb/summarize_project: Generate project summary kb/find_related: Find related nodes Integration : Claude Code via ~/.config/claude/config.json","breadcrumbs":"System Overview » kb-mcp (MCP Server)","id":"258","title":"kb-mcp (MCP Server)"},"259":{"body":"Purpose : Automation and maintenance tasks. Scripts (6): kb-sync.nu: Filesystem ↔ SurrealDB sync kb-backup.nu: Archive knowledge base kb-reindex.nu: Rebuild embeddings kb-import-logseq.nu: Import from Logseq kb-export-logseq.nu: Export to Logseq kb-stats.nu: Graph statistics Features : Colored output Dry-run modes Progress indicators Error handling","breadcrumbs":"System Overview » NuShell Scripts","id":"259","title":"NuShell Scripts"},"26":{"body":"Development setup Code guidelines Testing standards Documentation guidelines","breadcrumbs":"Introduction » 12. Contributing (contributing/)","id":"26","title":"12. Contributing (contributing/)"},"260":{"body":"","breadcrumbs":"System Overview » Core Library (kb-core)","id":"260","title":"Core Library (kb-core)"},"261":{"body":"Graph : pub struct Graph { pub name: String, pub version: String, pub nodes: HashMap, // ID → Node pub edges: Vec, pub metadata: HashMap,\\n} Node : pub struct Node { pub id: String, pub node_type: NodeType, pub title: String, pub content: String, pub tags: Vec, pub status: NodeStatus, pub created: DateTime, pub modified: DateTime, // ... relationships, metadata\\n} Edge : pub struct Edge { pub from: String, pub to: String, pub relation: EdgeType, pub strength: f32, pub created: DateTime,\\n}","breadcrumbs":"System Overview » Models","id":"261","title":"Models"},"262":{"body":"#[async_trait]\\npub trait Storage: Send + Sync { async fn save_graph(&self, graph: &Graph) -> Result<()>; async fn load_graph(&self, name: &str) -> Result; async fn delete_graph(&self, name: &str) -> Result<()>; async fn list_graphs(&self) -> Result>;\\n} Implementations : FilesystemStorage: Git-friendly markdown files MemoryStorage: In-memory with DashMap SurrealDbStorage: Scalable graph database","breadcrumbs":"System Overview » Storage Trait","id":"262","title":"Storage Trait"},"263":{"body":"#[async_trait]\\npub trait EmbeddingProvider: Send + Sync { async fn embed(&self, texts: Vec) -> Result>>; fn dimensions(&self) -> usize; fn model_name(&self) -> &str;\\n} Implementations : FastEmbedProvider: Local fastembed RigEmbeddingProvider: OpenAI, Claude, Ollama (via rig-core)","breadcrumbs":"System Overview » Embedding Provider Trait","id":"263","title":"Embedding Provider Trait"},"264":{"body":"Input : Markdown file with YAML frontmatter Output : Node struct Features : YAML frontmatter extraction Markdown body parsing Wikilink detection ([[linked-note]]) Code reference parsing (@file.rs:42) Example : ---\\nid: note-123\\ntype: note\\ntitle: My Note\\ntags: [rust, async]\\n--- # My Note Content with [[other-note]] and @src/main.rs:10 → Node { id: \\"note-123\\", node_type: NodeType::Note, title: \\"My Note\\", content: \\"Content with [[other-note]] and @src/main.rs:10\\", tags: vec![\\"rust\\", \\"async\\"], // ... parsed wikilinks, code refs\\n}","breadcrumbs":"System Overview » Parser","id":"264","title":"Parser"},"265":{"body":"","breadcrumbs":"System Overview » Configuration System","id":"265","title":"Configuration System"},"266":{"body":"# schemas/kb-config.ncl\\n{ KbConfig = { graph | GraphConfig, storage | StorageConfig, embeddings | EmbeddingConfig, templates | TemplateConfig, query | QueryConfig, mcp | McpConfig, sync | SyncConfig, },\\n}","breadcrumbs":"System Overview » Nickel Schema","id":"266","title":"Nickel Schema"},"267":{"body":"User writes: .kogral/config.ncl ↓ [nickel export --format json]\\nJSON intermediate ↓ [serde_json::from_str]\\nKbConfig struct (Rust) ↓\\nRuntime behavior Double Validation : Nickel contracts: Type-safe, enum validation Serde deserialization: Rust type checking Benefits : Errors caught at export time Runtime guaranteed valid config Self-documenting schemas","breadcrumbs":"System Overview » Loading Process","id":"267","title":"Loading Process"},"268":{"body":"","breadcrumbs":"System Overview » Storage Architecture","id":"268","title":"Storage Architecture"},"269":{"body":"Local Graph (per project): Storage: Filesystem (.kogral/ directory) Format: Markdown + YAML frontmatter Version control: Git Scope: Project-specific knowledge Shared Graph (organization): Storage: SurrealDB (or synced filesystem) Format: Same markdown (for compatibility) Version control: Optional Scope: Organization-wide guidelines Sync : Filesystem (.kogral/) ↕ [bidirectional sync]\\nSurrealDB (central)","breadcrumbs":"System Overview » Hybrid Strategy","id":"269","title":"Hybrid Strategy"},"27":{"body":"The documentation includes SVG diagrams for visual understanding: architecture-overview.svg - Complete system architecture core-concepts.svg - Node types and relationships config-composition.svg - Configuration flow (Nickel → JSON → Rust) storage-architecture.svg - Hybrid storage strategy These diagrams are embedded in relevant documentation pages and can be viewed standalone in a browser.","breadcrumbs":"Introduction » 🎨 Visual Diagrams","id":"27","title":"🎨 Visual Diagrams"},"270":{"body":".kogral/\\n├── config.toml # Graph metadata\\n├── notes/\\n│ ├── async-patterns.md # Individual note\\n│ └── error-handling.md\\n├── decisions/\\n│ ├── 0001-use-rust.md # ADR format\\n│ └── 0002-surrealdb.md\\n├── guidelines/\\n│ ├── rust-errors.md # Project guideline\\n│ └── testing.md\\n├── patterns/\\n│ └── repository.md\\n└── journal/ ├── 2026-01-17.md # Daily journal └── 2026-01-18.md","breadcrumbs":"System Overview » File Layout","id":"270","title":"File Layout"},"271":{"body":"","breadcrumbs":"System Overview » Query Engine","id":"271","title":"Query Engine"},"272":{"body":"let results = graph.nodes.values() .filter(|node| { node.title.contains(&query) || node.content.contains(&query) || node.tags.iter().any(|tag| tag.contains(&query)) }) .collect();","breadcrumbs":"System Overview » Text Search","id":"272","title":"Text Search"},"273":{"body":"let query_embedding = embeddings.embed(vec![query]).await?;\\nlet mut scored: Vec<_> = graph.nodes.values() .filter_map(|node| { let node_embedding = node.embedding.as_ref()?; let similarity = cosine_similarity(&query_embedding[0], node_embedding); (similarity >= threshold).then_some((node, similarity)) }) .collect();\\nscored.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap());","breadcrumbs":"System Overview » Semantic Search","id":"273","title":"Semantic Search"},"274":{"body":"// Query both project and shared graphs\\nlet project_results = project_graph.search(&query).await?;\\nlet shared_results = shared_graph.search(&query).await?; // Merge with deduplication\\nlet combined = merge_results(project_results, shared_results);","breadcrumbs":"System Overview » Cross-Graph Query","id":"274","title":"Cross-Graph Query"},"275":{"body":"Claude Code kb-mcp kb-core │ │ │ ├─ JSON-RPC request ───→ │ │ │ kb/search │ │ │ {\\"query\\": \\"rust\\"} │ │ │ ├─ search() ──────────→ │ │ │ │ │ │ Query engine │ │ Text + semantic │ │ │ │ │ ←──── results ─────────┤ │ │ │ │ ←─ JSON-RPC response ──┤ │ │ {\\"results\\": [...]} │ │","breadcrumbs":"System Overview » MCP Protocol Flow","id":"275","title":"MCP Protocol Flow"},"276":{"body":"Engine : Tera (Jinja2-like) Templates : Document Templates (6): note.md.tera decision.md.tera guideline.md.tera pattern.md.tera journal.md.tera execution.md.tera Export Templates (4): logseq-page.md.tera logseq-journal.md.tera summary.md.tera graph.json.tera Usage : let mut tera = Tera::new(\\"templates/**/*.tera\\")?;\\nlet rendered = tera.render(\\"note.md.tera\\", &context)?;","breadcrumbs":"System Overview » Template System","id":"276","title":"Template System"},"277":{"body":"Strategy : thiserror for structured errors #[derive(Error, Debug)]\\npub enum KbError { #[error(\\"Storage error: {0}\\")] Storage(String), #[error(\\"Node not found: {0}\\")] NodeNotFound(String), #[error(\\"Configuration error: {0}\\")] Config(String), #[error(\\"Parse error: {0}\\")] Parse(String), #[error(\\"Embedding error: {0}\\")] Embedding(String),\\n} Propagation : ? operator throughout","breadcrumbs":"System Overview » Error Handling","id":"277","title":"Error Handling"},"278":{"body":"Unit Tests : Per module (models, parser, storage) Integration Tests : Full workflow (add → save → load → query) Test Coverage : kb-core: 48 tests kb-mcp: 5 tests Total: 56 tests Test Data : Fixtures in tests/fixtures/","breadcrumbs":"System Overview » Testing Strategy","id":"278","title":"Testing Strategy"},"279":{"body":"Node Lookup : O(1) via HashMap Semantic Search : O(n) with early termination (threshold filter) Storage : Filesystem: Lazy loading (load on demand) Memory: Full graph in RAM SurrealDB: Query optimization (indexes) Embeddings : Cache embeddings in node metadata Batch processing (configurable batch size) Async generation (non-blocking)","breadcrumbs":"System Overview » Performance Considerations","id":"279","title":"Performance Considerations"},"28":{"body":"When using just docs::serve, you get a built-in search feature: Click the search icon (🔍) in the top-left corner Type your query Press Enter to navigate results The search indexes all documentation content including: Page titles Headers Body text Code examples (optionally)","breadcrumbs":"Introduction » 🔍 Searching the Documentation","id":"28","title":"🔍 Searching the Documentation"},"280":{"body":"No unsafe code : #![forbid(unsafe_code)] Input validation : Nickel contracts validate config serde validates JSON Custom validation for user input File operations : Path sanitization (no ../ traversal) Permissions checking Atomic writes (temp file + rename)","breadcrumbs":"System Overview » Security","id":"280","title":"Security"},"281":{"body":"Small Projects (< 1000 nodes): Filesystem storage In-memory search Local embeddings (fastembed) Medium Projects (1000-10,000 nodes): Filesystem + SurrealDB sync Semantic search with caching Cloud embeddings (OpenAI/Claude) Large Organizations (> 10,000 nodes): SurrealDB primary Distributed embeddings Multi-graph federation","breadcrumbs":"System Overview » Scalability","id":"281","title":"Scalability"},"282":{"body":"Graph Model Details : Graph Model Storage Deep Dive : Storage Architecture ADRs : Architectural Decisions Implementation : Development Guide","breadcrumbs":"System Overview » Next Steps","id":"282","title":"Next Steps"},"283":{"body":"","breadcrumbs":"Graph Model » Graph Model","id":"283","title":"Graph Model"},"284":{"body":"The KOGRAL follows a config-driven architecture where all behavior is defined through Nickel configuration files rather than hardcoded in Rust.","breadcrumbs":"Config-Driven Design » Config-Driven Architecture","id":"284","title":"Config-Driven Architecture"},"285":{"body":"\\"Configuration, not code, defines behavior\\" Instead of hardcoding storage backends, embedding providers, or query parameters, KB uses a layered configuration system that composes settings from multiple sources: Schema contracts (type definitions) Defaults (base values) Mode overlays (dev/prod/test optimizations) User customizations (project-specific overrides) This approach provides: ✅ Type safety - Nickel contracts validate configuration before runtime ✅ Composability - Mix and match configurations for different environments ✅ Discoverability - Self-documenting schemas with inline documentation ✅ Hot-reload - Change behavior without recompiling Rust code ✅ Double validation - Nickel contracts + serde ensure correctness","breadcrumbs":"Config-Driven Design » Philosophy","id":"285","title":"Philosophy"},"286":{"body":"Configuration Composition The configuration system uses a four-layer composition pattern :","breadcrumbs":"Config-Driven Design » Configuration Composition Flow","id":"286","title":"Configuration Composition Flow"},"287":{"body":"Location : schemas/kb/contracts.ncl Purpose : Define types and validation rules using Nickel contracts. Example : { StorageType = [| \'filesystem, \'memory, \'surrealdb |], StorageConfig = { primary | StorageType | doc \\"Primary storage backend\\" | default = \'filesystem, secondary | SecondaryStorageConfig | doc \\"Optional secondary storage\\" | default = { enabled = false }, },\\n} Benefits : Enum validation (only valid storage types accepted) Required vs optional fields Default values for optional fields Documentation attached to types","breadcrumbs":"Config-Driven Design » Layer 1: Schema Contracts","id":"287","title":"Layer 1: Schema Contracts"},"288":{"body":"Location : schemas/kb/defaults.ncl Purpose : Provide sensible base values for all configuration options. Example : { base = { storage = { primary = \'filesystem, secondary = { enabled = false, type = \'surrealdb, url = \\"ws://localhost:8000\\", }, }, embeddings = { enabled = true, provider = \'fastembed, model = \\"BAAI/bge-small-en-v1.5\\", dimensions = 384, }, } | contracts.KbConfig,\\n} Validated by : contracts.KbConfig contract ensures defaults are valid.","breadcrumbs":"Config-Driven Design » Layer 2: Defaults","id":"288","title":"Layer 2: Defaults"},"289":{"body":"Location : schemas/kb/modes/{dev,prod,test}.ncl Purpose : Environment-specific optimizations and tuning. Development Mode (dev.ncl) Optimized for: Fast iteration, local development, debugging { storage = { primary = \'filesystem, secondary = { enabled = false }, # No database overhead }, embeddings = { provider = \'fastembed, # Local, no API costs }, sync = { auto_index = false, # Manual control },\\n} Production Mode (prod.ncl) Optimized for: Performance, reliability, scalability { storage = { secondary = { enabled = true }, # SurrealDB for scale }, embeddings = { provider = \'openai, # High-quality cloud embeddings model = \\"text-embedding-3-small\\", dimensions = 1536, }, sync = { auto_index = true, debounce_ms = 300, # Fast response },\\n} Test Mode (test.ncl) Optimized for: Fast tests, isolation, determinism { storage = { primary = \'memory, # Ephemeral, no disk I/O }, embeddings = { enabled = false, # Disable for speed }, sync = { auto_index = false, debounce_ms = 0, # No delays in tests },\\n}","breadcrumbs":"Config-Driven Design » Layer 3: Mode Overlays","id":"289","title":"Layer 3: Mode Overlays"},"29":{"body":"","breadcrumbs":"Introduction » ✏️ Editing Documentation","id":"29","title":"✏️ Editing Documentation"},"290":{"body":"Location : .kb-config/core/kb.ncl or .kb-config/platform/{dev,prod,test}.ncl Purpose : Project-specific or deployment-specific overrides. Example (user project config): let mode = import \\"../../schemas/kb/modes/dev.ncl\\" in let user_custom = { graph = { name = \\"my-project\\", }, embeddings = { provider = \'claude, # Override to use Claude model = \\"claude-3-haiku-20240307\\", }, query = { similarity_threshold = 0.7, # Stricter threshold },\\n} in helpers.compose_config defaults.base mode user_custom | contracts.KbConfig","breadcrumbs":"Config-Driven Design » Layer 4: User Customizations","id":"290","title":"Layer 4: User Customizations"},"291":{"body":"The helpers.ncl module provides the composition function: { # Recursively merge with override precedence merge_with_override = fun base override => /* ... */, # Compose three layers compose_config = fun defaults mode_config user_custom => let with_mode = merge_with_override defaults mode_config in merge_with_override with_mode user_custom,\\n} Merge behavior : Records are merged recursively Override values take precedence over base values Arrays are not merged, override replaces base Null in override keeps base value Example merge : base = { storage = { primary = \'filesystem }, embeddings = { enabled = true } }\\noverride = { storage = { primary = \'memory } }\\n# Result: { storage = { primary = \'memory }, embeddings = { enabled = true } }","breadcrumbs":"Config-Driven Design » Composition Mechanism","id":"291","title":"Composition Mechanism"},"292":{"body":"Once composed, the Nickel configuration is exported to JSON for Rust consumption: nickel export --format json .kb-config/core/kb.ncl > .kb-config/targets/kb-core.json Output (.kb-config/targets/kb-core.json): { \\"graph\\": { \\"name\\": \\"my-project\\", \\"version\\": \\"1.0.0\\" }, \\"storage\\": { \\"primary\\": \\"memory\\", \\"secondary\\": { \\"enabled\\": false } }, \\"embeddings\\": { \\"enabled\\": true, \\"provider\\": \\"claude\\", \\"model\\": \\"claude-3-haiku-20240307\\", \\"dimensions\\": 768 }\\n}","breadcrumbs":"Config-Driven Design » Export to JSON","id":"292","title":"Export to JSON"},"293":{"body":"The Rust code deserializes the JSON into typed structs using serde: use serde::{Deserialize, Serialize}; #[derive(Debug, Deserialize, Serialize)]\\npub struct KbConfig { pub graph: GraphConfig, pub storage: StorageConfig, pub embeddings: EmbeddingConfig, pub templates: TemplateConfig, pub query: QueryConfig, pub mcp: McpConfig, pub sync: SyncConfig,\\n} impl KbConfig { pub fn from_file(path: &Path) -> Result { let json = std::fs::read_to_string(path)?; let config: KbConfig = serde_json::from_str(&json)?; Ok(config) }\\n} Usage in kb-core : let config = KbConfig::from_file(\\".kb-config/targets/kb-core.json\\")?; // Config drives behavior\\nlet storage: Box = match config.storage.primary { StorageType::Filesystem => Box::new(FilesystemStorage::new(&config)?), StorageType::Memory => Box::new(MemoryStorage::new()), StorageType::SurrealDb => Box::new(SurrealDbStorage::new(&config).await?),\\n}; let embeddings: Box = match config.embeddings.provider { EmbeddingProviderType::FastEmbed => Box::new(FastEmbedProvider::new()?), EmbeddingProviderType::OpenAI => Box::new(RigEmbeddingProvider::openai(&config)?), EmbeddingProviderType::Claude => Box::new(RigEmbeddingProvider::claude(&config)?), EmbeddingProviderType::Ollama => Box::new(RigEmbeddingProvider::ollama(&config)?),\\n};","breadcrumbs":"Config-Driven Design » Rust Integration","id":"293","title":"Rust Integration"},"294":{"body":"Configuration is validated twice :","breadcrumbs":"Config-Driven Design » Double Validation","id":"294","title":"Double Validation"},"295":{"body":"At export time, Nickel validates: ✅ Types match contracts (e.g., primary | StorageType) ✅ Required fields are present ✅ Enums have valid values ✅ Nested structure is correct Error example : error: contract broken by a value ┌─ .kb-config/core/kb.ncl:15:5 │\\n15│ primary = \'invalid, │ ^^^^^^^^^^^^^^^^^^^ applied to this expression │ = This value is not in the enum [\'filesystem, \'memory, \'surrealdb]","breadcrumbs":"Config-Driven Design » 1. Nickel Contract Validation","id":"295","title":"1. Nickel Contract Validation"},"296":{"body":"At runtime, serde validates: ✅ JSON structure matches Rust types ✅ Field names match (with rename support) ✅ Values can be converted to Rust types ✅ Required fields are not null Error example : Error: missing field `graph` at line 1 column 123","breadcrumbs":"Config-Driven Design » 2. Serde Deserialization Validation","id":"296","title":"2. Serde Deserialization Validation"},"297":{"body":"","breadcrumbs":"Config-Driven Design » Benefits of Config-Driven Architecture","id":"297","title":"Benefits of Config-Driven Architecture"},"298":{"body":"Bad (hardcoded): // Hardcoded - requires recompilation to change\\nlet storage = FilesystemStorage::new(\\"/fixed/path\\");\\nlet threshold = 0.6; Good (config-driven): // Config-driven - change via .ncl file\\nlet storage = create_storage(&config)?;\\nlet threshold = config.query.similarity_threshold;","breadcrumbs":"Config-Driven Design » 1. Zero Hardcoding","id":"298","title":"1. Zero Hardcoding"},"299":{"body":"Same codebase, different behavior: # Development\\nnickel export .kb-config/platform/dev.ncl > targets/kb-core.json\\n# → Filesystem storage, fastembed, no auto-sync # Production\\nnickel export .kb-config/platform/prod.ncl > targets/kb-core.json\\n# → SurrealDB enabled, OpenAI embeddings, auto-sync # Testing\\nnickel export .kb-config/platform/test.ncl > targets/kb-core.json\\n# → In-memory storage, no embeddings, isolated","breadcrumbs":"Config-Driven Design » 2. Environment Flexibility","id":"299","title":"2. Environment Flexibility"},"3":{"body":"Generate static HTML files you can browse offline: # Build mdBook to docs/book/\\njust docs::build Then open docs/book/index.html in your browser.","breadcrumbs":"Introduction » Option 2: Build Static HTML","id":"3","title":"Option 2: Build Static HTML"},"30":{"body":"All documentation is written in GitHub Flavored Markdown with mdBook extensions. See contributing/documentation.md for detailed editing guidelines.","breadcrumbs":"Introduction » File Format","id":"30","title":"File Format"},"300":{"body":"Nickel contracts include inline documentation: StorageType = [| \'filesystem, \'memory, \'surrealdb |] | doc \\"Storage backend type: filesystem (git-tracked), memory (ephemeral), surrealdb (scalable)\\", IDEs can show this documentation when editing .ncl files.","breadcrumbs":"Config-Driven Design » 3. Self-Documenting","id":"300","title":"3. Self-Documenting"},"301":{"body":"When adding new features: Update contract in contracts.ncl Add default in defaults.ncl Export validates existing configs Rust compilation validates deserialization Breaking changes are caught before runtime .","breadcrumbs":"Config-Driven Design » 4. Type-Safe Evolution","id":"301","title":"4. Type-Safe Evolution"},"302":{"body":"Different test scenarios without code changes: # test-semantic-search.ncl\\nlet test_config = defaults.base & { embeddings = { enabled = true, provider = \'fastembed }, query = { similarity_threshold = 0.3 },\\n} in test_config #[test]\\nfn test_semantic_search() { let config = KbConfig::from_file(\\"test-semantic-search.json\\")?; // Config drives test behavior\\n}","breadcrumbs":"Config-Driven Design » 5. Testability","id":"302","title":"5. Testability"},"303":{"body":"KB tools automatically discover configuration: Check .kb-config/targets/kb-core.json (pre-exported) Check .kb-config/core/kb.ncl (export on-demand) Check environment variable KB_CONFIG Fall back to embedded defaults impl KbConfig { pub fn discover() -> Result { if let Ok(config) = Self::from_file(\\".kb-config/targets/kb-core.json\\") { return Ok(config); } if Path::new(\\".kb-config/core/kb.ncl\\").exists() { // Export and load let output = Command::new(\\"nickel\\") .args([\\"export\\", \\"--format\\", \\"json\\", \\".kb-config/core/kb.ncl\\"]) .output()?; return serde_json::from_slice(&output.stdout)?; } if let Ok(path) = std::env::var(\\"KB_CONFIG\\") { return Self::from_file(&path); } Ok(Self::default()) // Embedded defaults }\\n}","breadcrumbs":"Config-Driven Design » Configuration Discovery","id":"303","title":"Configuration Discovery"},"304":{"body":"The justfile integrates configuration validation: # Validate all Nickel configs\\nnickel-validate-all: @echo \\"Validating Nickel schemas...\\" nickel typecheck schemas/kb/contracts.ncl nickel typecheck schemas/kb/defaults.ncl nickel typecheck schemas/kb/helpers.ncl nickel typecheck schemas/kb/modes/dev.ncl nickel typecheck schemas/kb/modes/prod.ncl nickel typecheck schemas/kb/modes/test.ncl nickel typecheck .kb-config/core/kb.ncl # Export all platform configs\\nnickel-export-all: @echo \\"Exporting platform configs to JSON...\\" @mkdir -p .kb-config/targets nickel export --format json .kb-config/platform/dev.ncl > .kb-config/targets/kb-dev.json nickel export --format json .kb-config/platform/prod.ncl > .kb-config/targets/kb-prod.json nickel export --format json .kb-config/platform/test.ncl > .kb-config/targets/kb-test.json @echo \\"Exported 3 configurations to .kb-config/targets/\\" Usage: just nickel::validate-all # Check configs are valid\\njust nickel::export-all # Generate JSON for all environments","breadcrumbs":"Config-Driven Design » Integration with justfile","id":"304","title":"Integration with justfile"},"305":{"body":"","breadcrumbs":"Config-Driven Design » Best Practices","id":"305","title":"Best Practices"},"306":{"body":"If it\'s behavior, it\'s config: Storage paths API endpoints Thresholds Timeouts Feature flags Provider selection","breadcrumbs":"Config-Driven Design » 1. Never Hardcode","id":"306","title":"1. Never Hardcode"},"307":{"body":"Don\'t put environment-specific values in user config: Bad : # user config with env-specific values\\n{ storage = { url = if env == \\"prod\\" then \\"prod-url\\" else \\"dev-url\\" # Don\'t do this }\\n} Good : # modes/prod.ncl\\n{ storage = { url = \\"prod-url\\" } } # modes/dev.ncl\\n{ storage = { url = \\"dev-url\\" } } # user config is environment-agnostic\\n{ graph = { name = \\"my-project\\" } }","breadcrumbs":"Config-Driven Design » 2. Use Modes for Environment Differences","id":"307","title":"2. Use Modes for Environment Differences"},"308":{"body":"Use Nickel\'s doc metadata: similarity_threshold | Number | doc \\"Minimum cosine similarity (0-1) for semantic search matches. Higher = stricter.\\" | default = 0.6,","breadcrumbs":"Config-Driven Design » 3. Document Complex Fields","id":"308","title":"3. Document Complex Fields"},"309":{"body":"Run nickel typecheck in CI/CD before building Rust code.","breadcrumbs":"Config-Driven Design » 4. Validate Early","id":"309","title":"4. Validate Early"},"31":{"body":"Create the markdown file in the appropriate directory Add it to SUMMARY.md for navigation Build to verify: just docs::build","breadcrumbs":"Introduction » Adding a New Page","id":"31","title":"Adding a New Page"},"310":{"body":"Track .ncl files in git, ignore .kb-config/targets/*.json (generated).","breadcrumbs":"Config-Driven Design » 5. Version Configs","id":"310","title":"5. Version Configs"},"311":{"body":"Schema Reference : Configuration Schema User Guide : Configuration Guide ADR : Why Nickel vs TOML Examples : .kb-config/core/kb.ncl, .kb-config/platform/*.ncl","breadcrumbs":"Config-Driven Design » See Also","id":"311","title":"See Also"},"312":{"body":"","breadcrumbs":"Storage Architecture » Storage Architecture","id":"312","title":"Storage Architecture"},"313":{"body":"","breadcrumbs":"Logseq Blocks Design » Logseq Blocks Support - Architecture Design","id":"313","title":"Logseq Blocks Support - Architecture Design"},"314":{"body":"Logseq uses content blocks as the fundamental unit of information, not full documents. Each block can have: Properties : #card, TODO, DONE, custom properties Tags : Inline tags like #flashcard, #important References : Block references ((block-id)), page references [[page]] Nesting : Outliner-style hierarchy (parent-child blocks) Metadata : Block-level properties (unlike page-level frontmatter) Current KB limitation : Nodes only have content: String (flat markdown). Importing from Logseq loses block structure and properties. Requirement : Support round-trip import/export with full block fidelity: Logseq Graph → KOGRAL Import → KOGRAL Storage → KOGRAL Export → Logseq Graph (blocks preserved) (blocks preserved)","breadcrumbs":"Logseq Blocks Design » Problem Statement","id":"314","title":"Problem Statement"},"315":{"body":"","breadcrumbs":"Logseq Blocks Design » Use Cases","id":"315","title":"Use Cases"},"316":{"body":"Logseq : - What is Rust\'s ownership model? #card - Rust uses ownership, borrowing, and lifetimes - Three rules: one owner, many borrows XOR one mutable KB needs to preserve : Block with #card property Nested answer blocks Ability to query all cards","breadcrumbs":"Logseq Blocks Design » 1. Flashcards (#card)","id":"316","title":"1. Flashcards (#card)"},"317":{"body":"Logseq : - TODO Implement block parser #rust - DONE Research block structure - TODO Write parser tests KB needs to preserve : Task status per block Hierarchical task breakdown Tags on tasks","breadcrumbs":"Logseq Blocks Design » 2. Task Tracking (TODO/DONE)","id":"317","title":"2. Task Tracking (TODO/DONE)"},"318":{"body":"Logseq : - Core concept: ((block-uuid-123)) - See also: [[Related Page]] KB needs to preserve : Block-to-block links (not just page-to-page) UUID references","breadcrumbs":"Logseq Blocks Design » 3. Block References","id":"318","title":"3. Block References"},"319":{"body":"Logseq : - This is a block with properties property1:: value1 property2:: value2 KB needs to preserve : Custom key-value properties per block Property inheritance/override","breadcrumbs":"Logseq Blocks Design » 4. Block Properties","id":"319","title":"4. Block Properties"},"32":{"body":"Create the directory Add a README.md for the section landing page Add section to SUMMARY.md","breadcrumbs":"Introduction » Adding a New Section","id":"32","title":"Adding a New Section"},"320":{"body":"","breadcrumbs":"Logseq Blocks Design » Design Options","id":"320","title":"Design Options"},"321":{"body":"Add blocks field to Node : pub struct Node { // ... existing fields ... pub content: String, // Backward compat: flat markdown pub blocks: Option>, // NEW: Structured blocks\\n} pub struct Block { pub id: String, // UUID or auto-generated pub content: String, // Block text pub properties: BlockProperties, // Tags, status, custom props pub children: Vec, // Nested blocks pub created: DateTime, pub modified: DateTime,\\n} pub struct BlockProperties { pub tags: Vec, // #card, #important pub status: Option, // TODO, DONE, WAITING pub custom: HashMap, // property:: value\\n} pub enum TaskStatus { Todo, Doing, Done, Waiting, Cancelled,\\n} Pros : ✅ Type-safe, explicit structure ✅ Queryable (find all #card blocks) ✅ Preserves hierarchy ✅ Supports block-level operations Cons : ❌ Adds complexity to Node ❌ Dual representation (content + blocks) ❌ Requires migration of existing data","breadcrumbs":"Logseq Blocks Design » Option A: Blocks as First-Class Data Structure","id":"321","title":"Option A: Blocks as First-Class Data Structure"},"322":{"body":"Keep content: String, parse blocks on-demand : pub struct BlockParser; impl BlockParser { // Parse markdown content into block structure fn parse(content: &str) -> Vec; // Serialize blocks back to markdown fn serialize(blocks: &[Block]) -> String;\\n} // Usage\\nlet blocks = BlockParser::parse(&node.content);\\nlet filtered = blocks.iter().filter(|b| b.properties.tags.contains(\\"card\\")); Pros : ✅ No schema changes ✅ Backward compatible ✅ Simple storage (still just String) Cons : ❌ Parse overhead on every access ❌ Can\'t query blocks in database (SurrealDB) ❌ Harder to index/search blocks","breadcrumbs":"Logseq Blocks Design » Option B: Parser-Only Approach","id":"322","title":"Option B: Parser-Only Approach"},"323":{"body":"Combine both: structured storage + lazy parsing : pub struct Node { // ... existing fields ... pub content: String, // Source of truth (markdown) #[serde(skip_serializing_if = \\"Option::is_none\\")] pub blocks: Option>, // Cached structure (parsed)\\n} impl Node { // Parse blocks from content if not already cached pub fn get_blocks(&mut self) -> &Vec { if self.blocks.is_none() { self.blocks = Some(BlockParser::parse(&self.content)); } self.blocks.as_ref().unwrap() } // Update content from blocks (when blocks modified) pub fn sync_blocks_to_content(&mut self) { if let Some(ref blocks) = self.blocks { self.content = BlockParser::serialize(blocks); } }\\n} Storage Strategy : Filesystem - Store as markdown (Logseq compatible): - Block 1 #card - Nested block\\n- Block 2 TODO SurrealDB - Store both: DEFINE TABLE block SCHEMAFULL;\\nDEFINE FIELD node_id ON block TYPE record(node);\\nDEFINE FIELD block_id ON block TYPE string;\\nDEFINE FIELD content ON block TYPE string;\\nDEFINE FIELD properties ON block TYPE object;\\nDEFINE FIELD parent_id ON block TYPE option; -- Index for queries\\nDEFINE INDEX block_tags ON block COLUMNS properties.tags;\\nDEFINE INDEX block_status ON block COLUMNS properties.status; Pros : ✅ Best of both worlds ✅ Filesystem stays Logseq-compatible ✅ SurrealDB can query blocks ✅ Lazy parsing (only when needed) ✅ Backward compatible Cons : ⚠️ Need to keep content/blocks in sync ⚠️ More complex implementation","breadcrumbs":"Logseq Blocks Design » Option C: Hybrid Approach (RECOMMENDED)","id":"323","title":"Option C: Hybrid Approach (RECOMMENDED)"},"324":{"body":"Phase 1: Data Model // crates/kb-core/src/models/block.rs use chrono::{DateTime, Utc};\\nuse serde::{Deserialize, Serialize};\\nuse std::collections::HashMap; /// A content block (Logseq-style)\\n#[derive(Debug, Clone, Serialize, Deserialize)]\\npub struct Block { /// Unique block identifier (UUID) pub id: String, /// Block content (markdown text, excluding nested blocks) pub content: String, /// Block properties (tags, status, custom) pub properties: BlockProperties, /// Child blocks (nested hierarchy) #[serde(default)] pub children: Vec, /// Creation timestamp pub created: DateTime, /// Last modification timestamp pub modified: DateTime, /// Parent block ID (if nested) #[serde(skip_serializing_if = \\"Option::is_none\\")] pub parent_id: Option,\\n} /// Block-level properties\\n#[derive(Debug, Clone, Default, Serialize, Deserialize)]\\npub struct BlockProperties { /// Tags (e.g., #card, #important) #[serde(default)] pub tags: Vec, /// Task status (TODO, DONE, etc.) #[serde(skip_serializing_if = \\"Option::is_none\\")] pub status: Option, /// Custom properties (property:: value) #[serde(default)] pub custom: HashMap, /// Block references ((uuid)) #[serde(default)] pub block_refs: Vec, /// Page references ([[page]]) #[serde(default)] pub page_refs: Vec,\\n} /// Task status for TODO blocks\\n#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]\\n#[serde(rename_all = \\"UPPERCASE\\")]\\npub enum TaskStatus { Todo, Doing, Done, Later, Now, Waiting, Cancelled,\\n} impl Block { /// Create a new block with content pub fn new(content: String) -> Self { use uuid::Uuid; Self { id: Uuid::new_v4().to_string(), content, properties: BlockProperties::default(), children: Vec::new(), created: Utc::now(), modified: Utc::now(), parent_id: None, } } /// Add a child block pub fn add_child(&mut self, mut child: Block) { child.parent_id = Some(self.id.clone()); self.children.push(child); self.modified = Utc::now(); } /// Add a tag to this block pub fn add_tag(&mut self, tag: String) { if !self.properties.tags.contains(&tag) { self.properties.tags.push(tag); self.modified = Utc::now(); } } /// Set task status pub fn set_status(&mut self, status: TaskStatus) { self.properties.status = Some(status); self.modified = Utc::now(); } /// Get all blocks (self + descendants) as flat list pub fn flatten(&self) -> Vec<&Block> { let mut result = vec![self]; for child in &self.children { result.extend(child.flatten()); } result } /// Find block by ID in tree pub fn find(&self, id: &str) -> Option<&Block> { if self.id == id { return Some(self); } for child in &self.children { if let Some(found) = child.find(id) { return Some(found); } } None }\\n} Phase 2: Update Node Model // crates/kb-core/src/models.rs (modifications) use crate::models::block::Block; pub struct Node { // ... existing fields ... pub content: String, /// Structured blocks (optional, parsed from content) #[serde(skip_serializing_if = \\"Option::is_none\\")] pub blocks: Option>,\\n} impl Node { /// Get blocks, parsing from content if needed pub fn get_blocks(&mut self) -> Result<&Vec> { if self.blocks.is_none() { self.blocks = Some(crate::parser::BlockParser::parse(&self.content)?); } Ok(self.blocks.as_ref().unwrap()) } /// Update content from blocks pub fn sync_blocks_to_content(&mut self) { if let Some(ref blocks) = self.blocks { self.content = crate::parser::BlockParser::serialize(blocks); } } /// Find all blocks with a specific tag pub fn find_blocks_by_tag(&mut self, tag: &str) -> Result> { let blocks = self.get_blocks()?; let mut result = Vec::new(); for block in blocks { for b in block.flatten() { if b.properties.tags.iter().any(|t| t == tag) { result.push(b); } } } Ok(result) } /// Find all TODO blocks pub fn find_todos(&mut self) -> Result> { let blocks = self.get_blocks()?; let mut result = Vec::new(); for block in blocks { for b in block.flatten() { if matches!(b.properties.status, Some(TaskStatus::Todo)) { result.push(b); } } } Ok(result) }\\n} Phase 3: Block Parser // crates/kb-core/src/parser/block_parser.rs use crate::models::block::{Block, BlockProperties, TaskStatus};\\nuse regex::Regex; pub struct BlockParser; impl BlockParser { /// Parse markdown content into block structure /// /// Handles: /// - Outliner format (- prefix with indentation) /// - Tags (#card, #important) /// - Task status (TODO, DONE) /// - Properties (property:: value) /// - Block references (((uuid))) /// - Page references ([[page]]) pub fn parse(content: &str) -> Result> { let mut blocks = Vec::new(); let mut stack: Vec<(usize, Block)> = Vec::new(); // (indent_level, block) for line in content.lines() { // Detect indentation level let indent = count_indent(line); let trimmed = line.trim_start(); // Skip empty lines if trimmed.is_empty() { continue; } // Parse block line if let Some(block_content) = trimmed.strip_prefix(\\"- \\") { let mut block = Self::parse_block_line(block_content)?; // Pop stack until we find parent level while let Some((level, _)) = stack.last() { if *level < indent { break; } stack.pop(); } // Add as child to parent or as root if let Some((_, parent)) = stack.last_mut() { parent.add_child(block.clone()); } else { blocks.push(block.clone()); } stack.push((indent, block)); } } Ok(blocks) } /// Parse a single block line (after \\"- \\" prefix) fn parse_block_line(line: &str) -> Result { let mut block = Block::new(String::new()); let mut properties = BlockProperties::default(); // Extract task status (TODO, DONE, etc.) let (status, remaining) = Self::extract_task_status(line); properties.status = status; // Extract tags (#card, #important) let (tags, remaining) = Self::extract_tags(remaining); properties.tags = tags; // Extract properties (property:: value) let (custom_props, remaining) = Self::extract_properties(remaining); properties.custom = custom_props; // Extract block references (((uuid))) let (block_refs, remaining) = Self::extract_block_refs(remaining); properties.block_refs = block_refs; // Extract page references ([[page]]) let (page_refs, content) = Self::extract_page_refs(remaining); properties.page_refs = page_refs; block.content = content.trim().to_string(); block.properties = properties; Ok(block) } /// Serialize blocks back to markdown pub fn serialize(blocks: &[Block]) -> String { let mut result = String::new(); for block in blocks { Self::serialize_block(&mut result, block, 0); } result } fn serialize_block(output: &mut String, block: &Block, indent: usize) { // Write indent for _ in 0..indent { output.push_str(\\" \\"); } // Write prefix output.push_str(\\"- \\"); // Write task status if let Some(status) = block.properties.status { output.push_str(&format!(\\"{:?} \\", status).to_uppercase()); } // Write content output.push_str(&block.content); // Write tags for tag in &block.properties.tags { output.push_str(&format!(\\" #{}\\", tag)); } // Write properties if !block.properties.custom.is_empty() { output.push(\'\\\\n\'); for (key, value) in &block.properties.custom { for _ in 0..=indent { output.push_str(\\" \\"); } output.push_str(&format!(\\"{}:: {}\\\\n\\", key, value)); } } output.push(\'\\\\n\'); // Write children recursively for child in &block.children { Self::serialize_block(output, child, indent + 1); } } // Helper methods for extraction fn extract_task_status(line: &str) -> (Option, &str) { let line = line.trim_start(); if let Some(rest) = line.strip_prefix(\\"TODO \\") { (Some(TaskStatus::Todo), rest) } else if let Some(rest) = line.strip_prefix(\\"DONE \\") { (Some(TaskStatus::Done), rest) } else if let Some(rest) = line.strip_prefix(\\"DOING \\") { (Some(TaskStatus::Doing), rest) } else if let Some(rest) = line.strip_prefix(\\"LATER \\") { (Some(TaskStatus::Later), rest) } else if let Some(rest) = line.strip_prefix(\\"NOW \\") { (Some(TaskStatus::Now), rest) } else if let Some(rest) = line.strip_prefix(\\"WAITING \\") { (Some(TaskStatus::Waiting), rest) } else if let Some(rest) = line.strip_prefix(\\"CANCELLED \\") { (Some(TaskStatus::Cancelled), rest) } else { (None, line) } } fn extract_tags(line: &str) -> (Vec, String) { let tag_regex = Regex::new(r\\"#(\\\\w+)\\").unwrap(); let mut tags = Vec::new(); let mut result = line.to_string(); for cap in tag_regex.captures_iter(line) { if let Some(tag) = cap.get(1) { tags.push(tag.as_str().to_string()); result = result.replace(&format!(\\"#{}\\", tag.as_str()), \\"\\"); } } (tags, result.trim().to_string()) } fn extract_properties(line: &str) -> (HashMap, String) { let prop_regex = Regex::new(r\\"(\\\\w+)::\\\\s*([^\\\\n]+)\\").unwrap(); let mut props = HashMap::new(); let mut result = line.to_string(); for cap in prop_regex.captures_iter(line) { if let (Some(key), Some(value)) = (cap.get(1), cap.get(2)) { props.insert(key.as_str().to_string(), value.as_str().trim().to_string()); result = result.replace(&cap[0], \\"\\"); } } (props, result.trim().to_string()) } fn extract_block_refs(line: &str) -> (Vec, String) { let ref_regex = Regex::new(r\\"\\\\(\\\\(([^)]+)\\\\)\\\\)\\").unwrap(); let mut refs = Vec::new(); let mut result = line.to_string(); for cap in ref_regex.captures_iter(line) { if let Some(uuid) = cap.get(1) { refs.push(uuid.as_str().to_string()); result = result.replace(&cap[0], \\"\\"); } } (refs, result.trim().to_string()) } fn extract_page_refs(line: &str) -> (Vec, String) { let page_regex = Regex::new(r\\"\\\\[\\\\[([^\\\\]]+)\\\\]\\\\]\\").unwrap(); let mut pages = Vec::new(); let result = line.to_string(); for cap in page_regex.captures_iter(line) { if let Some(page) = cap.get(1) { pages.push(page.as_str().to_string()); // Keep [[page]] in content for now (backward compat) } } (pages, result) }\\n} fn count_indent(line: &str) -> usize { line.chars().take_while(|c| c.is_whitespace()).count() / 2\\n} Phase 4: Logseq Import/Export // crates/kb-core/src/logseq.rs use crate::models::{Node, NodeType};\\nuse crate::models::block::Block;\\nuse crate::parser::BlockParser; pub struct LogseqImporter; impl LogseqImporter { /// Import a Logseq page (markdown file) as a Node pub fn import_page(path: &Path) -> Result { let content = std::fs::read_to_string(path)?; // Extract frontmatter if present let (frontmatter, body) = Self::split_frontmatter(&content); // Parse blocks from body let blocks = BlockParser::parse(&body)?; // Create node with blocks let mut node = Node::new(NodeType::Note, Self::extract_title(path)); node.content = body; node.blocks = Some(blocks); // Apply frontmatter properties if let Some(fm) = frontmatter { Self::apply_frontmatter(&mut node, &fm)?; } Ok(node) } fn split_frontmatter(content: &str) -> (Option, String) { if content.starts_with(\\"---\\\\n\\") { if let Some(end) = content[4..].find(\\"\\\\n---\\\\n\\") { let frontmatter = content[4..4 + end].to_string(); let body = content[4 + end + 5..].to_string(); return (Some(frontmatter), body); } } (None, content.to_string()) } fn extract_title(path: &Path) -> String { path.file_stem() .and_then(|s| s.to_str()) .unwrap_or(\\"Untitled\\") .to_string() } fn apply_frontmatter(node: &mut Node, frontmatter: &str) -> Result<()> { // Parse YAML frontmatter and apply to node // ... implementation ... Ok(()) }\\n} pub struct LogseqExporter; impl LogseqExporter { /// Export a Node to Logseq page format pub fn export_page(node: &Node, path: &Path) -> Result<()> { let mut output = String::new(); // Generate frontmatter output.push_str(\\"---\\\\n\\"); output.push_str(&Self::generate_frontmatter(node)?); output.push_str(\\"---\\\\n\\\\n\\"); // Serialize blocks or use content if let Some(ref blocks) = node.blocks { output.push_str(&BlockParser::serialize(blocks)); } else { output.push_str(&node.content); } std::fs::write(path, output)?; Ok(()) } fn generate_frontmatter(node: &Node) -> Result { let mut fm = String::new(); fm.push_str(&format!(\\"title: {}\\\\n\\", node.title)); fm.push_str(&format!(\\"tags: {}\\\\n\\", node.tags.join(\\", \\"))); // ... more frontmatter fields ... Ok(fm) }\\n}","breadcrumbs":"Logseq Blocks Design » Recommended Implementation","id":"324","title":"Recommended Implementation"},"325":{"body":"// New methods in Graph or Query module impl Graph { /// Find all blocks with a specific tag across all nodes pub fn find_blocks_by_tag(&mut self, tag: &str) -> Vec<(&Node, &Block)> { let mut results = Vec::new(); for node in self.nodes.values_mut() { if let Ok(blocks) = node.find_blocks_by_tag(tag) { for block in blocks { results.push((node as &Node, block)); } } } results } /// Find all flashcards (#card blocks) pub fn find_flashcards(&mut self) -> Vec<(&Node, &Block)> { self.find_blocks_by_tag(\\"card\\") } /// Find all TODO items across knowledge base pub fn find_all_todos(&mut self) -> Vec<(&Node, &Block)> { let mut results = Vec::new(); for node in self.nodes.values_mut() { if let Ok(todos) = node.find_todos() { for block in todos { results.push((node as &Node, block)); } } } results }\\n}","breadcrumbs":"Logseq Blocks Design » Query API Extensions","id":"325","title":"Query API Extensions"},"326":{"body":"{ \\"name\\": \\"kogral/find_blocks\\", \\"description\\": \\"Find blocks by tag, status, or properties\\", \\"inputSchema\\": { \\"type\\": \\"object\\", \\"properties\\": { \\"tag\\": { \\"type\\": \\"string\\", \\"description\\": \\"Filter by tag (e.g., \'card\')\\" }, \\"status\\": { \\"type\\": \\"string\\", \\"enum\\": [\\"TODO\\", \\"DONE\\", \\"DOING\\"] }, \\"property\\": { \\"type\\": \\"string\\", \\"description\\": \\"Custom property key\\" }, \\"value\\": { \\"type\\": \\"string\\", \\"description\\": \\"Property value to match\\" } } }\\n}","breadcrumbs":"Logseq Blocks Design » MCP Tool Extensions","id":"326","title":"MCP Tool Extensions"},"327":{"body":"# schemas/kb/contracts.ncl (additions) BlockConfig = { enabled | Bool | doc \\"Enable block-level parsing and storage\\" | default = true, preserve_hierarchy | Bool | doc \\"Preserve block nesting on import/export\\" | default = true, parse_on_load | Bool | doc \\"Automatically parse blocks when loading nodes\\" | default = false, # Lazy parsing by default supported_statuses | Array String | doc \\"Supported task statuses\\" | default = [\\"TODO\\", \\"DONE\\", \\"DOING\\", \\"LATER\\", \\"NOW\\", \\"WAITING\\", \\"CANCELLED\\"],\\n} KbConfig = { # ... existing fields ... blocks | BlockConfig | doc \\"Block-level features configuration\\" | default = {},\\n}","breadcrumbs":"Logseq Blocks Design » Configuration","id":"327","title":"Configuration"},"328":{"body":"Phase 1 : Add Block models (no behavior change) Phase 2 : Add BlockParser (opt-in via config) Phase 3 : Update Logseq import/export Phase 4 : Add block queries to CLI/MCP Phase 5 : SurrealDB block indexing Backward Compatibility : Existing nodes without blocks field work as before content remains source of truth blocks is optional cache/structure Config flag blocks.enabled to opt-in","breadcrumbs":"Logseq Blocks Design » Migration Path","id":"328","title":"Migration Path"},"329":{"body":"#[cfg(test)]\\nmod tests { use super::*; #[test] fn test_parse_simple_block() { let content = \\"- This is a block #card\\"; let blocks = BlockParser::parse(content).unwrap(); assert_eq!(blocks.len(), 1); assert_eq!(blocks[0].content, \\"This is a block\\"); assert_eq!(blocks[0].properties.tags, vec![\\"card\\"]); } #[test] fn test_parse_nested_blocks() { let content = r#\\"\\n- Parent block - Child block 1 - Child block 2 - Grandchild\\n\\"#; let blocks = BlockParser::parse(content).unwrap(); assert_eq!(blocks.len(), 1); assert_eq!(blocks[0].children.len(), 2); assert_eq!(blocks[0].children[1].children.len(), 1); } #[test] fn test_parse_todo() { let content = \\"- TODO Implement feature #rust\\"; let blocks = BlockParser::parse(content).unwrap(); assert_eq!(blocks[0].properties.status, Some(TaskStatus::Todo)); assert_eq!(blocks[0].content, \\"Implement feature\\"); assert_eq!(blocks[0].properties.tags, vec![\\"rust\\"]); } #[test] fn test_roundtrip() { let original = r#\\"- Block 1 #card - Nested\\n- TODO Block 2 priority:: high\\n\\"#; let blocks = BlockParser::parse(original).unwrap(); let serialized = BlockParser::serialize(&blocks); let reparsed = BlockParser::parse(&serialized).unwrap(); assert_eq!(blocks.len(), reparsed.len()); assert_eq!(blocks[0].properties, reparsed[0].properties); }\\n}","breadcrumbs":"Logseq Blocks Design » Testing Strategy","id":"329","title":"Testing Strategy"},"33":{"body":"","breadcrumbs":"Introduction » 🧪 Testing Documentation","id":"33","title":"🧪 Testing Documentation"},"330":{"body":"Recommended Approach : Hybrid (Option C) Add Block struct with properties, hierarchy Extend Node with optional blocks: Option> Implement bidirectional parser (markdown ↔ blocks) Preserve content as source of truth (backward compat) Enable block queries in CLI/MCP Support round-trip Logseq import/export Benefits : ✅ Full Logseq compatibility ✅ Queryable blocks (find #card, TODO, etc.) ✅ Backward compatible ✅ Extensible (custom properties) ✅ Type-safe structure Trade-offs : ⚠️ Added complexity ⚠️ Need to sync content ↔ blocks ⚠️ More storage for SurrealDB backend Next Steps : Review and approve design Implement Phase 1 (Block models) Implement Phase 2 (BlockParser) Update Logseq import/export Add block queries to MCP/CLI","breadcrumbs":"Logseq Blocks Design » Summary","id":"330","title":"Summary"},"331":{"body":"Status : Accepted Date : 2026-01-17 Deciders : Architecture Team Context : Configuration Strategy for Knowledge Base System","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » ADR-001: Nickel vs TOML for Configuration","id":"331","title":"ADR-001: Nickel vs TOML for Configuration"},"332":{"body":"The KOGRAL requires a flexible, type-safe configuration format that supports: Complex nested structures (graph settings, storage configs, embedding providers) Type validation (prevent runtime errors from config mistakes) Composition and inheritance (shared configs, environment-specific overrides) Documentation (self-documenting schemas) Validation before runtime (catch errors early) We evaluated two primary options:","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Context","id":"332","title":"Context"},"333":{"body":"Pros : Widely adopted in Rust ecosystem (Cargo.toml) Simple, human-readable syntax Native serde support IDE support (syntax highlighting, completion) Cons : No type system (validation only at runtime) Limited composition (no imports, no functions) No schema validation (errors discovered during execution) Verbose for complex nested structures No documentation in config files Example TOML : [graph]\\nname = \\"my-project\\"\\nversion = \\"1.0.0\\" [storage]\\nprimary = \\"filesystem\\" # String, not validated as enum [storage.secondary]\\nenabled = true\\ntype = \\"surrealdb\\" # Typo would fail at runtime\\nurl = \\"ws://localhost:8000\\" [embeddings]\\nenabled = true\\nprovider = \\"openai\\" # No validation of valid providers\\nmodel = \\"text-embedding-3-small\\" Problems : Typos in enum values (\\"surrealdb\\" vs \\"surealdb\\") fail at runtime No validation that provider = \\"openai\\" requires api_key_env No documentation of valid options No way to compose configs (e.g., base config + environment override)","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Option 1: TOML (Traditional Config Format)","id":"333","title":"Option 1: TOML (Traditional Config Format)"},"334":{"body":"Pros : Type system with contracts (validate before runtime) Composition via imports and merging Documentation in schemas (self-documenting) Validation at export time (catch errors early) Functions for conditional logic Default values in schema definitions Cons : Less familiar to Rust developers Requires separate nickel CLI tool Smaller ecosystem Steeper learning curve Example Nickel : # schemas/kb-config.ncl\\n{ KbConfig = { graph | GraphConfig, storage | StorageConfig, embeddings | EmbeddingConfig, }, StorageConfig = { primary | [| \'filesystem, \'memory |], # Enum validated at export secondary | { enabled | Bool, type | [| \'surrealdb, \'sqlite |], # Typos caught immediately url | String, } | optional, }, EmbeddingConfig = { enabled | Bool, provider | [| \'openai, \'claude, \'fastembed |], # Valid providers enforced model | String, api_key_env | String | doc \\"Environment variable for API key\\", },\\n} Benefits : Typos in enum values caught at nickel export time Schema enforces required fields based on provider Documentation embedded in schema Config can be composed: import \\"base.ncl\\" & { /* overrides */ }","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Option 2: Nickel (Functional Configuration Language)","id":"334","title":"Option 2: Nickel (Functional Configuration Language)"},"335":{"body":"We will use Nickel for configuration. Implementation : Define schemas in schemas/*.ncl with type contracts Users write configs in .kogral/config.ncl Export to JSON via CLI: nickel export --format json config.ncl Load JSON in Rust via serde_json into typed structs Pattern (double validation): Nickel Config (.ncl) ↓ [nickel export]\\nJSON (validated by Nickel contracts) ↓ [serde_json::from_str]\\nRust Struct (validated by serde) ↓\\nRuntime (guaranteed valid config) Bridge Code (kb-core/src/config/nickel.rs): pub fn load_config>(path: P) -> Result { // Export Nickel to JSON let json = export_nickel_to_json(path)?; // Deserialize to Rust struct let config: KbConfig = serde_json::from_str(&json)?; Ok(config)\\n} fn export_nickel_to_json>(path: P) -> Result { let output = Command::new(\\"nickel\\") .arg(\\"export\\") .arg(\\"--format\\").arg(\\"json\\") .arg(path.as_ref()) .output()?; Ok(String::from_utf8(output.stdout)?)\\n}","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Decision","id":"335","title":"Decision"},"336":{"body":"","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Consequences","id":"336","title":"Consequences"},"337":{"body":"✅ Type Safety : Config errors caught before runtime Invalid enum values fail at export: \'filesystm → error Missing required fields detected: no graph.name → error Type mismatches prevented: enabled = \\"yes\\" → error (expects Bool) ✅ Self-Documenting : Schemas serve as documentation | doc \\"Environment variable for API key\\" describes fields Enum options visible in schema: [| \'openai, \'claude, \'fastembed |] Default values explicit: | default = \'filesystem ✅ Composition : Config reuse and overrides # base.ncl\\n{ graph = { version = \\"1.0.0\\" } } # project.ncl\\nimport \\"base.ncl\\" & { graph = { name = \\"my-project\\" } } ✅ Validation Before Deployment : Catch errors in CI # CI pipeline\\nnickel typecheck config.ncl\\nnickel export --format json config.ncl > /dev/null ✅ Conditional Logic : Environment-specific configs let is_prod = std.string.is_match \\"prod\\" (std.env.get \\"ENV\\") in\\n{ embeddings = { provider = if is_prod then \'openai else \'fastembed, },\\n}","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Positive","id":"337","title":"Positive"},"338":{"body":"❌ Learning Curve : Team must learn Nickel syntax Mitigation : Provide comprehensive examples in config/ directory Mitigation : Document common patterns in docs/config/ ❌ Tool Dependency : Requires nickel CLI installed Mitigation : Document installation in setup guide Mitigation : Check nickel availability in kb init command ❌ IDE Support : Limited compared to TOML Mitigation : Use LSP (nickel-lang-lsp) for VSCode/Neovim Mitigation : Syntax highlighting available for major editors ❌ Ecosystem Size : Smaller than TOML Mitigation : Nickel actively developed by Tweag Mitigation : Stable language specification (v1.0+)","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Negative","id":"338","title":"Negative"},"339":{"body":"⚪ Two-Stage Loading : Nickel → JSON → Rust Not a performance concern (config loaded once at startup) Adds resilience (double validation) Allows runtime config inspection (read JSON directly)","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Neutral","id":"339","title":"Neutral"},"34":{"body":"just docs::test This runs all Rust code examples in the documentation to ensure they compile.","breadcrumbs":"Introduction » Test Code Examples","id":"34","title":"Test Code Examples"},"340":{"body":"","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Alternatives Considered","id":"340","title":"Alternatives Considered"},"341":{"body":"Rejected : Not ergonomic for humans to write No comments Verbose syntax ({\\"key\\": \\"value\\"} vs key = value) JSON Schema separate from config (duplication)","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » JSON Schema","id":"341","title":"JSON Schema"},"342":{"body":"Rejected : No type system, ambiguous parsing Boolean confusion: yes/no/on/off/true/false Indentation-sensitive (error-prone) No validation without external tools","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » YAML","id":"342","title":"YAML"},"343":{"body":"Rejected : More complex than needed Turing-incomplete by design (limits use cases) Smaller ecosystem than Nickel Steeper learning curve","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Dhall","id":"343","title":"Dhall"},"344":{"body":"Rejected : Kubernetes-focused, less general-purpose Designed for K8s manifests Less mature than Nickel for general config","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » KCL (KusionStack Configuration Language)","id":"344","title":"KCL (KusionStack Configuration Language)"},"345":{"body":"✅ Define base schemas (schemas/kb-config.ncl) ✅ Implement Nickel loader (kb-core/src/config/nickel.rs) ✅ Create example configs (config/defaults.ncl, config/production.ncl) ✅ Document Nickel usage (docs/config/nickel-schemas.md) ⏳ Add LSP recommendations to setup guide ⏳ Create Nickel → TOML migration tool (for existing users)","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Implementation Timeline","id":"345","title":"Implementation Timeline"},"346":{"body":"Success Criteria : Config errors caught at export time (not runtime) Users can compose configs for different environments Team comfortable with Nickel syntax within 2 weeks Metrics : Number of config validation errors caught before runtime Time to diagnose config issues (should decrease) User feedback on config complexity","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Monitoring","id":"346","title":"Monitoring"},"347":{"body":"Nickel Language Nickel User Manual platform-config pattern (reference implementation) TOML Specification","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » References","id":"347","title":"References"},"348":{"body":"Date Author Change 2026-01-17 Architecture Team Initial decision Next ADR : ADR-002: FastEmbed via AI Providers","breadcrumbs":"ADR-001: Nickel vs TOML for Configuration » Revision History","id":"348","title":"Revision History"},"349":{"body":"Status : Accepted Date : 2026-01-17 Deciders : Architecture Team Context : Embedding Strategy for Semantic Search","breadcrumbs":"ADR-002: FastEmbed via AI Providers » ADR-002: FastEmbed via AI Providers for Embeddings","id":"349","title":"ADR-002: FastEmbed via AI Providers for Embeddings"},"35":{"body":"just docs::check-links This validates all internal and external links.","breadcrumbs":"Introduction » Check Links","id":"35","title":"Check Links"},"350":{"body":"The KOGRAL requires embedding generation for semantic search capabilities. Embeddings convert text into numerical vectors that capture semantic meaning, enabling \\"find concepts\\" rather than just \\"find keywords\\". Requirements : Local-First Option : Must work offline without external API dependencies Production Scalability : Support cloud AI providers for large-scale deployments Multiple Providers : Flexibility to choose based on cost, quality, privacy Cost-Effective Development : Free local embeddings for development and testing Quality : Good enough embeddings for finding related concepts Options Evaluated :","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Context","id":"350","title":"Context"},"351":{"body":"Pros : No API costs Works offline Privacy-preserving (no data leaves machine) Fast (local GPU acceleration possible) Cons : Limited model quality compared to cloud providers Resource-intensive (requires download ~100MB models) Single provider lock-in (fastembed library) Example : use fastembed::{TextEmbedding, InitOptions}; let model = TextEmbedding::try_new(InitOptions { model_name: \\"BAAI/bge-small-en-v1.5\\", ..Default::default()\\n})?; let embeddings = model.embed(vec![\\"Hello world\\"], None)?;\\n// Output: Vec> with 384 dimensions","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Option 1: Only Local Embeddings (fastembed)","id":"351","title":"Option 1: Only Local Embeddings (fastembed)"},"352":{"body":"Pros : State-of-the-art embedding quality No local resource usage Latest models available Scalable to millions of documents Cons : Requires API keys (cost per embedding) Network dependency (no offline mode) Privacy concerns (data sent to third parties) Vendor lock-in risk Example : use rig::providers::openai; let client = openai::Client::new(\\"sk-...\\");\\nlet embeddings = client.embeddings(\\"text-embedding-3-small\\") .embed_documents(vec![\\"Hello world\\"]).await?;\\n// Output: Vec> with 1536 dimensions","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Option 2: Only Cloud AI Providers (OpenAI, Claude, etc.)","id":"352","title":"Option 2: Only Cloud AI Providers (OpenAI, Claude, etc.)"},"353":{"body":"Pros : ✅ Best of both worlds: local dev, cloud production ✅ User choice: privacy-first or quality-first ✅ Cost flexibility: free for small projects, paid for scale ✅ Unified interface via rig-core library ✅ Easy provider switching (config-driven) Cons : ❌ More complex implementation (multiple providers) ❌ Dimension mismatch between providers (384 vs 1536) ❌ Additional dependencies (rig-core, fastembed)","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Option 3: Hybrid Strategy (fastembed + AI providers via rig-core)","id":"353","title":"Option 3: Hybrid Strategy (fastembed + AI providers via rig-core)"},"354":{"body":"We will use a hybrid strategy: fastembed (local) + AI providers (via rig-core). Implementation : Default : fastembed with BAAI/bge-small-en-v1.5 (384 dimensions) Optional : OpenAI, Claude, Ollama via rig-core (configurable) Interface : EmbeddingProvider trait abstracts provider details Config-Driven : Provider selection via Nickel configuration Architecture : #[async_trait]\\npub trait EmbeddingProvider: Send + Sync { async fn embed(&self, texts: Vec) -> Result>>; fn dimensions(&self) -> usize; fn model_name(&self) -> &str;\\n} // Local implementation\\npub struct FastEmbedProvider { model: TextEmbedding,\\n} impl FastEmbedProvider { pub fn new(model_name: &str) -> Result { let model = TextEmbedding::try_new(InitOptions { model_name: model_name.into(), ..Default::default() })?; Ok(Self { model }) }\\n} #[async_trait]\\nimpl EmbeddingProvider for FastEmbedProvider { async fn embed(&self, texts: Vec) -> Result>> { Ok(self.model.embed(texts, None)?) } fn dimensions(&self) -> usize { 384 } fn model_name(&self) -> &str { \\"BAAI/bge-small-en-v1.5\\" }\\n} // Cloud provider implementation (via rig-core)\\npub struct RigEmbeddingProvider { client: rig::Client, model: String, dimensions: usize,\\n} #[async_trait]\\nimpl EmbeddingProvider for RigEmbeddingProvider { async fn embed(&self, texts: Vec) -> Result>> { let embeddings = self.client .embeddings(&self.model) .embed_documents(texts) .await?; Ok(embeddings) } fn dimensions(&self) -> usize { self.dimensions } fn model_name(&self) -> &str { &self.model }\\n} Configuration (Nickel): # Local development (default)\\n{ embeddings = { enabled = true, provider = \'fastembed, model = \\"BAAI/bge-small-en-v1.5\\", dimensions = 384, },\\n} # Production with OpenAI\\n{ embeddings = { enabled = true, provider = \'openai, model = \\"text-embedding-3-small\\", dimensions = 1536, api_key_env = \\"OPENAI_API_KEY\\", },\\n} # Self-hosted with Ollama\\n{ embeddings = { enabled = true, provider = \'ollama, model = \\"nomic-embed-text\\", dimensions = 768, },\\n} Provider Selection (kb-core/src/embeddings/mod.rs): pub fn create_provider(config: &EmbeddingConfig) -> Result> { match config.provider { EmbeddingProviderType::FastEmbed => { Ok(Box::new(FastEmbedProvider::new(&config.model)?)) } EmbeddingProviderType::OpenAI => { let api_key = std::env::var(&config.api_key_env)?; Ok(Box::new(RigEmbeddingProvider::new_openai(api_key, &config.model)?)) } EmbeddingProviderType::Claude => { let api_key = std::env::var(&config.api_key_env)?; Ok(Box::new(RigEmbeddingProvider::new_claude(api_key, &config.model)?)) } EmbeddingProviderType::Ollama => { Ok(Box::new(RigEmbeddingProvider::new_ollama(&config.model)?)) } }\\n}","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Decision","id":"354","title":"Decision"},"355":{"body":"","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Consequences","id":"355","title":"Consequences"},"356":{"body":"✅ Development Flexibility : Developers can use fastembed without API keys Fast feedback loop (local embeddings, no network calls) Works offline (train trips, flights) ✅ Production Quality : Production deployments can use OpenAI/Claude for better quality Latest embedding models available Scalable to millions of documents ✅ Privacy Control : Privacy-sensitive projects use local embeddings Public projects can use cloud providers User choice via configuration ✅ Cost Optimization : Small projects: free (fastembed) Large projects: pay for quality (cloud providers) Hybrid: important docs via cloud, bulk via local ✅ Unified Interface : EmbeddingProvider trait abstracts provider details Query code doesn\'t know/care about provider Easy to add new providers","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Positive","id":"356","title":"Positive"},"357":{"body":"❌ Dimension Mismatch : fastembed: 384 dimensions OpenAI: 1536 dimensions Cannot mix in same index Mitigation : Store provider + dimensions in node metadata Rebuild index when changing providers Document dimension constraints ❌ Model Download : First use of fastembed downloads ~100MB model Slow initial startup Mitigation : Pre-download in Docker images Document model download in setup guide Cache models in ~/.cache/fastembed ❌ Complex Configuration : Multiple provider options may confuse users Mitigation : Sane default (fastembed) Clear examples for each provider Validation errors explain misconfigurations","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Negative","id":"357","title":"Negative"},"358":{"body":"⚪ Dependency Trade-off : fastembed adds ~5MB to binary rig-core adds ~2MB Total: ~7MB overhead Not a concern for CLI/MCP server use case.","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Neutral","id":"358","title":"Neutral"},"359":{"body":"Provider Dimensions Quality Cost Privacy Offline fastembed 384 Good Free ✅ Local ✅ Yes OpenAI 1536 Excellent $0.0001/1K ❌ Cloud ❌ No Claude 1024 Excellent $0.00025/1K ❌ Cloud ❌ No Ollama 768 Very Good Free ✅ Local ✅ Yes Recommendation by Use Case : Development : fastembed (fast, free, offline) Small Teams : fastembed or Ollama (privacy, no costs) Enterprise : OpenAI or Claude (best quality, scalable) Self-Hosted : Ollama (good quality, local control)","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Provider Comparison","id":"359","title":"Provider Comparison"},"36":{"body":"When contributing to documentation: Use clear, concise language - Write for developers and AI agents Include code examples - Show, don\'t just tell Add diagrams where helpful - Visual aids improve understanding Link related concepts - Help readers discover related content Test code examples - Ensure code compiles and works Use consistent formatting - Follow existing page structure Update SUMMARY.md - New pages must be in navigation Run checks before committing : just docs::build\\njust docs::test\\njust docs::check-links","breadcrumbs":"Introduction » 📝 Documentation Standards","id":"36","title":"📝 Documentation Standards"},"360":{"body":"✅ Define EmbeddingProvider trait ✅ Implement FastEmbedProvider (stub, feature-gated) ✅ Implement RigEmbeddingProvider (stub, feature-gated) ⏳ Complete FastEmbed integration with model download ⏳ Complete rig-core integration (OpenAI, Claude, Ollama) ⏳ Add query engine with similarity search ⏳ Document provider selection and trade-offs","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Implementation Timeline","id":"360","title":"Implementation Timeline"},"361":{"body":"Success Criteria : Users can switch providers via config change Local embeddings work without API keys Production deployments use cloud providers successfully Query quality acceptable for both local and cloud embeddings Metrics : Embedding generation latency (local vs cloud) Query accuracy (precision@10 for semantic search) API costs (cloud providers) User satisfaction (feedback on search quality)","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Monitoring","id":"361","title":"Monitoring"},"362":{"body":"fastembed Documentation rig-core Documentation OpenAI Embeddings API BAAI/bge Models Ollama Embeddings","breadcrumbs":"ADR-002: FastEmbed via AI Providers » References","id":"362","title":"References"},"363":{"body":"Date Author Change 2026-01-17 Architecture Team Initial decision Previous ADR : ADR-001: Nickel vs TOML Next ADR : ADR-003: Hybrid Storage Strategy","breadcrumbs":"ADR-002: FastEmbed via AI Providers » Revision History","id":"363","title":"Revision History"},"364":{"body":"Status : Accepted Date : 2026-01-17 Deciders : Architecture Team Context : Storage Backend Strategy for Knowledge Base","breadcrumbs":"ADR-003: Hybrid Storage Strategy » ADR-003: Hybrid Storage Strategy","id":"364","title":"ADR-003: Hybrid Storage Strategy"},"365":{"body":"The KOGRAL needs to store knowledge graphs with these requirements: Git-Friendly : Knowledge should version alongside code Scalable : Support small projects (10s of nodes) to large organizations (10,000+ nodes) Queryable : Efficient graph queries and relationship traversal Offline-Capable : Work without network access Collaborative : Support shared organizational knowledge Cost-Effective : Free for small projects, reasonable cost at scale Constraints : Developers want to edit knowledge in text editors Organizations want centralized guideline management Git workflows essential for code-adjacent knowledge Large graphs need database performance","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Context","id":"365","title":"Context"},"366":{"body":"Approach : Store everything as markdown files Pros : ✅ Git-native (perfect for versioning) ✅ Text editor friendly ✅ No dependencies ✅ Works offline ✅ Free Cons : ❌ Poor performance for large graphs (100 0+ nodes) ❌ No efficient graph queries ❌ Difficult to share across projects ❌ Manual sync for collaboration Scalability : Good for < 100 nodes, poor beyond","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Option 1: Filesystem Only","id":"366","title":"Option 1: Filesystem Only"},"367":{"body":"Approach : Store all knowledge in SurrealDB graph database Pros : ✅ Excellent query performance ✅ Native graph relationships ✅ Scalable to millions of nodes ✅ Centralized for collaboration Cons : ❌ Not git-trackable ❌ Requires running database server ❌ Can\'t edit with text editor ❌ Network dependency ❌ Infrastructure cost Scalability : Excellent, but loses developer workflow benefits","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Option 2: Database Only (SurrealDB)","id":"367","title":"Option 2: Database Only (SurrealDB)"},"368":{"body":"Approach : Filesystem for local project knowledge, SurrealDB for shared organizational knowledge Pros : ✅ Git-friendly for project knowledge ✅ Text editor friendly ✅ Scalable for shared knowledge ✅ Works offline (local graph) ✅ Collaborative (shared graph) ✅ Cost-effective (DB only for shared) Cons : ❌ More complex implementation ❌ Sync mechanism needed ❌ Two storage systems to manage Scalability : Excellent - best of both worlds","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Option 3: Hybrid (Filesystem + SurrealDB)","id":"368","title":"Option 3: Hybrid (Filesystem + SurrealDB)"},"369":{"body":"We will use a hybrid storage strategy: Filesystem (local) + SurrealDB (shared). Architecture : ┌─────────────────────────────────────────────────────────────┐\\n│ Project A (.kogral/) │\\n│ Storage: Filesystem (git-tracked) │\\n│ Scope: Project-specific notes, decisions, patterns │\\n│ Access: Local only │\\n└──────────────────┬──────────────────────────────────────────┘ │ │ [inherits] ↓\\n┌─────────────────────────────────────────────────────────────┐\\n│ Shared KB (SurrealDB or synced filesystem) │\\n│ Storage: SurrealDB (scalable) or filesystem (synced) │\\n│ Scope: Organization-wide guidelines, patterns │\\n│ Access: All projects │\\n└─────────────────────────────────────────────────────────────┘ Implementation : # Project config\\n{ storage = { primary = \'filesystem, # Local project knowledge secondary = { enabled = true, type = \'surrealdb, # Shared knowledge url = \\"ws://kb-central.company.com:8000\\", namespace = \\"organization\\", database = \\"shared-kb\\", }, }, inheritance = { base = \\"surrealdb://organization/shared-kb\\", # Inherit from shared priority = 100, # Project overrides shared },\\n} Sync Strategy : .kogral/ (Filesystem) ↓ [on save]\\nWatch for changes ↓ [debounced]\\nSync to SurrealDB ↓\\nShared graph updated ↓ [on query]\\nMerge local + shared results","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Decision","id":"369","title":"Decision"},"37":{"body":"","breadcrumbs":"Introduction » 💡 Tips","id":"37","title":"💡 Tips"},"370":{"body":"","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Consequences","id":"370","title":"Consequences"},"371":{"body":"✅ Developer Workflow Preserved : # Local knowledge workflow (unchanged)\\nvim .kogral/notes/my-note.md\\ngit add .kogral/notes/my-note.md\\ngit commit -m \\"Add implementation note\\"\\ngit push ✅ Git Integration : Project knowledge versioned with code Branches include relevant knowledge Merges resolve knowledge conflicts PR reviews include knowledge changes ✅ Offline Development : Full functionality without network Shared guidelines cached locally Sync when reconnected ✅ Scalability : Projects: filesystem (100s of nodes, fine performance) Organization: SurrealDB (10,000+ nodes, excellent performance) ✅ Collaboration : Shared guidelines accessible to all projects Updates to shared knowledge propagate automatically Consistent practices across organization ✅ Cost-Effective : Small projects: free (filesystem only) Organizations: SurrealDB for shared only (not all project knowledge) ✅ Gradual Adoption : Start with filesystem only Add SurrealDB when needed Feature-gated (--features surrealdb)","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Positive","id":"371","title":"Positive"},"372":{"body":"❌ Complexity : Two storage implementations Sync mechanism required Conflict resolution needed Mitigation : Storage trait abstracts differences Sync is optional (can disable) Conflicts rare (guidelines change infrequently) ❌ Sync Latency : Changes to shared KB not instant in all projects Mitigation : Acceptable latency (guidelines don\'t change rapidly) Manual sync command available (kb sync) Auto-sync on query (fetch latest) ❌ Infrastructure Requirement : SurrealDB server needed for shared KB Mitigation : Optional (can use synced filesystem instead) Docker Compose for easy setup Managed SurrealDB Cloud option","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Negative","id":"372","title":"Negative"},"373":{"body":"⚪ Storage Trait Implementation : #[async_trait]\\npub trait Storage { async fn save_graph(&self, graph: &Graph) -> Result<()>; async fn load_graph(&self, name: &str) -> Result; async fn list_graphs(&self) -> Result>;\\n} // Three implementations\\nimpl Storage for FilesystemStorage { /* ... */ }\\nimpl Storage for SurrealDbStorage { /* ... */ }\\nimpl Storage for MemoryStorage { /* ... */ } Abstraction makes multi-backend manageable.","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Neutral","id":"373","title":"Neutral"},"374":{"body":"","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Use Cases","id":"374","title":"Use Cases"},"375":{"body":"Config : { storage = { primary = \'filesystem } } Behavior : All knowledge in .kogral/ directory Git-tracked with code No database required Works offline","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Small Project (Solo Developer)","id":"375","title":"Small Project (Solo Developer)"},"376":{"body":"Config : { storage = { primary = \'filesystem, secondary = { enabled = true, type = \'surrealdb, url = \\"ws://team-kb.local:8000\\", }, },\\n} Behavior : Project knowledge in .kogral/ (git-tracked) Shared team patterns in SurrealDB Automatic sync Offline fallback to cached","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Medium Project (Team)","id":"376","title":"Medium Project (Team)"},"377":{"body":"Config : { storage = { primary = \'filesystem, secondary = { enabled = true, type = \'surrealdb, url = \\"ws://kb.company.com:8000\\", namespace = \\"engineering\\", database = \\"shared-kb\\", }, }, inheritance = { base = \\"surrealdb://engineering/shared-kb\\", guidelines = [ \\"surrealdb://engineering/rust-guidelines\\", \\"surrealdb://engineering/security-policies\\", ], },\\n} Behavior : Project-specific in .kogral/ Organization guidelines in SurrealDB Security policies enforced Automatic guideline updates","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Large Organization","id":"377","title":"Large Organization"},"378":{"body":"","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Sync Mechanism","id":"378","title":"Sync Mechanism"},"379":{"body":"Trigger : File changes detected (via notify crate) Process : Parse changed markdown file Convert to Node struct Upsert to SurrealDB Update relationships Debouncing : 500ms (configurable)","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Filesystem → SurrealDB","id":"379","title":"Filesystem → SurrealDB"},"38":{"body":"just docs::watch This watches for changes and rebuilds automatically. Open http://localhost:3000 in your browser to see updates in real-time.","breadcrumbs":"Introduction » Live Reload While Writing","id":"38","title":"Live Reload While Writing"},"380":{"body":"Trigger : Query for shared knowledge Process : Query SurrealDB for shared nodes Cache locally (in-memory or filesystem) Merge with local results Return combined Caching : TTL-based (5 minutes default)","breadcrumbs":"ADR-003: Hybrid Storage Strategy » SurrealDB → Filesystem","id":"380","title":"SurrealDB → Filesystem"},"381":{"body":"Strategy : Last-write-wins with version tracking Example : Project A: Updates shared guideline (v1 → v2)\\nProject B: Has cached v1 On Project B query: - Detects v2 available - Fetches v2 - Updates cache - Uses v2 going forward","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Conflict Resolution","id":"381","title":"Conflict Resolution"},"382":{"body":"","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Alternatives Considered","id":"382","title":"Alternatives Considered"},"383":{"body":"Rejected : Cumbersome workflow Requires manual submodule update Merge conflicts in shared submodule Not discoverable (need to know submodule exists)","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Git Submodules for Shared Knowledge","id":"383","title":"Git Submodules for Shared Knowledge"},"384":{"body":"Rejected : Not designed for this use case No query optimization No relationship indexes Sync conflicts difficult to resolve","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Syncthing for Filesystem Sync","id":"384","title":"Syncthing for Filesystem Sync"},"385":{"body":"Rejected : Not a graph database Poor graph query performance Relationship traversal requires complex SQL joins No native graph features","breadcrumbs":"ADR-003: Hybrid Storage Strategy » PostgreSQL with JSON","id":"385","title":"PostgreSQL with JSON"},"386":{"body":"","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Migration Path","id":"386","title":"Migration Path"},"387":{"body":"All storage via filesystem Git-tracked No database required","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Phase 1: Filesystem Only (Current)","id":"387","title":"Phase 1: Filesystem Only (Current)"},"388":{"body":"Add SurrealDB support (feature-gated) Manual sync command Shared KB opt-in","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Phase 2: Optional SurrealDB","id":"388","title":"Phase 2: Optional SurrealDB"},"389":{"body":"File watching Auto-sync on changes Background sync","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Phase 3: Automatic Sync","id":"389","title":"Phase 3: Automatic Sync"},"39":{"body":"Most editors have Markdown preview: VS Code : Ctrl+Shift+V (Cmd+Shift+V on Mac) IntelliJ/CLion : Preview pane (right side) Vim/Neovim : Use plugins like markdown-preview.nvim","breadcrumbs":"Introduction » Markdown Preview in Editor","id":"39","title":"Markdown Preview in Editor"},"390":{"body":"Organization namespaces Access control Audit logs","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Phase 4: Multi-Tenant SurrealDB","id":"390","title":"Phase 4: Multi-Tenant SurrealDB"},"391":{"body":"Success Criteria : Developers don\'t notice hybrid complexity Sync completes < 1 second for typical changes Shared guidelines accessible in < 100ms Zero data loss in sync Metrics : Sync latency (P50, P95, P99) Cache hit rate (shared knowledge) Conflict rate (expect < 0.1%) User satisfaction","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Monitoring","id":"391","title":"Monitoring"},"392":{"body":"SurrealDB Documentation Storage Trait Implementation FilesystemStorage SurrealDbStorage Sync Mechanism","breadcrumbs":"ADR-003: Hybrid Storage Strategy » References","id":"392","title":"References"},"393":{"body":"Date Author Change 2026-01-17 Architecture Team Initial decision Previous ADR : ADR-002: FastEmbed via AI Providers Next ADR : ADR-004: Logseq Compatibility","breadcrumbs":"ADR-003: Hybrid Storage Strategy » Revision History","id":"393","title":"Revision History"},"394":{"body":"","breadcrumbs":"ADR-004: Logseq Blocks Support » ADR-004: Logseq Blocks Support","id":"394","title":"ADR-004: Logseq Blocks Support"},"395":{"body":"Proposed (Design phase)","breadcrumbs":"ADR-004: Logseq Blocks Support » Status","id":"395","title":"Status"},"396":{"body":"Logseq uses content blocks as the fundamental unit of information, not full documents. KB currently treats Node.content as flat markdown string, which loses block-level features on import/export: Lost features : Block properties (#card, TODO, custom properties) Block hierarchy (outliner nesting) Block references (((block-uuid))) Block-level queries (find all flashcards, TODOs) User requirement : Round-trip Logseq import/export with full fidelity: Logseq → KOGRAL Import → KOGRAL Storage → KOGRAL Export → Logseq (blocks preserved at every step)","breadcrumbs":"ADR-004: Logseq Blocks Support » Context","id":"396","title":"Context"},"397":{"body":"Implement Hybrid Block Support (structured + markdown):","breadcrumbs":"ADR-004: Logseq Blocks Support » Decision","id":"397","title":"Decision"},"398":{"body":"pub struct Block { pub id: String, // UUID pub content: String, // Block text pub properties: BlockProperties, // Tags, status, custom pub children: Vec, // Nested blocks // ... timestamps ...\\n} pub struct BlockProperties { pub tags: Vec, // #card, #important pub status: Option, // TODO, DONE, etc. pub custom: HashMap, // property:: value pub block_refs: Vec, // ((uuid)) pub page_refs: Vec, // [[page]]\\n}","breadcrumbs":"ADR-004: Logseq Blocks Support » 1. Add Block Data Structure","id":"398","title":"1. Add Block Data Structure"},"399":{"body":"pub struct Node { // ... existing fields ... pub content: String, // Source of truth (markdown) pub blocks: Option>, // Cached structure (optional)\\n}","breadcrumbs":"ADR-004: Logseq Blocks Support » 2. Extend Node Model","id":"399","title":"2. Extend Node Model"},"4":{"body":"All documentation is written in Markdown and can be read directly: Browse via GitHub/GitLab web interface Use your editor\'s Markdown preview Read from terminal with bat, glow, or similar tools Navigation : See SUMMARY.md for the complete table of contents.","breadcrumbs":"Introduction » Option 3: Read Markdown Files Directly","id":"4","title":"Option 3: Read Markdown Files Directly"},"40":{"body":"SUMMARY.md - Table of contents (edit to add/remove pages) book.toml - mdBook configuration theme/ - Custom CSS/JS (if needed) diagrams/ - SVG diagrams","breadcrumbs":"Introduction » Quick Reference","id":"40","title":"Quick Reference"},"400":{"body":"Parse : Markdown → Vec (lazy, on-demand) Serialize : Vec → Markdown (for export)","breadcrumbs":"ADR-004: Logseq Blocks Support » 3. Bidirectional Parser","id":"400","title":"3. Bidirectional Parser"},"401":{"body":"Filesystem (git-friendly, Logseq-compatible): - Block 1 #card - Nested answer\\n- TODO Block 2 priority:: high SurrealDB (queryable): DEFINE TABLE block;\\nDEFINE FIELD node_id ON block TYPE record(node);\\nDEFINE FIELD block_id ON block TYPE string;\\nDEFINE FIELD properties ON block TYPE object;\\nDEFINE INDEX block_tags ON block COLUMNS properties.tags;","breadcrumbs":"ADR-004: Logseq Blocks Support » 4. Storage Strategy","id":"401","title":"4. Storage Strategy"},"402":{"body":"// Find all flashcards\\ngraph.find_blocks_by_tag(\\"card\\") // Find all TODOs\\ngraph.find_all_todos() // Find blocks with custom property\\nnode.find_blocks_by_property(\\"priority\\", \\"high\\")","breadcrumbs":"ADR-004: Logseq Blocks Support » 5. Query Extensions","id":"402","title":"5. Query Extensions"},"403":{"body":"","breadcrumbs":"ADR-004: Logseq Blocks Support » Consequences","id":"403","title":"Consequences"},"404":{"body":"✅ Full Logseq Compatibility - Import/export preserves all block features ✅ Queryable Blocks - Find #card, TODO, custom properties across KOGRAL ✅ Backward Compatible - Existing nodes without blocks still work ✅ Type-Safe - Structured data instead of regex parsing everywhere ✅ Extensible - Custom block properties supported ✅ Hierarchy Preserved - Nested blocks maintain parent-child relationships","breadcrumbs":"ADR-004: Logseq Blocks Support » Positive","id":"404","title":"Positive"},"405":{"body":"⚠️ Added Complexity - New data structures, parser, sync logic ⚠️ Dual Representation - Must keep content and blocks in sync ⚠️ Storage Overhead - SurrealDB stores both markdown and structure ⚠️ Migration Required - Existing data needs parsing to populate blocks","breadcrumbs":"ADR-004: Logseq Blocks Support » Negative","id":"405","title":"Negative"},"406":{"body":"⚙️ Lazy Parsing - Blocks parsed on-demand (not stored by default) ⚙️ Opt-In - Config flag blocks.enabled to activate features ⚙️ Gradual Adoption - Can implement in phases","breadcrumbs":"ADR-004: Logseq Blocks Support » Neutral","id":"406","title":"Neutral"},"407":{"body":"Phase 1: Foundation (No behavior change) Add Block struct to models/block.rs Add optional blocks field to Node Add config: blocks.enabled = false (default off) Phase 2: Parser Implement BlockParser::parse() (markdown → blocks) Implement BlockParser::serialize() (blocks → markdown) Add Node::get_blocks() method (lazy parsing) Phase 3: Logseq Integration Update LogseqImporter to parse blocks Update LogseqExporter to serialize blocks Test round-trip (Logseq → KB → Logseq) Phase 4: Query API Add Graph::find_blocks_by_tag() Add Graph::find_all_todos() Add Node::find_blocks_by_property() Phase 5: MCP/CLI Integration Add kb/find_blocks MCP tool Add kb find-cards CLI command Add kb find-todos CLI command Phase 6: SurrealDB Backend Create block table schema Index on tags, status, properties Store blocks alongside nodes","breadcrumbs":"ADR-004: Logseq Blocks Support » Implementation Phases","id":"407","title":"Implementation Phases"},"408":{"body":"","breadcrumbs":"ADR-004: Logseq Blocks Support » Alternatives Considered","id":"408","title":"Alternatives Considered"},"409":{"body":"Convert each Logseq block to a separate KOGRAL Node. Rejected : Too granular, explosion of nodes, loses document context.","breadcrumbs":"ADR-004: Logseq Blocks Support » Alternative 1: Blocks as First-Class Nodes","id":"409","title":"Alternative 1: Blocks as First-Class Nodes"},"41":{"body":"","breadcrumbs":"Introduction » 🐛 Troubleshooting","id":"41","title":"🐛 Troubleshooting"},"410":{"body":"Keep content: String, parse blocks on every access. Rejected : Can\'t query blocks in database, parse overhead, can\'t index.","breadcrumbs":"ADR-004: Logseq Blocks Support » Alternative 2: Parser-Only (No Storage)","id":"410","title":"Alternative 2: Parser-Only (No Storage)"},"411":{"body":"Store blocks in metadata: HashMap. Rejected : Not type-safe, harder to query, no schema validation.","breadcrumbs":"ADR-004: Logseq Blocks Support » Alternative 3: Metadata Field","id":"411","title":"Alternative 3: Metadata Field"},"412":{"body":"Logseq Block Format Full Design Document Implementation Tracking","breadcrumbs":"ADR-004: Logseq Blocks Support » References","id":"412","title":"References"},"413":{"body":"Backward Compatibility Strategy : content remains source of truth blocks is optional enhancement Old code works unchanged New features opt-in via config Migration Path : Existing users: blocks disabled by default New users: blocks enabled, parsed on import Manual: kb reindex --parse-blocks to populate Decision Date : 2026-01-17 Approvers : TBD Review Date : After Phase 2 implementation","breadcrumbs":"ADR-004: Logseq Blocks Support » Notes","id":"413","title":"Notes"},"414":{"body":"","breadcrumbs":"ADR-005: MCP Protocol for AI Integration » ADR-005: MCP Protocol for AI Integration","id":"414","title":"ADR-005: MCP Protocol for AI Integration"},"415":{"body":"","breadcrumbs":"Prerequisites » Prerequisites","id":"415","title":"Prerequisites"},"416":{"body":"","breadcrumbs":"Installation Methods » Installation Methods","id":"416","title":"Installation Methods"},"417":{"body":"","breadcrumbs":"Project Initialization » Project Initialization","id":"417","title":"Project Initialization"},"418":{"body":"","breadcrumbs":"Environment Configuration » Environment Configuration","id":"418","title":"Environment Configuration"},"419":{"body":"","breadcrumbs":"Verification » Verification","id":"419","title":"Verification"},"42":{"body":"# Install mdBook\\ncargo install mdbook # Verify installation\\nmdbook --version","breadcrumbs":"Introduction » mdbook command not found","id":"42","title":"mdbook command not found"},"420":{"body":"","breadcrumbs":"Configuration Overview » Configuration Overview","id":"420","title":"Configuration Overview"},"421":{"body":"","breadcrumbs":"Nickel Schemas » Nickel Schemas","id":"421","title":"Nickel Schemas"},"422":{"body":"","breadcrumbs":"Graph Settings » Graph Settings","id":"422","title":"Graph Settings"},"423":{"body":"","breadcrumbs":"Inheritance » Inheritance","id":"423","title":"Inheritance"},"424":{"body":"","breadcrumbs":"Examples » Examples","id":"424","title":"Examples"},"425":{"body":"","breadcrumbs":"Storage Backends » Storage Backends","id":"425","title":"Storage Backends"},"426":{"body":"","breadcrumbs":"Filesystem Storage » Filesystem Storage","id":"426","title":"Filesystem Storage"},"427":{"body":"","breadcrumbs":"SurrealDB Storage » SurrealDB Storage","id":"427","title":"SurrealDB Storage"},"428":{"body":"","breadcrumbs":"In-Memory Storage » In-Memory Storage","id":"428","title":"In-Memory Storage"},"429":{"body":"","breadcrumbs":"Sync Strategies » Sync Strategies","id":"429","title":"Sync Strategies"},"43":{"body":"# Serve on different port\\ncd docs\\nmdbook serve --port 3001","breadcrumbs":"Introduction » Port 3000 already in use","id":"43","title":"Port 3000 already in use"},"430":{"body":"","breadcrumbs":"Embeddings Overview » Embeddings Overview","id":"430","title":"Embeddings Overview"},"431":{"body":"","breadcrumbs":"Provider Configuration » Provider Configuration","id":"431","title":"Provider Configuration"},"432":{"body":"","breadcrumbs":"FastEmbed Local » FastEmbed Local","id":"432","title":"FastEmbed Local"},"433":{"body":"","breadcrumbs":"OpenAI Integration » OpenAI Integration","id":"433","title":"OpenAI Integration"},"434":{"body":"","breadcrumbs":"Claude Integration » Claude Integration","id":"434","title":"Claude Integration"},"435":{"body":"","breadcrumbs":"Ollama Integration » Ollama Integration","id":"435","title":"Ollama Integration"},"436":{"body":"","breadcrumbs":"Semantic Search » Semantic Search","id":"436","title":"Semantic Search"},"437":{"body":"","breadcrumbs":"Template System » Template System","id":"437","title":"Template System"},"438":{"body":"","breadcrumbs":"Document Templates » Document Templates","id":"438","title":"Document Templates"},"439":{"body":"","breadcrumbs":"Export Templates » Export Templates","id":"439","title":"Export Templates"},"44":{"body":"# Check all links\\njust docs::check-links # Update internal links in affected files\\n# Then rebuild\\njust docs::build","breadcrumbs":"Introduction » Links broken after moving files","id":"44","title":"Links broken after moving files"},"440":{"body":"","breadcrumbs":"Customization » Customization","id":"440","title":"Customization"},"441":{"body":"","breadcrumbs":"CLI Overview » CLI Overview","id":"441","title":"CLI Overview"},"442":{"body":"","breadcrumbs":"Commands Reference » Commands Reference","id":"442","title":"Commands Reference"},"443":{"body":"","breadcrumbs":"Workflows » Workflows","id":"443","title":"Workflows"},"444":{"body":"","breadcrumbs":"NuShell Scripts » NuShell Scripts","id":"444","title":"NuShell Scripts"},"445":{"body":"Fast-track guide to integrating KOGRAL with Claude Code via the Model Context Protocol (MCP).","breadcrumbs":"MCP Quick Guide » MCP Quick Guide","id":"445","title":"MCP Quick Guide"},"446":{"body":"MCP (Model Context Protocol) is a protocol that allows Claude Code to interact with external tools and data sources. The kogral-mcp server exposes your KOGRAL knowledge base to Claude Code for AI-assisted knowledge management.","breadcrumbs":"MCP Quick Guide » What is MCP?","id":"446","title":"What is MCP?"},"447":{"body":"","breadcrumbs":"MCP Quick Guide » Quick Setup (5 Minutes)","id":"447","title":"Quick Setup (5 Minutes)"},"448":{"body":"# Build kogral-mcp server\\ncargo build --package kb-mcp --release # Verify binary\\nls -lh target/release/kb-mcp","breadcrumbs":"MCP Quick Guide » Step 1: Build MCP Server","id":"448","title":"Step 1: Build MCP Server"},"449":{"body":"Add to ~/.config/claude/config.json: { \\"mcpServers\\": { \\"kogral-mcp\\": { \\"command\\": \\"/path/to/knowledge-base/target/release/kb-mcp\\", \\"args\\": [\\"serve\\"], \\"env\\": { \\"KOGRAL_DIR\\": \\"/path/to/your/project/.kogral\\" } } }\\n} Replace /path/to/knowledge-base and /path/to/your/project/.kogral with your actual paths.","breadcrumbs":"MCP Quick Guide » Step 2: Configure Claude Code","id":"449","title":"Step 2: Configure Claude Code"},"45":{"body":"mdBook User Guide GitHub Flavored Markdown Spec Markdown Guide","breadcrumbs":"Introduction » 📚 Resources","id":"45","title":"📚 Resources"},"450":{"body":"# Navigate to your project\\ncd /path/to/your/project # Initialize .kb directory\\nkb init","breadcrumbs":"MCP Quick Guide » Step 3: Initialize KOGRAL","id":"450","title":"Step 3: Initialize KOGRAL"},"451":{"body":"# Start Claude Code (will auto-connect to kb-mcp)\\nclaude-code","breadcrumbs":"MCP Quick Guide » Step 4: Start Claude Code","id":"451","title":"Step 4: Start Claude Code"},"452":{"body":"In Claude Code, try: Search for \\"error handling\\" Claude will use the kogral/search tool to query your knowledge base.","breadcrumbs":"MCP Quick Guide » Step 5: Test Connection","id":"452","title":"Step 5: Test Connection"},"453":{"body":"","breadcrumbs":"MCP Quick Guide » Essential Commands","id":"453","title":"Essential Commands"},"454":{"body":"Natural language : Find notes about Rust error handling Claude translates to : { \\"tool\\": \\"kogral/search\\", \\"params\\": { \\"query\\": \\"error handling\\", \\"type\\": \\"note\\", \\"semantic\\": true }\\n}","breadcrumbs":"MCP Quick Guide » Search Knowledge Base","id":"454","title":"Search Knowledge Base"},"455":{"body":"Natural language : Add a note about async Rust patterns with tags rust, async, patterns Claude translates to : { \\"tool\\": \\"kogral/add_note\\", \\"params\\": { \\"title\\": \\"Async Rust Patterns\\", \\"content\\": \\"...\\", \\"tags\\": [\\"rust\\", \\"async\\", \\"patterns\\"] }\\n}","breadcrumbs":"MCP Quick Guide » Add Note","id":"455","title":"Add Note"},"456":{"body":"Natural language : Document decision to use SurrealDB for storage Claude translates to : { \\"tool\\": \\"kogral/add_decision\\", \\"params\\": { \\"title\\": \\"Use SurrealDB for Storage\\", \\"context\\": \\"Need scalable graph database\\", \\"decision\\": \\"Adopt SurrealDB as primary storage backend\\", \\"consequences\\": [\\"Better query performance\\", \\"Additional infrastructure\\"] }\\n}","breadcrumbs":"MCP Quick Guide » Add Decision","id":"456","title":"Add Decision"},"457":{"body":"Natural language : What are our Rust error handling guidelines? Claude translates to : { \\"tool\\": \\"kogral/get_guidelines\\", \\"params\\": { \\"language\\": \\"rust\\", \\"category\\": \\"error-handling\\" }\\n}","breadcrumbs":"MCP Quick Guide » Get Guidelines","id":"457","title":"Get Guidelines"},"458":{"body":"Natural language : Link note-async-patterns to decision-use-tokio as implements Claude translates to : { \\"tool\\": \\"kogral/link\\", \\"params\\": { \\"from\\": \\"note-async-patterns\\", \\"to\\": \\"decision-use-tokio\\", \\"relation\\": \\"implements\\" }\\n}","breadcrumbs":"MCP Quick Guide » Link Concepts","id":"458","title":"Link Concepts"},"459":{"body":"","breadcrumbs":"MCP Quick Guide » Common Workflows","id":"459","title":"Common Workflows"},"46":{"body":"Documentation improvements are always welcome! To contribute: Fork the repository Create a feature branch Make your changes Test with just docs::build and just docs::test Submit a pull request See contributing/documentation.md for detailed guidelines. Happy documenting! 📖 If you have questions or need help, please open an issue or reach out to the maintainers.","breadcrumbs":"Introduction » 🤝 Contributing to Documentation","id":"46","title":"🤝 Contributing to Documentation"},"460":{"body":"You : We just decided in our meeting to migrate from REST to GraphQL.\\nContext: current REST API is too chatty, requires multiple round trips.\\nConsequences: better client performance, but team needs to learn GraphQL.\\nCreate a decision record. Claude (uses kb/add_decision): Created decision: decision-migrate-to-graphql Status: proposed\\nContext: Current REST API requires multiple round trips (chatty)\\nDecision: Migrate from REST to GraphQL API\\nConsequences: - ✅ Better client performance - ❌ Team learning curve for GraphQL","breadcrumbs":"MCP Quick Guide » Capture Meeting Notes","id":"460","title":"Capture Meeting Notes"},"461":{"body":"You : I\'m working on error handling. What related notes and patterns do we have? Claude (uses kogral/search with semantic=true): Found 5 related items: 1. **Error Handling with thiserror** (pattern) Tags: rust, error-handling Created: 2026-01-15 2. **Result Type Best Practices** (guideline) Tags: rust, error-handling, best-practices Created: 2026-01-10 3. **Decision: Use anyhow for Application Errors** (decision) Status: accepted Created: 2026-01-08 4. **Custom Error Types** (note) Tags: rust, error-handling Created: 2026-01-05 5. **Error Propagation Patterns** (pattern) Tags: rust, error-handling Created: 2026-01-03 Would you like me to link your current work to any of these?","breadcrumbs":"MCP Quick Guide » Find Related Knowledge","id":"461","title":"Find Related Knowledge"},"462":{"body":"You : I just implemented the user authentication module following our security guidelines.\\nAdd a note and link it to our security guideline. Claude (uses kb/add_note + kb/link): Created note: note-user-auth-implementation\\nTags: security, authentication, implementation Linked: note-user-auth-implementation --[implements]--> guideline-security-practices Done! Your implementation is now documented and connected to our guidelines.","breadcrumbs":"MCP Quick Guide » Document Implementation","id":"462","title":"Document Implementation"},"463":{"body":"You : Summarize our project knowledge: what decisions have we made, what patterns are we using? Claude (uses kb/summarize_project prompt): # Project Knowledge Summary **Total Nodes**: 42 ## Recent Decisions (5)\\n- Use SurrealDB for Storage (accepted, 2 days ago)\\n- Adopt MCP for AI Integration (accepted, 5 days ago)\\n- Nickel for Configuration (accepted, 1 week ago) ## Active Patterns (8)\\n- Error Handling with thiserror\\n- Repository Pattern for DB\\n- Builder Pattern for Complex Objects\\n- ... ## Top Tags\\n1. rust (23 nodes)\\n2. architecture (12 nodes)\\n3. error-handling (8 nodes)\\n4. patterns (7 nodes) ## Guideline Coverage\\n- Rust: 5 guidelines\\n- Testing: 3 guidelines\\n- Security: 2 guidelines","breadcrumbs":"MCP Quick Guide » Review Project Knowledge","id":"463","title":"Review Project Knowledge"},"464":{"body":"","breadcrumbs":"MCP Quick Guide » Advanced Usage","id":"464","title":"Advanced Usage"},"465":{"body":"You : Find all decisions made in the last week that are still proposed (not accepted) Claude (combines kogral/search with filtering): Found 2 proposed decisions from last week: 1. **Migrate to GraphQL** (proposed) Created: 3 days ago Context: REST API is too chatty... 2. **Add Redis Caching** (proposed) Created: 5 days ago Context: Database queries are slow... Would you like to review these and update their status?","breadcrumbs":"MCP Quick Guide » Conditional Queries","id":"465","title":"Conditional Queries"},"466":{"body":"You : Before I implement X, check if we have any decisions or guidelines about it Claude (uses kogral/search + kogral/get_guidelines): Checking existing knowledge about X... **Decisions**: None found\\n**Guidelines**: 1 relevant guideline found - guideline-module-structure: \\"Keep modules focused and small\\" **Related Notes**: 2 notes mention similar topics - note-module-design-patterns - note-separation-of-concerns Recommendation: Your implementation of X looks aligned with our guidelines.\\nConsider linking it to guideline-module-structure when done.","breadcrumbs":"MCP Quick Guide » Cross-Reference Check","id":"466","title":"Cross-Reference Check"},"467":{"body":"You : Export our architectural decisions to Logseq so I can review them visually Claude (uses kb/export): Exporting to Logseq format... ✓ Exported 12 decisions to /Users/akasha/logseq-export/ - 12 decision records - Preserved wikilinks - Added Logseq properties You can now open /Users/akasha/logseq-export/ in Logseq to visualize the decision graph.","breadcrumbs":"MCP Quick Guide » Export for Sharing","id":"467","title":"Export for Sharing"},"468":{"body":"","breadcrumbs":"MCP Quick Guide » Tips and Tricks","id":"468","title":"Tips and Tricks"},"469":{"body":"Don\'t worry about exact tool syntax. Claude understands: ❌ Don\'t say : \\"Use kb/search with query=\'rust\' and type=\'pattern\'\\" ✅ Do say : \\"Find Rust patterns in KOGRAL\\"","breadcrumbs":"MCP Quick Guide » 1. Use Natural Language","id":"469","title":"1. Use Natural Language"},"47":{"body":"KOGRAL ( KO wledge GRA phs, L ocal-first) is a git-native knowledge graph system designed for developer teams to capture, connect, and query structured knowledge.","breadcrumbs":"What is KOGRAL? » What is KOGRAL?","id":"47","title":"What is KOGRAL?"},"470":{"body":"When adding notes, use consistent tags: ✅ Good : tags: rust, error-handling, pattern ❌ Bad : tags: Rust, ErrorHandling, patterns","breadcrumbs":"MCP Quick Guide » 2. Be Specific with Tags","id":"470","title":"2. Be Specific with Tags"},"471":{"body":"After creating notes, ask Claude to link them: Link this note to our error handling guideline as \'implements\'","breadcrumbs":"MCP Quick Guide » 3. Link as You Go","id":"471","title":"3. Link as You Go"},"472":{"body":"Ask Claude for summaries: What have we documented this week?","breadcrumbs":"MCP Quick Guide » 4. Review Regularly","id":"472","title":"4. Review Regularly"},"473":{"body":"For conceptual queries: Find anything related to \\"making code maintainable\\" Not just keyword \\"maintainable\\", but concepts like refactoring, clean code, patterns, etc.","breadcrumbs":"MCP Quick Guide » 5. Use Semantic Search","id":"473","title":"5. Use Semantic Search"},"474":{"body":"","breadcrumbs":"MCP Quick Guide » Troubleshooting","id":"474","title":"Troubleshooting"},"475":{"body":"# Check kb-mcp is built\\nls target/release/kb-mcp # Test manually\\necho \'{\\"jsonrpc\\":\\"2.0\\",\\"id\\":1,\\"method\\":\\"kogral/search\\",\\"params\\":{\\"query\\":\\"test\\"}}\' \\\\ | target/release/kb-mcp serve","breadcrumbs":"MCP Quick Guide » \\"MCP server not responding\\"","id":"475","title":"\\"MCP server not responding\\""},"476":{"body":"# Verify .kb exists\\nls -la /path/to/project/.kogral # Initialize if missing\\ncd /path/to/project\\nkb init","breadcrumbs":"MCP Quick Guide » \\"KB directory not found\\"","id":"476","title":"\\"KB directory not found\\""},"477":{"body":"# Make binary executable\\nchmod +x target/release/kb-mcp # Check environment variable\\necho $KOGRAL_DIR","breadcrumbs":"MCP Quick Guide » \\"Permission denied\\"","id":"477","title":"\\"Permission denied\\""},"478":{"body":"# Add some test content\\nkb add note \\"Test Note\\" --content \\"Test content\\" # Try search again in Claude Code","breadcrumbs":"MCP Quick Guide » \\"Empty search results\\"","id":"478","title":"\\"Empty search results\\""},"479":{"body":"Read : MCP Tools API Reference for all available tools Explore : Use Cases for more examples Configure : Configuration Reference to customize behavior Integrate : Claude Code Integration for advanced setup","breadcrumbs":"MCP Quick Guide » Next Steps","id":"479","title":"Next Steps"},"48":{"body":"KOGRAL solves the problem of knowledge fragmentation in software development: 📝 Notes scattered across tools 🤔 Decisions lost in chat histories 📚 Guidelines buried in wikis 🔄 Patterns rediscovered repeatedly 🤖 AI agents lacking project context","breadcrumbs":"What is KOGRAL? » Purpose","id":"48","title":"Purpose"},"480":{"body":"Task Say to Claude Search \\"Find notes about X\\" Add note \\"Add a note about X with tags Y, Z\\" Add decision \\"Document decision to use X for Y\\" Get guidelines \\"What are our X guidelines?\\" Link nodes \\"Link A to B as implements\\" Summarize \\"Summarize project knowledge\\" Export \\"Export to Logseq format\\" Remember : Claude Code with MCP turns KOGRAL into an active participant in your development workflow. Ask questions, capture decisions, and let AI help you maintain your project\'s knowledge graph.","breadcrumbs":"MCP Quick Guide » Quick Reference Card","id":"480","title":"Quick Reference Card"},"481":{"body":"","breadcrumbs":"Claude Code Integration » Claude Code Integration","id":"481","title":"Claude Code Integration"},"482":{"body":"","breadcrumbs":"Logseq Integration » Logseq Integration","id":"482","title":"Logseq Integration"},"483":{"body":"","breadcrumbs":"Obsidian Compatibility » Obsidian Compatibility","id":"483","title":"Obsidian Compatibility"},"484":{"body":"","breadcrumbs":"Git Workflows » Git Workflows","id":"484","title":"Git Workflows"},"485":{"body":"","breadcrumbs":"MCP Protocol » MCP Protocol","id":"485","title":"MCP Protocol"},"486":{"body":"Complete reference for the Model Context Protocol (MCP) server tools and resources.","breadcrumbs":"Tools Reference » MCP Tools API Reference","id":"486","title":"MCP Tools API Reference"},"487":{"body":"The kogral-mcp server implements the MCP protocol (JSON-RPC 2.0) for Claude Code integration. It provides: 10 Tools : Operations for querying and modifying knowledge base (7 core + 3 block tools) 6 Resources : Access to knowledge graph content via URIs 2 Prompts : Guided workflows for common tasks","breadcrumbs":"Tools Reference » Overview","id":"487","title":"Overview"},"488":{"body":"","breadcrumbs":"Tools Reference » Server Configuration","id":"488","title":"Server Configuration"},"489":{"body":"# Stdio transport (local use)\\nkb serve # Or run directly\\nkb-mcp serve","breadcrumbs":"Tools Reference » Start MCP Server","id":"489","title":"Start MCP Server"},"49":{"body":"KOGRAL provides a unified, queryable knowledge graph that: Captures knowledge in structured, git-friendly markdown Connects concepts through typed relationships Queries via text and semantic similarity Integrates with AI tools (Claude Code via MCP) Syncs across local (filesystem) and shared (SurrealDB) storage","breadcrumbs":"What is KOGRAL? » Solution","id":"49","title":"Solution"},"490":{"body":"Add to ~/.config/claude/config.json: { \\"mcpServers\\": { \\"kogral-mcp\\": { \\"command\\": \\"/path/to/kb-mcp\\", \\"args\\": [\\"serve\\"], \\"env\\": { \\"KOGRAL_DIR\\": \\"/path/to/project/.kogral\\" } } }\\n}","breadcrumbs":"Tools Reference » Claude Code Configuration","id":"490","title":"Claude Code Configuration"},"491":{"body":"","breadcrumbs":"Tools Reference » Tools","id":"491","title":"Tools"},"492":{"body":"Search the knowledge base using text and/or semantic similarity. Input Schema : { \\"type\\": \\"object\\", \\"properties\\": { \\"query\\": { \\"type\\": \\"string\\", \\"description\\": \\"Search query\\" }, \\"type\\": { \\"type\\": \\"string\\", \\"enum\\": [\\"note\\", \\"decision\\", \\"guideline\\", \\"pattern\\", \\"journal\\", \\"execution\\", \\"all\\"], \\"description\\": \\"Filter by node type\\", \\"default\\": \\"all\\" }, \\"project\\": { \\"type\\": \\"string\\", \\"description\\": \\"Limit search to specific project graph\\" }, \\"semantic\\": { \\"type\\": \\"boolean\\", \\"description\\": \\"Enable semantic similarity search\\", \\"default\\": true }, \\"threshold\\": { \\"type\\": \\"number\\", \\"description\\": \\"Minimum similarity threshold (0-1)\\", \\"default\\": 0.4 }, \\"limit\\": { \\"type\\": \\"integer\\", \\"description\\": \\"Maximum number of results\\", \\"default\\": 10 } }, \\"required\\": [\\"query\\"]\\n} Example Request : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 1, \\"method\\": \\"kogral/search\\", \\"params\\": { \\"query\\": \\"error handling patterns in Rust\\", \\"type\\": \\"pattern\\", \\"semantic\\": true, \\"threshold\\": 0.6, \\"limit\\": 5 }\\n} Example Response : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 1, \\"result\\": { \\"type\\": \\"text\\", \\"text\\": \\"Found 3 result(s):\\\\n\\\\n1. Error Handling with thiserror (pattern, score: 0.85)\\\\n Tags: rust, error-handling\\\\n Created: 2026-01-15\\\\n \\\\n2. Result Type Best Practices (guideline, score: 0.72)\\\\n Tags: rust, error-handling, best-practices\\\\n Created: 2026-01-10\\\\n\\\\n3. Custom Error Types (note, score: 0.65)\\\\n Tags: rust, error-handling\\\\n Created: 2026-01-08\\" }\\n}","breadcrumbs":"Tools Reference » kb/search","id":"492","title":"kb/search"},"493":{"body":"Add a new note to the knowledge base. Input Schema : { \\"type\\": \\"object\\", \\"properties\\": { \\"title\\": { \\"type\\": \\"string\\", \\"description\\": \\"Note title\\" }, \\"content\\": { \\"type\\": \\"string\\", \\"description\\": \\"Note content (markdown)\\" }, \\"tags\\": { \\"type\\": \\"array\\", \\"items\\": { \\"type\\": \\"string\\" }, \\"description\\": \\"Tags for categorization\\", \\"default\\": [] }, \\"relates_to\\": { \\"type\\": \\"array\\", \\"items\\": { \\"type\\": \\"string\\" }, \\"description\\": \\"Related node IDs\\", \\"default\\": [] }, \\"project\\": { \\"type\\": \\"string\\", \\"description\\": \\"Project graph name\\", \\"default\\": \\"default\\" } }, \\"required\\": [\\"title\\", \\"content\\"]\\n} Example Request : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 2, \\"method\\": \\"kogral/add_note\\", \\"params\\": { \\"title\\": \\"Async Trait Patterns\\", \\"content\\": \\"Common patterns for using async traits in Rust:\\\\n\\\\n1. Use `async-trait` crate\\\\n2. Box return types for flexibility\\\\n3. Consider Send + Sync bounds\\", \\"tags\\": [\\"rust\\", \\"async\\", \\"patterns\\"], \\"relates_to\\": [\\"pattern-error-handling\\"] }\\n} Example Response : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 2, \\"result\\": { \\"type\\": \\"text\\", \\"text\\": \\"Note added successfully: note-async-trait-patterns (ID: note-abc123)\\" }\\n}","breadcrumbs":"Tools Reference » kb/add_note","id":"493","title":"kb/add_note"},"494":{"body":"Create an Architectural Decision Record (ADR). Input Schema : { \\"type\\": \\"object\\", \\"properties\\": { \\"title\\": { \\"type\\": \\"string\\", \\"description\\": \\"Decision title\\" }, \\"context\\": { \\"type\\": \\"string\\", \\"description\\": \\"Decision context and background\\" }, \\"decision\\": { \\"type\\": \\"string\\", \\"description\\": \\"The decision made\\" }, \\"consequences\\": { \\"type\\": \\"array\\", \\"items\\": { \\"type\\": \\"string\\" }, \\"description\\": \\"List of consequences\\", \\"default\\": [] }, \\"status\\": { \\"type\\": \\"string\\", \\"enum\\": [\\"proposed\\", \\"accepted\\", \\"rejected\\", \\"deprecated\\", \\"superseded\\"], \\"default\\": \\"proposed\\" }, \\"tags\\": { \\"type\\": \\"array\\", \\"items\\": { \\"type\\": \\"string\\" }, \\"default\\": [] } }, \\"required\\": [\\"title\\", \\"context\\", \\"decision\\"]\\n} Example Request : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 3, \\"method\\": \\"kogral/add_decision\\", \\"params\\": { \\"title\\": \\"Use SurrealDB for Knowledge Graph Storage\\", \\"context\\": \\"Need a scalable storage solution that supports graph queries and can handle growing knowledge base\\", \\"decision\\": \\"Adopt SurrealDB as the primary storage backend for production deployments\\", \\"consequences\\": [ \\"Better query performance for graph traversal\\", \\"Native support for relationships\\", \\"Additional infrastructure dependency\\", \\"Team needs to learn SurrealDB query language\\" ], \\"status\\": \\"accepted\\", \\"tags\\": [\\"architecture\\", \\"storage\\", \\"surrealdb\\"] }\\n} Example Response : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 3, \\"result\\": { \\"type\\": \\"text\\", \\"text\\": \\"Decision added: decision-use-surrealdb (ID: decision-xyz789)\\\\nStatus: accepted\\" }\\n}","breadcrumbs":"Tools Reference » kb/add_decision","id":"494","title":"kb/add_decision"},"495":{"body":"Create a relationship between two nodes. Input Schema : { \\"type\\": \\"object\\", \\"properties\\": { \\"from\\": { \\"type\\": \\"string\\", \\"description\\": \\"Source node ID\\" }, \\"to\\": { \\"type\\": \\"string\\", \\"description\\": \\"Target node ID\\" }, \\"relation\\": { \\"type\\": \\"string\\", \\"enum\\": [\\"relates_to\\", \\"depends_on\\", \\"implements\\", \\"extends\\", \\"supersedes\\", \\"explains\\"], \\"description\\": \\"Relationship type\\" }, \\"strength\\": { \\"type\\": \\"number\\", \\"description\\": \\"Relationship strength (0-1)\\", \\"minimum\\": 0, \\"maximum\\": 1, \\"default\\": 1.0 } }, \\"required\\": [\\"from\\", \\"to\\", \\"relation\\"]\\n} Example Request : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 4, \\"method\\": \\"kogral/link\\", \\"params\\": { \\"from\\": \\"note-async-trait-patterns\\", \\"to\\": \\"pattern-error-handling\\", \\"relation\\": \\"relates_to\\", \\"strength\\": 0.8 }\\n} Example Response : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 4, \\"result\\": { \\"type\\": \\"text\\", \\"text\\": \\"Link created: note-async-trait-patterns --[relates_to]--> pattern-error-handling (strength: 0.8)\\" }\\n} Relationship Types : relates_to: General conceptual relationship depends_on: Dependency (from depends on to) implements: Implementation of concept/pattern extends: Inherits or extends another node supersedes: Replaces an older version explains: Provides documentation/clarification","breadcrumbs":"Tools Reference » kb/link","id":"495","title":"kb/link"},"496":{"body":"Retrieve guidelines for current project with inheritance resolution. Input Schema : { \\"type\\": \\"object\\", \\"properties\\": { \\"language\\": { \\"type\\": \\"string\\", \\"description\\": \\"Programming language (e.g., rust, nushell)\\" }, \\"category\\": { \\"type\\": \\"string\\", \\"description\\": \\"Guideline category (e.g., error-handling, testing)\\" }, \\"include_base\\": { \\"type\\": \\"boolean\\", \\"description\\": \\"Include shared/base guidelines\\", \\"default\\": true } }\\n} Example Request : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 5, \\"method\\": \\"kogral/get_guidelines\\", \\"params\\": { \\"language\\": \\"rust\\", \\"category\\": \\"error-handling\\", \\"include_base\\": true }\\n} Example Response : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 5, \\"result\\": { \\"type\\": \\"text\\", \\"text\\": \\"Guidelines for rust/error-handling:\\\\n\\\\n## Project Guidelines (priority: 150)\\\\n\\\\n1. Custom Error Types (guideline-custom-errors)\\\\n - Use thiserror for error definitions\\\\n - Implement From traits for conversions\\\\n - Source: .kogral/guidelines/rust-errors.md\\\\n\\\\n## Shared Guidelines (priority: 50)\\\\n\\\\n1. Result Type Best Practices (guideline-result-best-practices)\\\\n - Always use Result for fallible operations\\\\n - Never use unwrap() in production\\\\n - Source: ~/Tools/.kogral-shared/guidelines/rust-errors.md\\\\n\\\\n2. Error Propagation (guideline-error-propagation)\\\\n - Use ? operator for error propagation\\\\n - Add context with .context()\\\\n - Source: ~/Tools/.kogral-shared/guidelines/rust-errors.md\\" }\\n}","breadcrumbs":"Tools Reference » kb/get_guidelines","id":"496","title":"kb/get_guidelines"},"497":{"body":"List available knowledge graphs. Input Schema : { \\"type\\": \\"object\\", \\"properties\\": {}\\n} Example Request : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 6, \\"method\\": \\"kb/list_graphs\\"\\n} Example Response : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 6, \\"result\\": { \\"type\\": \\"text\\", \\"text\\": \\"Available graphs:\\\\n\\\\n- default (Current project)\\\\n Path: /path/to/project/.kogral\\\\n Nodes: 42\\\\n Last modified: 2026-01-17T10:30:00Z\\\\n\\\\n- shared (Shared guidelines)\\\\n Path: ~/Tools/.kogral-shared\\\\n Nodes: 156\\\\n Last modified: 2026-01-15T14:20:00Z\\" }\\n}","breadcrumbs":"Tools Reference » kb/list_graphs","id":"497","title":"kb/list_graphs"},"498":{"body":"Export knowledge base to various formats. Input Schema : { \\"type\\": \\"object\\", \\"properties\\": { \\"format\\": { \\"type\\": \\"string\\", \\"enum\\": [\\"logseq\\", \\"json\\", \\"markdown\\"], \\"description\\": \\"Export format\\" }, \\"output_path\\": { \\"type\\": \\"string\\", \\"description\\": \\"Output file or directory path\\" }, \\"include_types\\": { \\"type\\": \\"array\\", \\"items\\": { \\"type\\": \\"string\\", \\"enum\\": [\\"note\\", \\"decision\\", \\"guideline\\", \\"pattern\\", \\"journal\\", \\"execution\\"] }, \\"description\\": \\"Node types to include\\", \\"default\\": [\\"note\\", \\"decision\\", \\"guideline\\", \\"pattern\\"] }, \\"skip_journals\\": { \\"type\\": \\"boolean\\", \\"default\\": true } }, \\"required\\": [\\"format\\", \\"output_path\\"]\\n} Example Request : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 7, \\"method\\": \\"kogral/export\\", \\"params\\": { \\"format\\": \\"logseq\\", \\"output_path\\": \\"/Users/akasha/logseq-graph\\", \\"include_types\\": [\\"note\\", \\"decision\\", \\"guideline\\"], \\"skip_journals\\": true }\\n} Example Response : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 7, \\"result\\": { \\"type\\": \\"text\\", \\"text\\": \\"Export completed:\\\\n\\\\nFormat: Logseq\\\\nOutput: /Users/akasha/logseq-graph\\\\nExported: 42 nodes\\\\n - 23 notes\\\\n - 12 decisions\\\\n - 7 guidelines\\\\n\\\\nLogseq graph ready to open.\\" }\\n}","breadcrumbs":"Tools Reference » kb/export","id":"498","title":"kb/export"},"499":{"body":"Tools for querying Logseq content blocks. Requires blocks.enable_mcp_tools = true in configuration.","breadcrumbs":"Tools Reference » Block Tools","id":"499","title":"Block Tools"},"5":{"body":"We use just recipes for documentation tasks. All commands assume you\'re in the project root directory.","breadcrumbs":"Introduction » 🛠️ Documentation Commands","id":"5","title":"🛠️ Documentation Commands"},"50":{"body":"","breadcrumbs":"What is KOGRAL? » Core Philosophy","id":"50","title":"Core Philosophy"},"500":{"body":"Find blocks by tag, task status, or custom property across the knowledge base. Input Schema : { \\"type\\": \\"object\\", \\"properties\\": { \\"tag\\": { \\"type\\": \\"string\\", \\"description\\": \\"Find blocks with this tag (e.g., \'card\', \'important\')\\" }, \\"status\\": { \\"type\\": \\"string\\", \\"enum\\": [\\"TODO\\", \\"DOING\\", \\"DONE\\", \\"LATER\\", \\"NOW\\", \\"WAITING\\", \\"CANCELLED\\"], \\"description\\": \\"Find blocks with this task status\\" }, \\"property_key\\": { \\"type\\": \\"string\\", \\"description\\": \\"Custom property key to search for\\" }, \\"property_value\\": { \\"type\\": \\"string\\", \\"description\\": \\"Custom property value to match\\" }, \\"limit\\": { \\"type\\": \\"integer\\", \\"description\\": \\"Maximum number of results\\", \\"default\\": 20 } }\\n} Note : Provide one of: tag, status, or both property_key and property_value. Example Request (find blocks by tag): { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 8, \\"method\\": \\"kogral/find_blocks\\", \\"params\\": { \\"tag\\": \\"high-priority\\", \\"limit\\": 10 }\\n} Example Response : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 8, \\"result\\": { \\"type\\": \\"text\\", \\"text\\": \\"Found 3 blocks with tag \'#high-priority\':\\\\n\\\\n**Project Tasks** (project-tasks-123)\\\\n - TODO Implement authentication #high-priority\\\\n - TODO Fix security vulnerability #high-priority\\\\n\\\\n**Sprint Planning** (sprint-planning-456)\\\\n - DOING Refactor database layer #high-priority\\" }\\n} Example Request (find blocks by property): { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 9, \\"method\\": \\"kogral/find_blocks\\", \\"params\\": { \\"property_key\\": \\"priority\\", \\"property_value\\": \\"high\\", \\"limit\\": 15 }\\n}","breadcrumbs":"Tools Reference » kb/find_blocks","id":"500","title":"kb/find_blocks"},"501":{"body":"Find all TODO blocks across the knowledge base. Input Schema : { \\"type\\": \\"object\\", \\"properties\\": { \\"limit\\": { \\"type\\": \\"integer\\", \\"description\\": \\"Maximum number of results\\", \\"default\\": 20 } }\\n} Example Request : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 10, \\"method\\": \\"kogral/find_todos\\", \\"params\\": { \\"limit\\": 25 }\\n} Example Response : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 10, \\"result\\": { \\"type\\": \\"text\\", \\"text\\": \\"Found 8 TODO blocks:\\\\n\\\\n**Project Tasks** (project-tasks-123)\\\\n - TODO Implement authentication\\\\n - TODO Write integration tests\\\\n - TODO Update documentation\\\\n\\\\n**Bug Fixes** (bug-fixes-456)\\\\n - TODO Fix race condition in cache\\\\n - TODO Address memory leak\\\\n\\\\n**Research** (research-789)\\\\n - TODO Evaluate GraphQL alternatives\\\\n - TODO Benchmark new approach\\\\n - TODO Document findings\\" }\\n}","breadcrumbs":"Tools Reference » kb/find_todos","id":"501","title":"kb/find_todos"},"502":{"body":"Find all flashcard blocks (blocks tagged with #card) for spaced repetition learning. Input Schema : { \\"type\\": \\"object\\", \\"properties\\": { \\"limit\\": { \\"type\\": \\"integer\\", \\"description\\": \\"Maximum number of flashcards\\", \\"default\\": 10 } }\\n} Example Request : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 11, \\"method\\": \\"kogral/find_cards\\", \\"params\\": { \\"limit\\": 5 }\\n} Example Response : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 11, \\"result\\": { \\"type\\": \\"text\\", \\"text\\": \\"Found 3 flashcards:\\\\n\\\\n**Rust Learning** (rust-learning-123)\\\\n - What is Rust\'s ownership model? #card #rust\\\\n - Ownership prevents data races at compile time\\\\n - Each value has a single owner\\\\n\\\\n**System Design** (system-design-456)\\\\n - What is the CAP theorem? #card #distributed-systems\\\\n - Consistency, Availability, Partition tolerance\\\\n - Can only guarantee 2 of 3\\\\n\\\\n**Algorithms** (algorithms-789)\\\\n - What is the time complexity of quicksort? #card #algorithms\\\\n - Average: O(n log n)\\\\n - Worst case: O(n²)\\" }\\n} Use Cases : kb/find_blocks : General block search by metadata kb/find_todos : Task management and tracking kb/find_cards : Spaced repetition learning system See Also : Logseq Blocks Support ADR-004: Logseq Blocks Support","breadcrumbs":"Tools Reference » kb/find_cards","id":"502","title":"kb/find_cards"},"503":{"body":"Resources provide read-only access to knowledge graph content via URIs.","breadcrumbs":"Tools Reference » Resources","id":"503","title":"Resources"},"504":{"body":"Access project notes. URI : kogral://project/notes or kogral://project/notes/{note-id} Example : Read all project notes kogral://project/notes Example : Read specific note kogral://project/notes/async-trait-patterns","breadcrumbs":"Tools Reference » kogral://project/notes","id":"504","title":"kogral://project/notes"},"505":{"body":"Access project decisions (ADRs). URI : kogral://project/decisions or kogral://project/decisions/{decision-id}","breadcrumbs":"Tools Reference » kogral://project/decisions","id":"505","title":"kogral://project/decisions"},"506":{"body":"Access project-specific guidelines. URI : kogral://project/guidelines or kogral://project/guidelines/{guideline-id}","breadcrumbs":"Tools Reference » kogral://project/guidelines","id":"506","title":"kogral://project/guidelines"},"507":{"body":"Access project patterns. URI : kogral://project/patterns or kogral://project/patterns/{pattern-id}","breadcrumbs":"Tools Reference » kogral://project/patterns","id":"507","title":"kogral://project/patterns"},"508":{"body":"Access shared guidelines (inherited). URI : kogral://shared/guidelines or kogral://shared/guidelines/{guideline-id}","breadcrumbs":"Tools Reference » kogral://shared/guidelines","id":"508","title":"kogral://shared/guidelines"},"509":{"body":"Access shared patterns (inherited). URI : kogral://shared/patterns or kogral://shared/patterns/{pattern-id}","breadcrumbs":"Tools Reference » kogral://shared/patterns","id":"509","title":"kogral://shared/patterns"},"51":{"body":"Behavior defined in Nickel schemas, not hardcoded: { graph = { name = \\"my-project\\" }, storage = { primary = \'filesystem }, embeddings = { provider = \'fastembed }, templates = { templates_dir = \\"templates\\" },\\n} Every aspect configurable: storage, embeddings, templates, query behavior.","breadcrumbs":"What is KOGRAL? » Config-Driven","id":"51","title":"Config-Driven"},"510":{"body":"Prompts provide guided workflows for common tasks.","breadcrumbs":"Tools Reference » Prompts","id":"510","title":"Prompts"},"511":{"body":"Generate a comprehensive project knowledge summary. Arguments : { \\"project\\": { \\"type\\": \\"string\\", \\"description\\": \\"Project graph name\\", \\"default\\": \\"default\\" }\\n} Example Request : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 8, \\"method\\": \\"kogral/summarize_project\\", \\"params\\": { \\"project\\": \\"default\\" }\\n} Returns : Prompt messages with project summary including: Total node counts by type Recent additions Top tags Key decisions Active patterns","breadcrumbs":"Tools Reference » kb/summarize_project","id":"511","title":"kb/summarize_project"},"512":{"body":"Find nodes related to a specific topic or node. Arguments : { \\"node_id\\": { \\"type\\": \\"string\\", \\"description\\": \\"Node ID to find relations for\\" }, \\"depth\\": { \\"type\\": \\"integer\\", \\"description\\": \\"Maximum traversal depth\\", \\"default\\": 2 }\\n} Example Request : { \\"jsonrpc\\": \\"2.0\\", \\"id\\": 9, \\"method\\": \\"kb/find_related\\", \\"params\\": { \\"node_id\\": \\"pattern-error-handling\\", \\"depth\\": 2 }\\n} Returns : Prompt messages with: Direct relationships Indirect relationships (depth 2+) Common tags Related guidelines","breadcrumbs":"Tools Reference » kb/find_related","id":"512","title":"kb/find_related"},"513":{"body":"","breadcrumbs":"Tools Reference » Error Handling","id":"513","title":"Error Handling"},"514":{"body":"Standard JSON-RPC 2.0 error codes: Code Meaning Description -32700 Parse error Invalid JSON -32600 Invalid Request Missing required fields -32601 Method not found Unknown tool/resource -32602 Invalid params Parameter validation failed -32603 Internal error Server-side error","breadcrumbs":"Tools Reference » Error Codes","id":"514","title":"Error Codes"},"515":{"body":"{ \\"jsonrpc\\": \\"2.0\\", \\"id\\": 1, \\"error\\": { \\"code\\": -32602, \\"message\\": \\"Invalid params\\", \\"data\\": { \\"details\\": \\"Field \'query\' is required but missing\\", \\"field\\": \\"query\\" } }\\n}","breadcrumbs":"Tools Reference » Example Error Response","id":"515","title":"Example Error Response"},"516":{"body":"","breadcrumbs":"Tools Reference » Best Practices","id":"516","title":"Best Practices"},"517":{"body":"{ \\"method\\": \\"kogral/search\\", \\"params\\": { \\"query\\": \\"how to handle database connection errors\\", \\"semantic\\": true, \\"threshold\\": 0.5 }\\n}","breadcrumbs":"Tools Reference » 1. Use Semantic Search for Discovery","id":"517","title":"1. Use Semantic Search for Discovery"},"518":{"body":"{ \\"method\\": \\"kogral/link\\", \\"params\\": { \\"from\\": \\"note-new-discovery\\", \\"to\\": \\"pattern-related-pattern\\", \\"relation\\": \\"implements\\" }\\n}","breadcrumbs":"Tools Reference » 2. Link Related Concepts","id":"518","title":"2. Link Related Concepts"},"519":{"body":"{ \\"method\\": \\"kogral/get_guidelines\\", \\"params\\": { \\"language\\": \\"rust\\", \\"category\\": \\"testing\\" }\\n}","breadcrumbs":"Tools Reference » 3. Query Guidelines Before Implementation","id":"519","title":"3. Query Guidelines Before Implementation"},"52":{"body":"Knowledge stored as markdown files with YAML frontmatter: ---\\nid: note-123\\ntype: note\\ntitle: Error Handling Patterns\\ntags: [rust, error-handling]\\n--- # Error Handling Patterns Use `thiserror` for custom error types... Changes tracked via git, reviewable in PRs, mergeable across branches.","breadcrumbs":"What is KOGRAL? » Git-Friendly","id":"52","title":"Git-Friendly"},"520":{"body":"{ \\"method\\": \\"kogral/add_decision\\", \\"params\\": { \\"title\\": \\"Use X for Y\\", \\"context\\": \\"Background...\\", \\"decision\\": \\"We will...\\", \\"consequences\\": [\\"Pro 1\\", \\"Con 1\\"] }\\n}","breadcrumbs":"Tools Reference » 4. Document Decisions with ADRs","id":"520","title":"4. Document Decisions with ADRs"},"521":{"body":"MCP Specification Quick Start Guide Configuration Reference kb-mcp Source Code","breadcrumbs":"Tools Reference » See Also","id":"521","title":"See Also"},"522":{"body":"","breadcrumbs":"Resources » Resources","id":"522","title":"Resources"},"523":{"body":"","breadcrumbs":"Rust API » Rust API","id":"523","title":"Rust API"},"524":{"body":"","breadcrumbs":"Development Setup » Development Setup","id":"524","title":"Development Setup"},"525":{"body":"","breadcrumbs":"Code Standards » Code Standards","id":"525","title":"Code Standards"},"526":{"body":"","breadcrumbs":"Testing » Testing","id":"526","title":"Testing"},"53":{"body":"Built for agent collaboration: MCP Protocol : Native integration with Claude Code Semantic Search : Find concepts, not just keywords Auto-Linking : Suggest relationships based on content Context Injection : Agents query relevant guidelines before coding","breadcrumbs":"What is KOGRAL? » AI-Native","id":"53","title":"AI-Native"},"54":{"body":"","breadcrumbs":"What is KOGRAL? » Key Concepts","id":"54","title":"Key Concepts"},"55":{"body":"6 types of knowledge nodes: Type Purpose Example Note General observations \\"Rust ownership patterns\\" Decision ADRs (Architectural Decision Records) \\"Use SurrealDB for storage\\" Guideline Code standards \\"Error handling with thiserror\\" Pattern Reusable solutions \\"Repository pattern for DB access\\" Journal Daily reflections \\"2026-01-17 progress notes\\" Execution Agent task records \\"Implemented auth module\\"","breadcrumbs":"What is KOGRAL? » Nodes","id":"55","title":"Nodes"},"56":{"body":"6 typed edges connecting nodes: Relation Meaning Example relates_to Conceptual link Note ↔ Note depends_on Prerequisite Pattern → Guideline implements Concrete realization Code → Pattern extends Inheritance ProjectGuideline → BaseGuideline supersedes Replacement DecisionV2 → DecisionV1 explains Documentation Note → Execution","breadcrumbs":"What is KOGRAL? » Relationships","id":"56","title":"Relationships"},"57":{"body":"Local Graph (per project): Stored in .kogral/ directory Git-tracked for version control Project-specific knowledge Shared Graph (organization-wide): Centralized guidelines and patterns SurrealDB for scalability Inherited by projects Inheritance Resolution : Shared Guidelines (priority: 50) ↓\\nProject Guidelines (priority: 100) ↓\\nEffective Guidelines (higher priority wins)","breadcrumbs":"What is KOGRAL? » Multi-Graph Architecture","id":"57","title":"Multi-Graph Architecture"},"58":{"body":"","breadcrumbs":"What is KOGRAL? » Use Cases","id":"58","title":"Use Cases"},"59":{"body":"Capture decisions as you make them (ADRs) Document patterns for future reference Track daily progress in journal entries Query past decisions before new implementations","breadcrumbs":"What is KOGRAL? » For Developers","id":"59","title":"For Developers"},"6":{"body":"# Serve documentation locally (recommended)\\njust docs::serve # Build static HTML\\njust docs::build # Watch and rebuild on file changes\\njust docs::watch","breadcrumbs":"Introduction » Build and Serve","id":"6","title":"Build and Serve"},"60":{"body":"Share guidelines across projects Standardize patterns organization-wide Onboard new members with searchable knowledge Review decisions in context with git history","breadcrumbs":"What is KOGRAL? » For Teams","id":"60","title":"For Teams"},"61":{"body":"Query guidelines before generating code Check past decisions for context Document executions for audit trails Suggest related patterns during implementation","breadcrumbs":"What is KOGRAL? » For AI Agents","id":"61","title":"For AI Agents"},"62":{"body":"","breadcrumbs":"What is KOGRAL? » Comparison with Other Tools","id":"62","title":"Comparison with Other Tools"},"63":{"body":"Feature KOGRAL Logseq Storage Git-friendly markdown + DB Local markdown AI Integration Native MCP protocol Plugin-based Config Type-safe Nickel schemas JSON files Multi-Backend Filesystem + SurrealDB Filesystem only Semantic Search Multiple AI providers Local only Graph Queries SurrealDB graph queries Block references Compatibility : KOGRAL can import/export Logseq graphs for visual editing.","breadcrumbs":"What is KOGRAL? » vs. Logseq","id":"63","title":"vs. Logseq"},"64":{"body":"Feature KOGRAL Obsidian Target Audience Developers + AI agents Knowledge workers Focus Structured knowledge graph Flexible note-taking Configuration Config-driven (Nickel) Settings UI CLI Full CLI + MCP server Limited CLI Version Control Git-native Git plugin Use Case : KOGRAL for developer knowledge, Obsidian for personal notes.","breadcrumbs":"What is KOGRAL? » vs. Obsidian","id":"64","title":"vs. Obsidian"},"65":{"body":"Feature KOGRAL Notion/Confluence Storage Local-first Cloud-only Format Plain markdown Proprietary AI Access Programmatic API Web scraping Offline Full functionality Limited Privacy Self-hosted Third-party servers Advantage : KOGRAL keeps sensitive knowledge on-premises.","breadcrumbs":"What is KOGRAL? » vs. Notion/Confluence","id":"65","title":"vs. Notion/Confluence"},"66":{"body":"┌─────────────────────────────────────────────────────┐\\n│ kb-core │\\n│ (Rust library: graph, storage, config, query) │\\n└──────────────┬─────────────┬────────────────────────┘ │ │ ┌─────────┴──────┐ ┌──┴─────────┐ │ │ │ │\\n┌────▼─────┐ ┌──────▼──▼───┐ ┌─────▼─────┐\\n│ kb-cli │ │ kb-mcp │ │ NuShell │\\n│ (13 cmds)│ │ (MCP server) │ │ (scripts) │\\n└──────────┘ └──────────────┘ └───────────┘ Layers : kb-core : Core library (models, storage, query) kb-cli : Command-line interface kb-mcp : MCP server for AI integration Scripts : NuShell automation (sync, backup, etc.)","breadcrumbs":"What is KOGRAL? » Architecture Overview","id":"66","title":"Architecture Overview"},"67":{"body":"✅ Good fit : Developer teams building software Projects with architectural decisions Organizations standardizing patterns AI-assisted development workflows Knowledge requiring version control ❌ Not ideal for : Personal journaling (use Obsidian) Team wikis (use Notion) Customer documentation (use mdBook) Simple note-taking (use Logseq)","breadcrumbs":"What is KOGRAL? » When to Use KOGRAL","id":"67","title":"When to Use KOGRAL"},"68":{"body":"New to KOGRAL? → Installation Guide Ready to start? → Quick Start Want examples? → Use Cases Understand design? → Architecture Overview \\"Knowledge is only valuable when it\'s accessible, connected, and queryable.\\"","breadcrumbs":"What is KOGRAL? » Next Steps","id":"68","title":"Next Steps"},"69":{"body":"Understanding the fundamental concepts behind KOGRAL.","breadcrumbs":"Core Concepts » Core Concepts","id":"69","title":"Core Concepts"},"7":{"body":"# Test code examples in documentation\\njust docs::test # Check for broken links\\njust docs::check-links","breadcrumbs":"Introduction » Validation","id":"7","title":"Validation"},"70":{"body":"At its core, KOGRAL is a directed graph where: Nodes = pieces of knowledge (notes, decisions, guidelines, patterns) Edges = typed relationships between concepts Node Types and Relationships This graph structure enables: Discovery : Find related concepts through traversal Context : Understand how ideas connect Evolution : Track how knowledge changes over time","breadcrumbs":"Core Concepts » The Knowledge Graph","id":"70","title":"The Knowledge Graph"},"71":{"body":"","breadcrumbs":"Core Concepts » Node Types","id":"71","title":"Node Types"},"72":{"body":"Purpose : Capture general observations, learnings, and discoveries. When to use : Documenting a concept you learned Recording implementation details Capturing meeting notes Quick knowledge capture Example : ---\\ntype: note\\ntitle: Async Trait Patterns in Rust\\ntags: [rust, async, patterns]\\n--- # Async Trait Patterns in Rust Using async traits with the async-trait crate...","breadcrumbs":"Core Concepts » 1. Note","id":"72","title":"1. Note"},"73":{"body":"Purpose : Record architectural decisions with full context. When to use : Choosing between alternatives (REST vs GraphQL) Major technical decisions (database selection) Trade-off analysis Explaining \\"why\\" for future reference Structure : Context : Background and problem Decision : What was chosen Consequences : Positive and negative outcomes Alternatives : What was considered but rejected Example : ---\\ntype: decision\\ntitle: Use SurrealDB for Storage\\nstatus: accepted\\n--- ## Context\\nNeed a graph database that supports our relationship model... ## Decision\\nAdopt SurrealDB as the primary storage backend. ## Consequences\\n+ Better graph query performance\\n+ Native relationship support\\n- Additional infrastructure dependency\\n- Team learning curve","breadcrumbs":"Core Concepts » 2. Decision (ADR)","id":"73","title":"2. Decision (ADR)"},"74":{"body":"Purpose : Define coding standards, best practices, and conventions. When to use : Code style rules Architecture patterns to follow Security requirements Testing standards Can be : Shared : Organization-wide (in shared KOGRAL) Project-specific : Overrides shared guidelines Example : ---\\ntype: guideline\\nlanguage: rust\\ncategory: error-handling\\n--- # Rust Error Handling Guidelines 1. Use `thiserror` for custom error types\\n2. Never use `unwrap()` in production code\\n3. Always propagate errors with `?`","breadcrumbs":"Core Concepts » 3. Guideline","id":"74","title":"3. Guideline"},"75":{"body":"Purpose : Document reusable solutions to common problems. When to use : Recurring implementation patterns Tested solutions Best practice implementations Code templates Structure : Problem : What challenge does this solve? Solution : The pattern/approach Context : When to use/not use Example : Working code Example : ---\\ntype: pattern\\ntitle: Repository Pattern for Database Access\\ntags: [architecture, database, pattern]\\n--- ## Problem\\nNeed consistent database access across modules. ## Solution\\nRepository pattern with trait abstraction... ## Example\\n\\\\`\\\\`\\\\`rust\\ntrait UserRepository { async fn find_by_id(&self, id: Uuid) -> Result;\\n}\\n\\\\`\\\\`\\\\`","breadcrumbs":"Core Concepts » 4. Pattern","id":"75","title":"4. Pattern"},"76":{"body":"Purpose : Daily development log for tracking progress and reflections. When to use : End of day summaries Daily standup notes Progress tracking Blocker documentation Auto-linked : KOGRAL can auto-link journal entries to mentioned concepts. Example : ---\\ntype: journal\\ndate: 2026-01-17\\n--- ## Progress\\n- Implemented authentication module\\n- Fixed cache race condition ## Blockers\\n- Need API versioning discussion ## Learnings\\n- tokio::select! perfect for timeouts","breadcrumbs":"Core Concepts » 5. Journal","id":"76","title":"5. Journal"},"77":{"body":"Purpose : Record AI agent execution results (from Vapora integration). When to use : Agent task completion Execution metrics Agent decision history Audit trail Example : ---\\ntype: execution\\ntask_type: code_generation\\nagent: rust-expert\\noutcome: success\\nduration: 45s\\n--- Generated authentication module following project guidelines.","breadcrumbs":"Core Concepts » 6. Execution","id":"77","title":"6. Execution"},"78":{"body":"","breadcrumbs":"Core Concepts » Relationship Types","id":"78","title":"Relationship Types"},"79":{"body":"Meaning : General conceptual relationship. Use : Connect related ideas without specific dependency. Example : [Note: Async Patterns] --relates_to--> [Note: Tokio Runtime]","breadcrumbs":"Core Concepts » 1. relates_to","id":"79","title":"1. relates_to"},"8":{"body":"# Remove build artifacts\\njust docs::clean","breadcrumbs":"Introduction » Cleanup","id":"8","title":"Cleanup"},"80":{"body":"Meaning : Prerequisite relationship. Source requires target to exist/be understood first. Use : Learning paths, implementation order. Example : [Pattern: Advanced Error Handling] --depends_on--> [Guideline: Basic Errors]","breadcrumbs":"Core Concepts » 2. depends_on","id":"80","title":"2. depends_on"},"81":{"body":"Meaning : Concrete implementation of an abstract concept. Use : Connect code to patterns/guidelines. Example : [Note: Auth Module Implementation] --implements--> [Pattern: Repository Pattern]","breadcrumbs":"Core Concepts » 3. implements","id":"81","title":"3. implements"},"82":{"body":"Meaning : Inheritance/extension relationship. Use : Guideline overrides, pattern variations. Example : [Guideline: Project Error Handling] --extends--> [Guideline: Shared Error Handling]","breadcrumbs":"Core Concepts » 4. extends","id":"82","title":"4. extends"},"83":{"body":"Meaning : Replacement relationship. Source replaces target. Use : Track evolution of decisions/patterns. Example : [Decision: Use GraphQL v2] --supersedes--> [Decision: Use REST]","breadcrumbs":"Core Concepts » 5. supersedes","id":"83","title":"5. supersedes"},"84":{"body":"Meaning : Documentation/clarification relationship. Use : Connect notes to implementations, executions to rationale. Example : [Note: Why We Chose Rust] --explains--> [Decision: Adopt Rust]","breadcrumbs":"Core Concepts » 6. explains","id":"84","title":"6. explains"},"85":{"body":"KB supports multiple knowledge graphs :","breadcrumbs":"Core Concepts » Multi-Graph Architecture","id":"85","title":"Multi-Graph Architecture"},"86":{"body":"Location : .kogral/ in project directory Purpose : Project-specific knowledge Project decisions Implementation notes Local patterns Daily journals Storage : Filesystem (git-tracked) Scope : Single project","breadcrumbs":"Core Concepts » Local Graph (Project-Specific)","id":"86","title":"Local Graph (Project-Specific)"},"87":{"body":"Location : Configurable (e.g., ~/org/.kogral-shared) Purpose : Shared organizational knowledge Coding guidelines Standard patterns Architecture principles Security policies Storage : SurrealDB (centralized) or filesystem (synced) Scope : All projects","breadcrumbs":"Core Concepts » Shared Graph (Organization-Wide)","id":"87","title":"Shared Graph (Organization-Wide)"},"88":{"body":"Shared Guidelines (priority: 50) ↓ [inherited by]\\nProject Guidelines (priority: 100) ↓ [effective]\\nCombined Guidelines (higher priority wins) Example : Shared guideline: \\"Use Result for errors\\" Project override: \\"Use Result + log all errors with tracing\\" Effective: Both rules apply, project adds requirement","breadcrumbs":"Core Concepts » Inheritance Model","id":"88","title":"Inheritance Model"},"89":{"body":"Everything is configurable via Nickel schemas: { graph = { name = \\"my-project\\" }, # Graph metadata storage = { primary = \'filesystem }, # Where to store embeddings = { provider = \'fastembed }, # AI provider templates = { /* ... */ }, # Document templates query = { similarity_threshold = 0.6 }, # Search behavior\\n} No hardcoding : Change behavior without code changes.","breadcrumbs":"Core Concepts » Config-Driven Behavior","id":"89","title":"Config-Driven Behavior"},"9":{"body":"just docs::help","breadcrumbs":"Introduction » View All Documentation Commands","id":"9","title":"View All Documentation Commands"},"90":{"body":"Beyond keyword matching, KOGRAL uses embeddings to find concepts: Keyword search : \\"Find \'error handling\'\\" Matches exact phrase \\"error handling\\" Semantic search : \\"How to handle failures gracefully?\\" Finds: error handling, exception patterns, Result types, panic recovery Understands: \\"failures\\" = errors, \\"gracefully\\" = best practices How it works : Text → Embedding (384 or 1536 dimensional vector) Similarity search (cosine distance) Return nodes above threshold (e.g., 0.6) Providers : fastembed : Local, free, offline (384d) OpenAI : Cloud, best quality (1536d) Claude : Cloud, excellent (1024d) Ollama : Self-hosted (768d)","breadcrumbs":"Core Concepts » Semantic Search","id":"90","title":"Semantic Search"},"91":{"body":"Tera templates generate consistent documents: ---\\nid: {{ id }}\\ntype: {{ type }}\\ntitle: {{ title }}\\ntags: [{% for tag in tags %}\\"{{ tag }}\\"{% endfor %}]\\n--- # {{ title }} {{ content }} Customizable : Override templates per project. Export formats : Logseq, JSON, Markdown.","breadcrumbs":"Core Concepts » Templates","id":"91","title":"Templates"},"92":{"body":"Model Context Protocol connects KOGRAL to Claude Code: Claude Code ↓ [JSON-RPC 2.0]\\nkb-mcp Server ↓ [Rust API]\\nkb-core Library ↓ [Storage]\\nKnowledge Graph Tools : kogral/search, kogral/add_note, kogral/get_guidelines, etc. Resources : kogral://project/notes, kogral://shared/guidelines Prompts : kogral/summarize_project, kogral/find_related","breadcrumbs":"Core Concepts » MCP Integration","id":"92","title":"MCP Integration"},"93":{"body":"Markdown + YAML frontmatter = git-tracked knowledge: ---\\nid: note-123\\ntype: note\\ntitle: My Note\\n--- # Content here Benefits : ✅ Diffs in PRs (reviewable changes) ✅ Branches (experiment with knowledge) ✅ Merges (combine knowledge from feature branches) ✅ History (track evolution over time) ✅ Blame (who added this knowledge?)","breadcrumbs":"Core Concepts » Git-Friendly Storage","id":"93","title":"Git-Friendly Storage"},"94":{"body":"KOGRAL provides full support for Logseq-style outliner blocks with rich metadata and structure.","breadcrumbs":"Core Concepts » Logseq Content Blocks","id":"94","title":"Logseq Content Blocks"},"95":{"body":"Blocks are the fundamental unit of content in Logseq\'s outliner format: Each bullet point is a block Blocks can have children (nested blocks) Blocks support tasks, tags, and custom properties Blocks can reference other blocks or pages","breadcrumbs":"Core Concepts » What are Blocks?","id":"95","title":"What are Blocks?"},"96":{"body":"Task Status : - TODO Implement authentication #high-priority\\n- DOING Write tests\\n- DONE Deploy to staging\\n- LATER Consider GraphQL API\\n- NOW Fix critical bug\\n- WAITING Code review from @alice\\n- CANCELLED Old approach Inline Tags : - Learning Rust ownership #rust #learning #card - Prevents data races at compile time - Borrowing rules enforce safety Custom Properties : - Research paper summary priority:: high reviewed:: 2026-01-17 source:: https://example.com/paper.pdf - Key findings... Block and Page References : - Meeting notes from [[2026-01-17]] - Discussed architecture ((block-ref-123)) - Action items: [[Project Roadmap]] Hierarchical Structure : - Parent block #top-level - Child block 1 - Nested child - Child block 2","breadcrumbs":"Core Concepts » Block Features","id":"96","title":"Block Features"},"97":{"body":"Blocks support is opt-in via configuration: { blocks = { enabled = true, # Enable blocks parsing parse_on_import = true, # Auto-parse from Logseq imports serialize_on_export = true, # Serialize to outliner format enable_mcp_tools = true, # Enable block-related MCP tools },\\n}","breadcrumbs":"Core Concepts » Configuration","id":"97","title":"Configuration"},"98":{"body":"1. Task Management : - TODO Weekly sprint planning #meeting - DONE Review last sprint - DOING Plan current sprint - TODO Assign tasks 2. Flashcards (Spaced Repetition) : - What is Rust\'s ownership model? #card #rust - Ownership prevents data races at compile time - Each value has a single owner - When owner goes out of scope, value is dropped 3. Knowledge Capture with Metadata : - Tokio async runtime patterns #rust #async category:: architecture difficulty:: intermediate - Use tokio::select! for concurrent operations - spawn_blocking() for CPU-intensive work 4. Linked Notes : - Discussed [[ADR-001]] in architecture meeting - Decided on SurrealDB - See ((meeting-notes-block-id)) for details","breadcrumbs":"Core Concepts » Use Cases","id":"98","title":"Use Cases"},"99":{"body":"Query blocks across your knowledge base: Find blocks by tag : { \\"tool\\": \\"kogral/find_blocks\\", \\"arguments\\": { \\"tag\\": \\"card\\" }\\n} Find all TODOs : { \\"tool\\": \\"kogral/find_todos\\", \\"arguments\\": { \\"limit\\": 20 }\\n} Find flashcards : { \\"tool\\": \\"kogral/find_cards\\", \\"arguments\\": { \\"limit\\": 10 }\\n} Find blocks by property : { \\"tool\\": \\"kogral/find_blocks\\", \\"arguments\\": { \\"property_key\\": \\"priority\\", \\"property_value\\": \\"high\\" }\\n}","breadcrumbs":"Core Concepts » Block Queries (MCP Tools)","id":"99","title":"Block Queries (MCP Tools)"}},"length":527,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{".":{"=":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"0":{".":{"0":{".":{"0":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"1":{"/":{"1":{"df":0,"docs":{},"k":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"/":{"1":{"df":0,"docs":{},"k":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"144":{"tf":1.0}}},"1":{"df":1,"docs":{"391":{"tf":1.0}}},"3":{"df":1,"docs":{"302":{"tf":1.0}}},"4":{"df":1,"docs":{"492":{"tf":1.0}}},"5":{"df":1,"docs":{"517":{"tf":1.0}}},"6":{"5":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"298":{"tf":1.0},"308":{"tf":1.0},"492":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0}}},"7":{"2":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"200":{"tf":1.0},"290":{"tf":1.0}}},"8":{"5":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"495":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{"0":{"1":{"df":1,"docs":{"270":{"tf":1.0}}},"2":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}},"1":{"df":3,"docs":{"331":{"tf":1.0},"363":{"tf":1.0},"98":{"tf":1.0}}},"2":{"df":3,"docs":{"348":{"tf":1.0},"349":{"tf":1.0},"393":{"tf":1.0}}},"3":{"df":2,"docs":{"363":{"tf":1.0},"364":{"tf":1.0}}},"4":{"df":4,"docs":{"100":{"tf":1.0},"393":{"tf":1.0},"394":{"tf":1.0},"502":{"tf":1.0}}},"5":{"df":1,"docs":{"414":{"tf":1.0}}},"df":0,"docs":{}},"1":{"df":17,"docs":{"202":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"247":{"tf":1.7320508075688772},"270":{"tf":1.4142135623730951},"331":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"393":{"tf":1.0},"413":{"tf":1.0},"461":{"tf":2.23606797749979},"492":{"tf":1.7320508075688772},"497":{"tf":1.4142135623730951},"55":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"461":{"tf":1.0}}},"5":{"df":1,"docs":{"461":{"tf":1.0}}},"8":{"df":2,"docs":{"461":{"tf":1.0},"492":{"tf":1.0}}},"df":8,"docs":{"237":{"tf":1.4142135623730951},"277":{"tf":2.23606797749979},"289":{"tf":1.0},"308":{"tf":1.0},"324":{"tf":1.0},"366":{"tf":1.0},"492":{"tf":1.0},"495":{"tf":1.4142135623730951}},"x":{"0":{"1":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"b":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{".":{"0":{".":{"0":{"df":4,"docs":{"212":{"tf":1.0},"292":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"144":{"tf":1.0},"495":{"tf":1.0}}},"7":{"0":{"df":2,"docs":{"161":{"tf":1.0},"195":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{",":{"0":{"0":{"0":{"df":3,"docs":{"281":{"tf":1.4142135623730951},"365":{"tf":1.0},"371":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"df":2,"docs":{"241":{"tf":1.0},"281":{"tf":1.4142135623730951}}},"df":7,"docs":{"153":{"tf":1.0},"244":{"tf":1.4142135623730951},"366":{"tf":1.4142135623730951},"369":{"tf":1.0},"371":{"tf":1.0},"57":{"tf":1.0},"88":{"tf":1.0}},"m":{"b":{"df":2,"docs":{"351":{"tf":1.0},"357":{"tf":1.0}}},"df":1,"docs":{"391":{"tf":1.0}}}},"2":{"4":{"d":{"df":1,"docs":{"90":{"tf":1.0}}},"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"3":{"df":1,"docs":{"492":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":15,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"142":{"tf":1.0},"205":{"tf":1.0},"24":{"tf":1.0},"243":{"tf":1.0},"247":{"tf":1.0},"365":{"tf":1.0},"461":{"tf":1.0},"487":{"tf":1.0},"492":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.4142135623730951},"502":{"tf":1.0},"99":{"tf":1.0}}},"1":{"df":3,"docs":{"143":{"tf":1.0},"25":{"tf":1.0},"502":{"tf":1.4142135623730951}}},"2":{"3":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":3,"docs":{"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}},"df":6,"docs":{"264":{"tf":1.4142135623730951},"296":{"tf":1.0},"318":{"tf":1.0},"52":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.0}}},"df":5,"docs":{"144":{"tf":1.0},"26":{"tf":1.0},"463":{"tf":1.0},"467":{"tf":1.4142135623730951},"498":{"tf":1.0}}},"3":{"df":2,"docs":{"257":{"tf":1.0},"66":{"tf":1.0}}},"5":{"0":{")":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"1":{"df":1,"docs":{"496":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}},"3":{"6":{"d":{"df":1,"docs":{"90":{"tf":1.0}}},"df":7,"docs":{"289":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"357":{"tf":1.0},"359":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}},"6":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.0}}}},"df":3,"docs":{"295":{"tf":1.0},"461":{"tf":1.0},"500":{"tf":1.0}},"t":{"1":{"4":{":":{"2":{"0":{":":{"0":{"0":{"df":0,"docs":{},"z":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"7":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":12,"docs":{"238":{"tf":1.7320508075688772},"247":{"tf":1.7320508075688772},"331":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"393":{"tf":1.0},"413":{"tf":1.0},"55":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.4142135623730951}},"t":{"1":{"0":{":":{"3":{"0":{":":{"0":{"0":{"df":0,"docs":{},"z":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"202":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"8":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":54,"docs":{"107":{"tf":1.0},"113":{"tf":1.0},"127":{"tf":1.0},"133":{"tf":1.0},"146":{"tf":1.0},"15":{"tf":1.0},"150":{"tf":1.0},"156":{"tf":1.0},"164":{"tf":1.0},"169":{"tf":1.0},"184":{"tf":1.0},"196":{"tf":1.0},"2":{"tf":1.0},"229":{"tf":1.0},"231":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"287":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"298":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":2.23606797749979},"330":{"tf":1.0},"333":{"tf":1.0},"351":{"tf":1.0},"366":{"tf":1.0},"387":{"tf":1.0},"391":{"tf":1.0},"398":{"tf":1.0},"401":{"tf":1.0},"407":{"tf":1.0},"409":{"tf":1.0},"448":{"tf":1.0},"461":{"tf":1.0},"463":{"tf":1.4142135623730951},"465":{"tf":1.0},"466":{"tf":1.0},"469":{"tf":1.0},"492":{"tf":1.7320508075688772},"495":{"tf":1.4142135623730951},"515":{"tf":1.0},"517":{"tf":1.0},"520":{"tf":1.4142135623730951},"72":{"tf":1.0},"74":{"tf":1.0},"79":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"2":{".":{"0":{"df":17,"docs":{"258":{"tf":1.0},"487":{"tf":1.0},"492":{"tf":1.4142135623730951},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"495":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"511":{"tf":1.0},"512":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"df":0,"docs":{},"m":{"df":1,"docs":{"234":{"tf":1.0}}}},"2":{"4":{"0":{"3":{"0":{"7":{"df":2,"docs":{"290":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"df":17,"docs":{"202":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"247":{"tf":1.7320508075688772},"270":{"tf":1.4142135623730951},"331":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"393":{"tf":1.0},"413":{"tf":1.0},"461":{"tf":2.23606797749979},"492":{"tf":1.7320508075688772},"497":{"tf":1.4142135623730951},"55":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":3,"docs":{"500":{"tf":1.0},"501":{"tf":1.0},"99":{"tf":1.0}}},"3":{"4":{"df":1,"docs":{"238":{"tf":1.4142135623730951}}},"df":2,"docs":{"463":{"tf":1.0},"498":{"tf":1.0}}},"5":{"df":1,"docs":{"501":{"tf":1.0}}},"df":54,"docs":{"108":{"tf":1.0},"113":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"118":{"tf":1.0},"128":{"tf":1.0},"134":{"tf":1.0},"147":{"tf":1.0},"16":{"tf":1.0},"165":{"tf":1.0},"170":{"tf":1.0},"185":{"tf":1.0},"197":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"3":{"tf":1.0},"307":{"tf":1.0},"317":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.0},"334":{"tf":1.0},"346":{"tf":1.0},"352":{"tf":1.0},"367":{"tf":1.0},"388":{"tf":1.0},"399":{"tf":1.0},"401":{"tf":1.0},"407":{"tf":1.0},"410":{"tf":1.0},"413":{"tf":1.0},"449":{"tf":1.0},"461":{"tf":1.0},"463":{"tf":1.7320508075688772},"465":{"tf":1.4142135623730951},"466":{"tf":1.0},"470":{"tf":1.0},"487":{"tf":1.0},"493":{"tf":1.4142135623730951},"502":{"tf":1.0},"512":{"tf":1.7320508075688772},"518":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"80":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}},"m":{"b":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}}},"3":{"0":{"0":{"0":{"df":2,"docs":{"2":{"tf":1.0},"43":{"tf":1.0}}},"1":{"df":1,"docs":{"43":{"tf":1.0}}},"df":1,"docs":{"289":{"tf":1.0}}},"df":1,"docs":{"127":{"tf":1.0}}},"2":{"6":{"0":{"0":{"df":1,"docs":{"514":{"tf":1.0}}},"1":{"df":1,"docs":{"514":{"tf":1.0}}},"2":{"df":2,"docs":{"514":{"tf":1.0},"515":{"tf":1.0}}},"3":{"df":1,"docs":{"514":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"df":1,"docs":{"514":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"4":{"d":{"df":1,"docs":{"90":{"tf":1.0}}},"df":7,"docs":{"288":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.7320508075688772},"357":{"tf":1.0},"359":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":1,"docs":{"502":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":48,"docs":{"109":{"tf":1.4142135623730951},"114":{"tf":1.0},"129":{"tf":1.0},"135":{"tf":1.0},"148":{"tf":1.0},"166":{"tf":1.0},"17":{"tf":1.0},"171":{"tf":1.0},"182":{"tf":1.0},"186":{"tf":1.0},"198":{"tf":1.0},"231":{"tf":1.0},"235":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":2.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"292":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"318":{"tf":1.0},"324":{"tf":1.0},"328":{"tf":1.0},"333":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"368":{"tf":1.0},"389":{"tf":1.0},"4":{"tf":1.0},"400":{"tf":1.0},"407":{"tf":1.0},"411":{"tf":1.0},"450":{"tf":1.0},"461":{"tf":1.0},"463":{"tf":1.4142135623730951},"465":{"tf":1.0},"471":{"tf":1.0},"487":{"tf":1.0},"492":{"tf":1.0},"494":{"tf":1.4142135623730951},"500":{"tf":1.0},"502":{"tf":1.0},"519":{"tf":1.0},"74":{"tf":1.4142135623730951},"81":{"tf":1.0},"98":{"tf":1.0}}},"4":{"2":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":2,"docs":{"463":{"tf":1.0},"498":{"tf":1.0}}},"5":{"6":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":3,"docs":{"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"77":{"tf":1.0}}},"8":{"df":1,"docs":{"278":{"tf":1.0}}},"df":27,"docs":{"110":{"tf":1.0},"113":{"tf":1.0},"136":{"tf":1.0},"149":{"tf":1.0},"18":{"tf":1.0},"199":{"tf":1.0},"238":{"tf":1.0},"247":{"tf":1.4142135623730951},"276":{"tf":1.0},"290":{"tf":1.0},"301":{"tf":1.0},"309":{"tf":1.0},"319":{"tf":1.0},"324":{"tf":1.0},"328":{"tf":1.0},"390":{"tf":1.0},"401":{"tf":1.0},"407":{"tf":1.0},"451":{"tf":1.0},"461":{"tf":1.0},"463":{"tf":1.0},"472":{"tf":1.0},"495":{"tf":1.4142135623730951},"520":{"tf":1.0},"75":{"tf":1.0},"82":{"tf":1.0},"98":{"tf":1.0}}},"5":{".":{".":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{")":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"1":{"df":1,"docs":{"496":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"0":{"df":0,"docs":{},"m":{"df":1,"docs":{"379":{"tf":1.0}}}},"df":5,"docs":{"129":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"57":{"tf":1.0},"88":{"tf":1.0}},"m":{"df":1,"docs":{"234":{"tf":1.4142135623730951}}}},"6":{"df":1,"docs":{"278":{"tf":1.0}}},"df":31,"docs":{"108":{"tf":1.0},"111":{"tf":1.0},"114":{"tf":1.0},"137":{"tf":1.0},"150":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"194":{"tf":1.0},"200":{"tf":1.4142135623730951},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"278":{"tf":1.0},"302":{"tf":1.0},"310":{"tf":1.0},"328":{"tf":1.0},"380":{"tf":1.0},"402":{"tf":1.0},"407":{"tf":1.0},"447":{"tf":1.0},"452":{"tf":1.0},"461":{"tf":1.4142135623730951},"463":{"tf":1.7320508075688772},"465":{"tf":1.0},"473":{"tf":1.0},"492":{"tf":1.0},"496":{"tf":1.4142135623730951},"502":{"tf":1.0},"76":{"tf":1.0},"83":{"tf":1.0}},"m":{"b":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}}},"6":{"df":18,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"138":{"tf":1.0},"144":{"tf":1.0},"20":{"tf":1.0},"201":{"tf":1.0},"231":{"tf":1.4142135623730951},"242":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"276":{"tf":1.0},"407":{"tf":1.0},"487":{"tf":1.0},"497":{"tf":1.4142135623730951},"55":{"tf":1.0},"56":{"tf":1.0},"77":{"tf":1.0},"84":{"tf":1.0}}},"7":{"6":{"8":{"d":{"df":1,"docs":{"90":{"tf":1.0}}},"df":3,"docs":{"292":{"tf":1.0},"354":{"tf":1.0},"359":{"tf":1.0}}},"df":0,"docs":{}},"8":{"9":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":2,"docs":{"501":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":8,"docs":{"139":{"tf":1.0},"202":{"tf":1.0},"21":{"tf":1.0},"245":{"tf":1.0},"258":{"tf":1.0},"463":{"tf":1.0},"487":{"tf":1.0},"498":{"tf":1.7320508075688772}},"m":{"b":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}}},"8":{"0":{"df":1,"docs":{"234":{"tf":1.4142135623730951}}},"df":9,"docs":{"140":{"tf":1.0},"203":{"tf":1.0},"22":{"tf":1.0},"231":{"tf":1.0},"248":{"tf":1.0},"463":{"tf":1.4142135623730951},"500":{"tf":1.4142135623730951},"501":{"tf":1.0},"511":{"tf":1.0}}},"9":{"df":5,"docs":{"141":{"tf":1.0},"204":{"tf":1.0},"23":{"tf":1.0},"500":{"tf":1.0},"512":{"tf":1.0}}},"_":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}},"a":{"b":{"c":{"1":{"2":{"3":{"df":1,"docs":{"493":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"90":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"255":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.0},"75":{"tf":1.0},"81":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"351":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"t":{"df":15,"docs":{"208":{"tf":1.0},"231":{"tf":1.4142135623730951},"247":{"tf":1.0},"250":{"tf":1.7320508075688772},"287":{"tf":1.0},"331":{"tf":1.0},"349":{"tf":1.0},"361":{"tf":1.0},"364":{"tf":1.0},"372":{"tf":1.0},"461":{"tf":1.0},"463":{"tf":1.7320508075688772},"465":{"tf":1.0},"494":{"tf":1.7320508075688772},"73":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":25,"docs":{"100":{"tf":1.0},"104":{"tf":1.0},"111":{"tf":1.0},"121":{"tf":1.0},"238":{"tf":1.0},"247":{"tf":1.4142135623730951},"322":{"tf":1.0},"365":{"tf":1.0},"369":{"tf":1.4142135623730951},"371":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.0},"410":{"tf":1.0},"487":{"tf":1.0},"503":{"tf":1.0},"504":{"tf":1.0},"505":{"tf":1.0},"506":{"tf":1.0},"507":{"tf":1.0},"508":{"tf":1.0},"509":{"tf":1.0},"55":{"tf":1.0},"65":{"tf":1.0},"68":{"tf":1.0},"75":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"361":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"234":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"123":{"tf":1.0},"139":{"tf":1.0},"158":{"tf":1.0},"96":{"tf":1.0}}}},"v":{"df":7,"docs":{"125":{"tf":1.0},"202":{"tf":1.0},"338":{"tf":1.0},"406":{"tf":1.0},"463":{"tf":1.0},"480":{"tf":1.0},"511":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"157":{"tf":1.0},"449":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"109":{"tf":1.0},"133":{"tf":1.0}}}}},"d":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}},"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":51,"docs":{"138":{"tf":1.0},"143":{"tf":1.7320508075688772},"185":{"tf":1.0},"188":{"tf":1.0},"197":{"tf":1.7320508075688772},"198":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"209":{"tf":1.4142135623730951},"210":{"tf":1.7320508075688772},"213":{"tf":1.4142135623730951},"215":{"tf":2.0},"226":{"tf":1.0},"231":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":2.0},"237":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":2.23606797749979},"244":{"tf":1.7320508075688772},"257":{"tf":1.0},"278":{"tf":1.0},"301":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"328":{"tf":1.7320508075688772},"330":{"tf":1.4142135623730951},"339":{"tf":1.0},"345":{"tf":1.0},"356":{"tf":1.0},"358":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"371":{"tf":1.7320508075688772},"388":{"tf":1.0},"398":{"tf":1.0},"407":{"tf":3.1622776601683795},"449":{"tf":1.0},"455":{"tf":1.4142135623730951},"456":{"tf":1.0},"462":{"tf":1.0},"465":{"tf":1.0},"478":{"tf":1.4142135623730951},"480":{"tf":1.7320508075688772},"490":{"tf":1.0},"493":{"tf":1.0},"496":{"tf":1.0},"88":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":9,"docs":{"198":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"327":{"tf":1.0},"353":{"tf":1.0},"456":{"tf":1.0},"494":{"tf":1.0},"511":{"tf":1.0},"73":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"244":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"501":{"tf":1.0}}}}}}},"df":13,"docs":{"144":{"tf":1.0},"234":{"tf":1.0},"241":{"tf":1.0},"301":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"330":{"tf":1.0},"405":{"tf":1.0},"467":{"tf":1.0},"470":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"93":{"tf":1.0}},"j":{"a":{"c":{"df":1,"docs":{"365":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"250":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":11,"docs":{"198":{"tf":1.0},"208":{"tf":1.0},"231":{"tf":1.0},"333":{"tf":1.0},"371":{"tf":1.0},"406":{"tf":1.0},"456":{"tf":1.0},"463":{"tf":1.0},"494":{"tf":1.0},"73":{"tf":1.0},"84":{"tf":1.0}}}}},"r":{"df":31,"docs":{"100":{"tf":1.0},"114":{"tf":1.0},"116":{"tf":1.0},"141":{"tf":1.0},"151":{"tf":1.0},"17":{"tf":1.0},"208":{"tf":1.0},"232":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"258":{"tf":1.0},"270":{"tf":1.0},"282":{"tf":1.0},"311":{"tf":1.0},"331":{"tf":1.0},"348":{"tf":1.4142135623730951},"349":{"tf":1.0},"363":{"tf":2.0},"364":{"tf":1.0},"393":{"tf":2.0},"394":{"tf":1.0},"414":{"tf":1.0},"494":{"tf":1.0},"502":{"tf":1.0},"505":{"tf":1.0},"520":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"73":{"tf":1.0},"98":{"tf":1.0}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":8,"docs":{"170":{"tf":1.0},"212":{"tf":1.0},"23":{"tf":1.0},"241":{"tf":1.0},"252":{"tf":1.0},"464":{"tf":1.0},"479":{"tf":1.0},"80":{"tf":1.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"65":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"138":{"tf":1.0},"44":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}}}}}}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"478":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":9,"docs":{"123":{"tf":2.23606797749979},"125":{"tf":1.0},"36":{"tf":1.0},"48":{"tf":1.0},"53":{"tf":1.4142135623730951},"55":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"77":{"tf":2.0}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.0}}}}}},"o":{"df":5,"docs":{"118":{"tf":1.0},"231":{"tf":1.4142135623730951},"247":{"tf":1.0},"463":{"tf":1.7320508075688772},"465":{"tf":1.4142135623730951}}}},"i":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":40,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.4142135623730951},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"130":{"tf":1.0},"137":{"tf":2.6457513110645907},"142":{"tf":1.0},"143":{"tf":2.6457513110645907},"151":{"tf":1.0},"157":{"tf":1.4142135623730951},"205":{"tf":1.0},"21":{"tf":1.4142135623730951},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"350":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"36":{"tf":1.0},"393":{"tf":1.0},"414":{"tf":1.0},"446":{"tf":1.0},"463":{"tf":1.0},"48":{"tf":1.0},"480":{"tf":1.0},"49":{"tf":1.0},"53":{"tf":1.0},"61":{"tf":1.0},"63":{"tf":1.4142135623730951},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"77":{"tf":1.0},"89":{"tf":1.0}}},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":1,"docs":{"502":{"tf":1.0}},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"i":{"c":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"466":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"339":{"tf":1.0},"446":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":5,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0},"365":{"tf":1.0},"407":{"tf":1.0}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"104":{"tf":1.0},"323":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":8,"docs":{"140":{"tf":1.0},"340":{"tf":1.0},"382":{"tf":1.0},"408":{"tf":1.0},"409":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"73":{"tf":1.4142135623730951}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":7,"docs":{"153":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"46":{"tf":1.0},"496":{"tf":1.0},"74":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"342":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"73":{"tf":1.0}}}}}}},"d":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"492":{"tf":1.0}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"|":{"df":2,"docs":{"139":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"174":{"tf":1.0},"495":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"316":{"tf":1.0},"401":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"182":{"tf":1.0}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"182":{"tf":1.0}},"i":{"c":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"=":{"\\"":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"182":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"df":1,"docs":{"145":{"tf":1.0}}}},"y":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"108":{"tf":1.0},"244":{"tf":1.0},"461":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"108":{"tf":1.0},"129":{"tf":1.0},"142":{"tf":1.0},"473":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{"df":4,"docs":{"182":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"354":{"tf":1.0}}}}}},"df":1,"docs":{"354":{"tf":1.4142135623730951}}}}}},"df":30,"docs":{"135":{"tf":1.0},"182":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":2.0},"248":{"tf":1.0},"249":{"tf":1.0},"25":{"tf":1.7320508075688772},"250":{"tf":2.8284271247461903},"257":{"tf":1.0},"289":{"tf":1.0},"306":{"tf":1.0},"325":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.4142135623730951},"362":{"tf":1.0},"407":{"tf":1.0},"460":{"tf":1.7320508075688772},"465":{"tf":1.0},"479":{"tf":1.0},"486":{"tf":1.0},"523":{"tf":1.0},"65":{"tf":1.0},"76":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}},"p":{"df":2,"docs":{"107":{"tf":1.0},"24":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"i":{"c":{"df":3,"docs":{"108":{"tf":1.0},"244":{"tf":1.0},"461":{"tf":1.0}}},"df":6,"docs":{"110":{"tf":1.7320508075688772},"118":{"tf":1.0},"247":{"tf":1.0},"295":{"tf":1.0},"324":{"tf":1.4142135623730951},"88":{"tf":1.0}}},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"a":{"c":{"df":0,"docs":{},"h":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":11,"docs":{"241":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":1.0},"285":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"330":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"31":{"tf":1.0}}}}},"v":{"df":2,"docs":{"330":{"tf":1.0},"413":{"tf":1.0}}}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":48,"docs":{"100":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":1.0},"114":{"tf":1.0},"122":{"tf":1.0},"124":{"tf":1.0},"158":{"tf":1.0},"17":{"tf":2.0},"196":{"tf":1.0},"198":{"tf":1.0},"20":{"tf":1.0},"200":{"tf":1.0},"208":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.0},"254":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"284":{"tf":1.4142135623730951},"297":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"331":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"354":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"369":{"tf":1.0},"393":{"tf":1.0},"463":{"tf":1.0},"467":{"tf":1.0},"494":{"tf":1.4142135623730951},"55":{"tf":1.0},"57":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.4142135623730951}},"e":{",":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"208":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"df":1,"docs":{"259":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"g":{"(":{"\\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"335":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":4,"docs":{"185":{"tf":1.0},"335":{"tf":1.0},"449":{"tf":1.0},"490":{"tf":1.0}},"s":{"(":{"[":{"\\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"303":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"511":{"tf":1.0},"512":{"tf":1.0},"99":{"tf":2.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":5,"docs":{"291":{"tf":1.0},"327":{"tf":1.0},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"498":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"352":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"241":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"k":{"df":8,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"471":{"tf":1.0},"472":{"tf":1.0},"480":{"tf":1.0}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"<":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{">":{">":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.7320508075688772}}}}}},"[":{"0":{"]":{".":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}}}},"[":{"1":{"]":{".":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"329":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"329":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"329":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"98":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":9,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"124":{"tf":1.0},"137":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"205":{"tf":1.0},"446":{"tf":1.0},"67":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"5":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"n":{"c":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"262":{"tf":1.0},"263":{"tf":1.0},"354":{"tf":1.7320508075688772},"373":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":16,"docs":{"208":{"tf":1.0},"262":{"tf":2.0},"263":{"tf":1.0},"264":{"tf":1.4142135623730951},"270":{"tf":1.0},"279":{"tf":1.0},"354":{"tf":1.7320508075688772},"373":{"tf":1.7320508075688772},"455":{"tf":2.0},"458":{"tf":1.4142135623730951},"493":{"tf":2.23606797749979},"495":{"tf":1.4142135623730951},"72":{"tf":2.23606797749979},"75":{"tf":1.0},"79":{"tf":1.0},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"151":{"tf":1.0},"247":{"tf":1.0},"280":{"tf":1.0}}}},"t":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"287":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"64":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":3,"docs":{"390":{"tf":1.0},"61":{"tf":1.0},"77":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"137":{"tf":1.4142135623730951},"462":{"tf":1.4142135623730951},"55":{"tf":1.0},"81":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"137":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"249":{"tf":1.0},"462":{"tf":1.4142135623730951},"500":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"96":{"tf":1.0}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"348":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"289":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"df":10,"docs":{"2":{"tf":1.0},"238":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"321":{"tf":1.0},"372":{"tf":1.0},"389":{"tf":1.0},"451":{"tf":1.0},"53":{"tf":1.0},"76":{"tf":1.4142135623730951},"97":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":9,"docs":{"123":{"tf":1.0},"2":{"tf":1.0},"303":{"tf":1.0},"327":{"tf":1.0},"371":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"38":{"tf":1.0},"389":{"tf":1.0}}}},"df":5,"docs":{"156":{"tf":1.0},"214":{"tf":1.0},"255":{"tf":1.0},"259":{"tf":1.0},"66":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":15,"docs":{"114":{"tf":1.0},"199":{"tf":1.0},"225":{"tf":1.0},"234":{"tf":1.0},"241":{"tf":1.0},"251":{"tf":1.0},"258":{"tf":1.0},"338":{"tf":1.4142135623730951},"352":{"tf":1.0},"356":{"tf":1.0},"372":{"tf":1.0},"381":{"tf":1.0},"479":{"tf":1.0},"497":{"tf":1.4142135623730951},"502":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"234":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"145":{"tf":1.0},"219":{"tf":1.0},"247":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"354":{"tf":1.0}}}},"r":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{".":{"1":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"(":{"&":{"a":{".":{"1":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"273":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"\\"":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"a":{"a":{"df":0,"docs":{},"i":{"/":{"b":{"df":0,"docs":{},"g":{"df":5,"docs":{"146":{"tf":1.0},"288":{"tf":1.0},"351":{"tf":1.0},"354":{"tf":1.7320508075688772},"362":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"303":{"tf":1.0},"322":{"tf":1.0},"324":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":19,"docs":{"140":{"tf":1.0},"162":{"tf":1.0},"167":{"tf":1.7320508075688772},"176":{"tf":1.0},"177":{"tf":1.0},"20":{"tf":1.7320508075688772},"255":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.0},"300":{"tf":1.0},"330":{"tf":1.0},"364":{"tf":1.0},"373":{"tf":1.0},"407":{"tf":1.0},"425":{"tf":1.0},"456":{"tf":1.0},"494":{"tf":1.0},"63":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"389":{"tf":1.0},"494":{"tf":1.0},"520":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"111":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":2,"docs":{"214":{"tf":1.0},"259":{"tf":1.0}}}}},"df":2,"docs":{"214":{"tf":1.0},"66":{"tf":1.0}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":9,"docs":{"156":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.4142135623730951},"404":{"tf":1.0},"413":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":5,"docs":{"133":{"tf":1.0},"139":{"tf":1.0},"298":{"tf":1.0},"307":{"tf":1.0},"470":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"133":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"334":{"tf":1.0},"337":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"k":{"b":{"df":2,"docs":{"185":{"tf":1.0},"449":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":51,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"110":{"tf":1.0},"120":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"164":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"171":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"200":{"tf":1.0},"202":{"tf":1.0},"204":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.0},"244":{"tf":1.0},"251":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"285":{"tf":1.0},"288":{"tf":1.4142135623730951},"291":{"tf":2.23606797749979},"325":{"tf":1.0},"331":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"345":{"tf":1.0},"350":{"tf":1.0},"364":{"tf":1.0},"369":{"tf":1.0},"377":{"tf":1.0},"380":{"tf":1.0},"446":{"tf":1.0},"449":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.0},"487":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"53":{"tf":1.0},"63":{"tf":1.0},"99":{"tf":1.0}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"56":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"238":{"tf":1.0}}},"i":{"c":{"df":2,"docs":{"217":{"tf":1.0},"80":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}}},"df":1,"docs":{"4":{"tf":1.0}}}},"df":6,"docs":{"110":{"tf":1.0},"273":{"tf":1.0},"322":{"tf":1.0},"324":{"tf":1.4142135623730951},"381":{"tf":1.4142135623730951},"480":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"125":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":27,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":1.0},"123":{"tf":1.0},"134":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"241":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"257":{"tf":1.0},"285":{"tf":1.0},"301":{"tf":1.0},"309":{"tf":1.0},"328":{"tf":1.0},"332":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"346":{"tf":1.0},"36":{"tf":1.0},"466":{"tf":1.0},"519":{"tf":1.0},"53":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":21,"docs":{"109":{"tf":1.4142135623730951},"133":{"tf":1.0},"146":{"tf":1.0},"157":{"tf":1.0},"192":{"tf":1.0},"267":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.4142135623730951},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"328":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"407":{"tf":1.0},"479":{"tf":1.0},"51":{"tf":1.4142135623730951},"89":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"103":{"tf":1.0},"69":{"tf":1.0}}},"df":0,"docs":{}}}},"n":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"247":{"tf":1.0},"501":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":15,"docs":{"107":{"tf":1.0},"119":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"267":{"tf":1.0},"287":{"tf":1.0},"297":{"tf":1.0},"330":{"tf":1.0},"334":{"tf":1.0},"367":{"tf":1.0},"93":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":21,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"122":{"tf":1.0},"130":{"tf":1.4142135623730951},"137":{"tf":1.0},"142":{"tf":1.0},"2":{"tf":1.0},"244":{"tf":1.0},"253":{"tf":1.0},"305":{"tf":1.0},"323":{"tf":1.0},"353":{"tf":1.0},"359":{"tf":1.0},"368":{"tf":1.0},"461":{"tf":1.4142135623730951},"492":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"516":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"90":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":9,"docs":{"125":{"tf":1.0},"198":{"tf":1.0},"219":{"tf":1.0},"231":{"tf":1.0},"356":{"tf":1.0},"456":{"tf":1.0},"460":{"tf":1.4142135623730951},"494":{"tf":1.0},"73":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":7,"docs":{"105":{"tf":1.0},"199":{"tf":1.0},"257":{"tf":1.0},"353":{"tf":1.0},"495":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"122":{"tf":1.0},"366":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"100":{"tf":1.0},"144":{"tf":1.0},"214":{"tf":1.0},"269":{"tf":1.0},"330":{"tf":1.0},"400":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"150":{"tf":1.0},"193":{"tf":1.0},"358":{"tf":1.0},"448":{"tf":1.0},"477":{"tf":1.0}}}}},"d":{"df":1,"docs":{"190":{"tf":1.0}}},"df":1,"docs":{"188":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"93":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"150":{"tf":1.0}}},"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"323":{"tf":1.0},"401":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"324":{"tf":1.7320508075688772},"398":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"323":{"tf":1.0},"401":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"327":{"tf":1.4142135623730951}}}}}}}},"df":47,"docs":{"100":{"tf":3.1622776601683795},"238":{"tf":1.0},"279":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":3.1622776601683795},"316":{"tf":1.4142135623730951},"317":{"tf":1.7320508075688772},"318":{"tf":2.0},"319":{"tf":1.7320508075688772},"321":{"tf":3.1622776601683795},"322":{"tf":2.6457513110645907},"323":{"tf":4.123105625617661},"324":{"tf":7.416198487095663},"325":{"tf":3.1622776601683795},"326":{"tf":1.0},"327":{"tf":2.23606797749979},"328":{"tf":2.23606797749979},"329":{"tf":3.3166247903554},"330":{"tf":2.8284271247461903},"394":{"tf":1.0},"396":{"tf":2.8284271247461903},"397":{"tf":1.0},"398":{"tf":2.0},"399":{"tf":1.0},"401":{"tf":2.6457513110645907},"402":{"tf":1.0},"404":{"tf":2.23606797749979},"405":{"tf":1.4142135623730951},"406":{"tf":1.0},"407":{"tf":2.8284271247461903},"409":{"tf":1.4142135623730951},"410":{"tf":1.4142135623730951},"411":{"tf":1.0},"412":{"tf":1.0},"413":{"tf":2.0},"487":{"tf":1.0},"499":{"tf":1.4142135623730951},"500":{"tf":2.449489742783178},"501":{"tf":1.0},"502":{"tf":2.23606797749979},"63":{"tf":1.0},"94":{"tf":1.4142135623730951},"95":{"tf":2.8284271247461903},"96":{"tf":2.449489742783178},"97":{"tf":2.0},"98":{"tf":1.0},"99":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"238":{"tf":1.4142135623730951},"76":{"tf":1.4142135623730951}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":5,"docs":{"100":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"407":{"tf":1.0}},"e":{"(":{"&":{"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"d":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"329":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"&":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"323":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"407":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"321":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"499":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"328":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"b":{"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"140":{"tf":1.0},"264":{"tf":1.0},"28":{"tf":1.0},"324":{"tf":2.23606797749979}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"df":0,"docs":{}},"l":{"df":3,"docs":{"327":{"tf":1.7320508075688772},"334":{"tf":1.4142135623730951},"337":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"342":{"tf":1.0},"492":{"tf":1.0},"496":{"tf":1.0},"498":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"202":{"tf":1.0},"316":{"tf":1.4142135623730951},"96":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"137":{"tf":1.0},"274":{"tf":1.0},"323":{"tf":1.7320508075688772},"353":{"tf":1.0},"361":{"tf":1.0},"368":{"tf":1.0},"405":{"tf":1.0},"500":{"tf":1.0},"88":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"493":{"tf":1.0}}},"df":0,"docs":{}}},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"a":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"d":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":2,"docs":{"138":{"tf":1.0},"293":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":1,"docs":{"493":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"107":{"tf":2.0},"136":{"tf":1.0},"141":{"tf":1.0},"151":{"tf":1.0},"371":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"93":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"317":{"tf":1.0}}}}}},"df":4,"docs":{"138":{"tf":1.0},"156":{"tf":1.0},"301":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{},"w":{"df":1,"docs":{"162":{"tf":1.0}}}},"i":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"a":{"d":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"295":{"tf":1.0},"44":{"tf":1.0},"7":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}},"df":4,"docs":{"108":{"tf":1.0},"114":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"2":{"tf":1.0},"27":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":9,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"251":{"tf":1.0},"501":{"tf":1.0},"96":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"d":{"df":22,"docs":{"10":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.0},"164":{"tf":1.4142135623730951},"165":{"tf":2.6457513110645907},"166":{"tf":2.23606797749979},"167":{"tf":1.4142135623730951},"181":{"tf":1.4142135623730951},"184":{"tf":1.4142135623730951},"189":{"tf":1.0},"2":{"tf":1.0},"209":{"tf":1.0},"226":{"tf":1.0},"3":{"tf":1.4142135623730951},"309":{"tf":1.0},"31":{"tf":1.0},"448":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"67":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"463":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"28":{"tf":1.0},"475":{"tf":1.0},"53":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"356":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"95":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"104":{"tf":1.0},"48":{"tf":1.0}}}}}},"c":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"e":{"(":{")":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":20,"docs":{"100":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":2.23606797749979},"238":{"tf":2.23606797749979},"241":{"tf":4.0},"247":{"tf":2.449489742783178},"279":{"tf":1.0},"281":{"tf":1.0},"323":{"tf":1.4142135623730951},"357":{"tf":1.0},"371":{"tf":1.0},"376":{"tf":1.0},"380":{"tf":1.4142135623730951},"381":{"tf":1.4142135623730951},"391":{"tf":1.0},"399":{"tf":1.0},"465":{"tf":1.0},"76":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"357":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"328":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"356":{"tf":1.0}}}},"n":{"\'":{"df":0,"docs":{},"t":{"df":5,"docs":{"133":{"tf":1.0},"142":{"tf":1.0},"322":{"tf":1.0},"367":{"tf":1.0},"410":{"tf":1.4142135623730951}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"321":{"tf":1.0},"324":{"tf":1.0},"327":{"tf":1.0},"500":{"tf":1.0},"96":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"1":{"df":1,"docs":{"324":{"tf":2.0}}},"2":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"198":{"tf":1.0},"350":{"tf":1.0},"365":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"324":{"tf":2.0},"502":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":1.0},"207":{"tf":1.0},"226":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.4142135623730951},"350":{"tf":1.0},"460":{"tf":1.0},"47":{"tf":1.0},"480":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"72":{"tf":1.7320508075688772},"98":{"tf":1.0}}}}}},"r":{"d":{"df":20,"docs":{"314":{"tf":1.0},"316":{"tf":2.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"326":{"tf":1.0},"329":{"tf":1.4142135623730951},"330":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"401":{"tf":1.0},"404":{"tf":1.0},"407":{"tf":1.0},"480":{"tf":1.0},"500":{"tf":1.0},"502":{"tf":2.0},"96":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"333":{"tf":1.0}}}}}}},"df":17,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.0},"164":{"tf":1.4142135623730951},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"175":{"tf":1.7320508075688772},"181":{"tf":1.0},"184":{"tf":1.0},"188":{"tf":1.4142135623730951},"189":{"tf":1.4142135623730951},"193":{"tf":1.0},"195":{"tf":1.0},"42":{"tf":1.0},"448":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":24,"docs":{"130":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"235":{"tf":1.0},"238":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"315":{"tf":1.0},"343":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"374":{"tf":1.0},"384":{"tf":1.0},"479":{"tf":1.0},"502":{"tf":1.4142135623730951},"58":{"tf":1.0},"64":{"tf":1.0},"68":{"tf":1.0},"98":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":4,"docs":{"134":{"tf":1.0},"332":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0}}}},"df":2,"docs":{"237":{"tf":1.0},"244":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"493":{"tf":1.0}},"i":{"df":8,"docs":{"142":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.4142135623730951},"457":{"tf":1.0},"496":{"tf":1.7320508075688772},"519":{"tf":1.0},"74":{"tf":1.0},"98":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":6,"docs":{"134":{"tf":1.0},"267":{"tf":1.0},"301":{"tf":1.0},"334":{"tf":1.4142135623730951},"337":{"tf":1.0},"346":{"tf":1.4142135623730951}}}}}}},"d":{"df":9,"docs":{"164":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"196":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.0},"43":{"tf":1.0},"450":{"tf":1.0},"476":{"tf":1.0}}},"df":2,"docs":{"323":{"tf":1.0},"330":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":5,"docs":{"269":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"57":{"tf":1.0},"87":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"215":{"tf":1.0},"240":{"tf":1.0}}}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"228":{"tf":1.0},"234":{"tf":1.0},"75":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"g":{"df":31,"docs":{"107":{"tf":1.0},"109":{"tf":1.0},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0},"2":{"tf":1.0},"285":{"tf":1.0},"298":{"tf":1.4142135623730951},"301":{"tf":1.0},"302":{"tf":1.0},"322":{"tf":1.0},"328":{"tf":1.0},"348":{"tf":1.0},"357":{"tf":1.0},"361":{"tf":1.0},"363":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":1.0},"372":{"tf":1.7320508075688772},"379":{"tf":1.4142135623730951},"38":{"tf":1.0},"389":{"tf":1.0},"391":{"tf":1.0},"393":{"tf":1.0},"407":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"6":{"tf":1.0},"70":{"tf":1.0},"89":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"t":{"df":1,"docs":{"48":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"460":{"tf":1.4142135623730951},"465":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":22,"docs":{"123":{"tf":1.0},"173":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"207":{"tf":1.0},"224":{"tf":1.0},"226":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"267":{"tf":1.0},"280":{"tf":1.0},"303":{"tf":1.7320508075688772},"304":{"tf":1.0},"338":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"466":{"tf":1.7320508075688772},"475":{"tf":1.0},"477":{"tf":1.0},"61":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":5,"docs":{"314":{"tf":1.0},"324":{"tf":2.8284271247461903},"329":{"tf":1.4142135623730951},"404":{"tf":1.0},"96":{"tf":1.7320508075688772}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"321":{"tf":1.0},"324":{"tf":1.7320508075688772},"398":{"tf":1.0},"95":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"477":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"c":{"df":3,"docs":{"133":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":3,"docs":{"115":{"tf":1.0},"350":{"tf":1.0},"73":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"104":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"247":{"tf":1.0},"84":{"tf":1.0}},"n":{"df":2,"docs":{"241":{"tf":1.0},"73":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"{":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"/":{"c":{"d":{"df":2,"docs":{"18":{"tf":1.0},"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"337":{"tf":1.4142135623730951}}},"l":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"257":{"tf":1.0}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"321":{"tf":1.0},"409":{"tf":1.0}}}},"u":{"d":{"df":66,"docs":{"105":{"tf":1.0},"108":{"tf":1.4142135623730951},"114":{"tf":1.0},"118":{"tf":1.4142135623730951},"127":{"tf":1.0},"134":{"tf":1.0},"143":{"tf":1.0},"147":{"tf":1.0},"182":{"tf":1.7320508075688772},"183":{"tf":1.4142135623730951},"185":{"tf":1.0},"186":{"tf":1.0},"192":{"tf":1.0},"205":{"tf":1.7320508075688772},"225":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.7320508075688772},"24":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"263":{"tf":1.0},"275":{"tf":1.0},"290":{"tf":1.7320508075688772},"292":{"tf":1.4142135623730951},"334":{"tf":1.0},"337":{"tf":1.0},"352":{"tf":1.0},"354":{"tf":1.0},"359":{"tf":1.4142135623730951},"360":{"tf":1.0},"434":{"tf":1.0},"445":{"tf":1.0},"446":{"tf":1.4142135623730951},"449":{"tf":1.0},"451":{"tf":1.7320508075688772},"452":{"tf":1.4142135623730951},"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0},"460":{"tf":1.0},"461":{"tf":1.0},"462":{"tf":1.0},"463":{"tf":1.0},"465":{"tf":1.0},"466":{"tf":1.0},"467":{"tf":1.0},"469":{"tf":1.0},"471":{"tf":1.0},"472":{"tf":1.0},"478":{"tf":1.0},"479":{"tf":1.0},"480":{"tf":1.4142135623730951},"481":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.0},"490":{"tf":1.0},"53":{"tf":1.0},"90":{"tf":1.0},"92":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"189":{"tf":1.4142135623730951},"473":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"8":{"tf":1.0}}}}},"r":{"df":4,"docs":{"139":{"tf":1.0},"157":{"tf":1.0},"357":{"tf":1.0},"36":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"/":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"p":{"df":3,"docs":{"328":{"tf":1.0},"330":{"tf":1.0},"358":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":19,"docs":{"161":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"170":{"tf":1.0},"173":{"tf":1.0},"188":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.7320508075688772},"225":{"tf":1.0},"23":{"tf":1.7320508075688772},"255":{"tf":1.0},"257":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0},"338":{"tf":1.0},"407":{"tf":1.4142135623730951},"441":{"tf":1.0},"64":{"tf":1.7320508075688772},"66":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"(":{"\\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"352":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":3,"docs":{"352":{"tf":1.0},"354":{"tf":1.0},"460":{"tf":1.4142135623730951}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"164":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"104":{"tf":1.0}}}},"u":{"d":{"df":16,"docs":{"109":{"tf":1.0},"135":{"tf":2.0},"157":{"tf":1.0},"281":{"tf":1.0},"289":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":1.7320508075688772},"359":{"tf":1.4142135623730951},"361":{"tf":2.0},"372":{"tf":1.0},"65":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"m":{"d":{"+":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"+":{"df":0,"docs":{},"v":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":1,"docs":{"66":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"77":{"tf":1.0}}}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"238":{"tf":1.0},"299":{"tf":1.0}}}},"df":0,"docs":{}},"df":83,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"107":{"tf":1.7320508075688772},"108":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"125":{"tf":2.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"143":{"tf":1.0},"153":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"183":{"tf":1.4142135623730951},"185":{"tf":1.0},"186":{"tf":1.0},"192":{"tf":1.0},"202":{"tf":1.0},"205":{"tf":1.7320508075688772},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":1.0},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"258":{"tf":1.0},"26":{"tf":1.0},"264":{"tf":1.4142135623730951},"275":{"tf":1.0},"28":{"tf":1.0},"280":{"tf":1.0},"285":{"tf":1.4142135623730951},"293":{"tf":1.0},"302":{"tf":1.0},"309":{"tf":1.0},"335":{"tf":1.0},"34":{"tf":1.4142135623730951},"356":{"tf":1.0},"36":{"tf":1.7320508075688772},"365":{"tf":1.4142135623730951},"371":{"tf":1.0},"375":{"tf":1.0},"39":{"tf":1.0},"413":{"tf":1.0},"445":{"tf":1.0},"446":{"tf":1.4142135623730951},"449":{"tf":1.0},"451":{"tf":1.7320508075688772},"452":{"tf":1.0},"473":{"tf":1.4142135623730951},"478":{"tf":1.0},"479":{"tf":1.0},"480":{"tf":1.0},"481":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.0},"490":{"tf":1.0},"514":{"tf":1.7320508075688772},"515":{"tf":1.0},"521":{"tf":1.0},"525":{"tf":1.0},"53":{"tf":1.4142135623730951},"55":{"tf":1.0},"56":{"tf":1.0},"61":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"81":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0},"92":{"tf":1.4142135623730951},"96":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"121":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"371":{"tf":1.0},"53":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"272":{"tf":1.0},"273":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"155":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":3,"docs":{"296":{"tf":1.0},"323":{"tf":1.4142135623730951},"401":{"tf":1.0}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":7,"docs":{"244":{"tf":1.0},"274":{"tf":1.0},"323":{"tf":1.0},"380":{"tf":1.0},"465":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"144":{"tf":1.0}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"346":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"303":{"tf":1.0},"335":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":17,"docs":{"185":{"tf":1.0},"225":{"tf":1.4142135623730951},"226":{"tf":1.0},"23":{"tf":1.0},"257":{"tf":1.4142135623730951},"338":{"tf":1.0},"372":{"tf":1.0},"388":{"tf":1.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"442":{"tf":1.0},"449":{"tf":1.0},"453":{"tf":1.0},"490":{"tf":1.0},"5":{"tf":1.4142135623730951},"66":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"104":{"tf":1.0},"117":{"tf":1.0},"124":{"tf":1.0},"341":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":6,"docs":{"125":{"tf":1.4142135623730951},"136":{"tf":1.0},"143":{"tf":1.0},"215":{"tf":1.0},"36":{"tf":1.0},"371":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"206":{"tf":1.0},"228":{"tf":1.0},"23":{"tf":1.0},"251":{"tf":1.0},"338":{"tf":1.0},"459":{"tf":1.0},"487":{"tf":1.0},"493":{"tf":1.0},"510":{"tf":1.0},"512":{"tf":1.0},"75":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"191":{"tf":1.0},"226":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"338":{"tf":1.0},"351":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"21":{"tf":1.0},"359":{"tf":1.0},"62":{"tf":1.0}}}}}}},"t":{"df":18,"docs":{"100":{"tf":1.0},"156":{"tf":1.0},"170":{"tf":1.0},"204":{"tf":1.0},"250":{"tf":1.0},"269":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.7320508075688772},"324":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.7320508075688772},"393":{"tf":1.0},"401":{"tf":1.0},"404":{"tf":1.4142135623730951},"413":{"tf":1.0},"483":{"tf":1.0},"63":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":7,"docs":{"189":{"tf":1.0},"301":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"502":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":7,"docs":{"27":{"tf":1.0},"333":{"tf":1.0},"360":{"tf":1.4142135623730951},"391":{"tf":1.0},"4":{"tf":1.0},"486":{"tf":1.0},"77":{"tf":1.0}},"e":{"d":{":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"498":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":18,"docs":{"234":{"tf":1.0},"308":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"330":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"343":{"tf":1.0},"346":{"tf":1.0},"353":{"tf":1.0},"357":{"tf":1.0},"368":{"tf":1.0},"372":{"tf":1.0},"385":{"tf":1.0},"391":{"tf":1.0},"405":{"tf":1.0},"463":{"tf":1.0},"502":{"tf":1.0}}}},"i":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"138":{"tf":1.4142135623730951},"149":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":1.0}}},"s":{"df":10,"docs":{"138":{"tf":1.4142135623730951},"157":{"tf":1.0},"234":{"tf":1.0},"285":{"tf":1.4142135623730951},"291":{"tf":1.0},"292":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"346":{"tf":1.0},"372":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"291":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":8,"docs":{"138":{"tf":1.0},"154":{"tf":1.0},"286":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":5,"docs":{"0":{"tf":1.0},"153":{"tf":1.0},"254":{"tf":1.0},"338":{"tf":1.0},"511":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"214":{"tf":1.0}}}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"495":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":26,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.4142135623730951},"128":{"tf":1.0},"130":{"tf":1.4142135623730951},"142":{"tf":1.7320508075688772},"15":{"tf":1.0},"197":{"tf":1.0},"199":{"tf":1.0},"202":{"tf":1.0},"251":{"tf":1.0},"318":{"tf":1.0},"350":{"tf":1.4142135623730951},"36":{"tf":1.0},"458":{"tf":1.0},"473":{"tf":1.0},"49":{"tf":1.0},"518":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"72":{"tf":1.0},"76":{"tf":1.0},"81":{"tf":1.0},"90":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"u":{"df":6,"docs":{"199":{"tf":1.0},"200":{"tf":1.0},"473":{"tf":1.0},"495":{"tf":1.0},"56":{"tf":1.0},"79":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"339":{"tf":1.0},"352":{"tf":1.0},"358":{"tf":1.0},"466":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.0}}}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"157":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"56":{"tf":1.0},"81":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":3,"docs":{"238":{"tf":1.0},"247":{"tf":1.7320508075688772},"98":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":9,"docs":{"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"238":{"tf":2.23606797749979},"247":{"tf":1.7320508075688772},"334":{"tf":1.0},"337":{"tf":1.0},"465":{"tf":1.0},"501":{"tf":1.0},"76":{"tf":1.0}}}}},"df":12,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"520":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"354":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"n":{"c":{"df":0,"docs":{},"l":{"df":5,"docs":{"266":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0},"337":{"tf":1.4142135623730951},"345":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"133":{"tf":1.0},"147":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"298":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"293":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":3,"docs":{"169":{"tf":1.0},"196":{"tf":1.0},"270":{"tf":1.0}}}}}}},"/":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"185":{"tf":1.0},"205":{"tf":1.0},"258":{"tf":1.0},"449":{"tf":1.0},"490":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"k":{"b":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"\\"":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"303":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"5":{":":{"5":{"df":1,"docs":{"295":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"290":{"tf":1.0},"292":{"tf":1.0},"303":{"tf":1.4142135623730951},"304":{"tf":1.0},"311":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"345":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"/":{"*":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"311":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"299":{"tf":1.0},"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"299":{"tf":1.0},"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"299":{"tf":1.0},"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"{":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{",":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{",":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"}":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"345":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"304":{"tf":1.4142135623730951}},"s":{"/":{"*":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"310":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"b":{"df":4,"docs":{"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"303":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":54,"docs":{"109":{"tf":1.0},"133":{"tf":1.7320508075688772},"139":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"156":{"tf":1.0},"157":{"tf":1.0},"17":{"tf":1.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.0},"19":{"tf":1.0},"213":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.0},"27":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":1.4142135623730951},"290":{"tf":1.0},"293":{"tf":1.7320508075688772},"297":{"tf":1.0},"298":{"tf":1.4142135623730951},"301":{"tf":1.0},"302":{"tf":1.4142135623730951},"304":{"tf":2.0},"306":{"tf":1.0},"307":{"tf":1.7320508075688772},"310":{"tf":1.0},"328":{"tf":1.4142135623730951},"332":{"tf":1.7320508075688772},"333":{"tf":2.0},"334":{"tf":1.0},"335":{"tf":2.0},"337":{"tf":1.7320508075688772},"338":{"tf":1.0},"339":{"tf":1.4142135623730951},"341":{"tf":1.0},"344":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":2.23606797749979},"347":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"361":{"tf":1.0},"369":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0},"413":{"tf":1.0},"51":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0},"89":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"139":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"139":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"139":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":59,"docs":{"133":{"tf":1.0},"134":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"149":{"tf":1.0},"151":{"tf":1.0},"161":{"tf":1.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.0},"178":{"tf":1.0},"182":{"tf":1.0},"185":{"tf":1.0},"19":{"tf":1.7320508075688772},"192":{"tf":1.0},"196":{"tf":1.0},"205":{"tf":1.0},"21":{"tf":1.0},"212":{"tf":1.7320508075688772},"213":{"tf":1.0},"225":{"tf":1.4142135623730951},"252":{"tf":1.0},"257":{"tf":1.0},"265":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":2.0},"286":{"tf":1.7320508075688772},"288":{"tf":1.0},"292":{"tf":1.0},"294":{"tf":1.0},"303":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"327":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"332":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0},"344":{"tf":1.0},"354":{"tf":1.7320508075688772},"356":{"tf":1.0},"357":{"tf":1.0},"379":{"tf":1.0},"40":{"tf":1.0},"418":{"tf":1.0},"420":{"tf":1.0},"431":{"tf":1.0},"449":{"tf":1.0},"463":{"tf":1.0},"479":{"tf":1.4142135623730951},"488":{"tf":1.0},"490":{"tf":1.0},"499":{"tf":1.0},"51":{"tf":1.0},"521":{"tf":1.0},"64":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0},"97":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"136":{"tf":1.4142135623730951},"371":{"tf":1.0},"372":{"tf":1.4142135623730951},"381":{"tf":1.0},"383":{"tf":1.0},"384":{"tf":1.0},"391":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"107":{"tf":1.0},"124":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"342":{"tf":1.0},"357":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"226":{"tf":1.0}}}}}},"df":0,"docs":{}}},"n":{"df":2,"docs":{"179":{"tf":1.0},"238":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"_":{"d":{"b":{"df":1,"docs":{"238":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":24,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"111":{"tf":1.4142135623730951},"128":{"tf":1.0},"144":{"tf":1.0},"186":{"tf":1.0},"190":{"tf":1.0},"226":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"251":{"tf":1.0},"451":{"tf":1.0},"452":{"tf":1.0},"462":{"tf":1.0},"47":{"tf":1.0},"49":{"tf":1.0},"517":{"tf":1.0},"56":{"tf":1.0},"68":{"tf":1.0},"70":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0},"84":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"250":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"df":13,"docs":{"116":{"tf":1.0},"198":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"336":{"tf":1.0},"355":{"tf":1.0},"370":{"tf":1.0},"403":{"tf":1.0},"456":{"tf":1.0},"460":{"tf":1.4142135623730951},"494":{"tf":1.7320508075688772},"520":{"tf":1.0},"73":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":7,"docs":{"340":{"tf":1.0},"382":{"tf":1.0},"408":{"tf":1.0},"466":{"tf":1.0},"493":{"tf":1.0},"73":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":13,"docs":{"110":{"tf":1.0},"121":{"tf":1.0},"219":{"tf":1.4142135623730951},"234":{"tf":1.0},"238":{"tf":1.0},"244":{"tf":1.0},"255":{"tf":1.0},"36":{"tf":1.0},"371":{"tf":1.0},"470":{"tf":1.0},"502":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":1.0}}}}},"t":{"df":1,"docs":{"146":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"357":{"tf":1.0},"365":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"137":{"tf":1.4142135623730951},"292":{"tf":1.0}}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"323":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"[":{"4":{".":{".":{"4":{"df":1,"docs":{"324":{"tf":1.0}}},"]":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"\\"":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"df":45,"docs":{"100":{"tf":1.0},"139":{"tf":1.0},"150":{"tf":1.0},"197":{"tf":1.4142135623730951},"200":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"209":{"tf":1.0},"210":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.4142135623730951},"247":{"tf":1.0},"261":{"tf":1.0},"264":{"tf":1.7320508075688772},"28":{"tf":1.0},"314":{"tf":1.4142135623730951},"321":{"tf":1.7320508075688772},"322":{"tf":1.4142135623730951},"323":{"tf":2.0},"324":{"tf":3.872983346207417},"328":{"tf":1.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.4142135623730951},"36":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"405":{"tf":1.0},"410":{"tf":1.0},"413":{"tf":1.0},"455":{"tf":1.0},"478":{"tf":1.7320508075688772},"487":{"tf":1.0},"493":{"tf":2.0},"499":{"tf":1.0},"503":{"tf":1.0},"53":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"(":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":43,"docs":{"104":{"tf":1.4142135623730951},"113":{"tf":1.0},"114":{"tf":1.0},"116":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"144":{"tf":1.0},"151":{"tf":1.0},"198":{"tf":1.0},"231":{"tf":2.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.0},"250":{"tf":2.0},"251":{"tf":1.0},"258":{"tf":1.0},"276":{"tf":1.0},"331":{"tf":1.0},"332":{"tf":1.0},"349":{"tf":1.0},"350":{"tf":1.0},"364":{"tf":1.0},"365":{"tf":1.0},"396":{"tf":1.0},"409":{"tf":1.0},"445":{"tf":1.0},"446":{"tf":1.0},"456":{"tf":1.0},"460":{"tf":1.4142135623730951},"465":{"tf":1.4142135623730951},"48":{"tf":1.0},"486":{"tf":1.0},"494":{"tf":2.0},"496":{"tf":1.0},"520":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.7320508075688772},"75":{"tf":1.0},"92":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"134":{"tf":1.0},"147":{"tf":1.0},"151":{"tf":1.0},"154":{"tf":1.4142135623730951},"267":{"tf":1.0},"280":{"tf":1.0},"285":{"tf":1.7320508075688772},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"295":{"tf":1.7320508075688772},"300":{"tf":1.0},"301":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"k":{"b":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"288":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"301":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"26":{"tf":1.4142135623730951},"36":{"tf":1.0},"46":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"30":{"tf":1.0},"46":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":12,"docs":{"105":{"tf":1.0},"135":{"tf":1.0},"151":{"tf":1.0},"215":{"tf":1.0},"269":{"tf":1.4142135623730951},"289":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.0},"390":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"67":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"140":{"tf":1.7320508075688772},"74":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"t":{"df":5,"docs":{"238":{"tf":1.0},"296":{"tf":1.0},"350":{"tf":1.0},"379":{"tf":1.0},"409":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"i":{"df":4,"docs":{"170":{"tf":1.0},"220":{"tf":1.0},"241":{"tf":1.0},"324":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"299":{"tf":1.7320508075688772},"303":{"tf":1.4142135623730951}}}}}}},"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"335":{"tf":1.0},"345":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"354":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":31,"docs":{"126":{"tf":1.0},"130":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0},"165":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.0},"175":{"tf":1.0},"178":{"tf":1.0},"181":{"tf":1.0},"231":{"tf":1.0},"255":{"tf":1.4142135623730951},"260":{"tf":1.4142135623730951},"263":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"278":{"tf":1.0},"293":{"tf":1.0},"318":{"tf":1.0},"353":{"tf":1.7320508075688772},"354":{"tf":1.7320508075688772},"358":{"tf":1.0},"360":{"tf":1.0},"362":{"tf":1.0},"487":{"tf":1.0},"50":{"tf":1.0},"66":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":1.0},"92":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"190":{"tf":1.0},"285":{"tf":1.0},"295":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"308":{"tf":1.0},"90":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"[":{"0":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"t":{"df":14,"docs":{"109":{"tf":1.0},"135":{"tf":1.4142135623730951},"289":{"tf":1.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.4142135623730951},"361":{"tf":1.0},"365":{"tf":1.4142135623730951},"367":{"tf":1.0},"368":{"tf":1.0},"371":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"511":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"149":{"tf":1.0},"157":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"153":{"tf":1.0},"278":{"tf":1.0},"463":{"tf":1.0}}}},"df":1,"docs":{"159":{"tf":1.0}}}}}},"p":{"df":2,"docs":{"170":{"tf":1.0},"220":{"tf":1.0}},"u":{"df":1,"docs":{"98":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"{":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"2":{"df":1,"docs":{"493":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"165":{"tf":1.0},"379":{"tf":1.0},"72":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"k":{"b":{"df":2,"docs":{"164":{"tf":1.0},"324":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":37,"docs":{"143":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"198":{"tf":1.0},"199":{"tf":1.4142135623730951},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"208":{"tf":1.0},"213":{"tf":1.4142135623730951},"226":{"tf":1.0},"234":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.0},"250":{"tf":1.7320508075688772},"257":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"261":{"tf":1.4142135623730951},"31":{"tf":1.0},"32":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":2.0},"345":{"tf":1.4142135623730951},"407":{"tf":1.0},"46":{"tf":1.0},"460":{"tf":1.4142135623730951},"461":{"tf":2.23606797749979},"462":{"tf":1.0},"465":{"tf":1.4142135623730951},"471":{"tf":1.0},"492":{"tf":1.7320508075688772},"494":{"tf":1.0},"495":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"354":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"298":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":3,"docs":{"346":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"c":{"df":2,"docs":{"231":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":5,"docs":{"171":{"tf":1.0},"242":{"tf":1.0},"251":{"tf":1.0},"274":{"tf":1.0},"466":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"j":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"+":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"+":{"df":0,"docs":{},"v":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"383":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"l":{"df":3,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"190":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":12,"docs":{"114":{"tf":1.0},"144":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":1.0},"314":{"tf":1.0},"387":{"tf":1.0},"396":{"tf":1.0},"460":{"tf":1.4142135623730951},"461":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"98":{"tf":1.0}}}}}},"v":{"df":6,"docs":{"231":{"tf":1.0},"334":{"tf":1.0},"338":{"tf":1.0},"343":{"tf":1.0},"460":{"tf":1.0},"73":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}}},"df":36,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"124":{"tf":1.0},"140":{"tf":1.4142135623730951},"169":{"tf":1.0},"192":{"tf":1.0},"212":{"tf":1.0},"22":{"tf":1.0},"220":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"280":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"314":{"tf":1.0},"319":{"tf":1.0},"321":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"326":{"tf":1.0},"330":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.4142135623730951},"40":{"tf":1.0},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"440":{"tf":1.0},"461":{"tf":1.0},"479":{"tf":1.0},"492":{"tf":1.0},"496":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"52":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"140":{"tf":1.0},"91":{"tf":1.0}}}}}}}}}},"d":{")":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"203":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":11,"docs":{"196":{"tf":1.0},"203":{"tf":1.0},"210":{"tf":1.0},"227":{"tf":1.0},"238":{"tf":1.0},"251":{"tf":1.0},"270":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"76":{"tf":1.4142135623730951},"86":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"238":{"tf":1.4142135623730951},"247":{"tf":2.0},"262":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":23,"docs":{"111":{"tf":1.0},"151":{"tf":1.0},"178":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"236":{"tf":1.0},"262":{"tf":1.0},"289":{"tf":1.0},"322":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.7320508075688772},"369":{"tf":1.0},"375":{"tf":1.0},"377":{"tf":1.0},"385":{"tf":1.0},"387":{"tf":1.0},"410":{"tf":1.0},"456":{"tf":1.0},"465":{"tf":1.0},"500":{"tf":1.0},"517":{"tf":1.0},"73":{"tf":1.4142135623730951},"75":{"tf":1.7320508075688772}},"e":{"(":{"#":{"[":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"237":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":17,"docs":{"135":{"tf":1.0},"155":{"tf":1.0},"247":{"tf":1.0},"278":{"tf":1.0},"321":{"tf":1.4142135623730951},"324":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"391":{"tf":1.0},"398":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.4142135623730951},"446":{"tf":1.0},"502":{"tf":1.0},"515":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":8,"docs":{"331":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"393":{"tf":1.0},"413":{"tf":1.4142135623730951},"76":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"<":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"c":{"df":3,"docs":{"261":{"tf":1.7320508075688772},"321":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"y":{"df":7,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":1.7320508075688772},"463":{"tf":1.4142135623730951},"465":{"tf":1.4142135623730951},"76":{"tf":1.0}}}},"b":{"df":5,"docs":{"179":{"tf":1.0},"368":{"tf":1.0},"463":{"tf":1.0},"55":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"369":{"tf":1.0},"379":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"df":1,"docs":{"289":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"g":{"df":7,"docs":{"117":{"tf":1.0},"191":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"247":{"tf":1.0},"277":{"tf":1.0},"289":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":5,"docs":{"331":{"tf":1.0},"349":{"tf":1.0},"364":{"tf":1.0},"460":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":78,"docs":{"101":{"tf":1.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.4142135623730951},"111":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.7320508075688772},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.0},"127":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.4142135623730951},"151":{"tf":1.0},"157":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.0},"196":{"tf":1.4142135623730951},"198":{"tf":2.0},"199":{"tf":1.0},"200":{"tf":1.0},"208":{"tf":1.4142135623730951},"217":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"232":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":2.6457513110645907},"238":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":2.23606797749979},"246":{"tf":1.0},"247":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":4.123105625617661},"251":{"tf":1.4142135623730951},"257":{"tf":1.0},"270":{"tf":1.0},"282":{"tf":1.0},"335":{"tf":1.0},"348":{"tf":1.0},"354":{"tf":1.0},"363":{"tf":1.0},"369":{"tf":1.4142135623730951},"393":{"tf":1.0},"397":{"tf":1.0},"413":{"tf":1.0},"456":{"tf":1.7320508075688772},"458":{"tf":1.4142135623730951},"460":{"tf":2.0},"461":{"tf":1.4142135623730951},"463":{"tf":1.4142135623730951},"465":{"tf":1.4142135623730951},"466":{"tf":1.4142135623730951},"467":{"tf":2.0},"48":{"tf":1.0},"480":{"tf":1.7320508075688772},"492":{"tf":1.0},"494":{"tf":3.1622776601683795},"498":{"tf":1.7320508075688772},"505":{"tf":1.0},"511":{"tf":1.0},"520":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"59":{"tf":1.4142135623730951},"60":{"tf":1.0},"61":{"tf":1.0},"67":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":2.449489742783178},"77":{"tf":1.0},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"86":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"140":{"tf":1.0},"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"83":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"498":{"tf":1.0}}}},"df":0,"docs":{}},"v":{"1":{"df":1,"docs":{"56":{"tf":1.0}}},"2":{"df":1,"docs":{"56":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"346":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"100":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"274":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"282":{"tf":1.0}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"351":{"tf":1.0},"354":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":36,"docs":{"136":{"tf":1.0},"140":{"tf":1.7320508075688772},"154":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.7320508075688772},"288":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"301":{"tf":1.0},"303":{"tf":1.4142135623730951},"308":{"tf":1.0},"324":{"tf":1.0},"327":{"tf":2.449489742783178},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"354":{"tf":1.4142135623730951},"357":{"tf":1.0},"380":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0},"413":{"tf":1.0},"492":{"tf":2.0},"493":{"tf":2.0},"494":{"tf":1.7320508075688772},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.4142135623730951},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.7320508075688772},"512":{"tf":1.0}},"s":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"290":{"tf":1.0},"302":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"301":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"109":{"tf":1.0},"134":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.0},"323":{"tf":2.8284271247461903},"335":{"tf":1.0},"345":{"tf":1.0},"360":{"tf":1.0},"401":{"tf":2.23606797749979},"51":{"tf":1.0},"74":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.0},"285":{"tf":1.0},"334":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"257":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"262":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"279":{"tf":1.0},"303":{"tf":1.0},"322":{"tf":1.0},"400":{"tf":1.0},"406":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"139":{"tf":1.0},"477":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":15,"docs":{"144":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"234":{"tf":1.0},"338":{"tf":1.0},"350":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"358":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.4142135623730951},"73":{"tf":1.0},"79":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"111":{"tf":1.0},"199":{"tf":1.0},"495":{"tf":1.4142135623730951},"56":{"tf":1.0},"80":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":8,"docs":{"18":{"tf":1.0},"290":{"tf":1.0},"337":{"tf":1.0},"350":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0},"494":{"tf":1.0},"96":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"156":{"tf":1.0},"494":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"512":{"tf":2.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"257":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":2,"docs":{"293":{"tf":1.0},"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"237":{"tf":1.0},"277":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"b":{"df":3,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"337":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":17,"docs":{"167":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"241":{"tf":1.0},"326":{"tf":2.0},"492":{"tf":2.449489742783178},"493":{"tf":2.23606797749979},"494":{"tf":2.0},"495":{"tf":2.0},"496":{"tf":1.7320508075688772},"498":{"tf":1.7320508075688772},"500":{"tf":2.23606797749979},"501":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.4142135623730951},"514":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"267":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.0},"301":{"tf":1.0},"324":{"tf":1.7320508075688772},"335":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":21,"docs":{"100":{"tf":1.0},"102":{"tf":1.0},"126":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.4142135623730951},"15":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"313":{"tf":1.0},"320":{"tf":1.0},"330":{"tf":1.0},"343":{"tf":1.0},"344":{"tf":1.0},"384":{"tf":1.0},"395":{"tf":1.0},"412":{"tf":1.0},"466":{"tf":1.0},"47":{"tf":1.0},"502":{"tf":1.4142135623730951},"68":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":15,"docs":{"104":{"tf":1.0},"17":{"tf":1.0},"201":{"tf":1.0},"225":{"tf":1.0},"241":{"tf":1.0},"256":{"tf":1.0},"257":{"tf":1.0},"282":{"tf":1.0},"30":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":1.0},"46":{"tf":1.0},"515":{"tf":1.0},"72":{"tf":1.0},"98":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"139":{"tf":1.0},"238":{"tf":1.0},"264":{"tf":1.0},"324":{"tf":1.0},"337":{"tf":1.0},"379":{"tf":1.0},"381":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"289":{"tf":1.0}}}}}}}},"v":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"337":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.0},"285":{"tf":1.0}}}}}}},"df":1,"docs":{"133":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":2,"docs":{"307":{"tf":1.4142135623730951},"353":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":47,"docs":{"104":{"tf":1.4142135623730951},"109":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"117":{"tf":1.0},"120":{"tf":1.0},"124":{"tf":1.4142135623730951},"125":{"tf":2.23606797749979},"133":{"tf":1.0},"135":{"tf":1.0},"139":{"tf":1.0},"157":{"tf":1.0},"18":{"tf":1.0},"203":{"tf":1.0},"228":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"236":{"tf":1.0},"238":{"tf":1.7320508075688772},"244":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.4142135623730951},"251":{"tf":1.0},"26":{"tf":1.0},"282":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.0},"334":{"tf":1.0},"338":{"tf":1.0},"350":{"tf":1.4142135623730951},"354":{"tf":1.0},"356":{"tf":1.4142135623730951},"359":{"tf":1.0},"36":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"371":{"tf":1.4142135623730951},"375":{"tf":1.0},"391":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"480":{"tf":1.0},"524":{"tf":1.0},"59":{"tf":1.0},"64":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"76":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"343":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"346":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":5,"docs":{"12":{"tf":1.4142135623730951},"17":{"tf":1.0},"27":{"tf":1.7320508075688772},"36":{"tf":1.0},"40":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"136":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":12,"docs":{"106":{"tf":1.0},"110":{"tf":1.4142135623730951},"117":{"tf":1.0},"133":{"tf":1.0},"140":{"tf":1.0},"285":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"307":{"tf":1.0},"346":{"tf":1.0},"372":{"tf":1.0},"43":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"366":{"tf":1.0},"384":{"tf":1.0}},"i":{"df":1,"docs":{"98":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":9,"docs":{"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":2.23606797749979},"357":{"tf":2.23606797749979},"359":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"90":{"tf":1.0}},"s":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"263":{"tf":1.0},"354":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"r":{"df":2,"docs":{"140":{"tf":1.0},"222":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"214":{"tf":1.0},"512":{"tf":1.0},"70":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":6,"docs":{"143":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"339":{"tf":1.0},"4":{"tf":1.4142135623730951},"489":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":18,"docs":{"0":{"tf":1.0},"107":{"tf":1.0},"140":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"257":{"tf":1.0},"269":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"338":{"tf":1.0},"375":{"tf":1.0},"450":{"tf":1.0},"476":{"tf":1.0},"498":{"tf":1.0},"5":{"tf":1.0},"57":{"tf":1.0},"86":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"138":{"tf":1.0},"289":{"tf":1.0},"372":{"tf":1.0},"413":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":8,"docs":{"104":{"tf":1.0},"113":{"tf":1.0},"125":{"tf":1.0},"238":{"tf":1.0},"251":{"tf":1.0},"303":{"tf":1.4142135623730951},"333":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"157":{"tf":1.0},"285":{"tf":1.0},"383":{"tf":1.0}},"i":{"df":9,"docs":{"101":{"tf":1.0},"104":{"tf":1.0},"137":{"tf":1.0},"142":{"tf":1.0},"303":{"tf":1.0},"517":{"tf":1.0},"518":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":12,"docs":{"104":{"tf":1.4142135623730951},"115":{"tf":1.0},"116":{"tf":1.0},"226":{"tf":1.0},"233":{"tf":1.0},"238":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"289":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"203":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"257":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"281":{"tf":1.0},"502":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"282":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"238":{"tf":1.0}}}}}}},"c":{"df":14,"docs":{"104":{"tf":1.0},"124":{"tf":1.0},"129":{"tf":1.0},"141":{"tf":2.23606797749979},"215":{"tf":1.0},"231":{"tf":1.0},"287":{"tf":1.4142135623730951},"300":{"tf":1.0},"308":{"tf":1.4142135623730951},"327":{"tf":2.23606797749979},"334":{"tf":1.0},"337":{"tf":1.0},"356":{"tf":1.0},"43":{"tf":1.0}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"234":{"tf":1.0},"357":{"tf":1.0},"372":{"tf":1.0}}}}},"s":{"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":1,"docs":{"3":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"345":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"338":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"237":{"tf":1.0}}}}}}}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":6,"docs":{"3":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":4,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":3,"docs":{"2":{"tf":1.0},"28":{"tf":1.0},"6":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"34":{"tf":1.0},"36":{"tf":1.0},"46":{"tf":1.0},"7":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"38":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"199":{"tf":1.0},"495":{"tf":1.0},"84":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"501":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":84,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"101":{"tf":1.0},"108":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.0},"127":{"tf":1.4142135623730951},"128":{"tf":1.0},"130":{"tf":1.0},"134":{"tf":1.0},"14":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"154":{"tf":1.0},"198":{"tf":1.0},"2":{"tf":1.0},"202":{"tf":1.7320508075688772},"208":{"tf":1.0},"22":{"tf":1.0},"225":{"tf":1.0},"231":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"26":{"tf":1.0},"267":{"tf":1.0},"27":{"tf":1.4142135623730951},"276":{"tf":1.0},"28":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"287":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"300":{"tf":1.7320508075688772},"308":{"tf":1.0},"314":{"tf":1.0},"33":{"tf":1.0},"332":{"tf":1.4142135623730951},"333":{"tf":1.4142135623730951},"334":{"tf":1.7320508075688772},"337":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"34":{"tf":1.0},"345":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"360":{"tf":1.0},"362":{"tf":1.4142135623730951},"392":{"tf":1.0},"396":{"tf":1.0},"4":{"tf":1.0},"409":{"tf":1.0},"412":{"tf":1.0},"438":{"tf":1.0},"456":{"tf":1.0},"46":{"tf":1.7320508075688772},"462":{"tf":1.4142135623730951},"472":{"tf":1.0},"480":{"tf":1.0},"5":{"tf":1.4142135623730951},"501":{"tf":1.0},"520":{"tf":1.0},"56":{"tf":1.0},"59":{"tf":1.0},"6":{"tf":1.0},"61":{"tf":1.0},"67":{"tf":1.0},"7":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"89":{"tf":1.0},"9":{"tf":1.0},"91":{"tf":1.0}}}}}},"s":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"124":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"321":{"tf":1.0},"324":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"500":{"tf":1.4142135623730951},"96":{"tf":1.0},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":2,"docs":{"142":{"tf":1.0},"356":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"\'":{"df":0,"docs":{},"t":{"df":12,"docs":{"101":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"156":{"tf":1.0},"307":{"tf":1.4142135623730951},"36":{"tf":1.0},"372":{"tf":1.0},"391":{"tf":1.0},"469":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":13,"docs":{"127":{"tf":1.0},"314":{"tf":1.0},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"324":{"tf":2.0},"326":{"tf":1.0},"327":{"tf":1.0},"398":{"tf":1.0},"462":{"tf":1.0},"466":{"tf":1.0},"500":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"134":{"tf":1.0},"267":{"tf":1.0},"285":{"tf":1.0},"294":{"tf":1.0},"335":{"tf":1.0},"339":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":4,"docs":{"181":{"tf":1.0},"351":{"tf":1.0},"357":{"tf":2.0},"360":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"151":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"155":{"tf":1.0},"173":{"tf":1.4142135623730951},"257":{"tf":1.0},"259":{"tf":1.0}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"126":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0}},"n":{"df":12,"docs":{"109":{"tf":1.0},"133":{"tf":1.4142135623730951},"157":{"tf":1.0},"17":{"tf":1.0},"284":{"tf":1.4142135623730951},"297":{"tf":1.0},"298":{"tf":1.4142135623730951},"353":{"tf":1.0},"354":{"tf":1.0},"51":{"tf":1.0},"64":{"tf":1.0},"89":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"98":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"321":{"tf":1.0},"405":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"243":{"tf":1.0},"341":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"77":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":10,"docs":{"101":{"tf":1.0},"116":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"134":{"tf":1.7320508075688772},"234":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"333":{"tf":1.0},"61":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"203":{"tf":1.0},"238":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":8,"docs":{"295":{"tf":1.0},"324":{"tf":1.0},"326":{"tf":1.0},"333":{"tf":1.0},"496":{"tf":1.4142135623730951},"500":{"tf":1.0},"87":{"tf":1.0},"90":{"tf":1.0}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":12,"docs":{"121":{"tf":1.0},"236":{"tf":1.0},"238":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.0},"250":{"tf":1.0},"314":{"tf":1.0},"357":{"tf":1.0},"409":{"tf":1.0},"502":{"tf":1.0},"95":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"134":{"tf":1.0},"139":{"tf":1.0},"157":{"tf":1.0},"279":{"tf":1.0},"309":{"tf":1.0},"332":{"tf":1.0},"334":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":6,"docs":{"140":{"tf":1.0},"157":{"tf":1.0},"238":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"372":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"238":{"tf":1.0},"250":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"251":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":6,"docs":{"174":{"tf":1.4142135623730951},"191":{"tf":1.0},"215":{"tf":1.0},"304":{"tf":1.7320508075688772},"475":{"tf":1.0},"477":{"tf":1.0}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":4,"docs":{"333":{"tf":1.0},"334":{"tf":1.0},"338":{"tf":1.0},"343":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"g":{"df":4,"docs":{"15":{"tf":1.0},"261":{"tf":1.7320508075688772},"56":{"tf":1.0},"70":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"261":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":14,"docs":{"143":{"tf":1.4142135623730951},"170":{"tf":1.0},"178":{"tf":1.0},"202":{"tf":1.4142135623730951},"204":{"tf":1.0},"212":{"tf":1.0},"220":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"300":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"40":{"tf":1.0},"63":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"4":{"tf":1.0}}},"df":11,"docs":{"143":{"tf":1.0},"170":{"tf":1.0},"202":{"tf":1.7320508075688772},"203":{"tf":1.0},"220":{"tf":1.0},"338":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"39":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"139":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":8,"docs":{"197":{"tf":1.0},"244":{"tf":1.0},"350":{"tf":1.0},"365":{"tf":1.0},"368":{"tf":1.0},"371":{"tf":1.0},"57":{"tf":1.0},"88":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":3,"docs":{"122":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"b":{"df":1,"docs":{"354":{"tf":1.0}},"e":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"263":{"tf":1.0},"354":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"354":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"\\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"352":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"146":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":5,"docs":{"133":{"tf":1.0},"266":{"tf":1.0},"293":{"tf":1.0},"334":{"tf":1.4142135623730951},"354":{"tf":1.0}}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"133":{"tf":1.7320508075688772},"134":{"tf":1.0},"138":{"tf":1.4142135623730951},"263":{"tf":1.0},"293":{"tf":1.0},"354":{"tf":2.23606797749979},"356":{"tf":1.0},"360":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":2,"docs":{"293":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":2,"docs":{"293":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"293":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":2,"docs":{"293":{"tf":1.0},"354":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"s":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"354":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"]":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":47,"docs":{"109":{"tf":2.23606797749979},"133":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.4142135623730951},"138":{"tf":1.7320508075688772},"140":{"tf":1.4142135623730951},"149":{"tf":1.0},"167":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"200":{"tf":1.0},"21":{"tf":1.4142135623730951},"212":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.0},"259":{"tf":1.0},"263":{"tf":1.0},"266":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.4142135623730951},"281":{"tf":1.7320508075688772},"285":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":2.23606797749979},"290":{"tf":1.0},"291":{"tf":1.4142135623730951},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.4142135623730951},"332":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"337":{"tf":1.0},"349":{"tf":1.4142135623730951},"350":{"tf":2.0},"351":{"tf":1.4142135623730951},"352":{"tf":2.0},"354":{"tf":2.23606797749979},"356":{"tf":1.7320508075688772},"361":{"tf":1.7320508075688772},"362":{"tf":1.4142135623730951},"430":{"tf":1.0},"51":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":1,"docs":{"144":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"151":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"324":{"tf":1.0},"478":{"tf":1.0}}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":26,"docs":{"143":{"tf":1.0},"167":{"tf":1.7320508075688772},"178":{"tf":1.0},"182":{"tf":1.0},"212":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.4142135623730951},"289":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"299":{"tf":1.0},"302":{"tf":1.0},"327":{"tf":1.4142135623730951},"330":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"337":{"tf":1.0},"350":{"tf":1.0},"354":{"tf":1.7320508075688772},"369":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"413":{"tf":1.0},"492":{"tf":1.0},"70":{"tf":1.0},"97":{"tf":1.7320508075688772}},"e":{"_":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"97":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"238":{"tf":1.0}}}}}}},"d":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"238":{"tf":1.4142135623730951},"324":{"tf":1.0},"76":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"234":{"tf":1.0},"250":{"tf":1.0},"306":{"tf":1.0}}}}}}}},"df":5,"docs":{"133":{"tf":1.0},"146":{"tf":1.0},"288":{"tf":1.0},"351":{"tf":1.0},"354":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"334":{"tf":1.4142135623730951},"377":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"255":{"tf":1.4142135623730951},"271":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"360":{"tf":1.0},"377":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"12":{"tf":1.0},"135":{"tf":1.0},"143":{"tf":1.7320508075688772},"413":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"350":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"285":{"tf":1.0},"288":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"197":{"tf":1.0},"28":{"tf":1.0}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"359":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":8,"docs":{"118":{"tf":1.0},"196":{"tf":1.0},"203":{"tf":1.0},"210":{"tf":1.0},"238":{"tf":2.23606797749979},"247":{"tf":1.0},"59":{"tf":1.0},"76":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":16,"docs":{"237":{"tf":1.0},"267":{"tf":1.0},"277":{"tf":1.0},"287":{"tf":1.0},"295":{"tf":1.4142135623730951},"321":{"tf":1.0},"324":{"tf":1.0},"326":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"492":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"498":{"tf":1.4142135623730951},"500":{"tf":1.0}}}},"v":{"df":5,"docs":{"185":{"tf":1.0},"307":{"tf":1.4142135623730951},"337":{"tf":1.0},"449":{"tf":1.0},"490":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":17,"docs":{"168":{"tf":1.0},"18":{"tf":1.4142135623730951},"182":{"tf":1.0},"19":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.0},"307":{"tf":1.7320508075688772},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"346":{"tf":1.0},"418":{"tf":1.0},"477":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.0},"300":{"tf":1.0}}}}}}}},"q":{"df":1,"docs":{"324":{"tf":1.0}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"341":{"tf":1.0}}}}}}},"r":{"(":{"\\"":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"\\"":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"148":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"i":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\\"":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"237":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"277":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"277":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":58,"docs":{"108":{"tf":2.23606797749979},"129":{"tf":1.0},"134":{"tf":1.7320508075688772},"139":{"tf":2.0},"142":{"tf":1.4142135623730951},"148":{"tf":1.0},"153":{"tf":1.0},"155":{"tf":1.0},"157":{"tf":1.0},"189":{"tf":1.0},"200":{"tf":1.0},"207":{"tf":1.0},"209":{"tf":1.4142135623730951},"213":{"tf":1.4142135623730951},"218":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"236":{"tf":1.0},"237":{"tf":2.8284271247461903},"238":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":2.6457513110645907},"259":{"tf":1.0},"267":{"tf":1.0},"270":{"tf":1.0},"277":{"tf":2.449489742783178},"295":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"332":{"tf":1.4142135623730951},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":2.23606797749979},"342":{"tf":1.0},"346":{"tf":1.4142135623730951},"357":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.4142135623730951},"457":{"tf":1.4142135623730951},"461":{"tf":3.0},"463":{"tf":1.4142135623730951},"470":{"tf":1.0},"471":{"tf":1.0},"492":{"tf":2.449489742783178},"493":{"tf":1.0},"495":{"tf":1.4142135623730951},"496":{"tf":2.6457513110645907},"512":{"tf":1.0},"513":{"tf":1.0},"514":{"tf":2.23606797749979},"515":{"tf":1.4142135623730951},"517":{"tf":1.0},"52":{"tf":2.0},"55":{"tf":1.0},"74":{"tf":2.0},"80":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951},"88":{"tf":1.4142135623730951},"90":{"tf":2.0}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"470":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"2":{"df":1,"docs":{"496":{"tf":1.0}}},"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}},"df":3,"docs":{"244":{"tf":1.0},"270":{"tf":1.0},"496":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"140":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"365":{"tf":1.0},"453":{"tf":1.0}}}}}}}},"t":{"c":{"df":7,"docs":{"324":{"tf":1.4142135623730951},"330":{"tf":1.0},"352":{"tf":1.0},"398":{"tf":1.0},"473":{"tf":1.0},"66":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"332":{"tf":1.0},"350":{"tf":1.0},"501":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"108":{"tf":1.0},"238":{"tf":1.0}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"121":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"109":{"tf":1.0},"140":{"tf":1.4142135623730951},"366":{"tf":1.0},"89":{"tf":1.0}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"404":{"tf":1.0}}}}}}}}},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"156":{"tf":1.4142135623730951},"250":{"tf":1.0},"301":{"tf":1.0},"70":{"tf":1.0},"83":{"tf":1.0},"93":{"tf":1.0}}}},"v":{"df":3,"docs":{"101":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":5,"docs":{"108":{"tf":1.0},"142":{"tf":1.7320508075688772},"247":{"tf":1.0},"469":{"tf":1.0},"90":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":68,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"130":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"167":{"tf":1.0},"21":{"tf":1.0},"238":{"tf":1.0},"247":{"tf":1.0},"264":{"tf":1.0},"28":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"311":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"338":{"tf":1.0},"34":{"tf":1.4142135623730951},"345":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"357":{"tf":1.0},"36":{"tf":1.4142135623730951},"381":{"tf":1.0},"424":{"tf":1.0},"479":{"tf":1.0},"492":{"tf":1.4142135623730951},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"495":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"504":{"tf":1.4142135623730951},"511":{"tf":1.0},"512":{"tf":1.0},"515":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"68":{"tf":1.0},"7":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.7320508075688772},"76":{"tf":1.0},"77":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"88":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":7,"docs":{"231":{"tf":1.0},"251":{"tf":1.0},"359":{"tf":1.4142135623730951},"367":{"tf":1.4142135623730951},"368":{"tf":1.0},"371":{"tf":1.0},"90":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"u":{"d":{"df":2,"docs":{"215":{"tf":1.0},"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":11,"docs":{"123":{"tf":1.0},"134":{"tf":1.0},"333":{"tf":1.0},"477":{"tf":1.0},"492":{"tf":1.0},"498":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"61":{"tf":1.0},"77":{"tf":2.0},"84":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"/":{"b":{"df":1,"docs":{"80":{"tf":1.0}}},"df":0,"docs":{}},"df":17,"docs":{"15":{"tf":1.0},"156":{"tf":1.0},"301":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"324":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"345":{"tf":1.0},"36":{"tf":1.0},"383":{"tf":1.0},"399":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.0},"413":{"tf":1.0},"466":{"tf":1.0},"476":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"234":{"tf":1.0},"337":{"tf":1.0},"391":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"139":{"tf":1.0},"2":{"tf":1.0},"234":{"tf":1.0},"93":{"tf":1.0}}},"t":{"df":1,"docs":{"77":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":7,"docs":{"199":{"tf":1.0},"240":{"tf":1.0},"357":{"tf":1.0},"495":{"tf":1.4142135623730951},"56":{"tf":1.0},"73":{"tf":1.0},"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"139":{"tf":1.0},"140":{"tf":1.0},"321":{"tf":1.0},"337":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"231":{"tf":1.0},"479":{"tf":1.0}}},"s":{"df":1,"docs":{"409":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"335":{"tf":1.0}}}}},"df":0,"docs":{}}},"<":{"df":0,"docs":{},"p":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":32,"docs":{"134":{"tf":1.4142135623730951},"147":{"tf":1.0},"170":{"tf":1.4142135623730951},"182":{"tf":1.7320508075688772},"188":{"tf":1.0},"204":{"tf":1.7320508075688772},"22":{"tf":1.0},"231":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"258":{"tf":1.0},"259":{"tf":1.4142135623730951},"267":{"tf":1.4142135623730951},"276":{"tf":1.0},"292":{"tf":1.7320508075688772},"295":{"tf":1.0},"299":{"tf":1.7320508075688772},"301":{"tf":1.0},"303":{"tf":1.7320508075688772},"304":{"tf":2.6457513110645907},"314":{"tf":1.0},"324":{"tf":1.0},"334":{"tf":1.7320508075688772},"335":{"tf":2.0},"337":{"tf":1.4142135623730951},"346":{"tf":1.0},"396":{"tf":1.0},"400":{"tf":1.0},"439":{"tf":1.0},"467":{"tf":2.449489742783178},"480":{"tf":1.4142135623730951},"498":{"tf":1.7320508075688772},"91":{"tf":1.0}}}},"s":{"df":1,"docs":{"446":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"295":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"199":{"tf":1.0},"330":{"tf":1.0},"399":{"tf":1.0},"495":{"tf":1.7320508075688772},"56":{"tf":1.0},"82":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":6,"docs":{"30":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":1.0},"330":{"tf":1.0},"402":{"tf":1.0},"404":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"342":{"tf":1.0},"35":{"tf":1.0},"350":{"tf":1.0},"446":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"137":{"tf":1.0},"264":{"tf":1.0},"324":{"tf":2.6457513110645907}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"f":{"3":{"2":{"df":1,"docs":{"261":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":8,"docs":{"139":{"tf":2.0},"157":{"tf":1.0},"190":{"tf":1.0},"224":{"tf":1.0},"237":{"tf":1.4142135623730951},"333":{"tf":1.4142135623730951},"337":{"tf":1.0},"514":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"134":{"tf":1.0},"139":{"tf":1.0},"90":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"376":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"303":{"tf":1.0}},"i":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"153":{"tf":1.0},"231":{"tf":1.0},"496":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":6,"docs":{"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":2.0},"292":{"tf":1.0},"327":{"tf":1.0},"407":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"334":{"tf":1.0}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"100":{"tf":1.0},"139":{"tf":1.4142135623730951},"157":{"tf":1.0},"289":{"tf":1.7320508075688772},"351":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.0},"445":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"b":{"df":34,"docs":{"109":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"147":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"181":{"tf":1.7320508075688772},"182":{"tf":1.0},"212":{"tf":1.0},"263":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"348":{"tf":1.0},"349":{"tf":1.0},"351":{"tf":1.4142135623730951},"353":{"tf":1.4142135623730951},"354":{"tf":1.7320508075688772},"356":{"tf":1.4142135623730951},"357":{"tf":1.7320508075688772},"358":{"tf":1.0},"359":{"tf":1.7320508075688772},"360":{"tf":1.0},"362":{"tf":1.0},"393":{"tf":1.0},"432":{"tf":1.0},"51":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0}},"e":{"d":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"351":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"263":{"tf":1.0},"354":{"tf":1.7320508075688772},"360":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{"b":{"a":{"a":{"df":0,"docs":{},"i":{"/":{"b":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"149":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"121":{"tf":1.0},"125":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"202":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":33,"docs":{"107":{"tf":1.7320508075688772},"135":{"tf":1.0},"136":{"tf":1.7320508075688772},"141":{"tf":1.0},"142":{"tf":1.0},"166":{"tf":2.23606797749979},"167":{"tf":2.6457513110645907},"175":{"tf":1.4142135623730951},"181":{"tf":1.4142135623730951},"241":{"tf":1.0},"252":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"264":{"tf":1.0},"28":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"327":{"tf":1.0},"329":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"371":{"tf":1.4142135623730951},"385":{"tf":1.0},"388":{"tf":1.0},"396":{"tf":1.4142135623730951},"404":{"tf":1.0},"406":{"tf":1.0},"413":{"tf":1.0},"46":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"281":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"139":{"tf":1.0},"157":{"tf":1.0},"346":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"372":{"tf":1.0},"381":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"100":{"tf":1.0},"314":{"tf":1.0},"396":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":17,"docs":{"287":{"tf":1.4142135623730951},"295":{"tf":1.0},"296":{"tf":1.7320508075688772},"308":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":2.449489742783178},"324":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"399":{"tf":1.0},"401":{"tf":1.7320508075688772},"407":{"tf":1.0},"411":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"4":{"2":{"df":1,"docs":{"264":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{"/":{"/":{"d":{"a":{"df":0,"docs":{},"t":{"a":{".":{"d":{"b":{"df":1,"docs":{"177":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":29,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"139":{"tf":1.0},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"202":{"tf":1.0},"224":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"270":{"tf":1.0},"280":{"tf":1.4142135623730951},"284":{"tf":1.0},"298":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"300":{"tf":1.0},"31":{"tf":1.0},"310":{"tf":1.0},"324":{"tf":1.0},"333":{"tf":1.0},"366":{"tf":1.0},"379":{"tf":1.4142135623730951},"389":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.4142135623730951},"498":{"tf":1.0},"52":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":44,"docs":{"100":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"178":{"tf":1.0},"20":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"269":{"tf":1.7320508075688772},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"366":{"tf":1.0},"368":{"tf":1.4142135623730951},"369":{"tf":2.449489742783178},"371":{"tf":1.7320508075688772},"372":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"379":{"tf":1.0},"380":{"tf":1.4142135623730951},"384":{"tf":1.0},"387":{"tf":1.4142135623730951},"401":{"tf":1.0},"426":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"63":{"tf":1.4142135623730951},"86":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"262":{"tf":1.0},"373":{"tf":1.0},"392":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"d":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"298":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"m":{"df":1,"docs":{"337":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"272":{"tf":1.0}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":8,"docs":{"137":{"tf":1.0},"142":{"tf":1.0},"200":{"tf":1.0},"279":{"tf":1.0},"322":{"tf":1.0},"326":{"tf":1.0},"465":{"tf":1.0},"492":{"tf":1.0}}}}}},"n":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"324":{"tf":1.0},"325":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"y":{"_":{"df":0,"docs":{},"i":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"75":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":39,"docs":{"108":{"tf":1.4142135623730951},"114":{"tf":1.0},"118":{"tf":1.0},"129":{"tf":1.4142135623730951},"134":{"tf":1.0},"142":{"tf":2.23606797749979},"144":{"tf":1.0},"157":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"223":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"258":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":2.0},"325":{"tf":1.7320508075688772},"326":{"tf":1.0},"330":{"tf":1.0},"350":{"tf":1.7320508075688772},"396":{"tf":1.0},"402":{"tf":1.7320508075688772},"404":{"tf":1.0},"407":{"tf":1.4142135623730951},"454":{"tf":1.0},"461":{"tf":1.0},"465":{"tf":1.0},"469":{"tf":1.0},"473":{"tf":1.0},"480":{"tf":1.0},"500":{"tf":2.23606797749979},"501":{"tf":1.4142135623730951},"502":{"tf":1.0},"512":{"tf":1.4142135623730951},"53":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.7320508075688772},"96":{"tf":1.0},"99":{"tf":2.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"371":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"238":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":18,"docs":{"0":{"tf":1.0},"100":{"tf":1.0},"135":{"tf":1.0},"151":{"tf":1.0},"157":{"tf":1.0},"181":{"tf":1.0},"192":{"tf":1.0},"197":{"tf":1.0},"226":{"tf":1.0},"237":{"tf":1.0},"321":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.4142135623730951},"357":{"tf":1.0},"409":{"tf":1.0},"47":{"tf":1.0},"65":{"tf":1.0},"80":{"tf":1.0}}}}},"t":{"df":1,"docs":{"67":{"tf":1.0}}},"x":{"df":10,"docs":{"104":{"tf":1.0},"108":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"238":{"tf":2.0},"247":{"tf":1.7320508075688772},"500":{"tf":1.0},"501":{"tf":1.7320508075688772},"76":{"tf":1.0},"96":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"278":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":4,"docs":{"167":{"tf":1.0},"306":{"tf":1.0},"328":{"tf":1.0},"406":{"tf":1.0}}},"s":{"df":0,"docs":{},"h":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":8,"docs":{"314":{"tf":1.0},"316":{"tf":1.0},"325":{"tf":1.0},"396":{"tf":1.0},"402":{"tf":1.0},"502":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":1.0}},"s":{":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"502":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":4,"docs":{"314":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"396":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"30":{"tf":1.0},"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"\\\\":{"df":0,"docs":{},"n":{"3":{"df":1,"docs":{"493":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"l":{"df":11,"docs":{"110":{"tf":1.0},"133":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"250":{"tf":1.4142135623730951},"299":{"tf":1.0},"332":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"356":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"27":{"tf":1.0},"275":{"tf":1.0},"286":{"tf":1.0}}}}},"m":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"&":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\\"":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"324":{"tf":1.4142135623730951}}},"n":{"df":18,"docs":{"133":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"149":{"tf":1.4142135623730951},"238":{"tf":1.0},"262":{"tf":2.0},"263":{"tf":1.7320508075688772},"293":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":5.0990195135927845},"325":{"tf":1.7320508075688772},"329":{"tf":2.0},"335":{"tf":1.4142135623730951},"354":{"tf":3.3166247903554},"373":{"tf":1.7320508075688772},"75":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"64":{"tf":1.0}},"s":{"df":4,"docs":{"138":{"tf":1.4142135623730951},"241":{"tf":1.0},"344":{"tf":1.0},"466":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"108":{"tf":1.0},"111":{"tf":1.0},"128":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":19,"docs":{"107":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"14":{"tf":1.0},"142":{"tf":1.0},"156":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"230":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"284":{"tf":1.0},"36":{"tf":1.0},"462":{"tf":1.0},"74":{"tf":1.0},"77":{"tf":1.0}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"153":{"tf":1.0},"280":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"251":{"tf":1.0}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"238":{"tf":1.0}}}}},"k":{"df":1,"docs":{"46":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"t":{"\\"":{")":{".":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"(":{"\\"":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":28,"docs":{"143":{"tf":1.0},"150":{"tf":1.0},"170":{"tf":1.0},"202":{"tf":1.0},"220":{"tf":1.0},"225":{"tf":1.0},"258":{"tf":1.0},"267":{"tf":1.0},"269":{"tf":1.4142135623730951},"270":{"tf":1.0},"292":{"tf":1.0},"30":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"332":{"tf":1.0},"333":{"tf":1.0},"335":{"tf":1.0},"337":{"tf":1.0},"36":{"tf":1.0},"412":{"tf":1.0},"467":{"tf":1.0},"480":{"tf":1.0},"498":{"tf":2.23606797749979},"65":{"tf":1.0},"91":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"381":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":19,"docs":{"108":{"tf":1.0},"134":{"tf":1.0},"188":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"231":{"tf":1.0},"237":{"tf":1.0},"247":{"tf":1.0},"277":{"tf":1.0},"42":{"tf":1.0},"461":{"tf":1.0},"465":{"tf":1.0},"466":{"tf":1.4142135623730951},"476":{"tf":1.0},"492":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"514":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"286":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"48":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":10,"docs":{"238":{"tf":1.0},"247":{"tf":1.4142135623730951},"350":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.7320508075688772},"365":{"tf":1.0},"366":{"tf":1.0},"371":{"tf":1.0},"90":{"tf":1.0}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":12,"docs":{"136":{"tf":1.0},"157":{"tf":1.0},"255":{"tf":1.0},"262":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"368":{"tf":1.4142135623730951},"401":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"63":{"tf":1.0},"93":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"m":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"293":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":11,"docs":{"136":{"tf":1.0},"137":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"225":{"tf":1.0},"264":{"tf":1.4142135623730951},"269":{"tf":1.0},"314":{"tf":1.0},"324":{"tf":3.0},"52":{"tf":1.0},"93":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":25,"docs":{"100":{"tf":1.0},"114":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"140":{"tf":1.0},"153":{"tf":1.0},"167":{"tf":1.4142135623730951},"225":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.4142135623730951},"241":{"tf":1.0},"250":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.0},"314":{"tf":1.4142135623730951},"330":{"tf":1.0},"371":{"tf":1.0},"396":{"tf":1.4142135623730951},"404":{"tf":1.0},"412":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"73":{"tf":1.0},"94":{"tf":1.0}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"12":{"tf":1.0},"135":{"tf":1.0},"210":{"tf":1.0},"291":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.4142135623730951},"371":{"tf":1.0},"65":{"tf":1.0}}}}}}},"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"314":{"tf":1.0},"396":{"tf":1.0},"69":{"tf":1.0},"95":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"225":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"233":{"tf":1.0},"238":{"tf":1.0},"25":{"tf":1.0},"59":{"tf":1.0},"73":{"tf":1.0}}}}}}},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"360":{"tf":1.4142135623730951},"371":{"tf":1.0},"388":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":27,"docs":{"104":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.0},"137":{"tf":1.0},"167":{"tf":1.0},"196":{"tf":1.0},"199":{"tf":1.0},"214":{"tf":1.0},"258":{"tf":1.0},"279":{"tf":1.0},"3":{"tf":1.0},"304":{"tf":1.0},"310":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"344":{"tf":1.4142135623730951},"350":{"tf":1.0},"361":{"tf":1.0},"495":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.0},"55":{"tf":1.0},"61":{"tf":1.0},"72":{"tf":1.0},"77":{"tf":1.0},"79":{"tf":1.0},"91":{"tf":1.0}}}}},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"114":{"tf":1.0},"197":{"tf":1.0},"202":{"tf":1.4142135623730951},"217":{"tf":1.0},"226":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":35,"docs":{"105":{"tf":1.0},"107":{"tf":2.0},"136":{"tf":2.0},"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"151":{"tf":1.0},"157":{"tf":1.0},"164":{"tf":1.0},"215":{"tf":1.7320508075688772},"255":{"tf":1.0},"262":{"tf":1.0},"269":{"tf":1.0},"300":{"tf":1.0},"310":{"tf":1.0},"365":{"tf":1.4142135623730951},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":2.0},"375":{"tf":1.0},"376":{"tf":1.0},"383":{"tf":1.0},"387":{"tf":1.0},"401":{"tf":1.0},"47":{"tf":1.0},"484":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.4142135623730951},"57":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.4142135623730951},"86":{"tf":1.0},"93":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"u":{"b":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"a":{"b":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":4,"docs":{"104":{"tf":1.0},"226":{"tf":1.0},"30":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"215":{"tf":1.4142135623730951}}}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"4":{"tf":1.0}}}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"157":{"tf":1.0}}}},"df":3,"docs":{"101":{"tf":1.0},"381":{"tf":1.0},"471":{"tf":1.0}},"e":{"df":2,"docs":{"202":{"tf":1.0},"98":{"tf":1.0}}},"o":{"d":{"df":11,"docs":{"133":{"tf":1.0},"139":{"tf":1.0},"219":{"tf":1.0},"237":{"tf":1.0},"298":{"tf":1.0},"307":{"tf":1.0},"350":{"tf":1.0},"359":{"tf":1.7320508075688772},"366":{"tf":1.0},"470":{"tf":1.0},"67":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":1,"docs":{"351":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"142":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"142":{"tf":1.0},"90":{"tf":1.4142135623730951}}}}}}}}},"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"371":{"tf":1.0},"406":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}},"n":{"d":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"329":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"136":{"tf":1.0},"409":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"402":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"(":{"\\"":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"402":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"337":{"tf":1.0}}}},"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"272":{"tf":1.0},"273":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"498":{"tf":1.0}}}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"266":{"tf":1.0},"293":{"tf":1.0},"334":{"tf":1.0}}}}}}}},"df":73,"docs":{"105":{"tf":1.0},"110":{"tf":1.0},"114":{"tf":1.0},"124":{"tf":1.0},"128":{"tf":1.0},"140":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.4142135623730951},"15":{"tf":1.0},"151":{"tf":1.4142135623730951},"17":{"tf":1.0},"198":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"212":{"tf":1.0},"231":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.4142135623730951},"258":{"tf":1.0},"259":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"266":{"tf":1.0},"269":{"tf":1.4142135623730951},"270":{"tf":1.0},"274":{"tf":1.4142135623730951},"279":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.4142135623730951},"283":{"tf":1.0},"290":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"307":{"tf":1.0},"314":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"365":{"tf":1.7320508075688772},"366":{"tf":1.4142135623730951},"367":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"369":{"tf":1.0},"373":{"tf":1.4142135623730951},"385":{"tf":1.7320508075688772},"422":{"tf":1.0},"456":{"tf":1.0},"467":{"tf":1.0},"47":{"tf":1.0},"480":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.7320508075688772},"497":{"tf":1.0},"498":{"tf":1.4142135623730951},"503":{"tf":1.0},"51":{"tf":1.0},"511":{"tf":1.0},"57":{"tf":1.7320508075688772},"63":{"tf":1.7320508075688772},"64":{"tf":1.0},"66":{"tf":1.0},"70":{"tf":1.7320508075688772},"73":{"tf":1.4142135623730951},"85":{"tf":1.4142135623730951},"86":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.4142135623730951},"92":{"tf":1.0}},"q":{"df":0,"docs":{},"l":{"df":8,"docs":{"249":{"tf":1.0},"250":{"tf":2.8284271247461903},"460":{"tf":2.23606797749979},"465":{"tf":1.0},"501":{"tf":1.0},"73":{"tf":1.0},"83":{"tf":1.0},"96":{"tf":1.0}}}},"s":{":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"140":{"tf":1.0},"494":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"p":{"c":{"df":1,"docs":{"250":{"tf":2.449489742783178}}},"df":0,"docs":{}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"267":{"tf":1.0},"335":{"tf":1.0},"502":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"d":{"df":20,"docs":{"130":{"tf":1.0},"131":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.7320508075688772},"192":{"tf":1.0},"194":{"tf":1.0},"24":{"tf":1.0},"252":{"tf":1.4142135623730951},"282":{"tf":1.0},"311":{"tf":1.4142135623730951},"338":{"tf":1.0},"345":{"tf":1.0},"357":{"tf":1.0},"445":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"487":{"tf":1.0},"510":{"tf":1.0},"521":{"tf":1.0},"68":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":70,"docs":{"101":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.4142135623730951},"108":{"tf":1.0},"110":{"tf":2.0},"111":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.4142135623730951},"116":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"137":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":1.0},"144":{"tf":1.0},"156":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"213":{"tf":2.0},"231":{"tf":2.23606797749979},"241":{"tf":1.0},"242":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":3.0},"247":{"tf":1.0},"251":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"26":{"tf":1.4142135623730951},"269":{"tf":1.0},"270":{"tf":1.4142135623730951},"30":{"tf":1.0},"365":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":1.4142135623730951},"372":{"tf":1.4142135623730951},"377":{"tf":2.0},"381":{"tf":1.0},"391":{"tf":1.0},"457":{"tf":1.4142135623730951},"46":{"tf":1.0},"461":{"tf":1.0},"462":{"tf":2.0},"463":{"tf":2.0},"466":{"tf":2.449489742783178},"471":{"tf":1.0},"48":{"tf":1.0},"480":{"tf":1.4142135623730951},"492":{"tf":1.4142135623730951},"496":{"tf":3.0},"498":{"tf":1.7320508075688772},"506":{"tf":1.0},"508":{"tf":1.0},"512":{"tf":1.0},"519":{"tf":1.0},"53":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":2.0},"60":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":2.0},"77":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.7320508075688772},"87":{"tf":1.0},"88":{"tf":2.0}},"e":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"498":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"u":{"df":2,"docs":{"290":{"tf":1.0},"292":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":39,"docs":{"108":{"tf":1.4142135623730951},"129":{"tf":1.0},"142":{"tf":1.4142135623730951},"155":{"tf":1.0},"200":{"tf":1.0},"207":{"tf":1.0},"209":{"tf":1.4142135623730951},"213":{"tf":1.4142135623730951},"218":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"237":{"tf":2.449489742783178},"238":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":2.0},"259":{"tf":1.0},"277":{"tf":1.0},"324":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.4142135623730951},"457":{"tf":1.4142135623730951},"461":{"tf":2.449489742783178},"463":{"tf":1.4142135623730951},"470":{"tf":1.0},"471":{"tf":1.0},"492":{"tf":1.7320508075688772},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"512":{"tf":1.0},"513":{"tf":1.0},"517":{"tf":1.0},"52":{"tf":1.7320508075688772},"55":{"tf":1.0},"74":{"tf":1.4142135623730951},"80":{"tf":1.0},"82":{"tf":1.4142135623730951},"90":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"219":{"tf":1.0},"237":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"127":{"tf":1.0}}}},"i":{"df":1,"docs":{"46":{"tf":1.0}}}}},"r":{"d":{"c":{"df":0,"docs":{},"o":{"d":{"df":10,"docs":{"109":{"tf":1.0},"133":{"tf":1.4142135623730951},"146":{"tf":1.0},"149":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"298":{"tf":1.7320508075688772},"306":{"tf":1.0},"51":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"322":{"tf":1.0},"411":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":5,"docs":{"261":{"tf":1.4142135623730951},"321":{"tf":1.0},"324":{"tf":1.4142135623730951},"398":{"tf":1.0},"411":{"tf":1.0}}}}}},"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"140":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"104":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":5,"docs":{"173":{"tf":1.4142135623730951},"226":{"tf":2.0},"36":{"tf":1.4142135623730951},"46":{"tf":1.0},"480":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}},"s":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"291":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"202":{"tf":1.0},"93":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"317":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":6,"docs":{"314":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"330":{"tf":1.0},"396":{"tf":1.0},"404":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":9,"docs":{"247":{"tf":1.0},"255":{"tf":1.0},"289":{"tf":1.0},"329":{"tf":1.0},"401":{"tf":1.0},"402":{"tf":1.0},"500":{"tf":2.449489742783178},"96":{"tf":1.4142135623730951},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"308":{"tf":1.0},"57":{"tf":1.0},"88":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":2,"docs":{"333":{"tf":1.0},"338":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"251":{"tf":1.0}},"i":{"df":9,"docs":{"104":{"tf":1.0},"238":{"tf":1.0},"348":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0},"48":{"tf":1.0},"60":{"tf":1.0},"77":{"tf":1.0},"93":{"tf":1.0}}}}}}},"t":{"df":2,"docs":{"241":{"tf":1.0},"391":{"tf":1.0}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"144":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"354":{"tf":1.0},"359":{"tf":1.0},"65":{"tf":1.0},"90":{"tf":1.0}}}},"t":{"df":1,"docs":{"285":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"113":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"247":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"6":{"tf":1.0}}}},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"3":{"0":{"0":{"0":{"df":2,"docs":{"2":{"tf":1.0},"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"0":{"0":{"0":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"190":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"161":{"tf":1.0}},"s":{":":{"/":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"f":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"d":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":5,"docs":{"137":{"tf":2.23606797749979},"143":{"tf":2.8284271247461903},"157":{"tf":1.0},"333":{"tf":1.0},"341":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":15,"docs":{"100":{"tf":1.0},"20":{"tf":1.0},"269":{"tf":1.0},"27":{"tf":1.0},"323":{"tf":1.0},"330":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":1.0},"391":{"tf":1.0},"397":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"\'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"127":{"tf":1.0}}}},"m":{"df":2,"docs":{"237":{"tf":1.0},"461":{"tf":1.0}}}},"/":{"df":0,"docs":{},"o":{"df":2,"docs":{"208":{"tf":1.0},"289":{"tf":1.0}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.0}}}}},"d":{"df":40,"docs":{"137":{"tf":1.0},"150":{"tf":1.0},"199":{"tf":1.7320508075688772},"201":{"tf":1.7320508075688772},"202":{"tf":1.4142135623730951},"223":{"tf":1.0},"224":{"tf":1.0},"261":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"300":{"tf":1.0},"314":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":2.449489742783178},"333":{"tf":1.0},"338":{"tf":1.0},"398":{"tf":1.0},"492":{"tf":1.4142135623730951},"493":{"tf":2.0},"494":{"tf":1.7320508075688772},"495":{"tf":2.0},"496":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"504":{"tf":1.0},"505":{"tf":1.0},"506":{"tf":1.0},"507":{"tf":1.0},"508":{"tf":1.0},"509":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.4142135623730951},"515":{"tf":1.0},"52":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":1.4142135623730951},"93":{"tf":1.0},"98":{"tf":1.0}},"e":{"a":{"df":4,"docs":{"105":{"tf":1.0},"238":{"tf":1.0},"70":{"tf":1.0},"79":{"tf":1.0}},"l":{"df":2,"docs":{"124":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"310":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"357":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":2,"docs":{"101":{"tf":1.0},"334":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":10,"docs":{"133":{"tf":1.4142135623730951},"149":{"tf":1.4142135623730951},"293":{"tf":1.0},"303":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":2.23606797749979},"325":{"tf":1.0},"354":{"tf":1.7320508075688772},"373":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":70,"docs":{"104":{"tf":1.0},"111":{"tf":1.4142135623730951},"130":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.7320508075688772},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":1.4142135623730951},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"152":{"tf":1.0},"199":{"tf":1.4142135623730951},"210":{"tf":1.0},"218":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":2.0},"240":{"tf":1.0},"241":{"tf":3.0},"251":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"282":{"tf":1.0},"317":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.4142135623730951},"329":{"tf":1.4142135623730951},"330":{"tf":1.7320508075688772},"335":{"tf":1.0},"345":{"tf":1.4142135623730951},"347":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.7320508075688772},"360":{"tf":1.7320508075688772},"368":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.4142135623730951},"392":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.7320508075688772},"412":{"tf":1.0},"413":{"tf":1.0},"458":{"tf":1.4142135623730951},"462":{"tf":2.6457513110645907},"466":{"tf":1.4142135623730951},"471":{"tf":1.0},"480":{"tf":1.0},"487":{"tf":1.0},"495":{"tf":1.7320508075688772},"496":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"518":{"tf":1.0},"519":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.4142135623730951},"76":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":2.0},"84":{"tf":1.0},"86":{"tf":1.0},"96":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":8,"docs":{"314":{"tf":1.0},"324":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.4142135623730951},"396":{"tf":1.4142135623730951},"404":{"tf":1.0},"63":{"tf":1.0}}}}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":19,"docs":{"113":{"tf":1.0},"154":{"tf":1.0},"170":{"tf":1.0},"179":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"259":{"tf":1.4142135623730951},"290":{"tf":1.0},"314":{"tf":1.7320508075688772},"321":{"tf":1.0},"324":{"tf":2.0},"333":{"tf":1.0},"334":{"tf":1.4142135623730951},"337":{"tf":1.0},"356":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"413":{"tf":1.0},"500":{"tf":1.0},"97":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"36":{"tf":1.0},"46":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":11,"docs":{"141":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"300":{"tf":1.0},"36":{"tf":1.0},"371":{"tf":1.4142135623730951},"496":{"tf":1.0},"498":{"tf":1.0},"511":{"tf":1.0}},"e":{"_":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"496":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"498":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"243":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":2,"docs":{"324":{"tf":2.6457513110645907},"342":{"tf":1.0}}}},"x":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"322":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":10,"docs":{"100":{"tf":1.4142135623730951},"279":{"tf":1.0},"28":{"tf":1.0},"323":{"tf":1.7320508075688772},"328":{"tf":1.0},"357":{"tf":1.4142135623730951},"384":{"tf":1.0},"401":{"tf":1.0},"407":{"tf":1.0},"410":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"259":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"512":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":3,"docs":{"120":{"tf":1.0},"122":{"tf":1.0},"270":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"151":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"314":{"tf":1.0},"396":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"198":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.7320508075688772},"367":{"tf":1.0},"372":{"tf":1.0},"456":{"tf":1.0},"494":{"tf":1.0},"73":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"372":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"171":{"tf":1.0},"213":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":2,"docs":{"199":{"tf":1.0},"82":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"319":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":18,"docs":{"110":{"tf":1.4142135623730951},"114":{"tf":1.0},"138":{"tf":1.0},"171":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.4142135623730951},"258":{"tf":1.0},"332":{"tf":1.0},"369":{"tf":1.7320508075688772},"377":{"tf":1.0},"423":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"508":{"tf":1.0},"509":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"88":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"t":{"df":11,"docs":{"169":{"tf":1.4142135623730951},"171":{"tf":1.0},"173":{"tf":1.0},"196":{"tf":1.0},"213":{"tf":1.0},"222":{"tf":1.0},"244":{"tf":1.0},"257":{"tf":1.0},"338":{"tf":1.0},"450":{"tf":1.0},"476":{"tf":1.0}},"i":{"df":15,"docs":{"169":{"tf":1.7320508075688772},"171":{"tf":1.0},"173":{"tf":1.0},"179":{"tf":1.0},"18":{"tf":1.0},"196":{"tf":1.4142135623730951},"222":{"tf":1.0},"257":{"tf":1.0},"348":{"tf":1.0},"357":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0},"417":{"tf":1.0},"450":{"tf":1.4142135623730951},"476":{"tf":1.0}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"351":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"123":{"tf":1.0},"53":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":7,"docs":{"100":{"tf":1.0},"124":{"tf":1.0},"226":{"tf":1.0},"285":{"tf":1.0},"300":{"tf":1.0},"314":{"tf":1.0},"96":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"264":{"tf":1.0},"280":{"tf":1.4142135623730951},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0}},"s":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"326":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"339":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"151":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":18,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":2.0},"13":{"tf":1.0},"159":{"tf":1.4142135623730951},"16":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"164":{"tf":2.0},"172":{"tf":1.0},"188":{"tf":1.7320508075688772},"193":{"tf":1.0},"195":{"tf":2.23606797749979},"338":{"tf":1.4142135623730951},"416":{"tf":1.0},"42":{"tf":1.7320508075688772},"68":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"118":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"372":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"116":{"tf":1.0},"234":{"tf":1.0},"251":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":5,"docs":{"238":{"tf":1.0},"247":{"tf":1.0},"285":{"tf":1.0},"372":{"tf":1.0},"404":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":5,"docs":{"492":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"512":{"tf":1.0}},"r":{"df":38,"docs":{"105":{"tf":1.0},"142":{"tf":1.0},"151":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":1.0},"183":{"tf":1.0},"192":{"tf":1.0},"205":{"tf":1.0},"215":{"tf":1.0},"225":{"tf":1.0},"24":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"278":{"tf":1.0},"293":{"tf":1.0},"304":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"371":{"tf":1.0},"407":{"tf":1.4142135623730951},"414":{"tf":1.0},"433":{"tf":1.0},"434":{"tf":1.0},"435":{"tf":1.0},"445":{"tf":1.0},"463":{"tf":1.0},"479":{"tf":1.4142135623730951},"481":{"tf":1.0},"482":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.0},"501":{"tf":1.0},"53":{"tf":1.0},"63":{"tf":1.0},"66":{"tf":1.0},"77":{"tf":1.0},"92":{"tf":1.0}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"/":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"s":{"df":2,"docs":{"351":{"tf":1.0},"98":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"136":{"tf":1.0}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"197":{"tf":1.0},"257":{"tf":1.0},"446":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"128":{"tf":1.0},"144":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"a":{"c":{"df":7,"docs":{"255":{"tf":1.0},"257":{"tf":1.4142135623730951},"353":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":1.0},"4":{"tf":1.0},"66":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":2,"docs":{"267":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":4,"docs":{"250":{"tf":2.23606797749979},"35":{"tf":1.0},"44":{"tf":1.0},"514":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"135":{"tf":1.0}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"134":{"tf":1.0},"147":{"tf":1.0},"234":{"tf":1.0},"241":{"tf":1.0},"295":{"tf":1.0},"337":{"tf":1.0},"514":{"tf":1.7320508075688772},"515":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"245":{"tf":1.0},"251":{"tf":1.0}}}}}}}}},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"337":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":5,"docs":{"128":{"tf":1.0},"138":{"tf":1.0},"144":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":6,"docs":{"104":{"tf":1.0},"226":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"346":{"tf":1.0},"46":{"tf":1.0}}}}},"t":{"\'":{"df":2,"docs":{"306":{"tf":1.4142135623730951},"68":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":7,"docs":{"247":{"tf":1.0},"325":{"tf":1.0},"461":{"tf":1.0},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"498":{"tf":1.0},"96":{"tf":1.0}}},"r":{"df":1,"docs":{"289":{"tf":1.0}}}}}},"j":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"j":{"a":{"2":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"a":{"df":2,"docs":{"104":{"tf":1.0},"124":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"385":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":19,"docs":{"108":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.4142135623730951},"203":{"tf":2.0},"210":{"tf":1.4142135623730951},"238":{"tf":2.8284271247461903},"247":{"tf":2.0},"251":{"tf":1.0},"257":{"tf":1.0},"270":{"tf":1.4142135623730951},"492":{"tf":1.0},"498":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"67":{"tf":1.0},"76":{"tf":1.7320508075688772},"86":{"tf":1.0}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":23,"docs":{"170":{"tf":1.0},"238":{"tf":1.0},"258":{"tf":1.0},"267":{"tf":1.4142135623730951},"27":{"tf":1.0},"275":{"tf":1.4142135623730951},"280":{"tf":1.0},"292":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":2.23606797749979},"335":{"tf":2.449489742783178},"337":{"tf":1.0},"339":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"385":{"tf":1.0},"487":{"tf":1.0},"498":{"tf":1.0},"514":{"tf":1.4142135623730951},"63":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0}},"r":{"df":0,"docs":{},"p":{"c":{"\\"":{":":{"\\"":{"2":{".":{"0":{"\\"":{",":{"\\"":{"df":0,"docs":{},"i":{"d":{"\\"":{":":{"1":{",":{"\\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"\\"":{":":{"\\"":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"\\"":{",":{"\\"":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"\\"":{":":{"df":0,"docs":{},"{":{"\\"":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"\\"":{":":{"\\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"174":{"tf":1.0},"475":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":1,"docs":{"191":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"492":{"tf":1.4142135623730951},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"495":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"511":{"tf":1.0},"512":{"tf":1.0},"515":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}}}},"w":{"df":0,"docs":{},"t":{"df":1,"docs":{"137":{"tf":1.0}}}}},"k":{"8":{"df":1,"docs":{"344":{"tf":1.0}}},"b":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"/":{"a":{"d":{"d":{"_":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":3,"docs":{"258":{"tf":1.0},"460":{"tf":1.0},"494":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":4,"docs":{"241":{"tf":1.0},"258":{"tf":1.0},"462":{"tf":1.0},"493":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"258":{"tf":1.0},"467":{"tf":1.0},"498":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"407":{"tf":1.0},"500":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"502":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"258":{"tf":1.0},"512":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"501":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"231":{"tf":1.0},"244":{"tf":1.0},"258":{"tf":1.0},"496":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":4,"docs":{"241":{"tf":1.0},"258":{"tf":1.0},"462":{"tf":1.0},"495":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"258":{"tf":1.0},"497":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"186":{"tf":1.0},"205":{"tf":1.0},"275":{"tf":1.0},"469":{"tf":1.0},"492":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"258":{"tf":1.0},"463":{"tf":1.0},"511":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"303":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"\\"":{".":{"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":7,"docs":{"266":{"tf":1.0},"267":{"tf":1.0},"293":{"tf":1.7320508075688772},"303":{"tf":1.0},"327":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0}}}}}}}},"df":109,"docs":{"103":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":2.0},"111":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.0},"116":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.7320508075688772},"125":{"tf":1.0},"126":{"tf":1.0},"130":{"tf":1.0},"133":{"tf":1.0},"140":{"tf":1.0},"142":{"tf":1.0},"151":{"tf":1.0},"156":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":2.23606797749979},"166":{"tf":1.0},"167":{"tf":1.0},"169":{"tf":1.7320508075688772},"170":{"tf":1.4142135623730951},"171":{"tf":2.0},"173":{"tf":1.7320508075688772},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"181":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"191":{"tf":1.4142135623730951},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"198":{"tf":1.0},"199":{"tf":1.4142135623730951},"200":{"tf":2.0},"201":{"tf":1.4142135623730951},"203":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"209":{"tf":1.0},"210":{"tf":1.0},"213":{"tf":2.0},"222":{"tf":2.23606797749979},"223":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"23":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.4142135623730951},"244":{"tf":2.0},"247":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":1.7320508075688772},"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":2.449489742783178},"260":{"tf":1.0},"275":{"tf":1.4142135623730951},"278":{"tf":1.4142135623730951},"285":{"tf":1.0},"290":{"tf":1.4142135623730951},"292":{"tf":1.7320508075688772},"293":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.7320508075688772},"303":{"tf":2.0},"304":{"tf":3.0},"310":{"tf":1.0},"311":{"tf":1.4142135623730951},"314":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"335":{"tf":1.0},"338":{"tf":1.0},"345":{"tf":1.0},"354":{"tf":1.0},"369":{"tf":1.7320508075688772},"372":{"tf":1.7320508075688772},"377":{"tf":1.4142135623730951},"388":{"tf":1.0},"396":{"tf":1.0},"407":{"tf":1.7320508075688772},"413":{"tf":1.0},"448":{"tf":1.0},"450":{"tf":1.4142135623730951},"451":{"tf":1.0},"475":{"tf":1.0},"476":{"tf":1.7320508075688772},"478":{"tf":1.0},"489":{"tf":1.4142135623730951},"521":{"tf":1.0},"66":{"tf":2.449489742783178},"85":{"tf":1.0},"92":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"344":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":9,"docs":{"135":{"tf":1.0},"291":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"405":{"tf":1.0},"410":{"tf":1.0},"466":{"tf":1.0},"65":{"tf":1.0}}}},"y":{"df":16,"docs":{"101":{"tf":1.0},"197":{"tf":1.0},"202":{"tf":1.0},"319":{"tf":1.0},"324":{"tf":1.4142135623730951},"326":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"341":{"tf":1.4142135623730951},"352":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0},"500":{"tf":1.0},"511":{"tf":1.0},"54":{"tf":1.0},"96":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":6,"docs":{"108":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"350":{"tf":1.0},"473":{"tf":1.0},"53":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"356":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"142":{"tf":1.0},"383":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":95,"docs":{"101":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":2.0},"107":{"tf":2.23606797749979},"110":{"tf":1.4142135623730951},"111":{"tf":1.0},"114":{"tf":1.0},"120":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.7320508075688772},"127":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"136":{"tf":2.449489742783178},"142":{"tf":1.4142135623730951},"144":{"tf":1.0},"157":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"200":{"tf":1.0},"202":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"244":{"tf":1.0},"251":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"258":{"tf":1.0},"259":{"tf":1.0},"269":{"tf":1.0},"325":{"tf":1.0},"331":{"tf":1.0},"364":{"tf":1.0},"365":{"tf":2.23606797749979},"367":{"tf":1.0},"368":{"tf":2.0},"369":{"tf":1.4142135623730951},"371":{"tf":2.6457513110645907},"375":{"tf":1.0},"376":{"tf":1.0},"380":{"tf":1.0},"383":{"tf":1.0},"391":{"tf":1.0},"446":{"tf":1.4142135623730951},"452":{"tf":1.0},"454":{"tf":1.0},"461":{"tf":1.0},"463":{"tf":1.7320508075688772},"466":{"tf":1.0},"47":{"tf":1.4142135623730951},"48":{"tf":1.0},"480":{"tf":1.4142135623730951},"487":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.4142135623730951},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"503":{"tf":1.0},"511":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0},"70":{"tf":1.7320508075688772},"72":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":2.0},"98":{"tf":1.0},"99":{"tf":1.0}},"e":{"b":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"138":{"tf":1.0},"149":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"o":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"/":{"a":{"d":{"d":{"_":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":3,"docs":{"456":{"tf":1.0},"494":{"tf":1.0},"520":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"455":{"tf":1.0},"493":{"tf":1.0},"92":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":6,"docs":{"170":{"tf":1.7320508075688772},"178":{"tf":1.0},"182":{"tf":1.0},"212":{"tf":1.0},"267":{"tf":1.0},"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":3,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"498":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"326":{"tf":1.0},"500":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"502":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"92":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"501":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"457":{"tf":1.0},"466":{"tf":1.0},"496":{"tf":1.0},"519":{"tf":1.0},"92":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"496":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"/":{"$":{"(":{"d":{"df":1,"docs":{"203":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"215":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":3,"docs":{"458":{"tf":1.0},"495":{"tf":1.0},"518":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"143":{"tf":1.0},"202":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"202":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"i":{"df":2,"docs":{"143":{"tf":1.4142135623730951},"371":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":10,"docs":{"237":{"tf":1.0},"258":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.0},"461":{"tf":1.0},"465":{"tf":1.0},"466":{"tf":1.0},"492":{"tf":1.0},"517":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"511":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},":":{"/":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"/":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"258":{"tf":1.0},"505":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"505":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"258":{"tf":1.0},"506":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"{":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"506":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"258":{"tf":1.0},"504":{"tf":1.7320508075688772},"92":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"504":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"504":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"258":{"tf":1.0},"507":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"{":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"507":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"258":{"tf":1.0},"508":{"tf":1.4142135623730951},"92":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"{":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"508":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"258":{"tf":1.0},"509":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"{":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"509":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"449":{"tf":1.0},"477":{"tf":1.0},"490":{"tf":1.0}}}}},"df":0,"docs":{}},"df":66,"docs":{"0":{"tf":1.7320508075688772},"102":{"tf":1.0},"107":{"tf":1.4142135623730951},"136":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"15":{"tf":1.7320508075688772},"159":{"tf":1.0},"165":{"tf":1.0},"169":{"tf":1.0},"185":{"tf":1.0},"194":{"tf":1.0},"196":{"tf":1.4142135623730951},"215":{"tf":1.0},"228":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.7320508075688772},"247":{"tf":1.0},"250":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.0},"269":{"tf":1.4142135623730951},"270":{"tf":1.0},"284":{"tf":1.0},"314":{"tf":1.7320508075688772},"332":{"tf":1.0},"350":{"tf":1.0},"365":{"tf":1.0},"369":{"tf":1.4142135623730951},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"396":{"tf":1.7320508075688772},"404":{"tf":1.0},"409":{"tf":1.0},"445":{"tf":1.0},"446":{"tf":1.4142135623730951},"448":{"tf":1.0},"449":{"tf":1.0},"450":{"tf":1.0},"469":{"tf":1.0},"47":{"tf":1.4142135623730951},"48":{"tf":1.0},"480":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.0},"490":{"tf":1.0},"57":{"tf":1.0},"63":{"tf":1.4142135623730951},"64":{"tf":1.4142135623730951},"65":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":1.0},"76":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.0},"92":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"344":{"tf":1.0}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"344":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"104":{"tf":1.0},"48":{"tf":1.0}}}},"df":1,"docs":{"476":{"tf":1.0}},"n":{"d":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":4,"docs":{"161":{"tf":1.0},"188":{"tf":1.0},"195":{"tf":1.0},"338":{"tf":1.0}},"u":{"a":{"df":0,"docs":{},"g":{"df":17,"docs":{"213":{"tf":1.0},"244":{"tf":1.0},"334":{"tf":1.0},"338":{"tf":1.0},"344":{"tf":1.0},"347":{"tf":1.0},"36":{"tf":1.0},"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.4142135623730951},"458":{"tf":1.0},"469":{"tf":1.0},"494":{"tf":1.0},"496":{"tf":1.7320508075688772},"519":{"tf":1.0},"74":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":7,"docs":{"109":{"tf":1.0},"281":{"tf":1.0},"350":{"tf":1.0},"356":{"tf":1.0},"365":{"tf":1.4142135623730951},"366":{"tf":1.0},"377":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"144":{"tf":1.0},"231":{"tf":1.0},"324":{"tf":1.0},"381":{"tf":1.0},"465":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"98":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"361":{"tf":1.0},"372":{"tf":1.4142135623730951},"391":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":14,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":1.0},"13":{"tf":1.0},"161":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"324":{"tf":1.0},"327":{"tf":1.0},"500":{"tf":1.0},"96":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"179":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"372":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"238":{"tf":1.4142135623730951},"241":{"tf":2.449489742783178},"247":{"tf":1.0},"255":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"500":{"tf":1.0},"66":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"270":{"tf":1.0}}}}}},"z":{"df":0,"docs":{},"i":{"df":6,"docs":{"279":{"tf":1.0},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"400":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"100":{"tf":1.0}}}}}}},"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}},"e":{"a":{"d":{"df":2,"docs":{"113":{"tf":1.0},"231":{"tf":1.0}}},"df":0,"docs":{},"k":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"n":{"df":21,"docs":{"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":1.0},"120":{"tf":1.4142135623730951},"130":{"tf":1.0},"197":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":1.4142135623730951},"334":{"tf":1.0},"338":{"tf":1.4142135623730951},"343":{"tf":1.0},"460":{"tf":1.4142135623730951},"494":{"tf":1.0},"502":{"tf":2.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.0},"76":{"tf":1.0},"80":{"tf":1.0},"96":{"tf":1.4142135623730951}}}},"v":{"df":2,"docs":{"104":{"tf":1.0},"351":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"334":{"tf":1.0},"344":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":9,"docs":{"191":{"tf":1.0},"244":{"tf":1.0},"255":{"tf":1.0},"314":{"tf":1.4142135623730951},"321":{"tf":1.0},"324":{"tf":2.0},"327":{"tf":1.4142135623730951},"396":{"tf":1.4142135623730951},"96":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"220":{"tf":1.0}}}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"448":{"tf":1.0}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"124":{"tf":1.0},"165":{"tf":1.0},"209":{"tf":1.0},"235":{"tf":1.0},"255":{"tf":1.4142135623730951},"260":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"66":{"tf":1.4142135623730951},"92":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"202":{"tf":1.0},"316":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":15,"docs":{"109":{"tf":1.0},"200":{"tf":1.4142135623730951},"238":{"tf":2.23606797749979},"314":{"tf":1.0},"333":{"tf":1.0},"338":{"tf":1.0},"343":{"tf":1.0},"351":{"tf":1.0},"492":{"tf":1.7320508075688772},"500":{"tf":1.7320508075688772},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"64":{"tf":1.0},"65":{"tf":1.0},"99":{"tf":1.4142135623730951}}}}},"n":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"c":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"(":{"\\"":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"324":{"tf":1.0}},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":2.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"124":{"tf":1.0}}}},"df":4,"docs":{"257":{"tf":1.0},"296":{"tf":1.0},"324":{"tf":2.449489742783178},"66":{"tf":1.0}}},"k":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":35,"docs":{"101":{"tf":1.0},"116":{"tf":1.0},"12":{"tf":1.4142135623730951},"125":{"tf":1.0},"137":{"tf":1.4142135623730951},"151":{"tf":1.0},"199":{"tf":1.7320508075688772},"217":{"tf":1.0},"218":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.7320508075688772},"250":{"tf":1.7320508075688772},"251":{"tf":1.0},"257":{"tf":1.0},"264":{"tf":1.0},"318":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.4142135623730951},"44":{"tf":2.0},"458":{"tf":1.4142135623730951},"461":{"tf":1.0},"462":{"tf":1.4142135623730951},"466":{"tf":1.0},"471":{"tf":1.7320508075688772},"480":{"tf":1.4142135623730951},"495":{"tf":1.0},"518":{"tf":1.0},"53":{"tf":1.0},"56":{"tf":1.0},"7":{"tf":1.4142135623730951},"76":{"tf":1.4142135623730951},"98":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"199":{"tf":1.0},"223":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"258":{"tf":1.0},"324":{"tf":1.0},"494":{"tf":1.0},"497":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":4,"docs":{"104":{"tf":1.0},"141":{"tf":1.0},"2":{"tf":1.0},"38":{"tf":1.0}}}}},"o":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"139":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"<":{"df":0,"docs":{},"p":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":10,"docs":{"139":{"tf":1.0},"234":{"tf":1.0},"241":{"tf":1.0},"267":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"303":{"tf":1.0},"327":{"tf":1.0},"335":{"tf":1.0},"339":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"345":{"tf":1.0}}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"df":35,"docs":{"101":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":1.7320508075688772},"151":{"tf":1.0},"157":{"tf":1.0},"167":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"2":{"tf":1.4142135623730951},"257":{"tf":1.0},"263":{"tf":1.0},"269":{"tf":1.0},"281":{"tf":1.0},"289":{"tf":1.4142135623730951},"350":{"tf":1.4142135623730951},"351":{"tf":1.4142135623730951},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.7320508075688772},"356":{"tf":1.7320508075688772},"359":{"tf":1.7320508075688772},"361":{"tf":1.7320508075688772},"368":{"tf":1.4142135623730951},"369":{"tf":2.0},"371":{"tf":1.4142135623730951},"380":{"tf":1.4142135623730951},"432":{"tf":1.0},"489":{"tf":1.0},"49":{"tf":1.0},"57":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.4142135623730951},"65":{"tf":1.0},"86":{"tf":1.4142135623730951},"90":{"tf":1.0}}},"t":{"df":9,"docs":{"140":{"tf":1.0},"171":{"tf":1.0},"218":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":4,"docs":{"238":{"tf":1.0},"247":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":7,"docs":{"177":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"244":{"tf":1.0},"390":{"tf":1.0},"502":{"tf":1.0},"76":{"tf":1.0},"88":{"tf":1.0}},"i":{"c":{"df":5,"docs":{"231":{"tf":1.0},"241":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"\'":{"df":1,"docs":{"95":{"tf":1.0}}},".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":2,"docs":{"204":{"tf":1.0},"259":{"tf":1.4142135623730951}}}}},"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.0}}}}}}},"\\\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"498":{"tf":1.0}}}}}}}}}},"df":39,"docs":{"100":{"tf":1.7320508075688772},"124":{"tf":1.0},"136":{"tf":1.0},"151":{"tf":1.0},"204":{"tf":2.0},"231":{"tf":1.4142135623730951},"24":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.4142135623730951},"276":{"tf":1.4142135623730951},"313":{"tf":1.0},"314":{"tf":2.0},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"323":{"tf":1.4142135623730951},"324":{"tf":2.0},"328":{"tf":1.0},"330":{"tf":1.7320508075688772},"393":{"tf":1.0},"394":{"tf":1.0},"396":{"tf":2.0},"401":{"tf":1.0},"404":{"tf":1.0},"407":{"tf":1.7320508075688772},"409":{"tf":1.0},"412":{"tf":1.0},"467":{"tf":2.0},"480":{"tf":1.0},"482":{"tf":1.0},"498":{"tf":1.4142135623730951},"499":{"tf":1.0},"502":{"tf":1.4142135623730951},"63":{"tf":1.7320508075688772},"67":{"tf":1.0},"91":{"tf":1.0},"94":{"tf":1.4142135623730951},"97":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"324":{"tf":1.4142135623730951},"407":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"324":{"tf":1.4142135623730951},"407":{"tf":1.0}}}}}}}}}}}},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"129":{"tf":1.0},"247":{"tf":1.0},"466":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"279":{"tf":1.0}}}}},"p":{"df":1,"docs":{"356":{"tf":1.0}}},"s":{"df":1,"docs":{"157":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"130":{"tf":1.0},"314":{"tf":1.0},"367":{"tf":1.0},"396":{"tf":1.0},"409":{"tf":1.0}}},"s":{"df":1,"docs":{"391":{"tf":1.0}}},"t":{"df":5,"docs":{"104":{"tf":1.4142135623730951},"115":{"tf":1.0},"117":{"tf":1.0},"396":{"tf":1.0},"48":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"241":{"tf":1.0}}}},"s":{"df":4,"docs":{"143":{"tf":1.0},"448":{"tf":1.0},"475":{"tf":1.0},"476":{"tf":1.0}},"p":{"df":2,"docs":{"338":{"tf":1.4142135623730951},"345":{"tf":1.0}}}}},"m":{"a":{"c":{"df":1,"docs":{"39":{"tf":1.0}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"351":{"tf":1.0}}}}},"o":{"df":1,"docs":{"162":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":4,"docs":{"240":{"tf":1.0},"463":{"tf":1.0},"465":{"tf":1.0},"494":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"138":{"tf":1.0},"404":{"tf":1.0},"46":{"tf":1.0},"473":{"tf":1.4142135623730951},"480":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"162":{"tf":1.0},"259":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"156":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"156":{"tf":1.0},"338":{"tf":1.0},"73":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":10,"docs":{"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"222":{"tf":1.0},"251":{"tf":1.0},"373":{"tf":1.0},"46":{"tf":1.0},"473":{"tf":1.0},"477":{"tf":1.0},"59":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":12,"docs":{"124":{"tf":1.0},"157":{"tf":1.0},"161":{"tf":1.0},"205":{"tf":1.0},"257":{"tf":1.4142135623730951},"365":{"tf":1.0},"368":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.0},"446":{"tf":1.0},"502":{"tf":1.0},"98":{"tf":1.0}}}},"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":1,"docs":{"316":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"344":{"tf":1.0}}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":10,"docs":{"108":{"tf":1.0},"179":{"tf":1.0},"289":{"tf":1.0},"347":{"tf":1.0},"366":{"tf":1.0},"372":{"tf":1.0},"383":{"tf":1.0},"388":{"tf":1.0},"413":{"tf":1.0},"475":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"139":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":42,"docs":{"100":{"tf":2.23606797749979},"107":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.4142135623730951},"140":{"tf":1.0},"143":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"202":{"tf":1.4142135623730951},"217":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.4142135623730951},"269":{"tf":1.4142135623730951},"30":{"tf":1.0},"31":{"tf":1.0},"314":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":2.0},"330":{"tf":1.0},"366":{"tf":1.0},"379":{"tf":1.0},"39":{"tf":1.7320508075688772},"396":{"tf":1.0},"397":{"tf":1.0},"399":{"tf":1.0},"4":{"tf":1.7320508075688772},"400":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"49":{"tf":1.0},"493":{"tf":1.0},"498":{"tf":1.0},"52":{"tf":1.0},"63":{"tf":1.4142135623730951},"65":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"c":{"df":0,"docs":{},"h":{"df":12,"docs":{"108":{"tf":1.0},"133":{"tf":1.0},"142":{"tf":1.4142135623730951},"285":{"tf":1.0},"293":{"tf":1.4142135623730951},"295":{"tf":1.0},"296":{"tf":1.4142135623730951},"308":{"tf":1.0},"326":{"tf":1.0},"354":{"tf":1.0},"500":{"tf":1.0},"90":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"!":{"(":{"b":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"344":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"492":{"tf":1.0},"495":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"512":{"tf":1.0}}}}}}},"y":{"b":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"p":{"/":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"330":{"tf":1.0},"407":{"tf":1.0}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"266":{"tf":1.0},"293":{"tf":1.0}}}}}}}},"df":52,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.0},"165":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"183":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":1.4142135623730951},"191":{"tf":1.0},"192":{"tf":1.0},"205":{"tf":1.4142135623730951},"225":{"tf":1.0},"231":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0},"275":{"tf":1.4142135623730951},"278":{"tf":1.0},"293":{"tf":1.0},"326":{"tf":1.0},"407":{"tf":1.0},"414":{"tf":1.0},"445":{"tf":1.4142135623730951},"446":{"tf":1.7320508075688772},"448":{"tf":2.0},"449":{"tf":1.4142135623730951},"451":{"tf":1.0},"463":{"tf":1.0},"475":{"tf":2.0},"477":{"tf":1.0},"479":{"tf":1.0},"480":{"tf":1.0},"485":{"tf":1.0},"486":{"tf":1.4142135623730951},"487":{"tf":1.4142135623730951},"489":{"tf":1.4142135623730951},"49":{"tf":1.0},"490":{"tf":1.4142135623730951},"521":{"tf":1.4142135623730951},"53":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":2.0},"92":{"tf":1.4142135623730951},"97":{"tf":1.0},"99":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"185":{"tf":1.0},"449":{"tf":1.0},"490":{"tf":1.0}}}}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.7320508075688772},"124":{"tf":1.0},"13":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"143":{"tf":1.0},"203":{"tf":1.0},"215":{"tf":1.0},"371":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":10,"docs":{"111":{"tf":1.0},"350":{"tf":1.0},"514":{"tf":1.0},"56":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":6,"docs":{"20":{"tf":1.0},"291":{"tf":1.0},"368":{"tf":1.0},"372":{"tf":1.0},"378":{"tf":1.0},"392":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"281":{"tf":1.0},"376":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":10,"docs":{"104":{"tf":1.4142135623730951},"116":{"tf":1.0},"220":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.4142135623730951},"250":{"tf":1.0},"460":{"tf":1.4142135623730951},"72":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.7320508075688772}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"104":{"tf":1.0},"121":{"tf":1.0},"229":{"tf":1.0},"60":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":20,"docs":{"122":{"tf":1.0},"177":{"tf":1.4142135623730951},"190":{"tf":1.0},"20":{"tf":1.0},"200":{"tf":1.0},"255":{"tf":1.0},"262":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"289":{"tf":1.0},"291":{"tf":1.4142135623730951},"292":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.4142135623730951},"334":{"tf":1.0},"380":{"tf":1.0},"428":{"tf":1.0},"501":{"tf":1.0}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"466":{"tf":1.0},"76":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"g":{"df":12,"docs":{"107":{"tf":1.7320508075688772},"136":{"tf":1.7320508075688772},"141":{"tf":1.7320508075688772},"151":{"tf":1.0},"274":{"tf":1.0},"291":{"tf":2.23606797749979},"334":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":1.0},"380":{"tf":1.0},"383":{"tf":1.0},"93":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"291":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"139":{"tf":1.4142135623730951},"237":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"515":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":13,"docs":{"100":{"tf":1.0},"137":{"tf":1.0},"261":{"tf":1.4142135623730951},"270":{"tf":1.0},"279":{"tf":1.0},"308":{"tf":1.0},"314":{"tf":1.0},"357":{"tf":1.0},"411":{"tf":1.4142135623730951},"502":{"tf":1.0},"89":{"tf":1.0},"94":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":26,"docs":{"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"249":{"tf":1.0},"324":{"tf":1.0},"325":{"tf":1.0},"407":{"tf":1.0},"416":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.4142135623730951},"501":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"514":{"tf":1.0},"517":{"tf":1.0},"518":{"tf":1.0},"519":{"tf":1.0},"520":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"346":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":11,"docs":{"156":{"tf":1.4142135623730951},"179":{"tf":1.0},"238":{"tf":1.4142135623730951},"321":{"tf":1.0},"328":{"tf":1.0},"345":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":1.0},"413":{"tf":1.0},"460":{"tf":1.7320508075688772},"465":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"179":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"352":{"tf":1.0},"356":{"tf":1.0},"367":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"140":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"308":{"tf":1.0},"492":{"tf":1.0},"495":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"118":{"tf":1.0},"16":{"tf":1.0},"194":{"tf":1.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"247":{"tf":1.0},"380":{"tf":1.0},"447":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"357":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"337":{"tf":1.0},"353":{"tf":1.0},"357":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":6,"docs":{"113":{"tf":1.0},"296":{"tf":1.0},"337":{"tf":1.0},"476":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.0}}},"t":{"a":{"df":0,"docs":{},"k":{"df":3,"docs":{"104":{"tf":1.0},"113":{"tf":1.0},"332":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"338":{"tf":2.8284271247461903},"357":{"tf":1.7320508075688772},"372":{"tf":1.7320508075688772}}}}},"x":{"df":2,"docs":{"285":{"tf":1.0},"357":{"tf":1.0}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":4,"docs":{"171":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.0},"304":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"d":{"df":1,"docs":{"329":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":10,"docs":{"155":{"tf":1.0},"174":{"tf":1.0},"19":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":2.0},"290":{"tf":1.4142135623730951},"307":{"tf":1.0},"352":{"tf":1.0}},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"\\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"351":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"351":{"tf":1.0},"354":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"263":{"tf":1.0},"354":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"354":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":38,"docs":{"100":{"tf":1.0},"109":{"tf":1.0},"146":{"tf":1.0},"17":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"258":{"tf":1.0},"261":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.0},"324":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"351":{"tf":1.7320508075688772},"352":{"tf":1.0},"354":{"tf":2.6457513110645907},"356":{"tf":1.0},"357":{"tf":2.0},"360":{"tf":1.0},"362":{"tf":1.0},"399":{"tf":1.0},"445":{"tf":1.0},"446":{"tf":1.0},"486":{"tf":1.0},"502":{"tf":1.0},"66":{"tf":1.0},"73":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0},"98":{"tf":1.0}},"s":{"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"104":{"tf":1.0}}}},"s":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.4142135623730951}},"i":{"df":7,"docs":{"202":{"tf":1.0},"261":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.4142135623730951},"487":{"tf":1.0},"497":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"l":{"df":13,"docs":{"207":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"278":{"tf":1.0},"291":{"tf":1.0},"325":{"tf":1.0},"462":{"tf":1.0},"466":{"tf":2.0},"55":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"237":{"tf":1.0},"238":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"346":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"144":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":9,"docs":{"117":{"tf":1.0},"231":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"330":{"tf":1.0},"343":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.0},"479":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"102":{"tf":1.0},"103":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"44":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":8,"docs":{"110":{"tf":1.0},"144":{"tf":1.0},"281":{"tf":1.0},"373":{"tf":1.0},"390":{"tf":1.0},"57":{"tf":1.0},"63":{"tf":1.0},"85":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":9,"docs":{"233":{"tf":1.0},"249":{"tf":1.0},"285":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"357":{"tf":1.0},"460":{"tf":1.4142135623730951},"63":{"tf":1.0},"85":{"tf":1.0}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":4,"docs":{"273":{"tf":1.0},"276":{"tf":1.0},"324":{"tf":4.69041575982343},"325":{"tf":1.4142135623730951}}}}},"n":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"492":{"tf":1.0}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":20,"docs":{"140":{"tf":1.7320508075688772},"169":{"tf":1.4142135623730951},"171":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.4142135623730951},"290":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"307":{"tf":1.0},"326":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0},"373":{"tf":1.0},"493":{"tf":1.0},"51":{"tf":1.0},"511":{"tf":1.0},"89":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":4,"docs":{"178":{"tf":1.0},"369":{"tf":1.0},"377":{"tf":1.0},"390":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":14,"docs":{"107":{"tf":1.0},"108":{"tf":1.0},"137":{"tf":1.0},"157":{"tf":1.0},"333":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"385":{"tf":1.0},"47":{"tf":1.0},"494":{"tf":1.0},"53":{"tf":1.4142135623730951},"63":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"105":{"tf":1.0},"217":{"tf":1.0},"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0},"469":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":8,"docs":{"169":{"tf":1.0},"196":{"tf":1.0},"2":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"450":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"l":{"df":4,"docs":{"298":{"tf":1.0},"300":{"tf":1.0},"310":{"tf":1.0},"335":{"tf":1.0}}}},"df":1,"docs":{"324":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"e":{"d":{"df":39,"docs":{"101":{"tf":1.0},"142":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.0},"210":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.4142135623730951},"238":{"tf":1.4142135623730951},"240":{"tf":1.0},"244":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"251":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"323":{"tf":1.4142135623730951},"324":{"tf":1.0},"330":{"tf":1.0},"343":{"tf":1.0},"365":{"tf":1.4142135623730951},"368":{"tf":1.0},"371":{"tf":1.0},"372":{"tf":1.4142135623730951},"383":{"tf":1.0},"40":{"tf":1.0},"405":{"tf":1.0},"456":{"tf":1.0},"46":{"tf":1.0},"460":{"tf":1.0},"494":{"tf":1.4142135623730951},"73":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0}}},"df":0,"docs":{}},"g":{"df":5,"docs":{"338":{"tf":1.0},"357":{"tf":1.0},"372":{"tf":1.0},"405":{"tf":1.0},"73":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":17,"docs":{"238":{"tf":1.0},"295":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.7320508075688772},"327":{"tf":1.0},"329":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"401":{"tf":1.0},"404":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":5,"docs":{"352":{"tf":1.0},"356":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"371":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"339":{"tf":1.0},"358":{"tf":1.0},"373":{"tf":1.0},"406":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"127":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"306":{"tf":1.0},"496":{"tf":1.0},"74":{"tf":1.0}}}}},"w":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"354":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":30,"docs":{"104":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"121":{"tf":1.0},"133":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"237":{"tf":1.0},"238":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"301":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"325":{"tf":1.0},"356":{"tf":1.0},"36":{"tf":1.0},"405":{"tf":1.0},"413":{"tf":1.4142135623730951},"493":{"tf":1.0},"501":{"tf":1.0},"518":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"68":{"tf":1.0}}},"x":{"df":0,"docs":{},"t":{"df":14,"docs":{"102":{"tf":1.0},"158":{"tf":1.0},"192":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"237":{"tf":1.0},"252":{"tf":1.0},"282":{"tf":1.0},"330":{"tf":1.0},"348":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0},"479":{"tf":1.0},"68":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"\'":{"df":1,"docs":{"308":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"304":{"tf":1.0}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":43,"docs":{"109":{"tf":1.0},"134":{"tf":1.4142135623730951},"147":{"tf":1.0},"151":{"tf":1.0},"154":{"tf":1.0},"161":{"tf":1.4142135623730951},"170":{"tf":1.4142135623730951},"188":{"tf":2.0},"19":{"tf":1.0},"195":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.4142135623730951},"27":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.4142135623730951},"287":{"tf":1.0},"292":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"300":{"tf":1.0},"304":{"tf":3.7416573867739413},"309":{"tf":1.0},"311":{"tf":1.0},"331":{"tf":1.0},"334":{"tf":2.0},"335":{"tf":2.449489742783178},"337":{"tf":1.4142135623730951},"338":{"tf":2.23606797749979},"339":{"tf":1.0},"343":{"tf":1.0},"344":{"tf":1.0},"345":{"tf":1.7320508075688772},"346":{"tf":1.0},"347":{"tf":1.4142135623730951},"354":{"tf":1.4142135623730951},"363":{"tf":1.0},"421":{"tf":1.0},"463":{"tf":1.0},"51":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"89":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":2,"docs":{"104":{"tf":1.0},"115":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"324":{"tf":1.0},"396":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"273":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"\\"":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"402":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"t":{"a":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"272":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"407":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"i":{"d":{"df":3,"docs":{"323":{"tf":1.0},"401":{"tf":1.0},"512":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"261":{"tf":1.0},"264":{"tf":1.0}}}}}},"df":47,"docs":{"136":{"tf":1.0},"15":{"tf":1.0},"199":{"tf":1.7320508075688772},"201":{"tf":2.23606797749979},"202":{"tf":1.0},"217":{"tf":1.0},"223":{"tf":1.7320508075688772},"257":{"tf":2.23606797749979},"258":{"tf":1.0},"261":{"tf":2.23606797749979},"264":{"tf":1.4142135623730951},"27":{"tf":1.0},"279":{"tf":1.4142135623730951},"281":{"tf":1.7320508075688772},"314":{"tf":1.0},"321":{"tf":1.7320508075688772},"323":{"tf":1.4142135623730951},"324":{"tf":3.4641016151377544},"325":{"tf":2.23606797749979},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0},"357":{"tf":1.0},"365":{"tf":1.4142135623730951},"366":{"tf":1.4142135623730951},"367":{"tf":1.0},"371":{"tf":1.4142135623730951},"379":{"tf":1.0},"380":{"tf":1.0},"399":{"tf":1.4142135623730951},"404":{"tf":1.0},"407":{"tf":1.4142135623730951},"409":{"tf":1.7320508075688772},"463":{"tf":2.23606797749979},"480":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"495":{"tf":2.0},"497":{"tf":1.4142135623730951},"498":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.7320508075688772},"55":{"tf":1.4142135623730951},"56":{"tf":1.0},"70":{"tf":1.4142135623730951},"71":{"tf":1.0},"90":{"tf":1.0}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"498":{"tf":1.0}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"261":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"261":{"tf":1.0},"324":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"264":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"354":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":1,"docs":{"279":{"tf":1.0}},"e":{"df":4,"docs":{"324":{"tf":2.0},"351":{"tf":1.0},"354":{"tf":1.0},"466":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"137":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"140":{"tf":1.0},"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":2,"docs":{"143":{"tf":1.4142135623730951},"371":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":62,"docs":{"104":{"tf":1.7320508075688772},"105":{"tf":1.0},"108":{"tf":1.0},"111":{"tf":1.0},"114":{"tf":1.0},"137":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"150":{"tf":1.0},"151":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.4142135623730951},"197":{"tf":2.0},"199":{"tf":1.0},"202":{"tf":1.0},"207":{"tf":1.7320508075688772},"220":{"tf":1.0},"224":{"tf":1.7320508075688772},"234":{"tf":1.0},"241":{"tf":2.6457513110645907},"247":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"264":{"tf":3.0},"270":{"tf":1.4142135623730951},"369":{"tf":1.0},"371":{"tf":1.0},"413":{"tf":1.0},"454":{"tf":1.4142135623730951},"455":{"tf":1.4142135623730951},"458":{"tf":1.4142135623730951},"460":{"tf":1.0},"461":{"tf":1.4142135623730951},"462":{"tf":2.0},"466":{"tf":2.0},"470":{"tf":1.0},"471":{"tf":1.4142135623730951},"478":{"tf":1.4142135623730951},"48":{"tf":1.0},"480":{"tf":1.7320508075688772},"492":{"tf":1.4142135623730951},"493":{"tf":2.449489742783178},"495":{"tf":1.4142135623730951},"498":{"tf":1.7320508075688772},"500":{"tf":1.0},"504":{"tf":1.7320508075688772},"518":{"tf":1.0},"52":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"56":{"tf":1.7320508075688772},"64":{"tf":1.4142135623730951},"67":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.7320508075688772},"76":{"tf":1.0},"79":{"tf":1.4142135623730951},"81":{"tf":1.0},"84":{"tf":1.4142135623730951},"86":{"tf":1.0},"93":{"tf":1.7320508075688772},"96":{"tf":1.0},"98":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"220":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"498":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"c":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"379":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"65":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"107":{"tf":1.0},"124":{"tf":1.0},"67":{"tf":1.0}}}}}},"w":{"df":7,"docs":{"130":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"327":{"tf":1.0},"462":{"tf":1.0},"467":{"tf":1.0},"500":{"tf":1.0},"96":{"tf":1.0}}}},"s":{"df":1,"docs":{"179":{"tf":1.0}}},"u":{"df":4,"docs":{"162":{"tf":1.0},"179":{"tf":1.0},"204":{"tf":1.0},"214":{"tf":1.7320508075688772}},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"291":{"tf":1.0},"296":{"tf":1.0}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"308":{"tf":1.0},"346":{"tf":1.0},"492":{"tf":1.4142135623730951},"495":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"350":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":8,"docs":{"155":{"tf":1.0},"162":{"tf":1.0},"214":{"tf":1.0},"255":{"tf":1.0},"259":{"tf":1.0},"444":{"tf":1.0},"496":{"tf":1.0},"66":{"tf":1.4142135623730951}}}}}}}},"o":{"(":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":2,"docs":{"279":{"tf":1.0},"502":{"tf":1.4142135623730951}}}},"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":16,"docs":{"203":{"tf":1.0},"238":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"401":{"tf":1.0},"463":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"55":{"tf":1.0},"72":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":6,"docs":{"124":{"tf":1.0},"136":{"tf":1.0},"151":{"tf":1.0},"483":{"tf":1.0},"64":{"tf":1.7320508075688772},"67":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":4,"docs":{"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"330":{"tf":1.0},"360":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":16,"docs":{"135":{"tf":1.4142135623730951},"157":{"tf":1.0},"3":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.4142135623730951},"365":{"tf":1.0},"366":{"tf":1.0},"368":{"tf":1.0},"371":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"65":{"tf":1.0},"90":{"tf":1.0}}}}}}},"k":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"324":{"tf":1.4142135623730951},"325":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"133":{"tf":1.0},"354":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"(":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"354":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"a":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"354":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"(":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"354":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"293":{"tf":1.0},"303":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"354":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"303":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"354":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"303":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"354":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"8":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"335":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":3,"docs":{"139":{"tf":1.0},"238":{"tf":1.0},"324":{"tf":1.4142135623730951}}},"l":{"d":{"df":4,"docs":{"120":{"tf":1.0},"141":{"tf":1.0},"413":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"199":{"tf":1.0},"495":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"a":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"=":{"\\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"1":{"1":{"4":{"3":{"4":{"df":1,"docs":{"182":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":8,"docs":{"182":{"tf":1.7320508075688772},"263":{"tf":1.0},"354":{"tf":1.7320508075688772},"359":{"tf":1.7320508075688772},"360":{"tf":1.0},"362":{"tf":1.0},"435":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":6,"docs":{"104":{"tf":1.0},"121":{"tf":1.0},"229":{"tf":1.0},"231":{"tf":1.0},"251":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":4,"docs":{"105":{"tf":1.0},"251":{"tf":1.0},"292":{"tf":1.0},"339":{"tf":1.0}}},"df":4,"docs":{"110":{"tf":1.0},"136":{"tf":1.0},"316":{"tf":1.4142135623730951},"500":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"1":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{},"i":{"/":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":3,"docs":{"135":{"tf":1.0},"281":{"tf":1.0},"356":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"352":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"=":{"\\"":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"182":{"tf":1.0}}}}},"df":0,"docs":{}},"df":2,"docs":{"182":{"tf":1.0},"354":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":20,"docs":{"109":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"140":{"tf":1.0},"147":{"tf":1.0},"182":{"tf":1.7320508075688772},"263":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"352":{"tf":1.0},"354":{"tf":1.7320508075688772},"357":{"tf":1.0},"359":{"tf":1.4142135623730951},"360":{"tf":1.0},"362":{"tf":1.0},"433":{"tf":1.0},"90":{"tf":1.0}}}},"df":9,"docs":{"2":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0},"467":{"tf":1.0},"498":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":10,"docs":{"208":{"tf":1.0},"231":{"tf":1.4142135623730951},"247":{"tf":1.0},"257":{"tf":1.0},"277":{"tf":1.0},"280":{"tf":1.0},"321":{"tf":1.0},"487":{"tf":1.0},"496":{"tf":1.0},"98":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.0}}}}}}},"t":{"df":5,"docs":{"328":{"tf":1.4142135623730951},"388":{"tf":1.0},"406":{"tf":1.0},"413":{"tf":1.0},"97":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":8,"docs":{"137":{"tf":1.0},"142":{"tf":1.0},"157":{"tf":1.0},"279":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":2.0},"356":{"tf":1.0},"384":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"<":{"&":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"138":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"139":{"tf":1.0}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.4142135623730951}}}}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":3,"docs":{"321":{"tf":1.0},"324":{"tf":1.4142135623730951},"398":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"321":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"330":{"tf":1.0},"399":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":46,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"135":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"176":{"tf":1.0},"180":{"tf":1.0},"2":{"tf":1.0},"204":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"225":{"tf":1.0},"269":{"tf":1.0},"28":{"tf":1.0},"287":{"tf":1.7320508075688772},"288":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.4142135623730951},"332":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"337":{"tf":1.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"357":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"372":{"tf":1.7320508075688772},"388":{"tf":1.0},"399":{"tf":1.0},"4":{"tf":1.0},"407":{"tf":1.0},"413":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"80":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"/":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":2,"docs":{"244":{"tf":2.0},"87":{"tf":1.0}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"n":{"df":19,"docs":{"105":{"tf":1.0},"110":{"tf":1.4142135623730951},"122":{"tf":1.0},"14":{"tf":1.0},"213":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.7320508075688772},"269":{"tf":1.4142135623730951},"281":{"tf":1.0},"365":{"tf":1.4142135623730951},"369":{"tf":1.4142135623730951},"371":{"tf":1.7320508075688772},"377":{"tf":1.4142135623730951},"390":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"87":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":4,"docs":{"110":{"tf":1.0},"365":{"tf":1.0},"368":{"tf":1.0},"87":{"tf":1.0}}}}}},"df":1,"docs":{"244":{"tf":1.4142135623730951}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"73":{"tf":1.0},"77":{"tf":1.0}}}}},"d":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"141":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"46":{"tf":1.0},"98":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"100":{"tf":1.4142135623730951},"151":{"tf":1.0},"314":{"tf":1.0},"324":{"tf":1.0},"396":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"\'":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"&":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"498":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":12,"docs":{"13":{"tf":1.0},"155":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"264":{"tf":1.0},"292":{"tf":1.0},"303":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.0},"498":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"101":{"tf":1.0},"104":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.4142135623730951},"247":{"tf":1.0},"258":{"tf":1.0},"291":{"tf":1.0},"70":{"tf":1.0},"93":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":5,"docs":{"289":{"tf":1.0},"322":{"tf":1.0},"358":{"tf":1.0},"405":{"tf":1.0},"410":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"285":{"tf":1.0},"289":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"d":{"df":16,"docs":{"110":{"tf":1.4142135623730951},"140":{"tf":1.0},"244":{"tf":1.0},"251":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.4142135623730951},"291":{"tf":2.449489742783178},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"369":{"tf":1.0},"74":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":12,"docs":{"102":{"tf":1.0},"158":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.0},"420":{"tf":1.0},"430":{"tf":1.0},"441":{"tf":1.0},"487":{"tf":1.0},"66":{"tf":1.0},"68":{"tf":1.0}}}}}}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"502":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"316":{"tf":1.0},"98":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":7,"docs":{"202":{"tf":1.0},"205":{"tf":1.0},"316":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"55":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.4142135623730951}}}}}}}}}}},"p":{"5":{"0":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{}},"9":{"5":{"df":1,"docs":{"391":{"tf":1.0}}},"9":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":6,"docs":{"165":{"tf":1.7320508075688772},"166":{"tf":1.0},"175":{"tf":1.0},"181":{"tf":1.0},"184":{"tf":1.0},"448":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"324":{"tf":1.7320508075688772},"398":{"tf":1.0}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":12,"docs":{"27":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0},"314":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772},"32":{"tf":1.0},"324":{"tf":3.3166247903554},"36":{"tf":1.4142135623730951},"398":{"tf":1.0},"40":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"d":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"39":{"tf":1.0}}},"i":{"c":{"df":2,"docs":{"142":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"96":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":22,"docs":{"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.4142135623730951},"501":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.0},"517":{"tf":1.0},"518":{"tf":1.0},"519":{"tf":1.0},"520":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"285":{"tf":1.0},"514":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"a":{"d":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"100":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":5,"docs":{"314":{"tf":1.0},"324":{"tf":2.0},"329":{"tf":1.0},"404":{"tf":1.0},"96":{"tf":1.0}}}}},"s":{"df":19,"docs":{"100":{"tf":1.4142135623730951},"137":{"tf":1.4142135623730951},"224":{"tf":1.0},"264":{"tf":1.7320508075688772},"322":{"tf":1.7320508075688772},"323":{"tf":2.0},"324":{"tf":2.6457513110645907},"327":{"tf":1.7320508075688772},"342":{"tf":1.0},"379":{"tf":1.0},"400":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.0},"406":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951},"410":{"tf":1.4142135623730951},"413":{"tf":1.4142135623730951},"514":{"tf":1.0},"97":{"tf":1.4142135623730951}},"e":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"322":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}},"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"97":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"327":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":11,"docs":{"207":{"tf":1.0},"264":{"tf":1.0},"278":{"tf":1.0},"317":{"tf":1.4142135623730951},"322":{"tf":1.0},"324":{"tf":1.0},"330":{"tf":1.0},"400":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.0},"410":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"223":{"tf":1.0}},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":2,"docs":{"125":{"tf":1.0},"480":{"tf":1.0}}}}},"df":2,"docs":{"352":{"tf":1.0},"65":{"tf":1.0}},"t":{"df":1,"docs":{"502":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"177":{"tf":1.4142135623730951},"179":{"tf":1.0},"190":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"178":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"df":6,"docs":{"104":{"tf":1.0},"123":{"tf":1.0},"247":{"tf":1.0},"251":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{".":{"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"139":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"490":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":3,"docs":{"170":{"tf":1.0},"185":{"tf":1.0},"449":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"204":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"/":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}}},"df":3,"docs":{"193":{"tf":1.0},"476":{"tf":1.0},"490":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"476":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"/":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":1,"docs":{"449":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"169":{"tf":1.0},"196":{"tf":1.0},"450":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{".":{"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"=":{"\\"":{"$":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{"$":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"188":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"139":{"tf":1.4142135623730951},"164":{"tf":1.0},"188":{"tf":1.0},"280":{"tf":1.0},"293":{"tf":1.0},"306":{"tf":1.0},"324":{"tf":2.0},"328":{"tf":1.0},"386":{"tf":1.0},"413":{"tf":1.0},"449":{"tf":1.0},"497":{"tf":1.4142135623730951},"498":{"tf":1.0},"80":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"75":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":77,"docs":{"101":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.7320508075688772},"116":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"137":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"196":{"tf":1.4142135623730951},"209":{"tf":2.0},"230":{"tf":1.0},"235":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":2.0},"238":{"tf":2.23606797749979},"241":{"tf":1.7320508075688772},"243":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.4142135623730951},"251":{"tf":1.0},"257":{"tf":1.0},"270":{"tf":1.0},"286":{"tf":1.0},"335":{"tf":1.0},"338":{"tf":1.0},"347":{"tf":1.0},"369":{"tf":1.4142135623730951},"376":{"tf":1.0},"455":{"tf":2.0},"458":{"tf":1.4142135623730951},"461":{"tf":2.0},"463":{"tf":2.23606797749979},"466":{"tf":1.0},"469":{"tf":1.0},"470":{"tf":1.4142135623730951},"473":{"tf":1.0},"48":{"tf":1.0},"492":{"tf":2.0},"493":{"tf":2.23606797749979},"495":{"tf":2.0},"498":{"tf":1.4142135623730951},"504":{"tf":1.0},"507":{"tf":1.0},"509":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"518":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"67":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.7320508075688772},"74":{"tf":1.0},"75":{"tf":2.449489742783178},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.4142135623730951},"82":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"90":{"tf":1.0},"98":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"81":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"y":{"df":1,"docs":{"356":{"tf":1.0}}}},"df":5,"docs":{"171":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.0},"304":{"tf":1.0},"335":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":11,"docs":{"110":{"tf":1.4142135623730951},"113":{"tf":1.0},"136":{"tf":1.0},"241":{"tf":1.0},"269":{"tf":1.0},"278":{"tf":1.0},"317":{"tf":1.0},"319":{"tf":1.0},"352":{"tf":1.0},"57":{"tf":1.0},"91":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"124":{"tf":1.0},"238":{"tf":1.0},"366":{"tf":1.0},"76":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":17,"docs":{"198":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.4142135623730951},"279":{"tf":1.0},"289":{"tf":1.0},"339":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"371":{"tf":1.4142135623730951},"385":{"tf":1.0},"456":{"tf":1.0},"460":{"tf":1.4142135623730951},"494":{"tf":1.0},"73":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"139":{"tf":1.0},"280":{"tf":1.0},"477":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"120":{"tf":1.0},"124":{"tf":1.0},"64":{"tf":1.0},"67":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":11,"docs":{"324":{"tf":2.0},"328":{"tf":2.23606797749979},"330":{"tf":1.4142135623730951},"387":{"tf":1.0},"388":{"tf":1.0},"389":{"tf":1.0},"390":{"tf":1.0},"395":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":2.6457513110645907},"413":{"tf":1.0}}}}},"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":7,"docs":{"102":{"tf":1.4142135623730951},"126":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"15":{"tf":1.0},"285":{"tf":1.0},"50":{"tf":1.0}}}}}}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"90":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"157":{"tf":1.0},"70":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"155":{"tf":1.0},"337":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"65":{"tf":1.0}}}},"n":{"df":2,"docs":{"500":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"df":1,"docs":{"135":{"tf":1.0}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"304":{"tf":1.4142135623730951},"347":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"151":{"tf":1.0},"39":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"142":{"tf":1.0},"95":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"377":{"tf":1.4142135623730951},"87":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"135":{"tf":1.0},"366":{"tf":1.4142135623730951},"385":{"tf":1.0}}}},"p":{"df":1,"docs":{"324":{"tf":1.0}},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"405":{"tf":1.0},"413":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"43":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"120":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"337":{"tf":1.0},"356":{"tf":1.0},"371":{"tf":1.0},"404":{"tf":1.0},"73":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"247":{"tf":1.0},"351":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"234":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":3,"docs":{"111":{"tf":1.0},"230":{"tf":1.0},"385":{"tf":1.0}}}}}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":17,"docs":{"104":{"tf":1.0},"108":{"tf":1.0},"122":{"tf":1.0},"142":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"253":{"tf":1.0},"305":{"tf":1.0},"371":{"tf":1.0},"461":{"tf":1.4142135623730951},"462":{"tf":1.0},"492":{"tf":1.0},"496":{"tf":1.0},"516":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"90":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"104":{"tf":1.4142135623730951},"107":{"tf":1.0},"117":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0},"238":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"371":{"tf":1.0},"52":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"@":{"1":{"0":{"df":1,"docs":{"361":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"303":{"tf":1.0},"357":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"65":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"239":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"160":{"tf":1.0},"195":{"tf":1.0},"415":{"tf":1.0},"56":{"tf":1.0},"80":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"295":{"tf":1.0},"324":{"tf":1.0}}}},"r":{"df":0,"docs":{},"v":{"df":20,"docs":{"100":{"tf":1.0},"104":{"tf":1.0},"136":{"tf":1.0},"151":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"314":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"330":{"tf":1.0},"351":{"tf":1.0},"371":{"tf":1.0},"396":{"tf":1.0},"404":{"tf":1.4142135623730951},"467":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"327":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"s":{"df":1,"docs":{"28":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"332":{"tf":1.0},"337":{"tf":1.0},"502":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"df":2,"docs":{"39":{"tf":1.7320508075688772},"4":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":2,"docs":{"363":{"tf":1.0},"393":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":23,"docs":{"140":{"tf":1.0},"143":{"tf":1.0},"178":{"tf":1.0},"257":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.4142135623730951},"291":{"tf":1.7320508075688772},"292":{"tf":1.0},"295":{"tf":1.4142135623730951},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"369":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"456":{"tf":1.0},"494":{"tf":1.0},"51":{"tf":1.0},"73":{"tf":1.0},"89":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":18,"docs":{"101":{"tf":1.0},"126":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"152":{"tf":1.0},"157":{"tf":1.0},"87":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":11,"docs":{"231":{"tf":1.4142135623730951},"244":{"tf":1.7320508075688772},"329":{"tf":1.0},"369":{"tf":1.0},"401":{"tf":1.0},"496":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"57":{"tf":1.7320508075688772},"88":{"tf":1.7320508075688772},"96":{"tf":1.4142135623730951},"99":{"tf":1.0}}},"y":{"\'":{":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"500":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"500":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"500":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":8,"docs":{"135":{"tf":1.4142135623730951},"350":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"65":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":16,"docs":{"104":{"tf":1.4142135623730951},"122":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"236":{"tf":1.4142135623730951},"237":{"tf":1.0},"238":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"314":{"tf":1.0},"333":{"tf":1.0},"48":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"267":{"tf":1.0},"279":{"tf":1.0},"379":{"tf":1.0},"380":{"tf":1.0}}}}}},"d":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"307":{"tf":1.7320508075688772},"337":{"tf":1.0}},"u":{"c":{"df":0,"docs":{},"t":{"df":18,"docs":{"109":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"135":{"tf":1.0},"153":{"tf":1.0},"18":{"tf":1.0},"231":{"tf":1.4142135623730951},"244":{"tf":1.0},"246":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.0},"494":{"tf":1.0},"74":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":12,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"520":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"202":{"tf":1.0},"496":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"65":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":7,"docs":{"203":{"tf":1.4142135623730951},"210":{"tf":1.0},"238":{"tf":1.0},"259":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"76":{"tf":1.7320508075688772}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"\'":{"df":1,"docs":{"480":{"tf":1.0}}},")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"337":{"tf":1.0}}}},"df":0,"docs":{}}},"/":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}}}},"df":72,"docs":{"105":{"tf":1.4142135623730951},"110":{"tf":3.1622776601683795},"120":{"tf":1.0},"124":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":1.7320508075688772},"144":{"tf":1.0},"169":{"tf":2.0},"171":{"tf":1.7320508075688772},"193":{"tf":1.0},"196":{"tf":1.4142135623730951},"209":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"242":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":2.449489742783178},"251":{"tf":1.4142135623730951},"258":{"tf":1.0},"269":{"tf":1.4142135623730951},"270":{"tf":1.0},"274":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"290":{"tf":1.7320508075688772},"292":{"tf":1.0},"307":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":2.0},"365":{"tf":1.4142135623730951},"366":{"tf":1.0},"368":{"tf":1.4142135623730951},"369":{"tf":2.449489742783178},"371":{"tf":2.23606797749979},"372":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.4142135623730951},"377":{"tf":1.0},"381":{"tf":1.7320508075688772},"417":{"tf":1.0},"450":{"tf":1.0},"463":{"tf":1.7320508075688772},"48":{"tf":1.0},"480":{"tf":1.0},"492":{"tf":1.4142135623730951},"493":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"5":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"504":{"tf":1.4142135623730951},"505":{"tf":1.0},"506":{"tf":1.0},"507":{"tf":1.0},"51":{"tf":1.0},"511":{"tf":2.23606797749979},"57":{"tf":2.0},"60":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"86":{"tf":2.23606797749979},"87":{"tf":1.0},"88":{"tf":1.7320508075688772},"89":{"tf":1.0},"91":{"tf":1.0},"96":{"tf":1.0}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"56":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":9,"docs":{"197":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"463":{"tf":1.0},"487":{"tf":1.0},"510":{"tf":1.4142135623730951},"511":{"tf":1.0},"512":{"tf":1.0},"92":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"342":{"tf":1.0}}}},"p":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"a":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":8,"docs":{"108":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"277":{"tf":1.0},"371":{"tf":1.0},"461":{"tf":1.0},"496":{"tf":1.0},"74":{"tf":1.0}}}},"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":29,"docs":{"100":{"tf":1.0},"314":{"tf":2.0},"316":{"tf":1.0},"319":{"tf":2.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"324":{"tf":3.7416573867739413},"326":{"tf":2.23606797749979},"330":{"tf":1.4142135623730951},"396":{"tf":1.4142135623730951},"398":{"tf":1.4142135623730951},"401":{"tf":1.0},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"407":{"tf":1.0},"467":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":2.23606797749979},"501":{"tf":1.0},"502":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"323":{"tf":1.0},"324":{"tf":1.0},"401":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"y":{"1":{"df":1,"docs":{"319":{"tf":1.0}}},"2":{"df":1,"docs":{"319":{"tf":1.0}}},"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":2,"docs":{"500":{"tf":1.7320508075688772},"99":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"500":{"tf":1.7320508075688772},"99":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"s":{"df":5,"docs":{"234":{"tf":1.4142135623730951},"395":{"tf":1.0},"460":{"tf":1.0},"465":{"tf":2.0},"494":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"150":{"tf":1.0},"65":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"250":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":12,"docs":{"151":{"tf":1.0},"258":{"tf":1.4142135623730951},"275":{"tf":1.0},"414":{"tf":1.0},"445":{"tf":1.0},"446":{"tf":1.4142135623730951},"485":{"tf":1.0},"486":{"tf":1.0},"487":{"tf":1.0},"53":{"tf":1.0},"63":{"tf":1.0},"92":{"tf":1.0}}}}},"df":1,"docs":{"161":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":54,"docs":{"105":{"tf":1.0},"109":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"147":{"tf":1.4142135623730951},"149":{"tf":1.0},"156":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.7320508075688772},"21":{"tf":1.4142135623730951},"212":{"tf":1.0},"238":{"tf":1.0},"263":{"tf":1.0},"285":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.7320508075688772},"334":{"tf":1.7320508075688772},"337":{"tf":1.0},"338":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.4142135623730951},"352":{"tf":1.0},"353":{"tf":2.0},"354":{"tf":2.8284271247461903},"356":{"tf":2.23606797749979},"357":{"tf":2.0},"359":{"tf":1.4142135623730951},"360":{"tf":1.0},"361":{"tf":1.7320508075688772},"393":{"tf":1.0},"431":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.0},"495":{"tf":1.0},"500":{"tf":1.0},"503":{"tf":1.0},"51":{"tf":1.0},"510":{"tf":1.0},"63":{"tf":1.0},"89":{"tf":1.4142135623730951},"90":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":17,"docs":{"237":{"tf":1.0},"261":{"tf":4.58257569495584},"262":{"tf":1.0},"263":{"tf":1.0},"277":{"tf":1.0},"293":{"tf":3.0},"303":{"tf":1.0},"321":{"tf":3.872983346207417},"322":{"tf":1.0},"323":{"tf":2.23606797749979},"324":{"tf":5.916079783099616},"325":{"tf":1.7320508075688772},"335":{"tf":1.0},"354":{"tf":2.23606797749979},"373":{"tf":1.0},"398":{"tf":3.3166247903554},"399":{"tf":1.7320508075688772}},"l":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"250":{"tf":2.6457513110645907},"356":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":18,"docs":{"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"344":{"tf":1.0},"48":{"tf":1.0},"55":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"371":{"tf":1.0}}}},"t":{"df":1,"docs":{"307":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":11,"docs":{"109":{"tf":1.0},"241":{"tf":1.0},"289":{"tf":1.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.7320508075688772},"359":{"tf":1.7320508075688772},"361":{"tf":1.4142135623730951},"90":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":74,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.0},"118":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.0},"137":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"198":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0},"271":{"tf":1.0},"274":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"278":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.4142135623730951},"356":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.4142135623730951},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"369":{"tf":1.0},"372":{"tf":1.0},"380":{"tf":1.4142135623730951},"381":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"396":{"tf":1.0},"402":{"tf":1.0},"407":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.0},"456":{"tf":1.0},"465":{"tf":1.4142135623730951},"47":{"tf":1.0},"473":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.0},"492":{"tf":2.0},"494":{"tf":1.7320508075688772},"499":{"tf":1.0},"51":{"tf":1.0},"515":{"tf":1.4142135623730951},"517":{"tf":1.0},"519":{"tf":1.0},"53":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.0},"63":{"tf":1.4142135623730951},"66":{"tf":1.4142135623730951},"73":{"tf":1.0},"89":{"tf":1.0},"99":{"tf":1.4142135623730951}}},"y":{"=":{"\'":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"469":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":10,"docs":{"105":{"tf":1.0},"129":{"tf":1.0},"251":{"tf":1.0},"321":{"tf":1.0},"330":{"tf":1.0},"365":{"tf":1.0},"401":{"tf":1.0},"404":{"tf":1.0},"49":{"tf":1.0},"68":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"266":{"tf":1.0},"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"113":{"tf":1.4142135623730951},"46":{"tf":1.0},"480":{"tf":1.0}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":17,"docs":{"102":{"tf":1.0},"120":{"tf":1.0},"130":{"tf":1.4142135623730951},"158":{"tf":1.0},"16":{"tf":1.0},"192":{"tf":1.0},"194":{"tf":1.0},"207":{"tf":1.4142135623730951},"24":{"tf":1.0},"252":{"tf":1.4142135623730951},"40":{"tf":1.0},"445":{"tf":1.0},"447":{"tf":1.0},"480":{"tf":1.0},"521":{"tf":1.0},"68":{"tf":1.0},"72":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"502":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":9,"docs":{"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"238":{"tf":2.23606797749979},"247":{"tf":2.0},"501":{"tf":1.0},"502":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":1,"docs":{"279":{"tf":1.0}},"p":{"df":1,"docs":{"121":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"372":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"372":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"238":{"tf":2.23606797749979},"241":{"tf":1.0},"391":{"tf":1.4142135623730951}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"241":{"tf":1.0},"251":{"tf":1.4142135623730951},"84":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"329":{"tf":1.4142135623730951}},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"46":{"tf":1.0}}}},"d":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"137":{"tf":1.7320508075688772},"143":{"tf":1.0},"157":{"tf":1.0},"333":{"tf":1.0}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"137":{"tf":1.0},"139":{"tf":1.0},"2":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"247":{"tf":1.0},"339":{"tf":1.0},"4":{"tf":1.7320508075688772},"479":{"tf":1.0},"503":{"tf":1.0},"504":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}},"i":{"df":3,"docs":{"130":{"tf":1.0},"498":{"tf":1.0},"68":{"tf":1.0}}},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":4,"docs":{"112":{"tf":1.0},"228":{"tf":1.0},"241":{"tf":1.0},"38":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"56":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"365":{"tf":1.0}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":6,"docs":{"189":{"tf":1.0},"259":{"tf":1.0},"357":{"tf":1.0},"38":{"tf":1.0},"44":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"120":{"tf":1.0},"238":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"230":{"tf":1.0},"463":{"tf":1.0},"511":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"5":{"tf":1.0}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":9,"docs":{"164":{"tf":1.0},"2":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"330":{"tf":1.0},"345":{"tf":1.0},"359":{"tf":1.0},"466":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"133":{"tf":1.0},"285":{"tf":1.0},"298":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"371":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"d":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"323":{"tf":1.0},"401":{"tf":1.0}}},"df":0,"docs":{}}}},"df":14,"docs":{"124":{"tf":1.0},"151":{"tf":1.0},"17":{"tf":1.0},"198":{"tf":1.0},"232":{"tf":1.0},"250":{"tf":1.0},"291":{"tf":1.0},"460":{"tf":1.0},"467":{"tf":1.0},"494":{"tf":1.0},"55":{"tf":1.4142135623730951},"72":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"142":{"tf":1.0},"90":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"75":{"tf":1.0}},"s":{"df":2,"docs":{"291":{"tf":1.4142135623730951},"324":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"233":{"tf":1.0},"234":{"tf":2.449489742783178},"241":{"tf":2.449489742783178},"465":{"tf":1.0}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":4,"docs":{"104":{"tf":1.0},"236":{"tf":1.0},"238":{"tf":1.0},"48":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"c":{"df":1,"docs":{"134":{"tf":1.0}},"t":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"115":{"tf":1.0}},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"134":{"tf":1.0},"473":{"tf":1.0},"500":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"264":{"tf":1.0},"324":{"tf":1.4142135623730951},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":32,"docs":{"100":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"212":{"tf":1.0},"218":{"tf":1.0},"225":{"tf":1.0},"23":{"tf":1.0},"233":{"tf":1.0},"25":{"tf":1.0},"252":{"tf":1.0},"264":{"tf":1.0},"311":{"tf":1.0},"314":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951},"324":{"tf":2.449489742783178},"347":{"tf":1.4142135623730951},"362":{"tf":1.0},"392":{"tf":1.0},"396":{"tf":1.0},"40":{"tf":1.0},"412":{"tf":1.0},"442":{"tf":1.0},"466":{"tf":1.0},"479":{"tf":1.4142135623730951},"480":{"tf":1.0},"486":{"tf":1.4142135623730951},"521":{"tf":1.0},"59":{"tf":1.0},"63":{"tf":1.0},"73":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"136":{"tf":1.0},"141":{"tf":1.0},"55":{"tf":1.0},"76":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"\\"":{"#":{"(":{"\\\\":{"df":0,"docs":{},"w":{"+":{")":{"\\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"\\\\":{"df":0,"docs":{},"w":{"+":{")":{":":{":":{"\\\\":{"df":0,"docs":{},"s":{"*":{"(":{"[":{"^":{"\\\\":{"df":0,"docs":{},"n":{"]":{"+":{")":{"\\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"\\\\":{"(":{"\\\\":{"(":{"(":{"[":{"^":{")":{"]":{"+":{")":{"\\\\":{")":{"\\\\":{")":{"\\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"\\\\":{"[":{"(":{"[":{"^":{"\\\\":{"]":{"]":{"+":{")":{"\\\\":{"]":{"\\\\":{"]":{"\\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"404":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"214":{"tf":1.0},"472":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"259":{"tf":1.0}}}}},"df":1,"docs":{"413":{"tf":1.0}}}}},"df":0,"docs":{}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":12,"docs":{"341":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.0},"344":{"tf":1.0},"383":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"409":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"494":{"tf":1.0},"73":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"t":{"df":30,"docs":{"101":{"tf":1.0},"108":{"tf":1.0},"114":{"tf":1.0},"116":{"tf":1.0},"129":{"tf":1.0},"142":{"tf":1.0},"144":{"tf":1.0},"200":{"tf":1.0},"217":{"tf":1.0},"234":{"tf":1.4142135623730951},"246":{"tf":1.0},"251":{"tf":1.0},"258":{"tf":1.0},"261":{"tf":1.0},"318":{"tf":1.0},"350":{"tf":1.0},"36":{"tf":1.4142135623730951},"458":{"tf":1.0},"461":{"tf":1.7320508075688772},"466":{"tf":1.0},"473":{"tf":1.0},"493":{"tf":1.0},"495":{"tf":1.7320508075688772},"512":{"tf":1.7320508075688772},"518":{"tf":1.7320508075688772},"56":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"79":{"tf":1.0},"97":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":9,"docs":{"111":{"tf":1.0},"137":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"238":{"tf":1.0},"250":{"tf":1.7320508075688772},"493":{"tf":1.4142135623730951},"495":{"tf":2.0},"56":{"tf":1.0},"79":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":35,"docs":{"105":{"tf":1.0},"111":{"tf":1.4142135623730951},"137":{"tf":1.0},"142":{"tf":1.0},"144":{"tf":1.7320508075688772},"151":{"tf":1.0},"199":{"tf":2.0},"201":{"tf":1.4142135623730951},"231":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"261":{"tf":1.0},"27":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"404":{"tf":1.0},"49":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":2.23606797749979},"512":{"tf":1.4142135623730951},"53":{"tf":1.0},"56":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"78":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":5,"docs":{"164":{"tf":1.0},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"184":{"tf":1.0},"448":{"tf":1.0}}}},"df":0,"docs":{},"v":{"df":7,"docs":{"101":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.4142135623730951},"27":{"tf":1.0},"371":{"tf":1.0},"466":{"tf":1.0},"53":{"tf":1.0}}}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"231":{"tf":1.0},"289":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"a":{"d":{"df":3,"docs":{"2":{"tf":1.4142135623730951},"285":{"tf":1.0},"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"324":{"tf":2.0},"328":{"tf":1.0},"413":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":4,"docs":{"115":{"tf":1.0},"142":{"tf":1.0},"207":{"tf":1.0},"480":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"v":{"df":4,"docs":{"156":{"tf":1.0},"193":{"tf":1.7320508075688772},"257":{"tf":1.0},"8":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"280":{"tf":1.0},"296":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"276":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"329":{"tf":1.0}},"e":{"d":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}}}},"[":{"0":{"]":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"329":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"234":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"122":{"tf":1.0},"236":{"tf":1.0},"48":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"502":{"tf":1.4142135623730951},"98":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":7,"docs":{"143":{"tf":1.0},"199":{"tf":1.0},"291":{"tf":1.0},"449":{"tf":1.0},"495":{"tf":1.0},"56":{"tf":1.0},"83":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"226":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":7,"docs":{"111":{"tf":1.0},"164":{"tf":1.4142135623730951},"46":{"tf":1.0},"463":{"tf":1.0},"55":{"tf":1.0},"75":{"tf":1.4142135623730951},"81":{"tf":1.0}}},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"405":{"tf":1.0}}}}}}}}},"q":{"/":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":15,"docs":{"275":{"tf":1.0},"46":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.4142135623730951},"501":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"514":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":41,"docs":{"10":{"tf":1.0},"161":{"tf":1.0},"200":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.0},"287":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"298":{"tf":1.0},"314":{"tf":1.0},"321":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.4142135623730951},"337":{"tf":1.0},"338":{"tf":1.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"372":{"tf":1.4142135623730951},"375":{"tf":1.0},"383":{"tf":1.0},"385":{"tf":1.0},"387":{"tf":1.0},"396":{"tf":1.0},"405":{"tf":1.0},"460":{"tf":1.4142135623730951},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"498":{"tf":1.0},"499":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"80":{"tf":1.0},"88":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"317":{"tf":1.0},"501":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"339":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"372":{"tf":1.0},"381":{"tf":1.0},"496":{"tf":1.0},"57":{"tf":1.0}}}},"v":{"df":3,"docs":{"136":{"tf":1.0},"371":{"tf":1.0},"384":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":9,"docs":{"258":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"45":{"tf":1.0},"486":{"tf":1.0},"487":{"tf":1.0},"503":{"tf":1.4142135623730951},"522":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"191":{"tf":1.0},"475":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":14,"docs":{"234":{"tf":1.7320508075688772},"275":{"tf":1.0},"289":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"515":{"tf":1.0}}}}}},"t":{"df":8,"docs":{"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.8284271247461903},"324":{"tf":2.6457513110645907},"460":{"tf":2.0},"465":{"tf":1.0},"73":{"tf":1.0},"83":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{")":{":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"1":{"df":1,"docs":{"492":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"b":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"a":{"df":0,"docs":{},"p":{"[":{"0":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"<":{"&":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"<":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":2,"docs":{"133":{"tf":1.0},"354":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"139":{"tf":1.0}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}}},"df":0,"docs":{}}},"k":{"b":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"293":{"tf":1.0},"303":{"tf":1.0},"354":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"324":{"tf":1.0},"335":{"tf":1.0}}}}},"t":{"df":3,"docs":{"153":{"tf":1.0},"231":{"tf":1.0},"496":{"tf":1.0}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"75":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"&":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"f":{"3":{"2":{"df":2,"docs":{"263":{"tf":1.0},"354":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":37,"docs":{"104":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"129":{"tf":1.0},"142":{"tf":1.0},"200":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":1.7320508075688772},"244":{"tf":1.0},"262":{"tf":1.4142135623730951},"272":{"tf":1.0},"275":{"tf":1.4142135623730951},"28":{"tf":1.0},"291":{"tf":1.0},"324":{"tf":4.123105625617661},"325":{"tf":2.0},"369":{"tf":1.0},"373":{"tf":1.0},"380":{"tf":1.0},"461":{"tf":1.0},"478":{"tf":1.0},"492":{"tf":1.7320508075688772},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.7320508075688772},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.4142135623730951},"501":{"tf":1.4142135623730951},"502":{"tf":1.0},"77":{"tf":1.0},"88":{"tf":1.4142135623730951},"90":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"325":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"258":{"tf":1.0},"496":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":8,"docs":{"120":{"tf":1.0},"303":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"380":{"tf":1.0},"493":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"90":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"104":{"tf":1.0},"196":{"tf":1.0},"55":{"tf":1.0},"75":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"125":{"tf":1.0},"251":{"tf":1.0},"337":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":21,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"238":{"tf":1.4142135623730951},"239":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"251":{"tf":1.0},"330":{"tf":1.0},"371":{"tf":1.0},"413":{"tf":1.0},"463":{"tf":1.0},"465":{"tf":1.0},"467":{"tf":1.0},"472":{"tf":1.0},"52":{"tf":1.0},"60":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.4142135623730951},"98":{"tf":1.0}}}},"s":{"df":3,"docs":{"348":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0}}}}}},"f":{"df":1,"docs":{"193":{"tf":1.4142135623730951}}},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{},"g":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"354":{"tf":1.0}}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"352":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":6,"docs":{"263":{"tf":1.0},"353":{"tf":1.7320508075688772},"354":{"tf":1.7320508075688772},"358":{"tf":1.0},"360":{"tf":1.0},"362":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"263":{"tf":1.0},"354":{"tf":1.4142135623730951},"360":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"39":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"352":{"tf":1.0}}}}},"m":{"df":1,"docs":{"193":{"tf":1.4142135623730951}}},"o":{"a":{"d":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":7,"docs":{"140":{"tf":1.0},"177":{"tf":2.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.4142135623730951},"190":{"tf":1.4142135623730951},"324":{"tf":1.0},"5":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"100":{"tf":1.0},"314":{"tf":1.0},"330":{"tf":1.0},"396":{"tf":1.0},"407":{"tf":1.0},"460":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"p":{"c":{"df":5,"docs":{"258":{"tf":1.0},"275":{"tf":1.4142135623730951},"487":{"tf":1.0},"514":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":5,"docs":{"287":{"tf":1.0},"316":{"tf":1.0},"74":{"tf":1.0},"88":{"tf":1.0},"96":{"tf":1.0}}}},"n":{"df":13,"docs":{"155":{"tf":1.0},"173":{"tf":1.4142135623730951},"175":{"tf":2.0},"179":{"tf":1.0},"190":{"tf":1.0},"194":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"309":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"367":{"tf":1.0},"489":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":17,"docs":{"134":{"tf":1.7320508075688772},"147":{"tf":1.4142135623730951},"157":{"tf":1.0},"19":{"tf":1.0},"267":{"tf":1.4142135623730951},"285":{"tf":1.0},"296":{"tf":1.0},"301":{"tf":1.0},"332":{"tf":1.4142135623730951},"333":{"tf":1.7320508075688772},"334":{"tf":1.0},"335":{"tf":1.0},"337":{"tf":1.0},"339":{"tf":1.0},"346":{"tf":1.4142135623730951},"79":{"tf":1.0},"98":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"\'":{"df":3,"docs":{"316":{"tf":1.0},"502":{"tf":1.0},"98":{"tf":1.0}}},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"209":{"tf":1.0},"219":{"tf":1.0},"237":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{",":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"197":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"202":{"tf":1.0},"270":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"496":{"tf":1.0}}}}}}}},":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"1":{"df":1,"docs":{"493":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":63,"docs":{"110":{"tf":1.0},"153":{"tf":1.0},"161":{"tf":1.0},"189":{"tf":1.0},"195":{"tf":1.0},"197":{"tf":1.4142135623730951},"200":{"tf":1.0},"202":{"tf":1.7320508075688772},"203":{"tf":1.0},"205":{"tf":1.0},"208":{"tf":1.0},"213":{"tf":1.4142135623730951},"217":{"tf":1.0},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":2.0},"255":{"tf":1.0},"257":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.4142135623730951},"27":{"tf":1.0},"270":{"tf":1.0},"275":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"301":{"tf":1.0},"309":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0},"329":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.7320508075688772},"339":{"tf":1.0},"34":{"tf":1.0},"454":{"tf":1.0},"455":{"tf":2.0},"457":{"tf":1.4142135623730951},"461":{"tf":2.0},"463":{"tf":1.4142135623730951},"469":{"tf":1.0},"470":{"tf":1.4142135623730951},"492":{"tf":2.0},"493":{"tf":1.0},"496":{"tf":1.4142135623730951},"502":{"tf":1.0},"519":{"tf":1.0},"52":{"tf":1.0},"523":{"tf":1.0},"55":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.7320508075688772},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"77":{"tf":1.0},"84":{"tf":1.4142135623730951},"92":{"tf":1.0},"96":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"189":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"238":{"tf":1.0},"247":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":13,"docs":{"134":{"tf":1.4142135623730951},"151":{"tf":1.0},"157":{"tf":1.0},"237":{"tf":1.0},"247":{"tf":1.0},"267":{"tf":1.0},"301":{"tf":1.0},"321":{"tf":1.0},"330":{"tf":1.0},"332":{"tf":1.0},"404":{"tf":1.0},"411":{"tf":1.0},"63":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":6,"docs":{"200":{"tf":1.0},"231":{"tf":1.0},"247":{"tf":1.0},"285":{"tf":1.0},"337":{"tf":1.0},"96":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":11,"docs":{"110":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"122":{"tf":1.0},"236":{"tf":1.0},"243":{"tf":1.7320508075688772},"247":{"tf":1.0},"269":{"tf":1.0},"299":{"tf":1.0},"357":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"140":{"tf":1.0},"357":{"tf":1.0}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"280":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"361":{"tf":1.0},"391":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":3,"docs":{"238":{"tf":1.0},"278":{"tf":1.0},"369":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"l":{"df":20,"docs":{"162":{"tf":1.0},"198":{"tf":1.0},"255":{"tf":1.0},"262":{"tf":1.0},"281":{"tf":1.0},"289":{"tf":1.0},"300":{"tf":1.0},"350":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"369":{"tf":1.0},"371":{"tf":1.0},"456":{"tf":1.0},"494":{"tf":1.0},"57":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":5,"docs":{"135":{"tf":1.0},"289":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"365":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"48":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"228":{"tf":1.0},"302":{"tf":1.0}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"179":{"tf":1.0}}}}}}}},"df":41,"docs":{"109":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"140":{"tf":1.0},"147":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.0},"170":{"tf":1.0},"179":{"tf":1.4142135623730951},"19":{"tf":1.0},"250":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"285":{"tf":1.4142135623730951},"287":{"tf":1.0},"304":{"tf":1.0},"311":{"tf":1.4142135623730951},"322":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":2.0},"335":{"tf":1.0},"337":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"345":{"tf":1.0},"407":{"tf":1.0},"411":{"tf":1.0},"421":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"51":{"tf":1.0},"63":{"tf":1.0},"89":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.0}}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"345":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"*":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"b":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":3,"docs":{"287":{"tf":1.0},"304":{"tf":1.0},"327":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"288":{"tf":1.0},"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"290":{"tf":1.0},"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"{":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{",":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{",":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"}":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":3,"docs":{"266":{"tf":1.0},"334":{"tf":1.0},"345":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":5,"docs":{"269":{"tf":1.4142135623730951},"369":{"tf":1.4142135623730951},"86":{"tf":1.0},"87":{"tf":1.0},"98":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"d":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"a":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":2,"docs":{"273":{"tf":1.0},"492":{"tf":1.7320508075688772}}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"65":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":8,"docs":{"155":{"tf":1.0},"162":{"tf":1.0},"179":{"tf":1.0},"214":{"tf":1.0},"255":{"tf":1.0},"259":{"tf":1.4142135623730951},"444":{"tf":1.0},"66":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"k":{"b":{"df":3,"docs":{"179":{"tf":1.0},"204":{"tf":1.0},"214":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"302":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{}}},"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"219":{"tf":1.0},"60":{"tf":1.0}}}},"df":0,"docs":{}},"df":43,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.4142135623730951},"114":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"142":{"tf":1.4142135623730951},"144":{"tf":1.0},"2":{"tf":1.0},"200":{"tf":3.0},"21":{"tf":1.0},"210":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"238":{"tf":1.0},"247":{"tf":1.0},"251":{"tf":1.0},"257":{"tf":1.4142135623730951},"272":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":2.0},"281":{"tf":1.4142135623730951},"308":{"tf":1.0},"349":{"tf":1.0},"350":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.4142135623730951},"436":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.0},"473":{"tf":1.0},"478":{"tf":1.4142135623730951},"480":{"tf":1.0},"492":{"tf":2.0},"500":{"tf":1.0},"502":{"tf":1.0},"517":{"tf":1.0},"53":{"tf":1.0},"63":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":2.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"178":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.4142135623730951},"292":{"tf":1.0},"334":{"tf":1.0},"369":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"287":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":3,"docs":{"127":{"tf":1.0},"130":{"tf":1.0},"391":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"14":{"tf":1.0},"32":{"tf":1.7320508075688772}}}}}},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"110":{"tf":1.0},"122":{"tf":1.0},"137":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"280":{"tf":1.0},"377":{"tf":1.0},"462":{"tf":2.0},"463":{"tf":1.0},"500":{"tf":1.0},"74":{"tf":1.0},"87":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":17,"docs":{"100":{"tf":1.0},"102":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"195":{"tf":1.0},"212":{"tf":1.0},"217":{"tf":1.0},"241":{"tf":1.0},"30":{"tf":1.0},"311":{"tf":1.0},"318":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"502":{"tf":1.0},"521":{"tf":1.0},"98":{"tf":1.0}},"n":{"df":2,"docs":{"118":{"tf":1.0},"247":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"306":{"tf":1.0},"354":{"tf":1.4142135623730951},"360":{"tf":1.0},"73":{"tf":1.0}}}},"df":0,"docs":{}},"f":{".":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"323":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951}},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"323":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"354":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"354":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"149":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"(":{"\\"":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"325":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"354":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},":":{":":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"\\"":{".":{"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"&":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"303":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":15,"docs":{"133":{"tf":1.0},"134":{"tf":1.0},"267":{"tf":1.0},"285":{"tf":1.0},"300":{"tf":1.0},"323":{"tf":1.4142135623730951},"324":{"tf":3.1622776601683795},"325":{"tf":1.7320508075688772},"332":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"354":{"tf":1.0},"359":{"tf":1.0},"65":{"tf":1.0},"90":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":32,"docs":{"105":{"tf":1.0},"108":{"tf":1.0},"129":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.4142135623730951},"142":{"tf":1.4142135623730951},"156":{"tf":1.0},"200":{"tf":1.7320508075688772},"21":{"tf":1.0},"210":{"tf":1.0},"238":{"tf":1.0},"247":{"tf":1.0},"251":{"tf":1.0},"257":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"302":{"tf":1.4142135623730951},"308":{"tf":1.0},"349":{"tf":1.0},"350":{"tf":1.4142135623730951},"361":{"tf":1.0},"436":{"tf":1.0},"454":{"tf":1.0},"473":{"tf":1.0},"49":{"tf":1.0},"492":{"tf":2.0},"517":{"tf":1.4142135623730951},"53":{"tf":1.0},"63":{"tf":1.0},"90":{"tf":1.4142135623730951}},"i":{"c":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"461":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"n":{"d":{"df":4,"docs":{"262":{"tf":1.0},"263":{"tf":1.0},"354":{"tf":1.0},"493":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":4,"docs":{"135":{"tf":1.0},"342":{"tf":1.0},"356":{"tf":1.0},"65":{"tf":1.0}}}}},"t":{"df":1,"docs":{"352":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":4,"docs":{"334":{"tf":1.0},"341":{"tf":1.0},"409":{"tf":1.0},"466":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"144":{"tf":1.0}}}}}}}},"r":{"d":{"df":8,"docs":{"134":{"tf":1.0},"267":{"tf":1.0},"280":{"tf":1.0},"285":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"333":{"tf":1.0},"335":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"293":{"tf":1.0},"324":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"303":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"293":{"tf":1.0},"335":{"tf":1.0}}}}}},"s":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"139":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"267":{"tf":1.0},"335":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"238":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"335":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":8,"docs":{"100":{"tf":1.0},"293":{"tf":1.4142135623730951},"322":{"tf":1.0},"324":{"tf":2.449489742783178},"329":{"tf":1.0},"400":{"tf":1.0},"407":{"tf":1.0},"97":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"322":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"97":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"v":{"df":14,"docs":{"10":{"tf":1.0},"174":{"tf":1.4142135623730951},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"205":{"tf":1.0},"257":{"tf":1.0},"337":{"tf":1.0},"43":{"tf":1.4142135623730951},"449":{"tf":1.0},"475":{"tf":1.0},"489":{"tf":1.4142135623730951},"490":{"tf":1.0},"6":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":25,"docs":{"165":{"tf":1.0},"174":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"184":{"tf":1.0},"191":{"tf":1.0},"2":{"tf":1.0},"205":{"tf":1.4142135623730951},"234":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"358":{"tf":1.0},"367":{"tf":1.0},"372":{"tf":1.0},"446":{"tf":1.0},"448":{"tf":1.4142135623730951},"475":{"tf":1.0},"486":{"tf":1.0},"487":{"tf":1.0},"488":{"tf":1.0},"489":{"tf":1.0},"514":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"92":{"tf":1.0}}}},"i":{"c":{"df":2,"docs":{"111":{"tf":1.0},"250":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":10,"docs":{"159":{"tf":1.0},"171":{"tf":1.4142135623730951},"182":{"tf":1.0},"190":{"tf":1.0},"213":{"tf":1.4142135623730951},"285":{"tf":1.0},"324":{"tf":1.0},"332":{"tf":1.0},"422":{"tf":1.0},"64":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":14,"docs":{"168":{"tf":1.0},"176":{"tf":1.0},"18":{"tf":1.7320508075688772},"180":{"tf":1.0},"234":{"tf":1.0},"244":{"tf":1.0},"26":{"tf":1.0},"338":{"tf":1.0},"345":{"tf":1.0},"357":{"tf":1.0},"372":{"tf":1.0},"447":{"tf":1.0},"479":{"tf":1.0},"524":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"/":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"496":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":39,"docs":{"101":{"tf":1.4142135623730951},"105":{"tf":1.0},"110":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"144":{"tf":1.0},"171":{"tf":2.8284271247461903},"193":{"tf":1.4142135623730951},"213":{"tf":2.6457513110645907},"231":{"tf":1.0},"244":{"tf":3.1622776601683795},"251":{"tf":1.0},"269":{"tf":1.0},"274":{"tf":1.0},"332":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"368":{"tf":2.0},"369":{"tf":2.8284271247461903},"371":{"tf":2.0},"372":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"380":{"tf":1.4142135623730951},"381":{"tf":1.0},"383":{"tf":1.4142135623730951},"388":{"tf":1.0},"391":{"tf":1.4142135623730951},"467":{"tf":1.0},"49":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.4142135623730951},"508":{"tf":1.0},"509":{"tf":1.0},"57":{"tf":1.4142135623730951},"60":{"tf":1.0},"74":{"tf":1.7320508075688772},"82":{"tf":1.0},"87":{"tf":1.7320508075688772},"88":{"tf":1.4142135623730951}}}}},"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}},"o":{"df":0,"docs":{},"w":{"df":14,"docs":{"116":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"173":{"tf":1.0},"201":{"tf":2.0},"214":{"tf":1.0},"228":{"tf":1.0},"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"247":{"tf":1.0},"250":{"tf":1.0},"257":{"tf":1.0},"300":{"tf":1.0},"36":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"39":{"tf":1.0},"514":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":9,"docs":{"246":{"tf":1.0},"273":{"tf":1.7320508075688772},"308":{"tf":1.0},"360":{"tf":1.0},"4":{"tf":1.0},"466":{"tf":1.0},"49":{"tf":1.0},"492":{"tf":1.7320508075688772},"90":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"290":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":5,"docs":{"200":{"tf":1.0},"252":{"tf":1.0},"322":{"tf":1.0},"333":{"tf":1.0},"67":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"241":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":7,"docs":{"105":{"tf":1.0},"244":{"tf":1.0},"324":{"tf":1.0},"351":{"tf":1.0},"502":{"tf":1.0},"86":{"tf":1.0},"98":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"e":{"df":2,"docs":{"279":{"tf":1.0},"338":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"498":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"324":{"tf":1.0}}}}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"115":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"104":{"tf":1.0},"357":{"tf":1.0},"465":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":20,"docs":{"133":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"146":{"tf":1.0},"157":{"tf":1.0},"182":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"333":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":2.0},"356":{"tf":1.0},"359":{"tf":1.0},"365":{"tf":1.4142135623730951},"371":{"tf":1.0},"375":{"tf":1.0},"466":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"334":{"tf":1.0},"338":{"tf":1.0},"343":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"104":{"tf":1.0},"48":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"375":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"df":19,"docs":{"104":{"tf":1.7320508075688772},"105":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"125":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"251":{"tf":1.4142135623730951},"49":{"tf":1.0},"494":{"tf":1.0},"55":{"tf":1.0},"75":{"tf":2.0}}}},"v":{"df":12,"docs":{"104":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":1.0},"122":{"tf":1.0},"228":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"246":{"tf":1.0},"48":{"tf":1.0},"75":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"(":{"(":{"_":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"324":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"149":{"tf":1.0}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":2.6457513110645907}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"i":{"d":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{":":{":":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"324":{"tf":1.0}},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"324":{"tf":1.4142135623730951},"329":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"115":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"250":{"tf":1.0}},"e":{"\'":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":17,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"164":{"tf":1.0},"244":{"tf":1.0},"285":{"tf":1.0},"323":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0},"399":{"tf":1.0},"413":{"tf":1.0},"446":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.7320508075688772},"521":{"tf":1.0},"80":{"tf":1.0},"83":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"502":{"tf":1.4142135623730951},"98":{"tf":1.0}}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"98":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"134":{"tf":1.0},"45":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":30,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"110":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"218":{"tf":1.0},"25":{"tf":1.0},"269":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"324":{"tf":1.0},"325":{"tf":1.0},"332":{"tf":1.0},"337":{"tf":1.0},"338":{"tf":1.0},"347":{"tf":1.0},"369":{"tf":1.0},"377":{"tf":1.0},"470":{"tf":1.0},"492":{"tf":1.0},"504":{"tf":1.0},"506":{"tf":1.0},"512":{"tf":1.0},"521":{"tf":1.0},"57":{"tf":1.0},"74":{"tf":1.0},"79":{"tf":1.0},"86":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"500":{"tf":1.0},"98":{"tf":1.7320508075688772}}}}}}},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"385":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"334":{"tf":1.0}}}}},"x":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"237":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{"df":1,"docs":{"264":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"4":{"2":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"f":{"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"189":{"tf":1.0},"338":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":2,"docs":{"339":{"tf":1.0},"96":{"tf":1.0}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"128":{"tf":1.0},"27":{"tf":1.0}}}}},"r":{"d":{"df":16,"docs":{"110":{"tf":1.0},"122":{"tf":1.0},"140":{"tf":1.4142135623730951},"209":{"tf":1.0},"213":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"36":{"tf":1.0},"514":{"tf":1.0},"525":{"tf":1.0},"55":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.4142135623730951},"87":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"76":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":26,"docs":{"102":{"tf":1.4142135623730951},"130":{"tf":1.7320508075688772},"140":{"tf":1.0},"158":{"tf":1.4142135623730951},"16":{"tf":1.0},"174":{"tf":1.0},"177":{"tf":2.0},"186":{"tf":1.0},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"194":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.0},"202":{"tf":1.7320508075688772},"203":{"tf":1.0},"205":{"tf":1.4142135623730951},"217":{"tf":1.0},"226":{"tf":1.0},"238":{"tf":1.4142135623730951},"252":{"tf":1.4142135623730951},"257":{"tf":1.0},"371":{"tf":1.0},"451":{"tf":1.4142135623730951},"489":{"tf":1.0},"521":{"tf":1.0},"68":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"339":{"tf":1.0},"357":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"352":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"314":{"tf":1.0}}}}}}},"i":{"c":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"214":{"tf":1.0},"259":{"tf":1.0}}}}},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":2,"docs":{"214":{"tf":1.0},"259":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":23,"docs":{"100":{"tf":1.4142135623730951},"202":{"tf":1.0},"208":{"tf":1.0},"234":{"tf":1.4142135623730951},"250":{"tf":1.7320508075688772},"261":{"tf":1.0},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"324":{"tf":3.3166247903554},"326":{"tf":1.4142135623730951},"331":{"tf":1.0},"349":{"tf":1.0},"364":{"tf":1.0},"395":{"tf":1.0},"398":{"tf":1.4142135623730951},"407":{"tf":1.0},"460":{"tf":1.0},"461":{"tf":1.0},"465":{"tf":1.0},"494":{"tf":1.4142135623730951},"500":{"tf":2.0},"73":{"tf":1.0},"96":{"tf":1.0}},"s":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"327":{"tf":1.0}}}}},"y":{"df":1,"docs":{"323":{"tf":1.0}}}},"d":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"337":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"337":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"(":{"\\"":{"df":0,"docs":{},"k":{"b":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"303":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{"df":1,"docs":{"354":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"139":{"tf":1.4142135623730951},"293":{"tf":1.0},"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":4,"docs":{"174":{"tf":1.0},"191":{"tf":1.0},"258":{"tf":1.0},"489":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"231":{"tf":1.0},"334":{"tf":1.0},"343":{"tf":1.0}}}}}},"p":{"df":25,"docs":{"102":{"tf":1.0},"158":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"211":{"tf":1.0},"252":{"tf":1.0},"282":{"tf":1.0},"330":{"tf":1.0},"396":{"tf":1.0},"448":{"tf":1.0},"449":{"tf":1.0},"450":{"tf":1.0},"451":{"tf":1.0},"452":{"tf":1.0},"479":{"tf":1.0},"68":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"322":{"tf":1.0},"404":{"tf":1.0},"465":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"122":{"tf":1.0},"130":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":78,"docs":{"100":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":2.23606797749979},"140":{"tf":2.0},"151":{"tf":1.0},"162":{"tf":1.0},"167":{"tf":1.4142135623730951},"178":{"tf":1.0},"198":{"tf":1.4142135623730951},"20":{"tf":1.7320508075688772},"217":{"tf":1.0},"231":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"269":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"278":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.4142135623730951},"285":{"tf":1.0},"287":{"tf":1.7320508075688772},"288":{"tf":1.0},"289":{"tf":1.7320508075688772},"291":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.7320508075688772},"298":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"300":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.7320508075688772},"312":{"tf":1.0},"314":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"330":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.4142135623730951},"368":{"tf":1.0},"369":{"tf":2.0},"372":{"tf":1.4142135623730951},"373":{"tf":2.23606797749979},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"387":{"tf":1.0},"392":{"tf":1.0},"396":{"tf":1.0},"401":{"tf":1.0},"405":{"tf":1.0},"410":{"tf":1.0},"425":{"tf":1.0},"426":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"456":{"tf":1.7320508075688772},"463":{"tf":1.0},"49":{"tf":1.0},"494":{"tf":2.0},"51":{"tf":1.4142135623730951},"55":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"86":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"333":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":4,"docs":{"266":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"334":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":3,"docs":{"287":{"tf":1.4142135623730951},"295":{"tf":1.0},"300":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"d":{"b":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":14,"docs":{"100":{"tf":1.0},"142":{"tf":1.0},"323":{"tf":1.4142135623730951},"357":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"405":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0},"411":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"89":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":22,"docs":{"156":{"tf":1.0},"20":{"tf":1.0},"236":{"tf":1.0},"238":{"tf":1.0},"249":{"tf":1.0},"269":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.0},"331":{"tf":1.0},"349":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.4142135623730951},"369":{"tf":1.4142135623730951},"381":{"tf":1.0},"401":{"tf":1.0},"413":{"tf":1.0},"429":{"tf":1.0}}}}}}},"df":8,"docs":{"146":{"tf":1.0},"262":{"tf":1.4142135623730951},"263":{"tf":1.0},"322":{"tf":1.0},"324":{"tf":3.605551275463989},"325":{"tf":1.0},"354":{"tf":2.0},"373":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"144":{"tf":1.0},"261":{"tf":1.0},"495":{"tf":2.0}}}}}}},"i":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"290":{"tf":1.0},"308":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":26,"docs":{"100":{"tf":1.0},"261":{"tf":2.6457513110645907},"314":{"tf":1.0},"321":{"tf":2.0},"322":{"tf":1.7320508075688772},"323":{"tf":1.7320508075688772},"324":{"tf":3.872983346207417},"326":{"tf":2.0},"327":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.7320508075688772},"354":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.7320508075688772},"399":{"tf":1.0},"401":{"tf":1.0},"410":{"tf":1.0},"492":{"tf":1.7320508075688772},"493":{"tf":2.23606797749979},"494":{"tf":2.449489742783178},"495":{"tf":1.7320508075688772},"496":{"tf":1.4142135623730951},"498":{"tf":1.7320508075688772},"500":{"tf":2.0},"511":{"tf":1.0},"512":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":16,"docs":{"138":{"tf":1.0},"261":{"tf":1.7320508075688772},"264":{"tf":1.0},"267":{"tf":1.0},"293":{"tf":1.4142135623730951},"321":{"tf":1.7320508075688772},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":2.449489742783178},"330":{"tf":1.0},"335":{"tf":1.7320508075688772},"354":{"tf":1.4142135623730951},"379":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.0},"407":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":37,"docs":{"100":{"tf":1.7320508075688772},"110":{"tf":1.0},"111":{"tf":1.0},"137":{"tf":1.0},"14":{"tf":1.0},"155":{"tf":1.0},"196":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"247":{"tf":1.4142135623730951},"277":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"314":{"tf":1.0},"317":{"tf":1.0},"321":{"tf":1.7320508075688772},"322":{"tf":1.0},"323":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"330":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"36":{"tf":1.0},"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.4142135623730951},"466":{"tf":1.4142135623730951},"47":{"tf":1.0},"49":{"tf":1.0},"64":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.0},"94":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"b":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":4,"docs":{"314":{"tf":1.0},"324":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}}}},"u":{"b":{"df":1,"docs":{"234":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"383":{"tf":2.0}}}}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"346":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0},"77":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"361":{"tf":1.0},"493":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"142":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"53":{"tf":1.0},"61":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"231":{"tf":1.0},"463":{"tf":1.0},"480":{"tf":1.4142135623730951}},"i":{"df":8,"docs":{"251":{"tf":1.0},"258":{"tf":1.0},"330":{"tf":1.0},"463":{"tf":1.0},"472":{"tf":1.0},"511":{"tf":1.4142135623730951},"76":{"tf":1.0},"96":{"tf":1.0}}},"y":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":5,"docs":{"31":{"tf":1.0},"32":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"329":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"d":{"df":6,"docs":{"101":{"tf":1.0},"199":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.4142135623730951},"56":{"tf":1.0},"83":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":25,"docs":{"100":{"tf":1.0},"12":{"tf":1.4142135623730951},"167":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"330":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.4142135623730951},"338":{"tf":1.0},"350":{"tf":1.0},"365":{"tf":1.4142135623730951},"388":{"tf":1.0},"394":{"tf":1.0},"397":{"tf":1.0},"404":{"tf":1.0},"494":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"85":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"327":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"d":{"b":{"df":1,"docs":{"333":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"222":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"d":{"b":{",":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"166":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"162":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},":":{"/":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"377":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"377":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":62,"docs":{"100":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.0},"151":{"tf":1.0},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":2.0},"176":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.0},"190":{"tf":1.7320508075688772},"198":{"tf":1.4142135623730951},"20":{"tf":1.0},"214":{"tf":1.0},"217":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":2.0},"255":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"269":{"tf":1.4142135623730951},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.4142135623730951},"322":{"tf":1.0},"323":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.0},"367":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"369":{"tf":2.23606797749979},"371":{"tf":2.0},"372":{"tf":1.4142135623730951},"376":{"tf":1.4142135623730951},"377":{"tf":1.4142135623730951},"379":{"tf":1.4142135623730951},"380":{"tf":1.4142135623730951},"388":{"tf":1.4142135623730951},"390":{"tf":1.0},"392":{"tf":1.0},"401":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.0},"427":{"tf":1.0},"456":{"tf":1.7320508075688772},"463":{"tf":1.0},"49":{"tf":1.0},"494":{"tf":2.23606797749979},"55":{"tf":1.0},"57":{"tf":1.0},"63":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"87":{"tf":1.0},"98":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"262":{"tf":1.0},"373":{"tf":1.0},"392":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":3,"docs":{"177":{"tf":1.4142135623730951},"179":{"tf":1.0},"190":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"241":{"tf":1.0}}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"g":{"df":2,"docs":{"27":{"tf":1.0},"40":{"tf":1.0}}}},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"138":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"120":{"tf":1.0},"133":{"tf":1.0},"247":{"tf":1.4142135623730951},"353":{"tf":1.0},"361":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"n":{"c":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":2,"docs":{"214":{"tf":1.0},"259":{"tf":1.0}}}}},"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"266":{"tf":1.0},"293":{"tf":1.0}}}}}}}},"df":33,"docs":{"20":{"tf":1.0},"214":{"tf":1.0},"257":{"tf":1.4142135623730951},"259":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.7320508075688772},"281":{"tf":1.0},"289":{"tf":1.7320508075688772},"293":{"tf":1.0},"299":{"tf":1.4142135623730951},"323":{"tf":1.0},"330":{"tf":1.0},"354":{"tf":1.0},"366":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":2.0},"371":{"tf":1.0},"372":{"tf":2.6457513110645907},"376":{"tf":1.0},"378":{"tf":1.0},"384":{"tf":1.4142135623730951},"388":{"tf":1.0},"389":{"tf":1.7320508075688772},"391":{"tf":1.7320508075688772},"392":{"tf":1.0},"405":{"tf":1.4142135623730951},"429":{"tf":1.0},"49":{"tf":1.0},"493":{"tf":1.0},"66":{"tf":1.0},"87":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"384":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":5,"docs":{"333":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"341":{"tf":1.0},"346":{"tf":1.0},"469":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":20,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"138":{"tf":1.4142135623730951},"158":{"tf":1.0},"17":{"tf":1.0},"22":{"tf":1.0},"254":{"tf":1.0},"265":{"tf":1.0},"27":{"tf":1.0},"276":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"331":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"342":{"tf":1.0},"368":{"tf":1.0},"437":{"tf":1.0},"47":{"tf":1.0},"502":{"tf":1.4142135623730951}},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"100":{"tf":1.0},"323":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"401":{"tf":1.0},"407":{"tf":1.0}}}},"df":0,"docs":{},"g":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":44,"docs":{"100":{"tf":1.4142135623730951},"111":{"tf":1.0},"137":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.0},"197":{"tf":1.4142135623730951},"202":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"209":{"tf":1.0},"214":{"tf":1.0},"219":{"tf":2.23606797749979},"237":{"tf":1.0},"238":{"tf":1.0},"261":{"tf":1.0},"264":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"324":{"tf":4.123105625617661},"325":{"tf":1.4142135623730951},"326":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951},"407":{"tf":1.0},"455":{"tf":1.4142135623730951},"461":{"tf":2.0},"462":{"tf":1.0},"463":{"tf":1.0},"470":{"tf":2.0},"480":{"tf":1.0},"492":{"tf":1.7320508075688772},"493":{"tf":1.7320508075688772},"494":{"tf":1.4142135623730951},"500":{"tf":2.6457513110645907},"502":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"52":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":2.0},"95":{"tf":1.0},"96":{"tf":1.0},"99":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"k":{"df":0,"docs":{},"e":{"df":3,"docs":{"291":{"tf":1.0},"64":{"tf":1.0},"67":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"k":{"b":{"df":3,"docs":{"448":{"tf":1.0},"475":{"tf":1.4142135623730951},"477":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"179":{"tf":1.0},"495":{"tf":1.0},"64":{"tf":1.0},"80":{"tf":1.0},"83":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"299":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"77":{"tf":1.0}}}}}},"df":16,"docs":{"259":{"tf":1.0},"317":{"tf":2.0},"324":{"tf":2.449489742783178},"327":{"tf":1.0},"480":{"tf":1.0},"487":{"tf":1.0},"5":{"tf":1.0},"500":{"tf":2.0},"501":{"tf":1.4142135623730951},"502":{"tf":1.0},"510":{"tf":1.0},"55":{"tf":1.0},"77":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}},"b":{"d":{"df":1,"docs":{"413":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":31,"docs":{"104":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"233":{"tf":1.0},"236":{"tf":1.0},"238":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":1.0},"331":{"tf":1.0},"338":{"tf":1.0},"346":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"359":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"376":{"tf":1.4142135623730951},"393":{"tf":1.0},"460":{"tf":1.4142135623730951},"47":{"tf":1.0},"494":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.4142135623730951},"73":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"124":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"257":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"280":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"t":{"df":15,"docs":{"138":{"tf":1.0},"140":{"tf":2.0},"212":{"tf":1.4142135623730951},"22":{"tf":2.449489742783178},"220":{"tf":1.7320508075688772},"266":{"tf":1.0},"276":{"tf":2.0},"293":{"tf":1.0},"437":{"tf":1.0},"438":{"tf":1.0},"439":{"tf":1.0},"51":{"tf":1.7320508075688772},"75":{"tf":1.0},"89":{"tf":1.4142135623730951},"91":{"tf":1.7320508075688772}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"266":{"tf":1.0},"293":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"138":{"tf":1.4142135623730951}}}}}}},"s":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"220":{"tf":1.4142135623730951}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"220":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"140":{"tf":1.0},"212":{"tf":1.0},"51":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"390":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"122":{"tf":1.0}}}}},"r":{"a":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"\\"":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"*":{"*":{"/":{"*":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":3,"docs":{"22":{"tf":1.0},"276":{"tf":1.4142135623730951},"91":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":1,"docs":{"142":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"174":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.0},"279":{"tf":1.0},"4":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"302":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"138":{"tf":1.0},"302":{"tf":1.0}}}},"df":0,"docs":{}},"df":37,"docs":{"110":{"tf":1.0},"138":{"tf":1.0},"153":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"174":{"tf":1.7320508075688772},"175":{"tf":2.6457513110645907},"177":{"tf":1.0},"18":{"tf":1.0},"186":{"tf":1.4142135623730951},"191":{"tf":1.0},"236":{"tf":1.0},"241":{"tf":2.449489742783178},"243":{"tf":1.0},"26":{"tf":1.0},"278":{"tf":2.8284271247461903},"289":{"tf":1.7320508075688772},"299":{"tf":1.0},"302":{"tf":2.0},"317":{"tf":1.0},"329":{"tf":2.449489742783178},"33":{"tf":1.0},"34":{"tf":1.0},"350":{"tf":1.0},"36":{"tf":1.0},"407":{"tf":1.0},"452":{"tf":1.0},"46":{"tf":1.0},"463":{"tf":1.0},"475":{"tf":1.0},"478":{"tf":1.7320508075688772},"496":{"tf":1.0},"519":{"tf":1.0},"526":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"278":{"tf":1.0}}}}}}}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"t":{"df":37,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"182":{"tf":1.0},"200":{"tf":1.0},"257":{"tf":1.0},"263":{"tf":1.0},"272":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"289":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"333":{"tf":1.0},"350":{"tf":1.0},"354":{"tf":2.23606797749979},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"398":{"tf":1.0},"49":{"tf":1.0},"492":{"tf":1.7320508075688772},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"495":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"500":{"tf":1.4142135623730951},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"90":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"351":{"tf":1.0},"354":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"354":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"251":{"tf":1.0},"40":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"502":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"352":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"237":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":15,"docs":{"108":{"tf":1.0},"142":{"tf":1.0},"153":{"tf":1.0},"209":{"tf":1.0},"231":{"tf":1.0},"237":{"tf":1.7320508075688772},"244":{"tf":1.0},"277":{"tf":1.0},"461":{"tf":1.0},"463":{"tf":1.0},"492":{"tf":1.0},"496":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"74":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":5,"docs":{"126":{"tf":1.0},"255":{"tf":1.0},"291":{"tf":1.0},"316":{"tf":1.0},"373":{"tf":1.0}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":8,"docs":{"200":{"tf":1.0},"279":{"tf":1.0},"290":{"tf":1.0},"298":{"tf":1.4142135623730951},"306":{"tf":1.0},"492":{"tf":1.7320508075688772},"517":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":5,"docs":{"129":{"tf":1.0},"241":{"tf":1.0},"284":{"tf":1.0},"49":{"tf":1.0},"70":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":19,"docs":{"101":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"147":{"tf":1.0},"234":{"tf":1.4142135623730951},"237":{"tf":1.4142135623730951},"238":{"tf":1.0},"267":{"tf":1.0},"295":{"tf":1.0},"334":{"tf":1.4142135623730951},"346":{"tf":1.4142135623730951},"38":{"tf":1.0},"502":{"tf":1.0},"70":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"345":{"tf":1.0},"360":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"238":{"tf":1.7320508075688772},"306":{"tf":1.0},"76":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"324":{"tf":1.4142135623730951},"398":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"df":3,"docs":{"216":{"tf":1.0},"37":{"tf":1.0},"468":{"tf":1.0}}},"t":{"df":0,"docs":{},"l":{"df":19,"docs":{"137":{"tf":1.0},"197":{"tf":1.0},"202":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.0},"261":{"tf":1.0},"264":{"tf":1.4142135623730951},"28":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"493":{"tf":2.0},"494":{"tf":2.0},"52":{"tf":1.0},"520":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":1.7320508075688772},"93":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"1":{".":{"2":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"d":{"a":{"df":0,"docs":{},"y":{"\'":{"df":2,"docs":{"125":{"tf":1.0},"203":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"207":{"tf":1.0}}}}},"df":0,"docs":{}}},"/":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"317":{"tf":1.0}}}}},"df":0,"docs":{}},"df":21,"docs":{"314":{"tf":1.0},"317":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"324":{"tf":2.449489742783178},"325":{"tf":1.4142135623730951},"326":{"tf":1.0},"327":{"tf":1.0},"329":{"tf":1.4142135623730951},"330":{"tf":1.0},"396":{"tf":1.4142135623730951},"398":{"tf":1.0},"401":{"tf":1.0},"402":{"tf":1.0},"404":{"tf":1.0},"407":{"tf":1.0},"500":{"tf":1.7320508075688772},"501":{"tf":3.1622776601683795},"96":{"tf":1.0},"98":{"tf":1.4142135623730951},"99":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"141":{"tf":2.0},"199":{"tf":1.0},"250":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"238":{"tf":1.4142135623730951},"76":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":3,"docs":{"458":{"tf":1.4142135623730951},"79":{"tf":1.0},"98":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"l":{"df":8,"docs":{"170":{"tf":1.0},"311":{"tf":1.0},"331":{"tf":1.0},"333":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"345":{"tf":1.0},"347":{"tf":1.0},"363":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"238":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"514":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":42,"docs":{"100":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"12":{"tf":1.0},"156":{"tf":1.0},"164":{"tf":1.0},"192":{"tf":1.0},"225":{"tf":1.0},"238":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"303":{"tf":1.0},"326":{"tf":1.0},"334":{"tf":1.0},"338":{"tf":1.0},"342":{"tf":1.0},"345":{"tf":1.0},"4":{"tf":1.0},"407":{"tf":1.0},"446":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0},"469":{"tf":1.0},"479":{"tf":1.4142135623730951},"48":{"tf":1.0},"486":{"tf":1.4142135623730951},"487":{"tf":1.4142135623730951},"49":{"tf":1.0},"491":{"tf":1.0},"499":{"tf":1.4142135623730951},"62":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":2.23606797749979}},"s":{"/":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":5,"docs":{"171":{"tf":1.7320508075688772},"193":{"tf":1.0},"213":{"tf":1.7320508075688772},"496":{"tf":1.4142135623730951},"497":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":4,"docs":{"28":{"tf":1.0},"463":{"tf":1.0},"511":{"tf":1.0},"96":{"tf":1.0}},"i":{"c":{"df":2,"docs":{"466":{"tf":1.0},"512":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"257":{"tf":1.0},"278":{"tf":1.0},"358":{"tf":1.0},"463":{"tf":1.0},"511":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":3,"docs":{"177":{"tf":1.4142135623730951},"244":{"tf":1.0},"88":{"tf":1.0}}},"k":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"367":{"tf":1.0}}}},"df":0,"docs":{}},"df":24,"docs":{"105":{"tf":1.0},"123":{"tf":1.0},"210":{"tf":1.0},"238":{"tf":1.0},"251":{"tf":1.0},"300":{"tf":1.0},"310":{"tf":1.0},"317":{"tf":1.0},"369":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"381":{"tf":1.0},"387":{"tf":1.0},"412":{"tf":1.0},"445":{"tf":1.0},"502":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"70":{"tf":1.0},"76":{"tf":1.4142135623730951},"83":{"tf":1.0},"86":{"tf":1.0},"93":{"tf":1.4142135623730951}}}},"d":{"df":0,"docs":{},"e":{"df":6,"docs":{"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"330":{"tf":1.0},"358":{"tf":1.0},"360":{"tf":1.0},"73":{"tf":1.0}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"333":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"61":{"tf":1.0},"77":{"tf":1.0}}},"n":{"df":2,"docs":{"135":{"tf":1.0},"356":{"tf":1.0}}},"t":{"df":17,"docs":{"138":{"tf":2.23606797749979},"203":{"tf":1.0},"25":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"354":{"tf":1.4142135623730951},"356":{"tf":1.0},"360":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.4142135623730951},"392":{"tf":1.0},"493":{"tf":2.0},"495":{"tf":1.4142135623730951},"496":{"tf":1.0},"504":{"tf":1.0},"72":{"tf":2.0},"75":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"174":{"tf":1.0},"489":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":10,"docs":{"114":{"tf":1.0},"137":{"tf":1.0},"142":{"tf":1.0},"144":{"tf":1.0},"280":{"tf":1.0},"365":{"tf":1.0},"385":{"tf":1.0},"494":{"tf":1.0},"512":{"tf":1.0},"70":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"396":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"324":{"tf":1.0}}}},"i":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"216":{"tf":1.0},"468":{"tf":1.0}}}},"df":2,"docs":{"452":{"tf":1.0},"478":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"379":{"tf":1.0},"380":{"tf":1.0}}}}}},"m":{"df":1,"docs":{"324":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"d":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":7,"docs":{"100":{"tf":1.0},"314":{"tf":1.0},"330":{"tf":1.0},"356":{"tf":1.0},"396":{"tf":1.0},"407":{"tf":1.0},"460":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":5,"docs":{"187":{"tf":1.0},"221":{"tf":1.0},"23":{"tf":1.0},"41":{"tf":1.0},"474":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"e":{"df":21,"docs":{"178":{"tf":1.0},"182":{"tf":1.0},"212":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"292":{"tf":1.0},"302":{"tf":1.0},"327":{"tf":1.4142135623730951},"333":{"tf":1.4142135623730951},"354":{"tf":1.7320508075688772},"369":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"454":{"tf":1.0},"492":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"499":{"tf":1.0},"517":{"tf":1.0},"97":{"tf":2.0}}},"t":{"df":0,"docs":{},"h":{"df":8,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"244":{"tf":1.0},"323":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0},"399":{"tf":1.0},"413":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"l":{"df":3,"docs":{"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"380":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"289":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"343":{"tf":1.0}}},"n":{"df":1,"docs":{"480":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"338":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":10,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"332":{"tf":1.0},"339":{"tf":1.0},"368":{"tf":1.0},"372":{"tf":1.0},"495":{"tf":1.0}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"=":{"\'":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"469":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"304":{"tf":2.6457513110645907},"309":{"tf":1.0},"337":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":80,"docs":{"105":{"tf":1.0},"108":{"tf":1.4142135623730951},"111":{"tf":1.0},"134":{"tf":1.0},"137":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.0},"151":{"tf":1.0},"153":{"tf":1.0},"157":{"tf":1.0},"178":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.4142135623730951},"202":{"tf":1.0},"209":{"tf":1.0},"215":{"tf":1.0},"224":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.4142135623730951},"27":{"tf":1.0},"28":{"tf":1.0},"285":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.0},"293":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.4142135623730951},"300":{"tf":1.0},"301":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":2.23606797749979},"326":{"tf":2.23606797749979},"330":{"tf":1.0},"332":{"tf":1.4142135623730951},"333":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"342":{"tf":1.0},"369":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"401":{"tf":1.7320508075688772},"404":{"tf":1.0},"411":{"tf":1.0},"454":{"tf":1.0},"461":{"tf":1.4142135623730951},"49":{"tf":1.0},"492":{"tf":3.605551275463989},"493":{"tf":3.1622776601683795},"494":{"tf":3.1622776601683795},"495":{"tf":2.8284271247461903},"496":{"tf":2.6457513110645907},"497":{"tf":1.4142135623730951},"498":{"tf":2.8284271247461903},"500":{"tf":2.6457513110645907},"501":{"tf":1.7320508075688772},"502":{"tf":1.7320508075688772},"511":{"tf":1.4142135623730951},"512":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"56":{"tf":1.0},"63":{"tf":1.0},"70":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"i":{"c":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":3,"docs":{"134":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"64":{"tf":1.0}}},"n":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"371":{"tf":1.0},"413":{"tf":1.0}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":14,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"111":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"230":{"tf":1.0},"246":{"tf":1.0},"27":{"tf":1.0},"36":{"tf":1.0},"469":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"80":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":4,"docs":{"105":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"49":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"193":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"202":{"tf":1.0},"324":{"tf":1.0}}}},"t":{"df":5,"docs":{"241":{"tf":1.0},"278":{"tf":1.0},"314":{"tf":1.0},"396":{"tf":1.0},"95":{"tf":1.0}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"514":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"314":{"tf":1.0}}}}},"s":{"a":{"df":0,"docs":{},"f":{"df":2,"docs":{"153":{"tf":1.0},"280":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\\"":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":5,"docs":{"153":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"496":{"tf":1.0},"74":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":21,"docs":{"101":{"tf":1.0},"104":{"tf":1.0},"141":{"tf":1.4142135623730951},"189":{"tf":1.4142135623730951},"301":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0},"36":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":1.0},"377":{"tf":1.0},"379":{"tf":1.0},"38":{"tf":1.0},"381":{"tf":1.4142135623730951},"383":{"tf":1.0},"407":{"tf":1.4142135623730951},"44":{"tf":1.0},"465":{"tf":1.0},"501":{"tf":1.0}}}},"df":0,"docs":{}},"df":5,"docs":{"121":{"tf":1.0},"159":{"tf":1.0},"171":{"tf":1.0},"194":{"tf":1.0},"213":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"379":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"258":{"tf":1.0},"487":{"tf":1.0},"503":{"tf":1.0},"504":{"tf":1.0},"505":{"tf":1.0},"506":{"tf":1.0},"507":{"tf":1.0},"508":{"tf":1.0},"509":{"tf":1.0}}},"l":{"df":9,"docs":{"164":{"tf":1.0},"178":{"tf":1.0},"288":{"tf":1.0},"307":{"tf":2.6457513110645907},"333":{"tf":1.0},"334":{"tf":1.0},"369":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0}}}},"s":{"a":{"df":0,"docs":{},"g":{"df":12,"docs":{"134":{"tf":1.0},"167":{"tf":1.0},"226":{"tf":1.0},"23":{"tf":1.0},"238":{"tf":1.0},"276":{"tf":1.0},"293":{"tf":1.0},"304":{"tf":1.0},"322":{"tf":1.0},"345":{"tf":1.0},"352":{"tf":1.0},"464":{"tf":1.0}}}},"df":120,"docs":{"102":{"tf":1.0},"108":{"tf":1.0},"111":{"tf":1.0},"116":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":2.449489742783178},"130":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.4142135623730951},"142":{"tf":1.0},"149":{"tf":1.0},"153":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.4142135623730951},"16":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"181":{"tf":1.0},"183":{"tf":1.0},"198":{"tf":1.0},"202":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"217":{"tf":1.4142135623730951},"219":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"231":{"tf":1.7320508075688772},"232":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.0},"244":{"tf":1.4142135623730951},"245":{"tf":1.0},"247":{"tf":1.7320508075688772},"248":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"270":{"tf":1.0},"28":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"290":{"tf":1.0},"293":{"tf":1.4142135623730951},"307":{"tf":1.0},"308":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":1.0},"316":{"tf":1.0},"324":{"tf":3.3166247903554},"329":{"tf":1.0},"335":{"tf":1.0},"338":{"tf":1.0},"343":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":2.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"36":{"tf":1.4142135623730951},"361":{"tf":1.0},"369":{"tf":1.0},"372":{"tf":1.0},"374":{"tf":1.0},"381":{"tf":1.0},"384":{"tf":1.0},"39":{"tf":1.0},"396":{"tf":1.0},"4":{"tf":1.0},"43":{"tf":1.0},"452":{"tf":1.0},"456":{"tf":1.4142135623730951},"458":{"tf":1.4142135623730951},"460":{"tf":1.0},"461":{"tf":1.4142135623730951},"462":{"tf":1.0},"463":{"tf":1.7320508075688772},"466":{"tf":1.0},"467":{"tf":1.0},"469":{"tf":1.4142135623730951},"470":{"tf":1.0},"473":{"tf":1.0},"479":{"tf":1.0},"480":{"tf":1.0},"489":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"496":{"tf":2.0},"5":{"tf":1.0},"502":{"tf":1.0},"517":{"tf":1.0},"52":{"tf":1.0},"520":{"tf":1.0},"55":{"tf":1.0},"58":{"tf":1.0},"64":{"tf":1.0},"67":{"tf":2.23606797749979},"68":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"76":{"tf":1.0},"77":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.7320508075688772},"84":{"tf":1.0},"88":{"tf":1.4142135623730951},"90":{"tf":1.0},"98":{"tf":1.4142135623730951}},"e":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"75":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"r":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"290":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":30,"docs":{"111":{"tf":1.0},"133":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.0},"177":{"tf":1.4142135623730951},"179":{"tf":1.0},"190":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.0},"280":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.4142135623730951},"307":{"tf":1.7320508075688772},"311":{"tf":1.0},"335":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.4142135623730951},"347":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"361":{"tf":1.4142135623730951},"391":{"tf":1.0},"396":{"tf":1.0},"413":{"tf":1.4142135623730951},"45":{"tf":1.0},"462":{"tf":1.7320508075688772}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"178":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"75":{"tf":1.0}}}}}}}}}}}},"s":{"/":{"a":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":2,"docs":{"467":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"263":{"tf":1.0},"324":{"tf":1.4142135623730951},"354":{"tf":2.0}}}}},"t":{"c":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"i":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"v":{"4":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"318":{"tf":1.4142135623730951},"321":{"tf":1.0},"324":{"tf":2.0},"396":{"tf":1.0},"398":{"tf":1.4142135623730951},"75":{"tf":1.0}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"155":{"tf":1.0}}}},"v":{"0":{".":{"4":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"338":{"tf":1.0}}},"5":{"df":5,"docs":{"133":{"tf":1.0},"146":{"tf":1.0},"288":{"tf":1.0},"351":{"tf":1.0},"354":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":2,"docs":{"250":{"tf":1.4142135623730951},"381":{"tf":1.4142135623730951}}},"2":{"df":3,"docs":{"250":{"tf":1.4142135623730951},"381":{"tf":2.0},"83":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"238":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"237":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":31,"docs":{"12":{"tf":1.0},"134":{"tf":2.0},"147":{"tf":1.7320508075688772},"154":{"tf":1.0},"157":{"tf":1.0},"224":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.7320508075688772},"280":{"tf":2.0},"285":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"295":{"tf":1.7320508075688772},"296":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"304":{"tf":2.23606797749979},"309":{"tf":1.0},"332":{"tf":1.4142135623730951},"333":{"tf":2.6457513110645907},"334":{"tf":2.0},"335":{"tf":2.0},"337":{"tf":1.0},"339":{"tf":1.0},"342":{"tf":1.0},"346":{"tf":1.0},"35":{"tf":1.0},"357":{"tf":1.0},"411":{"tf":1.0},"514":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}},"u":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}},"df":0,"docs":{}},"df":23,"docs":{"131":{"tf":1.0},"134":{"tf":1.0},"261":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"291":{"tf":1.7320508075688772},"295":{"tf":1.7320508075688772},"296":{"tf":1.0},"307":{"tf":1.4142135623730951},"319":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":2.23606797749979},"326":{"tf":1.4142135623730951},"333":{"tf":1.0},"334":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"398":{"tf":1.0},"411":{"tf":1.0},"500":{"tf":1.0},"502":{"tf":1.0},"98":{"tf":1.4142135623730951}},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"319":{"tf":1.0}}},"2":{"df":1,"docs":{"319":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"24":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":5,"docs":{"182":{"tf":1.0},"303":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"477":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"134":{"tf":1.0}}}},"t":{"df":1,"docs":{"82":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"498":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"!":{"[":{"\\"":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"264":{"tf":1.0},"329":{"tf":1.0}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"324":{"tf":2.8284271247461903},"325":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"<":{"&":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"(":{"&":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"325":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}}},"_":{"df":1,"docs":{"273":{"tf":1.0}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"398":{"tf":1.0},"400":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"261":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":6,"docs":{"261":{"tf":1.0},"263":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":2.449489742783178},"354":{"tf":1.7320508075688772},"398":{"tf":1.7320508075688772}}}}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"f":{"3":{"2":{"df":2,"docs":{"351":{"tf":1.0},"352":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"350":{"tf":1.0},"90":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"352":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"333":{"tf":1.0},"341":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"359":{"tf":1.0}},"f":{"df":2,"docs":{"137":{"tf":1.0},"419":{"tf":1.0}},"i":{"df":9,"docs":{"13":{"tf":1.0},"164":{"tf":1.0},"172":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"31":{"tf":1.0},"42":{"tf":1.0},"448":{"tf":1.0},"476":{"tf":1.0}}}}},"s":{"a":{"df":1,"docs":{"133":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\'":{"df":1,"docs":{"141":{"tf":1.0}}},"df":33,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"13":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.7320508075688772},"151":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"164":{"tf":1.0},"173":{"tf":1.4142135623730951},"188":{"tf":1.0},"199":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"238":{"tf":2.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"261":{"tf":1.0},"269":{"tf":1.4142135623730951},"292":{"tf":1.0},"310":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"371":{"tf":1.0},"381":{"tf":1.0},"42":{"tf":1.0},"495":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"67":{"tf":1.0},"76":{"tf":1.0}}}}}}}},"i":{"a":{"df":36,"docs":{"105":{"tf":1.0},"108":{"tf":1.0},"11":{"tf":1.0},"114":{"tf":1.0},"133":{"tf":1.0},"154":{"tf":1.0},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.0},"258":{"tf":1.4142135623730951},"263":{"tf":1.0},"279":{"tf":1.0},"298":{"tf":1.0},"328":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.4142135623730951},"348":{"tf":1.0},"349":{"tf":1.0},"353":{"tf":1.4142135623730951},"354":{"tf":2.0},"356":{"tf":1.7320508075688772},"361":{"tf":1.0},"379":{"tf":1.0},"387":{"tf":1.0},"393":{"tf":1.0},"4":{"tf":1.0},"413":{"tf":1.0},"445":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.4142135623730951},"503":{"tf":1.0},"52":{"tf":1.0},"89":{"tf":1.0},"97":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":4,"docs":{"151":{"tf":1.0},"201":{"tf":1.0},"27":{"tf":1.0},"9":{"tf":1.0}}}},"m":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"39":{"tf":1.0}}}}}}}}},"df":2,"docs":{"143":{"tf":1.0},"371":{"tf":1.0}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"337":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"125":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":7,"docs":{"204":{"tf":1.0},"231":{"tf":1.0},"257":{"tf":1.0},"27":{"tf":1.4142135623730951},"36":{"tf":1.0},"467":{"tf":1.4142135623730951},"63":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"338":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":15,"docs":{"241":{"tf":1.0},"249":{"tf":1.0},"287":{"tf":1.0},"311":{"tf":1.0},"331":{"tf":1.0},"333":{"tf":1.0},"341":{"tf":1.0},"353":{"tf":1.0},"361":{"tf":1.0},"363":{"tf":1.0},"39":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"73":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"500":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":6,"docs":{"101":{"tf":1.0},"321":{"tf":1.4142135623730951},"324":{"tf":1.0},"327":{"tf":1.0},"500":{"tf":1.0},"96":{"tf":1.0}}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"170":{"tf":1.0},"365":{"tf":1.4142135623730951},"68":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"156":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"238":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"2":{"tf":1.0},"369":{"tf":1.0},"38":{"tf":1.0},"389":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":1,"docs":{"333":{"tf":1.0}}}},"df":0,"docs":{},"e":{"\'":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}},"v":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"247":{"tf":1.0}}}},"b":{"df":4,"docs":{"107":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"k":{"df":8,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":1.0},"346":{"tf":1.0},"463":{"tf":1.0},"465":{"tf":1.4142135623730951},"472":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{}}},"h":{"a":{"df":0,"docs":{},"t":{"\'":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"233":{"tf":1.0}}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":10,"docs":{"105":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.0},"269":{"tf":1.0},"333":{"tf":1.0},"369":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"74":{"tf":1.0},"87":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":8,"docs":{"104":{"tf":1.0},"107":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.0},"243":{"tf":1.0},"48":{"tf":1.0},"67":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":6,"docs":{"136":{"tf":1.0},"151":{"tf":1.0},"202":{"tf":1.0},"217":{"tf":1.0},"264":{"tf":1.4142135623730951},"467":{"tf":1.0}}}}}}}},"n":{"df":3,"docs":{"381":{"tf":1.0},"57":{"tf":1.0},"88":{"tf":1.0}}},"s":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"105":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"101":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"234":{"tf":1.0},"346":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":16,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"133":{"tf":1.4142135623730951},"138":{"tf":1.4142135623730951},"285":{"tf":1.0},"302":{"tf":1.0},"328":{"tf":1.0},"342":{"tf":1.0},"350":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0},"365":{"tf":1.0},"371":{"tf":1.0},"404":{"tf":1.0},"79":{"tf":1.0},"89":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":26,"docs":{"101":{"tf":1.0},"107":{"tf":1.0},"127":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"143":{"tf":1.0},"157":{"tf":1.0},"230":{"tf":1.0},"238":{"tf":2.0},"251":{"tf":1.0},"328":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"356":{"tf":1.0},"36":{"tf":1.0},"361":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"368":{"tf":1.0},"375":{"tf":1.0},"404":{"tf":1.0},"413":{"tf":1.0},"461":{"tf":1.4142135623730951},"75":{"tf":1.0},"90":{"tf":1.0},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"64":{"tf":1.0}}}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":18,"docs":{"133":{"tf":1.0},"143":{"tf":1.7320508075688772},"206":{"tf":1.0},"220":{"tf":1.0},"227":{"tf":1.0},"23":{"tf":1.0},"278":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"371":{"tf":1.4142135623730951},"383":{"tf":1.0},"443":{"tf":1.0},"459":{"tf":1.0},"480":{"tf":1.0},"484":{"tf":1.0},"487":{"tf":1.0},"510":{"tf":1.0},"67":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":4,"docs":{"164":{"tf":1.0},"166":{"tf":1.0},"175":{"tf":1.4142135623730951},"189":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"\\"":{"]":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"352":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"112":{"tf":1.0},"137":{"tf":1.0},"228":{"tf":1.0},"323":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"469":{"tf":1.0}}}},"s":{"df":1,"docs":{"141":{"tf":1.0}},"t":{"df":1,"docs":{"502":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":14,"docs":{"104":{"tf":1.0},"125":{"tf":1.4142135623730951},"241":{"tf":1.0},"267":{"tf":1.0},"280":{"tf":1.0},"317":{"tf":1.0},"324":{"tf":2.6457513110645907},"335":{"tf":1.0},"341":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"381":{"tf":1.0},"501":{"tf":1.0},"96":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"30":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"s":{":":{"/":{"/":{"df":0,"docs":{},"k":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"377":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"0":{"0":{"0":{"df":4,"docs":{"178":{"tf":1.0},"179":{"tf":1.0},"288":{"tf":1.0},"333":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":9,"docs":{"104":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"136":{"tf":1.7320508075688772},"143":{"tf":1.4142135623730951},"466":{"tf":1.7320508075688772},"477":{"tf":1.0},"480":{"tf":2.0},"520":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}},"y":{"df":0,"docs":{},"z":{"7":{"8":{"9":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"494":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":12,"docs":{"136":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"143":{"tf":1.0},"150":{"tf":1.0},"224":{"tf":1.0},"264":{"tf":1.4142135623730951},"269":{"tf":1.0},"324":{"tf":1.0},"342":{"tf":1.0},"52":{"tf":1.0},"93":{"tf":1.0}}}}},"df":5,"docs":{"104":{"tf":1.0},"143":{"tf":1.0},"203":{"tf":1.0},"480":{"tf":1.4142135623730951},"520":{"tf":1.0}},"e":{"df":3,"docs":{"167":{"tf":1.0},"337":{"tf":1.0},"359":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"342":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"u":{"\'":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}},"v":{"df":1,"docs":{"226":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"df":2,"docs":{"143":{"tf":1.0},"480":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":4,"docs":{"153":{"tf":1.0},"238":{"tf":1.0},"298":{"tf":1.0},"391":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"151":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}}}},"breadcrumbs":{"root":{"0":{".":{".":{"=":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"0":{".":{"0":{".":{"0":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"1":{"/":{"1":{"df":0,"docs":{},"k":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"/":{"1":{"df":0,"docs":{},"k":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"144":{"tf":1.0}}},"1":{"df":1,"docs":{"391":{"tf":1.0}}},"3":{"df":1,"docs":{"302":{"tf":1.0}}},"4":{"df":1,"docs":{"492":{"tf":1.0}}},"5":{"df":1,"docs":{"517":{"tf":1.0}}},"6":{"5":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"298":{"tf":1.0},"308":{"tf":1.0},"492":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0}}},"7":{"2":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"200":{"tf":1.0},"290":{"tf":1.0}}},"8":{"5":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"495":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{"0":{"1":{"df":1,"docs":{"270":{"tf":1.0}}},"2":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}},"1":{"df":20,"docs":{"331":{"tf":1.7320508075688772},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0},"336":{"tf":1.0},"337":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.0},"344":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.0},"347":{"tf":1.0},"348":{"tf":1.0},"363":{"tf":1.0},"98":{"tf":1.0}}},"2":{"df":17,"docs":{"348":{"tf":1.0},"349":{"tf":1.7320508075688772},"350":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.0},"362":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0}}},"3":{"df":31,"docs":{"363":{"tf":1.0},"364":{"tf":1.7320508075688772},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":1.0},"370":{"tf":1.0},"371":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"379":{"tf":1.0},"380":{"tf":1.0},"381":{"tf":1.0},"382":{"tf":1.0},"383":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"386":{"tf":1.0},"387":{"tf":1.0},"388":{"tf":1.0},"389":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.0},"392":{"tf":1.0},"393":{"tf":1.0}}},"4":{"df":23,"docs":{"100":{"tf":1.0},"393":{"tf":1.0},"394":{"tf":1.7320508075688772},"395":{"tf":1.0},"396":{"tf":1.0},"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.0},"402":{"tf":1.0},"403":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0},"408":{"tf":1.0},"409":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"412":{"tf":1.0},"413":{"tf":1.0},"502":{"tf":1.0}}},"5":{"df":1,"docs":{"414":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"1":{"df":17,"docs":{"202":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"247":{"tf":1.7320508075688772},"270":{"tf":1.4142135623730951},"331":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"393":{"tf":1.0},"413":{"tf":1.0},"461":{"tf":2.23606797749979},"492":{"tf":1.7320508075688772},"497":{"tf":1.4142135623730951},"55":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"461":{"tf":1.0}}},"5":{"df":1,"docs":{"461":{"tf":1.0}}},"8":{"df":2,"docs":{"461":{"tf":1.0},"492":{"tf":1.0}}},"df":8,"docs":{"237":{"tf":1.4142135623730951},"277":{"tf":2.23606797749979},"289":{"tf":1.0},"308":{"tf":1.0},"324":{"tf":1.0},"366":{"tf":1.0},"492":{"tf":1.0},"495":{"tf":1.4142135623730951}},"x":{"0":{"1":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"b":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{".":{"0":{".":{"0":{"df":4,"docs":{"212":{"tf":1.0},"292":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"144":{"tf":1.0},"495":{"tf":1.0}}},"7":{"0":{"df":2,"docs":{"161":{"tf":1.0},"195":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{",":{"0":{"0":{"0":{"df":3,"docs":{"281":{"tf":1.4142135623730951},"365":{"tf":1.0},"371":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"df":2,"docs":{"241":{"tf":1.0},"281":{"tf":1.4142135623730951}}},"df":7,"docs":{"153":{"tf":1.0},"244":{"tf":1.4142135623730951},"366":{"tf":1.4142135623730951},"369":{"tf":1.0},"371":{"tf":1.0},"57":{"tf":1.0},"88":{"tf":1.0}},"m":{"b":{"df":2,"docs":{"351":{"tf":1.0},"357":{"tf":1.0}}},"df":1,"docs":{"391":{"tf":1.0}}}},"2":{"4":{"d":{"df":1,"docs":{"90":{"tf":1.0}}},"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"3":{"df":1,"docs":{"492":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":15,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"142":{"tf":1.4142135623730951},"205":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"243":{"tf":1.0},"247":{"tf":1.0},"365":{"tf":1.0},"461":{"tf":1.0},"487":{"tf":1.0},"492":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.4142135623730951},"502":{"tf":1.0},"99":{"tf":1.0}}},"1":{"df":3,"docs":{"143":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951}}},"2":{"3":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":3,"docs":{"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}},"df":6,"docs":{"264":{"tf":1.4142135623730951},"296":{"tf":1.0},"318":{"tf":1.0},"52":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.0}}},"df":5,"docs":{"144":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"463":{"tf":1.0},"467":{"tf":1.4142135623730951},"498":{"tf":1.0}}},"3":{"df":2,"docs":{"257":{"tf":1.0},"66":{"tf":1.0}}},"5":{"0":{")":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"1":{"df":1,"docs":{"496":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}},"3":{"6":{"d":{"df":1,"docs":{"90":{"tf":1.0}}},"df":7,"docs":{"289":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"357":{"tf":1.0},"359":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}},"6":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.0}}}},"df":3,"docs":{"295":{"tf":1.0},"461":{"tf":1.0},"500":{"tf":1.0}},"t":{"1":{"4":{":":{"2":{"0":{":":{"0":{"0":{"df":0,"docs":{},"z":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"7":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":12,"docs":{"238":{"tf":1.7320508075688772},"247":{"tf":1.7320508075688772},"331":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"393":{"tf":1.0},"413":{"tf":1.0},"55":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.4142135623730951}},"t":{"1":{"0":{":":{"3":{"0":{":":{"0":{"0":{"df":0,"docs":{},"z":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"202":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"8":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":54,"docs":{"107":{"tf":1.4142135623730951},"113":{"tf":1.0},"127":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"146":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"156":{"tf":1.0},"164":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"184":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"296":{"tf":1.0},"298":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"308":{"tf":1.0},"316":{"tf":1.4142135623730951},"323":{"tf":1.0},"324":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":2.23606797749979},"330":{"tf":1.0},"333":{"tf":1.4142135623730951},"351":{"tf":1.4142135623730951},"366":{"tf":1.4142135623730951},"387":{"tf":1.4142135623730951},"391":{"tf":1.0},"398":{"tf":1.4142135623730951},"401":{"tf":1.0},"407":{"tf":1.0},"409":{"tf":1.4142135623730951},"448":{"tf":1.4142135623730951},"461":{"tf":1.0},"463":{"tf":1.4142135623730951},"465":{"tf":1.0},"466":{"tf":1.0},"469":{"tf":1.4142135623730951},"492":{"tf":1.7320508075688772},"495":{"tf":1.4142135623730951},"515":{"tf":1.0},"517":{"tf":1.4142135623730951},"520":{"tf":1.4142135623730951},"72":{"tf":1.4142135623730951},"74":{"tf":1.0},"79":{"tf":1.4142135623730951},"96":{"tf":1.0},"98":{"tf":1.0}}},"2":{".":{"0":{"df":17,"docs":{"258":{"tf":1.0},"487":{"tf":1.0},"492":{"tf":1.4142135623730951},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"495":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"511":{"tf":1.0},"512":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"df":0,"docs":{},"m":{"df":1,"docs":{"234":{"tf":1.0}}}},"2":{"4":{"0":{"3":{"0":{"7":{"df":2,"docs":{"290":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"df":17,"docs":{"202":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"247":{"tf":1.7320508075688772},"270":{"tf":1.4142135623730951},"331":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"393":{"tf":1.0},"413":{"tf":1.0},"461":{"tf":2.23606797749979},"492":{"tf":1.7320508075688772},"497":{"tf":1.4142135623730951},"55":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":3,"docs":{"500":{"tf":1.0},"501":{"tf":1.0},"99":{"tf":1.0}}},"3":{"4":{"df":1,"docs":{"238":{"tf":1.4142135623730951}}},"df":2,"docs":{"463":{"tf":1.0},"498":{"tf":1.0}}},"5":{"df":1,"docs":{"501":{"tf":1.0}}},"df":54,"docs":{"108":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"118":{"tf":1.0},"128":{"tf":1.4142135623730951},"134":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"170":{"tf":1.4142135623730951},"185":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"317":{"tf":1.4142135623730951},"323":{"tf":1.0},"324":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.0},"334":{"tf":1.4142135623730951},"346":{"tf":1.0},"352":{"tf":1.4142135623730951},"367":{"tf":1.4142135623730951},"388":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"401":{"tf":1.0},"407":{"tf":1.0},"410":{"tf":1.4142135623730951},"413":{"tf":1.0},"449":{"tf":1.4142135623730951},"461":{"tf":1.0},"463":{"tf":1.7320508075688772},"465":{"tf":1.4142135623730951},"466":{"tf":1.0},"470":{"tf":1.4142135623730951},"487":{"tf":1.0},"493":{"tf":1.4142135623730951},"502":{"tf":1.0},"512":{"tf":1.7320508075688772},"518":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.0},"80":{"tf":1.4142135623730951},"96":{"tf":1.0},"98":{"tf":1.0}},"m":{"b":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}}},"3":{"0":{"0":{"0":{"df":2,"docs":{"2":{"tf":1.0},"43":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"43":{"tf":1.0}}},"df":1,"docs":{"289":{"tf":1.0}}},"df":1,"docs":{"127":{"tf":1.0}}},"2":{"6":{"0":{"0":{"df":1,"docs":{"514":{"tf":1.0}}},"1":{"df":1,"docs":{"514":{"tf":1.0}}},"2":{"df":2,"docs":{"514":{"tf":1.0},"515":{"tf":1.0}}},"3":{"df":1,"docs":{"514":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"df":1,"docs":{"514":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"4":{"d":{"df":1,"docs":{"90":{"tf":1.0}}},"df":7,"docs":{"288":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.7320508075688772},"357":{"tf":1.0},"359":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":1,"docs":{"502":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":48,"docs":{"109":{"tf":1.7320508075688772},"114":{"tf":1.0},"129":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"166":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"182":{"tf":1.0},"186":{"tf":1.4142135623730951},"198":{"tf":1.4142135623730951},"231":{"tf":1.0},"235":{"tf":1.4142135623730951},"247":{"tf":1.0},"250":{"tf":2.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"292":{"tf":1.0},"300":{"tf":1.4142135623730951},"304":{"tf":1.0},"308":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951},"324":{"tf":1.0},"328":{"tf":1.0},"333":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.4142135623730951},"354":{"tf":1.0},"368":{"tf":1.4142135623730951},"389":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"407":{"tf":1.0},"411":{"tf":1.4142135623730951},"450":{"tf":1.4142135623730951},"461":{"tf":1.0},"463":{"tf":1.4142135623730951},"465":{"tf":1.0},"471":{"tf":1.4142135623730951},"487":{"tf":1.0},"492":{"tf":1.0},"494":{"tf":1.4142135623730951},"500":{"tf":1.0},"502":{"tf":1.0},"519":{"tf":1.4142135623730951},"74":{"tf":1.7320508075688772},"81":{"tf":1.4142135623730951},"98":{"tf":1.0}}},"4":{"2":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":2,"docs":{"463":{"tf":1.0},"498":{"tf":1.0}}},"5":{"6":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":3,"docs":{"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"77":{"tf":1.0}}},"8":{"df":1,"docs":{"278":{"tf":1.0}}},"df":27,"docs":{"110":{"tf":1.4142135623730951},"113":{"tf":1.0},"136":{"tf":1.4142135623730951},"149":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"238":{"tf":1.0},"247":{"tf":1.4142135623730951},"276":{"tf":1.0},"290":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"319":{"tf":1.4142135623730951},"324":{"tf":1.0},"328":{"tf":1.0},"390":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"407":{"tf":1.0},"451":{"tf":1.4142135623730951},"461":{"tf":1.0},"463":{"tf":1.0},"472":{"tf":1.4142135623730951},"495":{"tf":1.4142135623730951},"520":{"tf":1.4142135623730951},"75":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951},"98":{"tf":1.0}}},"5":{".":{".":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{")":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"1":{"df":1,"docs":{"496":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"0":{"df":0,"docs":{},"m":{"df":1,"docs":{"379":{"tf":1.0}}}},"df":5,"docs":{"129":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"57":{"tf":1.0},"88":{"tf":1.0}},"m":{"df":1,"docs":{"234":{"tf":1.4142135623730951}}}},"6":{"df":1,"docs":{"278":{"tf":1.0}}},"df":31,"docs":{"108":{"tf":1.0},"111":{"tf":1.4142135623730951},"114":{"tf":1.0},"137":{"tf":1.4142135623730951},"150":{"tf":1.4142135623730951},"16":{"tf":1.0},"19":{"tf":1.4142135623730951},"194":{"tf":1.0},"200":{"tf":1.7320508075688772},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"278":{"tf":1.0},"302":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"328":{"tf":1.0},"380":{"tf":1.0},"402":{"tf":1.4142135623730951},"407":{"tf":1.0},"447":{"tf":1.4142135623730951},"452":{"tf":1.4142135623730951},"461":{"tf":1.4142135623730951},"463":{"tf":1.7320508075688772},"465":{"tf":1.0},"473":{"tf":1.4142135623730951},"492":{"tf":1.0},"496":{"tf":1.4142135623730951},"502":{"tf":1.0},"76":{"tf":1.4142135623730951},"83":{"tf":1.4142135623730951}},"m":{"b":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}}},"6":{"df":18,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"138":{"tf":1.4142135623730951},"144":{"tf":1.0},"20":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"258":{"tf":1.0},"259":{"tf":1.0},"276":{"tf":1.0},"407":{"tf":1.0},"487":{"tf":1.0},"497":{"tf":1.4142135623730951},"55":{"tf":1.0},"56":{"tf":1.0},"77":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951}}},"7":{"6":{"8":{"d":{"df":1,"docs":{"90":{"tf":1.0}}},"df":3,"docs":{"292":{"tf":1.0},"354":{"tf":1.0},"359":{"tf":1.0}}},"df":0,"docs":{}},"8":{"9":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":2,"docs":{"501":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":8,"docs":{"139":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"258":{"tf":1.0},"463":{"tf":1.0},"487":{"tf":1.0},"498":{"tf":1.7320508075688772}},"m":{"b":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}}},"8":{"0":{"df":1,"docs":{"234":{"tf":1.4142135623730951}}},"df":9,"docs":{"140":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"231":{"tf":1.0},"248":{"tf":1.4142135623730951},"463":{"tf":1.4142135623730951},"500":{"tf":1.4142135623730951},"501":{"tf":1.0},"511":{"tf":1.0}}},"9":{"df":5,"docs":{"141":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"500":{"tf":1.0},"512":{"tf":1.0}}},"_":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}},"a":{"b":{"c":{"1":{"2":{"3":{"df":1,"docs":{"493":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"90":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"255":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.0},"75":{"tf":1.0},"81":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"351":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"t":{"df":15,"docs":{"208":{"tf":1.0},"231":{"tf":1.4142135623730951},"247":{"tf":1.0},"250":{"tf":1.7320508075688772},"287":{"tf":1.0},"331":{"tf":1.0},"349":{"tf":1.0},"361":{"tf":1.0},"364":{"tf":1.0},"372":{"tf":1.0},"461":{"tf":1.0},"463":{"tf":1.7320508075688772},"465":{"tf":1.0},"494":{"tf":1.7320508075688772},"73":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":25,"docs":{"100":{"tf":1.0},"104":{"tf":1.0},"111":{"tf":1.0},"121":{"tf":1.0},"238":{"tf":1.0},"247":{"tf":1.4142135623730951},"322":{"tf":1.0},"365":{"tf":1.0},"369":{"tf":1.4142135623730951},"371":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.0},"410":{"tf":1.0},"487":{"tf":1.0},"503":{"tf":1.0},"504":{"tf":1.0},"505":{"tf":1.0},"506":{"tf":1.0},"507":{"tf":1.0},"508":{"tf":1.0},"509":{"tf":1.0},"55":{"tf":1.0},"65":{"tf":1.0},"68":{"tf":1.0},"75":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"361":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"234":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"123":{"tf":1.0},"139":{"tf":1.0},"158":{"tf":1.0},"96":{"tf":1.0}}}},"v":{"df":7,"docs":{"125":{"tf":1.0},"202":{"tf":1.0},"338":{"tf":1.0},"406":{"tf":1.0},"463":{"tf":1.0},"480":{"tf":1.0},"511":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"157":{"tf":1.0},"449":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"109":{"tf":1.0},"133":{"tf":1.0}}}}},"d":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}},"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":51,"docs":{"138":{"tf":1.0},"143":{"tf":1.7320508075688772},"185":{"tf":1.0},"188":{"tf":1.0},"197":{"tf":1.7320508075688772},"198":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"209":{"tf":1.4142135623730951},"210":{"tf":1.7320508075688772},"213":{"tf":1.4142135623730951},"215":{"tf":2.0},"226":{"tf":1.0},"231":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":2.0},"237":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":2.23606797749979},"244":{"tf":1.7320508075688772},"257":{"tf":1.0},"278":{"tf":1.0},"301":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"328":{"tf":1.7320508075688772},"330":{"tf":1.4142135623730951},"339":{"tf":1.0},"345":{"tf":1.0},"356":{"tf":1.0},"358":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"371":{"tf":1.7320508075688772},"388":{"tf":1.0},"398":{"tf":1.4142135623730951},"407":{"tf":3.1622776601683795},"449":{"tf":1.0},"455":{"tf":1.7320508075688772},"456":{"tf":1.4142135623730951},"462":{"tf":1.0},"465":{"tf":1.0},"478":{"tf":1.4142135623730951},"480":{"tf":1.7320508075688772},"490":{"tf":1.0},"493":{"tf":1.0},"496":{"tf":1.0},"88":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":9,"docs":{"198":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"327":{"tf":1.0},"353":{"tf":1.0},"456":{"tf":1.0},"494":{"tf":1.0},"511":{"tf":1.0},"73":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"244":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"501":{"tf":1.0}}}}}}},"df":13,"docs":{"144":{"tf":1.0},"234":{"tf":1.0},"241":{"tf":1.0},"301":{"tf":1.0},"31":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951},"330":{"tf":1.0},"405":{"tf":1.0},"467":{"tf":1.0},"470":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"93":{"tf":1.0}},"j":{"a":{"c":{"df":1,"docs":{"365":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"250":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":11,"docs":{"198":{"tf":1.0},"208":{"tf":1.0},"231":{"tf":1.0},"333":{"tf":1.0},"371":{"tf":1.0},"406":{"tf":1.0},"456":{"tf":1.0},"463":{"tf":1.0},"494":{"tf":1.0},"73":{"tf":1.0},"84":{"tf":1.0}}}}},"r":{"df":107,"docs":{"100":{"tf":1.0},"114":{"tf":1.0},"116":{"tf":1.0},"141":{"tf":1.0},"151":{"tf":1.0},"17":{"tf":1.0},"208":{"tf":1.0},"232":{"tf":1.4142135623730951},"234":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"258":{"tf":1.0},"270":{"tf":1.0},"282":{"tf":1.0},"311":{"tf":1.0},"331":{"tf":1.7320508075688772},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0},"336":{"tf":1.0},"337":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.0},"344":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.0},"347":{"tf":1.0},"348":{"tf":1.7320508075688772},"349":{"tf":1.7320508075688772},"350":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.0},"362":{"tf":1.0},"363":{"tf":2.23606797749979},"364":{"tf":1.7320508075688772},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":1.0},"370":{"tf":1.0},"371":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"379":{"tf":1.0},"380":{"tf":1.0},"381":{"tf":1.0},"382":{"tf":1.0},"383":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"386":{"tf":1.0},"387":{"tf":1.0},"388":{"tf":1.0},"389":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.0},"392":{"tf":1.0},"393":{"tf":2.23606797749979},"394":{"tf":1.7320508075688772},"395":{"tf":1.0},"396":{"tf":1.0},"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.0},"402":{"tf":1.0},"403":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0},"408":{"tf":1.0},"409":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"412":{"tf":1.0},"413":{"tf":1.0},"414":{"tf":1.7320508075688772},"494":{"tf":1.0},"502":{"tf":1.0},"505":{"tf":1.0},"520":{"tf":1.4142135623730951},"55":{"tf":1.0},"59":{"tf":1.0},"73":{"tf":1.4142135623730951},"98":{"tf":1.0}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":8,"docs":{"170":{"tf":1.0},"212":{"tf":1.0},"23":{"tf":1.0},"241":{"tf":1.0},"252":{"tf":1.0},"464":{"tf":1.4142135623730951},"479":{"tf":1.0},"80":{"tf":1.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"65":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"138":{"tf":1.0},"44":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}}}}}}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"478":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":9,"docs":{"123":{"tf":2.449489742783178},"125":{"tf":1.0},"36":{"tf":1.0},"48":{"tf":1.0},"53":{"tf":1.4142135623730951},"55":{"tf":1.0},"61":{"tf":1.4142135623730951},"64":{"tf":1.0},"77":{"tf":2.0}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.0}}}}}},"o":{"df":5,"docs":{"118":{"tf":1.0},"231":{"tf":1.4142135623730951},"247":{"tf":1.0},"463":{"tf":1.7320508075688772},"465":{"tf":1.4142135623730951}}}},"i":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":50,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.7320508075688772},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.0},"130":{"tf":1.0},"137":{"tf":2.8284271247461903},"142":{"tf":1.0},"143":{"tf":2.8284271247461903},"151":{"tf":1.0},"157":{"tf":1.4142135623730951},"205":{"tf":1.0},"21":{"tf":2.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.7320508075688772},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.7320508075688772},"353":{"tf":1.7320508075688772},"354":{"tf":1.4142135623730951},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"36":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.0},"362":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0},"414":{"tf":1.7320508075688772},"446":{"tf":1.0},"463":{"tf":1.0},"48":{"tf":1.0},"480":{"tf":1.0},"49":{"tf":1.0},"53":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"77":{"tf":1.0},"89":{"tf":1.0}}},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":1,"docs":{"502":{"tf":1.0}},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"i":{"c":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"466":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"339":{"tf":1.0},"446":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":5,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0},"365":{"tf":1.0},"407":{"tf":1.0}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"104":{"tf":1.0},"323":{"tf":1.0},"43":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":8,"docs":{"140":{"tf":1.0},"340":{"tf":1.4142135623730951},"382":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951},"409":{"tf":1.4142135623730951},"410":{"tf":1.4142135623730951},"411":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":7,"docs":{"153":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"46":{"tf":1.0},"496":{"tf":1.0},"74":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"342":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"73":{"tf":1.0}}}}}}},"d":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"492":{"tf":1.0}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"|":{"df":2,"docs":{"139":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"174":{"tf":1.0},"495":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"316":{"tf":1.0},"401":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"182":{"tf":1.0}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"182":{"tf":1.0}},"i":{"c":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"=":{"\\"":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"182":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"df":1,"docs":{"145":{"tf":1.4142135623730951}}}},"y":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"108":{"tf":1.0},"244":{"tf":1.0},"461":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"108":{"tf":1.0},"129":{"tf":1.0},"142":{"tf":1.0},"473":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{"df":4,"docs":{"182":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"354":{"tf":1.0}}}}}},"df":1,"docs":{"354":{"tf":1.4142135623730951}}}}}},"df":30,"docs":{"135":{"tf":1.0},"182":{"tf":1.4142135623730951},"234":{"tf":1.0},"238":{"tf":2.0},"248":{"tf":1.4142135623730951},"249":{"tf":1.0},"25":{"tf":2.23606797749979},"250":{"tf":2.8284271247461903},"257":{"tf":1.0},"289":{"tf":1.0},"306":{"tf":1.0},"325":{"tf":1.4142135623730951},"334":{"tf":1.0},"337":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.4142135623730951},"362":{"tf":1.0},"407":{"tf":1.0},"460":{"tf":1.7320508075688772},"465":{"tf":1.0},"479":{"tf":1.0},"486":{"tf":1.4142135623730951},"523":{"tf":1.7320508075688772},"65":{"tf":1.0},"76":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}},"p":{"df":2,"docs":{"107":{"tf":1.0},"24":{"tf":2.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":3,"docs":{"108":{"tf":1.0},"244":{"tf":1.0},"461":{"tf":1.0}}},"df":6,"docs":{"110":{"tf":1.7320508075688772},"118":{"tf":1.0},"247":{"tf":1.0},"295":{"tf":1.0},"324":{"tf":1.4142135623730951},"88":{"tf":1.0}}},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"a":{"c":{"df":0,"docs":{},"h":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":11,"docs":{"241":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":1.0},"285":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"330":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"31":{"tf":1.0}}}}},"v":{"df":2,"docs":{"330":{"tf":1.0},"413":{"tf":1.0}}}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":48,"docs":{"100":{"tf":1.4142135623730951},"102":{"tf":1.0},"104":{"tf":1.0},"114":{"tf":1.0},"122":{"tf":1.0},"124":{"tf":1.0},"158":{"tf":1.0},"17":{"tf":2.449489742783178},"196":{"tf":1.0},"198":{"tf":1.0},"20":{"tf":1.0},"200":{"tf":1.0},"208":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.4142135623730951},"254":{"tf":1.7320508075688772},"255":{"tf":1.7320508075688772},"268":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"284":{"tf":1.7320508075688772},"297":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"313":{"tf":1.4142135623730951},"331":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"354":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"369":{"tf":1.0},"393":{"tf":1.0},"463":{"tf":1.0},"467":{"tf":1.0},"494":{"tf":1.4142135623730951},"55":{"tf":1.0},"57":{"tf":1.4142135623730951},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"85":{"tf":1.4142135623730951},"87":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.4142135623730951}},"e":{",":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"208":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"df":1,"docs":{"259":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"g":{"(":{"\\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"335":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":4,"docs":{"185":{"tf":1.0},"335":{"tf":1.0},"449":{"tf":1.0},"490":{"tf":1.0}},"s":{"(":{"[":{"\\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"303":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"511":{"tf":1.0},"512":{"tf":1.0},"99":{"tf":2.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":5,"docs":{"291":{"tf":1.0},"327":{"tf":1.0},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"498":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"352":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"241":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"k":{"df":8,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"471":{"tf":1.0},"472":{"tf":1.0},"480":{"tf":1.0}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"<":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{">":{">":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.7320508075688772}}}}}},"[":{"0":{"]":{".":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}}}},"[":{"1":{"]":{".":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"329":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"329":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"329":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"98":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":9,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"124":{"tf":1.0},"137":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"205":{"tf":1.0},"446":{"tf":1.0},"67":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"5":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"n":{"c":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"262":{"tf":1.0},"263":{"tf":1.0},"354":{"tf":1.7320508075688772},"373":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":16,"docs":{"208":{"tf":1.0},"262":{"tf":2.0},"263":{"tf":1.0},"264":{"tf":1.4142135623730951},"270":{"tf":1.0},"279":{"tf":1.0},"354":{"tf":1.7320508075688772},"373":{"tf":1.7320508075688772},"455":{"tf":2.0},"458":{"tf":1.4142135623730951},"493":{"tf":2.23606797749979},"495":{"tf":1.4142135623730951},"72":{"tf":2.23606797749979},"75":{"tf":1.0},"79":{"tf":1.0},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"151":{"tf":1.0},"247":{"tf":1.0},"280":{"tf":1.0}}}},"t":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"287":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"64":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":3,"docs":{"390":{"tf":1.0},"61":{"tf":1.0},"77":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"137":{"tf":1.4142135623730951},"462":{"tf":1.4142135623730951},"55":{"tf":1.0},"81":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"137":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"249":{"tf":1.0},"462":{"tf":1.4142135623730951},"500":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"96":{"tf":1.0}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"348":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"289":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"df":10,"docs":{"2":{"tf":1.0},"238":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"321":{"tf":1.0},"372":{"tf":1.0},"389":{"tf":1.0},"451":{"tf":1.0},"53":{"tf":1.0},"76":{"tf":1.4142135623730951},"97":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":9,"docs":{"123":{"tf":1.0},"2":{"tf":1.0},"303":{"tf":1.0},"327":{"tf":1.0},"371":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"38":{"tf":1.0},"389":{"tf":1.4142135623730951}}}},"df":5,"docs":{"156":{"tf":1.0},"214":{"tf":1.4142135623730951},"255":{"tf":1.0},"259":{"tf":1.0},"66":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":15,"docs":{"114":{"tf":1.0},"199":{"tf":1.0},"225":{"tf":1.0},"234":{"tf":1.0},"241":{"tf":1.0},"251":{"tf":1.0},"258":{"tf":1.0},"338":{"tf":1.4142135623730951},"352":{"tf":1.0},"356":{"tf":1.0},"372":{"tf":1.0},"381":{"tf":1.0},"479":{"tf":1.0},"497":{"tf":1.4142135623730951},"502":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"234":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"145":{"tf":1.4142135623730951},"219":{"tf":1.0},"247":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"354":{"tf":1.0}}}},"r":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{".":{"1":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"(":{"&":{"a":{".":{"1":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"273":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"\\"":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"a":{"a":{"df":0,"docs":{},"i":{"/":{"b":{"df":0,"docs":{},"g":{"df":5,"docs":{"146":{"tf":1.0},"288":{"tf":1.0},"351":{"tf":1.0},"354":{"tf":1.7320508075688772},"362":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"303":{"tf":1.0},"322":{"tf":1.0},"324":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":19,"docs":{"140":{"tf":1.0},"162":{"tf":1.0},"167":{"tf":1.7320508075688772},"176":{"tf":1.0},"177":{"tf":1.0},"20":{"tf":1.7320508075688772},"255":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.0},"300":{"tf":1.0},"330":{"tf":1.0},"364":{"tf":1.0},"373":{"tf":1.0},"407":{"tf":1.0},"425":{"tf":1.7320508075688772},"456":{"tf":1.0},"494":{"tf":1.0},"63":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"389":{"tf":1.0},"494":{"tf":1.0},"520":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"111":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":2,"docs":{"214":{"tf":1.0},"259":{"tf":1.0}}}}},"df":2,"docs":{"214":{"tf":1.0},"66":{"tf":1.0}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":9,"docs":{"156":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.4142135623730951},"404":{"tf":1.0},"413":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":5,"docs":{"133":{"tf":1.0},"139":{"tf":1.0},"298":{"tf":1.0},"307":{"tf":1.0},"470":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"133":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"334":{"tf":1.0},"337":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"k":{"b":{"df":2,"docs":{"185":{"tf":1.0},"449":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":51,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"110":{"tf":1.0},"120":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"164":{"tf":1.4142135623730951},"169":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"197":{"tf":1.0},"200":{"tf":1.4142135623730951},"202":{"tf":1.0},"204":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.0},"244":{"tf":1.0},"251":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"285":{"tf":1.0},"288":{"tf":1.4142135623730951},"291":{"tf":2.23606797749979},"325":{"tf":1.0},"331":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"345":{"tf":1.0},"350":{"tf":1.0},"364":{"tf":1.0},"369":{"tf":1.0},"377":{"tf":1.0},"380":{"tf":1.0},"446":{"tf":1.0},"449":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.4142135623730951},"487":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"53":{"tf":1.0},"63":{"tf":1.0},"99":{"tf":1.0}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"56":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"238":{"tf":1.0}}},"i":{"c":{"df":2,"docs":{"217":{"tf":1.0},"80":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}}},"df":1,"docs":{"4":{"tf":1.0}}}},"df":6,"docs":{"110":{"tf":1.0},"273":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"381":{"tf":1.4142135623730951},"480":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"125":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":27,"docs":{"113":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"118":{"tf":1.0},"120":{"tf":1.0},"123":{"tf":1.0},"134":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"241":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"257":{"tf":1.0},"285":{"tf":1.0},"301":{"tf":1.0},"309":{"tf":1.0},"328":{"tf":1.0},"332":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"346":{"tf":1.0},"36":{"tf":1.0},"466":{"tf":1.0},"519":{"tf":1.4142135623730951},"53":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":21,"docs":{"109":{"tf":1.4142135623730951},"133":{"tf":1.0},"146":{"tf":1.4142135623730951},"157":{"tf":1.0},"192":{"tf":1.0},"267":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.4142135623730951},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"328":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"407":{"tf":1.0},"479":{"tf":1.0},"51":{"tf":1.4142135623730951},"89":{"tf":2.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"103":{"tf":1.0},"69":{"tf":1.0}}},"df":0,"docs":{}}}},"n":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"247":{"tf":1.0},"501":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":15,"docs":{"107":{"tf":1.0},"119":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"267":{"tf":1.0},"287":{"tf":1.0},"297":{"tf":1.4142135623730951},"330":{"tf":1.0},"334":{"tf":1.0},"367":{"tf":1.0},"93":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":21,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"122":{"tf":1.0},"130":{"tf":1.4142135623730951},"137":{"tf":1.0},"142":{"tf":1.0},"2":{"tf":1.0},"244":{"tf":1.0},"253":{"tf":1.7320508075688772},"305":{"tf":1.4142135623730951},"323":{"tf":1.0},"353":{"tf":1.0},"359":{"tf":1.0},"368":{"tf":1.0},"461":{"tf":1.4142135623730951},"492":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"516":{"tf":1.4142135623730951},"74":{"tf":1.0},"75":{"tf":1.0},"90":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":9,"docs":{"125":{"tf":1.0},"198":{"tf":1.0},"219":{"tf":1.0},"231":{"tf":1.0},"356":{"tf":1.0},"456":{"tf":1.0},"460":{"tf":1.4142135623730951},"494":{"tf":1.0},"73":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":7,"docs":{"105":{"tf":1.0},"199":{"tf":1.0},"257":{"tf":1.0},"353":{"tf":1.0},"495":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"122":{"tf":1.0},"366":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"100":{"tf":1.0},"144":{"tf":1.0},"214":{"tf":1.0},"269":{"tf":1.0},"330":{"tf":1.0},"400":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"150":{"tf":1.0},"193":{"tf":1.0},"358":{"tf":1.0},"448":{"tf":1.0},"477":{"tf":1.0}}}}},"d":{"df":1,"docs":{"190":{"tf":1.0}}},"df":1,"docs":{"188":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"93":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"150":{"tf":1.0}}},"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"323":{"tf":1.0},"401":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"324":{"tf":1.7320508075688772},"398":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"323":{"tf":1.0},"401":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"327":{"tf":1.4142135623730951}}}}}}}},"df":53,"docs":{"100":{"tf":3.1622776601683795},"238":{"tf":1.0},"279":{"tf":1.0},"313":{"tf":1.7320508075688772},"314":{"tf":3.3166247903554},"315":{"tf":1.0},"316":{"tf":1.7320508075688772},"317":{"tf":2.0},"318":{"tf":2.449489742783178},"319":{"tf":2.23606797749979},"320":{"tf":1.0},"321":{"tf":3.4641016151377544},"322":{"tf":2.8284271247461903},"323":{"tf":4.242640687119285},"324":{"tf":7.483314773547883},"325":{"tf":3.3166247903554},"326":{"tf":1.4142135623730951},"327":{"tf":2.449489742783178},"328":{"tf":2.449489742783178},"329":{"tf":3.4641016151377544},"330":{"tf":3.0},"394":{"tf":1.7320508075688772},"395":{"tf":1.0},"396":{"tf":3.0},"397":{"tf":1.4142135623730951},"398":{"tf":2.449489742783178},"399":{"tf":1.4142135623730951},"400":{"tf":1.0},"401":{"tf":2.8284271247461903},"402":{"tf":1.4142135623730951},"403":{"tf":1.0},"404":{"tf":2.449489742783178},"405":{"tf":1.7320508075688772},"406":{"tf":1.4142135623730951},"407":{"tf":3.0},"408":{"tf":1.0},"409":{"tf":2.0},"410":{"tf":1.7320508075688772},"411":{"tf":1.4142135623730951},"412":{"tf":1.4142135623730951},"413":{"tf":2.23606797749979},"487":{"tf":1.0},"499":{"tf":1.7320508075688772},"500":{"tf":2.449489742783178},"501":{"tf":1.0},"502":{"tf":2.23606797749979},"63":{"tf":1.0},"94":{"tf":1.7320508075688772},"95":{"tf":3.0},"96":{"tf":2.6457513110645907},"97":{"tf":2.0},"98":{"tf":1.0},"99":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"238":{"tf":1.4142135623730951},"76":{"tf":1.4142135623730951}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":5,"docs":{"100":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"407":{"tf":1.0}},"e":{"(":{"&":{"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"d":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"329":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"&":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"323":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"407":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"321":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"499":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"328":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"b":{"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"140":{"tf":1.0},"264":{"tf":1.0},"28":{"tf":1.0},"324":{"tf":2.23606797749979}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"df":0,"docs":{}},"l":{"df":3,"docs":{"327":{"tf":1.7320508075688772},"334":{"tf":1.4142135623730951},"337":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"342":{"tf":1.0},"492":{"tf":1.0},"496":{"tf":1.0},"498":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"202":{"tf":1.0},"316":{"tf":1.4142135623730951},"96":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"137":{"tf":1.0},"274":{"tf":1.0},"323":{"tf":1.7320508075688772},"353":{"tf":1.0},"361":{"tf":1.0},"368":{"tf":1.0},"405":{"tf":1.0},"500":{"tf":1.0},"88":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"493":{"tf":1.0}}},"df":0,"docs":{}}},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"a":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"d":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":2,"docs":{"138":{"tf":1.0},"293":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":1,"docs":{"493":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"107":{"tf":2.0},"136":{"tf":1.0},"141":{"tf":1.0},"151":{"tf":1.0},"371":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"93":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"317":{"tf":1.0}}}}}},"df":4,"docs":{"138":{"tf":1.0},"156":{"tf":1.0},"301":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{},"w":{"df":1,"docs":{"162":{"tf":1.0}}}},"i":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"a":{"d":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"295":{"tf":1.0},"44":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"129":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":4,"docs":{"108":{"tf":1.0},"114":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"2":{"tf":1.0},"27":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":9,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.0},"245":{"tf":1.4142135623730951},"246":{"tf":1.0},"251":{"tf":1.0},"501":{"tf":1.0},"96":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"d":{"df":22,"docs":{"10":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":2.8284271247461903},"166":{"tf":2.449489742783178},"167":{"tf":1.4142135623730951},"181":{"tf":1.4142135623730951},"184":{"tf":1.7320508075688772},"189":{"tf":1.0},"2":{"tf":1.0},"209":{"tf":1.4142135623730951},"226":{"tf":1.0},"3":{"tf":1.7320508075688772},"309":{"tf":1.0},"31":{"tf":1.0},"448":{"tf":2.0},"6":{"tf":1.7320508075688772},"67":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"463":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"28":{"tf":1.0},"475":{"tf":1.0},"53":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"356":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"95":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"104":{"tf":1.0},"48":{"tf":1.0}}}}}},"c":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"e":{"(":{")":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":20,"docs":{"100":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":2.23606797749979},"238":{"tf":2.23606797749979},"241":{"tf":4.0},"247":{"tf":2.449489742783178},"279":{"tf":1.0},"281":{"tf":1.0},"323":{"tf":1.4142135623730951},"357":{"tf":1.0},"371":{"tf":1.0},"376":{"tf":1.0},"380":{"tf":1.4142135623730951},"381":{"tf":1.4142135623730951},"391":{"tf":1.0},"399":{"tf":1.0},"465":{"tf":1.0},"76":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"357":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"328":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"356":{"tf":1.0}}}},"n":{"\'":{"df":0,"docs":{},"t":{"df":5,"docs":{"133":{"tf":1.0},"142":{"tf":1.0},"322":{"tf":1.0},"367":{"tf":1.0},"410":{"tf":1.4142135623730951}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"321":{"tf":1.0},"324":{"tf":1.0},"327":{"tf":1.0},"500":{"tf":1.0},"96":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"1":{"df":1,"docs":{"324":{"tf":2.0}}},"2":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"198":{"tf":1.0},"350":{"tf":1.0},"365":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"324":{"tf":2.0},"502":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"226":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.4142135623730951},"350":{"tf":1.0},"460":{"tf":1.4142135623730951},"47":{"tf":1.0},"480":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"72":{"tf":1.7320508075688772},"98":{"tf":1.0}}}}}},"r":{"d":{"df":20,"docs":{"314":{"tf":1.0},"316":{"tf":2.23606797749979},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"326":{"tf":1.0},"329":{"tf":1.4142135623730951},"330":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"401":{"tf":1.0},"404":{"tf":1.0},"407":{"tf":1.0},"480":{"tf":1.4142135623730951},"500":{"tf":1.0},"502":{"tf":2.0},"96":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"333":{"tf":1.0}}}}}}},"df":17,"docs":{"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.0},"164":{"tf":1.4142135623730951},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"175":{"tf":1.7320508075688772},"181":{"tf":1.0},"184":{"tf":1.0},"188":{"tf":1.4142135623730951},"189":{"tf":1.4142135623730951},"193":{"tf":1.0},"195":{"tf":1.0},"42":{"tf":1.0},"448":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":40,"docs":{"130":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":1.7320508075688772},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.7320508075688772},"233":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.7320508075688772},"236":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.4142135623730951},"239":{"tf":1.7320508075688772},"240":{"tf":1.0},"241":{"tf":1.0},"242":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":1.0},"245":{"tf":1.7320508075688772},"246":{"tf":1.0},"247":{"tf":1.0},"248":{"tf":1.7320508075688772},"249":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"252":{"tf":1.0},"315":{"tf":1.4142135623730951},"343":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"374":{"tf":1.4142135623730951},"384":{"tf":1.0},"479":{"tf":1.0},"502":{"tf":1.4142135623730951},"58":{"tf":1.4142135623730951},"64":{"tf":1.0},"68":{"tf":1.0},"98":{"tf":1.4142135623730951}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":4,"docs":{"134":{"tf":1.0},"332":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0}}}},"df":2,"docs":{"237":{"tf":1.0},"244":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"493":{"tf":1.0}},"i":{"df":8,"docs":{"142":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.4142135623730951},"457":{"tf":1.0},"496":{"tf":1.7320508075688772},"519":{"tf":1.0},"74":{"tf":1.0},"98":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":6,"docs":{"134":{"tf":1.0},"267":{"tf":1.0},"301":{"tf":1.0},"334":{"tf":1.4142135623730951},"337":{"tf":1.0},"346":{"tf":1.4142135623730951}}}}}}},"d":{"df":9,"docs":{"164":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"196":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.0},"43":{"tf":1.0},"450":{"tf":1.0},"476":{"tf":1.0}}},"df":2,"docs":{"323":{"tf":1.4142135623730951},"330":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":5,"docs":{"269":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"57":{"tf":1.0},"87":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"215":{"tf":1.0},"240":{"tf":1.0}}}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"228":{"tf":1.0},"234":{"tf":1.0},"75":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"g":{"df":31,"docs":{"107":{"tf":1.0},"109":{"tf":1.0},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0},"2":{"tf":1.0},"285":{"tf":1.0},"298":{"tf":1.4142135623730951},"301":{"tf":1.0},"302":{"tf":1.0},"322":{"tf":1.0},"328":{"tf":1.0},"348":{"tf":1.0},"357":{"tf":1.0},"361":{"tf":1.0},"363":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":1.0},"372":{"tf":1.7320508075688772},"379":{"tf":1.4142135623730951},"38":{"tf":1.0},"389":{"tf":1.0},"391":{"tf":1.0},"393":{"tf":1.0},"407":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"6":{"tf":1.0},"70":{"tf":1.0},"89":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"t":{"df":1,"docs":{"48":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"460":{"tf":1.4142135623730951},"465":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":22,"docs":{"123":{"tf":1.0},"173":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"207":{"tf":1.0},"224":{"tf":1.0},"226":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"267":{"tf":1.0},"280":{"tf":1.0},"303":{"tf":1.7320508075688772},"304":{"tf":1.0},"338":{"tf":1.0},"35":{"tf":1.4142135623730951},"36":{"tf":1.0},"44":{"tf":1.0},"466":{"tf":2.0},"475":{"tf":1.0},"477":{"tf":1.0},"61":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":5,"docs":{"314":{"tf":1.0},"324":{"tf":2.8284271247461903},"329":{"tf":1.4142135623730951},"404":{"tf":1.0},"96":{"tf":1.7320508075688772}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"321":{"tf":1.0},"324":{"tf":1.7320508075688772},"398":{"tf":1.0},"95":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"477":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"c":{"df":3,"docs":{"133":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":3,"docs":{"115":{"tf":1.0},"350":{"tf":1.0},"73":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"104":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"247":{"tf":1.0},"84":{"tf":1.0}},"n":{"df":2,"docs":{"241":{"tf":1.0},"73":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"{":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"/":{"c":{"d":{"df":2,"docs":{"18":{"tf":1.0},"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"337":{"tf":1.4142135623730951}}},"l":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"257":{"tf":1.0}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"321":{"tf":1.4142135623730951},"409":{"tf":1.4142135623730951}}}},"u":{"d":{"df":66,"docs":{"105":{"tf":1.0},"108":{"tf":1.4142135623730951},"114":{"tf":1.0},"118":{"tf":1.4142135623730951},"127":{"tf":1.0},"134":{"tf":1.0},"143":{"tf":1.0},"147":{"tf":1.0},"182":{"tf":2.0},"183":{"tf":1.7320508075688772},"185":{"tf":1.4142135623730951},"186":{"tf":1.0},"192":{"tf":1.0},"205":{"tf":2.0},"225":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.7320508075688772},"24":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"263":{"tf":1.0},"275":{"tf":1.0},"290":{"tf":1.7320508075688772},"292":{"tf":1.4142135623730951},"334":{"tf":1.0},"337":{"tf":1.0},"352":{"tf":1.4142135623730951},"354":{"tf":1.0},"359":{"tf":1.4142135623730951},"360":{"tf":1.0},"434":{"tf":1.7320508075688772},"445":{"tf":1.0},"446":{"tf":1.4142135623730951},"449":{"tf":1.4142135623730951},"451":{"tf":2.0},"452":{"tf":1.4142135623730951},"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0},"460":{"tf":1.0},"461":{"tf":1.0},"462":{"tf":1.0},"463":{"tf":1.0},"465":{"tf":1.0},"466":{"tf":1.0},"467":{"tf":1.0},"469":{"tf":1.0},"471":{"tf":1.0},"472":{"tf":1.0},"478":{"tf":1.0},"479":{"tf":1.0},"480":{"tf":1.4142135623730951},"481":{"tf":1.7320508075688772},"487":{"tf":1.0},"49":{"tf":1.0},"490":{"tf":1.4142135623730951},"53":{"tf":1.0},"90":{"tf":1.0},"92":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"189":{"tf":1.4142135623730951},"473":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"r":{"df":4,"docs":{"139":{"tf":1.0},"157":{"tf":1.0},"357":{"tf":1.0},"36":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"139":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"i":{"/":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"p":{"df":3,"docs":{"328":{"tf":1.0},"330":{"tf":1.0},"358":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":19,"docs":{"161":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"170":{"tf":1.0},"173":{"tf":1.4142135623730951},"188":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.7320508075688772},"225":{"tf":1.0},"23":{"tf":2.23606797749979},"255":{"tf":1.0},"257":{"tf":1.4142135623730951},"334":{"tf":1.0},"335":{"tf":1.0},"338":{"tf":1.0},"407":{"tf":1.4142135623730951},"441":{"tf":1.7320508075688772},"64":{"tf":1.7320508075688772},"66":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"(":{"\\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"352":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":3,"docs":{"352":{"tf":1.0},"354":{"tf":1.0},"460":{"tf":1.4142135623730951}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"164":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"104":{"tf":1.0}}}},"u":{"d":{"df":16,"docs":{"109":{"tf":1.0},"135":{"tf":2.23606797749979},"157":{"tf":1.0},"281":{"tf":1.0},"289":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.4142135623730951},"353":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":1.7320508075688772},"359":{"tf":1.4142135623730951},"361":{"tf":2.0},"372":{"tf":1.0},"65":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"m":{"d":{"+":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"+":{"df":0,"docs":{},"v":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":1,"docs":{"66":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"77":{"tf":1.0}}}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"238":{"tf":1.0},"299":{"tf":1.0}}}},"df":0,"docs":{}},"df":83,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"107":{"tf":1.7320508075688772},"108":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"125":{"tf":2.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"141":{"tf":3.0},"143":{"tf":1.0},"153":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"183":{"tf":1.7320508075688772},"185":{"tf":1.4142135623730951},"186":{"tf":1.0},"192":{"tf":1.0},"202":{"tf":1.0},"205":{"tf":2.0},"218":{"tf":1.7320508075688772},"225":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":1.0},"239":{"tf":1.4142135623730951},"24":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"258":{"tf":1.0},"26":{"tf":1.0},"264":{"tf":1.4142135623730951},"275":{"tf":1.0},"28":{"tf":1.0},"280":{"tf":1.0},"285":{"tf":1.4142135623730951},"293":{"tf":1.0},"302":{"tf":1.0},"309":{"tf":1.0},"335":{"tf":1.0},"34":{"tf":1.7320508075688772},"356":{"tf":1.0},"36":{"tf":1.7320508075688772},"365":{"tf":1.4142135623730951},"371":{"tf":1.0},"375":{"tf":1.0},"39":{"tf":1.0},"413":{"tf":1.0},"445":{"tf":1.0},"446":{"tf":1.4142135623730951},"449":{"tf":1.4142135623730951},"451":{"tf":2.0},"452":{"tf":1.0},"473":{"tf":1.4142135623730951},"478":{"tf":1.0},"479":{"tf":1.0},"480":{"tf":1.0},"481":{"tf":1.7320508075688772},"487":{"tf":1.0},"49":{"tf":1.0},"490":{"tf":1.4142135623730951},"514":{"tf":2.0},"515":{"tf":1.0},"521":{"tf":1.0},"525":{"tf":1.7320508075688772},"53":{"tf":1.4142135623730951},"55":{"tf":1.0},"56":{"tf":1.0},"61":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"81":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0},"92":{"tf":1.4142135623730951},"96":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"121":{"tf":1.0},"248":{"tf":1.4142135623730951},"251":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"371":{"tf":1.0},"53":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"272":{"tf":1.0},"273":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"155":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":3,"docs":{"296":{"tf":1.0},"323":{"tf":1.4142135623730951},"401":{"tf":1.0}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":7,"docs":{"244":{"tf":1.0},"274":{"tf":1.0},"323":{"tf":1.0},"380":{"tf":1.0},"465":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"144":{"tf":1.0}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"346":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"303":{"tf":1.0},"335":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":17,"docs":{"185":{"tf":1.0},"225":{"tf":1.4142135623730951},"226":{"tf":1.0},"23":{"tf":1.0},"257":{"tf":1.7320508075688772},"338":{"tf":1.0},"372":{"tf":1.0},"388":{"tf":1.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"442":{"tf":1.7320508075688772},"449":{"tf":1.0},"453":{"tf":1.4142135623730951},"490":{"tf":1.0},"5":{"tf":1.7320508075688772},"66":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"104":{"tf":1.0},"117":{"tf":1.0},"124":{"tf":1.0},"341":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":6,"docs":{"125":{"tf":1.4142135623730951},"136":{"tf":1.0},"143":{"tf":1.0},"215":{"tf":1.0},"36":{"tf":1.0},"371":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"206":{"tf":1.4142135623730951},"228":{"tf":1.0},"23":{"tf":1.0},"251":{"tf":1.0},"338":{"tf":1.0},"459":{"tf":1.4142135623730951},"487":{"tf":1.0},"493":{"tf":1.0},"510":{"tf":1.0},"512":{"tf":1.0},"75":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"191":{"tf":1.0},"226":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"338":{"tf":1.0},"351":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"21":{"tf":1.0},"359":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951}}}}}}},"t":{"df":18,"docs":{"100":{"tf":1.0},"156":{"tf":1.0},"170":{"tf":1.0},"204":{"tf":1.0},"250":{"tf":1.0},"269":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.7320508075688772},"324":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.7320508075688772},"393":{"tf":1.0},"401":{"tf":1.0},"404":{"tf":1.4142135623730951},"413":{"tf":1.0},"483":{"tf":1.7320508075688772},"63":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":7,"docs":{"189":{"tf":1.4142135623730951},"301":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"502":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":7,"docs":{"27":{"tf":1.0},"333":{"tf":1.0},"360":{"tf":1.4142135623730951},"391":{"tf":1.0},"4":{"tf":1.0},"486":{"tf":1.0},"77":{"tf":1.0}},"e":{"d":{":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"498":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":18,"docs":{"234":{"tf":1.0},"308":{"tf":1.4142135623730951},"321":{"tf":1.0},"323":{"tf":1.0},"330":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"343":{"tf":1.0},"346":{"tf":1.0},"353":{"tf":1.0},"357":{"tf":1.0},"368":{"tf":1.0},"372":{"tf":1.0},"385":{"tf":1.0},"391":{"tf":1.0},"405":{"tf":1.0},"463":{"tf":1.0},"502":{"tf":1.0}}}},"i":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"138":{"tf":1.4142135623730951},"149":{"tf":1.4142135623730951},"256":{"tf":1.4142135623730951},"258":{"tf":1.0}}},"s":{"df":10,"docs":{"138":{"tf":1.4142135623730951},"157":{"tf":1.0},"234":{"tf":1.0},"285":{"tf":1.4142135623730951},"291":{"tf":1.0},"292":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"346":{"tf":1.0},"372":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"291":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":8,"docs":{"138":{"tf":1.4142135623730951},"154":{"tf":1.0},"286":{"tf":2.0},"291":{"tf":1.7320508075688772},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":5,"docs":{"0":{"tf":1.0},"153":{"tf":1.0},"254":{"tf":1.0},"338":{"tf":1.0},"511":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"214":{"tf":1.0}}}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"495":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":53,"docs":{"100":{"tf":1.0},"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.4142135623730951},"128":{"tf":1.0},"130":{"tf":1.4142135623730951},"142":{"tf":1.7320508075688772},"15":{"tf":1.0},"197":{"tf":1.0},"199":{"tf":1.0},"202":{"tf":1.0},"251":{"tf":1.0},"318":{"tf":1.0},"350":{"tf":1.4142135623730951},"36":{"tf":1.0},"458":{"tf":1.4142135623730951},"473":{"tf":1.0},"49":{"tf":1.0},"518":{"tf":1.4142135623730951},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"69":{"tf":2.0},"70":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.4142135623730951},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"u":{"df":6,"docs":{"199":{"tf":1.0},"200":{"tf":1.0},"473":{"tf":1.0},"495":{"tf":1.0},"56":{"tf":1.0},"79":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"339":{"tf":1.0},"352":{"tf":1.0},"358":{"tf":1.0},"466":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.0}}}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"157":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"56":{"tf":1.0},"81":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":3,"docs":{"238":{"tf":1.0},"247":{"tf":1.7320508075688772},"98":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":9,"docs":{"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"238":{"tf":2.23606797749979},"247":{"tf":1.7320508075688772},"334":{"tf":1.0},"337":{"tf":1.0},"465":{"tf":1.4142135623730951},"501":{"tf":1.0},"76":{"tf":1.0}}}}},"df":12,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"520":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"354":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"n":{"c":{"df":0,"docs":{},"l":{"df":5,"docs":{"266":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0},"337":{"tf":1.4142135623730951},"345":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"133":{"tf":1.0},"147":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"298":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"293":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":3,"docs":{"169":{"tf":1.0},"196":{"tf":1.0},"270":{"tf":1.0}}}}}}},"/":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"185":{"tf":1.0},"205":{"tf":1.0},"258":{"tf":1.0},"449":{"tf":1.0},"490":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"k":{"b":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"\\"":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"303":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"5":{":":{"5":{"df":1,"docs":{"295":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"290":{"tf":1.0},"292":{"tf":1.0},"303":{"tf":1.4142135623730951},"304":{"tf":1.0},"311":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"345":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"/":{"*":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"311":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"299":{"tf":1.0},"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"299":{"tf":1.0},"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"299":{"tf":1.0},"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"{":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{",":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{",":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"}":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"345":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"304":{"tf":1.4142135623730951}},"s":{"/":{"*":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"310":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"b":{"df":4,"docs":{"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"303":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":71,"docs":{"109":{"tf":1.4142135623730951},"133":{"tf":2.0},"139":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"156":{"tf":1.0},"157":{"tf":1.0},"17":{"tf":1.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.0},"19":{"tf":1.4142135623730951},"213":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.0},"27":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":2.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.4142135623730951},"291":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":2.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"297":{"tf":1.7320508075688772},"298":{"tf":1.7320508075688772},"299":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"303":{"tf":1.0},"304":{"tf":2.23606797749979},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"307":{"tf":2.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.7320508075688772},"311":{"tf":1.0},"328":{"tf":1.4142135623730951},"332":{"tf":1.7320508075688772},"333":{"tf":2.23606797749979},"334":{"tf":1.0},"335":{"tf":2.0},"337":{"tf":1.7320508075688772},"338":{"tf":1.0},"339":{"tf":1.4142135623730951},"341":{"tf":1.0},"344":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":2.23606797749979},"347":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"361":{"tf":1.0},"369":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0},"413":{"tf":1.0},"51":{"tf":1.4142135623730951},"63":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0},"89":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"139":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"139":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"139":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":72,"docs":{"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"140":{"tf":1.7320508075688772},"149":{"tf":1.0},"151":{"tf":1.0},"161":{"tf":1.0},"170":{"tf":2.0},"171":{"tf":1.0},"178":{"tf":1.4142135623730951},"182":{"tf":1.0},"185":{"tf":1.4142135623730951},"19":{"tf":2.0},"192":{"tf":1.0},"196":{"tf":1.0},"205":{"tf":1.0},"21":{"tf":1.0},"212":{"tf":2.0},"213":{"tf":1.0},"225":{"tf":1.4142135623730951},"252":{"tf":1.0},"257":{"tf":1.0},"265":{"tf":1.4142135623730951},"27":{"tf":1.0},"279":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":2.0},"286":{"tf":2.0},"288":{"tf":1.0},"292":{"tf":1.0},"294":{"tf":1.0},"303":{"tf":1.7320508075688772},"304":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"327":{"tf":1.7320508075688772},"331":{"tf":2.0},"332":{"tf":1.4142135623730951},"333":{"tf":1.0},"334":{"tf":1.7320508075688772},"335":{"tf":1.4142135623730951},"336":{"tf":1.0},"337":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.0},"344":{"tf":1.7320508075688772},"345":{"tf":1.0},"346":{"tf":1.0},"347":{"tf":1.0},"348":{"tf":1.0},"354":{"tf":1.7320508075688772},"356":{"tf":1.0},"357":{"tf":1.0},"379":{"tf":1.0},"40":{"tf":1.0},"418":{"tf":1.7320508075688772},"420":{"tf":1.7320508075688772},"431":{"tf":1.7320508075688772},"449":{"tf":1.4142135623730951},"463":{"tf":1.0},"479":{"tf":1.4142135623730951},"488":{"tf":1.4142135623730951},"490":{"tf":1.4142135623730951},"499":{"tf":1.0},"51":{"tf":1.0},"521":{"tf":1.0},"64":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0},"97":{"tf":1.7320508075688772}}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"136":{"tf":1.4142135623730951},"371":{"tf":1.0},"372":{"tf":1.4142135623730951},"381":{"tf":1.4142135623730951},"383":{"tf":1.0},"384":{"tf":1.0},"391":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"107":{"tf":1.0},"124":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"342":{"tf":1.0},"357":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"226":{"tf":1.0}}}}}},"df":0,"docs":{}}},"n":{"df":2,"docs":{"179":{"tf":1.0},"238":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"_":{"d":{"b":{"df":1,"docs":{"238":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":24,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"111":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951},"144":{"tf":1.0},"186":{"tf":1.4142135623730951},"190":{"tf":1.4142135623730951},"226":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"251":{"tf":1.0},"451":{"tf":1.0},"452":{"tf":1.4142135623730951},"462":{"tf":1.0},"47":{"tf":1.0},"49":{"tf":1.0},"517":{"tf":1.0},"56":{"tf":1.0},"68":{"tf":1.0},"70":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0},"84":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"250":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"df":13,"docs":{"116":{"tf":1.0},"198":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"336":{"tf":1.4142135623730951},"355":{"tf":1.4142135623730951},"370":{"tf":1.4142135623730951},"403":{"tf":1.4142135623730951},"456":{"tf":1.0},"460":{"tf":1.4142135623730951},"494":{"tf":1.7320508075688772},"520":{"tf":1.0},"73":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":7,"docs":{"340":{"tf":1.4142135623730951},"382":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951},"466":{"tf":1.0},"493":{"tf":1.0},"73":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":13,"docs":{"110":{"tf":1.0},"121":{"tf":1.0},"219":{"tf":1.7320508075688772},"234":{"tf":1.0},"238":{"tf":1.0},"244":{"tf":1.0},"255":{"tf":1.0},"36":{"tf":1.0},"371":{"tf":1.0},"470":{"tf":1.0},"502":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":1.0}}}}},"t":{"df":1,"docs":{"146":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"357":{"tf":1.0},"365":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"137":{"tf":1.4142135623730951},"292":{"tf":1.0}}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"323":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"[":{"4":{".":{".":{"4":{"df":1,"docs":{"324":{"tf":1.0}}},"]":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"\\"":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"df":45,"docs":{"100":{"tf":1.0},"139":{"tf":1.0},"150":{"tf":1.0},"197":{"tf":1.4142135623730951},"200":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"209":{"tf":1.0},"210":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.4142135623730951},"247":{"tf":1.0},"261":{"tf":1.0},"264":{"tf":1.7320508075688772},"28":{"tf":1.0},"314":{"tf":1.4142135623730951},"321":{"tf":1.7320508075688772},"322":{"tf":1.4142135623730951},"323":{"tf":2.0},"324":{"tf":3.872983346207417},"328":{"tf":1.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.4142135623730951},"36":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"405":{"tf":1.0},"410":{"tf":1.0},"413":{"tf":1.0},"455":{"tf":1.0},"478":{"tf":1.7320508075688772},"487":{"tf":1.0},"493":{"tf":2.0},"499":{"tf":1.0},"503":{"tf":1.0},"53":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.4142135623730951},"95":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"(":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":43,"docs":{"104":{"tf":1.4142135623730951},"113":{"tf":1.0},"114":{"tf":1.0},"116":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"144":{"tf":1.0},"151":{"tf":1.0},"198":{"tf":1.0},"231":{"tf":2.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.0},"250":{"tf":2.0},"251":{"tf":1.0},"258":{"tf":1.0},"276":{"tf":1.0},"331":{"tf":1.0},"332":{"tf":1.4142135623730951},"349":{"tf":1.0},"350":{"tf":1.4142135623730951},"364":{"tf":1.0},"365":{"tf":1.4142135623730951},"396":{"tf":1.4142135623730951},"409":{"tf":1.0},"445":{"tf":1.0},"446":{"tf":1.0},"456":{"tf":1.0},"460":{"tf":1.4142135623730951},"465":{"tf":1.4142135623730951},"48":{"tf":1.0},"486":{"tf":1.0},"494":{"tf":2.0},"496":{"tf":1.0},"520":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.7320508075688772},"75":{"tf":1.0},"92":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"134":{"tf":1.0},"147":{"tf":1.0},"151":{"tf":1.0},"154":{"tf":1.4142135623730951},"267":{"tf":1.0},"280":{"tf":1.0},"285":{"tf":1.7320508075688772},"287":{"tf":1.7320508075688772},"288":{"tf":1.0},"295":{"tf":2.0},"300":{"tf":1.0},"301":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"k":{"b":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"288":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"301":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"26":{"tf":2.0},"36":{"tf":1.0},"46":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"30":{"tf":1.0},"46":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":12,"docs":{"105":{"tf":1.0},"135":{"tf":1.0},"151":{"tf":1.0},"215":{"tf":1.0},"269":{"tf":1.4142135623730951},"289":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.0},"390":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"67":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"140":{"tf":2.0},"74":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"t":{"df":5,"docs":{"238":{"tf":1.0},"296":{"tf":1.0},"350":{"tf":1.0},"379":{"tf":1.0},"409":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"i":{"df":4,"docs":{"170":{"tf":1.0},"220":{"tf":1.0},"241":{"tf":1.0},"324":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"299":{"tf":1.7320508075688772},"303":{"tf":1.4142135623730951}}}}}}},"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"335":{"tf":1.0},"345":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"354":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":62,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"126":{"tf":1.0},"130":{"tf":1.0},"132":{"tf":1.4142135623730951},"135":{"tf":1.0},"15":{"tf":1.0},"165":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.0},"175":{"tf":1.0},"178":{"tf":1.4142135623730951},"181":{"tf":1.0},"231":{"tf":1.0},"255":{"tf":1.4142135623730951},"260":{"tf":2.0},"263":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"278":{"tf":1.0},"293":{"tf":1.0},"318":{"tf":1.0},"353":{"tf":2.0},"354":{"tf":1.7320508075688772},"358":{"tf":1.0},"360":{"tf":1.0},"362":{"tf":1.0},"487":{"tf":1.0},"50":{"tf":1.4142135623730951},"66":{"tf":1.7320508075688772},"69":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"190":{"tf":1.0},"285":{"tf":1.0},"295":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"308":{"tf":1.0},"90":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"[":{"0":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"t":{"df":14,"docs":{"109":{"tf":1.0},"135":{"tf":1.4142135623730951},"289":{"tf":1.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.4142135623730951},"361":{"tf":1.0},"365":{"tf":1.4142135623730951},"367":{"tf":1.0},"368":{"tf":1.0},"371":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"511":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"149":{"tf":1.4142135623730951},"157":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"153":{"tf":1.0},"278":{"tf":1.0},"463":{"tf":1.0}}}},"df":1,"docs":{"159":{"tf":1.0}}}}}},"p":{"df":2,"docs":{"170":{"tf":1.0},"220":{"tf":1.0}},"u":{"df":1,"docs":{"98":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"{":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"2":{"df":1,"docs":{"493":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"165":{"tf":1.4142135623730951},"379":{"tf":1.0},"72":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"k":{"b":{"df":2,"docs":{"164":{"tf":1.0},"324":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":37,"docs":{"143":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.7320508075688772},"198":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"202":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.0},"208":{"tf":1.0},"213":{"tf":1.4142135623730951},"226":{"tf":1.0},"234":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.0},"250":{"tf":1.7320508075688772},"257":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"261":{"tf":1.4142135623730951},"31":{"tf":1.0},"32":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":2.0},"345":{"tf":1.4142135623730951},"407":{"tf":1.0},"46":{"tf":1.0},"460":{"tf":1.4142135623730951},"461":{"tf":2.23606797749979},"462":{"tf":1.0},"465":{"tf":1.4142135623730951},"471":{"tf":1.0},"492":{"tf":1.7320508075688772},"494":{"tf":1.0},"495":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"354":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"298":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":3,"docs":{"346":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"c":{"df":2,"docs":{"231":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":5,"docs":{"171":{"tf":1.0},"242":{"tf":1.4142135623730951},"251":{"tf":1.0},"274":{"tf":1.4142135623730951},"466":{"tf":1.4142135623730951}}}}}},"s":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"j":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"+":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"+":{"df":0,"docs":{},"v":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"383":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"l":{"df":3,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"190":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":12,"docs":{"114":{"tf":1.0},"144":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":1.0},"314":{"tf":1.0},"387":{"tf":1.4142135623730951},"396":{"tf":1.0},"460":{"tf":1.4142135623730951},"461":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"98":{"tf":1.0}}}}}},"v":{"df":6,"docs":{"231":{"tf":1.0},"334":{"tf":1.0},"338":{"tf":1.0},"343":{"tf":1.0},"460":{"tf":1.0},"73":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}}},"df":36,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"124":{"tf":1.0},"140":{"tf":1.4142135623730951},"169":{"tf":1.0},"192":{"tf":1.0},"212":{"tf":1.4142135623730951},"22":{"tf":1.0},"220":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"280":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.4142135623730951},"314":{"tf":1.0},"319":{"tf":1.0},"321":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"326":{"tf":1.0},"330":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.4142135623730951},"40":{"tf":1.0},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"440":{"tf":1.7320508075688772},"461":{"tf":1.0},"479":{"tf":1.0},"492":{"tf":1.0},"496":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"52":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"140":{"tf":1.0},"91":{"tf":1.0}}}}}}}}}},"d":{")":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"203":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":11,"docs":{"196":{"tf":1.0},"203":{"tf":1.4142135623730951},"210":{"tf":1.4142135623730951},"227":{"tf":1.7320508075688772},"238":{"tf":1.0},"251":{"tf":1.0},"270":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"76":{"tf":1.4142135623730951},"86":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"238":{"tf":1.4142135623730951},"247":{"tf":2.0},"262":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":23,"docs":{"111":{"tf":1.0},"151":{"tf":1.0},"178":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"236":{"tf":1.0},"262":{"tf":1.0},"289":{"tf":1.0},"322":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":2.0},"369":{"tf":1.0},"375":{"tf":1.0},"377":{"tf":1.0},"385":{"tf":1.0},"387":{"tf":1.0},"410":{"tf":1.0},"456":{"tf":1.0},"465":{"tf":1.0},"500":{"tf":1.0},"517":{"tf":1.0},"73":{"tf":1.4142135623730951},"75":{"tf":1.7320508075688772}},"e":{"(":{"#":{"[":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"237":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":17,"docs":{"135":{"tf":1.0},"155":{"tf":1.0},"247":{"tf":1.0},"278":{"tf":1.0},"321":{"tf":1.7320508075688772},"324":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"391":{"tf":1.0},"398":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.4142135623730951},"446":{"tf":1.0},"502":{"tf":1.0},"515":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":8,"docs":{"331":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"393":{"tf":1.0},"413":{"tf":1.4142135623730951},"76":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"<":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"c":{"df":3,"docs":{"261":{"tf":1.7320508075688772},"321":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"y":{"df":7,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":1.7320508075688772},"463":{"tf":1.4142135623730951},"465":{"tf":1.4142135623730951},"76":{"tf":1.0}}}},"b":{"df":5,"docs":{"179":{"tf":1.0},"368":{"tf":1.0},"463":{"tf":1.0},"55":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"369":{"tf":1.0},"379":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"df":1,"docs":{"289":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"g":{"df":7,"docs":{"117":{"tf":1.0},"191":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"247":{"tf":1.0},"277":{"tf":1.0},"289":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":5,"docs":{"331":{"tf":1.0},"349":{"tf":1.0},"364":{"tf":1.0},"460":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":78,"docs":{"101":{"tf":1.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.4142135623730951},"111":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.7320508075688772},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.0},"127":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.4142135623730951},"151":{"tf":1.0},"157":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.0},"196":{"tf":1.4142135623730951},"198":{"tf":2.23606797749979},"199":{"tf":1.0},"200":{"tf":1.0},"208":{"tf":1.7320508075688772},"217":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"232":{"tf":1.4142135623730951},"233":{"tf":1.0},"234":{"tf":2.6457513110645907},"238":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":2.23606797749979},"246":{"tf":1.0},"247":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":4.123105625617661},"251":{"tf":1.4142135623730951},"257":{"tf":1.0},"270":{"tf":1.0},"282":{"tf":1.0},"335":{"tf":1.4142135623730951},"348":{"tf":1.0},"354":{"tf":1.4142135623730951},"363":{"tf":1.0},"369":{"tf":1.7320508075688772},"393":{"tf":1.0},"397":{"tf":1.4142135623730951},"413":{"tf":1.0},"456":{"tf":2.0},"458":{"tf":1.4142135623730951},"460":{"tf":2.0},"461":{"tf":1.4142135623730951},"463":{"tf":1.4142135623730951},"465":{"tf":1.4142135623730951},"466":{"tf":1.4142135623730951},"467":{"tf":2.0},"48":{"tf":1.0},"480":{"tf":1.7320508075688772},"492":{"tf":1.0},"494":{"tf":3.1622776601683795},"498":{"tf":1.7320508075688772},"505":{"tf":1.0},"511":{"tf":1.0},"520":{"tf":1.7320508075688772},"55":{"tf":1.4142135623730951},"59":{"tf":1.4142135623730951},"60":{"tf":1.0},"61":{"tf":1.0},"67":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":2.6457513110645907},"77":{"tf":1.0},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"86":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"140":{"tf":1.0},"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"83":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"498":{"tf":1.0}}}},"df":0,"docs":{}},"v":{"1":{"df":1,"docs":{"56":{"tf":1.0}}},"2":{"df":1,"docs":{"56":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"346":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"100":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"274":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"282":{"tf":1.0}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"351":{"tf":1.0},"354":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":36,"docs":{"136":{"tf":1.4142135623730951},"140":{"tf":1.7320508075688772},"154":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"301":{"tf":1.0},"303":{"tf":1.4142135623730951},"308":{"tf":1.0},"324":{"tf":1.0},"327":{"tf":2.449489742783178},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"354":{"tf":1.4142135623730951},"357":{"tf":1.0},"380":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0},"413":{"tf":1.0},"492":{"tf":2.0},"493":{"tf":2.0},"494":{"tf":1.7320508075688772},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.4142135623730951},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.7320508075688772},"512":{"tf":1.0}},"s":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"290":{"tf":1.0},"302":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"301":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"109":{"tf":1.0},"134":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.0},"323":{"tf":2.8284271247461903},"335":{"tf":1.0},"345":{"tf":1.0},"360":{"tf":1.0},"401":{"tf":2.23606797749979},"51":{"tf":1.0},"74":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.4142135623730951},"285":{"tf":1.0},"334":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"257":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"262":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"279":{"tf":1.0},"303":{"tf":1.0},"322":{"tf":1.0},"400":{"tf":1.0},"406":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"139":{"tf":1.0},"477":{"tf":1.4142135623730951}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":15,"docs":{"144":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"234":{"tf":1.0},"338":{"tf":1.0},"350":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"358":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.4142135623730951},"73":{"tf":1.0},"79":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"111":{"tf":1.0},"199":{"tf":1.0},"495":{"tf":1.4142135623730951},"56":{"tf":1.0},"80":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":8,"docs":{"18":{"tf":1.0},"290":{"tf":1.0},"337":{"tf":1.0},"350":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0},"494":{"tf":1.0},"96":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"156":{"tf":1.0},"494":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"512":{"tf":2.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"257":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":2,"docs":{"293":{"tf":1.0},"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"237":{"tf":1.0},"277":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"b":{"df":3,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"337":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":17,"docs":{"167":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"241":{"tf":1.0},"326":{"tf":2.0},"492":{"tf":2.449489742783178},"493":{"tf":2.23606797749979},"494":{"tf":2.0},"495":{"tf":2.0},"496":{"tf":1.7320508075688772},"498":{"tf":1.7320508075688772},"500":{"tf":2.23606797749979},"501":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.4142135623730951},"514":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"267":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"301":{"tf":1.0},"324":{"tf":1.7320508075688772},"335":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":91,"docs":{"100":{"tf":1.0},"102":{"tf":1.0},"126":{"tf":1.4142135623730951},"130":{"tf":1.0},"131":{"tf":2.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.0},"248":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"284":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0},"313":{"tf":1.7320508075688772},"314":{"tf":1.0},"315":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"330":{"tf":1.4142135623730951},"343":{"tf":1.0},"344":{"tf":1.0},"384":{"tf":1.0},"395":{"tf":1.0},"412":{"tf":1.0},"466":{"tf":1.0},"47":{"tf":1.0},"502":{"tf":1.4142135623730951},"68":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":15,"docs":{"104":{"tf":1.0},"17":{"tf":1.0},"201":{"tf":1.4142135623730951},"225":{"tf":1.0},"241":{"tf":1.0},"256":{"tf":1.4142135623730951},"257":{"tf":1.0},"282":{"tf":1.0},"30":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":1.0},"46":{"tf":1.0},"515":{"tf":1.0},"72":{"tf":1.0},"98":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"139":{"tf":1.0},"238":{"tf":1.0},"264":{"tf":1.0},"324":{"tf":1.0},"337":{"tf":1.0},"379":{"tf":1.0},"381":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"289":{"tf":1.0}}}}}}}},"v":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"337":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.0},"285":{"tf":1.0}}}}}}},"df":1,"docs":{"133":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":2,"docs":{"307":{"tf":1.4142135623730951},"353":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":47,"docs":{"104":{"tf":1.4142135623730951},"109":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"117":{"tf":1.0},"120":{"tf":1.4142135623730951},"124":{"tf":1.4142135623730951},"125":{"tf":2.23606797749979},"133":{"tf":1.0},"135":{"tf":1.0},"139":{"tf":1.0},"157":{"tf":1.0},"18":{"tf":1.0},"203":{"tf":1.0},"228":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"236":{"tf":1.0},"238":{"tf":1.7320508075688772},"244":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.4142135623730951},"251":{"tf":1.0},"26":{"tf":1.0},"282":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.0},"334":{"tf":1.0},"338":{"tf":1.0},"350":{"tf":1.4142135623730951},"354":{"tf":1.0},"356":{"tf":1.4142135623730951},"359":{"tf":1.0},"36":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"371":{"tf":1.4142135623730951},"375":{"tf":1.4142135623730951},"391":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"480":{"tf":1.0},"524":{"tf":1.7320508075688772},"59":{"tf":1.4142135623730951},"64":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"76":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"343":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"346":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":5,"docs":{"12":{"tf":1.4142135623730951},"17":{"tf":1.0},"27":{"tf":2.0},"36":{"tf":1.0},"40":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"136":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":12,"docs":{"106":{"tf":1.4142135623730951},"110":{"tf":1.4142135623730951},"117":{"tf":1.0},"133":{"tf":1.0},"140":{"tf":1.0},"285":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"307":{"tf":1.4142135623730951},"346":{"tf":1.0},"372":{"tf":1.0},"43":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"366":{"tf":1.0},"384":{"tf":1.0}},"i":{"df":1,"docs":{"98":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":9,"docs":{"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":2.23606797749979},"357":{"tf":2.23606797749979},"359":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"90":{"tf":1.0}},"s":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"263":{"tf":1.0},"354":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"r":{"df":2,"docs":{"140":{"tf":1.0},"222":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"214":{"tf":1.0},"512":{"tf":1.0},"70":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":6,"docs":{"143":{"tf":1.0},"202":{"tf":1.4142135623730951},"203":{"tf":1.0},"339":{"tf":1.0},"4":{"tf":1.7320508075688772},"489":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":18,"docs":{"0":{"tf":1.0},"107":{"tf":1.0},"140":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"257":{"tf":1.0},"269":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"338":{"tf":1.0},"375":{"tf":1.0},"450":{"tf":1.0},"476":{"tf":1.4142135623730951},"498":{"tf":1.0},"5":{"tf":1.0},"57":{"tf":1.0},"86":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"138":{"tf":1.0},"289":{"tf":1.0},"372":{"tf":1.0},"413":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":8,"docs":{"104":{"tf":1.0},"113":{"tf":1.0},"125":{"tf":1.0},"238":{"tf":1.0},"251":{"tf":1.0},"303":{"tf":1.4142135623730951},"333":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"142":{"tf":1.4142135623730951},"143":{"tf":1.0},"157":{"tf":1.0},"285":{"tf":1.0},"383":{"tf":1.0}},"i":{"df":9,"docs":{"101":{"tf":1.0},"104":{"tf":1.0},"137":{"tf":1.0},"142":{"tf":1.0},"303":{"tf":1.4142135623730951},"517":{"tf":1.4142135623730951},"518":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":12,"docs":{"104":{"tf":1.4142135623730951},"115":{"tf":1.0},"116":{"tf":1.0},"226":{"tf":1.0},"233":{"tf":1.0},"238":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"289":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"203":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"257":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"281":{"tf":1.0},"502":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"282":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"238":{"tf":1.0}}}}}}},"c":{"df":14,"docs":{"104":{"tf":1.0},"124":{"tf":1.0},"129":{"tf":1.0},"141":{"tf":2.23606797749979},"215":{"tf":1.0},"231":{"tf":1.0},"287":{"tf":1.4142135623730951},"300":{"tf":1.0},"308":{"tf":1.4142135623730951},"327":{"tf":2.23606797749979},"334":{"tf":1.0},"337":{"tf":1.0},"356":{"tf":1.0},"43":{"tf":1.0}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"234":{"tf":1.0},"357":{"tf":1.0},"372":{"tf":1.0}}}}},"s":{"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":1,"docs":{"3":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"345":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"338":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"237":{"tf":1.0}}}}}}}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":6,"docs":{"3":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":4,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":3,"docs":{"2":{"tf":1.0},"28":{"tf":1.0},"6":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"34":{"tf":1.0},"36":{"tf":1.0},"46":{"tf":1.0},"7":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"38":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"199":{"tf":1.0},"495":{"tf":1.0},"84":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"501":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":84,"docs":{"0":{"tf":2.0},"1":{"tf":1.7320508075688772},"10":{"tf":1.0},"101":{"tf":1.0},"108":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.0},"127":{"tf":1.4142135623730951},"128":{"tf":1.0},"130":{"tf":1.0},"134":{"tf":1.0},"14":{"tf":1.7320508075688772},"141":{"tf":1.7320508075688772},"154":{"tf":1.0},"198":{"tf":1.0},"2":{"tf":1.0},"202":{"tf":2.0},"208":{"tf":1.4142135623730951},"22":{"tf":1.0},"225":{"tf":1.0},"231":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"26":{"tf":1.0},"267":{"tf":1.0},"27":{"tf":1.4142135623730951},"276":{"tf":1.0},"28":{"tf":1.7320508075688772},"285":{"tf":1.4142135623730951},"287":{"tf":1.0},"29":{"tf":1.4142135623730951},"30":{"tf":1.0},"300":{"tf":2.0},"308":{"tf":1.4142135623730951},"314":{"tf":1.0},"33":{"tf":1.4142135623730951},"332":{"tf":1.4142135623730951},"333":{"tf":1.4142135623730951},"334":{"tf":1.7320508075688772},"337":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"34":{"tf":1.0},"345":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.4142135623730951},"36":{"tf":1.7320508075688772},"360":{"tf":1.0},"362":{"tf":1.4142135623730951},"392":{"tf":1.0},"396":{"tf":1.0},"4":{"tf":1.0},"409":{"tf":1.0},"412":{"tf":1.0},"438":{"tf":1.7320508075688772},"456":{"tf":1.0},"46":{"tf":2.0},"462":{"tf":1.7320508075688772},"472":{"tf":1.0},"480":{"tf":1.0},"5":{"tf":1.7320508075688772},"501":{"tf":1.0},"520":{"tf":1.4142135623730951},"56":{"tf":1.0},"59":{"tf":1.0},"6":{"tf":1.0},"61":{"tf":1.0},"67":{"tf":1.0},"7":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"89":{"tf":1.0},"9":{"tf":1.4142135623730951},"91":{"tf":1.0}}}}}},"s":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"124":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"321":{"tf":1.0},"324":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"500":{"tf":1.4142135623730951},"96":{"tf":1.0},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":2,"docs":{"142":{"tf":1.0},"356":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"\'":{"df":0,"docs":{},"t":{"df":12,"docs":{"101":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"156":{"tf":1.0},"307":{"tf":1.4142135623730951},"36":{"tf":1.0},"372":{"tf":1.0},"391":{"tf":1.0},"469":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":13,"docs":{"127":{"tf":1.0},"314":{"tf":1.0},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"324":{"tf":2.0},"326":{"tf":1.0},"327":{"tf":1.0},"398":{"tf":1.0},"462":{"tf":1.0},"466":{"tf":1.0},"500":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"134":{"tf":1.0},"267":{"tf":1.0},"285":{"tf":1.0},"294":{"tf":1.4142135623730951},"335":{"tf":1.0},"339":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":4,"docs":{"181":{"tf":1.0},"351":{"tf":1.0},"357":{"tf":2.0},"360":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"151":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"155":{"tf":1.0},"173":{"tf":1.4142135623730951},"257":{"tf":1.0},"259":{"tf":1.0}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"126":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0}},"n":{"df":37,"docs":{"109":{"tf":1.4142135623730951},"133":{"tf":1.7320508075688772},"157":{"tf":1.0},"17":{"tf":1.0},"284":{"tf":2.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"297":{"tf":1.7320508075688772},"298":{"tf":1.7320508075688772},"299":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"51":{"tf":1.4142135623730951},"64":{"tf":1.0},"89":{"tf":1.4142135623730951}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"98":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"321":{"tf":1.0},"405":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"243":{"tf":1.0},"341":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"77":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":10,"docs":{"101":{"tf":1.0},"116":{"tf":1.0},"127":{"tf":1.4142135623730951},"130":{"tf":1.0},"134":{"tf":1.7320508075688772},"234":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"333":{"tf":1.0},"61":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"203":{"tf":1.0},"238":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":8,"docs":{"295":{"tf":1.0},"324":{"tf":1.0},"326":{"tf":1.0},"333":{"tf":1.0},"496":{"tf":1.4142135623730951},"500":{"tf":1.0},"87":{"tf":1.0},"90":{"tf":1.0}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":12,"docs":{"121":{"tf":1.0},"236":{"tf":1.0},"238":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.0},"250":{"tf":1.0},"314":{"tf":1.0},"357":{"tf":1.0},"409":{"tf":1.0},"502":{"tf":1.0},"95":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"134":{"tf":1.0},"139":{"tf":1.0},"157":{"tf":1.0},"279":{"tf":1.0},"309":{"tf":1.4142135623730951},"332":{"tf":1.0},"334":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":6,"docs":{"140":{"tf":1.0},"157":{"tf":1.0},"238":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"372":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"238":{"tf":1.0},"250":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"251":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":6,"docs":{"174":{"tf":1.4142135623730951},"191":{"tf":1.0},"215":{"tf":1.0},"304":{"tf":1.7320508075688772},"475":{"tf":1.0},"477":{"tf":1.0}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":4,"docs":{"333":{"tf":1.0},"334":{"tf":1.0},"338":{"tf":1.0},"343":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"g":{"df":4,"docs":{"15":{"tf":1.0},"261":{"tf":1.7320508075688772},"56":{"tf":1.0},"70":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"261":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":14,"docs":{"143":{"tf":1.4142135623730951},"170":{"tf":1.0},"178":{"tf":1.0},"202":{"tf":1.7320508075688772},"204":{"tf":1.0},"212":{"tf":1.0},"220":{"tf":1.0},"29":{"tf":1.4142135623730951},"30":{"tf":1.0},"300":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"40":{"tf":1.0},"63":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"4":{"tf":1.0}}},"df":11,"docs":{"143":{"tf":1.0},"170":{"tf":1.0},"202":{"tf":1.7320508075688772},"203":{"tf":1.0},"220":{"tf":1.0},"338":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"39":{"tf":1.7320508075688772}}}}}}},"df":1,"docs":{"139":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":8,"docs":{"197":{"tf":1.0},"244":{"tf":1.0},"350":{"tf":1.0},"365":{"tf":1.0},"368":{"tf":1.0},"371":{"tf":1.0},"57":{"tf":1.0},"88":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":3,"docs":{"122":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"b":{"df":1,"docs":{"354":{"tf":1.0}},"e":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"263":{"tf":1.0},"354":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"354":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"\\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"352":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"146":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":5,"docs":{"133":{"tf":1.0},"266":{"tf":1.0},"293":{"tf":1.0},"334":{"tf":1.4142135623730951},"354":{"tf":1.0}}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"133":{"tf":1.7320508075688772},"134":{"tf":1.0},"138":{"tf":1.4142135623730951},"263":{"tf":1.0},"293":{"tf":1.0},"354":{"tf":2.23606797749979},"356":{"tf":1.0},"360":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":2,"docs":{"293":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":2,"docs":{"293":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"293":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":2,"docs":{"293":{"tf":1.0},"354":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"s":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"354":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"]":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":47,"docs":{"109":{"tf":2.23606797749979},"133":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.4142135623730951},"138":{"tf":1.7320508075688772},"140":{"tf":1.4142135623730951},"149":{"tf":1.0},"167":{"tf":1.0},"180":{"tf":1.4142135623730951},"182":{"tf":1.4142135623730951},"200":{"tf":1.0},"21":{"tf":1.7320508075688772},"212":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.0},"259":{"tf":1.0},"263":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.4142135623730951},"281":{"tf":1.7320508075688772},"285":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":2.23606797749979},"290":{"tf":1.0},"291":{"tf":1.4142135623730951},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.4142135623730951},"332":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"337":{"tf":1.0},"349":{"tf":1.7320508075688772},"350":{"tf":2.0},"351":{"tf":1.7320508075688772},"352":{"tf":2.0},"354":{"tf":2.23606797749979},"356":{"tf":1.7320508075688772},"361":{"tf":1.7320508075688772},"362":{"tf":1.4142135623730951},"430":{"tf":1.7320508075688772},"51":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":1,"docs":{"144":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"151":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"324":{"tf":1.0},"478":{"tf":1.4142135623730951}}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":26,"docs":{"143":{"tf":1.4142135623730951},"167":{"tf":1.7320508075688772},"178":{"tf":1.0},"182":{"tf":1.0},"212":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.4142135623730951},"289":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"299":{"tf":1.0},"302":{"tf":1.0},"327":{"tf":1.4142135623730951},"330":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"337":{"tf":1.0},"350":{"tf":1.0},"354":{"tf":1.7320508075688772},"369":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"413":{"tf":1.0},"492":{"tf":1.0},"70":{"tf":1.0},"97":{"tf":1.7320508075688772}},"e":{"_":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"97":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"238":{"tf":1.0}}}}}}},"d":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"238":{"tf":1.4142135623730951},"324":{"tf":1.0},"76":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"234":{"tf":1.0},"250":{"tf":1.0},"306":{"tf":1.0}}}}}}}},"df":5,"docs":{"133":{"tf":1.0},"146":{"tf":1.0},"288":{"tf":1.0},"351":{"tf":1.0},"354":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"334":{"tf":1.4142135623730951},"377":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"255":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"360":{"tf":1.0},"377":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"12":{"tf":1.0},"135":{"tf":1.0},"143":{"tf":1.7320508075688772},"413":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"350":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"285":{"tf":1.0},"288":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"197":{"tf":1.0},"28":{"tf":1.0}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"359":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":8,"docs":{"118":{"tf":1.0},"196":{"tf":1.0},"203":{"tf":1.4142135623730951},"210":{"tf":1.0},"238":{"tf":2.23606797749979},"247":{"tf":1.0},"59":{"tf":1.0},"76":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":16,"docs":{"237":{"tf":1.0},"267":{"tf":1.0},"277":{"tf":1.0},"287":{"tf":1.0},"295":{"tf":1.4142135623730951},"321":{"tf":1.0},"324":{"tf":1.0},"326":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"492":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"498":{"tf":1.4142135623730951},"500":{"tf":1.0}}}},"v":{"df":5,"docs":{"185":{"tf":1.0},"307":{"tf":1.4142135623730951},"337":{"tf":1.0},"449":{"tf":1.0},"490":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":17,"docs":{"168":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"182":{"tf":1.0},"19":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.4142135623730951},"303":{"tf":1.0},"304":{"tf":1.0},"307":{"tf":2.0},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"346":{"tf":1.0},"418":{"tf":1.7320508075688772},"477":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.0},"300":{"tf":1.0}}}}}}}},"q":{"df":1,"docs":{"324":{"tf":1.0}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"341":{"tf":1.0}}}}}}},"r":{"(":{"\\"":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"\\"":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"148":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"i":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\\"":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"237":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"277":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"277":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":58,"docs":{"108":{"tf":2.23606797749979},"129":{"tf":1.0},"134":{"tf":1.7320508075688772},"139":{"tf":2.0},"142":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"153":{"tf":1.0},"155":{"tf":1.0},"157":{"tf":1.0},"189":{"tf":1.4142135623730951},"200":{"tf":1.0},"207":{"tf":1.0},"209":{"tf":1.4142135623730951},"213":{"tf":1.4142135623730951},"218":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"236":{"tf":1.0},"237":{"tf":2.8284271247461903},"238":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":2.6457513110645907},"259":{"tf":1.0},"267":{"tf":1.0},"270":{"tf":1.0},"277":{"tf":2.6457513110645907},"295":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"332":{"tf":1.4142135623730951},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":2.23606797749979},"342":{"tf":1.0},"346":{"tf":1.4142135623730951},"357":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.4142135623730951},"457":{"tf":1.4142135623730951},"461":{"tf":3.0},"463":{"tf":1.4142135623730951},"470":{"tf":1.0},"471":{"tf":1.0},"492":{"tf":2.449489742783178},"493":{"tf":1.0},"495":{"tf":1.4142135623730951},"496":{"tf":2.6457513110645907},"512":{"tf":1.0},"513":{"tf":1.4142135623730951},"514":{"tf":2.449489742783178},"515":{"tf":1.7320508075688772},"517":{"tf":1.0},"52":{"tf":2.0},"55":{"tf":1.0},"74":{"tf":2.0},"80":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951},"88":{"tf":1.4142135623730951},"90":{"tf":2.0}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"470":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"2":{"df":1,"docs":{"496":{"tf":1.0}}},"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}},"df":3,"docs":{"244":{"tf":1.0},"270":{"tf":1.0},"496":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"140":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"365":{"tf":1.0},"453":{"tf":1.4142135623730951}}}}}}}},"t":{"c":{"df":7,"docs":{"324":{"tf":1.4142135623730951},"330":{"tf":1.0},"352":{"tf":1.4142135623730951},"398":{"tf":1.0},"473":{"tf":1.0},"66":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"332":{"tf":1.0},"350":{"tf":1.0},"501":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"108":{"tf":1.0},"238":{"tf":1.0}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"121":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"109":{"tf":1.0},"140":{"tf":1.4142135623730951},"366":{"tf":1.0},"89":{"tf":1.0}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"404":{"tf":1.0}}}}}}}}},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"156":{"tf":1.7320508075688772},"250":{"tf":1.0},"301":{"tf":1.4142135623730951},"70":{"tf":1.0},"83":{"tf":1.0},"93":{"tf":1.0}}}},"v":{"df":3,"docs":{"101":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":5,"docs":{"108":{"tf":1.0},"142":{"tf":1.7320508075688772},"247":{"tf":1.0},"469":{"tf":1.0},"90":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":68,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"130":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"167":{"tf":1.0},"21":{"tf":1.0},"238":{"tf":1.0},"247":{"tf":1.0},"264":{"tf":1.0},"28":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"311":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"338":{"tf":1.0},"34":{"tf":1.7320508075688772},"345":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"357":{"tf":1.0},"36":{"tf":1.4142135623730951},"381":{"tf":1.0},"424":{"tf":1.7320508075688772},"479":{"tf":1.0},"492":{"tf":1.4142135623730951},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"495":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"504":{"tf":1.4142135623730951},"511":{"tf":1.0},"512":{"tf":1.0},"515":{"tf":1.4142135623730951},"55":{"tf":1.0},"56":{"tf":1.0},"68":{"tf":1.0},"7":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.7320508075688772},"76":{"tf":1.0},"77":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"88":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":7,"docs":{"231":{"tf":1.0},"251":{"tf":1.0},"359":{"tf":1.4142135623730951},"367":{"tf":1.4142135623730951},"368":{"tf":1.0},"371":{"tf":1.0},"90":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"u":{"d":{"df":2,"docs":{"215":{"tf":1.0},"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":11,"docs":{"123":{"tf":1.0},"134":{"tf":1.0},"333":{"tf":1.0},"477":{"tf":1.0},"492":{"tf":1.0},"498":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"61":{"tf":1.0},"77":{"tf":2.23606797749979},"84":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"/":{"b":{"df":1,"docs":{"80":{"tf":1.0}}},"df":0,"docs":{}},"df":17,"docs":{"15":{"tf":1.0},"156":{"tf":1.0},"301":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"324":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"345":{"tf":1.0},"36":{"tf":1.0},"383":{"tf":1.0},"399":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.0},"413":{"tf":1.0},"466":{"tf":1.0},"476":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"234":{"tf":1.0},"337":{"tf":1.0},"391":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"139":{"tf":1.0},"2":{"tf":1.0},"234":{"tf":1.0},"93":{"tf":1.0}}},"t":{"df":1,"docs":{"77":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":7,"docs":{"199":{"tf":1.0},"240":{"tf":1.0},"357":{"tf":1.0},"495":{"tf":1.4142135623730951},"56":{"tf":1.0},"73":{"tf":1.0},"84":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"139":{"tf":1.0},"140":{"tf":1.0},"321":{"tf":1.0},"337":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"231":{"tf":1.0},"479":{"tf":1.0}}},"s":{"df":1,"docs":{"409":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"335":{"tf":1.0}}}}},"df":0,"docs":{}}},"<":{"df":0,"docs":{},"p":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":32,"docs":{"134":{"tf":1.4142135623730951},"147":{"tf":1.0},"170":{"tf":1.4142135623730951},"182":{"tf":1.7320508075688772},"188":{"tf":1.0},"204":{"tf":2.0},"22":{"tf":1.0},"231":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"258":{"tf":1.0},"259":{"tf":1.4142135623730951},"267":{"tf":1.4142135623730951},"276":{"tf":1.0},"292":{"tf":2.0},"295":{"tf":1.0},"299":{"tf":1.7320508075688772},"301":{"tf":1.0},"303":{"tf":1.7320508075688772},"304":{"tf":2.6457513110645907},"314":{"tf":1.0},"324":{"tf":1.0},"334":{"tf":1.7320508075688772},"335":{"tf":2.0},"337":{"tf":1.4142135623730951},"346":{"tf":1.0},"396":{"tf":1.0},"400":{"tf":1.0},"439":{"tf":1.7320508075688772},"467":{"tf":2.6457513110645907},"480":{"tf":1.4142135623730951},"498":{"tf":1.7320508075688772},"91":{"tf":1.0}}}},"s":{"df":1,"docs":{"446":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"295":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"199":{"tf":1.0},"330":{"tf":1.0},"399":{"tf":1.4142135623730951},"495":{"tf":1.7320508075688772},"56":{"tf":1.0},"82":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":6,"docs":{"30":{"tf":1.0},"325":{"tf":1.4142135623730951},"326":{"tf":1.4142135623730951},"330":{"tf":1.0},"402":{"tf":1.4142135623730951},"404":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"342":{"tf":1.0},"35":{"tf":1.0},"350":{"tf":1.0},"446":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"137":{"tf":1.0},"264":{"tf":1.0},"324":{"tf":2.6457513110645907}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"f":{"3":{"2":{"df":1,"docs":{"261":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":8,"docs":{"139":{"tf":2.449489742783178},"157":{"tf":1.0},"190":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"237":{"tf":1.4142135623730951},"333":{"tf":1.4142135623730951},"337":{"tf":1.0},"514":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"134":{"tf":1.0},"139":{"tf":1.0},"90":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"376":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"303":{"tf":1.0}},"i":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"153":{"tf":1.0},"231":{"tf":1.0},"496":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":6,"docs":{"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":2.0},"292":{"tf":1.0},"327":{"tf":1.0},"407":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"334":{"tf":1.0}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"100":{"tf":1.0},"139":{"tf":1.7320508075688772},"157":{"tf":1.0},"289":{"tf":1.7320508075688772},"351":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.0},"445":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"b":{"df":39,"docs":{"109":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"147":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"181":{"tf":2.0},"182":{"tf":1.0},"212":{"tf":1.0},"263":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"348":{"tf":1.0},"349":{"tf":1.7320508075688772},"350":{"tf":1.0},"351":{"tf":2.0},"352":{"tf":1.0},"353":{"tf":2.0},"354":{"tf":2.0},"355":{"tf":1.0},"356":{"tf":1.7320508075688772},"357":{"tf":2.0},"358":{"tf":1.4142135623730951},"359":{"tf":2.0},"360":{"tf":1.4142135623730951},"361":{"tf":1.0},"362":{"tf":1.4142135623730951},"363":{"tf":1.0},"393":{"tf":1.0},"432":{"tf":1.7320508075688772},"51":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0}},"e":{"d":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"351":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"263":{"tf":1.0},"354":{"tf":1.7320508075688772},"360":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{"b":{"a":{"a":{"df":0,"docs":{},"i":{"/":{"b":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"149":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"121":{"tf":1.0},"125":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"202":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":33,"docs":{"107":{"tf":1.7320508075688772},"135":{"tf":1.0},"136":{"tf":1.7320508075688772},"141":{"tf":1.0},"142":{"tf":1.0},"166":{"tf":2.449489742783178},"167":{"tf":2.8284271247461903},"175":{"tf":1.4142135623730951},"181":{"tf":1.4142135623730951},"241":{"tf":1.0},"252":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"264":{"tf":1.0},"28":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"327":{"tf":1.0},"329":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"371":{"tf":1.4142135623730951},"385":{"tf":1.0},"388":{"tf":1.0},"396":{"tf":1.4142135623730951},"404":{"tf":1.0},"406":{"tf":1.0},"413":{"tf":1.0},"46":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"281":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"139":{"tf":1.0},"157":{"tf":1.0},"346":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"372":{"tf":1.0},"381":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"100":{"tf":1.0},"314":{"tf":1.0},"396":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":17,"docs":{"287":{"tf":1.4142135623730951},"295":{"tf":1.0},"296":{"tf":1.7320508075688772},"308":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"323":{"tf":2.449489742783178},"324":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"399":{"tf":1.0},"401":{"tf":1.7320508075688772},"407":{"tf":1.0},"411":{"tf":1.4142135623730951},"514":{"tf":1.0},"515":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"4":{"2":{"df":1,"docs":{"264":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{"/":{"/":{"d":{"a":{"df":0,"docs":{},"t":{"a":{".":{"d":{"b":{"df":1,"docs":{"177":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":29,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"139":{"tf":1.0},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"202":{"tf":1.0},"224":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"270":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"284":{"tf":1.0},"298":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.4142135623730951},"300":{"tf":1.0},"31":{"tf":1.0},"310":{"tf":1.0},"324":{"tf":1.0},"333":{"tf":1.0},"366":{"tf":1.0},"379":{"tf":1.4142135623730951},"389":{"tf":1.0},"4":{"tf":1.4142135623730951},"44":{"tf":1.7320508075688772},"498":{"tf":1.0},"52":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":44,"docs":{"100":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"178":{"tf":1.0},"20":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"269":{"tf":1.7320508075688772},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"366":{"tf":1.4142135623730951},"368":{"tf":1.7320508075688772},"369":{"tf":2.449489742783178},"371":{"tf":1.7320508075688772},"372":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"379":{"tf":1.4142135623730951},"380":{"tf":1.7320508075688772},"384":{"tf":1.4142135623730951},"387":{"tf":1.7320508075688772},"401":{"tf":1.0},"426":{"tf":1.7320508075688772},"49":{"tf":1.0},"51":{"tf":1.0},"63":{"tf":1.4142135623730951},"86":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"262":{"tf":1.0},"373":{"tf":1.0},"392":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"d":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"298":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"m":{"df":1,"docs":{"337":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"272":{"tf":1.0}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":8,"docs":{"137":{"tf":1.0},"142":{"tf":1.0},"200":{"tf":1.0},"279":{"tf":1.0},"322":{"tf":1.0},"326":{"tf":1.0},"465":{"tf":1.0},"492":{"tf":1.0}}}}}},"n":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"324":{"tf":1.0},"325":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"y":{"_":{"df":0,"docs":{},"i":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"75":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":39,"docs":{"108":{"tf":1.4142135623730951},"114":{"tf":1.0},"118":{"tf":1.0},"129":{"tf":1.4142135623730951},"134":{"tf":1.0},"142":{"tf":2.23606797749979},"144":{"tf":1.0},"157":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"223":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"258":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":2.0},"325":{"tf":1.7320508075688772},"326":{"tf":1.0},"330":{"tf":1.0},"350":{"tf":1.7320508075688772},"396":{"tf":1.0},"402":{"tf":1.7320508075688772},"404":{"tf":1.0},"407":{"tf":1.4142135623730951},"454":{"tf":1.0},"461":{"tf":1.4142135623730951},"465":{"tf":1.0},"469":{"tf":1.0},"473":{"tf":1.0},"480":{"tf":1.0},"500":{"tf":2.23606797749979},"501":{"tf":1.4142135623730951},"502":{"tf":1.0},"512":{"tf":1.4142135623730951},"53":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.7320508075688772},"96":{"tf":1.0},"99":{"tf":2.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"371":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"238":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":18,"docs":{"0":{"tf":1.0},"100":{"tf":1.0},"135":{"tf":1.4142135623730951},"151":{"tf":1.0},"157":{"tf":1.0},"181":{"tf":1.0},"192":{"tf":1.0},"197":{"tf":1.4142135623730951},"226":{"tf":1.0},"237":{"tf":1.0},"321":{"tf":1.4142135623730951},"350":{"tf":1.0},"353":{"tf":1.4142135623730951},"357":{"tf":1.0},"409":{"tf":1.4142135623730951},"47":{"tf":1.0},"65":{"tf":1.0},"80":{"tf":1.0}}}}},"t":{"df":1,"docs":{"67":{"tf":1.0}}},"x":{"df":10,"docs":{"104":{"tf":1.0},"108":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"238":{"tf":2.0},"247":{"tf":1.7320508075688772},"500":{"tf":1.0},"501":{"tf":1.7320508075688772},"76":{"tf":1.0},"96":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"278":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":4,"docs":{"167":{"tf":1.4142135623730951},"306":{"tf":1.0},"328":{"tf":1.0},"406":{"tf":1.0}}},"s":{"df":0,"docs":{},"h":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":8,"docs":{"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"325":{"tf":1.0},"396":{"tf":1.0},"402":{"tf":1.0},"502":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":1.0}},"s":{":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"502":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":4,"docs":{"314":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"396":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"30":{"tf":1.0},"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"\\\\":{"df":0,"docs":{},"n":{"3":{"df":1,"docs":{"493":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"l":{"df":11,"docs":{"110":{"tf":1.0},"133":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"250":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"332":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"356":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"27":{"tf":1.0},"275":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951}}}}},"m":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"&":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\\"":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"324":{"tf":1.4142135623730951}}},"n":{"df":18,"docs":{"133":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"149":{"tf":1.4142135623730951},"238":{"tf":1.0},"262":{"tf":2.0},"263":{"tf":1.7320508075688772},"293":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":5.0990195135927845},"325":{"tf":1.7320508075688772},"329":{"tf":2.0},"335":{"tf":1.4142135623730951},"354":{"tf":3.3166247903554},"373":{"tf":1.7320508075688772},"75":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"64":{"tf":1.0}},"s":{"df":4,"docs":{"138":{"tf":1.4142135623730951},"241":{"tf":1.0},"344":{"tf":1.0},"466":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"108":{"tf":1.0},"111":{"tf":1.0},"128":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":19,"docs":{"107":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"14":{"tf":1.0},"142":{"tf":1.0},"156":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"230":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"284":{"tf":1.0},"36":{"tf":1.0},"462":{"tf":1.0},"74":{"tf":1.0},"77":{"tf":1.0}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"153":{"tf":1.0},"280":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"251":{"tf":1.0}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"238":{"tf":1.0}}}}},"k":{"df":1,"docs":{"46":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"t":{"\\"":{")":{".":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"(":{"\\"":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":28,"docs":{"143":{"tf":1.0},"150":{"tf":1.4142135623730951},"170":{"tf":1.0},"202":{"tf":1.0},"220":{"tf":1.0},"225":{"tf":1.0},"258":{"tf":1.0},"267":{"tf":1.0},"269":{"tf":1.4142135623730951},"270":{"tf":1.0},"292":{"tf":1.0},"30":{"tf":1.4142135623730951},"303":{"tf":1.0},"304":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"332":{"tf":1.0},"333":{"tf":1.4142135623730951},"335":{"tf":1.0},"337":{"tf":1.0},"36":{"tf":1.0},"412":{"tf":1.0},"467":{"tf":1.0},"480":{"tf":1.0},"498":{"tf":2.23606797749979},"65":{"tf":1.0},"91":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"381":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":19,"docs":{"108":{"tf":1.0},"134":{"tf":1.0},"188":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"231":{"tf":1.0},"237":{"tf":1.0},"247":{"tf":1.0},"277":{"tf":1.0},"42":{"tf":1.4142135623730951},"461":{"tf":1.0},"465":{"tf":1.0},"466":{"tf":1.4142135623730951},"476":{"tf":1.4142135623730951},"492":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"514":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"286":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":10,"docs":{"238":{"tf":1.0},"247":{"tf":1.4142135623730951},"350":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.7320508075688772},"365":{"tf":1.0},"366":{"tf":1.0},"371":{"tf":1.0},"90":{"tf":1.0}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":12,"docs":{"136":{"tf":1.4142135623730951},"157":{"tf":1.0},"255":{"tf":1.0},"262":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"368":{"tf":1.4142135623730951},"401":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.4142135623730951},"63":{"tf":1.0},"93":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"m":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"293":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":11,"docs":{"136":{"tf":1.0},"137":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"264":{"tf":1.4142135623730951},"269":{"tf":1.0},"314":{"tf":1.0},"324":{"tf":3.0},"52":{"tf":1.0},"93":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":25,"docs":{"100":{"tf":1.0},"114":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"140":{"tf":1.0},"153":{"tf":1.0},"167":{"tf":1.4142135623730951},"225":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.4142135623730951},"241":{"tf":1.0},"250":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.0},"314":{"tf":1.4142135623730951},"330":{"tf":1.0},"371":{"tf":1.0},"396":{"tf":1.4142135623730951},"404":{"tf":1.0},"412":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"73":{"tf":1.0},"94":{"tf":1.0}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"12":{"tf":1.0},"135":{"tf":1.0},"210":{"tf":1.0},"291":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.7320508075688772},"371":{"tf":1.0},"65":{"tf":1.0}}}}}}},"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"314":{"tf":1.0},"396":{"tf":1.0},"69":{"tf":1.0},"95":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"225":{"tf":1.4142135623730951}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"233":{"tf":1.0},"238":{"tf":1.0},"25":{"tf":1.0},"59":{"tf":1.0},"73":{"tf":1.0}}}}}}},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"360":{"tf":1.4142135623730951},"371":{"tf":1.0},"388":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":27,"docs":{"104":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.0},"137":{"tf":1.0},"167":{"tf":1.0},"196":{"tf":1.0},"199":{"tf":1.0},"214":{"tf":1.0},"258":{"tf":1.0},"279":{"tf":1.0},"3":{"tf":1.0},"304":{"tf":1.0},"310":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"344":{"tf":1.4142135623730951},"350":{"tf":1.0},"361":{"tf":1.0},"495":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.0},"55":{"tf":1.0},"61":{"tf":1.0},"72":{"tf":1.0},"77":{"tf":1.0},"79":{"tf":1.0},"91":{"tf":1.0}}}}},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"114":{"tf":1.0},"197":{"tf":1.0},"202":{"tf":1.4142135623730951},"217":{"tf":1.0},"226":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"t":{"df":35,"docs":{"105":{"tf":1.0},"107":{"tf":2.23606797749979},"136":{"tf":2.23606797749979},"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"151":{"tf":1.0},"157":{"tf":1.0},"164":{"tf":1.0},"215":{"tf":2.0},"255":{"tf":1.0},"262":{"tf":1.0},"269":{"tf":1.0},"300":{"tf":1.0},"310":{"tf":1.0},"365":{"tf":1.4142135623730951},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":2.0},"375":{"tf":1.0},"376":{"tf":1.0},"383":{"tf":1.4142135623730951},"387":{"tf":1.0},"401":{"tf":1.0},"47":{"tf":1.0},"484":{"tf":1.7320508075688772},"49":{"tf":1.0},"52":{"tf":1.7320508075688772},"57":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.4142135623730951},"86":{"tf":1.0},"93":{"tf":1.7320508075688772}},"h":{"df":0,"docs":{},"u":{"b":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"a":{"b":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":4,"docs":{"104":{"tf":1.0},"226":{"tf":1.0},"30":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"215":{"tf":1.4142135623730951}}}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"4":{"tf":1.0}}}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"157":{"tf":1.0}}}},"df":3,"docs":{"101":{"tf":1.0},"381":{"tf":1.0},"471":{"tf":1.4142135623730951}},"e":{"df":2,"docs":{"202":{"tf":1.0},"98":{"tf":1.0}}},"o":{"d":{"df":11,"docs":{"133":{"tf":1.0},"139":{"tf":1.0},"219":{"tf":1.0},"237":{"tf":1.0},"298":{"tf":1.0},"307":{"tf":1.0},"350":{"tf":1.0},"359":{"tf":1.7320508075688772},"366":{"tf":1.0},"470":{"tf":1.0},"67":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":1,"docs":{"351":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"142":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"142":{"tf":1.0},"90":{"tf":1.4142135623730951}}}}}}}}},"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"371":{"tf":1.0},"406":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}},"n":{"d":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"329":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"136":{"tf":1.0},"409":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"402":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"(":{"\\"":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"402":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"337":{"tf":1.0}}}},"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"272":{"tf":1.0},"273":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"498":{"tf":1.0}}}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"266":{"tf":1.0},"293":{"tf":1.0},"334":{"tf":1.0}}}}}}}},"df":73,"docs":{"105":{"tf":1.4142135623730951},"110":{"tf":1.4142135623730951},"114":{"tf":1.0},"124":{"tf":1.0},"128":{"tf":1.0},"140":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.7320508075688772},"15":{"tf":1.0},"151":{"tf":1.4142135623730951},"17":{"tf":1.0},"198":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"212":{"tf":1.0},"231":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.4142135623730951},"258":{"tf":1.0},"259":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"266":{"tf":1.0},"269":{"tf":1.4142135623730951},"270":{"tf":1.0},"274":{"tf":1.7320508075688772},"279":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.4142135623730951},"283":{"tf":1.7320508075688772},"290":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"307":{"tf":1.0},"314":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"365":{"tf":1.7320508075688772},"366":{"tf":1.4142135623730951},"367":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"369":{"tf":1.0},"373":{"tf":1.4142135623730951},"385":{"tf":1.7320508075688772},"422":{"tf":1.7320508075688772},"456":{"tf":1.0},"467":{"tf":1.0},"47":{"tf":1.0},"480":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.7320508075688772},"497":{"tf":1.0},"498":{"tf":1.4142135623730951},"503":{"tf":1.0},"51":{"tf":1.0},"511":{"tf":1.0},"57":{"tf":2.0},"63":{"tf":1.7320508075688772},"64":{"tf":1.0},"66":{"tf":1.0},"70":{"tf":2.0},"73":{"tf":1.4142135623730951},"85":{"tf":1.7320508075688772},"86":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"92":{"tf":1.0}},"q":{"df":0,"docs":{},"l":{"df":8,"docs":{"249":{"tf":1.0},"250":{"tf":2.8284271247461903},"460":{"tf":2.23606797749979},"465":{"tf":1.0},"501":{"tf":1.0},"73":{"tf":1.0},"83":{"tf":1.0},"96":{"tf":1.0}}}},"s":{":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"140":{"tf":1.0},"494":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"p":{"c":{"df":1,"docs":{"250":{"tf":2.449489742783178}}},"df":0,"docs":{}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"267":{"tf":1.0},"335":{"tf":1.0},"502":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"d":{"df":55,"docs":{"130":{"tf":1.0},"131":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":2.23606797749979},"192":{"tf":1.0},"194":{"tf":1.4142135623730951},"24":{"tf":1.0},"252":{"tf":1.4142135623730951},"282":{"tf":1.0},"311":{"tf":1.4142135623730951},"338":{"tf":1.0},"345":{"tf":1.0},"357":{"tf":1.0},"445":{"tf":2.0},"446":{"tf":1.0},"447":{"tf":1.0},"448":{"tf":1.0},"449":{"tf":1.0},"45":{"tf":1.4142135623730951},"450":{"tf":1.0},"451":{"tf":1.0},"452":{"tf":1.0},"453":{"tf":1.0},"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0},"459":{"tf":1.0},"460":{"tf":1.0},"461":{"tf":1.0},"462":{"tf":1.0},"463":{"tf":1.0},"464":{"tf":1.0},"465":{"tf":1.0},"466":{"tf":1.0},"467":{"tf":1.0},"468":{"tf":1.0},"469":{"tf":1.0},"470":{"tf":1.0},"471":{"tf":1.0},"472":{"tf":1.0},"473":{"tf":1.0},"474":{"tf":1.0},"475":{"tf":1.0},"476":{"tf":1.0},"477":{"tf":1.0},"478":{"tf":1.0},"479":{"tf":1.0},"480":{"tf":1.0},"487":{"tf":1.0},"510":{"tf":1.0},"521":{"tf":1.0},"68":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":70,"docs":{"101":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.4142135623730951},"108":{"tf":1.0},"110":{"tf":2.0},"111":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.4142135623730951},"116":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"137":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":1.0},"144":{"tf":1.0},"156":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"213":{"tf":2.23606797749979},"231":{"tf":2.23606797749979},"241":{"tf":1.0},"242":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":3.0},"247":{"tf":1.0},"251":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"26":{"tf":1.4142135623730951},"269":{"tf":1.0},"270":{"tf":1.4142135623730951},"30":{"tf":1.0},"365":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":1.4142135623730951},"372":{"tf":1.4142135623730951},"377":{"tf":2.0},"381":{"tf":1.0},"391":{"tf":1.0},"457":{"tf":1.7320508075688772},"46":{"tf":1.0},"461":{"tf":1.0},"462":{"tf":2.0},"463":{"tf":2.0},"466":{"tf":2.449489742783178},"471":{"tf":1.0},"48":{"tf":1.0},"480":{"tf":1.4142135623730951},"492":{"tf":1.4142135623730951},"496":{"tf":3.0},"498":{"tf":1.7320508075688772},"506":{"tf":1.0},"508":{"tf":1.0},"512":{"tf":1.0},"519":{"tf":1.4142135623730951},"53":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":2.0},"60":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":2.23606797749979},"77":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.7320508075688772},"87":{"tf":1.0},"88":{"tf":2.0}},"e":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"498":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"u":{"df":2,"docs":{"290":{"tf":1.0},"292":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":39,"docs":{"108":{"tf":1.4142135623730951},"129":{"tf":1.0},"142":{"tf":1.4142135623730951},"155":{"tf":1.0},"200":{"tf":1.0},"207":{"tf":1.0},"209":{"tf":1.4142135623730951},"213":{"tf":1.4142135623730951},"218":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"237":{"tf":2.449489742783178},"238":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":2.0},"259":{"tf":1.0},"277":{"tf":1.4142135623730951},"324":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.4142135623730951},"457":{"tf":1.4142135623730951},"461":{"tf":2.449489742783178},"463":{"tf":1.4142135623730951},"470":{"tf":1.0},"471":{"tf":1.0},"492":{"tf":1.7320508075688772},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"512":{"tf":1.0},"513":{"tf":1.4142135623730951},"517":{"tf":1.0},"52":{"tf":1.7320508075688772},"55":{"tf":1.0},"74":{"tf":1.4142135623730951},"80":{"tf":1.0},"82":{"tf":1.4142135623730951},"90":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"219":{"tf":1.0},"237":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"127":{"tf":1.0}}}},"i":{"df":1,"docs":{"46":{"tf":1.0}}}}},"r":{"d":{"c":{"df":0,"docs":{},"o":{"d":{"df":10,"docs":{"109":{"tf":1.0},"133":{"tf":1.7320508075688772},"146":{"tf":1.4142135623730951},"149":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"298":{"tf":2.0},"306":{"tf":1.4142135623730951},"51":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"322":{"tf":1.0},"411":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":5,"docs":{"261":{"tf":1.4142135623730951},"321":{"tf":1.0},"324":{"tf":1.4142135623730951},"398":{"tf":1.0},"411":{"tf":1.0}}}}}},"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"140":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"104":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":5,"docs":{"173":{"tf":1.4142135623730951},"226":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"46":{"tf":1.0},"480":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}},"s":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"291":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"202":{"tf":1.0},"93":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"317":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":6,"docs":{"314":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"330":{"tf":1.0},"396":{"tf":1.0},"404":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":9,"docs":{"247":{"tf":1.0},"255":{"tf":1.4142135623730951},"289":{"tf":1.0},"329":{"tf":1.0},"401":{"tf":1.0},"402":{"tf":1.0},"500":{"tf":2.449489742783178},"96":{"tf":1.4142135623730951},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"308":{"tf":1.0},"57":{"tf":1.0},"88":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":2,"docs":{"333":{"tf":1.0},"338":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"251":{"tf":1.0}},"i":{"df":9,"docs":{"104":{"tf":1.0},"238":{"tf":1.0},"348":{"tf":1.4142135623730951},"363":{"tf":1.4142135623730951},"393":{"tf":1.4142135623730951},"48":{"tf":1.0},"60":{"tf":1.0},"77":{"tf":1.0},"93":{"tf":1.0}}}}}}},"t":{"df":2,"docs":{"241":{"tf":1.0},"391":{"tf":1.0}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"144":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"354":{"tf":1.0},"359":{"tf":1.0},"65":{"tf":1.0},"90":{"tf":1.0}}}},"t":{"df":1,"docs":{"285":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"113":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"247":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.7320508075688772},"6":{"tf":1.0}}}},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"3":{"0":{"0":{"0":{"df":2,"docs":{"2":{"tf":1.0},"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"0":{"0":{"0":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"190":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"161":{"tf":1.0}},"s":{":":{"/":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"f":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"d":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":5,"docs":{"137":{"tf":2.449489742783178},"143":{"tf":3.0},"157":{"tf":1.0},"333":{"tf":1.0},"341":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":41,"docs":{"100":{"tf":1.0},"20":{"tf":1.0},"269":{"tf":1.4142135623730951},"27":{"tf":1.0},"323":{"tf":1.4142135623730951},"330":{"tf":1.0},"353":{"tf":1.4142135623730951},"354":{"tf":1.0},"356":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.7320508075688772},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.7320508075688772},"369":{"tf":1.4142135623730951},"370":{"tf":1.0},"371":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"379":{"tf":1.0},"380":{"tf":1.0},"381":{"tf":1.0},"382":{"tf":1.0},"383":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"386":{"tf":1.0},"387":{"tf":1.0},"388":{"tf":1.0},"389":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.4142135623730951},"392":{"tf":1.0},"393":{"tf":1.0},"397":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"\'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"127":{"tf":1.0}}}},"m":{"df":2,"docs":{"237":{"tf":1.0},"461":{"tf":1.0}}}},"/":{"df":0,"docs":{},"o":{"df":2,"docs":{"208":{"tf":1.0},"289":{"tf":1.0}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.0}}}}},"d":{"df":40,"docs":{"137":{"tf":1.0},"150":{"tf":1.0},"199":{"tf":1.7320508075688772},"201":{"tf":1.7320508075688772},"202":{"tf":1.4142135623730951},"223":{"tf":1.0},"224":{"tf":1.0},"261":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"300":{"tf":1.0},"314":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":2.449489742783178},"333":{"tf":1.0},"338":{"tf":1.0},"398":{"tf":1.0},"492":{"tf":1.4142135623730951},"493":{"tf":2.0},"494":{"tf":1.7320508075688772},"495":{"tf":2.0},"496":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"504":{"tf":1.0},"505":{"tf":1.0},"506":{"tf":1.0},"507":{"tf":1.0},"508":{"tf":1.0},"509":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.4142135623730951},"515":{"tf":1.0},"52":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":1.4142135623730951},"93":{"tf":1.0},"98":{"tf":1.0}},"e":{"a":{"df":4,"docs":{"105":{"tf":1.0},"238":{"tf":1.0},"70":{"tf":1.0},"79":{"tf":1.0}},"l":{"df":2,"docs":{"124":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"310":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"357":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":2,"docs":{"101":{"tf":1.0},"334":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":10,"docs":{"133":{"tf":1.4142135623730951},"149":{"tf":1.4142135623730951},"293":{"tf":1.0},"303":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":2.23606797749979},"325":{"tf":1.0},"354":{"tf":1.7320508075688772},"373":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":70,"docs":{"104":{"tf":1.0},"111":{"tf":1.4142135623730951},"130":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.7320508075688772},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":1.4142135623730951},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"152":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"210":{"tf":1.0},"218":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":2.0},"240":{"tf":1.0},"241":{"tf":3.0},"251":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"282":{"tf":1.0},"317":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.7320508075688772},"329":{"tf":1.4142135623730951},"330":{"tf":1.7320508075688772},"335":{"tf":1.0},"345":{"tf":1.7320508075688772},"347":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.7320508075688772},"360":{"tf":2.0},"368":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.4142135623730951},"392":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":2.0},"412":{"tf":1.0},"413":{"tf":1.0},"458":{"tf":1.4142135623730951},"462":{"tf":2.8284271247461903},"466":{"tf":1.4142135623730951},"471":{"tf":1.0},"480":{"tf":1.0},"487":{"tf":1.0},"495":{"tf":1.7320508075688772},"496":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"518":{"tf":1.0},"519":{"tf":1.4142135623730951},"55":{"tf":1.0},"56":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.4142135623730951},"76":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":2.23606797749979},"84":{"tf":1.0},"86":{"tf":1.0},"96":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":8,"docs":{"314":{"tf":1.0},"324":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.4142135623730951},"396":{"tf":1.4142135623730951},"404":{"tf":1.0},"63":{"tf":1.0}}}}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":19,"docs":{"113":{"tf":1.0},"154":{"tf":1.0},"170":{"tf":1.0},"179":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"259":{"tf":1.4142135623730951},"290":{"tf":1.0},"314":{"tf":1.7320508075688772},"321":{"tf":1.0},"324":{"tf":2.0},"333":{"tf":1.0},"334":{"tf":1.4142135623730951},"337":{"tf":1.0},"356":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"413":{"tf":1.0},"500":{"tf":1.0},"97":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"36":{"tf":1.0},"46":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":11,"docs":{"141":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"300":{"tf":1.0},"36":{"tf":1.0},"371":{"tf":1.4142135623730951},"496":{"tf":1.0},"498":{"tf":1.0},"511":{"tf":1.0}},"e":{"_":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"496":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"498":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"243":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":2,"docs":{"324":{"tf":2.6457513110645907},"342":{"tf":1.0}}}},"x":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"322":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":10,"docs":{"100":{"tf":1.4142135623730951},"279":{"tf":1.0},"28":{"tf":1.0},"323":{"tf":1.7320508075688772},"328":{"tf":1.0},"357":{"tf":1.4142135623730951},"384":{"tf":1.0},"401":{"tf":1.0},"407":{"tf":1.0},"410":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"259":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"512":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":3,"docs":{"120":{"tf":1.4142135623730951},"122":{"tf":1.0},"270":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"151":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"314":{"tf":1.0},"396":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"198":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.7320508075688772},"367":{"tf":1.0},"372":{"tf":1.0},"456":{"tf":1.0},"494":{"tf":1.0},"73":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"372":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"171":{"tf":1.0},"213":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":2,"docs":{"199":{"tf":1.0},"82":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"319":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":18,"docs":{"110":{"tf":1.4142135623730951},"114":{"tf":1.0},"138":{"tf":1.4142135623730951},"171":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.4142135623730951},"258":{"tf":1.0},"332":{"tf":1.0},"369":{"tf":1.7320508075688772},"377":{"tf":1.0},"423":{"tf":1.7320508075688772},"495":{"tf":1.0},"496":{"tf":1.0},"508":{"tf":1.0},"509":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"88":{"tf":1.7320508075688772}}}}}}},"i":{"df":0,"docs":{},"t":{"df":11,"docs":{"169":{"tf":1.4142135623730951},"171":{"tf":1.0},"173":{"tf":1.0},"196":{"tf":1.0},"213":{"tf":1.0},"222":{"tf":1.0},"244":{"tf":1.0},"257":{"tf":1.0},"338":{"tf":1.0},"450":{"tf":1.0},"476":{"tf":1.0}},"i":{"df":15,"docs":{"169":{"tf":2.0},"171":{"tf":1.0},"173":{"tf":1.0},"179":{"tf":1.4142135623730951},"18":{"tf":1.0},"196":{"tf":1.7320508075688772},"222":{"tf":1.0},"257":{"tf":1.0},"348":{"tf":1.0},"357":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0},"417":{"tf":1.7320508075688772},"450":{"tf":1.7320508075688772},"476":{"tf":1.0}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"351":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"123":{"tf":1.0},"53":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":7,"docs":{"100":{"tf":1.0},"124":{"tf":1.0},"226":{"tf":1.0},"285":{"tf":1.0},"300":{"tf":1.0},"314":{"tf":1.0},"96":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"264":{"tf":1.0},"280":{"tf":1.4142135623730951},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0}},"s":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"326":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"339":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"151":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":45,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.7320508075688772},"12":{"tf":2.23606797749979},"13":{"tf":1.4142135623730951},"159":{"tf":2.0},"16":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.7320508075688772},"163":{"tf":1.7320508075688772},"164":{"tf":2.449489742783178},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"172":{"tf":1.7320508075688772},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":2.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"195":{"tf":2.23606797749979},"338":{"tf":1.4142135623730951},"416":{"tf":1.7320508075688772},"42":{"tf":1.7320508075688772},"68":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"118":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"372":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"116":{"tf":1.0},"234":{"tf":1.0},"251":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":5,"docs":{"238":{"tf":1.0},"247":{"tf":1.0},"285":{"tf":1.0},"372":{"tf":1.0},"404":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":5,"docs":{"492":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"512":{"tf":1.0}},"r":{"df":38,"docs":{"105":{"tf":1.0},"142":{"tf":1.0},"151":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":1.0},"183":{"tf":1.4142135623730951},"192":{"tf":1.0},"205":{"tf":1.0},"215":{"tf":1.4142135623730951},"225":{"tf":1.0},"24":{"tf":2.0},"241":{"tf":1.4142135623730951},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"278":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"371":{"tf":1.0},"407":{"tf":1.4142135623730951},"414":{"tf":1.7320508075688772},"433":{"tf":1.7320508075688772},"434":{"tf":1.7320508075688772},"435":{"tf":1.7320508075688772},"445":{"tf":1.0},"463":{"tf":1.0},"479":{"tf":1.4142135623730951},"481":{"tf":1.7320508075688772},"482":{"tf":1.7320508075688772},"487":{"tf":1.0},"49":{"tf":1.0},"501":{"tf":1.0},"53":{"tf":1.0},"63":{"tf":1.0},"66":{"tf":1.0},"77":{"tf":1.0},"92":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"/":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"s":{"df":2,"docs":{"351":{"tf":1.0},"98":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"136":{"tf":1.0}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"197":{"tf":1.0},"257":{"tf":1.0},"446":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"128":{"tf":1.0},"144":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"a":{"c":{"df":7,"docs":{"255":{"tf":1.0},"257":{"tf":1.7320508075688772},"353":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":1.0},"4":{"tf":1.0},"66":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":2,"docs":{"267":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":4,"docs":{"250":{"tf":2.23606797749979},"35":{"tf":1.0},"44":{"tf":1.0},"514":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"135":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":47,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"134":{"tf":1.0},"147":{"tf":1.0},"234":{"tf":1.0},"241":{"tf":1.0},"295":{"tf":1.0},"337":{"tf":1.0},"514":{"tf":1.7320508075688772},"515":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"245":{"tf":1.4142135623730951},"251":{"tf":1.0}}}}}}}}},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"337":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":5,"docs":{"128":{"tf":1.4142135623730951},"138":{"tf":1.0},"144":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":6,"docs":{"104":{"tf":1.0},"226":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"346":{"tf":1.0},"46":{"tf":1.0}}}}},"t":{"\'":{"df":2,"docs":{"306":{"tf":1.4142135623730951},"68":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":7,"docs":{"247":{"tf":1.0},"325":{"tf":1.0},"461":{"tf":1.0},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"498":{"tf":1.0},"96":{"tf":1.0}}},"r":{"df":1,"docs":{"289":{"tf":1.0}}}}}},"j":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"j":{"a":{"2":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"a":{"df":2,"docs":{"104":{"tf":1.0},"124":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"385":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":19,"docs":{"108":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.4142135623730951},"203":{"tf":2.23606797749979},"210":{"tf":1.4142135623730951},"238":{"tf":2.8284271247461903},"247":{"tf":2.0},"251":{"tf":1.0},"257":{"tf":1.0},"270":{"tf":1.4142135623730951},"492":{"tf":1.0},"498":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"67":{"tf":1.0},"76":{"tf":2.0},"86":{"tf":1.0}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":23,"docs":{"170":{"tf":1.0},"238":{"tf":1.0},"258":{"tf":1.0},"267":{"tf":1.4142135623730951},"27":{"tf":1.0},"275":{"tf":1.4142135623730951},"280":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":2.23606797749979},"335":{"tf":2.449489742783178},"337":{"tf":1.0},"339":{"tf":1.4142135623730951},"341":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951},"487":{"tf":1.0},"498":{"tf":1.0},"514":{"tf":1.4142135623730951},"63":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0}},"r":{"df":0,"docs":{},"p":{"c":{"\\"":{":":{"\\"":{"2":{".":{"0":{"\\"":{",":{"\\"":{"df":0,"docs":{},"i":{"d":{"\\"":{":":{"1":{",":{"\\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"\\"":{":":{"\\"":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"\\"":{",":{"\\"":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"\\"":{":":{"df":0,"docs":{},"{":{"\\"":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"\\"":{":":{"\\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"174":{"tf":1.0},"475":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":1,"docs":{"191":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"492":{"tf":1.4142135623730951},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"495":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"511":{"tf":1.0},"512":{"tf":1.0},"515":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.7320508075688772}}}}}}}},"w":{"df":0,"docs":{},"t":{"df":1,"docs":{"137":{"tf":1.0}}}}},"k":{"8":{"df":1,"docs":{"344":{"tf":1.0}}},"b":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"/":{"a":{"d":{"d":{"_":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":3,"docs":{"258":{"tf":1.0},"460":{"tf":1.0},"494":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":4,"docs":{"241":{"tf":1.0},"258":{"tf":1.0},"462":{"tf":1.0},"493":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"258":{"tf":1.0},"467":{"tf":1.0},"498":{"tf":1.4142135623730951}}}}}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"407":{"tf":1.0},"500":{"tf":1.4142135623730951},"502":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"502":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"258":{"tf":1.0},"512":{"tf":1.7320508075688772}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"501":{"tf":1.4142135623730951},"502":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"231":{"tf":1.0},"244":{"tf":1.0},"258":{"tf":1.0},"496":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":4,"docs":{"241":{"tf":1.0},"258":{"tf":1.0},"462":{"tf":1.0},"495":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"258":{"tf":1.0},"497":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"186":{"tf":1.0},"205":{"tf":1.0},"275":{"tf":1.0},"469":{"tf":1.0},"492":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"258":{"tf":1.0},"463":{"tf":1.0},"511":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"303":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"\\"":{".":{"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":7,"docs":{"266":{"tf":1.0},"267":{"tf":1.0},"293":{"tf":1.7320508075688772},"303":{"tf":1.0},"327":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0}}}}}}}},"df":109,"docs":{"103":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":2.0},"111":{"tf":1.0},"113":{"tf":1.4142135623730951},"114":{"tf":1.7320508075688772},"115":{"tf":1.4142135623730951},"116":{"tf":1.7320508075688772},"117":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"124":{"tf":2.0},"125":{"tf":1.0},"126":{"tf":1.0},"130":{"tf":1.0},"133":{"tf":1.0},"140":{"tf":1.0},"142":{"tf":1.0},"151":{"tf":1.0},"156":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":2.23606797749979},"166":{"tf":1.0},"167":{"tf":1.0},"169":{"tf":1.7320508075688772},"170":{"tf":1.4142135623730951},"171":{"tf":2.0},"173":{"tf":1.7320508075688772},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"178":{"tf":1.7320508075688772},"179":{"tf":1.0},"181":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"191":{"tf":1.4142135623730951},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"198":{"tf":1.0},"199":{"tf":1.4142135623730951},"200":{"tf":2.0},"201":{"tf":1.4142135623730951},"203":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"209":{"tf":1.0},"210":{"tf":1.0},"213":{"tf":2.0},"222":{"tf":2.449489742783178},"223":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"23":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.4142135623730951},"244":{"tf":2.0},"247":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":1.7320508075688772},"257":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"259":{"tf":2.449489742783178},"260":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"278":{"tf":1.4142135623730951},"285":{"tf":1.0},"290":{"tf":1.4142135623730951},"292":{"tf":1.7320508075688772},"293":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.7320508075688772},"303":{"tf":2.0},"304":{"tf":3.0},"310":{"tf":1.0},"311":{"tf":1.4142135623730951},"314":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"335":{"tf":1.0},"338":{"tf":1.0},"345":{"tf":1.0},"354":{"tf":1.0},"369":{"tf":1.7320508075688772},"372":{"tf":1.7320508075688772},"377":{"tf":1.4142135623730951},"388":{"tf":1.0},"396":{"tf":1.0},"407":{"tf":1.7320508075688772},"413":{"tf":1.0},"448":{"tf":1.0},"450":{"tf":1.4142135623730951},"451":{"tf":1.0},"475":{"tf":1.0},"476":{"tf":2.0},"478":{"tf":1.0},"489":{"tf":1.4142135623730951},"521":{"tf":1.0},"66":{"tf":2.449489742783178},"85":{"tf":1.0},"92":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"344":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":9,"docs":{"135":{"tf":1.0},"291":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"405":{"tf":1.0},"410":{"tf":1.0},"466":{"tf":1.0},"65":{"tf":1.0}}}},"y":{"df":16,"docs":{"101":{"tf":1.4142135623730951},"197":{"tf":1.0},"202":{"tf":1.0},"319":{"tf":1.0},"324":{"tf":1.4142135623730951},"326":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"341":{"tf":1.4142135623730951},"352":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0},"500":{"tf":1.0},"511":{"tf":1.0},"54":{"tf":1.4142135623730951},"96":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":6,"docs":{"108":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"350":{"tf":1.0},"473":{"tf":1.0},"53":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"356":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"142":{"tf":1.0},"383":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":95,"docs":{"101":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":2.0},"105":{"tf":2.23606797749979},"107":{"tf":2.23606797749979},"110":{"tf":1.4142135623730951},"111":{"tf":1.0},"114":{"tf":1.0},"120":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.7320508075688772},"127":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951},"129":{"tf":1.4142135623730951},"130":{"tf":1.0},"131":{"tf":1.0},"136":{"tf":2.449489742783178},"142":{"tf":1.4142135623730951},"144":{"tf":1.0},"157":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"169":{"tf":1.7320508075688772},"171":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"197":{"tf":1.0},"198":{"tf":1.0},"200":{"tf":1.4142135623730951},"202":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"244":{"tf":1.0},"251":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"258":{"tf":1.0},"259":{"tf":1.0},"269":{"tf":1.0},"325":{"tf":1.0},"331":{"tf":1.0},"364":{"tf":1.0},"365":{"tf":2.23606797749979},"367":{"tf":1.0},"368":{"tf":2.0},"369":{"tf":1.4142135623730951},"371":{"tf":2.6457513110645907},"375":{"tf":1.0},"376":{"tf":1.0},"380":{"tf":1.0},"383":{"tf":1.4142135623730951},"391":{"tf":1.0},"446":{"tf":1.4142135623730951},"452":{"tf":1.0},"454":{"tf":1.4142135623730951},"461":{"tf":1.4142135623730951},"463":{"tf":2.0},"466":{"tf":1.0},"47":{"tf":1.4142135623730951},"48":{"tf":1.0},"480":{"tf":1.4142135623730951},"487":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.4142135623730951},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"503":{"tf":1.0},"511":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0},"70":{"tf":2.0},"72":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":2.0},"98":{"tf":1.0},"99":{"tf":1.0}},"e":{"b":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"138":{"tf":1.0},"149":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"o":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"/":{"a":{"d":{"d":{"_":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":3,"docs":{"456":{"tf":1.0},"494":{"tf":1.0},"520":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"455":{"tf":1.0},"493":{"tf":1.0},"92":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":6,"docs":{"170":{"tf":1.7320508075688772},"178":{"tf":1.0},"182":{"tf":1.0},"212":{"tf":1.0},"267":{"tf":1.0},"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":3,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"498":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"326":{"tf":1.0},"500":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"502":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"92":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"501":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"457":{"tf":1.0},"466":{"tf":1.0},"496":{"tf":1.0},"519":{"tf":1.0},"92":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"496":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"/":{"$":{"(":{"d":{"df":1,"docs":{"203":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"215":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":3,"docs":{"458":{"tf":1.0},"495":{"tf":1.0},"518":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"143":{"tf":1.0},"202":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"202":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"i":{"df":2,"docs":{"143":{"tf":1.4142135623730951},"371":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":10,"docs":{"237":{"tf":1.0},"258":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.0},"461":{"tf":1.0},"465":{"tf":1.0},"466":{"tf":1.0},"492":{"tf":1.0},"517":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"511":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},":":{"/":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"/":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"258":{"tf":1.0},"505":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"505":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"258":{"tf":1.0},"506":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"{":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"506":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"258":{"tf":1.0},"504":{"tf":2.0},"92":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"504":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"504":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"258":{"tf":1.0},"507":{"tf":1.7320508075688772}},"s":{"/":{"df":0,"docs":{},"{":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"507":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"258":{"tf":1.0},"508":{"tf":1.7320508075688772},"92":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"{":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"508":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"258":{"tf":1.0},"509":{"tf":1.7320508075688772}},"s":{"/":{"df":0,"docs":{},"{":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"509":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"449":{"tf":1.0},"477":{"tf":1.0},"490":{"tf":1.0}}}}},"df":0,"docs":{}},"df":106,"docs":{"0":{"tf":2.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.7320508075688772},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"15":{"tf":2.23606797749979},"159":{"tf":1.0},"165":{"tf":1.0},"169":{"tf":1.0},"185":{"tf":1.0},"194":{"tf":1.0},"196":{"tf":1.4142135623730951},"215":{"tf":1.0},"228":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"237":{"tf":1.4142135623730951},"238":{"tf":1.0},"241":{"tf":1.4142135623730951},"244":{"tf":2.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"254":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.0},"269":{"tf":1.4142135623730951},"270":{"tf":1.0},"284":{"tf":1.0},"314":{"tf":1.7320508075688772},"332":{"tf":1.0},"350":{"tf":1.0},"365":{"tf":1.0},"369":{"tf":1.4142135623730951},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"396":{"tf":1.7320508075688772},"404":{"tf":1.0},"409":{"tf":1.0},"445":{"tf":1.0},"446":{"tf":1.4142135623730951},"448":{"tf":1.0},"449":{"tf":1.0},"450":{"tf":1.4142135623730951},"469":{"tf":1.0},"47":{"tf":2.0},"48":{"tf":1.4142135623730951},"480":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.4142135623730951},"490":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.7320508075688772},"64":{"tf":1.7320508075688772},"65":{"tf":1.7320508075688772},"66":{"tf":1.0},"67":{"tf":1.7320508075688772},"68":{"tf":1.4142135623730951},"69":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":1.0},"76":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.0},"92":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"344":{"tf":1.0}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"344":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"104":{"tf":1.0},"48":{"tf":1.0}}}},"df":1,"docs":{"476":{"tf":1.0}},"n":{"d":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":4,"docs":{"161":{"tf":1.0},"188":{"tf":1.0},"195":{"tf":1.0},"338":{"tf":1.0}},"u":{"a":{"df":0,"docs":{},"g":{"df":17,"docs":{"213":{"tf":1.0},"244":{"tf":1.0},"334":{"tf":1.4142135623730951},"338":{"tf":1.0},"344":{"tf":1.4142135623730951},"347":{"tf":1.0},"36":{"tf":1.0},"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.4142135623730951},"458":{"tf":1.0},"469":{"tf":1.4142135623730951},"494":{"tf":1.0},"496":{"tf":1.7320508075688772},"519":{"tf":1.0},"74":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":7,"docs":{"109":{"tf":1.0},"281":{"tf":1.0},"350":{"tf":1.0},"356":{"tf":1.0},"365":{"tf":1.4142135623730951},"366":{"tf":1.0},"377":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"144":{"tf":1.0},"231":{"tf":1.0},"324":{"tf":1.0},"381":{"tf":1.0},"465":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"98":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"361":{"tf":1.0},"372":{"tf":1.4142135623730951},"391":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":14,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":1.0},"13":{"tf":1.0},"161":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"324":{"tf":1.0},"327":{"tf":1.0},"500":{"tf":1.0},"96":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"179":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"372":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"238":{"tf":1.4142135623730951},"241":{"tf":2.449489742783178},"247":{"tf":1.0},"255":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"289":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951},"291":{"tf":1.0},"500":{"tf":1.0},"66":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}}}}},"z":{"df":0,"docs":{},"i":{"df":6,"docs":{"279":{"tf":1.0},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"400":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"100":{"tf":1.0}}}}}}},"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}},"e":{"a":{"d":{"df":2,"docs":{"113":{"tf":1.0},"231":{"tf":1.0}}},"df":0,"docs":{},"k":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"n":{"df":21,"docs":{"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":1.0},"120":{"tf":1.4142135623730951},"130":{"tf":1.0},"197":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":1.4142135623730951},"334":{"tf":1.0},"338":{"tf":1.4142135623730951},"343":{"tf":1.0},"460":{"tf":1.4142135623730951},"494":{"tf":1.0},"502":{"tf":2.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.0},"76":{"tf":1.0},"80":{"tf":1.0},"96":{"tf":1.4142135623730951}}}},"v":{"df":2,"docs":{"104":{"tf":1.0},"351":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"334":{"tf":1.0},"344":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":9,"docs":{"191":{"tf":1.0},"244":{"tf":1.0},"255":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"321":{"tf":1.0},"324":{"tf":2.0},"327":{"tf":1.4142135623730951},"396":{"tf":1.4142135623730951},"96":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"220":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"448":{"tf":1.0}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"124":{"tf":1.0},"165":{"tf":1.0},"209":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"260":{"tf":1.4142135623730951},"351":{"tf":1.0},"353":{"tf":1.0},"66":{"tf":1.4142135623730951},"92":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"202":{"tf":1.0},"316":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":15,"docs":{"109":{"tf":1.0},"200":{"tf":1.4142135623730951},"238":{"tf":2.23606797749979},"314":{"tf":1.0},"333":{"tf":1.0},"338":{"tf":1.0},"343":{"tf":1.0},"351":{"tf":1.0},"492":{"tf":1.7320508075688772},"500":{"tf":1.7320508075688772},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"64":{"tf":1.0},"65":{"tf":1.0},"99":{"tf":1.4142135623730951}}}}},"n":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"c":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"(":{"\\"":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"324":{"tf":1.0}},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":2.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"124":{"tf":1.0}}}},"df":4,"docs":{"257":{"tf":1.4142135623730951},"296":{"tf":1.0},"324":{"tf":2.449489742783178},"66":{"tf":1.0}}},"k":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":35,"docs":{"101":{"tf":1.0},"116":{"tf":1.0},"12":{"tf":1.4142135623730951},"125":{"tf":1.0},"137":{"tf":1.4142135623730951},"151":{"tf":1.0},"199":{"tf":2.0},"217":{"tf":1.0},"218":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.7320508075688772},"250":{"tf":1.7320508075688772},"251":{"tf":1.0},"257":{"tf":1.0},"264":{"tf":1.0},"318":{"tf":1.0},"35":{"tf":2.0},"36":{"tf":1.4142135623730951},"44":{"tf":2.23606797749979},"458":{"tf":1.7320508075688772},"461":{"tf":1.0},"462":{"tf":1.4142135623730951},"466":{"tf":1.0},"471":{"tf":2.0},"480":{"tf":1.4142135623730951},"495":{"tf":1.0},"518":{"tf":1.4142135623730951},"53":{"tf":1.0},"56":{"tf":1.0},"7":{"tf":1.4142135623730951},"76":{"tf":1.4142135623730951},"98":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"199":{"tf":1.0},"223":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"258":{"tf":1.0},"324":{"tf":1.0},"494":{"tf":1.0},"497":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":4,"docs":{"104":{"tf":1.0},"141":{"tf":1.0},"2":{"tf":1.0},"38":{"tf":1.4142135623730951}}}}},"o":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"139":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"<":{"df":0,"docs":{},"p":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":10,"docs":{"139":{"tf":1.0},"234":{"tf":1.0},"241":{"tf":1.0},"267":{"tf":1.4142135623730951},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"303":{"tf":1.0},"327":{"tf":1.0},"335":{"tf":1.0},"339":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"345":{"tf":1.0}}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"df":35,"docs":{"101":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":2.0},"151":{"tf":1.0},"157":{"tf":1.0},"167":{"tf":1.0},"181":{"tf":1.4142135623730951},"182":{"tf":1.0},"2":{"tf":1.7320508075688772},"257":{"tf":1.0},"263":{"tf":1.0},"269":{"tf":1.0},"281":{"tf":1.0},"289":{"tf":1.4142135623730951},"350":{"tf":1.4142135623730951},"351":{"tf":1.7320508075688772},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.7320508075688772},"356":{"tf":1.7320508075688772},"359":{"tf":1.7320508075688772},"361":{"tf":1.7320508075688772},"368":{"tf":1.4142135623730951},"369":{"tf":2.0},"371":{"tf":1.4142135623730951},"380":{"tf":1.4142135623730951},"432":{"tf":1.7320508075688772},"489":{"tf":1.0},"49":{"tf":1.0},"57":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.4142135623730951},"65":{"tf":1.0},"86":{"tf":1.7320508075688772},"90":{"tf":1.0}}},"t":{"df":9,"docs":{"140":{"tf":1.0},"171":{"tf":1.0},"218":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":4,"docs":{"238":{"tf":1.0},"247":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":7,"docs":{"177":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"244":{"tf":1.0},"390":{"tf":1.0},"502":{"tf":1.0},"76":{"tf":1.0},"88":{"tf":1.0}},"i":{"c":{"df":5,"docs":{"231":{"tf":1.0},"241":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"\'":{"df":1,"docs":{"95":{"tf":1.0}}},".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":2,"docs":{"204":{"tf":1.0},"259":{"tf":1.4142135623730951}}}}},"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.0}}}}}}},"\\\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"498":{"tf":1.0}}}}}}}}}},"df":60,"docs":{"100":{"tf":1.7320508075688772},"124":{"tf":1.0},"136":{"tf":1.0},"151":{"tf":1.0},"204":{"tf":2.23606797749979},"231":{"tf":1.4142135623730951},"24":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.4142135623730951},"276":{"tf":1.4142135623730951},"313":{"tf":1.7320508075688772},"314":{"tf":2.23606797749979},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"317":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.7320508075688772},"324":{"tf":2.23606797749979},"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"330":{"tf":2.0},"393":{"tf":1.0},"394":{"tf":1.7320508075688772},"395":{"tf":1.0},"396":{"tf":2.23606797749979},"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"403":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":2.0},"408":{"tf":1.0},"409":{"tf":1.4142135623730951},"410":{"tf":1.0},"411":{"tf":1.0},"412":{"tf":1.4142135623730951},"413":{"tf":1.0},"467":{"tf":2.0},"480":{"tf":1.0},"482":{"tf":1.7320508075688772},"498":{"tf":1.4142135623730951},"499":{"tf":1.0},"502":{"tf":1.4142135623730951},"63":{"tf":2.0},"67":{"tf":1.0},"91":{"tf":1.0},"94":{"tf":1.7320508075688772},"97":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"324":{"tf":1.4142135623730951},"407":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"324":{"tf":1.4142135623730951},"407":{"tf":1.0}}}}}}}}}}}},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"129":{"tf":1.0},"247":{"tf":1.0},"466":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"279":{"tf":1.0}}}}},"p":{"df":1,"docs":{"356":{"tf":1.0}}},"s":{"df":1,"docs":{"157":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"130":{"tf":1.0},"314":{"tf":1.0},"367":{"tf":1.0},"396":{"tf":1.0},"409":{"tf":1.0}}},"s":{"df":1,"docs":{"391":{"tf":1.0}}},"t":{"df":5,"docs":{"104":{"tf":1.4142135623730951},"115":{"tf":1.0},"117":{"tf":1.0},"396":{"tf":1.0},"48":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"241":{"tf":1.0}}}},"s":{"df":4,"docs":{"143":{"tf":1.0},"448":{"tf":1.0},"475":{"tf":1.0},"476":{"tf":1.0}},"p":{"df":2,"docs":{"338":{"tf":1.4142135623730951},"345":{"tf":1.0}}}}},"m":{"a":{"c":{"df":1,"docs":{"39":{"tf":1.0}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"351":{"tf":1.0}}}}},"o":{"df":1,"docs":{"162":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":4,"docs":{"240":{"tf":1.0},"463":{"tf":1.0},"465":{"tf":1.0},"494":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"138":{"tf":1.0},"404":{"tf":1.0},"46":{"tf":1.0},"473":{"tf":1.4142135623730951},"480":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"162":{"tf":1.0},"259":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"156":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"156":{"tf":1.0},"338":{"tf":1.0},"73":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":10,"docs":{"106":{"tf":1.4142135623730951},"115":{"tf":1.0},"116":{"tf":1.0},"222":{"tf":1.0},"251":{"tf":1.0},"373":{"tf":1.0},"46":{"tf":1.0},"473":{"tf":1.0},"477":{"tf":1.0},"59":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":12,"docs":{"124":{"tf":1.0},"157":{"tf":1.0},"161":{"tf":1.0},"205":{"tf":1.0},"257":{"tf":1.4142135623730951},"365":{"tf":1.0},"368":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.0},"446":{"tf":1.0},"502":{"tf":1.0},"98":{"tf":1.0}}}},"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":1,"docs":{"316":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"344":{"tf":1.0}}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":10,"docs":{"108":{"tf":1.0},"179":{"tf":1.0},"289":{"tf":1.0},"347":{"tf":1.0},"366":{"tf":1.0},"372":{"tf":1.0},"383":{"tf":1.0},"388":{"tf":1.0},"413":{"tf":1.0},"475":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"139":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":42,"docs":{"100":{"tf":2.23606797749979},"107":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.4142135623730951},"140":{"tf":1.0},"143":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"202":{"tf":1.4142135623730951},"217":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.4142135623730951},"269":{"tf":1.4142135623730951},"30":{"tf":1.0},"31":{"tf":1.0},"314":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":2.0},"330":{"tf":1.0},"366":{"tf":1.0},"379":{"tf":1.0},"39":{"tf":2.0},"396":{"tf":1.0},"397":{"tf":1.0},"399":{"tf":1.0},"4":{"tf":2.0},"400":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"49":{"tf":1.0},"493":{"tf":1.0},"498":{"tf":1.0},"52":{"tf":1.0},"63":{"tf":1.4142135623730951},"65":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"c":{"df":0,"docs":{},"h":{"df":12,"docs":{"108":{"tf":1.0},"133":{"tf":1.0},"142":{"tf":1.4142135623730951},"285":{"tf":1.0},"293":{"tf":1.4142135623730951},"295":{"tf":1.0},"296":{"tf":1.4142135623730951},"308":{"tf":1.0},"326":{"tf":1.0},"354":{"tf":1.0},"500":{"tf":1.0},"90":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"!":{"(":{"b":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"344":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"492":{"tf":1.0},"495":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"512":{"tf":1.0}}}}}}},"y":{"b":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"p":{"/":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"330":{"tf":1.0},"407":{"tf":1.0}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"266":{"tf":1.0},"293":{"tf":1.0}}}}}}}},"df":78,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.0},"165":{"tf":1.4142135623730951},"174":{"tf":1.7320508075688772},"183":{"tf":1.0},"184":{"tf":1.7320508075688772},"185":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"192":{"tf":1.0},"205":{"tf":1.7320508075688772},"225":{"tf":1.0},"231":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":2.0},"266":{"tf":1.0},"275":{"tf":1.7320508075688772},"278":{"tf":1.0},"293":{"tf":1.0},"326":{"tf":1.4142135623730951},"407":{"tf":1.0},"414":{"tf":1.7320508075688772},"445":{"tf":2.0},"446":{"tf":2.23606797749979},"447":{"tf":1.0},"448":{"tf":2.449489742783178},"449":{"tf":1.7320508075688772},"450":{"tf":1.0},"451":{"tf":1.4142135623730951},"452":{"tf":1.0},"453":{"tf":1.0},"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0},"459":{"tf":1.0},"460":{"tf":1.0},"461":{"tf":1.0},"462":{"tf":1.0},"463":{"tf":1.4142135623730951},"464":{"tf":1.0},"465":{"tf":1.0},"466":{"tf":1.0},"467":{"tf":1.0},"468":{"tf":1.0},"469":{"tf":1.0},"470":{"tf":1.0},"471":{"tf":1.0},"472":{"tf":1.0},"473":{"tf":1.0},"474":{"tf":1.0},"475":{"tf":2.449489742783178},"476":{"tf":1.0},"477":{"tf":1.4142135623730951},"478":{"tf":1.0},"479":{"tf":1.4142135623730951},"480":{"tf":1.4142135623730951},"485":{"tf":1.7320508075688772},"486":{"tf":1.7320508075688772},"487":{"tf":1.4142135623730951},"489":{"tf":1.7320508075688772},"49":{"tf":1.0},"490":{"tf":1.4142135623730951},"521":{"tf":1.4142135623730951},"53":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":2.0},"92":{"tf":1.7320508075688772},"97":{"tf":1.0},"99":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"185":{"tf":1.0},"449":{"tf":1.0},"490":{"tf":1.0}}}}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.0},"12":{"tf":1.7320508075688772},"124":{"tf":1.0},"13":{"tf":1.4142135623730951},"2":{"tf":1.7320508075688772},"3":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":2.23606797749979},"43":{"tf":1.0},"45":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"143":{"tf":1.0},"203":{"tf":1.0},"215":{"tf":1.0},"371":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":10,"docs":{"111":{"tf":1.0},"350":{"tf":1.0},"514":{"tf":1.0},"56":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":6,"docs":{"20":{"tf":1.0},"291":{"tf":1.4142135623730951},"368":{"tf":1.0},"372":{"tf":1.0},"378":{"tf":1.4142135623730951},"392":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"281":{"tf":1.0},"376":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":10,"docs":{"104":{"tf":1.4142135623730951},"116":{"tf":1.0},"220":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.4142135623730951},"250":{"tf":1.0},"460":{"tf":1.7320508075688772},"72":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.7320508075688772}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"104":{"tf":1.0},"121":{"tf":1.0},"229":{"tf":1.4142135623730951},"60":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":20,"docs":{"122":{"tf":1.0},"177":{"tf":1.4142135623730951},"190":{"tf":1.0},"20":{"tf":1.0},"200":{"tf":1.0},"255":{"tf":1.0},"262":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"289":{"tf":1.0},"291":{"tf":1.4142135623730951},"292":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.4142135623730951},"334":{"tf":1.0},"380":{"tf":1.0},"428":{"tf":1.7320508075688772},"501":{"tf":1.0}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"466":{"tf":1.0},"76":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"g":{"df":12,"docs":{"107":{"tf":1.7320508075688772},"136":{"tf":1.7320508075688772},"141":{"tf":1.7320508075688772},"151":{"tf":1.0},"274":{"tf":1.0},"291":{"tf":2.23606797749979},"334":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":1.0},"380":{"tf":1.0},"383":{"tf":1.0},"93":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"291":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"139":{"tf":1.4142135623730951},"237":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"515":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":13,"docs":{"100":{"tf":1.0},"137":{"tf":1.0},"261":{"tf":1.4142135623730951},"270":{"tf":1.0},"279":{"tf":1.0},"308":{"tf":1.0},"314":{"tf":1.0},"357":{"tf":1.0},"411":{"tf":1.7320508075688772},"502":{"tf":1.0},"89":{"tf":1.0},"94":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":26,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"166":{"tf":1.4142135623730951},"249":{"tf":1.0},"324":{"tf":1.0},"325":{"tf":1.0},"407":{"tf":1.0},"416":{"tf":1.7320508075688772},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.4142135623730951},"501":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"514":{"tf":1.0},"517":{"tf":1.0},"518":{"tf":1.0},"519":{"tf":1.0},"520":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"346":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":11,"docs":{"156":{"tf":1.4142135623730951},"179":{"tf":1.0},"238":{"tf":1.4142135623730951},"321":{"tf":1.0},"328":{"tf":1.4142135623730951},"345":{"tf":1.0},"386":{"tf":1.4142135623730951},"405":{"tf":1.0},"413":{"tf":1.0},"460":{"tf":1.7320508075688772},"465":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"179":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"352":{"tf":1.0},"356":{"tf":1.0},"367":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"140":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"308":{"tf":1.0},"492":{"tf":1.0},"495":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"118":{"tf":1.0},"16":{"tf":1.0},"194":{"tf":1.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"247":{"tf":1.0},"380":{"tf":1.0},"447":{"tf":1.4142135623730951}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"357":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"337":{"tf":1.0},"353":{"tf":1.0},"357":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":6,"docs":{"113":{"tf":1.0},"296":{"tf":1.0},"337":{"tf":1.0},"476":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.0}}},"t":{"a":{"df":0,"docs":{},"k":{"df":3,"docs":{"104":{"tf":1.0},"113":{"tf":1.0},"332":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"338":{"tf":2.8284271247461903},"357":{"tf":1.7320508075688772},"372":{"tf":1.7320508075688772}}}}},"x":{"df":2,"docs":{"285":{"tf":1.0},"357":{"tf":1.0}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":4,"docs":{"171":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.0},"304":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"d":{"df":1,"docs":{"329":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":10,"docs":{"155":{"tf":1.0},"174":{"tf":1.0},"19":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"352":{"tf":1.0}},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"\\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"351":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"351":{"tf":1.0},"354":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"263":{"tf":1.0},"354":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"354":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":38,"docs":{"100":{"tf":1.0},"109":{"tf":1.0},"146":{"tf":1.0},"17":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"258":{"tf":1.0},"261":{"tf":1.4142135623730951},"278":{"tf":1.0},"282":{"tf":1.4142135623730951},"283":{"tf":1.7320508075688772},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.0},"324":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"351":{"tf":1.7320508075688772},"352":{"tf":1.0},"354":{"tf":2.6457513110645907},"356":{"tf":1.0},"357":{"tf":2.0},"360":{"tf":1.0},"362":{"tf":1.0},"399":{"tf":1.4142135623730951},"445":{"tf":1.0},"446":{"tf":1.0},"486":{"tf":1.0},"502":{"tf":1.0},"66":{"tf":1.0},"73":{"tf":1.0},"88":{"tf":1.4142135623730951},"92":{"tf":1.0},"98":{"tf":1.0}},"s":{"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"104":{"tf":1.0}}}},"s":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.4142135623730951}},"i":{"df":7,"docs":{"202":{"tf":1.0},"261":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.4142135623730951},"487":{"tf":1.0},"497":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"l":{"df":13,"docs":{"207":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"278":{"tf":1.0},"291":{"tf":1.0},"325":{"tf":1.0},"462":{"tf":1.0},"466":{"tf":2.0},"55":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"237":{"tf":1.0},"238":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"346":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"144":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":9,"docs":{"117":{"tf":1.0},"231":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"330":{"tf":1.0},"343":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.0},"479":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"102":{"tf":1.0},"103":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"44":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":8,"docs":{"110":{"tf":1.4142135623730951},"144":{"tf":1.0},"281":{"tf":1.0},"373":{"tf":1.0},"390":{"tf":1.4142135623730951},"57":{"tf":1.4142135623730951},"63":{"tf":1.0},"85":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"l":{"df":9,"docs":{"233":{"tf":1.0},"249":{"tf":1.0},"285":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"357":{"tf":1.0},"460":{"tf":1.4142135623730951},"63":{"tf":1.0},"85":{"tf":1.0}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":4,"docs":{"273":{"tf":1.0},"276":{"tf":1.0},"324":{"tf":4.69041575982343},"325":{"tf":1.4142135623730951}}}}},"n":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"492":{"tf":1.0}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":20,"docs":{"140":{"tf":1.7320508075688772},"169":{"tf":1.4142135623730951},"171":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.4142135623730951},"290":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"307":{"tf":1.0},"326":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0},"373":{"tf":1.0},"493":{"tf":1.0},"51":{"tf":1.0},"511":{"tf":1.0},"89":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":4,"docs":{"178":{"tf":1.0},"369":{"tf":1.0},"377":{"tf":1.0},"390":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":14,"docs":{"107":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"137":{"tf":1.4142135623730951},"157":{"tf":1.0},"333":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"385":{"tf":1.0},"47":{"tf":1.0},"494":{"tf":1.0},"53":{"tf":1.7320508075688772},"63":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"105":{"tf":1.0},"217":{"tf":1.0},"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0},"469":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":8,"docs":{"169":{"tf":1.0},"196":{"tf":1.0},"2":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"450":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"l":{"df":4,"docs":{"298":{"tf":1.0},"300":{"tf":1.0},"310":{"tf":1.0},"335":{"tf":1.0}}}},"df":1,"docs":{"324":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"e":{"d":{"df":39,"docs":{"101":{"tf":1.0},"142":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.0},"210":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.4142135623730951},"238":{"tf":1.4142135623730951},"240":{"tf":1.0},"244":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"251":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"323":{"tf":1.4142135623730951},"324":{"tf":1.0},"330":{"tf":1.0},"343":{"tf":1.0},"365":{"tf":1.4142135623730951},"368":{"tf":1.0},"371":{"tf":1.0},"372":{"tf":1.4142135623730951},"383":{"tf":1.0},"40":{"tf":1.0},"405":{"tf":1.0},"456":{"tf":1.0},"46":{"tf":1.0},"460":{"tf":1.0},"494":{"tf":1.4142135623730951},"73":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0}}},"df":0,"docs":{}},"g":{"df":5,"docs":{"338":{"tf":1.4142135623730951},"357":{"tf":1.4142135623730951},"372":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":17,"docs":{"238":{"tf":1.0},"295":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.7320508075688772},"327":{"tf":1.0},"329":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"401":{"tf":1.0},"404":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":5,"docs":{"352":{"tf":1.0},"356":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"371":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"339":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"373":{"tf":1.4142135623730951},"406":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"127":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"306":{"tf":1.4142135623730951},"496":{"tf":1.0},"74":{"tf":1.0}}}}},"w":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"354":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":30,"docs":{"104":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"121":{"tf":1.0},"133":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"229":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"237":{"tf":1.0},"238":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"301":{"tf":1.0},"31":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951},"321":{"tf":1.0},"324":{"tf":1.0},"325":{"tf":1.0},"356":{"tf":1.0},"36":{"tf":1.0},"405":{"tf":1.0},"413":{"tf":1.4142135623730951},"493":{"tf":1.0},"501":{"tf":1.0},"518":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"68":{"tf":1.0}}},"x":{"df":0,"docs":{},"t":{"df":14,"docs":{"102":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"192":{"tf":1.4142135623730951},"210":{"tf":1.0},"211":{"tf":1.4142135623730951},"237":{"tf":1.0},"252":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"330":{"tf":1.0},"348":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0},"479":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"\'":{"df":1,"docs":{"308":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"304":{"tf":1.0}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":50,"docs":{"109":{"tf":1.0},"134":{"tf":1.4142135623730951},"147":{"tf":1.0},"151":{"tf":1.0},"154":{"tf":1.4142135623730951},"161":{"tf":1.4142135623730951},"170":{"tf":1.7320508075688772},"188":{"tf":2.23606797749979},"19":{"tf":1.0},"195":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"267":{"tf":1.4142135623730951},"27":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.4142135623730951},"287":{"tf":1.0},"292":{"tf":1.4142135623730951},"295":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.0},"304":{"tf":3.7416573867739413},"309":{"tf":1.0},"311":{"tf":1.0},"331":{"tf":1.7320508075688772},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":2.449489742783178},"335":{"tf":2.6457513110645907},"336":{"tf":1.0},"337":{"tf":1.7320508075688772},"338":{"tf":2.449489742783178},"339":{"tf":1.4142135623730951},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.4142135623730951},"344":{"tf":1.4142135623730951},"345":{"tf":2.0},"346":{"tf":1.4142135623730951},"347":{"tf":1.7320508075688772},"348":{"tf":1.0},"354":{"tf":1.4142135623730951},"363":{"tf":1.0},"421":{"tf":1.7320508075688772},"463":{"tf":1.0},"51":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"89":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":2,"docs":{"104":{"tf":1.0},"115":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"324":{"tf":1.0},"396":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"273":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"\\"":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"402":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"t":{"a":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"272":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"407":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"i":{"d":{"df":3,"docs":{"323":{"tf":1.0},"401":{"tf":1.0},"512":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"261":{"tf":1.0},"264":{"tf":1.0}}}}}},"df":47,"docs":{"136":{"tf":1.0},"15":{"tf":1.0},"199":{"tf":2.0},"201":{"tf":2.449489742783178},"202":{"tf":1.0},"217":{"tf":1.0},"223":{"tf":2.0},"257":{"tf":2.23606797749979},"258":{"tf":1.0},"261":{"tf":2.23606797749979},"264":{"tf":1.4142135623730951},"27":{"tf":1.0},"279":{"tf":1.4142135623730951},"281":{"tf":1.7320508075688772},"314":{"tf":1.0},"321":{"tf":1.7320508075688772},"323":{"tf":1.4142135623730951},"324":{"tf":3.4641016151377544},"325":{"tf":2.23606797749979},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0},"357":{"tf":1.0},"365":{"tf":1.4142135623730951},"366":{"tf":1.4142135623730951},"367":{"tf":1.0},"371":{"tf":1.4142135623730951},"379":{"tf":1.0},"380":{"tf":1.0},"399":{"tf":1.7320508075688772},"404":{"tf":1.0},"407":{"tf":1.4142135623730951},"409":{"tf":2.0},"463":{"tf":2.23606797749979},"480":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"495":{"tf":2.0},"497":{"tf":1.4142135623730951},"498":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.7320508075688772},"55":{"tf":1.7320508075688772},"56":{"tf":1.0},"70":{"tf":1.4142135623730951},"71":{"tf":1.4142135623730951},"90":{"tf":1.0}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"498":{"tf":1.0}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"261":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"261":{"tf":1.0},"324":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"264":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"354":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":1,"docs":{"279":{"tf":1.0}},"e":{"df":4,"docs":{"324":{"tf":2.0},"351":{"tf":1.0},"354":{"tf":1.0},"466":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"137":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"140":{"tf":1.0},"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":2,"docs":{"143":{"tf":1.4142135623730951},"371":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":62,"docs":{"104":{"tf":1.7320508075688772},"105":{"tf":1.0},"108":{"tf":1.0},"111":{"tf":1.0},"114":{"tf":1.0},"137":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"150":{"tf":1.0},"151":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.4142135623730951},"197":{"tf":2.23606797749979},"199":{"tf":1.0},"202":{"tf":1.0},"207":{"tf":2.0},"220":{"tf":1.0},"224":{"tf":1.7320508075688772},"234":{"tf":1.0},"241":{"tf":2.6457513110645907},"247":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"264":{"tf":3.0},"270":{"tf":1.4142135623730951},"369":{"tf":1.0},"371":{"tf":1.0},"413":{"tf":1.4142135623730951},"454":{"tf":1.4142135623730951},"455":{"tf":1.7320508075688772},"458":{"tf":1.4142135623730951},"460":{"tf":1.4142135623730951},"461":{"tf":1.4142135623730951},"462":{"tf":2.0},"466":{"tf":2.0},"470":{"tf":1.0},"471":{"tf":1.4142135623730951},"478":{"tf":1.4142135623730951},"48":{"tf":1.0},"480":{"tf":1.7320508075688772},"492":{"tf":1.4142135623730951},"493":{"tf":2.449489742783178},"495":{"tf":1.4142135623730951},"498":{"tf":1.7320508075688772},"500":{"tf":1.0},"504":{"tf":1.7320508075688772},"518":{"tf":1.0},"52":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"56":{"tf":1.7320508075688772},"64":{"tf":1.4142135623730951},"67":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":2.0},"76":{"tf":1.0},"79":{"tf":1.4142135623730951},"81":{"tf":1.0},"84":{"tf":1.4142135623730951},"86":{"tf":1.0},"93":{"tf":1.7320508075688772},"96":{"tf":1.0},"98":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"220":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"498":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"c":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"379":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"65":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"107":{"tf":1.0},"124":{"tf":1.0},"67":{"tf":1.0}}}}}},"w":{"df":7,"docs":{"130":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"327":{"tf":1.0},"462":{"tf":1.0},"467":{"tf":1.0},"500":{"tf":1.0},"96":{"tf":1.0}}}},"s":{"df":1,"docs":{"179":{"tf":1.0}}},"u":{"df":4,"docs":{"162":{"tf":1.0},"179":{"tf":1.0},"204":{"tf":1.0},"214":{"tf":1.7320508075688772}},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"291":{"tf":1.0},"296":{"tf":1.0}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"308":{"tf":1.0},"346":{"tf":1.0},"492":{"tf":1.4142135623730951},"495":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"350":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":8,"docs":{"155":{"tf":1.4142135623730951},"162":{"tf":1.0},"214":{"tf":1.4142135623730951},"255":{"tf":1.0},"259":{"tf":1.4142135623730951},"444":{"tf":1.7320508075688772},"496":{"tf":1.0},"66":{"tf":1.4142135623730951}}}}}}}},"o":{"(":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":2,"docs":{"279":{"tf":1.0},"502":{"tf":1.4142135623730951}}}},"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":16,"docs":{"203":{"tf":1.0},"238":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"401":{"tf":1.0},"463":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"55":{"tf":1.0},"72":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":6,"docs":{"124":{"tf":1.0},"136":{"tf":1.0},"151":{"tf":1.0},"483":{"tf":1.7320508075688772},"64":{"tf":2.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":4,"docs":{"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"330":{"tf":1.0},"360":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":16,"docs":{"135":{"tf":1.4142135623730951},"157":{"tf":1.0},"3":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.4142135623730951},"365":{"tf":1.0},"366":{"tf":1.0},"368":{"tf":1.0},"371":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"65":{"tf":1.0},"90":{"tf":1.0}}}}}}},"k":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"324":{"tf":1.4142135623730951},"325":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"133":{"tf":1.0},"354":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"(":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"354":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"a":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"354":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"(":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"354":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"293":{"tf":1.0},"303":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"354":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"303":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"354":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"303":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"354":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"8":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"335":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":3,"docs":{"139":{"tf":1.0},"238":{"tf":1.0},"324":{"tf":1.4142135623730951}}},"l":{"d":{"df":4,"docs":{"120":{"tf":1.0},"141":{"tf":1.0},"413":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"199":{"tf":1.0},"495":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"a":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"=":{"\\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"1":{"1":{"4":{"3":{"4":{"df":1,"docs":{"182":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":8,"docs":{"182":{"tf":2.0},"263":{"tf":1.0},"354":{"tf":1.7320508075688772},"359":{"tf":1.7320508075688772},"360":{"tf":1.0},"362":{"tf":1.0},"435":{"tf":1.7320508075688772},"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":6,"docs":{"104":{"tf":1.0},"121":{"tf":1.0},"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"251":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":4,"docs":{"105":{"tf":1.0},"251":{"tf":1.0},"292":{"tf":1.0},"339":{"tf":1.0}}},"df":4,"docs":{"110":{"tf":1.0},"136":{"tf":1.0},"316":{"tf":1.4142135623730951},"500":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"1":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{},"i":{"/":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":3,"docs":{"135":{"tf":1.0},"281":{"tf":1.0},"356":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"352":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"=":{"\\"":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"182":{"tf":1.0}}}}},"df":0,"docs":{}},"df":2,"docs":{"182":{"tf":1.0},"354":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":20,"docs":{"109":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"140":{"tf":1.0},"147":{"tf":1.0},"182":{"tf":2.0},"263":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.0},"337":{"tf":1.4142135623730951},"352":{"tf":1.4142135623730951},"354":{"tf":1.7320508075688772},"357":{"tf":1.0},"359":{"tf":1.4142135623730951},"360":{"tf":1.0},"362":{"tf":1.0},"433":{"tf":1.7320508075688772},"90":{"tf":1.0}}}},"df":9,"docs":{"2":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0},"467":{"tf":1.0},"498":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":10,"docs":{"208":{"tf":1.0},"231":{"tf":1.4142135623730951},"247":{"tf":1.0},"257":{"tf":1.0},"277":{"tf":1.0},"280":{"tf":1.0},"321":{"tf":1.0},"487":{"tf":1.0},"496":{"tf":1.0},"98":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.0}}}}}}},"t":{"df":5,"docs":{"328":{"tf":1.4142135623730951},"388":{"tf":1.0},"406":{"tf":1.0},"413":{"tf":1.0},"97":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":8,"docs":{"137":{"tf":1.0},"142":{"tf":1.4142135623730951},"157":{"tf":1.0},"279":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":2.0},"356":{"tf":1.0},"384":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"<":{"&":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"138":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"139":{"tf":1.0}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.4142135623730951}}}}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":3,"docs":{"321":{"tf":1.0},"324":{"tf":1.4142135623730951},"398":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"321":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"330":{"tf":1.0},"399":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":46,"docs":{"1":{"tf":1.0},"12":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"157":{"tf":1.0},"162":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"180":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"212":{"tf":1.0},"215":{"tf":1.0},"225":{"tf":1.0},"269":{"tf":1.0},"28":{"tf":1.0},"287":{"tf":1.7320508075688772},"288":{"tf":1.0},"3":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.4142135623730951},"332":{"tf":1.0},"333":{"tf":1.7320508075688772},"334":{"tf":1.7320508075688772},"337":{"tf":1.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.4142135623730951},"352":{"tf":1.4142135623730951},"353":{"tf":1.4142135623730951},"354":{"tf":1.0},"357":{"tf":1.0},"366":{"tf":1.4142135623730951},"367":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"372":{"tf":1.7320508075688772},"388":{"tf":1.4142135623730951},"399":{"tf":1.0},"4":{"tf":1.4142135623730951},"407":{"tf":1.0},"413":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"80":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"/":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":2,"docs":{"244":{"tf":2.0},"87":{"tf":1.0}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"n":{"df":19,"docs":{"105":{"tf":1.0},"110":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"14":{"tf":1.0},"213":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.7320508075688772},"269":{"tf":1.4142135623730951},"281":{"tf":1.0},"365":{"tf":1.4142135623730951},"369":{"tf":1.4142135623730951},"371":{"tf":1.7320508075688772},"377":{"tf":1.7320508075688772},"390":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"87":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"z":{"df":4,"docs":{"110":{"tf":1.0},"365":{"tf":1.0},"368":{"tf":1.0},"87":{"tf":1.0}}}}}},"df":1,"docs":{"244":{"tf":1.4142135623730951}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"73":{"tf":1.0},"77":{"tf":1.0}}}}},"d":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"141":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"46":{"tf":1.0},"98":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"100":{"tf":1.4142135623730951},"151":{"tf":1.0},"314":{"tf":1.0},"324":{"tf":1.0},"396":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"\'":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"&":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"498":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":12,"docs":{"13":{"tf":1.0},"155":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"264":{"tf":1.0},"292":{"tf":1.0},"303":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.0},"498":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"101":{"tf":1.0},"104":{"tf":1.0},"138":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"230":{"tf":1.0},"241":{"tf":1.4142135623730951},"247":{"tf":1.0},"258":{"tf":1.0},"291":{"tf":1.0},"70":{"tf":1.0},"93":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":5,"docs":{"289":{"tf":1.0},"322":{"tf":1.0},"358":{"tf":1.0},"405":{"tf":1.0},"410":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"285":{"tf":1.0},"289":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"d":{"df":16,"docs":{"110":{"tf":1.4142135623730951},"140":{"tf":1.0},"244":{"tf":1.0},"251":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.4142135623730951},"291":{"tf":2.449489742783178},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"369":{"tf":1.0},"74":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":39,"docs":{"102":{"tf":1.0},"158":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"254":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"256":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"269":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0},"420":{"tf":1.7320508075688772},"430":{"tf":1.7320508075688772},"441":{"tf":1.7320508075688772},"487":{"tf":1.4142135623730951},"66":{"tf":1.4142135623730951},"68":{"tf":1.0}}}}}}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"502":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"316":{"tf":1.0},"98":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":7,"docs":{"202":{"tf":1.0},"205":{"tf":1.0},"316":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"55":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.4142135623730951}}}}}}}}}}},"p":{"5":{"0":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{}},"9":{"5":{"df":1,"docs":{"391":{"tf":1.0}}},"9":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":6,"docs":{"165":{"tf":1.7320508075688772},"166":{"tf":1.0},"175":{"tf":1.0},"181":{"tf":1.0},"184":{"tf":1.0},"448":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"324":{"tf":1.7320508075688772},"398":{"tf":1.0}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":12,"docs":{"27":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.4142135623730951},"314":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772},"32":{"tf":1.0},"324":{"tf":3.3166247903554},"36":{"tf":1.4142135623730951},"398":{"tf":1.0},"40":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"d":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"39":{"tf":1.0}}},"i":{"c":{"df":2,"docs":{"142":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"96":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":22,"docs":{"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.4142135623730951},"501":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.0},"517":{"tf":1.0},"518":{"tf":1.0},"519":{"tf":1.0},"520":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"285":{"tf":1.0},"514":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"a":{"d":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"100":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":5,"docs":{"314":{"tf":1.0},"324":{"tf":2.0},"329":{"tf":1.0},"404":{"tf":1.0},"96":{"tf":1.0}}}}},"s":{"df":19,"docs":{"100":{"tf":1.4142135623730951},"137":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"264":{"tf":1.7320508075688772},"322":{"tf":1.7320508075688772},"323":{"tf":2.0},"324":{"tf":2.6457513110645907},"327":{"tf":1.7320508075688772},"342":{"tf":1.0},"379":{"tf":1.0},"400":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.0},"406":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951},"410":{"tf":1.4142135623730951},"413":{"tf":1.4142135623730951},"514":{"tf":1.0},"97":{"tf":1.4142135623730951}},"e":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"322":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}},"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"97":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"327":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":11,"docs":{"207":{"tf":1.0},"264":{"tf":1.4142135623730951},"278":{"tf":1.0},"317":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"324":{"tf":1.0},"330":{"tf":1.0},"400":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"410":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"223":{"tf":1.0}},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":2,"docs":{"125":{"tf":1.0},"480":{"tf":1.0}}}}},"df":2,"docs":{"352":{"tf":1.0},"65":{"tf":1.0}},"t":{"df":1,"docs":{"502":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"177":{"tf":1.4142135623730951},"179":{"tf":1.0},"190":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"178":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"df":6,"docs":{"104":{"tf":1.0},"123":{"tf":1.0},"247":{"tf":1.0},"251":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{".":{"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"139":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"490":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":3,"docs":{"170":{"tf":1.0},"185":{"tf":1.0},"449":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"204":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"/":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}}},"df":3,"docs":{"193":{"tf":1.0},"476":{"tf":1.0},"490":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"476":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"/":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":1,"docs":{"449":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"169":{"tf":1.0},"196":{"tf":1.0},"450":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{".":{"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"=":{"\\"":{"$":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{"$":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"188":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"139":{"tf":1.4142135623730951},"164":{"tf":1.0},"188":{"tf":1.0},"280":{"tf":1.0},"293":{"tf":1.0},"306":{"tf":1.0},"324":{"tf":2.0},"328":{"tf":1.4142135623730951},"386":{"tf":1.4142135623730951},"413":{"tf":1.0},"449":{"tf":1.0},"497":{"tf":1.4142135623730951},"498":{"tf":1.0},"80":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"75":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":77,"docs":{"101":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.7320508075688772},"116":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"137":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.4142135623730951},"169":{"tf":1.0},"171":{"tf":1.0},"196":{"tf":1.4142135623730951},"209":{"tf":2.23606797749979},"230":{"tf":1.0},"235":{"tf":1.4142135623730951},"236":{"tf":1.0},"237":{"tf":2.0},"238":{"tf":2.23606797749979},"241":{"tf":1.7320508075688772},"243":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.4142135623730951},"251":{"tf":1.0},"257":{"tf":1.0},"270":{"tf":1.0},"286":{"tf":1.0},"335":{"tf":1.0},"338":{"tf":1.0},"347":{"tf":1.0},"369":{"tf":1.4142135623730951},"376":{"tf":1.0},"455":{"tf":2.0},"458":{"tf":1.4142135623730951},"461":{"tf":2.0},"463":{"tf":2.23606797749979},"466":{"tf":1.0},"469":{"tf":1.0},"470":{"tf":1.4142135623730951},"473":{"tf":1.0},"48":{"tf":1.0},"492":{"tf":2.0},"493":{"tf":2.23606797749979},"495":{"tf":2.0},"498":{"tf":1.4142135623730951},"504":{"tf":1.0},"507":{"tf":1.0},"509":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"518":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"67":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.7320508075688772},"74":{"tf":1.0},"75":{"tf":2.6457513110645907},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.4142135623730951},"82":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"90":{"tf":1.0},"98":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"81":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"y":{"df":1,"docs":{"356":{"tf":1.0}}}},"df":5,"docs":{"171":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.0},"304":{"tf":1.0},"335":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":11,"docs":{"110":{"tf":1.4142135623730951},"113":{"tf":1.0},"136":{"tf":1.0},"241":{"tf":1.0},"269":{"tf":1.0},"278":{"tf":1.0},"317":{"tf":1.0},"319":{"tf":1.0},"352":{"tf":1.0},"57":{"tf":1.0},"91":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"124":{"tf":1.0},"238":{"tf":1.0},"366":{"tf":1.0},"76":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":17,"docs":{"198":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"289":{"tf":1.0},"339":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"371":{"tf":1.4142135623730951},"385":{"tf":1.0},"456":{"tf":1.0},"460":{"tf":1.4142135623730951},"494":{"tf":1.0},"73":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"139":{"tf":1.0},"280":{"tf":1.0},"477":{"tf":1.4142135623730951}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"120":{"tf":1.0},"124":{"tf":1.0},"64":{"tf":1.0},"67":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":11,"docs":{"324":{"tf":2.0},"328":{"tf":2.23606797749979},"330":{"tf":1.4142135623730951},"387":{"tf":1.4142135623730951},"388":{"tf":1.4142135623730951},"389":{"tf":1.4142135623730951},"390":{"tf":1.4142135623730951},"395":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":2.8284271247461903},"413":{"tf":1.0}}}}},"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":34,"docs":{"102":{"tf":1.4142135623730951},"126":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"131":{"tf":1.7320508075688772},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.0},"285":{"tf":1.4142135623730951},"50":{"tf":1.4142135623730951}}}}}}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"90":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"157":{"tf":1.0},"70":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"155":{"tf":1.0},"337":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"65":{"tf":1.0}}}},"n":{"df":2,"docs":{"500":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"df":1,"docs":{"135":{"tf":1.0}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"304":{"tf":1.4142135623730951},"347":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"151":{"tf":1.0},"39":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"142":{"tf":1.0},"95":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"377":{"tf":1.4142135623730951},"87":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"135":{"tf":1.0},"366":{"tf":1.4142135623730951},"385":{"tf":1.0}}}},"p":{"df":1,"docs":{"324":{"tf":1.0}},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"405":{"tf":1.0},"413":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"43":{"tf":2.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"120":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"337":{"tf":1.4142135623730951},"356":{"tf":1.4142135623730951},"371":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"73":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"247":{"tf":1.0},"351":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"234":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":3,"docs":{"111":{"tf":1.0},"230":{"tf":1.0},"385":{"tf":1.4142135623730951}}}}}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":17,"docs":{"104":{"tf":1.0},"108":{"tf":1.0},"122":{"tf":1.0},"142":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"253":{"tf":1.7320508075688772},"305":{"tf":1.4142135623730951},"371":{"tf":1.0},"461":{"tf":1.4142135623730951},"462":{"tf":1.0},"492":{"tf":1.0},"496":{"tf":1.0},"516":{"tf":1.4142135623730951},"74":{"tf":1.0},"75":{"tf":1.0},"90":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"492":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"104":{"tf":1.4142135623730951},"107":{"tf":1.0},"117":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0},"238":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"371":{"tf":1.0},"52":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"@":{"1":{"0":{"df":1,"docs":{"361":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"303":{"tf":1.0},"357":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"65":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"239":{"tf":1.4142135623730951},"240":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"160":{"tf":1.4142135623730951},"195":{"tf":1.4142135623730951},"415":{"tf":1.7320508075688772},"56":{"tf":1.0},"80":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"295":{"tf":1.0},"324":{"tf":1.0}}}},"r":{"df":0,"docs":{},"v":{"df":20,"docs":{"100":{"tf":1.0},"104":{"tf":1.0},"136":{"tf":1.0},"151":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"314":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"330":{"tf":1.0},"351":{"tf":1.0},"371":{"tf":1.0},"396":{"tf":1.0},"404":{"tf":1.4142135623730951},"467":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"327":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"s":{"df":1,"docs":{"28":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"332":{"tf":1.0},"337":{"tf":1.0},"502":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"df":2,"docs":{"39":{"tf":2.0},"4":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":2,"docs":{"363":{"tf":1.0},"393":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":23,"docs":{"140":{"tf":1.0},"143":{"tf":1.0},"178":{"tf":1.0},"257":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.4142135623730951},"291":{"tf":1.7320508075688772},"292":{"tf":1.0},"295":{"tf":1.4142135623730951},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"369":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"456":{"tf":1.0},"494":{"tf":1.0},"51":{"tf":1.0},"73":{"tf":1.0},"89":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":18,"docs":{"101":{"tf":1.4142135623730951},"126":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"152":{"tf":1.4142135623730951},"157":{"tf":1.0},"87":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":11,"docs":{"231":{"tf":1.4142135623730951},"244":{"tf":1.7320508075688772},"329":{"tf":1.0},"369":{"tf":1.0},"401":{"tf":1.0},"496":{"tf":1.4142135623730951},"500":{"tf":1.7320508075688772},"57":{"tf":1.7320508075688772},"88":{"tf":1.7320508075688772},"96":{"tf":1.4142135623730951},"99":{"tf":1.0}}},"y":{"\'":{":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"500":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"*":{"*":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"500":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"500":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":8,"docs":{"135":{"tf":1.4142135623730951},"350":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"65":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":16,"docs":{"104":{"tf":1.7320508075688772},"122":{"tf":1.0},"230":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"236":{"tf":1.7320508075688772},"237":{"tf":1.0},"238":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"333":{"tf":1.0},"48":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"267":{"tf":1.4142135623730951},"279":{"tf":1.0},"379":{"tf":1.0},"380":{"tf":1.0}}}}}},"d":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"307":{"tf":1.7320508075688772},"337":{"tf":1.0}},"u":{"c":{"df":0,"docs":{},"t":{"df":18,"docs":{"109":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"135":{"tf":1.0},"153":{"tf":1.0},"18":{"tf":1.0},"231":{"tf":1.4142135623730951},"244":{"tf":1.0},"246":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.0},"494":{"tf":1.0},"74":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":12,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"520":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"202":{"tf":1.0},"496":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"65":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":7,"docs":{"203":{"tf":1.4142135623730951},"210":{"tf":1.4142135623730951},"238":{"tf":1.0},"259":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"76":{"tf":1.7320508075688772}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"\'":{"df":1,"docs":{"480":{"tf":1.0}}},")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"337":{"tf":1.0}}}},"df":0,"docs":{}}},"/":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}}}},"df":72,"docs":{"105":{"tf":1.4142135623730951},"110":{"tf":3.1622776601683795},"120":{"tf":1.0},"124":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":1.7320508075688772},"144":{"tf":1.0},"169":{"tf":2.0},"171":{"tf":1.7320508075688772},"193":{"tf":1.0},"196":{"tf":1.4142135623730951},"209":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":2.449489742783178},"251":{"tf":1.4142135623730951},"258":{"tf":1.0},"269":{"tf":1.4142135623730951},"270":{"tf":1.0},"274":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"290":{"tf":1.7320508075688772},"292":{"tf":1.0},"307":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":2.0},"365":{"tf":1.4142135623730951},"366":{"tf":1.0},"368":{"tf":1.4142135623730951},"369":{"tf":2.449489742783178},"371":{"tf":2.23606797749979},"372":{"tf":1.0},"375":{"tf":1.4142135623730951},"376":{"tf":1.7320508075688772},"377":{"tf":1.0},"381":{"tf":1.7320508075688772},"417":{"tf":1.7320508075688772},"450":{"tf":1.0},"463":{"tf":2.0},"48":{"tf":1.0},"480":{"tf":1.0},"492":{"tf":1.4142135623730951},"493":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"5":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"504":{"tf":1.4142135623730951},"505":{"tf":1.0},"506":{"tf":1.0},"507":{"tf":1.0},"51":{"tf":1.0},"511":{"tf":2.23606797749979},"57":{"tf":2.0},"60":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"86":{"tf":2.449489742783178},"87":{"tf":1.0},"88":{"tf":1.7320508075688772},"89":{"tf":1.0},"91":{"tf":1.0},"96":{"tf":1.0}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"56":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":9,"docs":{"197":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"463":{"tf":1.0},"487":{"tf":1.0},"510":{"tf":1.7320508075688772},"511":{"tf":1.0},"512":{"tf":1.0},"92":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"342":{"tf":1.0}}}},"p":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"a":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":8,"docs":{"108":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"277":{"tf":1.0},"371":{"tf":1.0},"461":{"tf":1.0},"496":{"tf":1.0},"74":{"tf":1.0}}}},"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":29,"docs":{"100":{"tf":1.0},"314":{"tf":2.0},"316":{"tf":1.0},"319":{"tf":2.23606797749979},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"324":{"tf":3.7416573867739413},"326":{"tf":2.23606797749979},"330":{"tf":1.4142135623730951},"396":{"tf":1.4142135623730951},"398":{"tf":1.4142135623730951},"401":{"tf":1.0},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"407":{"tf":1.0},"467":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":2.23606797749979},"501":{"tf":1.0},"502":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"323":{"tf":1.0},"324":{"tf":1.0},"401":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"y":{"1":{"df":1,"docs":{"319":{"tf":1.0}}},"2":{"df":1,"docs":{"319":{"tf":1.0}}},"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":2,"docs":{"500":{"tf":1.7320508075688772},"99":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"500":{"tf":1.7320508075688772},"99":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"s":{"df":5,"docs":{"234":{"tf":1.4142135623730951},"395":{"tf":1.0},"460":{"tf":1.0},"465":{"tf":2.0},"494":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"150":{"tf":1.4142135623730951},"65":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"250":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":12,"docs":{"151":{"tf":1.0},"258":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"414":{"tf":1.7320508075688772},"445":{"tf":1.0},"446":{"tf":1.4142135623730951},"485":{"tf":1.7320508075688772},"486":{"tf":1.0},"487":{"tf":1.0},"53":{"tf":1.0},"63":{"tf":1.0},"92":{"tf":1.0}}}}},"df":1,"docs":{"161":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":58,"docs":{"105":{"tf":1.0},"109":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"147":{"tf":1.4142135623730951},"149":{"tf":1.0},"156":{"tf":1.0},"180":{"tf":1.4142135623730951},"182":{"tf":2.0},"21":{"tf":1.4142135623730951},"212":{"tf":1.0},"238":{"tf":1.0},"263":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.7320508075688772},"334":{"tf":1.7320508075688772},"337":{"tf":1.0},"338":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.7320508075688772},"350":{"tf":1.7320508075688772},"351":{"tf":1.7320508075688772},"352":{"tf":1.7320508075688772},"353":{"tf":2.449489742783178},"354":{"tf":3.0},"355":{"tf":1.0},"356":{"tf":2.449489742783178},"357":{"tf":2.23606797749979},"358":{"tf":1.0},"359":{"tf":2.0},"360":{"tf":1.4142135623730951},"361":{"tf":2.0},"362":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0},"431":{"tf":1.7320508075688772},"487":{"tf":1.0},"49":{"tf":1.0},"495":{"tf":1.0},"500":{"tf":1.0},"503":{"tf":1.0},"51":{"tf":1.0},"510":{"tf":1.0},"63":{"tf":1.0},"89":{"tf":1.4142135623730951},"90":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":17,"docs":{"237":{"tf":1.0},"261":{"tf":4.58257569495584},"262":{"tf":1.0},"263":{"tf":1.0},"277":{"tf":1.0},"293":{"tf":3.0},"303":{"tf":1.0},"321":{"tf":3.872983346207417},"322":{"tf":1.0},"323":{"tf":2.23606797749979},"324":{"tf":5.916079783099616},"325":{"tf":1.7320508075688772},"335":{"tf":1.0},"354":{"tf":2.23606797749979},"373":{"tf":1.0},"398":{"tf":3.3166247903554},"399":{"tf":1.7320508075688772}},"l":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"250":{"tf":2.6457513110645907},"356":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":18,"docs":{"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"344":{"tf":1.0},"48":{"tf":1.4142135623730951},"55":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"371":{"tf":1.0}}}},"t":{"df":1,"docs":{"307":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":11,"docs":{"109":{"tf":1.0},"241":{"tf":1.0},"289":{"tf":1.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.7320508075688772},"359":{"tf":1.7320508075688772},"361":{"tf":1.4142135623730951},"90":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":74,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.0},"118":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.0},"137":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"198":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0},"271":{"tf":1.4142135623730951},"274":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951},"278":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.4142135623730951},"325":{"tf":1.7320508075688772},"328":{"tf":1.0},"330":{"tf":1.4142135623730951},"356":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.4142135623730951},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"369":{"tf":1.0},"372":{"tf":1.0},"380":{"tf":1.4142135623730951},"381":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"396":{"tf":1.0},"402":{"tf":1.4142135623730951},"407":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.0},"456":{"tf":1.0},"465":{"tf":1.7320508075688772},"47":{"tf":1.0},"473":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.0},"492":{"tf":2.0},"494":{"tf":1.7320508075688772},"499":{"tf":1.0},"51":{"tf":1.0},"515":{"tf":1.4142135623730951},"517":{"tf":1.0},"519":{"tf":1.4142135623730951},"53":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.0},"63":{"tf":1.4142135623730951},"66":{"tf":1.4142135623730951},"73":{"tf":1.0},"89":{"tf":1.0},"99":{"tf":1.7320508075688772}}},"y":{"=":{"\'":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"469":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":10,"docs":{"105":{"tf":1.4142135623730951},"129":{"tf":1.4142135623730951},"251":{"tf":1.0},"321":{"tf":1.0},"330":{"tf":1.0},"365":{"tf":1.0},"401":{"tf":1.0},"404":{"tf":1.0},"49":{"tf":1.0},"68":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"266":{"tf":1.0},"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"113":{"tf":1.4142135623730951},"46":{"tf":1.0},"480":{"tf":1.0}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":81,"docs":{"102":{"tf":1.0},"120":{"tf":1.0},"130":{"tf":1.4142135623730951},"158":{"tf":1.0},"16":{"tf":1.0},"192":{"tf":1.0},"194":{"tf":1.7320508075688772},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":2.0},"208":{"tf":1.0},"209":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"214":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.0},"252":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"445":{"tf":1.7320508075688772},"446":{"tf":1.0},"447":{"tf":1.7320508075688772},"448":{"tf":1.0},"449":{"tf":1.0},"450":{"tf":1.0},"451":{"tf":1.0},"452":{"tf":1.0},"453":{"tf":1.0},"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0},"459":{"tf":1.0},"460":{"tf":1.0},"461":{"tf":1.0},"462":{"tf":1.0},"463":{"tf":1.0},"464":{"tf":1.0},"465":{"tf":1.0},"466":{"tf":1.0},"467":{"tf":1.0},"468":{"tf":1.0},"469":{"tf":1.0},"470":{"tf":1.0},"471":{"tf":1.0},"472":{"tf":1.0},"473":{"tf":1.0},"474":{"tf":1.0},"475":{"tf":1.0},"476":{"tf":1.0},"477":{"tf":1.0},"478":{"tf":1.0},"479":{"tf":1.0},"480":{"tf":1.7320508075688772},"521":{"tf":1.0},"68":{"tf":1.0},"72":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"502":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":9,"docs":{"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"238":{"tf":2.23606797749979},"247":{"tf":2.0},"501":{"tf":1.0},"502":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":1,"docs":{"279":{"tf":1.0}},"p":{"df":1,"docs":{"121":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"372":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"372":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"238":{"tf":2.23606797749979},"241":{"tf":1.0},"391":{"tf":1.4142135623730951}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"241":{"tf":1.0},"251":{"tf":1.4142135623730951},"84":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"329":{"tf":1.4142135623730951}},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"46":{"tf":1.0}}}},"d":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"137":{"tf":2.0},"143":{"tf":1.0},"157":{"tf":1.0},"333":{"tf":1.0}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"137":{"tf":1.0},"139":{"tf":1.0},"2":{"tf":1.0},"225":{"tf":1.4142135623730951},"226":{"tf":1.0},"247":{"tf":1.0},"339":{"tf":1.0},"4":{"tf":2.0},"479":{"tf":1.0},"503":{"tf":1.0},"504":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}},"i":{"df":3,"docs":{"130":{"tf":1.0},"498":{"tf":1.0},"68":{"tf":1.0}}},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":4,"docs":{"112":{"tf":1.4142135623730951},"228":{"tf":1.0},"241":{"tf":1.0},"38":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"56":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"365":{"tf":1.0}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":6,"docs":{"189":{"tf":1.0},"259":{"tf":1.0},"357":{"tf":1.0},"38":{"tf":1.0},"44":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"120":{"tf":1.0},"238":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"230":{"tf":1.0},"463":{"tf":1.0},"511":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"5":{"tf":1.0}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":9,"docs":{"164":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"330":{"tf":1.0},"345":{"tf":1.0},"359":{"tf":1.0},"466":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"133":{"tf":1.0},"285":{"tf":1.0},"298":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"371":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"d":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"323":{"tf":1.0},"401":{"tf":1.0}}},"df":0,"docs":{}}}},"df":14,"docs":{"124":{"tf":1.0},"151":{"tf":1.0},"17":{"tf":1.0},"198":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"250":{"tf":1.0},"291":{"tf":1.0},"460":{"tf":1.0},"467":{"tf":1.0},"494":{"tf":1.0},"55":{"tf":1.4142135623730951},"72":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"142":{"tf":1.0},"90":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"75":{"tf":1.0}},"s":{"df":2,"docs":{"291":{"tf":1.4142135623730951},"324":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"233":{"tf":1.0},"234":{"tf":2.449489742783178},"241":{"tf":2.449489742783178},"465":{"tf":1.0}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":4,"docs":{"104":{"tf":1.0},"236":{"tf":1.0},"238":{"tf":1.0},"48":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"c":{"df":1,"docs":{"134":{"tf":1.0}},"t":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"115":{"tf":1.0}},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"134":{"tf":1.0},"473":{"tf":1.0},"500":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"264":{"tf":1.0},"324":{"tf":1.4142135623730951},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":66,"docs":{"100":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"212":{"tf":1.0},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"23":{"tf":1.4142135623730951},"233":{"tf":1.0},"25":{"tf":1.4142135623730951},"252":{"tf":1.0},"264":{"tf":1.0},"311":{"tf":1.0},"314":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772},"324":{"tf":2.449489742783178},"347":{"tf":1.7320508075688772},"362":{"tf":1.4142135623730951},"392":{"tf":1.4142135623730951},"396":{"tf":1.0},"40":{"tf":1.4142135623730951},"412":{"tf":1.4142135623730951},"442":{"tf":1.7320508075688772},"466":{"tf":1.4142135623730951},"479":{"tf":1.4142135623730951},"480":{"tf":1.4142135623730951},"486":{"tf":2.0},"487":{"tf":1.0},"488":{"tf":1.0},"489":{"tf":1.0},"490":{"tf":1.0},"491":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"499":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"503":{"tf":1.0},"504":{"tf":1.0},"505":{"tf":1.0},"506":{"tf":1.0},"507":{"tf":1.0},"508":{"tf":1.0},"509":{"tf":1.0},"510":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"513":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.0},"516":{"tf":1.0},"517":{"tf":1.0},"518":{"tf":1.0},"519":{"tf":1.0},"520":{"tf":1.0},"521":{"tf":1.4142135623730951},"59":{"tf":1.0},"63":{"tf":1.0},"73":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"136":{"tf":1.0},"141":{"tf":1.0},"55":{"tf":1.0},"76":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"\\"":{"#":{"(":{"\\\\":{"df":0,"docs":{},"w":{"+":{")":{"\\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"\\\\":{"df":0,"docs":{},"w":{"+":{")":{":":{":":{"\\\\":{"df":0,"docs":{},"s":{"*":{"(":{"[":{"^":{"\\\\":{"df":0,"docs":{},"n":{"]":{"+":{")":{"\\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"\\\\":{"(":{"\\\\":{"(":{"(":{"[":{"^":{")":{"]":{"+":{")":{"\\\\":{")":{"\\\\":{")":{"\\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"\\\\":{"[":{"(":{"[":{"^":{"\\\\":{"]":{"]":{"+":{")":{"\\\\":{"]":{"\\\\":{"]":{"\\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"404":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"214":{"tf":1.0},"472":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"259":{"tf":1.0}}}}},"df":1,"docs":{"413":{"tf":1.0}}}}},"df":0,"docs":{}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":12,"docs":{"341":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.0},"344":{"tf":1.0},"383":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"409":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"494":{"tf":1.0},"73":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"t":{"df":30,"docs":{"101":{"tf":1.0},"108":{"tf":1.0},"114":{"tf":1.0},"116":{"tf":1.0},"129":{"tf":1.0},"142":{"tf":1.0},"144":{"tf":1.0},"200":{"tf":1.0},"217":{"tf":1.0},"234":{"tf":1.4142135623730951},"246":{"tf":1.0},"251":{"tf":1.0},"258":{"tf":1.0},"261":{"tf":1.0},"318":{"tf":1.0},"350":{"tf":1.0},"36":{"tf":1.4142135623730951},"458":{"tf":1.0},"461":{"tf":2.0},"466":{"tf":1.0},"473":{"tf":1.0},"493":{"tf":1.0},"495":{"tf":1.7320508075688772},"512":{"tf":1.7320508075688772},"518":{"tf":2.0},"56":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"79":{"tf":1.0},"97":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":9,"docs":{"111":{"tf":1.0},"137":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"238":{"tf":1.0},"250":{"tf":1.7320508075688772},"493":{"tf":1.4142135623730951},"495":{"tf":2.0},"56":{"tf":1.0},"79":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":35,"docs":{"105":{"tf":1.0},"111":{"tf":1.7320508075688772},"137":{"tf":1.0},"142":{"tf":1.0},"144":{"tf":1.7320508075688772},"151":{"tf":1.0},"199":{"tf":2.0},"201":{"tf":1.4142135623730951},"231":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"261":{"tf":1.0},"27":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"404":{"tf":1.0},"49":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":2.23606797749979},"512":{"tf":1.4142135623730951},"53":{"tf":1.0},"56":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951},"79":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":5,"docs":{"164":{"tf":1.0},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"184":{"tf":1.0},"448":{"tf":1.0}}}},"df":0,"docs":{},"v":{"df":7,"docs":{"101":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.4142135623730951},"27":{"tf":1.0},"371":{"tf":1.0},"466":{"tf":1.0},"53":{"tf":1.0}}}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"231":{"tf":1.0},"289":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"a":{"d":{"df":3,"docs":{"2":{"tf":1.4142135623730951},"285":{"tf":1.0},"38":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"324":{"tf":2.0},"328":{"tf":1.0},"413":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":4,"docs":{"115":{"tf":1.0},"142":{"tf":1.0},"207":{"tf":1.0},"480":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"v":{"df":4,"docs":{"156":{"tf":1.0},"193":{"tf":1.7320508075688772},"257":{"tf":1.0},"8":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"280":{"tf":1.0},"296":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"276":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"329":{"tf":1.0}},"e":{"d":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}}}},"[":{"0":{"]":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"329":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"234":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"122":{"tf":1.0},"236":{"tf":1.0},"48":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"502":{"tf":1.4142135623730951},"98":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":7,"docs":{"143":{"tf":1.0},"199":{"tf":1.0},"291":{"tf":1.0},"449":{"tf":1.0},"495":{"tf":1.0},"56":{"tf":1.0},"83":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"226":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":7,"docs":{"111":{"tf":1.0},"164":{"tf":1.4142135623730951},"46":{"tf":1.0},"463":{"tf":1.0},"55":{"tf":1.0},"75":{"tf":1.4142135623730951},"81":{"tf":1.0}}},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"405":{"tf":1.0}}}}}}}}},"q":{"/":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":15,"docs":{"275":{"tf":1.0},"46":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.4142135623730951},"501":{"tf":1.0},"502":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"514":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":41,"docs":{"10":{"tf":1.0},"161":{"tf":1.4142135623730951},"200":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.0},"287":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"298":{"tf":1.0},"314":{"tf":1.0},"321":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.4142135623730951},"337":{"tf":1.0},"338":{"tf":1.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"352":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"372":{"tf":1.4142135623730951},"375":{"tf":1.0},"383":{"tf":1.0},"385":{"tf":1.0},"387":{"tf":1.0},"396":{"tf":1.0},"405":{"tf":1.0},"460":{"tf":1.4142135623730951},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"498":{"tf":1.0},"499":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"80":{"tf":1.0},"88":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"317":{"tf":1.0},"501":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"339":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"372":{"tf":1.0},"381":{"tf":1.4142135623730951},"496":{"tf":1.0},"57":{"tf":1.0}}}},"v":{"df":3,"docs":{"136":{"tf":1.0},"371":{"tf":1.0},"384":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":9,"docs":{"258":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"45":{"tf":1.4142135623730951},"486":{"tf":1.0},"487":{"tf":1.0},"503":{"tf":1.7320508075688772},"522":{"tf":1.7320508075688772},"92":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"191":{"tf":1.4142135623730951},"475":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":14,"docs":{"234":{"tf":1.7320508075688772},"275":{"tf":1.0},"289":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"515":{"tf":1.4142135623730951}}}}}},"t":{"df":8,"docs":{"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.8284271247461903},"324":{"tf":2.6457513110645907},"460":{"tf":2.0},"465":{"tf":1.0},"73":{"tf":1.0},"83":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{")":{":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"1":{"df":1,"docs":{"492":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"b":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"a":{"df":0,"docs":{},"p":{"[":{"0":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"<":{"&":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"<":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":2,"docs":{"133":{"tf":1.0},"354":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"139":{"tf":1.0}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}}},"df":0,"docs":{}}},"k":{"b":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"293":{"tf":1.0},"303":{"tf":1.0},"354":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"324":{"tf":1.0},"335":{"tf":1.0}}}}},"t":{"df":3,"docs":{"153":{"tf":1.0},"231":{"tf":1.0},"496":{"tf":1.0}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"75":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"&":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"f":{"3":{"2":{"df":2,"docs":{"263":{"tf":1.0},"354":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":37,"docs":{"104":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"129":{"tf":1.0},"142":{"tf":1.0},"200":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":1.7320508075688772},"244":{"tf":1.0},"262":{"tf":1.4142135623730951},"272":{"tf":1.0},"275":{"tf":1.4142135623730951},"28":{"tf":1.0},"291":{"tf":1.0},"324":{"tf":4.123105625617661},"325":{"tf":2.0},"369":{"tf":1.0},"373":{"tf":1.0},"380":{"tf":1.0},"461":{"tf":1.0},"478":{"tf":1.4142135623730951},"492":{"tf":1.7320508075688772},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.7320508075688772},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.4142135623730951},"501":{"tf":1.4142135623730951},"502":{"tf":1.0},"77":{"tf":1.0},"88":{"tf":1.4142135623730951},"90":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"325":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"258":{"tf":1.0},"496":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":8,"docs":{"120":{"tf":1.0},"303":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"380":{"tf":1.0},"493":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"90":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"104":{"tf":1.0},"196":{"tf":1.0},"55":{"tf":1.0},"75":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"125":{"tf":1.0},"251":{"tf":1.0},"337":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":21,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"238":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"251":{"tf":1.0},"330":{"tf":1.0},"371":{"tf":1.0},"413":{"tf":1.0},"463":{"tf":1.4142135623730951},"465":{"tf":1.0},"467":{"tf":1.0},"472":{"tf":1.4142135623730951},"52":{"tf":1.0},"60":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.4142135623730951},"98":{"tf":1.0}}}},"s":{"df":3,"docs":{"348":{"tf":1.4142135623730951},"363":{"tf":1.4142135623730951},"393":{"tf":1.4142135623730951}}}}}},"f":{"df":1,"docs":{"193":{"tf":1.4142135623730951}}},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{},"g":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"354":{"tf":1.0}}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"352":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":6,"docs":{"263":{"tf":1.0},"353":{"tf":2.0},"354":{"tf":1.7320508075688772},"358":{"tf":1.0},"360":{"tf":1.0},"362":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"263":{"tf":1.0},"354":{"tf":1.4142135623730951},"360":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"39":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"352":{"tf":1.0}}}}},"m":{"df":1,"docs":{"193":{"tf":1.4142135623730951}}},"o":{"a":{"d":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":7,"docs":{"140":{"tf":1.0},"177":{"tf":2.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.4142135623730951},"190":{"tf":1.4142135623730951},"324":{"tf":1.0},"5":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"100":{"tf":1.0},"314":{"tf":1.0},"330":{"tf":1.0},"396":{"tf":1.0},"407":{"tf":1.0},"460":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"p":{"c":{"df":5,"docs":{"258":{"tf":1.0},"275":{"tf":1.4142135623730951},"487":{"tf":1.0},"514":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":5,"docs":{"287":{"tf":1.0},"316":{"tf":1.0},"74":{"tf":1.0},"88":{"tf":1.0},"96":{"tf":1.0}}}},"n":{"df":13,"docs":{"155":{"tf":1.0},"173":{"tf":1.4142135623730951},"175":{"tf":2.23606797749979},"179":{"tf":1.0},"190":{"tf":1.0},"194":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"309":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"367":{"tf":1.0},"489":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":17,"docs":{"134":{"tf":1.7320508075688772},"147":{"tf":1.7320508075688772},"157":{"tf":1.0},"19":{"tf":1.0},"267":{"tf":1.4142135623730951},"285":{"tf":1.0},"296":{"tf":1.0},"301":{"tf":1.0},"332":{"tf":1.4142135623730951},"333":{"tf":1.7320508075688772},"334":{"tf":1.0},"335":{"tf":1.0},"337":{"tf":1.0},"339":{"tf":1.0},"346":{"tf":1.4142135623730951},"79":{"tf":1.0},"98":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"\'":{"df":3,"docs":{"316":{"tf":1.0},"502":{"tf":1.0},"98":{"tf":1.0}}},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"209":{"tf":1.0},"219":{"tf":1.0},"237":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{",":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"197":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"202":{"tf":1.0},"270":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"496":{"tf":1.0}}}}}}}},":":{"\\\\":{"df":0,"docs":{},"n":{"\\\\":{"df":0,"docs":{},"n":{"1":{"df":1,"docs":{"493":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":63,"docs":{"110":{"tf":1.0},"153":{"tf":1.4142135623730951},"161":{"tf":1.0},"189":{"tf":1.0},"195":{"tf":1.0},"197":{"tf":1.4142135623730951},"200":{"tf":1.0},"202":{"tf":1.7320508075688772},"203":{"tf":1.0},"205":{"tf":1.0},"208":{"tf":1.0},"213":{"tf":1.4142135623730951},"217":{"tf":1.0},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":2.0},"255":{"tf":1.0},"257":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.4142135623730951},"27":{"tf":1.0},"270":{"tf":1.0},"275":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.7320508075688772},"296":{"tf":1.4142135623730951},"301":{"tf":1.0},"309":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0},"329":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.7320508075688772},"339":{"tf":1.0},"34":{"tf":1.0},"454":{"tf":1.0},"455":{"tf":2.0},"457":{"tf":1.4142135623730951},"461":{"tf":2.0},"463":{"tf":1.4142135623730951},"469":{"tf":1.0},"470":{"tf":1.4142135623730951},"492":{"tf":2.0},"493":{"tf":1.0},"496":{"tf":1.4142135623730951},"502":{"tf":1.0},"519":{"tf":1.0},"52":{"tf":1.0},"523":{"tf":1.7320508075688772},"55":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.7320508075688772},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"77":{"tf":1.0},"84":{"tf":1.4142135623730951},"92":{"tf":1.0},"96":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"189":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"238":{"tf":1.0},"247":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":13,"docs":{"134":{"tf":1.7320508075688772},"151":{"tf":1.0},"157":{"tf":1.0},"237":{"tf":1.0},"247":{"tf":1.0},"267":{"tf":1.0},"301":{"tf":1.4142135623730951},"321":{"tf":1.0},"330":{"tf":1.0},"332":{"tf":1.0},"404":{"tf":1.0},"411":{"tf":1.0},"63":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":6,"docs":{"200":{"tf":1.0},"231":{"tf":1.0},"247":{"tf":1.0},"285":{"tf":1.0},"337":{"tf":1.0},"96":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":11,"docs":{"110":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"122":{"tf":1.0},"236":{"tf":1.0},"243":{"tf":1.7320508075688772},"247":{"tf":1.0},"269":{"tf":1.0},"299":{"tf":1.0},"357":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"140":{"tf":1.0},"357":{"tf":1.0}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"280":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"361":{"tf":1.0},"391":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"262":{"tf":1.0},"373":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":3,"docs":{"238":{"tf":1.0},"278":{"tf":1.0},"369":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"l":{"df":20,"docs":{"162":{"tf":1.0},"198":{"tf":1.0},"255":{"tf":1.0},"262":{"tf":1.0},"281":{"tf":1.4142135623730951},"289":{"tf":1.0},"300":{"tf":1.0},"350":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"369":{"tf":1.0},"371":{"tf":1.0},"456":{"tf":1.0},"494":{"tf":1.0},"57":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":5,"docs":{"135":{"tf":1.0},"289":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"365":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"48":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"228":{"tf":1.0},"302":{"tf":1.0}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"179":{"tf":1.0}}}}}}}},"df":41,"docs":{"109":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"140":{"tf":1.0},"147":{"tf":1.4142135623730951},"154":{"tf":1.0},"157":{"tf":1.0},"170":{"tf":1.4142135623730951},"179":{"tf":1.7320508075688772},"19":{"tf":1.0},"250":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"267":{"tf":1.0},"285":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"304":{"tf":1.0},"311":{"tf":1.4142135623730951},"322":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":2.0},"335":{"tf":1.0},"337":{"tf":1.4142135623730951},"341":{"tf":1.7320508075688772},"345":{"tf":1.0},"407":{"tf":1.0},"411":{"tf":1.0},"421":{"tf":1.7320508075688772},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"51":{"tf":1.0},"63":{"tf":1.0},"89":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.0}}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"345":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"*":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"b":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":3,"docs":{"287":{"tf":1.0},"304":{"tf":1.0},"327":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"288":{"tf":1.0},"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"290":{"tf":1.0},"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"{":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{",":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{",":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"}":{".":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":3,"docs":{"266":{"tf":1.0},"334":{"tf":1.0},"345":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":5,"docs":{"269":{"tf":1.4142135623730951},"369":{"tf":1.4142135623730951},"86":{"tf":1.0},"87":{"tf":1.0},"98":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"d":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"a":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":2,"docs":{"273":{"tf":1.0},"492":{"tf":1.7320508075688772}}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"65":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":8,"docs":{"155":{"tf":1.0},"162":{"tf":1.0},"179":{"tf":1.0},"214":{"tf":1.4142135623730951},"255":{"tf":1.0},"259":{"tf":1.7320508075688772},"444":{"tf":1.7320508075688772},"66":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"k":{"b":{"df":3,"docs":{"179":{"tf":1.0},"204":{"tf":1.0},"214":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"302":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{}}},"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"219":{"tf":1.0},"60":{"tf":1.0}}}},"df":0,"docs":{}},"df":43,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.4142135623730951},"114":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"142":{"tf":1.4142135623730951},"144":{"tf":1.0},"2":{"tf":1.0},"200":{"tf":3.1622776601683795},"21":{"tf":1.0},"210":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"238":{"tf":1.0},"247":{"tf":1.0},"251":{"tf":1.0},"257":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":2.23606797749979},"281":{"tf":1.4142135623730951},"308":{"tf":1.0},"349":{"tf":1.0},"350":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.4142135623730951},"436":{"tf":1.7320508075688772},"452":{"tf":1.0},"454":{"tf":1.4142135623730951},"473":{"tf":1.4142135623730951},"478":{"tf":1.7320508075688772},"480":{"tf":1.0},"492":{"tf":2.0},"500":{"tf":1.0},"502":{"tf":1.0},"517":{"tf":1.4142135623730951},"53":{"tf":1.0},"63":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"178":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.4142135623730951},"292":{"tf":1.0},"334":{"tf":1.0},"369":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"287":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":3,"docs":{"127":{"tf":1.0},"130":{"tf":1.0},"391":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"14":{"tf":1.0},"32":{"tf":2.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"110":{"tf":1.0},"122":{"tf":1.0},"137":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"377":{"tf":1.0},"462":{"tf":2.0},"463":{"tf":1.0},"500":{"tf":1.0},"74":{"tf":1.0},"87":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":17,"docs":{"100":{"tf":1.0},"102":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"195":{"tf":1.0},"212":{"tf":1.0},"217":{"tf":1.0},"241":{"tf":1.0},"30":{"tf":1.0},"311":{"tf":1.4142135623730951},"318":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"502":{"tf":1.0},"521":{"tf":1.4142135623730951},"98":{"tf":1.0}},"n":{"df":2,"docs":{"118":{"tf":1.0},"247":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"306":{"tf":1.0},"354":{"tf":1.4142135623730951},"360":{"tf":1.0},"73":{"tf":1.0}}}},"df":0,"docs":{}},"f":{".":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"323":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951}},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"323":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"354":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"354":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"149":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"(":{"\\"":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"325":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"354":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},":":{":":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"\\"":{".":{"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"&":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"303":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":15,"docs":{"133":{"tf":1.0},"134":{"tf":1.0},"267":{"tf":1.0},"285":{"tf":1.0},"300":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":3.1622776601683795},"325":{"tf":1.7320508075688772},"332":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"354":{"tf":1.0},"359":{"tf":1.0},"65":{"tf":1.0},"90":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":32,"docs":{"105":{"tf":1.0},"108":{"tf":1.0},"129":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.4142135623730951},"142":{"tf":1.4142135623730951},"156":{"tf":1.0},"200":{"tf":1.7320508075688772},"21":{"tf":1.0},"210":{"tf":1.0},"238":{"tf":1.0},"247":{"tf":1.0},"251":{"tf":1.0},"257":{"tf":1.0},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"302":{"tf":1.4142135623730951},"308":{"tf":1.0},"349":{"tf":1.0},"350":{"tf":1.4142135623730951},"361":{"tf":1.0},"436":{"tf":1.7320508075688772},"454":{"tf":1.0},"473":{"tf":1.4142135623730951},"49":{"tf":1.0},"492":{"tf":2.0},"517":{"tf":1.7320508075688772},"53":{"tf":1.0},"63":{"tf":1.0},"90":{"tf":1.7320508075688772}},"i":{"c":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"461":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"n":{"d":{"df":4,"docs":{"262":{"tf":1.0},"263":{"tf":1.0},"354":{"tf":1.0},"493":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":4,"docs":{"135":{"tf":1.0},"342":{"tf":1.0},"356":{"tf":1.0},"65":{"tf":1.0}}}}},"t":{"df":1,"docs":{"352":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":4,"docs":{"334":{"tf":1.0},"341":{"tf":1.0},"409":{"tf":1.0},"466":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"144":{"tf":1.0}}}}}}}},"r":{"d":{"df":8,"docs":{"134":{"tf":1.0},"267":{"tf":1.0},"280":{"tf":1.0},"285":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.7320508075688772},"333":{"tf":1.0},"335":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"293":{"tf":1.0},"324":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"303":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"293":{"tf":1.0},"335":{"tf":1.0}}}}}},"s":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"139":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"267":{"tf":1.0},"335":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"238":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"335":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":8,"docs":{"100":{"tf":1.0},"293":{"tf":1.4142135623730951},"322":{"tf":1.0},"324":{"tf":2.449489742783178},"329":{"tf":1.0},"400":{"tf":1.0},"407":{"tf":1.0},"97":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"322":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"97":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"v":{"df":14,"docs":{"10":{"tf":1.0},"174":{"tf":1.4142135623730951},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"2":{"tf":1.7320508075688772},"205":{"tf":1.0},"257":{"tf":1.0},"337":{"tf":1.0},"43":{"tf":1.4142135623730951},"449":{"tf":1.0},"475":{"tf":1.0},"489":{"tf":1.4142135623730951},"490":{"tf":1.0},"6":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":25,"docs":{"165":{"tf":1.0},"174":{"tf":1.7320508075688772},"177":{"tf":1.7320508075688772},"184":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"2":{"tf":1.0},"205":{"tf":1.7320508075688772},"234":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.4142135623730951},"358":{"tf":1.0},"367":{"tf":1.0},"372":{"tf":1.0},"446":{"tf":1.0},"448":{"tf":1.7320508075688772},"475":{"tf":1.4142135623730951},"486":{"tf":1.0},"487":{"tf":1.0},"488":{"tf":1.4142135623730951},"489":{"tf":1.4142135623730951},"514":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"92":{"tf":1.0}}}},"i":{"c":{"df":2,"docs":{"111":{"tf":1.0},"250":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":10,"docs":{"159":{"tf":1.0},"171":{"tf":1.7320508075688772},"182":{"tf":1.0},"190":{"tf":1.0},"213":{"tf":1.7320508075688772},"285":{"tf":1.0},"324":{"tf":1.0},"332":{"tf":1.0},"422":{"tf":1.7320508075688772},"64":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":14,"docs":{"168":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"18":{"tf":2.23606797749979},"180":{"tf":1.4142135623730951},"234":{"tf":1.0},"244":{"tf":1.0},"26":{"tf":1.0},"338":{"tf":1.0},"345":{"tf":1.0},"357":{"tf":1.0},"372":{"tf":1.0},"447":{"tf":1.4142135623730951},"479":{"tf":1.0},"524":{"tf":1.7320508075688772}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"/":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"496":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"496":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"497":{"tf":1.0}}}},"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":39,"docs":{"101":{"tf":1.4142135623730951},"105":{"tf":1.0},"110":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"144":{"tf":1.0},"171":{"tf":3.0},"193":{"tf":1.4142135623730951},"213":{"tf":2.8284271247461903},"231":{"tf":1.0},"244":{"tf":3.1622776601683795},"251":{"tf":1.0},"269":{"tf":1.0},"274":{"tf":1.0},"332":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"368":{"tf":2.0},"369":{"tf":2.8284271247461903},"371":{"tf":2.0},"372":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"380":{"tf":1.4142135623730951},"381":{"tf":1.0},"383":{"tf":1.7320508075688772},"388":{"tf":1.0},"391":{"tf":1.4142135623730951},"467":{"tf":1.4142135623730951},"49":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.4142135623730951},"508":{"tf":1.0},"509":{"tf":1.0},"57":{"tf":1.4142135623730951},"60":{"tf":1.0},"74":{"tf":1.7320508075688772},"82":{"tf":1.0},"87":{"tf":2.0},"88":{"tf":1.4142135623730951}}}}},"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}},"o":{"df":0,"docs":{},"w":{"df":14,"docs":{"116":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"173":{"tf":1.0},"201":{"tf":2.0},"214":{"tf":1.0},"228":{"tf":1.0},"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"247":{"tf":1.0},"250":{"tf":1.0},"257":{"tf":1.0},"300":{"tf":1.0},"36":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"39":{"tf":1.0},"514":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":9,"docs":{"246":{"tf":1.0},"273":{"tf":1.7320508075688772},"308":{"tf":1.0},"360":{"tf":1.0},"4":{"tf":1.0},"466":{"tf":1.0},"49":{"tf":1.0},"492":{"tf":1.7320508075688772},"90":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"290":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":5,"docs":{"200":{"tf":1.0},"252":{"tf":1.0},"322":{"tf":1.0},"333":{"tf":1.0},"67":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"241":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":7,"docs":{"105":{"tf":1.0},"244":{"tf":1.0},"324":{"tf":1.0},"351":{"tf":1.0},"502":{"tf":1.0},"86":{"tf":1.0},"98":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"e":{"df":2,"docs":{"279":{"tf":1.0},"338":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"498":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"324":{"tf":1.0}}}}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"115":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"104":{"tf":1.0},"357":{"tf":1.0},"465":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":20,"docs":{"133":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"146":{"tf":1.0},"157":{"tf":1.0},"182":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"333":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":2.0},"356":{"tf":1.0},"359":{"tf":1.0},"365":{"tf":1.4142135623730951},"371":{"tf":1.0},"375":{"tf":1.4142135623730951},"466":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"334":{"tf":1.0},"338":{"tf":1.0},"343":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"104":{"tf":1.0},"48":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"375":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"t":{"df":19,"docs":{"104":{"tf":1.7320508075688772},"105":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"125":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"236":{"tf":1.0},"237":{"tf":1.7320508075688772},"238":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"247":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"251":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"494":{"tf":1.0},"55":{"tf":1.0},"75":{"tf":2.0}}}},"v":{"df":12,"docs":{"104":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":1.0},"122":{"tf":1.0},"228":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"246":{"tf":1.0},"48":{"tf":1.0},"75":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"(":{"(":{"_":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"324":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"149":{"tf":1.0}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":2.6457513110645907}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"i":{"d":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{":":{":":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"324":{"tf":1.0}},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"324":{"tf":1.4142135623730951},"329":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"115":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"250":{"tf":1.0}},"e":{"\'":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":17,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"164":{"tf":1.4142135623730951},"244":{"tf":1.0},"285":{"tf":1.0},"323":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0},"399":{"tf":1.0},"413":{"tf":1.0},"446":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.7320508075688772},"521":{"tf":1.0},"80":{"tf":1.0},"83":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"502":{"tf":1.4142135623730951},"98":{"tf":1.0}}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"98":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"134":{"tf":1.0},"45":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":30,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"110":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"166":{"tf":1.0},"218":{"tf":1.0},"25":{"tf":1.0},"269":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"324":{"tf":1.0},"325":{"tf":1.0},"332":{"tf":1.0},"337":{"tf":1.0},"338":{"tf":1.0},"347":{"tf":1.0},"369":{"tf":1.0},"377":{"tf":1.0},"470":{"tf":1.4142135623730951},"492":{"tf":1.0},"504":{"tf":1.0},"506":{"tf":1.0},"512":{"tf":1.0},"521":{"tf":1.0},"57":{"tf":1.0},"74":{"tf":1.0},"79":{"tf":1.0},"86":{"tf":1.7320508075688772}},"i":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"500":{"tf":1.0},"98":{"tf":1.7320508075688772}}}}}}},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"385":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"334":{"tf":1.0}}}}},"x":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"237":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{"df":1,"docs":{"264":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"4":{"2":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"f":{"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"189":{"tf":1.0},"338":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"324":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":2,"docs":{"339":{"tf":1.0},"96":{"tf":1.0}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"128":{"tf":1.0},"27":{"tf":1.0}}}}},"r":{"d":{"df":16,"docs":{"110":{"tf":1.0},"122":{"tf":1.0},"140":{"tf":1.4142135623730951},"209":{"tf":1.0},"213":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"36":{"tf":1.4142135623730951},"514":{"tf":1.0},"525":{"tf":1.7320508075688772},"55":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.4142135623730951},"87":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"76":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":52,"docs":{"102":{"tf":1.4142135623730951},"130":{"tf":2.0},"140":{"tf":1.0},"158":{"tf":1.4142135623730951},"16":{"tf":1.0},"174":{"tf":1.0},"177":{"tf":2.23606797749979},"186":{"tf":1.0},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"194":{"tf":1.7320508075688772},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"198":{"tf":1.0},"199":{"tf":1.0},"2":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":2.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.0},"205":{"tf":2.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"209":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"214":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"217":{"tf":1.4142135623730951},"218":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.4142135623730951},"238":{"tf":1.4142135623730951},"252":{"tf":1.4142135623730951},"257":{"tf":1.0},"371":{"tf":1.0},"451":{"tf":1.7320508075688772},"489":{"tf":1.4142135623730951},"521":{"tf":1.0},"68":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"339":{"tf":1.0},"357":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"352":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"314":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":2,"docs":{"3":{"tf":1.7320508075688772},"6":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"214":{"tf":1.0},"259":{"tf":1.0}}}}},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":2,"docs":{"214":{"tf":1.0},"259":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":23,"docs":{"100":{"tf":1.4142135623730951},"202":{"tf":1.0},"208":{"tf":1.0},"234":{"tf":1.4142135623730951},"250":{"tf":1.7320508075688772},"261":{"tf":1.0},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"324":{"tf":3.3166247903554},"326":{"tf":1.4142135623730951},"331":{"tf":1.0},"349":{"tf":1.0},"364":{"tf":1.0},"395":{"tf":1.4142135623730951},"398":{"tf":1.4142135623730951},"407":{"tf":1.0},"460":{"tf":1.0},"461":{"tf":1.0},"465":{"tf":1.0},"494":{"tf":1.4142135623730951},"500":{"tf":2.0},"73":{"tf":1.0},"96":{"tf":1.0}},"s":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"327":{"tf":1.0}}}}},"y":{"df":1,"docs":{"323":{"tf":1.0}}}},"d":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"337":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"337":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"(":{"\\"":{"df":0,"docs":{},"k":{"b":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"303":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{"df":1,"docs":{"354":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"139":{"tf":1.4142135623730951},"293":{"tf":1.0},"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":4,"docs":{"174":{"tf":1.0},"191":{"tf":1.0},"258":{"tf":1.0},"489":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"231":{"tf":1.0},"334":{"tf":1.0},"343":{"tf":1.0}}}}}},"p":{"df":25,"docs":{"102":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"192":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"198":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"205":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"252":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"330":{"tf":1.0},"396":{"tf":1.0},"448":{"tf":1.4142135623730951},"449":{"tf":1.4142135623730951},"450":{"tf":1.4142135623730951},"451":{"tf":1.4142135623730951},"452":{"tf":1.4142135623730951},"479":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"322":{"tf":1.0},"404":{"tf":1.0},"465":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"122":{"tf":1.0},"130":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":98,"docs":{"100":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":2.23606797749979},"140":{"tf":2.0},"151":{"tf":1.0},"162":{"tf":1.0},"167":{"tf":1.4142135623730951},"178":{"tf":1.0},"198":{"tf":1.4142135623730951},"20":{"tf":2.23606797749979},"217":{"tf":1.0},"231":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"266":{"tf":1.0},"268":{"tf":1.4142135623730951},"269":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"278":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.4142135623730951},"285":{"tf":1.0},"287":{"tf":1.7320508075688772},"288":{"tf":1.0},"289":{"tf":1.7320508075688772},"291":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.7320508075688772},"298":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"300":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"314":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"330":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":2.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.4142135623730951},"369":{"tf":2.23606797749979},"370":{"tf":1.0},"371":{"tf":1.0},"372":{"tf":1.7320508075688772},"373":{"tf":2.449489742783178},"374":{"tf":1.0},"375":{"tf":1.4142135623730951},"376":{"tf":1.4142135623730951},"377":{"tf":1.4142135623730951},"378":{"tf":1.0},"379":{"tf":1.0},"380":{"tf":1.0},"381":{"tf":1.0},"382":{"tf":1.0},"383":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"386":{"tf":1.0},"387":{"tf":1.4142135623730951},"388":{"tf":1.0},"389":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.0},"392":{"tf":1.4142135623730951},"393":{"tf":1.0},"396":{"tf":1.0},"401":{"tf":1.4142135623730951},"405":{"tf":1.0},"410":{"tf":1.4142135623730951},"425":{"tf":1.7320508075688772},"426":{"tf":1.7320508075688772},"427":{"tf":1.7320508075688772},"428":{"tf":1.7320508075688772},"456":{"tf":1.7320508075688772},"463":{"tf":1.0},"49":{"tf":1.0},"494":{"tf":2.0},"51":{"tf":1.4142135623730951},"55":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"86":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.4142135623730951}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"333":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":4,"docs":{"266":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"334":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":3,"docs":{"287":{"tf":1.4142135623730951},"295":{"tf":1.0},"300":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"d":{"b":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":14,"docs":{"100":{"tf":1.0},"142":{"tf":1.0},"323":{"tf":1.4142135623730951},"357":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"405":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0},"411":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"89":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":49,"docs":{"156":{"tf":1.4142135623730951},"20":{"tf":1.0},"236":{"tf":1.0},"238":{"tf":1.0},"249":{"tf":1.0},"269":{"tf":1.4142135623730951},"27":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.4142135623730951},"323":{"tf":1.0},"329":{"tf":1.4142135623730951},"331":{"tf":1.0},"349":{"tf":1.0},"353":{"tf":1.4142135623730951},"354":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":2.0},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":1.7320508075688772},"370":{"tf":1.0},"371":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"379":{"tf":1.0},"380":{"tf":1.0},"381":{"tf":1.4142135623730951},"382":{"tf":1.0},"383":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"386":{"tf":1.0},"387":{"tf":1.0},"388":{"tf":1.0},"389":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.0},"392":{"tf":1.0},"393":{"tf":1.0},"401":{"tf":1.4142135623730951},"413":{"tf":1.0},"429":{"tf":1.7320508075688772}}}}}}},"df":8,"docs":{"146":{"tf":1.0},"262":{"tf":1.4142135623730951},"263":{"tf":1.0},"322":{"tf":1.0},"324":{"tf":3.605551275463989},"325":{"tf":1.0},"354":{"tf":2.0},"373":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"144":{"tf":1.0},"261":{"tf":1.0},"495":{"tf":2.0}}}}}}},"i":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"290":{"tf":1.0},"308":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":26,"docs":{"100":{"tf":1.0},"261":{"tf":2.6457513110645907},"314":{"tf":1.0},"321":{"tf":2.0},"322":{"tf":1.7320508075688772},"323":{"tf":1.7320508075688772},"324":{"tf":3.872983346207417},"326":{"tf":2.0},"327":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.7320508075688772},"354":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.7320508075688772},"399":{"tf":1.0},"401":{"tf":1.0},"410":{"tf":1.0},"492":{"tf":1.7320508075688772},"493":{"tf":2.23606797749979},"494":{"tf":2.449489742783178},"495":{"tf":1.7320508075688772},"496":{"tf":1.4142135623730951},"498":{"tf":1.7320508075688772},"500":{"tf":2.0},"511":{"tf":1.0},"512":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":16,"docs":{"138":{"tf":1.0},"261":{"tf":1.7320508075688772},"264":{"tf":1.0},"267":{"tf":1.0},"293":{"tf":1.4142135623730951},"321":{"tf":1.7320508075688772},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":2.449489742783178},"330":{"tf":1.0},"335":{"tf":1.7320508075688772},"354":{"tf":1.4142135623730951},"379":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.0},"407":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":37,"docs":{"100":{"tf":1.7320508075688772},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"137":{"tf":1.0},"14":{"tf":1.4142135623730951},"155":{"tf":1.0},"196":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"247":{"tf":1.4142135623730951},"277":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"314":{"tf":1.0},"317":{"tf":1.0},"321":{"tf":2.0},"322":{"tf":1.0},"323":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"330":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.0},"36":{"tf":1.0},"397":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.4142135623730951},"466":{"tf":1.4142135623730951},"47":{"tf":1.0},"49":{"tf":1.0},"64":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.0},"94":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"b":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":4,"docs":{"314":{"tf":1.0},"324":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}}}},"u":{"b":{"df":1,"docs":{"234":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"383":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"346":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0},"77":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"361":{"tf":1.0},"493":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"142":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"53":{"tf":1.0},"61":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"231":{"tf":1.0},"463":{"tf":1.0},"480":{"tf":1.4142135623730951}},"i":{"df":8,"docs":{"251":{"tf":1.4142135623730951},"258":{"tf":1.0},"330":{"tf":1.4142135623730951},"463":{"tf":1.0},"472":{"tf":1.0},"511":{"tf":1.4142135623730951},"76":{"tf":1.0},"96":{"tf":1.0}}},"y":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":5,"docs":{"31":{"tf":1.0},"32":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"329":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"d":{"df":6,"docs":{"101":{"tf":1.0},"199":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.4142135623730951},"56":{"tf":1.0},"83":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":42,"docs":{"100":{"tf":1.0},"12":{"tf":1.4142135623730951},"167":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.4142135623730951},"314":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"330":{"tf":1.0},"332":{"tf":1.0},"333":{"tf":1.4142135623730951},"338":{"tf":1.0},"350":{"tf":1.0},"365":{"tf":1.4142135623730951},"388":{"tf":1.0},"394":{"tf":1.7320508075688772},"395":{"tf":1.0},"396":{"tf":1.0},"397":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.0},"402":{"tf":1.0},"403":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":1.0},"408":{"tf":1.0},"409":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"412":{"tf":1.0},"413":{"tf":1.0},"494":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"85":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"327":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"d":{"b":{"df":1,"docs":{"333":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"222":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"d":{"b":{",":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"166":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"162":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},":":{"/":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"377":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"377":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":62,"docs":{"100":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.0},"151":{"tf":1.0},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":2.0},"176":{"tf":1.7320508075688772},"177":{"tf":1.4142135623730951},"178":{"tf":1.0},"190":{"tf":2.0},"198":{"tf":1.4142135623730951},"20":{"tf":1.0},"214":{"tf":1.0},"217":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":2.0},"255":{"tf":1.0},"257":{"tf":1.0},"259":{"tf":1.0},"269":{"tf":1.4142135623730951},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.4142135623730951},"322":{"tf":1.0},"323":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":1.7320508075688772},"369":{"tf":2.23606797749979},"371":{"tf":2.0},"372":{"tf":1.4142135623730951},"376":{"tf":1.4142135623730951},"377":{"tf":1.4142135623730951},"379":{"tf":1.7320508075688772},"380":{"tf":1.7320508075688772},"388":{"tf":1.7320508075688772},"390":{"tf":1.4142135623730951},"392":{"tf":1.0},"401":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.0},"427":{"tf":1.7320508075688772},"456":{"tf":1.7320508075688772},"463":{"tf":1.0},"49":{"tf":1.0},"494":{"tf":2.23606797749979},"55":{"tf":1.0},"57":{"tf":1.0},"63":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"87":{"tf":1.0},"98":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"262":{"tf":1.0},"373":{"tf":1.0},"392":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":3,"docs":{"177":{"tf":1.4142135623730951},"179":{"tf":1.0},"190":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"241":{"tf":1.0}}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"g":{"df":2,"docs":{"27":{"tf":1.0},"40":{"tf":1.0}}}},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"138":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"120":{"tf":1.0},"133":{"tf":1.0},"247":{"tf":1.4142135623730951},"353":{"tf":1.0},"361":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"n":{"c":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":2,"docs":{"214":{"tf":1.0},"259":{"tf":1.0}}}}},"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"323":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"266":{"tf":1.0},"293":{"tf":1.0}}}}}}}},"df":33,"docs":{"20":{"tf":1.0},"214":{"tf":1.0},"257":{"tf":1.4142135623730951},"259":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.7320508075688772},"281":{"tf":1.0},"289":{"tf":1.7320508075688772},"293":{"tf":1.0},"299":{"tf":1.4142135623730951},"323":{"tf":1.0},"330":{"tf":1.0},"354":{"tf":1.0},"366":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":2.0},"371":{"tf":1.0},"372":{"tf":2.6457513110645907},"376":{"tf":1.0},"378":{"tf":1.4142135623730951},"384":{"tf":1.7320508075688772},"388":{"tf":1.0},"389":{"tf":2.0},"391":{"tf":1.7320508075688772},"392":{"tf":1.0},"405":{"tf":1.4142135623730951},"429":{"tf":1.7320508075688772},"49":{"tf":1.0},"493":{"tf":1.0},"66":{"tf":1.0},"87":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"384":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":5,"docs":{"333":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"341":{"tf":1.0},"346":{"tf":1.0},"469":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":46,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"138":{"tf":1.4142135623730951},"158":{"tf":1.0},"17":{"tf":1.0},"22":{"tf":1.0},"254":{"tf":1.7320508075688772},"255":{"tf":1.0},"256":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"266":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"269":{"tf":1.0},"27":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.7320508075688772},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"331":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"342":{"tf":1.0},"368":{"tf":1.0},"437":{"tf":1.7320508075688772},"47":{"tf":1.0},"502":{"tf":1.4142135623730951}},"s":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"100":{"tf":1.0},"323":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"401":{"tf":1.0},"407":{"tf":1.0}}}},"df":0,"docs":{},"g":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":44,"docs":{"100":{"tf":1.4142135623730951},"111":{"tf":1.0},"137":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.0},"197":{"tf":1.4142135623730951},"202":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"209":{"tf":1.0},"214":{"tf":1.0},"219":{"tf":2.449489742783178},"237":{"tf":1.0},"238":{"tf":1.0},"261":{"tf":1.0},"264":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"324":{"tf":4.123105625617661},"325":{"tf":1.4142135623730951},"326":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951},"407":{"tf":1.0},"455":{"tf":1.4142135623730951},"461":{"tf":2.0},"462":{"tf":1.0},"463":{"tf":1.0},"470":{"tf":2.23606797749979},"480":{"tf":1.0},"492":{"tf":1.7320508075688772},"493":{"tf":1.7320508075688772},"494":{"tf":1.4142135623730951},"500":{"tf":2.6457513110645907},"502":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"52":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":2.0},"95":{"tf":1.0},"96":{"tf":1.0},"99":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"k":{"df":0,"docs":{},"e":{"df":3,"docs":{"291":{"tf":1.0},"64":{"tf":1.0},"67":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"k":{"b":{"df":3,"docs":{"448":{"tf":1.0},"475":{"tf":1.4142135623730951},"477":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"179":{"tf":1.0},"495":{"tf":1.0},"64":{"tf":1.0},"80":{"tf":1.0},"83":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"k":{"b":{"df":1,"docs":{"299":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"77":{"tf":1.0}}}}}},"df":16,"docs":{"259":{"tf":1.0},"317":{"tf":2.23606797749979},"324":{"tf":2.449489742783178},"327":{"tf":1.0},"480":{"tf":1.0},"487":{"tf":1.0},"5":{"tf":1.0},"500":{"tf":2.0},"501":{"tf":1.4142135623730951},"502":{"tf":1.0},"510":{"tf":1.0},"55":{"tf":1.0},"77":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}},"b":{"d":{"df":1,"docs":{"413":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":31,"docs":{"104":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.7320508075688772},"122":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"229":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"233":{"tf":1.0},"236":{"tf":1.0},"238":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":1.0},"331":{"tf":1.0},"338":{"tf":1.0},"346":{"tf":1.0},"348":{"tf":1.0},"349":{"tf":1.0},"359":{"tf":1.0},"363":{"tf":1.0},"364":{"tf":1.0},"376":{"tf":1.7320508075688772},"393":{"tf":1.0},"460":{"tf":1.4142135623730951},"47":{"tf":1.0},"494":{"tf":1.0},"60":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"73":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"124":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"257":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"280":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"t":{"df":15,"docs":{"138":{"tf":1.0},"140":{"tf":2.0},"212":{"tf":1.4142135623730951},"22":{"tf":2.8284271247461903},"220":{"tf":2.0},"266":{"tf":1.0},"276":{"tf":2.23606797749979},"293":{"tf":1.0},"437":{"tf":1.7320508075688772},"438":{"tf":1.7320508075688772},"439":{"tf":1.7320508075688772},"51":{"tf":1.7320508075688772},"75":{"tf":1.0},"89":{"tf":1.4142135623730951},"91":{"tf":2.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"266":{"tf":1.0},"293":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"138":{"tf":1.4142135623730951}}}}}}},"s":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"220":{"tf":1.4142135623730951}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"220":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"140":{"tf":1.0},"212":{"tf":1.0},"51":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"390":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"122":{"tf":1.0}}}}},"r":{"a":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"\\"":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"\\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"*":{"*":{"/":{"*":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":3,"docs":{"22":{"tf":1.0},"276":{"tf":1.4142135623730951},"91":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":1,"docs":{"142":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"174":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.0},"279":{"tf":1.0},"4":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"302":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"138":{"tf":1.0},"302":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":37,"docs":{"110":{"tf":1.0},"138":{"tf":1.0},"153":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"174":{"tf":2.0},"175":{"tf":2.8284271247461903},"177":{"tf":1.0},"18":{"tf":1.0},"186":{"tf":1.7320508075688772},"191":{"tf":1.0},"236":{"tf":1.0},"241":{"tf":2.449489742783178},"243":{"tf":1.0},"26":{"tf":1.0},"278":{"tf":3.0},"289":{"tf":1.7320508075688772},"299":{"tf":1.0},"302":{"tf":2.0},"317":{"tf":1.0},"329":{"tf":2.6457513110645907},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"350":{"tf":1.0},"36":{"tf":1.0},"407":{"tf":1.0},"452":{"tf":1.4142135623730951},"46":{"tf":1.0},"463":{"tf":1.0},"475":{"tf":1.0},"478":{"tf":1.7320508075688772},"496":{"tf":1.0},"519":{"tf":1.0},"526":{"tf":1.7320508075688772},"7":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"278":{"tf":1.0}}}}}}}}},"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"t":{"df":37,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"182":{"tf":1.0},"200":{"tf":1.0},"257":{"tf":1.0},"263":{"tf":1.0},"272":{"tf":1.4142135623730951},"275":{"tf":1.0},"28":{"tf":1.0},"289":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"333":{"tf":1.0},"350":{"tf":1.0},"354":{"tf":2.23606797749979},"365":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"398":{"tf":1.0},"49":{"tf":1.0},"492":{"tf":1.7320508075688772},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"495":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"497":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"500":{"tf":1.4142135623730951},"501":{"tf":1.4142135623730951},"502":{"tf":1.4142135623730951},"90":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"351":{"tf":1.0},"354":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"354":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"251":{"tf":1.0},"40":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"502":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"352":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"237":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":15,"docs":{"108":{"tf":1.0},"142":{"tf":1.0},"153":{"tf":1.0},"209":{"tf":1.0},"231":{"tf":1.0},"237":{"tf":1.7320508075688772},"244":{"tf":1.0},"277":{"tf":1.0},"461":{"tf":1.0},"463":{"tf":1.0},"492":{"tf":1.0},"496":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"74":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":5,"docs":{"126":{"tf":1.0},"255":{"tf":1.0},"291":{"tf":1.0},"316":{"tf":1.0},"373":{"tf":1.0}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":8,"docs":{"200":{"tf":1.0},"279":{"tf":1.0},"290":{"tf":1.0},"298":{"tf":1.4142135623730951},"306":{"tf":1.0},"492":{"tf":1.7320508075688772},"517":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":5,"docs":{"129":{"tf":1.0},"241":{"tf":1.0},"284":{"tf":1.0},"49":{"tf":1.0},"70":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":19,"docs":{"101":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"147":{"tf":1.0},"234":{"tf":1.4142135623730951},"237":{"tf":1.4142135623730951},"238":{"tf":1.0},"267":{"tf":1.0},"295":{"tf":1.0},"334":{"tf":1.4142135623730951},"346":{"tf":1.4142135623730951},"38":{"tf":1.0},"502":{"tf":1.0},"70":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"345":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"238":{"tf":1.7320508075688772},"306":{"tf":1.0},"76":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"324":{"tf":1.4142135623730951},"398":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"df":3,"docs":{"216":{"tf":1.4142135623730951},"37":{"tf":1.4142135623730951},"468":{"tf":1.4142135623730951}}},"t":{"df":0,"docs":{},"l":{"df":19,"docs":{"137":{"tf":1.0},"197":{"tf":1.0},"202":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.0},"261":{"tf":1.0},"264":{"tf":1.4142135623730951},"28":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"493":{"tf":2.0},"494":{"tf":2.0},"52":{"tf":1.0},"520":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":1.7320508075688772},"93":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"1":{".":{"2":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"d":{"a":{"df":0,"docs":{},"y":{"\'":{"df":2,"docs":{"125":{"tf":1.0},"203":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"207":{"tf":1.0}}}}},"df":0,"docs":{}}},"/":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"317":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":21,"docs":{"314":{"tf":1.0},"317":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"324":{"tf":2.449489742783178},"325":{"tf":1.4142135623730951},"326":{"tf":1.0},"327":{"tf":1.0},"329":{"tf":1.4142135623730951},"330":{"tf":1.0},"396":{"tf":1.4142135623730951},"398":{"tf":1.0},"401":{"tf":1.0},"402":{"tf":1.0},"404":{"tf":1.0},"407":{"tf":1.0},"500":{"tf":1.7320508075688772},"501":{"tf":3.1622776601683795},"96":{"tf":1.0},"98":{"tf":1.4142135623730951},"99":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"141":{"tf":2.0},"199":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"238":{"tf":1.4142135623730951},"76":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":3,"docs":{"458":{"tf":1.4142135623730951},"79":{"tf":1.0},"98":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"502":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"l":{"df":21,"docs":{"170":{"tf":1.0},"311":{"tf":1.0},"331":{"tf":1.7320508075688772},"332":{"tf":1.0},"333":{"tf":2.0},"334":{"tf":1.0},"335":{"tf":1.0},"336":{"tf":1.0},"337":{"tf":1.0},"338":{"tf":1.7320508075688772},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.0},"344":{"tf":1.0},"345":{"tf":1.4142135623730951},"346":{"tf":1.0},"347":{"tf":1.4142135623730951},"348":{"tf":1.0},"363":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"238":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"514":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":74,"docs":{"100":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"12":{"tf":1.4142135623730951},"156":{"tf":1.0},"164":{"tf":1.0},"192":{"tf":1.0},"225":{"tf":1.0},"238":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"303":{"tf":1.0},"326":{"tf":1.4142135623730951},"334":{"tf":1.0},"338":{"tf":1.0},"342":{"tf":1.0},"345":{"tf":1.0},"4":{"tf":1.0},"407":{"tf":1.0},"446":{"tf":1.0},"452":{"tf":1.0},"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0},"469":{"tf":1.0},"479":{"tf":1.4142135623730951},"48":{"tf":1.0},"486":{"tf":2.0},"487":{"tf":1.7320508075688772},"488":{"tf":1.0},"489":{"tf":1.0},"49":{"tf":1.0},"490":{"tf":1.0},"491":{"tf":1.7320508075688772},"492":{"tf":1.0},"493":{"tf":1.0},"494":{"tf":1.0},"495":{"tf":1.0},"496":{"tf":1.0},"497":{"tf":1.0},"498":{"tf":1.0},"499":{"tf":2.0},"500":{"tf":1.0},"501":{"tf":1.0},"502":{"tf":1.0},"503":{"tf":1.0},"504":{"tf":1.0},"505":{"tf":1.0},"506":{"tf":1.0},"507":{"tf":1.0},"508":{"tf":1.0},"509":{"tf":1.0},"510":{"tf":1.0},"511":{"tf":1.0},"512":{"tf":1.0},"513":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.0},"516":{"tf":1.0},"517":{"tf":1.0},"518":{"tf":1.0},"519":{"tf":1.0},"520":{"tf":1.0},"521":{"tf":1.0},"62":{"tf":1.4142135623730951},"92":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":2.449489742783178}},"s":{"/":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":5,"docs":{"171":{"tf":1.7320508075688772},"193":{"tf":1.0},"213":{"tf":1.7320508075688772},"496":{"tf":1.4142135623730951},"497":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":4,"docs":{"28":{"tf":1.0},"463":{"tf":1.0},"511":{"tf":1.0},"96":{"tf":1.0}},"i":{"c":{"df":2,"docs":{"466":{"tf":1.0},"512":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"257":{"tf":1.0},"278":{"tf":1.0},"358":{"tf":1.0},"463":{"tf":1.0},"511":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":3,"docs":{"177":{"tf":1.4142135623730951},"244":{"tf":1.0},"88":{"tf":1.0}}},"k":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"367":{"tf":1.0}}}},"df":0,"docs":{}},"df":24,"docs":{"105":{"tf":1.0},"123":{"tf":1.0},"210":{"tf":1.4142135623730951},"238":{"tf":1.0},"251":{"tf":1.0},"300":{"tf":1.0},"310":{"tf":1.0},"317":{"tf":1.4142135623730951},"369":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"381":{"tf":1.0},"387":{"tf":1.0},"412":{"tf":1.0},"445":{"tf":1.0},"502":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"70":{"tf":1.0},"76":{"tf":1.4142135623730951},"83":{"tf":1.0},"86":{"tf":1.0},"93":{"tf":1.4142135623730951}}}},"d":{"df":0,"docs":{},"e":{"df":6,"docs":{"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"330":{"tf":1.0},"358":{"tf":1.0},"360":{"tf":1.0},"73":{"tf":1.0}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"333":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"61":{"tf":1.0},"77":{"tf":1.0}}},"n":{"df":2,"docs":{"135":{"tf":1.0},"356":{"tf":1.0}}},"t":{"df":17,"docs":{"138":{"tf":2.23606797749979},"203":{"tf":1.0},"25":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"263":{"tf":1.7320508075688772},"354":{"tf":1.4142135623730951},"356":{"tf":1.0},"360":{"tf":1.0},"372":{"tf":1.0},"373":{"tf":1.4142135623730951},"392":{"tf":1.0},"493":{"tf":2.0},"495":{"tf":1.4142135623730951},"496":{"tf":1.0},"504":{"tf":1.0},"72":{"tf":2.0},"75":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"454":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0},"457":{"tf":1.0},"458":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"174":{"tf":1.0},"489":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":10,"docs":{"114":{"tf":1.0},"137":{"tf":1.0},"142":{"tf":1.0},"144":{"tf":1.0},"280":{"tf":1.0},"365":{"tf":1.0},"385":{"tf":1.0},"494":{"tf":1.0},"512":{"tf":1.0},"70":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"396":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"324":{"tf":1.0}}}},"i":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"216":{"tf":1.4142135623730951},"468":{"tf":1.4142135623730951}}}},"df":2,"docs":{"452":{"tf":1.0},"478":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"379":{"tf":1.0},"380":{"tf":1.0}}}}}},"m":{"df":1,"docs":{"324":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"d":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":7,"docs":{"100":{"tf":1.0},"314":{"tf":1.0},"330":{"tf":1.0},"356":{"tf":1.0},"396":{"tf":1.0},"407":{"tf":1.0},"460":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":5,"docs":{"187":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"23":{"tf":1.0},"41":{"tf":1.4142135623730951},"474":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"e":{"df":21,"docs":{"178":{"tf":1.0},"182":{"tf":1.0},"212":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"292":{"tf":1.0},"302":{"tf":1.0},"327":{"tf":1.4142135623730951},"333":{"tf":1.4142135623730951},"354":{"tf":1.7320508075688772},"369":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"454":{"tf":1.0},"492":{"tf":1.4142135623730951},"496":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951},"499":{"tf":1.0},"517":{"tf":1.0},"97":{"tf":2.0}}},"t":{"df":0,"docs":{},"h":{"df":8,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"244":{"tf":1.0},"323":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0},"399":{"tf":1.0},"413":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"l":{"df":3,"docs":{"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"380":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"289":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"343":{"tf":1.0}}},"n":{"df":1,"docs":{"480":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"338":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":10,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"332":{"tf":1.0},"339":{"tf":1.0},"368":{"tf":1.0},"372":{"tf":1.0},"495":{"tf":1.0}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"=":{"\'":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"469":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"304":{"tf":2.6457513110645907},"309":{"tf":1.0},"337":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":80,"docs":{"105":{"tf":1.0},"108":{"tf":1.4142135623730951},"111":{"tf":1.0},"134":{"tf":1.4142135623730951},"137":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.0},"151":{"tf":1.0},"153":{"tf":1.0},"157":{"tf":1.0},"178":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.4142135623730951},"202":{"tf":1.0},"209":{"tf":1.0},"215":{"tf":1.0},"224":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.4142135623730951},"27":{"tf":1.0},"28":{"tf":1.0},"285":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.0},"293":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.4142135623730951},"300":{"tf":1.0},"301":{"tf":1.4142135623730951},"321":{"tf":1.0},"323":{"tf":2.23606797749979},"326":{"tf":2.23606797749979},"330":{"tf":1.0},"332":{"tf":1.4142135623730951},"333":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"342":{"tf":1.0},"369":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0},"401":{"tf":1.7320508075688772},"404":{"tf":1.0},"411":{"tf":1.0},"454":{"tf":1.0},"461":{"tf":1.4142135623730951},"49":{"tf":1.0},"492":{"tf":3.605551275463989},"493":{"tf":3.1622776601683795},"494":{"tf":3.1622776601683795},"495":{"tf":2.8284271247461903},"496":{"tf":2.6457513110645907},"497":{"tf":1.4142135623730951},"498":{"tf":2.8284271247461903},"500":{"tf":2.6457513110645907},"501":{"tf":1.7320508075688772},"502":{"tf":1.7320508075688772},"511":{"tf":1.4142135623730951},"512":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"56":{"tf":1.0},"63":{"tf":1.0},"70":{"tf":1.4142135623730951},"71":{"tf":1.4142135623730951},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.4142135623730951},"90":{"tf":1.0},"91":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"i":{"c":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":3,"docs":{"134":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"64":{"tf":1.0}}},"n":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"371":{"tf":1.0},"413":{"tf":1.0}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":14,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"111":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"230":{"tf":1.0},"246":{"tf":1.0},"27":{"tf":1.0},"36":{"tf":1.0},"469":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"80":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":4,"docs":{"105":{"tf":1.4142135623730951},"353":{"tf":1.0},"356":{"tf":1.0},"49":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"193":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"202":{"tf":1.0},"324":{"tf":1.0}}}},"t":{"df":5,"docs":{"241":{"tf":1.0},"278":{"tf":1.0},"314":{"tf":1.0},"396":{"tf":1.0},"95":{"tf":1.0}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"514":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"314":{"tf":1.0}}}}},"s":{"a":{"df":0,"docs":{},"f":{"df":2,"docs":{"153":{"tf":1.0},"280":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\\"":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":5,"docs":{"153":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"496":{"tf":1.0},"74":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":21,"docs":{"101":{"tf":1.0},"104":{"tf":1.0},"141":{"tf":1.4142135623730951},"189":{"tf":1.4142135623730951},"301":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0},"36":{"tf":1.0},"369":{"tf":1.0},"371":{"tf":1.0},"377":{"tf":1.0},"379":{"tf":1.0},"38":{"tf":1.0},"381":{"tf":1.4142135623730951},"383":{"tf":1.0},"407":{"tf":1.4142135623730951},"44":{"tf":1.0},"465":{"tf":1.0},"501":{"tf":1.0}}}},"df":0,"docs":{}},"df":5,"docs":{"121":{"tf":1.0},"159":{"tf":1.0},"171":{"tf":1.4142135623730951},"194":{"tf":1.0},"213":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"379":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"258":{"tf":1.0},"487":{"tf":1.0},"503":{"tf":1.0},"504":{"tf":1.0},"505":{"tf":1.0},"506":{"tf":1.0},"507":{"tf":1.0},"508":{"tf":1.0},"509":{"tf":1.0}}},"l":{"df":9,"docs":{"164":{"tf":1.0},"178":{"tf":1.0},"288":{"tf":1.0},"307":{"tf":2.6457513110645907},"333":{"tf":1.0},"334":{"tf":1.0},"369":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.0}}}},"s":{"a":{"df":0,"docs":{},"g":{"df":12,"docs":{"134":{"tf":1.0},"167":{"tf":1.0},"226":{"tf":1.0},"23":{"tf":1.0},"238":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.0},"304":{"tf":1.0},"322":{"tf":1.0},"345":{"tf":1.0},"352":{"tf":1.0},"464":{"tf":1.4142135623730951}}}},"df":129,"docs":{"102":{"tf":1.0},"108":{"tf":1.0},"111":{"tf":1.0},"116":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":2.6457513110645907},"130":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.4142135623730951},"142":{"tf":1.0},"149":{"tf":1.0},"153":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.4142135623730951},"16":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"181":{"tf":1.0},"183":{"tf":1.0},"198":{"tf":1.0},"202":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"217":{"tf":1.7320508075688772},"219":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":1.7320508075688772},"230":{"tf":1.0},"231":{"tf":2.0},"232":{"tf":1.7320508075688772},"233":{"tf":1.0},"234":{"tf":1.4142135623730951},"235":{"tf":1.7320508075688772},"236":{"tf":1.0},"237":{"tf":1.4142135623730951},"238":{"tf":2.23606797749979},"239":{"tf":1.7320508075688772},"240":{"tf":1.0},"241":{"tf":1.0},"242":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":1.7320508075688772},"245":{"tf":1.7320508075688772},"246":{"tf":1.0},"247":{"tf":2.0},"248":{"tf":1.7320508075688772},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"251":{"tf":1.4142135623730951},"252":{"tf":1.0},"270":{"tf":1.0},"28":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"290":{"tf":1.0},"293":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"308":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":1.4142135623730951},"316":{"tf":1.0},"324":{"tf":3.3166247903554},"329":{"tf":1.0},"335":{"tf":1.0},"338":{"tf":1.0},"343":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"354":{"tf":1.0},"356":{"tf":2.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"36":{"tf":1.4142135623730951},"361":{"tf":1.0},"369":{"tf":1.0},"372":{"tf":1.0},"374":{"tf":1.4142135623730951},"381":{"tf":1.0},"384":{"tf":1.0},"39":{"tf":1.0},"396":{"tf":1.0},"4":{"tf":1.0},"43":{"tf":1.4142135623730951},"452":{"tf":1.0},"456":{"tf":1.4142135623730951},"458":{"tf":1.4142135623730951},"460":{"tf":1.0},"461":{"tf":1.4142135623730951},"462":{"tf":1.0},"463":{"tf":1.7320508075688772},"466":{"tf":1.0},"467":{"tf":1.0},"469":{"tf":1.7320508075688772},"470":{"tf":1.0},"473":{"tf":1.4142135623730951},"479":{"tf":1.0},"480":{"tf":1.0},"489":{"tf":1.0},"492":{"tf":1.0},"493":{"tf":1.4142135623730951},"494":{"tf":1.4142135623730951},"496":{"tf":2.0},"5":{"tf":1.0},"502":{"tf":1.0},"517":{"tf":1.4142135623730951},"52":{"tf":1.0},"520":{"tf":1.0},"55":{"tf":1.0},"58":{"tf":1.4142135623730951},"64":{"tf":1.0},"67":{"tf":2.449489742783178},"68":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"76":{"tf":1.0},"77":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.7320508075688772},"84":{"tf":1.0},"88":{"tf":1.4142135623730951},"90":{"tf":1.0},"98":{"tf":1.7320508075688772}},"e":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"75":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"r":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"290":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":30,"docs":{"111":{"tf":1.0},"133":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.0},"177":{"tf":1.4142135623730951},"179":{"tf":1.0},"190":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.0},"255":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.0},"280":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.7320508075688772},"307":{"tf":1.7320508075688772},"311":{"tf":1.0},"335":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.4142135623730951},"347":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"361":{"tf":1.4142135623730951},"391":{"tf":1.0},"396":{"tf":1.0},"413":{"tf":1.4142135623730951},"45":{"tf":1.0},"462":{"tf":1.7320508075688772}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"178":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"75":{"tf":1.0}}}}}}}}}}}},"s":{"/":{"a":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":2,"docs":{"467":{"tf":1.4142135623730951},"498":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"263":{"tf":1.0},"324":{"tf":1.4142135623730951},"354":{"tf":2.0}}}}},"t":{"c":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}},"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"i":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"v":{"4":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"318":{"tf":1.4142135623730951},"321":{"tf":1.0},"324":{"tf":2.0},"396":{"tf":1.0},"398":{"tf":1.4142135623730951},"75":{"tf":1.0}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"155":{"tf":1.0}}}},"v":{"0":{".":{"4":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"338":{"tf":1.0}}},"5":{"df":5,"docs":{"133":{"tf":1.0},"146":{"tf":1.0},"288":{"tf":1.0},"351":{"tf":1.0},"354":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":2,"docs":{"250":{"tf":1.4142135623730951},"381":{"tf":1.4142135623730951}}},"2":{"df":3,"docs":{"250":{"tf":1.4142135623730951},"381":{"tf":2.0},"83":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"238":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"237":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":31,"docs":{"12":{"tf":1.0},"134":{"tf":2.0},"147":{"tf":2.0},"154":{"tf":1.0},"157":{"tf":1.0},"224":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.7320508075688772},"280":{"tf":2.0},"285":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.4142135623730951},"294":{"tf":1.7320508075688772},"295":{"tf":2.0},"296":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"304":{"tf":2.23606797749979},"309":{"tf":1.4142135623730951},"332":{"tf":1.4142135623730951},"333":{"tf":2.6457513110645907},"334":{"tf":2.0},"335":{"tf":2.0},"337":{"tf":1.0},"339":{"tf":1.0},"342":{"tf":1.0},"346":{"tf":1.0},"35":{"tf":1.0},"357":{"tf":1.0},"411":{"tf":1.0},"514":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"u":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}},"df":0,"docs":{}},"df":23,"docs":{"131":{"tf":1.0},"134":{"tf":1.0},"261":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"291":{"tf":1.7320508075688772},"295":{"tf":1.7320508075688772},"296":{"tf":1.0},"307":{"tf":1.4142135623730951},"319":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":2.23606797749979},"326":{"tf":1.4142135623730951},"333":{"tf":1.0},"334":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"398":{"tf":1.0},"411":{"tf":1.0},"500":{"tf":1.0},"502":{"tf":1.0},"98":{"tf":1.4142135623730951}},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"319":{"tf":1.0}}},"2":{"df":1,"docs":{"319":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"24":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":5,"docs":{"182":{"tf":1.0},"303":{"tf":1.0},"334":{"tf":1.0},"337":{"tf":1.0},"477":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"134":{"tf":1.0}}}},"t":{"df":1,"docs":{"82":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"498":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"!":{"[":{"\\"":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"264":{"tf":1.0},"329":{"tf":1.0}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"324":{"tf":2.8284271247461903},"325":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"<":{"&":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"(":{"&":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"325":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}}},"_":{"df":1,"docs":{"273":{"tf":1.0}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0},"398":{"tf":1.0},"400":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"261":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":6,"docs":{"261":{"tf":1.0},"263":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":2.449489742783178},"354":{"tf":1.7320508075688772},"398":{"tf":1.7320508075688772}}}}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"f":{"3":{"2":{"df":2,"docs":{"351":{"tf":1.0},"352":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"350":{"tf":1.0},"90":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"352":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"333":{"tf":1.0},"341":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"359":{"tf":1.0}},"f":{"df":2,"docs":{"137":{"tf":1.0},"419":{"tf":1.7320508075688772}},"i":{"df":9,"docs":{"13":{"tf":1.4142135623730951},"164":{"tf":1.0},"172":{"tf":1.4142135623730951},"186":{"tf":1.0},"188":{"tf":1.0},"31":{"tf":1.0},"42":{"tf":1.0},"448":{"tf":1.0},"476":{"tf":1.0}}}}},"s":{"a":{"df":1,"docs":{"133":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\'":{"df":1,"docs":{"141":{"tf":1.0}}},"df":33,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"13":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.7320508075688772},"151":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"164":{"tf":1.0},"173":{"tf":1.4142135623730951},"188":{"tf":1.0},"199":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"238":{"tf":2.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"261":{"tf":1.0},"269":{"tf":1.4142135623730951},"292":{"tf":1.0},"310":{"tf":1.4142135623730951},"333":{"tf":1.0},"337":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"371":{"tf":1.0},"381":{"tf":1.0},"42":{"tf":1.0},"495":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"67":{"tf":1.0},"76":{"tf":1.0}}}}}}}},"i":{"a":{"df":46,"docs":{"105":{"tf":1.0},"108":{"tf":1.0},"11":{"tf":1.4142135623730951},"114":{"tf":1.0},"133":{"tf":1.0},"154":{"tf":1.0},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.0},"258":{"tf":1.4142135623730951},"263":{"tf":1.0},"279":{"tf":1.0},"298":{"tf":1.0},"328":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.4142135623730951},"348":{"tf":1.0},"349":{"tf":1.7320508075688772},"350":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":2.0},"354":{"tf":2.23606797749979},"355":{"tf":1.0},"356":{"tf":2.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.4142135623730951},"362":{"tf":1.0},"363":{"tf":1.0},"379":{"tf":1.0},"387":{"tf":1.0},"393":{"tf":1.0},"4":{"tf":1.0},"413":{"tf":1.0},"445":{"tf":1.0},"487":{"tf":1.0},"49":{"tf":1.4142135623730951},"503":{"tf":1.0},"52":{"tf":1.0},"89":{"tf":1.0},"97":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":4,"docs":{"151":{"tf":1.0},"201":{"tf":1.4142135623730951},"27":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"m":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"39":{"tf":1.0}}}}}}}}},"df":2,"docs":{"143":{"tf":1.0},"371":{"tf":1.0}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"337":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"125":{"tf":1.4142135623730951}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":7,"docs":{"204":{"tf":1.0},"231":{"tf":1.0},"257":{"tf":1.0},"27":{"tf":1.7320508075688772},"36":{"tf":1.0},"467":{"tf":1.4142135623730951},"63":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"338":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":30,"docs":{"241":{"tf":1.0},"249":{"tf":1.0},"287":{"tf":1.0},"311":{"tf":1.0},"331":{"tf":1.7320508075688772},"332":{"tf":1.0},"333":{"tf":1.4142135623730951},"334":{"tf":1.0},"335":{"tf":1.0},"336":{"tf":1.0},"337":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.4142135623730951},"342":{"tf":1.0},"343":{"tf":1.0},"344":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.0},"347":{"tf":1.0},"348":{"tf":1.0},"353":{"tf":1.0},"361":{"tf":1.0},"363":{"tf":1.0},"39":{"tf":1.0},"63":{"tf":1.4142135623730951},"64":{"tf":1.4142135623730951},"65":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"500":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":6,"docs":{"101":{"tf":1.0},"321":{"tf":1.4142135623730951},"324":{"tf":1.0},"327":{"tf":1.0},"500":{"tf":1.0},"96":{"tf":1.0}}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"170":{"tf":1.0},"365":{"tf":1.4142135623730951},"68":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"156":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"238":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"2":{"tf":1.0},"369":{"tf":1.0},"38":{"tf":1.0},"389":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":1,"docs":{"333":{"tf":1.0}}}},"df":0,"docs":{},"e":{"\'":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}},"v":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"247":{"tf":1.0}}}},"b":{"df":4,"docs":{"107":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"k":{"df":8,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"231":{"tf":1.0},"238":{"tf":1.0},"346":{"tf":1.0},"463":{"tf":1.0},"465":{"tf":1.4142135623730951},"472":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{}}},"h":{"a":{"df":0,"docs":{},"t":{"\'":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"233":{"tf":1.0}}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":10,"docs":{"105":{"tf":1.0},"213":{"tf":1.0},"244":{"tf":1.0},"269":{"tf":1.0},"333":{"tf":1.0},"369":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"74":{"tf":1.0},"87":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":8,"docs":{"104":{"tf":1.0},"107":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.0},"243":{"tf":1.0},"48":{"tf":1.0},"67":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":6,"docs":{"136":{"tf":1.0},"151":{"tf":1.0},"202":{"tf":1.0},"217":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"467":{"tf":1.0}}}}}}}},"n":{"df":3,"docs":{"381":{"tf":1.0},"57":{"tf":1.0},"88":{"tf":1.0}}},"s":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"105":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"101":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"234":{"tf":1.0},"346":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":16,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"133":{"tf":1.4142135623730951},"138":{"tf":1.4142135623730951},"285":{"tf":1.0},"302":{"tf":1.0},"328":{"tf":1.0},"342":{"tf":1.0},"350":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0},"365":{"tf":1.0},"371":{"tf":1.0},"404":{"tf":1.0},"79":{"tf":1.0},"89":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":26,"docs":{"101":{"tf":1.0},"107":{"tf":1.0},"127":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"143":{"tf":1.0},"157":{"tf":1.0},"230":{"tf":1.0},"238":{"tf":2.0},"251":{"tf":1.0},"328":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"356":{"tf":1.0},"36":{"tf":1.0},"361":{"tf":1.0},"365":{"tf":1.0},"366":{"tf":1.0},"368":{"tf":1.0},"375":{"tf":1.0},"404":{"tf":1.0},"413":{"tf":1.0},"461":{"tf":1.4142135623730951},"75":{"tf":1.0},"90":{"tf":1.0},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"64":{"tf":1.0}}}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":18,"docs":{"133":{"tf":1.0},"143":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"220":{"tf":1.0},"227":{"tf":1.7320508075688772},"23":{"tf":1.0},"278":{"tf":1.0},"365":{"tf":1.0},"367":{"tf":1.0},"371":{"tf":1.4142135623730951},"383":{"tf":1.0},"443":{"tf":1.7320508075688772},"459":{"tf":1.4142135623730951},"480":{"tf":1.0},"484":{"tf":1.7320508075688772},"487":{"tf":1.0},"510":{"tf":1.0},"67":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":4,"docs":{"164":{"tf":1.0},"166":{"tf":1.0},"175":{"tf":1.4142135623730951},"189":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"\\"":{"]":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"352":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"112":{"tf":1.4142135623730951},"137":{"tf":1.0},"228":{"tf":1.0},"323":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"469":{"tf":1.0}}}},"s":{"df":1,"docs":{"141":{"tf":1.0}},"t":{"df":1,"docs":{"502":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":14,"docs":{"104":{"tf":1.0},"125":{"tf":1.4142135623730951},"241":{"tf":1.0},"267":{"tf":1.0},"280":{"tf":1.0},"317":{"tf":1.0},"324":{"tf":2.6457513110645907},"335":{"tf":1.0},"341":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.4142135623730951},"381":{"tf":1.0},"501":{"tf":1.0},"96":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"30":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"s":{":":{"/":{"/":{"df":0,"docs":{},"k":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"377":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"0":{"0":{"0":{"df":4,"docs":{"178":{"tf":1.0},"179":{"tf":1.0},"288":{"tf":1.0},"333":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":9,"docs":{"104":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"136":{"tf":1.7320508075688772},"143":{"tf":1.4142135623730951},"466":{"tf":1.7320508075688772},"477":{"tf":1.0},"480":{"tf":2.0},"520":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}},"y":{"df":0,"docs":{},"z":{"7":{"8":{"9":{")":{"\\\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"494":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":12,"docs":{"136":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"143":{"tf":1.0},"150":{"tf":1.0},"224":{"tf":1.0},"264":{"tf":1.4142135623730951},"269":{"tf":1.0},"324":{"tf":1.0},"342":{"tf":1.4142135623730951},"52":{"tf":1.0},"93":{"tf":1.0}}}}},"df":5,"docs":{"104":{"tf":1.0},"143":{"tf":1.0},"203":{"tf":1.0},"480":{"tf":1.4142135623730951},"520":{"tf":1.0}},"e":{"df":3,"docs":{"167":{"tf":1.0},"337":{"tf":1.0},"359":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"342":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"u":{"\'":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}},"v":{"df":1,"docs":{"226":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"df":2,"docs":{"143":{"tf":1.0},"480":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":4,"docs":{"153":{"tf":1.0},"238":{"tf":1.0},"298":{"tf":1.4142135623730951},"391":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"151":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}}}},"title":{"root":{"0":{"0":{"1":{"df":1,"docs":{"331":{"tf":1.0}}},"2":{"df":1,"docs":{"349":{"tf":1.0}}},"3":{"df":1,"docs":{"364":{"tf":1.0}}},"4":{"df":1,"docs":{"394":{"tf":1.0}}},"5":{"df":1,"docs":{"414":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"df":3,"docs":{"142":{"tf":1.0},"205":{"tf":1.0},"24":{"tf":1.0}}},"1":{"df":2,"docs":{"143":{"tf":1.0},"25":{"tf":1.0}}},"2":{"df":2,"docs":{"144":{"tf":1.0},"26":{"tf":1.0}}},"df":27,"docs":{"107":{"tf":1.0},"127":{"tf":1.0},"133":{"tf":1.0},"146":{"tf":1.0},"15":{"tf":1.0},"164":{"tf":1.0},"169":{"tf":1.0},"184":{"tf":1.0},"196":{"tf":1.0},"2":{"tf":1.0},"229":{"tf":1.0},"287":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"306":{"tf":1.0},"316":{"tf":1.0},"333":{"tf":1.0},"351":{"tf":1.0},"366":{"tf":1.0},"387":{"tf":1.0},"398":{"tf":1.0},"409":{"tf":1.0},"448":{"tf":1.0},"469":{"tf":1.0},"517":{"tf":1.0},"72":{"tf":1.0},"79":{"tf":1.0}}},"2":{"df":27,"docs":{"108":{"tf":1.0},"128":{"tf":1.0},"134":{"tf":1.0},"147":{"tf":1.0},"16":{"tf":1.0},"165":{"tf":1.0},"170":{"tf":1.0},"185":{"tf":1.0},"197":{"tf":1.0},"232":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"3":{"tf":1.0},"307":{"tf":1.0},"317":{"tf":1.0},"334":{"tf":1.0},"352":{"tf":1.0},"367":{"tf":1.0},"388":{"tf":1.0},"399":{"tf":1.0},"410":{"tf":1.0},"449":{"tf":1.0},"470":{"tf":1.0},"518":{"tf":1.0},"73":{"tf":1.0},"80":{"tf":1.0}}},"3":{"0":{"0":{"0":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":25,"docs":{"109":{"tf":1.0},"129":{"tf":1.0},"135":{"tf":1.0},"148":{"tf":1.0},"166":{"tf":1.0},"17":{"tf":1.0},"171":{"tf":1.0},"186":{"tf":1.0},"198":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.0},"300":{"tf":1.0},"308":{"tf":1.0},"318":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.0},"389":{"tf":1.0},"4":{"tf":1.0},"400":{"tf":1.0},"411":{"tf":1.0},"450":{"tf":1.0},"471":{"tf":1.0},"519":{"tf":1.0},"74":{"tf":1.0},"81":{"tf":1.0}}},"4":{"df":16,"docs":{"110":{"tf":1.0},"136":{"tf":1.0},"149":{"tf":1.0},"18":{"tf":1.0},"199":{"tf":1.0},"290":{"tf":1.0},"301":{"tf":1.0},"309":{"tf":1.0},"319":{"tf":1.0},"390":{"tf":1.0},"401":{"tf":1.0},"451":{"tf":1.0},"472":{"tf":1.0},"520":{"tf":1.0},"75":{"tf":1.0},"82":{"tf":1.0}}},"5":{"df":14,"docs":{"111":{"tf":1.0},"137":{"tf":1.0},"150":{"tf":1.0},"19":{"tf":1.0},"200":{"tf":1.0},"239":{"tf":1.0},"302":{"tf":1.0},"310":{"tf":1.0},"402":{"tf":1.0},"447":{"tf":1.0},"452":{"tf":1.0},"473":{"tf":1.0},"76":{"tf":1.0},"83":{"tf":1.0}}},"6":{"df":6,"docs":{"138":{"tf":1.0},"20":{"tf":1.0},"201":{"tf":1.0},"242":{"tf":1.0},"77":{"tf":1.0},"84":{"tf":1.0}}},"7":{"df":4,"docs":{"139":{"tf":1.0},"202":{"tf":1.0},"21":{"tf":1.0},"245":{"tf":1.0}}},"8":{"df":4,"docs":{"140":{"tf":1.0},"203":{"tf":1.0},"22":{"tf":1.0},"248":{"tf":1.0}}},"9":{"df":3,"docs":{"141":{"tf":1.0},"204":{"tf":1.0},"23":{"tf":1.0}}},"a":{"d":{"d":{"df":3,"docs":{"398":{"tf":1.0},"455":{"tf":1.0},"456":{"tf":1.0}}},"df":2,"docs":{"31":{"tf":1.0},"32":{"tf":1.0}},"r":{"df":8,"docs":{"232":{"tf":1.0},"331":{"tf":1.0},"349":{"tf":1.0},"364":{"tf":1.0},"394":{"tf":1.0},"414":{"tf":1.0},"520":{"tf":1.0},"73":{"tf":1.0}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"464":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"123":{"tf":1.0},"61":{"tf":1.0}}}}}},"i":{"df":11,"docs":{"108":{"tf":1.0},"123":{"tf":1.0},"137":{"tf":1.0},"143":{"tf":1.0},"21":{"tf":1.4142135623730951},"349":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"414":{"tf":1.0},"53":{"tf":1.0},"61":{"tf":1.0}}},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"43":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":6,"docs":{"340":{"tf":1.0},"382":{"tf":1.0},"408":{"tf":1.0},"409":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"145":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"i":{"df":6,"docs":{"182":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.4142135623730951},"325":{"tf":1.0},"486":{"tf":1.0},"523":{"tf":1.0}}},"p":{"df":1,"docs":{"24":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"o":{"a":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"322":{"tf":1.0},"323":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":14,"docs":{"100":{"tf":1.0},"17":{"tf":1.4142135623730951},"208":{"tf":1.0},"232":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.0},"268":{"tf":1.0},"284":{"tf":1.0},"297":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"57":{"tf":1.0},"66":{"tf":1.0},"85":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"389":{"tf":1.0}}}},"df":1,"docs":{"214":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"145":{"tf":1.0}}},"df":0,"docs":{}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"425":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"169":{"tf":1.0},"171":{"tf":1.0},"196":{"tf":1.0},"200":{"tf":1.0},"454":{"tf":1.0}}}}},"df":1,"docs":{"322":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.0},"519":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"146":{"tf":1.0},"89":{"tf":1.0}}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"119":{"tf":1.0},"297":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"253":{"tf":1.0},"305":{"tf":1.0},"516":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"400":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":12,"docs":{"313":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"321":{"tf":1.0},"394":{"tf":1.0},"398":{"tf":1.0},"409":{"tf":1.0},"499":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"44":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"245":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"d":{"df":8,"docs":{"143":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"184":{"tf":1.0},"209":{"tf":1.0},"3":{"tf":1.0},"448":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"127":{"tf":1.0},"207":{"tf":1.0},"460":{"tf":1.0}}}}}},"r":{"d":{"df":2,"docs":{"316":{"tf":1.0},"480":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"11":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":12,"docs":{"228":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"235":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"315":{"tf":1.0},"374":{"tf":1.0},"58":{"tf":1.0},"98":{"tf":1.0}}}}},"df":1,"docs":{"323":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"35":{"tf":1.0},"466":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"321":{"tf":1.0},"409":{"tf":1.0}}}},"u":{"d":{"df":10,"docs":{"182":{"tf":1.0},"183":{"tf":1.0},"185":{"tf":1.0},"205":{"tf":1.0},"352":{"tf":1.0},"434":{"tf":1.0},"449":{"tf":1.0},"451":{"tf":1.0},"481":{"tf":1.0},"490":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":4,"docs":{"173":{"tf":1.0},"23":{"tf":1.4142135623730951},"257":{"tf":1.0},"441":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"d":{"df":2,"docs":{"135":{"tf":1.0},"352":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":13,"docs":{"141":{"tf":1.0},"183":{"tf":1.0},"185":{"tf":1.0},"205":{"tf":1.0},"218":{"tf":1.0},"239":{"tf":1.0},"34":{"tf":1.0},"449":{"tf":1.0},"451":{"tf":1.0},"481":{"tf":1.0},"490":{"tf":1.0},"514":{"tf":1.0},"525":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"248":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"257":{"tf":1.0},"42":{"tf":1.0},"442":{"tf":1.0},"453":{"tf":1.0},"5":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"206":{"tf":1.0},"459":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"359":{"tf":1.0},"62":{"tf":1.0}}}}}}},"t":{"df":1,"docs":{"483":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"189":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"308":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"149":{"tf":1.0},"256":{"tf":1.0}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"138":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0}}}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"458":{"tf":1.0},"518":{"tf":1.0},"54":{"tf":1.0},"69":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"157":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"465":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":9,"docs":{"109":{"tf":1.0},"133":{"tf":1.0},"19":{"tf":1.0},"284":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"333":{"tf":1.0},"51":{"tf":1.0},"89":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":21,"docs":{"134":{"tf":1.0},"140":{"tf":1.0},"170":{"tf":1.0},"178":{"tf":1.0},"185":{"tf":1.0},"19":{"tf":1.0},"212":{"tf":1.0},"265":{"tf":1.0},"286":{"tf":1.0},"303":{"tf":1.0},"327":{"tf":1.0},"331":{"tf":1.0},"334":{"tf":1.0},"344":{"tf":1.0},"418":{"tf":1.0},"420":{"tf":1.0},"431":{"tf":1.0},"449":{"tf":1.0},"488":{"tf":1.0},"490":{"tf":1.0},"97":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"128":{"tf":1.0},"186":{"tf":1.0},"190":{"tf":1.0},"452":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":4,"docs":{"336":{"tf":1.0},"355":{"tf":1.0},"370":{"tf":1.0},"403":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"340":{"tf":1.0},"382":{"tf":1.0},"408":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"219":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"94":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":4,"docs":{"332":{"tf":1.0},"350":{"tf":1.0},"365":{"tf":1.0},"396":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"287":{"tf":1.0},"295":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"46":{"tf":1.0}}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"140":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":6,"docs":{"132":{"tf":1.0},"178":{"tf":1.0},"260":{"tf":1.4142135623730951},"353":{"tf":1.0},"50":{"tf":1.0},"69":{"tf":1.0}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"165":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"197":{"tf":1.0},"198":{"tf":1.0},"203":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"242":{"tf":1.0},"274":{"tf":1.0},"466":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"387":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"212":{"tf":1.0},"290":{"tf":1.0},"440":{"tf":1.0}}}}}}}},"d":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"203":{"tf":1.0},"210":{"tf":1.0},"227":{"tf":1.0}}}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"367":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"321":{"tf":1.0},"398":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":10,"docs":{"198":{"tf":1.0},"208":{"tf":1.0},"232":{"tf":1.0},"335":{"tf":1.0},"354":{"tf":1.0},"369":{"tf":1.0},"397":{"tf":1.0},"456":{"tf":1.0},"520":{"tf":1.0},"73":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"136":{"tf":1.0},"288":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"477":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"80":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"296":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":5,"docs":{"126":{"tf":1.0},"131":{"tf":1.0},"248":{"tf":1.0},"313":{"tf":1.0},"320":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"201":{"tf":1.0},"256":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":4,"docs":{"120":{"tf":1.0},"375":{"tf":1.0},"524":{"tf":1.0},"59":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"343":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"106":{"tf":1.0},"307":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"202":{"tf":1.0},"4":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"222":{"tf":1.0},"476":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"142":{"tf":1.0}},"i":{"df":2,"docs":{"303":{"tf":1.0},"517":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":18,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.0},"202":{"tf":1.0},"208":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"300":{"tf":1.0},"308":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0},"438":{"tf":1.0},"46":{"tf":1.0},"462":{"tf":1.0},"5":{"tf":1.0},"520":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"109":{"tf":1.0},"133":{"tf":1.0},"284":{"tf":1.0},"297":{"tf":1.0},"51":{"tf":1.0},"89":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"127":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"309":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"202":{"tf":1.0},"29":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":6,"docs":{"180":{"tf":1.0},"21":{"tf":1.0},"263":{"tf":1.0},"349":{"tf":1.0},"351":{"tf":1.0},"430":{"tf":1.0}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":1,"docs":{"144":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"478":{"tf":1.0}}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"271":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"203":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"168":{"tf":1.0},"299":{"tf":1.0},"307":{"tf":1.0},"418":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"148":{"tf":1.0},"189":{"tf":1.0},"277":{"tf":1.0},"513":{"tf":1.0},"514":{"tf":1.0},"515":{"tf":1.0}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"140":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"453":{"tf":1.0}}}}}}}},"t":{"c":{"df":1,"docs":{"352":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"156":{"tf":1.0},"301":{"tf":1.0}}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":1.0},"424":{"tf":1.0},"515":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"84":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"204":{"tf":1.0},"292":{"tf":1.0},"439":{"tf":1.0},"467":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"399":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":3,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"402":{"tf":1.0}}}}}}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"139":{"tf":1.4142135623730951},"190":{"tf":1.0},"224":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"139":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"b":{"df":5,"docs":{"181":{"tf":1.0},"349":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"432":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"166":{"tf":1.0},"167":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"308":{"tf":1.0},"411":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":4,"docs":{"270":{"tf":1.0},"30":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":7,"docs":{"366":{"tf":1.0},"368":{"tf":1.0},"379":{"tf":1.0},"380":{"tf":1.0},"384":{"tf":1.0},"387":{"tf":1.0},"426":{"tf":1.0}}}}}}}}}},"n":{"d":{"df":1,"docs":{"461":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"135":{"tf":1.0},"197":{"tf":1.0},"321":{"tf":1.0},"409":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"167":{"tf":1.0}}},"s":{"df":0,"docs":{},"h":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"275":{"tf":1.0},"286":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"150":{"tf":1.0},"30":{"tf":1.0},"333":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"188":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"42":{"tf":1.0},"476":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"136":{"tf":1.0},"52":{"tf":1.0},"93":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"224":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"334":{"tf":1.0}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"225":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"226":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"107":{"tf":1.0},"136":{"tf":1.0},"215":{"tf":1.0},"383":{"tf":1.0},"484":{"tf":1.0},"52":{"tf":1.0},"93":{"tf":1.0}}}},"o":{"df":1,"docs":{"471":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":11,"docs":{"105":{"tf":1.0},"110":{"tf":1.0},"144":{"tf":1.0},"274":{"tf":1.0},"283":{"tf":1.0},"422":{"tf":1.0},"57":{"tf":1.0},"70":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"16":{"tf":1.4142135623730951},"194":{"tf":1.0},"445":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"213":{"tf":1.0},"242":{"tf":1.0},"457":{"tf":1.0},"519":{"tf":1.0},"74":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"277":{"tf":1.0},"513":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"d":{"c":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"133":{"tf":1.0},"146":{"tf":1.0},"298":{"tf":1.0},"306":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"140":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"226":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"255":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"348":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"137":{"tf":1.0},"143":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":5,"docs":{"269":{"tf":1.0},"323":{"tf":1.0},"353":{"tf":1.0},"364":{"tf":1.0},"368":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"152":{"tf":1.0},"324":{"tf":1.0},"345":{"tf":1.0},"360":{"tf":1.0},"407":{"tf":1.0},"462":{"tf":1.0},"519":{"tf":1.0},"81":{"tf":1.0}}}}}}}}}},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":1,"docs":{"120":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"151":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"138":{"tf":1.0},"423":{"tf":1.0},"88":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":5,"docs":{"169":{"tf":1.0},"179":{"tf":1.0},"196":{"tf":1.0},"417":{"tf":1.0},"450":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":9,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"159":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"172":{"tf":1.0},"416":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":12,"docs":{"183":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"293":{"tf":1.0},"304":{"tf":1.0},"414":{"tf":1.0},"433":{"tf":1.0},"434":{"tf":1.0},"435":{"tf":1.0},"481":{"tf":1.0},"482":{"tf":1.0},"92":{"tf":1.0}}}},"r":{"df":0,"docs":{},"f":{"a":{"c":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"245":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"128":{"tf":1.0}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"203":{"tf":1.0},"76":{"tf":1.0}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"292":{"tf":1.0},"341":{"tf":1.0},"385":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.0}}}}}}}}},"k":{"b":{"/":{"a":{"d":{"d":{"_":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"494":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"493":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"498":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"500":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"502":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"512":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"501":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"496":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"495":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":1,"docs":{"497":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"492":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"511":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":15,"docs":{"103":{"tf":1.0},"106":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.0},"178":{"tf":1.0},"222":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"260":{"tf":1.0},"476":{"tf":1.0}}},"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"344":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":2,"docs":{"101":{"tf":1.0},"54":{"tf":1.0}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":14,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"196":{"tf":1.0},"200":{"tf":1.0},"383":{"tf":1.0},"454":{"tf":1.0},"461":{"tf":1.0},"463":{"tf":1.0},"70":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{":":{"/":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"/":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"505":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"506":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"504":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"507":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"508":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"509":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"0":{"tf":1.0},"15":{"tf":1.4142135623730951},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"450":{"tf":1.0},"47":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"344":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"334":{"tf":1.0},"344":{"tf":1.0},"469":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"377":{"tf":1.0}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"270":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"255":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"220":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"209":{"tf":1.0},"235":{"tf":1.0},"260":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"257":{"tf":1.0}}},"k":{"df":6,"docs":{"199":{"tf":1.0},"35":{"tf":1.0},"44":{"tf":1.0},"458":{"tf":1.0},"471":{"tf":1.0},"518":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"38":{"tf":1.0}}}}},"o":{"a":{"d":{"df":1,"docs":{"267":{"tf":1.0}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"135":{"tf":1.0},"181":{"tf":1.0},"2":{"tf":1.0},"351":{"tf":1.0},"432":{"tf":1.0},"86":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":6,"docs":{"204":{"tf":1.0},"313":{"tf":1.0},"394":{"tf":1.0},"482":{"tf":1.0},"63":{"tf":1.0},"94":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"106":{"tf":1.0}}}},"r":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"39":{"tf":1.0},"4":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"p":{"df":17,"docs":{"174":{"tf":1.0},"184":{"tf":1.0},"191":{"tf":1.0},"205":{"tf":1.0},"258":{"tf":1.4142135623730951},"275":{"tf":1.0},"326":{"tf":1.0},"414":{"tf":1.0},"445":{"tf":1.0},"446":{"tf":1.0},"448":{"tf":1.0},"475":{"tf":1.0},"485":{"tf":1.0},"486":{"tf":1.0},"489":{"tf":1.0},"92":{"tf":1.0},"99":{"tf":1.0}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"10":{"tf":1.0},"2":{"tf":1.0},"42":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"291":{"tf":1.0},"378":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"460":{"tf":1.0}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"229":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":1.0}}}}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"411":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":5,"docs":{"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"416":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"328":{"tf":1.0},"386":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"447":{"tf":1.0}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"289":{"tf":1.0},"307":{"tf":1.0}},"l":{"df":4,"docs":{"261":{"tf":1.0},"283":{"tf":1.0},"399":{"tf":1.0},"88":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"346":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"44":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"110":{"tf":1.0},"390":{"tf":1.0},"57":{"tf":1.0},"85":{"tf":1.0}}}}}}},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":4,"docs":{"107":{"tf":1.0},"108":{"tf":1.0},"137":{"tf":1.0},"53":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"469":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":4,"docs":{"338":{"tf":1.0},"357":{"tf":1.0},"372":{"tf":1.0},"405":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"339":{"tf":1.0},"358":{"tf":1.0},"373":{"tf":1.0},"406":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"306":{"tf":1.0}}}}},"w":{"df":3,"docs":{"229":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0}}},"x":{"df":0,"docs":{},"t":{"df":8,"docs":{"102":{"tf":1.0},"158":{"tf":1.0},"192":{"tf":1.0},"211":{"tf":1.0},"252":{"tf":1.0},"282":{"tf":1.0},"479":{"tf":1.0},"68":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":8,"docs":{"154":{"tf":1.0},"170":{"tf":1.0},"188":{"tf":1.0},"266":{"tf":1.0},"295":{"tf":1.0},"331":{"tf":1.0},"334":{"tf":1.0},"421":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":7,"docs":{"199":{"tf":1.0},"201":{"tf":1.0},"223":{"tf":1.0},"399":{"tf":1.0},"409":{"tf":1.0},"55":{"tf":1.0},"71":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":6,"docs":{"197":{"tf":1.0},"207":{"tf":1.0},"413":{"tf":1.0},"455":{"tf":1.0},"460":{"tf":1.0},"72":{"tf":1.0}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"65":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"155":{"tf":1.0},"214":{"tf":1.0},"259":{"tf":1.0},"444":{"tf":1.0}}}}}}}},"o":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"483":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"182":{"tf":1.0},"435":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"229":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":3,"docs":{"182":{"tf":1.0},"352":{"tf":1.0},"433":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"142":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{"df":24,"docs":{"12":{"tf":1.0},"135":{"tf":1.0},"162":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"176":{"tf":1.0},"180":{"tf":1.0},"2":{"tf":1.0},"204":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"351":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"366":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"388":{"tf":1.0},"4":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"122":{"tf":1.0},"377":{"tf":1.0},"87":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"138":{"tf":1.0},"140":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"420":{"tf":1.0},"430":{"tf":1.0},"441":{"tf":1.0},"487":{"tf":1.0},"66":{"tf":1.0}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"31":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"224":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"264":{"tf":1.0},"322":{"tf":1.0},"400":{"tf":1.0},"410":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"328":{"tf":1.0},"386":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"145":{"tf":1.0},"209":{"tf":1.0},"235":{"tf":1.0},"75":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"279":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"477":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"387":{"tf":1.0},"388":{"tf":1.0},"389":{"tf":1.0},"390":{"tf":1.0},"407":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":4,"docs":{"126":{"tf":1.0},"131":{"tf":1.0},"285":{"tf":1.0},"50":{"tf":1.0}}}}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"337":{"tf":1.0},"356":{"tf":1.0},"371":{"tf":1.0},"404":{"tf":1.0}}}},"t":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"385":{"tf":1.0}}}}}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":3,"docs":{"253":{"tf":1.0},"305":{"tf":1.0},"516":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"160":{"tf":1.0},"195":{"tf":1.0},"415":{"tf":1.0}}}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"101":{"tf":1.0},"152":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":9,"docs":{"104":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"236":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"314":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"267":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"210":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"242":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"417":{"tf":1.0},"463":{"tf":1.0},"86":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"510":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"150":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"275":{"tf":1.0},"414":{"tf":1.0},"485":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"180":{"tf":1.0},"182":{"tf":1.0},"263":{"tf":1.0},"349":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.0},"359":{"tf":1.0},"431":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"48":{"tf":1.0}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":7,"docs":{"271":{"tf":1.0},"274":{"tf":1.0},"325":{"tf":1.0},"402":{"tf":1.0},"465":{"tf":1.0},"519":{"tf":1.0},"99":{"tf":1.0}}},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"105":{"tf":1.0},"129":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"194":{"tf":1.0},"207":{"tf":1.0},"40":{"tf":1.0},"445":{"tf":1.0},"447":{"tf":1.0},"480":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"137":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"1":{"tf":1.0},"225":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"112":{"tf":1.0}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"164":{"tf":1.0},"2":{"tf":1.0},"323":{"tf":1.0},"324":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"d":{"df":2,"docs":{"198":{"tf":1.0},"232":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"218":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"318":{"tf":1.0},"347":{"tf":1.0},"362":{"tf":1.0},"392":{"tf":1.0},"40":{"tf":1.0},"412":{"tf":1.0},"442":{"tf":1.0},"466":{"tf":1.0},"480":{"tf":1.0},"486":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"472":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"461":{"tf":1.0},"518":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"79":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"111":{"tf":1.0},"56":{"tf":1.0},"78":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"45":{"tf":1.0},"503":{"tf":1.0},"522":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"191":{"tf":1.0},"475":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"515":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"478":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":3,"docs":{"239":{"tf":1.0},"463":{"tf":1.0},"472":{"tf":1.0}}}},"s":{"df":3,"docs":{"348":{"tf":1.0},"363":{"tf":1.0},"393":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"353":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"175":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"147":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"153":{"tf":1.0},"293":{"tf":1.0},"523":{"tf":1.0}}}}}},"s":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":2,"docs":{"134":{"tf":1.0},"301":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":7,"docs":{"147":{"tf":1.0},"170":{"tf":1.0},"179":{"tf":1.0},"266":{"tf":1.0},"287":{"tf":1.0},"341":{"tf":1.0},"421":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"214":{"tf":1.0},"259":{"tf":1.0},"444":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":10,"docs":{"200":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.0},"436":{"tf":1.0},"454":{"tf":1.0},"473":{"tf":1.0},"478":{"tf":1.0},"517":{"tf":1.0},"90":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"32":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"311":{"tf":1.0},"521":{"tf":1.0}}},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"300":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"273":{"tf":1.0},"436":{"tf":1.0},"473":{"tf":1.0},"517":{"tf":1.0},"90":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"d":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":2,"docs":{"2":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":10,"docs":{"174":{"tf":1.0},"177":{"tf":1.0},"184":{"tf":1.0},"191":{"tf":1.0},"205":{"tf":1.0},"258":{"tf":1.0},"448":{"tf":1.0},"475":{"tf":1.0},"488":{"tf":1.0},"489":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"171":{"tf":1.0},"213":{"tf":1.0},"422":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":6,"docs":{"168":{"tf":1.0},"176":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"447":{"tf":1.0},"524":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"171":{"tf":1.0},"213":{"tf":1.0},"383":{"tf":1.0},"467":{"tf":1.0},"87":{"tf":1.0}}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"375":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"375":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"df":9,"docs":{"105":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"49":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"164":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"165":{"tf":1.0},"470":{"tf":1.0},"86":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"36":{"tf":1.0},"525":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":6,"docs":{"130":{"tf":1.0},"177":{"tf":1.0},"194":{"tf":1.0},"205":{"tf":1.0},"451":{"tf":1.0},"489":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"314":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":1,"docs":{"395":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":23,"docs":{"102":{"tf":1.0},"158":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"211":{"tf":1.0},"252":{"tf":1.0},"282":{"tf":1.0},"448":{"tf":1.0},"449":{"tf":1.0},"450":{"tf":1.0},"451":{"tf":1.0},"452":{"tf":1.0},"479":{"tf":1.0},"68":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":12,"docs":{"20":{"tf":1.4142135623730951},"262":{"tf":1.0},"268":{"tf":1.0},"312":{"tf":1.0},"364":{"tf":1.0},"401":{"tf":1.0},"410":{"tf":1.0},"425":{"tf":1.0},"426":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"93":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":8,"docs":{"156":{"tf":1.0},"269":{"tf":1.0},"278":{"tf":1.0},"329":{"tf":1.0},"353":{"tf":1.0},"364":{"tf":1.0},"401":{"tf":1.0},"429":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"111":{"tf":1.0},"14":{"tf":1.0},"321":{"tf":1.0},"398":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"u":{"b":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"383":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"251":{"tf":1.0},"330":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"83":{"tf":1.0}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"313":{"tf":1.0},"394":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"d":{"b":{"df":10,"docs":{"176":{"tf":1.0},"177":{"tf":1.0},"190":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"379":{"tf":1.0},"380":{"tf":1.0},"388":{"tf":1.0},"390":{"tf":1.0},"427":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"y":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"378":{"tf":1.0},"384":{"tf":1.0},"389":{"tf":1.0},"429":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"384":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":4,"docs":{"254":{"tf":1.0},"265":{"tf":1.0},"276":{"tf":1.0},"437":{"tf":1.0}}}}}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"219":{"tf":1.0},"470":{"tf":1.0}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"317":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"121":{"tf":1.0},"229":{"tf":1.0},"376":{"tf":1.0},"60":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":7,"docs":{"22":{"tf":1.4142135623730951},"220":{"tf":1.0},"276":{"tf":1.0},"437":{"tf":1.0},"438":{"tf":1.0},"439":{"tf":1.0},"91":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"390":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{}},"df":10,"docs":{"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"186":{"tf":1.0},"278":{"tf":1.0},"329":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"452":{"tf":1.0},"526":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"345":{"tf":1.0},"360":{"tf":1.0}}}}}}},"p":{"df":3,"docs":{"216":{"tf":1.0},"37":{"tf":1.0},"468":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"o":{"/":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"317":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"199":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"331":{"tf":1.0},"333":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"df":7,"docs":{"12":{"tf":1.0},"326":{"tf":1.0},"486":{"tf":1.0},"491":{"tf":1.0},"499":{"tf":1.0},"62":{"tf":1.0},"99":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"210":{"tf":1.0},"317":{"tf":1.0}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"333":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"262":{"tf":1.0},"263":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"216":{"tf":1.0},"468":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":4,"docs":{"187":{"tf":1.0},"221":{"tf":1.0},"41":{"tf":1.0},"474":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":4,"docs":{"134":{"tf":1.0},"301":{"tf":1.0},"71":{"tf":1.0},"78":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"105":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"193":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"p":{"df":2,"docs":{"171":{"tf":1.0},"213":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"238":{"tf":1.0},"464":{"tf":1.0}}}},"df":20,"docs":{"124":{"tf":1.0},"217":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"235":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"307":{"tf":1.0},"315":{"tf":1.0},"374":{"tf":1.0},"43":{"tf":1.0},"469":{"tf":1.0},"473":{"tf":1.0},"517":{"tf":1.0},"58":{"tf":1.0},"67":{"tf":1.0},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"290":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":6,"docs":{"147":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"309":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"419":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.0},"172":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"310":{"tf":1.0}}}}}}}},"i":{"a":{"df":3,"docs":{"11":{"tf":1.0},"349":{"tf":1.0},"353":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"201":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"125":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":4,"docs":{"331":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"217":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"127":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":5,"docs":{"206":{"tf":1.0},"227":{"tf":1.0},"443":{"tf":1.0},"459":{"tf":1.0},"484":{"tf":1.0}}}}}}},"l":{"d":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"38":{"tf":1.0}}}}}}},"y":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"342":{"tf":1.0}}}}},"df":0,"docs":{}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"298":{"tf":1.0}}}}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"AND","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}'); \ No newline at end of file diff --git a/docs/book/setup/environment.html b/docs/book/setup/environment.html new file mode 100644 index 0000000..dc03a64 --- /dev/null +++ b/docs/book/setup/environment.html @@ -0,0 +1,227 @@ + + + + + + Environment Configuration - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Environment Configuration

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/setup/installation.html b/docs/book/setup/installation.html new file mode 100644 index 0000000..d430e1e --- /dev/null +++ b/docs/book/setup/installation.html @@ -0,0 +1,227 @@ + + + + + + Installation Methods - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Installation Methods

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/setup/prerequisites.html b/docs/book/setup/prerequisites.html new file mode 100644 index 0000000..6329308 --- /dev/null +++ b/docs/book/setup/prerequisites.html @@ -0,0 +1,227 @@ + + + + + + Prerequisites - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Prerequisites

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/setup/project-init.html b/docs/book/setup/project-init.html new file mode 100644 index 0000000..bc62516 --- /dev/null +++ b/docs/book/setup/project-init.html @@ -0,0 +1,227 @@ + + + + + + Project Initialization - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Project Initialization

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/setup/verification.html b/docs/book/setup/verification.html new file mode 100644 index 0000000..aa5e6b7 --- /dev/null +++ b/docs/book/setup/verification.html @@ -0,0 +1,227 @@ + + + + + + Verification - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Verification

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/storage/backends.html b/docs/book/storage/backends.html new file mode 100644 index 0000000..d3ed098 --- /dev/null +++ b/docs/book/storage/backends.html @@ -0,0 +1,227 @@ + + + + + + Storage Backends - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Storage Backends

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/storage/filesystem.html b/docs/book/storage/filesystem.html new file mode 100644 index 0000000..f2cf487 --- /dev/null +++ b/docs/book/storage/filesystem.html @@ -0,0 +1,227 @@ + + + + + + Filesystem Storage - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Filesystem Storage

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/storage/memory.html b/docs/book/storage/memory.html new file mode 100644 index 0000000..c4b4f09 --- /dev/null +++ b/docs/book/storage/memory.html @@ -0,0 +1,227 @@ + + + + + + In-Memory Storage - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

In-Memory Storage

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/storage/surrealdb.html b/docs/book/storage/surrealdb.html new file mode 100644 index 0000000..f0d4257 --- /dev/null +++ b/docs/book/storage/surrealdb.html @@ -0,0 +1,227 @@ + + + + + + SurrealDB Storage - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

SurrealDB Storage

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/storage/sync.html b/docs/book/storage/sync.html new file mode 100644 index 0000000..7b37fed --- /dev/null +++ b/docs/book/storage/sync.html @@ -0,0 +1,227 @@ + + + + + + Sync Strategies - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Sync Strategies

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/templates/customization.html b/docs/book/templates/customization.html new file mode 100644 index 0000000..8ef466e --- /dev/null +++ b/docs/book/templates/customization.html @@ -0,0 +1,227 @@ + + + + + + Customization - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Customization

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/templates/documents.html b/docs/book/templates/documents.html new file mode 100644 index 0000000..d19d8f7 --- /dev/null +++ b/docs/book/templates/documents.html @@ -0,0 +1,227 @@ + + + + + + Document Templates - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Document Templates

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/templates/export.html b/docs/book/templates/export.html new file mode 100644 index 0000000..95f1ce1 --- /dev/null +++ b/docs/book/templates/export.html @@ -0,0 +1,227 @@ + + + + + + Export Templates - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Export Templates

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/templates/overview.html b/docs/book/templates/overview.html new file mode 100644 index 0000000..d3ab64c --- /dev/null +++ b/docs/book/templates/overview.html @@ -0,0 +1,227 @@ + + + + + + Template System - KOGRAL Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Template System

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/book/toc.html b/docs/book/toc.html new file mode 100644 index 0000000..e33aada --- /dev/null +++ b/docs/book/toc.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + +
  1. Introduction
  2. Project Definition
  3. What is KOGRAL?
  4. Core Concepts
  5. Why KOGRAL?
  6. Design Philosophy
  7. Guides
  8. Installation
  9. Quick Start
  10. Daily Workflows
  11. Use Cases
  12. Best Practices
  13. Architecture
  14. System Overview
  15. Graph Model
  16. Config-Driven Design
  17. Storage Architecture
  18. Logseq Blocks Design
  19. ADR-001: Nickel vs TOML for Configuration
  20. ADR-002: FastEmbed via AI Providers
  21. ADR-003: Hybrid Storage Strategy
  22. ADR-004: Logseq Blocks Support
  23. ADR-005: MCP Protocol for AI Integration
  24. Setup
  25. Prerequisites
  26. Installation Methods
  27. Project Initialization
  28. Environment Configuration
  29. Verification
  30. Configuration
  31. Configuration Overview
  32. Nickel Schemas
  33. Graph Settings
  34. Inheritance
  35. Examples
  36. Storage
  37. Storage Backends
  38. Filesystem Storage
  39. SurrealDB Storage
  40. In-Memory Storage
  41. Sync Strategies
  42. AI & Embeddings
  43. Embeddings Overview
  44. Provider Configuration
  45. FastEmbed Local
  46. OpenAI Integration
  47. Claude Integration
  48. Ollama Integration
  49. Semantic Search
  50. Templates
  51. Template System
  52. Document Templates
  53. Export Templates
  54. Customization
  55. CLI
  56. CLI Overview
  57. Commands Reference
  58. Workflows
  59. NuShell Scripts
  60. Apps & Connections
  61. MCP Quick Guide
  62. Claude Code Integration
  63. Logseq Integration
  64. Obsidian Compatibility
  65. Git Workflows
  66. API Reference
  67. MCP Protocol
  68. Tools Reference
  69. Resources
  70. Rust API
  71. Contributing
  72. Development Setup
  73. Code Standards
  74. Testing
+ + diff --git a/docs/book/toc.js b/docs/book/toc.js new file mode 100644 index 0000000..f8c0219 --- /dev/null +++ b/docs/book/toc.js @@ -0,0 +1,70 @@ +// Populate the sidebar +// +// This is a script, and not included directly in the page, to control the total size of the book. +// The TOC contains an entry for each page, so if each page includes a copy of the TOC, +// the total size of the page becomes O(n**2). +class MDBookSidebarScrollbox extends HTMLElement { + constructor() { + super(); + } + connectedCallback() { + this.innerHTML = '
  1. Introduction
  2. Project Definition
  3. What is KOGRAL?
  4. Core Concepts
  5. Why KOGRAL?
  6. Design Philosophy
  7. Guides
  8. Installation
  9. Quick Start
  10. Daily Workflows
  11. Use Cases
  12. Best Practices
  13. Architecture
  14. System Overview
  15. Graph Model
  16. Config-Driven Design
  17. Storage Architecture
  18. Logseq Blocks Design
  19. ADR-001: Nickel vs TOML for Configuration
  20. ADR-002: FastEmbed via AI Providers
  21. ADR-003: Hybrid Storage Strategy
  22. ADR-004: Logseq Blocks Support
  23. ADR-005: MCP Protocol for AI Integration
  24. Setup
  25. Prerequisites
  26. Installation Methods
  27. Project Initialization
  28. Environment Configuration
  29. Verification
  30. Configuration
  31. Configuration Overview
  32. Nickel Schemas
  33. Graph Settings
  34. Inheritance
  35. Examples
  36. Storage
  37. Storage Backends
  38. Filesystem Storage
  39. SurrealDB Storage
  40. In-Memory Storage
  41. Sync Strategies
  42. AI & Embeddings
  43. Embeddings Overview
  44. Provider Configuration
  45. FastEmbed Local
  46. OpenAI Integration
  47. Claude Integration
  48. Ollama Integration
  49. Semantic Search
  50. Templates
  51. Template System
  52. Document Templates
  53. Export Templates
  54. Customization
  55. CLI
  56. CLI Overview
  57. Commands Reference
  58. Workflows
  59. NuShell Scripts
  60. Apps & Connections
  61. MCP Quick Guide
  62. Claude Code Integration
  63. Logseq Integration
  64. Obsidian Compatibility
  65. Git Workflows
  66. API Reference
  67. MCP Protocol
  68. Tools Reference
  69. Resources
  70. Rust API
  71. Contributing
  72. Development Setup
  73. Code Standards
  74. Testing
'; + // Set the current, active page, and reveal it if it's hidden + let current_page = document.location.href.toString().split("#")[0].split("?")[0]; + if (current_page.endsWith("/")) { + current_page += "index.html"; + } + var links = Array.prototype.slice.call(this.querySelectorAll("a")); + var l = links.length; + for (var i = 0; i < l; ++i) { + var link = links[i]; + var href = link.getAttribute("href"); + if (href && !href.startsWith("#") && !/^(?:[a-z+]+:)?\/\//.test(href)) { + link.href = path_to_root + href; + } + // The "index" page is supposed to alias the first chapter in the book. + if (link.href === current_page || (i === 0 && path_to_root === "" && current_page.endsWith("/index.html"))) { + link.classList.add("active"); + var parent = link.parentElement; + if (parent && parent.classList.contains("chapter-item")) { + parent.classList.add("expanded"); + } + while (parent) { + if (parent.tagName === "LI" && parent.previousElementSibling) { + if (parent.previousElementSibling.classList.contains("chapter-item")) { + parent.previousElementSibling.classList.add("expanded"); + } + } + parent = parent.parentElement; + } + } + } + // Track and set sidebar scroll position + this.addEventListener('click', function(e) { + if (e.target.tagName === 'A') { + sessionStorage.setItem('sidebar-scroll', this.scrollTop); + } + }, { passive: true }); + var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll'); + sessionStorage.removeItem('sidebar-scroll'); + if (sidebarScrollTop) { + // preserve sidebar scroll position when navigating via links within sidebar + this.scrollTop = sidebarScrollTop; + } else { + // scroll sidebar to current active section when navigating via "next/previous chapter" buttons + var activeSection = document.querySelector('#sidebar .active'); + if (activeSection) { + activeSection.scrollIntoView({ block: 'center' }); + } + } + // Toggle buttons + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + } +} +window.customElements.define("mdbook-sidebar-scrollbox", MDBookSidebarScrollbox); diff --git a/docs/book/tomorrow-night.css b/docs/book/tomorrow-night.css new file mode 100644 index 0000000..11752b8 --- /dev/null +++ b/docs/book/tomorrow-night.css @@ -0,0 +1,104 @@ +/* Tomorrow Night Theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-attr, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rule .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.hljs-name, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.hljs-title, +.hljs-section, +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +.hljs-addition { + color: #718c00; +} + +.hljs-deletion { + color: #c82829; +} diff --git a/docs/cli/README.md b/docs/cli/README.md new file mode 100644 index 0000000..230b208 --- /dev/null +++ b/docs/cli/README.md @@ -0,0 +1,25 @@ +# CLI Documentation + +Complete reference for KOGRAL command-line interfaces: + +- [Overview](overview.md) - Introduction to CLI and NuShell scripts, when to use each +- [Commands Reference](commands.md) - Detailed documentation for all 13 kogral-cli commands +- [Workflows](workflows.md) - Task-oriented guides for common operations +- [NuShell Scripts](nushell-scripts.md) - Advanced maintenance and automation scripts + +## Quick Links + +### For First-Time Users +1. Start with [Overview](overview.md) to understand both interfaces +2. Follow [Quick Start](overview.md#installation) to install CLI and scripts +3. Check [Workflows](workflows.md) for your specific use case + +### For Advanced Users +- [NuShell Scripts](nushell-scripts.md) - Batch operations, automation, CI/CD +- [Commands Reference](commands.md) - All CLI options and parameters + +### For Specific Tasks +- Creating notes: See [Workflows](workflows.md#creating-knowledge) +- Searching: See [Commands Reference](commands.md#search) +- Importing from Logseq: See [NuShell Scripts - kogral-import-logseq.nu](nushell-scripts.md#kogral-import-logseqnu) +- Syncing with SurrealDB: See [NuShell Scripts - kogral-sync.nu](nushell-scripts.md#kogral-syncnu) diff --git a/docs/cli/commands.md b/docs/cli/commands.md new file mode 100644 index 0000000..0dc205b --- /dev/null +++ b/docs/cli/commands.md @@ -0,0 +1 @@ +# Commands Reference diff --git a/docs/cli/overview.md b/docs/cli/overview.md new file mode 100644 index 0000000..019d14b --- /dev/null +++ b/docs/cli/overview.md @@ -0,0 +1,242 @@ +# CLI Overview + +KOGRAL provides two complementary command-line interfaces for knowledge base management: + +1. **kogral-cli** - The main binary with 13 commands for node operations, search, and config +2. **NuShell Scripts** - Maintenance and automation scripts for advanced operations + +## kogral-cli Binary + +The Rust CLI tool (`cargo install --path crates/kogral-cli`) provides primary operations: + +### Core Commands + +- `init` - Initialize `.kogral/` directory in project +- `add` - Create new nodes (note, decision, guideline, pattern, journal) +- `search` - Text and semantic search across knowledge base +- `link` - Create relationships between nodes +- `list` - List all nodes with filtering options +- `show` - Display node details with relationships +- `delete` - Remove nodes from knowledge base +- `graph` - Visualize knowledge graph structure +- `config` - Manage configuration settings +- `sync` - Sync filesystem ↔ SurrealDB (underlying operation) +- `import` - Import from Logseq format +- `export` - Export to Logseq/JSON/Markdown +- `serve` - Start MCP server for Claude Code integration + +### Quick Start + +```bash +# Initialize project +kogral init + +# Create a decision note +kogral add --type decision "API Authentication Strategy" + +# Search for related content +kogral search "authentication" --limit 10 + +# Create relationships +kogral link "api-auth" --relates-to "api-design" --depends-on "security-policy" + +# View the graph +kogral graph --output graph.svg +``` + +See [Commands Reference](commands.md) for complete command documentation and [Workflows](workflows.md) for task-oriented guides. + +## NuShell Scripts + +Production-ready scripts written in NuShell for maintenance and automation tasks: + +| Script | Purpose | +| -------- | --------- | +| **kogral-sync.nu** | Bidirectional sync (filesystem ↔ SurrealDB) | +| **kogral-reindex.nu** | Rebuild embeddings index (fastembed, OpenAI, Claude, Ollama) | +| **kogral-import-logseq.nu** | Import from Logseq graphs | +| **kogral-export-logseq.nu** | Export to Logseq format | +| **kogral-migrate.nu** | Schema migrations (version management) | + +### Quick Start + +```bash +# Reindex with local embeddings +nu scripts/kogral-reindex.nu + +# Import from Logseq +nu scripts/kogral-import-logseq.nu ~/Logseq/mydb + +# Export to Logseq +nu scripts/kogral-export-logseq.nu ~/logseq-export + +# Sync to SurrealDB +nu scripts/kogral-sync.nu --direction to-storage +``` + +See [NuShell Scripts](nushell-scripts.md) for detailed documentation on all scripts, options, and examples. + +## CLI vs Scripts: When to Use Each + +### Use kogral-cli for + +- **Daily operations** - Adding notes, creating relationships, searching +- **Interactive workflows** - Real-time graph operations +- **Quick queries** - Text/semantic search with immediate results +- **Configuration** - Viewing and updating settings +- **Single-file operations** - Creating, viewing, deleting nodes + +### Use NuShell Scripts for + +- **Batch operations** - Processing many files at once +- **Automation** - Scheduled tasks via cron/systemd +- **Storage sync** - Keeping filesystem and SurrealDB in sync +- **Format migration** - Importing/exporting entire graphs +- **Maintenance** - Reindexing, schema upgrades +- **CI/CD pipelines** - Automated knowledge base updates + +## Installation + +### kogral-cli + +```bash +cargo install --path crates/kogral-cli +``` + +### NuShell Scripts + +Scripts are in the repository at `scripts/`: + +```bash +# Direct execution +nu scripts/kogral-sync.nu --help + +# Via justfile +just scripts::sync +just scripts::reindex +just scripts::import +just scripts::export +``` + +## Configuration + +Both CLI and scripts respect the KOGRAL configuration system: + +- **Primary config**: `.kogral/config.toml` or via Nickel schemas +- **Storage backend**: Selected in config (filesystem, SurrealDB, or both) +- **Embedding provider**: Configured for reindexing operations +- **Environment variables**: Used for API credentials (OPENAI_API_KEY, ANTHROPIC_API_KEY) + +See [Configuration](../config/overview.md) for details. + +## Error Handling + +Both interfaces follow clean error patterns: + +**kogral-cli**: +- Clear error messages with context +- Exit codes: 0 (success), 1 (error) +- Help text via `--help` on any command + +**NuShell Scripts**: +- Production patterns without try-catch wrapping +- Exit codes: 0 (success), 1 (fatal error) +- Dry-run mode for all destructive operations +- Direct error propagation (errors are visible) + +## Performance Notes + +- **CLI operations**: Sub-second for single nodes, scales linearly +- **Scripts**: Optimize for batch processing with configurable parameters +- **Search**: Text search is instant; semantic search depends on provider +- **Reindexing**: Scales with node count and API latency (use batches to control) + +## Integration + +### With justfile + +Most operations can be run via justfile recipes: + +```bash +just dev::init # Initialize project +just dev::add-note # Create a note +just dev::search # Search knowledge base +just scripts::sync # Run sync script +just scripts::reindex # Run reindex script +``` + +### With Git workflows + +Knowledge base is git-friendly: + +```bash +# Commit changes +git add .kogral/ +git commit -m "Update architecture decisions" + +# Sync to SurrealDB +nu scripts/kogral-sync.nu --direction to-storage + +# Export for sharing +nu scripts/kogral-export-logseq.nu ./share/ +``` + +### With CI/CD + +Scripts are designed for automation: + +```yaml +# GitHub Actions example +- name: Reindex embeddings + run: nu scripts/kogral-reindex.nu --provider fastembed + +- name: Export knowledge base + run: nu scripts/kogral-export-logseq.nu ./artifacts/ + +- name: Sync to storage + run: nu scripts/kogral-sync.nu +``` + +## Troubleshooting + +### "kogral: command not found" + +Install the CLI: + +```bash +cargo install --path crates/kogral-cli +``` + +### "nu: command not found" + +Install NuShell: + +```bash +# macOS +brew install nushell + +# Linux +cargo install nu + +# Or see https://www.nushell.sh/book/installation.html +``` + +### Scripts not executable + +Make scripts executable: + +```bash +chmod +x scripts/*.nu +``` + +Or run directly with `nu`: + +```bash +nu scripts/kogral-sync.nu +``` + +## Next Steps + +- [Commands Reference](commands.md) - Detailed CLI command documentation +- [Workflows](workflows.md) - Task-oriented guides for common operations +- [NuShell Scripts](nushell-scripts.md) - Advanced maintenance and automation diff --git a/docs/cli/workflows.md b/docs/cli/workflows.md new file mode 100644 index 0000000..307ef40 --- /dev/null +++ b/docs/cli/workflows.md @@ -0,0 +1 @@ +# Workflows diff --git a/docs/config/examples.md b/docs/config/examples.md new file mode 100644 index 0000000..df635b4 --- /dev/null +++ b/docs/config/examples.md @@ -0,0 +1 @@ +# Examples diff --git a/docs/config/graph-settings.md b/docs/config/graph-settings.md new file mode 100644 index 0000000..14f6ba8 --- /dev/null +++ b/docs/config/graph-settings.md @@ -0,0 +1 @@ +# Graph Settings diff --git a/docs/config/inheritance.md b/docs/config/inheritance.md new file mode 100644 index 0000000..1384947 --- /dev/null +++ b/docs/config/inheritance.md @@ -0,0 +1 @@ +# Inheritance diff --git a/docs/config/nickel-schemas.md b/docs/config/nickel-schemas.md new file mode 100644 index 0000000..70c1b14 --- /dev/null +++ b/docs/config/nickel-schemas.md @@ -0,0 +1 @@ +# Nickel Schemas diff --git a/docs/config/overview.md b/docs/config/overview.md new file mode 100644 index 0000000..0e40fae --- /dev/null +++ b/docs/config/overview.md @@ -0,0 +1 @@ +# Configuration Overview diff --git a/docs/contributing/development.md b/docs/contributing/development.md new file mode 100644 index 0000000..4698bc8 --- /dev/null +++ b/docs/contributing/development.md @@ -0,0 +1 @@ +# Development Setup diff --git a/docs/contributing/standards.md b/docs/contributing/standards.md new file mode 100644 index 0000000..57ef393 --- /dev/null +++ b/docs/contributing/standards.md @@ -0,0 +1 @@ +# Code Standards diff --git a/docs/contributing/testing.md b/docs/contributing/testing.md new file mode 100644 index 0000000..f00b526 --- /dev/null +++ b/docs/contributing/testing.md @@ -0,0 +1 @@ +# Testing diff --git a/docs/diagrams/architecture-overview.svg b/docs/diagrams/architecture-overview.svg new file mode 100644 index 0000000..1a7efb6 --- /dev/null +++ b/docs/diagrams/architecture-overview.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + Knowledge Base Architecture + + + + kogral-core (Rust Library) + + + + Config Layer + Nickel → JSON → KbConfig + + + + Storage Layer (Hybrid) + + FileSystem + + SurrealDB + + In-Memory + + + + Graph Engine + Nodes: Note, Decision, Guideline, Pattern, Journal, Execution + Edges: relates_to, depends_on, implements, extends, supersedes, explains + Multi-graph: local (project) + shared (central) + + + + Parser + Markdown + Frontmatter + + + Embeddings + rig-core + fastembed + + + Query + Text+Vector + Cross-graph + + + + kogral-mcp (MCP Server) + + Tools: + kogral/search, kogral/add_note, kogral/add_decision + kogral/link, kogral/get_guidelines, kogral/export + + Resources: + kogral://project/notes, kogral://project/decisions + kogral://shared/guidelines, kogral://shared/patterns + + Prompts: + kogral/summarize_project, kogral/find_related + + + + kogral-cli (Command Line) + + Commands: + init, add, search, link, sync + serve, graph, import, export + get-guidelines, list, show, stats + + Features: + Interactive prompts + Template-based document creation + Graph visualization + + + + NuShell Scripts & Plugins + + Scripts: + kogral-sync.nu, kogral-backup.nu, kogral-reindex.nu + + Plugins: + kogral-import-logseq.nu, kogral-stats.nu + + + + + + + + + + + JSON-RPC + Direct API + CLI invocation + + diff --git a/docs/diagrams/config-composition.svg b/docs/diagrams/config-composition.svg new file mode 100644 index 0000000..d665e80 --- /dev/null +++ b/docs/diagrams/config-composition.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + Configuration Composition Flow + Nickel Schema → Validated Config → Rust Struct + + + + Layer 1: Schema Contracts (Type Definitions) + + + schemas/contracts.ncl + KbConfig = { + graph | GraphConfig, + storage | StorageConfig, + + + Defines types: + StorageType = [| 'filesystem, + 'memory, 'surrealdb |] + + + + validates + + + + Layer 2: Default Values + + + schemas/defaults.ncl + base = { + storage = { primary = 'filesystem, secondary = { enabled = false } }, + embeddings = { provider = 'fastembed, model = "BAAI/bge-small-en-v1.5" }, + + + + base for + + + + Layer 3: Mode Overlay (Environment-Specific) + + + + modes/dev.ncl + storage = { + primary = 'filesystem, + secondary.enabled + = false + } + + + + modes/prod.ncl + storage = { + primary = 'filesystem, + secondary.enabled + = true + } + + + + modes/test.ncl + storage = { + primary = 'memory, + secondary.enabled + = false + } + + + + select one + + + + Layer 4: User Customization (Project-Specific) + + + .kogral-config/core/kogral.ncl + { graph = { name = "my-project" }, embeddings = { model = "custom-model" } } + + + + Composition (helpers.ncl) + merge_with_override(defaults, + mode_overlay, user_custom) + + + + + + + nickel export + + + + Exported JSON (.kogral-config/targets/kogral-core.json) + + + {"graph":{"name":"my-project"},"storage":{"primary":"filesystem"},...} + + + + serde deserialize + + + + Rust: KbConfig Struct + let config = KbConfig::from_file(".kogral-config/targets/kogral-core.json")?; + + diff --git a/docs/diagrams/core-concepts.svg b/docs/diagrams/core-concepts.svg new file mode 100644 index 0000000..4fb8d34 --- /dev/null +++ b/docs/diagrams/core-concepts.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + Knowledge Base: Node Types & Relationships + + + + Node Types + + + + Note + General knowledge, observations + Fields: title, content, tags + + + + Decision (ADR) + Architectural decisions + Fields: context, decision, consequences, status + + + + Guideline + Code standards, practices + Fields: language, category, rules, examples + + + + Pattern + Reusable solutions + Fields: problem, solution, context, forces + + + + Journal + Daily notes (auto-dated) + Fields: date, content, highlights + + + + Execution + Agent task records (from Vapora KG) + Fields: task_type, agent, outcome, duration + + + + Relationship Types (Edges) + + + + Error Handling + (Note) + + + Logging Best + Practices (Note) + + + Rust Error + Guidelines (Guideline) + + + + relates_to + + + + Result Pattern + (Pattern) + + + Error Handling + Rules (Guideline) + + + + depends_on + + + + Task: Fix Bug + (Execution) + + + Debugging + Pattern (Pattern) + + + + implements + + + + Project Rules + (Guideline) + + + Base Rust + Guidelines (Guideline) + + + + extends + + + + ADR-002 + (Decision) + + + ADR-001 + (Decision) + + + + supersedes + + + + Edge Types + • relates_to - Conceptual link + • depends_on - Required prerequisite + • implements - Concrete realization + • extends - Inherits + overrides + • supersedes - Replaces older version + + diff --git a/docs/diagrams/storage-architecture.svg b/docs/diagrams/storage-architecture.svg new file mode 100644 index 0000000..77c9952 --- /dev/null +++ b/docs/diagrams/storage-architecture.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + Hybrid Storage Architecture + Filesystem (git-friendly) + SurrealDB (scalable) + In-Memory (cache) + + + + Graph Engine (kogral-core) + Unified API: add_node, get_node, query + HashMap<String, Node> for O(1) access + Multi-graph: local (project) + shared (central) + + + + Storage Trait + trait Storage: save(), load(), delete(), list(), search() + Abstraction for all backends + + + + + + + + + Filesystem Storage + + Purpose: + • Git-friendly + • Human-readable + • Logseq compatible + + Format: + .kogral/notes/2026-01-17-topic.md + --- + id: note-123 + type: note + tags: [rust, architecture] + --- + # Title + Content with [[wikilinks]] + + Watch: + notify crate (file system events) + + + + SurrealDB Storage + + Purpose: + • Scalable queries + • Advanced graph operations + • Shared organizational knowledge + + Schema: + DEFINE TABLE node SCHEMAFULL; + DEFINE FIELD id ON node TYPE string; + DEFINE FIELD type ON node TYPE string; + DEFINE FIELD embedding ON node + TYPE array<number>; + + Features: + • Graph queries (RELATE) + • Vector search (embeddings) + • Full-text search + • Multi-tenancy (namespace/db) + + + + In-Memory Storage + + Purpose: + • Fast development + • Testing (ephemeral) + • Cache layer + + Implementation: + DashMap<String, Node> + Concurrent HashMap + + Features: + • O(1) access + • No persistence + • Thread-safe + • No setup required + + Use Cases: + • cargo test (test mode) + • Session cache + + + + + + + + + Sync Mechanism + Bidirectional sync + • File change → SurrealDB + • SurrealDB update → File + + + + sync + + + + 💡 Configured via .kogral-config/core/kogral.ncl: primary storage + optional secondary (SurrealDB) + sync settings + + diff --git a/docs/guides/best-practices.md b/docs/guides/best-practices.md new file mode 100644 index 0000000..874ca7f --- /dev/null +++ b/docs/guides/best-practices.md @@ -0,0 +1 @@ +# Best Practices diff --git a/docs/guides/daily-workflows.md b/docs/guides/daily-workflows.md new file mode 100644 index 0000000..72931f1 --- /dev/null +++ b/docs/guides/daily-workflows.md @@ -0,0 +1 @@ +# Daily Workflows diff --git a/docs/guides/installation.md b/docs/guides/installation.md new file mode 100644 index 0000000..84d3928 --- /dev/null +++ b/docs/guides/installation.md @@ -0,0 +1,380 @@ +# Installation + +This guide covers installing and setting up the KOGRAL. + +## Prerequisites + +### Required + +- **Rust** 1.70 or later + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + +- **Nickel** CLI for configuration management + + ```bash + cargo install nickel-lang-cli + ``` + +### Optional + +- **NuShell** for maintenance scripts + + ```bash + cargo install nu + ``` + +- **SurrealDB** for scalable storage backend + + ```bash + # macOS + brew install surrealdb/tap/surreal + + # Linux/Windows + curl -sSf https://install.surrealdb.com | sh + ``` + +## Installation Methods + +### Method 1: Install from Source (Recommended) + +```bash +# Clone the repository +git clone knowledge-base +cd knowledge-base + +# Build the workspace +cargo build --release + +# Install CLI tool +cargo install --path crates/kogral-cli + +# Verify installation +kogral --version +``` + +### Method 2: Build Specific Crates + +```bash +# Build only kogral-core library +cargo build --package kogral-core --release + +# Build only kogral-cli +cargo build --package kogral-cli --release + +# Build only kogral-mcp server +cargo build --package kogral-mcp --release +``` + +### Method 3: Build with Features + +```bash +# Build with all features (filesystem + SurrealDB + fastembed) +cargo build --workspace --all-features --release + +# Build with specific features +cargo build --package kogral-core --features "surrealdb,fastembed" --release +``` + +## Feature Flags + +kogral-core supports optional features: + +| Feature | Description | Default | +| --------- | ------------- | --------- | +| `filesystem` | Filesystem storage backend | ✅ Yes | +| `surrealdb` | SurrealDB storage backend | ❌ No | +| `fastembed` | Local embedding generation | ❌ No | +| `full` | All features enabled | ❌ No | + +Example usage: + +```bash +# Enable SurrealDB backend +cargo build --features surrealdb + +# Enable all features +cargo build --features full +``` + +## Environment Setup + +### 1. Initialize a Knowledge Base + +```bash +# Navigate to your project +cd /path/to/your/project + +# Initialize .kogral directory +kogral init + +# Or initialize with custom name +kogral init --name "My Project" --description "Project knowledge base" +``` + +This creates: + +```text +your-project/ +└── .kogral/ + ├── config.toml + ├── notes/ + ├── decisions/ + ├── guidelines/ + ├── patterns/ + └── journal/ +``` + +### 2. Configure Nickel Schemas (Optional) + +If you want advanced configuration: + +```bash +# Copy default config +cp /path/to/knowledge-base/config/defaults.ncl .kogral/config.ncl + +# Edit configuration +$EDITOR .kogral/config.ncl + +# Export to TOML (for kogral-cli compatibility) +nickel export --format json .kogral/config.ncl | kogral config import +``` + +### 3. Set Up Shared Knowledge Base (Optional) + +For shared guidelines and patterns across projects: + +```bash +# Create shared KOGRAL location +mkdir -p ~/Tools/.kogral-shared +cd ~/Tools/.kogral-shared + +# Initialize shared KOGRAL +kogral init --name "Shared Knowledge" --description "Cross-project guidelines" + +# Configure inheritance in project +kogral config set inheritance.base ~/Tools/.kogral-shared +``` + +## Verify Installation + +### Test CLI + +```bash +# Check version +kogral --version + +# Show help +kogral --help + +# Test initialization (dry-run) +kogral init --dry-run +``` + +### Test MCP Server + +```bash +# Start MCP server in test mode +kogral serve --transport stdio + +# In another terminal, test with echo +echo '{"jsonrpc":"2.0","id":1,"method":"kogral/search","params":{"query":"test"}}' | kogral serve +``` + +### Run Tests + +```bash +# Run all tests +cargo test --workspace + +# Run integration tests +cargo test --package kogral-core --test '*' + +# Run with all features +cargo test --workspace --all-features +``` + +## SurrealDB Setup (Optional) + +If using SurrealDB backend: + +### Start SurrealDB Server + +```bash +# Start server +surreal start --log trace --user root --pass root file://data.db + +# Or use memory backend for testing +surreal start --log trace --user root --pass root memory +``` + +### Configure kogral-core + +Edit `.kogral/config.ncl`: + +```nickel +{ + storage = { + primary = 'filesystem, + secondary = { + enabled = true, + type = 'surrealdb, + url = "ws://localhost:8000", + namespace = "kogral", + database = "default", + username = "root", + password = "root", + }, + }, +} +``` + +### Initialize Schema + +```bash +# Run migration script +nu scripts/kogral-migrate.nu --target latest + +# Or manually import schema +surreal import --conn ws://localhost:8000 --user root --pass root --ns kogral --db default schema.surql +``` + +## Embedding Provider Setup (Optional) + +### Local fastembed + +```bash +# Build with fastembed feature +cargo build --package kogral-core --features fastembed + +# Models will be downloaded on first use +``` + +### API Providers (OpenAI, Claude, Ollama) + +Set environment variables: + +```bash +# OpenAI +export OPENAI_API_KEY="sk-..." + +# Claude (Anthropic) +export ANTHROPIC_API_KEY="sk-ant-..." + +# Ollama (local) +export OLLAMA_API_BASE="http://localhost:11434" +``` + +Configure provider in `.kogral/config.ncl`: + +```nickel +{ + embeddings = { + enabled = true, + provider = 'openai, # or 'claude, 'ollama, 'fastembed + model = "text-embedding-3-small", + api_key_env = "OPENAI_API_KEY", + }, +} +``` + +## Claude Code Integration + +To use kogral-mcp with Claude Code: + +### 1. Build MCP Server + +```bash +cargo build --package kogral-mcp --release +``` + +### 2. Configure Claude Code + +Add to `~/.config/claude/config.json`: + +```json +{ + "mcpServers": { + "kogral-mcp": { + "command": "/path/to/knowledge-base/target/release/kogral-mcp", + "args": ["serve"], + "env": {} + } + } +} +``` + +### 3. Test Connection + +Start Claude Code and verify: + +```text +> kogral/search "test" +``` + +## Troubleshooting + +### Nickel Not Found + +```bash +# Verify nickel is installed +nickel --version + +# If not, install +cargo install nickel-lang-cli + +# Add cargo bin to PATH +export PATH="$HOME/.cargo/bin:$PATH" +``` + +### Compilation Errors + +```bash +# Update Rust +rustup update stable + +# Clean and rebuild +cargo clean +cargo build --workspace +``` + +### SurrealDB Connection Failed + +```bash +# Check SurrealDB is running +curl http://localhost:8000/health + +# Start SurrealDB with correct settings +surreal start --bind 0.0.0.0:8000 --user root --pass root memory +``` + +### MCP Server Not Responding + +```bash +# Test stdio communication +echo '{"jsonrpc":"2.0","id":1,"method":"ping"}' | kogral serve + +# Check logs +kogral serve --log-level debug +``` + +## Next Steps + +- [Quick Start Guide](user-guide/quickstart.md) - Create your first knowledge base +- [Configuration Reference](user-guide/configuration.md) - Customize behavior +- [MCP Tools](api/mcp-tools.md) - Integrate with Claude Code + +## Uninstallation + +```bash +# Remove installed binary +cargo uninstall kogral-cli + +# Remove project knowledge base +rm -rf /path/to/project/.kogral + +# Remove shared knowledge base +rm -rf ~/Tools/.kogral-shared +``` diff --git a/docs/guides/quickstart.md b/docs/guides/quickstart.md new file mode 100644 index 0000000..2717825 --- /dev/null +++ b/docs/guides/quickstart.md @@ -0,0 +1,383 @@ +# Quick Start Guide + +Get up and running with the KOGRAL in 5 minutes. + +## Prerequisites + +- Rust 1.70+ installed +- Nickel CLI installed (`cargo install nickel-lang-cli`) +- kogral-cli installed (see [Installation](../installation.md)) + +## Step 1: Initialize Your Knowledge Base + +Navigate to your project directory and initialize: + +```bash +cd /path/to/your/project +kogral init +``` + +This creates a `.kogral/` directory with the following structure: + +```text +.kogral/ +├── config.toml # Configuration +├── notes/ # General notes +├── decisions/ # Architectural decisions +├── guidelines/ # Project guidelines +├── patterns/ # Reusable patterns +└── journal/ # Daily journal entries +``` + +## Step 2: Create Your First Note + +Add a note to your knowledge base: + +```bash +kogral add note "Getting Started with Rust" \ + --tags rust,programming,learning \ + --content "Key concepts for learning Rust effectively." +``` + +Or create interactively: + +```bash +kogral add note +# Follow the prompts to enter title, tags, and content +``` + +## Step 3: Create a Decision Record + +Document an architectural decision: + +```bash +kogral add decision "Use SurrealDB for Storage" \ + --context "Need scalable storage for knowledge graph" \ + --decision "Adopt SurrealDB for its graph capabilities" \ + --consequence "Better query performance" \ + --consequence "Additional infrastructure dependency" +``` + +## Step 4: Link Nodes Together + +Create relationships between nodes: + +```bash +# Find node IDs +kogral list + +# Create a relationship +kogral link relates_to +``` + +Available relationship types: +- `relates_to` - General conceptual link +- `depends_on` - Dependency relationship +- `implements` - Implementation of a concept +- `extends` - Inheritance/extension +- `supersedes` - Replaces older version +- `explains` - Documentation/clarification + +## Step 5: Search Your Knowledge Base + +Search by text: + +```bash +# Simple search +kogral search "rust" + +# Filter by type +kogral search "architecture" --type decision + +# Limit results +kogral search "error handling" --limit 5 +``` + +Search semantically (requires embeddings): + +```bash +# Semantic search finds conceptually related content +kogral search "memory safety" --semantic --threshold 0.7 +``` + +## Step 6: View Node Details + +```bash +# Show node by ID +kogral show + +# Show node with relationships +kogral show --with-relationships +``` + +## Step 7: Edit Documents Directly + +All knowledge base documents are markdown files you can edit: + +```bash +# Open in your editor +$EDITOR .kogral/notes/getting-started-with-rust.md + +# Or use your favorite markdown editor +code .kogral/notes/ +``` + +Document format: + +```markdown +--- +id: unique-id +type: note +title: Getting Started with Rust +created: 2026-01-17T10:30:00Z +modified: 2026-01-17T10:30:00Z +tags: [rust, programming, learning] +status: active +--- + +# Getting Started with Rust + +Content goes here with [[wikilinks]] to other nodes. + +## Key Concepts + +- Ownership +- Borrowing +- Lifetimes +``` + +## Step 8: Create a Daily Journal Entry + +Start journaling your development progress: + +```bash +kogral add journal "Today's Progress" \ + --content "Learned about trait objects and dynamic dispatch in Rust." +``` + +Or open today's journal directly: + +```bash +$EDITOR .kogral/journal/$(date +%Y-%m-%d).md +``` + +## Step 9: Export to Logseq (Optional) + +If you use Logseq, export your knowledge base: + +```bash +nu scripts/kogral-export-logseq.nu /path/to/logseq-graph +``` + +This creates a Logseq-compatible graph you can open in Logseq for visual editing. + +## Step 10: Start MCP Server for Claude Code + +Integrate with Claude Code for AI-assisted knowledge management: + +```bash +# Start MCP server +kogral serve + +# Configure in ~/.config/claude/config.json +# Then use in Claude Code: +# > kogral/search "rust ownership" +``` + +## Common Workflows + +### Capture Quick Notes + +```bash +# Quick note +kogral add note "Remember to check error handling in parser module" --tags todo,parser +``` + +### Document Architectural Decisions + +```bash +# Create ADR +kogral add decision "Adopt Async Rust for I/O Operations" \ + --status accepted \ + --tags architecture,async +``` + +### Build a Pattern Library + +```bash +# Add a pattern +kogral add pattern "Error Handling with thiserror" \ + --tags rust,error-handling \ + --content "Standard pattern for error types in this project." +``` + +### Track Daily Progress + +```bash +# Add journal entry +kogral add journal --content "Implemented search functionality. Need to add semantic search next." +``` + +## Next Steps + +### Customize Configuration + +Edit `.kogral/config.ncl` for advanced configuration: + +```nickel +{ + graph = { + name = "My Project", + version = "1.0.0", + }, + + embeddings = { + enabled = true, + provider = 'fastembed, + }, + + templates = { + templates_dir = "templates", + }, +} +``` + +See [Configuration Reference](configuration.md) for all options. + +### Set Up Shared Guidelines + +Create a shared knowledge base for organization-wide standards: + +```bash +# Create shared KOGRAL +mkdir -p ~/Tools/.kogral-shared +cd ~/Tools/.kogral-shared +kogral init --name "Shared Guidelines" + +# Add guidelines +kogral add guideline "Rust Error Handling" \ + --language rust \ + --category error-handling + +# Configure inheritance in projects +kogral config set inheritance.base ~/Tools/.kogral-shared +``` + +### Automate with NuShell Scripts + +```bash +# Backup regularly +nu scripts/kogral-backup.nu --compress + +# Sync with SurrealDB +nu scripts/kogral-sync.nu --direction bidirectional + +# Generate statistics +nu scripts/kogral-stats.nu --show-tags +``` + +### Integrate with Git + +```bash +# Add to version control +git add .kogral/ +git commit -m "docs: Add knowledge base" + +# Add to .gitignore (optional: exclude certain types) +echo ".kogral/journal/" >> .gitignore +``` + +## Tips and Tricks + +### Use Wikilinks + +Link to other nodes naturally in markdown: + +```markdown +See [[getting-started-with-rust]] for basics. +Related decision: [[use-surrealdb-for-storage]]. +``` + +### Reference Code + +Link to specific code locations: + +```markdown +Error handling implementation: @src/parser.rs:42 +``` + +### Tag Consistently + +Use consistent tagging for better searchability: + +```bash +# Good tagging +--tags rust,error-handling,pattern + +# Avoid +--tags Rust,ErrorHandling,patterns +``` + +### Leverage Templates + +Customize templates for your workflow: + +```bash +# Copy template +cp templates/note.md.tera templates/meeting-notes.md.tera + +# Edit for meeting notes format +$EDITOR templates/meeting-notes.md.tera +``` + +## Troubleshooting + +### "KB directory not found" + +```bash +# Make sure you initialized +kogral init + +# Or specify KB directory +kogral --kogral-dir /path/to/.kb search "query" +``` + +### "Node not found" + +```bash +# List all nodes to find ID +kogral list + +# Search for node +kogral search "partial title" +``` + +### "Failed to parse frontmatter" + +Check your markdown file has valid YAML frontmatter: + +```yaml +--- +id: my-note +type: note +title: My Note +--- +``` + +## Further Reading + +- [Configuration Reference](configuration.md) - Full configuration options +- [CLI Commands](cli-commands.md) - All available commands +- [Document Format](document-format.md) - Markdown and frontmatter details +- [MCP Tools](../api/mcp-tools.md) - Claude Code integration + +## Getting Help + +- Check `kogral --help` for command usage +- Read inline help: `kogral add --help` +- Report issues on GitHub +- Join community discussions + +--- + +**Congratulations!** You've created your first knowledge base. Start capturing knowledge and building connections. diff --git a/docs/guides/use-cases.md b/docs/guides/use-cases.md new file mode 100644 index 0000000..d7018ea --- /dev/null +++ b/docs/guides/use-cases.md @@ -0,0 +1,578 @@ +# Use Cases + +Real-world scenarios showing how KOGRAL solves common development challenges. + +## Use Case 1: Onboarding New Team Members + +### Problem + +New developer joins the team. Needs to understand: +- Why we chose SurrealDB over PostgreSQL +- How error handling works in this project +- What coding patterns we follow +- Recent architectural decisions + +### Solution with KOGRAL + +**Team lead**: + +```bash +# Export project knowledge to Logseq for visual exploration +kogral export logseq ~/onboarding-docs +``` + +**New developer** (with Claude Code): + +```text +Summarize our architectural decisions from the last 6 months +``` + +**Claude** (via MCP): + +```text +Found 8 decisions: + +1. **Use SurrealDB for Storage** (accepted, 3 months ago) + - Context: Need graph database for knowledge relationships + - Consequences: Better queries, additional infrastructure + +2. **Adopt Rust for Core Logic** (accepted, 5 months ago) + - Context: Type safety and performance critical + - Consequences: Steeper learning curve, excellent reliability + +... [6 more decisions] +``` + +**New developer**: + +```text +What are our error handling guidelines? +``` + +**Claude** (via `kogral/get_guidelines`): + +```text +## Rust Error Handling Guidelines + +### Project Guidelines (priority: 150) +- Use thiserror for custom error types +- Never unwrap() in production +- Propagate with ? operator + +### Shared Guidelines (priority: 50) +- Always use Result for fallible operations +- Add context with .context() + +[Links to full guideline documents] +``` + +**Result**: New developer productive in days, not weeks. + +--- + +## Use Case 2: Architectural Decision Records (ADR) + +### Problem + +Team discussing whether to add Redis caching. Multiple opinions, need to document the decision for future reference. + +### Solution with KOGRAL + +**During meeting**: + +```text +Document decision: Add Redis caching for API responses + +Context: +- Current database queries average 200ms +- 80% of queries are repeated within 5 minutes +- Need sub-50ms response times for user experience + +Decision: +- Add Redis with 5-minute TTL for GET endpoints +- Cache invalidation on POST/PUT/DELETE + +Consequences: +- ✅ Expected 80% reduction in database load +- ✅ Sub-50ms response times achieved +- ❌ Additional infrastructure (Redis server) +- ❌ Cache consistency challenges +- ❌ Debugging complexity increases + +Status: proposed (pending infrastructure setup) +``` + +**Claude** (creates ADR): + +```text +Created: decision-add-redis-caching +Type: decision +Status: proposed + +Added relationships: + - Relates to: note-performance-requirements + - Depends on: decision-use-docker-compose (infrastructure) + +Decision documented and linked to related knowledge. +``` + +**Two months later**, someone asks "Why Redis?": + +```text +kogral show decision-add-redis-caching +``` + +Full context available instantly. + +--- + +## Use Case 3: Pattern Library + +### Problem + +Team solves the same problems repeatedly: +- How to structure error types +- Database connection patterns +- Testing strategies + +Each developer rediscovers solutions. + +### Solution with KOGRAL + +**First time** solving error handling: + +```bash +kogral add pattern "Error Handling with thiserror" \ + --tags rust,error-handling,pattern \ + --content "$(cat docs/error-pattern.md)" +``` + +**Next time** someone needs error handling: + +```text +I'm implementing a new module with errors. What's our standard pattern? +``` + +**Claude** (via `kogral/search`): + +```text +Found pattern: Error Handling with thiserror + +## Pattern: Error Handling with thiserror + +### Problem +Need structured, type-safe error handling with good error messages. + +### Solution +```rust + +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum ModuleError { + #[error("Database connection failed: {0}")] + Database(#[from] sqlx::Error), + + #[error("Validation failed: {0}")] + Validation(String), +} + +```text + +### Usage +```rust + +fn do_work() -> Result<(), ModuleError> { + let conn = connect_db()?; // Auto-converts via #[from] + validate_input()?; + Ok(()) +} + +```text + +[Full pattern with examples] + +Would you like me to create a new error module following this pattern? +``` + +**Result**: Consistent error handling across codebase, zero time wasted rediscovering patterns. + +--- + +## Use Case 4: Daily Development Journal + +### Problem + +Developer wants to track: +- What they worked on each day +- Blockers encountered +- Solutions discovered +- Ideas for future work + +### Solution with KOGRAL + +**End of each day**: + +```bash +kogral add journal "2026-01-17" --content " +## Progress +- Implemented user authentication +- Fixed race condition in cache layer +- Started work on API rate limiting + +## Blockers +- SurrealDB migration tool not working with nested objects +- Need to discuss API versioning strategy with team + +## Learnings +- tokio::select! is perfect for timeout patterns +- serde_json::Value useful for dynamic JSON handling + +## Tomorrow +- Finish rate limiting implementation +- Review PR #234 +- Team meeting: discuss API versioning +" +``` + +**With Claude Code** (even easier): + +```text +End of day journal: + +Implemented authentication, fixed cache race condition, started rate limiting. +Blocked on SurrealDB migrations and need API versioning discussion. +Learned about tokio::select! for timeouts. +Tomorrow: finish rate limiting, review PR #234, versioning meeting. +``` + +**Claude** (creates journal entry): + +```text +Created journal entry: 2026-01-17 + +Tags auto-detected: authentication, cache, rate-limiting, surrealdb + +Linked to: + - pattern-timeout-handling (implements) + - decision-use-surrealdb (relates_to) + +Journal entry saved. +``` + +**Two weeks later** (forgot how you solved that race condition): + +```text +How did I fix the cache race condition? +``` + +**Claude** (semantic search): + +```text +From your journal entry on 2026-01-17: + +"Fixed race condition in cache layer by using DashMap instead of +RwLock. DashMap provides lock-free concurrent access." + +[Link to full journal entry] +``` + +**Result**: Development history preserved, solutions easy to recall. + +--- + +## Use Case 5: Code Review Preparation + +### Problem + +Preparing for code review. Need to: +- Document why certain decisions were made +- Link implementation to requirements +- Explain trade-offs to reviewers + +### Solution with KOGRAL + +**Before creating PR**: + +```text +I just implemented the caching layer. +Add a note documenting the implementation and link it to our caching decision. +``` + +**Claude** (via `kogral/add_note` + `kogral/link`): + +```text +Created note: note-caching-layer-implementation + +Content: +# Caching Layer Implementation + +## Approach +- Redis with 5-minute TTL +- Cache-aside pattern +- Invalidation on mutations + +## Trade-offs +- Chose simplicity over advanced features (no LRU eviction) +- 5-minute TTL balances freshness vs cache hit rate +- Cache-aside pattern chosen over write-through (simpler) + +## Testing +- Unit tests for cache logic +- Integration tests with real Redis +- Load test: 1000 req/s sustained + +Links: + - Implements: decision-add-redis-caching + - Follows: pattern-cache-aside + - Tests: guideline-integration-testing + +Note added and linked to decision-add-redis-caching. +``` + +**In PR description**: + +```markdown +## Implementation + +Implements caching layer per decision-add-redis-caching. + +See note-caching-layer-implementation for detailed rationale. + +## Trade-offs + +[Copy from note] +``` + +**Reviewers**: + +```text +kogral show decision-add-redis-caching +kogral show note-caching-layer-implementation +``` + +Full context available, review focuses on code quality not "why this approach?" + +--- + +## Use Case 6: Cross-Project Guidelines + +### Problem + +Organization has 10 projects. Each should follow: +- Same Rust error handling patterns +- Same security guidelines +- Same testing standards + +Currently: duplicated wikis, inconsistent practices. + +### Solution with KOGRAL + +**Setup shared KOGRAL**: + +```bash +# Create organization-wide shared KOGRAL +mkdir -p ~/org/.kogral-shared +cd ~/org/.kogral-shared +kogral init --name "Organization Guidelines" + +# Add shared guidelines +kogral add guideline "Rust Error Handling" \ + --language rust \ + --category error-handling \ + --content "$(cat org-rust-errors.md)" + +kogral add guideline "Security Best Practices" \ + --category security \ + --content "$(cat org-security.md)" +``` + +**In each project**: + +```nickel +# project/.kogral/config.ncl +{ + inheritance = { + base = "~/org/.kogral-shared", + priority = 100, # Project overrides shared + }, +} +``` + +**Developer in Project A**: + +```text +What are our error handling guidelines? +``` + +**Claude** (via `kogral/get_guidelines` with inheritance): + +```text +## Rust Error Handling Guidelines + +### Shared Guidelines (priority: 50) +From ~/org/.kogral-shared: +- Use thiserror for custom errors +- Never unwrap() in production +- Always propagate with ? + +### Project Guidelines (priority: 100) +From project .kogral/: +- Additionally: log all errors with tracing +- Use anyhow for application-level errors + +[Combined effective guidelines] +``` + +**Result**: +- Consistent practices across organization +- Projects can specialize where needed +- Single source of truth for shared knowledge + +--- + +## Use Case 7: Bug Investigation + +### Problem + +Bug in production. Developer needs to: +- Understand relevant decisions +- Find related code patterns +- Check if similar issues were solved before + +### Solution with KOGRAL + +**Developer**: + +```text +We have a race condition in the cache layer. +What past decisions or patterns might be relevant? +``` + +**Claude** (semantic search): + +```text +Found 4 relevant items: + +1. **Decision: Use DashMap for Concurrent Access** (accepted, 1 month ago) + "Chose DashMap over RwLock to avoid race conditions in cache" + +2. **Pattern: Safe Concurrent Cache Access** + "Always use lock-free data structures for high-contention caches" + +3. **Note: Cache Race Condition Fix** (from 2026-01-17 journal) + "Fixed race in cache by switching to DashMap" + +4. **Guideline: Concurrency Safety** + "Use atomic operations and lock-free structures where possible" + +It looks like we've seen this before! Check the journal entry from 2026-01-17. +``` + +**Developer reads journal**: + +```bash +kogral show journal-2026-01-17 +``` + +**Finds**: +- Exact same issue +- Solution: switch to DashMap +- Code example included +- Performance benchmarks + +**Applies fix** in 10 minutes instead of 2 hours of debugging. + +--- + +## Use Case 8: API Design Collaboration + +### Problem + +Team discussing new API design. Multiple approaches: +- REST vs GraphQL +- Versioning strategy +- Authentication method + +Need to capture discussion and decision. + +### Solution with KOGRAL + +**During design meeting** (using Claude Code): + +```text +We're designing the new API. Let me capture this discussion: + +Approaches discussed: +1. REST with versioned endpoints (/v1/, /v2/) +2. GraphQL with schema versioning +3. gRPC for internal services + +Team consensus: +- REST for public API (easier for partners) +- GraphQL for internal admin tools (flexibility) +- gRPC for service-to-service (performance) + +Create a decision record for each, linking them together. +``` + +**Claude** (creates 3 linked ADRs): + +```text +Created 3 decisions: + +1. decision-rest-public-api + Status: accepted + Context: Public API needs broad compatibility + Decision: REST with /v1/, /v2/ versioning + +2. decision-graphql-admin + Status: accepted + Context: Admin tools need flexible queries + Decision: GraphQL with schema evolution + +3. decision-grpc-internal + Status: accepted + Context: Service-to-service needs performance + Decision: gRPC with protobuf + +Linked: + decision-rest-public-api --[relates_to]--> decision-graphql-admin + decision-rest-public-api --[relates_to]--> decision-grpc-internal + decision-graphql-admin --[relates_to]--> decision-grpc-internal + +All decisions documented and interconnected. +``` + +**Two months later**, someone asks "Why REST not GraphQL for public API?": + +```bash +kogral show decision-rest-public-api +``` + +Full context preserved, including relationship to GraphQL decision. + +--- + +## Summary + +Knowledge Base excels at: + +✅ **Onboarding**: Historical context instantly available +✅ **Decision Making**: ADRs preserve rationale +✅ **Pattern Reuse**: Solutions documented once, used forever +✅ **Daily Tracking**: Development journal with semantic search +✅ **Code Review**: Implementation rationale linked to decisions +✅ **Cross-Project**: Shared guidelines with project overrides +✅ **Bug Investigation**: Past solutions easily discovered +✅ **Collaboration**: Discussions captured and interconnected + +**Common Theme**: Knowledge captured during work, queryable when needed, connected to related concepts. + +--- + +## Next Steps + +- **Start simple**: [Quick Start Guide](quickstart.md) +- **Integrate AI**: [MCP Quick Guide](../apps/mcp-quickguide.md) +- **Advanced features**: [Configuration Reference](../config/overview.md) diff --git a/docs/kogral/core-concepts.md b/docs/kogral/core-concepts.md new file mode 100644 index 0000000..8ff40c2 --- /dev/null +++ b/docs/kogral/core-concepts.md @@ -0,0 +1,622 @@ +# Core Concepts + +Understanding the fundamental concepts behind KOGRAL. + +## The Knowledge Graph + +At its core, KOGRAL is a **directed graph** where: +- **Nodes** = pieces of knowledge (notes, decisions, guidelines, patterns) +- **Edges** = typed relationships between concepts + +![Node Types and Relationships](../diagrams/core-concepts.svg) + +This graph structure enables: +- **Discovery**: Find related concepts through traversal +- **Context**: Understand how ideas connect +- **Evolution**: Track how knowledge changes over time + +## Node Types + +### 1. Note + +**Purpose**: Capture general observations, learnings, and discoveries. + +**When to use**: +- Documenting a concept you learned +- Recording implementation details +- Capturing meeting notes +- Quick knowledge capture + +**Example**: + +```yaml +--- +type: note +title: Async Trait Patterns in Rust +tags: [rust, async, patterns] +--- + +# Async Trait Patterns in Rust + +Using async traits with the async-trait crate... +``` + +### 2. Decision (ADR) + +**Purpose**: Record architectural decisions with full context. + +**When to use**: +- Choosing between alternatives (REST vs GraphQL) +- Major technical decisions (database selection) +- Trade-off analysis +- Explaining "why" for future reference + +**Structure**: +- **Context**: Background and problem +- **Decision**: What was chosen +- **Consequences**: Positive and negative outcomes +- **Alternatives**: What was considered but rejected + +**Example**: + +```yaml +--- +type: decision +title: Use SurrealDB for Storage +status: accepted +--- + +## Context +Need a graph database that supports our relationship model... + +## Decision +Adopt SurrealDB as the primary storage backend. + +## Consequences ++ Better graph query performance ++ Native relationship support +- Additional infrastructure dependency +- Team learning curve +``` + +### 3. Guideline + +**Purpose**: Define coding standards, best practices, and conventions. + +**When to use**: +- Code style rules +- Architecture patterns to follow +- Security requirements +- Testing standards + +**Can be**: +- **Shared**: Organization-wide (in shared KOGRAL) +- **Project-specific**: Overrides shared guidelines + +**Example**: + +```yaml +--- +type: guideline +language: rust +category: error-handling +--- + +# Rust Error Handling Guidelines + +1. Use `thiserror` for custom error types +2. Never use `unwrap()` in production code +3. Always propagate errors with `?` +``` + +### 4. Pattern + +**Purpose**: Document reusable solutions to common problems. + +**When to use**: +- Recurring implementation patterns +- Tested solutions +- Best practice implementations +- Code templates + +**Structure**: +- **Problem**: What challenge does this solve? +- **Solution**: The pattern/approach +- **Context**: When to use/not use +- **Example**: Working code + +**Example**: + +```yaml +--- +type: pattern +title: Repository Pattern for Database Access +tags: [architecture, database, pattern] +--- + +## Problem +Need consistent database access across modules. + +## Solution +Repository pattern with trait abstraction... + +## Example +\`\`\`rust +trait UserRepository { + async fn find_by_id(&self, id: Uuid) -> Result; +} +\`\`\` +``` + +### 5. Journal + +**Purpose**: Daily development log for tracking progress and reflections. + +**When to use**: +- End of day summaries +- Daily standup notes +- Progress tracking +- Blocker documentation + +**Auto-linked**: KOGRAL can auto-link journal entries to mentioned concepts. + +**Example**: + +```yaml +--- +type: journal +date: 2026-01-17 +--- + +## Progress +- Implemented authentication module +- Fixed cache race condition + +## Blockers +- Need API versioning discussion + +## Learnings +- tokio::select! perfect for timeouts +``` + +### 6. Execution + +**Purpose**: Record AI agent execution results (from Vapora integration). + +**When to use**: +- Agent task completion +- Execution metrics +- Agent decision history +- Audit trail + +**Example**: + +```yaml +--- +type: execution +task_type: code_generation +agent: rust-expert +outcome: success +duration: 45s +--- + +Generated authentication module following project guidelines. +``` + +## Relationship Types + +### 1. `relates_to` + +**Meaning**: General conceptual relationship. + +**Use**: Connect related ideas without specific dependency. + +**Example**: + +```text +[Note: Async Patterns] --relates_to--> [Note: Tokio Runtime] +``` + +### 2. `depends_on` + +**Meaning**: Prerequisite relationship. Source requires target to exist/be understood first. + +**Use**: Learning paths, implementation order. + +**Example**: + +```text +[Pattern: Advanced Error Handling] --depends_on--> [Guideline: Basic Errors] +``` + +### 3. `implements` + +**Meaning**: Concrete implementation of an abstract concept. + +**Use**: Connect code to patterns/guidelines. + +**Example**: + +```text +[Note: Auth Module Implementation] --implements--> [Pattern: Repository Pattern] +``` + +### 4. `extends` + +**Meaning**: Inheritance/extension relationship. + +**Use**: Guideline overrides, pattern variations. + +**Example**: + +```text +[Guideline: Project Error Handling] --extends--> [Guideline: Shared Error Handling] +``` + +### 5. `supersedes` + +**Meaning**: Replacement relationship. Source replaces target. + +**Use**: Track evolution of decisions/patterns. + +**Example**: + +```text +[Decision: Use GraphQL v2] --supersedes--> [Decision: Use REST] +``` + +### 6. `explains` + +**Meaning**: Documentation/clarification relationship. + +**Use**: Connect notes to implementations, executions to rationale. + +**Example**: + +```text +[Note: Why We Chose Rust] --explains--> [Decision: Adopt Rust] +``` + +## Multi-Graph Architecture + +KOGRAL supports **multiple knowledge graphs**: + +### Local Graph (Project-Specific) + +**Location**: `.kogral/` in project directory + +**Purpose**: Project-specific knowledge +- Project decisions +- Implementation notes +- Local patterns +- Daily journals + +**Storage**: Filesystem (git-tracked) + +**Scope**: Single project + +### Shared Graph (Organization-Wide) + +**Location**: Configurable (e.g., `~/org/.kogral-shared`) + +**Purpose**: Shared organizational knowledge +- Coding guidelines +- Standard patterns +- Architecture principles +- Security policies + +**Storage**: SurrealDB (centralized) or filesystem (synced) + +**Scope**: All projects + +### Inheritance Model + +```text +Shared Guidelines (priority: 50) + ↓ [inherited by] +Project Guidelines (priority: 100) + ↓ [effective] +Combined Guidelines (higher priority wins) +``` + +**Example**: + +Shared guideline: "Use Result\ for errors" +Project override: "Use Result\ + log all errors with tracing" +Effective: Both rules apply, project adds requirement + +## Config-Driven Behavior + +**Everything is configurable** via Nickel schemas: + +```nickel +{ + graph = { name = "my-project" }, # Graph metadata + storage = { primary = 'filesystem }, # Where to store + embeddings = { provider = 'fastembed }, # AI provider + templates = { /* ... */ }, # Document templates + query = { similarity_threshold = 0.6 }, # Search behavior +} +``` + +**No hardcoding**: Change behavior without code changes. + +## Semantic Search + +Beyond keyword matching, KOGRAL uses **embeddings** to find concepts: + +**Keyword search**: "Find 'error handling'" +- Matches exact phrase "error handling" + +**Semantic search**: "How to handle failures gracefully?" +- Finds: error handling, exception patterns, Result types, panic recovery +- Understands: "failures" = errors, "gracefully" = best practices + +**How it works**: +1. Text → Embedding (384 or 1536 dimensional vector) +2. Similarity search (cosine distance) +3. Return nodes above threshold (e.g., 0.6) + +**Providers**: +- **fastembed**: Local, free, offline (384d) +- **OpenAI**: Cloud, best quality (1536d) +- **Claude**: Cloud, excellent (1024d) +- **Ollama**: Self-hosted (768d) + +## Templates + +**Tera templates** generate consistent documents: + +```jinja2 +--- +id: {{ id }} +type: {{ type }} +title: {{ title }} +tags: [{% for tag in tags %}"{{ tag }}"{% endfor %}] +--- + +# {{ title }} + +{{ content }} +``` + +**Customizable**: Override templates per project. + +**Export formats**: Logseq, JSON, Markdown. + +## MCP Integration + +**Model Context Protocol** connects KOGRAL to Claude Code: + +```text +Claude Code + ↓ [JSON-RPC 2.0] +kogral-mcp Server + ↓ [Rust API] +kogral-core Library + ↓ [Storage] +Knowledge Graph +``` + +**Tools**: `kogral/search`, `kogral/add_note`, `kogral/get_guidelines`, etc. + +**Resources**: `kogral://project/notes`, `kogral://shared/guidelines` + +**Prompts**: `kogral/summarize_project`, `kogral/find_related` + +## Git-Friendly Storage + +**Markdown + YAML frontmatter** = git-tracked knowledge: + +```markdown +--- +id: note-123 +type: note +title: My Note +--- + +# Content here +``` + +**Benefits**: +- ✅ Diffs in PRs (reviewable changes) +- ✅ Branches (experiment with knowledge) +- ✅ Merges (combine knowledge from feature branches) +- ✅ History (track evolution over time) +- ✅ Blame (who added this knowledge?) + +## Logseq Content Blocks + +KOGRAL provides full support for **Logseq-style outliner blocks** with rich metadata and structure. + +### What are Blocks + +Blocks are the fundamental unit of content in Logseq's outliner format: +- Each bullet point is a block +- Blocks can have children (nested blocks) +- Blocks support tasks, tags, and custom properties +- Blocks can reference other blocks or pages + +### Block Features + +**Task Status**: + +```markdown +- TODO Implement authentication #high-priority +- DOING Write tests +- DONE Deploy to staging +- LATER Consider GraphQL API +- NOW Fix critical bug +- WAITING Code review from @alice +- CANCELLED Old approach +``` + +**Inline Tags**: + +```markdown +- Learning Rust ownership #rust #learning #card + - Prevents data races at compile time + - Borrowing rules enforce safety +``` + +**Custom Properties**: + +```markdown +- Research paper summary + priority:: high + reviewed:: 2026-01-17 + source:: https://example.com/paper.pdf + - Key findings... +``` + +**Block and Page References**: + +```markdown +- Meeting notes from [[2026-01-17]] + - Discussed architecture ((block-ref-123)) + - Action items: [[Project Roadmap]] +``` + +**Hierarchical Structure**: + +```markdown +- Parent block #top-level + - Child block 1 + - Nested child + - Child block 2 +``` + +### Configuration + +Blocks support is opt-in via configuration: + +```nickel +{ + blocks = { + enabled = true, # Enable blocks parsing + parse_on_import = true, # Auto-parse from Logseq imports + serialize_on_export = true, # Serialize to outliner format + enable_mcp_tools = true, # Enable block-related MCP tools + }, +} +``` + +### Use Cases + +**1. Task Management**: + +```markdown +- TODO Weekly sprint planning #meeting + - DONE Review last sprint + - DOING Plan current sprint + - TODO Assign tasks +``` + +**2. Flashcards (Spaced Repetition)**: + +```markdown +- What is Rust's ownership model? #card #rust + - Ownership prevents data races at compile time + - Each value has a single owner + - When owner goes out of scope, value is dropped +``` + +**3. Knowledge Capture with Metadata**: + +```markdown +- Tokio async runtime patterns #rust #async + category:: architecture + difficulty:: intermediate + - Use tokio::select! for concurrent operations + - spawn_blocking() for CPU-intensive work +``` + +**4. Linked Notes**: + +```markdown +- Discussed [[ADR-001]] in architecture meeting + - Decided on SurrealDB + - See ((meeting-notes-block-id)) for details +``` + +### Block Queries (MCP Tools) + +Query blocks across your knowledge base: + +**Find blocks by tag**: + +```json +{ + "tool": "kogral/find_blocks", + "arguments": { "tag": "card" } +} +``` + +**Find all TODOs**: + +```json +{ + "tool": "kogral/find_todos", + "arguments": { "limit": 20 } +} +``` + +**Find flashcards**: + +```json +{ + "tool": "kogral/find_cards", + "arguments": { "limit": 10 } +} +``` + +**Find blocks by property**: + +```json +{ + "tool": "kogral/find_blocks", + "arguments": { + "property_key": "priority", + "property_value": "high" + } +} +``` + +### Architecture + +**Hybrid Model**: +- Content stored as markdown string (source of truth) +- Blocks lazily parsed on first access +- Cached block structure for fast queries +- Bidirectional: markdown ↔ blocks + +**BlockParser**: +- Parse outliner markdown → Block structures +- Serialize Block structures → outliner markdown +- Preserve all metadata (tags, status, properties, references) +- Round-trip fidelity for Logseq compatibility + +**Storage**: +- Filesystem: markdown with blocks inline +- SurrealDB: dedicated `block` table with indexes +- Indexes: tags, status, parent_id, full-text search + +**See Also**: +- [ADR-004: Logseq Blocks Support](../architecture/adrs/004-logseq-blocks-support.md) +- [Logseq Blocks Design](../architecture/logseq-blocks-design.md) +- [MCP Block Tools](../api/mcp-tools.md#block-tools) + +## Key Principles + +1. **Capture During Work**: Don't wait, document as you go +2. **Link as You Learn**: Connect related concepts immediately +3. **Query When Needed**: AI-assisted discovery of relevant knowledge +4. **Evolve Over Time**: Update decisions, supersede patterns +5. **Share Wisely**: Shared guidelines, local specifics + +## Next Steps + +- **Understand motivation**: [Why KOGRAL?](why-kogral.md) +- **Learn philosophy**: [Design Philosophy](design-philosophy.md) +- **See architecture**: [System Overview](../architecture/overview.md) +- **Start using**: [Quick Start](../guides/quickstart.md) diff --git a/docs/kogral/design-philosophy.md b/docs/kogral/design-philosophy.md new file mode 100644 index 0000000..895fbc3 --- /dev/null +++ b/docs/kogral/design-philosophy.md @@ -0,0 +1,471 @@ +# Design Philosophy + +The principles and values guiding KOGRAL design and implementation. + +## Core Tenets + +### 1. Config-Driven, Not Hardcoded + +**Principle**: All behavior should be configurable via schemas, not baked into code. + +**Why**: Flexibility without code changes. Users adapt KOGRAL to their workflows, not vice versa. + +**Example**: + +```rust +// ❌ Bad: Hardcoded +impl EmbeddingProvider { + fn new() -> Self { + FastEmbedProvider::new("BAAI/bge-small-en-v1.5") // Can't change + } +} + +// ✅ Good: Config-driven +impl EmbeddingProvider { + fn from_config(config: &EmbeddingConfig) -> Result> { + match config.provider { + 'fastembed => Ok(Box::new(FastEmbedProvider::new(&config.model)?)), + 'openai => Ok(Box::new(OpenAIProvider::new(&config.model)?)), + } + } +} +``` + +**Benefits**: +- Switch embedding providers without recompilation +- Different configs for dev/prod +- User choice, not developer mandate + +### 2. Type-Safe Configuration + +**Principle**: Validate configuration before runtime, not during. + +**Why**: Catch errors early, reduce runtime failures. + +**Implementation**: Nickel contracts + serde validation = double validation + +```nickel +# Schema defines valid values +EmbeddingProvider = [| 'openai, 'claude, 'fastembed |] + +# Typo caught at export time, not runtime +{ provider = 'opena1 } # Error: Invalid variant +``` + +**Benefits**: +- Errors found during `nickel export`, not during execution +- Self-documenting: schema is the spec +- Refactoring safe: change schema, find all usages + +### 3. Local-First, Cloud-Optional + +**Principle**: Core functionality works offline, cloud is enhancement. + +**Why**: Privacy, cost control, offline development. + +**Examples**: + +| Feature | Local | Cloud | +| --------- | ------- | ------- | +| Storage | Filesystem | SurrealDB | +| Embeddings | fastembed | OpenAI/Claude | +| Search | Text-based | Semantic | + +**Benefits**: +- Works on planes, trains, areas with poor internet +- No API costs for small projects +- Privacy-sensitive projects keep data local +- Production can use cloud for scale + +### 4. Git-Friendly by Default + +**Principle**: Knowledge should version alongside code. + +**Why**: Knowledge describes code, should evolve with it. + +**Implementation**: +- Markdown + YAML frontmatter (text-based, diffable) +- One file per node (granular commits) +- Wikilinks preserved (works in Logseq, Obsidian) + +**Benefits**: + +```bash +# Review knowledge changes in PRs +git diff .kogral/decisions/ + +# Knowledge follows branches +git checkout feature-x +# .kogral/ reflects feature-x decisions + +# Knowledge merges +git merge feature-x +# Merge conflicts = knowledge conflicts (resolve intentionally) +``` + +### 5. AI-Native, Human-Readable + +**Principle**: Optimized for AI consumption, readable by humans. + +**Why**: Best of both worlds - AI-assisted discovery, human verification. + +**Implementation**: +- **Structured**: YAML frontmatter for AI parsing +- **Semantic**: Embeddings for AI queries +- **Readable**: Markdown for human consumption +- **Linked**: Typed relationships for AI traversal + +**Example**: + +```markdown +--- +id: note-auth +type: note +title: Authentication Implementation +tags: [security, auth] +relates_to: [guideline-security, pattern-jwt] +--- + +# Authentication Implementation + +Humans read this markdown normally. + +AI can: +- Parse frontmatter for metadata +- Extract tags for filtering +- Follow relates_to links +- Generate embeddings for semantic search +``` + +### 6. Composition Over Inheritance + +**Principle**: Build systems by composing small, focused components. + +**Why**: Flexibility, testability, maintainability. + +**Implementation**: + +```rust +// Small, focused traits +trait Storage { ... } +trait EmbeddingProvider { ... } +trait TemplateEngine { ... } + +// Compose into systems +struct KnowledgeBase { + storage: Box, + embeddings: Option>, + templates: TemplateEngine, +} +``` + +**Benefits**: +- Swap storage without affecting embeddings +- Disable embeddings without breaking storage +- Test components in isolation +- Add new providers by implementing trait + +### 7. Fail Fast, Fail Clearly + +**Principle**: Detect errors early, provide clear messages. + +**Why**: Developer experience - fast feedback, actionable errors. + +**Implementation**: + +```rust +// ❌ Bad: Silent failure +fn load_config(path: &Path) -> Option { + std::fs::read_to_string(path) + .ok() + .and_then(|s| serde_json::from_str(&s).ok()) +} + +// ✅ Good: Explicit errors +fn load_config(path: &Path) -> Result { + let content = std::fs::read_to_string(path) + .map_err(|e| ConfigError::ReadFailed(path.to_path_buf(), e))?; + + serde_json::from_str(&content) + .map_err(|e| ConfigError::ParseFailed(path.to_path_buf(), e)) +} +``` + +**Error messages**: + +```text +❌ "Failed to load config" +✅ "Failed to read config file '/path/to/config.ncl': Permission denied" +``` + +### 8. Convention Over Configuration (With Escape Hatches) + +**Principle**: Sane defaults, but everything customizable. + +**Why**: Easy to start, flexible as you grow. + +**Examples**: + +```nickel +# Minimal config (uses conventions) +{ graph = { name = "my-project" } } +# Defaults: filesystem storage, no embeddings, standard templates + +# Full config (explicit everything) +{ + graph = { name = "my-project" }, + storage = { primary = 'surrealdb, /* ... */ }, + embeddings = { provider = 'openai, /* ... */ }, + templates = { templates_dir = "custom" }, +} +``` + +**Conventions**: +- `.kogral/` directory in project root +- Filesystem storage by default +- YAML frontmatter + markdown body +- Standard template names (note.md.tera, decision.md.tera) + +**Escape hatches**: +- `--kogral-dir` to use different location +- Configure alternative storage backends +- Custom frontmatter schemas +- Override any template + +### 9. Documentation as Code + +**Principle**: Documentation lives with code, versioned together. + +**Why**: Outdated docs are worse than no docs. + +**Implementation**: +- ADRs in `.kogral/decisions/` (alongside code) +- Guidelines in `.kogral/guidelines/` (versioned with code) +- Patterns in `.kogral/patterns/` (evolve with implementations) + +**Benefits**: + +```bash +# Code and docs branch together +git checkout old-version +# .kogral/ reflects that version's decisions + +# Code and docs merge together +git merge feature +# Merge includes new patterns, updated guidelines + +# Code and docs reviewed together +# PR shows code + decision + guideline updates +``` + +### 10. Optimize for Discoverability + +**Principle**: Knowledge is useless if you can't find it. + +**Why**: The point is to **use** knowledge, not just store it. + +**Features**: +- **Text search**: Find exact keywords +- **Semantic search**: Find related concepts +- **Graph traversal**: Follow relationships +- **Tag filtering**: Narrow by category +- **MCP integration**: AI-assisted discovery + +**Example**: + +User doesn't remember exact term, but knows the concept: + +```text +"Find anything about handling errors gracefully" +``` + +KOGRAL finds (semantically): +- "Error Handling with thiserror" (pattern) +- "Result Type Best Practices" (guideline) +- "Panic Recovery" (note) +- "Graceful Degradation" (pattern) + +No exact keyword match needed, concept match sufficient. + +### 11. Build for Humans, Enable AI + +**Principle**: Humans are the primary users, AI is the assistant. + +**Why**: AI should enhance human workflows, not replace them. + +**Implementation**: +- **Human-readable formats**: Markdown, YAML +- **Human-editable**: Any text editor works +- **Human-discoverable**: `ls .kogral/notes/` shows files +- **AI-enhanced**: MCP for AI-assisted queries + +**Example**: + +```bash +# Human workflow +vim .kogral/notes/my-note.md # Edit directly +git add .kogral/notes/my-note.md +git commit -m "Add note about X" + +# AI-enhanced workflow +# (in Claude Code) +"Add a note about X with tags Y, Z" +# AI creates file, human reviews +``` + +### 12. Embrace the Graph + +**Principle**: Knowledge is interconnected, embrace the relationships. + +**Why**: Context comes from connections, not isolation. + +**Implementation**: +- Typed relationships (not just "related") +- Bidirectional traversal +- Relationship strength (0.0-1.0) +- Multi-hop queries + +**Example**: + +```text +Find all patterns that: + - Are implemented by current project + - Depend on shared guidelines + - Were added in the last 6 months + +# Graph query, not sequential file search +``` + +## Anti-Patterns to Avoid + +### 1. ❌ Hardcoding Behavior + +```rust +// Don't +const EMBEDDING_MODEL: &str = "BAAI/bge-small-en-v1.5"; + +// Do +let model = config.embeddings.model.as_str(); +``` + +### 2. ❌ Runtime Schema Validation + +```nickel +// Don't validate at runtime +let provider = config.provider; // Might be invalid + +// Do validate at export time (Nickel contracts) +provider | [| 'openai, 'claude, 'fastembed |] +``` + +### 3. ❌ Opaque Errors + +```rust +// Don't +Err("Failed".into()) + +// Do +Err(KbError::NodeNotFound(id.to_string())) +``` + +### 4. ❌ Coupling Components + +```rust +// Don't +impl KnowledgeBase { + fn search(&self) -> Vec { + let embeddings = FastEmbedProvider::new(); // Hardcoded! + // ... + } +} + +// Do +impl KnowledgeBase { + fn search(&self) -> Vec { + if let Some(provider) = &self.embeddings { + // Use configured provider + } + } +} +``` + +### 5. ❌ Proprietary Formats + +```text +// Don't +Binary blob: [0x4B, 0x42, 0x01, ...] + +// Do +Markdown + YAML: +--- +id: note-1 +--- +# Content +``` + +## Influences + +KOGRAL draws inspiration from: + +- **Logseq**: Outliner, graph view, wikilinks +- **Obsidian**: Markdown-first, local storage, plugins +- **Zettelkasten**: Atomic notes, links, emergence +- **ADR**: Decision records, context preservation +- **Git**: Version control, branching, merging +- **Nickel**: Type-safe configuration, contracts +- **MCP**: AI integration protocol +- **SurrealDB**: Graph database, relationships + +## Implementation Principles + +### Rust + +- Zero unsafe code (`#![forbid(unsafe_code)]`) +- No `unwrap()` in production code +- Always use `Result` for fallibility +- Comprehensive error types with `thiserror` +- Full test coverage (100+ tests) + +### Nickel + +- Contracts for validation +- Defaults in schemas +- Documentation in contracts +- Composition via imports + +### NuShell + +- Structured data pipelines +- Error handling in scripts +- Colored output for UX +- Dry-run modes + +## Evolution Strategy + +KOGRAL follows these guidelines for evolution: + +1. **Backward Compatibility**: Don't break existing configs +2. **Deprecation Period**: Warn before removal (1 major version) +3. **Migration Tools**: Provide automated migrations +4. **Semantic Versioning**: MAJOR.MINOR.PATCH strictly + +## Conclusion + +These principles guide every decision: + +✅ **Config-driven**: Behavior in schemas, not code +✅ **Type-safe**: Validate before runtime +✅ **Local-first**: Works offline, cloud optional +✅ **Git-friendly**: Knowledge versions with code +✅ **AI-native**: Optimized for AI, readable by humans +✅ **Composable**: Small pieces, loosely coupled +✅ **Fast feedback**: Fail early, clear errors +✅ **Discoverable**: Easy to find what you need + +The goal: **Knowledge management that developers actually use.** + +## Next Steps + +- **See it in action**: [Use Cases](../guides/use-cases.md) +- **Understand architecture**: [System Overview](../architecture/overview.md) +- **Start using**: [Quick Start](../guides/quickstart.md) diff --git a/docs/kogral/what-is-kogral.md b/docs/kogral/what-is-kogral.md new file mode 100644 index 0000000..ee98ad9 --- /dev/null +++ b/docs/kogral/what-is-kogral.md @@ -0,0 +1,228 @@ +# What is KOGRAL + +KOGRAL (**KO**wledge **GRA**phs, **L**ocal-first) is a **git-native knowledge graph system** designed for developer teams to capture, connect, and query structured knowledge. + +## Purpose + +KOGRAL solves the problem of **knowledge fragmentation** in software development: + +- 📝 Notes scattered across tools +- 🤔 Decisions lost in chat histories +- 📚 Guidelines buried in wikis +- 🔄 Patterns rediscovered repeatedly +- 🤖 AI agents lacking project context + +## Solution + +KOGRAL provides a **unified, queryable knowledge graph** that: + +1. **Captures** knowledge in structured, git-friendly markdown +2. **Connects** concepts through typed relationships +3. **Queries** via text and semantic similarity +4. **Integrates** with AI tools (Claude Code via MCP) +5. **Syncs** across local (filesystem) and shared (SurrealDB) storage + +## Core Philosophy + +### Config-Driven + +Behavior defined in Nickel schemas, not hardcoded: + +```nickel +{ + graph = { name = "my-project" }, + storage = { primary = 'filesystem }, + embeddings = { provider = 'fastembed }, + templates = { templates_dir = "templates" }, +} +``` + +Every aspect configurable: storage, embeddings, templates, query behavior. + +### Git-Friendly + +Knowledge stored as markdown files with YAML frontmatter: + +```markdown +--- +id: note-123 +type: note +title: Error Handling Patterns +tags: [rust, error-handling] +--- + +# Error Handling Patterns + +Use `thiserror` for custom error types... +``` + +Changes tracked via git, reviewable in PRs, mergeable across branches. + +### AI-Native + +Built for agent collaboration: + +- **MCP Protocol**: Native integration with Claude Code +- **Semantic Search**: Find concepts, not just keywords +- **Auto-Linking**: Suggest relationships based on content +- **Context Injection**: Agents query relevant guidelines before coding + +## Key Concepts + +### Nodes + +6 types of knowledge nodes: + +| Type | Purpose | Example | +| ------ | --------- | --------- | +| **Note** | General observations | "Rust ownership patterns" | +| **Decision** | ADRs (Architectural Decision Records) | "Use SurrealDB for storage" | +| **Guideline** | Code standards | "Error handling with thiserror" | +| **Pattern** | Reusable solutions | "Repository pattern for DB access" | +| **Journal** | Daily reflections | "2026-01-17 progress notes" | +| **Execution** | Agent task records | "Implemented auth module" | + +### Relationships + +6 typed edges connecting nodes: + +| Relation | Meaning | Example | +| ---------- | --------- | --------- | +| `relates_to` | Conceptual link | Note ↔ Note | +| `depends_on` | Prerequisite | Pattern → Guideline | +| `implements` | Concrete realization | Code → Pattern | +| `extends` | Inheritance | ProjectGuideline → BaseGuideline | +| `supersedes` | Replacement | DecisionV2 → DecisionV1 | +| `explains` | Documentation | Note → Execution | + +### Multi-Graph Architecture + +**Local Graph** (per project): +- Stored in `.kogral/` directory +- Git-tracked for version control +- Project-specific knowledge + +**Shared Graph** (organization-wide): +- Centralized guidelines and patterns +- SurrealDB for scalability +- Inherited by projects + +**Inheritance Resolution**: + +```text +Shared Guidelines (priority: 50) + ↓ +Project Guidelines (priority: 100) + ↓ +Effective Guidelines (higher priority wins) +``` + +## Use Cases + +### For Developers + +- **Capture decisions** as you make them (ADRs) +- **Document patterns** for future reference +- **Track daily progress** in journal entries +- **Query past decisions** before new implementations + +### For Teams + +- **Share guidelines** across projects +- **Standardize patterns** organization-wide +- **Onboard new members** with searchable knowledge +- **Review decisions** in context with git history + +### For AI Agents + +- **Query guidelines** before generating code +- **Check past decisions** for context +- **Document executions** for audit trails +- **Suggest related patterns** during implementation + +## Comparison with Other Tools + +### vs. Logseq + +| Feature | KOGRAL | Logseq | +| --------- | -------- | -------- | +| **Storage** | Git-friendly markdown + DB | Local markdown | +| **AI Integration** | Native MCP protocol | Plugin-based | +| **Config** | Type-safe Nickel schemas | JSON files | +| **Multi-Backend** | Filesystem + SurrealDB | Filesystem only | +| **Semantic Search** | Multiple AI providers | Local only | +| **Graph Queries** | SurrealDB graph queries | Block references | + +**Compatibility**: KOGRAL can import/export Logseq graphs for visual editing. + +### vs. Obsidian + +| Feature | KOGRAL | Obsidian | +| --------- | -------- | ---------- | +| **Target Audience** | Developers + AI agents | Knowledge workers | +| **Focus** | Structured knowledge graph | Flexible note-taking | +| **Configuration** | Config-driven (Nickel) | Settings UI | +| **CLI** | Full CLI + MCP server | Limited CLI | +| **Version Control** | Git-native | Git plugin | + +**Use Case**: KOGRAL for developer knowledge, Obsidian for personal notes. + +### vs. Notion/Confluence + +| Feature | KOGRAL | Notion/Confluence | +| --------- | -------- | ------------------- | +| **Storage** | Local-first | Cloud-only | +| **Format** | Plain markdown | Proprietary | +| **AI Access** | Programmatic API | Web scraping | +| **Offline** | Full functionality | Limited | +| **Privacy** | Self-hosted | Third-party servers | + +**Advantage**: KOGRAL keeps sensitive knowledge on-premises. + +## Architecture Overview + +```text +┌─────────────────────────────────────────────────────┐ +│ kogral-core │ +│ (Rust library: graph, storage, config, query) │ +└──────────────┬─────────────┬────────────────────────┘ + │ │ + ┌─────────┴──────┐ ┌──┴─────────┐ + │ │ │ │ +┌────▼─────┐ ┌──────▼──▼───┐ ┌─────▼─────┐ +│ kogral-cli │ │ kogral-mcp │ │ NuShell │ +│ (13 cmds)│ │ (MCP server) │ │ (scripts) │ +└──────────┘ └──────────────┘ └───────────┘ +``` + +**Layers**: +1. **kogral-core**: Core library (models, storage, query) +2. **kogral-cli**: Command-line interface +3. **kogral-mcp**: MCP server for AI integration +4. **Scripts**: NuShell automation (sync, backup, etc.) + +## When to Use KOGRAL + +✅ **Good fit**: +- Developer teams building software +- Projects with architectural decisions +- Organizations standardizing patterns +- AI-assisted development workflows +- Knowledge requiring version control + +❌ **Not ideal for**: +- Personal journaling (use Obsidian) +- Team wikis (use Notion) +- Customer documentation (use mdBook) +- Simple note-taking (use Logseq) + +## Next Steps + +- **New to KOGRAL?** → [Installation Guide](../guides/installation.md) +- **Ready to start?** → [Quick Start](../guides/quickstart.md) +- **Want examples?** → [Use Cases](../guides/use-cases.md) +- **Understand design?** → [Architecture Overview](../architecture/overview.md) + +--- + +> "Knowledge is only valuable when it's accessible, connected, and queryable." diff --git a/docs/kogral/why-kogral.md b/docs/kogral/why-kogral.md new file mode 100644 index 0000000..9c5115b --- /dev/null +++ b/docs/kogral/why-kogral.md @@ -0,0 +1,317 @@ +# Why KB + +Understanding the motivation behind the Knowledge Base system. + +## The Problem: Knowledge Fragmentation + +Modern software development generates enormous amounts of knowledge: + +📝 **Notes**: Implementation details, learnings, discoveries +🤔 **Decisions**: Why we chose X over Y +📚 **Guidelines**: How we write code, architecture patterns +🔄 **Patterns**: Reusable solutions we've discovered +💭 **Discussions**: Slack threads, meeting notes, PR comments +🐛 **Bug Fixes**: How we solved issues + +**But where does this knowledge live?** + +- Meeting notes in Google Docs +- Decisions buried in Slack threads +- Guidelines in a wiki nobody updates +- Patterns in someone's head +- PR discussions lost in GitHub history +- Bug solutions in closed Jira tickets + +**The result?** + +❌ **Rediscovering solutions** to problems we've already solved +❌ **Inconsistent practices** because guidelines aren't accessible +❌ **Slow onboarding** as new developers lack context +❌ **Lost context** when team members leave +❌ **Repeated mistakes** because past lessons aren't preserved + +## The Solution: Unified, Queryable Knowledge Graph + +Knowledge Base provides a **single source of truth** for project knowledge: + +✅ **Capture once**: Notes, decisions, guidelines, patterns +✅ **Connect concepts**: Typed relationships between ideas +✅ **Query naturally**: Text and semantic search +✅ **AI-assisted**: Claude Code integration via MCP +✅ **Git-tracked**: Version control for knowledge +✅ **Shared wisdom**: Organization-wide guidelines + project-specific + +## What Makes KB Different + +### 1. Git-Native + +**Other tools**: Notion, Confluence, wikis in web apps + +**KB**: Markdown files in `.kogral/` directory + +**Benefits**: + +```bash +# Review knowledge changes in PRs +git diff .kogral/decisions/ + +# Branch knowledge with code +git checkout feature-branch +# .kogral/ follows the branch + +# Merge knowledge from feature work +git merge feature-branch +# Knowledge merges like code +``` + +**Result**: Knowledge versioned alongside code it describes. + +### 2. AI-Native + +**Other tools**: Manual search, browse folders + +**KB**: AI queries via Claude Code + +**Example**: + +```text +You: "Find anything about error handling" + +Claude: [Searches semantically, not just keywords] +Found 5 concepts: +- Pattern: Error Handling with thiserror +- Guideline: Result Type Best Practices +- Decision: Use anyhow for Application Errors +- Note: Custom Error Types +- Journal: Fixed error propagation bug + +[All related, even without exact keyword match] +``` + +**Result**: Find concepts, not just documents with keywords. + +### 3. Config-Driven + +**Other tools**: Hardcoded behavior, limited customization + +**KB**: Nickel schemas define everything + +**Example**: + +```nickel +# Development: local embeddings, no costs +{ embeddings = { provider = 'fastembed } } + +# Production: cloud embeddings, best quality +{ embeddings = { provider = 'openai, model = "text-embedding-3-large" } } +``` + +**Result**: Adapt behavior without code changes. + +### 4. Multi-Graph + +**Other tools**: One knowledge base per project + +**KB**: Shared organizational knowledge + project-specific + +**Structure**: + +```text +Organization Shared KB + ├── Rust Guidelines (applies to all projects) + ├── Security Patterns (applies to all projects) + └── Testing Standards (applies to all projects) + +Project A KB + ├── Inherits shared guidelines + ├── Project-specific decisions + └── Can override shared guidelines + +Project B KB + ├── Inherits same shared guidelines + ├── Different project decisions + └── Different overrides +``` + +**Result**: Consistency across organization, flexibility per project. + +### 5. Structured Relationships + +**Other tools**: Backlinks, tags, folders + +**KB**: Typed relationships with meaning + +**Example**: + +```text +Pattern: Repository Pattern + ↑ [implements] +Note: User Service Implementation + ↑ [relates_to] +Decision: Use PostgreSQL + ↑ [depends_on] +Guideline: Database Access Patterns +``` + +**Result**: Understand how knowledge connects, not just that it connects. + +## Real-World Impact + +### Before KB + +**New developer joins**: +1. Read outdated wiki (2 hours) +2. Ask teammates for context (1 hour per question × 10 questions) +3. Discover guidelines by reading code (days) +4. Miss important decisions (leads to mistakes) + +**Time to productivity**: 2-4 weeks + +### With KB + +**New developer joins**: +1. `kogral search "architectural decisions"` → finds all ADRs +2. Ask Claude: "What are our coding guidelines?" → gets current guidelines with inheritance +3. Browse related notes via graph traversal +4. Full context available, no tribal knowledge + +**Time to productivity**: 3-5 days + +### Before KB + +**Team makes decision**: +1. Discussion in Slack (lost after a week) +2. Someone documents in wiki (maybe) +3. 6 months later: "Why did we choose X?" → nobody remembers +4. Re-debate the same decision + +### With KB + +**Team makes decision**: +1. Discussion captured as ADR during meeting +2. Context, decision, consequences documented +3. Linked to related patterns and guidelines +4. 6 months later: `kogral show decision-use-x` → full context instantly + +### Before KB + +**Solving a bug**: +1. Encounter race condition in cache +2. Debug for 2 hours +3. Fix it +4. Solution lost in PR comments + +**Two months later**: Different developer, same bug, 2 more hours + +### With KB + +**Solving a bug**: +1. Encounter race condition +2. Ask Claude: "Have we seen cache race conditions before?" +3. Claude finds journal entry from 2 months ago with solution +4. Apply fix in 10 minutes + +**Two months later**: Same query, same instant solution + +## Who Benefits + +### Individual Developers + +✅ **Personal knowledge base**: Capture learnings, build expertise +✅ **Quick recall**: "How did I solve this before?" +✅ **Context switching**: Return to old projects with full context +✅ **Career growth**: Document what you learn, portfolio of knowledge + +### Teams + +✅ **Shared context**: Everyone has access to team knowledge +✅ **Onboarding**: New members ramp up faster +✅ **Consistency**: Follow shared guidelines and patterns +✅ **Collaboration**: Build on each other's knowledge + +### Organizations + +✅ **Institutional memory**: Knowledge persists beyond individual tenure +✅ **Best practices**: Standardize across teams +✅ **Compliance**: Document security and architecture decisions +✅ **Efficiency**: Stop solving the same problems repeatedly + +### AI Agents + +✅ **Context injection**: Agents query guidelines before generating code +✅ **Decision awareness**: Agents check past decisions +✅ **Pattern following**: Agents use documented patterns +✅ **Execution tracking**: Agent actions documented automatically + +## When NOT to Use KB + +KB is **not** ideal for: + +❌ **Personal journaling**: Use Obsidian or Logseq +❌ **Team wikis**: Use Notion or Confluence +❌ **Customer docs**: Use mdBook or Docusaurus +❌ **Project management**: Use Jira or Linear +❌ **Code comments**: Use inline documentation + +KB is **perfect** for: + +✅ Developer knowledge graphs +✅ Architectural decision records +✅ Pattern libraries +✅ Coding guidelines +✅ Technical context +✅ AI-assisted development + +## The Vision + +**Today's development**: + +```text +Developer → writes code → commits +``` + +**With KB**: + +```text +Developer → writes code → documents decisions → links to patterns → commits code + knowledge + ↓ + AI Agent queries knowledge → generates better code + ↓ + Team discovers patterns → reuses solutions → faster development +``` + +**Knowledge becomes an active participant in development**, not an afterthought. + +## Design Philosophy + +Three core principles drive KB: + +### 1. **Knowledge should be captured during work, not after** + +❌ "I'll document this later" → never happens +✅ "Claude, document this decision" → done in 30 seconds + +### 2. **Knowledge should be connected, not isolated** + +❌ Standalone documents in folders +✅ Graph of interconnected concepts + +### 3. **Knowledge should be queryable, not browsable** + +❌ "Let me look through 50 docs to find..." +✅ "Find anything related to error handling" → instant semantic results + +## Get Started + +Ready to stop losing knowledge? + +- **Understand concepts**: [Core Concepts](core-concepts.md) +- **Learn philosophy**: [Design Philosophy](design-philosophy.md) +- **Quick start**: [Quick Start Guide](../guides/quickstart.md) +- **See examples**: [Use Cases](../guides/use-cases.md) + +--- + +> "The best time to document was during implementation. The second best time is now." + +But with KB + AI, "now" is instant. diff --git a/docs/setup/environment.md b/docs/setup/environment.md new file mode 100644 index 0000000..ebfbf35 --- /dev/null +++ b/docs/setup/environment.md @@ -0,0 +1 @@ +# Environment Configuration diff --git a/docs/setup/installation.md b/docs/setup/installation.md new file mode 100644 index 0000000..fe7ea87 --- /dev/null +++ b/docs/setup/installation.md @@ -0,0 +1 @@ +# Installation Methods diff --git a/docs/setup/prerequisites.md b/docs/setup/prerequisites.md new file mode 100644 index 0000000..6059b91 --- /dev/null +++ b/docs/setup/prerequisites.md @@ -0,0 +1 @@ +# Prerequisites diff --git a/docs/setup/project-init.md b/docs/setup/project-init.md new file mode 100644 index 0000000..7600abe --- /dev/null +++ b/docs/setup/project-init.md @@ -0,0 +1 @@ +# Project Initialization diff --git a/docs/setup/verification.md b/docs/setup/verification.md new file mode 100644 index 0000000..0978386 --- /dev/null +++ b/docs/setup/verification.md @@ -0,0 +1 @@ +# Verification diff --git a/docs/storage/backends.md b/docs/storage/backends.md new file mode 100644 index 0000000..158b01d --- /dev/null +++ b/docs/storage/backends.md @@ -0,0 +1 @@ +# Storage Backends diff --git a/docs/storage/filesystem.md b/docs/storage/filesystem.md new file mode 100644 index 0000000..1789cc8 --- /dev/null +++ b/docs/storage/filesystem.md @@ -0,0 +1 @@ +# Filesystem Storage diff --git a/docs/storage/memory.md b/docs/storage/memory.md new file mode 100644 index 0000000..d80c391 --- /dev/null +++ b/docs/storage/memory.md @@ -0,0 +1 @@ +# In-Memory Storage diff --git a/docs/storage/overview.md b/docs/storage/overview.md new file mode 100644 index 0000000..f91e9a6 --- /dev/null +++ b/docs/storage/overview.md @@ -0,0 +1,639 @@ +# Storage Architecture + +The Knowledge Base uses a **hybrid storage strategy** combining filesystem, SurrealDB, and in-memory backends to balance git-friendliness, scalability, and performance. + +## Overview + +![Storage Architecture](../diagrams/storage-architecture.svg) + +The storage layer is abstracted through a common `Storage` trait, allowing KOGRAL to use different backends based on project needs: + +- **Filesystem**: Git-tracked markdown files for local project knowledge +- **SurrealDB**: Scalable graph database for shared organizational knowledge +- **In-Memory**: Fast ephemeral storage for testing and caching + +## Storage Trait + +All storage backends implement a common async trait: + +```rust +#[async_trait] +pub trait Storage: Send + Sync { + async fn save_node(&self, node: &Node) -> Result<()>; + async fn load_node(&self, id: &str) -> Result; + async fn delete_node(&self, id: &str) -> Result<()>; + async fn list_nodes(&self, node_type: Option) -> Result>; + async fn search(&self, query: &str) -> Result>; + + async fn save_edge(&self, edge: &Edge) -> Result<()>; + async fn load_edges(&self, node_id: &str) -> Result>; + async fn delete_edge(&self, from: &str, to: &str, relation: EdgeType) -> Result<()>; + + async fn save_graph(&self, graph: &Graph) -> Result<()>; + async fn load_graph(&self, name: &str) -> Result; +} +``` + +This abstraction allows: +- ✅ Swapping backends without code changes (config-driven) +- ✅ Testing with in-memory storage +- ✅ Hybrid setups (filesystem + SurrealDB) +- ✅ Custom backends (implement trait + add to config) + +## Filesystem Storage + +### Purpose + +**Git-friendly, human-readable knowledge storage** + +Ideal for: +- Project-specific knowledge +- Version control with git +- Code review of knowledge changes +- Offline work +- Logseq compatibility + +### File Layout + +```text +.kogral/ +├── config.toml # Graph metadata +├── notes/ +│ ├── 2026-01-17-topic.md +│ ├── async-patterns.md +│ └── error-handling.md +├── decisions/ +│ ├── 0001-use-rust.md # ADR format +│ ├── 0002-surrealdb.md +│ └── 0003-nickel-config.md +├── guidelines/ +│ ├── rust-errors.md +│ ├── testing-standards.md +│ └── api-design.md +├── patterns/ +│ ├── repository-pattern.md +│ ├── builder-pattern.md +│ └── async-error-handling.md +└── journal/ + ├── 2026-01-17.md # Daily notes + └── 2026-01-18.md +``` + +### Document Format + +Each document is **markdown with YAML frontmatter**: + +```markdown +--- +id: note-rust-async-traits +type: note +title: Async Trait Patterns in Rust +created: 2026-01-17T10:30:00Z +modified: 2026-01-17T15:45:00Z +tags: [rust, async, traits] +status: active +relates_to: + - pattern-async-error-handling + - guideline-rust-async +depends_on: + - note-rust-basics +project: knowledge-base +--- + +# Async Trait Patterns in Rust + +Using async traits with the `async-trait` crate... + +## Pattern 1: Boxed Futures + +When working with async traits, use `async-trait` to avoid lifetime issues: + +\`\`\`rust +#[async_trait] +trait DataSource { + async fn fetch(&self, id: &str) -> Result; +} +\`\`\` + +## Related Concepts + +See [[pattern-async-error-handling]] for error handling in async contexts. + +Depends on understanding [[note-rust-basics]] first. +``` + +### Features + +**Wikilinks**: `[[other-note]]` automatically creates relationships + +**Code References**: `@src/main.rs:42` links to code locations + +**Git Integration**: +- Diffs show knowledge changes +- Branches for experimental knowledge +- PRs for knowledge review +- History tracking +- Blame shows knowledge authors + +**Logseq Compatibility**: Format is compatible with Logseq for graph visualization + +### Implementation + +```rust +pub struct FilesystemStorage { + root: PathBuf, +} + +impl FilesystemStorage { + pub fn new(root: impl Into) -> Result { + let root = root.into(); + fs::create_dir_all(&root)?; + Ok(Self { root }) + } + + fn node_path(&self, node_type: NodeType, id: &str) -> PathBuf { + let subdir = match node_type { + NodeType::Note => "notes", + NodeType::Decision => "decisions", + NodeType::Guideline => "guidelines", + NodeType::Pattern => "patterns", + NodeType::Journal => "journal", + NodeType::Execution => "executions", + }; + self.root.join(subdir).join(format!("{}.md", id)) + } +} + +#[async_trait] +impl Storage for FilesystemStorage { + async fn save_node(&self, node: &Node) -> Result<()> { + let path = self.node_path(node.node_type, &node.id); + fs::create_dir_all(path.parent().unwrap())?; + + let markdown = format_node_as_markdown(node)?; + fs::write(path, markdown)?; + Ok(()) + } + + async fn load_node(&self, id: &str) -> Result { + // Try each node type directory + for node_type in NodeType::iter() { + let path = self.node_path(node_type, id); + if path.exists() { + let content = fs::read_to_string(path)?; + return parse_markdown_node(&content); + } + } + Err(KbError::NodeNotFound(id.to_string())) + } +} +``` + +### File Watching + +Filesystem storage can watch for changes and auto-sync: + +```rust +use notify::{Watcher, RecursiveMode, Event}; + +impl FilesystemStorage { + pub async fn watch(&self, on_change: impl Fn(Event) + Send + 'static) -> Result<()> { + let (tx, rx) = channel(); + let mut watcher = RecommendedWatcher::new(tx, Config::default())?; + + watcher.watch(&self.root, RecursiveMode::Recursive)?; + + while let Ok(event) = rx.recv() { + on_change(event); + } + Ok(()) + } +} +``` + +## SurrealDB Storage + +### Purpose + +**Scalable graph database for shared organizational knowledge** + +Ideal for: +- Organization-wide guidelines +- Shared patterns library +- Advanced graph queries +- Semantic search with embeddings +- Multi-project knowledge sharing + +### Schema + +SurrealDB schema for nodes and edges: + +```sql +DEFINE TABLE node SCHEMAFULL; + +DEFINE FIELD id ON node TYPE string; +DEFINE FIELD node_type ON node TYPE string ASSERT $value INSIDE ["note", "decision", "guideline", "pattern", "journal", "execution"]; +DEFINE FIELD title ON node TYPE string; +DEFINE FIELD content ON node TYPE string; +DEFINE FIELD tags ON node TYPE array; +DEFINE FIELD status ON node TYPE string; +DEFINE FIELD created ON node TYPE datetime; +DEFINE FIELD modified ON node TYPE datetime; +DEFINE FIELD embedding ON node TYPE array; -- For semantic search + +DEFINE INDEX unique_node_id ON node COLUMNS id UNIQUE; +DEFINE INDEX node_type_idx ON node COLUMNS node_type; +DEFINE INDEX node_tags_idx ON node COLUMNS tags; + +-- Relationship table +DEFINE TABLE edge SCHEMAFULL; + +DEFINE FIELD from ON edge TYPE record(node); +DEFINE FIELD to ON edge TYPE record(node); +DEFINE FIELD relation ON edge TYPE string ASSERT $value INSIDE ["relates_to", "depends_on", "implements", "extends", "supersedes", "explains"]; +DEFINE FIELD strength ON edge TYPE number; +DEFINE FIELD created ON edge TYPE datetime; +``` + +### Graph Queries + +SurrealDB's native graph support enables powerful queries: + +**Find all dependencies** (transitive): + +```sql +SELECT * FROM node:note-id->depends_on->node; +``` + +**Find related guidelines** (2 hops): + +```sql +SELECT * FROM node:guideline-rust-errors<-relates_to<-node<-relates_to<-node; +``` + +**Semantic search** (cosine similarity): + +```sql +SELECT *, vector::similarity::cosine(embedding, $query_embedding) AS score +FROM node +WHERE score > 0.6 +ORDER BY score DESC +LIMIT 10; +``` + +### Implementation + +```rust +use surrealdb::{Surreal, engine::remote::ws::Client}; + +pub struct SurrealDbStorage { + db: Surreal, + namespace: String, + database: String, +} + +impl SurrealDbStorage { + pub async fn new(config: &KbConfig) -> Result { + let db = Surreal::new::(&config.storage.secondary.url).await?; + + db.signin(Root { + username: &config.storage.secondary.username, + password: &config.storage.secondary.password, + }).await?; + + db.use_ns(&config.storage.secondary.namespace) + .use_db(&config.storage.secondary.database) + .await?; + + Ok(Self { + db, + namespace: config.storage.secondary.namespace.clone(), + database: config.storage.secondary.database.clone(), + }) + } +} + +#[async_trait] +impl Storage for SurrealDbStorage { + async fn save_node(&self, node: &Node) -> Result<()> { + let _: Option = self.db + .create(("node", &node.id)) + .content(node) + .await?; + Ok(()) + } + + async fn load_node(&self, id: &str) -> Result { + self.db.select(("node", id)).await? + .ok_or_else(|| KbError::NodeNotFound(id.to_string())) + } + + async fn search(&self, query: &str) -> Result> { + let sql = "SELECT * FROM node WHERE title ~ $query OR content ~ $query"; + let mut result = self.db.query(sql).bind(("query", query)).await?; + let nodes: Vec = result.take(0)?; + Ok(nodes) + } +} +``` + +### Multi-Tenancy + +SurrealDB supports namespaces and databases for isolation: + +```text +Namespace: "kb" +├── Database: "shared" (organization-wide) +│ └── Nodes: guidelines, patterns, policies +└── Database: "project-foo" (project-specific) + └── Nodes: project decisions, local notes +``` + +Configuration: + +```nickel +storage = { + secondary = { + enabled = true, + namespace = "kogral", + database = "shared", # or "project-foo" for project-specific + }, +} +``` + +## In-Memory Storage + +### Purpose + +**Fast ephemeral storage for testing and caching** + +Ideal for: +- Unit tests (isolated, deterministic) +- Integration tests (fast setup/teardown) +- Session caching (temporary graphs) +- Development mode (rapid iteration) + +### Implementation + +```rust +use dashmap::DashMap; + +pub struct MemoryStorage { + nodes: DashMap, + edges: DashMap<(String, String, EdgeType), Edge>, +} + +impl MemoryStorage { + pub fn new() -> Self { + Self { + nodes: DashMap::new(), + edges: DashMap::new(), + } + } +} + +#[async_trait] +impl Storage for MemoryStorage { + async fn save_node(&self, node: &Node) -> Result<()> { + self.nodes.insert(node.id.clone(), node.clone()); + Ok(()) + } + + async fn load_node(&self, id: &str) -> Result { + self.nodes.get(id) + .map(|entry| entry.value().clone()) + .ok_or_else(|| KbError::NodeNotFound(id.to_string())) + } + + async fn list_nodes(&self, node_type: Option) -> Result> { + Ok(self.nodes.iter() + .filter(|entry| { + node_type.map_or(true, |t| entry.value().node_type == t) + }) + .map(|entry| entry.key().clone()) + .collect()) + } + + async fn search(&self, query: &str) -> Result> { + Ok(self.nodes.iter() + .filter(|entry| { + let node = entry.value(); + node.title.contains(query) || + node.content.contains(query) || + node.tags.iter().any(|tag| tag.contains(query)) + }) + .map(|entry| entry.value().clone()) + .collect()) + } +} +``` + +### Concurrency + +`DashMap` provides lock-free concurrent access: + +```rust +// Multiple threads can read/write simultaneously +let storage = Arc::new(MemoryStorage::new()); + +tokio::spawn({ + let storage = storage.clone(); + async move { + storage.save_node(&node1).await.unwrap(); + } +}); + +tokio::spawn({ + let storage = storage.clone(); + async move { + storage.save_node(&node2).await.unwrap(); + } +}); +``` + +## Hybrid Storage Strategy + +### Architecture + +Combine filesystem and SurrealDB for best of both worlds: + +```text +Project Graph (local) Shared Graph (central) + ↓ ↓ +Filesystem Storage SurrealDB Storage + .kogral/notes/ namespace: "kb" + .kogral/decisions/ database: "shared" + .kogral/guidelines/ nodes: shared guidelines + ↓ ↓ + └─────── Sync Mechanism ─────────┘ + (bidirectional) +``` + +**Local advantages**: +- Git-tracked (version control) +- Offline work +- Fast local queries +- Human-readable diffs + +**Central advantages**: +- Shared across projects +- Advanced graph queries +- Semantic search at scale +- Organization-wide knowledge + +### Sync Mechanism + +Bidirectional synchronization keeps both in sync: + +```rust +pub struct SyncManager { + filesystem: Arc, + surrealdb: Arc, + config: SyncConfig, +} + +impl SyncManager { + pub async fn sync_to_central(&self) -> Result<()> { + let nodes = self.filesystem.list_nodes(None).await?; + + for node_id in nodes { + let node = self.filesystem.load_node(&node_id).await?; + self.surrealdb.save_node(&node).await?; + } + + Ok(()) + } + + pub async fn sync_from_central(&self) -> Result<()> { + let nodes = self.surrealdb.list_nodes(None).await?; + + for node_id in nodes { + let node = self.surrealdb.load_node(&node_id).await?; + self.filesystem.save_node(&node).await?; + } + + Ok(()) + } + + pub async fn watch_and_sync(&self) -> Result<()> { + self.filesystem.watch(|event| { + if let Some(path) = event.path { + // Debounce and sync changed file + tokio::spawn(async move { + sleep(Duration::from_millis(self.config.debounce_ms)).await; + self.sync_to_central().await + }); + } + }).await + } +} +``` + +### Conflict Resolution + +When both storage have different versions of the same node: + +**Strategy 1: Last-Write-Wins** (based on `modified` timestamp) + +```rust +if filesystem_node.modified > surrealdb_node.modified { + surrealdb.save_node(&filesystem_node).await?; +} else { + filesystem.save_node(&surrealdb_node).await?; +} +``` + +**Strategy 2: User Prompt** (safe, explicit) + +```rust +if filesystem_node != surrealdb_node { + match prompt_user(&filesystem_node, &surrealdb_node)? { + Choice::KeepLocal => surrealdb.save_node(&filesystem_node).await?, + Choice::KeepCentral => filesystem.save_node(&surrealdb_node).await?, + Choice::Merge => /* merge and save */, + } +} +``` + +**Strategy 3: Both** (create branches) + +```rust +// Save both as separate nodes with relationship +filesystem_node.id = format!("{}-local", original_id); +surrealdb_node.id = format!("{}-central", original_id); +storage.save_node(&filesystem_node).await?; +storage.save_node(&surrealdb_node).await?; +storage.save_edge(&Edge { + from: filesystem_node.id, + to: surrealdb_node.id, + relation: EdgeType::RelatesTo, + strength: 1.0, +}).await?; +``` + +## Configuration + +Storage backend is selected via config: + +```nickel +{ + storage = { + # Primary storage (always used) + primary = 'filesystem, # or 'memory, 'surrealdb + + # Secondary storage (optional, for hybrid setup) + secondary = { + enabled = true, # Enable SurrealDB + type = 'surrealdb, + url = "ws://localhost:8000", + namespace = "kogral", + database = "shared", + username = "root", # Or from env var + password = "root", + }, + }, + + sync = { + auto_index = true, # Auto-sync to secondary + debounce_ms = 500, # Wait before syncing + watch_paths = ["notes", "decisions", "guidelines"], + }, +} +``` + +## Performance Considerations + +### Filesystem Storage + +- **Read**: O(1) if ID known, O(n) for scanning +- **Write**: Fast (single file write) +- **Search**: O(n) text scan, slow for large graphs +- **Optimization**: Use file system cache, lazy load + +### SurrealDB Storage + +- **Read**: O(log n) with indexes +- **Write**: Fast with async commits +- **Search**: O(1) with full-text index +- **Graph traversal**: Optimized with native graph support +- **Optimization**: Index on tags, node_type, embeddings + +### In-Memory Storage + +- **Read**: O(1) with DashMap +- **Write**: O(1) lock-free +- **Search**: O(n) iteration +- **Memory**: Entire graph in RAM + +## Security + +- **Filesystem**: Unix permissions, path sanitization +- **SurrealDB**: Authentication, namespaces, TLS +- **In-Memory**: Process isolation, no persistence + +## See Also + +- **Configuration**: [Storage Configuration](../config/storage.md) +- **Sync Guide**: [Filesystem ↔ SurrealDB Sync](sync.md) +- **ADR**: [Hybrid Storage Decision](../architecture/adrs/003-hybrid-storage.md) +- **API Reference**: [Storage Trait Documentation](../api/storage-trait.md) diff --git a/docs/storage/surrealdb.md b/docs/storage/surrealdb.md new file mode 100644 index 0000000..df50e78 --- /dev/null +++ b/docs/storage/surrealdb.md @@ -0,0 +1 @@ +# SurrealDB Storage diff --git a/docs/storage/sync.md b/docs/storage/sync.md new file mode 100644 index 0000000..47aeeda --- /dev/null +++ b/docs/storage/sync.md @@ -0,0 +1 @@ +# Sync Strategies diff --git a/docs/templates/customization.md b/docs/templates/customization.md new file mode 100644 index 0000000..90570e9 --- /dev/null +++ b/docs/templates/customization.md @@ -0,0 +1 @@ +# Customization diff --git a/docs/templates/documents.md b/docs/templates/documents.md new file mode 100644 index 0000000..af02e95 --- /dev/null +++ b/docs/templates/documents.md @@ -0,0 +1 @@ +# Document Templates diff --git a/docs/templates/export.md b/docs/templates/export.md new file mode 100644 index 0000000..53ac436 --- /dev/null +++ b/docs/templates/export.md @@ -0,0 +1 @@ +# Export Templates diff --git a/docs/templates/overview.md b/docs/templates/overview.md new file mode 100644 index 0000000..1da30f8 --- /dev/null +++ b/docs/templates/overview.md @@ -0,0 +1 @@ +# Template System diff --git a/docs/user-guide/README.md b/docs/user-guide/README.md new file mode 100644 index 0000000..5135589 --- /dev/null +++ b/docs/user-guide/README.md @@ -0,0 +1,36 @@ +# User Guide + +Comprehensive guides for using the KOGRAL. + +## Getting Started + +- [Quick Start](quickstart.md) - Get up and running in 5 minutes +- [Configuration](configuration.md) - Configure your knowledge base +- [CLI Commands](cli-commands.md) - Command-line interface reference + +## Working with Documents + +- [Document Format](document-format.md) - Markdown and frontmatter syntax +- [Node Types](node-types.md) - Notes, Decisions, Guidelines, Patterns, Journal +- [Relationships](relationships.md) - Linking nodes together +- [Templates](templates.md) - Using and customizing document templates + +## Integration + +- [Logseq Integration](logseq-integration.md) - Import/export with Logseq +- [Claude Code Integration](claude-code-integration.md) - MCP server usage +- [Git Workflows](git-workflows.md) - Version control best practices + +## Advanced Usage + +- [Search and Query](search-and-query.md) - Text and semantic search +- [Cross-Project Knowledge](cross-project-knowledge.md) - Shared guidelines and patterns +- [Automation](automation.md) - NuShell scripts and workflows +- [Maintenance](maintenance.md) - Backup, sync, and migration + +## Workflows + +- [Daily Notes](workflows/daily-notes.md) - Journal entries and reflection +- [Decision Records](workflows/decision-records.md) - Architectural Decision Records (ADR) +- [Pattern Library](workflows/pattern-library.md) - Building reusable patterns +- [Guideline Management](workflows/guideline-management.md) - Code standards and practices diff --git a/docs/user-guide/configuration.md b/docs/user-guide/configuration.md new file mode 100644 index 0000000..c4d9391 --- /dev/null +++ b/docs/user-guide/configuration.md @@ -0,0 +1,635 @@ +# Configuration Reference + +Complete reference for configuring the KOGRAL using Nickel schemas. + +## Configuration Files + +The knowledge base uses Nickel (`.ncl`) for configuration with type-safe schemas: + +```text +.kogral/ +└── config.ncl # Main configuration file +``` + +Configuration is exported to JSON and loaded into Rust structs with double validation. + +## Quick Configuration + +### Minimal Configuration + +```nickel +# .kogral/config.ncl +{ + graph = { + name = "My Project", + version = "1.0.0", + }, +} +``` + +### Recommended Configuration + +```nickel +{ + graph = { + name = "My Project", + version = "1.0.0", + description = "Project knowledge base", + }, + + storage = { + primary = 'filesystem, + }, + + embeddings = { + enabled = true, + provider = 'fastembed, + }, + + sync = { + auto_index = true, + }, +} +``` + +### Production Configuration + +```nickel +{ + graph = { + name = "Production Project", + version = "2.1.0", + description = "Production knowledge base with full features", + }, + + inheritance = { + base = "/Users/Akasha/Tools/.kogral-shared", + priority = 100, + }, + + storage = { + primary = 'filesystem, + secondary = { + enabled = true, + type = 'surrealdb, + url = "ws://db.example.com:8000", + namespace = "kogral", + database = "production", + }, + }, + + embeddings = { + enabled = true, + provider = 'openai, + model = "text-embedding-3-large", + api_key_env = "OPENAI_API_KEY", + }, + + query = { + similarity_threshold = 0.6, + max_results = 20, + cross_graph = true, + }, + + mcp = { + server = { + name = "production-kogral-mcp", + transport = 'stdio, + }, + tools = { + search = true, + add_note = true, + export = true, + }, + }, + + sync = { + auto_index = true, + watch_paths = ["notes", "decisions", "guidelines", "patterns"], + debounce_ms = 1000, + }, +} +``` + +## Configuration Sections + +### Graph Configuration + +Basic graph metadata: + +```nickel +graph = { + name | String, + version | String | default = "1.0.0", + description | String | default = "", +} +``` + +**Fields**: + +- `name` (required): Graph name identifier +- `version` (optional): Semantic version string (default: "1.0.0") +- `description` (optional): Human-readable description + +**Example**: + +```nickel +graph = { + name = "vapora-knowledge", + version = "1.2.0", + description = "Vapora project knowledge base", +} +``` + +### Inheritance Configuration + +Inherit guidelines and patterns from shared knowledge bases: + +```nickel +inheritance = { + base | String | default = "/Users/Akasha/Tools/.kogral-shared", + guidelines | Array String | default = [], + priority | Number | default = 100, +} +``` + +**Fields**: + +- `base`: Path to shared KOGRAL directory +- `guidelines`: Additional guideline paths to inherit +- `priority`: Override priority (higher wins) + +**Example**: + +```nickel +inheritance = { + base = "~/Tools/.kogral-shared", + guidelines = [ + "~/Tools/.claude/guidelines/rust", + "~/Tools/.claude/guidelines/nushell", + ], + priority = 150, # Project overrides shared +} +``` + +**Priority Rules**: +- 0-99: Shared guidelines (lowest priority) +- 100-199: Project guidelines (default) +- 200+: Critical project overrides + +### Storage Configuration + +Configure storage backends: + +```nickel +storage = { + primary | [| 'filesystem, 'memory |] | default = 'filesystem, + + secondary | { + enabled | Bool | default = false, + type | [| 'surrealdb, 'sqlite |] | default = 'surrealdb, + url | String | default = "ws://localhost:8000", + namespace | String | default = "kb", + database | String | default = "default", + } | default = {}, +} +``` + +**Fields**: + +- `primary`: Primary storage backend (`filesystem` or `memory`) +- `secondary.enabled`: Enable secondary backend for sync +- `secondary.type`: Secondary backend type +- `secondary.url`: Connection URL for SurrealDB +- `secondary.namespace`: SurrealDB namespace +- `secondary.database`: SurrealDB database name + +**Examples**: + +```nickel +# Filesystem only (default) +storage = { + primary = 'filesystem, +} + +# Filesystem with SurrealDB sync +storage = { + primary = 'filesystem, + secondary = { + enabled = true, + type = 'surrealdb, + url = "ws://localhost:8000", + namespace = "kogral", + database = "myproject", + }, +} + +# In-memory (development/testing) +storage = { + primary = 'memory, +} +``` + +### Embeddings Configuration + +Configure semantic search and embeddings: + +```nickel +embeddings = { + enabled | Bool | default = true, + provider | [| 'openai, 'claude, 'ollama, 'fastembed |] | default = 'fastembed, + model | String | default = "BAAI/bge-small-en-v1.5", + dimensions | Number | default = 384, + api_key_env | String | default = "OPENAI_API_KEY", +} +``` + +**Fields**: + +- `enabled`: Enable embedding generation +- `provider`: Embedding provider +- `model`: Model name/identifier +- `dimensions`: Embedding vector dimensions +- `api_key_env`: Environment variable for API key + +**Provider-Specific Settings**: + +**OpenAI**: + +```nickel +embeddings = { + enabled = true, + provider = 'openai, + model = "text-embedding-3-small", # or text-embedding-3-large + dimensions = 1536, + api_key_env = "OPENAI_API_KEY", +} +``` + +**Claude (Anthropic)**: + +```nickel +embeddings = { + enabled = true, + provider = 'claude, + model = "claude-3-embedding", + api_key_env = "ANTHROPIC_API_KEY", +} +``` + +**Ollama (local)**: + +```nickel +embeddings = { + enabled = true, + provider = 'ollama, + model = "nomic-embed-text", + dimensions = 768, +} +``` + +**fastembed (local)**: + +```nickel +embeddings = { + enabled = true, + provider = 'fastembed, + model = "BAAI/bge-small-en-v1.5", # or BAAI/bge-base-en-v1.5 + dimensions = 384, # 384 for small, 768 for base +} +``` + +### Template Configuration + +Configure document templates: + +```nickel +templates = { + templates_dir | String | default = "templates", + + templates | { + note | String | default = "note.md.tera", + decision | String | default = "decision.md.tera", + guideline | String | default = "guideline.md.tera", + pattern | String | default = "pattern.md.tera", + journal | String | default = "journal.md.tera", + execution | String | default = "execution.md.tera", + } | default = {}, + + export | { + logseq_page | String | default = "export/logseq-page.md.tera", + logseq_journal | String | default = "export/logseq-journal.md.tera", + summary | String | default = "export/summary.md.tera", + json | String | default = "export/graph.json.tera", + } | default = {}, + + custom | { _ | String } | default = {}, +} +``` + +**Fields**: + +- `templates_dir`: Directory containing templates +- `templates.*`: Template files for each node type +- `export.*`: Export format templates +- `custom`: Custom template registry + +**Example**: + +```nickel +templates = { + templates_dir = "custom-templates", + + templates = { + note = "my-note-template.md.tera", + journal = "daily-standup.md.tera", + }, + + custom = { + "meeting-notes" = "meeting-notes.md.tera", + "retrospective" = "retro.md.tera", + }, +} +``` + +### Query Configuration + +Configure search and query behavior: + +```nickel +query = { + similarity_threshold | Number | default = 0.4, + max_results | Number | default = 10, + recency_weight | Number | default = 3.0, + cross_graph | Bool | default = true, +} +``` + +**Fields**: + +- `similarity_threshold`: Minimum similarity for semantic matches (0-1) +- `max_results`: Maximum results to return +- `recency_weight`: Weight factor for recent documents +- `cross_graph`: Enable cross-graph queries + +**Example**: + +```nickel +query = { + similarity_threshold = 0.6, # Higher = more strict + max_results = 20, + recency_weight = 5.0, # Strongly prefer recent + cross_graph = true, # Search shared KOGRAL too +} +``` + +**Similarity Threshold Guide**: +- 0.0-0.3: Very loose (many false positives) +- 0.4-0.6: Balanced (recommended) +- 0.7-0.9: Strict (high precision) +- 0.9-1.0: Exact matches only + +### MCP Configuration + +Configure Model Context Protocol server: + +```nickel +mcp = { + server | { + name | String | default = "kogral-mcp", + version | String | default = "1.0.0", + transport | [| 'stdio, 'sse |] | default = 'stdio, + }, + + tools | { + search | Bool | default = true, + add_note | Bool | default = true, + add_decision | Bool | default = true, + link | Bool | default = true, + get_guidelines | Bool | default = true, + export | Bool | default = true, + } | default = {}, + + resources | { + expose_project | Bool | default = true, + expose_shared | Bool | default = true, + } | default = {}, +} +``` + +**Fields**: + +- `server.name`: MCP server identifier +- `server.transport`: Communication transport +- `tools.*`: Enable/disable specific tools +- `resources.*`: Expose resources + +**Example**: + +```nickel +mcp = { + server = { + name = "myproject-kogral-mcp", + transport = 'stdio, + }, + + tools = { + search = true, + add_note = true, + add_decision = false, # Disable if not needed + link = true, + get_guidelines = true, + export = true, + }, + + resources = { + expose_project = true, + expose_shared = false, # Hide shared KOGRAL + }, +} +``` + +### Sync Configuration + +Configure filesystem synchronization: + +```nickel +sync = { + auto_index | Bool | default = true, + watch_paths | Array String | default = ["notes", "decisions", "guidelines", "patterns", "journal"], + debounce_ms | Number | default = 500, +} +``` + +**Fields**: + +- `auto_index`: Automatically sync filesystem to storage +- `watch_paths`: Directories to watch for changes +- `debounce_ms`: Debounce delay for file system events + +**Example**: + +```nickel +sync = { + auto_index = true, + watch_paths = ["notes", "decisions", "guidelines"], # Exclude journal + debounce_ms = 1000, # 1 second debounce +} +``` + +## Environment Variables + +Some settings support environment variable expansion: + +| Variable | Purpose | Example | +| ---------- | --------- | --------- | +| `OPENAI_API_KEY` | OpenAI API authentication | `sk-...` | +| `ANTHROPIC_API_KEY` | Anthropic API authentication | `sk-ant-...` | +| `OLLAMA_API_BASE` | Ollama server URL | `http://localhost:11434` | +| `KOGRAL_SHARED_BASE` | Shared KOGRAL location | `~/Tools/.kogral-shared` | + +**Usage in config**: + +```nickel +embeddings = { + api_key_env = "OPENAI_API_KEY", # References environment variable +} +``` + +## Configuration Validation + +Validate configuration before use: + +```bash +# Export and validate +nickel export --format json .kogral/config.ncl + +# Test configuration +kogral config validate + +# Show effective configuration +kogral config show +``` + +## Configuration Inheritance + +Configurations can be composed: + +```nickel +# base.ncl +let BaseConfig = { + graph = { version = "1.0.0" }, + storage = { primary = 'filesystem }, +} + +# project-config.ncl +let base = import "base.ncl" in +base & { + graph = { + name = "My Project", + }, + embeddings = { + enabled = true, + }, +} +``` + +## Migration Guide + +### From TOML to Nickel + +Old TOML config: + +```toml +[graph] +name = "my-project" +version = "1.0.0" + +[embeddings] +enabled = true +provider = "fastembed" +``` + +New Nickel config: + +```nickel +{ + graph = { + name = "my-project", + version = "1.0.0", + }, + + embeddings = { + enabled = true, + provider = 'fastembed, + }, +} +``` + +## Advanced Patterns + +### Conditional Configuration + +```nickel +let is_production = std.string.is_match "prod" (std.env.get "ENV") in +{ + embeddings = { + provider = if is_production then 'openai else 'fastembed, + }, +} +``` + +### Configuration per Environment + +```nickel +# config/dev.ncl +{ embeddings = { provider = 'fastembed } } + +# config/prod.ncl +{ embeddings = { provider = 'openai } } + +# .kogral/config.ncl +let env = std.env.get_or_default "ENV" "dev" in +import ("config/" ++ env ++ ".ncl") +``` + +## Troubleshooting + +### Syntax Errors + +```bash +# Check Nickel syntax +nickel typecheck .kogral/config.ncl + +# Pretty-print to find errors +nickel export --format json .kogral/config.ncl | jq +``` + +### Schema Validation Failed + +Ensure all required fields are present: + +```nickel +# This will fail (missing name) +{ graph = { version = "1.0.0" } } + +# This works +{ graph = { name = "project", version = "1.0.0" } } +``` + +### Type Errors + +```nickel +# Wrong: string instead of enum +{ storage = { primary = "filesystem" } } # Error! + +# Correct: enum variant +{ storage = { primary = 'filesystem } } # Success +``` + +## See Also + +- [Nickel Language Documentation](https://nickel-lang.org/user-manual) +- [schemas/kogral-config.ncl](../../schemas/kogral-config.ncl) - Full schema definition +- [config/defaults.ncl](../../config/defaults.ncl) - Default configuration +- [config/production.ncl](../../config/production.ncl) - Production example