cmpstr 2.0.2 → 3.0.0

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.
Files changed (172) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +75 -499
  3. package/dist/CmpStr.esm.js +4863 -0
  4. package/dist/CmpStr.esm.js.map +1 -0
  5. package/dist/CmpStr.esm.min.js +8 -0
  6. package/dist/CmpStr.esm.min.js.map +1 -0
  7. package/dist/CmpStr.umd.js +4875 -0
  8. package/dist/CmpStr.umd.js.map +1 -0
  9. package/dist/CmpStr.umd.min.js +8 -0
  10. package/dist/CmpStr.umd.min.js.map +1 -0
  11. package/dist/cjs/CmpStr.js +663 -0
  12. package/dist/cjs/CmpStr.js.map +1 -0
  13. package/dist/cjs/CmpStrAsync.js +336 -0
  14. package/dist/cjs/CmpStrAsync.js.map +1 -0
  15. package/dist/cjs/index.js +15 -0
  16. package/dist/cjs/index.js.map +1 -0
  17. package/dist/cjs/metric/Cosine.js +101 -0
  18. package/dist/cjs/metric/Cosine.js.map +1 -0
  19. package/dist/cjs/metric/DamerauLevenshtein.js +110 -0
  20. package/dist/cjs/metric/DamerauLevenshtein.js.map +1 -0
  21. package/dist/cjs/metric/DiceSorensen.js +91 -0
  22. package/dist/cjs/metric/DiceSorensen.js.map +1 -0
  23. package/dist/cjs/metric/Hamming.js +82 -0
  24. package/dist/cjs/metric/Hamming.js.map +1 -0
  25. package/dist/cjs/metric/Jaccard.js +76 -0
  26. package/dist/cjs/metric/Jaccard.js.map +1 -0
  27. package/dist/cjs/metric/JaroWinkler.js +114 -0
  28. package/dist/cjs/metric/JaroWinkler.js.map +1 -0
  29. package/dist/cjs/metric/LCS.js +89 -0
  30. package/dist/cjs/metric/LCS.js.map +1 -0
  31. package/dist/cjs/metric/Levenshtein.js +94 -0
  32. package/dist/cjs/metric/Levenshtein.js.map +1 -0
  33. package/dist/cjs/metric/Metric.js +445 -0
  34. package/dist/cjs/metric/Metric.js.map +1 -0
  35. package/dist/cjs/metric/NeedlemanWunsch.js +95 -0
  36. package/dist/cjs/metric/NeedlemanWunsch.js.map +1 -0
  37. package/dist/cjs/metric/SmithWaterman.js +98 -0
  38. package/dist/cjs/metric/SmithWaterman.js.map +1 -0
  39. package/dist/cjs/metric/qGram.js +91 -0
  40. package/dist/cjs/metric/qGram.js.map +1 -0
  41. package/dist/cjs/phonetic/Cologne.js +112 -0
  42. package/dist/cjs/phonetic/Cologne.js.map +1 -0
  43. package/dist/cjs/phonetic/Metaphone.js +172 -0
  44. package/dist/cjs/phonetic/Metaphone.js.map +1 -0
  45. package/dist/cjs/phonetic/Phonetic.js +413 -0
  46. package/dist/cjs/phonetic/Phonetic.js.map +1 -0
  47. package/dist/cjs/phonetic/Soundex.js +135 -0
  48. package/dist/cjs/phonetic/Soundex.js.map +1 -0
  49. package/dist/cjs/utils/DeepMerge.js +144 -0
  50. package/dist/cjs/utils/DeepMerge.js.map +1 -0
  51. package/dist/cjs/utils/DiffChecker.js +500 -0
  52. package/dist/cjs/utils/DiffChecker.js.map +1 -0
  53. package/dist/cjs/utils/Filter.js +189 -0
  54. package/dist/cjs/utils/Filter.js.map +1 -0
  55. package/dist/cjs/utils/HashTable.js +175 -0
  56. package/dist/cjs/utils/HashTable.js.map +1 -0
  57. package/dist/cjs/utils/Normalizer.js +144 -0
  58. package/dist/cjs/utils/Normalizer.js.map +1 -0
  59. package/dist/cjs/utils/Pool.js +196 -0
  60. package/dist/cjs/utils/Pool.js.map +1 -0
  61. package/dist/cjs/utils/Profiler.js +229 -0
  62. package/dist/cjs/utils/Profiler.js.map +1 -0
  63. package/dist/cjs/utils/Registry.js +148 -0
  64. package/dist/cjs/utils/Registry.js.map +1 -0
  65. package/dist/cjs/utils/TextAnalyzer.js +358 -0
  66. package/dist/cjs/utils/TextAnalyzer.js.map +1 -0
  67. package/dist/esm/CmpStr.js +662 -0
  68. package/dist/esm/CmpStr.js.map +1 -0
  69. package/dist/esm/CmpStrAsync.js +331 -0
  70. package/dist/esm/CmpStrAsync.js.map +1 -0
  71. package/dist/esm/index.js +7 -0
  72. package/dist/esm/index.js.map +1 -0
  73. package/dist/esm/metric/Cosine.js +99 -0
  74. package/dist/esm/metric/Cosine.js.map +1 -0
  75. package/dist/esm/metric/DamerauLevenshtein.js +108 -0
  76. package/dist/esm/metric/DamerauLevenshtein.js.map +1 -0
  77. package/dist/esm/metric/DiceSorensen.js +89 -0
  78. package/dist/esm/metric/DiceSorensen.js.map +1 -0
  79. package/dist/esm/metric/Hamming.js +77 -0
  80. package/dist/esm/metric/Hamming.js.map +1 -0
  81. package/dist/esm/metric/Jaccard.js +74 -0
  82. package/dist/esm/metric/Jaccard.js.map +1 -0
  83. package/dist/esm/metric/JaroWinkler.js +112 -0
  84. package/dist/esm/metric/JaroWinkler.js.map +1 -0
  85. package/dist/esm/metric/LCS.js +87 -0
  86. package/dist/esm/metric/LCS.js.map +1 -0
  87. package/dist/esm/metric/Levenshtein.js +92 -0
  88. package/dist/esm/metric/Levenshtein.js.map +1 -0
  89. package/dist/esm/metric/Metric.js +442 -0
  90. package/dist/esm/metric/Metric.js.map +1 -0
  91. package/dist/esm/metric/NeedlemanWunsch.js +93 -0
  92. package/dist/esm/metric/NeedlemanWunsch.js.map +1 -0
  93. package/dist/esm/metric/SmithWaterman.js +96 -0
  94. package/dist/esm/metric/SmithWaterman.js.map +1 -0
  95. package/dist/esm/metric/qGram.js +89 -0
  96. package/dist/esm/metric/qGram.js.map +1 -0
  97. package/dist/esm/phonetic/Cologne.js +114 -0
  98. package/dist/esm/phonetic/Cologne.js.map +1 -0
  99. package/dist/esm/phonetic/Metaphone.js +174 -0
  100. package/dist/esm/phonetic/Metaphone.js.map +1 -0
  101. package/dist/esm/phonetic/Phonetic.js +409 -0
  102. package/dist/esm/phonetic/Phonetic.js.map +1 -0
  103. package/dist/esm/phonetic/Soundex.js +137 -0
  104. package/dist/esm/phonetic/Soundex.js.map +1 -0
  105. package/dist/esm/utils/DeepMerge.js +139 -0
  106. package/dist/esm/utils/DeepMerge.js.map +1 -0
  107. package/dist/esm/utils/DiffChecker.js +498 -0
  108. package/dist/esm/utils/DiffChecker.js.map +1 -0
  109. package/dist/esm/utils/Filter.js +187 -0
  110. package/dist/esm/utils/Filter.js.map +1 -0
  111. package/dist/esm/utils/HashTable.js +173 -0
  112. package/dist/esm/utils/HashTable.js.map +1 -0
  113. package/dist/esm/utils/Normalizer.js +142 -0
  114. package/dist/esm/utils/Normalizer.js.map +1 -0
  115. package/dist/esm/utils/Pool.js +194 -0
  116. package/dist/esm/utils/Pool.js.map +1 -0
  117. package/dist/esm/utils/Profiler.js +227 -0
  118. package/dist/esm/utils/Profiler.js.map +1 -0
  119. package/dist/esm/utils/Registry.js +142 -0
  120. package/dist/esm/utils/Registry.js.map +1 -0
  121. package/dist/esm/utils/TextAnalyzer.js +356 -0
  122. package/dist/esm/utils/TextAnalyzer.js.map +1 -0
  123. package/dist/types/CmpStr.d.ts +472 -0
  124. package/dist/types/CmpStrAsync.d.ts +233 -0
  125. package/dist/types/index.d.ts +51 -0
  126. package/dist/types/metric/Cosine.d.ts +57 -0
  127. package/dist/types/metric/DamerauLevenshtein.d.ts +50 -0
  128. package/dist/types/metric/DiceSorensen.d.ts +57 -0
  129. package/dist/types/metric/Hamming.d.ts +49 -0
  130. package/dist/types/metric/Jaccard.d.ts +48 -0
  131. package/dist/types/metric/JaroWinkler.d.ts +50 -0
  132. package/dist/types/metric/LCS.d.ts +50 -0
  133. package/dist/types/metric/Levenshtein.d.ts +50 -0
  134. package/dist/types/metric/Metric.d.ts +261 -0
  135. package/dist/types/metric/NeedlemanWunsch.d.ts +47 -0
  136. package/dist/types/metric/SmithWaterman.d.ts +48 -0
  137. package/dist/types/metric/index.d.ts +41 -0
  138. package/dist/types/metric/qGram.d.ts +56 -0
  139. package/dist/types/phonetic/Cologne.d.ts +46 -0
  140. package/dist/types/phonetic/Metaphone.d.ts +50 -0
  141. package/dist/types/phonetic/Phonetic.d.ts +189 -0
  142. package/dist/types/phonetic/Soundex.d.ts +49 -0
  143. package/dist/types/phonetic/index.d.ts +30 -0
  144. package/dist/types/utils/DeepMerge.d.ts +70 -0
  145. package/dist/types/utils/DiffChecker.d.ts +137 -0
  146. package/dist/types/utils/Filter.d.ts +97 -0
  147. package/dist/types/utils/HashTable.d.ts +86 -0
  148. package/dist/types/utils/Normalizer.d.ts +76 -0
  149. package/dist/types/utils/Pool.d.ts +63 -0
  150. package/dist/types/utils/Profiler.d.ts +129 -0
  151. package/dist/types/utils/Registry.d.ts +57 -0
  152. package/dist/types/utils/TextAnalyzer.d.ts +199 -0
  153. package/dist/types/utils/Types.d.ts +313 -0
  154. package/package.json +62 -49
  155. package/src/CmpStr.d.ts +0 -70
  156. package/src/CmpStr.js +0 -912
  157. package/src/CmpStrAsync.d.ts +0 -19
  158. package/src/CmpStrAsync.js +0 -204
  159. package/src/algorithms/cosine.js +0 -86
  160. package/src/algorithms/damerau.js +0 -78
  161. package/src/algorithms/dice.js +0 -65
  162. package/src/algorithms/hamming.js +0 -44
  163. package/src/algorithms/jaccard.js +0 -34
  164. package/src/algorithms/jaroWinkler.js +0 -106
  165. package/src/algorithms/lcs.js +0 -58
  166. package/src/algorithms/levenshtein.js +0 -70
  167. package/src/algorithms/needlemanWunsch.js +0 -72
  168. package/src/algorithms/qGram.js +0 -63
  169. package/src/algorithms/smithWaterman.js +0 -78
  170. package/src/algorithms/soundex.js +0 -152
  171. package/src/index.d.ts +0 -3
  172. package/src/index.js +0 -47
