# Directory Structure ``` ├── .gitignore ├── .npmignore ├── docs │ ├── google-search-spec.md │ └── publish-npm.md ├── jest.config.mjs ├── LICENSE ├── package-lock.json ├── package.json ├── README.md ├── src │ ├── index.ts │ ├── tools │ │ ├── fetch.ts │ │ └── search.ts │ ├── toolsImpl │ │ ├── searchTool │ │ │ └── index.ts │ │ └── webFetchTool │ │ ├── htmlParser.ts │ │ ├── index.ts │ │ ├── scriptGenerator.ts │ │ └── types.ts │ ├── types │ │ └── search.ts │ └── utils │ ├── osascript.ts │ └── url.ts ├── test │ ├── data │ │ └── wikipedia.home.html │ ├── integration │ │ ├── web-fetch.test.ts │ │ └── web-search-tool.test.ts │ └── unit │ ├── web-fetch.test.ts │ └── web-search-url.test.ts └── tsconfig.json ``` # Files -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- ``` 1 | # Source 2 | src/ 3 | 4 | # Tests 5 | **/*.test.ts 6 | **/*.spec.ts 7 | coverage/ 8 | jest.config.js 9 | 10 | # Development configs 11 | .eslintrc 12 | .prettierrc 13 | tsconfig.json 14 | .editorconfig 15 | .git* 16 | 17 | # IDE 18 | .vscode/ 19 | .idea/ 20 | 21 | # Logs 22 | *.log 23 | npm-debug.log* 24 | 25 | # Dependencies 26 | node_modules/ 27 | 28 | # Misc 29 | .DS_Store 30 | *.env 31 | .env.* ``` -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- ``` 1 | # Dependencies 2 | node_modules/ 3 | .pnp/ 4 | .pnp.js 5 | 6 | # Production build 7 | dist/ 8 | build/ 9 | 10 | # TypeScript cache 11 | *.tsbuildinfo 12 | 13 | # Environment variables 14 | .env 15 | .env.local 16 | .env.development.local 17 | .env.test.local 18 | .env.production.local 19 | 20 | # Logs 21 | logs/ 22 | *.log 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # Editor directories and files 28 | .idea/ 29 | .vscode/ 30 | *.swp 31 | *.swo 32 | .DS_Store 33 | *.sublime-workspace 34 | *.sublime-project 35 | 36 | # Testing 37 | coverage/ 38 | 39 | # Temporary files 40 | *.tmp 41 | *.temp 42 | 43 | # Debug 44 | .debug/ 45 | 46 | # OS generated files 47 | .DS_Store 48 | .DS_Store? 49 | ._* 50 | .Spotlight-V100 51 | .Trashes 52 | ehthumbs.db 53 | Thumbs.db 54 | .aider* 55 | ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- ```markdown 1 | # MCP Chrome Google Search Tool 2 | 3 | MCP tool for Google search and webpage content extraction using Chrome browser. Works with Claude to enable Google search and content fetching capabilities. 4 | 5 | ## Quick Installation 6 | 7 | 1. **Configure Claude Desktop** 8 | - Open Claude Desktop on Mac 9 | - Go to Claude > Settings > Developer > Edit Config 10 | - Add the following to your config file: 11 | ```json 12 | { 13 | "mcpServers": { 14 | "mcp-chrome-google-search": { 15 | "command": "npx", 16 | "args": [ 17 | "-y", 18 | "@cmann50/mcp-chrome-google-search" 19 | ] 20 | } 21 | } 22 | } 23 | ``` 24 | - Restart Claude Desktop 25 | 26 | 2. **First Time Setup** 27 | - **Grant Accessibility Permissions** 28 | - On first run, approve macOS accessibility permissions prompt 29 | - Navigate to: System Preferences > Security & Privacy > Privacy > Accessibility 30 | - Add and enable permissions for your terminal app 31 | 32 | - **Enable Chrome JavaScript from Apple Events** 33 | - Open Chrome 34 | - Navigate to: View > Developer > Allow JavaScript from Apple Events 35 | - One-time setup only 36 | 37 | Once configured, Claude will be able to perform Google searches and extract webpage content through Chrome when you make requests. 38 | 39 | ## Key Advantages 40 | 41 | - Free to search google 42 | - Opens and small windows and uses your chrome browser, so should not get blocked 43 | - Since it is using your Chrome window it can access authenticated content. Claude can just open the URL in your browser. 44 | 45 | ## Platform Support 46 | - ✅ macOS 47 | - ❌ Windows (not supported) 48 | - ❌ Linux (not supported) 49 | 50 | ## Requirements 51 | 1. macOS 52 | 2. Google Chrome 53 | 3. Node.js 20 or higher 54 | 55 | ## Alternative Installation Methods 56 | 57 | ### NPX Installation 58 | ```bash 59 | npx mcp-chrome-google-search 60 | ``` 61 | 62 | 63 | ### Custom Installation 64 | 1. Checkout from git 65 | 2. Run `npm run build` 66 | 3. Add to Claude config (use absolute path): 67 | ```json 68 | { 69 | "google-tools": { 70 | "command": "node", 71 | "args": [ 72 | "/your/checkout/path/mcp/mcp-chrome-google-search/dist/index.js" 73 | ] 74 | } 75 | } 76 | ``` 77 | 78 | ## Local development 79 | 80 | To test changes locally bump package.json version and run 81 | to put it in edit mode: 82 | ``` 83 | npm install -g . 84 | ``` 85 | Then just do `npm run build` and the files will go in dist where claude is monitoring 86 | 87 | Then press ctrl-R in claude desktop, no need to restart it 88 | 89 | ## Debugging 90 | 91 | ### Log Monitoring 92 | ```bash 93 | # Follow logs in real-time 94 | tail -n 20 -F ~/Library/Logs/Claude/mcp*.log 95 | ``` 96 | 97 | ### Dev Tools Access 98 | 1. Enable developer settings: 99 | ```bash 100 | echo '{"allowDevTools": true}' > ~/Library/Application\ Support/Claude/developer_settings.json 101 | ``` 102 | 2. Open DevTools: Command-Option-Shift-i in Claude desktop 103 | 3. Use ctrl-r in Claude desktop while tailing for better errors 104 | 105 | ## Troubleshooting 106 | 107 | ### Chrome JavaScript Error 108 | If you see: 109 | ``` 110 | execution error: Google Chrome got an error: Executing JavaScript through AppleScript 111 | is turned off. For more information: https://support.google.com/chrome/?p=applescript (12) 112 | ``` 113 | 114 | Solution: 115 | 1. Open Chrome 116 | 2. View > Developer > Allow JavaScript from Apple Events 117 | 118 | ### Accessibility Permission Issues 119 | If Chrome control fails: 120 | 1. Open System Preferences 121 | 2. Security & Privacy > Privacy > Accessibility 122 | 3. Ensure terminal app is listed and enabled 123 | 4. Use lock icon to make changes if needed 124 | 125 | ## Implementation Details 126 | 127 | - Uses AppleScript for Chrome control 128 | - Visible automation - Chrome windows will open/navigate 129 | - Each request opens a new Chrome tab 130 | - Close unused tabs periodically for optimal performance 131 | - Only use with trusted Claude instances (has Chrome control access) 132 | 133 | ## Support 134 | 135 | - Create GitHub issues for problems 136 | - Include macOS and Chrome version details 137 | 138 | ## License 139 | 140 | MIT License - see LICENSE file for details ``` -------------------------------------------------------------------------------- /src/types/search.ts: -------------------------------------------------------------------------------- ```typescript 1 | export interface SearchParams { 2 | query_text: string; 3 | site?: string; 4 | timeframe?: 'h' | 'd' | 'w' | 'm' | 'y'; 5 | } 6 | 7 | export interface SearchResult { 8 | url: string; 9 | description: string; 10 | } ``` -------------------------------------------------------------------------------- /src/toolsImpl/webFetchTool/types.ts: -------------------------------------------------------------------------------- ```typescript 1 | export interface Link { 2 | text: string; 3 | url: string; 4 | } 5 | 6 | export interface ParsedContent { 7 | text: string; 8 | links: Link[]; 9 | } 10 | 11 | export interface WebContentOptions { 12 | includeLinks?: boolean; 13 | } ``` -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "ES2022", 5 | "moduleResolution": "node", 6 | "esModuleInterop": true, 7 | "outDir": "./dist", 8 | "rootDir": "./src", 9 | "strict": true 10 | }, 11 | "include": ["src/**/*"] 12 | } ``` -------------------------------------------------------------------------------- /docs/publish-npm.md: -------------------------------------------------------------------------------- ```markdown 1 | # Publishing Guide 2 | 3 | ## NPM 4 | ```bash 5 | # Update version 6 | npm version patch|minor|major 7 | 8 | # Build and publish 9 | npm run build 10 | npm publish --access public 11 | ``` 12 | 13 | ## GitHub 14 | ```bash 15 | # Push changes 16 | git add . 17 | git commit -m "feat: description" 18 | git push origin main 19 | 20 | # Push tags 21 | git push --tags 22 | ``` 23 | 24 | Note: Ensure you're logged into npm (`npm login`) and GitHub before publishing. ``` -------------------------------------------------------------------------------- /src/utils/osascript.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { execFile } from 'node:child_process'; 2 | import { promisify } from 'node:util'; 3 | 4 | const execFileAsync = promisify(execFile); 5 | 6 | export async function runOsascript(script: string): Promise<string> { 7 | // Set maxBuffer to 10MB (10 * 1024 * 1024) 8 | const { stdout } = await execFileAsync('osascript', ['-e', script], { 9 | maxBuffer: 10 * 1024 * 1024 10 | }); 11 | return stdout; 12 | } ``` -------------------------------------------------------------------------------- /jest.config.mjs: -------------------------------------------------------------------------------- ``` 1 | export default { 2 | preset: 'ts-jest', 3 | testEnvironment: 'node', 4 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], 5 | testMatch: ['**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[tj]s?(x)'], 6 | extensionsToTreatAsEsm: ['.ts'], 7 | transform: { 8 | '^.+\\.tsx?$': ['ts-jest', { 9 | useESM: true, 10 | }] 11 | }, 12 | moduleNameMapper: { 13 | '^(\\.{1,2}/.*)\\.js$': '$1', 14 | } 15 | }; ``` -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | #!/usr/bin/env node 2 | 3 | import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 4 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 5 | import { registerSearchTool } from './tools/search.js'; 6 | import { registerFetchTool } from './tools/fetch.js'; 7 | 8 | const server = new McpServer({ 9 | name: "mcp-chrome-google-search", 10 | version: "1.0.0", 11 | }); 12 | 13 | registerSearchTool(server); 14 | registerFetchTool(server); 15 | 16 | async function main() { 17 | const transport = new StdioServerTransport(); 18 | await server.connect(transport); 19 | console.error("MCP Chrome Google Search Server running on stdio"); 20 | } 21 | 22 | main().catch(error => { 23 | console.error("Fatal error:", error); 24 | process.exit(1); 25 | }); ``` -------------------------------------------------------------------------------- /src/utils/url.ts: -------------------------------------------------------------------------------- ```typescript 1 | import type { SearchParams } from '../types/search.js'; 2 | 3 | function formatDate(date: Date): string { 4 | return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`; 5 | } 6 | 7 | export function buildGoogleSearchUrl(params: SearchParams, pageNum: number = 0): string { 8 | // Build base query 9 | let searchQuery = params.query_text; 10 | 11 | // Add site restriction if specified 12 | if (params.site) { 13 | searchQuery = `site:${params.site} ${searchQuery}`; 14 | } 15 | 16 | // Base URL with encoded query and page number 17 | let url = `https://www.google.com/search?q=${encodeURIComponent(searchQuery)}&hl=en&start=${pageNum * 10}`; 18 | 19 | // Add time restriction if specified 20 | if (params.timeframe) { 21 | url += `&tbs=qdr:${params.timeframe}`; 22 | } 23 | 24 | return url; 25 | } ``` -------------------------------------------------------------------------------- /src/toolsImpl/webFetchTool/scriptGenerator.ts: -------------------------------------------------------------------------------- ```typescript 1 | export function generateAppleScript(url: string): string { 2 | const script = ` 3 | tell application "Google Chrome" 4 | make new window with properties {bounds:{50, 50, 425, 717}} 5 | set newWindow to window 1 6 | 7 | tell newWindow 8 | set URL of active tab to "${url}" 9 | end tell 10 | 11 | -- Return focus to Claude 12 | tell application "Claude" to activate 13 | 14 | -- Wait for page to load 15 | tell active tab of newWindow 16 | repeat until (loading is false) 17 | delay 0.1 18 | end repeat 19 | end tell 20 | 21 | -- Get page content 22 | tell active tab of newWindow 23 | set pageContent to (execute javascript "document.documentElement.outerHTML;") 24 | end tell 25 | 26 | -- Close the window 27 | close newWindow 28 | end tell 29 | 30 | return pageContent 31 | `; 32 | return script; 33 | } ``` -------------------------------------------------------------------------------- /src/toolsImpl/webFetchTool/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { runOsascript } from '../../utils/osascript.js'; 2 | import { generateAppleScript } from './scriptGenerator.js'; 3 | import { parseHtml } from './htmlParser.js'; 4 | import type { WebContentOptions } from './types.js'; 5 | 6 | export async function getWebContent(url: string, options: WebContentOptions = {}): Promise<string> { 7 | try { 8 | const script = generateAppleScript(url); 9 | const rawContent = await runOsascript(script); 10 | 11 | if (!rawContent) { 12 | throw new Error('No content received from page'); 13 | } 14 | 15 | const { text, links } = parseHtml(rawContent); 16 | 17 | if (!options.includeLinks || links.length === 0) { 18 | return text; 19 | } 20 | 21 | return `${text}\n\n=== Links ===\n${links.map(link => 22 | `${link.text} (${link.url})`).join('\n')}`; 23 | 24 | } catch (error: unknown) { 25 | throw new Error(`Failed to get web content: ${error instanceof Error ? error.message : String(error)}`); 26 | } 27 | } ``` -------------------------------------------------------------------------------- /docs/google-search-spec.md: -------------------------------------------------------------------------------- ```markdown 1 | # Google Search URL Specification 2 | 3 | ## Basic Search URLs 4 | 5 | ``` 6 | # Basic search 7 | https://www.google.com/search?q=news 8 | 9 | # Site-specific search 10 | https://www.google.com/search?q=site:apple.com+news 11 | 12 | # Site-specific search with time filter 13 | https://www.google.com/search?q=site:apple.com+news&tbs=qdr:d 14 | ``` 15 | 16 | ## Time Filter Parameters 17 | 18 | Relative time filters using `tbs=qdr:X`: 19 | ``` 20 | h : past hour 21 | d : past 24 hours 22 | w : past week 23 | m : past month 24 | y : past year 25 | ``` 26 | 27 | Custom date range using `tbs=cdr:1,cd_min:MM/DD/YYYY,cd_max:MM/DD/YYYY`: 28 | ``` 29 | Example: tbs=cdr:1,cd_min:12/1/2024,cd_max:12/31/2024 30 | ``` 31 | 32 | ## TypeScript Interface 33 | 34 | ```typescript 35 | interface SearchParams { 36 | query_text: string; // Plain text to search for (no Google operators) 37 | 38 | site?: string; // Optional site restriction (e.g. "apple.com") 39 | timeframe?: { 40 | type: 'relative'; // For qdr: filters 41 | period: 'h' | 'd' | 'w' | 'm' | 'y'; 42 | } | { 43 | type: 'custom'; // For custom date range 44 | startDate: Date; // Will be formatted as MM/DD/YYYY 45 | endDate: Date; 46 | }; 47 | } 48 | ``` 49 | 50 | Note: The query_text parameter and date portions in custom date ranges require URL encoding. ``` -------------------------------------------------------------------------------- /src/tools/fetch.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { z } from "zod"; 2 | import { getWebContent } from '../toolsImpl/webFetchTool/index.js'; 3 | import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 4 | 5 | export function registerFetchTool(server: McpServer) { 6 | server.tool( 7 | "web_fetch", 8 | "Extract readable text content from a webpage using Chrome browser automation.\n\nKey Features:\n- Returns main content text and optionally links", 9 | { 10 | url: z.string().url() 11 | .describe("Webpage URL to fetch (must include http:// or https://)"), 12 | 13 | includeLinks: z.boolean().optional().default(false) 14 | .describe("Whether to include extracted links in the output") 15 | }, 16 | async ({ url, includeLinks }) => { 17 | try { 18 | const content = await getWebContent(url, { includeLinks }); 19 | if (!content) { 20 | return { 21 | content: [{ 22 | type: "text", 23 | text: "Failed to retrieve web content" 24 | }] 25 | }; 26 | } 27 | 28 | // Ensure the content is properly formatted and trimmed 29 | const formattedContent = content.trim(); 30 | 31 | return { 32 | content: [{ 33 | type: "text", 34 | text: formattedContent 35 | }] 36 | }; 37 | } catch (error) { 38 | const errorMessage = error instanceof Error ? error.message : String(error); 39 | return { 40 | content: [{ 41 | type: "text", 42 | text: `Content fetch failed - please try again: ${errorMessage}`.trim() 43 | }] 44 | }; 45 | } 46 | } 47 | ); 48 | } ``` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "name": "@cmann50/mcp-chrome-google-search", 3 | "version": "1.0.6", 4 | "type": "module", 5 | "bin": { 6 | "mcp-chrome-google-search": "./dist/index.js" 7 | }, 8 | "files": [ 9 | "dist" 10 | ], 11 | "main": "dist/index.js", 12 | "scripts": { 13 | "build": "tsc && chmod +x dist/*.js", 14 | "prepare": "npm run build", 15 | "start": "node dist/index.js", 16 | "test": "NODE_OPTIONS=--experimental-vm-modules jest --config jest.config.mjs", 17 | "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --config jest.config.mjs --watch", 18 | "test:coverage": "NODE_OPTIONS=--experimental-vm-modules jest --config jest.config.mjs --coverage" 19 | }, 20 | "dependencies": { 21 | "@modelcontextprotocol/sdk": "^1.0.0", 22 | "@types/cheerio": "^0.22.35", 23 | "cheerio": "^1.0.0", 24 | "zod": "^3.22.0" 25 | }, 26 | "devDependencies": { 27 | "@types/jest": "^29.5.14", 28 | "@types/node": "^20.0.0", 29 | "jest": "^29.7.0", 30 | "ts-jest": "^29.2.5", 31 | "typescript": "^5.0.0" 32 | }, 33 | "types": "./dist/index.d.ts", 34 | "description": "MCP tool for Google search and webpage content extraction using Chrome browser. Works with Claude to enable Google search and content fetching capabilities.", 35 | "repository": { 36 | "type": "git", 37 | "url": "git+https://github.com/cmann50/mcp-chrome-google-search.git" 38 | }, 39 | "keywords": [ 40 | "mcp", 41 | "model-context-protocol", 42 | "claude-desktop-tool", 43 | "google-search", 44 | "chrome", 45 | "web-search", 46 | "macos", 47 | "browser-automation" 48 | ], 49 | "author": "Chris Mann", 50 | "license": "MIT", 51 | "bugs": { 52 | "url": "https://github.com/cmann50/mcp-chrome-google-search/issues" 53 | }, 54 | "homepage": "https://github.com/cmann50/mcp-chrome-google-search#readme" 55 | } 56 | ``` -------------------------------------------------------------------------------- /src/tools/search.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { z } from "zod"; 2 | import { performGoogleSearch } from '../toolsImpl/searchTool/index.js'; 3 | import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 4 | 5 | export function registerSearchTool(server: McpServer) { 6 | server.tool( 7 | "web-search", 8 | "Search webpages and get a specific page of results (each page has ~10 results). Optionally filter by site and timeframe.", 9 | { 10 | query_text: z.string().min(1).describe("Plain text to search for (no Google operators plain text only - use other parameters for site/date filtering)"), 11 | site: z.string().optional().describe("Limit search to specific domain (e.g. 'github.com' or 'docs.python.org')"), 12 | timeframe: z.enum(['h', 'd', 'w', 'm', 'y']).optional().describe("Time range filter (h=hour, d=day, w=week, m=month, y=year)"), 13 | pageNumber: z.number().min(1).max(5).optional().default(1).describe( 14 | "Which page of results to fetch (1-5). Each page contains ~10 results" 15 | ) 16 | }, 17 | async ({ query_text, site, timeframe, pageNumber }) => { 18 | console.error(`Executing Google search for: ${query_text} (page ${pageNumber})`); 19 | try { 20 | const searchParams = { query_text, site, timeframe }; 21 | const results = await performGoogleSearch(searchParams, pageNumber); 22 | 23 | return { 24 | content: [{ 25 | type: "text" as const, 26 | text: results 27 | }] 28 | }; 29 | } catch (error) { 30 | return { 31 | content: [{ 32 | type: "text" as const, 33 | text: `Search failed - please try again: ${error instanceof Error ? error.message : String(error)}` 34 | }], 35 | isError: true 36 | }; 37 | } 38 | } 39 | ); 40 | } 41 | ``` -------------------------------------------------------------------------------- /test/unit/web-fetch.test.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { jest } from '@jest/globals'; 2 | import fs from 'fs'; 3 | import path from 'path'; 4 | import { registerFetchTool } from '../../src/tools/fetch'; 5 | import { getWebContent } from '../../src/toolsImpl/webFetchTool'; 6 | import { generateAppleScript } from '../../src/toolsImpl/webFetchTool/scriptGenerator'; 7 | import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 8 | 9 | // Define the type for the tool callback 10 | type WebFetchCallback = (params: { url: string; includeLinks?: boolean }) => Promise<{ 11 | content: Array<{ type: string; text: string }>; 12 | }>; 13 | 14 | // Mock the script generator 15 | jest.mock('../../src/toolsImpl/webFetchTool/scriptGenerator'); 16 | 17 | // Mock utils/osascript 18 | jest.mock('../../src/utils/osascript', () => ({ 19 | runOsascript: jest.fn().mockImplementation(async () => { 20 | // Read the fixture file 21 | const fixturePath = path.join(__dirname, '../data/wikipedia.home.html'); 22 | return fs.readFileSync(fixturePath, 'utf-8'); 23 | }) 24 | })); 25 | 26 | describe('Web Fetch Tool', () => { 27 | const mockServer = { 28 | tool: jest.fn() 29 | }; 30 | 31 | beforeEach(() => { 32 | jest.clearAllMocks(); 33 | }); 34 | 35 | it('should fetch and process web content', async () => { 36 | // Register the tool 37 | registerFetchTool(mockServer as unknown as McpServer); 38 | 39 | // Get the callback function that was passed to mockServer.tool 40 | const toolCallback = mockServer.tool.mock.calls[0][3] as WebFetchCallback; 41 | 42 | // Call the callback with test parameters 43 | const result = await toolCallback({ 44 | url: 'https://wikipedia.org', 45 | includeLinks: true 46 | }); 47 | 48 | // Print the returned text for now 49 | console.log('Returned content:', result.content[0].text); 50 | 51 | // Basic assertions 52 | expect(result).toBeDefined(); 53 | expect(result.content).toBeInstanceOf(Array); 54 | expect(result.content[0].type).toBe('text'); 55 | expect(result.content[0].text).toBeTruthy(); 56 | }); 57 | 58 | // Add more test cases as needed 59 | }); 60 | ``` -------------------------------------------------------------------------------- /test/integration/web-fetch.test.ts: -------------------------------------------------------------------------------- ```typescript 1 | import {getWebContent} from '../../src/toolsImpl/webFetchTool'; 2 | 3 | describe('web-fetch Tool', () => { 4 | it('should fetch and parse content from a URL', async () => { 5 | const url = 'https://apple.com'; 6 | 7 | try { 8 | console.log('Test: Calling getWebContent with URL:', url); 9 | const result = await getWebContent(url); 10 | console.log('Test: Received result type:', typeof result); 11 | console.log('Test: Result length:', result?.length); 12 | console.log('Test: Raw result:', result); 13 | 14 | // Check that we got content 15 | expect(result).toBeTruthy(); 16 | expect(result.length).toBeGreaterThan(0); 17 | 18 | // Basic content validation - apple.com should contain Apple-related content 19 | expect(result.toLowerCase()).toMatch(/apple|iphone|mac|ipad/); 20 | 21 | // Log the results for inspection 22 | console.log('Web Content Results:'); 23 | console.log('-----------------'); 24 | console.log(result); 25 | console.log('-----------------'); 26 | 27 | } catch (error: unknown) { 28 | const errorMessage = error instanceof Error ? error.message : String(error); 29 | throw new Error('Should not throw an error: ' + errorMessage); 30 | } 31 | }, 30000); 32 | 33 | it('should include links when requested', async () => { 34 | const url = 'https://apple.com'; 35 | 36 | const result = await getWebContent(url, {includeLinks: true}); 37 | 38 | // Check for links section and content 39 | expect(result).toBeTruthy(); 40 | expect(result.length).toBeGreaterThan(0); 41 | 42 | // If we have links, they should be properly formatted 43 | if (result.includes('=== Links ===')) { 44 | expect(result).toMatch(/\([^)]+\)/); 45 | } 46 | 47 | console.log('Content with Links:'); 48 | console.log('-----------------'); 49 | console.log(result); 50 | console.log('-----------------'); 51 | }, 30000); 52 | 53 | 54 | }); ``` -------------------------------------------------------------------------------- /src/toolsImpl/webFetchTool/htmlParser.ts: -------------------------------------------------------------------------------- ```typescript 1 | import * as cheerio from 'cheerio'; 2 | import type { ParsedContent, Link } from './types.js'; 3 | 4 | export function parseHtml(htmlContent: string): ParsedContent { 5 | const $ = cheerio.load(htmlContent); 6 | 7 | // Only remove script and style elements 8 | $('script, style').remove(); 9 | 10 | // Get meaningful content from the body 11 | const mainContent: string[] = []; 12 | 13 | // Process main content areas 14 | $('body').find('*').each((_, elem) => { 15 | const $elem = $(elem); 16 | 17 | // Skip hidden elements 18 | if ($elem.css('display') === 'none' || $elem.css('visibility') === 'hidden') { 19 | return; 20 | } 21 | 22 | // Get direct text nodes only (not nested text) 23 | const directText = $elem.clone().children().remove().end().text().trim(); 24 | if (directText && directText.length > 0) { 25 | mainContent.push(directText); 26 | } 27 | }); 28 | 29 | // Extract links 30 | const links: Link[] = []; 31 | const seenUrls = new Set<string>(); 32 | const seenTexts = new Set<string>(); 33 | 34 | $('a[href]').each((_, elem) => { 35 | const $elem = $(elem); 36 | const url = $elem.attr('href')?.trim(); 37 | const text = $elem.text().trim(); 38 | 39 | if (!url || !text || seenUrls.has(url) || seenTexts.has(text)) return; 40 | 41 | // Skip javascript: and other non-http links 42 | if (!url.startsWith('javascript:') && 43 | !url.startsWith('tel:') && 44 | !url.startsWith('mailto:') && 45 | text.length > 2) { 46 | 47 | // Normalize URLs 48 | let finalUrl = url; 49 | if (url.startsWith('//')) { 50 | finalUrl = 'https:' + url; 51 | } else if (url.startsWith('/')) { 52 | // Handle relative URLs later when we have base URL 53 | finalUrl = url; 54 | } 55 | 56 | links.push({ text, url: finalUrl }); 57 | seenUrls.add(finalUrl); 58 | seenTexts.add(text); 59 | } 60 | }); 61 | 62 | // Clean and format the content 63 | const text = mainContent 64 | .filter(section => section.length > 0) 65 | .map(section => section 66 | .replace(/\\s+/g, ' ') // Normalize whitespace 67 | .trim()) 68 | .join('\\n') 69 | .replace(/\\n{3,}/g, '\\n\\n') // Max 2 newlines in a row 70 | .trim(); 71 | 72 | return { 73 | text: text || 'No content found on the page.', 74 | links: links.slice(0, 50) // Include more links 75 | }; 76 | } ``` -------------------------------------------------------------------------------- /test/unit/web-search-url.test.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { buildGoogleSearchUrl } from '../../src/utils/url'; 2 | import type { SearchParams } from '../../src/types/search'; 3 | 4 | describe('web-search URL Generation', () => { 5 | it('generates basic search URL', () => { 6 | const params: SearchParams = { 7 | query_text: 'plain search text' 8 | }; 9 | const url = buildGoogleSearchUrl(params); 10 | expect(url).toBe('https://www.google.com/search?q=plain%20search%20text&hl=en&start=0'); 11 | }); 12 | 13 | it('generates URL with site filter', () => { 14 | const params: SearchParams = { 15 | query_text: 'search text', 16 | site: 'example.com' 17 | }; 18 | const url = buildGoogleSearchUrl(params); 19 | expect(url).toBe('https://www.google.com/search?q=site%3Aexample.com%20search%20text&hl=en&start=0'); 20 | }); 21 | 22 | it('generates URLs with time filters', () => { 23 | const periods: Array<'h' | 'd' | 'w' | 'm' | 'y'> = ['h', 'd', 'w', 'm', 'y']; 24 | 25 | periods.forEach(period => { 26 | const params: SearchParams = { 27 | query_text: 'news', 28 | timeframe: period 29 | }; 30 | const url = buildGoogleSearchUrl(params); 31 | expect(url).toBe(`https://www.google.com/search?q=news&hl=en&start=0&tbs=qdr:${period}`); 32 | }); 33 | }); 34 | 35 | it('generates URLs for different pages', () => { 36 | const params: SearchParams = { 37 | query_text: 'test search' 38 | }; 39 | 40 | // Test zero-based page numbers (0 = first page, 1 = second page, etc) 41 | const testCases = [ 42 | { pageNum: 0, expected: 'https://www.google.com/search?q=test%20search&hl=en&start=0' }, 43 | { pageNum: 1, expected: 'https://www.google.com/search?q=test%20search&hl=en&start=10' }, 44 | { pageNum: 2, expected: 'https://www.google.com/search?q=test%20search&hl=en&start=20' } 45 | ]; 46 | 47 | testCases.forEach(({ pageNum, expected }) => { 48 | const url = buildGoogleSearchUrl(params, pageNum); 49 | expect(url).toBe(expected); 50 | }); 51 | }); 52 | 53 | it('combines site filter with time filter', () => { 54 | const params: SearchParams = { 55 | query_text: 'release notes', 56 | site: 'github.com', 57 | timeframe: 'm' 58 | }; 59 | const url = buildGoogleSearchUrl(params); 60 | expect(url).toBe('https://www.google.com/search?q=site%3Agithub.com%20release%20notes&hl=en&start=0&tbs=qdr:m'); 61 | }); 62 | }); ``` -------------------------------------------------------------------------------- /src/toolsImpl/searchTool/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { runOsascript } from '../../utils/osascript.js'; 2 | import { buildGoogleSearchUrl } from '../../utils/url.js'; 3 | import type { SearchParams, SearchResult } from '../../types/search.js'; 4 | import * as cheerio from 'cheerio'; 5 | 6 | function parseHtml(html: string): SearchResult[] { 7 | const $ = cheerio.load(html); 8 | const results: SearchResult[] = []; 9 | 10 | // Find all main result containers 11 | $('.g').each((_, resultDiv) => { 12 | // Look for the first link in this container 13 | const link = $(resultDiv).find('a').first(); 14 | const href = link.attr('href'); 15 | 16 | // Find the description - it's typically the last text block in the container 17 | const description = $(resultDiv).find('div[style*="-webkit-line-clamp"], div.VwiC3b, .aCOpRe').text(); 18 | 19 | if (href?.startsWith('http') && 20 | !href.includes('google.com') && 21 | description.trim().length > 0) { 22 | results.push({ 23 | url: href, 24 | description: description.trim() 25 | }); 26 | } 27 | }); 28 | 29 | return results; 30 | } 31 | 32 | async function fetchSearchPage(searchParams: SearchParams, pageNumber: number): Promise<SearchResult[]> { 33 | // Convert 1-based page number to 0-based for URL 34 | const pageIndex = pageNumber - 1; 35 | const searchUrl = buildGoogleSearchUrl(searchParams, pageIndex); 36 | 37 | const script = ` 38 | tell application "Google Chrome" 39 | make new window with properties {bounds:{50, 50, 425, 717}} 40 | set newWindow to window 1 41 | 42 | tell newWindow 43 | set URL of active tab to "${searchUrl}" 44 | end tell 45 | 46 | -- Return focus to Claude 47 | tell application "Claude" to activate 48 | 49 | -- Wait for page to load 50 | tell active tab of newWindow 51 | repeat until (loading is false) 52 | delay 0.1 53 | end repeat 54 | end tell 55 | 56 | -- Get page content 57 | tell active tab of newWindow 58 | set pageContent to (execute javascript "document.documentElement.outerHTML;") 59 | end tell 60 | 61 | -- Close the window 62 | close newWindow 63 | end tell 64 | 65 | return pageContent 66 | `; 67 | 68 | const html = await runOsascript(script); 69 | return parseHtml(html); 70 | } 71 | 72 | export async function performGoogleSearch(searchParams: SearchParams, pages: number = 1): Promise<string> { 73 | try { 74 | const allResults: SearchResult[] = []; 75 | 76 | // Fetch results from multiple pages 77 | for (let page = 1; page <= pages; page++) { 78 | const pageResults = await fetchSearchPage(searchParams, page); 79 | allResults.push(...pageResults); 80 | 81 | // Add a small delay between page fetches 82 | if (page < pages) { 83 | await new Promise(resolve => setTimeout(resolve, 1000)); 84 | } 85 | } 86 | 87 | return allResults.map(r => `${r.url}\n${r.description}`).join('\n\n'); 88 | } catch (error: unknown) { 89 | const errorMessage = error instanceof Error ? error.message : String(error); 90 | throw new Error(`Failed to perform Google search: ${errorMessage}`); 91 | } 92 | } ``` -------------------------------------------------------------------------------- /test/integration/web-search-tool.test.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { performGoogleSearch } from '../../src/toolsImpl/searchTool'; 2 | import type { SearchParams } from '../../src/types/search'; 3 | 4 | describe('web-search Tool', () => { 5 | it('should perform a basic search and return results', async () => { 6 | const searchParams: SearchParams = { 7 | query_text: 'integration test search' 8 | }; 9 | 10 | try { 11 | const result = await performGoogleSearch(searchParams, 1); 12 | expect(result.length).toBeGreaterThan(0); 13 | 14 | const blocks = result.split('\n\n'); 15 | expect(blocks.length).toBeGreaterThan(1); 16 | 17 | blocks.forEach((block: string) => { 18 | const [url, description] = block.split('\n'); 19 | expect(url).toMatch(/^https?:\/\/.+/); 20 | expect(description?.length).toBeGreaterThan(0); 21 | }); 22 | 23 | } catch (error: unknown) { 24 | const errorMessage = error instanceof Error ? error.message : String(error); 25 | throw new Error('Search should succeed: ' + errorMessage); 26 | } 27 | }, 30000); 28 | 29 | it('should handle site filtering', async () => { 30 | const searchParams: SearchParams = { 31 | query_text: 'documentation', 32 | site: 'nodejs.org' 33 | }; 34 | 35 | try { 36 | const result = await performGoogleSearch(searchParams, 1); 37 | expect(result.length).toBeGreaterThan(0); 38 | 39 | const blocks = result.split('\n\n'); 40 | blocks.forEach((block: string) => { 41 | const [url] = block.split('\n'); 42 | expect(url).toContain('nodejs.org'); 43 | }); 44 | 45 | } catch (error: unknown) { 46 | const errorMessage = error instanceof Error ? error.message : String(error); 47 | throw new Error('Search with site filter should succeed: ' + errorMessage); 48 | } 49 | }, 30000); 50 | 51 | it('should handle time filtering', async () => { 52 | const searchParams: SearchParams = { 53 | query_text: 'news', 54 | timeframe: 'd' 55 | }; 56 | 57 | try { 58 | const result = await performGoogleSearch(searchParams, 1); 59 | expect(result.length).toBeGreaterThan(0); 60 | 61 | const blocks = result.split('\n\n'); 62 | expect(blocks.length).toBeGreaterThan(1); 63 | 64 | } catch (error: unknown) { 65 | const errorMessage = error instanceof Error ? error.message : String(error); 66 | throw new Error('Search with time filter should succeed: ' + errorMessage); 67 | } 68 | }, 30000); 69 | 70 | it('should successfully fetch multiple pages of results', async () => { 71 | const searchParams: SearchParams = { 72 | query_text: 'latest news' 73 | }; 74 | 75 | try { 76 | // Test fetching 3 different pages 77 | for (let page = 1; page <= 3; page++) { 78 | const results = await performGoogleSearch(searchParams, page); 79 | 80 | // Basic validation that we got results 81 | expect(results.length).toBeGreaterThan(0); 82 | expect(results.split('\n\n').length).toBeGreaterThan(1); 83 | } 84 | } catch (error: unknown) { 85 | const errorMessage = error instanceof Error ? error.message : String(error); 86 | throw new Error('Failed to fetch multiple pages: ' + errorMessage); 87 | } 88 | }, 30000); 89 | }); ``` -------------------------------------------------------------------------------- /test/data/wikipedia.home.html: -------------------------------------------------------------------------------- ```html 1 | <!DOCTYPE html> 2 | <html lang="en" class="no-js"> 3 | <head> 4 | <meta charset="utf-8"> 5 | <title>Wikipedia</title> 6 | <meta name="description" content="Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation."> 7 | <script> 8 | document.documentElement.className = document.documentElement.className.replace( /(^|\s)no-js(\s|$)/, "$1js-enabled$2" ); 9 | </script> 10 | <meta name="viewport" content="initial-scale=1,user-scalable=yes"> 11 | <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png"> 12 | <link rel="shortcut icon" href="/static/favicon/wikipedia.ico"> 13 | <link rel="license" href="//creativecommons.org/licenses/by-sa/4.0/"> 14 | <style> 15 | .sprite{background-image:linear-gradient(transparent,transparent),url(portal/wikipedia.org/assets/img/sprite-de847d1a.svg);background-repeat:no-repeat;display:inline-block;vertical-align:middle}.svg-Commons-logo_sister{background-position:0 0;width:47px;height:47px}.svg-MediaWiki-logo_sister{background-position:0 -47px;width:42px;height:42px}.svg-Meta-Wiki-logo_sister{background-position:0 -89px;width:37px;height:37px}.svg-Wikibooks-logo_sister{background-position:0 -126px;width:37px;height:37px}.svg-Wikidata-logo_sister{background-position:0 -163px;width:49px;height:49px}.svg-Wikifunctions-logo_sister{background-position:0 -212px;width:50px;height:50px}.svg-Wikimedia-logo_black{background-position:0 -262px;width:42px;height:42px}.svg-Wikipedia_wordmark{background-position:0 -304px;width:176px;height:32px}.svg-Wikiquote-logo_sister{background-position:0 -336px;width:42px;height:42px}.svg-Wikisource-logo_sister{background-position:0 -378px;width:39px;height:39px}.svg-Wikispecies-logo_sister{background-position:0 -417px;width:42px;height:42px}.svg-Wikiversity-logo_sister{background-position:0 -459px;width:43px;height:37px}.svg-Wikivoyage-logo_sister{background-position:0 -496px;width:36px;height:36px}.svg-Wiktionary-logo_sister{background-position:0 -532px;width:37px;height:37px}.svg-arrow-down{background-position:0 -569px;width:12px;height:8px}.svg-arrow-down-blue{background-position:0 -577px;width:14px;height:14px}.svg-badge_google_play_store{background-position:0 -591px;width:124px;height:38px}.svg-badge_ios_app_store{background-position:0 -629px;width:110px;height:38px}.svg-language-icon{background-position:0 -667px;width:22px;height:22px}.svg-noimage{background-position:0 -689px;width:58px;height:58px}.svg-search-icon{background-position:0 -747px;width:22px;height:22px}.svg-wikipedia_app_tile{background-position:0 -769px;width:42px;height:42px} 16 | </style> 17 | <style> 18 | html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size:62.5%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:32px;font-size:3.2rem;margin:1.2rem 0}mark{background:#fef6e7;color:#101418}small{font-size:13px;font-size:1.3rem}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}figure{margin:1.6rem 4rem}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:14px;font-size:1.4rem}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:none;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=search]:focus{outline-offset:-2px}fieldset{border:1px solid #a2a9b1;margin:0 .2rem;padding:.6rem 1rem 1.2rem}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.hidden,[hidden]{display:none!important}.screen-reader-text{display:block;position:absolute!important;clip:rect(1px,1px,1px,1px);width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden}body{background-color:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Inter,Helvetica,Arial,sans-serif;font-size:14px;font-size:1.4rem;line-height:1.5;margin:.4rem 0 1.6rem}main{padding:0 1.28rem}a{-ms-touch-action:manipulation;touch-action:manipulation}a,a:active,a:focus{unicode-bidi:embed;outline:0;color:#36c;text-decoration:none}a:focus{outline:1px solid #36c}a:hover{text-decoration:underline}img{vertical-align:middle}hr,img{border:0}hr{clear:both;height:0;border-bottom:1px solid #c8ccd1;margin:.26rem 0}.pure-button{display:inline-block;zoom:1;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#f8f9fa;color:#202122;position:relative;min-height:19.2px;min-height:1.92rem;min-width:16px;min-width:1.6rem;margin:.16rem 0;border:1px solid #a2a9b1;-moz-border-radius:2px;border-radius:2px;padding:.8rem 1.6rem;font-family:inherit;font-size:inherit;font-weight:700;text-decoration:none;vertical-align:top;-webkit-transition:background .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;-o-transition:background .1s ease,color .1s ease,border-color .1s ease,box-shadow .1s ease;-moz-transition:background .1s ease,color .1s ease,border-color .1s ease,box-shadow .1s ease,-moz-box-shadow .1s ease;transition:background .1s ease,color .1s ease,border-color .1s ease,box-shadow .1s ease;transition:background .1s ease,color .1s ease,border-color .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease,-moz-box-shadow .1s ease}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-hover,.pure-button:hover{background-color:#fff;border-color:#a2a9b1;color:#404244}.pure-button-active,.pure-button:active{background-color:#eaecf0;border-color:#72777d;color:#101418}.pure-button:focus{outline:1px solid transparent;border-color:#36c;-webkit-box-shadow:inset 0 0 0 1px #36c;-moz-box-shadow:inset 0 0 0 1px #36c;box-shadow:inset 0 0 0 1px #36c}.pure-button-primary-progressive{background-color:#36c;border-color:#6485d1;color:#fff}.pure-button-primary-progressive:hover{background:#3056a9;border-color:#3056a9}.pure-button-primary-progressive:active{background-color:#233566;border-color:#233566;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;color:#fff}.pure-button-primary-progressive:focus{-webkit-box-shadow:inset 0 0 0 1px #36c,inset 0 0 0 2px #fff;-moz-box-shadow:inset 0 0 0 1px #36c,inset 0 0 0 2px #fff;box-shadow:inset 0 0 0 1px #36c,inset 0 0 0 2px #fff;border-color:#36c}.pure-form input[type=search]{background-color:#fff;display:inline-block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #a2a9b1;-moz-border-radius:2px;border-radius:2px;padding:.8rem;-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;vertical-align:middle}.pure-form input:focus:invalid{color:#bf3c2c;border-color:#f54739}.pure-form fieldset{margin:0;padding:.56rem 0 1.2rem;border:0}@media only screen and (max-width:480px){.pure-form input[type=search]{display:block}}.central-textlogo-wrapper{display:inline-block;vertical-align:bottom}.central-textlogo{position:relative;margin:4rem auto .5rem;width:270px;font-family:Linux Libertine,Hoefler Text,Georgia,Times New Roman,Times,serif;font-size:30px;font-size:3rem;font-weight:400;line-height:33px;line-height:3.3rem;text-align:center;-moz-font-feature-settings:"ss05=1";-moz-font-feature-settings:"ss05";-webkit-font-feature-settings:"ss05";-ms-font-feature-settings:"ss05";font-feature-settings:"ss05"}.localized-slogan{display:block;font-family:Linux Libertine,Georgia,Times,"Source Serif Pro",serif;font-size:15px;font-size:1.5rem;font-weight:400}.central-textlogo__image{color:transparent;display:inline-block;overflow:hidden;text-indent:-10000px}.central-featured-logo{position:absolute;top:158px;left:35px}@media (max-width:480px){.central-textlogo{position:relative;height:70px;width:auto;margin:2rem 0 0;text-align:center;line-height:25px;line-height:2.5rem;text-indent:-10px;text-indent:-1rem;font-size:1em}.central-textlogo-wrapper{position:relative;top:12px;text-indent:2px;text-indent:.2rem}.svg-Wikipedia_wordmark{width:150px;height:25px;background-position:0 -260px;-webkit-background-size:100% 100%;-moz-background-size:100%;background-size:100%}.localized-slogan{font-size:14px;font-size:1.4rem}.central-featured-logo{position:relative;display:inline-block;width:57px;height:auto;left:0;top:0}}@media (max-width:240px){.central-textlogo__image{height:auto}}.central-featured{position:relative;height:325px;height:32.5rem;width:546px;width:54.6rem;max-width:100%;margin:0 auto;text-align:center;vertical-align:middle}.central-featured-lang{position:absolute;width:156px;width:15.6rem}.central-featured-lang .link-box{display:block;padding:0;text-decoration:none;white-space:normal}.central-featured-lang .link-box:hover strong{text-decoration:underline}.central-featured-lang :hover{background-color:#eaecf0}.central-featured-lang strong{display:block;font-size:16px;font-size:1.6rem}.central-featured-lang small{color:#54595d;display:inline-block;font-size:13px;font-size:1.3rem;line-height:1.6}.central-featured-lang em{font-style:italic}.central-featured-lang .emNonItalicLang{font-style:normal}.lang1{top:0;right:60%}.lang2{top:0;left:60%}.lang3{top:20%;right:70%}.lang4{top:20%;left:70%}.lang5{top:40%;right:72%}.lang6{top:40%;left:72%}.lang7{top:60%;right:70%}.lang8{top:60%;left:70%}.lang9{top:80%;right:60%}.lang10{top:80%;left:60%}@media (max-width:480px){.central-featured{width:auto;height:auto;margin-top:8rem;font-size:13px;font-size:1.3rem;text-align:left}.central-featured:after{content:" ";display:block;visibility:hidden;clear:both;height:0;font-size:0}.central-featured-lang{display:block;float:left;position:relative;top:auto;left:auto;right:auto;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:64px;height:6.4rem;width:33%;margin:0 0 16px;padding:0 1.6rem;font-size:14px;font-size:1.4rem;text-align:center}.central-featured-lang strong{font-size:14px;font-size:1.4rem;margin-bottom:4px}.central-featured-lang small{line-height:1.4}}@media (max-width:375px){.central-featured-lang{font-size:13px;font-size:1.3rem}}@media (max-width:240px){.central-featured-lang{width:100%}}.search-container{float:none;max-width:95%;width:540px;margin:.4rem auto 1.95rem;text-align:center;vertical-align:middle}.search-container fieldset{word-spacing:-4px}.search-container button{min-height:44px;min-height:4.4rem;margin:0;-moz-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;padding:.8rem 1.6rem;font-size:16px;font-size:1.6rem;z-index:2}.search-container button .svg-search-icon{text-indent:-9999px}.search-container input[type=search]::-webkit-search-results-button,.search-container input[type=search]::-webkit-search-results-decoration{-webkit-appearance:none}.search-container input::-webkit-calendar-picker-indicator{display:none}.search-container .sprite.svg-arrow-down{position:absolute;top:8px;top:.8rem;right:6px;right:.6rem}#searchInput{-webkit-appearance:none;width:100%;height:44px;height:4.4rem;border-width:1px 0 1px 1px;-moz-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;padding:.8rem 9.6rem .8rem 1.2rem;font-size:16px;font-size:1.6rem;line-height:1.6;-webkit-transition:background .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;-o-transition:background .1s ease,border-color .1s ease,box-shadow .1s ease;-moz-transition:background .1s ease,border-color .1s ease,box-shadow .1s ease,-moz-box-shadow .1s ease;transition:background .1s ease,border-color .1s ease,box-shadow .1s ease;transition:background .1s ease,border-color .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease,-moz-box-shadow .1s ease}#searchInput:hover{border-color:#72777d}#searchInput:focus{border-color:#6485d1;-webkit-box-shadow:inset 0 0 0 1px #36c;-moz-box-shadow:inset 0 0 0 1px #36c;box-shadow:inset 0 0 0 1px #36c;outline:1px solid transparent}.search-container .search-input{display:inline-block;position:relative;width:73%;vertical-align:top}@media only screen and (max-width:480px){.search-container .pure-form fieldset{margin-left:1rem;margin-right:6.6rem}.search-container .search-input{width:100%;margin-right:-6.6rem}.search-container .pure-form button{float:right;right:-56px;right:-5.6rem}}.suggestions-dropdown{background-color:#fff;display:inline-block;position:absolute;left:0;z-index:2;margin:0;padding:0;border:1px solid #a2a9b1;border-top:0;-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,.2);-moz-box-shadow:0 2px 2px 0 rgba(0,0,0,.2);box-shadow:0 2px 2px 0 rgba(0,0,0,.2);list-style-type:none;word-spacing:normal}.suggestion-link,.suggestions-dropdown{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;text-align:left}.suggestion-link{display:block;position:relative;min-height:70px;min-height:7rem;padding:1rem 1rem 1rem 8.5rem;border-bottom:1px solid #eaecf0;color:inherit;text-decoration:none;text-align:initial;white-space:normal}.suggestion-link.active{background-color:#f1f4fd}a.suggestion-link:hover{text-decoration:none}a.suggestion-link:active,a.suggestion-link:focus{outline:0;white-space:normal}.suggestion-thumbnail{background-color:#eaecf0;background-image:url(portal/wikipedia.org/assets/img/noimage.png);background-image:-webkit-linear-gradient(transparent,transparent),url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 56 56'%3E%3Cpath fill='%23eee' d='M0 0h56v56H0z'/%3E%3Cpath fill='%23999' d='M36.4 13.5H17.8v24.9c0 1.4.9 2.3 2.3 2.3h18.7v-25c.1-1.4-1-2.2-2.4-2.2zM30.2 17h5.1v6.4h-5.1V17zm-8.8 0h6v1.8h-6V17zm0 4.6h6v1.8h-6v-1.8zm0 15.5v-1.8h13.8v1.8H21.4zm13.8-4.5H21.4v-1.8h13.8v1.8zm0-4.7H21.4v-1.8h13.8v1.8z'/%3E%3C/svg%3E");background-image:-webkit-linear-gradient(transparent,transparent),url(portal/wikipedia.org/assets/img/noimage.svg) !ie;background-image:-webkit-gradient(linear,left top,left bottom,from(transparent),to(transparent)),url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 56 56'%3E%3Cpath fill='%23eee' d='M0 0h56v56H0z'/%3E%3Cpath fill='%23999' d='M36.4 13.5H17.8v24.9c0 1.4.9 2.3 2.3 2.3h18.7v-25c.1-1.4-1-2.2-2.4-2.2zM30.2 17h5.1v6.4h-5.1V17zm-8.8 0h6v1.8h-6V17zm0 4.6h6v1.8h-6v-1.8zm0 15.5v-1.8h13.8v1.8H21.4zm13.8-4.5H21.4v-1.8h13.8v1.8zm0-4.7H21.4v-1.8h13.8v1.8z'/%3E%3C/svg%3E");background-image:-moz- oldlinear-gradient(transparent,transparent),url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 56 56'%3E%3Cpath fill='%23eee' d='M0 0h56v56H0z'/%3E%3Cpath fill='%23999' d='M36.4 13.5H17.8v24.9c0 1.4.9 2.3 2.3 2.3h18.7v-25c.1-1.4-1-2.2-2.4-2.2zM30.2 17h5.1v6.4h-5.1V17zm-8.8 0h6v1.8h-6V17zm0 4.6h6v1.8h-6v-1.8zm0 15.5v-1.8h13.8v1.8H21.4zm13.8-4.5H21.4v-1.8h13.8v1.8zm0-4.7H21.4v-1.8h13.8v1.8z'/%3E%3C/svg%3E");background-image:-o-linear-gradient(transparent,transparent),url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 56 56'%3E%3Cpath fill='%23eee' d='M0 0h56v56H0z'/%3E%3Cpath fill='%23999' d='M36.4 13.5H17.8v24.9c0 1.4.9 2.3 2.3 2.3h18.7v-25c.1-1.4-1-2.2-2.4-2.2zM30.2 17h5.1v6.4h-5.1V17zm-8.8 0h6v1.8h-6V17zm0 4.6h6v1.8h-6v-1.8zm0 15.5v-1.8h13.8v1.8H21.4zm13.8-4.5H21.4v-1.8h13.8v1.8zm0-4.7H21.4v-1.8h13.8v1.8z'/%3E%3C/svg%3E");background-image:linear-gradient(transparent,transparent),url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 56 56'%3E%3Cpath fill='%23eee' d='M0 0h56v56H0z'/%3E%3Cpath fill='%23999' d='M36.4 13.5H17.8v24.9c0 1.4.9 2.3 2.3 2.3h18.7v-25c.1-1.4-1-2.2-2.4-2.2zM30.2 17h5.1v6.4h-5.1V17zm-8.8 0h6v1.8h-6V17zm0 4.6h6v1.8h-6v-1.8zm0 15.5v-1.8h13.8v1.8H21.4zm13.8-4.5H21.4v-1.8h13.8v1.8zm0-4.7H21.4v-1.8h13.8v1.8z'/%3E%3C/svg%3E");background-image:-webkit-gradient(linear,left top,left bottom,from(transparent),to(transparent)),url(portal/wikipedia.org/assets/img/noimage.svg) !ie;background-image:-moz- oldlinear-gradient(transparent,transparent),url(portal/wikipedia.org/assets/img/noimage.svg) !ie;background-image:-o-linear-gradient(transparent,transparent),url(portal/wikipedia.org/assets/img/noimage.svg) !ie;background-image:linear-gradient(transparent,transparent),url(portal/wikipedia.org/assets/img/noimage.svg) !ie;background-image:-o-linear-gradient(transparent,transparent),url(portal/wikipedia.org/assets/img/noimage.png);background-position:50%;background-repeat:no-repeat;-webkit-background-size:100% auto;-moz-background-size:100% auto;background-size:100% auto;-webkit-background-size:cover;-moz-background-size:cover;background-size:cover;height:100%;width:70px;width:7rem;position:absolute;top:0;left:0}.suggestion-title{margin:0 0 .78rem;color:#54595d;font-size:16px;font-size:1.6rem;line-height:18.72px;line-height:1.872rem}.suggestion-link.active .suggestion-title{color:#36c}.suggestion-highlight{font-style:normal;text-decoration:underline}.suggestion-description{color:#72777d;margin:0;font-size:13px;font-size:1.3rem;line-height:14.299px;line-height:1.43rem}.styled-select{display:none;position:absolute;top:10px;top:1rem;bottom:12px;bottom:1.2rem;right:12px;right:1.2rem;max-width:95px;max-width:9.5rem;height:24px;height:2.4rem;-moz-border-radius:2px;border-radius:2px}.styled-select:hover{background-color:#f8f9fa}.styled-select .hide-arrow{right:32px;right:3.2rem;max-width:68px;max-width:6.8rem;height:24px;height:2.4rem;overflow:hidden;text-align:right}.styled-select select{background:transparent;display:inline;overflow:hidden;height:24px;height:2.4rem;min-width:110px;min-width:11rem;max-width:110px;max-width:11rem;width:110px;width:11rem;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:0;line-height:24px;line-height:2.4rem;-webkit-appearance:none;-moz-appearance:window;text-indent:.01px;-o-text-overflow:"";text-overflow:"";opacity:0;-moz-appearance:none;appearance:none;cursor:pointer}.styled-select.no-js{width:95px;width:9.5rem}.styled-select.no-js select{opacity:1;margin:0;padding:0 2.4rem 0 .8rem;color:#54595d}.styled-select.no-js .hide-arrow{width:68px;width:6.8rem}.search-container .styled-select.no-js .js-langpicker-label{display:none}.styled-select.js-enabled .hide-arrow{padding:0 2.4rem 0 .8rem}.styled-select.js-enabled select{background:transparent;position:absolute;top:0;left:0;height:100%;z-index:1;width:100%;border:0;margin:0;padding:0 2.4rem;color:transparent;color:hsla(0,0%,100%,0)}.styled-select.js-enabled select option{color:#54595d}.styled-select.js-enabled select:hover{background-color:transparent}.styled-select-active-helper{display:none}.styled-select.js-enabled select:focus+.styled-select-active-helper{display:block;position:absolute;top:0;left:0;z-index:0;width:100%;height:100%;outline:1px solid #36c}.search-container .js-langpicker-label{display:inline-block;margin:0;color:#54595d;font-size:13px;font-size:1.3rem;line-height:24px;line-height:2.4rem;text-transform:uppercase}.styled-select select:hover{background-color:#f8f9fa}.styled-select select::-ms-expand{display:none}.styled-select select:focus{outline:1px solid transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}@-moz-document url-prefix(){.styled-select select{width:110%}}.other-projects{display:inline-block;width:65%}.other-project{float:left;position:relative;width:33%;height:90px;height:9rem}.other-project-link{display:inline-block;min-height:50px;width:90%;padding:1em;white-space:nowrap}.other-project-link:hover{background-color:#eaecf0}a.other-project-link{text-decoration:none}.other-project-icon{display:inline-block;width:50px;text-align:center}.svg-Wikinews-logo_sister{background-image:url(portal/wikipedia.org/assets/img/Wikinews-logo_sister.png);background-position:0 0;-webkit-background-size:47px 26px;-moz-background-size:47px 26px;background-size:47px 26px;width:47px;height:26px}@media (-o-min-device-pixel-ratio:5/4),(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.svg-Wikinews-logo_sister{background-image:url(portal/wikipedia.org/assets/img/[email protected])}}.other-project-text,.other-project .sprite-project-logos{display:inline-block}.other-project-text{max-width:65%;font-size:14px;font-size:1.4rem;vertical-align:middle;white-space:normal}.other-project-tagline,.other-project-title{display:block}.other-project-tagline{color:#54595d;font-size:13px;font-size:1.3rem}@media screen and (max-width:768px){.other-projects{width:100%}.other-project{width:33%}}@media screen and (max-width:480px){.other-project{width:50%}.other-project-tagline{-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}}@media screen and (max-width:320px){.other-project-text{margin-right:5px;font-size:13px;font-size:1.3rem}}.lang-list-container{background-color:#f8f9fa;overflow:hidden;position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;max-height:0;width:80%;margin:-1.6rem auto 4.8rem;-webkit-transition:max-height .5s ease-out .16s,visibility .5s ease-in 1s;-o-transition:max-height .5s ease-out .16s,visibility .5s ease-in 1s;-moz-transition:max-height .5s ease-out .16s,visibility .5s ease-in 1s;transition:max-height .5s ease-out .16s,visibility .5s ease-in 1s}.js-enabled .lang-list-container{visibility:hidden}.lang-list-active .lang-list-container,.no-js .lang-list-container{visibility:visible;max-height:10000px;-webkit-transition:max-height 1s ease-in .2s,visibility 1000s ease-in 0ms;-o-transition:max-height 1s ease-in .2s,visibility 1000s ease-in 0ms;-moz-transition:max-height 1s ease-in .2s,visibility 1000s ease-in 0ms;transition:max-height 1s ease-in .2s,visibility 1000s ease-in 0ms}.no-js .lang-list-button{display:none}.lang-list-button-wrapper{text-align:center}.lang-list-button{background-color:#f8f9fa;display:inline;position:relative;z-index:1;margin:0 auto;padding:.6rem 1.2rem;outline:16px solid #fff;outline:1.6rem solid #fff;border:1px solid #a2a9b1;-moz-border-radius:2px;border-radius:2px;color:#36c;font-size:14px;font-size:1.4rem;font-weight:700;line-height:1;-webkit-transition:outline-width .1s ease-in .5s;-o-transition:outline-width .1s ease-in .5s;-moz-transition:outline-width .1s ease-in .5s;transition:outline-width .1s ease-in .5s}.lang-list-button:hover{background-color:#fff;border-color:#a2a9b1}.lang-list-button:focus{border-color:#36c;-webkit-box-shadow:inset 0 0 0 1px #36c;-moz-box-shadow:inset 0 0 0 1px #36c;box-shadow:inset 0 0 0 1px #36c}.lang-list-active .lang-list-button{background-color:#fff;outline:1px solid #fff;border-color:#72777d;-webkit-transition-delay:0s;-moz-transition-delay:0s;-o-transition-delay:0s;transition-delay:0s}.lang-list-button-text{padding:0 .64rem;vertical-align:middle}.lang-list-button i{display:inline-block;vertical-align:middle}.no-js .lang-list-border,.no-js .lang-list-button{display:none}.lang-list-border{background-color:#c8ccd1;display:block;position:relative;max-width:460px;width:80%;margin:-1.6rem auto 1.6rem;height:1px;-webkit-transition:max-width .2s ease-out .4s;-o-transition:max-width .2s ease-out .4s;-moz-transition:max-width .2s ease-out .4s;transition:max-width .2s ease-out .4s}.lang-list-active .lang-list-border{max-width:85%;-webkit-transition-delay:0s;-moz-transition-delay:0s;-o-transition-delay:0s;transition-delay:0s}.no-js .lang-list-content{padding:0}.lang-list-content{position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;padding:1.6rem 1.6rem 0}.svg-arrow-down-blue{-webkit-transition:-webkit-transform .2s ease-out;transition:-webkit-transform .2s ease-out;-o-transition:transform .2s ease-out;-moz-transition:transform .2s ease-out,-moz-transform .2s ease-out;transition:transform .2s ease-out;transition:transform .2s ease-out,-webkit-transform .2s ease-out,-moz-transform .2s ease-out}.lang-list-active .svg-arrow-down-blue{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.langlist{width:auto;margin:1.6rem 0;text-align:left}.langlist-others{font-weight:700;text-align:center}.hlist ul{margin:0;padding:0}.hlist li,.hlist ul ul{display:inline}.hlist li:before{content:" · ";font-weight:700}.hlist li:first-child:before{content:none}.hlist li>ul:before{content:"\00a0("}.hlist li>ul:after{content:") "}.langlist>ul{-webkit-column-width:11.2rem;-moz-column-width:11.2rem;column-width:11.2rem}.langlist>ul>li{display:block;line-height:1.7;-webkit-column-break-inside:avoid;page-break-inside:avoid;break-inside:avoid}.no-js .langlist>ul{text-align:center;list-style-type:circle}.no-js .langlist>ul>li{display:inline-block;padding:0 .8rem}.langlist>ul>li:before{content:none}.langlist>ul>li a{white-space:normal}@media (max-width:480px){.langlist{font-size:inherit}.langlist a{word-wrap:break-word;white-space:normal}.lang-list-container{width:auto;margin-left:.8rem;margin-right:.8rem}.bookshelf{overflow:visible}}.bookshelf{display:block;border-top:1px solid #c8ccd1;-webkit-box-shadow:0 -1px 0 #fff;-moz-box-shadow:0 -1px 0 #fff;box-shadow:0 -1px 0 #fff;text-align:center;white-space:nowrap}.bookshelf .text{background-color:#f8f9fa;position:relative;top:-11.2px;top:-1.12rem;font-weight:400;padding:0 .8rem}.bookshelf-container{display:block;overflow:visible;width:100%;height:1px;margin:2.4rem 0 1.6rem;font-size:13px;font-size:1.3rem;font-weight:700;line-height:1.5}@media (max-width:480px){.bookshelf{width:auto;left:auto}.bookshelf-container{text-align:left;width:auto}}.app-badges .footer-sidebar-content{background-color:#f8f9fa}.app-badges .footer-sidebar-text{padding-top:.8rem;padding-bottom:.8rem}.app-badges .sprite.footer-sidebar-icon{top:8px;top:.8rem}.app-badges ul{margin:0;padding:0;list-style-type:none}.app-badge{display:inline-block}.app-badge a{color:transparent}@media screen and (max-width:768px){.app-badges .footer-sidebar-content{text-align:center}.app-badges .sprite.footer-sidebar-icon{display:inline-block;position:relative;margin:0;top:-3px;left:0;vertical-align:middle;-webkit-transform:scale(.7);-moz-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}.footer{overflow:hidden;max-width:100%;margin:0 auto;padding:4.16rem 1.28rem 0;font-size:13px;font-size:1.3rem}.footer:after,.footer:before{content:" ";display:table}.footer:after{clear:both}.footer-sidebar{width:35%;float:left;clear:left;margin-bottom:3.2rem;vertical-align:top}.footer-sidebar-content{position:relative;max-width:350px;margin:0 auto}.sprite.footer-sidebar-icon{position:absolute;top:0;left:8px;left:.8rem}.footer-sidebar-text{position:relative;margin:0;padding-left:6rem;padding-right:2rem;color:#54595d}.site-license{color:#54595d;text-align:center}.site-license small:after{content:"\2022";display:inline-block;font-size:13px;font-size:1.3rem;line-height:inherit;margin-left:.8rem;margin-right:.5rem}.site-license small:last-child:after{display:none}.footer hr{margin-top:1.28rem}@media screen and (max-width:768px){.footer{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-moz-box-orient:vertical;-moz-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-top:1.28rem}.footer .footer-sidebar{-webkit-box-ordinal-group:1;-moz-box-ordinal-group:1;-webkit-order:1;-ms-flex-order:1;order:1}.footer .other-projects{-webkit-box-ordinal-group:2;-moz-box-ordinal-group:2;-webkit-order:2;-ms-flex-order:2;order:2}.footer .app-badges{-webkit-box-ordinal-group:3;-moz-box-ordinal-group:3;-webkit-order:3;-ms-flex-order:3;order:3}.footer hr{-webkit-box-ordinal-group:4;-moz-box-ordinal-group:4;-webkit-order:4;-ms-flex-order:4;order:4}.footer .site-license{-webkit-box-ordinal-group:5;-moz-box-ordinal-group:5;-webkit-order:5;-ms-flex-order:5;order:5}.footer-sidebar{width:100%}.sprite.footer-sidebar-icon{display:block;position:relative;left:0;margin:0 auto 1.28rem}.footer-sidebar-content{max-width:none}.footer-sidebar-text{margin:0;padding:0;text-align:center}}@media screen and (max-width:480px){.footer{padding:.96rem .64rem 1.28rem}}@media (max-width:480px){.search-container{margin-top:0;height:78px;height:7.8rem;position:absolute;top:96px;top:9.6rem;left:0;right:0;max-width:100%;width:auto;padding:0;text-align:left}.search-container label{display:none}.search-form #searchInput{max-width:40%;vertical-align:middle}.search-form .formBtn{max-width:25%;vertical-align:middle}form fieldset{margin:0;border-left:0;border-right:0}hr{margin-top:.65rem}}@media (-o-min-device-pixel-ratio:2/1),(-webkit-min-device-pixel-ratio:2),(min--moz-device-pixel-ratio:2),(min-resolution:2dppx),(min-resolution:192dpi){hr{border-bottom-width:.5px}}@supports (-webkit-marquee-style:slide){hr{border-bottom-width:1px}}.js-enabled .central-featured,.js-enabled .jsl10n{opacity:0}.jsl10n-visible .central-featured,.jsl10n-visible .jsl10n{opacity:1}@media print{body{background-color:transparent}a{color:#000!important;background:none!important;padding:0!important}a:link,a:visited{color:#520;background:transparent}img{border:0}} 19 | </style> 20 | <link rel="preconnect" href="//upload.wikimedia.org"> 21 | <link rel="me" href="https://wikis.world/@wikipedia"> 22 | <meta property="og:url" content> 23 | <meta property="og:title" content="Wikipedia, the free encyclopedia"> 24 | <meta property="og:type" content="website"> 25 | <meta property="og:description" content="Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation."> 26 | <meta property="og:image" content="https://upload.wikimedia.org/wikipedia/en/thumb/8/80/Wikipedia-logo-v2.svg/2244px-Wikipedia-logo-v2.svg.png"> 27 | </head> 28 | <body id="www-wikipedia-org"> 29 | <main> 30 | <div class="central-textlogo"> 31 | <img class="central-featured-logo" src="portal/wikipedia.org/assets/img/Wikipedia-logo-v2.png" srcset="portal/wikipedia.org/assets/img/[email protected] 1.5x, portal/wikipedia.org/assets/img/[email protected] 2x" width="200" height="183" alt> 32 | <h1 class="central-textlogo-wrapper"> 33 | <span class="central-textlogo__image sprite svg-Wikipedia_wordmark"> 34 | Wikipedia 35 | </span> 36 | <strong class="jsl10n localized-slogan" data-jsl10n="portal.slogan">The Free Encyclopedia</strong> 37 | </h1> 38 | </div> 39 | <nav data-jsl10n="top-ten-nav-label" aria-label="Top languages" class="central-featured" data-el-section="primary links"> 40 | <!-- #1. en.wikipedia.org - 1,803,172,000 views/day --> 41 | <div class="central-featured-lang lang1" lang="en" dir="ltr"> 42 | <a id="js-link-box-en" href="//en.wikipedia.org/" title="English — Wikipedia — The Free Encyclopedia" class="link-box" data-slogan="The Free Encyclopedia"> 43 | <strong>English</strong> 44 | <small>6,942,000+ <span>articles</span></small> 45 | </a> 46 | </div> 47 | <!-- #2. ja.wikipedia.org - 223,982,000 views/day --> 48 | <div class="central-featured-lang lang2" lang="ja" dir="ltr"> 49 | <a id="js-link-box-ja" href="//ja.wikipedia.org/" title="Nihongo — ウィキペディア — フリー百科事典" class="link-box" data-slogan="フリー百科事典"> 50 | <strong>日本語</strong> 51 | <small>1,445,000+ <span>記事</span></small> 52 | </a> 53 | </div> 54 | <!-- #3. ru.wikipedia.org - 222,257,000 views/day --> 55 | <div class="central-featured-lang lang3" lang="ru" dir="ltr"> 56 | <a id="js-link-box-ru" href="//ru.wikipedia.org/" title="Russkiy — Википедия — Свободная энциклопедия" class="link-box" data-slogan="Свободная энциклопедия"> 57 | <strong>Русский</strong> 58 | <small>2 020 000+ <span>статей</span></small> 59 | </a> 60 | </div> 61 | <!-- #4. de.wikipedia.org - 196,822,000 views/day --> 62 | <div class="central-featured-lang lang4" lang="de" dir="ltr"> 63 | <a id="js-link-box-de" href="//de.wikipedia.org/" title="Deutsch — Wikipedia — Die freie Enzyklopädie" class="link-box" data-slogan="Die freie Enzyklopädie"> 64 | <strong>Deutsch</strong> 65 | <small>2.979.000+ <span>Artikel</span></small> 66 | </a> 67 | </div> 68 | <!-- #5. es.wikipedia.org - 172,057,000 views/day --> 69 | <div class="central-featured-lang lang5" lang="es" dir="ltr"> 70 | <a id="js-link-box-es" href="//es.wikipedia.org/" title="Español — Wikipedia — La enciclopedia libre" class="link-box" data-slogan="La enciclopedia libre"> 71 | <strong>Español</strong> 72 | <small>2.003.000+ <span>artículos</span></small> 73 | </a> 74 | </div> 75 | <!-- #6. fr.wikipedia.org - 170,275,000 views/day --> 76 | <div class="central-featured-lang lang6" lang="fr" dir="ltr"> 77 | <a id="js-link-box-fr" href="//fr.wikipedia.org/" title="Français — Wikipédia — L’encyclopédie libre" class="link-box" data-slogan="L’encyclopédie libre"> 78 | <strong>Français</strong> 79 | <small>2 659 000+ <span>articles</span></small> 80 | </a> 81 | </div> 82 | <!-- #7. it.wikipedia.org - 116,527,000 views/day --> 83 | <div class="central-featured-lang lang7" lang="it" dir="ltr"> 84 | <a id="js-link-box-it" href="//it.wikipedia.org/" title="Italiano — Wikipedia — L'enciclopedia libera" class="link-box" data-slogan="L'enciclopedia libera"> 85 | <strong>Italiano</strong> 86 | <small>1.900.000+ <span>voci</span></small> 87 | </a> 88 | </div> 89 | <!-- #8. zh.wikipedia.org - 98,932,000 views/day --> 90 | <div class="central-featured-lang lang8" lang="zh" dir="ltr"> 91 | <a id="js-link-box-zh" href="//zh.wikipedia.org/" title="Zhōngwén — 维基百科 / 維基百科 — 自由的百科全书 / 自由的百科全書" class="link-box localize-variant" data-slogan="自由的百科全书 / 自由的百科全書"> 92 | <strong>中文</strong> 93 | <small>1,459,000+ <span>条目 / 條目</span></small> 94 | </a> 95 | </div> 96 | <!-- #9. fa.wikipedia.org - 57,736,000 views/day --> 97 | <div class="central-featured-lang lang9" lang="fa" dir="rtl"> 98 | <a id="js-link-box-fa" href="//fa.wikipedia.org/" title="Fārsi — ویکیپدیا — دانشنامهٔ آزاد" class="link-box" data-slogan="دانشنامهٔ آزاد"> 99 | <strong><bdi dir="rtl">فارسی</bdi></strong> 100 | <small>۱٬۰۲۶٬۰۰۰+ <span>مقاله</span></small> 101 | </a> 102 | </div> 103 | <!-- #10. pl.wikipedia.org - 55,649,000 views/day --> 104 | <div class="central-featured-lang lang10" lang="pl" dir="ltr"> 105 | <a id="js-link-box-pl" href="//pl.wikipedia.org/" title="Polski — Wikipedia — Wolna encyklopedia" class="link-box" data-slogan="Wolna encyklopedia"> 106 | <strong>Polski</strong> 107 | <small>1 645 000+ <span>haseł</span></small> 108 | </a> 109 | </div> 110 | </nav> 111 | <div role="search" class="search-container"> 112 | <form class="pure-form" id="search-form" action="//www.wikipedia.org/search-redirect.php" data-el-section="search"> 113 | <fieldset> 114 | <input type="hidden" name="family" value="Wikipedia"> 115 | <input type="hidden" id="hiddenLanguageInput" name="language" value="en"> 116 | <div class="search-input" id="search-input"> 117 | <label for="searchInput" class="screen-reader-text" data-jsl10n="portal.search-input-label">Search Wikipedia</label> 118 | <input id="searchInput" name="search" type="search" size="20" autofocus="autofocus" accesskey="F" dir="auto" autocomplete="off"> 119 | <div class="styled-select no-js"> 120 | <div class="hide-arrow"> 121 | <select id="searchLanguage" name="language"> 122 | <option value="af" lang="af">Afrikaans</option> 123 | <option value="ar" lang="ar">العربية</option><!-- Al-ʿArabīyah --> 124 | <option value="ast" lang="ast">Asturianu</option> 125 | <option value="az" lang="az">Azərbaycanca</option> 126 | <option value="bg" lang="bg">Български</option><!-- Bǎlgarski --> 127 | <option value="nan" lang="nan">閩南語 / Bân-lâm-gú</option><!-- Bân-lâm-gú --> 128 | <option value="bn" lang="bn">বাংলা</option><!-- Bangla --> 129 | <option value="be" lang="be">Беларуская</option><!-- Belaruskaya --> 130 | <option value="ca" lang="ca">Català</option> 131 | <option value="cs" lang="cs">Čeština</option> 132 | <option value="cy" lang="cy">Cymraeg</option> 133 | <option value="da" lang="da">Dansk</option> 134 | <option value="de" lang="de">Deutsch</option> 135 | <option value="et" lang="et">Eesti</option> 136 | <option value="el" lang="el">Ελληνικά</option><!-- Ellīniká --> 137 | <option value="en" lang="en" selected=selected>English</option><!-- English --> 138 | <option value="es" lang="es">Español</option> 139 | <option value="eo" lang="eo">Esperanto</option> 140 | <option value="eu" lang="eu">Euskara</option> 141 | <option value="fa" lang="fa">فارسی</option><!-- Fārsi --> 142 | <option value="fr" lang="fr">Français</option> 143 | <option value="gl" lang="gl">Galego</option><!-- Galego --> 144 | <option value="ko" lang="ko">한국어</option><!-- Hangugeo --> 145 | <option value="hy" lang="hy">Հայերեն</option><!-- Hayeren --> 146 | <option value="hi" lang="hi">हिन्दी</option><!-- Hindī --> 147 | <option value="hr" lang="hr">Hrvatski</option> 148 | <option value="id" lang="id">Bahasa Indonesia</option> 149 | <option value="it" lang="it">Italiano</option> 150 | <option value="he" lang="he">עברית</option><!-- Ivrit --> 151 | <option value="ka" lang="ka">ქართული</option><!-- Kartuli --> 152 | <option value="lld" lang="lld">Ladin</option> 153 | <option value="la" lang="la">Latina</option> 154 | <option value="lv" lang="lv">Latviešu</option> 155 | <option value="lt" lang="lt">Lietuvių</option> 156 | <option value="hu" lang="hu">Magyar</option> 157 | <option value="mk" lang="mk">Македонски</option><!-- Makedonski --> 158 | <option value="arz" lang="arz">مصرى</option><!-- Maṣrī --> 159 | <option value="ms" lang="ms">Bahasa Melayu</option><!-- Bahasa Melayu --> 160 | <option value="min" lang="min">Bahaso Minangkabau</option> 161 | <option value="my" lang="my">မြန်မာဘာသာ</option><!-- Myanmarsar --> 162 | <option value="nl" lang="nl">Nederlands</option> 163 | <option value="ja" lang="ja">日本語</option><!-- Nihongo --> 164 | <option value="no" lang="nb">Norsk (bokmål)</option> 165 | <option value="nn" lang="nn">Norsk (nynorsk)</option> 166 | <option value="ce" lang="ce">Нохчийн</option><!-- Noxçiyn --> 167 | <option value="uz" lang="uz">Oʻzbekcha / Ўзбекча</option> 168 | <option value="pl" lang="pl">Polski</option> 169 | <option value="pt" lang="pt">Português</option> 170 | <option value="kk" lang="kk">Қазақша / Qazaqşa / قازاقشا</option> 171 | <option value="ro" lang="ro">Română</option> 172 | <option value="sq" lang="sq">Shqip</option> 173 | <option value="simple" lang="en">Simple English</option> 174 | <option value="ceb" lang="ceb">Sinugboanong Binisaya</option> 175 | <option value="sk" lang="sk">Slovenčina</option> 176 | <option value="sl" lang="sl">Slovenščina</option><!-- Slovenščina --> 177 | <option value="sr" lang="sr">Српски / Srpski</option> 178 | <option value="sh" lang="sh">Srpskohrvatski / Српскохрватски</option> 179 | <option value="fi" lang="fi">Suomi</option> 180 | <option value="sv" lang="sv">Svenska</option> 181 | <option value="ta" lang="ta">தமிழ்</option><!-- Tamiḻ --> 182 | <option value="tt" lang="tt">Татарча / Tatarça</option> 183 | <option value="te" lang="te">తెలుగు</option><!-- Telugu --> 184 | <option value="th" lang="th">ภาษาไทย</option><!-- Phasa Thai --> 185 | <option value="tg" lang="tg">Тоҷикӣ</option><!-- Tojikī --> 186 | <option value="azb" lang="azb">تۆرکجه</option><!-- Türkce --> 187 | <option value="tr" lang="tr">Türkçe</option> 188 | <option value="uk" lang="uk">Українська</option><!-- Ukrayins’ka --> 189 | <option value="ur" lang="ur">اردو</option><!-- Urdu --> 190 | <option value="vi" lang="vi">Tiếng Việt</option> 191 | <option value="war" lang="war">Winaray</option> 192 | <option value="zh" lang="zh">中文</option><!-- Zhōngwén --> 193 | <option value="ru" lang="ru">Русский</option><!-- Russkiy --> 194 | <option value="yue" lang="yue">粵語</option> 195 | </select> 196 | <div class="styled-select-active-helper"></div> 197 | </div> 198 | <i class="sprite svg-arrow-down"></i> 199 | </div> 200 | </div> 201 | <button class="pure-button pure-button-primary-progressive" type="submit"> 202 | <i class="sprite svg-search-icon" data-jsl10n="search-input-button">Search</i> 203 | </button> 204 | <input type="hidden" value="Go" name="go"> 205 | </fieldset> 206 | </form> 207 | </div> 208 | <nav data-jsl10n="all-languages-nav-label" aria-label="All languages"> 209 | <div class="lang-list-button-wrapper"> 210 | <button id="js-lang-list-button" aria-expanded="false" aria-controls="js-lang-lists" class="lang-list-button"> 211 | <i class="sprite svg-language-icon"></i> 212 | <span class="lang-list-button-text jsl10n" data-jsl10n="portal.language-button-text">Read Wikipedia in your language </span> 213 | <i class="sprite svg-arrow-down-blue"></i> 214 | </button> 215 | </div> 216 | <div class="lang-list-border"></div> 217 | <div class="lang-list-container"> 218 | <div id="js-lang-lists" class="lang-list-content"> 219 | <h2 class="bookshelf-container"> 220 | <span class="bookshelf"> 221 | <span class="text"> 222 | <bdi dir="ltr"> 223 | 1,000,000+ 224 | </bdi> 225 | <span class="jsl10n" data-jsl10n="entries"> 226 | articles 227 | </span> 228 | </span> 229 | </span> 230 | </h2> 231 | <div class="langlist langlist-large hlist" data-el-section="secondary links"> 232 | <ul> 233 | <li><a href="//ar.wikipedia.org/" lang="ar" title="Al-ʿArabīyah"><bdi dir="rtl">العربية</bdi></a></li> 234 | <li><a href="//de.wikipedia.org/" lang="de">Deutsch</a></li> 235 | <li><a href="//en.wikipedia.org/" lang="en" title="English">English</a></li> 236 | <li><a href="//es.wikipedia.org/" lang="es">Español</a></li> 237 | <li><a href="//fa.wikipedia.org/" lang="fa" title="Fārsi"><bdi dir="rtl">فارسی</bdi></a></li> 238 | <li><a href="//fr.wikipedia.org/" lang="fr">Français</a></li> 239 | <li><a href="//it.wikipedia.org/" lang="it">Italiano</a></li> 240 | <li><a href="//arz.wikipedia.org/" lang="arz" title="Maṣrī"><bdi dir="rtl">مصرى</bdi></a></li> 241 | <li><a href="//nl.wikipedia.org/" lang="nl">Nederlands</a></li> 242 | <li><a href="//ja.wikipedia.org/" lang="ja" title="Nihongo">日本語</a></li> 243 | <li><a href="//pl.wikipedia.org/" lang="pl">Polski</a></li> 244 | <li><a href="//pt.wikipedia.org/" lang="pt">Português</a></li> 245 | <li><a href="//ceb.wikipedia.org/" lang="ceb">Sinugboanong Binisaya</a></li> 246 | <li><a href="//sv.wikipedia.org/" lang="sv">Svenska</a></li> 247 | <li><a href="//uk.wikipedia.org/" lang="uk" title="Ukrayins’ka">Українська</a></li> 248 | <li><a href="//vi.wikipedia.org/" lang="vi">Tiếng Việt</a></li> 249 | <li><a href="//war.wikipedia.org/" lang="war">Winaray</a></li> 250 | <li><a href="//zh.wikipedia.org/" lang="zh" title="Zhōngwén">中文</a></li> 251 | <li><a href="//ru.wikipedia.org/" lang="ru" title="Russkiy">Русский</a></li> 252 | </ul> 253 | </div> 254 | <h2 class="bookshelf-container"> 255 | <span class="bookshelf"> 256 | <span class="text"> 257 | <bdi dir="ltr"> 258 | 100,000+ 259 | </bdi> 260 | <span class="jsl10n" data-jsl10n="portal.entries"> 261 | articles 262 | </span> 263 | </span> 264 | </span> 265 | </h2> 266 | <div class="langlist langlist-large hlist" data-el-section="secondary links"> 267 | <ul> 268 | <li><a href="//af.wikipedia.org/" lang="af">Afrikaans</a></li> 269 | <li><a href="//ast.wikipedia.org/" lang="ast">Asturianu</a></li> 270 | <li><a href="//az.wikipedia.org/" lang="az">Azərbaycanca</a></li> 271 | <li><a href="//bg.wikipedia.org/" lang="bg" title="Bǎlgarski">Български</a></li> 272 | <li><a href="//zh-min-nan.wikipedia.org/" lang="nan" title="Bân-lâm-gú">閩南語 / Bân-lâm-gú</a></li> 273 | <li><a href="//bn.wikipedia.org/" lang="bn" title="Bangla">বাংলা</a></li> 274 | <li><a href="//be.wikipedia.org/" lang="be" title="Belaruskaya">Беларуская</a></li> 275 | <li><a href="//ca.wikipedia.org/" lang="ca">Català</a></li> 276 | <li><a href="//cs.wikipedia.org/" lang="cs">Čeština</a></li> 277 | <li><a href="//cy.wikipedia.org/" lang="cy">Cymraeg</a></li> 278 | <li><a href="//da.wikipedia.org/" lang="da">Dansk</a></li> 279 | <li><a href="//et.wikipedia.org/" lang="et">Eesti</a></li> 280 | <li><a href="//el.wikipedia.org/" lang="el" title="Ellīniká">Ελληνικά</a></li> 281 | <li><a href="//eo.wikipedia.org/" lang="eo">Esperanto</a></li> 282 | <li><a href="//eu.wikipedia.org/" lang="eu">Euskara</a></li> 283 | <li><a href="//gl.wikipedia.org/" lang="gl" title="Galego">Galego</a></li> 284 | <li><a href="//ko.wikipedia.org/" lang="ko" title="Hangugeo">한국어</a></li> 285 | <li><a href="//hy.wikipedia.org/" lang="hy" title="Hayeren">Հայերեն</a></li> 286 | <li><a href="//hi.wikipedia.org/" lang="hi" title="Hindī">हिन्दी</a></li> 287 | <li><a href="//hr.wikipedia.org/" lang="hr">Hrvatski</a></li> 288 | <li><a href="//id.wikipedia.org/" lang="id">Bahasa Indonesia</a></li> 289 | <li><a href="//he.wikipedia.org/" lang="he" title="Ivrit"><bdi dir="rtl">עברית</bdi></a></li> 290 | <li><a href="//ka.wikipedia.org/" lang="ka" title="Kartuli">ქართული</a></li> 291 | <li><a href="//lld.wikipedia.org/" lang="lld">Ladin</a></li> 292 | <li><a href="//la.wikipedia.org/" lang="la">Latina</a></li> 293 | <li><a href="//lv.wikipedia.org/" lang="lv">Latviešu</a></li> 294 | <li><a href="//lt.wikipedia.org/" lang="lt">Lietuvių</a></li> 295 | <li><a href="//hu.wikipedia.org/" lang="hu">Magyar</a></li> 296 | <li><a href="//mk.wikipedia.org/" lang="mk" title="Makedonski">Македонски</a></li> 297 | <li><a href="//ms.wikipedia.org/" lang="ms" title="Bahasa Melayu">Bahasa Melayu</a></li> 298 | <li><a href="//min.wikipedia.org/" lang="min">Bahaso Minangkabau</a></li> 299 | <li><a href="//my.wikipedia.org/" lang="my" title="Myanmarsar">မြန်မာဘာသာ</a></li> 300 | <li lang="no">Norsk<ul><li><a href="//no.wikipedia.org/" lang="nb">bokmål</a></li><li><a href="//nn.wikipedia.org/" lang="nn">nynorsk</a></li></ul></li> 301 | <li><a href="//ce.wikipedia.org/" lang="ce" title="Noxçiyn">Нохчийн</a></li> 302 | <li><a href="//uz.wikipedia.org/" lang="uz">Oʻzbekcha / Ўзбекча</a></li> 303 | <li><a href="//kk.wikipedia.org/" lang="kk"><span lang="kk-Cyrl">Қазақша</span> / <span lang="kk-Latn">Qazaqşa</span> / <bdi lang="kk-Arab" dir="rtl">قازاقشا</bdi></a></li> 304 | <li><a href="//ro.wikipedia.org/" lang="ro">Română</a></li> 305 | <li><a href="//sq.wikipedia.org/" lang="sq">Shqip</a></li> 306 | <li><a href="//simple.wikipedia.org/" lang="en">Simple English</a></li> 307 | <li><a href="//sk.wikipedia.org/" lang="sk">Slovenčina</a></li> 308 | <li><a href="//sl.wikipedia.org/" lang="sl" title="Slovenščina">Slovenščina</a></li> 309 | <li><a href="//sr.wikipedia.org/" lang="sr">Српски / Srpski</a></li> 310 | <li><a href="//sh.wikipedia.org/" lang="sh">Srpskohrvatski / Српскохрватски</a></li> 311 | <li><a href="//fi.wikipedia.org/" lang="fi">Suomi</a></li> 312 | <li><a href="//ta.wikipedia.org/" lang="ta" title="Tamiḻ">தமிழ்</a></li> 313 | <li><a href="//tt.wikipedia.org/" lang="tt">Татарча / Tatarça</a></li> 314 | <li><a href="//te.wikipedia.org/" lang="te" title="Telugu">తెలుగు</a></li> 315 | <li><a href="//th.wikipedia.org/" lang="th" title="Phasa Thai">ภาษาไทย</a></li> 316 | <li><a href="//tg.wikipedia.org/" lang="tg" title="Tojikī">Тоҷикӣ</a></li> 317 | <li><a href="//azb.wikipedia.org/" lang="azb" title="Türkce"><bdi dir="rtl">تۆرکجه</bdi></a></li> 318 | <li><a href="//tr.wikipedia.org/" lang="tr">Türkçe</a></li> 319 | <li><a href="//ur.wikipedia.org/" lang="ur" title="Urdu"><bdi dir="rtl">اردو</bdi></a></li> 320 | <li><a href="//zh-yue.wikipedia.org/" lang="yue">粵語</a></li> 321 | </ul> 322 | </div> 323 | <h2 class="bookshelf-container"> 324 | <span class="bookshelf"> 325 | <span class="text"> 326 | <bdi dir="ltr"> 327 | 10,000+ 328 | </bdi> 329 | <span class="jsl10n" data-jsl10n="portal.entries"> 330 | articles 331 | </span> 332 | </span> 333 | </span> 334 | </h2> 335 | <div class="langlist hlist" data-el-section="secondary links"> 336 | <ul> 337 | <li><a href="//ace.wikipedia.org/" lang="ace">Bahsa Acèh</a></li> 338 | <li><a href="//als.wikipedia.org/" lang="gsw">Alemannisch</a></li> 339 | <li><a href="//am.wikipedia.org/" lang="am" title="Āmariññā">አማርኛ</a></li> 340 | <li><a href="//an.wikipedia.org/" lang="an">Aragonés</a></li> 341 | <li><a href="//hyw.wikipedia.org/" lang="hyw" title="Arevmdahayeren">Արեւմտահայերէն</a></li> 342 | <li><a href="//gor.wikipedia.org/" lang="gor">Bahasa Hulontalo</a></li> 343 | <li><a href="//ban.wikipedia.org/" lang="ban">Basa Bali</a></li> 344 | <li><a href="//bjn.wikipedia.org/" lang="bjn">Bahasa Banjar</a></li> 345 | <li><a href="//map-bms.wikipedia.org/" lang="map-x-bms">Basa Banyumasan</a></li> 346 | <li><a href="//ba.wikipedia.org/" lang="ba" title="Başqortsa">Башҡортса</a></li> 347 | <li><a href="//be-tarask.wikipedia.org/" lang="be-tarask" title="Bielaruskaja (taraškievica)">Беларуская (тарашкевіца)</a></li> 348 | <li><a href="//bcl.wikipedia.org/" lang="bcl">Bikol Central</a></li> 349 | <li><a href="//bpy.wikipedia.org/" lang="bpy" title="Bishnupriya Manipuri">বিষ্ণুপ্রিয়া মণিপুরী</a></li> 350 | <li><a href="//bar.wikipedia.org/" lang="bar">Boarisch</a></li> 351 | <li><a href="//bs.wikipedia.org/" lang="bs">Bosanski</a></li> 352 | <li><a href="//br.wikipedia.org/" lang="br">Brezhoneg</a></li> 353 | <li><a href="//cv.wikipedia.org/" lang="cv" title="Čăvašla">Чӑвашла</a></li> 354 | <li><a href="//dag.wikipedia.org/" lang="dag">Dagbanli</a></li> 355 | <li><a href="//ary.wikipedia.org/" lang="ary" title="Darija"><bdi dir="rtl">الدارجة</bdi></a></li> 356 | <li><a href="//nv.wikipedia.org/" lang="nv">Diné Bizaad</a></li> 357 | <li><a href="//eml.wikipedia.org/" lang="roa-x-eml">Emigliàn–Rumagnòl</a></li> 358 | <li><a href="//hif.wikipedia.org/" lang="hif">Fiji Hindi</a></li> 359 | <li><a href="//fo.wikipedia.org/" lang="fo">Føroyskt</a></li> 360 | <li><a href="//fy.wikipedia.org/" lang="fy">Frysk</a></li> 361 | <li><a href="//ga.wikipedia.org/" lang="ga">Gaeilge</a></li> 362 | <li><a href="//gd.wikipedia.org/" lang="gd">Gàidhlig</a></li> 363 | <li><a href="//glk.wikipedia.org/" lang="glk" title="Giləki"><bdi dir="rtl">گیلکی</bdi></a></li> 364 | <li><a href="//gu.wikipedia.org/" lang="gu" title="Gujarati">ગુજરાતી</a></li> 365 | <li><a href="//hak.wikipedia.org/" lang="hak">Hak-kâ-ngî / 客家語</a></li> 366 | <li><a href="//ha.wikipedia.org/" lang="ha">Hausa</a></li> 367 | <li><a href="//hsb.wikipedia.org/" lang="hsb">Hornjoserbsce</a></li> 368 | <li><a href="//io.wikipedia.org/" lang="io">Ido</a></li> 369 | <li><a href="//ig.wikipedia.org/" lang="ig">Igbo</a></li> 370 | <li><a href="//ilo.wikipedia.org/" lang="ilo">Ilokano</a></li> 371 | <li><a href="//ia.wikipedia.org/" lang="ia">Interlingua</a></li> 372 | <li><a href="//ie.wikipedia.org/" lang="ie">Interlingue</a></li> 373 | <li><a href="//os.wikipedia.org/" lang="os" title="Iron">Ирон</a></li> 374 | <li><a href="//is.wikipedia.org/" lang="is">Íslenska</a></li> 375 | <li><a href="//jv.wikipedia.org/" lang="jv">Jawa</a></li> 376 | <li><a href="//kn.wikipedia.org/" lang="kn" title="Kannada">ಕನ್ನಡ</a></li> 377 | <li><a href="//pam.wikipedia.org/" lang="pam">Kapampangan</a></li> 378 | <li><a href="//km.wikipedia.org/" lang="km" title="Phéasa Khmér">ភាសាខ្មែរ</a></li> 379 | <li><a href="//avk.wikipedia.org/" lang="avk">Kotava</a></li> 380 | <li><a href="//ht.wikipedia.org/" lang="ht">Kreyòl Ayisyen</a></li> 381 | <li><a href="//ku.wikipedia.org/" lang="ku"><span lang="ku-Latn">Kurdî</span> / <bdi lang="ku-Arab" dir="rtl">كوردی</bdi></a></li> 382 | <li><a href="//ckb.wikipedia.org/" lang="ckb" title="Kurdîy Nawendî"><bdi dir="rtl">کوردیی ناوەندی</bdi></a></li> 383 | <li><a href="//ky.wikipedia.org/" lang="ky" title="Kyrgyzča">Кыргызча</a></li> 384 | <li><a href="//mrj.wikipedia.org/" lang="mjr" title="Kyryk Mary">Кырык мары</a></li> 385 | <li><a href="//lb.wikipedia.org/" lang="lb">Lëtzebuergesch</a></li> 386 | <li><a href="//lij.wikipedia.org/" lang="lij">Lìgure</a></li> 387 | <li><a href="//li.wikipedia.org/" lang="li">Limburgs</a></li> 388 | <li><a href="//lmo.wikipedia.org/" lang="lmo">Lombard</a></li> 389 | <li><a href="//mai.wikipedia.org/" lang="mai" title="Maithilī">मैथिली</a></li> 390 | <li><a href="//mg.wikipedia.org/" lang="mg">Malagasy</a></li> 391 | <li><a href="//ml.wikipedia.org/" lang="ml" title="Malayalam">മലയാളം</a></li> 392 | <li><a href="//mr.wikipedia.org/" lang="mr" title="Marathi">मराठी</a></li> 393 | <li><a href="//xmf.wikipedia.org/" lang="xmf" title="Margaluri">მარგალური</a></li> 394 | <li><a href="//mzn.wikipedia.org/" lang="mzn" title="Mäzeruni"><bdi dir="rtl">مازِرونی</bdi></a></li> 395 | <li><a href="//cdo.wikipedia.org/" lang="cdo" title="Ming-deng-ngu">Mìng-dĕ̤ng-ngṳ̄ / 閩東語</a></li> 396 | <li><a href="//mn.wikipedia.org/" lang="mn" title="Mongol">Монгол</a></li> 397 | <li><a href="//nap.wikipedia.org/" lang="nap">Napulitano</a></li> 398 | <li><a href="//new.wikipedia.org/" lang="new" title="Nepal Bhasa">नेपाल भाषा</a></li> 399 | <li><a href="//ne.wikipedia.org/" lang="ne" title="Nepālī">नेपाली</a></li> 400 | <li><a href="//frr.wikipedia.org/" lang="frr">Nordfriisk</a></li> 401 | <li><a href="//oc.wikipedia.org/" lang="oc">Occitan</a></li> 402 | <li><a href="//mhr.wikipedia.org/" lang="mhr" title="Olyk Marij">Олык марий</a></li> 403 | <li><a href="//or.wikipedia.org/" lang="or" title="Oṛiā">ଓଡି଼ଆ</a></li> 404 | <li><a href="//as.wikipedia.org/" lang="as" title="Ôxômiya">অসমীযা়</a></li> 405 | <li><a href="//pa.wikipedia.org/" lang="pa" title="Pañjābī (Gurmukhī)">ਪੰਜਾਬੀ</a></li> 406 | <li><a href="//pnb.wikipedia.org/" lang="pnb" title="Pañjābī (Shāhmukhī)"><bdi dir="rtl">پنجابی (شاہ مکھی)</bdi></a></li> 407 | <li><a href="//ps.wikipedia.org/" lang="ps" title="Paʂto"><bdi dir="rtl">پښتو</bdi></a></li> 408 | <li><a href="//pms.wikipedia.org/" lang="pms">Piemontèis</a></li> 409 | <li><a href="//nds.wikipedia.org/" lang="nds">Plattdüütsch</a></li> 410 | <li><a href="//crh.wikipedia.org/" lang="crh">Qırımtatarca</a></li> 411 | <li><a href="//qu.wikipedia.org/" lang="qu">Runa Simi</a></li> 412 | <li><a href="//sa.wikipedia.org/" lang="sa" title="Saṃskṛtam">संस्कृतम्</a></li> 413 | <li><a href="//sat.wikipedia.org/" lang="sat" title="Santali">ᱥᱟᱱᱛᱟᱲᱤ</a></li> 414 | <li><a href="//sah.wikipedia.org/" lang="sah" title="Saxa Tyla">Саха Тыла</a></li> 415 | <li><a href="//sco.wikipedia.org/" lang="sco">Scots</a></li> 416 | <li><a href="//sn.wikipedia.org/" lang="sn">ChiShona</a></li> 417 | <li><a href="//scn.wikipedia.org/" lang="scn">Sicilianu</a></li> 418 | <li><a href="//si.wikipedia.org/" lang="si" title="Siṃhala">සිංහල</a></li> 419 | <li><a href="//sd.wikipedia.org/" lang="sd" title="Sindhī"><bdi dir="rtl">سنڌي</bdi></a></li> 420 | <li><a href="//szl.wikipedia.org/" lang="szl">Ślůnski</a></li> 421 | <li><a href="//su.wikipedia.org/" lang="su">Basa Sunda</a></li> 422 | <li><a href="//sw.wikipedia.org/" lang="sw">Kiswahili</a></li> 423 | <li><a href="//tl.wikipedia.org/" lang="tl">Tagalog</a></li> 424 | <li><a href="//shn.wikipedia.org/" lang="shn">ၽႃႇသႃႇတႆး</a></li> 425 | <li><a href="//zgh.wikipedia.org/" lang="zgh" title="Tamazight tanawayt">ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ</a></li> 426 | <li><a href="//tum.wikipedia.org/" lang="tum">chiTumbuka</a></li> 427 | <li><a href="//bug.wikipedia.org/" lang="bug">Basa Ugi</a></li> 428 | <li><a href="//vec.wikipedia.org/" lang="vec">Vèneto</a></li> 429 | <li><a href="//vo.wikipedia.org/" lang="vo">Volapük</a></li> 430 | <li><a href="//wa.wikipedia.org/" lang="wa">Walon</a></li> 431 | <li><a href="//zh-classical.wikipedia.org/" lang="lzh" title="Wényán">文言</a></li> 432 | <li><a href="//wuu.wikipedia.org/" lang="wuu" title="Wúyǔ">吴语</a></li> 433 | <li><a href="//yi.wikipedia.org/" lang="yi" title="Yidiš"><bdi dir="rtl">ייִדיש</bdi></a></li> 434 | <li><a href="//yo.wikipedia.org/" lang="yo">Yorùbá</a></li> 435 | <li><a href="//diq.wikipedia.org/" lang="diq">Zazaki</a></li> 436 | <li><a href="//bat-smg.wikipedia.org/" lang="sgs">žemaitėška</a></li> 437 | <li><a href="//zu.wikipedia.org/" lang="zu">isiZulu</a></li> 438 | <li><a href="//mni.wikipedia.org/" lang="mni">ꯃꯤꯇꯩ ꯂꯣꯟ</a></li> 439 | </ul> 440 | </div> 441 | <h2 class="bookshelf-container"> 442 | <span class="bookshelf"> 443 | <span class="text"> 444 | <bdi dir="ltr"> 445 | 1,000+ 446 | </bdi> 447 | <span class="jsl10n" data-jsl10n="portal.entries"> 448 | articles 449 | </span> 450 | </span> 451 | </span> 452 | </h2> 453 | <div class="langlist hlist" data-el-section="secondary links"> 454 | <ul> 455 | <li><a href="//lad.wikipedia.org/" lang="lad"><span lang="lad-Latn">Dzhudezmo</span> / <bdi lang="lad-Hebr" dir="rtl">לאדינו</bdi></a></li> 456 | <li><a href="//kbd.wikipedia.org/" lang="kbd" title="Adighabze">Адыгэбзэ</a></li> 457 | <li><a href="//ang.wikipedia.org/" lang="ang">Ænglisc</a></li> 458 | <li><a href="//smn.wikipedia.org/" lang="smn" title="Anarâškielâ">Anarâškielâ</a></li> 459 | <li><a href="//anp.wikipedia.org/" lang="anp" title="Angika">अंगिका</a></li> 460 | <li><a href="//ab.wikipedia.org/" lang="ab" title="Aṗsshwa">Аԥсшәа</a></li> 461 | <li><a href="//roa-rup.wikipedia.org/" lang="rup">armãneashti</a></li> 462 | <li><a href="//frp.wikipedia.org/" lang="frp">Arpitan</a></li> 463 | <li><a href="//atj.wikipedia.org/" lang="atj">atikamekw</a></li> 464 | <li><a href="//arc.wikipedia.org/" lang="arc" title="Ātûrāyâ"><bdi dir="rtl">ܐܬܘܪܝܐ</bdi></a></li> 465 | <li><a href="//gn.wikipedia.org/" lang="gn">Avañe’ẽ</a></li> 466 | <li><a href="//av.wikipedia.org/" lang="av" title="Avar">Авар</a></li> 467 | <li><a href="//ay.wikipedia.org/" lang="ay">Aymar</a></li> 468 | <li><a href="//bew.wikipedia.org/" lang="bew">Betawi</a></li> 469 | <li><a href="//bh.wikipedia.org/" lang="bh" title="Bhōjapurī">भोजपुरी</a></li> 470 | <li><a href="//bi.wikipedia.org/" lang="bi">Bislama</a></li> 471 | <li><a href="//bo.wikipedia.org/" lang="bo" title="Bod Skad">བོད་ཡིག</a></li> 472 | <li><a href="//bxr.wikipedia.org/" lang="bxr" title="Buryad">Буряад</a></li> 473 | <li><a href="//cbk-zam.wikipedia.org/" lang="cbk-x-zam">Chavacano de Zamboanga</a></li> 474 | <li><a href="//ny.wikipedia.org/" lang="ny">Chichewa</a></li> 475 | <li><a href="//co.wikipedia.org/" lang="co">Corsu</a></li> 476 | <li><a href="//za.wikipedia.org/" lang="za">Vahcuengh / 話僮</a></li> 477 | <li><a href="//dga.wikipedia.org/" lang="dga">Dagaare</a></li> 478 | <li><a href="//se.wikipedia.org/" lang="se" title="Davvisámegiella">Davvisámegiella</a></li> 479 | <li><a href="//pdc.wikipedia.org/" lang="pdc">Deitsch</a></li> 480 | <li><a href="//dv.wikipedia.org/" lang="dv" title="Divehi"><bdi dir="rtl">ދިވެހިބަސް</bdi></a></li> 481 | <li><a href="//dsb.wikipedia.org/" lang="dsb">Dolnoserbski</a></li> 482 | <li><a href="//dtp.wikipedia.org/" lang="dtp">Dusun Bundu-liwan</a></li> 483 | <li><a href="//myv.wikipedia.org/" lang="myv" title="Erzjanj">Эрзянь</a></li> 484 | <li><a href="//ext.wikipedia.org/" lang="ext">Estremeñu</a></li> 485 | <li><a href="//fon.wikipedia.org/" lang="fon">Fɔ̀ngbè</a></li> 486 | <li><a href="//ff.wikipedia.org/" lang="ff">Fulfulde</a></li> 487 | <li><a href="//fur.wikipedia.org/" lang="fur">Furlan</a></li> 488 | <li><a href="//gv.wikipedia.org/" lang="gv">Gaelg</a></li> 489 | <li><a href="//gag.wikipedia.org/" lang="gag">Gagauz</a></li> 490 | <li><a href="//inh.wikipedia.org/" lang="inh" title="Ghalghai">ГӀалгӀай</a></li> 491 | <li><a href="//gpe.wikipedia.org/" lang="gpe">Ghanaian Pidgin</a></li> 492 | <li><a href="//ki.wikipedia.org/" lang="ki">Gĩkũyũ</a></li> 493 | <li><a href="//gan.wikipedia.org/" lang="gan" title="Gon ua" data-hans="赣语" data-hant="贛語" class="jscnconv">赣语 / 贛語</a></li> 494 | <li><a href="//guw.wikipedia.org/" lang="guw">Gungbe</a></li> 495 | <li><a href="//xal.wikipedia.org/" lang="xal" title="Halʹmg">Хальмг</a></li> 496 | <li><a href="//haw.wikipedia.org/" lang="haw">ʻŌlelo Hawaiʻi</a></li> 497 | <li><a href="//rw.wikipedia.org/" lang="rw">Ikinyarwanda</a></li> 498 | <li><a href="//iba.wikipedia.org/" lang="iba">Jaku Iban</a></li> 499 | <li><a href="//kbp.wikipedia.org/" lang="kbp">Kabɩyɛ</a></li> 500 | <li><a href="//csb.wikipedia.org/" lang="csb">Kaszëbsczi</a></li> 501 | <li><a href="//kw.wikipedia.org/" lang="kw">Kernewek</a></li> 502 | <li><a href="//kv.wikipedia.org/" lang="kv" title="Komi">Коми</a></li> 503 | <li><a href="//koi.wikipedia.org/" lang="koi" title="Perem Komi">Перем коми</a></li> 504 | <li><a href="//kg.wikipedia.org/" lang="kg">Kongo</a></li> 505 | <li><a href="//gom.wikipedia.org/" lang="gom">कोंकणी / Konknni</a></li> 506 | <li><a href="//ks.wikipedia.org/" lang="ks" title="Koshur"><bdi dir="rtl">كٲشُر</bdi></a></li> 507 | <li><a href="//gcr.wikipedia.org/" lang="gcr">Kriyòl Gwiyannen</a></li> 508 | <li><a href="//kge.wikipedia.org/" lang="kge">Kumoring</a></li> 509 | <li><a href="//kus.wikipedia.org/" lang="kus">Kʋsaal</a></li> 510 | <li><a href="//lo.wikipedia.org/" lang="lo" title="Phaasaa Laao">ພາສາລາວ</a></li> 511 | <li><a href="//lbe.wikipedia.org/" lang="lbe" title="Lakku">Лакку</a></li> 512 | <li><a href="//ltg.wikipedia.org/" lang="ltg">Latgaļu</a></li> 513 | <li><a href="//lez.wikipedia.org/" lang="lez" title="Lezgi">Лезги</a></li> 514 | <li><a href="//nia.wikipedia.org/" lang="nia">Li Niha</a></li> 515 | <li><a href="//ln.wikipedia.org/" lang="ln">Lingála</a></li> 516 | <li><a href="//lfn.wikipedia.org/" lang="lfn">Lingua Franca Nova</a></li> 517 | <li><a href="//olo.wikipedia.org/" lang="olo">livvinkarjala</a></li> 518 | <li><a href="//jbo.wikipedia.org/" lang="jbo">lojban</a></li> 519 | <li><a href="//lg.wikipedia.org/" lang="lg">Luganda</a></li> 520 | <li><a href="//mad.wikipedia.org/" lang="mad">Madhurâ</a></li> 521 | <li><a href="//mt.wikipedia.org/" lang="mt">Malti</a></li> 522 | <li><a href="//btm.wikipedia.org/" lang="btm">Mandailing</a></li> 523 | <li><a href="//mi.wikipedia.org/" lang="mi">Māori</a></li> 524 | <li><a href="//mwl.wikipedia.org/" lang="mwl">Mirandés</a></li> 525 | <li><a href="//mdf.wikipedia.org/" lang="mdf" title="Mokšenj">Мокшень</a></li> 526 | <li><a href="//mnw.wikipedia.org/" lang="mnw">ဘာသာ မန်</a></li> 527 | <li><a href="//mos.wikipedia.org/" lang="mos">Moore</a></li> 528 | <li><a href="//nqo.wikipedia.org/" lang="nqo" title="N'Ko">ߒߞߏ</a></li> 529 | <li><a href="//fj.wikipedia.org/" lang="fj">Na Vosa Vaka-Viti</a></li> 530 | <li><a href="//nah.wikipedia.org/" lang="nah">Nāhuatlahtōlli</a></li> 531 | <li><a href="//pcm.wikipedia.org/" lang="pcm">Naijá</a></li> 532 | <li><a href="//nds-nl.wikipedia.org/" lang="nds-nl">Nedersaksisch</a></li> 533 | <li><a href="//nrm.wikipedia.org/" lang="roa-x-nrm">Nouormand / Normaund</a></li> 534 | <li><a href="//nov.wikipedia.org/" lang="nov">Novial</a></li> 535 | <li><a href="//om.wikipedia.org/" lang="om">Afaan Oromoo</a></li> 536 | <li><a href="//blk.wikipedia.org/" lang="blk">ပအိုဝ်ႏဘာႏသာႏ</a></li> 537 | <li><a href="//pi.wikipedia.org/" lang="pi" title="Pāḷi">पालि</a></li> 538 | <li><a href="//pag.wikipedia.org/" lang="pag">Pangasinán</a></li> 539 | <li><a href="//ami.wikipedia.org/" lang="ami">Pangcah</a></li> 540 | <li><a href="//pap.wikipedia.org/" lang="pap">Papiamentu</a></li> 541 | <li><a href="//jam.wikipedia.org/" lang="jam">Patois</a></li> 542 | <li><a href="//pfl.wikipedia.org/" lang="pfl">Pfälzisch</a></li> 543 | <li><a href="//pcd.wikipedia.org/" lang="pcd">Picard</a></li> 544 | <li><a href="//krc.wikipedia.org/" lang="krc" title="Qaraçay–Malqar">Къарачай–малкъар</a></li> 545 | <li><a href="//kaa.wikipedia.org/" lang="kaa">Qaraqalpaqsha</a></li> 546 | <li><a href="//ksh.wikipedia.org/" lang="ksh">Ripoarisch</a></li> 547 | <li><a href="//rm.wikipedia.org/" lang="rm">Rumantsch</a></li> 548 | <li><a href="//rue.wikipedia.org/" lang="rue" title="Rusin’skyj">Русиньскый</a></li> 549 | <li><a href="//szy.wikipedia.org/" lang="szy">Sakizaya</a></li> 550 | <li><a href="//sm.wikipedia.org/" lang="sm">Gagana Sāmoa</a></li> 551 | <li><a href="//skr.wikipedia.org/" lang="skr" title="Saraiki">سرائیکی</a></li> 552 | <li><a href="//sc.wikipedia.org/" lang="sc">Sardu</a></li> 553 | <li><a href="//trv.wikipedia.org/" lang="trv">Seediq</a></li> 554 | <li><a href="//stq.wikipedia.org/" lang="stq">Seeltersk</a></li> 555 | <li><a href="//st.wikipedia.org/" lang="st">Sesotho</a></li> 556 | <li><a href="//nso.wikipedia.org/" lang="nso">Sesotho sa Leboa</a></li> 557 | <li><a href="//tn.wikipedia.org/" lang="tn">Setswana</a></li> 558 | <li><a href="//cu.wikipedia.org/" lang="cu" title="Slověnĭskŭ">Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ</a></li> 559 | <li><a href="//so.wikipedia.org/" lang="so">Soomaaliga</a></li> 560 | <li><a href="//srn.wikipedia.org/" lang="srn">Sranantongo</a></li> 561 | <li><a href="//ss.wikipedia.org/" lang="ss">SiSwati</a></li> 562 | <li><a href="//shi.wikipedia.org/" lang="shi">Taclḥit</a></li> 563 | <li><a href="//ty.wikipedia.org/" lang="ty">Reo tahiti</a></li> 564 | <li><a href="//kab.wikipedia.org/" lang="kab" title="Taqbaylit">Taqbaylit</a></li> 565 | <li><a href="//roa-tara.wikipedia.org/" lang="roa">Tarandíne</a></li> 566 | <li><a href="//tay.wikipedia.org/" lang="tay">Tayal</a></li> 567 | <li><a href="//tet.wikipedia.org/" lang="tet">Tetun</a></li> 568 | <li><a href="//tpi.wikipedia.org/" lang="tpi">Tok Pisin</a></li> 569 | <li><a href="//tly.wikipedia.org/" lang="tly">tolışi</a></li> 570 | <li><a href="//to.wikipedia.org/" lang="to">faka Tonga</a></li> 571 | <li><a href="//tk.wikipedia.org/" lang="tk">Türkmençe</a></li> 572 | <li><a href="//tw.wikipedia.org/" lang="tw">Twi</a></li> 573 | <li><a href="//kcg.wikipedia.org/" lang="kcg">Tyap</a></li> 574 | <li><a href="//tyv.wikipedia.org/" lang="tyv" title="Tyva dyl">Тыва дыл</a></li> 575 | <li><a href="//udm.wikipedia.org/" lang="udm" title="Udmurt">Удмурт</a></li> 576 | <li><a href="//ug.wikipedia.org/" lang="ug"><bdi dir="rtl">ئۇيغۇرچه</bdi></a></li> 577 | <li><a href="//vep.wikipedia.org/" lang="vep">Vepsän</a></li> 578 | <li><a href="//fiu-vro.wikipedia.org/" lang="vro">võro</a></li> 579 | <li><a href="//vls.wikipedia.org/" lang="vls">West-Vlams</a></li> 580 | <li><a href="//wo.wikipedia.org/" lang="wo">Wolof</a></li> 581 | <li><a href="//xh.wikipedia.org/" lang="xh">isiXhosa</a></li> 582 | <li><a href="//zea.wikipedia.org/" lang="zea">Zeêuws</a></li> 583 | <li><a href="//alt.wikipedia.org/" lang="alt">алтай тил</a></li> 584 | <li><a href="//awa.wikipedia.org/" lang="awa">अवधी</a></li> 585 | <li><a href="//dty.wikipedia.org/" lang="dty">डोटेली</a></li> 586 | <li><a href="//tcy.wikipedia.org/" lang="tcy">ತುಳು</a></li> 587 | </ul> 588 | </div> 589 | <h2 class="bookshelf-container"> 590 | <span class="bookshelf"> 591 | <span class="text"> 592 | <bdi dir="ltr"> 593 | 100+ 594 | </bdi> 595 | <span class="jsl10n" data-jsl10n="portal.entries"> 596 | articles 597 | </span> 598 | </span> 599 | </span> 600 | </h2> 601 | <div class="langlist langlist-tiny hlist" data-el-section="secondary links"> 602 | <ul> 603 | <li><a href="//bdr.wikipedia.org/" lang="bdr">Bajau Sama</a></li> 604 | <li><a href="//bm.wikipedia.org/" lang="bm">Bamanankan</a></li> 605 | <li><a href="//bbc.wikipedia.org/" lang="bbc">Batak Toba</a></li> 606 | <li><a href="//ch.wikipedia.org/" lang="ch">Chamoru</a></li> 607 | <li><a href="//dz.wikipedia.org/" lang="dz" title="Rdzong-Kha">རྫོང་ཁ</a></li> 608 | <li><a href="//ee.wikipedia.org/" lang="ee">Eʋegbe</a></li> 609 | <li><a href="//gur.wikipedia.org/" lang="gur">Farefare</a></li> 610 | <li><a href="//got.wikipedia.org/" lang="got" title="Gutisk">𐌲𐌿𐍄𐌹𐍃𐌺</a></li> 611 | <li><a href="//igl.wikipedia.org/" lang="igl">Igala</a></li> 612 | <li><a href="//iu.wikipedia.org/" lang="iu">ᐃᓄᒃᑎᑐᑦ / Inuktitut</a></li> 613 | <li><a href="//ik.wikipedia.org/" lang="ik">Iñupiak</a></li> 614 | <li><a href="//nr.wikipedia.org/" lang="nr" title="isiNdebele seSewula">isiNdebele seSewula</a></li> 615 | <li><a href="//kl.wikipedia.org/" lang="kl">Kalaallisut</a></li> 616 | <li><a href="//fat.wikipedia.org/" lang="fat">Mfantse</a></li> 617 | <li><a href="//pih.wikipedia.org/" lang="pih">Norfuk / Pitkern</a></li> 618 | <li><a href="//ann.wikipedia.org/" lang="ann">Obolo</a></li> 619 | <li><a href="//pwn.wikipedia.org/" lang="pwn">pinayuanan</a></li> 620 | <li><a href="//pnt.wikipedia.org/" lang="pnt" title="Pontiaká">Ποντιακά</a></li> 621 | <li><a href="//rmy.wikipedia.org/" lang="rmy">romani čhib</a></li> 622 | <li><a href="//rn.wikipedia.org/" lang="rn">Ikirundi</a></li> 623 | <li><a href="//rsk.wikipedia.org/" lang="rsk" title="Ruski">руски</a></li> 624 | <li><a href="//sg.wikipedia.org/" lang="sg">Sängö</a></li> 625 | <li><a href="//tdd.wikipedia.org/" lang="tdd" title="Tai taɯ xoŋ">ᥖᥭᥰᥖᥬᥳᥑᥨᥒᥰ</a></li> 626 | <li><a href="//ti.wikipedia.org/" lang="ti" title="Təgərəña">ትግርኛ</a></li> 627 | <li><a href="//din.wikipedia.org/" lang="din">Thuɔŋjäŋ</a></li> 628 | <li><a href="//chr.wikipedia.org/" lang="chr" title="Tsalagi">ᏣᎳᎩ</a></li> 629 | <li><a href="//chy.wikipedia.org/" lang="chy">Tsėhesenėstsestotse</a></li> 630 | <li><a href="//ts.wikipedia.org/" lang="ts">Xitsonga</a></li> 631 | <li><a href="//ve.wikipedia.org/" lang="ve">Tshivenḓa</a></li> 632 | <li><a href="//guc.wikipedia.org/" lang="guc">Wayuunaiki</a></li> 633 | <li><a href="//ady.wikipedia.org/" lang="ady">адыгабзэ</a></li> 634 | </ul> 635 | </div> 636 | <div class="langlist langlist-others hlist" data-el-section="other languages"> 637 | <a class="jsl10n" href="https://meta.wikimedia.org/wiki/Special:MyLanguage/List_of_Wikipedias" lang data-jsl10n="other-languages-label">Other languages</a> 638 | </div></div> 639 | </div> 640 | </nav> 641 | <hr> 642 | </main> 643 | <footer class="footer" data-el-section="other projects"> 644 | <div class="footer-sidebar"> 645 | <div class="footer-sidebar-content"> 646 | <div class="footer-sidebar-icon sprite svg-Wikimedia-logo_black"> 647 | </div> 648 | <div class="footer-sidebar-text jsl10n" data-jsl10n="portal.footer-description"> 649 | Wikipedia is hosted by the Wikimedia Foundation, a non-profit organization that also hosts a range of other projects. 650 | </div> 651 | <div class="footer-sidebar-text"> 652 | <a href="https://donate.wikimedia.org/?wmf_medium=portal&wmf_campaign=portalFooter&wmf_source=portalFooter" target="_blank"> 653 | <span class="jsl10n" data-jsl10n="footer-donate">You can support our work with a donation.</span> 654 | </a> 655 | </div> 656 | </div> 657 | </div> 658 | <div class="footer-sidebar app-badges"> 659 | <div class="footer-sidebar-content"> 660 | <div class="footer-sidebar-text"> 661 | <div class="footer-sidebar-icon sprite svg-wikipedia_app_tile"></div> 662 | <strong class="jsl10n" data-jsl10n="portal.app-links.title"> 663 | <a class="jsl10n" data-jsl10n="portal.app-links.url" href="https://en.wikipedia.org/wiki/List_of_Wikipedia_mobile_applications"> 664 | Download Wikipedia for Android or iOS 665 | </a> 666 | </strong> 667 | <p class="jsl10n" data-jsl10n="portal.app-links.description"> 668 | Save your favorite articles to read offline, sync your reading lists across devices and customize your reading experience with the official Wikipedia app. 669 | </p> 670 | <ul> 671 | <li class="app-badge app-badge-android"> 672 | <a target="_blank" rel="noreferrer" href="https://play.google.com/store/apps/details?id=org.wikipedia&referrer=utm_source%3Dportal%26utm_medium%3Dbutton%26anid%3Dadmob"> 673 | <span class="jsl10n sprite svg-badge_google_play_store" data-jsl10n="portal.app-links.google-store">Google Play Store</span> 674 | </a> 675 | </li> 676 | <li class="app-badge app-badge-ios"> 677 | <a target="_blank" rel="noreferrer" href="https://itunes.apple.com/app/apple-store/id324715238?pt=208305&ct=portal&mt=8"> 678 | <span class="jsl10n sprite svg-badge_ios_app_store" data-jsl10n="portal.app-links.apple-store">Apple App Store</span> 679 | </a> 680 | </li> 681 | </ul> 682 | </div> 683 | </div> 684 | </div> 685 | <nav data-jsl10n="other-projects-nav-label" aria-label="Other projects" class="other-projects"> 686 | <div class="other-project"> 687 | <a class="other-project-link" href="//commons.wikimedia.org/"> 688 | <div class="other-project-icon"> 689 | <div class="sprite svg-Commons-logo_sister"></div> 690 | </div> 691 | <div class="other-project-text"> 692 | <span class="other-project-title jsl10n" data-jsl10n="commons.name">Commons</span> 693 | <span class="other-project-tagline jsl10n" data-jsl10n="commons.slogan">Free media collection</span> 694 | </div> 695 | </a> 696 | </div> 697 | <div class="other-project"> 698 | <a class="other-project-link" href="//www.wikivoyage.org/"> 699 | <div class="other-project-icon"> 700 | <div class="sprite svg-Wikivoyage-logo_sister"></div> 701 | </div> 702 | <div class="other-project-text"> 703 | <span class="other-project-title jsl10n" data-jsl10n="wikivoyage.name">Wikivoyage</span> 704 | <span class="other-project-tagline jsl10n" data-jsl10n="wikivoyage.slogan">Free travel guide</span> 705 | </div> 706 | </a> 707 | </div> 708 | <div class="other-project"> 709 | <a class="other-project-link" href="//www.wiktionary.org/"> 710 | <div class="other-project-icon"> 711 | <div class="sprite svg-Wiktionary-logo_sister"></div> 712 | </div> 713 | <div class="other-project-text"> 714 | <span class="other-project-title jsl10n" data-jsl10n="wiktionary.name">Wiktionary</span> 715 | <span class="other-project-tagline jsl10n" data-jsl10n="wiktionary.slogan">Free dictionary</span> 716 | </div> 717 | </a> 718 | </div> 719 | <div class="other-project"> 720 | <a class="other-project-link" href="//www.wikibooks.org/"> 721 | <div class="other-project-icon"> 722 | <div class="sprite svg-Wikibooks-logo_sister"></div> 723 | </div> 724 | <div class="other-project-text"> 725 | <span class="other-project-title jsl10n" data-jsl10n="wikibooks.name">Wikibooks</span> 726 | <span class="other-project-tagline jsl10n" data-jsl10n="wikibooks.slogan">Free textbooks</span> 727 | </div> 728 | </a> 729 | </div> 730 | <div class="other-project"> 731 | <a class="other-project-link" href="//www.wikinews.org/"> 732 | <div class="other-project-icon"> 733 | <div class="sprite svg-Wikinews-logo_sister"></div> 734 | </div> 735 | <div class="other-project-text"> 736 | <span class="other-project-title jsl10n" data-jsl10n="wikinews.name">Wikinews</span> 737 | <span class="other-project-tagline jsl10n" data-jsl10n="wikinews.slogan">Free news source</span> 738 | </div> 739 | </a> 740 | </div> 741 | <div class="other-project"> 742 | <a class="other-project-link" href="//www.wikidata.org/"> 743 | <div class="other-project-icon"> 744 | <div class="sprite svg-Wikidata-logo_sister"></div> 745 | </div> 746 | <div class="other-project-text"> 747 | <span class="other-project-title jsl10n" data-jsl10n="wikidata.name">Wikidata</span> 748 | <span class="other-project-tagline jsl10n" data-jsl10n="wikidata.slogan">Free knowledge base</span> 749 | </div> 750 | </a> 751 | </div> 752 | <div class="other-project"> 753 | <a class="other-project-link" href="//www.wikiversity.org/"> 754 | <div class="other-project-icon"> 755 | <div class="sprite svg-Wikiversity-logo_sister"></div> 756 | </div> 757 | <div class="other-project-text"> 758 | <span class="other-project-title jsl10n" data-jsl10n="wikiversity.name">Wikiversity</span> 759 | <span class="other-project-tagline jsl10n" data-jsl10n="wikiversity.slogan">Free learning resources</span> 760 | </div> 761 | </a> 762 | </div> 763 | <div class="other-project"> 764 | <a class="other-project-link" href="//www.wikiquote.org/"> 765 | <div class="other-project-icon"> 766 | <div class="sprite svg-Wikiquote-logo_sister"></div> 767 | </div> 768 | <div class="other-project-text"> 769 | <span class="other-project-title jsl10n" data-jsl10n="wikiquote.name">Wikiquote</span> 770 | <span class="other-project-tagline jsl10n" data-jsl10n="wikiquote.slogan">Free quote compendium</span> 771 | </div> 772 | </a> 773 | </div> 774 | <div class="other-project"> 775 | <a class="other-project-link" href="//www.mediawiki.org/"> 776 | <div class="other-project-icon"> 777 | <div class="sprite svg-MediaWiki-logo_sister"></div> 778 | </div> 779 | <div class="other-project-text"> 780 | <span class="other-project-title jsl10n" data-jsl10n="mediawiki.name">MediaWiki</span> 781 | <span class="other-project-tagline jsl10n" data-jsl10n="mediawiki.slogan">Free & open wiki software</span> 782 | </div> 783 | </a> 784 | </div> 785 | <div class="other-project"> 786 | <a class="other-project-link" href="//www.wikisource.org/"> 787 | <div class="other-project-icon"> 788 | <div class="sprite svg-Wikisource-logo_sister"></div> 789 | </div> 790 | <div class="other-project-text"> 791 | <span class="other-project-title jsl10n" data-jsl10n="wikisource.name">Wikisource</span> 792 | <span class="other-project-tagline jsl10n" data-jsl10n="wikisource.slogan">Free content library</span> 793 | </div> 794 | </a> 795 | </div> 796 | <div class="other-project"> 797 | <a class="other-project-link" href="//species.wikimedia.org/"> 798 | <div class="other-project-icon"> 799 | <div class="sprite svg-Wikispecies-logo_sister"></div> 800 | </div> 801 | <div class="other-project-text"> 802 | <span class="other-project-title jsl10n" data-jsl10n="wikispecies.name">Wikispecies</span> 803 | <span class="other-project-tagline jsl10n" data-jsl10n="wikispecies.slogan">Free species directory</span> 804 | </div> 805 | </a> 806 | </div> 807 | <div class="other-project"> 808 | <a class="other-project-link" href="//www.wikifunctions.org/"> 809 | <div class="other-project-icon"> 810 | <div class="sprite svg-Wikifunctions-logo_sister"></div> 811 | </div> 812 | <div class="other-project-text"> 813 | <span class="other-project-title jsl10n" data-jsl10n="wikifunctions.name">Wikifunctions</span> 814 | <span class="other-project-tagline jsl10n" data-jsl10n="wikifunctions.slogan">Free function library</span> 815 | </div> 816 | </a> 817 | </div> 818 | <div class="other-project"> 819 | <a class="other-project-link" href="//meta.wikimedia.org/"> 820 | <div class="other-project-icon"> 821 | <div class="sprite svg-Meta-Wiki-logo_sister"></div> 822 | </div> 823 | <div class="other-project-text"> 824 | <span class="other-project-title jsl10n" data-jsl10n="metawiki.name">Meta-Wiki</span> 825 | <span class="other-project-tagline jsl10n" data-jsl10n="metawiki.slogan">Community coordination & documentation</span> 826 | </div> 827 | </a> 828 | </div> 829 | </nav> 830 | <hr> 831 | <p class="site-license"> 832 | <small class="jsl10n" data-jsl10n="license">This page is available under the <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike License</a></small> 833 | <small class="jsl10n" data-jsl10n="terms"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a></small> 834 | <small class="jsl10n" data-jsl10n="privacy-policy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy Policy</a></small> 835 | </p> 836 | </footer> 837 | <script> 838 | var rtlLangs = ['ar','arc','ary','arz','bcc','bgn','bqi','ckb','dv','fa','glk','he','kk-cn','kk-arab','khw','ks','ku-arab','lki','luz','mzn','nqo','pnb','ps','sd','sdh','skr','ug','ur','yi'], 839 | translationsHash = 'c4ec3936', 840 | /** 841 | * This variable is used to convert the generic "portal" keyword in the data-jsl10n attributes 842 | * e.g. 'data-jsl10n="portal.footer-description"' into a portal-specific key, e.g. "wiki" 843 | * for the Wikipedia portal. 844 | */ 845 | translationsPortalKey = 'wiki'; 846 | /** 847 | * The wm-typeahead.js feature is used for search,and it uses domain name for searching. We want domain 848 | * name to be portal Specific (different for every portal).So by declaring variable 'portalSearchDomain' 849 | * in index.handlebars we will make this portal Specific. 850 | **/ 851 | portalSearchDomain = 'wikipedia.org' 852 | /* 853 | This object is used by l10n scripts (page-localized.js, topten-localized.js) 854 | to reveal the page content after l10n json is loaded. 855 | A timer is also set to prevent JS from hiding page content indefinitelty. 856 | This script is inlined to safeguard againt script loading errors and placed 857 | at the top of the page to safeguard against any HTML loading/parsing errors. 858 | */ 859 | wmL10nVisible = { 860 | ready: false, 861 | makeVisible: function(){ 862 | if ( !wmL10nVisible.ready ) { 863 | wmL10nVisible.ready = true; 864 | document.body.className += ' jsl10n-visible'; 865 | } 866 | } 867 | }; 868 | window.setTimeout( wmL10nVisible.makeVisible, 1000 ) 869 | </script> 870 | <script src="portal/wikipedia.org/assets/js/index-24c3e2ca18.js"></script> 871 | <script src="portal/wikipedia.org/assets/js/gt-ie9-ce3fe8e88d.js"></script> 872 | <style> 873 | .styled-select { 874 | display: block; 875 | } 876 | </style> 877 | </body> 878 | </html> 879 | ```