Full Code of pydantic/FastUI for AI

main b5a33bc6e5cd cached
146 files
855.4 KB
295.1k tokens
460 symbols
1 requests
Download .txt
Showing preview only (901K chars total). Download the full file or copy to clipboard to get everything.
Repository: pydantic/FastUI
Branch: main
Commit: b5a33bc6e5cd
Files: 146
Total size: 855.4 KB

Directory structure:
gitextract_8bolxsaa/

├── .eslintrc.cjs
├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .prettierignore
├── LICENSE
├── Makefile
├── README.md
├── build-docs.sh
├── bump_npm.py
├── demo/
│   ├── README.md
│   ├── __init__.py
│   ├── auth.py
│   ├── auth_user.py
│   ├── cities.json
│   ├── components_list.py
│   ├── forms.py
│   ├── main.py
│   ├── shared.py
│   ├── sse.py
│   ├── tables.py
│   └── tests.py
├── docs/
│   ├── api/
│   │   ├── python_components.md
│   │   └── typescript_components.md
│   ├── extra/
│   │   └── tweaks.css
│   ├── guide.md
│   ├── index.md
│   └── plugins.py
├── mkdocs.yml
├── package.json
├── pyproject.toml
├── requirements/
│   ├── docs.in
│   └── docs.txt
├── src/
│   ├── npm-fastui/
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── Defaults.tsx
│   │   │   ├── components/
│   │   │   │   ├── Code.tsx
│   │   │   │   ├── CodeLazy.tsx
│   │   │   │   ├── Custom.tsx
│   │   │   │   ├── FireEvent.tsx
│   │   │   │   ├── FormField.tsx
│   │   │   │   ├── Iframe.tsx
│   │   │   │   ├── Json.tsx
│   │   │   │   ├── LinkList.tsx
│   │   │   │   ├── Markdown.tsx
│   │   │   │   ├── MarkdownLazy.tsx
│   │   │   │   ├── PageTitle.tsx
│   │   │   │   ├── ServerLoad.tsx
│   │   │   │   ├── button.tsx
│   │   │   │   ├── details.tsx
│   │   │   │   ├── display.tsx
│   │   │   │   ├── div.tsx
│   │   │   │   ├── error.tsx
│   │   │   │   ├── footer.tsx
│   │   │   │   ├── form.tsx
│   │   │   │   ├── heading.tsx
│   │   │   │   ├── image.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   ├── link.tsx
│   │   │   │   ├── modal.tsx
│   │   │   │   ├── navbar.tsx
│   │   │   │   ├── pagination.tsx
│   │   │   │   ├── paragraph.tsx
│   │   │   │   ├── spinner.tsx
│   │   │   │   ├── table.tsx
│   │   │   │   ├── text.tsx
│   │   │   │   ├── toast.tsx
│   │   │   │   └── video.tsx
│   │   │   ├── controller.tsx
│   │   │   ├── dev.tsx
│   │   │   ├── events.ts
│   │   │   ├── hooks/
│   │   │   │   ├── className.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── error.tsx
│   │   │   │   ├── eventContext.tsx
│   │   │   │   └── locationContext.tsx
│   │   │   ├── index.tsx
│   │   │   ├── models.d.ts
│   │   │   └── tools.ts
│   │   ├── tsconfig.json
│   │   └── typedoc.json
│   ├── npm-fastui-bootstrap/
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── footer.tsx
│   │   │   ├── index.tsx
│   │   │   ├── modal.tsx
│   │   │   ├── navbar.tsx
│   │   │   ├── pagination.tsx
│   │   │   └── toast.tsx
│   │   ├── tsconfig.json
│   │   └── typedoc.json
│   ├── npm-fastui-prebuilt/
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── App.tsx
│   │   │   ├── main.scss
│   │   │   ├── main.tsx
│   │   │   └── vite-env.d.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   ├── typedoc.json
│   │   └── vite.config.ts
│   └── python-fastui/
│       ├── LICENSE
│       ├── README.md
│       ├── fastui/
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── auth/
│       │   │   ├── __init__.py
│       │   │   ├── github.py
│       │   │   └── shared.py
│       │   ├── base.py
│       │   ├── class_name.py
│       │   ├── components/
│       │   │   ├── __init__.py
│       │   │   ├── display.py
│       │   │   ├── forms.py
│       │   │   ├── py.typed
│       │   │   └── tables.py
│       │   ├── dev.py
│       │   ├── events.py
│       │   ├── forms.py
│       │   ├── generate_typescript.py
│       │   ├── json_schema.py
│       │   ├── py.typed
│       │   └── types.py
│       ├── pyproject.toml
│       ├── requirements/
│       │   ├── all.txt
│       │   ├── lint.in
│       │   ├── lint.txt
│       │   ├── pyproject.txt
│       │   ├── render.txt
│       │   ├── test.in
│       │   └── test.txt
│       └── tests/
│           ├── test_auth_github.py
│           ├── test_auth_shared.py
│           ├── test_components.py
│           ├── test_dev.py
│           ├── test_forms.py
│           ├── test_json_schema.py
│           ├── test_prebuilt_html.py
│           └── test_tables_display.py
├── tsconfig.json
├── typedoc.base.json
└── typedoc.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .eslintrc.cjs
================================================
module.exports = {
  root: true,
  env: { browser: true, es2020: true },
  extends: [
    'standard',
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:@typescript-eslint/recommended',
    'plugin:react-hooks/recommended',
    'prettier',
  ],
  ignorePatterns: ['node_modules', 'dist', 'htmlcov'],
  parser: '@typescript-eslint/parser',
  plugins: ['react', '@typescript-eslint', 'react-refresh', 'simple-import-sort'],
  rules: {
    'react-refresh/only-export-components': 'off', // how much effect does this have?
    '@typescript-eslint/no-explicit-any': 'off',
    'no-use-before-define': 'off',
    'react/react-in-jsx-scope': 'off',
    'react/prop-types': 'off',
    'react/display-name': 'off',
    'import/order': [
      'error',
      {
        'newlines-between': 'always',
        groups: ['builtin', 'external', 'internal', 'object', 'type', 'parent', 'index', 'sibling'],
        pathGroups: [
          {
            pattern: '@/**',
            group: 'internal',
          },
          {
            pattern: './../**',
            group: 'parent',
          },
        ],
      },
    ],
  },
}


================================================
FILE: .github/dependabot.yml
================================================
# Keep GitHub Actions up to date with GitHub's Dependabot...
# https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem
version: 2
updates:
  - package-ecosystem: github-actions
    directory: /
    groups:
      github-actions:
        patterns:
          - "*"  # Group all Actions updates into a single larger pull request
    schedule:
      interval: monthly


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  push:
    branches:
      - main
    tags:
      - '**'
  pull_request:
    types: [opened, synchronize]

jobs:
  lint:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - uses: actions/setup-node@v4
        with:
          node-version: 18

      - run: pip install -r src/python-fastui/requirements/all.txt
      - run: pip install src/python-fastui

      - run: npm install

      - uses: pre-commit/action@v3.0.1
        with:
          extra_args: --all-files
        env:
          SKIP: no-commit-to-branch

  docs-build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      # note: PPPR_TOKEN is not available on PRs sourced from forks, but the necessary
      # dependencies are also listed in docs.txt :)
      - name: install
        run: |
          pip install --upgrade pip
          pip install --extra-index-url https://pydantic:${PPPR_TOKEN}@pppr.pydantic.dev/simple/ mkdocs-material mkdocstrings-python
          pip install -r requirements/docs.txt
        # note -- we can use these in the future when mkdocstrings-typescript and griffe-typedoc beocome publicly available
        # pip install --extra-index-url https://pydantic:${PPPR_TOKEN}@pppr.pydantic.dev/simple/ mkdocs-material mkdocstrings-python griffe-typedoc mkdocstrings-typescript
        # npm install
        # npm install -g typedoc
        env:
          PPPR_TOKEN: ${{ secrets.PPPR_TOKEN }}

      - name: build site
        run: mkdocs build --strict

  test:
    name: test ${{ matrix.python-version }} on ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-15-intel, macos-latest]
        python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
        exclude:
          - os: macos-15-intel
            python-version: '3.10'
          - os: macos-15-intel
            python-version: '3.11'
          - os: macos-15-intel
            python-version: '3.12'
          - os: macos-latest
            python-version: '3.13'

    runs-on: ${{ matrix.os }}

    env:
      PYTHON: ${{ matrix.python-version }}
      OS: ${{ matrix.os }}

    steps:
      - uses: actions/checkout@v4

      - name: set up python
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - run: pip install -r src/python-fastui/requirements/test.txt
      - run: pip install -r src/python-fastui/requirements/pyproject.txt
      - run: pip install -e src/python-fastui

      - run: coverage run -m pytest src
      # display coverage and fail if it's below 80%, which shouldn't happen
      - run: coverage report --fail-under=80

      # test demo on 3.11 and 3.12, these tests are intentionally omitted from coverage
      - if: matrix.python-version == '3.11' || matrix.python-version == '3.12'
        run: pytest demo/tests.py

      - run: coverage xml

      - uses: codecov/codecov-action@v5
        with:
          file: ./coverage.xml
          env_vars: PYTHON,OS

  npm-build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 18

      - run: npm install
      - run: npm run build
      - run: tree src

  check: # This job does nothing and is only used for the branch protection
    if: always()
    needs: [lint, test, npm-build]
    runs-on: ubuntu-latest

    steps:
      - name: Decide whether the needed jobs succeeded or failed
        uses: re-actors/alls-green@release/v1
        id: all-green
        with:
          jobs: ${{ toJSON(needs) }}

  release:
    needs: [check]
    if: "success() && startsWith(github.ref, 'refs/tags/')"
    runs-on: ubuntu-latest
    environment: release

    permissions:
      id-token: write

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - run: pip install -U build

      - id: check-version
        uses: samuelcolvin/check-python-version@v4.1
        with:
          version_file_path: 'src/python-fastui/fastui/__init__.py'

      - run: python -m build --outdir dist src/python-fastui

      - run: ls -lh dist

      - uses: pypa/gh-action-pypi-publish@release/v1


================================================
FILE: .gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
/**/*.egg-info

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

# python
/env*/
__pycache__/

/.logfire/
/frontend-dist/
/scratch/
/packages-dist/
/.coverage
/users.db


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
      - id: no-commit-to-branch
      - id: check-yaml
        args: ['--unsafe']
      - id: check-toml
      - id: end-of-file-fixer
      - id: trailing-whitespace

  - repo: local
    hooks:
      - id: python-format
        name: python-format
        types_or: [python]
        entry: make format
        language: system
        pass_filenames: false
      - id: python-typecheck
        name: python-typecheck
        types_or: [python]
        entry: make typecheck
        language: system
        pass_filenames: false
      - id: js-prettier
        name: js-prettier
        types_or: [javascript, jsx, ts, tsx, css, json, markdown]
        entry: npm run prettier
        language: system
        exclude: '^docs/.*'
      - id: js-lint
        name: js-lint
        types_or: [ts, tsx]
        entry: npm run lint-fix
        language: system
        pass_filenames: false
      - id: js-typecheck
        name: js-typecheck
        types_or: [ts, tsx]
        entry: npm run typecheck
        language: system
        pass_filenames: false
      - id: python-generate-ts
        name: python-generate-ts
        types_or: [python]
        entry: make typescript-models
        language: system
        pass_filenames: false


================================================
FILE: .prettierignore
================================================
htmlcov/


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2023 to present Pydantic Services inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: Makefile
================================================
.DEFAULT_GOAL:=all
path = src/python-fastui

.PHONY: install
install:
	pip install -U pip pre-commit pip-tools
	pip install -r $(path)/requirements/all.txt
	pip install -e $(path)
	pre-commit install


.PHONY: install-docs
install-docs:
	pip install -r requirements/docs.txt

# note -- mkdocstrings-typescript and griffe-typedoc are not yet publicly available
# but the following can be added above the pip install -r requirements/docs.txt line in the future
# pip install mkdocstrings-python mkdocstrings-typescript griffe-typedoc

.PHONY: update-lockfiles
update-lockfiles:
	@echo "Updating requirements files using pip-compile"
	pip-compile -q --strip-extras -o $(path)/requirements/lint.txt $(path)/requirements/lint.in
	pip-compile -q --strip-extras -o $(path)/requirements/pyproject.txt -c $(path)/requirements/lint.txt $(path)/pyproject.toml --extra=fastapi
	pip-compile -q --strip-extras -o $(path)/requirements/test.txt -c $(path)/requirements/lint.txt -c $(path)/requirements/pyproject.txt $(path)/requirements/test.in
	pip install --dry-run -r $(path)/requirements/all.txt

.PHONY: format
format:
	ruff check --fix-only $(path) demo
	ruff format $(path) demo

.PHONY: lint
lint:
	ruff check $(path) demo
	ruff format --check $(path) demo

.PHONY: typecheck
typecheck:
	pyright

.PHONY: test
test:
	coverage run -m pytest

.PHONY: testcov
testcov: test
	coverage html

.PHONY: typescript-models
typescript-models:
	fastui generate fastui:FastUI src/npm-fastui/src/models.d.ts

.PHONY: dev
dev:
	uvicorn demo:app --reload --reload-dir .

.PHONY: docs
docs:
	mkdocs build

.PHONY: serve
serve:
	mkdocs serve

.PHONY: all
all: testcov lint


================================================
FILE: README.md
================================================
# NOTE: this project is inactive, see [#368](https://github.com/pydantic/FastUI/issues/368)

# FastUI

