@ycookiey/yfuzzy 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +191 -176
- package/THIRD_PARTY_NOTICES.md +49 -3
- package/dist/entry.d.ts +10 -1
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +39 -1
- package/dist/entry.js.map +1 -1
- package/dist/expand.d.ts +1 -1
- package/dist/expand.js +3 -3
- package/dist/expand.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/keystroke.d.ts +5 -0
- package/dist/keystroke.d.ts.map +1 -0
- package/dist/keystroke.js +79 -0
- package/dist/keystroke.js.map +1 -0
- package/dist/lattice.d.ts +63 -0
- package/dist/lattice.d.ts.map +1 -0
- package/dist/lattice.js +277 -0
- package/dist/lattice.js.map +1 -0
- package/dist/pipeline.d.ts +2 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +26 -2
- package/dist/pipeline.js.map +1 -1
- package/dist/query.d.ts +13 -9
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +11 -7
- package/dist/query.js.map +1 -1
- package/dist/tiers/tier1-exact.d.ts.map +1 -1
- package/dist/tiers/tier1-exact.js +332 -50
- package/dist/tiers/tier1-exact.js.map +1 -1
- package/dist/tiers/tier2-flexible.d.ts.map +1 -1
- package/dist/tiers/tier2-flexible.js +45 -1
- package/dist/tiers/tier2-flexible.js.map +1 -1
- package/dist/tiers/tier3-typo.d.ts.map +1 -1
- package/dist/tiers/tier3-typo.js +128 -12
- package/dist/tiers/tier3-typo.js.map +1 -1
- package/dist/tiers/tier4-structural.d.ts.map +1 -1
- package/dist/tiers/tier4-structural.js +2 -0
- package/dist/tiers/tier4-structural.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/vendor/wanakana/romaji-to-kana.d.ts +5 -0
- package/dist/vendor/wanakana/romaji-to-kana.d.ts.map +1 -1
- package/dist/vendor/wanakana/romaji-to-kana.js +21 -0
- package/dist/vendor/wanakana/romaji-to-kana.js.map +1 -1
- package/dist/yfuzzy.min.js +2 -2
- package/package.json +61 -61
- package/dist/ablate.d.ts +0 -8
- package/dist/ablate.d.ts.map +0 -1
- package/dist/ablate.js +0 -11
- package/dist/ablate.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,176 +1,191 @@
|
|
|
1
|
-
# yfuzzy
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/@ycookiey/yfuzzy)
|
|
4
|
-
[](https://www.npmjs.com/package/@ycookiey/yfuzzy)
|
|
5
|
-
[](https://bundlephobia.com/package/@ycookiey/yfuzzy)
|
|
6
|
-
[](./LICENSE)
|
|
7
|
-
|
|
8
|
-
日本語特化のあいまい検索ライブラリ。ローマ字混じり入力・ヘボン式/訓令式の同時照合・子音だけのマッチ・誤字許容を 1 パッケージに統合。依存ゼロ・ESM・TypeScript 型付き。
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
shinjuku / sinjuku / しんじゅく / シンジュク → すべて「シンジュク」にヒット
|
|
12
|
-
kmnr → 「カミナリ」にヒット(子音だけ)
|
|
13
|
-
カナリ → 「カミナリ」にヒット(とびとび一致)
|
|
14
|
-
センタイ → 「センダイ」にヒット(誤字)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
|
38
|
-
|
|
|
39
|
-
|
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
|
44
|
-
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
<script>
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
{ label: '
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
index
|
|
104
|
-
index.search('
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
1
|
+
# yfuzzy
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@ycookiey/yfuzzy)
|
|
4
|
+
[](https://www.npmjs.com/package/@ycookiey/yfuzzy)
|
|
5
|
+
[](https://bundlephobia.com/package/@ycookiey/yfuzzy)
|
|
6
|
+
[](./LICENSE)
|
|
7
|
+
|
|
8
|
+
日本語特化のあいまい検索ライブラリ。ローマ字混じり入力・ヘボン式/訓令式の同時照合・子音だけのマッチ・誤字許容を 1 パッケージに統合。依存ゼロ・ESM・TypeScript 型付き。
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
shinjuku / sinjuku / しんじゅく / シンジュク → すべて「シンジュク」にヒット
|
|
12
|
+
kmnr → 「カミナリ」にヒット(子音だけ)
|
|
13
|
+
カナリ → 「カミナリ」にヒット(とびとび一致)
|
|
14
|
+
センタイ → 「センダイ」にヒット(誤字)
|
|
15
|
+
かぇんだr → 「Calendar」にヒット(IME オンのまま英字を打った入力)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## なぜ yfuzzy か
|
|
19
|
+
|
|
20
|
+
既存のあいまい検索ライブラリ(fuse.js / fuzzysort / MiniSearch / uFuzzy / match-sorter など)はラテン文字圏を前提に設計されており、diacritics(発音区別符号)の除去や Unicode 正規化には対応するものの、**ローマ字とかなの変換や、ヘボン式・訓令式の違いを扱わない**。
|
|
21
|
+
|
|
22
|
+
日本語 UI では、利用者はローマ字・部分的なかな・子音だけ(上の例)で打つ一方、データはひらがな・カタカナ・漢字(の読み)で保持されている。yfuzzy はこの表記のずれを埋めることに特化している。
|
|
23
|
+
|
|
24
|
+
## スコープ
|
|
25
|
+
|
|
26
|
+
**向いている**: 日本語の読み(かな)を索引にした短い文字列の検索。駅名・地名・商品名・人名などの読みに対する、逐次検索(type-ahead)やオートコンプリート。英字の名前が混ざった索引を英字で探す用途にも対応する([照合経路](#照合経路matching))。
|
|
27
|
+
|
|
28
|
+
**向いていない**:
|
|
29
|
+
|
|
30
|
+
- **漢字をそのまま検索**: yfuzzy は漢字を読みに変換しない(文字どおりの一致のみ)。読みで当てたいなら読み仮名を用意し `getText` で返す([使い方](#使い方)参照)。
|
|
31
|
+
- **ラテン文字の全文検索**(複数フィールド・トークン化・TF-IDF): fuse.js / MiniSearch 等が成熟している。用途で使い分けるとよい。
|
|
32
|
+
|
|
33
|
+
## 類似パッケージとの比較
|
|
34
|
+
|
|
35
|
+
| 機能 | yfuzzy | [fuse.js](https://www.fusejs.io/) | [fuzzysort](https://github.com/farzher/fuzzysort) | [MiniSearch](https://github.com/lucaong/minisearch) | [uFuzzy](https://github.com/leeoniya/uFuzzy) | [match-sorter](https://github.com/kentcdodds/match-sorter) |
|
|
36
|
+
|---|:--:|:--:|:--:|:--:|:--:|:--:|
|
|
37
|
+
| 日本語入力(ローマ字↔かな・ヘボン/訓令・かな正規化) | ✅ | ➖ | ➖ | ➖ | ➖ | ➖ |
|
|
38
|
+
| 子音だけのマッチ | ✅ | ➖ | 🔸 | ➖ | 🔸 | 🔸 |
|
|
39
|
+
| とびとび一致(subsequence) | ✅ | 🔸 | ✅ | ➖ | ✅ | 🔸 |
|
|
40
|
+
| 誤字許容(編集距離) | ✅ | ✅ | ➖ | ✅ | 🔸 | ➖ |
|
|
41
|
+
| ハイライト位置の返却 | ✅ | ✅ | ✅ | 🔸 | ✅ | ➖ |
|
|
42
|
+
| 索引の事前構築 | ✅ | ✅ | ✅ | ✅ | ➖ | ➖ |
|
|
43
|
+
| 全文検索(複数フィールド/トークン) | ➖ | ✅ | 🔸 | ✅ | ➖ | 🔸 |
|
|
44
|
+
| ラテン文字の diacritics 除去 | ➖ | ✅ | ➖ | 🔸 | ✅ | ✅ |
|
|
45
|
+
| 依存ゼロ | ✅ | ✅ | ✅ | ✅ | ✅ | ➖ |
|
|
46
|
+
|
|
47
|
+
凡例: ✅ 組み込み / 🔸 部分的・間接的(または要カスタム) / ➖ なし。各ライブラリの調査時点の既定挙動を基準とした。多くはカスタム関数で拡張できる。本表は「日本語入力対応+主要なあいまいマッチ機能」に観点を絞ったもの。
|
|
48
|
+
|
|
49
|
+
## インストール
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
npm install @ycookiey/yfuzzy
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Node 18+ / ESM 専用。
|
|
56
|
+
|
|
57
|
+
### ブラウザ (CDN)
|
|
58
|
+
|
|
59
|
+
ビルドツールなしで使う場合は同梱の単一ファイル bundle を `<script>` で読み込む(グローバル `yfuzzy` が定義される):
|
|
60
|
+
|
|
61
|
+
```html
|
|
62
|
+
<script src="https://unpkg.com/@ycookiey/yfuzzy@0.3.0/dist/yfuzzy.min.js"></script>
|
|
63
|
+
<script>
|
|
64
|
+
yfuzzy.search('sinjuku', ['トウキョウ', 'シンジュク', 'シブヤ']);
|
|
65
|
+
// → [{ item: 'シンジュク', refIndex: 1, score: 1, tier: 1 }]
|
|
66
|
+
</script>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 使い方
|
|
70
|
+
|
|
71
|
+
### 文字列配列
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
import { search } from '@ycookiey/yfuzzy';
|
|
75
|
+
|
|
76
|
+
const stations = ['トウキョウ', 'シンジュク', 'シブヤ', 'シナガワ'];
|
|
77
|
+
|
|
78
|
+
search('sinjuku', stations);
|
|
79
|
+
// → [{ item: 'シンジュク', refIndex: 1, score: 1, tier: 1 }]
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### オブジェクト配列(getText)
|
|
83
|
+
|
|
84
|
+
`getText` で検索対象の文字列を取り出す。漢字を読みで当てたい場合も、読み仮名を返せばよい(読みは利用者側で用意する)。
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
const items = [
|
|
88
|
+
{ label: '東京', yomi: 'トウキョウ' },
|
|
89
|
+
{ label: '新宿', yomi: 'シンジュク' },
|
|
90
|
+
];
|
|
91
|
+
|
|
92
|
+
search('しんじゅく', items, { getText: (x) => x.yomi });
|
|
93
|
+
// → [{ item: { label: '新宿', … }, refIndex: 1, score: 1, tier: 1 }]
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 索引の再利用(createIndex)
|
|
97
|
+
|
|
98
|
+
同じデータを繰り返し検索するなら事前構築する。単発 `search` と結果は同一。
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import { createIndex } from '@ycookiey/yfuzzy';
|
|
102
|
+
|
|
103
|
+
const index = createIndex(stations);
|
|
104
|
+
index.search('しぶ'); // → 先頭は シブヤ(短い語なので tier3 候補も続く)
|
|
105
|
+
index.search('しな', { limit: 5 }); // 呼び出しごとに検索オプションを上書き
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### ハイライト(includeMatches)
|
|
109
|
+
|
|
110
|
+
`includeMatches: true` で、**元文字列上**の一致区間 `[start, end)`(半開・昇順、隣接や重複は統合済み)を返す(後述の tier 1・2 でのみ)。各区間を `text.slice` で切り出して囲めばハイライトになる。
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
const r = search('keki', ['ケーキ'], { includeMatches: true });
|
|
114
|
+
// r[0].matches → [[0, 3]] ← 長音「ー」も含めて隙間なく連続
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## マッチの仕組み
|
|
118
|
+
|
|
119
|
+
### 照合経路(matching)
|
|
120
|
+
|
|
121
|
+
クエリは2つの経路で照合し、score の高いほうを採る(既定 `matching: 'both'`)。
|
|
122
|
+
|
|
123
|
+
- **literal**: 入力した文字のまま照合する(大文字小文字・全角半角・ひらがなカタカナの正規化のみ)。英字の item を英字で探す場合に当たる(`cale` → `Calendar`)。入力中のかなは、それを打ったローマ字の打鍵としても照合するため、IME をオンのまま英字を打った入力も当たる(`かぇんだr` → `Calendar`、`きっちぇn` → `Kitchen`、`Nかl` → `New Calendar`)。打鍵の表記は主要な IME のローマ字表(`ci`→し、`ce`→せ、`tch`→っち 等)に合わせている。
|
|
124
|
+
- **phonetic**: ローマ字をかなに変換して照合する。ヘボン式・訓令式の同時照合、子音だけの入力、誤字の許容はこちら(`sinjuku` → `シンジュク`、`kmnr` → `カミナリ`)。
|
|
125
|
+
|
|
126
|
+
同点のときは literal の結果を採る(ハイライトが入力した文字の位置になる)。
|
|
127
|
+
|
|
128
|
+
### tier
|
|
129
|
+
|
|
130
|
+
クエリは tier 1 から順に評価され、最初に一致した tier で確定する(既定は tier 1〜3。`maxTier: 4` で tier 4 も有効化)。`score` は 0〜1 で、上の tier ほど高い。
|
|
131
|
+
|
|
132
|
+
| tier | 内容 | 例 | score の範囲(目安) |
|
|
133
|
+
|---|---|---|---|
|
|
134
|
+
| 1 | 直接一致(打った文字列がそのまま現れる、または各単語の頭文字に並ぶ) | `シンジュク`→`シンジュク` | 0.75〜1.0 |
|
|
135
|
+
| 2 | 柔軟一致(とびとびでも可。語頭・連続を優遇、子音だけの入力も可) | `kmnr`→`カミナリ` | 0.5〜0.75 |
|
|
136
|
+
| 3 | 誤字許容(編集距離、中間の置換/挿入/削除/入れ替え) | `センタイ`→`センダイ` | 0.25〜0.5 |
|
|
137
|
+
| 4 | 構造類似(2 文字単位の重なりによる類似〔Tversky 係数〕、既定で無効) | 大きく崩れた入力 | 0〜0.25 |
|
|
138
|
+
|
|
139
|
+
tier 1 の中は一致の位置で順位を分ける: item の先頭から(`co` → **Co**ffee)> 単語の頭から(Source **Co**de。空白・記号の後と、AutoCorrect のような大文字の区切りを単語の頭とする)> 各単語の頭文字(`ac` → **A**pple **C**ider、`goca` → **Go**ld **Ca**se)> 単語の途中(Dis**co**unt)。同じ段の中は短い item が上。
|
|
140
|
+
|
|
141
|
+
各 tier は幅およそ 0.25 の帯に収まり、スコアが tier 間の境界(0.25 / 0.5 / 0.75)ちょうどになることはない。そのため閾値ひとつで「確実なヒット」と「あいまいな候補(『もしかして』表示向け)」を分離できる。結果は `score` 降順(同点は `refIndex` 昇順で安定)。
|
|
142
|
+
|
|
143
|
+
## API
|
|
144
|
+
|
|
145
|
+
### `search(query, items, options?)`
|
|
146
|
+
|
|
147
|
+
単発検索。`createIndex(items, options).search(query)` と等価。
|
|
148
|
+
|
|
149
|
+
### `createIndex(items, options?) → SearchIndex`
|
|
150
|
+
|
|
151
|
+
事前構築した索引を返す。`index.search(query, searchOptions?)` で呼び出しごとに検索オプションを上書きできる。`index.size` で件数。
|
|
152
|
+
|
|
153
|
+
### オプション
|
|
154
|
+
|
|
155
|
+
構築時オプション(`createIndex` / `search` の `options`):
|
|
156
|
+
|
|
157
|
+
| 名前 | 型 | 既定 | 説明 |
|
|
158
|
+
|---|---|---|---|
|
|
159
|
+
| `getText` | `(item: T) => string` | なし | オブジェクト配列で検索対象文字列を取り出す(`T[]` のとき必須) |
|
|
160
|
+
| `romaji` | `'hepburn' \| 'kunrei' \| 'both' \| false` | `'both'` | ローマ字照合の方式。`false` でローマ字照合せず、かなのみで照合 |
|
|
161
|
+
| `matching` | `'literal' \| 'phonetic' \| 'both'` | `'both'` | クエリの照合経路([照合経路](#照合経路matching))。`'both'` は両方の score の高いほう |
|
|
162
|
+
| `separatorExpansion` | `boolean \| string[]` | `false` | 区切り文字を、取り除いた形と区切りとして扱う形の両方で照合(`true` で `['-', ' ', '・', '_']`) |
|
|
163
|
+
|
|
164
|
+
検索時オプション(`index.search` で上書き可):
|
|
165
|
+
|
|
166
|
+
| 名前 | 型 | 既定 | 説明 |
|
|
167
|
+
|---|---|---|---|
|
|
168
|
+
| `limit` | `number` | 無制限 | 返却件数の上限 |
|
|
169
|
+
| `maxTier` | `1 \| 2 \| 3 \| 4` | `3` | 実行する tier の上限(`4` で構造類似の tier を有効化) |
|
|
170
|
+
| `minScore` | `number` | `0` | この score 未満を除外 |
|
|
171
|
+
| `includeMatches` | `boolean` | `false` | `matches` を含める |
|
|
172
|
+
|
|
173
|
+
### 結果 `SearchResult<T>`
|
|
174
|
+
|
|
175
|
+
```ts
|
|
176
|
+
type SearchResult<T> = {
|
|
177
|
+
item: T;
|
|
178
|
+
refIndex: number; // items 内の位置
|
|
179
|
+
score: number; // 0〜1、高いほど良い
|
|
180
|
+
tier: 1 | 2 | 3 | 4;
|
|
181
|
+
matches?: readonly [number, number][]; // includeMatches 時、tier 1/2 のみ
|
|
182
|
+
};
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## 性能
|
|
186
|
+
|
|
187
|
+
短い文字列の索引向け(数百〜数十万件)。内部の前段フィルタと早期打ち切りにより、1 クエリの実測値は千件で約 1.5ms、1 万件で約 10ms、10 万件で約 90ms(環境依存)。同条件で fuse.js より高速。英字の item をかなを含むクエリで探すときは打鍵の照合が加わり、1.5〜2 倍程度になる。`maxTier` を下げる、または `romaji` を一方の方式だけに絞ると更に軽くなる。索引構築は 10 万件で約 0.7 秒(一度きり)。
|
|
188
|
+
|
|
189
|
+
## ライセンス
|
|
190
|
+
|
|
191
|
+
MIT。ローマ字→かな変換に [WanaKana](https://github.com/WaniKani/WanaKana)(MIT)のコードを改変のうえ同梱している。詳細は [`THIRD_PARTY_NOTICES.md`](./THIRD_PARTY_NOTICES.md)。
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
# Third-Party Notices
|
|
2
2
|
|
|
3
|
-
yfuzzy bundles (vendors) source code from the following
|
|
4
|
-
|
|
5
|
-
`src/vendor/wanakana/` for the list of modifications.
|
|
3
|
+
yfuzzy bundles (vendors) source code or data derived from the following
|
|
4
|
+
third-party projects.
|
|
6
5
|
|
|
7
6
|
---
|
|
8
7
|
|
|
9
8
|
## WanaKana
|
|
10
9
|
|
|
10
|
+
The code has been ported to TypeScript and modified; see the header comment in
|
|
11
|
+
`src/vendor/wanakana/` for the list of modifications.
|
|
12
|
+
|
|
13
|
+
|
|
11
14
|
- Project: https://github.com/WaniKani/WanaKana
|
|
12
15
|
- Version vendored: 5.3.1
|
|
13
16
|
- Files derived from: `src/toKana.js`, `src/utils/kanaMapping.js`,
|
|
@@ -36,3 +39,46 @@ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
|
36
39
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
37
40
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
38
41
|
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Mozc
|
|
46
|
+
|
|
47
|
+
The keystroke table in `src/keystroke.ts` was aligned with the Mozc romaji
|
|
48
|
+
table: the romaji spellings it accepts that differ from WanaKana (for example
|
|
49
|
+
`ci`, `ce`, `qu`, `nn`, `tch`) were taken from it.
|
|
50
|
+
|
|
51
|
+
- Project: https://github.com/google/mozc
|
|
52
|
+
- Data referenced: `src/data/preedit/romanji-hiragana.tsv`
|
|
53
|
+
- Used in: `src/keystroke.ts`
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
Copyright 2010-2018, Google Inc.
|
|
57
|
+
All rights reserved.
|
|
58
|
+
|
|
59
|
+
Redistribution and use in source and binary forms, with or without
|
|
60
|
+
modification, are permitted provided that the following conditions are
|
|
61
|
+
met:
|
|
62
|
+
|
|
63
|
+
* Redistributions of source code must retain the above copyright
|
|
64
|
+
notice, this list of conditions and the following disclaimer.
|
|
65
|
+
* Redistributions in binary form must reproduce the above
|
|
66
|
+
copyright notice, this list of conditions and the following disclaimer
|
|
67
|
+
in the documentation and/or other materials provided with the
|
|
68
|
+
distribution.
|
|
69
|
+
* Neither the name of Google Inc. nor the names of its
|
|
70
|
+
contributors may be used to endorse or promote products derived from
|
|
71
|
+
this software without specific prior written permission.
|
|
72
|
+
|
|
73
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
74
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
75
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
76
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
77
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
78
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
79
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
80
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
81
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
82
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
83
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
84
|
+
```
|
package/dist/entry.d.ts
CHANGED
|
@@ -9,8 +9,15 @@ export interface IndexEntry {
|
|
|
9
9
|
readonly raw: string;
|
|
10
10
|
/** 正規化カナ形 + normMap */
|
|
11
11
|
readonly kana: Normalized;
|
|
12
|
-
/**
|
|
12
|
+
/** かな空間の境界位置 = 単語の頭(spec 2.6) */
|
|
13
13
|
readonly kanaBoundaries: ReadonlySet<number>;
|
|
14
|
+
/** romaji 空間の単語の頭(単語の頭のかなから始まる音節の先頭。tier 1 の段、spec 4.1) */
|
|
15
|
+
readonly kunreiHeads: ReadonlySet<number>;
|
|
16
|
+
readonly hepburnHeads: ReadonlySet<number>;
|
|
17
|
+
/** 上の各単語の頭の昇順の一覧(tier 1 の頭文字の一致用) */
|
|
18
|
+
readonly kanaHeadList: readonly number[];
|
|
19
|
+
readonly kunreiHeadList: readonly number[];
|
|
20
|
+
readonly hepburnHeadList: readonly number[];
|
|
14
21
|
/** 各空間の文字集合マスク(前置フィルタ用、空間が無効なら 0) */
|
|
15
22
|
readonly kanaMask: number;
|
|
16
23
|
readonly kunreiMask: number;
|
|
@@ -19,6 +26,8 @@ export interface IndexEntry {
|
|
|
19
26
|
readonly kunrei: RomajiForm | null;
|
|
20
27
|
/** ヘボン式 RomajiForm(romaji オプションで無効時 null) */
|
|
21
28
|
readonly hepburn: RomajiForm | null;
|
|
29
|
+
/** 打鍵の文字(英小文字・'・-)を含むか。含まなければ打鍵ラティスの打鍵経路は一致し得ない */
|
|
30
|
+
readonly hasKeystrokeChar: boolean;
|
|
22
31
|
/** bigram 集合(tier 4 用、遅延生成) */
|
|
23
32
|
bigrams: Set<string> | null;
|
|
24
33
|
}
|
package/dist/entry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAI9E,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,iBAAiB;IACjB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,
|
|
1
|
+
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAI9E,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,iBAAiB;IACjB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,qCAAqC;IACrC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IACpC,mDAAmD;IACnD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,+BAA+B;IAC/B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CAC7B;AA8BD,yBAAyB;AACzB,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,UAAU,CAyB1F;AAED,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAG5D"}
|
package/dist/entry.js
CHANGED
|
@@ -5,21 +5,59 @@ import { KUNREI, HEPBURN, kunreiEnabled, hepburnEnabled, } from './romaji/conver
|
|
|
5
5
|
import { toRomajiForm, kanaBoundaries } from './syllable.js';
|
|
6
6
|
import { generateBigrams } from './bigram.js';
|
|
7
7
|
import { charMask } from './charmask.js';
|
|
8
|
+
const ASCII_LETTER = /[a-z]/;
|
|
9
|
+
/** 単語の頭(spec 2.6): かな空間の境界に、元の文字列で英小文字の直後の英大文字を加える */
|
|
10
|
+
function wordHeads(kana, raw) {
|
|
11
|
+
const heads = kanaBoundaries(kana.text);
|
|
12
|
+
const t = kana.text;
|
|
13
|
+
const at = (i) => raw.slice(kana.map[i][0], kana.map[i][1]);
|
|
14
|
+
for (let i = 1; i < t.length; i++) {
|
|
15
|
+
if (!ASCII_LETTER.test(t[i]) || !ASCII_LETTER.test(t[i - 1]))
|
|
16
|
+
continue;
|
|
17
|
+
const cur = at(i);
|
|
18
|
+
const prev = at(i - 1);
|
|
19
|
+
if (cur !== cur.toLowerCase() && prev === prev.toLowerCase())
|
|
20
|
+
heads.add(i);
|
|
21
|
+
}
|
|
22
|
+
return heads;
|
|
23
|
+
}
|
|
24
|
+
/** romaji 空間の単語の頭: 単語の頭のかなから始まる音節の先頭位置 */
|
|
25
|
+
function romajiHeads(form, heads) {
|
|
26
|
+
const out = new Set();
|
|
27
|
+
if (form === null)
|
|
28
|
+
return out;
|
|
29
|
+
for (const s of form.syllables)
|
|
30
|
+
if (heads.has(s.kanaStart))
|
|
31
|
+
out.add(s.romajiStart);
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
function sorted(set) {
|
|
35
|
+
return [...set].sort((a, b) => a - b);
|
|
36
|
+
}
|
|
8
37
|
/** 1 item からエントリを構築する */
|
|
9
38
|
export function buildEntry(raw, refIndex, romaji) {
|
|
10
39
|
const kana = normalize(raw);
|
|
11
40
|
const kunrei = kunreiEnabled(romaji) ? toRomajiForm(kana.text, KUNREI) : null;
|
|
12
41
|
const hepburn = hepburnEnabled(romaji) ? toRomajiForm(kana.text, HEPBURN) : null;
|
|
42
|
+
const heads = wordHeads(kana, raw);
|
|
43
|
+
const kunreiHeads = romajiHeads(kunrei, heads);
|
|
44
|
+
const hepburnHeads = romajiHeads(hepburn, heads);
|
|
13
45
|
return {
|
|
14
46
|
refIndex,
|
|
15
47
|
raw,
|
|
16
48
|
kana,
|
|
17
|
-
kanaBoundaries:
|
|
49
|
+
kanaBoundaries: heads,
|
|
50
|
+
kunreiHeads,
|
|
51
|
+
hepburnHeads,
|
|
52
|
+
kanaHeadList: sorted(heads),
|
|
53
|
+
kunreiHeadList: sorted(kunreiHeads),
|
|
54
|
+
hepburnHeadList: sorted(hepburnHeads),
|
|
18
55
|
kanaMask: charMask(kana.text),
|
|
19
56
|
kunreiMask: kunrei ? charMask(kunrei.text) : 0,
|
|
20
57
|
hepburnMask: hepburn ? charMask(hepburn.text) : 0,
|
|
21
58
|
kunrei,
|
|
22
59
|
hepburn,
|
|
60
|
+
hasKeystrokeChar: /[a-z'-]/.test(kana.text),
|
|
23
61
|
bigrams: null,
|
|
24
62
|
};
|
|
25
63
|
}
|
package/dist/entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,yDAAyD;AAEzD,OAAO,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,MAAM,EACN,OAAO,EACP,aAAa,EACb,cAAc,GAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAmB,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"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"}
|
package/dist/expand.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export type SeparatorConfig = boolean | readonly string[];
|
|
|
3
3
|
/** true 指定時のデフォルト separator セット */
|
|
4
4
|
export declare const DEFAULT_SEPARATORS: readonly string[];
|
|
5
5
|
/**
|
|
6
|
-
* クエリ raw を展開経路へ。順序は (c)
|
|
6
|
+
* クエリ raw を展開経路へ。順序は (c) 原文 → (a) 除去 → (b) 境界。
|
|
7
7
|
* - separator を含まない / 無効化時は [raw] のみ
|
|
8
8
|
* - 末尾に separator がある場合は (a) 除去経路を生成しない(入力継続中シグナル、過剰マッチ回避)
|
|
9
9
|
* - 重複・空文字列は除外((c) は raw が空でも保持しない=呼び出し側が空クエリ判定)
|
package/dist/expand.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// separatorExpansion(spec 3章)。クエリを最大3経路に展開する。
|
|
2
2
|
// 展開は「追加」であって置換ではない。経路の順序は同点タイブレーク順(spec 5章):
|
|
3
|
-
// (c)
|
|
3
|
+
// (c) 原文経路(常設)> (a) 除去経路 > (b) 境界経路。
|
|
4
4
|
// データ側は展開しない(separator は 2.6 の境界として効く)。
|
|
5
5
|
/** true 指定時のデフォルト separator セット */
|
|
6
6
|
export const DEFAULT_SEPARATORS = ['-', ' ', '・', '_'];
|
|
@@ -16,7 +16,7 @@ function escapeForCharClass(ch) {
|
|
|
16
16
|
return ch.replace(/[\\\]^-]/g, '\\$&');
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* クエリ raw を展開経路へ。順序は (c)
|
|
19
|
+
* クエリ raw を展開経路へ。順序は (c) 原文 → (a) 除去 → (b) 境界。
|
|
20
20
|
* - separator を含まない / 無効化時は [raw] のみ
|
|
21
21
|
* - 末尾に separator がある場合は (a) 除去経路を生成しない(入力継続中シグナル、過剰マッチ回避)
|
|
22
22
|
* - 重複・空文字列は除外((c) は raw が空でも保持しない=呼び出し側が空クエリ判定)
|
|
@@ -37,7 +37,7 @@ export function expandQuery(raw, config) {
|
|
|
37
37
|
paths.push(s);
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
|
-
// (c)
|
|
40
|
+
// (c) 原文
|
|
41
41
|
push(raw);
|
|
42
42
|
// (a) 除去(末尾 separator のときはスキップ)
|
|
43
43
|
const lastCp = [...raw].at(-1);
|
package/dist/expand.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand.js","sourceRoot":"","sources":["../src/expand.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,8CAA8C;AAC9C,
|
|
1
|
+
{"version":3,"file":"expand.js","sourceRoot":"","sources":["../src/expand.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,8CAA8C;AAC9C,uCAAuC;AACvC,wCAAwC;AAKxC,mCAAmC;AACnC,MAAM,CAAC,MAAM,kBAAkB,GAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAE1E,SAAS,iBAAiB,CAAC,MAAuB;IAChD,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACxD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,kBAAkB,CAAC;IAC/C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wBAAwB;AACxB,SAAS,kBAAkB,CAAC,EAAU;IACpC,OAAO,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,MAAuB;IAC9D,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE5D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAErD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,IAAI,GAAG,CAAC,CAAS,EAAQ,EAAE;QAC/B,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,SAAS;IACT,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,gCAAgC;IAChC,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IAChC,MAAM,iBAAiB,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAE9B,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IndexOptions, SearchOptions, SearchResult, SearchIndex } from './types.js';
|
|
2
|
-
export type { IndexOptions, SearchOptions, SearchResult, SearchIndex, RomajiOption, SeparatorConfig, } from './types.js';
|
|
2
|
+
export type { IndexOptions, SearchOptions, SearchResult, SearchIndex, RomajiOption, SeparatorConfig, MatchingOption, } from './types.js';
|
|
3
3
|
export declare function createIndex(items: readonly string[], options?: IndexOptions<string> & SearchOptions): SearchIndex<string>;
|
|
4
4
|
export declare function createIndex<T>(items: readonly T[], options: IndexOptions<T> & SearchOptions & {
|
|
5
5
|
getText: (item: T) => string;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AAwBpB,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,aAAa,GAC7C,WAAW,CAAC,MAAM,CAAC,CAAC;AACvB,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;CAAE,GAC1E,WAAW,CAAC,CAAC,CAAC,CAAC;AA6ClB,wBAAgB,MAAM,CACpB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,aAAa,GAC7C,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1B,wBAAgB,MAAM,CAAC,CAAC,EACtB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;CAAE,GAC1E,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC"}
|