Coverage for fastapi/applications.py: 100%

169 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-09-29 03:37 +0000

1from enum import Enum 1abcdef

2from typing import ( 1abcdef

3 Any, 

4 Awaitable, 

5 Callable, 

6 Coroutine, 

7 Dict, 

8 List, 

9 Optional, 

10 Sequence, 

11 Type, 

12 TypeVar, 

13 Union, 

14) 

15 

16from fastapi import routing 1abcdef

17from fastapi.datastructures import Default, DefaultPlaceholder 1abcdef

18from fastapi.exception_handlers import ( 1abcdef

19 http_exception_handler, 

20 request_validation_exception_handler, 

21 websocket_request_validation_exception_handler, 

22) 

23from fastapi.exceptions import RequestValidationError, WebSocketRequestValidationError 1abcdef

24from fastapi.logger import logger 1abcdef

25from fastapi.middleware.asyncexitstack import AsyncExitStackMiddleware 1abcdef

26from fastapi.openapi.docs import ( 1abcdef

27 get_redoc_html, 

28 get_swagger_ui_html, 

29 get_swagger_ui_oauth2_redirect_html, 

30) 

31from fastapi.openapi.utils import get_openapi 1abcdef

32from fastapi.params import Depends 1abcdef

33from fastapi.types import DecoratedCallable, IncEx 1abcdef

34from fastapi.utils import generate_unique_id 1abcdef

35from starlette.applications import Starlette 1abcdef

36from starlette.datastructures import State 1abcdef

37from starlette.exceptions import HTTPException 1abcdef

38from starlette.middleware import Middleware 1abcdef

39from starlette.middleware.base import BaseHTTPMiddleware 1abcdef

40from starlette.middleware.errors import ServerErrorMiddleware 1abcdef

41from starlette.middleware.exceptions import ExceptionMiddleware 1abcdef

42from starlette.requests import Request 1abcdef

43from starlette.responses import HTMLResponse, JSONResponse, Response 1abcdef

44from starlette.routing import BaseRoute 1abcdef

45from starlette.types import ASGIApp, ExceptionHandler, Lifespan, Receive, Scope, Send 1abcdef

46from typing_extensions import Annotated, Doc, deprecated 1abcdef

47 

48AppType = TypeVar("AppType", bound="FastAPI") 1abcdef

49 

50 

51class FastAPI(Starlette): 1abcdef

52 """ 

53 `FastAPI` app class, the main entrypoint to use FastAPI. 

54 

55 Read more in the 

56 [FastAPI docs for First Steps](https://fastapi.tiangolo.com/tutorial/first-steps/). 

57 

58 ## Example 

59 

60 ```python 

61 from fastapi import FastAPI 

62 

63 app = FastAPI() 

64 ``` 

65 """ 

66 

67 def __init__( 1abcdef

68 self: AppType, 

69 *, 

70 debug: Annotated[ 

71 bool, 

72 Doc( 

73 """ 

74 Boolean indicating if debug tracebacks should be returned on server 

75 errors. 

76 

77 Read more in the 

78 [Starlette docs for Applications](https://www.starlette.io/applications/#instantiating-the-application). 

79 """ 

80 ), 

81 ] = False, 

82 routes: Annotated[ 

83 Optional[List[BaseRoute]], 

84 Doc( 

85 """ 

86 **Note**: you probably shouldn't use this parameter, it is inherited 

87 from Starlette and supported for compatibility. 

88 

89 --- 

90 

91 A list of routes to serve incoming HTTP and WebSocket requests. 

92 """ 

93 ), 

94 deprecated( 

95 """ 

96 You normally wouldn't use this parameter with FastAPI, it is inherited 

97 from Starlette and supported for compatibility. 

98 

99 In FastAPI, you normally would use the *path operation methods*, 

100 like `app.get()`, `app.post()`, etc. 

101 """ 

102 ), 

103 ] = None, 

104 title: Annotated[ 

105 str, 

106 Doc( 

107 """ 

108 The title of the API. 

109 

110 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

111 

112 Read more in the 

113 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). 

114 

115 **Example** 

116 

117 ```python 

118 from fastapi import FastAPI 

119 

120 app = FastAPI(title="ChimichangApp") 

121 ``` 

122 """ 

123 ), 

124 ] = "FastAPI", 

125 summary: Annotated[ 

126 Optional[str], 

127 Doc( 

128 """ 

129 A short summary of the API. 

130 

131 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

132 

133 Read more in the 

134 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). 

135 

136 **Example** 

137 

138 ```python 

139 from fastapi import FastAPI 

140 

141 app = FastAPI(summary="Deadpond's favorite app. Nuff said.") 

142 ``` 

143 """ 

144 ), 

145 ] = None, 

146 description: Annotated[ 

147 str, 

148 Doc( 

149 ''' 

150 A description of the API. Supports Markdown (using 

151 [CommonMark syntax](https://commonmark.org/)). 

152 

153 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

154 

155 Read more in the 

156 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). 

157 

158 **Example** 

159 

160 ```python 

161 from fastapi import FastAPI 

162 

163 app = FastAPI( 

164 description=""" 

165 ChimichangApp API helps you do awesome stuff. 🚀 

166 

167 ## Items 

168 

169 You can **read items**. 

170 

171 ## Users 

172 

173 You will be able to: 

174 

175 * **Create users** (_not implemented_). 

176 * **Read users** (_not implemented_). 

177 

178 """ 

179 ) 

180 ``` 

181 ''' 

182 ), 

183 ] = "", 

184 version: Annotated[ 

185 str, 

186 Doc( 

187 """ 

188 The version of the API. 

189 

190 **Note** This is the version of your application, not the version of 

191 the OpenAPI specification nor the version of FastAPI being used. 

192 

193 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

194 

195 Read more in the 

196 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). 

197 

198 **Example** 

199 

200 ```python 

201 from fastapi import FastAPI 

202 

203 app = FastAPI(version="0.0.1") 

204 ``` 

205 """ 

206 ), 

207 ] = "0.1.0", 

208 openapi_url: Annotated[ 

209 Optional[str], 

210 Doc( 

211 """ 

212 The URL where the OpenAPI schema will be served from. 

213 

214 If you set it to `None`, no OpenAPI schema will be served publicly, and 

215 the default automatic endpoints `/docs` and `/redoc` will also be 

216 disabled. 

217 

218 Read more in the 

219 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#openapi-url). 

220 

221 **Example** 

222 

223 ```python 

224 from fastapi import FastAPI 

225 

226 app = FastAPI(openapi_url="/api/v1/openapi.json") 

227 ``` 

228 """ 

229 ), 

230 ] = "/openapi.json", 

231 openapi_tags: Annotated[ 

232 Optional[List[Dict[str, Any]]], 

233 Doc( 

234 """ 

235 A list of tags used by OpenAPI, these are the same `tags` you can set 

236 in the *path operations*, like: 

237 

238 * `@app.get("/users/", tags=["users"])` 

239 * `@app.get("/items/", tags=["items"])` 

240 

241 The order of the tags can be used to specify the order shown in 

242 tools like Swagger UI, used in the automatic path `/docs`. 

243 

244 It's not required to specify all the tags used. 

245 

246 The tags that are not declared MAY be organized randomly or based 

247 on the tools' logic. Each tag name in the list MUST be unique. 

248 

249 The value of each item is a `dict` containing: 

250 

251 * `name`: The name of the tag. 

252 * `description`: A short description of the tag. 

253 [CommonMark syntax](https://commonmark.org/) MAY be used for rich 

254 text representation. 

255 * `externalDocs`: Additional external documentation for this tag. If 

256 provided, it would contain a `dict` with: 

257 * `description`: A short description of the target documentation. 

258 [CommonMark syntax](https://commonmark.org/) MAY be used for 

259 rich text representation. 

260 * `url`: The URL for the target documentation. Value MUST be in 

261 the form of a URL. 

262 

263 Read more in the 

264 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-tags). 

265 

266 **Example** 

267 

268 ```python 

269 from fastapi import FastAPI 

270 

271 tags_metadata = [ 

272 { 

273 "name": "users", 

274 "description": "Operations with users. The **login** logic is also here.", 

275 }, 

276 { 

277 "name": "items", 

278 "description": "Manage items. So _fancy_ they have their own docs.", 

279 "externalDocs": { 

280 "description": "Items external docs", 

281 "url": "https://fastapi.tiangolo.com/", 

282 }, 

283 }, 

284 ] 

285 

286 app = FastAPI(openapi_tags=tags_metadata) 

287 ``` 

288 """ 

289 ), 

290 ] = None, 

291 servers: Annotated[ 

292 Optional[List[Dict[str, Union[str, Any]]]], 

293 Doc( 

294 """ 

295 A `list` of `dict`s with connectivity information to a target server. 

296 

297 You would use it, for example, if your application is served from 

298 different domains and you want to use the same Swagger UI in the 

299 browser to interact with each of them (instead of having multiple 

300 browser tabs open). Or if you want to leave fixed the possible URLs. 

301 

302 If the servers `list` is not provided, or is an empty `list`, the 

303 default value would be a `dict` with a `url` value of `/`. 

304 

305 Each item in the `list` is a `dict` containing: 

306 

307 * `url`: A URL to the target host. This URL supports Server Variables 

308 and MAY be relative, to indicate that the host location is relative 

309 to the location where the OpenAPI document is being served. Variable 

310 substitutions will be made when a variable is named in `{`brackets`}`. 

311 * `description`: An optional string describing the host designated by 

312 the URL. [CommonMark syntax](https://commonmark.org/) MAY be used for 

313 rich text representation. 

314 * `variables`: A `dict` between a variable name and its value. The value 

315 is used for substitution in the server's URL template. 

316 

317 Read more in the 

318 [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/#additional-servers). 

319 

320 **Example** 

321 

322 ```python 

323 from fastapi import FastAPI 

324 

325 app = FastAPI( 

326 servers=[ 

327 {"url": "https://stag.example.com", "description": "Staging environment"}, 

328 {"url": "https://prod.example.com", "description": "Production environment"}, 

329 ] 

330 ) 

331 ``` 

332 """ 

333 ), 

334 ] = None, 

335 dependencies: Annotated[ 

336 Optional[Sequence[Depends]], 

337 Doc( 

338 """ 

339 A list of global dependencies, they will be applied to each 

340 *path operation*, including in sub-routers. 

341 

342 Read more about it in the 

343 [FastAPI docs for Global Dependencies](https://fastapi.tiangolo.com/tutorial/dependencies/global-dependencies/). 

344 

345 **Example** 

346 

347 ```python 

348 from fastapi import Depends, FastAPI 

349 

350 from .dependencies import func_dep_1, func_dep_2 

351 

352 app = FastAPI(dependencies=[Depends(func_dep_1), Depends(func_dep_2)]) 

353 ``` 

354 """ 

355 ), 

356 ] = None, 

357 default_response_class: Annotated[ 

358 Type[Response], 

359 Doc( 

360 """ 

361 The default response class to be used. 

362 

363 Read more in the 

364 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class). 

365 

366 **Example** 

367 

368 ```python 

369 from fastapi import FastAPI 

370 from fastapi.responses import ORJSONResponse 

371 

372 app = FastAPI(default_response_class=ORJSONResponse) 

373 ``` 

374 """ 

375 ), 

376 ] = Default(JSONResponse), 

377 redirect_slashes: Annotated[ 

378 bool, 

379 Doc( 

380 """ 

381 Whether to detect and redirect slashes in URLs when the client doesn't 

382 use the same format. 

383 

384 **Example** 

385 

386 ```python 

387 from fastapi import FastAPI 

388 

389 app = FastAPI(redirect_slashes=True) # the default 

390 

391 @app.get("/items/") 

392 async def read_items(): 

393 return [{"item_id": "Foo"}] 

394 ``` 

395 

396 With this app, if a client goes to `/items` (without a trailing slash), 

397 they will be automatically redirected with an HTTP status code of 307 

398 to `/items/`. 

399 """ 

400 ), 

401 ] = True, 

402 docs_url: Annotated[ 

403 Optional[str], 

404 Doc( 

405 """ 

406 The path to the automatic interactive API documentation. 

407 It is handled in the browser by Swagger UI. 

408 

409 The default URL is `/docs`. You can disable it by setting it to `None`. 

410 

411 If `openapi_url` is set to `None`, this will be automatically disabled. 

412 

413 Read more in the 

414 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#docs-urls). 

415 

416 **Example** 

417 

418 ```python 

419 from fastapi import FastAPI 

420 

421 app = FastAPI(docs_url="/documentation", redoc_url=None) 

422 ``` 

423 """ 

424 ), 

425 ] = "/docs", 

426 redoc_url: Annotated[ 

427 Optional[str], 

428 Doc( 

429 """ 

430 The path to the alternative automatic interactive API documentation 

431 provided by ReDoc. 

432 

433 The default URL is `/redoc`. You can disable it by setting it to `None`. 

434 

435 If `openapi_url` is set to `None`, this will be automatically disabled. 

436 

437 Read more in the 

438 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#docs-urls). 

439 

440 **Example** 

441 

442 ```python 

443 from fastapi import FastAPI 

444 

445 app = FastAPI(docs_url="/documentation", redoc_url="redocumentation") 

446 ``` 

447 """ 

448 ), 

449 ] = "/redoc", 

450 swagger_ui_oauth2_redirect_url: Annotated[ 

451 Optional[str], 

452 Doc( 

453 """ 

454 The OAuth2 redirect endpoint for the Swagger UI. 

455 

456 By default it is `/docs/oauth2-redirect`. 

457 

458 This is only used if you use OAuth2 (with the "Authorize" button) 

459 with Swagger UI. 

460 """ 

461 ), 

462 ] = "/docs/oauth2-redirect", 

463 swagger_ui_init_oauth: Annotated[ 

464 Optional[Dict[str, Any]], 

465 Doc( 

466 """ 

467 OAuth2 configuration for the Swagger UI, by default shown at `/docs`. 

468 

469 Read more about the available configuration options in the 

470 [Swagger UI docs](https://swagger.io/docs/open-source-tools/swagger-ui/usage/oauth2/). 

471 """ 

472 ), 

473 ] = None, 

474 middleware: Annotated[ 

475 Optional[Sequence[Middleware]], 

476 Doc( 

477 """ 

478 List of middleware to be added when creating the application. 

479 

480 In FastAPI you would normally do this with `app.add_middleware()` 

481 instead. 

482 

483 Read more in the 

484 [FastAPI docs for Middleware](https://fastapi.tiangolo.com/tutorial/middleware/). 

485 """ 

486 ), 

487 ] = None, 

488 exception_handlers: Annotated[ 

489 Optional[ 

490 Dict[ 

491 Union[int, Type[Exception]], 

492 Callable[[Request, Any], Coroutine[Any, Any, Response]], 

493 ] 

494 ], 

495 Doc( 

496 """ 

497 A dictionary with handlers for exceptions. 

498 

499 In FastAPI, you would normally use the decorator 

500 `@app.exception_handler()`. 

501 

502 Read more in the 

503 [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/). 

504 """ 

505 ), 

506 ] = None, 

507 on_startup: Annotated[ 

508 Optional[Sequence[Callable[[], Any]]], 

509 Doc( 

510 """ 

511 A list of startup event handler functions. 

512 

513 You should instead use the `lifespan` handlers. 

514 

515 Read more in the [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). 

516 """ 

517 ), 

518 ] = None, 

519 on_shutdown: Annotated[ 

520 Optional[Sequence[Callable[[], Any]]], 

521 Doc( 

522 """ 

523 A list of shutdown event handler functions. 

524 

525 You should instead use the `lifespan` handlers. 

526 

527 Read more in the 

528 [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). 

529 """ 

530 ), 

531 ] = None, 

532 lifespan: Annotated[ 

533 Optional[Lifespan[AppType]], 

534 Doc( 

535 """ 

536 A `Lifespan` context manager handler. This replaces `startup` and 

537 `shutdown` functions with a single context manager. 

538 

539 Read more in the 

540 [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). 

541 """ 

542 ), 

543 ] = None, 

544 terms_of_service: Annotated[ 

545 Optional[str], 

546 Doc( 

547 """ 

548 A URL to the Terms of Service for your API. 

549 

550 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

551 

552 Read more at the 

553 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). 

554 

555 **Example** 

556 

557 ```python 

558 app = FastAPI(terms_of_service="http://example.com/terms/") 

559 ``` 

560 """ 

561 ), 

562 ] = None, 

563 contact: Annotated[ 

564 Optional[Dict[str, Union[str, Any]]], 

565 Doc( 

566 """ 

567 A dictionary with the contact information for the exposed API. 

568 

569 It can contain several fields. 

570 

571 * `name`: (`str`) The name of the contact person/organization. 

572 * `url`: (`str`) A URL pointing to the contact information. MUST be in 

573 the format of a URL. 

574 * `email`: (`str`) The email address of the contact person/organization. 

575 MUST be in the format of an email address. 

576 

577 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

578 

579 Read more at the 

580 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). 

581 

582 **Example** 

583 

584 ```python 

585 app = FastAPI( 

586 contact={ 

587 "name": "Deadpoolio the Amazing", 

588 "url": "http://x-force.example.com/contact/", 

589 "email": "dp@x-force.example.com", 

590 } 

591 ) 

592 ``` 

593 """ 

594 ), 

595 ] = None, 

596 license_info: Annotated[ 

597 Optional[Dict[str, Union[str, Any]]], 

598 Doc( 

599 """ 

600 A dictionary with the license information for the exposed API. 

601 

602 It can contain several fields. 

603 

604 * `name`: (`str`) **REQUIRED** (if a `license_info` is set). The 

605 license name used for the API. 

606 * `identifier`: (`str`) An [SPDX](https://spdx.dev/) license expression 

607 for the API. The `identifier` field is mutually exclusive of the `url` 

608 field. Available since OpenAPI 3.1.0, FastAPI 0.99.0. 

609 * `url`: (`str`) A URL to the license used for the API. This MUST be 

610 the format of a URL. 

611 

612 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

613 

614 Read more at the 

615 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). 

616 

617 **Example** 

618 

619 ```python 

620 app = FastAPI( 

621 license_info={ 

622 "name": "Apache 2.0", 

623 "url": "https://www.apache.org/licenses/LICENSE-2.0.html", 

624 } 

625 ) 

626 ``` 

627 """ 

628 ), 

629 ] = None, 

630 openapi_prefix: Annotated[ 

631 str, 

632 Doc( 

633 """ 

634 A URL prefix for the OpenAPI URL. 

635 """ 

636 ), 

637 deprecated( 

638 """ 

639 "openapi_prefix" has been deprecated in favor of "root_path", which 

640 follows more closely the ASGI standard, is simpler, and more 

641 automatic. 

642 """ 

643 ), 

644 ] = "", 

645 root_path: Annotated[ 

646 str, 

647 Doc( 

648 """ 

649 A path prefix handled by a proxy that is not seen by the application 

650 but is seen by external clients, which affects things like Swagger UI. 

651 

652 Read more about it at the 

653 [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/). 

654 

655 **Example** 

656 

657 ```python 

658 from fastapi import FastAPI 

659 

660 app = FastAPI(root_path="/api/v1") 

661 ``` 

662 """ 

663 ), 

664 ] = "", 

665 root_path_in_servers: Annotated[ 

666 bool, 

667 Doc( 

668 """ 

669 To disable automatically generating the URLs in the `servers` field 

670 in the autogenerated OpenAPI using the `root_path`. 

671 

672 Read more about it in the 

673 [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/#disable-automatic-server-from-root_path). 

674 

675 **Example** 

676 

677 ```python 

678 from fastapi import FastAPI 

679 

680 app = FastAPI(root_path_in_servers=False) 

681 ``` 

682 """ 

683 ), 

684 ] = True, 

685 responses: Annotated[ 

686 Optional[Dict[Union[int, str], Dict[str, Any]]], 

687 Doc( 

688 """ 

689 Additional responses to be shown in OpenAPI. 

690 

691 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

692 

693 Read more about it in the 

694 [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/). 

695 

696 And in the 

697 [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). 

698 """ 

699 ), 

700 ] = None, 

701 callbacks: Annotated[ 

702 Optional[List[BaseRoute]], 

703 Doc( 

704 """ 

705 OpenAPI callbacks that should apply to all *path operations*. 

706 

707 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

708 

709 Read more about it in the 

710 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). 

711 """ 

712 ), 

713 ] = None, 

714 webhooks: Annotated[ 

715 Optional[routing.APIRouter], 

716 Doc( 

717 """ 

718 Add OpenAPI webhooks. This is similar to `callbacks` but it doesn't 

719 depend on specific *path operations*. 

720 

721 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

722 

723 **Note**: This is available since OpenAPI 3.1.0, FastAPI 0.99.0. 

724 

725 Read more about it in the 

726 [FastAPI docs for OpenAPI Webhooks](https://fastapi.tiangolo.com/advanced/openapi-webhooks/). 

727 """ 

728 ), 

729 ] = None, 

730 deprecated: Annotated[ 

731 Optional[bool], 

732 Doc( 

733 """ 

734 Mark all *path operations* as deprecated. You probably don't need it, 

735 but it's available. 

736 

737 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

738 

739 Read more about it in the 

740 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

741 """ 

742 ), 

743 ] = None, 

744 include_in_schema: Annotated[ 

745 bool, 

746 Doc( 

747 """ 

748 To include (or not) all the *path operations* in the generated OpenAPI. 

749 You probably don't need it, but it's available. 

750 

751 This affects the generated OpenAPI (e.g. visible at `/docs`). 

752 

753 Read more about it in the 

754 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). 

755 """ 

756 ), 

757 ] = True, 

758 swagger_ui_parameters: Annotated[ 

759 Optional[Dict[str, Any]], 

760 Doc( 

761 """ 

762 Parameters to configure Swagger UI, the autogenerated interactive API 

763 documentation (by default at `/docs`). 

764 

765 Read more about it in the 

766 [FastAPI docs about how to Configure Swagger UI](https://fastapi.tiangolo.com/how-to/configure-swagger-ui/). 

767 """ 

768 ), 

769 ] = None, 

770 generate_unique_id_function: Annotated[ 

771 Callable[[routing.APIRoute], str], 

772 Doc( 

773 """ 

774 Customize the function used to generate unique IDs for the *path 

775 operations* shown in the generated OpenAPI. 

776 

777 This is particularly useful when automatically generating clients or 

778 SDKs for your API. 

779 

780 Read more about it in the 

781 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

782 """ 

783 ), 

784 ] = Default(generate_unique_id), 

785 separate_input_output_schemas: Annotated[ 

786 bool, 

787 Doc( 

788 """ 

789 Whether to generate separate OpenAPI schemas for request body and 

790 response body when the results would be more precise. 

791 

792 This is particularly useful when automatically generating clients. 

793 

794 For example, if you have a model like: 

795 

796 ```python 

797 from pydantic import BaseModel 

798 

799 class Item(BaseModel): 

800 name: str 

801 tags: list[str] = [] 

802 ``` 

803 

804 When `Item` is used for input, a request body, `tags` is not required, 

805 the client doesn't have to provide it. 

806 

807 But when using `Item` for output, for a response body, `tags` is always 

808 available because it has a default value, even if it's just an empty 

809 list. So, the client should be able to always expect it. 

810 

811 In this case, there would be two different schemas, one for input and 

812 another one for output. 

813 """ 

814 ), 

815 ] = True, 

816 openapi_external_docs: Annotated[ 

817 Optional[Dict[str, Any]], 

818 Doc( 

819 """ 

820 This field allows you to provide additional external documentation links. 

821 If provided, it must be a dictionary containing: 

822 

823 * `description`: A brief description of the external documentation. 

824 * `url`: The URL pointing to the external documentation. The value **MUST** 

825 be a valid URL format. 

826 

827 **Example**: 

828 

829 ```python 

830 from fastapi import FastAPI 

831 

832 external_docs = { 

833 "description": "Detailed API Reference", 

834 "url": "https://example.com/api-docs", 

835 } 

836 

837 app = FastAPI(openapi_external_docs=external_docs) 

838 ``` 

839 """ 

840 ), 

841 ] = None, 

842 **extra: Annotated[ 

843 Any, 

844 Doc( 

845 """ 

846 Extra keyword arguments to be stored in the app, not used by FastAPI 

847 anywhere. 

848 """ 

849 ), 

850 ], 

851 ) -> None: 

852 self.debug = debug 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

853 self.title = title 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

854 self.summary = summary 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

855 self.description = description 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

856 self.version = version 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

857 self.terms_of_service = terms_of_service 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

858 self.contact = contact 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

859 self.license_info = license_info 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

860 self.openapi_url = openapi_url 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

861 self.openapi_tags = openapi_tags 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

862 self.root_path_in_servers = root_path_in_servers 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

863 self.docs_url = docs_url 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

864 self.redoc_url = redoc_url 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

865 self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

866 self.swagger_ui_init_oauth = swagger_ui_init_oauth 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

867 self.swagger_ui_parameters = swagger_ui_parameters 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

868 self.servers = servers or [] 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

869 self.separate_input_output_schemas = separate_input_output_schemas 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

870 self.openapi_external_docs = openapi_external_docs 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

871 self.extra = extra 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

872 self.openapi_version: Annotated[ 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

873 str, 

874 Doc( 

875 """ 

876 The version string of OpenAPI. 

877 

878 FastAPI will generate OpenAPI version 3.1.0, and will output that as 

879 the OpenAPI version. But some tools, even though they might be 

880 compatible with OpenAPI 3.1.0, might not recognize it as a valid. 

881 

882 So you could override this value to trick those tools into using 

883 the generated OpenAPI. Have in mind that this is a hack. But if you 

884 avoid using features added in OpenAPI 3.1.0, it might work for your 

885 use case. 

886 

887 This is not passed as a parameter to the `FastAPI` class to avoid 

888 giving the false idea that FastAPI would generate a different OpenAPI 

889 schema. It is only available as an attribute. 

890 

891 **Example** 

892 

893 ```python 

894 from fastapi import FastAPI 

895 

896 app = FastAPI() 

897 

898 app.openapi_version = "3.0.2" 

899 ``` 

900 """ 

901 ), 

902 ] = "3.1.0" 

903 self.openapi_schema: Optional[Dict[str, Any]] = None 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

904 if self.openapi_url: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

905 assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'" 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