@@ -0,0 +1,409 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ import { merge } from '../utils/DeepMerge.js';
3
+ import { Registry } from '../utils/Registry.js';
4
+ import { HashTable } from '../utils/HashTable.js';
5
+ import { Profiler } from '../utils/Profiler.js';
6
+
7
+ /**
8
+ * Abstract Phonetic
9
+ * src/phonetic/Phonetic.ts
10
+ *
11
+ * @see https://en.wikipedia.org/wiki/Phonetic_algorithm
12
+ *
13
+ * A phonetic algorithm refers to a method for indexing words according to their
14
+ * pronunciation. When the algorithm relies on orthography, it is significantly
15
+ * influenced by the spelling conventions of the language for which it is intended:
16
+ * since the majority of phonetic algorithms were created for English, they tend
17
+ * to be less effective for indexing words in other languages.
18
+ *
19
+ * Phonetic search has numerous applications, and one of the initial use cases has
20
+ * been in trademark searches to verify that newly registered trademarks do not
21
+ * pose a risk of infringing upon existing trademarks due to their pronunciation.
22
+ *
23
+ * This module provides an abstract class for generating phonetic indices based
24
+ * on mappings and rules. It allows for the implementation of various phonetic
25
+ * algorithms by extending the abstract class.
26
+ *
27
+ * @module Phonetic
28
+ * @author Paul Köhler (komed3)
29
+ * @license MIT
30
+ */
31
+ // Get the singleton profiler instance for performance monitoring
32
+ const profiler = Profiler.getInstance();
33
+ /**
34
+ * Abstract class representing a phonetic algorithm.
35
+ *
36
+ * The protected methods `applyRules`, `encode`, `mapChar`, `equalLen`, `word2Chars`,
37
+ * `exitEarly`, `adjustCode`, `loop` and `loopAsync` can be overridden in subclasses
38
+ * to implement specific phonetic algorithms.
39
+ *
40
+ * @abstract
41
+ */
42
+ class Phonetic {
43
+ // Cache for indexed words to avoid redundant calculations
44
+ static cache = new HashTable();
45
+ /**
46
+ * Default phonetic options.
47
+ *
48
+ * This object contains default settings for phonetic algorithms,
49
+ * implemented in the subclass.
50
+ */
51
+ static default;
52
+ // Phonetic algorithm name for identification
53
+ algo;
54
+ // Phonetic map and options for the algorithm
55
+ options;
56
+ map;
57
+ /**
58
+ * Static method to clear the cache of indexed words.
59
+ */
60
+ static clear() {
61
+ this.cache.clear();
62
+ }
63
+ /**
64
+ * Constructor for the Phonetic class.
65
+ *
66
+ * Initializes the phonetic algorithm with the specified options and mapping.
67
+ *
68
+ * @param {string} algo - The name of the algorithm (e.g. 'soundex')
69
+ * @param {PhoneticOptions} [opt] - Options for the phonetic algorithm
70
+ * @throws {Error} - If the requested mapping is not declared
71
+ */
72
+ constructor(algo, opt = {}) {
73
+ // Set the options by merging the default options with the provided ones
74
+ this.options = merge(this.constructor.default ?? {}, opt);
75
+ // Get the mapping based on the provided options
76
+ const map = PhoneticMappingRegistry.get(algo, this.options.map);
77
+ // If the mapping is not defined, throw an error
78
+ if (map === undefined)
79
+ throw new Error(
80
+ `requested mapping <${this.options.map}> is not declared`
81
+ );
82
+ this.algo = algo;
83
+ this.map = map;
84
+ }
85
+ /**
86
+ * Applies phonetic rules to a character in a word context.
87
+ *
88
+ * This method is designed to be generic and efficient for all phonetic algorithms.
89
+ * It checks all rule types (prev, next, prevNot, nextNot, position, etc.) and
90
+ * returns either the appropriate code (string) or undefined.
91
+ *
92
+ * @param {string} char - The current character
93
+ * @param {number} i - The current position within the word
94
+ * @param {string[]} chars - The word as an array of characters
95
+ * @param {number} charLen - The total length of the word
96
+ * @returns {string|undefined} - The rule code or undefined if no rule applies
97
+ */
98
+ applyRules(char, i, chars, charLen) {
99
+ const { ruleset = [] } = this.map;
100
+ // If no rules are provided, return undefined
101
+ if (!ruleset || !ruleset.length) return undefined;
102
+ // Get the surrounding characters
103
+ const prev = chars[i - 1] || '',
104
+ prev2 = chars[i - 2] || '';
105
+ const next = chars[i + 1] || '',
106
+ next2 = chars[i + 2] || '';
107
+ // Iterate over the rules to find a matching rule for the current character
108
+ for (const rule of ruleset) {
109
+ // Skip if the rule does not match the current character
110
+ if (rule.char && rule.char !== char) continue;
111
+ // Position in the word (start, middle, end)
112
+ if (rule.position === 'start' && i !== 0) continue;
113
+ if (rule.position === 'middle' && i > 0 && i < charLen) continue;
114
+ if (rule.position === 'end' && i !== charLen) continue;
115
+ // Previous character(s)
116
+ if (rule.prev && !rule.prev.includes(prev)) continue;
117
+ if (rule.prevNot && rule.prevNot.includes(prev)) continue;
118
+ if (rule.prev2 && !rule.prev2.includes(prev2)) continue;
119
+ if (rule.prev2Not && rule.prev2Not.includes(prev2)) continue;
120
+ // Following character(s)
121
+ if (rule.next && !rule.next.includes(next)) continue;
122
+ if (rule.nextNot && rule.nextNot.includes(next)) continue;
123
+ if (rule.next2 && !rule.next2.includes(next2)) continue;
124
+ if (rule.next2Not && rule.next2Not.includes(next2)) continue;
125
+ // Special case: Beginning of a word (e.g. chars.slice(0, n))
126
+ if (
127
+ rule.leading &&
128
+ !rule.leading.includes(chars.slice(0, rule.leading.length).join(''))
129
+ )
130
+ continue;
131
+ // Special case: end of word (e.g. chars.slice(-n))
132
+ if (
133
+ rule.trailing &&
134
+ !rule.trailing.includes(chars.slice(-rule.trailing.length).join(''))
135
+ )
136
+ continue;
137
+ // Check multiple characters (e.g. bigram/trigram)
138
+ if (rule.match && !rule.match.every((c, j) => chars[i + j] === c))
139
+ continue;
140
+ // If all conditions met, return the rule code
141
+ return rule.code;
142
+ }
143
+ // If no rule matched, return undefined
144
+ return undefined;
145
+ }
146
+ /**
147
+ * Generates the phonetic code for a given word.
148
+ *
149
+ * This method processes the word character by character, applying phonetic rules
150
+ * and mappings to generate a phonetic code.
151
+ *
152
+ * @param {string} word - The input word to be converted into a phonetic code
153
+ * @returns {string} - The generated phonetic code
154
+ */
155
+ encode(word) {
156
+ const { map = {}, ignore = [] } = this.map;
157
+ // Get the characters of the word and its length
158
+ const chars = this.word2Chars(word);
159
+ const charLen = chars.length;
160
+ let code = '',
161
+ lastCode = null;
162
+ // Iterate over each character in the word
163
+ for (let i = 0; i < charLen; i++) {
164
+ const char = chars[i];
165
+ // Skip characters that are in the ignore list
166
+ if (ignore.includes(char)) continue;
167
+ // Convert the character to its phonetic code
168
+ const mapped = this.mapChar(char, i, chars, charLen, lastCode, map);
169
+ // If no code is generated, skip to the next character
170
+ if (mapped === undefined) continue;
171
+ // Append the generated code to the final code
172
+ (code += mapped), (lastCode = mapped);
173
+ // If the code length exceeds the specified limit, exit early
174
+ if (this.exitEarly(code, i)) break;
175
+ }
176
+ // Return the adjusted phonetic code
177
+ return this.adjustCode(code, chars);
178
+ }
179
+ /**
180
+ * Converts a character to its phonetic code based on the mapping and rules.
181
+ *
182
+ * @param {string} char - The current character
183
+ * @param {number} i - The current position within the word
184
+ * @param {string[]} chars - The word as an array of characters
185
+ * @param {number} charLen - The total length of the word
186
+ * @param {string|null} lastCode - The last code generated (to avoid duplicates)
187
+ * @param {Record<string, string>} map - The phonetic mapping
188
+ * @returns {string|undefined} - The phonetic code or undefined if no code applies
189
+ */
190
+ mapChar(char, i, chars, charLen, lastCode, map) {
191
+ const { dedupe = true } = this.options;
192
+ // Apply phonetic rules to the character
193
+ // If no rules apply, use the mapping
194
+ // If the character is not in the mapping, return undefined
195
+ const c =
196
+ this.applyRules(char, i, chars, charLen) ?? map[char] ?? undefined;
197
+ // De-duplicate the code if necessary
198
+ return dedupe && c === lastCode ? undefined : c;
199
+ }
200
+ /**
201
+ * Ensures the phonetic code has a fixed length by padding or truncating.
202
+ *
203
+ * @param {string} input - The input string to be adjusted
204
+ * @returns {string} - The adjusted string with fixed length
205
+ */
206
+ equalLen(input) {
207
+ const { length = -1, pad = '0' } = this.options;
208
+ return length === -1
209
+ ? input
210
+ : (input + pad.repeat(length)).slice(0, length);
211
+ }
212
+ /**
213
+ * Converts a word into an array of characters.
214
+ *
215
+ * @param {string} word - The input word to be converted
216
+ * @returns {string[]} - An array of characters from the input word
217
+ */
218
+ word2Chars(word) {
219
+ return word.toLowerCase().split('');
220
+ }
221
+ /**
222
+ * Determines whether to exit early based on the current phonetic code length.
223
+ *
224
+ * @param {string} code - The current phonetic code
225
+ * @param {number} i - The current index in the word
226
+ * @returns {boolean} - True if the code length exceeds the specified limit, false otherwise
227
+ */
228
+ exitEarly(code, i) {
229
+ const { length = -1 } = this.options;
230
+ return length > 0 && code.length >= length;
231
+ }
232
+ /**
233
+ * Adjusts the phonetic code.
234
+ *
235
+ * @param {string} code - The phonetic code to be adjusted
236
+ * @param {string[]} chars - Characters to be removed from the code
237
+ * @returns {string} - The adjusted phonetic code
238
+ */
239
+ adjustCode(code, chars) {
240
+ return code;
241
+ }
242
+ /**
243
+ * Processes an array of words to generate their phonetic indices.
244
+ *
245
+ * This method iterates over each word, generates its phonetic code,
246
+ * and ensures that the resulting codes are of equal length.
247
+ *
248
+ * @param {string[]} words - An array of words to be processed
249
+ * @returns {string[]} - An array of phonetic indices for the input words
250
+ */
251
+ loop(words) {
252
+ const index = [];
253
+ // Loop over each word in the input array
254
+ for (const word of words) {
255
+ // Generate a cache key based on the algorithm and word
256
+ const key = Phonetic.cache.key(this.algo, [word]);
257
+ // If the key exists in the cache, return the cached result
258
+ // Otherwise, encode the word using the algorithm
259
+ const code =
260
+ Phonetic.cache.get(key || '') ??
261
+ (() => {
262
+ // Get the phonetic code for the word
263
+ const res = this.encode(word);
264
+ // If a key was generated, store the result in the cache
265
+ if (key) Phonetic.cache.set(key, res);
266
+ return res;
267
+ })();
268
+ // If a code is generated, add them to the index
269
+ if (code && code.length) index.push(this.equalLen(code));
270
+ }
271
+ return index;
272
+ }
273
+ /**
274
+ * Asynchronously processes an array of words to generate their phonetic indices.
275
+ *
276
+ * This method iterates over each word, generates its phonetic code asynchronously,
277
+ * and ensures that the resulting codes are of equal length.
278
+ *
279
+ * @param {string[]} words - An array of words to be processed
280
+ * @returns {Promise<string[]>} - A promise that resolves to an array of phonetic indices for the input words
281
+ */
282
+ async loopAsync(words) {
283
+ const index = [];
284
+ // Loop over each word in the input array
285
+ for (const word of words) {
286
+ // Get the phonetic code for the word asynchronously
287
+ const code = await Promise.resolve(this.encode(word));
288
+ // If a code is generated, add them to the index
289
+ if (code && code.length) index.push(this.equalLen(code));
290
+ }
291
+ return index;
292
+ }
293
+ /**
294
+ * Get the name of the phonetic algorithm.
295
+ *
296
+ * @returns {string} - The name of the algorithm
297
+ */
298
+ getAlgoName() {
299
+ return this.algo;
300
+ }
301
+ /**
302
+ * Generates a phonetic index for the given input string.
303
+ *
304
+ * @param {string} input - The input string to be indexed
305
+ * @returns {string[]} - An array of phonetic indices for the input words
306
+ */
307
+ getIndex(input) {
308
+ const { delimiter = ' ' } = this.options;
309
+ // Split the input string by the specified delimiter and loop over it
310
+ return profiler.run(() =>
311
+ this.loop(input.split(delimiter).filter(Boolean)).filter(Boolean)
312
+ );
313
+ }
314
+ /**
315
+ * Asynchronously generates a phonetic index for the given input string.
316
+ *
317
+ * @param {string} input - The input string to be indexed
318
+ * @returns {Promise<string[]>} - A promise that resolves to an array of phonetic indices for the input words
319
+ */
320
+ async getIndexAsync(input) {
321
+ const { delimiter = ' ' } = this.options;
322
+ // Split the input string by the specified delimiter and loop over it asynchronously
323
+ return (
324
+ await profiler.runAsync(
325
+ async () => await this.loopAsync(input.split(delimiter).filter(Boolean))
326
+ )
327
+ ).filter(Boolean);
328
+ }
329
+ }
330
+ /**
331
+ * Phonetic registry service for managing phonetic implementations.
332
+ *
333
+ * This registry allows for dynamic registration and retrieval of phonetic classes,
334
+ * enabling the use of various phonetic algorithms in a consistent manner.
335
+ */
336
+ const PhoneticRegistry = Registry('phonetic', Phonetic);
337
+ /**
338
+ * Phonetic Mapping Service
339
+ *
340
+ * This service provides a simple interface to manage phonetic mappings across
341
+ * different phonetic algorithms. It allows adding, removing, checking existence,
342
+ * retrieving, and listing phonetic mappings for specified algorithms.
343
+ */
344
+ const PhoneticMappingRegistry = (() => {
345
+ // Create a registry object to hold mappings
346
+ const mappings = Object.create(null);
347
+ // Helper function to retrieve mappings for a specific algorithm
348
+ const maps = (algo) => (mappings[algo] ||= Object.create(null));
349
+ return {
350
+ /**
351
+ * Adds a phonetic mapping for a specific algorithm and ID.
352
+ *
353
+ * @param {string} algo - The phonetic algorithm identifier (e.g., 'soundex', 'metaphone')
354
+ * @param {string} id - The unique identifier for the mapping
355
+ * @param {PhoneticMap} map - The phonetic map to be added, containing rules and mappings
356
+ * @param {boolean} [update=false] - Whether to allow overwriting an existing entry
357
+ * @throws {Error} If the mapping name already exists and update is false
358
+ */
359
+ add(algo, id, map, update = false) {
360
+ const mappings = maps(algo);
361
+ if (!update && id in mappings)
362
+ throw new Error(
363
+ `entry <${id}> already exists / use <update=true> to overwrite`
364
+ );
365
+ mappings[id] = map;
366
+ },
367
+ /**
368
+ * Removes a phonetic mapping for a specific algorithm and ID.
369
+ *
370
+ * @param {string} algo - The phonetic algorithm identifier
371
+ * @param {string} id - The unique identifier for the mapping to be removed
372
+ */
373
+ remove(algo, id) {
374
+ delete maps(algo)[id];
375
+ },
376
+ /**
377
+ * Checks if a phonetic mapping exists for a specific algorithm and ID.
378
+ *
379
+ * @param {string} algo - The phonetic algorithm identifier
380
+ * @param {string} id - The unique identifier for the mapping to check
381
+ * @returns {boolean} - Returns true if the mapping exists, false otherwise
382
+ */
383
+ has(algo, id) {
384
+ return id in maps(algo);
385
+ },
386
+ /**
387
+ * Retrieves a phonetic mapping for a specific algorithm and ID.
388
+ *
389
+ * @param {string} algo - The phonetic algorithm identifier
390
+ * @param {string} id - The unique identifier for the mapping to retrieve
391
+ * @returns {PhoneticMap | undefined} - Returns the phonetic map if found, otherwise undefined
392
+ */
393
+ get(algo, id) {
394
+ return maps(algo)[id];
395
+ },
396
+ /**
397
+ * Lists all phonetic mappings for a specific algorithm.
398
+ *
399
+ * @param {string} algo - The phonetic algorithm identifier
400
+ * @returns {string[]} - Returns an array of mapping IDs for the specified algorithm
401
+ */
402
+ list(algo) {
403
+ return Object.keys(maps(algo));
404
+ }
405
+ };
406
+ })();
407
+
408
+ export { Phonetic, PhoneticMappingRegistry, PhoneticRegistry };
409
+ //# sourceMappingURL=Phonetic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Phonetic.js","sources":["../../../src/phonetic/Phonetic.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;AAuBG,CAAA,CAAA;AAcH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,WAAW,CAAE,CAAA;AAEvC,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA;MACmB,QAAQ,CAAA;;AAGlB,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAA8B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,SAAS,CAAG,CAAA;AAElE,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA;EACO,OAAO,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGP,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA;;AAGF,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAG,CAAA,CAAA;AAEtB,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA;CACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAa,IAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE;AAAA,EAAA;AAElD,CAAA,CAAA,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA,CAAA,CAAA;EACH,WAAc,CAAA,CAAA,CAAA,CAAA,CAAY,EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,EAAE,CAAA,CAAA;;AAGjD,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAI,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAE,GAAG,CAAE;;AAGtE,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAC,CAAG,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAI,CAAE;;CAGlE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;MAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA;QACpC,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAG7D,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,GAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA;AAChB,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA;;AAIlB,CAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;AAYG,CAAA,CAAA,CAAA,CAAA;AACO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA;CAE5E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA;;AAGjC,CAAA,CAAA,CAAA,CAAA,IAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,OAAO,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;CAGrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA,CAAA,CAAI,EAAE;AAAE,MAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAW,CAAK,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA;CAC/E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA,CAAA,CAAI,EAAE;AAAE,MAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAW,CAAK,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA;;AAG/E,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAG,CAAA;;CAG1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;CAGvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,KAAK,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,KAAK,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGhD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;MACjD,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAI,CAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,KAAK,CAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;MACpD,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;MACjD,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAI,CAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,KAAK,CAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;MACpD,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGxD,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA;AAAA,QAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACxC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAE,CAAE;CAChD,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;KAGC,GAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA;AAAA,QAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAC1C,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAC,CAAI,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAE;CAC/C,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;CAGJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CACjC,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CACnC;CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;CAGJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA;;;AAKpB,CAAA,CAAA,CAAA,CAAA,OAAO,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAIpB,CAAA,CAAA,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA,CAAA,CAAA;AACO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA;AAE3B,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA;;CAG1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AAEpC,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE;AAAE,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAkB,CAAI,CAAA,CAAA,CAAA;;AAGrD,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAG,CAAA;AAEhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAK,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE;;AAG/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAK,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAG/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAC3C,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,KAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,GAAG,CACzC;;CAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAG5B,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,CAAE,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAM,CAAA,CAAA,CAAA,CAAA,EAAA;;AAGjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA;;;CAKrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,KAAK,CAAE;;AAIzC,CAAA,CAAA,CAAA,CAAA;;;;;;;;;;AAUG,CAAA,CAAA,CAAA,CAAA;EACO,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACb,CAAY,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAE,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACzD,CAAuB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,GAA2B,CAAA,CAAA;CAGpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;CAKtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG;AAAA,MAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE,CAAA,CAAC,EAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,OAAO,CAAE,CAAA,CAAA,CAAA,CAAI,GAAG,CAAE,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAI,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGhF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAM,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;;AAInD,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA;AACO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAE/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;AAAE,QAAG,CAAK,CAAA,CAAA,CAAA;AAAA,MAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,MAAM,CAAE,CAAA,CAAG,KAAK,CAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE;;AAItF,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA;AACO,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAgB;IAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAE,CAAE;AAAA,EAAA;AAExF,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA;EACO,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA;CAIzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAEpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAM,CAAG,CAAA,CAAA,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;;AAI9C,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA;AACO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe;AAA6B,IAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI;AAAA,EAAA;AAE7F,CAAA,CAAA,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA,CAAA,CAAA;AACO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA;CAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA;;AAG1B,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAG,CAAA;;AAGxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAI,CAAE,CAAE;;;AAIrE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAW;AAAA,QAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAE,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA;AAAA,QAAI,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;;CAG3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE;;AAGvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAK,CAAG,CAAA,CAAA,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAE,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE;AAEzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAG,CAAA,CAAA;SAEb,CAAI,CAAA,CAAA;;AAGL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,EAAG,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAE,CAAE;;AAIlE,CAAA,CAAA,CAAA,CAAA,OAAO,CAAK,CAAA,CAAA,CAAA,CAAA;;AAIhB,CAAA,CAAA,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA,CAAA,CAAA;EACO,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA;CAEvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA;;AAG1B,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAG,CAAA;;AAGxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAI,CAAE,CAAE;;AAGjE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,EAAG,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAE,CAAE;;AAIlE,CAAA,CAAA,CAAA,CAAA,OAAO,CAAK,CAAA,CAAA,CAAA,CAAA;;AAIhB,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,WAAW;IAAe,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,IAAI;AAAA,EAAA;AAEjD,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA;CAE3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA;AAAA,MAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAChC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAC7C,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAIrB,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA;EACI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAG,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA;CAEtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGxC,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;MAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ;QAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAC9D,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE;MAC7C;IAAE,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,OAAO,CAAE;;;AAM/B,CAAA,CAAA;;;;;AAKG,CAAA,CAAA;AACU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,gBAAgB,CAA8B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAUzF,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA;AACU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAA2B,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;;CAGlE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,QAAQ,CAAoC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE;;EAGvE,MAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAY,MACvB,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAE,KAAK,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAI,CAAE,CAC7C;EAED,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAgB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA;AAErE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAI,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE;AAE9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK;UAC7C,UAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAGhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,GAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAE,GAAG,CAAG,CAAA,CAAA;CAEvB,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAU;AAAY,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE,CAAE,CAAE,CAAA,CAAE;AAEtE,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAE,EAAU;MAAe,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAI,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAE;AAEtE,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,GAAG,CAAG,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAU;AAA+B,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE,CAAE,CAAE,CAAA,CAAE;AAEtF,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAgB;MAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAI,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAE,CAAE;CAExE,CAAA,CAAA,CAAA;GAAA;AAEL,CAAC,CAAA,CAAA,CAAA;;;"}
@@ -0,0 +1,137 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ import {
3
+ PhoneticRegistry,
4
+ PhoneticMappingRegistry,
5
+ Phonetic
6
+ } from './Phonetic.js';
7
+
8
+ /**
9
+ * Soundex Phonetic Algorithm
10
+ * src/phonetic/Soudex.ts
11
+ *
12
+ * @see https://en.wikipedia.org/wiki/Soundex
13
+ *
14
+ * Soundex is a phonetic algorithm for indexing names by sound. It is used to
15
+ * encode words into a phonetic representation, allowing for the comparison of
16
+ * words based on their pronunciation rather than their spelling. This works
17
+ * by mapping letters to digits, ignoring certain letters, and applying specific
18
+ * rules to handle character combinations.
19
+ *
20
+ * It is particularly useful for matching names that may be spelled differently
21
+ * but sound similar and commonly used in genealogical research and databases
22
+ * to find similar-sounding names.
23
+ *
24
+ * The Soundex algorithm is not case-sensitive and ignores vowels and certain
25
+ * consonants. It outputs an array of strings that represents the phonetic code
26
+ * of the input, typically limited to the length of four characters.
27
+ *
28
+ * @module Phonetic/Soundex
29
+ * @author Paul Köhler (komed3)
30
+ * @license MIT
31
+ */
32
+ /**
33
+ * Soundex class extends the Phonetic class to implement the Soundex phonetic algorithm.
34
+ */
35
+ class Soundex extends Phonetic {
36
+ // Default options for the Soundex phonetic algorithm
37
+ static default = {
38
+ map: 'en',
39
+ delimiter: ' ',
40
+ length: 4,
41
+ pad: '0',
42
+ dedupe: true
43
+ };
44
+ /**
45
+ * Constructor for the Soundex class.
46
+ *
47
+ * Initializes the Soundex phonetic algorithm with the mapping and options.
48
+ *
49
+ * @param {PhoneticOptions} [opt] - Options for the Soundex phonetic algorithm
50
+ */
51
+ constructor(opt = {}) {
52
+ super('soundex', opt);
53
+ }
54
+ /**
55
+ * Adjusts the phonetic code by removing leading zeros and ensuring the
56
+ * first character is uppercase.
57
+ *
58
+ * @param {string} code - The phonetic code to adjust
59
+ * @param {string[]} chars - The characters used in the phonetic code
60
+ * @returns {string} - The adjusted phonetic code
61
+ */
62
+ adjustCode(code, chars) {
63
+ return chars[0].toUpperCase() + code.slice(1).replaceAll('0', '');
64
+ }
65
+ }
66
+ // Register the Soundex algorithm in the phonetic registry
67
+ PhoneticRegistry.add('soundex', Soundex);
68
+ //Register the Soundex phonetic mapping for English.
69
+ PhoneticMappingRegistry.add('soundex', 'en', {
70
+ map: {
71
+ a: '0',
72
+ e: '0',
73
+ h: '0',
74
+ i: '0',
75
+ o: '0',
76
+ u: '0',
77
+ w: '0',
78
+ y: '0',
79
+ b: '1',
80
+ f: '1',
81
+ p: '1',
82
+ v: '1',
83
+ c: '2',
84
+ g: '2',
85
+ j: '2',
86
+ k: '2',
87
+ q: '2',
88
+ s: '2',
89
+ x: '2',
90
+ z: '2',
91
+ d: '3',
92
+ t: '3',
93
+ l: '4',
94
+ m: '5',
95
+ n: '5',
96
+ r: '6'
97
+ }
98
+ });
99
+ //Register the Soundex phonetic mapping for German.
100
+ PhoneticMappingRegistry.add('soundex', 'de', {
101
+ map: {
102
+ a: '0',
103
+ ä: '0',
104
+ e: '0',
105
+ h: '0',
106
+ i: '0',
107
+ j: '0',
108
+ o: '0',
109
+ ö: '0',
110
+ u: '0',
111
+ ü: '0',
112
+ y: '0',
113
+ b: '1',
114
+ f: '1',
115
+ p: '1',
116
+ v: '1',
117
+ w: '1',
118
+ c: '2',
119
+ g: '2',
120
+ k: '2',
121
+ q: '2',
122
+ s: '2',
123
+ ß: '2',
124
+ x: '2',
125
+ z: '2',
126
+ d: '3',
127
+ t: '3',
128
+ l: '4',
129
+ m: '5',
130
+ n: '5',
131
+ r: '6'
132
+ },
133
+ ruleset: [{ char: 'c', next: ['h'], code: '7' }]
134
+ });
135
+
136
+ export { Soundex };
137
+ //# sourceMappingURL=Soundex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Soundex.js","sources":["../../../src/phonetic/Soundex.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;AAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;AAuBG,CAAA,CAAA;AAOH,CAAA,CAAA;;AAEG,CAAA,CAAA;AACG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA;;CAGvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,OAAO,CAAoB,CAAA,CAAA;AACjD,CAAA,CAAA,CAAA,CAAA,GAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI;AAAE,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAAE,IAAA,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA;CAC3D,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA;EACH,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAE,CAAA,CAAA,CAAA;AAAK,IAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE;AAAA,EAAA;AAEpE,CAAA,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA,CAAA;EACgB,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAE,KAAe,CAAA,CAAA;CAEzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAE,CAAC,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,CAAC,UAAU,CAAE,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAE,CAAE;;;AAM/E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAC,CAAG,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,OAAO,CAAE;AAE1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAC,CAAG,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE,CAAA;AAC1C,CAAA,CAAA,GAAG,CAAE,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAC9D,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;CAC9D,CAAA,CAAA,CAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA;AAC9C,CAAA,CAAA;AACJ,CAAA,CAAE;AAEH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAC,CAAG,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE,CAAA;AAC1C,CAAA,CAAA,GAAG,CAAE,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AACtF,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AACtC,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;CAC9D,CAAA,CAAA,CAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,OAAO,CAAE,CAAA,CACL,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAE,CAAG,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,EAAE,CAAG,CAAA,CAAA,CAAA,CACxC;AACJ,CAAA,CAAE;;;"}