{"id":22733264,"url":"https://github.com/ultikits/ultitools-reborn","last_synced_at":"2026-02-18T06:01:53.447Z","repository":{"id":167831334,"uuid":"566328594","full_name":"UltiKits/UltiTools-Reborn","owner":"UltiKits","description":"A library for Minecraft server plugin development.","archived":false,"fork":false,"pushed_at":"2024-07-28T09:13:07.000Z","size":1125,"stargazers_count":10,"open_issues_count":21,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-14T01:54:01.851Z","etag":null,"topics":["bukkit","bukkit-plugin","library","minecraft","minecraft-plugin","spigot","spigot-plugin","spigot-plugin-api"],"latest_commit_sha":null,"homepage":"https://dev.ultikits.com","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/UltiKits.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-15T12:54:17.000Z","updated_at":"2025-03-25T23:56:51.000Z","dependencies_parsed_at":null,"dependency_job_id":"b533bf85-8afb-41bc-8724-00b3f1be168e","html_url":"https://github.com/UltiKits/UltiTools-Reborn","commit_stats":null,"previous_names":["ultikits/ultitools-reborn"],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UltiKits%2FUltiTools-Reborn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UltiKits%2FUltiTools-Reborn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UltiKits%2FUltiTools-Reborn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UltiKits%2FUltiTools-Reborn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/UltiKits","download_url":"https://codeload.github.com/UltiKits/UltiTools-Reborn/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248809032,"owners_count":21164895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bukkit","bukkit-plugin","library","minecraft","minecraft-plugin","spigot","spigot-plugin","spigot-plugin-api"],"created_at":"2024-12-10T20:13:28.544Z","updated_at":"2026-02-18T06:01:53.440Z","avatar_url":"https://github.com/UltiKits.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cbr\u003e\r\n\u003cbr\u003e\r\n\r\n\u003cdiv align=\"center\"\u003e\r\n\u003cimg src=\"https://github.com/UltiKits/UltiTools-Reborn/assets/62180110/f5e8e7d3-e97d-4d37-a9ab-ba3722dc6faa\" width=\"96\" height=\"96\"/\u003e\r\n\u003c/div\u003e\r\n\r\n\r\n\u003ch1 align=\"center\"\u003eUltiTools-API\u003c/h1\u003e\r\n\r\n\u003cdiv align=\"center\"\u003e\u003cstrong\u003eThe Modern Spigot Plugin Framework\u003c/strong\u003e\u003c/div\u003e\r\n\r\n\u003cp align=\"center\"\u003eBuild Minecraft plugins the way you'd build a Spring Boot app — annotations, dependency injection, ORM, and scheduled tasks. Java 8+ compatible, Minecraft 1.8 - 1.21.\u003c/p\u003e\r\n\r\n\u003cbr\u003e\r\n\r\n\u003cdiv align=\"center\"\u003e\r\n\u003cimg alt=\"GitHub License\" src=\"https://img.shields.io/github/license/ultikits/ultitools-reborn?style=flat-square\"/\u003e\r\n\u003cimg alt=\"GitHub release (latest by date)\" src=\"https://img.shields.io/github/v/release/UltiKits/UltiTools-Reborn?style=flat-square\"/\u003e\r\n\u003cimg alt=\"Maven Central\" src=\"https://img.shields.io/maven-central/v/com.ultikits/UltiTools-API?style=flat-square\"/\u003e\r\n\u003cimg alt=\"GitHub Repo stars\" src=\"https://img.shields.io/github/stars/UltiKits/UltiTools-Reborn?style=flat-square\"/\u003e\r\n\u003cimg alt=\"Minecraft Version\" src=\"https://img.shields.io/badge/Minecraft-1.8--1.21-blue?style=flat-square\"/\u003e\r\n\u003cimg alt=\"Java Version\" src=\"https://img.shields.io/badge/Java-8+-orange?style=flat-square\"/\u003e\r\n\u003cimg alt=\"Spigot Rating\" src=\"https://img.shields.io/spiget/rating/85214?label=SpigotMC\u0026amp;style=flat-square\"/\u003e\r\n\u003cimg alt=\"bStats Players\" src=\"https://img.shields.io/bstats/players/8652?style=flat-square\"/\u003e\r\n\u003cimg alt=\"bStats Servers\" src=\"https://img.shields.io/bstats/servers/8652?style=flat-square\"/\u003e\r\n\u003ca href=\"https://www.codefactor.io/repository/github/ultikits/ultitools-reborn/overview/alpha\"\u003e\u003cimg src=\"https://www.codefactor.io/repository/github/ultikits/ultitools-reborn/badge/alpha\" alt=\"CodeFactor\" /\u003e\u003c/a\u003e\r\n\u003c/div\u003e\r\n\r\n---\r\n\r\n\u003cp align=\"center\"\u003e\r\n\u003cstrong\u003eEnglish\u003c/strong\u003e | \u003ca href=\"https://github.com/UltiKits/UltiTools-Reborn/wiki/%E4%B8%AD%E6%96%87%E4%BB%8B%E7%BB%8D\"\u003e中文文档\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n\u003cdiv align=\"center\"\u003e\r\n\r\n| [![discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge\u0026logo=discord\u0026logoColor=white)](https://discord.gg/6TVRRF47) | Join our Discord! | 加入官方 QQ 群！ | [![discord](https://img.shields.io/badge/Tencent_QQ-EB1923?style=for-the-badge\u0026logo=TencentQQ\u0026logoColor=white)](https://qm.qq.com/q/i5GeDH6a7C) |\r\n|-----------------------------------------------------------------------------------------------------------------------------------------|----------------------------|---------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\r\n\r\n\u003c/div\u003e\r\n\r\n\u003cbr\u003e\r\n\r\n## Why UltiTools?\r\n\r\nWriting Spigot plugins often means pages of boilerplate — registering commands manually, wiring up listeners, building raw SQL, scheduling BukkitRunnables everywhere. UltiTools-API eliminates all of that.\r\n\r\n**What you get:**\r\n\r\n| Feature | Traditional Spigot | With UltiTools-API |\r\n|---------|-------------------|-------------------|\r\n| Commands | `onCommand()` switch/case | `@CmdMapping(format = \"pay \u003cplayer\u003e \u003camount\u003e\")` |\r\n| Listeners | Manual registration in `onEnable()` | `@EventListener` auto-discovered |\r\n| Dependency injection | Static singletons everywhere | `@Autowired` like Spring |\r\n| Data storage | Raw JDBC or custom file I/O | `@Table` + `@Column` ORM, works with MySQL/SQLite/JSON |\r\n| Config | `getConfig().getString(...)` | `@ConfigEntry` on typed fields with validation |\r\n| Scheduled tasks | `new BukkitRunnable()` boilerplate | `@Scheduled(period = 6000)` on any method |\r\n| Feature toggles | Manual `if` checks | `@ConditionalOnConfig` skips entire components |\r\n| Transactions | Manual try/catch/rollback | `@Transactional` AOP proxy |\r\n\r\n\u003cbr\u003e\r\n\r\n## Quick Look\r\n\r\nA complete UltiTools module in under 50 lines:\r\n\r\n```java\r\n// Main class — just one annotation to enable auto-scanning\r\n@UltiToolsModule(scanBasePackages = {\"com.example.myplugin\"})\r\npublic class MyPlugin extends UltiToolsPlugin {\r\n    @Override\r\n    public boolean registerSelf() { return true; }\r\n\r\n    @Override\r\n    public void unregisterSelf() { }\r\n}\r\n```\r\n\r\n```java\r\n// Define your data — works with MySQL, SQLite, and JSON automatically\r\n@Data @Builder @NoArgsConstructor @AllArgsConstructor\r\n@EqualsAndHashCode(callSuper = true)\r\n@Table(\"homes\")\r\npublic class HomeEntity extends AbstractDataEntity {\r\n    @Column(\"player_id\") private String playerId;\r\n    @Column(\"name\")      private String name;\r\n    @Column(\"world\")     private String world;\r\n    @Column(\"x\")         private double x;\r\n    @Column(\"y\")         private double y;\r\n    @Column(\"z\")         private double z;\r\n}\r\n```\r\n\r\n```java\r\n// Write commands like controllers — auto-registered, auto-completed\r\n@CmdTarget(CmdTarget.CmdTargetType.PLAYER)\r\n@CmdExecutor(alias = {\"home\"}, permission = \"myplugin.home\")\r\npublic class HomeCommand extends AbstractCommandExecutor {\r\n\r\n    @Autowired\r\n    private HomeService homeService;\r\n\r\n    @CmdMapping(format = \"tp \u003cname\u003e\")\r\n    public void teleport(@CmdSender Player player, @CmdParam(\"name\") String name) {\r\n        homeService.teleport(player, name);\r\n    }\r\n\r\n    @CmdMapping(format = \"set \u003cname\u003e\")\r\n    public void setHome(@CmdSender Player player, @CmdParam(\"name\") String name) {\r\n        homeService.setHome(player, name, player.getLocation());\r\n        player.sendMessage(\"Home set!\");\r\n    }\r\n\r\n    @CmdMapping(format = \"list\")\r\n    public void listHomes(@CmdSender Player player) {\r\n        homeService.getHomes(player).forEach(h -\u003e\r\n            player.sendMessage(\" - \" + h.getName())\r\n        );\r\n    }\r\n}\r\n```\r\n\r\n```java\r\n// Service with DI, query DSL, and scheduled tasks\r\n@Service\r\npublic class HomeService {\r\n\r\n    @Autowired\r\n    private UltiToolsPlugin plugin;\r\n\r\n    public void teleport(Player player, String name) {\r\n        HomeEntity home = plugin.getDataOperator(HomeEntity.class)\r\n            .query()\r\n            .where(\"playerId\").eq(player.getUniqueId().toString())\r\n            .and(\"name\").eq(name)\r\n            .first();\r\n\r\n        if (home != null) {\r\n            Location loc = new Location(\r\n                Bukkit.getWorld(home.getWorld()),\r\n                home.getX(), home.getY(), home.getZ()\r\n            );\r\n            player.teleport(loc);\r\n        }\r\n    }\r\n\r\n    public List\u003cHomeEntity\u003e getHomes(Player player) {\r\n        return plugin.getDataOperator(HomeEntity.class)\r\n            .query()\r\n            .where(\"playerId\").eq(player.getUniqueId().toString())\r\n            .orderBy(\"name\")\r\n            .list();\r\n    }\r\n\r\n    @Scheduled(period = 72000, async = true) // Cleanup every hour\r\n    public void cleanupExpiredHomes() {\r\n        // Automatically called by the framework — no BukkitRunnable needed\r\n    }\r\n}\r\n```\r\n\r\nThat's it. No `onCommand()` switches, no manual listener registration, no `new BukkitRunnable()` boilerplate, no raw SQL.\r\n\r\n\u003cbr\u003e\r\n\r\n## Features\r\n\r\n### Annotation-Driven Commands\r\nMap subcommands directly to methods. Parameters are parsed and type-converted automatically.\r\n\r\n```java\r\n@CmdMapping(format = \"pay \u003cplayer\u003e \u003camount\u003e\")\r\npublic void pay(@CmdSender Player sender, @CmdParam(\"player\") String target, @CmdParam(\"amount\") double amount) {\r\n    // 'amount' is already a double — no manual parsing\r\n}\r\n```\r\n\r\n### IoC Container with `@Autowired`\r\nSpring-like dependency injection with three-level cache for circular dependency resolution.\r\n\r\n```java\r\n@Service\r\npublic class EconomyService {\r\n    @Autowired\r\n    private TransactionLogger logger;  // Auto-injected\r\n\r\n    @Transactional\r\n    public void transfer(UUID from, UUID to, double amount) {\r\n        // Automatic rollback on exception\r\n    }\r\n}\r\n```\r\n\r\n### Fluent Query DSL\r\nChain conditions, ordering, and pagination — works across MySQL, SQLite, and JSON storage.\r\n\r\n```java\r\nList\u003cAccountEntity\u003e richPlayers = plugin.getDataOperator(AccountEntity.class)\r\n    .query()\r\n    .where(\"balance\").gte(10000)\r\n    .orderByDesc(\"balance\")\r\n    .limit(10)\r\n    .list();\r\n\r\nboolean exists = plugin.getDataOperator(AccountEntity.class)\r\n    .query()\r\n    .where(\"owner\").eq(uuid)\r\n    .and(\"name\").eq(\"savings\")\r\n    .exists();\r\n```\r\n\r\n### `@Scheduled` Tasks\r\nDeclare scheduled methods — the framework handles BukkitRunnable creation, registration, and cleanup.\r\n\r\n```java\r\n@Service\r\npublic class InterestService {\r\n    @Scheduled(delay = 100, period = 36000, async = true) // 30min cycle, async\r\n    public void distributeInterest() {\r\n        // Called automatically. Cancelled when plugin unloads.\r\n    }\r\n\r\n    @Scheduled(delay = 20) // One-shot: runs once after 1 second\r\n    public void onStartup() {\r\n        // Initialization logic\r\n    }\r\n}\r\n```\r\n\r\n### Config Validation\r\nInvalid config values are automatically caught and reset to safe defaults on load and reload.\r\n\r\n```java\r\n@Getter @Setter\r\n@ConfigEntity(path = \"config/config.yml\")\r\npublic class EcoConfig extends AbstractConfigEntity {\r\n\r\n    @ConfigEntry(path = \"interestRate\", comment = \"Interest rate per cycle\")\r\n    @Range(min = 0.0, max = 1.0)\r\n    private double interestRate = 0.0003;\r\n\r\n    @ConfigEntry(path = \"currency_name\", comment = \"Currency display name\")\r\n    @NotEmpty\r\n    private String currencyName = \"Gold Coin\";\r\n\r\n    @ConfigEntry(path = \"motd\", comment = \"Server message of the day\")\r\n    @Size(min = 1, max = 256)\r\n    private String motd = \"Welcome!\";\r\n}\r\n```\r\n\r\n### `@ConditionalOnConfig`\r\nToggle entire features on/off from config — no `if` checks scattered through code.\r\n\r\n```java\r\n@Service\r\n@ConditionalOnConfig(value = \"config/config.yml\", path = \"enableInterest\")\r\npublic class InterestService {\r\n    // This bean is never created if enableInterest: false\r\n}\r\n\r\n@CmdExecutor(alias = {\"warp\"}, permission = \"myplugin.warp\")\r\n@ConditionalOnConfig(value = \"config/config.yml\", path = \"enableWarp\")\r\npublic class WarpCommands extends AbstractCommandExecutor {\r\n    // Command doesn't exist if enableWarp: false\r\n}\r\n```\r\n\r\n### AOP Proxies\r\n`@Transactional` and `@ExceptionCatch` via CGLIB runtime proxies — no boilerplate try/catch.\r\n\r\n```java\r\n@Service\r\npublic class BankService {\r\n    @Transactional(propagation = Propagation.REQUIRED)\r\n    public void transfer(UUID from, UUID to, double amount) {\r\n        withdraw(from, amount);\r\n        deposit(to, amount); // Rolls back both if this throws\r\n    }\r\n\r\n    @ExceptionCatch(value = IOException.class, silent = true)\r\n    public String readExternalData() {\r\n        // Returns null on IOException instead of crashing\r\n    }\r\n}\r\n```\r\n\r\n### More Built-in\r\n\r\n- **GUI Framework** — Inventory GUIs with pagination via ObliviateInvs\r\n- **i18n** — Built-in internationalization with `i18n(\"key\")`\r\n- **Hot Module Loading** — Load/unload plugin modules without server restart\r\n- **WebSocket + UltiPanel** — Remote server management (commands, files, monitoring, logs)\r\n- **Plugin Sandbox** — Class blacklisting, path traversal protection, command blocklists\r\n\r\n\u003cbr\u003e\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n- **Java**: 8 or higher\r\n- **Minecraft**: 1.8 - 1.21 (Spigot/Paper)\r\n- **UltiTools Plugin**: Install on your server\r\n\r\n### Add the Dependency\r\n\r\n**Maven**\r\n```xml\r\n\u003cdependency\u003e\r\n    \u003cgroupId\u003ecom.ultikits\u003c/groupId\u003e\r\n    \u003cartifactId\u003eUltiTools-API\u003c/artifactId\u003e\r\n    \u003cversion\u003e6.2.0\u003c/version\u003e\r\n\u003c/dependency\u003e\r\n```\r\n\r\n**Gradle**\r\n```groovy\r\nimplementation 'com.ultikits:UltiTools-API:6.2.0'\r\n```\r\n\r\n### Create `plugin.yml`\r\n\r\n```yaml\r\nname: MyPlugin\r\nversion: '${project.version}'\r\nmain: com.example.myplugin.MyPlugin\r\napi-version: 600\r\nauthors: [ YourName ]\r\n```\r\n\r\n### Write Your Plugin\r\n\r\n```java\r\n@UltiToolsModule(scanBasePackages = {\"com.example.myplugin\"})\r\npublic class MyPlugin extends UltiToolsPlugin {\r\n    @Override\r\n    public boolean registerSelf() {\r\n        return true;  // Commands, listeners, services are all auto-registered!\r\n    }\r\n\r\n    @Override\r\n    public void unregisterSelf() { }\r\n}\r\n```\r\n\r\nAdd `@CmdExecutor` on command classes, `@EventListener` on listener classes, and `@Service` on services. The framework discovers and wires everything automatically.\r\n\r\nFor detailed guides, see the [Developer Documentation](https://dev.ultikits.com/en/) or [Project Wiki](docs/wiki/README.md).\r\n\r\n\u003cbr\u003e\r\n\r\n## Documentation\r\n\r\n| Document | Description |\r\n|----------|-------------|\r\n| [Developer Docs](https://dev.ultikits.com/en/) | Full documentation site |\r\n| [Project Wiki](docs/wiki/README.md) | Complete project documentation |\r\n| [Architecture Guide](docs/wiki/ARCHITECTURE.md) | System architecture overview |\r\n| [IoC Container](docs/wiki/modules/IOC_CONTAINER.md) | Dependency injection guide |\r\n| [Command System](docs/wiki/modules/COMMAND_SYSTEM.md) | Command development guide |\r\n| [Data Storage](docs/wiki/modules/DATA_STORAGE.md) | Database operations guide |\r\n| [Quick Start Tutorial](docs/wiki/tutorials/QUICK_START.md) | First module tutorial |\r\n| [API Reference](docs/wiki/api/INDEX.md) | API quick reference |\r\n\r\n\u003cbr\u003e\r\n\r\n## Project Structure\r\n\r\n```\r\nUltiTools-Reborn/\r\n├── src/main/java/com/ultikits/ultitools/\r\n│   ├── UltiTools.java           # Main plugin entry\r\n│   ├── abstracts/               # Base classes (UltiToolsPlugin, AbstractCommandExecutor, etc.)\r\n│   ├── annotations/             # Framework annotations (@Service, @CmdExecutor, @Scheduled, etc.)\r\n│   │   └── config/              # Validation annotations (@Range, @NotEmpty, @Size, @Pattern)\r\n│   ├── aop/                     # AOP system (CglibProxyFactory, TransactionInterceptor)\r\n│   ├── context/                 # IoC container (SimpleContainer, ComponentScanner)\r\n│   ├── manager/                 # Core managers (Command, Listener, Config, Plugin, Task)\r\n│   ├── interfaces/              # Core interfaces (DataOperator, Query, DataStore) + impl/\r\n│   ├── websocket/               # UltiPanel WebSocket client + handlers\r\n│   └── utils/                   # SecurityPolicy, CloudAuthManager, ApiRateLimiter\r\n├── docs/wiki/                   # Project documentation\r\n└── pom.xml\r\n```\r\n\r\n\u003cbr\u003e\r\n\r\n## Contributing\r\n\r\n[Submit an Issue](https://github.com/UltiKits/UltiTools-Reborn/issues/new/choose) for bugs and suggestions.\r\n\r\n### Main Contributors\r\n| Contributor | Role |\r\n|-------------|------|\r\n| [@wisdommen](https://github.com/wisdommen) | Founder, UltiKits Author |\r\n| [@qianmo2233](https://github.com/qianmo2233) | Developer, Documentation Maintainer |\r\n| [@Shpries](https://github.com/Shpries) | Developer |\r\n| [@JueChenChen](https://github.com/JueChenChen) | Issue Feedback \u0026 Suggestions |\r\n| 拾柒 | Graphic Designer |\r\n\r\n\u003cbr\u003e\r\n\r\n## License\r\n\r\nMIT License — see [LICENSE](LICENSE) for details.\r\n\r\n\u003cbr\u003e\r\n\r\n## WakaTime Statistics\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003eDevelopment Timeline\u003c/summary\u003e\r\n\u003cimg alt=\"wakatime timeline\" src=\"https://wakatime.com/share/@wisdomme/0a9b3a30-f210-4be9-91f2-1b2e94ff403b.svg\"/\u003e\r\n\u003cbr\u003e\r\n\u003cbr\u003e\r\n\u003cimg alt=\"wakatime week\" src=\"https://wakatime.com/share/@wisdomme/bf0d9440-52ee-41b6-9df9-03fae3ae86dc.svg\"/\u003e\r\n\u003c/details\u003e\r\n\r\n\u003cbr\u003e\r\n\r\n## Acknowledgments\r\n\r\n|                                                                                                                           |                        |\r\n|---------------------------------------------------------------------------------------------------------------------------|------------------------|\r\n| ![Java](https://img.shields.io/badge/java-%23ED8B00.svg?style=for-the-badge\u0026logo=openjdk\u0026logoColor=white)                 | Development language |\r\n| ![GitHub Actions](https://img.shields.io/badge/github%20actions-%232671E5.svg?style=for-the-badge\u0026logo=githubactions\u0026logoColor=white) | CI/CD |\r\n| ![wakatime](https://img.shields.io/badge/IntelliJ_IDEA-000000.svg?style=for-the-badge\u0026logo=intellij-idea\u0026logoColor=white) | IDE |\r\n| ![Claude](https://img.shields.io/badge/Claude-191919?style=for-the-badge\u0026logo=anthropic\u0026logoColor=white)                   | AI-assisted development |\r\n| ![wakatime](https://img.shields.io/badge/apache_maven-C71A36?style=for-the-badge\u0026logo=apachemaven\u0026logoColor=white)        | Build tool |\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fultikits%2Fultitools-reborn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fultikits%2Fultitools-reborn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fultikits%2Fultitools-reborn/lists"}