906 assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'" 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

907 # TODO: remove when discarding the openapi_prefix parameter 

908 if openapi_prefix: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

909 logger.warning( 1abcdef

910 '"openapi_prefix" has been deprecated in favor of "root_path", which ' 

911 "follows more closely the ASGI standard, is simpler, and more " 

912 "automatic. Check the docs at " 

913 "https://fastapi.tiangolo.com/advanced/sub-applications/" 

914 ) 

915 self.webhooks: Annotated[ 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

916 routing.APIRouter, 

917 Doc( 

918 """ 

919 The `app.webhooks` attribute is an `APIRouter` with the *path 

920 operations* that will be used just for documentation of webhooks. 

921 

922 Read more about it in the 

923 [FastAPI docs for OpenAPI Webhooks](https://fastapi.tiangolo.com/advanced/openapi-webhooks/). 

924 """ 

925 ), 

926 ] = webhooks or routing.APIRouter() 

927 self.root_path = root_path or openapi_prefix 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

928 self.state: Annotated[ 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

929 State, 

930 Doc( 

931 """ 

932 A state object for the application. This is the same object for the 

933 entire application, it doesn't change from request to request. 

934 

935 You normally wouldn't use this in FastAPI, for most of the cases you 

936 would instead use FastAPI dependencies. 

937 

938 This is simply inherited from Starlette. 

939 

940 Read more about it in the 

941 [Starlette docs for Applications](https://www.starlette.io/applications/#storing-state-on-the-app-instance). 

942 """ 

943 ), 

944 ] = State() 

945 self.dependency_overrides: Annotated[ 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

946 Dict[Callable[..., Any], Callable[..., Any]], 

947 Doc( 

948 """ 

949 A dictionary with overrides for the dependencies. 

950 

951 Each key is the original dependency callable, and the value is the 

952 actual dependency that should be called. 

953 

954 This is for testing, to replace expensive dependencies with testing 

955 versions. 

956 

957 Read more about it in the 

958 [FastAPI docs for Testing Dependencies with Overrides](https://fastapi.tiangolo.com/advanced/testing-dependencies/). 

959 """ 

960 ), 

961 ] = {} 

962 self.router: routing.APIRouter = routing.APIRouter( 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

963 routes=routes, 

964 redirect_slashes=redirect_slashes, 

965 dependency_overrides_provider=self, 

966 on_startup=on_startup, 

967 on_shutdown=on_shutdown, 

968 lifespan=lifespan, 

969 default_response_class=default_response_class, 

970 dependencies=dependencies, 

971 callbacks=callbacks, 

972 deprecated=deprecated, 

973 include_in_schema=include_in_schema, 

974 responses=responses, 

975 generate_unique_id_function=generate_unique_id_function, 

976 ) 

977 self.exception_handlers: Dict[ 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

978 Any, Callable[[Request, Any], Union[Response, Awaitable[Response]]] 

979 ] = {} if exception_handlers is None else dict(exception_handlers) 

980 self.exception_handlers.setdefault(HTTPException, http_exception_handler) 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

981 self.exception_handlers.setdefault( 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

982 RequestValidationError, request_validation_exception_handler 

983 ) 

984 self.exception_handlers.setdefault( 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

985 WebSocketRequestValidationError, 

986 # Starlette still has incorrect type specification for the handlers 

987 websocket_request_validation_exception_handler, # type: ignore 

988 ) 

989 

990 self.user_middleware: List[Middleware] = ( 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

991 [] if middleware is None else list(middleware) 

992 ) 

993 self.middleware_stack: Union[ASGIApp, None] = None 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

994 self.setup() 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

995 

996 def build_middleware_stack(self) -> ASGIApp: 1abcdef

997 # Duplicate/override from Starlette to add AsyncExitStackMiddleware 

998 # inside of ExceptionMiddleware, inside of custom user middlewares 

999 debug = self.debug 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd

1000 error_handler = None 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd

1001 exception_handlers: dict[Any, ExceptionHandler] = {} 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd

1002 

1003 for key, value in self.exception_handlers.items(): 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd

1004 if key in (500, Exception): 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd

1005 error_handler = value 2dhjhphvhBhHh

1006 else: 

1007 exception_handlers[key] = value 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd

1008 

1009 middleware = ( 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd

1010 [Middleware(ServerErrorMiddleware, handler=error_handler, debug=debug)] 

1011 + self.user_middleware 

1012 + [ 

1013 Middleware( 

1014 ExceptionMiddleware, handlers=exception_handlers, debug=debug 

1015 ), 

1016 # Add FastAPI-specific AsyncExitStackMiddleware for closing files. 

1017 # Before this was also used for closing dependencies with yield but 

1018 # those now have their own AsyncExitStack, to properly support 

1019 # streaming responses while keeping compatibility with the previous 

1020 # versions (as of writing 0.117.1) that allowed doing 

1021 # except HTTPException inside a dependency with yield. 

1022 # This needs to happen after user middlewares because those create a 

1023 # new contextvars context copy by using a new AnyIO task group. 

1024 # This AsyncExitStack preserves the context for contextvars, not 

1025 # strictly necessary for closing files but it was one of the original 

1026 # intentions. 

1027 # If the AsyncExitStack lived outside of the custom middlewares and 

1028 # contextvars were set, for example in a dependency with 'yield' 

1029 # in that internal contextvars context, the values would not be 

1030 # available in the outer context of the AsyncExitStack. 

1031 # By placing the middleware and the AsyncExitStack here, inside all 

1032 # user middlewares, the same context is used. 

1033 # This is currently not needed, only for closing files, but used to be 

1034 # important when dependencies with yield were closed here. 

1035 Middleware(AsyncExitStackMiddleware), 

1036 ] 

1037 ) 

1038 

1039 app = self.router 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd

1040 for cls, args, kwargs in reversed(middleware): 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd

1041 app = cls(app, *args, **kwargs) 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd

1042 return app 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd

1043 

1044 def openapi(self) -> Dict[str, Any]: 1abcdef

1045 """ 

1046 Generate the OpenAPI schema of the application. This is called by FastAPI 

1047 internally. 

1048 

1049 The first time it is called it stores the result in the attribute 

1050 `app.openapi_schema`, and next times it is called, it just returns that same 

1051 result. To avoid the cost of generating the schema every time. 

1052 

1053 If you need to modify the generated OpenAPI schema, you could modify it. 

1054 

1055 Read more in the 

1056 [FastAPI docs for OpenAPI](https://fastapi.tiangolo.com/how-to/extending-openapi/). 

1057 """ 

1058 if not self.openapi_schema: 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg

1059 self.openapi_schema = get_openapi( 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg

1060 title=self.title, 

1061 version=self.version, 

1062 openapi_version=self.openapi_version, 

1063 summary=self.summary, 

1064 description=self.description, 

1065 terms_of_service=self.terms_of_service, 

1066 contact=self.contact, 

1067 license_info=self.license_info, 

1068 routes=self.routes, 

1069 webhooks=self.webhooks.routes, 

1070 tags=self.openapi_tags, 

1071 servers=self.servers, 

1072 separate_input_output_schemas=self.separate_input_output_schemas, 

1073 external_docs=self.openapi_external_docs, 

1074 ) 

1075 return self.openapi_schema 2mznzozPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxFagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAHqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg

1076 

1077 def setup(self) -> None: 1abcdef

1078 if self.openapi_url: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

1079 urls = (server_data.get("url") for server_data in self.servers) 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

1080 server_urls = {url for url in urls if url} 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

1081 

1082 async def openapi(req: Request) -> JSONResponse: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

1083 root_path = req.scope.get("root_path", "").rstrip("/") 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAKLvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCLLyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEMLBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGNLEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIOLHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKPLKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg

1084 if root_path not in server_urls: 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAKLvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCLLyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEMLBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGNLEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIOLHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKPLKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg

1085 if root_path and self.root_path_in_servers: 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAKLvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCLLyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEMLBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGNLEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIOLHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKPLKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg

1086 self.servers.insert(0, {"url": root_path}) 2,yaz-y.yJf/ybz:y;yKf=ycz?y@yLf[ydz]y^yMf_yez`y{yNf|yfz}y~yOf

1087 server_urls.add(root_path) 2,yaz-y.yJf/ybz:y;yKf=ycz?y@yLf[ydz]y^yMf_yez`y{yNf|yfz}y~yOf

1088 return JSONResponse(self.openapi()) 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAKLvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCLLyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEMLBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGNLEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIOLHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKPLKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg

1089 

1090 self.add_route(self.openapi_url, openapi, include_in_schema=False) 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

1091 if self.openapi_url and self.docs_url: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

1092 

1093 async def swagger_ui_html(req: Request) -> HTMLResponse: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

