open-index/open-npm huggingface dataset:
npm package: @mugisha_pascal/start-it
Description: A prompt-based CLI tool to scaffold projects for Go, Flutter, React Native, Spring Boot, and more
Latest version: 1.0.0

# start-it

A prompt-based CLI tool to scaffold projects for various frameworks and languages.

## Features

- Interactive prompt-based project setup
- Support for multiple frameworks:
  - Go
  - Flutter
  - React Native
  - Spring Boot
  - Node.js
  - Python
- Beautiful CLI interface with colors and spinners
- Fast project scaffolding

## Installation

```bash
npm install -g start-it
```

Or use with `npx`:

```bash
npx start-it
```

## Usage

Simply run the command:

```bash
start-it
```

Then follow the interactive prompts to:

1. Select your project type (Go, Flutter, React Native, Spring Boot, etc.)
2. Enter your project name
3. Choose additional options based on your framework
4. Watch as your project is scaffolded automatically

## Example

```bash
$ start-it
? What type of project would you like to create? (Use arrow keys)
❯ Go
  Flutter
  React Native
  Spring Boot
  Node.js
  Python

? Project name: my-awesome-app
? Select Go template: (Use arrow keys)
❯ Basic CLI
  Web API
  Microservice

Project created successfully!
```

## Supported Frameworks

### Go

- Basic CLI application
- Web API (using Gin)
- Microservice template

### Flutter

- Mobile app
- Web app
- Desktop app

### React Native

- Expo project
- Bare React Native project

### Spring Boot

- REST API
- Web application
- Microservice

### Node.js

- Express API
- Next.js application
- TypeScript project

### Python

- Django project
- Flask application
- FastAPI service

## Development

### Setup

```bash
npm install
npm run build
```

### Development Mode

```bash
npm run dev
```

### Testing

```bash
npm test
```

## License

MIT
npm package: @mugo-agency/eslint-config
Description: A shareable set of ESLint rules to maintain standards across projects.
Author: Sam Wells
Latest version: 0.0.5