Find the documentation [here](https://docs.pydantic.dev/fastui/).
Join the discussion in the #fastui slack channel [here](https://pydanticlogfire.slack.com/archives/C0720M7D31S)

[![CI](https://github.com/pydantic/FastUI/actions/workflows/ci.yml/badge.svg)](https://github.com/pydantic/FastUI/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)
[![pypi](https://img.shields.io/pypi/v/fastui.svg)](https://pypi.python.org/pypi/fastui)
[![versions](https://img.shields.io/pypi/pyversions/fastui.svg)](https://github.com/pydantic/FastUI)
[![license](https://img.shields.io/github/license/pydantic/FastUI.svg)](https://github.com/pydantic/FastUI/blob/main/LICENSE)

**Please note:** FastUI is still an active work in progress, do not expect it to be complete.

## The Principle (short version)

You can see a simple demo of an application built with FastUI [here](https://fastui-demo.onrender.com).

FastUI is a new way to build web application user interfaces defined by declarative Python code.

This means:

- **If you're a Python developer** — you can build responsive web applications using React without writing a single line of JavaScript, or touching `npm`.
- **If you're a frontend developer** — you can concentrate on building magical components that are truly reusable, no copy-pasting components for each view.
- **For everyone** — a true separation of concerns, the backend defines the entire application; while the frontend is free to implement just the user interface

At its heart, FastUI is a set of matching [Pydantic](https://docs.pydantic.dev) models and TypeScript interfaces that allow you to define a user interface. This interface is validated at build time by TypeScript and pyright/mypy and at runtime by Pydantic.

## The Practice — Usage

FastUI is made up of 4 things:

- [`fastui` PyPI package](https://pypi.python.org/pypi/fastui) — Pydantic models for UI components, and some utilities. While it works well with [FastAPI](https://fastapi.tiangolo.com) it doesn't depend on FastAPI, and most of it could be used with any python web framework.
- [`@pydantic/fastui` npm package](https://www.npmjs.com/package/@pydantic/fastui) — a React TypeScript package that lets you reuse the machinery and types of FastUI while implementing your own components
- [`@pydantic/fastui-bootstrap` npm package](https://www.npmjs.com/package/@pydantic/fastui-bootstrap) — implementation/customisation of all FastUI components using [Bootstrap](https://getbootstrap.com)
- [`@pydantic/fastui-prebuilt` npm package](https://www.jsdelivr.com/package/npm/@pydantic/fastui-prebuilt) (available on [jsdelivr.com CDN](https://www.jsdelivr.com/package/npm/@pydantic/fastui-prebuilt)) providing a pre-built version of the FastUI React app so you can use it without installing any npm packages or building anything yourself. The Python package provides a simple HTML page to serve this app.

Here's a simple but complete FastAPI application that uses FastUI to show some user profiles:

```python
from datetime import date

from fastapi import FastAPI, HTTPException
from fastapi.responses import HTMLResponse
from fastui import FastUI, AnyComponent, prebuilt_html, components as c
from fastui.components.display import DisplayMode, DisplayLookup
from fastui.events import GoToEvent, BackEvent
from pydantic import BaseModel, Field

app = FastAPI()


class User(BaseModel):
    id: int
    name: str
    dob: date = Field(title='Date of Birth')


# define some users
users = [
    User(id=1, name='John', dob=date(1990, 1, 1)),
    User(id=2, name='Jack', dob=date(1991, 1, 1)),
    User(id=3, name='Jill', dob=date(1992, 1, 1)),
    User(id=4, name='Jane', dob=date(1993, 1, 1)),
]


@app.get("/api/", response_model=FastUI, response_model_exclude_none=True)
def users_table() -> list[AnyComponent]:
    """
    Show a table of four users, `/api` is the endpoint the frontend will connect to
    when a user visits `/` to fetch components to render.
    """
    return [
        c.Page(  # Page provides a basic container for components
            components=[
                c.Heading(text='Users', level=2),  # renders `<h2>Users</h2>`
                c.Table(
                    data=users,
                    # define two columns for the table
                    columns=[
                        # the first is the users, name rendered as a link to their profile
                        DisplayLookup(field='name', on_click=GoToEvent(url='/user/{id}/')),
                        # the second is the date of birth, rendered as a date
                        DisplayLookup(field='dob', mode=DisplayMode.date),
                    ],
                ),
            ]
        ),
    ]


@app.get("/api/user/{user_id}/", response_model=FastUI, response_model_exclude_none=True)
def user_profile(user_id: int) -> list[AnyComponent]:
    """
    User profile page, the frontend will fetch this when the user visits `/user/{id}/`.
    """
    try:
        user = next(u for u in users if u.id == user_id)
    except StopIteration:
        raise HTTPException(status_code=404, detail="User not found")
    return [
        c.Page(
            components=[
                c.Heading(text=user.name, level=2),
                c.Link(components=[c.Text(text='Back')], on_click=BackEvent()),
                c.Details(data=user),
            ]
        ),
    ]


@app.get('/{path:path}')
async def html_landing() -> HTMLResponse:
    """Simple HTML page which serves the React app, comes last as it matches all paths."""
    return HTMLResponse(prebuilt_html(title='FastUI Demo'))
```

Which renders like this:

![screenshot](https://raw.githubusercontent.com/pydantic/FastUI/main/screenshot.png)

Of course, that's a very simple application, the [full demo](https://fastui-demo.onrender.com) is more complete.

### Components

FastUI already defines a rich set of components.

All components are listed in the [demo app](https://fastui-demo.onrender.com).

## The Principle (long version)

FastUI is an implementation of the RESTful principle; but not as it's usually understood, instead I mean the principle defined in the original [PhD dissertation](https://ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm) by Roy Fielding, and excellently summarised in [this essay on htmx.org](https://htmx.org/essays/how-did-rest-come-to-mean-the-opposite-of-rest/) (HTMX people, I'm sorry to use your article to promote React which I know you despise 🙏).

The RESTful principle as described in the HTMX article is that the frontend doesn't need to (and shouldn't) know anything about the application you're building. Instead, it should just provide all the components you need to construct the interface, the backend can then tell the frontend what to do.

Think of your frontend as a puppet, and the backend as the hand within it — the puppet doesn't need to know what to say, that's kind of the point.

Building an application this way has a number of significant advantages:

- You only need to write code in one place to build a new feature — add a new view, change the behavior of an existing view or alter the URL structure
- Deploying the front and backend can be completely decoupled, provided the frontend knows how to render all the components the backend is going to ask it to use, you're good to go
- You should be able to reuse a rich set of opensource components, they should end up being better tested and more reliable than anything you could build yourself, this is possible because the components need no context about how they're going to be used (note: since FastUI is brand new, this isn't true yet, hopefully we get there)
- We can use Pydantic, TypeScript and JSON Schema to provide guarantees that the two sides are communicating with an agreed schema

In the abstract, FastUI is like the opposite of GraphQL but with the same goal — GraphQL lets frontend developers extend an application without any new backend development; FastUI lets backend developers extend an application without any new frontend development.

### Beyond Python and React

Of course, this principle shouldn't be limited to Python and React applications — provided we use the same set of agreed schemas and encoding to communicate, we should be able to use any frontend and backend that implements the schema. Interchangeably.

This could mean:

- Implementing a web frontend using another JS framework like Vue — lots of work, limited value IMHO
- Implementing a web frontend using an edge server, so the browser just sees HTML — lots of work but very valuable
- Implementing frontends for other platforms like mobile or IOT — lots of work, no idea if it's actually a good idea?
- Implementing the component models in another language like Rust or Go — since there's actually not that much code in the backend, so this would be a relatively small and mechanical task


================================================
FILE: build-docs.sh
================================================
#!/usr/bin/env bash

set -e
set -x

python3 -V

python3 -m pip install --extra-index-url https://pydantic:${PPPR_TOKEN}@pppr.pydantic.dev/simple/ mkdocs-material mkdocstrings-python
python3 -m pip install -r ./requirements/docs.txt
# note -- we can use these in the future when mkdocstrings-typescript and griffe-typedoc beocome publicly available
# python3 -m pip install --extra-index-url https://pydantic:$PPPR_TOKEN@pppr.pydantic.dev/simple/ mkdocs-material mkdocstrings-python griffe-typedoc mkdocstrings-typescript
# npm install
# npm install -g typedoc

python3 -m mkdocs build


================================================
FILE: bump_npm.py
================================================
#!/usr/bin/env python
from __future__ import annotations

import json
import re
from pathlib import Path


def replace_package_json(package_json: Path, new_version: str, deps: bool = False) -> tuple[Path, str]:
    content = package_json.read_text()
    content, r_count = re.subn(r'"version": *".*?"', f'"version": "{new_version}"', content, count=1)
    assert r_count == 1 , f'Failed to update version in {package_json}, expect replacement count 1, got {r_count}'
    if deps:
        content, r_count = re.subn(r'"(@pydantic/.+?)": *".*?"', fr'"\1": "{new_version}"', content)
        assert r_count == 1, f'Failed to update version in {package_json}, expect replacement count 1, got {r_count}'

    return package_json, content


def main():
    this_dir = Path(__file__).parent
    fastui_package_json = this_dir / 'src/npm-fastui/package.json'
    with fastui_package_json.open() as f:
        old_version = json.load(f)['version']

    rest, patch_version = old_version.rsplit('.', 1)
    new_version = f'{rest}.{int(patch_version) + 1}'
    bootstrap_package_json = this_dir / 'src/npm-fastui-bootstrap/package.json'
    prebuilt_package_json = this_dir / 'src/npm-fastui-prebuilt/package.json'
    to_update: list[tuple[Path, str]] = [
        replace_package_json(fastui_package_json, new_version),
        replace_package_json(bootstrap_package_json, new_version, deps=True),
        replace_package_json(prebuilt_package_json, new_version),
    ]

    python_init = this_dir / 'src/python-fastui/fastui/__init__.py'
    python_content = python_init.read_text()
    python_content, r_count = re.subn(r"(_PREBUILT_VERSION = )'.+'", fr"\1'{new_version}'", python_content)
    assert r_count == 1, f'Failed to update version in {python_init}, expect replacement count 1, got {r_count}'
    to_update.append((python_init, python_content))

    # logic is finished, no update all files
    print(f'Updating files:')
    for package_json, content in to_update:
        print(f'  {package_json.relative_to(this_dir)}')
        package_json.write_text(content)

    print(f"""
Bumped from `{old_version}` to `{new_version}` in {len(to_update)} files.

To publish the new version, run:

> npm --workspaces publish
""")


if __name__ == '__main__':
    main()


================================================
FILE: demo/README.md
================================================
# FastUI Demo

This a simple demo app for FastUI, it's deployed at [fastui-demo.onrender.com](https://fastui-demo.onrender.com).

## Running

To run the demo app, execute the following commands from the FastUI repo root

```bash
# create a virtual env
python3.11 -m venv env311
# activate the env
. env311/bin/activate
# install deps
make install
# run the demo server
make dev
```

Then navigate to [http://localhost:8000](http://localhost:8000)

If you want to run the dev version of the React frontend, run

```bash
npm install
npm run dev
```

This will run at [http://localhost:3000](http://localhost:3000), and connect to the backend running at `localhost:3000`.


================================================
FILE: demo/__init__.py
================================================
from __future__ import annotations as _annotations

import sys
from contextlib import asynccontextmanager

from fastapi import FastAPI
from fastapi.responses import HTMLResponse, PlainTextResponse
from fastui import prebuilt_html
from fastui.auth import fastapi_auth_exception_handling
from fastui.dev import dev_fastapi_app
from httpx import AsyncClient

from .auth import router as auth_router
from .components_list import router as components_router
from .forms import router as forms_router
from .main import router as main_router
from .sse import router as sse_router
from .tables import router as table_router


@asynccontextmanager
async def lifespan(app_: FastAPI):
    async with AsyncClient() as client:
        app_.state.httpx_client = client
        yield


frontend_reload = '--reload' in sys.argv
if frontend_reload:
    # dev_fastapi_app reloads in the browser when the Python source changes
    app = dev_fastapi_app(lifespan=lifespan)
else:
    app = FastAPI(lifespan=lifespan)

fastapi_auth_exception_handling(app)
app.include_router(components_router, prefix='/api/components')
app.include_router(sse_router, prefix='/api/components')
app.include_router(table_router, prefix='/api/table')
app.include_router(forms_router, prefix='/api/forms')
app.include_router(auth_router, prefix='/api/auth')
app.include_router(main_router, prefix='/api')


@app.get('/robots.txt', response_class=PlainTextResponse)
async def robots_txt() -> str:
    return 'User-agent: *\nAllow: /'


@app.get('/favicon.ico', status_code=404, response_class=PlainTextResponse)
async def favicon_ico() -> str:
    return 'page not found'


@app.get('/{path:path}')
async def html_landing() -> HTMLResponse:
    return HTMLResponse(prebuilt_html(title='FastUI Demo'))


================================================
FILE: demo/auth.py
================================================
from __future__ import annotations as _annotations

import asyncio
import json
import os
from dataclasses import asdict
from typing import Annotated, Literal, TypeAlias

from fastapi import APIRouter, Depends, Request
from fastui import AnyComponent, FastUI
from fastui import components as c
from fastui.auth import AuthRedirect, GitHubAuthProvider
from fastui.events import AuthEvent, GoToEvent, PageEvent
from fastui.forms import fastui_form
from httpx import AsyncClient
from pydantic import BaseModel, EmailStr, Field, SecretStr

from .auth_user import User
from .shared import demo_page

router = APIRouter()

GITHUB_CLIENT_ID = os.getenv('GITHUB_CLIENT_ID', '0d0315f9c2e055d032e2')
# this will give an error when making requests to GitHub, but at least the app will run
GITHUB_CLIENT_SECRET = SecretStr(os.getenv('GITHUB_CLIENT_SECRET', 'dummy-secret'))
# use 'http://localhost:3000/auth/login/github/redirect' in development
GITHUB_REDIRECT = os.getenv('GITHUB_REDIRECT')


async def get_github_auth(request: Request) -> GitHubAuthProvider:
    client: AsyncClient = request.app.state.httpx_client
    return GitHubAuthProvider(
        httpx_client=client,
        github_client_id=GITHUB_CLIENT_ID,
        github_client_secret=GITHUB_CLIENT_SECRET,
        redirect_uri=GITHUB_REDIRECT,
        scopes=['user:email'],
    )


LoginKind: TypeAlias = Literal['password', 'github']


@router.get('/login/{kind}', response_model=FastUI, response_model_exclude_none=True)
def auth_login(
    kind: LoginKind,
    user: Annotated[User | None, Depends(User.from_request_opt)],
) -> list[AnyComponent]:
    if user is not None:
        # already logged in
        raise AuthRedirect('/auth/profile')

    return demo_page(
        c.LinkList(
            links=[
                c.Link(
                    components=[c.Text(text='Password Login')],
                    on_click=PageEvent(name='tab', push_path='/auth/login/password', context={'kind': 'password'}),
                    active='/auth/login/password',
                ),
                c.Link(
                    components=[c.Text(text='GitHub Login')],
                    on_click=PageEvent(name='tab', push_path='/auth/login/github', context={'kind': 'github'}),
                    active='/auth/login/github',
                ),
            ],
            mode='tabs',
            class_name='+ mb-4',
        ),
        c.ServerLoad(
            path='/auth/login/content/{kind}',
            load_trigger=PageEvent(name='tab'),
            components=auth_login_content(kind),
        ),
        title='Authentication',
    )


@router.get('/login/content/{kind}', response_model=FastUI, response_model_exclude_none=True)
def auth_login_content(kind: LoginKind) -> list[AnyComponent]:
    match kind:
        case 'password':
            return [
                c.Heading(text='Password Login', level=3),
                c.Paragraph(
                    text=(
                        'This is a very simple demo of password authentication, '
                        'here you can "login" with any email address and password.'
                    )
                ),
                c.Paragraph(text='(Passwords are not saved and is email stored in the browser via a JWT only)'),
                c.ModelForm(model=LoginForm, submit_url='/api/auth/login', display_mode='page'),
            ]
        case 'github':
            return [
                c.Heading(text='GitHub Login', level=3),
                c.Paragraph(text='Demo of GitHub authentication.'),
                c.Paragraph(text='(Credentials are stored in the browser via a JWT only)'),
                c.Button(text='Login with GitHub', on_click=GoToEvent(url='/auth/login/github/gen')),
            ]
        case _:
            raise ValueError(f'Invalid kind {kind!r}')


class LoginForm(BaseModel):
    email: EmailStr = Field(
        title='Email Address', description='Enter whatever value you like', json_schema_extra={'autocomplete': 'email'}
    )
    password: SecretStr = Field(
        title='Password',
        description='Enter whatever value you like, password is not checked',
        json_schema_extra={'autocomplete': 'current-password'},
    )


@router.post('/login', response_model=FastUI, response_model_exclude_none=True)
async def login_form_post(form: Annotated[LoginForm, fastui_form(LoginForm)]) -> list[AnyComponent]:
    user = User(email=form.email, extra={})
    token = user.encode_token()
    return [c.FireEvent(event=AuthEvent(token=token, url='/auth/profile'))]


@router.get('/profile', response_model=FastUI, response_model_exclude_none=True)
async def profile(user: Annotated[User, Depends(User.from_request)]) -> list[AnyComponent]:
    return demo_page(
        c.Paragraph(text=f'You are logged in as "{user.email}".'),
        c.Button(text='Logout', on_click=PageEvent(name='submit-form')),
        c.Heading(text='User Data:', level=3),
        c.Code(language='json', text=json.dumps(asdict(user), indent=2)),
        c.Form(
            submit_url='/api/auth/logout',
            form_fields=[c.FormFieldInput(name='test', title='', initial='data', html_type='hidden')],
            footer=[],
            submit_trigger=PageEvent(name='submit-form'),
        ),
        title='Authentication',
    )


@router.post('/logout', response_model=FastUI, response_model_exclude_none=True)
async def logout_form_post() -> list[AnyComponent]:
    return [c.FireEvent(event=AuthEvent(token=False, url='/auth/login/password'))]


@router.get('/login/github/gen', response_model=FastUI, response_model_exclude_none=True)
async def auth_github_gen(github_auth: Annotated[GitHubAuthProvider, Depends(get_github_auth)]) -> list[AnyComponent]:
    auth_url = await github_auth.authorization_url()
    return [c.FireEvent(event=GoToEvent(url=auth_url))]


@router.get('/login/github/redirect', response_model=FastUI, response_model_exclude_none=True)
async def github_redirect(
    code: str,
    state: str | None,
    github_auth: Annotated[GitHubAuthProvider, Depends(get_github_auth)],
) -> list[AnyComponent]:
    exchange = await github_auth.exchange_code(code, state)
    user_info, emails = await asyncio.gather(
        github_auth.get_github_user(exchange), github_auth.get_github_user_emails(exchange)
    )
    user = User(
        email=next((e.email for e in emails if e.primary and e.verified), None),
        extra={
            'github_user_info': user_info.model_dump(),
            'github_emails': [e.model_dump() for e in emails],
        },
    )
    token = user.encode_token()
    return [c.FireEvent(event=AuthEvent(token=token, url='/auth/profile'))]


================================================
FILE: demo/auth_user.py
================================================
import json
from dataclasses import asdict, dataclass
from datetime import datetime, timedelta
from typing import Annotated, Any

import jwt
from fastapi import Header, HTTPException
from fastui.auth import AuthRedirect
from typing_extensions import Self

JWT_SECRET = 'secret'


@dataclass
class User:
    email: str | None
    extra: dict[str, Any]

    def encode_token(self) -> str:
        payload = asdict(self)
        payload['exp'] = datetime.now() + timedelta(hours=1)
        return jwt.encode(payload, JWT_SECRET, algorithm='HS256', json_encoder=CustomJsonEncoder)

    @classmethod
    def from_request(cls, authorization: Annotated[str, Header()] = '') -> Self:
        user = cls.from_request_opt(authorization)
        if user is None:
            raise AuthRedirect('/auth/login/password')
        else:
            return user

    @classmethod
    def from_request_opt(cls, authorization: Annotated[str, Header()] = '') -> Self | None:
        try:
            token = authorization.split(' ', 1)[1]
        except IndexError:
            return None

        try:
            payload = jwt.decode(token, JWT_SECRET, algorithms=['HS256'])
        except jwt.ExpiredSignatureError:
            return None
        except jwt.DecodeError:
            raise HTTPException(status_code=401, detail='Invalid token')
        else:
            # existing token might not have 'exp' field
            payload.pop('exp', None)
            return cls(**payload)


class CustomJsonEncoder(json.JSONEncoder):
    def default(self, obj: Any) -> Any:
        if isinstance(obj, datetime):
            return obj.isoformat()
        else:
            return super().default(obj)


================================================
FILE: demo/cities.json
================================================
[
  {
    "city": "Kandahār",
    "city_ascii": "Kandahar",
    "lat": 31.62,
    "lng": 65.7158,
    "country": "Afghanistan",
    "iso2": "AF",
    "iso3": "AFG",
    "admin_name": "Kandahār",
    "capital": "admin",
    "population": 614254.0,
    "id": 1004003059
  },
  {
    "city": "Herāt",
    "city_ascii": "Herat",
    "lat": 34.3419,
    "lng": 62.2031,
    "country": "Afghanistan",
    "iso2": "AF",
    "iso3": "AFG",
    "admin_name": "Herāt",
    "capital": "admin",
    "population": 556205.0,
    "id": 1004237782
  },
  {
    "city": "Mazār-e Sharīf",
    "city_ascii": "Mazar-e Sharif",
    "lat": 36.7,
    "lng": 67.1167,
    "country": "Afghanistan",
    "iso2": "AF",
    "iso3": "AFG",
    "admin_name": "Balkh",
    "capital": "admin",
    "population": 469247.0,
    "id": 1004436363
  },
  {
    "city": "Farāh",
    "city_ascii": "Farah",
    "lat": 32.3436,
    "lng": 62.1194,
    "country": "Afghanistan",
    "iso2": "AF",
    "iso3": "AFG",
    "admin_name": "Farāh",
    "capital": "admin",
    "population": 500000.0,
    "id": 1004523791
  },
  {
    "city": "Kabul",
    "city_ascii": "Kabul",
    "lat": 34.5253,
    "lng": 69.1783,
    "country": "Afghanistan",
    "iso2": "AF",
    "iso3": "AFG",
    "admin_name": "Kābul",
    "capital": "primary",
    "population": 4273156.0,
    "id": 1004993580
  },
  {
    "city": "Tirana",
    "city_ascii": "Tirana",
    "lat": 41.3289,
    "lng": 19.8178,
    "country": "Albania",
    "iso2": "AL",
    "iso3": "ALB",
    "admin_name": "Tiranë",
    "capital": "primary",
    "population": 418495.0,
    "id": 1008162156
  },
  {
    "city": "Oran",
    "city_ascii": "Oran",
    "lat": 35.6969,
    "lng": -0.6331,
    "country": "Algeria",
    "iso2": "DZ",
    "iso3": "DZA",
    "admin_name": "Oran",
    "capital": "admin",
    "population": 852000.0,
    "id": 1012126319
  },
  {
    "city": "Constantine",
    "city_ascii": "Constantine",
    "lat": 36.365,
    "lng": 6.6147,
    "country": "Algeria",
    "iso2": "DZ",
    "iso3": "DZA",
    "admin_name": "Constantine",
    "capital": "admin",
    "population": 448374.0,
    "id": 1012275076
  },
  {
    "city": "Algiers",
    "city_ascii": "Algiers",
    "lat": 36.7539,
    "lng": 3.0589,
    "country": "Algeria",
    "iso2": "DZ",
    "iso3": "DZA",
    "admin_name": "Alger",
    "capital": "primary",
    "population": 3415811.0,
    "id": 1012973369
  },
  {
    "city": "Huambo",
    "city_ascii": "Huambo",
    "lat": -12.7767,
    "lng": 15.7347,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Huambo",
    "capital": "admin",
    "population": 665564.0,
    "id": 1024079828
  },
  {
    "city": "Lobito",
    "city_ascii": "Lobito",
    "lat": -12.3597,
    "lng": 13.5308,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Benguela",
    "capital": null,
    "population": 393079.0,
    "id": 1024128946
  },
  {
    "city": "Benguela",
    "city_ascii": "Benguela",
    "lat": -12.55,
    "lng": 13.4167,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Benguela",
    "capital": "admin",
    "population": 561775.0,
    "id": 1024141961
  },
  {
    "city": "Belas",
    "city_ascii": "Belas",
    "lat": -8.9983,
    "lng": 13.265,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Luanda",
    "capital": null,
    "population": 500000.0,
    "id": 1024196826
  },
  {
    "city": "Luena",
    "city_ascii": "Luena",
    "lat": -11.7918,
    "lng": 19.9062,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Moxico",
    "capital": "admin",
    "population": 357413.0,
    "id": 1024283760
  },
  {
    "city": "Saurimo",
    "city_ascii": "Saurimo",
    "lat": -9.65,
    "lng": 20.4,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Lunda-Sul",
    "capital": "admin",
    "population": 393000.0,
    "id": 1024326839
  },
  {
    "city": "Cabinda",
    "city_ascii": "Cabinda",
    "lat": -5.56,
    "lng": 12.19,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Cabinda",
    "capital": "admin",
    "population": 739182.0,
    "id": 1024474012
  },
  {
    "city": "Cacuaco",
    "city_ascii": "Cacuaco",
    "lat": -8.8053,
    "lng": 13.2444,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Luanda",
    "capital": null,
    "population": 1279488.0,
    "id": 1024559448
  },
  {
    "city": "Cubal",
    "city_ascii": "Cubal",
    "lat": -13.1117,
    "lng": 14.3672,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Benguela",
    "capital": null,
    "population": 357618.0,
    "id": 1024580158
  },
  {
    "city": "Lubango",
    "city_ascii": "Lubango",
    "lat": -14.9167,
    "lng": 13.5,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Huíla",
    "capital": "admin",
    "population": 776249.0,
    "id": 1024669127
  },
  {
    "city": "Malanje",
    "city_ascii": "Malanje",
    "lat": -9.5333,
    "lng": 16.35,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Malanje",
    "capital": "admin",
    "population": 604215.0,
    "id": 1024774947
  },
  {
    "city": "Cuito",
    "city_ascii": "Cuito",
    "lat": -12.3833,
    "lng": 16.9333,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Bié",
    "capital": "admin",
    "population": 355423.0,
    "id": 1024939858
  },
  {
    "city": "Luanda",
    "city_ascii": "Luanda",
    "lat": -8.8383,
    "lng": 13.2344,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Luanda",
    "capital": "primary",
    "population": 9051000.0,
    "id": 1024949724
  },
  {
    "city": "Talatona",
    "city_ascii": "Talatona",
    "lat": -8.9167,
    "lng": 13.1833,
    "country": "Angola",
    "iso2": "AO",
    "iso3": "AGO",
    "admin_name": "Luanda",
    "capital": null,
    "population": 500000.0,
    "id": 1024988332
  },
  {
    "city": "Sumqayıt",
    "city_ascii": "Sumqayit",
    "lat": 40.5917,
    "lng": 49.6397,
    "country": "Azerbaijan",
    "iso2": "AZ",
    "iso3": "AZE",
    "admin_name": "Sumqayıt",
    "capital": "admin",
    "population": 341200.0,
    "id": 1031630283
  },
  {
    "city": "Baku",
    "city_ascii": "Baku",
    "lat": 40.3667,
    "lng": 49.8352,
    "country": "Azerbaijan",
    "iso2": "AZ",
    "iso3": "AZE",
    "admin_name": "Bakı",
    "capital": "primary",
    "population": 2300500.0,
    "id": 1031946365
  },
  {
    "city": "Lanús",
    "city_ascii": "Lanus",
    "lat": -34.7,
    "lng": -58.4,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Buenos Aires",
    "capital": "minor",
    "population": 459263.0,
    "id": 1032009573
  },
  {
    "city": "Comodoro Rivadavia",
    "city_ascii": "Comodoro Rivadavia",
    "lat": -45.8647,
    "lng": -67.4808,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Chubut",
    "capital": "minor",
    "population": 730266.0,
    "id": 1032042035
  },
  {
    "city": "Corrientes",
    "city_ascii": "Corrientes",
    "lat": -27.4833,
    "lng": -58.8167,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Corrientes",
    "capital": "admin",
    "population": 352646.0,
    "id": 1032173097
  },
  {
    "city": "San Miguel de Tucumán",
    "city_ascii": "San Miguel de Tucuman",
    "lat": -26.8167,
    "lng": -65.2167,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Tucumán",
    "capital": "admin",
    "population": 605767.0,
    "id": 1032233996
  },
  {
    "city": "Mar del Plata",
    "city_ascii": "Mar del Plata",
    "lat": -38.0,
    "lng": -57.55,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Buenos Aires",
    "capital": "minor",
    "population": 682605.0,
    "id": 1032456103
  },
  {
    "city": "Santiago del Estero",
    "city_ascii": "Santiago del Estero",
    "lat": -27.7833,
    "lng": -64.2667,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Santiago del Estero",
    "capital": "admin",
    "population": 911506.0,
    "id": 1032492280
  },
  {
    "city": "Buenos Aires",
    "city_ascii": "Buenos Aires",
    "lat": -34.5997,
    "lng": -58.3819,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Buenos Aires, Ciudad Autónoma de",
    "capital": "primary",
    "population": 16710000.0,
    "id": 1032717330
  },
  {
    "city": "Florencio Varela",
    "city_ascii": "Florencio Varela",
    "lat": -34.8167,
    "lng": -58.2833,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Buenos Aires",
    "capital": null,
    "population": 426005.0,
    "id": 1032730758
  },
  {
    "city": "Rosario",
    "city_ascii": "Rosario",
    "lat": -32.9575,
    "lng": -60.6394,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Santa Fe",
    "capital": "minor",
    "population": 1276000.0,
    "id": 1032770677
  },
  {
    "city": "Córdoba",
    "city_ascii": "Cordoba",
    "lat": -31.4167,
    "lng": -64.1833,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Córdoba",
    "capital": "admin",
    "population": 1565112.0,
    "id": 1032803249
  },
  {
    "city": "Santa Fe",
    "city_ascii": "Santa Fe",
    "lat": -31.6333,
    "lng": -60.7,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Santa Fe",
    "capital": "admin",
    "population": 405683.0,
    "id": 1032817575
  },
  {
    "city": "San Juan",
    "city_ascii": "San Juan",
    "lat": -31.5342,
    "lng": -68.5261,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "San Juan",
    "capital": "admin",
    "population": 471389.0,
    "id": 1032869625
  },
  {
    "city": "Salta",
    "city_ascii": "Salta",
    "lat": -24.7833,
    "lng": -65.4167,
    "country": "Argentina",
    "iso2": "AR",
    "iso3": "ARG",
    "admin_name": "Salta",
    "capital": "admin",
    "population": 535303.0,
    "id": 1032926124
  },
  {
    "city": "Central Coast",
    "city_ascii": "Central Coast",
    "lat": -33.3,
    "lng": 151.2,
    "country": "Australia",
    "iso2": "AU",
    "iso3": "AUS",
    "admin_name": "New South Wales",
    "capital": null,
    "population": 346596.0,
    "id": 1036067845
  },
  {
    "city": "Sydney",
    "city_ascii": "Sydney",
    "lat": -33.8678,
    "lng": 151.21,
    "country": "Australia",
    "iso2": "AU",
    "iso3": "AUS",
    "admin_name": "New South Wales",
    "capital": "admin",
    "population": 4840600.0,
    "id": 1036074917
  },
  {
    "city": "Canberra",
    "city_ascii": "Canberra",
    "lat": -35.2931,
    "lng": 149.1269,
    "country": "Australia",
    "iso2": "AU",
    "iso3": "AUS",
    "admin_name": "Australian Capital Territory",
    "capital": "primary",
    "population": 381488.0,
    "id": 1036142029
  },
  {
    "city": "Gold Coast",
    "city_ascii": "Gold Coast",
    "lat": -28.0167,
    "lng": 153.4,
    "country": "Australia",
    "iso2": "AU",
    "iso3": "AUS",
    "admin_name": "Queensland",
    "capital": null,
    "population": 638090.0,
    "id": 1036153217
  },
  {
    "city": "Perth",
    "city_ascii": "Perth",
    "lat": -31.9559,
    "lng": 115.8606,
    "country": "Australia",
    "iso2": "AU",
    "iso3": "AUS",
    "admin_name": "Western Australia",
    "capital": "admin",
    "population": 2141834.0,
    "id": 1036178956
  },
  {
    "city": "Brisbane",
    "city_ascii": "Brisbane",
    "lat": -27.4678,
    "lng": 153.0281,
    "country": "Australia",
    "iso2": "AU",
    "iso3": "AUS",
    "admin_name": "Queensland",
    "capital": "admin",
    "population": 2360241.0,
    "id": 1036192929
  },
  {
    "city": "Melbourne",
    "city_ascii": "Melbourne",
    "lat": -37.8142,
    "lng": 144.9631,
    "country": "Australia",
    "iso2": "AU",
    "iso3": "AUS",
    "admin_name": "Victoria",
    "capital": "admin",
    "population": 4529500.0,
    "id": 1036533631
  },
  {
    "city": "Adelaide",
    "city_ascii": "Adelaide",
    "lat": -34.9275,
    "lng": 138.6,
    "country": "Australia",
    "iso2": "AU",
    "iso3": "AUS",
    "admin_name": "South Australia",
    "capital": "admin",
    "population": 1295714.0,
    "id": 1036538171
  },
  {
    "city": "Cranbourne",
    "city_ascii": "Cranbourne",
    "lat": -38.0996,
    "lng": 145.2834,
    "country": "Australia",
    "iso2": "AU",
    "iso3": "AUS",
    "admin_name": "Victoria",
    "capital": null,
    "population": 460491.0,
    "id": 1036685862
  },
  {
    "city": "Vienna",
    "city_ascii": "Vienna",
    "lat": 48.2083,
    "lng": 16.3725,
    "country": "Austria",
    "iso2": "AT",
    "iso3": "AUT",
    "admin_name": "Wien",
    "capital": "primary",
    "population": 1973403.0,
    "id": 1040261752
  },
  {
    "city": "Manama",
    "city_ascii": "Manama",
    "lat": 26.225,
    "lng": 50.5775,
    "country": "Bahrain",
    "iso2": "BH",
    "iso3": "BHR",
    "admin_name": "Al ‘Āşimah",
    "capital": "primary",
    "population": 436000.0,
    "id": 1048989486
  },
  {
    "city": "Kushtia",
    "city_ascii": "Kushtia",
    "lat": 23.9101,
    "lng": 89.1231,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Khulna",
    "capital": null,
    "population": 418312.0,
    "id": 1050000610
  },
  {
    "city": "Rangapukur",
    "city_ascii": "Rangapukur",
    "lat": 25.56,
    "lng": 89.25,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Rangpur",
    "capital": null,
    "population": 1031388.0,
    "id": 1050032005
  },
  {
    "city": "Tungi",
    "city_ascii": "Tungi",
    "lat": 23.9,
    "lng": 90.41,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Dhaka",
    "capital": null,
    "population": 350000.0,
    "id": 1050143008
  },
  {
    "city": "Farīdpur",
    "city_ascii": "Faridpur",
    "lat": 23.602,
    "lng": 89.833,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Dhaka",
    "capital": null,
    "population": 557632.0,
    "id": 1050187264
  },
  {
    "city": "Mymensingh",
    "city_ascii": "Mymensingh",
    "lat": 24.7539,
    "lng": 90.4031,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Mymensingh",
    "capital": "admin",
    "population": 576722.0,
    "id": 1050399881
  },
  {
    "city": "Nārāyanganj",
    "city_ascii": "Narayanganj",
    "lat": 23.62,
    "lng": 90.5,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Dhaka",
    "capital": null,
    "population": 1572386.0,
    "id": 1050424421
  },
  {
    "city": "Gāzipura",
    "city_ascii": "Gazipura",
    "lat": 23.9889,
    "lng": 90.375,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Dhaka",
    "capital": null,
    "population": 1199215.0,
    "id": 1050449249
  },
  {
    "city": "Dhaka",
    "city_ascii": "Dhaka",
    "lat": 23.7639,
    "lng": 90.3889,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Dhaka",
    "capital": "primary",
    "population": 18627000.0,
    "id": 1050529279
  },
  {
    "city": "Rājshāhi",
    "city_ascii": "Rajshahi",
    "lat": 24.3667,
    "lng": 88.6,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Rājshāhi",
    "capital": "admin",
    "population": 763580.0,
    "id": 1050547831
  },
  {
    "city": "Tāngāil",
    "city_ascii": "Tangail",
    "lat": 24.2644,
    "lng": 89.9181,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Dhaka",
    "capital": null,
    "population": 392300.0,
    "id": 1050628940
  },
  {
    "city": "Sylhet",
    "city_ascii": "Sylhet",
    "lat": 24.9,
    "lng": 91.8667,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Sylhet",
    "capital": "admin",
    "population": 479837.0,
    "id": 1050646703
  },
  {
    "city": "Khulna",
    "city_ascii": "Khulna",
    "lat": 22.8167,
    "lng": 89.55,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Khulna",
    "capital": "admin",
    "population": 1400689.0,
    "id": 1050667339
  },
  {
    "city": "Chauddagram",
    "city_ascii": "Chauddagram",
    "lat": 23.2283,
    "lng": 91.3133,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Chattogram",
    "capital": null,
    "population": 443648.0,
    "id": 1050749168
  },
  {
    "city": "Chattogram",
    "city_ascii": "Chattogram",
    "lat": 22.335,
    "lng": 91.8325,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Chattogram",
    "capital": "admin",
    "population": 7000000.0,
    "id": 1050830722
  },
  {
    "city": "Barura",
    "city_ascii": "Barura",
    "lat": 23.375,
    "lng": 91.0583,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Chattogram",
    "capital": null,
    "population": 473590.0,
    "id": 1050831924
  },
  {
    "city": "Bogra",
    "city_ascii": "Bogra",
    "lat": 24.85,
    "lng": 89.3667,
    "country": "Bangladesh",
    "iso2": "BD",
    "iso3": "BGD",
    "admin_name": "Rājshāhi",
    "capital": null,
    "population": 400983.0,
    "id": 1050833664
  },
  {
    "city": "Yerevan",
    "city_ascii": "Yerevan",
    "lat": 40.1814,
    "lng": 44.5144,
    "country": "Armenia",
    "iso2": "AM",
    "iso3": "ARM",
    "admin_name": "Yerevan",
    "capital": "primary",
    "population": 1075800.0,
    "id": 1051074169
  },
  {
    "city": "Antwerp",
    "city_ascii": "Antwerp",
    "lat": 51.2178,
    "lng": 4.4003,
    "country": "Belgium",
    "iso2": "BE",
    "iso3": "BEL",
    "admin_name": "Flanders",
    "capital": "minor",
    "population": 529247.0,
    "id": 1056168623
  },
  {
    "city": "Brussels",
    "city_ascii": "Brussels",
    "lat": 50.8467,
    "lng": 4.3525,
    "country": "Belgium",
    "iso2": "BE",
    "iso3": "BEL",
    "admin_name": "Brussels-Capital Region",
    "capital": "primary",
    "population": 1743000.0,
    "id": 1056469830
  },
  {
    "city": "La Paz",
    "city_ascii": "La Paz",
    "lat": -16.5,
    "lng": -68.15,
    "country": "Bolivia",
    "iso2": "BO",
    "iso3": "BOL",
    "admin_name": "La Paz",
    "capital": "primary",
    "population": 2867504.0,
    "id": 1068000064
  },
  {
    "city": "El Alto",
    "city_ascii": "El Alto",
    "lat": -16.5047,
    "lng": -68.1633,
    "country": "Bolivia",
    "iso2": "BO",
    "iso3": "BOL",
    "admin_name": "La Paz",
    "capital": null,
    "population": 943000.0,
    "id": 1068007058
  },
  {
    "city": "Santa Cruz",
    "city_ascii": "Santa Cruz",
    "lat": -17.7892,
    "lng": -63.1975,
    "country": "Bolivia",
    "iso2": "BO",
    "iso3": "BOL",
    "admin_name": "Santa Cruz",
    "capital": "admin",
    "population": 3151676.0,
    "id": 1068129363
  },
  {
    "city": "Oruro",
    "city_ascii": "Oruro",
    "lat": -17.9667,
    "lng": -67.1167,
    "country": "Bolivia",
    "iso2": "BO",
    "iso3": "BOL",
    "admin_name": "Oruro",
    "capital": null,
    "population": 351802.0,
    "id": 1068626742
  },
  {
    "city": "Cochabamba",
    "city_ascii": "Cochabamba",
    "lat": -17.3833,
    "lng": -66.1667,
    "country": "Bolivia",
    "iso2": "BO",
    "iso3": "BOL",
    "admin_name": "Cochabamba",
    "capital": "admin",
    "population": 856198.0,
    "id": 1068793894
  },
  {
    "city": "Sarajevo",
    "city_ascii": "Sarajevo",
    "lat": 43.8564,
    "lng": 18.4131,
    "country": "Bosnia and Herzegovina",
    "iso2": "BA",
    "iso3": "BIH",
    "admin_name": "Bosnia and Herzegovina, Federation of",
    "capital": "primary",
    "population": 419957.0,
    "id": 1070966777
  },
  {
    "city": "Jaboatão",
    "city_ascii": "Jaboatao",
    "lat": -8.1803,
    "lng": -35.0014,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Pernambuco",
    "capital": null,
    "population": 702621.0,
    "id": 1076000699
  },
  {
    "city": "Juiz de Fora",
    "city_ascii": "Juiz de Fora",
    "lat": -21.7619,
    "lng": -43.3494,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Minas Gerais",
    "capital": null,
    "population": 573285.0,
    "id": 1076006144
  },
  {
    "city": "Maringá",
    "city_ascii": "Maringa",
    "lat": -23.4,
    "lng": -51.9167,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Paraná",
    "capital": null,
    "population": 403063.0,
    "id": 1076013378
  },
  {
    "city": "Ananindeua",
    "city_ascii": "Ananindeua",
    "lat": -1.3658,
    "lng": -48.3719,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Pará",
    "capital": null,
    "population": 540410.0,
    "id": 1076025295
  },
  {
    "city": "Santos",
    "city_ascii": "Santos",
    "lat": -23.9369,
    "lng": -46.325,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 1897551.0,
    "id": 1076033299
  },
  {
    "city": "Goiânia",
    "city_ascii": "Goiania",
    "lat": -16.6667,
    "lng": -49.25,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Goiás",
    "capital": "admin",
    "population": 1393575.0,
    "id": 1076034054
  },
  {
    "city": "Porto Velho",
    "city_ascii": "Porto Velho",
    "lat": -8.7619,
    "lng": -63.9039,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Rondônia",
    "capital": "admin",
    "population": 428527.0,
    "id": 1076045591
  },
  {
    "city": "Joinvile",
    "city_ascii": "Joinvile",
    "lat": -26.3204,
    "lng": -48.8437,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Santa Catarina",
    "capital": null,
    "population": 515288.0,
    "id": 1076050637
  },
  {
    "city": "Cuiabá",
    "city_ascii": "Cuiaba",
    "lat": -15.5958,
    "lng": -56.0969,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Mato Grosso",
    "capital": "admin",
    "population": 585367.0,
    "id": 1076112309
  },
  {
    "city": "Montes Claros",
    "city_ascii": "Montes Claros",
    "lat": -16.7306,
    "lng": -43.8639,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Minas Gerais",
    "capital": null,
    "population": 361915.0,
    "id": 1076113275
  },
  {
    "city": "Recife",
    "city_ascii": "Recife",
    "lat": -8.05,
    "lng": -34.9,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Pernambuco",
    "capital": "admin",
    "population": 1653461.0,
    "id": 1076137337
  },
  {
    "city": "Brasília",
    "city_ascii": "Brasilia",
    "lat": -15.7939,
    "lng": -47.8828,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Distrito Federal",
    "capital": "primary",
    "population": 3039444.0,
    "id": 1076144436
  },
  {
    "city": "Campinas",
    "city_ascii": "Campinas",
    "lat": -22.9058,
    "lng": -47.0608,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 1213792.0,
    "id": 1076145766
  },
  {
    "city": "Piracicaba",
    "city_ascii": "Piracicaba",
    "lat": -22.7253,
    "lng": -47.6492,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 391449.0,
    "id": 1076166252
  },
  {
    "city": "Macapá",
    "city_ascii": "Macapa",
    "lat": 0.033,
    "lng": -51.0653,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Amapá",
    "capital": "admin",
    "population": 512902.0,
    "id": 1076189884
  },
  {
    "city": "Florianópolis",
    "city_ascii": "Florianopolis",
    "lat": -27.6122,
    "lng": -48.4853,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Santa Catarina",
    "capital": "admin",
    "population": 477798.0,
    "id": 1076190259
  },
  {
    "city": "Serra",
    "city_ascii": "Serra",
    "lat": -20.1289,
    "lng": -40.3078,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Espírito Santo",
    "capital": null,
    "population": 485376.0,
    "id": 1076191325
  },
  {
    "city": "Anápolis",
    "city_ascii": "Anapolis",
    "lat": -16.3339,
    "lng": -48.9519,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Goiás",
    "capital": null,
    "population": 366491.0,
    "id": 1076208869
  },
  {
    "city": "Campina Grande",
    "city_ascii": "Campina Grande",
    "lat": -7.2306,
    "lng": -35.8811,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Paraíba",
    "capital": null,
    "population": 405072.0,
    "id": 1076218697
  },
  {
    "city": "Natal",
    "city_ascii": "Natal",
    "lat": -6.9838,
    "lng": -60.2699,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Amazonas",
    "capital": null,
    "population": 980588.0,
    "id": 1076336975
  },
  {
    "city": "Iguaçu",
    "city_ascii": "Iguacu",
    "lat": -22.74,
    "lng": -43.47,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Rio de Janeiro",
    "capital": null,
    "population": 844583.0,
    "id": 1076339714
  },
  {
    "city": "Vitória",
    "city_ascii": "Vitoria",
    "lat": -20.2889,
    "lng": -40.3083,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Espírito Santo",
    "capital": "admin",
    "population": 355875.0,
    "id": 1076376829
  },
  {
    "city": "Rio Branco",
    "city_ascii": "Rio Branco",
    "lat": -9.9747,
    "lng": -67.81,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Acre",
    "capital": "admin",
    "population": 413418.0,
    "id": 1076391263
  },
  {
    "city": "Caruaru",
    "city_ascii": "Caruaru",
    "lat": -8.2828,
    "lng": -35.9758,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Pernambuco",
    "capital": null,
    "population": 347088.0,
    "id": 1076397475
  },
  {
    "city": "Vila Velha",
    "city_ascii": "Vila Velha",
    "lat": -20.3364,
    "lng": -40.2936,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Espírito Santo",
    "capital": null,
    "population": 472762.0,
    "id": 1076404077
  },
  {
    "city": "Abaeté",
    "city_ascii": "Abaete",
    "lat": -19.1583,
    "lng": -45.4522,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Minas Gerais",
    "capital": null,
    "population": 800000.0,
    "id": 1076413528
  },
  {
    "city": "Maceió",
    "city_ascii": "Maceio",
    "lat": -9.6658,
    "lng": -35.735,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Alagoas",
    "capital": "admin",
    "population": 1025360.0,
    "id": 1076440479
  },
  {
    "city": "Mauá",
    "city_ascii": "Maua",
    "lat": -23.6678,
    "lng": -46.4608,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 453286.0,
    "id": 1076477498
  },
  {
    "city": "Cariacica",
    "city_ascii": "Cariacica",
    "lat": -20.2639,
    "lng": -40.42,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Espírito Santo",
    "capital": null,
    "population": 348738.0,
    "id": 1076479479
  },
  {
    "city": "São Gonçalo",
    "city_ascii": "Sao Goncalo",
    "lat": -22.8269,
    "lng": -43.0539,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Rio de Janeiro",
    "capital": null,
    "population": 1077687.0,
    "id": 1076485783
  },
  {
    "city": "Uberlândia",
    "city_ascii": "Uberlandia",
    "lat": -18.9231,
    "lng": -48.2886,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Minas Gerais",
    "capital": null,
    "population": 604013.0,
    "id": 1076495001
  },
  {
    "city": "Niterói",
    "city_ascii": "Niteroi",
    "lat": -22.8833,
    "lng": -43.1036,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Rio de Janeiro",
    "capital": null,
    "population": 496696.0,
    "id": 1076501425
  },
  {
    "city": "Ribeirão Prêto",
    "city_ascii": "Ribeirao Preto",
    "lat": -21.1783,
    "lng": -47.8067,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 711825.0,
    "id": 1076524478
  },
  {
    "city": "Aracaju",
    "city_ascii": "Aracaju",
    "lat": -10.9167,
    "lng": -37.05,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Sergipe",
    "capital": "admin",
    "population": 632744.0,
    "id": 1076527830
  },
  {
    "city": "São Paulo",
    "city_ascii": "Sao Paulo",
    "lat": -23.55,
    "lng": -46.6333,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": "admin",
    "population": 23086000.0,
    "id": 1076532519
  },
  {
    "city": "Fortaleza",
    "city_ascii": "Fortaleza",
    "lat": -3.7275,
    "lng": -38.5275,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Ceará",
    "capital": "admin",
    "population": 2452185.0,
    "id": 1076567885
  },
  {
    "city": "Vila Velha",
    "city_ascii": "Vila Velha",
    "lat": 3.2167,
    "lng": -51.2167,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Amapá",
    "capital": null,
    "population": 1209091.0,
    "id": 1076575691
  },
  {
    "city": "Campos",
    "city_ascii": "Campos",
    "lat": -21.7539,
    "lng": -41.3239,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Rio de Janeiro",
    "capital": null,
    "population": 463731.0,
    "id": 1076606365
  },
  {
    "city": "Manaus",
    "city_ascii": "Manaus",
    "lat": -3.1,
    "lng": -60.0167,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Amazonas",
    "capital": "admin",
    "population": 2219580.0,
    "id": 1076607274
  },
  {
    "city": "Blumenau",
    "city_ascii": "Blumenau",
    "lat": -26.9333,
    "lng": -49.05,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Santa Catarina",
    "capital": null,
    "population": 361855.0,
    "id": 1076618665
  },
  {
    "city": "Boa Vista",
    "city_ascii": "Boa Vista",
    "lat": 2.8194,
    "lng": -60.6714,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Roraima",
    "capital": "admin",
    "population": 419652.0,
    "id": 1076621300
  },
  {
    "city": "Santo André",
    "city_ascii": "Santo Andre",
    "lat": -23.6572,
    "lng": -46.5333,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 721368.0,
    "id": 1076625886
  },
  {
    "city": "Belém",
    "city_ascii": "Belem",
    "lat": -1.4558,
    "lng": -48.5039,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Pará",
    "capital": "admin",
    "population": 1499641.0,
    "id": 1076646823
  },
  {
    "city": "Porto Alegre",
    "city_ascii": "Porto Alegre",
    "lat": -30.0331,
    "lng": -51.23,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Rio Grande do Sul",
    "capital": "admin",
    "population": 1484941.0,
    "id": 1076658221
  },
  {
    "city": "Campo Grande",
    "city_ascii": "Campo Grande",
    "lat": -20.4839,
    "lng": -54.615,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Mato Grosso do Sul",
    "capital": "admin",
    "population": 906092.0,
    "id": 1076660445
  },
  {
    "city": "Natal",
    "city_ascii": "Natal",
    "lat": -5.7833,
    "lng": -35.2,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Rio Grande do Norte",
    "capital": "admin",
    "population": 877662.0,
    "id": 1076697777
  },
  {
    "city": "Curitiba",
    "city_ascii": "Curitiba",
    "lat": -25.4297,
    "lng": -49.2711,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Paraná",
    "capital": "admin",
    "population": 1879355.0,
    "id": 1076701712
  },
  {
    "city": "Londrina",
    "city_ascii": "Londrina",
    "lat": -23.31,
    "lng": -51.1628,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Paraná",
    "capital": null,
    "population": 548249.0,
    "id": 1076723241
  },
  {
    "city": "Teresina",
    "city_ascii": "Teresina",
    "lat": -5.0949,
    "lng": -42.8042,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Piauí",
    "capital": "admin",
    "population": 953172.0,
    "id": 1076727667
  },
  {
    "city": "Guarulhos",
    "city_ascii": "Guarulhos",
    "lat": -23.4628,
    "lng": -46.5328,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 1324781.0,
    "id": 1076730420
  },
  {
    "city": "Franca",
    "city_ascii": "Franca",
    "lat": -20.5389,
    "lng": -47.4008,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 358539.0,
    "id": 1076740256
  },
  {
    "city": "Sorocaba",
    "city_ascii": "Sorocaba",
    "lat": -23.5017,
    "lng": -47.4581,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 644919.0,
    "id": 1076758708
  },
  {
    "city": "São José do Rio Prêto",
    "city_ascii": "Sao Jose do Rio Preto",
    "lat": -20.8081,
    "lng": -49.3811,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 469173.0,
    "id": 1076760827
  },
  {
    "city": "São José dos Campos",
    "city_ascii": "Sao Jose dos Campos",
    "lat": -23.1789,
    "lng": -45.8869,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 729737.0,
    "id": 1076783887
  },
  {
    "city": "Olinda",
    "city_ascii": "Olinda",
    "lat": -8.0,
    "lng": -34.8833,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Pernambuco",
    "capital": null,
    "population": 393115.0,
    "id": 1076784718
  },
  {
    "city": "Osasco",
    "city_ascii": "Osasco",
    "lat": -23.5328,
    "lng": -46.7919,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 694844.0,
    "id": 1076786452
  },
  {
    "city": "São Bernardo do Campo",
    "city_ascii": "Sao Bernardo do Campo",
    "lat": -23.7,
    "lng": -46.55,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 816925.0,
    "id": 1076793227
  },
  {
    "city": "Caxias do Sul",
    "city_ascii": "Caxias do Sul",
    "lat": -29.1667,
    "lng": -51.1833,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Rio Grande do Sul",
    "capital": null,
    "population": 435564.0,
    "id": 1076809957
  },
  {
    "city": "Vitória da Conquista",
    "city_ascii": "Vitoria da Conquista",
    "lat": -14.8658,
    "lng": -40.8389,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Bahia",
    "capital": null,
    "population": 343230.0,
    "id": 1076812020
  },
  {
    "city": "São Luís",
    "city_ascii": "Sao Luis",
    "lat": -2.5283,
    "lng": -44.3044,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Maranhão",
    "capital": "admin",
    "population": 1108975.0,
    "id": 1076819308
  },
  {
    "city": "Contagem",
    "city_ascii": "Contagem",
    "lat": -19.9319,
    "lng": -44.0539,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Minas Gerais",
    "capital": null,
    "population": 648766.0,
    "id": 1076845191
  },
  {
    "city": "São Vicente",
    "city_ascii": "Sao Vicente",
    "lat": -23.9633,
    "lng": -46.3922,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 355542.0,
    "id": 1076857089
  },
  {
    "city": "Mogi das Cruzes",
    "city_ascii": "Mogi das Cruzes",
    "lat": -23.5228,
    "lng": -46.1878,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 450785.0,
    "id": 1076857883
  },
  {
    "city": "Diadema",
    "city_ascii": "Diadema",
    "lat": -23.6861,
    "lng": -46.6106,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 426757.0,
    "id": 1076867279
  },
  {
    "city": "Caucaia",
    "city_ascii": "Caucaia",
    "lat": -3.7167,
    "lng": -38.65,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Ceará",
    "capital": null,
    "population": 368918.0,
    "id": 1076870058
  },
  {
    "city": "Carapicuíba",
    "city_ascii": "Carapicuiba",
    "lat": -23.5192,
    "lng": -46.8358,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 403183.0,
    "id": 1076874103
  },
  {
    "city": "Rio de Janeiro",
    "city_ascii": "Rio de Janeiro",
    "lat": -22.9111,
    "lng": -43.2056,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Rio de Janeiro",
    "capital": "admin",
    "population": 12592000.0,
    "id": 1076887657
  },
  {
    "city": "Feira de Santana",
    "city_ascii": "Feira de Santana",
    "lat": -12.25,
    "lng": -38.95,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Bahia",
    "capital": null,
    "population": 617528.0,
    "id": 1076892244
  },
  {
    "city": "Bauru",
    "city_ascii": "Bauru",
    "lat": -22.315,
    "lng": -49.0608,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 366992.0,
    "id": 1076905338
  },
  {
    "city": "João Pessoa",
    "city_ascii": "Joao Pessoa",
    "lat": -7.12,
    "lng": -34.88,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Paraíba",
    "capital": "admin",
    "population": 801718.0,
    "id": 1076922014
  },
  {
    "city": "Salvador",
    "city_ascii": "Salvador",
    "lat": -12.9747,
    "lng": -38.4767,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Bahia",
    "capital": "admin",
    "population": 2886698.0,
    "id": 1076923789
  },
  {
    "city": "Itaquaquecetuba",
    "city_ascii": "Itaquaquecetuba",
    "lat": -23.4864,
    "lng": -46.3486,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 352801.0,
    "id": 1076942224
  },
  {
    "city": "Betim",
    "city_ascii": "Betim",
    "lat": -19.9678,
    "lng": -44.1978,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Minas Gerais",
    "capital": null,
    "population": 378089.0,
    "id": 1076953384
  },
  {
    "city": "Belo Horizonte",
    "city_ascii": "Belo Horizonte",
    "lat": -19.9167,
    "lng": -43.9333,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "Minas Gerais",
    "capital": "admin",
    "population": 5328000.0,
    "id": 1076967355
  },
  {
    "city": "Jundiaí",
    "city_ascii": "Jundiai",
    "lat": -23.1858,
    "lng": -46.8839,
    "country": "Brazil",
    "iso2": "BR",
    "iso3": "BRA",
    "admin_name": "São Paulo",
    "capital": null,
    "population": 401896.0,
    "id": 1076998392
  },
  {
    "city": "Plovdiv",
    "city_ascii": "Plovdiv",
    "lat": 42.15,
    "lng": 24.75,
    "country": "Bulgaria",
    "iso2": "BG",
    "iso3": "BGR",
    "admin_name": "Plovdiv",
    "capital": "admin",
    "population": 383540.0,
    "id": 1100436706
  },
  {
    "city": "Sofia",
    "city_ascii": "Sofia",
    "lat": 42.7,
    "lng": 23.33,
    "country": "Bulgaria",
    "iso2": "BG",
    "iso3": "BGR",
    "admin_name": "Sofia-Grad",
    "capital": "primary",
    "population": 1547779.0,
    "id": 1100762037
  },
  {
    "city": "Varna",
    "city_ascii": "Varna",
    "lat": 43.2167,
    "lng": 27.9167,
    "country": "Bulgaria",
    "iso2": "BG",
    "iso3": "BGR",
    "admin_name": "Varna",
    "capital": "admin",
    "population": 348668.0,
    "id": 1100789115
  },
  {
    "city": "Maungdaw",
    "city_ascii": "Maungdaw",
    "lat": 20.8167,
    "lng": 92.3667,
    "country": "Myanmar",
    "iso2": "MM",
    "iso3": "MMR",
    "admin_name": "Rakhine State",
    "capital": null,
    "population": 400000.0,
    "id": 1104000431
  },
  {
    "city": "Taunggyi",
    "city_ascii": "Taunggyi",
    "lat": 20.7836,
    "lng": 97.0354,
    "country": "Myanmar",
    "iso2": "MM",
    "iso3": "MMR",
    "admin_name": "Shan State",
    "capital": "admin",
    "population": 381639.0,
    "id": 1104364374
  },
  {
    "city": "Mandalay",
    "city_ascii": "Mandalay",
    "lat": 21.9831,
    "lng": 96.0844,
    "country": "Myanmar",
    "iso2": "MM",
    "iso3": "MMR",
    "admin_name": "Mandalay",
    "capital": "admin",
    "population": 1319452.0,
    "id": 1104468217
  },
  {
    "city": "Hpa-An",
    "city_ascii": "Hpa-An",
    "lat": 16.8906,
    "lng": 97.6333,
    "country": "Myanmar",
    "iso2": "MM",
    "iso3": "MMR",
    "admin_name": "Kayin State",
    "capital": "admin",
    "population": 421525.0,
    "id": 1104494124
  },
  {
    "city": "Rangoon",
    "city_ascii": "Rangoon",
    "lat": 16.795,
    "lng": 96.16,
    "country": "Myanmar",
    "iso2": "MM",
    "iso3": "MMR",
    "admin_name": "Yangon",
    "capital": "primary",
    "population": 5209541.0,
    "id": 1104616656
  },
  {
    "city": "Kyaukse",
    "city_ascii": "Kyaukse",
    "lat": 21.6131,
    "lng": 96.1303,
    "country": "Myanmar",
    "iso2": "MM",
    "iso3": "MMR",
    "admin_name": "Mandalay",
    "capital": null,
    "population": 741071.0,
    "id": 1104814217
  },
  {
    "city": "Nay Pyi Taw",
    "city_ascii": "Nay Pyi Taw",
    "lat": 19.7475,
    "lng": 96.115,
    "country": "Myanmar",
    "iso2": "MM",
    "iso3": "MMR",
    "admin_name": "Nay Pyi Taw",
    "capital": "primary",
    "population": 1160242.0,
    "id": 1104838105
  },
  {
    "city": "Bujumbura",
    "city_ascii": "Bujumbura",
    "lat": -3.3833,
    "lng": 29.3667,
    "country": "Burundi",
    "iso2": "BI",
    "iso3": "BDI",
    "admin_name": "Bujumbura Mairie",
    "capital": "primary",
    "population": 1075000.0,
    "id": 1108101689
  },
  {
    "city": "Hrodna",
    "city_ascii": "Hrodna",
    "lat": 53.6667,
    "lng": 23.8333,
    "country": "Belarus",
    "iso2": "BY",
    "iso3": "BLR",
    "admin_name": "Hrodzyenskaya Voblasts’",
    "capital": "admin",
    "population": 357493.0,
    "id": 1112187197
  },
  {
    "city": "Minsk",
    "city_ascii": "Minsk",
    "lat": 53.9,
    "lng": 27.5667,
    "country": "Belarus",
    "iso2": "BY",
    "iso3": "BLR",
    "admin_name": "Minsk",
    "capital": "primary",
    "population": 2009786.0,
    "id": 1112348503
  },
  {
    "city": "Vitsyebsk",
    "city_ascii": "Vitsyebsk",
    "lat": 55.1917,
    "lng": 30.2056,
    "country": "Belarus",
    "iso2": "BY",
    "iso3": "BLR",
    "admin_name": "Vitsyebskaya Voblasts’",
    "capital": "admin",
    "population": 366299.0,
    "id": 1112480679
  },
  {
    "city": "Mahilyow",
    "city_ascii": "Mahilyow",
    "lat": 53.9167,
    "lng": 30.35,
    "country": "Belarus",
    "iso2": "BY",
    "iso3": "BLR",
    "admin_name": "Mahilyowskaya Voblasts’",
    "capital": "admin",
    "population": 357100.0,
    "id": 1112518993
  },
  {
    "city": "Homyel’",
    "city_ascii": "Homyel'",
    "lat": 52.4453,
    "lng": 30.9842,
    "country": "Belarus",
    "iso2": "BY",
    "iso3": "BLR",
    "admin_name": "Homyel’skaya Voblasts’",
    "capital": "admin",
    "population": 510300.0,
    "id": 1112580227
  },
  {
    "city": "Brest",
    "city_ascii": "Brest",
    "lat": 52.1347,
    "lng": 23.6569,
    "country": "Belarus",
    "iso2": "BY",
    "iso3": "BLR",
    "admin_name": "Brestskaya Voblasts’",
    "capital": "admin",
    "population": 340723.0,
    "id": 1112896927
  },
  {
    "city": "Phnom Penh",
    "city_ascii": "Phnom Penh",
    "lat": 11.5694,
    "lng": 104.9211,
    "country": "Cambodia",
    "iso2": "KH",
    "iso3": "KHM",
    "admin_name": "Phnom Penh",
    "capital": "primary",
    "population": 2129371.0,
    "id": 1116260534
  },
  {
    "city": "Yaoundé",
    "city_ascii": "Yaounde",
    "lat": 3.8667,
    "lng": 11.5167,
    "country": "Cameroon",
    "iso2": "CM",
    "iso3": "CMR",
    "admin_name": "Centre",
    "capital": "primary",
    "population": 2440462.0,
    "id": 1120298240
  },
  {
    "city": "Bafoussam",
    "city_ascii": "Bafoussam",
    "lat": 5.4667,
    "lng": 10.4167,
    "country": "Cameroon",
    "iso2": "CM",
    "iso3": "CMR",
    "admin_name": "Ouest",
    "capital": "admin",
    "population": 1146000.0,
    "id": 1120435460
  },
  {
    "city": "Douala",
    "city_ascii": "Douala",
    "lat": 4.05,
    "lng": 9.7,
    "country": "Cameroon",
    "iso2": "CM",
    "iso3": "CMR",
    "admin_name": "Littoral",
    "capital": "admin",
    "population": 5768400.0,
    "id": 1120494607
  },
  {
    "city": "Garoua",
    "city_ascii": "Garoua",
    "lat": 9.3,
    "lng": 13.4,
    "country": "Cameroon",
    "iso2": "CM",
    "iso3": "CMR",
    "admin_name": "Nord",
    "capital": "admin",
    "population": 600000.0,
    "id": 1120803808
  },
  {
    "city": "Bamenda",
    "city_ascii": "Bamenda",
    "lat": 5.9614,
    "lng": 10.1517,
    "country": "Cameroon",
    "iso2": "CM",
    "iso3": "CMR",
    "admin_name": "North-West",
    "capital": "admin",
    "population": 2000000.0,
    "id": 1120909610
  },
  {
    "city": "Surrey",
    "city_ascii": "Surrey",
    "lat": 49.19,
    "lng": -122.8489,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "British Columbia",
    "capital": null,
    "population": 517887.0,
    "id": 1124001454
  },
  {
    "city": "Mississauga",
    "city_ascii": "Mississauga",
    "lat": 43.6,
    "lng": -79.65,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Ontario",
    "capital": null,
    "population": 721599.0,
    "id": 1124112672
  },
  {
    "city": "Halifax",
    "city_ascii": "Halifax",
    "lat": 44.6475,
    "lng": -63.5906,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Nova Scotia",
    "capital": "admin",
    "population": 403131.0,
    "id": 1124130981
  },
  {
    "city": "Kitchener",
    "city_ascii": "Kitchener",
    "lat": 43.4186,
    "lng": -80.4728,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Ontario",
    "capital": null,
    "population": 470015.0,
    "id": 1124158530
  },
  {
    "city": "Winnipeg",
    "city_ascii": "Winnipeg",
    "lat": 49.8844,
    "lng": -97.1464,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Manitoba",
    "capital": "admin",
    "population": 705244.0,
    "id": 1124224963
  },
  {
    "city": "Toronto",
    "city_ascii": "Toronto",
    "lat": 43.7417,
    "lng": -79.3733,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Ontario",
    "capital": "admin",
    "population": 5429524.0,
    "id": 1124279679
  },
  {
    "city": "Edmonton",
    "city_ascii": "Edmonton",
    "lat": 53.5344,
    "lng": -113.4903,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Alberta",
    "capital": "admin",
    "population": 1062643.0,
    "id": 1124290735
  },
  {
    "city": "Ottawa",
    "city_ascii": "Ottawa",
    "lat": 45.4247,
    "lng": -75.695,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Ontario",
    "capital": "primary",
    "population": 989567.0,
    "id": 1124399363
  },
  {
    "city": "London",
    "city_ascii": "London",
    "lat": 42.9836,
    "lng": -81.2497,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Ontario",
    "capital": null,
    "population": 383822.0,
    "id": 1124469960
  },
  {
    "city": "Hamilton",
    "city_ascii": "Hamilton",
    "lat": 43.2567,
    "lng": -79.8692,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Ontario",
    "capital": null,
    "population": 693645.0,
    "id": 1124567288
  },
  {
    "city": "Montréal",
    "city_ascii": "Montreal",
    "lat": 45.5089,
    "lng": -73.5617,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Quebec",
    "capital": null,
    "population": 3519595.0,
    "id": 1124586170
  },
  {
    "city": "Brampton",
    "city_ascii": "Brampton",
    "lat": 43.6833,
    "lng": -79.7667,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Ontario",
    "capital": null,
    "population": 593638.0,
    "id": 1124625989
  },
  {
    "city": "Calgary",
    "city_ascii": "Calgary",
    "lat": 51.05,
    "lng": -114.0667,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Alberta",
    "capital": null,
    "population": 1239220.0,
    "id": 1124690423
  },
  {
    "city": "Quebec City",
    "city_ascii": "Quebec City",
    "lat": 46.8139,
    "lng": -71.2081,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Quebec",
    "capital": "admin",
    "population": 705103.0,
    "id": 1124823933
  },
  {
    "city": "Vancouver",
    "city_ascii": "Vancouver",
    "lat": 49.25,
    "lng": -123.1,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "British Columbia",
    "capital": null,
    "population": 2264823.0,
    "id": 1124825478
  },
  {
    "city": "Laval",
    "city_ascii": "Laval",
    "lat": 45.5833,
    "lng": -73.75,
    "country": "Canada",
    "iso2": "CA",
    "iso3": "CAN",
    "admin_name": "Quebec",
    "capital": null,
    "population": 422993.0,
    "id": 1124922301
  },
  {
    "city": "Bangui",
    "city_ascii": "Bangui",
    "lat": 4.3733,
    "lng": 18.5628,
    "country": "Central African Republic",
    "iso2": "CF",
    "iso3": "CAF",
    "admin_name": "Bangui",
    "capital": "primary",
    "population": 889231.0,
    "id": 1140080881
  },
  {
    "city": "Colombo",
    "city_ascii": "Colombo",
    "lat": 6.9344,
    "lng": 79.8428,
    "country": "Sri Lanka",
    "iso2": "LK",
    "iso3": "LKA",
    "admin_name": "Western",
    "capital": "primary",
    "population": 2323826.0,
    "id": 1144251314
  },
  {
    "city": "N’Djamena",
    "city_ascii": "N'Djamena",
    "lat": 12.11,
    "lng": 15.05,
    "country": "Chad",
    "iso2": "TD",
    "iso3": "TCD",
    "admin_name": "N’Djamena",
    "capital": "primary",
    "population": 1092066.0,
    "id": 1148708596
  },
  {
    "city": "Puente Alto",
    "city_ascii": "Puente Alto",
    "lat": -33.6167,
    "lng": -70.5667,
    "country": "Chile",
    "iso2": "CL",
    "iso3": "CHL",
    "admin_name": "Región Metropolitana",
    "capital": "minor",
    "population": 573935.0,
    "id": 1152516346
  },
  {
    "city": "Santiago",
    "city_ascii": "Santiago",
    "lat": -33.4372,
    "lng": -70.6506,
    "country": "Chile",
    "iso2": "CL",
    "iso3": "CHL",
    "admin_name": "Región Metropolitana",
    "capital": "primary",
    "population": 7171000.0,
    "id": 1152554349
  },
  {
    "city": "Maipú",
    "city_ascii": "Maipu",
    "lat": -33.5167,
    "lng": -70.7667,
    "country": "Chile",
    "iso2": "CL",
    "iso3": "CHL",
    "admin_name": "Región Metropolitana",
    "capital": null,
    "population": 521627.0,
    "id": 1152583016
  },
  {
    "city": "Antofagasta",
    "city_ascii": "Antofagasta",
    "lat": -23.65,
    "lng": -70.4,
    "country": "Chile",
    "iso2": "CL",
    "iso3": "CHL",
    "admin_name": "Antofagasta",
    "capital": "admin",
    "population": 348517.0,
    "id": 1152734289
  },
  {
    "city": "Concepción",
    "city_ascii": "Concepcion",
    "lat": -36.8282,
    "lng": -73.0514,
    "country": "Chile",
    "iso2": "CL",
    "iso3": "CHL",
    "admin_name": "Biobío",
    "capital": "admin",
    "population": 719944.0,
    "id": 1152838958
  },
  {
    "city": "La Florida",
    "city_ascii": "La Florida",
    "lat": -33.5333,
    "lng": -70.5833,
    "country": "Chile",
    "iso2": "CL",
    "iso3": "CHL",
    "admin_name": "Región Metropolitana",
    "capital": null,
    "population": 366916.0,
    "id": 1152939649
  },
  {
    "city": "Cencheng",
    "city_ascii": "Cencheng",
    "lat": 22.9297,
    "lng": 111.0186,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 772113.0,
    "id": 1156000460
  },
  {
    "city": "Yongji",
    "city_ascii": "Yongji",
    "lat": 34.867,
    "lng": 110.4417,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": null,
    "population": 444724.0,
    "id": 1156001205
  },
  {
    "city": "Xiaoganzhan",
    "city_ascii": "Xiaoganzhan",
    "lat": 30.9273,
    "lng": 113.911,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 4921000.0,
    "id": 1156002290
  },
  {
    "city": "Lengshuijiang",
    "city_ascii": "Lengshuijiang",
    "lat": 27.6858,
    "lng": 111.4279,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": null,
    "population": 370300.0,
    "id": 1156002852
  },
  {
    "city": "Liaocheng",
    "city_ascii": "Liaocheng",
    "lat": 36.45,
    "lng": 115.9833,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 5952128.0,
    "id": 1156006600
  },
  {
    "city": "Yatou",
    "city_ascii": "Yatou",
    "lat": 37.1653,
    "lng": 122.4867,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 714211.0,
    "id": 1156009046
  },
  {
    "city": "Loudi",
    "city_ascii": "Loudi",
    "lat": 27.7378,
    "lng": 111.9974,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": null,
    "population": 3931800.0,
    "id": 1156010654
  },
  {
    "city": "Changsha",
    "city_ascii": "Changsha",
    "lat": 22.3762,
    "lng": 112.6877,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 717700.0,
    "id": 1156011120
  },
  {
    "city": "Yingcheng",
    "city_ascii": "Yingcheng",
    "lat": 24.1878,
    "lng": 113.4042,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 986400.0,
    "id": 1156012356
  },
  {
    "city": "Longyan",
    "city_ascii": "Longyan",
    "lat": 25.0881,
    "lng": 117.0244,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": "minor",
    "population": 2723637.0,
    "id": 1156012979
  },
  {
    "city": "Heshan",
    "city_ascii": "Heshan",
    "lat": 22.7697,
    "lng": 112.9578,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": null,
    "population": 516500.0,
    "id": 1156013872
  },
  {
    "city": "Wancheng",
    "city_ascii": "Wancheng",
    "lat": 18.8,
    "lng": 110.4,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hainan",
    "capital": "minor",
    "population": 578600.0,
    "id": 1156017483
  },
  {
    "city": "Kaihua",
    "city_ascii": "Kaihua",
    "lat": 23.3715,
    "lng": 104.2437,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Yunnan",
    "capital": "minor",
    "population": 481505.0,
    "id": 1156017759
  },
  {
    "city": "Botou",
    "city_ascii": "Botou",
    "lat": 38.074,
    "lng": 116.57,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 584308.0,
    "id": 1156018338
  },
  {
    "city": "Huadian",
    "city_ascii": "Huadian",
    "lat": 42.9633,
    "lng": 126.7478,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": null,
    "population": 455339.0,
    "id": 1156018839
  },
  {
    "city": "Bijie",
    "city_ascii": "Bijie",
    "lat": 27.3019,
    "lng": 105.2863,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guizhou",
    "capital": null,
    "population": 6899636.0,
    "id": 1156018927
  },
  {
    "city": "Wuxi",
    "city_ascii": "Wuxi",
    "lat": 31.5667,
    "lng": 120.2833,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 3245179.0,
    "id": 1156019650
  },
  {
    "city": "Lianzhou",
    "city_ascii": "Lianzhou",
    "lat": 24.7868,
    "lng": 112.3735,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 384700.0,
    "id": 1156020454
  },
  {
    "city": "Meishan",
    "city_ascii": "Meishan",
    "lat": 34.1736,
    "lng": 112.839,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 936000.0,
    "id": 1156023073
  },
  {
    "city": "Zigong",
    "city_ascii": "Zigong",
    "lat": 29.3498,
    "lng": 104.7645,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": null,
    "population": 2678899.0,
    "id": 1156023354
  },
  {
    "city": "Sanzhou",
    "city_ascii": "Sanzhou",
    "lat": 30.82,
    "lng": 108.4,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Chongqing",
    "capital": null,
    "population": 1680000.0,
    "id": 1156025536
  },
  {
    "city": "Wuxue",
    "city_ascii": "Wuxue",
    "lat": 29.8518,
    "lng": 115.5539,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": "minor",
    "population": 644247.0,
    "id": 1156027100
  },
  {
    "city": "Suzhou",
    "city_ascii": "Suzhou",
    "lat": 31.3,
    "lng": 120.6194,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 4330000.0,
    "id": 1156029196
  },
  {
    "city": "Shanhu",
    "city_ascii": "Shanhu",
    "lat": 29.5908,
    "lng": 120.8176,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 679762.0,
    "id": 1156029691
  },
  {
    "city": "Qinbaling",
    "city_ascii": "Qinbaling",
    "lat": 35.7278,
    "lng": 107.64,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": null,
    "population": 2211191.0,
    "id": 1156032582
  },
  {
    "city": "Baotou",
    "city_ascii": "Baotou",
    "lat": 40.6562,
    "lng": 109.8345,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Inner Mongolia",
    "capital": null,
    "population": 2709378.0,
    "id": 1156032751
  },
  {
    "city": "Rizhao",
    "city_ascii": "Rizhao",
    "lat": 35.4164,
    "lng": 119.4331,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 2968365.0,
    "id": 1156032841
  },
  {
    "city": "Jingcheng",
    "city_ascii": "Jingcheng",
    "lat": 32.0058,
    "lng": 120.2547,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 684360.0,
    "id": 1156033208
  },
  {
    "city": "Jiangyin",
    "city_ascii": "Jiangyin",
    "lat": 31.9087,
    "lng": 120.2653,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": null,
    "population": 1285785.0,
    "id": 1156033234
  },
  {
    "city": "Qingping",
    "city_ascii": "Qingping",
    "lat": 34.538,
    "lng": 113.3796,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 797200.0,
    "id": 1156033855
  },
  {
    "city": "Longjiang",
    "city_ascii": "Longjiang",
    "lat": 27.582,
    "lng": 120.5488,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": null,
    "population": 464695.0,
    "id": 1156034166
  },
  {
    "city": "Xinpu",
    "city_ascii": "Xinpu",
    "lat": 34.5906,
    "lng": 119.1801,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 4599360.0,
    "id": 1156035381
  },
  {
    "city": "Huichang",
    "city_ascii": "Huichang",
    "lat": 34.9136,
    "lng": 112.7852,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 367113.0,
    "id": 1156035769
  },
  {
    "city": "Chuzhou",
    "city_ascii": "Chuzhou",
    "lat": 32.3062,
    "lng": 118.3115,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": null,
    "population": 3987054.0,
    "id": 1156036420
  },
  {
    "city": "Jingdezhen",
    "city_ascii": "Jingdezhen",
    "lat": 29.2942,
    "lng": 117.2036,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": "minor",
    "population": 1673200.0,
    "id": 1156038165
  },
  {
    "city": "Hongjiang",
    "city_ascii": "Hongjiang",
    "lat": 27.1167,
    "lng": 109.95,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": null,
    "population": 498100.0,
    "id": 1156039152
  },
  {
    "city": "Hengzhou",
    "city_ascii": "Hengzhou",
    "lat": 22.6896,
    "lng": 109.2674,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 908400.0,
    "id": 1156041202
  },
  {
    "city": "Zhuzhou",
    "city_ascii": "Zhuzhou",
    "lat": 27.8407,
    "lng": 113.1469,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": "minor",
    "population": 4020800.0,
    "id": 1156041962
  },
  {
    "city": "Linxia Chengguanzhen",
    "city_ascii": "Linxia Chengguanzhen",
    "lat": 35.6,
    "lng": 103.2167,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": "minor",
    "population": 355968.0,
    "id": 1156043522
  },
  {
    "city": "Leling",
    "city_ascii": "Leling",
    "lat": 37.7333,
    "lng": 117.2167,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 689867.0,
    "id": 1156044041
  },
  {
    "city": "Lincang",
    "city_ascii": "Lincang",
    "lat": 23.8864,
    "lng": 100.0871,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Yunnan",
    "capital": null,
    "population": 2536000.0,
    "id": 1156044130
  },
  {
    "city": "Zhuozhou",
    "city_ascii": "Zhuozhou",
    "lat": 39.4887,
    "lng": 115.9918,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 603535.0,
    "id": 1156045160
  },
  {
    "city": "Nantong",
    "city_ascii": "Nantong",
    "lat": 31.9829,
    "lng": 120.8873,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 2261382.0,
    "id": 1156045365
  },
  {
    "city": "Puxi",
    "city_ascii": "Puxi",
    "lat": 35.2125,
    "lng": 114.735,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 809535.0,
    "id": 1156046618
  },
  {
    "city": "Lianshan",
    "city_ascii": "Lianshan",
    "lat": 40.7523,
    "lng": 120.828,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": "minor",
    "population": 2426000.0,
    "id": 1156046704
  },
  {
    "city": "Xushan",
    "city_ascii": "Xushan",
    "lat": 30.1697,
    "lng": 121.2665,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 1502000.0,
    "id": 1156046916
  },
  {
    "city": "Yan’an Beilu",
    "city_ascii": "Yan'an Beilu",
    "lat": 44.0144,
    "lng": 87.2674,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Xinjiang",
    "capital": "minor",
    "population": 426253.0,
    "id": 1156048097
  },
  {
    "city": "Ürümqi",
    "city_ascii": "Urumqi",
    "lat": 43.8225,
    "lng": 87.6125,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Xinjiang",
    "capital": "admin",
    "population": 4335017.0,
    "id": 1156051276
  },
  {
    "city": "Shuyangzha",
    "city_ascii": "Shuyangzha",
    "lat": 34.1299,
    "lng": 118.7734,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": null,
    "population": 1770000.0,
    "id": 1156051957
  },
  {
    "city": "Wenling",
    "city_ascii": "Wenling",
    "lat": 28.3797,
    "lng": 121.3718,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": null,
    "population": 1416199.0,
    "id": 1156052493
  },
  {
    "city": "Haicheng",
    "city_ascii": "Haicheng",
    "lat": 40.8523,
    "lng": 122.7474,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": "minor",
    "population": 1293877.0,
    "id": 1156052713
  },
  {
    "city": "Yunfu",
    "city_ascii": "Yunfu",
    "lat": 22.9242,
    "lng": 112.0353,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 2526900.0,
    "id": 1156057251
  },
  {
    "city": "Leiyang",
    "city_ascii": "Leiyang",
    "lat": 26.4179,
    "lng": 112.8457,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": "minor",
    "population": 1151554.0,
    "id": 1156057789
  },
  {
    "city": "Changzhi",
    "city_ascii": "Changzhi",
    "lat": 36.1953,
    "lng": 113.097,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": "minor",
    "population": 3334565.0,
    "id": 1156057944
  },
  {
    "city": "Dunhua",
    "city_ascii": "Dunhua",
    "lat": 43.3667,
    "lng": 128.2333,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": "minor",
    "population": 483811.0,
    "id": 1156058709
  },
  {
    "city": "Wudalianchi",
    "city_ascii": "Wudalianchi",
    "lat": 48.6433,
    "lng": 126.1408,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 360000.0,
    "id": 1156059331
  },
  {
    "city": "Jingling",
    "city_ascii": "Jingling",
    "lat": 30.6667,
    "lng": 113.1667,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 1247400.0,
    "id": 1156060544
  },
  {
    "city": "Siping",
    "city_ascii": "Siping",
    "lat": 43.1715,
    "lng": 124.3644,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": "minor",
    "population": 3385156.0,
    "id": 1156063295
  },
  {
    "city": "Ghulja",
    "city_ascii": "Ghulja",
    "lat": 43.9,
    "lng": 81.35,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Xinjiang",
    "capital": "minor",
    "population": 542507.0,
    "id": 1156064979
  },
  {
    "city": "Pingxiang",
    "city_ascii": "Pingxiang",
    "lat": 27.6333,
    "lng": 113.85,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": "minor",
    "population": 1933200.0,
    "id": 1156066465
  },
  {
    "city": "Luoyang",
    "city_ascii": "Luoyang",
    "lat": 34.6587,
    "lng": 112.4245,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": null,
    "population": 2372571.0,
    "id": 1156069315
  },
  {
    "city": "Zhangjiajie",
    "city_ascii": "Zhangjiajie",
    "lat": 29.1255,
    "lng": 110.4844,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": "minor",
    "population": 1537900.0,
    "id": 1156072884
  },
  {
    "city": "Shanghai",
    "city_ascii": "Shanghai",
    "lat": 31.1667,
    "lng": 121.4667,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanghai",
    "capital": "admin",
    "population": 24073000.0,
    "id": 1156073548
  },
  {
    "city": "Shishi",
    "city_ascii": "Shishi",
    "lat": 24.7355,
    "lng": 118.6434,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": "minor",
    "population": 693000.0,
    "id": 1156077046
  },
  {
    "city": "Zhugang",
    "city_ascii": "Zhugang",
    "lat": 28.1277,
    "lng": 121.2288,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 616346.0,
    "id": 1156077330
  },
  {
    "city": "Yiwu",
    "city_ascii": "Yiwu",
    "lat": 29.3081,
    "lng": 120.0698,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 1234015.0,
    "id": 1156078044
  },
  {
    "city": "Changchun",
    "city_ascii": "Changchun",
    "lat": 43.9,
    "lng": 125.2,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": "admin",
    "population": 4408154.0,
    "id": 1156078103
  },
  {
    "city": "Xiashi",
    "city_ascii": "Xiashi",
    "lat": 30.5333,
    "lng": 120.6833,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 1076199.0,
    "id": 1156080077
  },
  {
    "city": "Linghai",
    "city_ascii": "Linghai",
    "lat": 41.1676,
    "lng": 121.3558,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 412513.0,
    "id": 1156081300
  },
  {
    "city": "Xining",
    "city_ascii": "Xining",
    "lat": 36.6239,
    "lng": 101.7787,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Qinghai",
    "capital": "admin",
    "population": 2467965.0,
    "id": 1156081448
  },
  {
    "city": "Kaiyuan",
    "city_ascii": "Kaiyuan",
    "lat": 42.538,
    "lng": 124.0371,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 545624.0,
    "id": 1156081841
  },
  {
    "city": "Beian",
    "city_ascii": "Beian",
    "lat": 48.2395,
    "lng": 126.5037,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 470000.0,
    "id": 1156084414
  },
  {
    "city": "Guangyuan",
    "city_ascii": "Guangyuan",
    "lat": 32.4353,
    "lng": 105.8398,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": null,
    "population": 2484122.0,
    "id": 1156084562
  },
  {
    "city": "Duyun",
    "city_ascii": "Duyun",
    "lat": 26.2672,
    "lng": 107.5143,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guizhou",
    "capital": null,
    "population": 493574.0,
    "id": 1156084618
  },
  {
    "city": "Linyi",
    "city_ascii": "Linyi",
    "lat": 35.1041,
    "lng": 118.3502,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 11018365.0,
    "id": 1156086320
  },
  {
    "city": "Zijinglu",
    "city_ascii": "Zijinglu",
    "lat": 34.7513,
    "lng": 112.9854,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 807857.0,
    "id": 1156086381
  },
  {
    "city": "Wugang",
    "city_ascii": "Wugang",
    "lat": 26.7345,
    "lng": 110.6293,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": null,
    "population": 734870.0,
    "id": 1156089788
  },
  {
    "city": "Tieling",
    "city_ascii": "Tieling",
    "lat": 42.2841,
    "lng": 123.8365,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 2717732.0,
    "id": 1156089994
  },
  {
    "city": "Qinhuangdao",
    "city_ascii": "Qinhuangdao",
    "lat": 39.9398,
    "lng": 119.5881,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 3146300.0,
    "id": 1156091093
  },
  {
    "city": "Shangzhou",
    "city_ascii": "Shangzhou",
    "lat": 33.868,
    "lng": 109.9244,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shaanxi",
    "capital": null,
    "population": 2341742.0,
    "id": 1156091241
  },
  {
    "city": "Luanzhou",
    "city_ascii": "Luanzhou",
    "lat": 39.7396,
    "lng": 118.6978,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": "minor",
    "population": 554315.0,
    "id": 1156092104
  },
  {
    "city": "Tai’an",
    "city_ascii": "Tai'an",
    "lat": 36.2001,
    "lng": 117.0809,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 5494207.0,
    "id": 1156095188
  },
  {
    "city": "Dengtacun",
    "city_ascii": "Dengtacun",
    "lat": 41.4237,
    "lng": 123.3203,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 496122.0,
    "id": 1156096868
  },
  {
    "city": "Benxi",
    "city_ascii": "Benxi",
    "lat": 41.292,
    "lng": 123.761,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 1709538.0,
    "id": 1156097909
  },
  {
    "city": "Baojishi",
    "city_ascii": "Baojishi",
    "lat": 34.3609,
    "lng": 107.1751,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shaanxi",
    "capital": null,
    "population": 3738700.0,
    "id": 1156101096
  },
  {
    "city": "Rongcheng",
    "city_ascii": "Rongcheng",
    "lat": 29.8239,
    "lng": 112.9019,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": "minor",
    "population": 1162770.0,
    "id": 1156102432
  },
  {
    "city": "Puyang Chengguanzhen",
    "city_ascii": "Puyang Chengguanzhen",
    "lat": 35.7004,
    "lng": 114.98,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 666322.0,
    "id": 1156103317
  },
  {
    "city": "Qincheng",
    "city_ascii": "Qincheng",
    "lat": 34.5809,
    "lng": 105.7311,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": "minor",
    "population": 3262549.0,
    "id": 1156104017
  },
  {
    "city": "Ruiming",
    "city_ascii": "Ruiming",
    "lat": 25.8833,
    "lng": 116.0333,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": null,
    "population": 640600.0,
    "id": 1156104573
  },
  {
    "city": "Taishan",
    "city_ascii": "Taishan",
    "lat": 22.2486,
    "lng": 112.785,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": null,
    "population": 953900.0,
    "id": 1156105450
  },
  {
    "city": "Jiangmen",
    "city_ascii": "Jiangmen",
    "lat": 22.5833,
    "lng": 113.0833,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 4630300.0,
    "id": 1156105613
  },
  {
    "city": "Kuaidamao",
    "city_ascii": "Kuaidamao",
    "lat": 41.7302,
    "lng": 125.9471,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": "minor",
    "population": 2324439.0,
    "id": 1156106507
  },
  {
    "city": "Qinzhou",
    "city_ascii": "Qinzhou",
    "lat": 21.95,
    "lng": 108.6167,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 3304400.0,
    "id": 1156106602
  },
  {
    "city": "Xigazê",
    "city_ascii": "Xigaze",
    "lat": 29.25,
    "lng": 88.8833,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Tibet",
    "capital": "minor",
    "population": 798153.0,
    "id": 1156107208
  },
  {
    "city": "Xiangyang",
    "city_ascii": "Xiangyang",
    "lat": 32.0654,
    "lng": 112.1531,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": "minor",
    "population": 5680000.0,
    "id": 1156107325
  },
  {
    "city": "Shangzhi",
    "city_ascii": "Shangzhi",
    "lat": 45.2116,
    "lng": 127.962,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 585386.0,
    "id": 1156107332
  },
  {
    "city": "Yibin",
    "city_ascii": "Yibin",
    "lat": 28.7596,
    "lng": 104.64,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 4588804.0,
    "id": 1156107603
  },
  {
    "city": "Langfang",
    "city_ascii": "Langfang",
    "lat": 39.5196,
    "lng": 116.7006,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 5464087.0,
    "id": 1156109017
  },
  {
    "city": "Qingdao",
    "city_ascii": "Qingdao",
    "lat": 36.1167,
    "lng": 120.4,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 5818255.0,
    "id": 1156112588
  },
  {
    "city": "Kashgar",
    "city_ascii": "Kashgar",
    "lat": 39.4681,
    "lng": 75.9938,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Xinjiang",
    "capital": "minor",
    "population": 920000.0,
    "id": 1156113193
  },
  {
    "city": "Pizhou",
    "city_ascii": "Pizhou",
    "lat": 34.3422,
    "lng": 118.0097,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": null,
    "population": 1458038.0,
    "id": 1156114238
  },
  {
    "city": "Hebi",
    "city_ascii": "Hebi",
    "lat": 35.7497,
    "lng": 114.2887,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": null,
    "population": 1569208.0,
    "id": 1156114258
  },
  {
    "city": "Xichang",
    "city_ascii": "Xichang",
    "lat": 27.8983,
    "lng": 102.2706,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 712434.0,
    "id": 1156116456
  },
  {
    "city": "Wuhan",
    "city_ascii": "Wuhan",
    "lat": 30.5872,
    "lng": 114.2881,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": "admin",
    "population": 10251000.0,
    "id": 1156117184
  },
  {
    "city": "Taizhou",
    "city_ascii": "Taizhou",
    "lat": 32.4831,
    "lng": 119.9,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 5031000.0,
    "id": 1156119229
  },
  {
    "city": "Xianyang",
    "city_ascii": "Xianyang",
    "lat": 34.35,
    "lng": 108.7167,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shaanxi",
    "capital": "minor",
    "population": 5096001.0,
    "id": 1156120117
  },
  {
    "city": "Rongcheng",
    "city_ascii": "Rongcheng",
    "lat": 26.2312,
    "lng": 104.0966,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Yunnan",
    "capital": null,
    "population": 1302891.0,
    "id": 1156122888
  },
  {
    "city": "Yangjiang",
    "city_ascii": "Yangjiang",
    "lat": 21.8556,
    "lng": 111.9627,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 2555600.0,
    "id": 1156123172
  },
  {
    "city": "Deyang",
    "city_ascii": "Deyang",
    "lat": 31.1289,
    "lng": 104.395,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 3877000.0,
    "id": 1156127147
  },
  {
    "city": "Bazhou",
    "city_ascii": "Bazhou",
    "lat": 39.1235,
    "lng": 116.386,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 622975.0,
    "id": 1156127276
  },
  {
    "city": "Nangandao",
    "city_ascii": "Nangandao",
    "lat": 35.2992,
    "lng": 113.8851,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 5708191.0,
    "id": 1156127660
  },
  {
    "city": "Huanghua",
    "city_ascii": "Huanghua",
    "lat": 38.371,
    "lng": 117.3329,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": "minor",
    "population": 548507.0,
    "id": 1156131099
  },
  {
    "city": "Chizhou",
    "city_ascii": "Chizhou",
    "lat": 30.6583,
    "lng": 117.4849,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": "minor",
    "population": 1402518.0,
    "id": 1156131504
  },
  {
    "city": "Kumul",
    "city_ascii": "Kumul",
    "lat": 42.8193,
    "lng": 93.5151,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Xinjiang",
    "capital": "minor",
    "population": 673383.0,
    "id": 1156131545
  },
  {
    "city": "Qingyuan",
    "city_ascii": "Qingyuan",
    "lat": 23.6842,
    "lng": 113.0507,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 3969473.0,
    "id": 1156135890
  },
  {
    "city": "Meicheng",
    "city_ascii": "Meicheng",
    "lat": 30.6412,
    "lng": 116.5689,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": "minor",
    "population": 500292.0,
    "id": 1156136207
  },
  {
    "city": "Beidao",
    "city_ascii": "Beidao",
    "lat": 34.602,
    "lng": 105.918,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": "minor",
    "population": 1225000.0,
    "id": 1156137209
  },
  {
    "city": "Xinyu",
    "city_ascii": "Xinyu",
    "lat": 27.795,
    "lng": 114.9242,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": "minor",
    "population": 1202499.0,
    "id": 1156138735
  },
  {
    "city": "Luocheng",
    "city_ascii": "Luocheng",
    "lat": 22.7645,
    "lng": 111.5745,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 984100.0,
    "id": 1156138895
  },
  {
    "city": "Wuzhong",
    "city_ascii": "Wuzhong",
    "lat": 37.9874,
    "lng": 106.1919,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Ningxia",
    "capital": "minor",
    "population": 1382713.0,
    "id": 1156139322
  },
  {
    "city": "Chang’an",
    "city_ascii": "Chang'an",
    "lat": 29.4761,
    "lng": 113.448,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": "minor",
    "population": 537500.0,
    "id": 1156139784
  },
  {
    "city": "Baiyin",
    "city_ascii": "Baiyin",
    "lat": 36.5448,
    "lng": 104.1766,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": "minor",
    "population": 1708751.0,
    "id": 1156140738
  },
  {
    "city": "Fuxin",
    "city_ascii": "Fuxin",
    "lat": 42.0127,
    "lng": 121.6486,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 1819339.0,
    "id": 1156141954
  },
  {
    "city": "Dashiqiao",
    "city_ascii": "Dashiqiao",
    "lat": 40.6328,
    "lng": 122.5021,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": "minor",
    "population": 704891.0,
    "id": 1156141962
  },
  {
    "city": "Anda",
    "city_ascii": "Anda",
    "lat": 46.4078,
    "lng": 125.3252,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 520000.0,
    "id": 1156142150
  },
  {
    "city": "Yiyang",
    "city_ascii": "Yiyang",
    "lat": 26.4103,
    "lng": 112.3913,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": "minor",
    "population": 810447.0,
    "id": 1156142520
  },
  {
    "city": "Huaibei",
    "city_ascii": "Huaibei",
    "lat": 33.9562,
    "lng": 116.789,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": null,
    "population": 2114276.0,
    "id": 1156142626
  },
  {
    "city": "Songyang",
    "city_ascii": "Songyang",
    "lat": 34.4603,
    "lng": 113.028,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 668592.0,
    "id": 1156143149
  },
  {
    "city": "Gaizhou",
    "city_ascii": "Gaizhou",
    "lat": 40.4019,
    "lng": 122.3499,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": "minor",
    "population": 691595.0,
    "id": 1156145272
  },
  {
    "city": "Pencheng",
    "city_ascii": "Pencheng",
    "lat": 29.6792,
    "lng": 115.6611,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": null,
    "population": 419047.0,
    "id": 1156147187
  },
  {
    "city": "Hanchuan",
    "city_ascii": "Hanchuan",
    "lat": 30.652,
    "lng": 113.8274,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 1092700.0,
    "id": 1156149248
  },
  {
    "city": "Huili Chengguanzhen",
    "city_ascii": "Huili Chengguanzhen",
    "lat": 26.6614,
    "lng": 102.2469,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 430066.0,
    "id": 1156149320
  },
  {
    "city": "Jiannan",
    "city_ascii": "Jiannan",
    "lat": 31.3446,
    "lng": 104.1994,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 477868.0,
    "id": 1156155414
  },
  {
    "city": "Xishan",
    "city_ascii": "Xishan",
    "lat": 27.6609,
    "lng": 113.4946,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": "minor",
    "population": 1060000.0,
    "id": 1156155575
  },
  {
    "city": "Pingdu",
    "city_ascii": "Pingdu",
    "lat": 36.7833,
    "lng": 119.9556,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 1378900.0,
    "id": 1156157078
  },
  {
    "city": "Jinzhou",
    "city_ascii": "Jinzhou",
    "lat": 41.1144,
    "lng": 121.1292,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 3126463.0,
    "id": 1156157151
  },
  {
    "city": "Yangquan",
    "city_ascii": "Yangquan",
    "lat": 37.8576,
    "lng": 113.5762,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": "minor",
    "population": 1368502.0,
    "id": 1156157844
  },
  {
    "city": "Jiaozuo",
    "city_ascii": "Jiaozuo",
    "lat": 35.229,
    "lng": 113.2304,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": null,
    "population": 3590700.0,
    "id": 1156157854
  },
  {
    "city": "Luofeng",
    "city_ascii": "Luofeng",
    "lat": 37.359,
    "lng": 120.396,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 570898.0,
    "id": 1156158643
  },
  {
    "city": "Shenzhen",
    "city_ascii": "Shenzhen",
    "lat": 22.535,
    "lng": 114.054,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 17619000.0,
    "id": 1156158707
  },
  {
    "city": "Xicheng",
    "city_ascii": "Xicheng",
    "lat": 23.3629,
    "lng": 103.1545,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Yunnan",
    "capital": "minor",
    "population": 459781.0,
    "id": 1156161838
  },
  {
    "city": "Jincheng",
    "city_ascii": "Jincheng",
    "lat": 35.4906,
    "lng": 112.8483,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": "minor",
    "population": 2279146.0,
    "id": 1156163376
  },
  {
    "city": "Guiping",
    "city_ascii": "Guiping",
    "lat": 23.4,
    "lng": 110.0833,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 1511011.0,
    "id": 1156165517
  },
  {
    "city": "Changping",
    "city_ascii": "Changping",
    "lat": 40.2248,
    "lng": 116.1944,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Beijing",
    "capital": null,
    "population": 614821.0,
    "id": 1156166828
  },
  {
    "city": "Hechi",
    "city_ascii": "Hechi",
    "lat": 24.6928,
    "lng": 108.085,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 3545700.0,
    "id": 1156167204
  },
  {
    "city": "Zhaoqing",
    "city_ascii": "Zhaoqing",
    "lat": 23.05,
    "lng": 112.4667,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 4151700.0,
    "id": 1156170144
  },
  {
    "city": "Ningbo",
    "city_ascii": "Ningbo",
    "lat": 29.875,
    "lng": 121.5492,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 4087523.0,
    "id": 1156170787
  },
  {
    "city": "Anguo",
    "city_ascii": "Anguo",
    "lat": 38.4177,
    "lng": 115.3204,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 370317.0,
    "id": 1156172518
  },
  {
    "city": "Ximeicun",
    "city_ascii": "Ximeicun",
    "lat": 24.9633,
    "lng": 118.3811,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": null,
    "population": 1508000.0,
    "id": 1156173813
  },
  {
    "city": "Tianjin",
    "city_ascii": "Tianjin",
    "lat": 39.1467,
    "lng": 117.2056,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Tianjin",
    "capital": "admin",
    "population": 10368000.0,
    "id": 1156174046
  },
  {
    "city": "Kuiju",
    "city_ascii": "Kuiju",
    "lat": 36.8528,
    "lng": 119.3904,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 564501.0,
    "id": 1156174997
  },
  {
    "city": "Dalian",
    "city_ascii": "Dalian",
    "lat": 38.9,
    "lng": 121.6,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 5871474.0,
    "id": 1156175472
  },
  {
    "city": "Yuci",
    "city_ascii": "Yuci",
    "lat": 37.6823,
    "lng": 112.7281,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": null,
    "population": 840000.0,
    "id": 1156177817
  },
  {
    "city": "Dandong",
    "city_ascii": "Dandong",
    "lat": 40.1167,
    "lng": 124.3833,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 2444697.0,
    "id": 1156178316
  },
  {
    "city": "Zhangye",
    "city_ascii": "Zhangye",
    "lat": 38.9355,
    "lng": 100.4553,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": "minor",
    "population": 1199515.0,
    "id": 1156180353
  },
  {
    "city": "Quzhou",
    "city_ascii": "Quzhou",
    "lat": 28.9545,
    "lng": 118.8763,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": null,
    "population": 902767.0,
    "id": 1156180376
  },
  {
    "city": "Luocheng",
    "city_ascii": "Luocheng",
    "lat": 30.9793,
    "lng": 104.28,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 591115.0,
    "id": 1156180482
  },
  {
    "city": "Jinghong",
    "city_ascii": "Jinghong",
    "lat": 22.0057,
    "lng": 100.7948,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Yunnan",
    "capital": null,
    "population": 519935.0,
    "id": 1156181533
  },
  {
    "city": "Wutong",
    "city_ascii": "Wutong",
    "lat": 30.6326,
    "lng": 120.5474,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 1029754.0,
    "id": 1156182309
  },
  {
    "city": "Zhengzhou",
    "city_ascii": "Zhengzhou",
    "lat": 34.7492,
    "lng": 113.6605,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "admin",
    "population": 5621593.0,
    "id": 1156183137
  },
  {
    "city": "Haikou",
    "city_ascii": "Haikou",
    "lat": 20.02,
    "lng": 110.32,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hainan",
    "capital": "admin",
    "population": 2873358.0,
    "id": 1156183327
  },
  {
    "city": "Lingyuan",
    "city_ascii": "Lingyuan",
    "lat": 41.2407,
    "lng": 119.3957,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 570660.0,
    "id": 1156184681
  },
  {
    "city": "Zhumadian",
    "city_ascii": "Zhumadian",
    "lat": 32.9773,
    "lng": 114.0253,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": null,
    "population": 7231234.0,
    "id": 1156184822
  },
  {
    "city": "Jinchang",
    "city_ascii": "Jinchang",
    "lat": 38.5168,
    "lng": 102.1866,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": "minor",
    "population": 438026.0,
    "id": 1156184861
  },
  {
    "city": "Yong’an",
    "city_ascii": "Yong'an",
    "lat": 25.9733,
    "lng": 117.3593,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": "minor",
    "population": 357000.0,
    "id": 1156185328
  },
  {
    "city": "Meishan",
    "city_ascii": "Meishan",
    "lat": 30.0575,
    "lng": 103.8381,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": null,
    "population": 2950545.0,
    "id": 1156185501
  },
  {
    "city": "Changzhou",
    "city_ascii": "Changzhou",
    "lat": 31.8122,
    "lng": 119.9692,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 3601079.0,
    "id": 1156185511
  },
  {
    "city": "Fuzhou",
    "city_ascii": "Fuzhou",
    "lat": 26.0769,
    "lng": 119.2917,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": "admin",
    "population": 3671192.0,
    "id": 1156188037
  },
  {
    "city": "Wenzhou",
    "city_ascii": "Wenzhou",
    "lat": 27.9991,
    "lng": 120.6561,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": null,
    "population": 3604446.0,
    "id": 1156188829
  },
  {
    "city": "Nanyang",
    "city_ascii": "Nanyang",
    "lat": 32.9987,
    "lng": 112.5292,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": null,
    "population": 10013600.0,
    "id": 1156192287
  },
  {
    "city": "Weichanglu",
    "city_ascii": "Weichanglu",
    "lat": 37.1792,
    "lng": 119.9333,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 859424.0,
    "id": 1156194600
  },
  {
    "city": "Xiangtan",
    "city_ascii": "Xiangtan",
    "lat": 27.8431,
    "lng": 112.9228,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": null,
    "population": 2864800.0,
    "id": 1156195684
  },
  {
    "city": "Fuyuan",
    "city_ascii": "Fuyuan",
    "lat": 48.3614,
    "lng": 134.2875,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 480000.0,
    "id": 1156196485
  },
  {
    "city": "Zaoyang",
    "city_ascii": "Zaoyang",
    "lat": 32.1287,
    "lng": 112.7581,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 1004741.0,
    "id": 1156197076
  },
  {
    "city": "Wuchuan",
    "city_ascii": "Wuchuan",
    "lat": 21.4283,
    "lng": 110.7749,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": null,
    "population": 972400.0,
    "id": 1156198103
  },
  {
    "city": "Huanglongsi",
    "city_ascii": "Huanglongsi",
    "lat": 34.795,
    "lng": 114.345,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": null,
    "population": 4824016.0,
    "id": 1156198356
  },
  {
    "city": "Nanchang",
    "city_ascii": "Nanchang",
    "lat": 28.6842,
    "lng": 115.8872,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": "admin",
    "population": 3576547.0,
    "id": 1156198892
  },
  {
    "city": "Huanggang",
    "city_ascii": "Huanggang",
    "lat": 30.45,
    "lng": 114.875,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": "minor",
    "population": 6333000.0,
    "id": 1156200037
  },
  {
    "city": "Zhoushan",
    "city_ascii": "Zhoushan",
    "lat": 29.9887,
    "lng": 122.2049,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 882932.0,
    "id": 1156200283
  },
  {
    "city": "Dengtalu",
    "city_ascii": "Dengtalu",
    "lat": 36.1386,
    "lng": 114.1066,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 887000.0,
    "id": 1156202014
  },
  {
    "city": "Lingcheng",
    "city_ascii": "Lingcheng",
    "lat": 22.7,
    "lng": 110.35,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": null,
    "population": 1211637.0,
    "id": 1156202191
  },
  {
    "city": "Liaoyang",
    "city_ascii": "Liaoyang",
    "lat": 41.2643,
    "lng": 123.1772,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 1858768.0,
    "id": 1156202749
  },
  {
    "city": "Yangshe",
    "city_ascii": "Yangshe",
    "lat": 31.8775,
    "lng": 120.5512,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 1432044.0,
    "id": 1156203000
  },
  {
    "city": "Leshan",
    "city_ascii": "Leshan",
    "lat": 29.5854,
    "lng": 103.7575,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": null,
    "population": 3235759.0,
    "id": 1156203130
  },
  {
    "city": "Huizhou",
    "city_ascii": "Huizhou",
    "lat": 23.1115,
    "lng": 114.4152,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 2509243.0,
    "id": 1156203268
  },
  {
    "city": "Jiujiang",
    "city_ascii": "Jiujiang",
    "lat": 29.7048,
    "lng": 116.0021,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": "minor",
    "population": 4896800.0,
    "id": 1156206041
  },
  {
    "city": "Laiyang",
    "city_ascii": "Laiyang",
    "lat": 36.9758,
    "lng": 120.7136,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 874127.0,
    "id": 1156207330
  },
  {
    "city": "Laiwu",
    "city_ascii": "Laiwu",
    "lat": 36.1833,
    "lng": 117.6667,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 1248636.0,
    "id": 1156207332
  },
  {
    "city": "Xiping",
    "city_ascii": "Xiping",
    "lat": 25.6005,
    "lng": 103.8166,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Yunnan",
    "capital": "minor",
    "population": 652604.0,
    "id": 1156207794
  },
  {
    "city": "Licheng",
    "city_ascii": "Licheng",
    "lat": 24.4935,
    "lng": 110.3902,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 352472.0,
    "id": 1156208986
  },
  {
    "city": "Hohhot",
    "city_ascii": "Hohhot",
    "lat": 40.8151,
    "lng": 111.6629,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Inner Mongolia",
    "capital": "admin",
    "population": 3446100.0,
    "id": 1156210167
  },
  {
    "city": "Suqian",
    "city_ascii": "Suqian",
    "lat": 33.9331,
    "lng": 118.2831,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": null,
    "population": 4986192.0,
    "id": 1156212349
  },
  {
    "city": "Xiamen",
    "city_ascii": "Xiamen",
    "lat": 24.4797,
    "lng": 118.0819,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": "minor",
    "population": 3707090.0,
    "id": 1156212809
  },
  {
    "city": "Xiangyang",
    "city_ascii": "Xiangyang",
    "lat": 34.2999,
    "lng": 108.4816,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shaanxi",
    "capital": null,
    "population": 541554.0,
    "id": 1156215566
  },
  {
    "city": "Pingliang",
    "city_ascii": "Pingliang",
    "lat": 35.5412,
    "lng": 106.6819,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": "minor",
    "population": 2068033.0,
    "id": 1156216904
  },
  {
    "city": "Xiantao",
    "city_ascii": "Xiantao",
    "lat": 30.3833,
    "lng": 113.4,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 1140100.0,
    "id": 1156216927
  },
  {
    "city": "Yanjiang",
    "city_ascii": "Yanjiang",
    "lat": 30.1256,
    "lng": 104.6397,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 2593843.0,
    "id": 1156217114
  },
  {
    "city": "Shijiazhuang",
    "city_ascii": "Shijiazhuang",
    "lat": 38.0422,
    "lng": 114.5086,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": "admin",
    "population": 4098243.0,
    "id": 1156217541
  },
  {
    "city": "Yiyang",
    "city_ascii": "Yiyang",
    "lat": 28.5833,
    "lng": 112.3333,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": null,
    "population": 4413800.0,
    "id": 1156218615
  },
  {
    "city": "Yuyao",
    "city_ascii": "Yuyao",
    "lat": 30.0372,
    "lng": 121.1546,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": null,
    "population": 1095000.0,
    "id": 1156221984
  },
  {
    "city": "Heze",
    "city_ascii": "Heze",
    "lat": 35.2333,
    "lng": 115.4333,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 8795939.0,
    "id": 1156225008
  },
  {
    "city": "Hejin",
    "city_ascii": "Hejin",
    "lat": 35.5914,
    "lng": 110.706,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": null,
    "population": 395527.0,
    "id": 1156225234
  },
  {
    "city": "Chuxiong",
    "city_ascii": "Chuxiong",
    "lat": 25.0461,
    "lng": 101.5436,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Yunnan",
    "capital": null,
    "population": 588620.0,
    "id": 1156225985
  },
  {
    "city": "Shuozhou",
    "city_ascii": "Shuozhou",
    "lat": 39.3408,
    "lng": 112.4292,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": "minor",
    "population": 1714857.0,
    "id": 1156227167
  },
  {
    "city": "Beijing",
    "city_ascii": "Beijing",
    "lat": 39.904,
    "lng": 116.4075,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Beijing",
    "capital": "primary",
    "population": 18522000.0,
    "id": 1156228865
  },
  {
    "city": "Yichun",
    "city_ascii": "Yichun",
    "lat": 27.8041,
    "lng": 114.383,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": "minor",
    "population": 5573200.0,
    "id": 1156229590
  },
  {
    "city": "Yidu",
    "city_ascii": "Yidu",
    "lat": 30.388,
    "lng": 111.4505,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 384598.0,
    "id": 1156230664
  },
  {
    "city": "Shihezi",
    "city_ascii": "Shihezi",
    "lat": 44.3054,
    "lng": 86.0804,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Xinjiang",
    "capital": "minor",
    "population": 717000.0,
    "id": 1156232270
  },
  {
    "city": "Huangshi",
    "city_ascii": "Huangshi",
    "lat": 30.2018,
    "lng": 115.0326,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": "minor",
    "population": 2471700.0,
    "id": 1156234290
  },
  {
    "city": "Guilin",
    "city_ascii": "Guilin",
    "lat": 25.2819,
    "lng": 110.2864,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 5085500.0,
    "id": 1156235364
  },
  {
    "city": "Suihua",
    "city_ascii": "Suihua",
    "lat": 46.6384,
    "lng": 126.9808,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 5418153.0,
    "id": 1156235493
  },
  {
    "city": "Jiangguanchi",
    "city_ascii": "Jiangguanchi",
    "lat": 34.0244,
    "lng": 113.8201,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 4379998.0,
    "id": 1156235735
  },
  {
    "city": "Gaoyou",
    "city_ascii": "Gaoyou",
    "lat": 32.7847,
    "lng": 119.4432,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 811800.0,
    "id": 1156235854
  },
  {
    "city": "Xin’an",
    "city_ascii": "Xin'an",
    "lat": 34.3662,
    "lng": 118.3369,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": null,
    "population": 920628.0,
    "id": 1156236053
  },
  {
    "city": "Suohe",
    "city_ascii": "Suohe",
    "lat": 34.7879,
    "lng": 113.392,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 626700.0,
    "id": 1156236948
  },
  {
    "city": "Guangzhou",
    "city_ascii": "Guangzhou",
    "lat": 23.13,
    "lng": 113.26,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "admin",
    "population": 26940000.0,
    "id": 1156237133
  },
  {
    "city": "Gaoping",
    "city_ascii": "Gaoping",
    "lat": 35.7911,
    "lng": 112.9259,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": null,
    "population": 484862.0,
    "id": 1156238773
  },
  {
    "city": "Anqing",
    "city_ascii": "Anqing",
    "lat": 30.5,
    "lng": 117.0333,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": "minor",
    "population": 4723000.0,
    "id": 1156238875
  },
  {
    "city": "Zhangjiakou Shi Xuanhua Qu",
    "city_ascii": "Zhangjiakou Shi Xuanhua Qu",
    "lat": 40.5944,
    "lng": 115.0243,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": "minor",
    "population": 409745.0,
    "id": 1156240430
  },
  {
    "city": "Harbin",
    "city_ascii": "Harbin",
    "lat": 45.75,
    "lng": 126.6333,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "admin",
    "population": 3830000.0,
    "id": 1156241528
  },
  {
    "city": "Zhangzhou",
    "city_ascii": "Zhangzhou",
    "lat": 24.5093,
    "lng": 117.6612,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": "minor",
    "population": 5140000.0,
    "id": 1156241637
  },
  {
    "city": "Tongshan",
    "city_ascii": "Tongshan",
    "lat": 34.261,
    "lng": 117.1859,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 9083790.0,
    "id": 1156241678
  },
  {
    "city": "Xi’an",
    "city_ascii": "Xi'an",
    "lat": 34.2667,
    "lng": 108.9,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shaanxi",
    "capital": "admin",
    "population": 12328000.0,
    "id": 1156244079
  },
  {
    "city": "Fu’an",
    "city_ascii": "Fu'an",
    "lat": 27.1,
    "lng": 119.6333,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": "minor",
    "population": 577000.0,
    "id": 1156244234
  },
  {
    "city": "Yushan",
    "city_ascii": "Yushan",
    "lat": 31.3867,
    "lng": 120.9766,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 2092496.0,
    "id": 1156245000
  },
  {
    "city": "Shuangyashan",
    "city_ascii": "Shuangyashan",
    "lat": 46.6388,
    "lng": 131.1545,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 1462626.0,
    "id": 1156245904
  },
  {
    "city": "Fuyang",
    "city_ascii": "Fuyang",
    "lat": 32.8986,
    "lng": 115.8045,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": null,
    "population": 8200264.0,
    "id": 1156248008
  },
  {
    "city": "Guankou",
    "city_ascii": "Guankou",
    "lat": 28.1417,
    "lng": 113.625,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": "minor",
    "population": 1168056.0,
    "id": 1156249346
  },
  {
    "city": "Mudanjiang",
    "city_ascii": "Mudanjiang",
    "lat": 44.5861,
    "lng": 129.5997,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 2798723.0,
    "id": 1156249698
  },
  {
    "city": "Liaoyuan",
    "city_ascii": "Liaoyuan",
    "lat": 42.8976,
    "lng": 125.1381,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": null,
    "population": 1176239.0,
    "id": 1156249772
  },
  {
    "city": "Chengxiang",
    "city_ascii": "Chengxiang",
    "lat": 31.4515,
    "lng": 121.1043,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 831113.0,
    "id": 1156254788
  },
  {
    "city": "Xingyi",
    "city_ascii": "Xingyi",
    "lat": 25.091,
    "lng": 104.9011,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guizhou",
    "capital": null,
    "population": 1004132.0,
    "id": 1156255316
  },
  {
    "city": "Ankang",
    "city_ascii": "Ankang",
    "lat": 32.6877,
    "lng": 109.0235,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shaanxi",
    "capital": null,
    "population": 2629906.0,
    "id": 1156255711
  },
  {
    "city": "Daye",
    "city_ascii": "Daye",
    "lat": 30.1003,
    "lng": 114.9699,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 909724.0,
    "id": 1156255811
  },
  {
    "city": "Baoding",
    "city_ascii": "Baoding",
    "lat": 38.8671,
    "lng": 115.4845,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 11860000.0,
    "id": 1156256829
  },
  {
    "city": "Yingkou",
    "city_ascii": "Yingkou",
    "lat": 40.6653,
    "lng": 122.2297,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": "minor",
    "population": 2428534.0,
    "id": 1156257074
  },
  {
    "city": "Xinxing",
    "city_ascii": "Xinxing",
    "lat": 39.8734,
    "lng": 124.1453,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": "minor",
    "population": 627475.0,
    "id": 1156258586
  },
  {
    "city": "Guixi",
    "city_ascii": "Guixi",
    "lat": 28.2861,
    "lng": 117.2083,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": "minor",
    "population": 647240.0,
    "id": 1156259342
  },
  {
    "city": "Dongyang",
    "city_ascii": "Dongyang",
    "lat": 29.2785,
    "lng": 120.2282,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 804398.0,
    "id": 1156259752
  },
  {
    "city": "Jieyang",
    "city_ascii": "Jieyang",
    "lat": 23.5533,
    "lng": 116.3649,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 6089400.0,
    "id": 1156260378
  },
  {
    "city": "Nagqu",
    "city_ascii": "Nagqu",
    "lat": 31.4766,
    "lng": 92.0569,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Tibet",
    "capital": "minor",
    "population": 504838.0,
    "id": 1156260844
  },
  {
    "city": "Xindi",
    "city_ascii": "Xindi",
    "lat": 29.8182,
    "lng": 113.4653,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 819446.0,
    "id": 1156263165
  },
  {
    "city": "Zhuangyuan",
    "city_ascii": "Zhuangyuan",
    "lat": 37.3056,
    "lng": 120.8275,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 626683.0,
    "id": 1156263400
  },
  {
    "city": "Wusong",
    "city_ascii": "Wusong",
    "lat": 30.9333,
    "lng": 117.7667,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": "minor",
    "population": 1311726.0,
    "id": 1156264408
  },
  {
    "city": "Hancheng",
    "city_ascii": "Hancheng",
    "lat": 35.4768,
    "lng": 110.4419,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shaanxi",
    "capital": null,
    "population": 391164.0,
    "id": 1156265838
  },
  {
    "city": "Mishan",
    "city_ascii": "Mishan",
    "lat": 45.542,
    "lng": 131.8666,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 420000.0,
    "id": 1156267144
  },
  {
    "city": "Hailin",
    "city_ascii": "Hailin",
    "lat": 44.5735,
    "lng": 129.3825,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 420000.0,
    "id": 1156267191
  },
  {
    "city": "Guangshui",
    "city_ascii": "Guangshui",
    "lat": 31.6189,
    "lng": 113.8229,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 755910.0,
    "id": 1156267419
  },
  {
    "city": "Bazhou",
    "city_ascii": "Bazhou",
    "lat": 31.8576,
    "lng": 106.7559,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 3283148.0,
    "id": 1156271365
  },
  {
    "city": "Zhoukou",
    "city_ascii": "Zhoukou",
    "lat": 33.625,
    "lng": 114.6418,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 9026015.0,
    "id": 1156272098
  },
  {
    "city": "Qingyang",
    "city_ascii": "Qingyang",
    "lat": 24.8141,
    "lng": 118.5792,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": "minor",
    "population": 2111000.0,
    "id": 1156273372
  },
  {
    "city": "Xinyang",
    "city_ascii": "Xinyang",
    "lat": 32.1264,
    "lng": 114.0672,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": null,
    "population": 6234401.0,
    "id": 1156273453
  },
  {
    "city": "Hangzhou",
    "city_ascii": "Hangzhou",
    "lat": 30.25,
    "lng": 120.1675,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "admin",
    "population": 9523000.0,
    "id": 1156275243
  },
  {
    "city": "Jiexiu",
    "city_ascii": "Jiexiu",
    "lat": 37.0282,
    "lng": 111.9103,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": null,
    "population": 406517.0,
    "id": 1156275703
  },
  {
    "city": "Chifeng",
    "city_ascii": "Chifeng",
    "lat": 42.2663,
    "lng": 118.9223,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Inner Mongolia",
    "capital": "minor",
    "population": 4341245.0,
    "id": 1156277458
  },
  {
    "city": "Qamdo",
    "city_ascii": "Qamdo",
    "lat": 31.1375,
    "lng": 97.1777,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Tibet",
    "capital": "minor",
    "population": 760966.0,
    "id": 1156277802
  },
  {
    "city": "Ji’an",
    "city_ascii": "Ji'an",
    "lat": 27.1172,
    "lng": 114.9793,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": "minor",
    "population": 4956600.0,
    "id": 1156278215
  },
  {
    "city": "Jian’ou",
    "city_ascii": "Jian'ou",
    "lat": 27.0387,
    "lng": 118.3215,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": "minor",
    "population": 456000.0,
    "id": 1156278784
  },
  {
    "city": "Shache",
    "city_ascii": "Shache",
    "lat": 38.4261,
    "lng": 77.25,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Xinjiang",
    "capital": null,
    "population": 851374.0,
    "id": 1156278934
  },
  {
    "city": "Ailan Mubage",
    "city_ascii": "Ailan Mubage",
    "lat": 43.908,
    "lng": 81.2777,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Xinjiang",
    "capital": "minor",
    "population": 526745.0,
    "id": 1156279608
  },
  {
    "city": "Lanzhou",
    "city_ascii": "Lanzhou",
    "lat": 36.0617,
    "lng": 103.8318,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": "admin",
    "population": 3067141.0,
    "id": 1156280566
  },
  {
    "city": "Yulinshi",
    "city_ascii": "Yulinshi",
    "lat": 38.2655,
    "lng": 109.7388,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shaanxi",
    "capital": null,
    "population": 3634750.0,
    "id": 1156280672
  },
  {
    "city": "Taihe",
    "city_ascii": "Taihe",
    "lat": 30.8706,
    "lng": 105.3784,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 924531.0,
    "id": 1156281983
  },
  {
    "city": "Huazhou",
    "city_ascii": "Huazhou",
    "lat": 21.654,
    "lng": 110.6294,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": null,
    "population": 1302100.0,
    "id": 1156282637
  },
  {
    "city": "Xiulin",
    "city_ascii": "Xiulin",
    "lat": 29.7211,
    "lng": 112.4037,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 577022.0,
    "id": 1156284109
  },
  {
    "city": "Chenzhou",
    "city_ascii": "Chenzhou",
    "lat": 25.7989,
    "lng": 113.0267,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": "minor",
    "population": 4744500.0,
    "id": 1156291915
  },
  {
    "city": "Yicheng",
    "city_ascii": "Yicheng",
    "lat": 31.3697,
    "lng": 119.8239,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 1285785.0,
    "id": 1156292419
  },
  {
    "city": "Yuanping",
    "city_ascii": "Yuanping",
    "lat": 38.7299,
    "lng": 112.7134,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": null,
    "population": 491213.0,
    "id": 1156294277
  },
  {
    "city": "Sanming",
    "city_ascii": "Sanming",
    "lat": 26.2658,
    "lng": 117.6302,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": "minor",
    "population": 2580000.0,
    "id": 1156294429
  },
  {
    "city": "Xingtai",
    "city_ascii": "Xingtai",
    "lat": 37.0659,
    "lng": 114.4753,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 7111106.0,
    "id": 1156294952
  },
  {
    "city": "Minzhu",
    "city_ascii": "Minzhu",
    "lat": 43.7192,
    "lng": 127.337,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": "minor",
    "population": 453265.0,
    "id": 1156295044
  },
  {
    "city": "Yingtan",
    "city_ascii": "Yingtan",
    "lat": 28.2333,
    "lng": 117.0,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": null,
    "population": 1175000.0,
    "id": 1156301061
  },
  {
    "city": "Lichuan",
    "city_ascii": "Lichuan",
    "lat": 30.2965,
    "lng": 108.9378,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 913700.0,
    "id": 1156302762
  },
  {
    "city": "Feicheng",
    "city_ascii": "Feicheng",
    "lat": 36.186,
    "lng": 116.772,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 946627.0,
    "id": 1156303834
  },
  {
    "city": "Jieshou",
    "city_ascii": "Jieshou",
    "lat": 33.2605,
    "lng": 115.3618,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": null,
    "population": 650870.0,
    "id": 1156304827
  },
  {
    "city": "Shenyang",
    "city_ascii": "Shenyang",
    "lat": 41.8025,
    "lng": 123.4281,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": "admin",
    "population": 7964000.0,
    "id": 1156309382
  },
  {
    "city": "Shaoyang",
    "city_ascii": "Shaoyang",
    "lat": 27.2418,
    "lng": 111.4725,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": null,
    "population": 7370500.0,
    "id": 1156310366
  },
  {
    "city": "Qian’an",
    "city_ascii": "Qian'an",
    "lat": 40.0059,
    "lng": 118.6973,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 728160.0,
    "id": 1156315498
  },
  {
    "city": "Wuhu",
    "city_ascii": "Wuhu",
    "lat": 31.334,
    "lng": 118.3622,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": "minor",
    "population": 3842100.0,
    "id": 1156315512
  },
  {
    "city": "Taizhou",
    "city_ascii": "Taizhou",
    "lat": 28.6583,
    "lng": 121.4221,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 2162461.0,
    "id": 1156322307
  },
  {
    "city": "Rucheng",
    "city_ascii": "Rucheng",
    "lat": 32.3852,
    "lng": 120.5634,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 1267066.0,
    "id": 1156323529
  },
  {
    "city": "Yushu",
    "city_ascii": "Yushu",
    "lat": 44.8249,
    "lng": 126.5451,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": "minor",
    "population": 1304436.0,
    "id": 1156326773
  },
  {
    "city": "Xiangshui",
    "city_ascii": "Xiangshui",
    "lat": 26.5964,
    "lng": 104.8314,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guizhou",
    "capital": null,
    "population": 1221000.0,
    "id": 1156328867
  },
  {
    "city": "Luohe",
    "city_ascii": "Luohe",
    "lat": 33.583,
    "lng": 114.0109,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 2544266.0,
    "id": 1156330876
  },
  {
    "city": "Taixing",
    "city_ascii": "Taixing",
    "lat": 32.1724,
    "lng": 120.0142,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 1073921.0,
    "id": 1156331200
  },
  {
    "city": "Hai’an",
    "city_ascii": "Hai'an",
    "lat": 32.532,
    "lng": 120.4604,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 874334.0,
    "id": 1156332302
  },
  {
    "city": "Hefei",
    "city_ascii": "Hefei",
    "lat": 31.8639,
    "lng": 117.2808,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": "admin",
    "population": 4216940.0,
    "id": 1156332710
  },
  {
    "city": "Lianran",
    "city_ascii": "Lianran",
    "lat": 24.9211,
    "lng": 102.4778,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Yunnan",
    "capital": "minor",
    "population": 341341.0,
    "id": 1156332794
  },
  {
    "city": "Huzhou",
    "city_ascii": "Huzhou",
    "lat": 30.8925,
    "lng": 120.0875,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 1558826.0,
    "id": 1156335543
  },
  {
    "city": "Heihe",
    "city_ascii": "Heihe",
    "lat": 50.2458,
    "lng": 127.4886,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 1673899.0,
    "id": 1156339225
  },
  {
    "city": "Fuyang",
    "city_ascii": "Fuyang",
    "lat": 30.0553,
    "lng": 119.95,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 771000.0,
    "id": 1156340393
  },
  {
    "city": "Jiangshan",
    "city_ascii": "Jiangshan",
    "lat": 28.7412,
    "lng": 118.6225,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": null,
    "population": 467862.0,
    "id": 1156346497
  },
  {
    "city": "Danjiangkou",
    "city_ascii": "Danjiangkou",
    "lat": 32.5408,
    "lng": 111.5098,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 443755.0,
    "id": 1156347994
  },
  {
    "city": "Jiamusi",
    "city_ascii": "Jiamusi",
    "lat": 46.8081,
    "lng": 130.3653,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 2552097.0,
    "id": 1156350864
  },
  {
    "city": "Jiangjiafan",
    "city_ascii": "Jiangjiafan",
    "lat": 31.0238,
    "lng": 111.9709,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 400000.0,
    "id": 1156352568
  },
  {
    "city": "Huaihua",
    "city_ascii": "Huaihua",
    "lat": 27.5494,
    "lng": 109.9592,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": null,
    "population": 4979600.0,
    "id": 1156353465
  },
  {
    "city": "Bozhou",
    "city_ascii": "Bozhou",
    "lat": 33.8626,
    "lng": 115.7742,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": null,
    "population": 4996844.0,
    "id": 1156356860
  },
  {
    "city": "Tongliao",
    "city_ascii": "Tongliao",
    "lat": 43.6172,
    "lng": 122.264,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Inner Mongolia",
    "capital": "minor",
    "population": 3139153.0,
    "id": 1156358686
  },
  {
    "city": "Yinchuan",
    "city_ascii": "Yinchuan",
    "lat": 38.4795,
    "lng": 106.2254,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Ningxia",
    "capital": "admin",
    "population": 1901793.0,
    "id": 1156359072
  },
  {
    "city": "Liuzhou",
    "city_ascii": "Liuzhou",
    "lat": 24.3264,
    "lng": 109.4281,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 4157934.0,
    "id": 1156360785
  },
  {
    "city": "Meizhou",
    "city_ascii": "Meizhou",
    "lat": 24.2998,
    "lng": 116.1191,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 4378800.0,
    "id": 1156361028
  },
  {
    "city": "Liangshi",
    "city_ascii": "Liangshi",
    "lat": 27.2578,
    "lng": 111.7351,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": null,
    "population": 1335900.0,
    "id": 1156366507
  },
  {
    "city": "Xinmin",
    "city_ascii": "Xinmin",
    "lat": 41.9952,
    "lng": 122.8224,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 680000.0,
    "id": 1156368551
  },
  {
    "city": "Lhasa",
    "city_ascii": "Lhasa",
    "lat": 29.6534,
    "lng": 91.1719,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Tibet",
    "capital": "admin",
    "population": 902500.0,
    "id": 1156369972
  },
  {
    "city": "Sanya",
    "city_ascii": "Sanya",
    "lat": 18.2533,
    "lng": 109.5036,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hainan",
    "capital": "minor",
    "population": 1031396.0,
    "id": 1156373900
  },
  {
    "city": "Guang’an",
    "city_ascii": "Guang'an",
    "lat": 30.4673,
    "lng": 106.6336,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 3205476.0,
    "id": 1156377302
  },
  {
    "city": "Beipiao",
    "city_ascii": "Beipiao",
    "lat": 41.802,
    "lng": 120.7621,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 496164.0,
    "id": 1156378599
  },
  {
    "city": "Zibo",
    "city_ascii": "Zibo",
    "lat": 36.7831,
    "lng": 118.0497,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 2631647.0,
    "id": 1156381094
  },
  {
    "city": "Hanzhong",
    "city_ascii": "Hanzhong",
    "lat": 33.0794,
    "lng": 107.026,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shaanxi",
    "capital": null,
    "population": 3416196.0,
    "id": 1156382678
  },
  {
    "city": "Guli",
    "city_ascii": "Guli",
    "lat": 28.9008,
    "lng": 120.0284,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": null,
    "population": 723490.0,
    "id": 1156383681
  },
  {
    "city": "Shiyan",
    "city_ascii": "Shiyan",
    "lat": 32.6351,
    "lng": 110.7755,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": "minor",
    "population": 3398000.0,
    "id": 1156383921
  },
  {
    "city": "Fangting",
    "city_ascii": "Fangting",
    "lat": 31.1282,
    "lng": 104.1695,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 412758.0,
    "id": 1156384608
  },
  {
    "city": "Wenlan",
    "city_ascii": "Wenlan",
    "lat": 23.3989,
    "lng": 103.3631,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Yunnan",
    "capital": "minor",
    "population": 585976.0,
    "id": 1156385754
  },
  {
    "city": "Yingmen",
    "city_ascii": "Yingmen",
    "lat": 39.9487,
    "lng": 97.4395,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": null,
    "population": 350000.0,
    "id": 1156386711
  },
  {
    "city": "Jixi",
    "city_ascii": "Jixi",
    "lat": 45.2937,
    "lng": 130.965,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 1862165.0,
    "id": 1156393765
  },
  {
    "city": "Daqing",
    "city_ascii": "Daqing",
    "lat": 46.5979,
    "lng": 125.008,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 2904532.0,
    "id": 1156403962
  },
  {
    "city": "Fujin",
    "city_ascii": "Fujin",
    "lat": 47.2489,
    "lng": 132.0341,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 470000.0,
    "id": 1156404715
  },
  {
    "city": "Yanji",
    "city_ascii": "Yanji",
    "lat": 42.9044,
    "lng": 129.5067,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": "minor",
    "population": 513072.0,
    "id": 1156405468
  },
  {
    "city": "Shangrao",
    "city_ascii": "Shangrao",
    "lat": 28.4419,
    "lng": 117.9633,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": "minor",
    "population": 6810700.0,
    "id": 1156405492
  },
  {
    "city": "Hejian",
    "city_ascii": "Hejian",
    "lat": 38.4451,
    "lng": 116.0897,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 810306.0,
    "id": 1156405731
  },
  {
    "city": "Anlu",
    "city_ascii": "Anlu",
    "lat": 31.2575,
    "lng": 113.6783,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": "minor",
    "population": 720000.0,
    "id": 1156406202
  },
  {
    "city": "Zhuanghe",
    "city_ascii": "Zhuanghe",
    "lat": 39.6896,
    "lng": 122.9664,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 905852.0,
    "id": 1156410076
  },
  {
    "city": "Ezhou",
    "city_ascii": "Ezhou",
    "lat": 30.3972,
    "lng": 114.8842,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": "minor",
    "population": 1079353.0,
    "id": 1156414637
  },
  {
    "city": "Anshun",
    "city_ascii": "Anshun",
    "lat": 26.2456,
    "lng": 105.934,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guizhou",
    "capital": null,
    "population": 2353100.0,
    "id": 1156415948
  },
  {
    "city": "Linfen",
    "city_ascii": "Linfen",
    "lat": 36.0812,
    "lng": 111.5087,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": null,
    "population": 4316610.0,
    "id": 1156416074
  },
  {
    "city": "Mianyang",
    "city_ascii": "Mianyang",
    "lat": 31.4669,
    "lng": 104.7385,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 4868243.0,
    "id": 1156417758
  },
  {
    "city": "Beihai",
    "city_ascii": "Beihai",
    "lat": 21.4667,
    "lng": 109.1,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 1853227.0,
    "id": 1156421449
  },
  {
    "city": "Chengdu",
    "city_ascii": "Chengdu",
    "lat": 30.66,
    "lng": 104.0633,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "admin",
    "population": 14645000.0,
    "id": 1156421555
  },
  {
    "city": "Xinshi",
    "city_ascii": "Xinshi",
    "lat": 31.0236,
    "lng": 113.1079,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": "minor",
    "population": 636776.0,
    "id": 1156422214
  },
  {
    "city": "Xuanzhou",
    "city_ascii": "Xuanzhou",
    "lat": 30.9475,
    "lng": 118.7518,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": null,
    "population": 2532938.0,
    "id": 1156424311
  },
  {
    "city": "Beining",
    "city_ascii": "Beining",
    "lat": 41.5961,
    "lng": 121.7928,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 514898.0,
    "id": 1156424678
  },
  {
    "city": "Nangong",
    "city_ascii": "Nangong",
    "lat": 37.3606,
    "lng": 115.3803,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 476096.0,
    "id": 1156426803
  },
  {
    "city": "Puyang",
    "city_ascii": "Puyang",
    "lat": 35.7639,
    "lng": 115.03,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 3598740.0,
    "id": 1156431924
  },
  {
    "city": "Baicheng",
    "city_ascii": "Baicheng",
    "lat": 45.6148,
    "lng": 122.832,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": "minor",
    "population": 2032356.0,
    "id": 1156435764
  },
  {
    "city": "Aksu",
    "city_ascii": "Aksu",
    "lat": 41.185,
    "lng": 80.2904,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Xinjiang",
    "capital": "minor",
    "population": 535657.0,
    "id": 1156436913
  },
  {
    "city": "Taozhou",
    "city_ascii": "Taozhou",
    "lat": 30.8956,
    "lng": 119.411,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": "minor",
    "population": 499132.0,
    "id": 1156438524
  },
  {
    "city": "Chongzuo",
    "city_ascii": "Chongzuo",
    "lat": 22.4167,
    "lng": 107.3667,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 2099400.0,
    "id": 1156438670
  },
  {
    "city": "Bengbu",
    "city_ascii": "Bengbu",
    "lat": 32.9354,
    "lng": 117.3531,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": null,
    "population": 3296408.0,
    "id": 1156440668
  },
  {
    "city": "Kaiyuan",
    "city_ascii": "Kaiyuan",
    "lat": 36.0656,
    "lng": 113.8153,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 1160000.0,
    "id": 1156441554
  },
  {
    "city": "Jianshe",
    "city_ascii": "Jianshe",
    "lat": 34.2189,
    "lng": 113.7693,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 687130.0,
    "id": 1156444449
  },
  {
    "city": "Changde",
    "city_ascii": "Changde",
    "lat": 29.0397,
    "lng": 111.6839,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": "minor",
    "population": 5827200.0,
    "id": 1156449091
  },
  {
    "city": "Sizhan",
    "city_ascii": "Sizhan",
    "lat": 39.0099,
    "lng": 106.3694,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Ningxia",
    "capital": null,
    "population": 751389.0,
    "id": 1156450911
  },
  {
    "city": "Linhai",
    "city_ascii": "Linhai",
    "lat": 28.8523,
    "lng": 121.1409,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": null,
    "population": 1028813.0,
    "id": 1156451663
  },
  {
    "city": "Fenyang",
    "city_ascii": "Fenyang",
    "lat": 37.2647,
    "lng": 111.7775,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": null,
    "population": 416212.0,
    "id": 1156455704
  },
  {
    "city": "Xinji",
    "city_ascii": "Xinji",
    "lat": 37.9423,
    "lng": 115.2118,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 615919.0,
    "id": 1156456552
  },
  {
    "city": "Shantou",
    "city_ascii": "Shantou",
    "lat": 23.3735,
    "lng": 116.6941,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 4312192.0,
    "id": 1156457499
  },
  {
    "city": "Hezhou",
    "city_ascii": "Hezhou",
    "lat": 24.4164,
    "lng": 111.5478,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 2072600.0,
    "id": 1156459799
  },
  {
    "city": "Shuizhai",
    "city_ascii": "Shuizhai",
    "lat": 33.4433,
    "lng": 114.8994,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": null,
    "population": 1003698.0,
    "id": 1156462734
  },
  {
    "city": "Yanjiao",
    "city_ascii": "Yanjiao",
    "lat": 39.9432,
    "lng": 116.8036,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 363809.0,
    "id": 1156470847
  },
  {
    "city": "Weihai",
    "city_ascii": "Weihai",
    "lat": 37.5,
    "lng": 122.1,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 2906548.0,
    "id": 1156473300
  },
  {
    "city": "Meihekou",
    "city_ascii": "Meihekou",
    "lat": 42.5279,
    "lng": 125.678,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": "minor",
    "population": 618251.0,
    "id": 1156474288
  },
  {
    "city": "Sanhe",
    "city_ascii": "Sanhe",
    "lat": 39.9808,
    "lng": 117.0701,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 652042.0,
    "id": 1156476348
  },
  {
    "city": "Wafangdian",
    "city_ascii": "Wafangdian",
    "lat": 39.6271,
    "lng": 121.9972,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 1024876.0,
    "id": 1156476417
  },
  {
    "city": "Kunming",
    "city_ascii": "Kunming",
    "lat": 25.0433,
    "lng": 102.7061,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Yunnan",
    "capital": "admin",
    "population": 4422686.0,
    "id": 1156477539
  },
  {
    "city": "Dongguan",
    "city_ascii": "Dongguan",
    "lat": 23.0475,
    "lng": 113.7493,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 10646000.0,
    "id": 1156478242
  },
  {
    "city": "Huilong",
    "city_ascii": "Huilong",
    "lat": 31.8131,
    "lng": 121.6574,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 972525.0,
    "id": 1156485081
  },
  {
    "city": "Gaobeidian",
    "city_ascii": "Gaobeidian",
    "lat": 39.3257,
    "lng": 115.8678,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hebei",
    "capital": null,
    "population": 640280.0,
    "id": 1156487293
  },
  {
    "city": "Qufu",
    "city_ascii": "Qufu",
    "lat": 35.6,
    "lng": 116.9833,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 640498.0,
    "id": 1156490037
  },
  {
    "city": "Lianyuan",
    "city_ascii": "Lianyuan",
    "lat": 27.6961,
    "lng": 111.6659,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": "minor",
    "population": 1162928.0,
    "id": 1156490109
  },
  {
    "city": "Jiaxing",
    "city_ascii": "Jiaxing",
    "lat": 30.7522,
    "lng": 120.75,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 1518654.0,
    "id": 1156491661
  },
  {
    "city": "Lu’an",
    "city_ascii": "Lu'an",
    "lat": 31.7542,
    "lng": 116.5078,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": "minor",
    "population": 5611701.0,
    "id": 1156499624
  },
  {
    "city": "Zhanjiang",
    "city_ascii": "Zhanjiang",
    "lat": 21.1967,
    "lng": 110.4031,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 7332000.0,
    "id": 1156502170
  },
  {
    "city": "Guankou",
    "city_ascii": "Guankou",
    "lat": 30.9933,
    "lng": 103.624,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": null,
    "population": 671200.0,
    "id": 1156503907
  },
  {
    "city": "Zhuji",
    "city_ascii": "Zhuji",
    "lat": 29.7169,
    "lng": 120.2314,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 1157938.0,
    "id": 1156504227
  },
  {
    "city": "Jining",
    "city_ascii": "Jining",
    "lat": 35.4,
    "lng": 116.5667,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 8357897.0,
    "id": 1156504601
  },
  {
    "city": "Zhongba",
    "city_ascii": "Zhongba",
    "lat": 31.7761,
    "lng": 104.7406,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 762140.0,
    "id": 1156515985
  },
  {
    "city": "Neijiang",
    "city_ascii": "Neijiang",
    "lat": 29.5872,
    "lng": 105.0635,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 3702847.0,
    "id": 1156516335
  },
  {
    "city": "Dingxi",
    "city_ascii": "Dingxi",
    "lat": 35.5806,
    "lng": 104.6263,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": "minor",
    "population": 2698624.0,
    "id": 1156518274
  },
  {
    "city": "Fengcheng",
    "city_ascii": "Fengcheng",
    "lat": 40.4543,
    "lng": 124.0646,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": null,
    "population": 543933.0,
    "id": 1156519626
  },
  {
    "city": "Gaoping",
    "city_ascii": "Gaoping",
    "lat": 30.7824,
    "lng": 106.1281,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 2174000.0,
    "id": 1156522457
  },
  {
    "city": "Zhufeng",
    "city_ascii": "Zhufeng",
    "lat": 36.0,
    "lng": 119.4167,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 1081960.0,
    "id": 1156522825
  },
  {
    "city": "Dezhou",
    "city_ascii": "Dezhou",
    "lat": 37.4513,
    "lng": 116.3105,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 5611194.0,
    "id": 1156524080
  },
  {
    "city": "Xiangxiang",
    "city_ascii": "Xiangxiang",
    "lat": 27.7389,
    "lng": 112.5223,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": null,
    "population": 787216.0,
    "id": 1156524101
  },
  {
    "city": "Huangshan",
    "city_ascii": "Huangshan",
    "lat": 29.7132,
    "lng": 118.3151,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": "minor",
    "population": 1358980.0,
    "id": 1156527426
  },
  {
    "city": "Sanmenxia",
    "city_ascii": "Sanmenxia",
    "lat": 34.7736,
    "lng": 111.195,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": null,
    "population": 2234018.0,
    "id": 1156529682
  },
  {
    "city": "Fuding",
    "city_ascii": "Fuding",
    "lat": 27.2,
    "lng": 120.2,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Fujian",
    "capital": "minor",
    "population": 542000.0,
    "id": 1156530120
  },
  {
    "city": "Yucheng",
    "city_ascii": "Yucheng",
    "lat": 36.9329,
    "lng": 116.6403,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": "minor",
    "population": 522878.0,
    "id": 1156530681
  },
  {
    "city": "Fangchenggang",
    "city_ascii": "Fangchenggang",
    "lat": 21.6,
    "lng": 108.3,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 1046068.0,
    "id": 1156532454
  },
  {
    "city": "Xingren",
    "city_ascii": "Xingren",
    "lat": 25.4352,
    "lng": 105.1907,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guizhou",
    "capital": null,
    "population": 417919.0,
    "id": 1156533633
  },
  {
    "city": "Dongtai",
    "city_ascii": "Dongtai",
    "lat": 32.8534,
    "lng": 120.3037,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 990306.0,
    "id": 1156536785
  },
  {
    "city": "Zunyi",
    "city_ascii": "Zunyi",
    "lat": 27.705,
    "lng": 106.9336,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guizhou",
    "capital": null,
    "population": 6606675.0,
    "id": 1156539782
  },
  {
    "city": "Hegang",
    "city_ascii": "Hegang",
    "lat": 47.3139,
    "lng": 130.2775,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 1058665.0,
    "id": 1156541759
  },
  {
    "city": "Xinhualu",
    "city_ascii": "Xinhualu",
    "lat": 34.3962,
    "lng": 113.7249,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 758079.0,
    "id": 1156544851
  },
  {
    "city": "Jianguang",
    "city_ascii": "Jianguang",
    "lat": 28.1958,
    "lng": 115.7833,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangxi",
    "capital": null,
    "population": 1507402.0,
    "id": 1156545200
  },
  {
    "city": "Yan’an",
    "city_ascii": "Yan'an",
    "lat": 36.5952,
    "lng": 109.4863,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shaanxi",
    "capital": null,
    "population": 2282581.0,
    "id": 1156546342
  },
  {
    "city": "Baoshan",
    "city_ascii": "Baoshan",
    "lat": 25.1211,
    "lng": 99.169,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Yunnan",
    "capital": null,
    "population": 2627000.0,
    "id": 1156546994
  },
  {
    "city": "Jinhua",
    "city_ascii": "Jinhua",
    "lat": 29.1046,
    "lng": 119.6494,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Zhejiang",
    "capital": "minor",
    "population": 1463990.0,
    "id": 1156547188
  },
  {
    "city": "Chaozhou",
    "city_ascii": "Chaozhou",
    "lat": 23.67,
    "lng": 116.63,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 2656600.0,
    "id": 1156549118
  },
  {
    "city": "Zêtang",
    "city_ascii": "Zetang",
    "lat": 29.238,
    "lng": 91.771,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Tibet",
    "capital": null,
    "population": 382610.0,
    "id": 1156561299
  },
  {
    "city": "Binzhou",
    "city_ascii": "Binzhou",
    "lat": 37.3806,
    "lng": 118.0125,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 3928568.0,
    "id": 1156564962
  },
  {
    "city": "Maoming",
    "city_ascii": "Maoming",
    "lat": 21.6618,
    "lng": 110.9178,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 6313200.0,
    "id": 1156568722
  },
  {
    "city": "Chengjiao",
    "city_ascii": "Chengjiao",
    "lat": 35.4043,
    "lng": 114.0593,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Henan",
    "capital": "minor",
    "population": 495744.0,
    "id": 1156571332
  },
  {
    "city": "Wanyuan",
    "city_ascii": "Wanyuan",
    "lat": 32.0691,
    "lng": 108.0351,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 407594.0,
    "id": 1156571429
  },
  {
    "city": "Turpan",
    "city_ascii": "Turpan",
    "lat": 42.9512,
    "lng": 89.1895,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Xinjiang",
    "capital": "minor",
    "population": 622903.0,
    "id": 1156573684
  },
  {
    "city": "Shuanghe",
    "city_ascii": "Shuanghe",
    "lat": 30.3866,
    "lng": 106.7756,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 360000.0,
    "id": 1156573894
  },
  {
    "city": "Wenchang",
    "city_ascii": "Wenchang",
    "lat": 31.054,
    "lng": 116.9507,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Anhui",
    "capital": "minor",
    "population": 664455.0,
    "id": 1156574542
  },
  {
    "city": "Wuhai",
    "city_ascii": "Wuhai",
    "lat": 39.6844,
    "lng": 106.8158,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Inner Mongolia",
    "capital": "minor",
    "population": 532902.0,
    "id": 1156575615
  },
  {
    "city": "Da’an",
    "city_ascii": "Da'an",
    "lat": 45.505,
    "lng": 124.2863,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jilin",
    "capital": "minor",
    "population": 418232.0,
    "id": 1156577983
  },
  {
    "city": "Danyang",
    "city_ascii": "Danyang",
    "lat": 31.9948,
    "lng": 119.575,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": null,
    "population": 980662.0,
    "id": 1156578273
  },
  {
    "city": "Zhongshan",
    "city_ascii": "Zhongshan",
    "lat": 22.5333,
    "lng": 113.35,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 2909633.0,
    "id": 1156579621
  },
  {
    "city": "Huludao",
    "city_ascii": "Huludao",
    "lat": 40.7094,
    "lng": 120.8378,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Liaoning",
    "capital": "minor",
    "population": 2623541.0,
    "id": 1156580218
  },
  {
    "city": "Luzhou",
    "city_ascii": "Luzhou",
    "lat": 28.8918,
    "lng": 105.4409,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Sichuan",
    "capital": "minor",
    "population": 4218427.0,
    "id": 1156582079
  },
  {
    "city": "Dangyang",
    "city_ascii": "Dangyang",
    "lat": 30.8258,
    "lng": 111.791,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 560000.0,
    "id": 1156585505
  },
  {
    "city": "Qingzhen",
    "city_ascii": "Qingzhen",
    "lat": 26.5555,
    "lng": 106.4646,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guizhou",
    "capital": null,
    "population": 467992.0,
    "id": 1156587033
  },
  {
    "city": "Yutan",
    "city_ascii": "Yutan",
    "lat": 28.3147,
    "lng": 112.554,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hunan",
    "capital": "minor",
    "population": 1368117.0,
    "id": 1156592042
  },
  {
    "city": "Anqiu",
    "city_ascii": "Anqiu",
    "lat": 36.3619,
    "lng": 119.1072,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shandong",
    "capital": null,
    "population": 947723.0,
    "id": 1156592047
  },
  {
    "city": "Zhaodong",
    "city_ascii": "Zhaodong",
    "lat": 46.0635,
    "lng": 125.9773,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 666532.0,
    "id": 1156601489
  },
  {
    "city": "Nanning",
    "city_ascii": "Nanning",
    "lat": 22.8192,
    "lng": 108.315,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "admin",
    "population": 3837978.0,
    "id": 1156605439
  },
  {
    "city": "Sihui",
    "city_ascii": "Sihui",
    "lat": 23.3448,
    "lng": 112.6956,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": null,
    "population": 593400.0,
    "id": 1156609451
  },
  {
    "city": "Nehe",
    "city_ascii": "Nehe",
    "lat": 48.48,
    "lng": 124.8738,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 740000.0,
    "id": 1156609562
  },
  {
    "city": "Lecheng",
    "city_ascii": "Lecheng",
    "lat": 25.1307,
    "lng": 113.3472,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 419500.0,
    "id": 1156612198
  },
  {
    "city": "Shaoguan",
    "city_ascii": "Shaoguan",
    "lat": 24.8011,
    "lng": 113.5927,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangdong",
    "capital": "minor",
    "population": 2997600.0,
    "id": 1156617066
  },
  {
    "city": "Xinzhou",
    "city_ascii": "Xinzhou",
    "lat": 38.4178,
    "lng": 112.7233,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": "minor",
    "population": 3067501.0,
    "id": 1156617534
  },
  {
    "city": "Wuzhou",
    "city_ascii": "Wuzhou",
    "lat": 23.4833,
    "lng": 111.3167,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Guangxi",
    "capital": "minor",
    "population": 3061100.0,
    "id": 1156620133
  },
  {
    "city": "Ning’an",
    "city_ascii": "Ning'an",
    "lat": 44.3439,
    "lng": 129.4656,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Heilongjiang",
    "capital": "minor",
    "population": 440000.0,
    "id": 1156629205
  },
  {
    "city": "Zhongxiang",
    "city_ascii": "Zhongxiang",
    "lat": 31.169,
    "lng": 112.5853,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Hubei",
    "capital": null,
    "population": 1022514.0,
    "id": 1156631720
  },
  {
    "city": "Taiyuan",
    "city_ascii": "Taiyuan",
    "lat": 37.8733,
    "lng": 112.5425,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanxi",
    "capital": "admin",
    "population": 3875053.0,
    "id": 1156632014
  },
  {
    "city": "Longba",
    "city_ascii": "Longba",
    "lat": 33.535,
    "lng": 105.349,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Gansu",
    "capital": null,
    "population": 2567718.0,
    "id": 1156633259
  },
  {
    "city": "Huai’an",
    "city_ascii": "Huai'an",
    "lat": 33.5058,
    "lng": 119.1392,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": null,
    "population": 2632788.0,
    "id": 1156634228
  },
  {
    "city": "Zhenzhou",
    "city_ascii": "Zhenzhou",
    "lat": 32.2739,
    "lng": 119.1619,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "minor",
    "population": 564021.0,
    "id": 1156634387
  },
  {
    "city": "Nanjing",
    "city_ascii": "Nanjing",
    "lat": 32.0608,
    "lng": 118.7789,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Jiangsu",
    "capital": "admin",
    "population": 8422000.0,
    "id": 1156644065
  },
  {
    "city": "Pudong",
    "city_ascii": "Pudong",
    "lat": 31.2231,
    "lng": 121.5397,
    "country": "China",
    "iso2": "CN",
    "iso3": "CHN",
    "admin_name": "Shanghai",
    "capital": "minor",
    "pop
Download .txt
gitextract_8bolxsaa/

├── .eslintrc.cjs
├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .prettierignore
├── LICENSE
├── Makefile
├── README.md
├── build-docs.sh
├── bump_npm.py
├── demo/
│   ├── README.md
│   ├── __init__.py
│   ├── auth.py
│   ├── auth_user.py
│   ├── cities.json
│   ├── components_list.py
│   ├── forms.py
│   ├── main.py
│   ├── shared.py
│   ├── sse.py
│   ├── tables.py
│   └── tests.py
├── docs/
│   ├── api/
│   │   ├── python_components.md
│   │   └── typescript_components.md
│   ├── extra/
│   │   └── tweaks.css
│   ├── guide.md
│   ├── index.md
│   └── plugins.py
├── mkdocs.yml
├── package.json
├── pyproject.toml
├── requirements/
│   ├── docs.in
│   └── docs.txt
├── src/
│   ├── npm-fastui/
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── Defaults.tsx
│   │   │   ├── components/
│   │   │   │   ├── Code.tsx
│   │   │   │   ├── CodeLazy.tsx
│   │   │   │   ├── Custom.tsx
│   │   │   │   ├── FireEvent.tsx
│   │   │   │   ├── FormField.tsx
│   │   │   │   ├── Iframe.tsx
│   │   │   │   ├── Json.tsx
│   │   │   │   ├── LinkList.tsx
│   │   │   │   ├── Markdown.tsx
│   │   │   │   ├── MarkdownLazy.tsx
│   │   │   │   ├── PageTitle.tsx
│   │   │   │   ├── ServerLoad.tsx
│   │   │   │   ├── button.tsx
│   │   │   │   ├── details.tsx
│   │   │   │   ├── display.tsx
│   │   │   │   ├── div.tsx
│   │   │   │   ├── error.tsx
│   │   │   │   ├── footer.tsx
│   │   │   │   ├── form.tsx
│   │   │   │   ├── heading.tsx
│   │   │   │   ├── image.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   ├── link.tsx
│   │   │   │   ├── modal.tsx
│   │   │   │   ├── navbar.tsx
│   │   │   │   ├── pagination.tsx
│   │   │   │   ├── paragraph.tsx
│   │   │   │   ├── spinner.tsx
│   │   │   │   ├── table.tsx
│   │   │   │   ├── text.tsx
│   │   │   │   ├── toast.tsx
│   │   │   │   └── video.tsx
│   │   │   ├── controller.tsx
│   │   │   ├── dev.tsx
│   │   │   ├── events.ts
│   │   │   ├── hooks/
│   │   │   │   ├── className.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── error.tsx
│   │   │   │   ├── eventContext.tsx
│   │   │   │   └── locationContext.tsx
│   │   │   ├── index.tsx
│   │   │   ├── models.d.ts
│   │   │   └── tools.ts
│   │   ├── tsconfig.json
│   │   └── typedoc.json
│   ├── npm-fastui-bootstrap/
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── footer.tsx
│   │   │   ├── index.tsx
│   │   │   ├── modal.tsx
│   │   │   ├── navbar.tsx
│   │   │   ├── pagination.tsx
│   │   │   └── toast.tsx
│   │   ├── tsconfig.json
│   │   └── typedoc.json
│   ├── npm-fastui-prebuilt/
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── App.tsx
│   │   │   ├── main.scss
│   │   │   ├── main.tsx
│   │   │   └── vite-env.d.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   ├── typedoc.json
│   │   └── vite.config.ts
│   └── python-fastui/
│       ├── LICENSE
│       ├── README.md
│       ├── fastui/
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── auth/
│       │   │   ├── __init__.py
│       │   │   ├── github.py
│       │   │   └── shared.py
│       │   ├── base.py
│       │   ├── class_name.py
│       │   ├── components/
│       │   │   ├── __init__.py
│       │   │   ├── display.py
│       │   │   ├── forms.py
│       │   │   ├── py.typed
│       │   │   └── tables.py
│       │   ├── dev.py
│       │   ├── events.py
│       │   ├── forms.py
│       │   ├── generate_typescript.py
│       │   ├── json_schema.py
│       │   ├── py.typed
│       │   └── types.py
│       ├── pyproject.toml
│       ├── requirements/
│       │   ├── all.txt
│       │   ├── lint.in
│       │   ├── lint.txt
│       │   ├── pyproject.txt
│       │   ├── render.txt
│       │   ├── test.in
│       │   └── test.txt
│       └── tests/
│           ├── test_auth_github.py
│           ├── test_auth_shared.py
│           ├── test_components.py
│           ├── test_dev.py
│           ├── test_forms.py
│           ├── test_json_schema.py
│           ├── test_prebuilt_html.py
│           └── test_tables_display.py
├── tsconfig.json
├── typedoc.base.json
└── typedoc.json
Download .txt
SYMBOL INDEX (460 symbols across 56 files)

FILE: bump_npm.py
  function replace_package_json (line 9) | def replace_package_json(package_json: Path, new_version: str, deps: boo...
  function main (line 20) | def main():

FILE: demo/__init__.py
  function lifespan (line 22) | async def lifespan(app_: FastAPI):
  function robots_txt (line 45) | async def robots_txt() -> str:
  function favicon_ico (line 50) | async def favicon_ico() -> str:
  function html_landing (line 55) | async def html_landing() -> HTMLResponse:

FILE: demo/auth.py
  function get_github_auth (line 30) | async def get_github_auth(request: Request) -> GitHubAuthProvider:
  function auth_login (line 45) | def auth_login(
  function auth_login_content (line 80) | def auth_login_content(kind: LoginKind) -> list[AnyComponent]:
  class LoginForm (line 105) | class LoginForm(BaseModel):
  function login_form_post (line 117) | async def login_form_post(form: Annotated[LoginForm, fastui_form(LoginFo...
  function profile (line 124) | async def profile(user: Annotated[User, Depends(User.from_request)]) -> ...
  function logout_form_post (line 141) | async def logout_form_post() -> list[AnyComponent]:
  function auth_github_gen (line 146) | async def auth_github_gen(github_auth: Annotated[GitHubAuthProvider, Dep...
  function github_redirect (line 152) | async def github_redirect(

FILE: demo/auth_user.py
  class User (line 15) | class User:
    method encode_token (line 19) | def encode_token(self) -> str:
    method from_request (line 25) | def from_request(cls, authorization: Annotated[str, Header()] = '') ->...
    method from_request_opt (line 33) | def from_request_opt(cls, authorization: Annotated[str, Header()] = ''...
  class CustomJsonEncoder (line 51) | class CustomJsonEncoder(json.JSONEncoder):
    method default (line 52) | def default(self, obj: Any) -> Any:

FILE: demo/components_list.py
  function panel (line 15) | def panel(*components: AnyComponent) -> AnyComponent:
  function components_view (line 20) | def components_view() -> list[AnyComponent]:
  function modal_view (line 304) | async def modal_view() -> list[AnyComponent]:
  function modal_form_submit (line 310) | async def modal_form_submit() -> list[AnyComponent]:
  function modal_prompt_submit (line 316) | async def modal_prompt_submit() -> list[AnyComponent]:

FILE: demo/forms.py
  function search_view (line 23) | async def search_view(request: Request, q: str) -> SelectSearchResponse:
  function forms_view (line 49) | def forms_view(kind: FormKind) -> list[AnyComponent]:
  function form_content (line 82) | def form_content(kind: FormKind):
  class LoginForm (line 106) | class LoginForm(BaseModel):
  function login_form_post (line 112) | async def login_form_post(form: Annotated[LoginForm, fastui_form(LoginFo...
  class ToolEnum (line 117) | class ToolEnum(str, enum.Enum):
  class SelectForm (line 124) | class SelectForm(BaseModel):
    method correct_select_multiple (line 132) | def correct_select_multiple(cls, v: list[str]) -> list[str]:
  function select_form_post (line 140) | async def select_form_post(form: Annotated[SelectForm, fastui_form(Selec...
  class SizeModel (line 145) | class SizeModel(BaseModel):
  class BigModel (line 150) | class BigModel(BaseModel):
    method name_validator (line 174) | def name_validator(cls, v: str | None) -> str:
  function big_form_post (line 181) | async def big_form_post(form: Annotated[BigModel, fastui_form(BigModel)]):

FILE: demo/main.py
  function api_index (line 13) | def api_index() -> list[AnyComponent]:
  function api_404 (line 52) | async def api_404():

FILE: demo/shared.py
  function demo_page (line 8) | def demo_page(*components: AnyComponent, title: str | None = None) -> li...

FILE: demo/sse.py
  function canned_ai_response_generator (line 13) | async def canned_ai_response_generator() -> AsyncIterable[str]:
  function sse_ai_response (line 24) | async def sse_ai_response() -> StreamingResponse:
  function run_openai (line 28) | async def run_openai():

FILE: demo/tables.py
  class City (line 18) | class City(BaseModel):
  function cities_list (line 33) | def cities_list() -> list[City]:
  function cities_lookup (line 42) | def cities_lookup() -> dict[id, City]:
  class FilterForm (line 46) | class FilterForm(pydantic.BaseModel):
  function cities_view (line 51) | def cities_view(page: int = 1, country: str | None = None) -> list[AnyCo...
  function city_view (line 84) | def city_view(city_id: int) -> list[AnyComponent]:
  class User (line 94) | class User(BaseModel):
  function users_view (line 110) | def users_view() -> list[AnyComponent]:
  function tabs (line 126) | def tabs() -> list[AnyComponent]:
  function user_profile (line 148) | def user_profile(id: int) -> list[AnyComponent]:

FILE: demo/tests.py
  function client (line 11) | def client():
  function test_index (line 16) | def test_index(client: TestClient):
  function test_api_root (line 23) | def test_api_root(client: TestClient):
  function get_menu_links (line 56) | def get_menu_links():
  function test_menu_links (line 70) | def test_menu_links(client: TestClient, url: str):

FILE: docs/plugins.py
  function on_pre_build (line 16) | def on_pre_build(config: Config):
  function on_files (line 20) | def on_files(files: Files, config: Config) -> Files:
  function remove_files (line 24) | def remove_files(files: Files) -> Files:
  function on_page_markdown (line 38) | def on_page_markdown(markdown: str, page: Page, config: Config, files: F...
  function add_version (line 43) | def add_version(markdown: str, page: Page) -> str:
  function remove_code_fence_attributes (line 60) | def remove_code_fence_attributes(markdown: str) -> str:

FILE: src/npm-fastui-bootstrap/src/pagination.tsx
  type Link (line 4) | interface Link {

FILE: src/npm-fastui-prebuilt/src/App.tsx
  function App (line 5) | function App() {
  function getMetaContent (line 19) | function getMetaContent(name: string): string | undefined {
  constant COWSAY (line 50) | const COWSAY = ` {above}

FILE: src/npm-fastui/src/components/FormField.tsx
  type PrivateOnChange (line 20) | type PrivateOnChange = () => void
  type FormFieldInputProps (line 22) | interface FormFieldInputProps extends FormFieldInput {
  type FormFieldTextareaProps (line 50) | interface FormFieldTextareaProps extends FormFieldTextarea {
  type FormFieldBooleanProps (line 77) | interface FormFieldBooleanProps extends FormFieldBoolean {
  type FormFieldFileProps (line 103) | interface FormFieldFileProps extends FormFieldFile {
  type FormFieldSelectProps (line 134) | interface FormFieldSelectProps extends FormFieldSelect {
  function findDefaultArray (line 234) | function findDefaultArray(options: SelectOptions, value: string[]): Sele...
  function findDefault (line 239) | function findDefault(options: SelectOptions, value?: string): SelectOpti...
  type FormFieldSelectSearchProps (line 252) | interface FormFieldSelectSearchProps extends FormFieldSelectSearch {
  type FormFieldProps (line 328) | type FormFieldProps =

FILE: src/npm-fastui/src/components/MarkdownLazy.tsx
  method a (line 16) | a({ children, href }) {
  method code (line 19) | code({ children, className }) {
  type MarkdownCodeProps (line 74) | interface MarkdownCodeProps {
  type MarkdownCodeHighlightProps (line 93) | interface MarkdownCodeHighlightProps {

FILE: src/npm-fastui/src/components/ServerLoad.tsx
  type DeferProps (line 37) | interface DeferProps {
  type FetchProps (line 64) | interface FetchProps {
  type SSEProps (line 116) | interface SSEProps {
  function useServerUrl (line 159) | function useServerUrl(path: string): string {
  function getFragment (line 174) | function getFragment(path: string): string | undefined {

FILE: src/npm-fastui/src/components/display.tsx
  type DisplayArrayProps (line 72) | interface DisplayArrayProps {
  type DisplayObjectProps (line 91) | interface DisplayObjectProps {
  type JSONPrimitive (line 110) | type JSONPrimitive = string | number | boolean | null
  type DisplayPrimitiveProps (line 112) | interface DisplayPrimitiveProps {
  type DataModel (line 236) | type DataModel = Record<string, JsonData>
  type DisplayLookupProps (line 238) | interface DisplayLookupProps extends Omit<Display, 'type' | 'value'> {
  function renderEvent (line 243) | function renderEvent(event: AnyEvent | undefined, data: DataModel): AnyE...

FILE: src/npm-fastui/src/components/form.tsx
  type Loc (line 152) | type Loc = (string | number)[]
  type Error (line 153) | interface Error {
  type ErrorResponse (line 159) | interface ErrorResponse {
  function locToName (line 166) | function locToName(loc: Loc): string {

FILE: src/npm-fastui/src/components/heading.tsx
  function getComponent (line 14) | function getComponent(level: 1 | 2 | 3 | 4 | 5 | 6): FC<{ text: string; ...

FILE: src/npm-fastui/src/components/index.tsx
  type FastClassNameProps (line 84) | type FastClassNameProps = Exclude<FastProps, Text | Display | ServerLoad...

FILE: src/npm-fastui/src/components/link.tsx
  type LinkRenderProps (line 17) | interface LinkRenderProps {

FILE: src/npm-fastui/src/controller.tsx
  function FastUIController (line 7) | function FastUIController() {

FILE: src/npm-fastui/src/dev.tsx
  function listen (line 30) | async function listen() {

FILE: src/npm-fastui/src/events.ts
  type PageEventDetail (line 9) | interface PageEventDetail {
  function pageEventType (line 14) | function pageEventType(event: PageEvent): string {
  function useFireEvent (line 18) | function useFireEvent(): { fireEvent: (event?: AnyEvent) => void } {
  type LoadEventDetail (line 76) | interface LoadEventDetail {
  function fireLoadEvent (line 81) | function fireLoadEvent(detail: LoadEventDetail) {
  type EventDetails (line 85) | interface EventDetails {
  function usePageEventListen (line 91) | function usePageEventListen(event?: PageEvent, initialContext: ContextTy...

FILE: src/npm-fastui/src/hooks/className.ts
  type ClassNameGeneratorArgs (line 8) | interface ClassNameGeneratorArgs {
  type ClassNameGenerator (line 14) | type ClassNameGenerator = (args: ClassNameGeneratorArgs) => ClassName | ...
  type UseClassNameExtra (line 17) | interface UseClassNameExtra {
  function useClassName (line 30) | function useClassName(props: FastClassNameProps, extra?: UseClassNameExt...
  function combineClassNameProp (line 65) | function combineClassNameProp(classNameProp?: ClassName): boolean {
  function combine (line 81) | function combine(cn1?: ClassName, cn2?: ClassName): string {
  function renderClassName (line 95) | function renderClassName(className?: ClassName): string {

FILE: src/npm-fastui/src/hooks/config.ts
  type Config (line 6) | type Config = Omit<FastUIProps, 'DisplayError' | 'classNameGenerator' | ...

FILE: src/npm-fastui/src/hooks/error.tsx
  type ErrorDetails (line 9) | interface ErrorDetails {
  type ErrorDisplayProps (line 15) | interface ErrorDisplayProps extends ErrorDetails {
  type ErrorContextType (line 19) | interface ErrorContextType {
  type Props (line 54) | interface Props {

FILE: src/npm-fastui/src/hooks/eventContext.tsx
  type ContextType (line 3) | type ContextType = Record<string, string | number>

FILE: src/npm-fastui/src/hooks/locationContext.tsx
  function parseLocation (line 7) | function parseLocation(): string {
  type LocationState (line 13) | interface LocationState {
  function LocationProvider (line 36) | function LocationProvider({ children }: { children: ReactNode }) {
  function pathMatch (line 139) | function pathMatch(matchPath: string | boolean | undefined, fullPath: st...
  function stripQuery (line 157) | function stripQuery(fullPath: string): string {
  function getQuery (line 166) | function getQuery(fullPath: string): URLSearchParams {

FILE: src/npm-fastui/src/index.tsx
  type CustomRender (line 19) | type CustomRender = (props: FastProps) => FC | void
  type FastUIProps (line 21) | interface FastUIProps {
  function FastUI (line 35) | function FastUI(props: FastUIProps) {

FILE: src/npm-fastui/src/models.d.ts
  type FastProps (line 7) | type FastProps =
  type ClassName (line 44) | type ClassName =
  type JsonData (line 50) | type JsonData =
  type AnyEvent (line 59) | type AnyEvent = PageEvent | GoToEvent | BackEvent | AuthEvent
  type DisplayMode (line 63) | type DisplayMode =
  type DisplayMode1 (line 77) | type DisplayMode1 =
  type SelectOptions (line 88) | type SelectOptions = SelectOption[] | SelectGroup[]
  type Text (line 93) | interface Text {
  type Paragraph (line 100) | interface Paragraph {
  type PageTitle (line 113) | interface PageTitle {
  type Div (line 120) | interface Div {
  type Page (line 133) | interface Page {
  type Heading (line 146) | interface Heading {
  type Markdown (line 161) | interface Markdown {
  type Code (line 175) | interface Code {
  type Json (line 190) | interface Json {
  type Button (line 203) | interface Button {
  type PageEvent (line 216) | interface PageEvent {
  type ContextType (line 224) | interface ContextType {
  type GoToEvent (line 227) | interface GoToEvent {
  type BackEvent (line 235) | interface BackEvent {
  type AuthEvent (line 238) | interface AuthEvent {
  type Link (line 246) | interface Link {
  type LinkList (line 263) | interface LinkList {
  type Navbar (line 277) | interface Navbar {
  type Footer (line 293) | interface Footer {
  type Modal (line 307) | interface Modal {
  type PageEvent1 (line 321) | interface PageEvent1 {
  type ContextType1 (line 329) | interface ContextType1 {
  type ServerLoad (line 335) | interface ServerLoad {
  type PageEvent2 (line 344) | interface PageEvent2 {
  type Image (line 355) | interface Image {
  type Iframe (line 382) | interface Iframe {
  type Video (line 400) | interface Video {
  type FireEvent (line 420) | interface FireEvent {
  type Error (line 428) | interface Error {
  type Spinner (line 444) | interface Spinner {
  type Custom (line 457) | interface Custom {
  type Table (line 472) | interface Table {
  type DataModel (line 484) | interface DataModel {
  type DisplayLookup (line 490) | interface DisplayLookup {
  type Pagination (line 500) | interface Pagination {
  type Display (line 517) | interface Display {
  type Details (line 527) | interface Details {
  type Form (line 541) | interface Form {
  type PageEvent3 (line 568) | interface PageEvent3 {
  type FormFieldInput (line 579) | interface FormFieldInput {
  type FormFieldTextarea (line 602) | interface FormFieldTextarea {
  type FormFieldBoolean (line 626) | interface FormFieldBoolean {
  type FormFieldFile (line 647) | interface FormFieldFile {
  type FormFieldSelect (line 668) | interface FormFieldSelect {
  type SelectOption (line 690) | interface SelectOption {
  type SelectGroup (line 694) | interface SelectGroup {
  type FormFieldSelectSearch (line 701) | interface FormFieldSelectSearch {
  type SelectOption1 (line 722) | interface SelectOption1 {
  type ModelForm (line 729) | interface ModelForm {
  type PageEvent4 (line 756) | interface PageEvent4 {
  type Toast (line 767) | interface Toast {
  type PageEvent5 (line 790) | interface PageEvent5 {
  type ContextType2 (line 798) | interface ContextType2 {

FILE: src/npm-fastui/src/tools.ts
  constant AUTH_TOKEN_KEY (line 6) | const AUTH_TOKEN_KEY = 'fastui-auth-token'
  type Method (line 7) | type Method = 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE'
  function useRequest (line 9) | function useRequest(): (args: RequestArgs) => Promise<[number, any]> {
  type RequestArgs (line 30) | interface RequestArgs {
  function request (line 41) | async function request({
  function useSSE (line 101) | function useSSE(url: string, onMessage: (data: any) => void, method?: Me...
  class SSERetryError (line 166) | class SSERetryError extends Error {}
  class SSEStopError (line 167) | class SSEStopError extends Error {}
  class RequestError (line 169) | class RequestError extends Error {
    method constructor (line 172) | constructor(message: string, status: number) {
  function responseOk (line 179) | function responseOk(response: Response, expectedStatus?: number[]) {
  function unreachable (line 187) | function unreachable(msg: string, unexpectedValue: never, args?: any) {
  type Callable (line 191) | type Callable = (...args: any[]) => void
  function debounce (line 193) | function debounce<C extends Callable>(fn: C, delay: number): C {
  function sleep (line 203) | async function sleep(ms: number): Promise<void> {
  function getAuthHeader (line 219) | function getAuthHeader(): { key: string; value: string } | undefined {
  function checkResponse (line 227) | async function checkResponse(url: string, response: Response, expectedSt...

FILE: src/python-fastui/fastui/__init__.py
  class FastUI (line 11) | class FastUI(pydantic.RootModel):
    method coerce_to_list (line 19) | def coerce_to_list(cls, v):
  function prebuilt_html (line 30) | def prebuilt_html(

FILE: src/python-fastui/fastui/__main__.py
  function cli (line 7) | def cli():

FILE: src/python-fastui/fastui/auth/github.py
  class GitHubExchangeError (line 20) | class GitHubExchangeError:
  class GitHubExchange (line 26) | class GitHubExchange:
    method check_scope (line 32) | def check_scope(cls, v: str) -> list[str]:
  class GithubUser (line 39) | class GithubUser(BaseModel):
  class GitHubEmail (line 58) | class GitHubEmail(BaseModel):
  class GitHubAuthProvider (line 68) | class GitHubAuthProvider:
    method __init__ (line 73) | def __init__(
    method create (line 112) | async def create(
    method authorization_url (line 136) | async def authorization_url(self) -> str:
    method exchange_code (line 149) | async def exchange_code(self, code: str, state: str | None = None) -> ...
    method _exchange_code (line 167) | async def _exchange_code(self, code: str, state: str | None = None) ->...
    method get_github_user (line 197) | async def get_github_user(self, exchange: GitHubExchange) -> GithubUser:
    method get_github_user_emails (line 206) | async def get_github_user_emails(self, exchange: GitHubExchange) -> li...
    method _auth_headers (line 216) | def _auth_headers(exchange: GitHubExchange) -> dict[str, str]:
  class ExchangeCache (line 223) | class ExchangeCache:
    method __init__ (line 224) | def __init__(self):
    method get (line 227) | def get(self, key: str, max_age: timedelta) -> GitHubExchange | None:
    method set (line 232) | def set(self, key: str, value: GitHubExchange) -> None:
    method _purge (line 235) | def _purge(self, max_age: timedelta) -> None:
    method __len__ (line 244) | def __len__(self) -> int:
    method clear (line 247) | def clear(self) -> None:
  class StateProvider (line 255) | class StateProvider:
    method __init__ (line 262) | def __init__(self, secret: SecretStr, max_age: timedelta = timedelta(m...
    method new_state (line 266) | async def new_state(self) -> str:
    method check_state (line 272) | async def check_state(self, state: str) -> bool:

FILE: src/python-fastui/fastui/auth/shared.py
  class AuthException (line 14) | class AuthException(ABC, Exception):
    method response_data (line 20) | def response_data(self) -> tuple[int, str]:
  class AuthError (line 24) | class AuthError(AuthException):
    method __init__ (line 25) | def __init__(self, message: str, *, code: str):
    method response_data (line 29) | def response_data(self) -> tuple[int, str]:
  class AuthRedirect (line 33) | class AuthRedirect(AuthException):
    method __init__ (line 39) | def __init__(self, path: str, message: str | None = None):
    method response_data (line 44) | def response_data(self) -> tuple[int, str]:
  function fastapi_auth_exception_handling (line 49) | def fastapi_auth_exception_handling(app: 'FastAPI') -> None:

FILE: src/python-fastui/fastui/base.py
  class BaseModel (line 6) | class BaseModel(_BaseModel):

FILE: src/python-fastui/fastui/components/__init__.py
  class Text (line 74) | class Text(BaseModel, extra='forbid'):
  class Paragraph (line 84) | class Paragraph(BaseModel, extra='forbid'):
  class PageTitle (line 97) | class PageTitle(BaseModel, extra='forbid'):
  class Div (line 107) | class Div(BaseModel, defer_build=True, extra='forbid'):
  class Page (line 120) | class Page(BaseModel, defer_build=True, extra='forbid'):
  class Heading (line 133) | class Heading(BaseModel, extra='forbid'):
    method __get_pydantic_json_schema__ (line 152) | def __get_pydantic_json_schema__(
  class Markdown (line 175) | class Markdown(BaseModel, extra='forbid'):
  class Code (line 191) | class Code(BaseModel, extra='forbid'):
  class Json (line 210) | class Json(BaseModel, extra='forbid'):
  class Button (line 223) | class Button(BaseModel, extra='forbid'):
  class Link (line 245) | class Link(BaseModel, defer_build=True, extra='forbid'):
  class LinkList (line 270) | class LinkList(BaseModel, extra='forbid'):
  class Navbar (line 286) | class Navbar(BaseModel, extra='forbid'):
    method __get_pydantic_json_schema__ (line 308) | def __get_pydantic_json_schema__(
  class Footer (line 318) | class Footer(BaseModel, extra='forbid'):
  class Modal (line 334) | class Modal(BaseModel, defer_build=True, extra='forbid'):
  class ServerLoad (line 359) | class ServerLoad(BaseModel, defer_build=True, extra='forbid'):
  class Image (line 384) | class Image(BaseModel, extra='forbid'):
  class Iframe (line 426) | class Iframe(BaseModel, extra='forbid'):
  class Video (line 454) | class Video(BaseModel, extra='forbid'):
  class FireEvent (line 488) | class FireEvent(BaseModel, extra='forbid'):
  class Error (line 501) | class Error(BaseModel, extra='forbid'):
    method __get_pydantic_json_schema__ (line 520) | def __get_pydantic_json_schema__(
  class Spinner (line 530) | class Spinner(BaseModel, extra='forbid'):
  class Toast (line 543) | class Toast(BaseModel, defer_build=True, extra='forbid'):
  class Custom (line 579) | class Custom(BaseModel, extra='forbid'):

FILE: src/python-fastui/fastui/components/display.py
  class DisplayMode (line 18) | class DisplayMode(str, enum.Enum):
  class DisplayBase (line 33) | class DisplayBase(BaseModel, ABC):
  class DisplayLookup (line 46) | class DisplayLookup(DisplayBase, extra='forbid'):
  class Display (line 56) | class Display(DisplayBase, extra='forbid'):
  class Details (line 66) | class Details(BaseModel, extra='forbid'):
    method _fill_fields (line 82) | def _fill_fields(self) -> _te.Self:
    method __get_pydantic_json_schema__ (line 99) | def __get_pydantic_json_schema__(

FILE: src/python-fastui/fastui/components/forms.py
  class BaseFormField (line 18) | class BaseFormField(BaseModel, ABC, defer_build=True):
  class FormFieldInput (line 46) | class FormFieldInput(BaseFormField):
  class FormFieldTextarea (line 65) | class FormFieldTextarea(BaseFormField):
  class FormFieldBoolean (line 87) | class FormFieldBoolean(BaseFormField):
  class FormFieldFile (line 100) | class FormFieldFile(BaseFormField):
  class FormFieldSelect (line 113) | class FormFieldSelect(BaseFormField):
  class FormFieldSelectSearch (line 138) | class FormFieldSelectSearch(BaseFormField):
  class BaseForm (line 167) | class BaseForm(BaseModel, ABC, defer_build=True, extra='forbid'):
    method default_footer (line 198) | def default_footer(self) -> _te.Self:
  class Form (line 204) | class Form(BaseForm, defer_build=True):
  class ModelForm (line 221) | class ModelForm(BaseForm, defer_build=True):
    method form_fields (line 231) | def form_fields(self) -> list[FormField]:

FILE: src/python-fastui/fastui/components/tables.py
  class Table (line 20) | class Table(BaseModel, extra='forbid'):
    method _fill_columns (line 42) | def _fill_columns(self) -> _te.Self:
    method __get_pydantic_json_schema__ (line 65) | def __get_pydantic_json_schema__(
  class Pagination (line 75) | class Pagination(BaseModel):
    method page_count (line 97) | def page_count(self) -> int:

FILE: src/python-fastui/fastui/dev.py
  function dev_fastapi_app (line 15) | def dev_fastapi_app(reload_path: str = '/api/__dev__/reload', **fastapi_...
  class DevReload (line 23) | class DevReload:
    method __init__ (line 24) | def __init__(self, default_lifespan: types.Lifespan[FastAPI] | None):
    method lifespan (line 29) | async def lifespan(self, app: FastAPI):
    method dev_reload_endpoints (line 37) | async def dev_reload_endpoints(self):
    method _on_signal (line 40) | def _on_signal(self, *_args: _t.Any):
    method ping (line 44) | async def ping(self):

FILE: src/python-fastui/fastui/events.py
  class PageEvent (line 11) | class PageEvent(BaseModel, defer_build=True):
  class GoToEvent (line 20) | class GoToEvent(BaseModel):
  class BackEvent (line 28) | class BackEvent(BaseModel):
  class AuthEvent (line 32) | class AuthEvent(BaseModel):

FILE: src/python-fastui/fastui/forms.py
  class FastUIForm (line 27) | class FastUIForm(_t.Generic[FormModel]):
    method __class_getitem__ (line 32) | def __class_getitem__(cls, model: type[FormModel]) -> fastapi_params.D...
  function fastui_form (line 36) | def fastui_form(model: type[FormModel]) -> fastapi_params.Depends:
  class FormFile (line 52) | class FormFile:
    method __init__ (line 55) | def __init__(self, accept: str | None = None, max_size: int | None = N...
    method validate_single (line 59) | def validate_single(self, input_value: _t.Any) -> ds.UploadFile:
    method validate_multiple (line 67) | def validate_multiple(self, input_value: _t.Any) -> list[ds.UploadFile]:
    method _validate_file (line 73) | def _validate_file(self, file: ds.UploadFile) -> None:
    method __get_pydantic_core_schema__ (line 120) | def __get_pydantic_core_schema__(self, source_type: type[_t.Any], *_ar...
    method __get_pydantic_json_schema__ (line 130) | def __get_pydantic_json_schema__(self, core_schema_: core_schema.CoreS...
    method __repr__ (line 142) | def __repr__(self):
  function get_content_type (line 149) | def get_content_type(file: ds.UploadFile) -> str | None:
  class SelectOption (line 156) | class SelectOption(_te.TypedDict):
  class SelectGroup (line 161) | class SelectGroup(_te.TypedDict):
  class SelectSearchResponse (line 169) | class SelectSearchResponse(pydantic.BaseModel):
  function unflatten (line 176) | def unflatten(form_data: ds.FormData) -> NestedDict:
  function name_to_loc (line 218) | def name_to_loc(name: str) -> 'json_schema.SchemeLocation':
  function Textarea (line 232) | def Textarea(rows: int | None = None, cols: int | None = None) -> _t.Any...

FILE: src/python-fastui/fastui/generate_typescript.py
  function main (line 13) | def main(python_object_str: str, typescript_output_file: Path):  # pragm...
  function generate_json_schema (line 24) | def generate_json_schema(root_model: Any) -> JsonSchemaValue:
  class CustomGenerateJsonSchema (line 51) | class CustomGenerateJsonSchema(GenerateJsonSchema):
    method field_title_should_be_set (line 52) | def field_title_should_be_set(self, schema) -> bool:
    method default_schema (line 55) | def default_schema(self, schema: core_schema.WithDefaultSchema) -> Jso...
    method field_is_required (line 65) | def field_is_required(
    method nullable_schema (line 76) | def nullable_schema(self, schema: core_schema.NullableSchema) -> JsonS...
    method tagged_union_schema (line 86) | def tagged_union_schema(self, schema: core_schema.TaggedUnionSchema) -...
  function is_type_schema (line 93) | def is_type_schema(schema: core_schema.WithDefaultSchema) -> bool:
  function json2ts (line 110) | def json2ts(input_file: Path, output_file: Path):  # pragma: no cover

FILE: src/python-fastui/fastui/json_schema.py
  function model_json_schema_to_fields (line 27) | def model_json_schema_to_fields(model: type[BaseModel]) -> list[FormField]:
  class JsonSchemaBase (line 41) | class JsonSchemaBase(_t.TypedDict, total=False):
  class JsonSchemaString (line 46) | class JsonSchemaString(JsonSchemaBase):
  class JsonSchemaStringEnum (line 52) | class JsonSchemaStringEnum(JsonSchemaBase, total=False):
  class JsonSchemaStringSearch (line 60) | class JsonSchemaStringSearch(JsonSchemaBase, total=False):
  class JsonSchemaFile (line 67) | class JsonSchemaFile(JsonSchemaBase, total=False):
  class JsonSchemaTextarea (line 73) | class JsonSchemaTextarea(JsonSchemaBase, total=False):
  class JsonSchemaBool (line 82) | class JsonSchemaBool(JsonSchemaBase, total=False):
  class JsonSchemaInt (line 88) | class JsonSchemaInt(JsonSchemaBase, total=False):
  class JsonSchemaNumber (line 98) | class JsonSchemaNumber(JsonSchemaBase, total=False):
  class JsonSchemaArray (line 108) | class JsonSchemaArray(JsonSchemaBase, total=False):
  class JsonSchemaNull (line 134) | class JsonSchemaNull(JsonSchemaBase):
  class JsonSchemaAnyOf (line 138) | class JsonSchemaAnyOf(JsonSchemaBase):
  class JsonSchemaAllOf (line 142) | class JsonSchemaAllOf(JsonSchemaBase):
  function json_schema_obj_to_fields (line 151) | def json_schema_obj_to_fields(
  function json_schema_any_to_fields (line 160) | def json_schema_any_to_fields(
  function json_schema_field_to_field (line 177) | def json_schema_field_to_field(
  function loc_to_title (line 209) | def loc_to_title(loc: SchemeLocation) -> str:
  function json_schema_array_to_fields (line 213) | def json_schema_array_to_fields(
  function special_string_field (line 248) | def special_string_field(
  function loc_to_name (line 304) | def loc_to_name(loc: SchemeLocation) -> str:
  function deference_json_schema (line 319) | def deference_json_schema(
  function as_title (line 358) | def as_title(s: _t.Any) -> str:
  function input_html_type (line 376) | def input_html_type(schema: JsonSchemaField) -> InputHtmlType:
  function schema_is_field (line 391) | def schema_is_field(schema: JsonSchemaConcrete) -> _ta.TypeGuard[JsonSch...
  function schema_is_array (line 398) | def schema_is_array(schema: JsonSchemaConcrete) -> _ta.TypeGuard[JsonSch...
  function schema_is_object (line 405) | def schema_is_object(schema: JsonSchemaConcrete) -> _ta.TypeGuard[JsonSc...

FILE: src/python-fastui/fastui/types.py
  class JsonDataSchema (line 12) | class JsonDataSchema:
    method __get_pydantic_json_schema__ (line 14) | def __get_pydantic_json_schema__(
  class PydanticModelSchema (line 47) | class PydanticModelSchema:
    method __get_pydantic_json_schema__ (line 49) | def __get_pydantic_json_schema__(

FILE: src/python-fastui/tests/test_auth_github.py
  function github_requests (line 12) | def github_requests() -> list[str]:
  function fake_github_app (line 17) | def fake_github_app(github_requests: list[str]) -> FastAPI:
  function httpx_client (line 70) | async def httpx_client(fake_github_app: FastAPI):
  function github_auth_provider (line 77) | async def github_auth_provider(httpx_client: AsyncClient):
  function test_get_auth_url (line 87) | async def test_get_auth_url(github_auth_provider: GitHubAuthProvider):
  function test_get_auth_url_scopes (line 93) | async def test_get_auth_url_scopes(httpx_client: AsyncClient):
  function test_exchange_ok (line 107) | async def test_exchange_ok(github_auth_provider: GitHubAuthProvider, git...
  function test_exchange_ok_user (line 116) | async def test_exchange_ok_user(github_auth_provider: GitHubAuthProvider):
  function test_exchange_bad_expected (line 123) | async def test_exchange_bad_expected(github_auth_provider: GitHubAuthPro...
  function test_exchange_bad_unexpected (line 128) | async def test_exchange_bad_unexpected(github_auth_provider: GitHubAuthP...
  function github_auth_provider_state (line 134) | async def github_auth_provider_state(fake_github_app: FastAPI, httpx_cli...
  function test_exchange_no_state (line 143) | async def test_exchange_no_state(github_auth_provider_state: GitHubAuthP...
  function test_exchange_bad_state (line 148) | async def test_exchange_bad_state(github_auth_provider_state: GitHubAuth...
  function test_exchange_good_state (line 153) | async def test_exchange_good_state(github_auth_provider_state: GitHubAut...
  function test_exchange_bad_state_file_exists (line 162) | async def test_exchange_bad_state_file_exists(github_auth_provider_state...
  function test_exchange_ok_repeat (line 170) | async def test_exchange_ok_repeat(github_auth_provider: GitHubAuthProvid...
  function test_exchange_ok_repeat_cached (line 184) | async def test_exchange_ok_repeat_cached(
  function test_exchange_cached_purge (line 205) | async def test_exchange_cached_purge(fake_github_app: FastAPI, httpx_cli...
  function test_exchange_redirect_url (line 224) | async def test_exchange_redirect_url(fake_github_app: FastAPI, httpx_cli...
  function test_get_github_user (line 240) | async def test_get_github_user(github_auth_provider: GitHubAuthProvider,...
  function test_get_github_user_emails (line 252) | async def test_get_github_user_emails(github_auth_provider: GitHubAuthPr...
  function test_create (line 264) | async def test_create():

FILE: src/python-fastui/tests/test_auth_shared.py
  function app_fixture (line 8) | def app_fixture() -> FastAPI:
  function client (line 24) | def client(app: FastAPI):
  function test_auth_redirect (line 29) | def test_auth_redirect(client: TestClient):
  function test_auth_error (line 36) | def test_auth_error(client: TestClient):

FILE: src/python-fastui/tests/test_components.py
  function test_div_text (line 11) | def test_div_text():
  function test_div_class_name (line 25) | def test_div_class_name():
  function test_root_model (line 35) | def test_root_model():
  function test_root_model_single (line 45) | def test_root_model_single():
  function test_iframe (line 56) | def test_iframe():

FILE: src/python-fastui/tests/test_dev.py
  function mock_signal (line 7) | def mock_signal(_sig, on_signal):
  function test_dev_connect (line 11) | async def test_dev_connect():

FILE: src/python-fastui/tests/test_forms.py
  class SimpleForm (line 14) | class SimpleForm(BaseModel):
  class FakeRequest (line 19) | class FakeRequest:
    method __init__ (line 24) | def __init__(self, form_data_list: list[tuple[str, str | UploadFile]]):
    method form (line 28) | async def form(self):
  function test_simple_form_fields (line 32) | def test_simple_form_fields():
  function test_inline_form_fields (line 61) | def test_inline_form_fields():
  function test_simple_form_submit (line 92) | async def test_simple_form_submit():
  function test_simple_form_submit_repeat (line 102) | async def test_simple_form_submit_repeat():
  class FormWithNested (line 116) | class FormWithNested(BaseModel):
    class NestedForm (line 119) | class NestedForm(BaseModel):
  function test_w_nested_form_fields (line 125) | def test_w_nested_form_fields():
  function test_w_nested_form_submit (line 154) | async def test_w_nested_form_submit():
  class FormWithFile (line 164) | class FormWithFile(BaseModel):
  function test_file (line 168) | def test_file():
  function test_file_submit (line 189) | async def test_file_submit():
  function test_file_submit_repeat (line 197) | async def test_file_submit_repeat():
  class FormWithFileConstraint (line 211) | class FormWithFileConstraint(BaseModel):
  function test_file_constrained (line 215) | def test_file_constrained():
  function test_file_constrained_submit (line 237) | async def test_file_constrained_submit():
  function test_file_constrained_submit_filename (line 246) | async def test_file_constrained_submit_filename():
  function test_file_constrained_submit_too_big (line 254) | async def test_file_constrained_submit_too_big():
  function test_file_constrained_submit_wrong_type (line 274) | async def test_file_constrained_submit_wrong_type():
  class FormMultipleFiles (line 297) | class FormMultipleFiles(BaseModel):
  function test_multiple_files (line 301) | def test_multiple_files():
  function test_multiple_files_single (line 322) | async def test_multiple_files_single():
  function test_multiple_files_multiple (line 330) | async def test_multiple_files_multiple():
  class FixedTuple (line 339) | class FixedTuple(BaseModel):
  function test_fixed_tuple (line 343) | def test_fixed_tuple():
  function test_fixed_tuple_submit (line 379) | async def test_fixed_tuple_submit():
  class NestedTuple (line 386) | class NestedTuple(BaseModel):
  function test_fixed_tuple_nested (line 390) | def test_fixed_tuple_nested():
  function test_fixed_tuple_nested_submit (line 426) | async def test_fixed_tuple_nested_submit():
  function test_variable_tuple (line 433) | def test_variable_tuple():
  function test_tuple_optional (line 442) | def test_tuple_optional():
  class FormTextarea (line 451) | class FormTextarea(BaseModel):
  function test_form_textarea_form_fields (line 455) | def test_form_textarea_form_fields():
  class SelectEnum (line 474) | class SelectEnum(str, enum.Enum):
  class FormSelectMultiple (line 479) | class FormSelectMultiple(BaseModel):
  function test_form_description_leakage (line 485) | def test_form_description_leakage():
  class RichForm (line 525) | class RichForm(BaseModel):
  function test_form_fields (line 529) | def test_form_fields():

FILE: src/python-fastui/tests/test_json_schema.py
  function test_json_schema (line 8) | async def test_json_schema():
  function test_openapi (line 19) | async def test_openapi():

FILE: src/python-fastui/tests/test_prebuilt_html.py
  function test_prebuilt_html (line 4) | def test_prebuilt_html():
  function test_prebuilt_html_meta_tags (line 14) | def test_prebuilt_html_meta_tags():

FILE: src/python-fastui/tests/test_tables_display.py
  class User (line 7) | class User(BaseModel):
    method representation (line 13) | def representation(self) -> str:
  function test_table_no_columns (line 20) | def test_table_no_columns():
  function test_table_columns (line 38) | def test_table_columns():
  function test_table_empty_no_data_model (line 63) | def test_table_empty_no_data_model():
  function test_table_empty_data_model (line 68) | def test_table_empty_data_model():
  function test_display_no_fields (line 83) | def test_display_no_fields():
  function test_display_fields (line 98) | def test_display_fields():
  function test_details_with_display_lookup_and_display (line 111) | def test_details_with_display_lookup_and_display():
  function test_table_respect_computed_field_title (line 133) | def test_table_respect_computed_field_title():
  function test_details_respect_computed_field_title (line 152) | def test_details_respect_computed_field_title():
Condensed preview — 146 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (995K chars).
[
  {
    "path": ".eslintrc.cjs",
    "chars": 1136,
    "preview": "module.exports = {\n  root: true,\n  env: { browser: true, es2020: true },\n  extends: [\n    'standard',\n    'eslint:recomm"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 580,
    "preview": "# Keep GitHub Actions up to date with GitHub's Dependabot...\n# https://docs.github.com/en/code-security/dependabot/worki"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 4447,
    "preview": "name: CI\n\non:\n  push:\n    branches:\n      - main\n    tags:\n      - '**'\n  pull_request:\n    types: [opened, synchronize]"
  },
  {
    "path": ".gitignore",
    "chars": 373,
    "preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n/**/*.egg-info\n\nnode_m"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 1331,
    "preview": "repos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v5.0.0\n    hooks:\n      - id: no-commit-to-bran"
  },
  {
    "path": ".prettierignore",
    "chars": 9,
    "preview": "htmlcov/\n"
  },
  {
    "path": "LICENSE",
    "chars": 1100,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2023 to present Pydantic Services inc.\n\nPermission is hereby granted, free of charg"
  },
  {
    "path": "Makefile",
    "chars": 1647,
    "preview": ".DEFAULT_GOAL:=all\npath = src/python-fastui\n\n.PHONY: install\ninstall:\n\tpip install -U pip pre-commit pip-tools\n\tpip inst"
  },
  {
    "path": "README.md",
    "chars": 8970,
    "preview": "# NOTE: this project is inactive, see [#368](https://github.com/pydantic/FastUI/issues/368)\n\n# FastUI\n\nFind the document"
  },
  {
    "path": "build-docs.sh",
    "chars": 585,
    "preview": "#!/usr/bin/env bash\n\nset -e\nset -x\n\npython3 -V\n\npython3 -m pip install --extra-index-url https://pydantic:${PPPR_TOKEN}@"
  },
  {
    "path": "bump_npm.py",
    "chars": 2262,
    "preview": "#!/usr/bin/env python\nfrom __future__ import annotations\n\nimport json\nimport re\nfrom pathlib import Path\n\n\ndef replace_p"
  },
  {
    "path": "demo/README.md",
    "chars": 669,
    "preview": "# FastUI Demo\n\nThis a simple demo app for FastUI, it's deployed at [fastui-demo.onrender.com](https://fastui-demo.onrend"
  },
  {
    "path": "demo/__init__.py",
    "chars": 1757,
    "preview": "from __future__ import annotations as _annotations\n\nimport sys\nfrom contextlib import asynccontextmanager\n\nfrom fastapi "
  },
  {
    "path": "demo/auth.py",
    "chars": 6658,
    "preview": "from __future__ import annotations as _annotations\n\nimport asyncio\nimport json\nimport os\nfrom dataclasses import asdict\n"
  },
  {
    "path": "demo/auth_user.py",
    "chars": 1682,
    "preview": "import json\nfrom dataclasses import asdict, dataclass\nfrom datetime import datetime, timedelta\nfrom typing import Annota"
  },
  {
    "path": "demo/cities.json",
    "chars": 536658,
    "preview": "[\n  {\n    \"city\": \"Kandahār\",\n    \"city_ascii\": \"Kandahar\",\n    \"lat\": 31.62,\n    \"lng\": 65.7158,\n    \"country\": \"Afghan"
  },
  {
    "path": "demo/components_list.py",
    "chars": 12774,
    "preview": "from __future__ import annotations as _annotations\n\nimport asyncio\n\nfrom fastapi import APIRouter\nfrom fastui import Any"
  },
  {
    "path": "demo/forms.py",
    "chars": 7078,
    "preview": "from __future__ import annotations as _annotations\n\nimport enum\nfrom collections import defaultdict\nfrom datetime import"
  },
  {
    "path": "demo/main.py",
    "chars": 2263,
    "preview": "from __future__ import annotations as _annotations\n\nfrom fastapi import APIRouter\nfrom fastui import AnyComponent, FastU"
  },
  {
    "path": "demo/shared.py",
    "chars": 1992,
    "preview": "from __future__ import annotations as _annotations\n\nfrom fastui import AnyComponent\nfrom fastui import components as c\nf"
  },
  {
    "path": "demo/sse.py",
    "chars": 9455,
    "preview": "import asyncio\nfrom collections.abc import AsyncIterable\nfrom itertools import chain\n\nfrom fastapi import APIRouter\nfrom"
  },
  {
    "path": "demo/tables.py",
    "chars": 5340,
    "preview": "from datetime import date\nfrom functools import cache\nfrom pathlib import Path\n\nimport pydantic\nfrom fastapi import APIR"
  },
  {
    "path": "demo/tests.py",
    "chars": 2547,
    "preview": "import re\n\nimport pytest\nfrom dirty_equals import IsList, IsStr\nfrom fastapi.testclient import TestClient\n\nfrom . import"
  },
  {
    "path": "docs/api/python_components.md",
    "chars": 912,
    "preview": "# Python Components\n\n::: fastui.components\n    handler: python\n    options:\n        inherited_members: true\n        docs"
  },
  {
    "path": "docs/api/typescript_components.md",
    "chars": 281,
    "preview": "# TypeScript Components\n\n!!! warning \"🚧 Work in Progress\"\n    This page is a work in progress.\n\n<!-- Note -- we will ena"
  },
  {
    "path": "docs/extra/tweaks.css",
    "chars": 162,
    "preview": "/* Revert hue value to that of pre mkdocs-material v9.4.0 */\n[data-md-color-scheme='slate'] {\n  --md-hue: 230;\n  --md-de"
  },
  {
    "path": "docs/guide.md",
    "chars": 70,
    "preview": "!!! warning \"🚧 Work in Progress\"\n    This page is a work in progress.\n"
  },
  {
    "path": "docs/index.md",
    "chars": 7968,
    "preview": "# FastUI\n\n## The Principle\n\nFastUI is a new way to build web application user interfaces defined by declarative Python c"
  },
  {
    "path": "docs/plugins.py",
    "chars": 2390,
    "preview": "import os\nimport re\n\nfrom typing import Match\n\nfrom mkdocs.config import Config\nfrom mkdocs.structure.files import Files"
  },
  {
    "path": "mkdocs.yml",
    "chars": 2345,
    "preview": "site_name: FastUI\nsite_description: Build web application user interfaces defined by declarative Python code.\nsite_url: "
  },
  {
    "path": "package.json",
    "chars": 1408,
    "preview": "{\n  \"name\": \"FastUI\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"workspaces\": [\n    \"src/*\"\n  ],\n  \"scripts\": {\n    \"dev\""
  },
  {
    "path": "pyproject.toml",
    "chars": 931,
    "preview": "# this is not the used for the python package \"fastui\",\n# for that see packages/python-fastui/pyproject.toml\n\n[tool.ruff"
  },
  {
    "path": "requirements/docs.in",
    "chars": 108,
    "preview": "mkdocs\nmkdocs-material\nmkdocs-simple-hooks\nmkdocstrings[python]\nmkdocs-redirects\nmkdocs-material-extensions\n"
  },
  {
    "path": "requirements/docs.txt",
    "chars": 2196,
    "preview": "#\n# This file is autogenerated by pip-compile with Python 3.11\n# by the following command:\n#\n#    pip-compile --output-f"
  },
  {
    "path": "src/npm-fastui/LICENSE",
    "chars": 1100,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2023 to present Pydantic Services inc.\n\nPermission is hereby granted, free of charg"
  },
  {
    "path": "src/npm-fastui/README.md",
    "chars": 75,
    "preview": "# FastUI\n\nReact frontend for [FastUI](https://github.com/pydantic/FastUI).\n"
  },
  {
    "path": "src/npm-fastui/package.json",
    "chars": 841,
    "preview": "{\n  \"name\": \"@pydantic/fastui\",\n  \"version\": \"0.0.26\",\n  \"description\": \"Build better UIs faster.\",\n  \"main\": \"dist/inde"
  },
  {
    "path": "src/npm-fastui/src/Defaults.tsx",
    "chars": 299,
    "preview": "import { FC, ReactNode } from 'react'\n\nexport const DefaultNotFound: FC<{ url: string }> = ({ url }) => <div>Page not fo"
  },
  {
    "path": "src/npm-fastui/src/components/Code.tsx",
    "chars": 87,
    "preview": "import { lazy } from 'react'\n\nexport const CodeComp = lazy(() => import('./CodeLazy'))\n"
  },
  {
    "path": "src/npm-fastui/src/components/CodeLazy.tsx",
    "chars": 620,
    "preview": "import * as codeStyles from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport { Prism as SyntaxHighlighter } from "
  },
  {
    "path": "src/npm-fastui/src/components/Custom.tsx",
    "chars": 659,
    "preview": "import { FC } from 'react'\n\nimport type { Custom } from '../models'\n\nimport { DisplayError } from '../hooks/error'\n\nimpo"
  },
  {
    "path": "src/npm-fastui/src/components/FireEvent.tsx",
    "chars": 510,
    "preview": "import { FC, useEffect } from 'react'\n\nimport type { FireEvent } from '../models'\n\nimport { useFireEvent } from '../even"
  },
  {
    "path": "src/npm-fastui/src/components/FormField.tsx",
    "chars": 9918,
    "preview": "import { FC, useState } from 'react'\nimport AsyncSelect from 'react-select/async'\nimport Select, { StylesConfig } from '"
  },
  {
    "path": "src/npm-fastui/src/components/Iframe.tsx",
    "chars": 293,
    "preview": "import { FC } from 'react'\n\nimport type { Iframe } from '../models'\n\nexport const IframeComp: FC<Iframe> = (props) => {\n"
  },
  {
    "path": "src/npm-fastui/src/components/Json.tsx",
    "chars": 538,
    "preview": "import { FC } from 'react'\n\nimport type { Json } from '../models'\n\nimport { CodeComp } from './Code'\n\nexport const JsonC"
  },
  {
    "path": "src/npm-fastui/src/components/LinkList.tsx",
    "chars": 489,
    "preview": "import type { LinkList } from '../models'\n\nimport { useClassName } from '../hooks/className'\n\nimport { LinkComp } from '"
  },
  {
    "path": "src/npm-fastui/src/components/Markdown.tsx",
    "chars": 95,
    "preview": "import { lazy } from 'react'\n\nexport const MarkdownComp = lazy(() => import('./MarkdownLazy'))\n"
  },
  {
    "path": "src/npm-fastui/src/components/MarkdownLazy.tsx",
    "chars": 2775,
    "preview": "import { FC, MouseEventHandler, ReactNode } from 'react'\nimport ReactMarkdown, { Components } from 'react-markdown'\nimpo"
  },
  {
    "path": "src/npm-fastui/src/components/PageTitle.tsx",
    "chars": 243,
    "preview": "import { FC, useEffect } from 'react'\n\nimport type { PageTitle } from '../models'\n\nexport const PageTitleComp: FC<PageTi"
  },
  {
    "path": "src/npm-fastui/src/components/ServerLoad.tsx",
    "chars": 5278,
    "preview": "import { FC, useCallback, useContext, useEffect, useState } from 'react'\n\nimport type { ServerLoad, PageEvent, FastProps"
  },
  {
    "path": "src/npm-fastui/src/components/button.tsx",
    "chars": 437,
    "preview": "import { FC } from 'react'\n\nimport type { Button } from '../models'\n\nimport { useClassName } from '../hooks/className'\ni"
  },
  {
    "path": "src/npm-fastui/src/components/details.tsx",
    "chars": 1497,
    "preview": "import { FC } from 'react'\n\nimport type { Details, Display, DisplayMode } from '../models'\n\nimport { asTitle } from '../"
  },
  {
    "path": "src/npm-fastui/src/components/display.tsx",
    "chars": 6860,
    "preview": "import { FC } from 'react'\n\nimport type { AnyEvent, DisplayMode, Display, JsonData, FastProps } from '../models'\n\nimport"
  },
  {
    "path": "src/npm-fastui/src/components/div.tsx",
    "chars": 308,
    "preview": "import { FC } from 'react'\n\nimport { Div, Page } from '../models'\nimport { useClassName } from '../hooks/className'\n\nimp"
  },
  {
    "path": "src/npm-fastui/src/components/error.tsx",
    "chars": 523,
    "preview": "import { FC } from 'react'\n\nimport type { Error } from '../models'\n\nimport { useClassName } from '../hooks/className'\n\ne"
  },
  {
    "path": "src/npm-fastui/src/components/footer.tsx",
    "chars": 587,
    "preview": "import type { Footer } from '../models'\n\nimport { useClassName } from '../hooks/className'\n\nimport { LinkComp } from './"
  },
  {
    "path": "src/npm-fastui/src/components/form.tsx",
    "chars": 5151,
    "preview": "import { FC, FormEvent, useContext, useState, useRef, useCallback, useEffect } from 'react'\n\nimport type { Form, ModelFo"
  },
  {
    "path": "src/npm-fastui/src/components/heading.tsx",
    "chars": 980,
    "preview": "import { FC } from 'react'\n\nimport type { Heading } from '../models'\n\nimport { useClassName } from '../hooks/className'\n"
  },
  {
    "path": "src/npm-fastui/src/components/image.tsx",
    "chars": 576,
    "preview": "import { FC } from 'react'\n\nimport type { Image } from '../models'\n\nimport { useClassName } from '../hooks/className'\nim"
  },
  {
    "path": "src/npm-fastui/src/components/index.tsx",
    "chars": 5287,
    "preview": "import { FC } from 'react'\n\nimport type { FastProps, Display, Text, ServerLoad, PageTitle, FireEvent } from '../models'\n"
  },
  {
    "path": "src/npm-fastui/src/components/link.tsx",
    "chars": 1404,
    "preview": "import { FC, MouseEventHandler, ReactNode, useContext } from 'react'\n\nimport type { Link, AnyEvent } from '../models'\n\ni"
  },
  {
    "path": "src/npm-fastui/src/components/modal.tsx",
    "chars": 562,
    "preview": "import { FC, useEffect } from 'react'\n\nimport type { Modal } from '../models'\n\nimport { usePageEventListen } from '../ev"
  },
  {
    "path": "src/npm-fastui/src/components/navbar.tsx",
    "chars": 1154,
    "preview": "import type { Navbar } from '../models'\n\nimport { useClassName } from '../hooks/className'\n\nimport { LinkComp, LinkRende"
  },
  {
    "path": "src/npm-fastui/src/components/pagination.tsx",
    "chars": 863,
    "preview": "import { FC } from 'react'\n\nimport type { Pagination, Link } from '../models'\n\nimport { useClassName } from '../hooks/cl"
  },
  {
    "path": "src/npm-fastui/src/components/paragraph.tsx",
    "chars": 263,
    "preview": "import { FC } from 'react'\n\nimport type { Paragraph } from '../models'\n\nimport { useClassName } from '../hooks/className"
  },
  {
    "path": "src/npm-fastui/src/components/spinner.tsx",
    "chars": 487,
    "preview": "import { FC } from 'react'\n\nimport type { Spinner } from '../models'\n\nimport { useClassName } from '../hooks/className'\n"
  },
  {
    "path": "src/npm-fastui/src/components/table.tsx",
    "chars": 1556,
    "preview": "import { FC, CSSProperties } from 'react'\n\nimport type { Table } from '../models'\n\nimport { asTitle } from '../tools'\nim"
  },
  {
    "path": "src/npm-fastui/src/components/text.tsx",
    "chars": 127,
    "preview": "import { FC } from 'react'\n\nimport type { Text } from '../models'\n\nexport const TextComp: FC<Text> = ({ text }) => <>{te"
  },
  {
    "path": "src/npm-fastui/src/components/toast.tsx",
    "chars": 562,
    "preview": "import { FC, useEffect } from 'react'\n\nimport type { Toast } from '../models'\n\nimport { usePageEventListen } from '../ev"
  },
  {
    "path": "src/npm-fastui/src/components/video.tsx",
    "chars": 482,
    "preview": "import { FC } from 'react'\n\nimport type { Video } from '../models'\n\nexport const VideoComp: FC<Video> = (props) => {\n  c"
  },
  {
    "path": "src/npm-fastui/src/controller.tsx",
    "chars": 841,
    "preview": "import { useContext, useEffect, useState } from 'react'\n\nimport { LocationContext } from './hooks/locationContext'\nimpor"
  },
  {
    "path": "src/npm-fastui/src/dev.tsx",
    "chars": 2532,
    "preview": "import { FC, useContext, useEffect } from 'react'\n\nimport { sleep } from './tools'\nimport { ErrorContext } from './hooks"
  },
  {
    "path": "src/npm-fastui/src/events.ts",
    "chars": 3381,
    "preview": "import { useContext, useState, useEffect, useCallback } from 'react'\n\nimport type { PageEvent, AnyEvent } from './models"
  },
  {
    "path": "src/npm-fastui/src/hooks/className.ts",
    "chars": 3680,
    "preview": "import { createContext, useContext } from 'react'\n\nimport type { FastClassNameProps } from '../components'\nimport type {"
  },
  {
    "path": "src/npm-fastui/src/hooks/config.ts",
    "chars": 478,
    "preview": "import { createContext, FC, useContext } from 'react'\n\nimport type { FastUIProps } from '../index'\nimport type { FastPro"
  },
  {
    "path": "src/npm-fastui/src/hooks/error.tsx",
    "chars": 1748,
    "preview": "import { createContext, FC, ReactNode, useCallback, useContext, useState } from 'react'\n\nimport type { Error as ErrorPro"
  },
  {
    "path": "src/npm-fastui/src/hooks/eventContext.tsx",
    "chars": 1006,
    "preview": "import { createContext, FC, ReactNode, useCallback, useContext } from 'react'\n\nexport type ContextType = Record<string, "
  },
  {
    "path": "src/npm-fastui/src/hooks/locationContext.tsx",
    "chars": 4717,
    "preview": "import { createContext, ReactNode, useEffect, useState, useCallback, useContext } from 'react'\n\nimport { fireLoadEvent }"
  },
  {
    "path": "src/npm-fastui/src/index.tsx",
    "chars": 1777,
    "preview": "import { FC, ReactNode } from 'react'\n\nimport type { FastProps } from './models'\n\nimport { LocationProvider } from './ho"
  },
  {
    "path": "src/npm-fastui/src/models.d.ts",
    "chars": 15024,
    "preview": "/**\n * This file was automatically generated by json-schema-to-typescript.\n * DO NOT MODIFY IT BY HAND. Instead, modify "
  },
  {
    "path": "src/npm-fastui/src/tools.ts",
    "chars": 6959,
    "preview": "import { useCallback, useContext, useEffect } from 'react'\nimport { fetchEventSource, EventStreamContentType } from '@mi"
  },
  {
    "path": "src/npm-fastui/tsconfig.json",
    "chars": 110,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"dist\"\n  },\n  \"include\": [\"src\"]\n}\n"
  },
  {
    "path": "src/npm-fastui/typedoc.json",
    "chars": 373,
    "preview": "// TODO: we really want the entryPoint to be src, but mkdocstrings-typescript doesn't fully support this option yet,\n// "
  },
  {
    "path": "src/npm-fastui-bootstrap/LICENSE",
    "chars": 1100,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2023 to present Pydantic Services inc.\n\nPermission is hereby granted, free of charg"
  },
  {
    "path": "src/npm-fastui-bootstrap/README.md",
    "chars": 91,
    "preview": "# FastUI Bootstrap\n\nBootstrap components for [FastUI](https://github.com/pydantic/FastUI).\n"
  },
  {
    "path": "src/npm-fastui-bootstrap/package.json",
    "chars": 760,
    "preview": "{\n  \"name\": \"@pydantic/fastui-bootstrap\",\n  \"version\": \"0.0.26\",\n  \"description\": \"Bootstrap renderer for FastUI\",\n  \"ma"
  },
  {
    "path": "src/npm-fastui-bootstrap/src/footer.tsx",
    "chars": 682,
    "preview": "import { FC } from 'react'\nimport { components, models, useClassName } from 'fastui'\n\nexport const Footer: FC<models.Foo"
  },
  {
    "path": "src/npm-fastui-bootstrap/src/index.tsx",
    "chars": 4786,
    "preview": "import { pathMatch } from 'fastui'\n\nimport type { ClassNameGenerator, CustomRender, models } from 'fastui'\n\nimport { Mod"
  },
  {
    "path": "src/npm-fastui-bootstrap/src/modal.tsx",
    "chars": 1046,
    "preview": "import { FC } from 'react'\nimport { models, components, events, renderClassName, EventContextProvider } from 'fastui'\nim"
  },
  {
    "path": "src/npm-fastui-bootstrap/src/navbar.tsx",
    "chars": 1679,
    "preview": "import { FC } from 'react'\nimport { components, useClassName, models } from 'fastui'\nimport BootstrapNavbar from 'react-"
  },
  {
    "path": "src/npm-fastui-bootstrap/src/pagination.tsx",
    "chars": 2417,
    "preview": "import { FC } from 'react'\nimport { components, models, renderClassName } from 'fastui'\n\ninterface Link {\n  Display: FC\n"
  },
  {
    "path": "src/npm-fastui-bootstrap/src/toast.tsx",
    "chars": 1061,
    "preview": "import { FC } from 'react'\nimport { components, events, renderClassName, EventContextProvider, models } from 'fastui'\nim"
  },
  {
    "path": "src/npm-fastui-bootstrap/tsconfig.json",
    "chars": 170,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"dist\",\n    \"paths\": {\n      \"fastui\": [\"../n"
  },
  {
    "path": "src/npm-fastui-bootstrap/typedoc.json",
    "chars": 105,
    "preview": "{\n  \"extends\": [\"../../typedoc.base.json\"],\n  \"entryPointStrategy\": \"expand\",\n  \"entryPoints\": [\"src\"]\n}\n"
  },
  {
    "path": "src/npm-fastui-prebuilt/LICENSE",
    "chars": 1100,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2023 to present Pydantic Services inc.\n\nPermission is hereby granted, free of charg"
  },
  {
    "path": "src/npm-fastui-prebuilt/README.md",
    "chars": 86,
    "preview": "# FastUI pre-build\n\nPre-built files for [FastUI](https://github.com/pydantic/FastUI).\n"
  },
  {
    "path": "src/npm-fastui-prebuilt/index.html",
    "chars": 287,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "src/npm-fastui-prebuilt/package.json",
    "chars": 644,
    "preview": "{\n  \"name\": \"@pydantic/fastui-prebuilt\",\n  \"version\": \"0.0.26\",\n  \"description\": \"Pre-built files for FastUI\",\n  \"main\":"
  },
  {
    "path": "src/npm-fastui-prebuilt/src/App.tsx",
    "chars": 1959,
    "preview": "import { CustomRender, FastUI, renderClassName } from 'fastui'\nimport * as bootstrap from 'fastui-bootstrap'\nimport { FC"
  },
  {
    "path": "src/npm-fastui-prebuilt/src/main.scss",
    "chars": 2092,
    "preview": "$primary: black;\n$secondary: white;\n$link-color: #0d6efd; // bootstrap primary\n\n@import 'bootstrap/scss/bootstrap';\n\nhtm"
  },
  {
    "path": "src/npm-fastui-prebuilt/src/main.tsx",
    "chars": 233,
    "preview": "import React from 'react'\nimport ReactDOM from 'react-dom/client'\n\nimport App from './App'\nimport './main.scss'\n\nReactDO"
  },
  {
    "path": "src/npm-fastui-prebuilt/src/vite-env.d.ts",
    "chars": 38,
    "preview": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "src/npm-fastui-prebuilt/tsconfig.json",
    "chars": 261,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"paths\": {\n      \"fastui\": [\"../npm-fastui/src\"],\n     "
  },
  {
    "path": "src/npm-fastui-prebuilt/tsconfig.node.json",
    "chars": 213,
    "preview": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"skipLibCheck\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\""
  },
  {
    "path": "src/npm-fastui-prebuilt/typedoc.json",
    "chars": 105,
    "preview": "{\n  \"extends\": [\"../../typedoc.base.json\"],\n  \"entryPointStrategy\": \"expand\",\n  \"entryPoints\": [\"src\"]\n}\n"
  },
  {
    "path": "src/npm-fastui-prebuilt/vite.config.ts",
    "chars": 1378,
    "preview": "import path from 'path'\n\nimport react from '@vitejs/plugin-react-swc'\nimport { defineConfig, HttpProxy } from 'vite'\n\nex"
  },
  {
    "path": "src/python-fastui/LICENSE",
    "chars": 1100,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2023 to present Pydantic Services inc.\n\nPermission is hereby granted, free of charg"
  },
  {
    "path": "src/python-fastui/README.md",
    "chars": 476,
    "preview": "# FastUI\n\n[![CI](https://github.com/pydantic/FastUI/actions/workflows/ci.yml/badge.svg)](https://github.com/pydantic/Fas"
  },
  {
    "path": "src/python-fastui/fastui/__init__.py",
    "chars": 2328,
    "preview": "import typing as _t\n\nimport pydantic\n\nfrom .components import AnyComponent\n\n__version__ = '0.9.0'\n__all__ = 'AnyComponen"
  },
  {
    "path": "src/python-fastui/fastui/__main__.py",
    "chars": 1006,
    "preview": "import argparse\nfrom pathlib import Path\n\nfrom . import __version__, generate_typescript\n\n\ndef cli():\n    parser = argpa"
  },
  {
    "path": "src/python-fastui/fastui/auth/__init__.py",
    "chars": 333,
    "preview": "from .github import GitHubAuthProvider, GitHubEmail, GitHubExchange, GithubUser\nfrom .shared import AuthError, AuthRedir"
  },
  {
    "path": "src/python-fastui/fastui/auth/github.py",
    "chars": 9922,
    "preview": "from collections.abc import AsyncIterator\nfrom contextlib import asynccontextmanager\nfrom dataclasses import dataclass\nf"
  },
  {
    "path": "src/python-fastui/fastui/auth/shared.py",
    "chars": 1841,
    "preview": "import json\nfrom abc import ABC, abstractmethod\nfrom typing import TYPE_CHECKING\n\nfrom .. import AnyComponent, FastUI, e"
  },
  {
    "path": "src/python-fastui/fastui/base.py",
    "chars": 263,
    "preview": "from pydantic import AliasGenerator, ConfigDict\nfrom pydantic import BaseModel as _BaseModel\nfrom pydantic.alias_generat"
  },
  {
    "path": "src/python-fastui/fastui/class_name.py",
    "chars": 522,
    "preview": "# could be renamed to something general if there's more to add\nfrom typing import Annotated, Literal\n\nfrom pydantic impo"
  },
  {
    "path": "src/python-fastui/fastui/components/__init__.py",
    "chars": 19402,
    "preview": "\"\"\"\nComponent definitions.\n\nAll CamelCase names in the namespace should be components.\n\"\"\"\nimport typing as _t\n\nimport p"
  },
  {
    "path": "src/python-fastui/fastui/components/display.py",
    "chars": 3344,
    "preview": "import enum\nimport typing as _t\nfrom abc import ABC\n\nimport annotated_types as _at\nimport pydantic\nimport typing_extensi"
  },
  {
    "path": "src/python-fastui/fastui/components/forms.py",
    "chars": 6819,
    "preview": "import typing as _t\nfrom abc import ABC\n\nimport pydantic\nimport typing_extensions as _te\n\nfrom .. import class_name as _"
  },
  {
    "path": "src/python-fastui/fastui/components/py.typed",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/python-fastui/fastui/components/tables.py",
    "chars": 3451,
    "preview": "import typing as _t\n\nimport pydantic\nimport typing_extensions as _te\nfrom pydantic_core import core_schema as _core_sche"
  },
  {
    "path": "src/python-fastui/fastui/dev.py",
    "chars": 1717,
    "preview": "import asyncio\nimport os\nimport signal\nimport typing as _t\nfrom contextlib import asynccontextmanager\n\ntry:\n    from fas"
  },
  {
    "path": "src/python-fastui/fastui/events.py",
    "chars": 1088,
    "preview": "from typing import Annotated, Literal\n\nfrom pydantic import Field\nfrom typing_extensions import TypeAliasType\n\nfrom .bas"
  },
  {
    "path": "src/python-fastui/fastui/forms.py",
    "chars": 8086,
    "preview": "import json\nimport typing as _t\nfrom itertools import groupby\nfrom mimetypes import MimeTypes\nfrom operator import itemg"
  },
  {
    "path": "src/python-fastui/fastui/generate_typescript.py",
    "chars": 5229,
    "preview": "from __future__ import annotations as _annotations\n\nimport re\nimport subprocess\nfrom pathlib import Path\nfrom typing imp"
  },
  {
    "path": "src/python-fastui/fastui/json_schema.py",
    "chars": 13348,
    "preview": "import json\nimport re\nimport typing as _t\n\nimport typing_extensions as _ta\nfrom pydantic import BaseModel\n\nfrom .compone"
  },
  {
    "path": "src/python-fastui/fastui/py.typed",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/python-fastui/fastui/types.py",
    "chars": 3576,
    "preview": "import typing as _t\n\nimport pydantic\nimport typing_extensions as _te\nfrom pydantic.json_schema import CoreRef, GenerateJ"
  },
  {
    "path": "src/python-fastui/pyproject.toml",
    "chars": 1204,
    "preview": "[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.version]\npath = \"fastui/__init__."
  },
  {
    "path": "src/python-fastui/requirements/all.txt",
    "chars": 71,
    "preview": "-r ./lint.txt\n-r ./test.txt\n-r ./pyproject.txt\nuvicorn[standard]\nhttpx\n"
  },
  {
    "path": "src/python-fastui/requirements/lint.in",
    "chars": 13,
    "preview": "ruff\npyright\n"
  },
  {
    "path": "src/python-fastui/requirements/lint.txt",
    "chars": 477,
    "preview": "#\n# This file is autogenerated by pip-compile with Python 3.11\n# by the following command:\n#\n#    pip-compile --output-f"
  },
  {
    "path": "src/python-fastui/requirements/pyproject.txt",
    "chars": 1060,
    "preview": "#\n# This file is autogenerated by pip-compile with Python 3.14\n# by the following command:\n#\n#    pip-compile --constrai"
  },
  {
    "path": "src/python-fastui/requirements/render.txt",
    "chars": 116,
    "preview": "# this is used by render to install dependencies\n-r ./pyproject.txt\nsrc/python-fastui\nuvicorn[standard]\nhttpx\nPyJWT\n"
  },
  {
    "path": "src/python-fastui/requirements/test.in",
    "chars": 70,
    "preview": "coverage\npytest\npytest-pretty\ndirty-equals\npytest-asyncio\nhttpx\nPyJWT\n"
  },
  {
    "path": "src/python-fastui/requirements/test.txt",
    "chars": 1591,
    "preview": "#\n# This file is autogenerated by pip-compile with Python 3.14\n# by the following command:\n#\n#    pip-compile --constrai"
  },
  {
    "path": "src/python-fastui/tests/test_auth_github.py",
    "chars": 10415,
    "preview": "from datetime import datetime\n\nimport pytest\nfrom fastapi import FastAPI\nfrom fastui.auth import AuthError, GitHubAuthPr"
  },
  {
    "path": "src/python-fastui/tests/test_auth_shared.py",
    "chars": 1031,
    "preview": "import pytest\nfrom fastapi import FastAPI\nfrom fastui.auth import AuthError, AuthRedirect, fastapi_auth_exception_handli"
  },
  {
    "path": "src/python-fastui/tests/test_components.py",
    "chars": 1667,
    "preview": "\"\"\"\nSimple tests of component creation.\n\nNOTE: we do NOT want to exhaustively construct every component just for the sam"
  },
  {
    "path": "src/python-fastui/tests/test_dev.py",
    "chars": 733,
    "preview": "from unittest.mock import patch\n\nfrom fastui.dev import dev_fastapi_app\nfrom httpx import ASGITransport, AsyncClient\n\n\nd"
  },
  {
    "path": "src/python-fastui/tests/test_forms.py",
    "chars": 16918,
    "preview": "import enum\nfrom contextlib import asynccontextmanager\nfrom io import BytesIO\nfrom typing import Annotated\n\nimport pytes"
  },
  {
    "path": "src/python-fastui/tests/test_json_schema.py",
    "chars": 1242,
    "preview": "from dirty_equals import IsPartialDict\nfrom fastapi import FastAPI\nfrom fastui import FastUI, components\nfrom fastui.gen"
  },
  {
    "path": "src/python-fastui/tests/test_prebuilt_html.py",
    "chars": 884,
    "preview": "from fastui import prebuilt_html\n\n\ndef test_prebuilt_html():\n    html = prebuilt_html()\n    assert html.startswith('<!do"
  },
  {
    "path": "src/python-fastui/tests/test_tables_display.py",
    "chars": 5305,
    "preview": "import pytest\nfrom fastui import components\nfrom fastui.components import display\nfrom pydantic import BaseModel, Field,"
  },
  {
    "path": "tsconfig.json",
    "chars": 591,
    "preview": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"useDefineForClassFields\": true,\n    \"lib\": [\"ES2020\", \"DOM\", \"DOM."
  },
  {
    "path": "typedoc.base.json",
    "chars": 77,
    "preview": "{\n  \"$schema\": \"https://typedoc.org/schema.json\",\n  \"includeVersion\": true\n}\n"
  },
  {
    "path": "typedoc.json",
    "chars": 107,
    "preview": "{\n  \"extends\": [\"./typedoc.base.json\"],\n  \"entryPointStrategy\": \"packages\",\n  \"entryPoints\": [\"./src/*\"]\n}\n"
  }
]

About this extraction

This page contains the full source code of the pydantic/FastUI GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 146 files (855.4 KB), approximately 295.1k tokens, and a symbol index with 460 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!