1094 root_path = req.scope.get("root_path", "").rstrip("/") 2ELXg`gYgg Zg0g1gFL3g{g4gh 5g6g7gGL9g|g!gi #g$g%gHL(g}g)gj *g+g,gIL.g~g/gk :g;g=gJL@gah[gl ]g^g_g

1095 openapi_url = root_path + self.openapi_url 2ELXg`gYgg Zg0g1gFL3g{g4gh 5g6g7gGL9g|g!gi #g$g%gHL(g}g)gj *g+g,gIL.g~g/gk :g;g=gJL@gah[gl ]g^g_g

1096 oauth2_redirect_url = self.swagger_ui_oauth2_redirect_url 2ELXg`gYgg Zg0g1gFL3g{g4gh 5g6g7gGL9g|g!gi #g$g%gHL(g}g)gj *g+g,gIL.g~g/gk :g;g=gJL@gah[gl ]g^g_g

1097 if oauth2_redirect_url: 2ELXg`gYgg Zg0g1gFL3g{g4gh 5g6g7gGL9g|g!gi #g$g%gHL(g}g)gj *g+g,gIL.g~g/gk :g;g=gJL@gah[gl ]g^g_g

1098 oauth2_redirect_url = root_path + oauth2_redirect_url 2ELXgYgg Zg0g1gFL3g4gh 5g6g7gGL9g!gi #g$g%gHL(g)gj *g+g,gIL.g/gk :g;g=gJL@g[gl ]g^g_g

1099 return get_swagger_ui_html( 2ELXg`gYgg Zg0g1gFL3g{g4gh 5g6g7gGL9g|g!gi #g$g%gHL(g}g)gj *g+g,gIL.g~g/gk :g;g=gJL@gah[gl ]g^g_g

1100 openapi_url=openapi_url, 

1101 title=f"{self.title} - Swagger UI", 

1102 oauth2_redirect_url=oauth2_redirect_url, 

1103 init_oauth=self.swagger_ui_init_oauth, 

1104 swagger_ui_parameters=self.swagger_ui_parameters, 

1105 ) 

1106 

1107 self.add_route(self.docs_url, swagger_ui_html, include_in_schema=False) 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

1108 

1109 if self.swagger_ui_oauth2_redirect_url: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

1110 

1111 async def swagger_ui_redirect(req: Request) -> HTMLResponse: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

1112 return get_swagger_ui_oauth2_redirect_html() 2WLXLYLZL0L1L2L3L4L5L6L7L

1113 

1114 self.add_route( 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

1115 self.swagger_ui_oauth2_redirect_url, 

1116 swagger_ui_redirect, 

1117 include_in_schema=False, 

1118 ) 

1119 if self.openapi_url and self.redoc_url: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd

1120 

1121 async def redoc_html(req: Request) -> HTMLResponse: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

1122 root_path = req.scope.get("root_path", "").rstrip("/") 2QLg RLh SLi TLj ULk VLl

1123 openapi_url = root_path + self.openapi_url 2QLg RLh SLi TLj ULk VLl

1124 return get_redoc_html( 2QLg RLh SLi TLj ULk VLl

1125 openapi_url=openapi_url, title=f"{self.title} - ReDoc" 

1126 ) 

1127 

1128 self.add_route(self.redoc_url, redoc_html, include_in_schema=False) 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd

1129 

1130 async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: 1abcdef

1131 if self.root_path: 2a LhMhNh8LOhPhQhmzRh9LnzozShWgPfQfRfSfTh!L#L$Lpz%L'L(LUhbhVhTbUbqz)LWhrzQLELWLXhVbWbYhTfZh*L0hszUf+L,LXgXLXbYbZb1h-L.L/L:L;L=L?L@L[L]L^L_L`L2h{L|L}L~LaMbMcMdMeMfMgMhMiMjMkMlM3hmMnMoMpM4hqMrM5hsM6htMuMvM7hwMxMyM8hzMAMBMCMDMEMFMGMHMIMJMKMLMMMNMOMPMQM9hRMSM!htzTMUMVMWM#hXMYMZM0M1M2M3M4M5M6M7M8M9M!M#M$M%M'M(M)M*M$h+M,M%h-Mch,y'huz(h.M/MVfdh:M;M=M?M@M)h[M]Mvz^M_M`M*h{M+hwz|M,hWf-h.h}M~MaNbNcN/hxz:hm ' n o p q r ( ;hyzXf=hzz?hdN@heN[hAzfNgNhNiNjNkNlN]hmNnNBz0b1bCz^hoNpNDz_hqN`hrNEzsN`gtN{hFzYf|hGz}hHzdbebfbs t gb~hIzaiuNbiJzcivNwNxNyNZfzNANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNUNVNWNXNYNZN0N1N2N3N4N5N6N7N8N9N!N#N$N%N'N(N)N*N+N,N-N.N/N:N;N=N?N@N[N]N^N_N`N{N|N}N~NaObOcOdOeOfOgOhOiOjOkOKzdilOmOnOoOpOqOrOsOtOuOvOwOxOyOzOAOBOCODOEOFOGOHOIOJOKOLOMONOOO2b3beiPO0ffiLzgiMz1fQOROSOTOhiUOVONziiWOXOYOZO0O1O2O3Oji2fkiOz4O5O6O7O8O9O!O#O$O%O'O(O)OliPz*O+O,O-O.O/O:O;O=O?O@O[O]O^O_O`O{O|O}O~OaPbPcPmidPePnifPoigPhPiPjPkPpilPQzqi4brimPnPoPpP5b6b7b| hb8bsi9b!bibu RztiqPSzuirPTzvisPUzwitPVzxiuPWzyivPXzziwPYzAixPZzBiyP0zCizP1zDiAP2zEiBP3zFiCPDPEP4zGiFPGPHP5zHiIPJPKP6zIiLPMP7zJiNPOP8zKiPPQP9zLiRPSP!zMiTPUP#zNiVPWP$zOiXPYPZP0P1P2P3PPi%z4P5PQi'z6P(zRi7P8P9P!P#P$P)zSi%P'P(P)P*P+P,PTi*z-P.PUi+z/P,zVi:P;P-zWi=P?P.zXi@P[P]PYi^P_P`P{P|P}PZi~PaQbQ0icQdQeQfQgQ1ihQiQjQkQ2ilQmQnQoQpQ/zqQ3irQsQ4i:ztQYguQ5i;zvQwQxQyQ=z6izQ?z7iAQ@z8iBQ[z9iCQDQ!i#i$i%iEQ'i(i)iazFQ*ieh-yfh.yghgzGQHQIQJQKQLQMQNQOQPQQQ]zRQSQTQUQVQWQXQYQZQ0Q+i1Q2Q,i3Q4Q5Q^z6Q7Q8Q9Q!Q#Q$Q%Q'Q(Q)Q*Q-i+Q_z`z.i,Q-Q.Q{z/Q:Q/i|z:i;Q;i}z~z=Qg 8d#b?QZg@Q0g[Q1g=i]Q^Q_QaA?i`Q{Q|QbA@icA[i}Q~QaRbRcRdReRfR]igR^ihR_iiR`idA{ieA|ifA}igA~ihAiAajjAbjcjdjejfjgjkAjRhjijlAkRmAnAjjkjoAljpAlRmRmjnRqAoRnjpRqRrRojsRtRpjuRvRwRxRyRzRqjARBRCRrArjsAsjtAtjuAujKLvjvAwjDRwAxjxAyjyAzjzAERAAAjFRBjGRBACjHRCADjIRDAJRKREjEAFALRFjMRNRGjGAHjORPRQRHAIjRRSRTRIAJjURVRWRXRJAKjKALjLAMjMANjNAOjOAPAPjQjQARjRASjSATjTAUjUAVAWAVjWjXAYAXjZAYjYRZR0AZj0R1R0j2R1A2A3A1j4A2j3j5A3R4j4R5R6R6A7A5j7R8R9R8A6j!R#R$R7j%R9A8j'R!A#A(R)R9j*R!j$A+R#j,R%A$j'A-R%j.R(A/R:R;R'j)A*A=R?R(j@R[R+A]R)j^R_R,A*j`R{R-A|R}R+j~RaS.A,jbS/A-jcSdSeSfS:AgS.jhSiSjSkS;AlS/jmSnSoSpS=A:jqSrSsStS?AuSvSwS;jxS=j?j@j[j]j@A^j[A_j`jyS]A{j^A|jzS_A}j`A{A~jAS|AakBS}Abk~AckaBdkbBekCSfkcBDSESFSGSgkHSISJSdBKSLSMShkNSOSPSeBQSRSSSTSUSVSWSXSYSfBikZS0S1SjkgB2SkkhB3Slkmk4SiB5SjB6S3fJf7S$b8SkBnk9SlB!S#Sjb$S%Sok'S(S)S*S+Spk,Sqk-S.S/S:S;Srk=S?SskmB@Stk[S]SnB^SukoBvk_S`Swk{S|S}S~SaTxkbTyk4fzkcTdTAk%b'b(beTfTgThTiTjTkTlTb BkCkDkmTEkFkGkpBHknTqBrBIk2g5f6f7f8fJkoTpTqTsBrTsTtTKkhhLk)b*btBuTMkuBRLFLYLNk+b,bOk9fPkvTQkvB!fwTxT3gZL-b.b/bRkyTzTATBTCTDTETFTGTHTITJTKTSkLTMTNTOTPTQTRTSTTTUTVTWTXTYTZT0TTk1T2T3T4TUk5T6TVk7TWk8T9T!TXk#T$T%TYk'T(T)T*T+T,T-T.T/T:T;T=T?T@T[T]T^T_TZk`T{T0kwB|T}T~TaU1kbUcUdUeUfUgUhUiUjUkUlUmUnUoUpUqUrUsUtUuUvU2kwUxU3kyUih/y4kxB5kzUAU#fjhBUCUDUEUFU6kGUHUyBIUJUKU7kLU8kzBMU9k$f!k#kNUOUPUQURU$kAB%kv ) w x y z A * 'kBB%f(kCB)kSU*kTU+kDBUUVUWUXUYUZU0U,k1U2UEB:b;bFB-k3U4UGB.k5U/k6UHB7U{g8U:kIB'f;kJB=kKBkblbmbB C nb?kLB@k9U[kMB]k!U#U$U%U(f'U(U)U*U+U,U-U.U/U:U;U=U?U@U[U]U^U_U`U{U|U}U~UaVbVcVdVeVfVgVhViVjVkVlVmVnVoVpVqVrVsVtVuVvVwVxVyVzVAVBVCVDVEVFVGVHVIVJVKVLVMVNVOVPVQVRVSVTVUVVVWVXVYVZVNB^k0V1V2V3V4V5V6V7V8V9V!V#V$V%V'V(V)V*V+V,V-V.V/V:V;V=V?V@V[V]V=b?b_k^V)f`kOB{kPB*f_V`V{V|V|k}V~VQB}kaWbWcWdWeWfWgWhW~k+falRBiWjWkWlWmWnWoWpWqWrWsWtWuWblSBvWwWxWyWzWAWBWCWDWEWFWGWHWIWJWKWLWMWNWOWPWQWRWclSWTWdlUWelVWWWXWYWZWfl0WTBgl@bhl1W2W3W4W[b]b^b} ob_bil`b{bpbD UBjl5WVBkl6WWBll7WXBml8WYBnl9WZBol!W0Bpl#W1Bql$W2Brl%W3Bsl'W4Btl(W5Bul)W6Bvl*W+W,W7Bwl-W.W/W8Bxl:W;W=W9Byl?W@W!Bzl[W]W#BAl^W_W$BBl`W{W%BCl|W}W'BDl~WaX(BElbXcXdXeXfXgXhXFl)BiXjXGl*BkX+BHllXmXnXoXpXqX,BIlrXsXtXuXvXwXxXJl-ByXzXKl.BAX/BLlBXCX:BMlDXEX;BNlFXGXHXOlIXJXKXLXMXNXPlOXPXQXQlRXSXTXUXVXRlWXXXYXZXSl0X1X2X3X4X=B5XTl6X7XUl?B8X4g9XVl@B!X#X$X%X[BWl'X]BXl(X^BYl)X_BZl*X+X0l1l2l3l,X4l5l6lbz-X7lkh:ylh;ymhhz.X/X:X;X=X?X@X[X]X^X_X`B`X{X|X}X~XaYbYcYdYeY8lfYgY9lhYiYjY{BkYlYmYnYoYpYqYrYsYtYuYvY!lwY|B}B#lxYyYzY~BAYBY$laC%lCY'lbCcCDYh be|bEY5gFY6gGY7g(lHYIYJYdC)lKYLYMYeC*lfC+lNYOYPYQYRYSYTYUY,lVY-lWY.lXY/lgC:lhC;liC=ljC?lkClC@lmC[l]l^l_l`l{lnCYY|l}loCZYpCqC~lamrCbmsC0Y1Ycm2YtC3Ydm4Y5Y6Yem7Y8Yfm9Y!Y#Y$Y%Y'Ygm(Y)Y*YuChmvCimwCjmxCkmLLlmyCmm+YzCnmAComBCpmCC,YDCqm-Yrm.YECsm/YFCtm:YGC;Y=YumHCIC?Yvm@Y[YwmJCxm]Y^Y_YKCym`Y{Y|YLCzm}Y~YaZbZMCAmNCBmOCCmPCDmQCEmRCSCFmGmTCHmUCImVCJmWCKmXCYCZCLmMm0C1CNm2COmcZdZ3CPmeZfZQmgZ4C5C6CRm7CSmTm8ChZUmiZjZkZ9C!CVmlZmZnZ#CWmoZpZqZXmrZ$CYmsZ%C'CtZuZZmvZ0m(CwZ1mxZ)C2m*CyZ3mzZ+CAZBZCZ4m,C-CDZEZ5mFZGZ.CHZ6mIZJZ/C7mKZLZ:CMZNZ8mOZPZ;C9mQZ=C!mRZSZTZUZ?CVZ#mWZXZYZZZ@C0Z$m1Z2Z3Z4Z[C%m5Z6Z7Z8Z]C9Z!Z#Z'm$Z(m)m*m+m,m^C-m_C.m/m%Z`C:m{C;m'Z|C=m}C~C?m(ZaD@m)ZbD[mcD]mdD^meD_m*Z`mfD+Z,Z-Z.Z{m/Z:Z;ZgD=Z?Z@Z|m[Z]Z^ZhD_Z`Z{Z|Z}Z~Za0b0c0iD}md0e0f0~mjDg0ankDh0bncni0lDj0mDk0,fKfl0}bm0nDdnn0oDo0p0qbq0r0ens0t0u0v0w0fnx0gny0z0A0B0C0hnD0inE0F0jnpDG0knH0I0qDJ0lnrDmnK0L0nnM0N0O0P0Q0onR0pn-fqnS0T0rn~bacbcU0V0W0X0Y0Z00010c sntnun20vnwnxnsDyn30tDuDzn8g.f/f:f;fAn405060vD708090BnnhCnccdcwD!0DnxDSLGL0LEnecfcFn=fGn#0HnyD?f$0%09g1LgchcicIn'0(0)0*0+0,0-0.0/0:0;0=0?0Jn@0[0]0^0_0`0{0|0}0~0a1b1c1d1e1f1Kng1h1i1j1Lnk1l1Mnm1Nnn1o1p1Onq1r1s1Pnt1u1v1w1x1y1z1A1B1C1D1E1F1G1H1I1J1K1QnL1M1RnzDN1O1P1Q1SnR1S1T1U1V1W1X1Y1Z101112131415161718191!1#1Tn$1%1Un'1oh=yVnADWn(1)1@fph*1+1,1-1.1Xn/1:1BD;1=1?1Yn@1ZnCD[10n[f1n2n]1^1_1`1{13nDD4nE + F G H I J , 5nED]f6nFD7n|18n}19nGD~1a2b2c2d2e2f2!ng2h2HDjckcID#ni2j2JD$nk2%nl2KDm2|gn2'nLD^f(nMD)nNDrbsbtbK L ub*nOD+no2,nPD-np2q2r2s2_ft2u2v2w2x2y2z2A2B2C2D2E2F2G2H2I2J2K2L2M2N2O2P2Q2R2S2T2U2V2W2X2Y2Z202122232425262728292!2#2$2%2'2(2)2*2+2,2-2.2/2:2;2=2?2@2[2]2^2_2`2{2|2}2~2a3b3c3d3e3QD.nf3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3A3B3C3D3E3F3G3H3I3lcmcnc- ocpc. qcrcsc/nJ3`f:nRD;nSD{fK3L3M3N3=nO3P3TD?nQ3R3S3T3U3V3W3X3@n|f[nUDY3Z303132333435363738393!3]nVD#3$3%3'3(3)3*3+3,3-3.3/3:3;3=3?3@3[3]3^3_3`3{3^n|3}3_n~3`na4b4c4d4e4{nf4WD|ntc}ng4h4i4j4ucvcwc~ vbxc~nyczcwbM XDaok4YDbol4ZDcom40Ddon41Deoo42Dfop43Dgoq44Dhor45Dios46Djot47Dkou48Dlov49Dmow4x4y4!Dnoz4A4B4#DooC4D4E4$DpoF4G4%DqoH4I4'DroJ4K4(DsoL4M4)DtoN4O4*DuoP4Q4+DvoR4S4T4U4V4W4X4wo,DY4Z4xo-D04.Dyo142434445464/Dzo748494!4#4$4%4Ao:D'4(4Bo;D)4=DCo*4+4?DDo,4-4@DEo.4/4:4Fo;4=4?4@4[4]4Go^4_4`4Ho{4|4}4~4a5Iob5c5d5e5Jof5g5h5i5j5[Dk5Kol5m5Lo]Dn5!go5Mo^Dp5q5r5s5_DNot5`DOou5{DPov5|DQow5x5RoSoToUoy5VoWoXoczz5Yoqh?yrh@yshizA5B5C5D5E5F5G5H5I5J5K5}DL5M5N5O5P5Q5R5S5T5U5ZoV5W50oX5Y5Z5~D05152535455565758595!5#51o$5aEbE2o%5'5(5cE)5*53odE4o+55oeEfE,5i FeAc-5#g.5$g/5%g6o:5;5=5gE7o?5@5[5hE8oiE9o]5^5_5`5{5|5}5~5!oa6#ob6$oc6%ojE'okE(olE)omE*onEoE+opE,o-o.o/o:o;oqEd6=o?orEe6sEtE@o[ouE]ovEf6g6^oh6wEi6_oj6k6l6`om6n6{oo6p6q6r6s6t6|ou6v6w6xE}oyE~ozEapAEbpMLcpBEdpx6CEepDEfpEEgpFEy6GEhpz6ipA6HEjpB6IEkpC6JED6E6lpKELEF6mpG6H6npMEopI6J6K6NEppL6M6N6OEqpO6P6Q6R6PErpQEspREtpSEupTEvpUEVEwpxpWEypXEzpYEApZEBp0E1E2ECpDp3E4EEp5EFpS6T66EGpU6V6HpW67E8E9EIp!EJpKp#EX6LpY6Z606$E%EMp162636'ENp465666Op76(EPp86)E*E96!6Qp#6Rp+E$6Sp%6,ETp-E'6Up(6.E)6*6+6Vp/E:E,6-6Wp.6/6;E:6Xp;6=6=EYp?6@6?E[6]6Zp^6_6@E0p`6[E1p{6|6}6~6]Ea72pb7c7d7e7^Ef73pg7h7i7j7_E4pk7l7m7n7`Eo7p7q75pr76p7p8p9p!p{E#p|E$p%ps7}E'p~E(pt7aF)pbFcF*pu7dF+pv7eF,pfF-pgF.phF/pw7:piFx7y7z7A7;pB7C7D7jFE7F7G7=pH7I7J7kFK7L7M7N7O7P7Q7R7S7lF?pT7U7V7@pmFW7[pnFX7]p^pY7oFZ7pF07}fLf17Bc27qF_p37rF4757xb6777`p8797!7#7$7{p%7|p'7(7)7*7+7}p,7~p-7.7aqCcsF/7bq:7;7tF=7cquFdq?7@7eq[7]7^7_7`7fq{7gq~fhq|7}7iqDcEcFc~7a8b8c8d8e8f8g8d jqkqlqh8mqnqoqvFpqi8wFxFqq'gagbgcgdgrqj8k8l8yFm8n8o8sqthtqGcHczFp8uqAFTLHL2LvqIcJcwqegxqq8yqBFfgr8s8(g3LKcLcMczqt8u8v8w8x8y8z8A8B8C8D8E8F8AqG8H8I8J8K8L8M8N8O8P8Q8R8S8T8U8V8BqW8X8Y8Z8Cq0818Dq28Eq384858Fq687888Gq98!8#8$8%8'8(8)8*8+8,8-8.8/8:8;8=8?8Hq@8[8IqCF]8^8_8`8Jq{8|8}8~8a9b9c9d9e9f9g9h9i9j9k9l9m9n9o9p9q9Kqr9s9Lqt9uh[yMqDFNqu9v9ggvhw9x9y9z9A9OqB9C9EFD9E9F9PqG9QqFFH9RqhgSqTqI9J9K9L9M9UqGFVqN / O P Q R S : WqHFigXqIFYqN9ZqO90qJFP9Q9R9S9T9U9V91qW9X9KFNcOcLF2qY9Z9MF3q094q19NF29}g395qOFjg6qPF7qQFybzbAbT U Bb8qRF9q49!qSF#q59697989kg99!9#9$9%9'9(9)9*9+9,9-9.9/9:9;9=9?9@9[9]9^9_9`9{9|9}9~9a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!TF$qV!W!X!Y!Z!0!1!2!3!4!5!6!7!8!9!!!#!$!%!'!(!)!*!+!,!-!.!/!:!;!PcQcRc; ScTc= UcVcWc%q=!lg'qUF(qVFmg?!@![!]!)q^!_!WF*q`!{!|!}!~!a#b#c#+qng,qXFd#e#f#g#h#i#j#k#l#m#n#o#p#-qYFq#r#s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#.qN#O#/qP#:qQ#R#S#T#U#;qV#ZF=qXc?qW#X#Y#Z#YcZc0cabCb1c@q2c3cDbV 0F[q0#1F]q1#2F^q2#3F_q3#4F`q4#5F{q5#6F|q6#7F}q7#8F~q8#9Far9#!Fbr!##Fcr##$Fdr$#%#'#%Fer(#)#*#'Ffr+#,#-#(Fgr.#/#)Fhr:#;#*Fir=#?#+Fjr@#[#,Fkr]#^#-Flr_#`#.Fmr{#|#}#~#a$b$c$nr/Fd$e$or:Ff$;Fprg$h$i$j$k$l$=Fqrm$n$o$p$q$r$s$rr?Ft$u$sr@Fv$[Ftrw$x$]Fury$z$^FvrA$B$C$wrD$E$F$G$H$I$xrJ$K$L$yrM$N$O$P$Q$zrR$S$T$U$ArV$W$X$Y$Z$_F0$Br1$2$Cr`F3$)g4$Dr{F5$6$7$8$|FEr9$}FFr!$~FGr#$aGHr$$%$IrJrKrLr'$MrNrOrdz($Prwh]yxh^yyhjz)$*$+$,$-$.$/$:$;$=$?$bG@$[$]$^$_$`${$|$}$~$Qra%b%Rrc%d%e%cGf%g%h%i%j%k%l%m%n%o%p%q%Srr%dGeGTrs%t%u%fGv%w%UrgGVrx%WrhGiGy%j 9e4cz%*gA%+gB%,gXrC%D%E%jGYrF%G%H%kGZrlG0rI%J%K%L%M%N%O%P%1rQ%2rR%3rS%4rmG5rnG6roG7rpG8rqGrG9rsG!r#r$r%r'r(rtGT%)r*ruGU%vGwG+r,rxG-ryGV%W%.rX%zGY%/rZ%0%1%:r2%3%;r4%5%6%7%8%9%=r!%#%$%AG?rBG@rCG[rDG]rNL^rEG_r%%FG`rGG{rHG|rIG'%JG}r(%~r)%KGas*%LGbs+%MG,%-%csNGOG.%ds/%:%esPGfs;%=%?%QGgs@%[%]%RGhs^%_%`%{%SGisTGjsUGksVGlsWGmsXGYGnsosZGps0Gqs1Grs2Gss3G4G5Gtsus6G7Gvs8Gws|%}%9Gxs~%a'ysb'!G#G$Gzs%GAsBs'Gc'Csd'e'f'(G)GDsg'h'i'*GEsj'k'l'Fsm'+GGsn',G-Go'p'Hsq'Is.Gr'Jss'/GKs:Gt'Lsu';Gv'w'x'Ms=G?Gy'z'NsA'B'@GC'OsD'E'[GPsF'G']GH'I'QsJ'K'^GRsL'_GSsM'N'O'P'`GQ'TsR'S'T'U'{GV'UsW'X'Y'Z'|GVs0'1'2'3'}G4'5'6'Ws7'XsYsZs0s1s~G2saH3s4s8'bH5scH6s9'dH7seHfH8s!'gH9s#'hH!siH#sjH$skH%s$''slH%'''(')'(s*'+','mH-'.'/')s:';'='nH?'@'[']'^'_'`'{'|'oH*s}'~'a(+spHb(,sqHc(-s.sd(rHe(sHf(ogMfg(5ch(tH/si(uHj(k(Ebl(m(:sn(o(p(q(r(;ss(=st(u(v(w(x(?sy(@sz(A([s6cvHB(]sC(D(wHE(^sxH_sF(G(`sH(I(J(K(L({sM(|spg}sN(O(~s7c8c9cP(Q(R(S(T(U(V(W(e atbtctX(dtetftyHgtY(zHAHht-gqgrgsgtgitZ(0(1(BH2(3(4(jtzhkt!c#cCH5(ltDHULIL4Lmt$c%cntugot6(ptEHvg7(8(.g5L'c(c)cqt9(!(#($(%('((()(*(+(,(-(.(rt/(:(;(=(?(@([(](^(_(`({(|(}(~(a)stb)c)d)e)ttf)g)uth)vti)j)k)wtl)m)n)xto)p)q)r)s)t)u)v)w)x)y)z)A)B)C)D)E)F)ytG)H)ztFHI)J)K)L)AtM)N)O)P)Q)R)S)T)U)V)W)X)Y)Z)0)1)2)3)4)5)6)Bt7)8)Ct9)Ah_yDtGHEt!)#)wgBh$)%)')()))Ft*)+)HH,)-).)Gt/)HtIH:)ItxgJtKt;)=)?)@)[)LtJHMtW ? X Y Z 0 1 @ NtKHygOtLHPt])Qt^)RtMH_)`){)|)})~)a*Stb*c*NH*c+cOHTtd*e*PHUtf*Vtg*QHh*~gi*WtRHzgXtSHYtTHFbGbHb2 3 IbZtUH0tj*1tVH2tk*l*m*n*Ago*p*q*r*s*t*u*v*w*x*y*z*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*0*1*2*3*4*5*6*7*8*9*!*#*$*%*'*(*)***+*,*-*.*/*:*;*=*?*@*[*]*^*_*`*{*|*}*~*WH3ta+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D+,c-c.c[ /c:c] ;c=c?c4tE+Bg5tXH6tYHCgF+G+H+I+7tJ+K+ZH8tL+M+N+O+P+Q+R+S+9tDg!t0HT+U+V+W+X+Y+Z+0+1+2+3+4+5+#t1H6+7+8+9+!+#+$+%+'+(+)+*+++,+-+.+/+:+;+=+?+@+[+$t]+^+%t_+'t`+{+|+}+~+(ta,2H)t@c*tb,c,d,e,[c]c^cbbJb_c+t`c{cKb4 3H,tf,4H-tg,5H.th,6H/ti,7H:tj,8H;tk,9H=tl,!H?tm,#H@tn,$H[to,%H]tp,'H^tq,(H_tr,s,t,)H`tu,v,w,*H{tx,y,z,+H|tA,B,,H}tC,D,-H~tE,F,.HauG,H,/HbuI,J,:HcuK,L,;HduM,N,O,P,Q,R,S,eu=HT,U,fu?HV,@HguW,X,Y,Z,0,1,[Hhu2,3,4,5,6,7,8,iu]H9,!,ju^H#,_Hku$,%,`Hlu',(,{Hmu),*,+,nu,,-,.,/,:,;,ou=,?,@,pu[,],^,_,`,qu{,|,},~,rua-b-c-d-e-|Hf-sug-h-tu}Hi-/gj-uu~Hk-l-m-n-aIvuo-bIwup-cIxuq-dIyur-s-zuAuBuCut-DuEuFuezu-GuCh`yDh{yEhkzv-w-x-y-z-A-B-C-D-E-F-eIG-H-I-J-K-L-M-N-O-P-HuQ-R-IuS-T-U-fIV-W-X-Y-Z-0-1-2-3-4-5-6-Ju7-gIhIKu8-9-!-iI#-$-LujIMu%-NukIlI'-k cf|c(-:g)-;g*-=gOu+-,---mIPu.-/-:-nIQuoIRu;-=-?-@-[-]-^-_-Su`-Tu{-Uu|-VupIWuqIXurIYusIZutIuI0uvI1u2u3u4u5u6uwI}-7u8uxI~-yIzI9u!uAI#uBIa.b.$uc.CId.%ue.f.g.'uh.i.(uj.k.l.m.n.o.)up.q.r.DI*uEI+uFI,uGI-uOL.uHI/us.II:uJI;uKI=uLIt.MI?uu.@uv.NI[uw.OI]ux.PIy.z.^uQIRIA._uB.C.`uSI{uD.E.F.TI|uG.H.I.UI}uJ.K.L.M.VI~uWIavXIbvYIcvZIdv0I1Ievfv2Igv3Ihv4Iiv5Ijv6I7I8Ikvlv9I!Imv#InvN.O.$IovP.Q.pvR.%I'I(Iqv)Irvsv*IS.tvT.U.V.+I,IuvW.X.Y.-IvvZ.0.1.wv2..Ixv3./I:I4.5.yv6.zv;I7.Av8.=IBv?I9.Cv!.@I#.$.%.Dv[I]I'.(.Ev).*.^I+.Fv,.-._IGv../.`I:.;.Hv=.?.{IIv@.|IJv[.].^._.}I`.Kv{.|.}.~.~Ia/Lvb/c/d/e/aJMvf/g/h/i/bJj/k/l/Nvm/OvPvQvRvSvcJTvdJUvVvn/eJWvfJXvo/gJYvhJiJZvp/jJ0vq/kJ1vlJ2vmJ3vnJ4vr/5voJs/t/u/v/6vw/x/y/pJz/A/B/7vC/D/E/qJF/G/H/I/J/K/L/M/N/rJ8vO/P/Q/9vsJR/!vtJS/#v$vT/uJU/vJV/EgNfW/}cX/wJ%vY/xJZ/0/Lb1/2/'v3/4/5/6/7/(v8/)v9/!/#/$/%/*v'/+v(/)/,v~cyJ*/-v+/,/zJ-/.vAJ/v.///:v:/;/=/?/@/;v[/=vFg?v]/^/@vadbdcd_/`/{/|/}/~/a:b:f [v]v^vc:_v`v{vBJ|vd:CJDJ}v?gGgHgIgJg~ve:f:g:EJh:i:j:awFhbwddedFJk:cwGJVLJL6LdwfdgdewKgfwl:gwHJLgm:n:@g7Lhdidjdhwo:p:q:r:s:t:u:v:w:x:y:z:A:iwB:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:jwR:S:T:U:kwV:W:lwX:mwY:Z:0:nw1:2:3:ow4:5:6:7:8:9:!:#:$:%:':(:):*:+:,:-:.:pw/:::qwIJ;:=:?:@:rw[:]:^:_:`:{:|:}:~:a;b;c;d;e;f;g;h;i;j;k;l;swm;n;two;Gh|yuwJJvwp;q;MgHhr;s;t;u;v;www;x;KJy;z;A;xwB;ywLJC;zwNgAwBwD;E;F;G;H;CwMJDw5 ^ 6 7 8 9 ! _ EwNJOgFwOJGwI;HwJ;IwPJK;L;M;N;O;P;Q;JwR;S;QJkdldRJKwT;U;SJLwV;MwW;TJX;ahY;NwUJPgOwVJPwWJMbNbOb# $ PbQwXJRwZ;SwYJTw0;1;2;3;Qg4;5;6;7;8;9;!;#;$;%;';(;);*;+;,;-;.;/;:;;;=;?;@;[;];^;_;`;{;|;};~;a=b=c=d=e=f=g=h=i=j=k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z=A=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=ZJUwQ=R=S=T=U=V=W=X=Y=Z=0=1=2=3=4=5=6=7=8=9=!=#=$=%='=(=)=*=+=,=mdndod` pdqd{ rdsdtdVw-=RgWw0JXw1JSg.=/=:=;=Yw==?=2JZw@=[=]=^=_=`={=|=0wTg1w3J}=~=a?b?c?d?e?f?g?h?i?j?k?2w4Jl?m?n?o?p?q?r?s?t?u?v?w?x?y?z?A?B?C?D?E?F?G?H?3wI?J?4wK?5wL?M?N?O?P?6wQ?5J7wud8wR?S?T?U?vdwdxdcbQbyd9wzdAdRb% 6J!wV?7J#wW?8J$wX?9J%wY?!J'wZ?#J(w0?$J)w1?%J*w2?'J+w3?(J,w4?)J-w5?*J.w6?+J/w7?8?9?,J:w!?#?$?-J;w%?'?(?.J=w)?*?/J?w+?,?:J@w-?.?;J[w/?:?=J]w;?=??J^w??@?@J_w[?]?^?_?`?{?|?`w[J}?~?{w]Ja@^J|wb@c@d@e@f@g@_J}wh@i@j@k@l@m@n@~w`Jo@p@ax{Jq@|Jbxr@s@}Jcxt@u@~Jdxv@w@x@exy@z@A@B@C@D@fxE@F@G@gxH@I@J@K@L@hxM@N@O@P@ixQ@R@S@T@U@aKV@jxW@X@kxbKY@[gZ@lxcK0@1@2@3@dKmx4@eKnx5@fKox6@gKpx7@8@qxrxsxtx9@uxvxwxfz!@xxIh}yJh~yKhlz#@$@%@'@(@)@*@+@,@-@.@hK/@:@;@=@?@@@[@]@^@_@yx`@{@zx|@}@~@iKa[b[c[d[e[f[g[h[i[j[k[l[Axm[jKkKBxn[o[p[lKq[r[CxmKDxs[ExnKoKt[l GfBdu[]gv[^gw[_gFxx[y[z[pKGxA[B[C[qKHxrKIxD[E[F[G[H[I[J[K[JxL[KxM[LxN[MxsKNxtKOxuKPxvKQxwKxKRxyKSxTxUxVxWxXxzKO[YxZxAKP[BKCK0x1xDK2xEKQ[R[3xS[FKT[4xU[V[W[5xX[Y[6xZ[0[1[2[3[4[7x5[6[7[GK8xHK9xIK!xJK#xPL$xKK%x8[LK'xMK(xNK)xOK9[PK*x![+x#[QK,x$[RK-x%[SK'[([.xTKUK)[/x*[+[:xVK;x,[-[.[WK=x/[:[;[XK?x=[?[@[[[YK@xZK[x0K]x1K^x2K_x3K4K`x{x5K|x6K}x7K~x8Kay9K!K#Kbycy$K%Kdy'Key][^[(Kfy_[`[gy{[)K*K+Khy,Kiyjy-K|[ky}[~[a].K/Klyb]c]d]:Kmye]f]g]nyh];Koyi]=K?Kj]k]pyl]qy@Km]ryn][Ksy]Ko]typ]^Kq]r]s]uy_K`Kt]u]vyv]w]{Kx]wyy]z]|KxyA]B]}KC]D]yyE]F]~KzyG]aLAyH]I]J]K]bLL]ByM]N]O]P]cLQ]CyR]S]T]U]dLDyV]W]X]Y]eLZ]0]1]Ey2]FyGyHyIyJyfLKygLLyMy3]hLNyiLOy4]jLPykLlLQy5]mLRy6]nLSyoLTypLUyqLVy7]WyrL8]9]!]#]Xy$]%]']sL(])]*]Yy+],]-]tL.]/]:];]=]?]@][]]]uLZy^]_]`]0yvL{]1ywL|]2y3y}]xL~]yLa^UgOfb^Cdc^zL4yd^ALe^f^Sbg^h^5yi^j^k^l^m^6yn^7yo^p^q^r^s^8yt^9yu^v^!yDdBLw^#yx^y^CLz^$yDL%yA^B^'yC^D^E^F^G^(yH^)yVg*yI^J^+yEdFdGdK^L^M^N^O^P^Q^R^

1132 scope["root_path"] = self.root_path 2ch,yeh-yfh.yghgzih/ykh:ylh;ymhhzoh=yqh?yrh@yshizuh[ywh]yxh^yyhjzAh_yCh`yDh{yEhkzGh|yIh}yJh~yKhlz

1133 await super().__call__(scope, receive, send) 2a LhMhNh8LOhPhQhmzRh9LnzozShWgPfQfRfSfTh!L#L$Lpz%L'L(LUhbhVhTbUbqz)LWhrzQLELWLXhVbWbYhTfZh*L0hszUf+L,LXgXLXbYbZb1h-L.L/L:L;L=L?L@L[L]L^L_L`L2h{L|L}L~LaMbMcMdMeMfMgMhMiMjMkMlM3hmMnMoMpM4hqMrM5hsM6htMuMvM7hwMxMyM8hzMAMBMCMDMEMFMGMHMIMJMKMLMMMNMOMPMQM9hRMSM!htzTMUMVMWM#hXMYMZM0M1M2M3M4M5M6M7M8M9M!M#M$M%M'M(M)M*M$h+M,M%h-Mch,y'huz(h.M/MVfdh:M;M=M?M@M)h[M]Mvz^M_M`M*h{M+hwz|M,hWf-h.h}M~MaNbNcN/hxz:hm ' n o p q r ( ;hyzXf=hzz?hdN@heN[hAzfNgNhNiNjNkNlN]hmNnNBz0b1bCz^hoNpNDz_hqN`hrNEzsN`gtN{hFzYf|hGz}hHzdbebfbs t gb~hIzaiuNbiJzcivNwNxNyNZfzNANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNUNVNWNXNYNZN0N1N2N3N4N5N6N7N8N9N!N#N$N%N'N(N)N*N+N,N-N.N/N:N;N=N?N@N[N]N^N_N`N{N|N}N~NaObOcOdOeOfOgOhOiOjOkOKzdilOmOnOoOpOqOrOsOtOuOvOwOxOyOzOAOBOCODOEOFOGOHOIOJOKOLOMONOOO2b3beiPO0ffiLzgiMz1fQOROSOTOhiUOVONziiWOXOYOZO0O1O2O3Oji2fkiOz4O5O6O7O8O9O!O#O$O%O'O(O)OliPz*O+O,O-O.O/O:O;O=O?O@O[O]O^O_O`O{O|O}O~OaPbPcPmidPePnifPoigPhPiPjPkPpilPQzqi4brimPnPoPpP5b6b7b| hb8bsi9b!bibu RztiqPSzuirPTzvisPUzwitPVzxiuPWzyivPXzziwPYzAixPZzBiyP0zCizP1zDiAP2zEiBP3zFiCPDPEP4zGiFPGPHP5zHiIPJPKP6zIiLPMP7zJiNPOP8zKiPPQP9zLiRPSP!zMiTPUP#zNiVPWP$zOiXPYPZP0P1P2P3PPi%z4P5PQi'z6P(zRi7P8P9P!P#P$P)zSi%P'P(P)P*P+P,PTi*z-P.PUi+z/P,zVi:P;P-zWi=P?P.zXi@P[P]PYi^P_P`P{P|P}PZi~PaQbQ0icQdQeQfQgQ1ihQiQjQkQ2ilQmQnQoQpQ/zqQ3irQsQ4i:ztQYguQ5i;zvQwQxQyQ=z6izQ?z7iAQ@z8iBQ[z9iCQDQ!i#i$i%iEQ'i(i)iazFQ*ieh-yfh.yghgzGQHQIQJQKQLQMQNQOQPQQQ]zRQSQTQUQVQWQXQYQZQ0Q+i1Q2Q,i3Q4Q5Q^z6Q7Q8Q9Q!Q#Q$Q%Q'Q(Q)Q*Q-i+Q_z`z.i,Q-Q.Q{z/Q:Q/i|z:i;Q;i}z~z=Qg 8d#b?QZg@Q0g[Q1g=i]Q^Q_QaA?i`Q{Q|QbA@icA[i}Q~QaRbRcRdReRfR]igR^ihR_iiR`idA{ieA|ifA}igA~ihAiAajjAbjcjdjejfjgjkAjRhjijlAkRmAnAjjkjoAljpAlRmRmjnRqAoRnjpRqRrRojsRtRpjuRvRwRxRyRzRqjARBRCRrArjsAsjtAtjuAujKLvjvAwjDRwAxjxAyjyAzjzAERAAAjFRBjGRBACjHRCADjIRDAJRKREjEAFALRFjMRNRGjGAHjORPRQRHAIjRRSRTRIAJjURVRWRXRJAKjKALjLAMjMANjNAOjOAPAPjQjQARjRASjSATjTAUjUAVAWAVjWjXAYAXjZAYjYRZR0AZj0R1R0j2R1A2A3A1j4A2j3j5A3R4j4R5R6R6A7A5j7R8R9R8A6j!R#R$R7j%R9A8j'R!A#A(R)R9j*R!j$A+R#j,R%A$j'A-R%j.R(A/R:R;R'j)A*A=R?R(j@R[R+A]R)j^R_R,A*j`R{R-A|R}R+j~RaS.A,jbS/A-jcSdSeSfS:AgS.jhSiSjSkS;AlS/jmSnSoSpS=A:jqSrSsStS?AuSvSwS;jxS=j?j@j[j]j@A^j[A_j`jyS]A{j^A|jzS_A}j`A{A~jAS|AakBS}Abk~AckaBdkbBekCSfkcBDSESFSGSgkHSISJSdBKSLSMShkNSOSPSeBQSRSSSTSUSVSWSXSYSfBikZS0S1SjkgB2SkkhB3Slkmk4SiB5SjB6S3fJf7S$b8SkBnk9SlB!S#Sjb$S%Sok'S(S)S*S+Spk,Sqk-S.S/S:S;Srk=S?SskmB@Stk[S]SnB^SukoBvk_S`Swk{S|S}S~SaTxkbTyk4fzkcTdTAk%b'b(beTfTgThTiTjTkTlTb BkCkDkmTEkFkGkpBHknTqBrBIk2g5f6f7f8fJkoTpTqTsBrTsTtTKkhhLk)b*btBuTMkuBRLFLYLNk+b,bOk9fPkvTQkvB!fwTxT3gZL-b.b/bRkyTzTATBTCTDTETFTGTHTITJTKTSkLTMTNTOTPTQTRTSTTTUTVTWTXTYTZT0TTk1T2T3T4TUk5T6TVk7TWk8T9T!TXk#T$T%TYk'T(T)T*T+T,T-T.T/T:T;T=T?T@T[T]T^T_TZk`T{T0kwB|T}T~TaU1kbUcUdUeUfUgUhUiUjUkUlUmUnUoUpUqUrUsUtUuUvU2kwUxU3kyUih/y4kxB5kzUAU#fjhBUCUDUEUFU6kGUHUyBIUJUKU7kLU8kzBMU9k$f!k#kNUOUPUQURU$kAB%kv ) w x y z A * 'kBB%f(kCB)kSU*kTU+kDBUUVUWUXUYUZU0U,k1U2UEB:b;bFB-k3U4UGB.k5U/k6UHB7U{g8U:kIB'f;kJB=kKBkblbmbB C nb?kLB@k9U[kMB]k!U#U$U%U(f'U(U)U*U+U,U-U.U/U:U;U=U?U@U[U]U^U_U`U{U|U}U~UaVbVcVdVeVfVgVhViVjVkVlVmVnVoVpVqVrVsVtVuVvVwVxVyVzVAVBVCVDVEVFVGVHVIVJVKVLVMVNVOVPVQVRVSVTVUVVVWVXVYVZVNB^k0V1V2V3V4V5V6V7V8V9V!V#V$V%V'V(V)V*V+V,V-V.V/V:V;V=V?V@V[V]V=b?b_k^V)f`kOB{kPB*f_V`V{V|V|k}V~VQB}kaWbWcWdWeWfWgWhW~k+falRBiWjWkWlWmWnWoWpWqWrWsWtWuWblSBvWwWxWyWzWAWBWCWDWEWFWGWHWIWJWKWLWMWNWOWPWQWRWclSWTWdlUWelVWWWXWYWZWfl0WTBgl@bhl1W2W3W4W[b]b^b} ob_bil`b{bpbD UBjl5WVBkl6WWBll7WXBml8WYBnl9WZBol!W0Bpl#W1Bql$W2Brl%W3Bsl'W4Btl(W5Bul)W6Bvl*W+W,W7Bwl-W.W/W8Bxl:W;W=W9Byl?W@W!Bzl[W]W#BAl^W_W$BBl`W{W%BCl|W}W'BDl~WaX(BElbXcXdXeXfXgXhXFl)BiXjXGl*BkX+BHllXmXnXoXpXqX,BIlrXsXtXuXvXwXxXJl-ByXzXKl.BAX/BLlBXCX:BMlDXEX;BNlFXGXHXOlIXJXKXLXMXNXPlOXPXQXQlRXSXTXUXVXRlWXXXYXZXSl0X1X2X3X4X=B5XTl6X7XUl?B8X4g9XVl@B!X#X$X%X[BWl'X]BXl(X^BYl)X_BZl*X+X0l1l2l3l,X4l5l6lbz-X7lkh:ylh;ymhhz.X/X:X;X=X?X@X[X]X^X_X`B`X{X|X}X~XaYbYcYdYeY8lfYgY9lhYiYjY{BkYlYmYnYoYpYqYrYsYtYuYvY!lwY|B}B#lxYyYzY~BAYBY$laC%lCY'lbCcCDYh be|bEY5gFY6gGY7g(lHYIYJYdC)lKYLYMYeC*lfC+lNYOYPYQYRYSYTYUY,lVY-lWY.lXY/lgC:lhC;liC=ljC?lkClC@lmC[l]l^l_l`l{lnCYY|l}loCZYpCqC~lamrCbmsC0Y1Ycm2YtC3Ydm4Y5Y6Yem7Y8Yfm9Y!Y#Y$Y%Y'Ygm(Y)Y*YuChmvCimwCjmxCkmLLlmyCmm+YzCnmAComBCpmCC,YDCqm-Yrm.YECsm/YFCtm:YGC;Y=YumHCIC?Yvm@Y[YwmJCxm]Y^Y_YKCym`Y{Y|YLCzm}Y~YaZbZMCAmNCBmOCCmPCDmQCEmRCSCFmGmTCHmUCImVCJmWCKmXCYCZCLmMm0C1CNm2COmcZdZ3CPmeZfZQmgZ4C5C6CRm7CSmTm8ChZUmiZjZkZ9C!CVmlZmZnZ#CWmoZpZqZXmrZ$CYmsZ%C'CtZuZZmvZ0m(CwZ1mxZ)C2m*CyZ3mzZ+CAZBZCZ4m,C-CDZEZ5mFZGZ.CHZ6mIZJZ/C7mKZLZ:CMZNZ8mOZPZ;C9mQZ=C!mRZSZTZUZ?CVZ#mWZXZYZZZ@C0Z$m1Z2Z3Z4Z[C%m5Z6Z7Z8Z]C9Z!Z#Z'm$Z(m)m*m+m,m^C-m_C.m/m%Z`C:m{C;m'Z|C=m}C~C?m(ZaD@m)ZbD[mcD]mdD^meD_m*Z`mfD+Z,Z-Z.Z{m/Z:Z;ZgD=Z?Z@Z|m[Z]Z^ZhD_Z`Z{Z|Z}Z~Za0b0c0iD}md0e0f0~mjDg0ankDh0bncni0lDj0mDk0,fKfl0}bm0nDdnn0oDo0p0qbq0r0ens0t0u0v0w0fnx0gny0z0A0B0C0hnD0inE0F0jnpDG0knH0I0qDJ0lnrDmnK0L0nnM0N0O0P0Q0onR0pn-fqnS0T0rn~bacbcU0V0W0X0Y0Z00010c sntnun20vnwnxnsDyn30tDuDzn8g.f/f:f;fAn405060vD708090BnnhCnccdcwD!0DnxDSLGL0LEnecfcFn=fGn#0HnyD?f$0%09g1LgchcicIn'0(0)0*0+0,0-0.0/0:0;0=0?0Jn@0[0]0^0_0`0{0|0}0~0a1b1c1d1e1f1Kng1h1i1j1Lnk1l1Mnm1Nnn1o1p1Onq1r1s1Pnt1u1v1w1x1y1z1A1B1C1D1E1F1G1H1I1J1K1QnL1M1RnzDN1O1P1Q1SnR1S1T1U1V1W1X1Y1Z101112131415161718191!1#1Tn$1%1Un'1oh=yVnADWn(1)1@fph*1+1,1-1.1Xn/1:1BD;1=1?1Yn@1ZnCD[10n[f1n2n]1^1_1`1{13nDD4nE + F G H I J , 5nED]f6nFD7n|18n}19nGD~1a2b2c2d2e2f2!ng2h2HDjckcID#ni2j2JD$nk2%nl2KDm2|gn2'nLD^f(nMD)nNDrbsbtbK L ub*nOD+no2,nPD-np2q2r2s2_ft2u2v2w2x2y2z2A2B2C2D2E2F2G2H2I2J2K2L2M2N2O2P2Q2R2S2T2U2V2W2X2Y2Z202122232425262728292!2#2$2%2'2(2)2*2+2,2-2.2/2:2;2=2?2@2[2]2^2_2`2{2|2}2~2a3b3c3d3e3QD.nf3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3A3B3C3D3E3F3G3H3I3lcmcnc- ocpc. qcrcsc/nJ3`f:nRD;nSD{fK3L3M3N3=nO3P3TD?nQ3R3S3T3U3V3W3X3@n|f[nUDY3Z303132333435363738393!3]nVD#3$3%3'3(3)3*3+3,3-3.3/3:3;3=3?3@3[3]3^3_3`3{3^n|3}3_n~3`na4b4c4d4e4{nf4WD|ntc}ng4h4i4j4ucvcwc~ vbxc~nyczcwbM XDaok4YDbol4ZDcom40Ddon41Deoo42Dfop43Dgoq44Dhor45Dios46Djot47Dkou48Dlov49Dmow4x4y4!Dnoz4A4B4#DooC4D4E4$DpoF4G4%DqoH4I4'DroJ4K4(DsoL4M4)DtoN4O4*DuoP4Q4+DvoR4S4T4U4V4W4X4wo,DY4Z4xo-D04.Dyo142434445464/Dzo748494!4#4$4%4Ao:D'4(4Bo;D)4=DCo*4+4?DDo,4-4@DEo.4/4:4Fo;4=4?4@4[4]4Go^4_4`4Ho{4|4}4~4a5Iob5c5d5e5Jof5g5h5i5j5[Dk5Kol5m5Lo]Dn5!go5Mo^Dp5q5r5s5_DNot5`DOou5{DPov5|DQow5x5RoSoToUoy5VoWoXoczz5Yoqh?yrh@yshizA5B5C5D5E5F5G5H5I5J5K5}DL5M5N5O5P5Q5R5S5T5U5ZoV5W50oX5Y5Z5~D05152535455565758595!5#51o$5aEbE2o%5'5(5cE)5*53odE4o+55oeEfE,5i FeAc-5#g.5$g/5%g6o:5;5=5gE7o?5@5[5hE8oiE9o]5^5_5`5{5|5}5~5!oa6#ob6$oc6%ojE'okE(olE)omE*onEoE+opE,o-o.o/o:o;oqEd6=o?orEe6sEtE@o[ouE]ovEf6g6^oh6wEi6_oj6k6l6`om6n6{oo6p6q6r6s6t6|ou6v6w6xE}oyE~ozEapAEbpMLcpBEdpx6CEepDEfpEEgpFEy6GEhpz6ipA6HEjpB6IEkpC6JED6E6lpKELEF6mpG6H6npMEopI6J6K6NEppL6M6N6OEqpO6P6Q6R6PErpQEspREtpSEupTEvpUEVEwpxpWEypXEzpYEApZEBp0E1E2ECpDp3E4EEp5EFpS6T66EGpU6V6HpW67E8E9EIp!EJpKp#EX6LpY6Z606$E%EMp162636'ENp465666Op76(EPp86)E*E96!6Qp#6Rp+E$6Sp%6,ETp-E'6Up(6.E)6*6+6Vp/E:E,6-6Wp.6/6;E:6Xp;6=6=EYp?6@6?E[6]6Zp^6_6@E0p`6[E1p{6|6}6~6]Ea72pb7c7d7e7^Ef73pg7h7i7j7_E4pk7l7m7n7`Eo7p7q75pr76p7p8p9p!p{E#p|E$p%ps7}E'p~E(pt7aF)pbFcF*pu7dF+pv7eF,pfF-pgF.phF/pw7:piFx7y7z7A7;pB7C7D7jFE7F7G7=pH7I7J7kFK7L7M7N7O7P7Q7R7S7lF?pT7U7V7@pmFW7[pnFX7]p^pY7oFZ7pF07}fLf17Bc27qF_p37rF4757xb6777`p8797!7#7$7{p%7|p'7(7)7*7+7}p,7~p-7.7aqCcsF/7bq:7;7tF=7cquFdq?7@7eq[7]7^7_7`7fq{7gq~fhq|7}7iqDcEcFc~7a8b8c8d8e8f8g8d jqkqlqh8mqnqoqvFpqi8wFxFqq'gagbgcgdgrqj8k8l8yFm8n8o8sqthtqGcHczFp8uqAFTLHL2LvqIcJcwqegxqq8yqBFfgr8s8(g3LKcLcMczqt8u8v8w8x8y8z8A8B8C8D8E8F8AqG8H8I8J8K8L8M8N8O8P8Q8R8S8T8U8V8BqW8X8Y8Z8Cq0818Dq28Eq384858Fq687888Gq98!8#8$8%8'8(8)8*8+8,8-8.8/8:8;8=8?8Hq@8[8IqCF]8^8_8`8Jq{8|8}8~8a9b9c9d9e9f9g9h9i9j9k9l9m9n9o9p9q9Kqr9s9Lqt9uh[yMqDFNqu9v9ggvhw9x9y9z9A9OqB9C9EFD9E9F9PqG9QqFFH9RqhgSqTqI9J9K9L9M9UqGFVqN / O P Q R S : WqHFigXqIFYqN9ZqO90qJFP9Q9R9S9T9U9V91qW9X9KFNcOcLF2qY9Z9MF3q094q19NF29}g395qOFjg6qPF7qQFybzbAbT U Bb8qRF9q49!qSF#q59697989kg99!9#9$9%9'9(9)9*9+9,9-9.9/9:9;9=9?9@9[9]9^9_9`9{9|9}9~9a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!TF$qV!W!X!Y!Z!0!1!2!3!4!5!6!7!8!9!!!#!$!%!'!(!)!*!+!,!-!.!/!:!;!PcQcRc; ScTc= UcVcWc%q=!lg'qUF(qVFmg?!@![!]!)q^!_!WF*q`!{!|!}!~!a#b#c#+qng,qXFd#e#f#g#h#i#j#k#l#m#n#o#p#-qYFq#r#s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#.qN#O#/qP#:qQ#R#S#T#U#;qV#ZF=qXc?qW#X#Y#Z#YcZc0cabCb1c@q2c3cDbV 0F[q0#1F]q1#2F^q2#3F_q3#4F`q4#5F{q5#6F|q6#7F}q7#8F~q8#9Far9#!Fbr!##Fcr##$Fdr$#%#'#%Fer(#)#*#'Ffr+#,#-#(Fgr.#/#)Fhr:#;#*Fir=#?#+Fjr@#[#,Fkr]#^#-Flr_#`#.Fmr{#|#}#~#a$b$c$nr/Fd$e$or:Ff$;Fprg$h$i$j$k$l$=Fqrm$n$o$p$q$r$s$rr?Ft$u$sr@Fv$[Ftrw$x$]Fury$z$^FvrA$B$C$wrD$E$F$G$H$I$xrJ$K$L$yrM$N$O$P$Q$zrR$S$T$U$ArV$W$X$Y$Z$_F0$Br1$2$Cr`F3$)g4$Dr{F5$6$7$8$|FEr9$}FFr!$~FGr#$aGHr$$%$IrJrKrLr'$MrNrOrdz($Prwh]yxh^yyhjz)$*$+$,$-$.$/$:$;$=$?$bG@$[$]$^$_$`${$|$}$~$Qra%b%Rrc%d%e%cGf%g%h%i%j%k%l%m%n%o%p%q%Srr%dGeGTrs%t%u%fGv%w%UrgGVrx%WrhGiGy%j 9e4cz%*gA%+gB%,gXrC%D%E%jGYrF%G%H%kGZrlG0rI%J%K%L%M%N%O%P%1rQ%2rR%3rS%4rmG5rnG6roG7rpG8rqGrG9rsG!r#r$r%r'r(rtGT%)r*ruGU%vGwG+r,rxG-ryGV%W%.rX%zGY%/rZ%0%1%:r2%3%;r4%5%6%7%8%9%=r!%#%$%AG?rBG@rCG[rDG]rNL^rEG_r%%FG`rGG{rHG|rIG'%JG}r(%~r)%KGas*%LGbs+%MG,%-%csNGOG.%ds/%:%esPGfs;%=%?%QGgs@%[%]%RGhs^%_%`%{%SGisTGjsUGksVGlsWGmsXGYGnsosZGps0Gqs1Grs2Gss3G4G5Gtsus6G7Gvs8Gws|%}%9Gxs~%a'ysb'!G#G$Gzs%GAsBs'Gc'Csd'e'f'(G)GDsg'h'i'*GEsj'k'l'Fsm'+GGsn',G-Go'p'Hsq'Is.Gr'Jss'/GKs:Gt'Lsu';Gv'w'x'Ms=G?Gy'z'NsA'B'@GC'OsD'E'[GPsF'G']GH'I'QsJ'K'^GRsL'_GSsM'N'O'P'`GQ'TsR'S'T'U'{GV'UsW'X'Y'Z'|GVs0'1'2'3'}G4'5'6'Ws7'XsYsZs0s1s~G2saH3s4s8'bH5scH6s9'dH7seHfH8s!'gH9s#'hH!siH#sjH$skH%s$''slH%'''(')'(s*'+','mH-'.'/')s:';'='nH?'@'[']'^'_'`'{'|'oH*s}'~'a(+spHb(,sqHc(-s.sd(rHe(sHf(ogMfg(5ch(tH/si(uHj(k(Ebl(m(:sn(o(p(q(r(;ss(=st(u(v(w(x(?sy(@sz(A([s6cvHB(]sC(D(wHE(^sxH_sF(G(`sH(I(J(K(L({sM(|spg}sN(O(~s7c8c9cP(Q(R(S(T(U(V(W(e atbtctX(dtetftyHgtY(zHAHht-gqgrgsgtgitZ(0(1(BH2(3(4(jtzhkt!c#cCH5(ltDHULIL4Lmt$c%cntugot6(ptEHvg7(8(.g5L'c(c)cqt9(!(#($(%('((()(*(+(,(-(.(rt/(:(;(=(?(@([(](^(_(`({(|(}(~(a)stb)c)d)e)ttf)g)uth)vti)j)k)wtl)m)n)xto)p)q)r)s)t)u)v)w)x)y)z)A)B)C)D)E)F)ytG)H)ztFHI)J)K)L)AtM)N)O)P)Q)R)S)T)U)V)W)X)Y)Z)0)1)2)3)4)5)6)Bt7)8)Ct9)Ah_yDtGHEt!)#)wgBh$)%)')()))Ft*)+)HH,)-).)Gt/)HtIH:)ItxgJtKt;)=)?)@)[)LtJHMtW ? X Y Z 0 1 @ NtKHygOtLHPt])Qt^)RtMH_)`){)|)})~)a*Stb*c*NH*c+cOHTtd*e*PHUtf*Vtg*QHh*~gi*WtRHzgXtSHYtTHFbGbHb2 3 IbZtUH0tj*1tVH2tk*l*m*n*Ago*p*q*r*s*t*u*v*w*x*y*z*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*0*1*2*3*4*5*6*7*8*9*!*#*$*%*'*(*)***+*,*-*.*/*:*;*=*?*@*[*]*^*_*`*{*|*}*~*WH3ta+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D+,c-c.c[ /c:c] ;c=c?c4tE+Bg5tXH6tYHCgF+G+H+I+7tJ+K+ZH8tL+M+N+O+P+Q+R+S+9tDg!t0HT+U+V+W+X+Y+Z+0+1+2+3+4+5+#t1H6+7+8+9+!+#+$+%+'+(+)+*+++,+-+.+/+:+;+=+?+@+[+$t]+^+%t_+'t`+{+|+}+~+(ta,2H)t@c*tb,c,d,e,[c]c^cbbJb_c+t`c{cKb4 3H,tf,4H-tg,5H.th,6H/ti,7H:tj,8H;tk,9H=tl,!H?tm,#H@tn,$H[to,%H]tp,'H^tq,(H_tr,s,t,)H`tu,v,w,*H{tx,y,z,+H|tA,B,,H}tC,D,-H~tE,F,.HauG,H,/HbuI,J,:HcuK,L,;HduM,N,O,P,Q,R,S,eu=HT,U,fu?HV,@HguW,X,Y,Z,0,1,[Hhu2,3,4,5,6,7,8,iu]H9,!,ju^H#,_Hku$,%,`Hlu',(,{Hmu),*,+,nu,,-,.,/,:,;,ou=,?,@,pu[,],^,_,`,qu{,|,},~,rua-b-c-d-e-|Hf-sug-h-tu}Hi-/gj-uu~Hk-l-m-n-aIvuo-bIwup-cIxuq-dIyur-s-zuAuBuCut-DuEuFuezu-GuCh`yDh{yEhkzv-w-x-y-z-A-B-C-D-E-F-eIG-H-I-J-K-L-M-N-O-P-HuQ-R-IuS-T-U-fIV-W-X-Y-Z-0-1-2-3-4-5-6-Ju7-gIhIKu8-9-!-iI#-$-LujIMu%-NukIlI'-k cf|c(-:g)-;g*-=gOu+-,---mIPu.-/-:-nIQuoIRu;-=-?-@-[-]-^-_-Su`-Tu{-Uu|-VupIWuqIXurIYusIZutIuI0uvI1u2u3u4u5u6uwI}-7u8uxI~-yIzI9u!uAI#uBIa.b.$uc.CId.%ue.f.g.'uh.i.(uj.k.l.m.n.o.)up.q.r.DI*uEI+uFI,uGI-uOL.uHI/us.II:uJI;uKI=uLIt.MI?uu.@uv.NI[uw.OI]ux.PIy.z.^uQIRIA._uB.C.`uSI{uD.E.F.TI|uG.H.I.UI}uJ.K.L.M.VI~uWIavXIbvYIcvZIdv0I1Ievfv2Igv3Ihv4Iiv5Ijv6I7I8Ikvlv9I!Imv#InvN.O.$IovP.Q.pvR.%I'I(Iqv)Irvsv*IS.tvT.U.V.+I,IuvW.X.Y.-IvvZ.0.1.wv2..Ixv3./I:I4.5.yv6.zv;I7.Av8.=IBv?I9.Cv!.@I#.$.%.Dv[I]I'.(.Ev).*.^I+.Fv,.-._IGv../.`I:.;.Hv=.?.{IIv@.|IJv[.].^._.}I`.Kv{.|.}.~.~Ia/Lvb/c/d/e/aJMvf/g/h/i/bJj/k/l/Nvm/OvPvQvRvSvcJTvdJUvVvn/eJWvfJXvo/gJYvhJiJZvp/jJ0vq/kJ1vlJ2vmJ3vnJ4vr/5voJs/t/u/v/6vw/x/y/pJz/A/B/7vC/D/E/qJF/G/H/I/J/K/L/M/N/rJ8vO/P/Q/9vsJR/!vtJS/#v$vT/uJU/vJV/EgNfW/}cX/wJ%vY/xJZ/0/Lb1/2/'v3/4/5/6/7/(v8/)v9/!/#/$/%/*v'/+v(/)/,v~cyJ*/-v+/,/zJ-/.vAJ/v.///:v:/;/=/?/@/;v[/=vFg?v]/^/@vadbdcd_/`/{/|/}/~/a:b:f [v]v^vc:_v`v{vBJ|vd:CJDJ}v?gGgHgIgJg~ve:f:g:EJh:i:j:awFhbwddedFJk:cwGJVLJL6LdwfdgdewKgfwl:gwHJLgm:n:@g7Lhdidjdhwo:p:q:r:s:t:u:v:w:x:y:z:A:iwB:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:jwR:S:T:U:kwV:W:lwX:mwY:Z:0:nw1:2:3:ow4:5:6:7:8:9:!:#:$:%:':(:):*:+:,:-:.:pw/:::qwIJ;:=:?:@:rw[:]:^:_:`:{:|:}:~:a;b;c;d;e;f;g;h;i;j;k;l;swm;n;two;Gh|yuwJJvwp;q;MgHhr;s;t;u;v;www;x;KJy;z;A;xwB;ywLJC;zwNgAwBwD;E;F;G;H;CwMJDw5 ^ 6 7 8 9 ! _ EwNJOgFwOJGwI;HwJ;IwPJK;L;M;N;O;P;Q;JwR;S;QJkdldRJKwT;U;SJLwV;MwW;TJX;ahY;NwUJPgOwVJPwWJMbNbOb# $ PbQwXJRwZ;SwYJTw0;1;2;3;Qg4;5;6;7;8;9;!;#;$;%;';(;);*;+;,;-;.;/;:;;;=;?;@;[;];^;_;`;{;|;};~;a=b=c=d=e=f=g=h=i=j=k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z=A=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=ZJUwQ=R=S=T=U=V=W=X=Y=Z=0=1=2=3=4=5=6=7=8=9=!=#=$=%='=(=)=*=+=,=mdndod` pdqd{ rdsdtdVw-=RgWw0JXw1JSg.=/=:=;=Yw==?=2JZw@=[=]=^=_=`={=|=0wTg1w3J}=~=a?b?c?d?e?f?g?h?i?j?k?2w4Jl?m?n?o?p?q?r?s?t?u?v?w?x?y?z?A?B?C?D?E?F?G?H?3wI?J?4wK?5wL?M?N?O?P?6wQ?5J7wud8wR?S?T?U?vdwdxdcbQbyd9wzdAdRb% 6J!wV?7J#wW?8J$wX?9J%wY?!J'wZ?#J(w0?$J)w1?%J*w2?'J+w3?(J,w4?)J-w5?*J.w6?+J/w7?8?9?,J:w!?#?$?-J;w%?'?(?.J=w)?*?/J?w+?,?:J@w-?.?;J[w/?:?=J]w;?=??J^w??@?@J_w[?]?^?_?`?{?|?`w[J}?~?{w]Ja@^J|wb@c@d@e@f@g@_J}wh@i@j@k@l@m@n@~w`Jo@p@ax{Jq@|Jbxr@s@}Jcxt@u@~Jdxv@w@x@exy@z@A@B@C@D@fxE@F@G@gxH@I@J@K@L@hxM@N@O@P@ixQ@R@S@T@U@aKV@jxW@X@kxbKY@[gZ@lxcK0@1@2@3@dKmx4@eKnx5@fKox6@gKpx7@8@qxrxsxtx9@uxvxwxfz!@xxIh}yJh~yKhlz#@$@%@'@(@)@*@+@,@-@.@hK/@:@;@=@?@@@[@]@^@_@yx`@{@zx|@}@~@iKa[b[c[d[e[f[g[h[i[j[k[l[Axm[jKkKBxn[o[p[lKq[r[CxmKDxs[ExnKoKt[l GfBdu[]gv[^gw[_gFxx[y[z[pKGxA[B[C[qKHxrKIxD[E[F[G[H[I[J[K[JxL[KxM[LxN[MxsKNxtKOxuKPxvKQxwKxKRxyKSxTxUxVxWxXxzKO[YxZxAKP[BKCK0x1xDK2xEKQ[R[3xS[FKT[4xU[V[W[5xX[Y[6xZ[0[1[2[3[4[7x5[6[7[GK8xHK9xIK!xJK#xPL$xKK%x8[LK'xMK(xNK)xOK9[PK*x![+x#[QK,x$[RK-x%[SK'[([.xTKUK)[/x*[+[:xVK;x,[-[.[WK=x/[:[;[XK?x=[?[@[[[YK@xZK[x0K]x1K^x2K_x3K4K`x{x5K|x6K}x7K~x8Kay9K!K#Kbycy$K%Kdy'Key][^[(Kfy_[`[gy{[)K*K+Khy,Kiyjy-K|[ky}[~[a].K/Klyb]c]d]:Kmye]f]g]nyh];Koyi]=K?Kj]k]pyl]qy@Km]ryn][Ksy]Ko]typ]^Kq]r]s]uy_K`Kt]u]vyv]w]{Kx]wyy]z]|KxyA]B]}KC]D]yyE]F]~KzyG]aLAyH]I]J]K]bLL]ByM]N]O]P]cLQ]CyR]S]T]U]dLDyV]W]X]Y]eLZ]0]1]Ey2]FyGyHyIyJyfLKygLLyMy3]hLNyiLOy4]jLPykLlLQy5]mLRy6]nLSyoLTypLUyqLVy7]WyrL8]9]!]#]Xy$]%]']sL(])]*]Yy+],]-]tL.]/]:];]=]?]@][]]]uLZy^]_]`]0yvL{]1ywL|]2y3y}]xL~]yLa^UgOfb^Cdc^zL4yd^ALe^f^Sbg^h^5yi^j^k^l^m^6yn^7yo^p^q^r^s^8yt^9yu^v^!yDdBLw^#yx^y^CLz^$yDL%yA^B^'yC^D^E^F^G^(yH^)yVg*yI^J^+yEdFdGdK^L^M^N^O^P^Q^R^

1134 

1135 def add_api_route( 1abcdef

1136 self, 

1137 path: str, 

1138 endpoint: Callable[..., Any], 

1139 *, 

1140 response_model: Any = Default(None), 

1141 status_code: Optional[int] = None, 

1142 tags: Optional[List[Union[str, Enum]]] = None, 

1143 dependencies: Optional[Sequence[Depends]] = None, 

1144 summary: Optional[str] = None, 

1145 description: Optional[str] = None, 

1146 response_description: str = "Successful Response", 

1147 responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, 

1148 deprecated: Optional[bool] = None, 

1149 methods: Optional[List[str]] = None, 

1150 operation_id: Optional[str] = None, 

1151 response_model_include: Optional[IncEx] = None, 

1152 response_model_exclude: Optional[IncEx] = None, 

1153 response_model_by_alias: bool = True, 

1154 response_model_exclude_unset: bool = False, 

1155 response_model_exclude_defaults: bool = False, 

1156 response_model_exclude_none: bool = False, 

1157 include_in_schema: bool = True, 

1158 response_class: Union[Type[Response], DefaultPlaceholder] = Default( 

1159 JSONResponse 

1160 ), 

1161 name: Optional[str] = None, 

1162 openapi_extra: Optional[Dict[str, Any]] = None, 

1163 generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( 

1164 generate_unique_id 

1165 ), 

1166 ) -> None: 

1167 self.router.add_api_route( 1abcdef

1168 path, 

1169 endpoint=endpoint, 

1170 response_model=response_model, 

1171 status_code=status_code, 

1172 tags=tags, 

1173 dependencies=dependencies, 

1174 summary=summary, 

1175 description=description, 

1176 response_description=response_description, 

1177 responses=responses, 

1178 deprecated=deprecated, 

1179 methods=methods, 

1180 operation_id=operation_id, 

1181 response_model_include=response_model_include, 

1182 response_model_exclude=response_model_exclude, 

1183 response_model_by_alias=response_model_by_alias, 

1184 response_model_exclude_unset=response_model_exclude_unset, 

1185 response_model_exclude_defaults=response_model_exclude_defaults, 

1186 response_model_exclude_none=response_model_exclude_none, 

1187 include_in_schema=include_in_schema, 

1188 response_class=response_class, 

1189 name=name, 

1190 openapi_extra=openapi_extra, 

1191 generate_unique_id_function=generate_unique_id_function, 

1192 ) 

1193 

1194 def api_route( 1abcdef

1195 self, 

1196 path: str, 

1197 *, 

1198 response_model: Any = Default(None), 

1199 status_code: Optional[int] = None, 

1200 tags: Optional[List[Union[str, Enum]]] = None, 

1201 dependencies: Optional[Sequence[Depends]] = None, 

1202 summary: Optional[str] = None, 

1203 description: Optional[str] = None, 

1204 response_description: str = "Successful Response", 

1205 responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, 

1206 deprecated: Optional[bool] = None, 

1207 methods: Optional[List[str]] = None, 

1208 operation_id: Optional[str] = None, 

1209 response_model_include: Optional[IncEx] = None, 

1210 response_model_exclude: Optional[IncEx] = None, 

1211 response_model_by_alias: bool = True, 

1212 response_model_exclude_unset: bool = False, 

1213 response_model_exclude_defaults: bool = False, 

1214 response_model_exclude_none: bool = False, 

1215 include_in_schema: bool = True, 

1216 response_class: Type[Response] = Default(JSONResponse), 

1217 name: Optional[str] = None, 

1218 openapi_extra: Optional[Dict[str, Any]] = None, 

1219 generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( 

1220 generate_unique_id 

1221 ), 

1222 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

1223 def decorator(func: DecoratedCallable) -> DecoratedCallable: 1abcdef

1224 self.router.add_api_route( 1abcdef

1225 path, 

1226 func, 

1227 response_model=response_model, 

1228 status_code=status_code, 

1229 tags=tags, 

1230 dependencies=dependencies, 

1231 summary=summary, 

1232 description=description, 

1233 response_description=response_description, 

1234 responses=responses, 

1235 deprecated=deprecated, 

1236 methods=methods, 

1237 operation_id=operation_id, 

1238 response_model_include=response_model_include, 

1239 response_model_exclude=response_model_exclude, 

1240 response_model_by_alias=response_model_by_alias, 

1241 response_model_exclude_unset=response_model_exclude_unset, 

1242 response_model_exclude_defaults=response_model_exclude_defaults, 

1243 response_model_exclude_none=response_model_exclude_none, 

1244 include_in_schema=include_in_schema, 

1245 response_class=response_class, 

1246 name=name, 

1247 openapi_extra=openapi_extra, 

1248 generate_unique_id_function=generate_unique_id_function, 

1249 ) 

1250 return func 1abcdef

1251 

1252 return decorator 1abcdef

1253 

1254 def add_api_websocket_route( 1abcdef

1255 self, 

1256 path: str, 

1257 endpoint: Callable[..., Any], 

1258 name: Optional[str] = None, 

1259 *, 

1260 dependencies: Optional[Sequence[Depends]] = None, 

1261 ) -> None: 

1262 self.router.add_api_websocket_route( 1abcdef

1263 path, 

1264 endpoint, 

1265 name=name, 

1266 dependencies=dependencies, 

1267 ) 

1268 

1269 def websocket( 1abcdef

1270 self, 

1271 path: Annotated[ 

1272 str, 

1273 Doc( 

1274 """ 

1275 WebSocket path. 

1276 """ 

1277 ), 

1278 ], 

1279 name: Annotated[ 

1280 Optional[str], 

1281 Doc( 

1282 """ 

1283 A name for the WebSocket. Only used internally. 

1284 """ 

1285 ), 

1286 ] = None, 

1287 *, 

1288 dependencies: Annotated[ 

1289 Optional[Sequence[Depends]], 

1290 Doc( 

1291 """ 

1292 A list of dependencies (using `Depends()`) to be used for this 

1293 WebSocket. 

1294 

1295 Read more about it in the 

1296 [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). 

1297 """ 

1298 ), 

1299 ] = None, 

1300 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

1301 """ 

1302 Decorate a WebSocket function. 

1303 

1304 Read more about it in the 

1305 [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). 

1306 

1307 **Example** 

1308 

1309 ```python 

1310 from fastapi import FastAPI, WebSocket 

1311 

1312 app = FastAPI() 

1313 

1314 @app.websocket("/ws") 

1315 async def websocket_endpoint(websocket: WebSocket): 

1316 await websocket.accept() 

1317 while True: 

1318 data = await websocket.receive_text() 

1319 await websocket.send_text(f"Message text was: {data}") 

1320 ``` 

1321 """ 

1322 

1323 def decorator(func: DecoratedCallable) -> DecoratedCallable: 1abcdef

1324 self.add_api_websocket_route( 1abcdef

1325 path, 

1326 func, 

1327 name=name, 

1328 dependencies=dependencies, 

1329 ) 

1330 return func 1abcdef

1331 

1332 return decorator 1abcdef

1333 

1334 def include_router( 1abcdef

1335 self, 

1336 router: Annotated[routing.APIRouter, Doc("The `APIRouter` to include.")], 

1337 *, 

1338 prefix: Annotated[str, Doc("An optional path prefix for the router.")] = "", 

1339 tags: Annotated[ 

1340 Optional[List[Union[str, Enum]]], 

1341 Doc( 

1342 """ 

1343 A list of tags to be applied to all the *path operations* in this 

1344 router. 

1345 

1346 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1347 

1348 Read more about it in the 

1349 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

1350 """ 

1351 ), 

1352 ] = None, 

1353 dependencies: Annotated[ 

1354 Optional[Sequence[Depends]], 

1355 Doc( 

1356 """ 

1357 A list of dependencies (using `Depends()`) to be applied to all the 

1358 *path operations* in this router. 

1359 

1360 Read more about it in the 

1361 [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). 

1362 

1363 **Example** 

1364 

1365 ```python 

1366 from fastapi import Depends, FastAPI 

1367 

1368 from .dependencies import get_token_header 

1369 from .internal import admin 

1370 

1371 app = FastAPI() 

1372 

1373 app.include_router( 

1374 admin.router, 

1375 dependencies=[Depends(get_token_header)], 

1376 ) 

1377 ``` 

1378 """ 

1379 ), 

1380 ] = None, 

1381 responses: Annotated[ 

1382 Optional[Dict[Union[int, str], Dict[str, Any]]], 

1383 Doc( 

1384 """ 

1385 Additional responses to be shown in OpenAPI. 

1386 

1387 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1388 

1389 Read more about it in the 

1390 [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/). 

1391 

1392 And in the 

1393 [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). 

1394 """ 

1395 ), 

1396 ] = None, 

1397 deprecated: Annotated[ 

1398 Optional[bool], 

1399 Doc( 

1400 """ 

1401 Mark all the *path operations* in this router as deprecated. 

1402 

1403 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1404 

1405 **Example** 

1406 

1407 ```python 

1408 from fastapi import FastAPI 

1409 

1410 from .internal import old_api 

1411 

1412 app = FastAPI() 

1413 

1414 app.include_router( 

1415 old_api.router, 

1416 deprecated=True, 

1417 ) 

1418 ``` 

1419 """ 

1420 ), 

1421 ] = None, 

1422 include_in_schema: Annotated[ 

1423 bool, 

1424 Doc( 

1425 """ 

1426 Include (or not) all the *path operations* in this router in the 

1427 generated OpenAPI schema. 

1428 

1429 This affects the generated OpenAPI (e.g. visible at `/docs`). 

1430 

1431 **Example** 

1432 

1433 ```python 

1434 from fastapi import FastAPI 

1435 

1436 from .internal import old_api 

1437 

1438 app = FastAPI() 

1439 

1440 app.include_router( 

1441 old_api.router, 

1442 include_in_schema=False, 

1443 ) 

1444 ``` 

1445 """ 

1446 ), 

1447 ] = True, 

1448 default_response_class: Annotated[ 

1449 Type[Response], 

1450 Doc( 

1451 """ 

1452 Default response class to be used for the *path operations* in this 

1453 router. 

1454 

1455 Read more in the 

1456 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class). 

1457 

1458 **Example** 

1459 

1460 ```python 

1461 from fastapi import FastAPI 

1462 from fastapi.responses import ORJSONResponse 

1463 

1464 from .internal import old_api 

1465 

1466 app = FastAPI() 

1467 

1468 app.include_router( 

1469 old_api.router, 

1470 default_response_class=ORJSONResponse, 

1471 ) 

1472 ``` 

1473 """ 

1474 ), 

1475 ] = Default(JSONResponse), 

1476 callbacks: Annotated[ 

1477 Optional[List[BaseRoute]], 

1478 Doc( 

1479 """ 

1480 List of *path operations* that will be used as OpenAPI callbacks. 

1481 

1482 This is only for OpenAPI documentation, the callbacks won't be used 

1483 directly. 

1484 

1485 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1486 

1487 Read more about it in the 

1488 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). 

1489 """ 

1490 ), 

1491 ] = None, 

1492 generate_unique_id_function: Annotated[ 

1493 Callable[[routing.APIRoute], str], 

1494 Doc( 

1495 """ 

1496 Customize the function used to generate unique IDs for the *path 

1497 operations* shown in the generated OpenAPI. 

1498 

1499 This is particularly useful when automatically generating clients or 

1500 SDKs for your API. 

1501 

1502 Read more about it in the 

1503 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

1504 """ 

1505 ), 

1506 ] = Default(generate_unique_id), 

1507 ) -> None: 

1508 """ 

1509 Include an `APIRouter` in the same app. 

1510 

1511 Read more about it in the 

1512 [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/). 

1513 

1514 ## Example 

1515 

1516 ```python 

1517 from fastapi import FastAPI 

1518 

1519 from .users import users_router 

1520 

1521 app = FastAPI() 

1522 

1523 app.include_router(users_router) 

1524 ``` 

1525 """ 

1526 self.router.include_router( 2a UbS^m n o p q r 6b7b| hb8b9b!b%b'b(bb *bT^v w x y z A ]b^b} ob_b`b{b~bacbcc dcU^E F G H I J vcwc~ vbxcyczcDcEcFcd HcV^N O P Q R S Zc0cabCb1c2c3c7c8c9ce #cW^W X Y Z 0 1 ]c^cbbJb_c`c{cadbdcdf edX^5 6 7 8 9 ! wdxdcbQbydzdAdEdFdGd

1527 router, 

1528 prefix=prefix, 

1529 tags=tags, 

1530 dependencies=dependencies, 

1531 responses=responses, 

1532 deprecated=deprecated, 

1533 include_in_schema=include_in_schema, 

1534 default_response_class=default_response_class, 

1535 callbacks=callbacks, 

1536 generate_unique_id_function=generate_unique_id_function, 

1537 ) 

1538 

1539 def get( 1abcdef

1540 self, 

1541 path: Annotated[ 

1542 str, 

1543 Doc( 

1544 """ 

1545 The URL path to be used for this *path operation*. 

1546 

1547 For example, in `http://example.com/items`, the path is `/items`. 

1548 """ 

1549 ), 

1550 ], 

1551 *, 

1552 response_model: Annotated[ 

1553 Any, 

1554 Doc( 

1555 """ 

1556 The type to use for the response. 

1557 

1558 It could be any valid Pydantic *field* type. So, it doesn't have to 

1559 be a Pydantic model, it could be other things, like a `list`, `dict`, 

1560 etc. 

1561 

1562 It will be used for: 

1563 

1564 * Documentation: the generated OpenAPI (and the UI at `/docs`) will 

1565 show it as the response (JSON Schema). 

1566 * Serialization: you could return an arbitrary object and the 

1567 `response_model` would be used to serialize that object into the 

1568 corresponding JSON. 

1569 * Filtering: the JSON sent to the client will only contain the data 

1570 (fields) defined in the `response_model`. If you returned an object 

1571 that contains an attribute `password` but the `response_model` does 

1572 not include that field, the JSON sent to the client would not have 

1573 that `password`. 

1574 * Validation: whatever you return will be serialized with the 

1575 `response_model`, converting any data as necessary to generate the 

1576 corresponding JSON. But if the data in the object returned is not 

1577 valid, that would mean a violation of the contract with the client, 

1578 so it's an error from the API developer. So, FastAPI will raise an 

1579 error and return a 500 error code (Internal Server Error). 

1580 

1581 Read more about it in the 

1582 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). 

1583 """ 

1584 ), 

1585 ] = Default(None), 

1586 status_code: Annotated[ 

1587 Optional[int], 

1588 Doc( 

1589 """ 

1590 The default status code to be used for the response. 

1591 

1592 You could override the status code by returning a response directly. 

1593 

1594 Read more about it in the 

1595 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). 

1596 """ 

1597 ), 

1598 ] = None, 

1599 tags: Annotated[ 

1600 Optional[List[Union[str, Enum]]], 

1601 Doc( 

1602 """ 

1603 A list of tags to be applied to the *path operation*. 

1604 

1605 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1606 

1607 Read more about it in the 

1608 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). 

1609 """ 

1610 ), 

1611 ] = None, 

1612 dependencies: Annotated[ 

1613 Optional[Sequence[Depends]], 

1614 Doc( 

1615 """ 

1616 A list of dependencies (using `Depends()`) to be applied to the 

1617 *path operation*. 

1618 

1619 Read more about it in the 

1620 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). 

1621 """ 

1622 ), 

1623 ] = None, 

1624 summary: Annotated[ 

1625 Optional[str], 

1626 Doc( 

1627 """ 

1628 A summary for the *path operation*. 

1629 

1630 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1631 

1632 Read more about it in the 

1633 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

1634 """ 

1635 ), 

1636 ] = None, 

1637 description: Annotated[ 

1638 Optional[str], 

1639 Doc( 

1640 """ 

1641 A description for the *path operation*. 

1642 

1643 If not provided, it will be extracted automatically from the docstring 

1644 of the *path operation function*. 

1645 

1646 It can contain Markdown. 

1647 

1648 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1649 

1650 Read more about it in the 

1651 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

1652 """ 

1653 ), 

1654 ] = None, 

1655 response_description: Annotated[ 

1656 str, 

1657 Doc( 

1658 """ 

1659 The description for the default response. 

1660 

1661 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1662 """ 

1663 ), 

1664 ] = "Successful Response", 

1665 responses: Annotated[ 

1666 Optional[Dict[Union[int, str], Dict[str, Any]]], 

1667 Doc( 

1668 """ 

1669 Additional responses that could be returned by this *path operation*. 

1670 

1671 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1672 """ 

1673 ), 

1674 ] = None, 

1675 deprecated: Annotated[ 

1676 Optional[bool], 

1677 Doc( 

1678 """ 

1679 Mark this *path operation* as deprecated. 

1680 

1681 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1682 """ 

1683 ), 

1684 ] = None, 

1685 operation_id: Annotated[ 

1686 Optional[str], 

1687 Doc( 

1688 """ 

1689 Custom operation ID to be used by this *path operation*. 

1690 

1691 By default, it is generated automatically. 

1692 

1693 If you provide a custom operation ID, you need to make sure it is 

1694 unique for the whole API. 

1695 

1696 You can customize the 

1697 operation ID generation with the parameter 

1698 `generate_unique_id_function` in the `FastAPI` class. 

1699 

1700 Read more about it in the 

1701 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

1702 """ 

1703 ), 

1704 ] = None, 

1705 response_model_include: Annotated[ 

1706 Optional[IncEx], 

1707 Doc( 

1708 """ 

1709 Configuration passed to Pydantic to include only certain fields in the 

1710 response data. 

1711 

1712 Read more about it in the 

1713 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

1714 """ 

1715 ), 

1716 ] = None, 

1717 response_model_exclude: Annotated[ 

1718 Optional[IncEx], 

1719 Doc( 

1720 """ 

1721 Configuration passed to Pydantic to exclude certain fields in the 

1722 response data. 

1723 

1724 Read more about it in the 

1725 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

1726 """ 

1727 ), 

1728 ] = None, 

1729 response_model_by_alias: Annotated[ 

1730 bool, 

1731 Doc( 

1732 """ 

1733 Configuration passed to Pydantic to define if the response model 

1734 should be serialized by alias when an alias is used. 

1735 

1736 Read more about it in the 

1737 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

1738 """ 

1739 ), 

1740 ] = True, 

1741 response_model_exclude_unset: Annotated[ 

1742 bool, 

1743 Doc( 

1744 """ 

1745 Configuration passed to Pydantic to define if the response data 

1746 should have all the fields, including the ones that were not set and 

1747 have their default values. This is different from 

1748 `response_model_exclude_defaults` in that if the fields are set, 

1749 they will be included in the response, even if the value is the same 

1750 as the default. 

1751 

1752 When `True`, default values are omitted from the response. 

1753 

1754 Read more about it in the 

1755 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

1756 """ 

1757 ), 

1758 ] = False, 

1759 response_model_exclude_defaults: Annotated[ 

1760 bool, 

1761 Doc( 

1762 """ 

1763 Configuration passed to Pydantic to define if the response data 

1764 should have all the fields, including the ones that have the same value 

1765 as the default. This is different from `response_model_exclude_unset` 

1766 in that if the fields are set but contain the same default values, 

1767 they will be excluded from the response. 

1768 

1769 When `True`, default values are omitted from the response. 

1770 

1771 Read more about it in the 

1772 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

1773 """ 

1774 ), 

1775 ] = False, 

1776 response_model_exclude_none: Annotated[ 

1777 bool, 

1778 Doc( 

1779 """ 

1780 Configuration passed to Pydantic to define if the response data should 

1781 exclude fields set to `None`. 

1782 

1783 This is much simpler (less smart) than `response_model_exclude_unset` 

1784 and `response_model_exclude_defaults`. You probably want to use one of 

1785 those two instead of this one, as those allow returning `None` values 

1786 when it makes sense. 

1787 

1788 Read more about it in the 

1789 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). 

1790 """ 

1791 ), 

1792 ] = False, 

1793 include_in_schema: Annotated[ 

1794 bool, 

1795 Doc( 

1796 """ 

1797 Include this *path operation* in the generated OpenAPI schema. 

1798 

1799 This affects the generated OpenAPI (e.g. visible at `/docs`). 

1800 

1801 Read more about it in the 

1802 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). 

1803 """ 

1804 ), 

1805 ] = True, 

1806 response_class: Annotated[ 

1807 Type[Response], 

1808 Doc( 

1809 """ 

1810 Response class to be used for this *path operation*. 

1811 

1812 This will not be used if you return a response directly. 

1813 

1814 Read more about it in the 

1815 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). 

1816 """ 

1817 ), 

1818 ] = Default(JSONResponse), 

1819 name: Annotated[ 

1820 Optional[str], 

1821 Doc( 

1822 """ 

1823 Name for this *path operation*. Only used internally. 

1824 """ 

1825 ), 

1826 ] = None, 

1827 callbacks: Annotated[ 

1828 Optional[List[BaseRoute]], 

1829 Doc( 

1830 """ 

1831 List of *path operations* that will be used as OpenAPI callbacks. 

1832 

1833 This is only for OpenAPI documentation, the callbacks won't be used 

1834 directly. 

1835 

1836 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1837 

1838 Read more about it in the 

1839 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). 

1840 """ 

1841 ), 

1842 ] = None, 

1843 openapi_extra: Annotated[ 

1844 Optional[Dict[str, Any]], 

1845 Doc( 

1846 """ 

1847 Extra metadata to be included in the OpenAPI schema for this *path 

1848 operation*. 

1849 

1850 Read more about it in the 

1851 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). 

1852 """ 

1853 ), 

1854 ] = None, 

1855 generate_unique_id_function: Annotated[ 

1856 Callable[[routing.APIRoute], str], 

1857 Doc( 

1858 """ 

1859 Customize the function used to generate unique IDs for the *path 

1860 operations* shown in the generated OpenAPI. 

1861 

1862 This is particularly useful when automatically generating clients or 

1863 SDKs for your API. 

1864 

1865 Read more about it in the 

1866 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

1867 """ 

1868 ), 

1869 ] = Default(generate_unique_id), 

1870 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

1871 """ 

1872 Add a *path operation* using an HTTP GET operation. 

1873 

1874 ## Example 

1875 

1876 ```python 

1877 from fastapi import FastAPI 

1878 

1879 app = FastAPI() 

1880 

1881 @app.get("/items/") 

1882 def read_items(): 

1883 return [{"name": "Empanada"}, {"name": "Arepa"}] 

1884 ``` 

1885 """ 

1886 return self.router.get( 2a bhY^TbYbZb0b1bHdIdJdKdLdMdNdOdPdQdRddbebfbs t gb3d4d5d6d7d4b5b| hbibu g 8d#b9d!d$bjbb hhZ^)b.b/b:b;b#d$d%d'd(d)d*d+d,d-d.dkblbmbB C nb{d|d}d~dae@b[b} obpbD h be|bcede}bqbc nh0^cchcicjckceefegeheiejekelemeneoerbsbtbK L ub. qcrcscAeBeCeDeEetcuc~ vbwbM i FeAcGeHeBcxbd th1^GcLcMcNcOcIeJeKeLeMeNeOePeQeReSeybzbAbT U Bb= UcVcWc4e5e6e7e8eXcYcabCbDbV j 9e4c!e#e5cEbe zh2^!c(c)c*c+c$e%e'e(e)e*e+e,e-e.e/eFbGbHb2 3 Ib] ;c=c?c|e}e~eafbf@c[cbbJbKb4 k cf|cdfef}cLbf Fh3^ddidjdkdldffgfhfifjfkflfmfnfofpfMbNbOb# $ Pb{ rdsdtdBfCfDfEfFfudvdcbQbRb% l GfBdHfIfCdSb

1887 path, 

1888 response_model=response_model, 

1889 status_code=status_code, 

1890 tags=tags, 

1891 dependencies=dependencies, 

1892 summary=summary, 

1893 description=description, 

1894 response_description=response_description, 

1895 responses=responses, 

1896 deprecated=deprecated, 

1897 operation_id=operation_id, 

1898 response_model_include=response_model_include, 

1899 response_model_exclude=response_model_exclude, 

1900 response_model_by_alias=response_model_by_alias, 

1901 response_model_exclude_unset=response_model_exclude_unset, 

1902 response_model_exclude_defaults=response_model_exclude_defaults, 

1903 response_model_exclude_none=response_model_exclude_none, 

1904 include_in_schema=include_in_schema, 

1905 response_class=response_class, 

1906 name=name, 

1907 callbacks=callbacks, 

1908 openapi_extra=openapi_extra, 

1909 generate_unique_id_function=generate_unique_id_function, 

1910 ) 

1911 

1912 def put( 1abcdef

1913 self, 

1914 path: Annotated[ 

1915 str, 

1916 Doc( 

1917 """ 

1918 The URL path to be used for this *path operation*. 

1919 

1920 For example, in `http://example.com/items`, the path is `/items`. 

1921 """ 

1922 ), 

1923 ], 

1924 *, 

1925 response_model: Annotated[ 

1926 Any, 

1927 Doc( 

1928 """ 

1929 The type to use for the response. 

1930 

1931 It could be any valid Pydantic *field* type. So, it doesn't have to 

1932 be a Pydantic model, it could be other things, like a `list`, `dict`, 

1933 etc. 

1934 

1935 It will be used for: 

1936 

1937 * Documentation: the generated OpenAPI (and the UI at `/docs`) will 

1938 show it as the response (JSON Schema). 

1939 * Serialization: you could return an arbitrary object and the 

1940 `response_model` would be used to serialize that object into the 

1941 corresponding JSON. 

1942 * Filtering: the JSON sent to the client will only contain the data 

1943 (fields) defined in the `response_model`. If you returned an object 

1944 that contains an attribute `password` but the `response_model` does 

1945 not include that field, the JSON sent to the client would not have 

1946 that `password`. 

1947 * Validation: whatever you return will be serialized with the 

1948 `response_model`, converting any data as necessary to generate the 

1949 corresponding JSON. But if the data in the object returned is not 

1950 valid, that would mean a violation of the contract with the client, 

1951 so it's an error from the API developer. So, FastAPI will raise an 

1952 error and return a 500 error code (Internal Server Error). 

1953 

1954 Read more about it in the 

1955 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). 

1956 """ 

1957 ), 

1958 ] = Default(None), 

1959 status_code: Annotated[ 

1960 Optional[int], 

1961 Doc( 

1962 """ 

1963 The default status code to be used for the response. 

1964 

1965 You could override the status code by returning a response directly. 

1966 

1967 Read more about it in the 

1968 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). 

1969 """ 

1970 ), 

1971 ] = None, 

1972 tags: Annotated[ 

1973 Optional[List[Union[str, Enum]]], 

1974 Doc( 

1975 """ 

1976 A list of tags to be applied to the *path operation*. 

1977 

1978 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

1979 

1980 Read more about it in the 

1981 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). 

1982 """ 

1983 ), 

1984 ] = None, 

1985 dependencies: Annotated[ 

1986 Optional[Sequence[Depends]], 

1987 Doc( 

1988 """ 

1989 A list of dependencies (using `Depends()`) to be applied to the 

1990 *path operation*. 

1991 

1992 Read more about it in the 

1993 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). 

1994 """ 

1995 ), 

1996 ] = None, 

1997 summary: Annotated[ 

1998 Optional[str], 

1999 Doc( 

2000 """ 

2001 A summary for the *path operation*. 

2002 

2003 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2004 

2005 Read more about it in the 

2006 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

2007 """ 

2008 ), 

2009 ] = None, 

2010 description: Annotated[ 

2011 Optional[str], 

2012 Doc( 

2013 """ 

2014 A description for the *path operation*. 

2015 

2016 If not provided, it will be extracted automatically from the docstring 

2017 of the *path operation function*. 

2018 

2019 It can contain Markdown. 

2020 

2021 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2022 

2023 Read more about it in the 

2024 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

2025 """ 

2026 ), 

2027 ] = None, 

2028 response_description: Annotated[ 

2029 str, 

2030 Doc( 

2031 """ 

2032 The description for the default response. 

2033 

2034 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2035 """ 

2036 ), 

2037 ] = "Successful Response", 

2038 responses: Annotated[ 

2039 Optional[Dict[Union[int, str], Dict[str, Any]]], 

2040 Doc( 

2041 """ 

2042 Additional responses that could be returned by this *path operation*. 

2043 

2044 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2045 """ 

2046 ), 

2047 ] = None, 

2048 deprecated: Annotated[ 

2049 Optional[bool], 

2050 Doc( 

2051 """ 

2052 Mark this *path operation* as deprecated. 

2053 

2054 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2055 """ 

2056 ), 

2057 ] = None, 

2058 operation_id: Annotated[ 

2059 Optional[str], 

2060 Doc( 

2061 """ 

2062 Custom operation ID to be used by this *path operation*. 

2063 

2064 By default, it is generated automatically. 

2065 

2066 If you provide a custom operation ID, you need to make sure it is 

2067 unique for the whole API. 

2068 

2069 You can customize the 

2070 operation ID generation with the parameter 

2071 `generate_unique_id_function` in the `FastAPI` class. 

2072 

2073 Read more about it in the 

2074 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

2075 """ 

2076 ), 

2077 ] = None, 

2078 response_model_include: Annotated[ 

2079 Optional[IncEx], 

2080 Doc( 

2081 """ 

2082 Configuration passed to Pydantic to include only certain fields in the 

2083 response data. 

2084 

2085 Read more about it in the 

2086 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

2087 """ 

2088 ), 

2089 ] = None, 

2090 response_model_exclude: Annotated[ 

2091 Optional[IncEx], 

2092 Doc( 

2093 """ 

2094 Configuration passed to Pydantic to exclude certain fields in the 

2095 response data. 

2096 

2097 Read more about it in the 

2098 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

2099 """ 

2100 ), 

2101 ] = None, 

2102 response_model_by_alias: Annotated[ 

2103 bool, 

2104 Doc( 

2105 """ 

2106 Configuration passed to Pydantic to define if the response model 

2107 should be serialized by alias when an alias is used. 

2108 

2109 Read more about it in the 

2110 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

2111 """ 

2112 ), 

2113 ] = True, 

2114 response_model_exclude_unset: Annotated[ 

2115 bool, 

2116 Doc( 

2117 """ 

2118 Configuration passed to Pydantic to define if the response data 

2119 should have all the fields, including the ones that were not set and 

2120 have their default values. This is different from 

2121 `response_model_exclude_defaults` in that if the fields are set, 

2122 they will be included in the response, even if the value is the same 

2123 as the default. 

2124 

2125 When `True`, default values are omitted from the response. 

2126 

2127 Read more about it in the 

2128 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

2129 """ 

2130 ), 

2131 ] = False, 

2132 response_model_exclude_defaults: Annotated[ 

2133 bool, 

2134 Doc( 

2135 """ 

2136 Configuration passed to Pydantic to define if the response data 

2137 should have all the fields, including the ones that have the same value 

2138 as the default. This is different from `response_model_exclude_unset` 

2139 in that if the fields are set but contain the same default values, 

2140 they will be excluded from the response. 

2141 

2142 When `True`, default values are omitted from the response. 

2143 

2144 Read more about it in the 

2145 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

2146 """ 

2147 ), 

2148 ] = False, 

2149 response_model_exclude_none: Annotated[ 

2150 bool, 

2151 Doc( 

2152 """ 

2153 Configuration passed to Pydantic to define if the response data should 

2154 exclude fields set to `None`. 

2155 

2156 This is much simpler (less smart) than `response_model_exclude_unset` 

2157 and `response_model_exclude_defaults`. You probably want to use one of 

2158 those two instead of this one, as those allow returning `None` values 

2159 when it makes sense. 

2160 

2161 Read more about it in the 

2162 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). 

2163 """ 

2164 ), 

2165 ] = False, 

2166 include_in_schema: Annotated[ 

2167 bool, 

2168 Doc( 

2169 """ 

2170 Include this *path operation* in the generated OpenAPI schema. 

2171 

2172 This affects the generated OpenAPI (e.g. visible at `/docs`). 

2173 

2174 Read more about it in the 

2175 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). 

2176 """ 

2177 ), 

2178 ] = True, 

2179 response_class: Annotated[ 

2180 Type[Response], 

2181 Doc( 

2182 """ 

2183 Response class to be used for this *path operation*. 

2184 

2185 This will not be used if you return a response directly. 

2186 

2187 Read more about it in the 

2188 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). 

2189 """ 

2190 ), 

2191 ] = Default(JSONResponse), 

2192 name: Annotated[ 

2193 Optional[str], 

2194 Doc( 

2195 """ 

2196 Name for this *path operation*. Only used internally. 

2197 """ 

2198 ), 

2199 ] = None, 

2200 callbacks: Annotated[ 

2201 Optional[List[BaseRoute]], 

2202 Doc( 

2203 """ 

2204 List of *path operations* that will be used as OpenAPI callbacks. 

2205 

2206 This is only for OpenAPI documentation, the callbacks won't be used 

2207 directly. 

2208 

2209 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2210 

2211 Read more about it in the 

2212 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). 

2213 """ 

2214 ), 

2215 ] = None, 

2216 openapi_extra: Annotated[ 

2217 Optional[Dict[str, Any]], 

2218 Doc( 

2219 """ 

2220 Extra metadata to be included in the OpenAPI schema for this *path 

2221 operation*. 

2222 

2223 Read more about it in the 

2224 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). 

2225 """ 

2226 ), 

2227 ] = None, 

2228 generate_unique_id_function: Annotated[ 

2229 Callable[[routing.APIRoute], str], 

2230 Doc( 

2231 """ 

2232 Customize the function used to generate unique IDs for the *path 

2233 operations* shown in the generated OpenAPI. 

2234 

2235 This is particularly useful when automatically generating clients or 

2236 SDKs for your API. 

2237 

2238 Read more about it in the 

2239 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

2240 """ 

2241 ), 

2242 ] = Default(generate_unique_id), 

2243 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

2244 """ 

2245 Add a *path operation* using an HTTP PUT operation. 

2246 

2247 ## Example 

2248 

2249 ```python 

2250 from fastapi import FastAPI 

2251 from pydantic import BaseModel 

2252 

2253 class Item(BaseModel): 

2254 name: str 

2255 description: str | None = None 

2256 

2257 app = FastAPI() 

2258 

2259 @app.put("/items/{item_id}") 

2260 def replace_item(item_id: str, item: Item): 

2261 return {"message": "Item replaced", "id": item_id} 

2262 ``` 

2263 """ 

2264 return self.router.put( 1abcdef

2265 path, 

2266 response_model=response_model, 

2267 status_code=status_code, 

2268 tags=tags, 

2269 dependencies=dependencies, 

2270 summary=summary, 

2271 description=description, 

2272 response_description=response_description, 

2273 responses=responses, 

2274 deprecated=deprecated, 

2275 operation_id=operation_id, 

2276 response_model_include=response_model_include, 

2277 response_model_exclude=response_model_exclude, 

2278 response_model_by_alias=response_model_by_alias, 

2279 response_model_exclude_unset=response_model_exclude_unset, 

2280 response_model_exclude_defaults=response_model_exclude_defaults, 

2281 response_model_exclude_none=response_model_exclude_none, 

2282 include_in_schema=include_in_schema, 

2283 response_class=response_class, 

2284 name=name, 

2285 callbacks=callbacks, 

2286 openapi_extra=openapi_extra, 

2287 generate_unique_id_function=generate_unique_id_function, 

2288 ) 

2289 

2290 def post( 1abcdef

2291 self, 

2292 path: Annotated[ 

2293 str, 

2294 Doc( 

2295 """ 

2296 The URL path to be used for this *path operation*. 

2297 

2298 For example, in `http://example.com/items`, the path is `/items`. 

2299 """ 

2300 ), 

2301 ], 

2302 *, 

2303 response_model: Annotated[ 

2304 Any, 

2305 Doc( 

2306 """ 

2307 The type to use for the response. 

2308 

2309 It could be any valid Pydantic *field* type. So, it doesn't have to 

2310 be a Pydantic model, it could be other things, like a `list`, `dict`, 

2311 etc. 

2312 

2313 It will be used for: 

2314 

2315 * Documentation: the generated OpenAPI (and the UI at `/docs`) will 

2316 show it as the response (JSON Schema). 

2317 * Serialization: you could return an arbitrary object and the 

2318 `response_model` would be used to serialize that object into the 

2319 corresponding JSON. 

2320 * Filtering: the JSON sent to the client will only contain the data 

2321 (fields) defined in the `response_model`. If you returned an object 

2322 that contains an attribute `password` but the `response_model` does 

2323 not include that field, the JSON sent to the client would not have 

2324 that `password`. 

2325 * Validation: whatever you return will be serialized with the 

2326 `response_model`, converting any data as necessary to generate the 

2327 corresponding JSON. But if the data in the object returned is not 

2328 valid, that would mean a violation of the contract with the client, 

2329 so it's an error from the API developer. So, FastAPI will raise an 

2330 error and return a 500 error code (Internal Server Error). 

2331 

2332 Read more about it in the 

2333 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). 

2334 """ 

2335 ), 

2336 ] = Default(None), 

2337 status_code: Annotated[ 

2338 Optional[int], 

2339 Doc( 

2340 """ 

2341 The default status code to be used for the response. 

2342 

2343 You could override the status code by returning a response directly. 

2344 

2345 Read more about it in the 

2346 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). 

2347 """ 

2348 ), 

2349 ] = None, 

2350 tags: Annotated[ 

2351 Optional[List[Union[str, Enum]]], 

2352 Doc( 

2353 """ 

2354 A list of tags to be applied to the *path operation*. 

2355 

2356 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2357 

2358 Read more about it in the 

2359 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). 

2360 """ 

2361 ), 

2362 ] = None, 

2363 dependencies: Annotated[ 

2364 Optional[Sequence[Depends]], 

2365 Doc( 

2366 """ 

2367 A list of dependencies (using `Depends()`) to be applied to the 

2368 *path operation*. 

2369 

2370 Read more about it in the 

2371 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). 

2372 """ 

2373 ), 

2374 ] = None, 

2375 summary: Annotated[ 

2376 Optional[str], 

2377 Doc( 

2378 """ 

2379 A summary for the *path operation*. 

2380 

2381 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2382 

2383 Read more about it in the 

2384 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

2385 """ 

2386 ), 

2387 ] = None, 

2388 description: Annotated[ 

2389 Optional[str], 

2390 Doc( 

2391 """ 

2392 A description for the *path operation*. 

2393 

2394 If not provided, it will be extracted automatically from the docstring 

2395 of the *path operation function*. 

2396 

2397 It can contain Markdown. 

2398 

2399 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2400 

2401 Read more about it in the 

2402 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

2403 """ 

2404 ), 

2405 ] = None, 

2406 response_description: Annotated[ 

2407 str, 

2408 Doc( 

2409 """ 

2410 The description for the default response. 

2411 

2412 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2413 """ 

2414 ), 

2415 ] = "Successful Response", 

2416 responses: Annotated[ 

2417 Optional[Dict[Union[int, str], Dict[str, Any]]], 

2418 Doc( 

2419 """ 

2420 Additional responses that could be returned by this *path operation*. 

2421 

2422 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2423 """ 

2424 ), 

2425 ] = None, 

2426 deprecated: Annotated[ 

2427 Optional[bool], 

2428 Doc( 

2429 """ 

2430 Mark this *path operation* as deprecated. 

2431 

2432 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2433 """ 

2434 ), 

2435 ] = None, 

2436 operation_id: Annotated[ 

2437 Optional[str], 

2438 Doc( 

2439 """ 

2440 Custom operation ID to be used by this *path operation*. 

2441 

2442 By default, it is generated automatically. 

2443 

2444 If you provide a custom operation ID, you need to make sure it is 

2445 unique for the whole API. 

2446 

2447 You can customize the 

2448 operation ID generation with the parameter 

2449 `generate_unique_id_function` in the `FastAPI` class. 

2450 

2451 Read more about it in the 

2452 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

2453 """ 

2454 ), 

2455 ] = None, 

2456 response_model_include: Annotated[ 

2457 Optional[IncEx], 

2458 Doc( 

2459 """ 

2460 Configuration passed to Pydantic to include only certain fields in the 

2461 response data. 

2462 

2463 Read more about it in the 

2464 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

2465 """ 

2466 ), 

2467 ] = None, 

2468 response_model_exclude: Annotated[ 

2469 Optional[IncEx], 

2470 Doc( 

2471 """ 

2472 Configuration passed to Pydantic to exclude certain fields in the 

2473 response data. 

2474 

2475 Read more about it in the 

2476 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

2477 """ 

2478 ), 

2479 ] = None, 

2480 response_model_by_alias: Annotated[ 

2481 bool, 

2482 Doc( 

2483 """ 

2484 Configuration passed to Pydantic to define if the response model 

2485 should be serialized by alias when an alias is used. 

2486 

2487 Read more about it in the 

2488 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

2489 """ 

2490 ), 

2491 ] = True, 

2492 response_model_exclude_unset: Annotated[ 

2493 bool, 

2494 Doc( 

2495 """ 

2496 Configuration passed to Pydantic to define if the response data 

2497 should have all the fields, including the ones that were not set and 

2498 have their default values. This is different from 

2499 `response_model_exclude_defaults` in that if the fields are set, 

2500 they will be included in the response, even if the value is the same 

2501 as the default. 

2502 

2503 When `True`, default values are omitted from the response. 

2504 

2505 Read more about it in the 

2506 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

2507 """ 

2508 ), 

2509 ] = False, 

2510 response_model_exclude_defaults: Annotated[ 

2511 bool, 

2512 Doc( 

2513 """ 

2514 Configuration passed to Pydantic to define if the response data 

2515 should have all the fields, including the ones that have the same value 

2516 as the default. This is different from `response_model_exclude_unset` 

2517 in that if the fields are set but contain the same default values, 

2518 they will be excluded from the response. 

2519 

2520 When `True`, default values are omitted from the response. 

2521 

2522 Read more about it in the 

2523 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

2524 """ 

2525 ), 

2526 ] = False, 

2527 response_model_exclude_none: Annotated[ 

2528 bool, 

2529 Doc( 

2530 """ 

2531 Configuration passed to Pydantic to define if the response data should 

2532 exclude fields set to `None`. 

2533 

2534 This is much simpler (less smart) than `response_model_exclude_unset` 

2535 and `response_model_exclude_defaults`. You probably want to use one of 

2536 those two instead of this one, as those allow returning `None` values 

2537 when it makes sense. 

2538 

2539 Read more about it in the 

2540 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). 

2541 """ 

2542 ), 

2543 ] = False, 

2544 include_in_schema: Annotated[ 

2545 bool, 

2546 Doc( 

2547 """ 

2548 Include this *path operation* in the generated OpenAPI schema. 

2549 

2550 This affects the generated OpenAPI (e.g. visible at `/docs`). 

2551 

2552 Read more about it in the 

2553 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). 

2554 """ 

2555 ), 

2556 ] = True, 

2557 response_class: Annotated[ 

2558 Type[Response], 

2559 Doc( 

2560 """ 

2561 Response class to be used for this *path operation*. 

2562 

2563 This will not be used if you return a response directly. 

2564 

2565 Read more about it in the 

2566 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). 

2567 """ 

2568 ), 

2569 ] = Default(JSONResponse), 

2570 name: Annotated[ 

2571 Optional[str], 

2572 Doc( 

2573 """ 

2574 Name for this *path operation*. Only used internally. 

2575 """ 

2576 ), 

2577 ] = None, 

2578 callbacks: Annotated[ 

2579 Optional[List[BaseRoute]], 

2580 Doc( 

2581 """ 

2582 List of *path operations* that will be used as OpenAPI callbacks. 

2583 

2584 This is only for OpenAPI documentation, the callbacks won't be used 

2585 directly. 

2586 

2587 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2588 

2589 Read more about it in the 

2590 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). 

2591 """ 

2592 ), 

2593 ] = None, 

2594 openapi_extra: Annotated[ 

2595 Optional[Dict[str, Any]], 

2596 Doc( 

2597 """ 

2598 Extra metadata to be included in the OpenAPI schema for this *path 

2599 operation*. 

2600 

2601 Read more about it in the 

2602 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). 

2603 """ 

2604 ), 

2605 ] = None, 

2606 generate_unique_id_function: Annotated[ 

2607 Callable[[routing.APIRoute], str], 

2608 Doc( 

2609 """ 

2610 Customize the function used to generate unique IDs for the *path 

2611 operations* shown in the generated OpenAPI. 

2612 

2613 This is particularly useful when automatically generating clients or 

2614 SDKs for your API. 

2615 

2616 Read more about it in the 

2617 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

2618 """ 

2619 ), 

2620 ] = Default(generate_unique_id), 

2621 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

2622 """ 

2623 Add a *path operation* using an HTTP POST operation. 

2624 

2625 ## Example 

2626 

2627 ```python 

2628 from fastapi import FastAPI 

2629 from pydantic import BaseModel 

2630 

2631 class Item(BaseModel): 

2632 name: str 

2633 description: str | None = None 

2634 

2635 app = FastAPI() 

2636 

2637 @app.post("/items/") 

2638 def create_item(item: Item): 

2639 return {"message": "Item created"} 

2640 ``` 

2641 """ 

2642 return self.router.post( 2a VbWbXbm ' n o p q r ( SdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3bibu b +b,b-bv ) w x y z A * /d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?bpbD c ecfcgcE + F G H I J , peqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpcwbM Ccd IcJcKcN / O P Q R S : TeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTcDbV 6ce $c%c'cW ? X Y Z 0 1 @ :e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:cKb4 ~cf fdgdhd5 ^ 6 7 8 9 ! _ qfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqdRb% Dd

2643 path, 

2644 response_model=response_model, 

2645 status_code=status_code, 

2646 tags=tags, 

2647 dependencies=dependencies, 

2648 summary=summary, 

2649 description=description, 

2650 response_description=response_description, 

2651 responses=responses, 

2652 deprecated=deprecated, 

2653 operation_id=operation_id, 

2654 response_model_include=response_model_include, 

2655 response_model_exclude=response_model_exclude, 

2656 response_model_by_alias=response_model_by_alias, 

2657 response_model_exclude_unset=response_model_exclude_unset, 

2658 response_model_exclude_defaults=response_model_exclude_defaults, 

2659 response_model_exclude_none=response_model_exclude_none, 

2660 include_in_schema=include_in_schema, 

2661 response_class=response_class, 

2662 name=name, 

2663 callbacks=callbacks, 

2664 openapi_extra=openapi_extra, 

2665 generate_unique_id_function=generate_unique_id_function, 

2666 ) 

2667 

2668 def delete( 1abcdef

2669 self, 

2670 path: Annotated[ 

2671 str, 

2672 Doc( 

2673 """ 

2674 The URL path to be used for this *path operation*. 

2675 

2676 For example, in `http://example.com/items`, the path is `/items`. 

2677 """ 

2678 ), 

2679 ], 

2680 *, 

2681 response_model: Annotated[ 

2682 Any, 

2683 Doc( 

2684 """ 

2685 The type to use for the response. 

2686 

2687 It could be any valid Pydantic *field* type. So, it doesn't have to 

2688 be a Pydantic model, it could be other things, like a `list`, `dict`, 

2689 etc. 

2690 

2691 It will be used for: 

2692 

2693 * Documentation: the generated OpenAPI (and the UI at `/docs`) will 

2694 show it as the response (JSON Schema). 

2695 * Serialization: you could return an arbitrary object and the 

2696 `response_model` would be used to serialize that object into the 

2697 corresponding JSON. 

2698 * Filtering: the JSON sent to the client will only contain the data 

2699 (fields) defined in the `response_model`. If you returned an object 

2700 that contains an attribute `password` but the `response_model` does 

2701 not include that field, the JSON sent to the client would not have 

2702 that `password`. 

2703 * Validation: whatever you return will be serialized with the 

2704 `response_model`, converting any data as necessary to generate the 

2705 corresponding JSON. But if the data in the object returned is not 

2706 valid, that would mean a violation of the contract with the client, 

2707 so it's an error from the API developer. So, FastAPI will raise an 

2708 error and return a 500 error code (Internal Server Error). 

2709 

2710 Read more about it in the 

2711 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). 

2712 """ 

2713 ), 

2714 ] = Default(None), 

2715 status_code: Annotated[ 

2716 Optional[int], 

2717 Doc( 

2718 """ 

2719 The default status code to be used for the response. 

2720 

2721 You could override the status code by returning a response directly. 

2722 

2723 Read more about it in the 

2724 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). 

2725 """ 

2726 ), 

2727 ] = None, 

2728 tags: Annotated[ 

2729 Optional[List[Union[str, Enum]]], 

2730 Doc( 

2731 """ 

2732 A list of tags to be applied to the *path operation*. 

2733 

2734 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2735 

2736 Read more about it in the 

2737 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). 

2738 """ 

2739 ), 

2740 ] = None, 

2741 dependencies: Annotated[ 

2742 Optional[Sequence[Depends]], 

2743 Doc( 

2744 """ 

2745 A list of dependencies (using `Depends()`) to be applied to the 

2746 *path operation*. 

2747 

2748 Read more about it in the 

2749 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). 

2750 """ 

2751 ), 

2752 ] = None, 

2753 summary: Annotated[ 

2754 Optional[str], 

2755 Doc( 

2756 """ 

2757 A summary for the *path operation*. 

2758 

2759 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2760 

2761 Read more about it in the 

2762 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

2763 """ 

2764 ), 

2765 ] = None, 

2766 description: Annotated[ 

2767 Optional[str], 

2768 Doc( 

2769 """ 

2770 A description for the *path operation*. 

2771 

2772 If not provided, it will be extracted automatically from the docstring 

2773 of the *path operation function*. 

2774 

2775 It can contain Markdown. 

2776 

2777 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2778 

2779 Read more about it in the 

2780 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

2781 """ 

2782 ), 

2783 ] = None, 

2784 response_description: Annotated[ 

2785 str, 

2786 Doc( 

2787 """ 

2788 The description for the default response. 

2789 

2790 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2791 """ 

2792 ), 

2793 ] = "Successful Response", 

2794 responses: Annotated[ 

2795 Optional[Dict[Union[int, str], Dict[str, Any]]], 

2796 Doc( 

2797 """ 

2798 Additional responses that could be returned by this *path operation*. 

2799 

2800 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2801 """ 

2802 ), 

2803 ] = None, 

2804 deprecated: Annotated[ 

2805 Optional[bool], 

2806 Doc( 

2807 """ 

2808 Mark this *path operation* as deprecated. 

2809 

2810 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2811 """ 

2812 ), 

2813 ] = None, 

2814 operation_id: Annotated[ 

2815 Optional[str], 

2816 Doc( 

2817 """ 

2818 Custom operation ID to be used by this *path operation*. 

2819 

2820 By default, it is generated automatically. 

2821 

2822 If you provide a custom operation ID, you need to make sure it is 

2823 unique for the whole API. 

2824 

2825 You can customize the 

2826 operation ID generation with the parameter 

2827 `generate_unique_id_function` in the `FastAPI` class. 

2828 

2829 Read more about it in the 

2830 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

2831 """ 

2832 ), 

2833 ] = None, 

2834 response_model_include: Annotated[ 

2835 Optional[IncEx], 

2836 Doc( 

2837 """ 

2838 Configuration passed to Pydantic to include only certain fields in the 

2839 response data. 

2840 

2841 Read more about it in the 

2842 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

2843 """ 

2844 ), 

2845 ] = None, 

2846 response_model_exclude: Annotated[ 

2847 Optional[IncEx], 

2848 Doc( 

2849 """ 

2850 Configuration passed to Pydantic to exclude certain fields in the 

2851 response data. 

2852 

2853 Read more about it in the 

2854 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

2855 """ 

2856 ), 

2857 ] = None, 

2858 response_model_by_alias: Annotated[ 

2859 bool, 

2860 Doc( 

2861 """ 

2862 Configuration passed to Pydantic to define if the response model 

2863 should be serialized by alias when an alias is used. 

2864 

2865 Read more about it in the 

2866 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

2867 """ 

2868 ), 

2869 ] = True, 

2870 response_model_exclude_unset: Annotated[ 

2871 bool, 

2872 Doc( 

2873 """ 

2874 Configuration passed to Pydantic to define if the response data 

2875 should have all the fields, including the ones that were not set and 

2876 have their default values. This is different from 

2877 `response_model_exclude_defaults` in that if the fields are set, 

2878 they will be included in the response, even if the value is the same 

2879 as the default. 

2880 

2881 When `True`, default values are omitted from the response. 

2882 

2883 Read more about it in the 

2884 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

2885 """ 

2886 ), 

2887 ] = False, 

2888 response_model_exclude_defaults: Annotated[ 

2889 bool, 

2890 Doc( 

2891 """ 

2892 Configuration passed to Pydantic to define if the response data 

2893 should have all the fields, including the ones that have the same value 

2894 as the default. This is different from `response_model_exclude_unset` 

2895 in that if the fields are set but contain the same default values, 

2896 they will be excluded from the response. 

2897 

2898 When `True`, default values are omitted from the response. 

2899 

2900 Read more about it in the 

2901 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

2902 """ 

2903 ), 

2904 ] = False, 

2905 response_model_exclude_none: Annotated[ 

2906 bool, 

2907 Doc( 

2908 """ 

2909 Configuration passed to Pydantic to define if the response data should 

2910 exclude fields set to `None`. 

2911 

2912 This is much simpler (less smart) than `response_model_exclude_unset` 

2913 and `response_model_exclude_defaults`. You probably want to use one of 

2914 those two instead of this one, as those allow returning `None` values 

2915 when it makes sense. 

2916 

2917 Read more about it in the 

2918 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). 

2919 """ 

2920 ), 

2921 ] = False, 

2922 include_in_schema: Annotated[ 

2923 bool, 

2924 Doc( 

2925 """ 

2926 Include this *path operation* in the generated OpenAPI schema. 

2927 

2928 This affects the generated OpenAPI (e.g. visible at `/docs`). 

2929 

2930 Read more about it in the 

2931 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). 

2932 """ 

2933 ), 

2934 ] = True, 

2935 response_class: Annotated[ 

2936 Type[Response], 

2937 Doc( 

2938 """ 

2939 Response class to be used for this *path operation*. 

2940 

2941 This will not be used if you return a response directly. 

2942 

2943 Read more about it in the 

2944 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). 

2945 """ 

2946 ), 

2947 ] = Default(JSONResponse), 

2948 name: Annotated[ 

2949 Optional[str], 

2950 Doc( 

2951 """ 

2952 Name for this *path operation*. Only used internally. 

2953 """ 

2954 ), 

2955 ] = None, 

2956 callbacks: Annotated[ 

2957 Optional[List[BaseRoute]], 

2958 Doc( 

2959 """ 

2960 List of *path operations* that will be used as OpenAPI callbacks. 

2961 

2962 This is only for OpenAPI documentation, the callbacks won't be used 

2963 directly. 

2964 

2965 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

2966 

2967 Read more about it in the 

2968 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). 

2969 """ 

2970 ), 

2971 ] = None, 

2972 openapi_extra: Annotated[ 

2973 Optional[Dict[str, Any]], 

2974 Doc( 

2975 """ 

2976 Extra metadata to be included in the OpenAPI schema for this *path 

2977 operation*. 

2978 

2979 Read more about it in the 

2980 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). 

2981 """ 

2982 ), 

2983 ] = None, 

2984 generate_unique_id_function: Annotated[ 

2985 Callable[[routing.APIRoute], str], 

2986 Doc( 

2987 """ 

2988 Customize the function used to generate unique IDs for the *path 

2989 operations* shown in the generated OpenAPI. 

2990 

2991 This is particularly useful when automatically generating clients or 

2992 SDKs for your API. 

2993 

2994 Read more about it in the 

2995 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

2996 """ 

2997 ), 

2998 ] = Default(generate_unique_id), 

2999 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

3000 """ 

3001 Add a *path operation* using an HTTP DELETE operation. 

3002 

3003 ## Example 

3004 

3005 ```python 

3006 from fastapi import FastAPI 

3007 

3008 app = FastAPI() 

3009 

3010 @app.delete("/items/{item_id}") 

3011 def delete_item(item_id: str): 

3012 return {"message": "Item deleted"} 

3013 ``` 

3014 """ 

3015 return self.router.delete( 1abcdef

3016 path, 

3017 response_model=response_model, 

3018 status_code=status_code, 

3019 tags=tags, 

3020 dependencies=dependencies, 

3021 summary=summary, 

3022 description=description, 

3023 response_description=response_description, 

3024 responses=responses, 

3025 deprecated=deprecated, 

3026 operation_id=operation_id, 

3027 response_model_include=response_model_include, 

3028 response_model_exclude=response_model_exclude, 

3029 response_model_by_alias=response_model_by_alias, 

3030 response_model_exclude_unset=response_model_exclude_unset, 

3031 response_model_exclude_defaults=response_model_exclude_defaults, 

3032 response_model_exclude_none=response_model_exclude_none, 

3033 include_in_schema=include_in_schema, 

3034 response_class=response_class, 

3035 name=name, 

3036 callbacks=callbacks, 

3037 openapi_extra=openapi_extra, 

3038 generate_unique_id_function=generate_unique_id_function, 

3039 ) 

3040 

3041 def options( 1abcdef

3042 self, 

3043 path: Annotated[ 

3044 str, 

3045 Doc( 

3046 """ 

3047 The URL path to be used for this *path operation*. 

3048 

3049 For example, in `http://example.com/items`, the path is `/items`. 

3050 """ 

3051 ), 

3052 ], 

3053 *, 

3054 response_model: Annotated[ 

3055 Any, 

3056 Doc( 

3057 """ 

3058 The type to use for the response. 

3059 

3060 It could be any valid Pydantic *field* type. So, it doesn't have to 

3061 be a Pydantic model, it could be other things, like a `list`, `dict`, 

3062 etc. 

3063 

3064 It will be used for: 

3065 

3066 * Documentation: the generated OpenAPI (and the UI at `/docs`) will 

3067 show it as the response (JSON Schema). 

3068 * Serialization: you could return an arbitrary object and the 

3069 `response_model` would be used to serialize that object into the 

3070 corresponding JSON. 

3071 * Filtering: the JSON sent to the client will only contain the data 

3072 (fields) defined in the `response_model`. If you returned an object 

3073 that contains an attribute `password` but the `response_model` does 

3074 not include that field, the JSON sent to the client would not have 

3075 that `password`. 

3076 * Validation: whatever you return will be serialized with the 

3077 `response_model`, converting any data as necessary to generate the 

3078 corresponding JSON. But if the data in the object returned is not 

3079 valid, that would mean a violation of the contract with the client, 

3080 so it's an error from the API developer. So, FastAPI will raise an 

3081 error and return a 500 error code (Internal Server Error). 

3082 

3083 Read more about it in the 

3084 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). 

3085 """ 

3086 ), 

3087 ] = Default(None), 

3088 status_code: Annotated[ 

3089 Optional[int], 

3090 Doc( 

3091 """ 

3092 The default status code to be used for the response. 

3093 

3094 You could override the status code by returning a response directly. 

3095 

3096 Read more about it in the 

3097 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). 

3098 """ 

3099 ), 

3100 ] = None, 

3101 tags: Annotated[ 

3102 Optional[List[Union[str, Enum]]], 

3103 Doc( 

3104 """ 

3105 A list of tags to be applied to the *path operation*. 

3106 

3107 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3108 

3109 Read more about it in the 

3110 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). 

3111 """ 

3112 ), 

3113 ] = None, 

3114 dependencies: Annotated[ 

3115 Optional[Sequence[Depends]], 

3116 Doc( 

3117 """ 

3118 A list of dependencies (using `Depends()`) to be applied to the 

3119 *path operation*. 

3120 

3121 Read more about it in the 

3122 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). 

3123 """ 

3124 ), 

3125 ] = None, 

3126 summary: Annotated[ 

3127 Optional[str], 

3128 Doc( 

3129 """ 

3130 A summary for the *path operation*. 

3131 

3132 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3133 

3134 Read more about it in the 

3135 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

3136 """ 

3137 ), 

3138 ] = None, 

3139 description: Annotated[ 

3140 Optional[str], 

3141 Doc( 

3142 """ 

3143 A description for the *path operation*. 

3144 

3145 If not provided, it will be extracted automatically from the docstring 

3146 of the *path operation function*. 

3147 

3148 It can contain Markdown. 

3149 

3150 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3151 

3152 Read more about it in the 

3153 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

3154 """ 

3155 ), 

3156 ] = None, 

3157 response_description: Annotated[ 

3158 str, 

3159 Doc( 

3160 """ 

3161 The description for the default response. 

3162 

3163 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3164 """ 

3165 ), 

3166 ] = "Successful Response", 

3167 responses: Annotated[ 

3168 Optional[Dict[Union[int, str], Dict[str, Any]]], 

3169 Doc( 

3170 """ 

3171 Additional responses that could be returned by this *path operation*. 

3172 

3173 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3174 """ 

3175 ), 

3176 ] = None, 

3177 deprecated: Annotated[ 

3178 Optional[bool], 

3179 Doc( 

3180 """ 

3181 Mark this *path operation* as deprecated. 

3182 

3183 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3184 """ 

3185 ), 

3186 ] = None, 

3187 operation_id: Annotated[ 

3188 Optional[str], 

3189 Doc( 

3190 """ 

3191 Custom operation ID to be used by this *path operation*. 

3192 

3193 By default, it is generated automatically. 

3194 

3195 If you provide a custom operation ID, you need to make sure it is 

3196 unique for the whole API. 

3197 

3198 You can customize the 

3199 operation ID generation with the parameter 

3200 `generate_unique_id_function` in the `FastAPI` class. 

3201 

3202 Read more about it in the 

3203 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

3204 """ 

3205 ), 

3206 ] = None, 

3207 response_model_include: Annotated[ 

3208 Optional[IncEx], 

3209 Doc( 

3210 """ 

3211 Configuration passed to Pydantic to include only certain fields in the 

3212 response data. 

3213 

3214 Read more about it in the 

3215 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

3216 """ 

3217 ), 

3218 ] = None, 

3219 response_model_exclude: Annotated[ 

3220 Optional[IncEx], 

3221 Doc( 

3222 """ 

3223 Configuration passed to Pydantic to exclude certain fields in the 

3224 response data. 

3225 

3226 Read more about it in the 

3227 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

3228 """ 

3229 ), 

3230 ] = None, 

3231 response_model_by_alias: Annotated[ 

3232 bool, 

3233 Doc( 

3234 """ 

3235 Configuration passed to Pydantic to define if the response model 

3236 should be serialized by alias when an alias is used. 

3237 

3238 Read more about it in the 

3239 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

3240 """ 

3241 ), 

3242 ] = True, 

3243 response_model_exclude_unset: Annotated[ 

3244 bool, 

3245 Doc( 

3246 """ 

3247 Configuration passed to Pydantic to define if the response data 

3248 should have all the fields, including the ones that were not set and 

3249 have their default values. This is different from 

3250 `response_model_exclude_defaults` in that if the fields are set, 

3251 they will be included in the response, even if the value is the same 

3252 as the default. 

3253 

3254 When `True`, default values are omitted from the response. 

3255 

3256 Read more about it in the 

3257 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

3258 """ 

3259 ), 

3260 ] = False, 

3261 response_model_exclude_defaults: Annotated[ 

3262 bool, 

3263 Doc( 

3264 """ 

3265 Configuration passed to Pydantic to define if the response data 

3266 should have all the fields, including the ones that have the same value 

3267 as the default. This is different from `response_model_exclude_unset` 

3268 in that if the fields are set but contain the same default values, 

3269 they will be excluded from the response. 

3270 

3271 When `True`, default values are omitted from the response. 

3272 

3273 Read more about it in the 

3274 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

3275 """ 

3276 ), 

3277 ] = False, 

3278 response_model_exclude_none: Annotated[ 

3279 bool, 

3280 Doc( 

3281 """ 

3282 Configuration passed to Pydantic to define if the response data should 

3283 exclude fields set to `None`. 

3284 

3285 This is much simpler (less smart) than `response_model_exclude_unset` 

3286 and `response_model_exclude_defaults`. You probably want to use one of 

3287 those two instead of this one, as those allow returning `None` values 

3288 when it makes sense. 

3289 

3290 Read more about it in the 

3291 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). 

3292 """ 

3293 ), 

3294 ] = False, 

3295 include_in_schema: Annotated[ 

3296 bool, 

3297 Doc( 

3298 """ 

3299 Include this *path operation* in the generated OpenAPI schema. 

3300 

3301 This affects the generated OpenAPI (e.g. visible at `/docs`). 

3302 

3303 Read more about it in the 

3304 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). 

3305 """ 

3306 ), 

3307 ] = True, 

3308 response_class: Annotated[ 

3309 Type[Response], 

3310 Doc( 

3311 """ 

3312 Response class to be used for this *path operation*. 

3313 

3314 This will not be used if you return a response directly. 

3315 

3316 Read more about it in the 

3317 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). 

3318 """ 

3319 ), 

3320 ] = Default(JSONResponse), 

3321 name: Annotated[ 

3322 Optional[str], 

3323 Doc( 

3324 """ 

3325 Name for this *path operation*. Only used internally. 

3326 """ 

3327 ), 

3328 ] = None, 

3329 callbacks: Annotated[ 

3330 Optional[List[BaseRoute]], 

3331 Doc( 

3332 """ 

3333 List of *path operations* that will be used as OpenAPI callbacks. 

3334 

3335 This is only for OpenAPI documentation, the callbacks won't be used 

3336 directly. 

3337 

3338 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3339 

3340 Read more about it in the 

3341 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). 

3342 """ 

3343 ), 

3344 ] = None, 

3345 openapi_extra: Annotated[ 

3346 Optional[Dict[str, Any]], 

3347 Doc( 

3348 """ 

3349 Extra metadata to be included in the OpenAPI schema for this *path 

3350 operation*. 

3351 

3352 Read more about it in the 

3353 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). 

3354 """ 

3355 ), 

3356 ] = None, 

3357 generate_unique_id_function: Annotated[ 

3358 Callable[[routing.APIRoute], str], 

3359 Doc( 

3360 """ 

3361 Customize the function used to generate unique IDs for the *path 

3362 operations* shown in the generated OpenAPI. 

3363 

3364 This is particularly useful when automatically generating clients or 

3365 SDKs for your API. 

3366 

3367 Read more about it in the 

3368 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

3369 """ 

3370 ), 

3371 ] = Default(generate_unique_id), 

3372 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

3373 """ 

3374 Add a *path operation* using an HTTP OPTIONS operation. 

3375 

3376 ## Example 

3377 

3378 ```python 

3379 from fastapi import FastAPI 

3380 

3381 app = FastAPI() 

3382 

3383 @app.options("/items/") 

3384 def get_item_options(): 

3385 return {"additions": ["Aji", "Guacamole"]} 

3386 ``` 

3387 """ 

3388 return self.router.options( 1abcdef

3389 path, 

3390 response_model=response_model, 

3391 status_code=status_code, 

3392 tags=tags, 

3393 dependencies=dependencies, 

3394 summary=summary, 

3395 description=description, 

3396 response_description=response_description, 

3397 responses=responses, 

3398 deprecated=deprecated, 

3399 operation_id=operation_id, 

3400 response_model_include=response_model_include, 

3401 response_model_exclude=response_model_exclude, 

3402 response_model_by_alias=response_model_by_alias, 

3403 response_model_exclude_unset=response_model_exclude_unset, 

3404 response_model_exclude_defaults=response_model_exclude_defaults, 

3405 response_model_exclude_none=response_model_exclude_none, 

3406 include_in_schema=include_in_schema, 

3407 response_class=response_class, 

3408 name=name, 

3409 callbacks=callbacks, 

3410 openapi_extra=openapi_extra, 

3411 generate_unique_id_function=generate_unique_id_function, 

3412 ) 

3413 

3414 def head( 1abcdef

3415 self, 

3416 path: Annotated[ 

3417 str, 

3418 Doc( 

3419 """ 

3420 The URL path to be used for this *path operation*. 

3421 

3422 For example, in `http://example.com/items`, the path is `/items`. 

3423 """ 

3424 ), 

3425 ], 

3426 *, 

3427 response_model: Annotated[ 

3428 Any, 

3429 Doc( 

3430 """ 

3431 The type to use for the response. 

3432 

3433 It could be any valid Pydantic *field* type. So, it doesn't have to 

3434 be a Pydantic model, it could be other things, like a `list`, `dict`, 

3435 etc. 

3436 

3437 It will be used for: 

3438 

3439 * Documentation: the generated OpenAPI (and the UI at `/docs`) will 

3440 show it as the response (JSON Schema). 

3441 * Serialization: you could return an arbitrary object and the 

3442 `response_model` would be used to serialize that object into the 

3443 corresponding JSON. 

3444 * Filtering: the JSON sent to the client will only contain the data 

3445 (fields) defined in the `response_model`. If you returned an object 

3446 that contains an attribute `password` but the `response_model` does 

3447 not include that field, the JSON sent to the client would not have 

3448 that `password`. 

3449 * Validation: whatever you return will be serialized with the 

3450 `response_model`, converting any data as necessary to generate the 

3451 corresponding JSON. But if the data in the object returned is not 

3452 valid, that would mean a violation of the contract with the client, 

3453 so it's an error from the API developer. So, FastAPI will raise an 

3454 error and return a 500 error code (Internal Server Error). 

3455 

3456 Read more about it in the 

3457 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). 

3458 """ 

3459 ), 

3460 ] = Default(None), 

3461 status_code: Annotated[ 

3462 Optional[int], 

3463 Doc( 

3464 """ 

3465 The default status code to be used for the response. 

3466 

3467 You could override the status code by returning a response directly. 

3468 

3469 Read more about it in the 

3470 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). 

3471 """ 

3472 ), 

3473 ] = None, 

3474 tags: Annotated[ 

3475 Optional[List[Union[str, Enum]]], 

3476 Doc( 

3477 """ 

3478 A list of tags to be applied to the *path operation*. 

3479 

3480 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3481 

3482 Read more about it in the 

3483 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). 

3484 """ 

3485 ), 

3486 ] = None, 

3487 dependencies: Annotated[ 

3488 Optional[Sequence[Depends]], 

3489 Doc( 

3490 """ 

3491 A list of dependencies (using `Depends()`) to be applied to the 

3492 *path operation*. 

3493 

3494 Read more about it in the 

3495 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). 

3496 """ 

3497 ), 

3498 ] = None, 

3499 summary: Annotated[ 

3500 Optional[str], 

3501 Doc( 

3502 """ 

3503 A summary for the *path operation*. 

3504 

3505 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3506 

3507 Read more about it in the 

3508 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

3509 """ 

3510 ), 

3511 ] = None, 

3512 description: Annotated[ 

3513 Optional[str], 

3514 Doc( 

3515 """ 

3516 A description for the *path operation*. 

3517 

3518 If not provided, it will be extracted automatically from the docstring 

3519 of the *path operation function*. 

3520 

3521 It can contain Markdown. 

3522 

3523 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3524 

3525 Read more about it in the 

3526 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

3527 """ 

3528 ), 

3529 ] = None, 

3530 response_description: Annotated[ 

3531 str, 

3532 Doc( 

3533 """ 

3534 The description for the default response. 

3535 

3536 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3537 """ 

3538 ), 

3539 ] = "Successful Response", 

3540 responses: Annotated[ 

3541 Optional[Dict[Union[int, str], Dict[str, Any]]], 

3542 Doc( 

3543 """ 

3544 Additional responses that could be returned by this *path operation*. 

3545 

3546 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3547 """ 

3548 ), 

3549 ] = None, 

3550 deprecated: Annotated[ 

3551 Optional[bool], 

3552 Doc( 

3553 """ 

3554 Mark this *path operation* as deprecated. 

3555 

3556 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3557 """ 

3558 ), 

3559 ] = None, 

3560 operation_id: Annotated[ 

3561 Optional[str], 

3562 Doc( 

3563 """ 

3564 Custom operation ID to be used by this *path operation*. 

3565 

3566 By default, it is generated automatically. 

3567 

3568 If you provide a custom operation ID, you need to make sure it is 

3569 unique for the whole API. 

3570 

3571 You can customize the 

3572 operation ID generation with the parameter 

3573 `generate_unique_id_function` in the `FastAPI` class. 

3574 

3575 Read more about it in the 

3576 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

3577 """ 

3578 ), 

3579 ] = None, 

3580 response_model_include: Annotated[ 

3581 Optional[IncEx], 

3582 Doc( 

3583 """ 

3584 Configuration passed to Pydantic to include only certain fields in the 

3585 response data. 

3586 

3587 Read more about it in the 

3588 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

3589 """ 

3590 ), 

3591 ] = None, 

3592 response_model_exclude: Annotated[ 

3593 Optional[IncEx], 

3594 Doc( 

3595 """ 

3596 Configuration passed to Pydantic to exclude certain fields in the 

3597 response data. 

3598 

3599 Read more about it in the 

3600 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

3601 """ 

3602 ), 

3603 ] = None, 

3604 response_model_by_alias: Annotated[ 

3605 bool, 

3606 Doc( 

3607 """ 

3608 Configuration passed to Pydantic to define if the response model 

3609 should be serialized by alias when an alias is used. 

3610 

3611 Read more about it in the 

3612 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

3613 """ 

3614 ), 

3615 ] = True, 

3616 response_model_exclude_unset: Annotated[ 

3617 bool, 

3618 Doc( 

3619 """ 

3620 Configuration passed to Pydantic to define if the response data 

3621 should have all the fields, including the ones that were not set and 

3622 have their default values. This is different from 

3623 `response_model_exclude_defaults` in that if the fields are set, 

3624 they will be included in the response, even if the value is the same 

3625 as the default. 

3626 

3627 When `True`, default values are omitted from the response. 

3628 

3629 Read more about it in the 

3630 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

3631 """ 

3632 ), 

3633 ] = False, 

3634 response_model_exclude_defaults: Annotated[ 

3635 bool, 

3636 Doc( 

3637 """ 

3638 Configuration passed to Pydantic to define if the response data 

3639 should have all the fields, including the ones that have the same value 

3640 as the default. This is different from `response_model_exclude_unset` 

3641 in that if the fields are set but contain the same default values, 

3642 they will be excluded from the response. 

3643 

3644 When `True`, default values are omitted from the response. 

3645 

3646 Read more about it in the 

3647 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

3648 """ 

3649 ), 

3650 ] = False, 

3651 response_model_exclude_none: Annotated[ 

3652 bool, 

3653 Doc( 

3654 """ 

3655 Configuration passed to Pydantic to define if the response data should 

3656 exclude fields set to `None`. 

3657 

3658 This is much simpler (less smart) than `response_model_exclude_unset` 

3659 and `response_model_exclude_defaults`. You probably want to use one of 

3660 those two instead of this one, as those allow returning `None` values 

3661 when it makes sense. 

3662 

3663 Read more about it in the 

3664 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). 

3665 """ 

3666 ), 

3667 ] = False, 

3668 include_in_schema: Annotated[ 

3669 bool, 

3670 Doc( 

3671 """ 

3672 Include this *path operation* in the generated OpenAPI schema. 

3673 

3674 This affects the generated OpenAPI (e.g. visible at `/docs`). 

3675 

3676 Read more about it in the 

3677 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). 

3678 """ 

3679 ), 

3680 ] = True, 

3681 response_class: Annotated[ 

3682 Type[Response], 

3683 Doc( 

3684 """ 

3685 Response class to be used for this *path operation*. 

3686 

3687 This will not be used if you return a response directly. 

3688 

3689 Read more about it in the 

3690 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). 

3691 """ 

3692 ), 

3693 ] = Default(JSONResponse), 

3694 name: Annotated[ 

3695 Optional[str], 

3696 Doc( 

3697 """ 

3698 Name for this *path operation*. Only used internally. 

3699 """ 

3700 ), 

3701 ] = None, 

3702 callbacks: Annotated[ 

3703 Optional[List[BaseRoute]], 

3704 Doc( 

3705 """ 

3706 List of *path operations* that will be used as OpenAPI callbacks. 

3707 

3708 This is only for OpenAPI documentation, the callbacks won't be used 

3709 directly. 

3710 

3711 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3712 

3713 Read more about it in the 

3714 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). 

3715 """ 

3716 ), 

3717 ] = None, 

3718 openapi_extra: Annotated[ 

3719 Optional[Dict[str, Any]], 

3720 Doc( 

3721 """ 

3722 Extra metadata to be included in the OpenAPI schema for this *path 

3723 operation*. 

3724 

3725 Read more about it in the 

3726 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). 

3727 """ 

3728 ), 

3729 ] = None, 

3730 generate_unique_id_function: Annotated[ 

3731 Callable[[routing.APIRoute], str], 

3732 Doc( 

3733 """ 

3734 Customize the function used to generate unique IDs for the *path 

3735 operations* shown in the generated OpenAPI. 

3736 

3737 This is particularly useful when automatically generating clients or 

3738 SDKs for your API. 

3739 

3740 Read more about it in the 

3741 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

3742 """ 

3743 ), 

3744 ] = Default(generate_unique_id), 

3745 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

3746 """ 

3747 Add a *path operation* using an HTTP HEAD operation. 

3748 

3749 ## Example 

3750 

3751 ```python 

3752 from fastapi import FastAPI, Response 

3753 

3754 app = FastAPI() 

3755 

3756 @app.head("/items/", status_code=204) 

3757 def get_items_headers(response: Response): 

3758 response.headers["X-Cat-Dog"] = "Alone in the world" 

3759 ``` 

3760 """ 

3761 return self.router.head( 1abcdef

3762 path, 

3763 response_model=response_model, 

3764 status_code=status_code, 

3765 tags=tags, 

3766 dependencies=dependencies, 

3767 summary=summary, 

3768 description=description, 

3769 response_description=response_description, 

3770 responses=responses, 

3771 deprecated=deprecated, 

3772 operation_id=operation_id, 

3773 response_model_include=response_model_include, 

3774 response_model_exclude=response_model_exclude, 

3775 response_model_by_alias=response_model_by_alias, 

3776 response_model_exclude_unset=response_model_exclude_unset, 

3777 response_model_exclude_defaults=response_model_exclude_defaults, 

3778 response_model_exclude_none=response_model_exclude_none, 

3779 include_in_schema=include_in_schema, 

3780 response_class=response_class, 

3781 name=name, 

3782 callbacks=callbacks, 

3783 openapi_extra=openapi_extra, 

3784 generate_unique_id_function=generate_unique_id_function, 

3785 ) 

3786 

3787 def patch( 1abcdef

3788 self, 

3789 path: Annotated[ 

3790 str, 

3791 Doc( 

3792 """ 

3793 The URL path to be used for this *path operation*. 

3794 

3795 For example, in `http://example.com/items`, the path is `/items`. 

3796 """ 

3797 ), 

3798 ], 

3799 *, 

3800 response_model: Annotated[ 

3801 Any, 

3802 Doc( 

3803 """ 

3804 The type to use for the response. 

3805 

3806 It could be any valid Pydantic *field* type. So, it doesn't have to 

3807 be a Pydantic model, it could be other things, like a `list`, `dict`, 

3808 etc. 

3809 

3810 It will be used for: 

3811 

3812 * Documentation: the generated OpenAPI (and the UI at `/docs`) will 

3813 show it as the response (JSON Schema). 

3814 * Serialization: you could return an arbitrary object and the 

3815 `response_model` would be used to serialize that object into the 

3816 corresponding JSON. 

3817 * Filtering: the JSON sent to the client will only contain the data 

3818 (fields) defined in the `response_model`. If you returned an object 

3819 that contains an attribute `password` but the `response_model` does 

3820 not include that field, the JSON sent to the client would not have 

3821 that `password`. 

3822 * Validation: whatever you return will be serialized with the 

3823 `response_model`, converting any data as necessary to generate the 

3824 corresponding JSON. But if the data in the object returned is not 

3825 valid, that would mean a violation of the contract with the client, 

3826 so it's an error from the API developer. So, FastAPI will raise an 

3827 error and return a 500 error code (Internal Server Error). 

3828 

3829 Read more about it in the 

3830 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). 

3831 """ 

3832 ), 

3833 ] = Default(None), 

3834 status_code: Annotated[ 

3835 Optional[int], 

3836 Doc( 

3837 """ 

3838 The default status code to be used for the response. 

3839 

3840 You could override the status code by returning a response directly. 

3841 

3842 Read more about it in the 

3843 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). 

3844 """ 

3845 ), 

3846 ] = None, 

3847 tags: Annotated[ 

3848 Optional[List[Union[str, Enum]]], 

3849 Doc( 

3850 """ 

3851 A list of tags to be applied to the *path operation*. 

3852 

3853 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3854 

3855 Read more about it in the 

3856 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). 

3857 """ 

3858 ), 

3859 ] = None, 

3860 dependencies: Annotated[ 

3861 Optional[Sequence[Depends]], 

3862 Doc( 

3863 """ 

3864 A list of dependencies (using `Depends()`) to be applied to the 

3865 *path operation*. 

3866 

3867 Read more about it in the 

3868 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). 

3869 """ 

3870 ), 

3871 ] = None, 

3872 summary: Annotated[ 

3873 Optional[str], 

3874 Doc( 

3875 """ 

3876 A summary for the *path operation*. 

3877 

3878 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3879 

3880 Read more about it in the 

3881 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

3882 """ 

3883 ), 

3884 ] = None, 

3885 description: Annotated[ 

3886 Optional[str], 

3887 Doc( 

3888 """ 

3889 A description for the *path operation*. 

3890 

3891 If not provided, it will be extracted automatically from the docstring 

3892 of the *path operation function*. 

3893 

3894 It can contain Markdown. 

3895 

3896 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3897 

3898 Read more about it in the 

3899 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

3900 """ 

3901 ), 

3902 ] = None, 

3903 response_description: Annotated[ 

3904 str, 

3905 Doc( 

3906 """ 

3907 The description for the default response. 

3908 

3909 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3910 """ 

3911 ), 

3912 ] = "Successful Response", 

3913 responses: Annotated[ 

3914 Optional[Dict[Union[int, str], Dict[str, Any]]], 

3915 Doc( 

3916 """ 

3917 Additional responses that could be returned by this *path operation*. 

3918 

3919 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3920 """ 

3921 ), 

3922 ] = None, 

3923 deprecated: Annotated[ 

3924 Optional[bool], 

3925 Doc( 

3926 """ 

3927 Mark this *path operation* as deprecated. 

3928 

3929 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

3930 """ 

3931 ), 

3932 ] = None, 

3933 operation_id: Annotated[ 

3934 Optional[str], 

3935 Doc( 

3936 """ 

3937 Custom operation ID to be used by this *path operation*. 

3938 

3939 By default, it is generated automatically. 

3940 

3941 If you provide a custom operation ID, you need to make sure it is 

3942 unique for the whole API. 

3943 

3944 You can customize the 

3945 operation ID generation with the parameter 

3946 `generate_unique_id_function` in the `FastAPI` class. 

3947 

3948 Read more about it in the 

3949 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

3950 """ 

3951 ), 

3952 ] = None, 

3953 response_model_include: Annotated[ 

3954 Optional[IncEx], 

3955 Doc( 

3956 """ 

3957 Configuration passed to Pydantic to include only certain fields in the 

3958 response data. 

3959 

3960 Read more about it in the 

3961 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

3962 """ 

3963 ), 

3964 ] = None, 

3965 response_model_exclude: Annotated[ 

3966 Optional[IncEx], 

3967 Doc( 

3968 """ 

3969 Configuration passed to Pydantic to exclude certain fields in the 

3970 response data. 

3971 

3972 Read more about it in the 

3973 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

3974 """ 

3975 ), 

3976 ] = None, 

3977 response_model_by_alias: Annotated[ 

3978 bool, 

3979 Doc( 

3980 """ 

3981 Configuration passed to Pydantic to define if the response model 

3982 should be serialized by alias when an alias is used. 

3983 

3984 Read more about it in the 

3985 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

3986 """ 

3987 ), 

3988 ] = True, 

3989 response_model_exclude_unset: Annotated[ 

3990 bool, 

3991 Doc( 

3992 """ 

3993 Configuration passed to Pydantic to define if the response data 

3994 should have all the fields, including the ones that were not set and 

3995 have their default values. This is different from 

3996 `response_model_exclude_defaults` in that if the fields are set, 

3997 they will be included in the response, even if the value is the same 

3998 as the default. 

3999 

4000 When `True`, default values are omitted from the response. 

4001 

4002 Read more about it in the 

4003 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

4004 """ 

4005 ), 

4006 ] = False, 

4007 response_model_exclude_defaults: Annotated[ 

4008 bool, 

4009 Doc( 

4010 """ 

4011 Configuration passed to Pydantic to define if the response data 

4012 should have all the fields, including the ones that have the same value 

4013 as the default. This is different from `response_model_exclude_unset` 

4014 in that if the fields are set but contain the same default values, 

4015 they will be excluded from the response. 

4016 

4017 When `True`, default values are omitted from the response. 

4018 

4019 Read more about it in the 

4020 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

4021 """ 

4022 ), 

4023 ] = False, 

4024 response_model_exclude_none: Annotated[ 

4025 bool, 

4026 Doc( 

4027 """ 

4028 Configuration passed to Pydantic to define if the response data should 

4029 exclude fields set to `None`. 

4030 

4031 This is much simpler (less smart) than `response_model_exclude_unset` 

4032 and `response_model_exclude_defaults`. You probably want to use one of 

4033 those two instead of this one, as those allow returning `None` values 

4034 when it makes sense. 

4035 

4036 Read more about it in the 

4037 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). 

4038 """ 

4039 ), 

4040 ] = False, 

4041 include_in_schema: Annotated[ 

4042 bool, 

4043 Doc( 

4044 """ 

4045 Include this *path operation* in the generated OpenAPI schema. 

4046 

4047 This affects the generated OpenAPI (e.g. visible at `/docs`). 

4048 

4049 Read more about it in the 

4050 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). 

4051 """ 

4052 ), 

4053 ] = True, 

4054 response_class: Annotated[ 

4055 Type[Response], 

4056 Doc( 

4057 """ 

4058 Response class to be used for this *path operation*. 

4059 

4060 This will not be used if you return a response directly. 

4061 

4062 Read more about it in the 

4063 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). 

4064 """ 

4065 ), 

4066 ] = Default(JSONResponse), 

4067 name: Annotated[ 

4068 Optional[str], 

4069 Doc( 

4070 """ 

4071 Name for this *path operation*. Only used internally. 

4072 """ 

4073 ), 

4074 ] = None, 

4075 callbacks: Annotated[ 

4076 Optional[List[BaseRoute]], 

4077 Doc( 

4078 """ 

4079 List of *path operations* that will be used as OpenAPI callbacks. 

4080 

4081 This is only for OpenAPI documentation, the callbacks won't be used 

4082 directly. 

4083 

4084 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

4085 

4086 Read more about it in the 

4087 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). 

4088 """ 

4089 ), 

4090 ] = None, 

4091 openapi_extra: Annotated[ 

4092 Optional[Dict[str, Any]], 

4093 Doc( 

4094 """ 

4095 Extra metadata to be included in the OpenAPI schema for this *path 

4096 operation*. 

4097 

4098 Read more about it in the 

4099 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). 

4100 """ 

4101 ), 

4102 ] = None, 

4103 generate_unique_id_function: Annotated[ 

4104 Callable[[routing.APIRoute], str], 

4105 Doc( 

4106 """ 

4107 Customize the function used to generate unique IDs for the *path 

4108 operations* shown in the generated OpenAPI. 

4109 

4110 This is particularly useful when automatically generating clients or 

4111 SDKs for your API. 

4112 

4113 Read more about it in the 

4114 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

4115 """ 

4116 ), 

4117 ] = Default(generate_unique_id), 

4118 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

4119 """ 

4120 Add a *path operation* using an HTTP PATCH operation. 

4121 

4122 ## Example 

4123 

4124 ```python 

4125 from fastapi import FastAPI 

4126 from pydantic import BaseModel 

4127 

4128 class Item(BaseModel): 

4129 name: str 

4130 description: str | None = None 

4131 

4132 app = FastAPI() 

4133 

4134 @app.patch("/items/") 

4135 def update_item(item: Item): 

4136 return {"message": "Item updated in place"} 

4137 ``` 

4138 """ 

4139 return self.router.patch( 1abcdef

4140 path, 

4141 response_model=response_model, 

4142 status_code=status_code, 

4143 tags=tags, 

4144 dependencies=dependencies, 

4145 summary=summary, 

4146 description=description, 

4147 response_description=response_description, 

4148 responses=responses, 

4149 deprecated=deprecated, 

4150 operation_id=operation_id, 

4151 response_model_include=response_model_include, 

4152 response_model_exclude=response_model_exclude, 

4153 response_model_by_alias=response_model_by_alias, 

4154 response_model_exclude_unset=response_model_exclude_unset, 

4155 response_model_exclude_defaults=response_model_exclude_defaults, 

4156 response_model_exclude_none=response_model_exclude_none, 

4157 include_in_schema=include_in_schema, 

4158 response_class=response_class, 

4159 name=name, 

4160 callbacks=callbacks, 

4161 openapi_extra=openapi_extra, 

4162 generate_unique_id_function=generate_unique_id_function, 

4163 ) 

4164 

4165 def trace( 1abcdef

4166 self, 

4167 path: Annotated[ 

4168 str, 

4169 Doc( 

4170 """ 

4171 The URL path to be used for this *path operation*. 

4172 

4173 For example, in `http://example.com/items`, the path is `/items`. 

4174 """ 

4175 ), 

4176 ], 

4177 *, 

4178 response_model: Annotated[ 

4179 Any, 

4180 Doc( 

4181 """ 

4182 The type to use for the response. 

4183 

4184 It could be any valid Pydantic *field* type. So, it doesn't have to 

4185 be a Pydantic model, it could be other things, like a `list`, `dict`, 

4186 etc. 

4187 

4188 It will be used for: 

4189 

4190 * Documentation: the generated OpenAPI (and the UI at `/docs`) will 

4191 show it as the response (JSON Schema). 

4192 * Serialization: you could return an arbitrary object and the 

4193 `response_model` would be used to serialize that object into the 

4194 corresponding JSON. 

4195 * Filtering: the JSON sent to the client will only contain the data 

4196 (fields) defined in the `response_model`. If you returned an object 

4197 that contains an attribute `password` but the `response_model` does 

4198 not include that field, the JSON sent to the client would not have 

4199 that `password`. 

4200 * Validation: whatever you return will be serialized with the 

4201 `response_model`, converting any data as necessary to generate the 

4202 corresponding JSON. But if the data in the object returned is not 

4203 valid, that would mean a violation of the contract with the client, 

4204 so it's an error from the API developer. So, FastAPI will raise an 

4205 error and return a 500 error code (Internal Server Error). 

4206 

4207 Read more about it in the 

4208 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). 

4209 """ 

4210 ), 

4211 ] = Default(None), 

4212 status_code: Annotated[ 

4213 Optional[int], 

4214 Doc( 

4215 """ 

4216 The default status code to be used for the response. 

4217 

4218 You could override the status code by returning a response directly. 

4219 

4220 Read more about it in the 

4221 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). 

4222 """ 

4223 ), 

4224 ] = None, 

4225 tags: Annotated[ 

4226 Optional[List[Union[str, Enum]]], 

4227 Doc( 

4228 """ 

4229 A list of tags to be applied to the *path operation*. 

4230 

4231 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

4232 

4233 Read more about it in the 

4234 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). 

4235 """ 

4236 ), 

4237 ] = None, 

4238 dependencies: Annotated[ 

4239 Optional[Sequence[Depends]], 

4240 Doc( 

4241 """ 

4242 A list of dependencies (using `Depends()`) to be applied to the 

4243 *path operation*. 

4244 

4245 Read more about it in the 

4246 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). 

4247 """ 

4248 ), 

4249 ] = None, 

4250 summary: Annotated[ 

4251 Optional[str], 

4252 Doc( 

4253 """ 

4254 A summary for the *path operation*. 

4255 

4256 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

4257 

4258 Read more about it in the 

4259 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

4260 """ 

4261 ), 

4262 ] = None, 

4263 description: Annotated[ 

4264 Optional[str], 

4265 Doc( 

4266 """ 

4267 A description for the *path operation*. 

4268 

4269 If not provided, it will be extracted automatically from the docstring 

4270 of the *path operation function*. 

4271 

4272 It can contain Markdown. 

4273 

4274 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

4275 

4276 Read more about it in the 

4277 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). 

4278 """ 

4279 ), 

4280 ] = None, 

4281 response_description: Annotated[ 

4282 str, 

4283 Doc( 

4284 """ 

4285 The description for the default response. 

4286 

4287 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

4288 """ 

4289 ), 

4290 ] = "Successful Response", 

4291 responses: Annotated[ 

4292 Optional[Dict[Union[int, str], Dict[str, Any]]], 

4293 Doc( 

4294 """ 

4295 Additional responses that could be returned by this *path operation*. 

4296 

4297 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

4298 """ 

4299 ), 

4300 ] = None, 

4301 deprecated: Annotated[ 

4302 Optional[bool], 

4303 Doc( 

4304 """ 

4305 Mark this *path operation* as deprecated. 

4306 

4307 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

4308 """ 

4309 ), 

4310 ] = None, 

4311 operation_id: Annotated[ 

4312 Optional[str], 

4313 Doc( 

4314 """ 

4315 Custom operation ID to be used by this *path operation*. 

4316 

4317 By default, it is generated automatically. 

4318 

4319 If you provide a custom operation ID, you need to make sure it is 

4320 unique for the whole API. 

4321 

4322 You can customize the 

4323 operation ID generation with the parameter 

4324 `generate_unique_id_function` in the `FastAPI` class. 

4325 

4326 Read more about it in the 

4327 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

4328 """ 

4329 ), 

4330 ] = None, 

4331 response_model_include: Annotated[ 

4332 Optional[IncEx], 

4333 Doc( 

4334 """ 

4335 Configuration passed to Pydantic to include only certain fields in the 

4336 response data. 

4337 

4338 Read more about it in the 

4339 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

4340 """ 

4341 ), 

4342 ] = None, 

4343 response_model_exclude: Annotated[ 

4344 Optional[IncEx], 

4345 Doc( 

4346 """ 

4347 Configuration passed to Pydantic to exclude certain fields in the 

4348 response data. 

4349 

4350 Read more about it in the 

4351 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

4352 """ 

4353 ), 

4354 ] = None, 

4355 response_model_by_alias: Annotated[ 

4356 bool, 

4357 Doc( 

4358 """ 

4359 Configuration passed to Pydantic to define if the response model 

4360 should be serialized by alias when an alias is used. 

4361 

4362 Read more about it in the 

4363 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). 

4364 """ 

4365 ), 

4366 ] = True, 

4367 response_model_exclude_unset: Annotated[ 

4368 bool, 

4369 Doc( 

4370 """ 

4371 Configuration passed to Pydantic to define if the response data 

4372 should have all the fields, including the ones that were not set and 

4373 have their default values. This is different from 

4374 `response_model_exclude_defaults` in that if the fields are set, 

4375 they will be included in the response, even if the value is the same 

4376 as the default. 

4377 

4378 When `True`, default values are omitted from the response. 

4379 

4380 Read more about it in the 

4381 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

4382 """ 

4383 ), 

4384 ] = False, 

4385 response_model_exclude_defaults: Annotated[ 

4386 bool, 

4387 Doc( 

4388 """ 

4389 Configuration passed to Pydantic to define if the response data 

4390 should have all the fields, including the ones that have the same value 

4391 as the default. This is different from `response_model_exclude_unset` 

4392 in that if the fields are set but contain the same default values, 

4393 they will be excluded from the response. 

4394 

4395 When `True`, default values are omitted from the response. 

4396 

4397 Read more about it in the 

4398 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). 

4399 """ 

4400 ), 

4401 ] = False, 

4402 response_model_exclude_none: Annotated[ 

4403 bool, 

4404 Doc( 

4405 """ 

4406 Configuration passed to Pydantic to define if the response data should 

4407 exclude fields set to `None`. 

4408 

4409 This is much simpler (less smart) than `response_model_exclude_unset` 

4410 and `response_model_exclude_defaults`. You probably want to use one of 

4411 those two instead of this one, as those allow returning `None` values 

4412 when it makes sense. 

4413 

4414 Read more about it in the 

4415 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). 

4416 """ 

4417 ), 

4418 ] = False, 

4419 include_in_schema: Annotated[ 

4420 bool, 

4421 Doc( 

4422 """ 

4423 Include this *path operation* in the generated OpenAPI schema. 

4424 

4425 This affects the generated OpenAPI (e.g. visible at `/docs`). 

4426 

4427 Read more about it in the 

4428 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). 

4429 """ 

4430 ), 

4431 ] = True, 

4432 response_class: Annotated[ 

4433 Type[Response], 

4434 Doc( 

4435 """ 

4436 Response class to be used for this *path operation*. 

4437 

4438 This will not be used if you return a response directly. 

4439 

4440 Read more about it in the 

4441 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). 

4442 """ 

4443 ), 

4444 ] = Default(JSONResponse), 

4445 name: Annotated[ 

4446 Optional[str], 

4447 Doc( 

4448 """ 

4449 Name for this *path operation*. Only used internally. 

4450 """ 

4451 ), 

4452 ] = None, 

4453 callbacks: Annotated[ 

4454 Optional[List[BaseRoute]], 

4455 Doc( 

4456 """ 

4457 List of *path operations* that will be used as OpenAPI callbacks. 

4458 

4459 This is only for OpenAPI documentation, the callbacks won't be used 

4460 directly. 

4461 

4462 It will be added to the generated OpenAPI (e.g. visible at `/docs`). 

4463 

4464 Read more about it in the 

4465 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). 

4466 """ 

4467 ), 

4468 ] = None, 

4469 openapi_extra: Annotated[ 

4470 Optional[Dict[str, Any]], 

4471 Doc( 

4472 """ 

4473 Extra metadata to be included in the OpenAPI schema for this *path 

4474 operation*. 

4475 

4476 Read more about it in the 

4477 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). 

4478 """ 

4479 ), 

4480 ] = None, 

4481 generate_unique_id_function: Annotated[ 

4482 Callable[[routing.APIRoute], str], 

4483 Doc( 

4484 """ 

4485 Customize the function used to generate unique IDs for the *path 

4486 operations* shown in the generated OpenAPI. 

4487 

4488 This is particularly useful when automatically generating clients or 

4489 SDKs for your API. 

4490 

4491 Read more about it in the 

4492 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). 

4493 """ 

4494 ), 

4495 ] = Default(generate_unique_id), 

4496 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

4497 """ 

4498 Add a *path operation* using an HTTP TRACE operation. 

4499 

4500 ## Example 

4501 

4502 ```python 

4503 from fastapi import FastAPI 

4504 

4505 app = FastAPI() 

4506 

4507 @app.trace("/items/{item_id}") 

4508 def trace_item(item_id: str): 

4509 return None 

4510 ``` 

4511 """ 

4512 return self.router.trace( 1abcdef

4513 path, 

4514 response_model=response_model, 

4515 status_code=status_code, 

4516 tags=tags, 

4517 dependencies=dependencies, 

4518 summary=summary, 

4519 description=description, 

4520 response_description=response_description, 

4521 responses=responses, 

4522 deprecated=deprecated, 

4523 operation_id=operation_id, 

4524 response_model_include=response_model_include, 

4525 response_model_exclude=response_model_exclude, 

4526 response_model_by_alias=response_model_by_alias, 

4527 response_model_exclude_unset=response_model_exclude_unset, 

4528 response_model_exclude_defaults=response_model_exclude_defaults, 

4529 response_model_exclude_none=response_model_exclude_none, 

4530 include_in_schema=include_in_schema, 

4531 response_class=response_class, 

4532 name=name, 

4533 callbacks=callbacks, 

4534 openapi_extra=openapi_extra, 

4535 generate_unique_id_function=generate_unique_id_function, 

4536 ) 

4537 

4538 def websocket_route( 1abcdef

4539 self, path: str, name: Union[str, None] = None 

4540 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

4541 def decorator(func: DecoratedCallable) -> DecoratedCallable: 1abcdef

4542 self.router.add_websocket_route(path, func, name=name) 1abcdef

4543 return func 1abcdef

4544 

4545 return decorator 1abcdef

4546 

4547 @deprecated( 1abcdef

4548 """ 

4549 on_event is deprecated, use lifespan event handlers instead. 

4550 

4551 Read more about it in the 

4552 [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). 

4553 """ 

4554 ) 

4555 def on_event( 1abcdef

4556 self, 

4557 event_type: Annotated[ 

4558 str, 

4559 Doc( 

4560 """ 

4561 The type of event. `startup` or `shutdown`. 

4562 """ 

4563 ), 

4564 ], 

4565 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

4566 """ 

4567 Add an event handler for the application. 

4568 

4569 `on_event` is deprecated, use `lifespan` event handlers instead. 

4570 

4571 Read more about it in the 

4572 [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/#alternative-events-deprecated). 

4573 """ 

4574 return self.router.on_event(event_type) 2a | jbb } qbc ~ xbd abEbe bbLbf cbSb

4575 

4576 def middleware( 1abcdef

4577 self, 

4578 middleware_type: Annotated[ 

4579 str, 

4580 Doc( 

4581 """ 

4582 The type of middleware. Currently only supports `http`. 

4583 """ 

4584 ), 

4585 ], 

4586 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

4587 """ 

4588 Add a middleware to the application. 

4589 

4590 Read more about it in the 

4591 [FastAPI docs for Middleware](https://fastapi.tiangolo.com/tutorial/middleware/). 

4592 

4593 ## Example 

4594 

4595 ```python 

4596 import time 

4597 from typing import Awaitable, Callable 

4598 

4599 from fastapi import FastAPI, Request, Response 

4600 

4601 app = FastAPI() 

4602 

4603 

4604 @app.middleware("http") 

4605 async def add_process_time_header( 

4606 request: Request, call_next: Callable[[Request], Awaitable[Response]] 

4607 ) -> Response: 

4608 start_time = time.time() 

4609 response = await call_next(request) 

4610 process_time = time.time() - start_time 

4611 response.headers["X-Process-Time"] = str(process_time) 

4612 return response 

4613 ``` 

4614 """ 

4615 

4616 def decorator(func: DecoratedCallable) -> DecoratedCallable: 1abcdef

4617 self.add_middleware(BaseHTTPMiddleware, dispatch=func) 1abcdef

4618 return func 1abcdef

4619 

4620 return decorator 1abcdef

4621 

4622 def exception_handler( 1abcdef

4623 self, 

4624 exc_class_or_status_code: Annotated[ 

4625 Union[int, Type[Exception]], 

4626 Doc( 

4627 """ 

4628 The Exception class this would handle, or a status code. 

4629 """ 

4630 ), 

4631 ], 

4632 ) -> Callable[[DecoratedCallable], DecoratedCallable]: 

4633 """ 

4634 Add an exception handler to the app. 

4635 

4636 Read more about it in the 

4637 [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/). 

4638 

4639 ## Example 

4640 

4641 ```python 

4642 from fastapi import FastAPI, Request 

4643 from fastapi.responses import JSONResponse 

4644 

4645 

4646 class UnicornException(Exception): 

4647 def __init__(self, name: str): 

4648 self.name = name 

4649 

4650 

4651 app = FastAPI() 

4652 

4653 

4654 @app.exception_handler(UnicornException) 

4655 async def unicorn_exception_handler(request: Request, exc: UnicornException): 

4656 return JSONResponse( 

4657 status_code=418, 

4658 content={"message": f"Oops! {exc.name} did something. There goes a rainbow..."}, 

4659 ) 

4660 ``` 

4661 """ 

4662 

4663 def decorator(func: DecoratedCallable) -> DecoratedCallable: 1abcdef

4664 self.add_exception_handler(exc_class_or_status_code, func) 1abcdef

4665 return func 1abcdef

4666 

4667 return decorator 1abcdef