[![Node.js Package](https://github.com/mugoagency/eslint-config/actions/workflows/npm-publish.yml/badge.svg)](https://github.com/mugoagency/eslint-config/actions/workflows/npm-publish.yml)
# eslint-config

Mugo's shareable svgo config for use across projects.

## Installation 

Install `@mugo-agency/eslint-config`:

**With Yarn**
```
yarn add --dev @mugo-agency/eslint-config
```

**With npm**
```
npm install @mugo-agency/eslint-config --save-dev
```

## Usage
Mugo's ESLint config comes bundled in `@mugo-agency/eslint-config`. 
Add to your `.eslintrc.js`

```
const config = require("@mugo-agency/eslint-config");
module.exports = config;
```
npm package: @mugo-agency/postcss-config
Description: A shareable postcss config.
Author: Sam Wells
Latest version: 0.2.7

[![Node.js Package](https://github.com/mugoagency/postcss-config/actions/workflows/npm-publish.yml/badge.svg)](https://github.com/mugoagency/postcss-config/actions/workflows/npm-publish.yml)
# postcss-config

Mugo's shareable PostCSS config for use across projects.

## Installation

Install `@mugo-agency/postcss-config`:

**With Yarn**
```
yarn add --dev @mugo-agency/postcss-config
```

**With npm**
```
npm install @mugo-agency/postcss-config --save-dev
```

## Usage
Mugo's postcss config comes bundled in `@mugo-agency/postcss-config`.
Add to your `postcss.config.js`

```
const config = require("@mugo-agency/postcss-config");
module.exports = config;
```
npm package: @mugo-agency/stylelint-config
Description: A shareable set of Stylelint rules to maintain CSS Standards across projects.
Author: Sam Wells
Latest version: 0.1.0

[![Node.js Package](https://github.com/mugoagency/stylelint-config/actions/workflows/npm-publish.yml/badge.svg)](https://github.com/mugoagency/stylelint-config/actions/workflows/npm-publish.yml)
# stylelint-config

Mugo's shareable Stylelint config for use across projects.

## Installation 

Install [stylelint](https://stylelint.io/) and `@mugo-agency/stylelint-config`:

**With Yarn**
```
yarn add --dev stylelint @mugo-agency/stylelint-config
```

**With npm**
```
npm install stylelint @mugo-agency/stylelint-config --save-dev
```


## Usage
Mugo's stylelint rules come bundled in `@mugo-agency/stylelint-config`. To enable these rules, add a `stylelint` property in your `package.json`. See the [stylelint configuration docs](https://stylelint.io/user-guide/configuration/) for more details.
```
"stylelint": {
  "extends": ["@mugo-agency/stylelint-config"]
}
```

Now you can run stylelint by adding the following linting script to your `package.json`. See the [stylelint CLI docs](https://stylelint.io/user-guide/cli/) for more details.
```
"scripts": {
  "stylelint": "stylelint 'src/**/*.scss'"
}
```
Run it:

**With Yarn**
```
yarn run stylelint
```

**With npm**
```
npm run stylelint
```
npm package: @mugo-agency/svgo-config
Description: A shareable svgo config to maintain standards across projects.
Author: Sam Wells
Latest version: 0.0.5

[![Node.js Package](https://github.com/mugoagency/svgo-config/actions/workflows/npm-publish.yml/badge.svg)](https://github.com/mugoagency/svgo-config/actions/workflows/npm-publish.yml)
# svgo-config

Mugo's shareable svgo config for use across projects.

## Installation 

Install `@mugo-agency/svgo-config`:

**With Yarn**
```
yarn add --dev @mugo-agency/svgo-config
```

**With npm**
```
npm install @mugo-agency/svgo-config --save-dev
```

## Usage
Mugo's postcss config comes bundled in `@mugo-agency/svgo-config`. 
Add to your `svgo.config.js`

```
const config = require("@mugo-agency/svgo-config");
module.exports = config;
```
npm package: @mugos/case-swapper
Description: [![Build Status](https://travis-ci.org/mugos/case-swapper.svg?branch=master)](https://travis-ci.org/mugos/case-swapper) [![npm module](https://badge.fury.io/js/mugos-case-swapper.svg)](https://www.npmjs.org/package/mugos/case-swapper)
Latest version: 1.0.0

[![Build Status](https://travis-ci.org/mugos/case-swapper.svg?branch=master)](https://travis-ci.org/mugos/case-swapper)
[![npm module](https://badge.fury.io/js/mugos-case-swapper.svg)](https://www.npmjs.org/package/mugos/case-swapper)

# Case Swapper
npm package: @mugos/fredis
Description: A functional redis client.
Latest version: 0.0.0

# fredis

A funtional redis client

[![Build Status](https://travis-ci.org/mugos/fredis.svg?branch=master)](https://travis-ci.org/mugos/fredis)
[![npm module](https://badge.fury.io/js/fredis.svg)](https://www.npmjs.org/package/fredis)

Why fredis?
-----------

## ROADMAP

- remove dependecy on redis npm package
npm package: @mugos/ftw
Description: Function Training Wheels
Latest version: 0.13.7

[![Build Status](https://travis-ci.org/mugos/ftw.svg?branch=master)](https://travis-ci.org/mugos/ftw)
[![npm module](https://badge.fury.io/js/%40mugos%2Fftw.svg)](https://www.npmjs.org/package/@mugos/ftw)

# FTW

Functional Programming Training Wheels
npm package: @mugos/log
Description: [![Build Status](https://travis-ci.org/mugos/log.svg?branch=master)](https://travis-ci.org/mugos/log) [![npm module](https://badge.fury.io/js/mugos-log.svg)](https://www.npmjs.org/package/mugos/log)
Latest version: 1.0.4

[![Build Status](https://travis-ci.org/mugos/log.svg?branch=master)](https://travis-ci.org/mugos/log)
[![npm module](https://badge.fury.io/js/mugos-log.svg)](https://www.npmjs.org/package/mugos/log)

# log
npm package: @mugshot/browser-contract
Description: Contract tests for Mugshot's Browser interface
Author: Andrei Picus
Latest version: 2.0.1

> Contract tests for Mugshot's `Browser` interface

----

## Usage

```typescript
import { describe, it, before } from 'mocha';
import MyAdapter from './src';
import browserContractTests, { BrowserToBeAdapted } from '@mugshot/browser-contract';

describe('MyAdapter', () => {
  let browser!: BrowserToBeAdapted;

  before(async () => {
    // Set up browser here.
  });

  browserContractTests.forEach(test => {
    it(test.name, test.getTest(browser, new MyAdapter(browser)));
  });
});
```
npm package: @mugshot/contracts
Description: Contract tests for Mugshot's various interfaces
Author: Andrei Picus
Latest version: 4.0.2

> Contract tests for Mugshot's various interfaces

----

## Install

```
npm install @mugshot/contracts
```
or
```
yarn add @mugshot/contracts
```

## Docs

[View API docs](https://nighttrax.github.io/mugshot/api/modules/_mugshot_contracts)
npm package: @mugshot/jimp
Description: Custom Jimp instance to use in Mugshot
Author: Andrei Picus
Latest version: 0.0.3

This is a custom [Jimp](https://github.com/oliver-moran/jimp) instance with a minimal set of types and plugins configured, to be used with [Mugshot](https://github.com/NiGhTTraX/mugshot). The main purpose of this is to disable the GIF type which breaks tests in jest@27 because of an import that happens in `process.nextTick`.
npm package: @mugshot/playwright
Description: A Playwright adapter for Mugshot
Author: Andrei Picus
Latest version: 2.0.2

> [Playwright](https://www.npmjs.com/package/playwright) adapter for Mugshot

[![Build status](https://github.com/NiGhTTraX/mugshot/actions/workflows/ci.yml/badge.svg)](https://github.com/NiGhTTraX/mugshot/actions/workflows/ci.yml)
[![codecov](https://codecov.io/gh/NiGhTTraX/mugshot/branch/master/graph/badge.svg)](https://codecov.io/gh/NiGhTTraX/mugshot)
![npm type definitions](https://img.shields.io/npm/types/@mugshot/playwright.svg)
[![License](https://img.shields.io/github/license/nighttrax/mugshot)](LICENSE)

----

## Install

```
npm install @mugshot/playwright
```
or
```
yarn add @mugshot/playwright
```

## Docs

[View API docs](https://nighttrax.github.io/mugshot/api/modules/_mugshot_playwright)
npm package: @mugshot/puppeteer
Description: A Puppeteer adapter for Mugshot
Author: Andrei Picus
Latest version: 3.0.0

> Puppeteer adapter for Mugshot

[![Build status](https://github.com/NiGhTTraX/mugshot/actions/workflows/ci.yml/badge.svg)](https://github.com/NiGhTTraX/mugshot/actions/workflows/ci.yml)
[![codecov](https://codecov.io/gh/NiGhTTraX/mugshot/branch/master/graph/badge.svg)](https://codecov.io/gh/NiGhTTraX/mugshot)
![npm type definitions](https://img.shields.io/npm/types/@mugshot/puppeteer.svg)
[![License](https://img.shields.io/github/license/nighttrax/mugshot)](LICENSE)

----

## Install

```
npm install @mugshot/puppeteer
```
or
```
yarn add @mugshot/puppeteer
```

## Docs

[View API docs](https://nighttrax.github.io/mugshot/api/modules/_mugshot_puppeteer)
npm package: @mugshot/selenium
Description: Spin up a Selenium grid for Mugshot tests
Author: Andrei Picus
Latest version: 1.0.2

> Docker scripts to start a Selenium grid to be used for testing Mugshot packages

----

## Requirements

- Docker
- docker-compose


## Usage

Spin up a Selenium server listening at `0.0.0.0:4444` and 2 browser nodes (Chrome and Firefox) that connect to it:

```sh
npx @mugshot/selenium start
```

Spin up a Selenium server listening at `0.0.0.0:4444` and 2 debug nodes (Chrome and Firefox) that have VNC listening at `0.0.0.0:5900` and `0.0.0.0:5901`:

```sh
npx @mugshot/selenium debug
```

Stop everything:

```sh
npx @mugshot/selenium stop
```
npm package: @mugshot/webdriverio
Description: A WebdriverIO adapter for Mugshot
Author: Andrei Picus
Latest version: 3.0.2

> WebdriverIO adapter for Mugshot

[![Build status](https://github.com/NiGhTTraX/mugshot/actions/workflows/ci.yml/badge.svg)](https://github.com/NiGhTTraX/mugshot/actions/workflows/ci.yml)
[![codecov](https://codecov.io/gh/NiGhTTraX/mugshot/branch/master/graph/badge.svg)](https://codecov.io/gh/NiGhTTraX/mugshot)
![npm type definitions](https://img.shields.io/npm/types/@mugshot/webdriverio.svg)
[![License](https://img.shields.io/github/license/nighttrax/mugshot)](LICENSE)

----

## Install

```
npm install @mugshot/webdriverio
```
or
```
yarn add @mugshot/webdriverio
```

## Docs

[View API docs](https://nighttrax.github.io/mugshot/api/modules/_mugshot_webdriverio)
npm package: @mugshotlabs/guardian-js
Description: SDK to load Fraud Detection Agent via CDN and initialize it
Latest version: 0.2.3

## Guardian JS SDK (`@mugshotlabs/guardian-js`)

Client-side SDK to initialize the Guardian Fraud Detection Agent and create an identification event from the browser. It returns a request id you can send to your backend to fetch the full event and decide whether to pass or apply additional checks.

---

### Installation

```bash
npm install @mugshotlabs/guardian-js
# or
yarn add @mugshotlabs/guardian-js
# or
pnpm add @mugshotlabs/guardian-js
```

---

### Quick start (npm, ESM)

```ts
import { loadAgent } from "@mugshotlabs/guardian-js";

async function main() {
  // Initialize with your site key (debug is optional and can be omitted)
  const api = await loadAgent({ siteKey: "YOUR_SITE_KEY" });

  // Create an identification event and get its request id
  const response = await api.get();
  const body = response && (await response.json());
  const requestId = body?.requestId;

  // Send requestId to your backend to retrieve the full event
  // and decide whether to pass or perform additional checks
}

main();
```

- Backend SDK: fetch the event by `requestId` and implement your decisioning with the server SDK: [Guardian JS Server SDK on npm](https://www.npmjs.com/package/@mugshotlabs/guardianjs-server)

---

### API (client)

- `loadAgent({ siteKey: string }) => Promise<Agent>`
  - Initializes the browser Agent. `debug` is optional and not required.
- `Agent.get() => Promise<Response | undefined>`
  - Creates an identification event and returns a response containing a `requestId`. Send this `requestId` to your backend to fetch the event and decide whether to pass or add additional checks.

---

### License

MIT © Mugshot Labs
npm package: @mugtungshing/core
Description: Tungshing generator for MUG players.
Author: mochaaP
Latest version: 0.7.0

# 音游狗老黄历 Bot [![Core](https://img.shields.io/static/v1?label=&message=Core&color=blue&logo=typescript&logoColor=white)](https://github.com/mugtungshing/core)

[![MIT Licensed](https://img.shields.io/badge/license-MIT-brightgreen.svg)](./LICENSE)
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
![npm bundle size](https://img.shields.io/bundlephobia/minzip/@mugtungshing/core)
[![npm](https://img.shields.io/npm/v/@mugtungshing/core)](https://www.npmjs.com/package/@mugtungshing/core)
[![codecov](https://codecov.io/gh/mugtungshing/core/branch/main/graph/badge.svg?token=V48jl8kASP)](https://codecov.io/gh/mugtungshing/core)

「音游狗老黄历」生成器核心。

[阅读文档 ↗](https://mugtungshing-core.netlify.app/) [![Netlify Status](https://api.netlify.com/api/v1/badges/686cf4f9-a457-4c56-9b82-0a1f78946133/deploy-status)](https://app.netlify.com/sites/mugtungshing-core/deploys)

## 上手

### 安装

#### 通过包管理器安装

- npm

  ```sh
  npm i @mugtungshing/core
  ```

- yarn

  ```sh
  yarn add @mugtungshing/core
  ```

#### 从 CDN 加载

```html
<script type="module">
  import { Tungshing, Identifier } from 'https://cdn.skypack.dev/@mugtungshing/core'
</script>
```

### 使用

```javascript
new Tungshing(new Identifier(Math.random().toString()), new Date(), 'Asia/Shanghai') // 生成 GMT+8 的今日黄历
```

**注意**：这并不是一个很好的范例，随机种子需要对每个用户独立唯一，且无法通过用户 ID 推出。

## 贡献

欢迎贡献！

1. 点击右上角的 Fork
2. 创建一个分支 (`git checkout -b feature/user-update-dict`)
3. 提交更改 (`git commit -m 'feat(dict): add SDVX'`)
4. 推送更改 (`git push origin feature/user-update-dict`)
5. 提交 Pull Request

> 需要向词典添加内容，请参见 [`dict.json`](./src/tungshing/dict.json)

## 协议

MIT
npm package: @muguilin/calendar
Description: calendar.js, JavaScript日历插件, JavaScript日历转换库
Author: 沐枫（MuGuiLin）
Latest version: 1.0.1

# calendar - JavaScript 日历插件、日历转换库

[![MIT License](https://img.shields.io/npm/l/utilsjs.svg?style=flat-square)](https://www.npmjs.com/package/mu-tooljs)

> JavaScript 日历插件、日历转换库
>
> 中国农历（阴阳历）和西元阳历即公历互转JavaScript库 [js-calendar-converter ](https://www.npmjs.com/package/js-calendar-converter)



#### 下载安装：

```shell
# 使用npm命令下载安装
$ npm i @muguilin/calendar

# 使用yarn命令下载安装
$ yarn add @muguilin/calendar
```



#### 使用实例：

```html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>JavaScript 日历、转换库</title>
  <style>
    body { padding: 50px; }
    section {  margin: 50px auto; width: 1200px; }
    h1{ text-align: center; }
    #el { margin: auto; padding: 20px; width: 500px; height: 310px; border: 1px solid gray; overflow: auto;}
    #el table{ width: 100%; text-align: center; }
    .now{ background-color: blue; color: #fff; }
    button { font-size: 16px; }
  </style>
</head>

<body>
  <h1>JavaScript 日历、转换库</h1>
  <hr />

  <section>
    
    <h1 id="toDay"></h1>

    <main>
        <!--<button type="button" id="perv">上一月</button>
        <button type="button" id="next">下一月</button>-->
        <div id="calendar"> </div>
       
    </main>

  </section>

  <script type="module">
    import { muCalendar, solar2lunar, lunar2solar } from '@muguilin/calendar';
	
    // 日历
    {
        const calendar = muCalendar(document.querySelector('#calendar'));

        console.log(calendar);
    }   

    // 转换
    {
        console.log('公历年月日转农历数据：', solar2lunar());

        const {Animal, gzYear, cYear, cMonth, cDay, ncWeek, IMonthCn, IDayCn} = solar2lunar();
        
        console.log('农历年月日转公历年月日：', lunar2solar(cYear, cMonth, cDay));

        toDay.innerHTML = `${Animal}【${gzYear}】，国历：${cYear}年${cMonth}月${cDay}日 ${ncWeek} ，农历：${IMonthCn} ${IDayCn}`

    };

  </script>

</body>

</html>
```
npm package: @muguilin/jweixin
Description: 微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包。
Author: 沐枫（MuGuiLin）
Latest version: 1.6.0

# 微信 JS-SDK

[![MIT License](https://img.shields.io/npm/l/utilsjs.svg?style=flat-square)](https://www.npmjs.com/package/mu-tooljs)

> 微信JS-SDK是[微信公众平台](https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN) 面向网页开发者提供的基于微信内的网页开发工具包。
>
> 通过使用微信JS-SDK，网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力，同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力，为微信用户提供更优质的网页体验。
>
> 为了方便在Web开发框架中，能直接下载安装使用而在Npm中分享发布！



#### 下载安装：

```shell
# 使用npm下载安装
$ npm i @muguilin/jweixin

# 使用yarn下载安装
$ yarn add @muguilin/jweixin

# 微信官方JS-SDK
http://res2.wx.qq.com/open/js/jweixin-1.6.0.js
```



#### 使用文档：

#### [🚀 微信Web网页开发 / JS-SDK说明文档](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html)
npm package: @muguilin/xf-voice-dictation
Description: 讯飞语音听写 WebAPI
Author: 沐枫（MuGuiLin）
Latest version: 1.0.1

# @muguilin/xf-voice-dictation

[![MIT License](https://img.shields.io/npm/l/utilsjs.svg?style=flat-square)](https://www.npmjs.com/package/mu-tooljs)

> 基于 讯飞语音听写流式接口 进行二次封装，用于在 1 分钟内的即时语音转文字技术，支持实时返回识别结果，达到一边上传音频一边获得识别文本的效果。
>
> 该语音能力是通过 Websocket API 的方式给开发者提供一个通用的接口。Websocket API 具备流式传输能力，适用于需要流式数据传输的 AI 服务场景，比如边说话边识别。相较于 SDK，API 具有轻量、跨语言的特点；相较于 HTTP API，Websocket API 协议有原生支持跨域的优势。

#### 🏡 下载安装：

```shell
# 使用npm命令下载安装
$ npm i @muguilin/xf-voice-dictation

# 使用yarn命令下载安装
$ yarn add @muguilin/xf-voice-dictation
```

#### 🔍 实例效果：

[语音听写 DEMO（流式版）WebAPI (muguilin.github.io)](https://muguilin.github.io/VoiceDictation/)

[讯飞语音听写（流式版）WebAPI 文档 | (xfyun.cn)](https://www.xfyun.cn/doc/asr/voicedictation/API.html)

#### 🚀 使用方法：

> 【关于：】服务接口认证信息这 3 个参数据：APPID、APISecret、APIKey，请到官网申请（https://www.xfyun.cn/services/voicedictation）
>
> 【注意：】APISecret 和 APIKey 的长度都差不多很相似，所以要填错哦！

```javascript
import { XfVoiceDictation } from '@muguilin/xf-voice-dictation';

let times = null;
const xfVoice = new XfVoiceDictation({
    APPID: 'xxx',
    APISecret: 'xxx',
    APIKey: 'xxx',

    // webSocket请求地址 非必传参数，默认为：wss://iat-api.xfyun.cn/v2/iat
    // url: '',

    // 监听录音状态变化回调
    onWillStatusChange: function (oldStatus, newStatus) {
        // 可以在这里进行页面中一些交互逻辑处理：注：倒计时（语音听写只有60s）,录音的动画，按钮交互等！
        console.log('识别状态：', oldStatus, newStatus);
    },

    // 监听识别结果的变化回调
    onTextChange: function (text) {
        // 可以在这里进行页面中一些交互逻辑处理：如将文本显示在页面中
        console.log('识别内容：',text)

        // 如果3秒钟内没有说话，就自动关闭（60s后也会自动关闭）
        if (text) {
            clearTimeout(times);
            times = setTimeout(() => {
                this.stop();
            }, 3000);
        };
    },

    // 监听识别错误回调
    onError: function(error){
        console.log('错误信息：', error)
    }
});


// 给Dom元素加添事件，来调用开始语音识别！
// xfVoice.start();


// 给Dom元素加添事件，来调用关闭语音识别！
// xfVoice.stop();

```
npm package: @muhaddis/lord-ring-sdk
Description: This SDK package can be used to to access Lord of Ring API's
Author: Muhaddis Umer
Latest version: 1.0.0

# Lord Ring API SDK
This SDK package can be used to to access Lord of Ring API's

## API KEY's
You can get API Keys by Signing up on: 
```https://the-one-api.dev/sign-up```

## Installation
```npm i muhaddis-lord-ring-sdk```

## Usage
```const LordRing = require("muhaddis-lord-ring-sdk");```

### 1. Movies
Function to get all movies:
```LordRing.movies.getAll(api-key-here)```

Function to get movie by id:
```LordRing.movies.getById(movieId, api-key-here)```

Function to get quote of a movie by id:
```LordRing.movies.getQuote(movieId, api-key-here)```

### 2. Quotes
Function to get all quotes:
```LordRing.quotes.getAll(api-key-here)```

Function to get quotes by id:
```LordRing.quotes.getById(quoteId, api-key-here)```

## Future Modules
### 1. Books
### 2. Characters