@ihabdevteam/core 0.334.0 → 0.336.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.
@@ -1678,7 +1678,7 @@ export declare function copyText(text: string): Promise<boolean>;
1678
1678
  *
1679
1679
  * 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
1680
1680
  */
1681
- export declare const CORE_VERSION = "0.334.0";
1681
+ export declare const CORE_VERSION = "0.336.0";
1682
1682
 
1683
1683
  /** @public */
1684
1684
  declare const coreDefault: Record<string, unknown>;
@@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next';
5
5
  import Button from '../Button';
6
6
  import Badge from '../Badge';
7
7
  import { playOneShot } from '../Training/oneShotSound';
8
- import { questionSoundCandidates, canSpeak, playableUrl } from '../Training/questionSoundRoute';
8
+ import { questionSoundSteps, routeDeadline, shareOf, warnNoSoundUrl, canSpeak, playableUrl } from '../Training/questionSoundRoute';
9
9
  import { speak, stopSpeaking } from '../../utils/speak';
10
10
  import Popup from './Popup';
11
11
  import "./TrainingResultPopup.css";
@@ -140,21 +140,33 @@ export default function TrainingResultPopup(props) {
140
140
  playingRef.current = () => { turnRef.current++; s.stop(); stopSpeaking(); };
141
141
  return s.done;
142
142
  };
143
- /* **날 주소는 누름 그 자리에서 튼다.**
144
- 차례를 다 모으고 나서 틀도록 짰더니 `await` 가 하나 끼었고, 그러면 자동재생 막음이
145
- `play()` 를 거절할 수 있다 — 누름의 표가 `await` 를 못 넘는 브라우저가 있다. 시험 셋이
146
- 그 바뀜을 잡았다(누르자마자 안 울렸다). 있는 주소는 바로, 없을 때만 더듬는다. */
147
- const raw = playableUrl(rawUrl);
148
- const firstDone = raw ? tryUrl(raw) : Promise.resolve(false);
143
+ /* **차례를 하나씩 풀어 바로 튼다 — 다 모으고 나서 틀지 않는다.**
144
+ 전에는 셋을 다 풀어 모은 뒤에 틀었다. 그러면 ①이 0초에 답해도 ③(서버 합성)을
145
+ **반드시** 불러, 첫 소리가 그 합성이 끝난 뒤에야 났다(말귀_1 실측 2026-10-14:
146
+ `urlResolver` 0.0초 · `fallbackUrlResolver` 3.3초 — 둘 다 불렸다). 합성은 돈과 시간을
147
+ 쓰는 자리라, **쓰지도 않을 답을 누를 때마다 짓고 있었다.**
148
+
149
+ **날 주소는 누름 그 자리에서 튼다.** `await` 가 하나라도 끼면 자동재생 막음이 `play()`
150
+ 를 거절할 수 있다 — 누름의 표가 `await` 를 못 넘는 브라우저가 있다. 그래서 첫 차례가
151
+ 날 주소면 약속을 안 거치고 바로 튼다(시험 셋이 그 바뀜을 잡았다). */
152
+ const steps = questionSoundSteps(text, rawUrl);
153
+ const firstIsRaw = steps[0]?.kind === 'raw';
154
+ const firstDone = firstIsRaw ? tryUrl(rawUrl) : Promise.resolve(false);
149
155
  void (async () => {
150
156
  if (await firstDone)
151
157
  return;
152
158
  if (!mine())
153
159
  return;
154
- /* 날 주소는 위에서 이미 썼으니 다시 넘기지 않는다 */
155
- for (const url of await questionSoundCandidates(text, null)) {
160
+ const deadline = routeDeadline();
161
+ const rest = firstIsRaw ? steps.slice(1) : steps;
162
+ for (let k = 0; k < rest.length; k++) {
156
163
  if (!mine())
157
164
  return;
165
+ const url = await rest[k].resolve(shareOf(deadline, rest.length - k));
166
+ if (!mine())
167
+ return;
168
+ if (!url)
169
+ continue;
158
170
  if (await tryUrl(url))
159
171
  return;
160
172
  if (!mine())
@@ -162,6 +174,7 @@ export default function TrainingResultPopup(props) {
162
174
  }
163
175
  if (!mine())
164
176
  return;
177
+ warnNoSoundUrl(text);
165
178
  /* 주소로는 못 냈다 — 브라우저가 읽는다. 여기까지 와야 음원 없는 낱말도 들린다.
166
179
  멈추개를 **말소리용으로 바꿔 둔다** — 안 바꾸면 끝난 `<audio>` 의 `stop` 이 남아,
167
180
  멈춤 단추가 말을 끊는 것처럼 보이면서 실제로 끊는 것은 `stopSpeaking` 뿐이게 된다. */
@@ -24,7 +24,6 @@
24
24
  * 한 군데에 두 줄을 더하면 넷이 함께 따른다. 넷에 흩어진 채로 결정이 내려지면, 지금까지
25
25
  * 그래 왔듯 **한 자리가 안 따라간다.**
26
26
  */
27
- /** `playOneShot` 이 돌려주는 것 — 한 번 울리는 소리 하나의 삶 */
28
27
  export interface OneShotSound {
29
28
  /**
30
29
  * 만든 요소. 화면이 떠날 때 멈추려고 쥐고 있는 쪽이 있어 내보낸다
@@ -24,6 +24,8 @@
24
24
  * 한 군데에 두 줄을 더하면 넷이 함께 따른다. 넷에 흩어진 채로 결정이 내려지면, 지금까지
25
25
  * 그래 왔듯 **한 자리가 안 따라간다.**
26
26
  */
27
+ /** `playOneShot` 이 돌려주는 것 — 한 번 울리는 소리 하나의 삶 */
28
+ import { devWarnOnce } from '../../utils/devWarn';
27
29
  /**
28
30
  * 소리 하나를 틀고, 끝을 **한 번만** 알린다.
29
31
  *
@@ -39,6 +41,22 @@
39
41
  export function playOneShot(url, onEnd) {
40
42
  let settle = () => { };
41
43
  const done = new Promise((res) => { settle = res; });
44
+ /* **빈 주소로는 안 튼다 — 그리고 조용히 안 넘긴다.**
45
+ `new Audio('')` 는 문서 주소를 제 주소로 삼아 `play()` 가 **바로 거절**되고, 끝이
46
+ **그 자리에서** 돌아온다. 부르는 쪽에서 보면 *"틀었는데 곧바로 끝났다"* 라, 화면이
47
+ 되돌아가고 다음 차례도 안 밟는다 — 아무 데도 까닭이 안 남는다.
48
+ 부르는 자리 넷이 저마다 `if (!url)` 를 들고 있었는데, **그 넷이 다 맞다는 보장은 없다.**
49
+ 막는 자리를 여기 하나 더 둔다. 2026-10-14 에 앱에서 `play@0.0 (currentSrc = "")` 이
50
+ 잡혔고, 그것이 코어의 것인지 가리는 데만 한나절이 들었다. */
51
+ if (typeof url !== 'string' || url.trim() === '') {
52
+ devWarnOnce('one-shot-empty-url', '[core] playOneShot 에 빈 주소가 왔다 — 안 튼다. 부르는 쪽이 주소를 얻기 전에 불렀다.', new Error('playOneShot(empty)').stack);
53
+ settle(false);
54
+ try {
55
+ onEnd?.(false);
56
+ }
57
+ catch { /* 부르는 쪽의 실패로 약속을 묶어 두지 않는다 */ }
58
+ return { el: {}, stop: () => { }, done };
59
+ }
42
60
  /** 끝은 한 번이다 — 거절과 `error` 가 함께 오는 일이 실제로 있다 */
43
61
  let ended = false;
44
62
  const finish = (played) => {
@@ -8,4 +8,33 @@ export declare function canSpeak(text: string | null | undefined): boolean;
8
8
  *
9
9
  * 리졸버가 던지거나 빈 글자를 주면 그 자리만 건너뛴다 — 한 자리의 실패로 길이 끊기지 않는다.
10
10
  */
11
- export declare function questionSoundCandidates(text: string | null | undefined, rawUrl: unknown): Promise<string[]>;
11
+ /** 한 차례 — 부를 때까지 아무 일도 안 한다 */
12
+ export interface SoundStep {
13
+ /** 어느 차례인가 — 말할 때 쓴다 */
14
+ readonly kind: 'raw' | 'urlResolver' | 'fallbackUrlResolver';
15
+ /** 이 차례의 주소를 얻는다. 없으면 `null`(까닭은 콘솔에 적는다). */
16
+ resolve(remainingMs: number): Promise<string | null>;
17
+ }
18
+ /**
19
+ * 더듬을 차례들을 **차례대로** 준다(①②③). ④ 는 주소가 아니므로 여기 없다 —
20
+ * 다 비면 부르는 쪽이 `speechSynthesis` 로 간다.
21
+ *
22
+ * **게으르다 — 부르는 쪽이 하나씩 풀어 쓴다.**
23
+ * 처음에는 셋을 **다 풀어 모은 뒤에** 틀었다. 그러면 ①이 0초에 답해도 ③(서버 합성)을
24
+ * **반드시** 불러, 첫 소리가 그 합성이 끝난 뒤에야 났다(말귀_1 실측 2026-10-14:
25
+ * `urlResolver` 0.0초 · `fallbackUrlResolver` 3.3초 — 둘 다 불렸다). 합성은 돈과 시간을
26
+ * 쓰는 자리라, **쓰지도 않을 답을 누를 때마다 짓고 있었다.**
27
+ */
28
+ export declare function questionSoundSteps(text: string | null | undefined, rawUrl: unknown): SoundStep[];
29
+ /**
30
+ * **한 바퀴를 돌며 트는 쪽**이 쓰는 셈 — 바퀴가 끝나야 하는 때.
31
+ *
32
+ * 자리마다가 아니라 한 바퀴에 건다. 다만 남은 몫을 **남은 자리 수로 나눠** 준다 —
33
+ * 바퀴 하나로만 묶으면 앞(저장소 찾기)이 다 먹어 **뒤(합성)가 굶는데**, 음원 없는 낱말을
34
+ * 살리는 것이 뒤쪽이다. 앞이 빨리 답하면 남은 몫이 뒤로 흘러간다.
35
+ */
36
+ export declare function routeDeadline(): number;
37
+ /** 이 자리에 줄 몫 — 남은 시간을 남은 자리 수로 나눈다 */
38
+ export declare const shareOf: (deadline: number, stepsLeft: number) => number;
39
+ /** 주소를 하나도 못 얻었다 — 부르는 쪽이 브라우저 낭독으로 간다 */
40
+ export declare function warnNoSoundUrl(text: string): void;
@@ -82,53 +82,71 @@ export function canSpeak(text) {
82
82
  return typeof window !== 'undefined' && !!window.speechSynthesis;
83
83
  }
84
84
  /**
85
- * 더듬을 주소를 **차례대로** 모은다(①②③). ④ 는 주소가 아니므로 여기 없다 —
86
- * 다 실패하면 부르는 쪽이 `speechSynthesis` 로 간다.
85
+ * 더듬을 차례들을 **차례대로** 준다(①②③). ④ 는 주소가 아니므로 여기 없다 —
86
+ * 다 비면 부르는 쪽이 `speechSynthesis` 로 간다.
87
87
  *
88
- * 리졸버가 던지거나 빈 글자를 주면 그 자리만 건너뛴다 — 한 자리의 실패로 길이 끊기지 않는다.
88
+ * **게으르다 — 부르는 쪽이 하나씩 풀어 쓴다.**
89
+ * 처음에는 셋을 **다 풀어 모은 뒤에** 틀었다. 그러면 ①이 0초에 답해도 ③(서버 합성)을
90
+ * **반드시** 불러, 첫 소리가 그 합성이 끝난 뒤에야 났다(말귀_1 실측 2026-10-14:
91
+ * `urlResolver` 0.0초 · `fallbackUrlResolver` 3.3초 — 둘 다 불렸다). 합성은 돈과 시간을
92
+ * 쓰는 자리라, **쓰지도 않을 답을 누를 때마다 짓고 있었다.**
89
93
  */
90
- export async function questionSoundCandidates(text, rawUrl) {
91
- const out = [];
94
+ export function questionSoundSteps(text, rawUrl) {
95
+ const steps = [];
92
96
  const raw = playableUrl(rawUrl);
93
97
  if (raw)
94
- out.push(raw);
98
+ steps.push({ kind: 'raw', resolve: async () => raw });
95
99
  const t = (text ?? '').trim();
96
100
  if (!t)
97
- return out;
98
- /* 바퀴가 끝나야 하는 때 — 자리마다 새로 세지 않는다 */
99
- const deadline = Date.now() + ROUTE_BUDGET_MS;
100
- const steps = [
101
+ return steps;
102
+ for (const [kind, resolver] of [
101
103
  ['urlResolver', getTTSUrlResolver()],
102
104
  ['fallbackUrlResolver', getTTSFallbackUrlResolver()],
103
- ].filter(([, r]) => !!r);
104
- for (let i = 0; i < steps.length; i++) {
105
- const [kind, resolver] = steps[i];
105
+ ]) {
106
106
  if (!resolver)
107
107
  continue;
108
- /* 남은 몫을 남은 자리로 나눈다 — 앞이 빨리 답하면 그 몫이 뒤로 흘러간다 */
109
- const share = Math.max(0, deadline - Date.now()) / (steps.length - i);
110
- let answer;
111
- try {
112
- answer = await within(resolver(t), share);
113
- }
114
- catch (e) {
115
- /* **조용히 넘기지 않는다** — 리졸버가 던지면 그 자리는 영영 안 울고, 까닭은 아무 데도 안 남는다 */
116
- devWarnOnce(`question-sound-threw-${kind}`, `[core] configureTTS 의 ${kind} 가 던졌다 — 그 차례는 건너뛴다.`, e);
117
- continue;
118
- }
119
- if (answer === TIMED_OUT) {
120
- devWarnOnce(`question-sound-slow-${kind}`, `[core] configureTTS 의 ${kind} 가 ${ROUTE_BUDGET_MS}ms 바퀴 안에 안 풀렸다 — 그 차례를 버리고 다음으로 간다. ` +
121
- '서버 합성을 기다리는 리졸버라면 이 자리가 길어진다. 소리가 아예 안 나면 여기부터 보라.');
122
- continue;
123
- }
124
- const url = resolvedUrl(answer);
125
- if (!url) {
126
- devWarnOnce(`question-sound-empty-${kind}`, `[core] configureTTS 의 ${kind} 가 주소를 안 줬다(받은 것: ${JSON.stringify(answer)}) — 그 차례는 건너뛴다.`);
127
- continue;
128
- }
129
- /* 같은 주소를 두 번 더듬지 않는다 — 리졸버 둘이 같은 저장소를 가리키는 일이 있다 */
130
- if (!out.includes(url))
131
- out.push(url);
108
+ steps.push({
109
+ kind,
110
+ resolve: async (remainingMs) => {
111
+ let answer;
112
+ try {
113
+ answer = await within(resolver(t), remainingMs);
114
+ }
115
+ catch (e) {
116
+ /* **조용히 넘기지 않는다** — 리졸버가 던지면 그 자리는 영영 안 울고 까닭도 안 남는다 */
117
+ devWarnOnce(`question-sound-threw-${kind}`, `[core] configureTTS 의 ${kind} 가 던졌다 — 그 차례는 건너뛴다.`, e);
118
+ return null;
119
+ }
120
+ if (answer === TIMED_OUT) {
121
+ devWarnOnce(`question-sound-slow-${kind}`, `[core] configureTTS 의 ${kind} 가 ${ROUTE_BUDGET_MS}ms 바퀴 안에 안 풀렸다 — 그 차례를 버리고 다음으로 간다. ` +
122
+ '서버 합성을 기다리는 리졸버라면 이 자리가 길어진다. 소리가 아예 안 나면 여기부터 보라.');
123
+ return null;
124
+ }
125
+ const url = resolvedUrl(answer);
126
+ if (!url) {
127
+ devWarnOnce(`question-sound-empty-${kind}`, `[core] configureTTS 의 ${kind} 가 주소를 안 줬다(받은 것: ${JSON.stringify(answer)}) — 그 차례는 건너뛴다.`);
128
+ return null;
129
+ }
130
+ return url;
131
+ },
132
+ });
132
133
  }
133
- return out;
134
+ return steps;
135
+ }
136
+ /**
137
+ * **한 바퀴를 돌며 트는 쪽**이 쓰는 셈 — 바퀴가 끝나야 하는 때.
138
+ *
139
+ * 자리마다가 아니라 한 바퀴에 건다. 다만 남은 몫을 **남은 자리 수로 나눠** 준다 —
140
+ * 바퀴 하나로만 묶으면 앞(저장소 찾기)이 다 먹어 **뒤(합성)가 굶는데**, 음원 없는 낱말을
141
+ * 살리는 것이 뒤쪽이다. 앞이 빨리 답하면 남은 몫이 뒤로 흘러간다.
142
+ */
143
+ export function routeDeadline() {
144
+ return Date.now() + ROUTE_BUDGET_MS;
145
+ }
146
+ /** 이 자리에 줄 몫 — 남은 시간을 남은 자리 수로 나눈다 */
147
+ export const shareOf = (deadline, stepsLeft) => Math.max(0, deadline - Date.now()) / Math.max(1, stepsLeft);
148
+ /** 주소를 하나도 못 얻었다 — 부르는 쪽이 브라우저 낭독으로 간다 */
149
+ export function warnNoSoundUrl(text) {
150
+ devWarnOnce('question-sound-none', `[core] "${text}" 의 소리 주소를 한 자리에서도 못 얻었다 — 브라우저 낭독으로 간다. ` +
151
+ 'configureTTS 가 걸려 있는지, 리졸버가 주소를 주는지 위 줄들을 보라.');
134
152
  }
@@ -161,10 +161,20 @@ export function captureHtml(els, paperW, paperH, autoPrint = false, fileName = '
161
161
  ${fileName ? `<title>${escapeHtml(fileName)}</title>` : ''}
162
162
  <style>${styles}</style>
163
163
  <style>
164
- /* **화면에서 감춘 속 단추를 종이에서는 되살린다**((304), 2026-10-14).
164
+ /* **화면에서 감춘 속 단추를 이 문서에서는 되살린다**((304), 2026-10-14).
165
165
  화면이 작아 감춘 표(word-table-cell--tap-too-small)가 복제본에 그대로 따라오는데, 종이는 A4 라
166
166
  작지 않다. 이 한 줄이 없으면 **작은 화면에서 뽑은 종이에만 재생 단추가 없다** — 그
167
- 차이는 종이를 받아 든 사람에게만 보인다. */
167
+ 차이는 종이를 받아 든 사람에게만 보인다.
168
+
169
+ **@media print 안으로 옮기지 마라**(말귀_1 이 2026-10-14 실측 중에 물어 적는다).
170
+ 이 문서는 인쇄만 쓰는 것이 아니다 — **새 창**과 **내려받은 HTML** 로도 열리고, 그때는
171
+ 사람이 **화면으로** 본다. 거기서도 칸은 A4 크기로 서므로 단추가 보여야 한다.
172
+ 조건은 *"인쇄 중이냐"* 가 아니라 **"이 문서가 종이 문서냐"** 이고, 그 조건은 이미
173
+ 이 style 묶음이 그 문서 안에만 있다는 것으로 채워져 있다. 안으로 옮기면 새 창·내려받은
174
+ 쪽에서만 단추가 사라지고, **그 둘은 아무도 안 재는 자리다.**
175
+
176
+ (이 글은 template literal 안이다 — **백틱을 쓰면 틀이 거기서 끊긴다.** 이 파일에서
177
+ 두 번째 밟았다. 글머리표는 별표로만 적는다.) */
168
178
  .word-table-cell--tap-too-small .word-table-cell__play-button,
169
179
  .word-table-cell--tap-too-small .word-table-cell__info-button { display: revert; }
170
180
  * { box-sizing: border-box; }
@@ -46,4 +46,4 @@
46
46
  *
47
47
  * 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
48
48
  */
49
- export declare const CORE_VERSION = "0.334.0";
49
+ export declare const CORE_VERSION = "0.336.0";
@@ -46,4 +46,4 @@
46
46
  *
47
47
  * 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
48
48
  */
49
- export const CORE_VERSION = '0.334.0';
49
+ export const CORE_VERSION = '0.336.0';
package/dist/utils.cjs.js CHANGED
@@ -21,4 +21,4 @@
21
21
  \uC2E0\uB8B0\uB97C \uC313\uACE0
22
22
  \uD68C\uBCF5\uC744 \uB3D5\uC2B5\uB2C8\uB2E4.`,site:{title:"\uC0AC\uC774\uD2B8",malgwi:"\uB9D0\uADC0",soundDirection:"\uC18C\uB9AC\uBC29\uD5A5\uC131\uC2DC\uC2A4\uD15C",vrSoundDirection:"VR\uC18C\uB9AC\uBC29\uD5A5\uC131\uC2DC\uC2A4\uD15C",hearingTest:"\uCCAD\uB825\uD14C\uC2A4\uD2B8 \uD504\uB85C"},sns:{title:"SNS",naverBlog:"\uB124\uC774\uBC84 \uBE14\uB85C\uADF8",kakao:"KAKAO Talk \uC624\uD508\uCC44\uD305"},policy:{title:"\uC815\uCC45",terms:"\uC774\uC6A9\uC57D\uAD00",privacy:"\uAC1C\uC778\uC815\uBCF4 \uCC98\uB9AC\uBC29\uCE68"},ceo:"\uB300\uD45C",address:"\uC8FC\uC18C",support:"\uACE0\uAC1D\uC13C\uD130",ceoName:"\uD55C\uC9C0\uD61C",addressValue:"\uAC15\uC6D0\uB3C4 \uCD98\uCC9C\uC2DC \uC2DC\uCCAD\uAE38 32 \uD574\uCC2C\uBE4C\uB529 3\uCE35 302\uD638"},zi={trainingPhone:{topic:"\uD143\uBC2D\uAC00\uAFB8\uAE30",prev:"\uC774\uC804",next:"\uB2E4\uC74C",speed:"\uBE60\uB974\uAE30 3",noiseType:"\uC640\uAE00\uC640\uAE00",settings:"\uC124\uC815",start:{caption:"\uC544\uB798 \uD50C\uB808\uC774(\u25B6) \uBC84\uD2BC\uC744 \uB20C\uB7EC \uBB38\uC7A5\uC744 \uC798 \uB4E4\uC5B4\uBCF4\uC138\uC694. \uC798 \uB4E4\uC73C\uC2E0 \uB4A4 \uBB38\uC7A5\uC744 \uD655\uC778\uD558\uC138\uC694."},feedback:{caption:"\uC798 \uD0A4\uC6B4 \uBAA8\uC885\uC744 \uD143\uBC2D\uC5D0 \uC2EC\uACE0 \uBE44\uB2D0\uC744 \uC798 \uB36E\uC5B4 \uC90D\uB2C8\uB2E4."},done:{heardWell:"\uC798 \uB4E4\uB9B0 \uBB38\uC7A5",listenAgain:"\uD55C \uBC88 \uB354 \uB4E3\uAE30"}}},qi={timeHM:"{{h}}\uC2DC {{m}}\uBD84",timeH:"{{h}}\uC2DC"},Ji={options:"\uD6C8\uB828 \uC635\uC158",difficulty:"\uB09C\uC774\uB3C4",exclude:"\uC81C\uC678",chosung:"\uCD08\uC131",excludeOptions:{none:"\uC5C6\uC74C",noImage:"\uC774\uBBF8\uC9C0 \uC5C6\uC74C"}},Qi={answer:"\uC815\uB2F5",distractor:"\uC624\uB2F5"},Zi={phaseWordDownload:"\uB2E8\uC5B4 \uB370\uC774\uD130 \uB2E4\uC6B4\uB85C\uB4DC",phaseImageCheck:"\uC774\uBBF8\uC9C0 \uD655\uC778",phasePairAnalysis:"\uB2E8\uC5B4\uC30D \uBD84\uC11D",downloadingCount:"{{n}}\uAC1C \uB2E4\uC6B4\uB85C\uB4DC \uC911",checkingPage:"{{page}}\uD398\uC774\uC9C0 \uBAA9\uB85D \uD655\uC778 \uC911",imageCount:"{{done}} / {{total}}\uAC1C"},Xi={clearAriaLabel:"\uC785\uB825\uAC12 \uC9C0\uC6B0\uAE30"},eu={ariaLabel:"\uC120\uD0DD \uD0ED"},tu={ariaLabel:"\uD0ED"},nu={dragPrompt:"\uD30C\uC77C\uC744 \uC774\uACF3\uC5D0 \uB4DC\uB798\uADF8\uD558\uC5EC \uC5C5\uB85C\uB4DC",browseButton:"\uD30C\uC77C \uC120\uD0DD",removeAriaLabel:"{{name}} \uC81C\uAC70"},ou={ariaLabel:"\uC0AC\uC6A9\uC790 \uC544\uBC14\uD0C0"},ru={relativeDay:{today:"\uC624\uB298",yesterday:"\uC5B4\uC81C",daysAgo:"{{n}}\uC77C \uC804"},reason:{notLoggedIn:"\uB85C\uADF8\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4."},list:{title:"\uBC1B\uC740 \uC219\uC81C"},status:{expired:"\uB9CC\uB8CC\uB428",done:"\uC644\uB8CC {{count}}\uD68C \xB7 {{date}}",notDone:"\uBBF8\uC644\uB8CC"}},au={weekly:{title:"\uC8FC\uAC04 \uD6C8\uB828 \uD604\uD669",daily:"\uC624\uB298\uC758 \uB4E3\uAE30",crossword:"\uAC00\uB85C\uC138\uB85C"},homework:{title:"\uC219\uC81C \uC9C4\uD589\uD604\uD669",totalRate:"\uC804\uCCB4 \uC644\uB8CC\uC728",count:"\uC804\uCCB4",done:"\uC644\uB8CC",remaining:"\uBBF8\uC644\uB8CC"},today:{tooltipTotal:"\uC804\uCCB4",tooltipDone:"\uC644\uB8CC"},filter:{countSuffix:" \uD6C8\uB828"},time:{countLabel:"{{n}}\uD68C \uD6C8\uB828",empty:"\uD6C8\uB828 \uAE30\uB85D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."},daily:{title:"\uC624\uB298\uC758 \uB4E3\uAE30 \uAE30\uB85D",empty:"\uC644\uB8CC\uD55C \uD68C\uCC28\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."},crossword:{title:"\uAC00\uB85C\uC138\uB85C\uD034\uC988",empty:"\uC644\uB8CC\uD55C \uB808\uBCA8\uC774 \uC5C6\uC2B5\uB2C8\uB2E4"},visit:{title:"\uBC29\uBB38 \uC5F0\uB3D9 \uAE30\uB85D"},detail:"\uC0C1\uC138\uBCF4\uAE30",detailFor:"{{name}} \uC0C1\uC138\uBCF4\uAE30",trainingType:{LISTEN_IN_NOISE:"\uC18C\uC74C \uD558 \uBB38\uC7A5",SHORT_STORY:"\uC9E7\uC740 \uC774\uC57C\uAE30",LONG_STORY:"\uAE34 \uC774\uC57C\uAE30",ORDERING_SENTENCE:"\uBB38\uC7A5 \uC21C\uC11C\uD654"}},iu={publish:{descPlaceholder:"\uB9D0\uADC0\uC790\uB8CC\uC2E4\uC5D0 \uD45C\uC2DC\uD560 \uD55C \uC904 \uC124\uBA85 (\uC120\uD0DD)"},import:"\uB0B4 \uD6C8\uB828\uC5D0 \uAC00\uC838\uC624\uAE30",publisher:"\uAC8C\uC2DC\uC790",time:{justNow:"\uBC29\uAE08 \uC804",minutesAgo:"{{n}}\uBD84 \uC804",hoursAgo:"{{n}}\uC2DC\uAC04 \uC804",daysAgo:"{{n}}\uC77C \uC804",weeksAgo:"{{n}}\uC8FC \uC804",monthsAgo:"{{n}}\uAC1C\uC6D4 \uC804",yearsAgo:"{{n}}\uB144 \uC804"},badge:{shared:"\uB9D0\uADC0\uC790\uB8CC\uC2E4"}},uu={manage:{unit:"\uAC74"}},lu={cancelLabel:"\uCDE8\uC18C"},su={steps:"\uC9C4\uD589 \uB2E8\uACC4 {{current}} / {{total}}"},cu={panelTitle:"\uD6C8\uB828 \uC624\uB2F5",viewItems:"\uBB38\uD56D",viewTypes:"\uC720\uD615",colPending:"\uB0A8\uC740 \uAC83",colTrend:"\uBCC0\uD654",colRuns:"\uD310",unitItem:"\uAC1C",skippedOnly:"\uC61B \uAE30\uB85D {{n}}\uAC74\uC740 \uBB34\uC5C7\uC744 \uD47C \uAC83\uC778\uC9C0 \uC548 \uB0A8\uC544 \uC788\uC5B4 \uC148\uC5D0\uC11C \uBE90\uC2B5\uB2C8\uB2E4.",summaryLabel:"\uC313\uC778 \uAE30\uB85D",summaryValue:"{{items}}\uBB38\uD56D \xB7 \uC544\uC9C1 \uBABB \uC7A1\uC740 \uAC83 {{pending}}\uAC1C",nextLabel:"\uB2E4\uC74C\uC5D0 \uBCFC \uAC83",nextCount:"{{count}}\uAC1C",nextCountCapped:"{{total}}\uAC1C \uC911 {{shown}}\uAC1C",picked:"\u2192 {{what}}",typeClear:"\uB2E4 \uC7A1\uC558\uC5B4\uC694",typePending:"{{total}}\uAC1C \uC911 {{pending}}\uAC1C \uB0A8\uC74C",flat:"\uBCC0\uD654 \uC5C6\uC74C",runs:"{{count}}\uD310",avgDuration:"\uD3C9\uADE0 {{sec}}\uCD08"},du={resetColumns:"\uCE78 \uB108\uBE44 \uCD08\uAE30\uD654",scrollRegion:"\uAC00\uB85C\uB85C \uAD74\uB9B4 \uC218 \uC788\uB294 \uD45C",rowActionHint:"\uC904\uC744 \uB204\uB974\uBA74 \uC790\uC138\uD788 \uBD05\uB2C8\uB2E4"},gu={panelTitle:"\uB2E8\uC5B4\uD45C \uCC44\uC810",viewWords:"\uB0B1\uB9D0",viewTables:"\uD45C",colLatest:"\uB9C8\uC9C0\uB9C9",colTrend:"\uBCC0\uD654",unitTime:"\uD68C",summaryLabel:"\uC313\uC778 \uCC44\uC810",summaryValue:"{{times}}\uD68C \xB7 \uB0B1\uB9D0 {{words}}\uAC1C",nextLabel:"\uB2E4\uC74C\uC5D0 \uBCFC \uAC83",nextCount:"{{count}}\uAC1C",allClear:"\uC9C0\uB09C\uBC88\uC5D0 \uBAA8\uB450 \uB9DE\uD614\uC2B5\uB2C8\uB2E4.",times:"{{count}}\uD68C",flat:"\uBCC0\uD654 \uC5C6\uC74C",recentLabel:"\uCD5C\uADFC \uCC44\uC810",nextCountCapped:"{{total}}\uAC1C \uC911 {{shown}}\uAC1C"},mu={ariaLabel:"\uBC30\uB108",dotAriaLabel:"{{count}}\uAC1C \uC911 {{index}}\uBC88\uC9F8 \uBC30\uB108"},Cu={selectYearMonth:"\uC5F0\uC6D4 \uC120\uD0DD",chooseDate:"\uB0A0\uC9DC \uC120\uD0DD"},hu={previewRegion:"\uBCF4\uACE0\uC11C \uBBF8\uB9AC\uBCF4\uAE30 \u2014 \uC88C\uC6B0\uB85C \uAD74\uB824 \uBCFC \uC218 \uC788\uC2B5\uB2C8\uB2E4"},pu={description:"\uC124\uBA85",textbox:"\uBCF8\uBB38",training:"\uD6C8\uB828 \uC548\uB0B4",menu:"\uBA54\uB274"},fu={devNone:"\uBC1C\uB2EC \uC790\uB8CC \uC5C6\uC74C",place:{labial:"\uC591\uC21C\uC74C",alveolar:"\uCE58\uC870\uC74C",palatal:"\uACBD\uAD6C\uAC1C\uC74C",velar:"\uC5F0\uAD6C\uAC1C\uC74C",glottal:"\uC131\uBB38\uC74C"}},Su={clearSelection:"\uC120\uD0DD \uD574\uC81C"},yu={showResult:"{{type}} \uACB0\uACFC\uBCF4\uAE30"},bu={selected:"\uC120\uD0DD\uB428",remove:"\uC81C\uAC70",exclude:"\uC81C\uC678",nthSelected:"{{n}}\uBC88\uC9F8 \uC120\uD0DD"},wu={loading:"\uBD88\uB7EC\uC624\uB294 \uC911\u2026"},Tu={state:{active:"\uC18C\uB9AC \uB098\uB294 \uC911",played:"\uB4E4\uC74C",correct:"\uC815\uB2F5",wrong:"\uC624\uB2F5"}},Eu={ariaLabel:"\uC774\uB3D9 \uACBD\uB85C"},Du={empty:"\uB4F1\uB85D\uB41C \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."},vu={main:"\uBA54\uC778 \uADF8\uB77C\uB514\uC5B8\uD2B8",soft:"\uC18C\uD504\uD2B8",sub:"\uC11C\uBE0C \uCEEC\uB7EC",deep:"\uB525 \uADF8\uB77C\uB514\uC5B8\uD2B8",softSub:"\uC18C\uD504\uD2B8 \uC11C\uBE0C",warm:"\uC6DC(\uAC15\uC870)",dark:"\uB2E4\uD06C",radial:"\uBC29\uC0AC\uD615 \uADF8\uB77C\uB514\uC5B8\uD2B8",diagonal:"\uB300\uAC01\uC120 \uD328\uD134",dots:"\uB3C4\uD2B8 \uD328\uD134",outline:"\uC544\uC6C3\uB77C\uC778",success:"\uC131\uACF5/\uC644\uB8CC",naver:"\uB124\uC774\uBC84 \uBE14\uB85C\uADF8 \uC548\uB0B4",instagram:"\uC778\uC2A4\uD0C0\uADF8\uB7A8 \uC548\uB0B4"},Au={common:di,calendar:gi,passCard:mi,searchField:Ci,rating:hi,colorPicker:pi,dropdown:fi,accordion:Si,header:yi,nav:bi,settings:wi,usage:Ti,account:Ei,help:Di,training:vi,trainingSettings:Ai,customers:Li,payment:Ni,coupons:_i,visits:Ri,company:ki,trainingType:Pi,myWordTraining:Bi,myWordTable:Oi,keyWords:Mi,wordTable:Ii,wordSearch:ji,wordPrint:$i,topic:Fi,accessLinkManager:xi,login:Wi,trainingPlanRun:Gi,device:Hi,manager:Ki,wordPairs:Yi,game:Vi,footer:Ui,landing:zi,date:qi,trainingSetPage:Ji,wordTrainingPreview:Qi,wordData:Zi,textField:Xi,segmentedControl:eu,tabs:tu,fileUpload:nu,avatar:ou,myHomework:ru,trainingStatus:au,store:iu,homework:uu,inquiry:lu,progress:su,trainingMiss:cu,table:du,wordScore:gu,topBanner:mu,datePicker:Cu,report:hu,tooltip:pu,phonemeProfile:fu,bulkBar:Su,debug:yu,badge:bu,loader:wu,soundCompass:Tu,breadcrumb:Eu,board:Du,promoBannerBg:vu},Lu={statusFilter:"Filter by status",pageSizeSelect:"Items per page",selectedCount_one:"{{count}} selected",selectedCount_other:"{{count}} selected",moreFor:"More options for {{name}}",collapseFor:"Collapse {{name}}",expandFor:"Expand {{name}}",sortFor:"Sort {{name}}",cancel:"Cancel",info:"Info",errorState:{message:"Couldn't load this.",retry:"Try again"},save:"Save",confirm:"Confirm",discardConfirm:{title:"Discard your changes?",body:"If you do not save, everything you have entered will be lost.",confirm:"Discard"},close:"Close",back:"Back",emptyTrainingName:"Training name is empty.",remove:"Remove",image:"Image",delete:"Delete",reset:"Reset",update:"Update",download:"Download",likeCount_one:"{{count}} like",likeCount_other:"{{count}} likes",selectedOfMax:"{{count}} of {{max}}",downloadCount_one:"{{count}} download",downloadCount_other:"{{count}} downloads",descriptionFor:"About {{name}}",search:"Search",empty:"No data.",yes:"Yes",no:"No",all:"All",none:"None",days_one:"{{count}} day",days_other:"{{count}} days",loadMore:"Load More",retry:"Try Again",prevPage:"Previous page",nextPage:"Next page",play:"Play",playFor:"Play {{name}}",pauseFor:"Pause {{name}}",pause:"Pause",playPause:"Play / Pause",replay:"Replay",subscription:"Subscription",done:"Done",failed:"Failed",continue:"Continue",notification:"Notice",emptyList:"No items",noMatches:"No matching items",menu:"Menu",resetSelection:"Reset Selection",pageSizeLabel:"Show {{n}}",totalCountPrefix:"Total: ",totalCountSuffix:"",expand:"Expand",collapse:"Collapse",popup:"Popup",more:"More",codeBlock:"Code block",totalPrefix:"",copyCode:"Copy code",copied:"Copied",col:{problem:"Question"},phonetics:{place:{labial:"Bilabial",alveolar:"Alveolar",palatal:"Palatal",velar:"Velar",glottal:"Glottal"},vowel:{frontHigh:"Front high vowel",backHighUnrounded:"Back high unrounded vowel",backHighRounded:"Back high rounded vowel",frontMid:"Front mid vowel",backMidUnrounded:"Back mid unrounded vowel",backMidRounded:"Back mid rounded vowel",low:"Low vowel"},glide:{j:"j-glide",w:"w-glide",velar:"\u0270-glide"}},unknownError:"Unknown error",networkError:"The network connection is unstable. Check your connection and try again."},Nu={rangeSelect:"Select period",dow:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],weekLabel:"Week {{ord}}",prevMonth:"Previous month",addOnDate:"Add a visit on {{date}}",nextMonth:"Next month",prevWeek:"Previous week",nextWeek:"Next week",legend:{visited:"Visited",scheduled:"Scheduled",noVisit:"No Show"},periodSelect:"Period unit",visitCount_one:"{{count}} visit",visitCount_other:"{{count}} visits",statusCount:"{{count}} {{label}}",weekOrdinal:["1","2","3","4","5","6","7"]},_u={planSuffix:"Plan",labeledPlan:"{{label}} Plan",couponCode:"Pass Code",specialLabel:"Open Special",unitDay:"d",unitYear:"yr",remainingDay:"{{n}}d left",remainingHour:"{{n}}h left",remainingMinute:"{{n}}m left",remainingSecond:"{{n}}s left",expired:"Expired",menu:{use:"Activate",refund:"Refund",delete:"Delete"}},Ru={clearAriaLabel:"Clear search"},ku={starLabel:"Select star {{n}}",valueLabel:"{{value}} out of {{max}}",groupLabel:"Rating"},Pu={selected:"selected"},Bu={placeholder:"Select"},Ou={collapse:"Collapse",expand:"Expand"},Mu={biArea:"BI area",biSymbol:"BI symbol",logoMalgwi:"Malgwi logo",logoManager:"Malgwi Manager logo",menuOpen:"Open menu",utilMenu:"Utility menu",menuClose:"Close menu"},Iu={mainMenu:"Main menu",bottomNav:"Bottom navigation",goToManager:"Go to Malgwi Manager",goToMalgwi:"Go to Malgwi",modeLabelManager:"Malgwi Manager",modeLabelMalgwi:"Malgwi",training:"Training",settings:"Settings",notifications:"Notifications",account:"Account",help:"Help",feedback:"Report a bug",debug:"Debug",coupons:"Coupons",topic:"By Topic",trainingType:"By Training Type",wordPairs:"Word Pairs",wordSearch:"Word Search",wordTable:"Word Table Creator",company:"Company Info",more:"More",moreMenu:"More menu",badgeLabel:"{{label}}, {{count}}",badgeInsideLabel_one:"{{label}}, {{count}} notification inside",badgeInsideLabel_other:"{{label}}, {{count}} notifications inside"},ju={language:{training:{label:"Training Language",sub:"Language used for training words and speech"}},notifications:{title:"Notifications"},display:{fontSize:{small:"Small",large:"Large"}},cache:{title:"Cache Management",confirmMessage:"Delete cache ({{size}}). Do you want to continue?",delete:"Delete",deleting:"Deleting",cleared:"Cache cleared successfully.",group:{wordData:{label:"Word Data",sub:"Word list and version info"},pairIndex:{label:"Pair Index",sub:"Onset\xB7vowel\xB7coda minimal pair analysis cache"},imageCache:{label:"Image Cache",sub:"Word image existence check results"},trainingRecord:{label:"Training Record",sub:"Daily training progress and streak"}}},button:{save:"Save Settings"},popup:{clear:{confirm:"Reset"},update:{confirm:"Update"},cache:{title:"Delete {{label}}",message:"Delete {{label}} ({{size}}). Do you want to continue?"}},saved:"\u2713 Saved",account:{title:"Account",delete:{sub:"You can restore your account within 30 days of withdrawal."}}},$u={addButton:"Add Subscription",couponButton:"Enter Coupon",active:{infoTitle:"Subscription Info",refund:"Request Refund",startDate:"Start Date",endDate:"End Date",remaining:"Remaining"},pending:{title:"Pending",empty:"No pending subscriptions."},loading:"Loading\u2026",segment:{personal:"Malgwi",org:"Malgwi Manager"},org:{title:"Current Plan",disc:"Subscription plan in use by your organization.",empty:"No organization plan registered.",fallbackTitle:"Organization Plan",startDate:"Start Date",endDate:"End Date",remaining:"Remaining",duration:"Duration"}},Fu={profile:{planSuffix:"",plan:"Plan"},basicInfo:{name:{placeholder:"John Doe"}},security:{title:"Security",password:{label:"Password",currentRequired:"Enter your current password.",newRequired:"Enter a new password.",mismatch:"The new passwords do not match.",changed:"Your password has been changed."},twoFactor:{label:"Two-Factor Authentication",sub:"Strengthen your account security"}}},xu={guide:{faq:{title:"FAQ",desc:"View all frequently asked questions"}}},Wu={settings:"Settings",start:{title:"Start Word Training",description:"Select a training type below to begin"},difficulty:{tooltip:"The easiest difficulty is 'Random', the hardest is 'Initial Consonant Difference'."},contrast:{label:"Contrast",type:"Contrast Type",count:"Contrast Count",n:"{{n}}"},filter:{random:"Random",trainOnset:"Onset",trainVowel:"Vowel",trainCoda:"Coda",phonemeGroup:"Training phonemes",noLimit:"Any",codaExclude:"Exclude",gradeLabel:"Grade",excludeImageInfo:"Only words with images: keeps only results with a registered word image.",sameStructureInfo:"Only same phoneme structure: keeps only pairs where the correct and wrong answers share the same syllable structure (length, batchim, etc.).",selectSection:"Select",excludeImage:"Only words with images",sameStructure:"Only same phoneme structure"},noQuestions:"No questions available.",countQuestions_one:"{{n}} question",countQuestions_other:"{{n}} questions",countSentences_one:"{{n}} sentence",countSentences_other:"{{n}} sentences",comingSoon:"Coming Soon",nextQuestion:"Next",noiseRatioTitle:"Noise Ratio",noiseRatioValue:"{{ratio}}\xD7",noiseTypeTitle:"Noise Type",playVolumeTitle:"Volume",playSpeedTitle:"Speed",meter:{sentence:"Playback",noise:"Noise",toggle:"Show Audio Meter"},viewResult:"View Results",problemNotice:"Problem {{n}}.",trainingSettingsTitle:"Training Settings",sentencePreview:"Sentence Preview",notHeard:"Didn't hear it.",heardWell:"Heard it well.",confirmTitle:"Check the sentence and select whether you heard it.",noSoundWaveform:"Waveform is not shown for sound-comparison questions.",noise:{level:{none:"None",weak:"Weak",medium:"Medium",strong:"Strong",veryStrong:"Very Strong"},type:{none:"None",default:"Default",street:"Street",buzz:"Buzzing",restaurant:"Restaurant"}},listenTitle:"Please listen to the sentence.",listenButton:"Listen",playSound:"Play Sound",playAll:"Play All",selectInOrder:"Select the cards in the order you heard.",stop:"Stop",preview:"Preview",previewFor:"Preview {{name}}",stopFor:"Stop {{name}}",next:"Next",completed:"Completed",selected:"Selected",nthSelected:"Selection {{n}}",fontSizeMin:"Font size is at the minimum.",fontSizeMax:"Font size is at the maximum.",fontSizeDecrease:"Decrease font size",fontSizeIncrease:"Increase font size",toggleBackground:"Toggle background",cardInstructions:"Look at the word card, listen to the sound, and check it.",noCards:"No cards.",audioFetchError:"Failed to load the sound source.",ttsUnavailable:"Speech playback isn't available on this device.",selectConfirm:"Look at the question and select the answer.",orderListDefault:"Arrange the sentences in the order you heard.",result:{pendingDone:"Results are still being calculated, so you can't finish yet.",eyebrow:"Training Complete",title:"You've finished all the training!",scoreAria:"{{correct}} / {{total}} questions",elapsed:"Time Elapsed",summary:"You heard {{correct}} item(s) correctly.",tableAriaLabel:"Per-question judgement",colJudge:"Judgement",colAnswerSelected:"Answer \xB7 Selected",colAnswer:"Answer",colSelected:"Selected",heardWell:"Heard well",notHeard:"Didn't hear",notJudged:"Not judged",replay:"Replay",replaySound:"Replay item {{no}}",replaySoundStop:"Stop item {{no}}",done:"Done",viewResult:"View Results",noContent:"(No content)"},up:"Move up",down:"Move down",prev:"Previous",listenLabel:"Listen",sourcePlay:"Play source {{n}}",listen:"Listen",audioStatus:{idle:"Idle",resolving:"Resolving\u2026",checking_exists:"Checking file\u2026",getting_signed_url:"Getting URL\u2026",downloading:"Downloading\u2026",measuring_duration:"Measuring length\u2026",ready:"Ready",error:"Error",synthesizing:"Preparing the sound\u2026"}},Gu={totalCount:" training bundles",sort:{customers:"Customers"},copyLink:"Copy Link",removeLink:"Remove Link",linkRemoved:"Link removed.",linkSaveFirst:"Please save the training bundle first.",linkSaveFirstHint:"You can only create a shared link from a saved training bundle.",linkCopySelect:"Copy blocked \u2014 link selected. Press Ctrl/\u2318+C to copy.",nameRequired:"Please enter a training bundle name.",itemRequired:"Please add at least one training item.",randomAdd:"Random Add",menu:{publish:"Post to Store",duplicate:"Duplicate Training Bundle",edit:"Edit Training Bundle",move:"Move Group",rename:"Rename"},itemCount:"Number of Items",renameGroup:"Rename Group"},Hu={totalCount:" customers",loadError:"Failed to load list",basicInfo:{editTooltip:"Edit"},member:{placeholder:"Email or phone",link:"Link",linking:"Linking\u2026"},device:{title:"Hearing Devices",addTooltip:"Add New",addButton:"Add device",listTooltip:"View List",listTitle:" Device List",historyEmpty:"No device history registered",wearing:" in use",notRegistered:"Not registered",unit:"",wearingNow:"In use",wear:"Wear",unwear:"Remove",wornSince:"Since {{date}}",release:"Release",historyTitle:"Hearing device history"},schedule:{title:"Upcoming Visits",addTooltip:"Add Schedule",listTooltip:"View All",empty:"No upcoming visits",registerTitle:" Register Schedule",memoPlaceholder:"Enter a memo for this visit."},visitHistory:{title:"Visit History",addTooltip:"Add Visit",empty:"No visit history yet",popupTitle:" Visit History",registerTitle:" Register Visit"},moreItems:"more",viewAll:"View All",visits:{title:"Visits"},trainingRecord:{title:"Customer Training Records"},status:{trainingSubtitle:"Training Status"},detail:{session:{completedFmt:"Done {{done}}/{{total}} \xB7 {{duration}}"},visitSuffix:" visits"},homework:{active:"Active",copied:"Link copied.",copy:"Copy Link",inactive:"Inactive",title:"Homework Progress"},duration:{minSec:"{{m}}m {{s}}s",min:"{{m}}m",sec:"{{s}}s"}},Ku={plan:{recommendedFor:"Recommended for",features:"Key Features",freePrice:"Free",contact:"Contact Us",tierFallback:"Plan",openPromo:"Launch offer"},products:{mgrEnterprise:{tier:{price:"Contact us"}}}},Yu={title:"Coupons",subtitle:"Enter a coupon code or view your coupons",input:{label:"Coupon code",placeholder:"Enter coupon code"},applyButton:"Apply",error:{invalid:"Invalid coupon code.",alreadyUsed:"This coupon has already been used."},success:{applied:'"{{name}}" coupon applied.'},section:{owned:"My Coupons"},status:{used:"Used",available:"Available"}},Vu={unitVisit:"",periodAll:"All",showN:"Show {{n}}"},Uu={subtitle:"Manage company and business information",editButton:"Edit Info",basicInfo:{title:"Basic Info"},contactInfo:{title:"Contact Info"}},zu={title:"Training by Type",subtitle:"Select the training type you want",listenInNoise:{title:"Sentence Listening in Noise",desc:"Train sentence comprehension in various noise environments."},shortStory:{title:"Short Story Listening",desc:"Listen to short stories and understand the content."},longStory:{title:"Long Story Listening",desc:"Focus on listening to long stories and grasp the content."},orderingSentence:{title:"Sentence Ordering",desc:"Arrange heard sentences in the correct order."},SAME_SOUND_PICK:{label:"Listen & Pick Same Sound",sub:"Pick the word card that matches what you heard."},SAME_OR_DIFF:{label:"Same or Different?",sub:"Decide whether the two sounds are the same or different."},HEAR_AND_PICK_SAME:{label:"Hear & Match Word",sub:"Pick the word card that matches the sound you heard."},HEAR_AND_PICK_INCLUDED:{label:"Find Word Containing Sound",sub:"Pick the word card that contains the syllable you heard."},STARTS_WITH_SAME_SOUND:{label:"Find Word Starting with Same Sound",sub:"Pick a word that starts with the same sound as what you heard."},LISTEN_AND_REMEMBER_ORDER:{label:"Listen & Recall Order",sub:"Select the cards in the order you heard the three words."},MERGE_2_SYLLABLES:{label:"Combine 2 Syllables",sub:"What word do two syllables make?"},MERGE_3_SYLLABLES:{label:"Combine 3 Syllables",sub:"What word do three syllables make?"},MERGE_2_PHONEMES:{label:"Combine 2 Phonemes",sub:"What sound do two phonemes make?"},MERGE_3_PHONEMES:{label:"Combine 3 Phonemes",sub:"What sound do three phonemes make?"},DROP_1_FROM_2SYLL:{label:"Drop 1 Syllable from 2-Syllable",sub:"What sound remains when you remove a syllable from a 2-syllable word?"},DROP_1_FROM_3SYLL:{label:"Drop 1 Syllable from 3-Syllable",sub:"What sound remains when you remove a syllable from a 3-syllable word?"},DROP_PART_FROM_COMPOUND:{label:"Drop Part of Compound Word",sub:"What word remains when you remove part of a compound word?"},DROP_FINAL_CONSONANT_FROM_1SYLL:{label:"Drop Final Consonant",sub:"What sound remains when you remove the final consonant?"},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{label:"Drop Consonant",sub:"What sound remains when you remove the consonant?"},CHANGE_1_SYLL_IN_2SYLL:{label:"Change 1 Syllable (2-Syllable)",sub:"Change one syllable in a 2-syllable word to make a new word."},CHANGE_1_SYLL_IN_3SYLL:{label:"Change 1 Syllable (3-Syllable)",sub:"Change one syllable in a 3-syllable word to make a new word."},CHANGE_1_PHONEME_IN_1SYLL:{label:"Change 1 Phoneme (1-Syllable)",sub:"Change one phoneme in a 1-syllable word to make a new sound."},CHANGE_1_PHONEME_IN_2SYLL:{label:"Change 1 Phoneme (2-Syllable)",sub:"Change one phoneme in a 2-syllable word to make a new word."}},qu={comingSoon:"Word training is coming soon."},Ju={colName:"Table Name",open:"Open",countSuffix:" tables",addCard:"Add Word Table Card",cardsEmpty:"No word table cards created yet.",menu:{publishStore:"Post to Training Store",unpublishStore:"Remove from Training Store"},newBadge:"Newly created",tab:{cards:"Word Table Cards",tables:"Word Tables"},publishedBadge:"Published",sharedBadge:"Shared"},Qu={title:"Key Words",empty:"No key words available."},Zu={defaultName:"Word Table",title:"Word Table Builder",subtitle:"Set columns and add words to build a table.",filterTitle:"Table Settings",filter:{composition:"Composition",image:"Image",word:"Word",standardPron:"Standard Pronunciation",colloquialPron:"Colloquial Pronunciation",paperOrientation:"Paper Orientation",landscape:"Landscape",portrait:"Portrait",columns:"Columns",column:"{{count}} col",itemsPerPageWord:"Words per page",itemsPerPagePair:"Pairs per page",itemsPerPageOption:"{{count}}",pageIndicator:"{{current}} / {{total}}",pageNumber:"Page Number",pageNumberLeft:"Left",pageNumberCenter:"Center",pageNumberRight:"Right",border:"Border",topInfo:"Header",bottomInfo:"Footer",cutLine:"Cut Line",show:"Show",hide:"Hide",dotted:"Dotted",corner:"Corner"},addWord:"Add",wordInfo:"Info for {{word}}",emptyItems:"Please add at least one word.",load:"Load",openNewWindow:"Open in New Window",saveButton:"Save",saveAsNewButton:"Save as New",print:"Print",popupBlocked:"Popup was blocked. Please allow popups in your browser settings.",printFileNameSingle:"Word Table",printFileNamePair:"Contrast Pair Table",save:{title:"Save Word Table",nameLabel:"Name",desc:"Enter a name for the word table.",placeholder:"Enter a title for this word table.",descriptionLabel:"Description",descriptionPlaceholder:"Enter a description for this word table.",duplicateName:"This name is already in use.",nameRequired:"Please enter a table name.",autoFillHint:" (Press Tab or Space to autofill)",copyName:"{{name}} (copy)"},loadTable:{title:"Load Saved Word Table",empty:"No saved word tables.",loadButton:"Load",itemCount_one:"{{count}} word",itemCount_other:"{{count}} words",deleteAriaLabel:"Delete {{name}}",viewLabel:"View as",sortLabel:"Sort by",sort:{newest:"Newest",oldest:"Oldest",name:"Name",count:"Word Count"},view:{grid:"Grid View",list:"List View"}},publisherFilter:"Show only tables by {{name}}",groupDeleteMessage:"Word tables in this group will be moved to 'No Group'.",groupNamePlaceholder:"Group name",store:{badge:"Training Store"},card:{sub:"Word Table Card",empty:"No word tables in this card."},toast:{renameError:"Failed to rename",saveError:"Failed to save",deleteError:"Failed to delete",duplicateError:"Failed to duplicate",saveSuccess:"Word table saved."},scoring:{o:"{{word}} correct",triangle:"{{word}} partial",x:"{{word}} incorrect",markName:{o:"Correct",triangle:"Partial",x:"Incorrect"},button:"Score",pickTitle:"Who are you scoring?",pickSubtitle:"Choose the customer who trained with \u201C{{name}}\u201D.",pickSearch:"Search by name or phone",pickEmpty:"No customers registered.",pickNoMatch:"No matching customer.",pickAgain:"Choose another",scoringFor:"Scoring {{name}}",none:"Tap \u25CB \xB7 \u25B3 \xB7 \u2715 under a cell to mark it. With a mouse they appear when you hover the cell; with a keyboard, when focus reaches it.",tally:"{{marked}} scored \xB7 \u25CB {{o}} \xB7 \u25B3 {{triangle}} \xB7 \u2715 {{x}} \xB7 {{rate}}%",save:"Save score",saved_one:"Saved {{count}} mark for {{name}}.",saved_other:"Saved {{count}} marks for {{name}}.",reviewTitle:"Create a review table?",reviewMessage_one:"Builds a new table from the {{count}} cell {{name}} got wrong or partial. Correct ones are left out.",reviewMessage_other:"Builds a new table from the {{count}} cells {{name}} got wrong or partial. Correct ones are left out.",reviewConfirm:"Create review table",reviewDescription:"Cells marked wrong or partial in \u201C{{name}}\u201D \u2014 {{count}} of them.",reviewCreated_one:"Created \u201C{{name}}\u201D \u2014 {{count}} cell.",reviewCreated_other:"Created \u201C{{name}}\u201D \u2014 {{count}} cells.",discardTitle:"Discard this scoring?",discardMessage_one:"You marked {{count}} cell but have not saved. Leaving discards it.",discardMessage_other:"You marked {{count}} cells but have not saved. Leaving discards them.",discardConfirm:"Discard and leave"},info:{grade:"Grade: {{n}}",syllables:"Syllables: {{n}}",pos:"Part of speech: {{v}}",wordType:"Type: {{v}}"},pos:{noun:"Noun",verb:"Verb",adjective:"Adjective",adverb:"Adverb",numeral:"Numeral",determiner:"Determiner",interjection:"Interjection",particle:"Particle",affix:"Affix",dependentNoun:"Dependent noun",pronoun:"Pronoun",auxVerb:"Auxiliary verb",auxAdjective:"Auxiliary adjective"},reorder:{moved:"Moved to position {{n}} of {{total}}",handle:"Reorder {{word}} (Alt + arrow keys)",hint:"Alt + \u2190 \u2192 to reorder"}},Xu={editBanner:{message:"Saving will update the word table you're editing."},filterTitle:"Word Search Settings",filter:{positionAny:"Any",positionHead:"Start",positionMid:"Middle",positionTail:"End",difficulty:"Grade",grade:"Grade {{n}}",gradeNone:"None",syllables:"Syllables",syllable:"{{n}} Syll.",syllable5plus:"5+ Syllables",partOfSpeech:"Part of Speech",pos:{noun:"Noun/Numeral",verb:"Verb/Adjective",modifier:"Adverb/Determiner"},wordType:"Word Type",field:"Semantic Category",type:{native:"Native Korean",sino:"Sino-Korean",foreign:"Loanword",mixed:"Hybrid"},exclude:"Exclude",excludeNoImage:"No Image"},searchButton:"Search",resultUnit:"words",remaining:"{{count}} remaining",resultDisc:"Select {{unit}}. Up to {{max}} items. ({{selected}}/{{max}})",resultTitlePrefix:"",resultTitleSuffix:" {{unit}} found.",emptyResult:"No results found.",groupCount:"{{count}}",sort:{aria:"Sort",match:"Best Match",ganada:"A\u2013Z \u2191",ganadaDesc:"A\u2013Z \u2193",syllable:"Syllables \u2191",syllableDesc:"Syllables \u2193",grade:"Grade \u2191",gradeDesc:"Grade \u2193",original:"Original order"},pageSize:"Show {{count}}",pageSizeAria:"Page size",popup:{title:"Select a word for cell {{n}}"}},el={clearAllSelection:"Clear All Selections",divLine:"Contrast Line",removePair:"Remove pair",removeWord:"Remove word"},tl={title:"By Topic",subtitle:"Select a topic to start listening training",noiseTitle:"Sentence Listening in Noise",shortStoryTitle:"Short Story Listening",FOOD:"Food",HLTH:"Health",WETH:"Weather",PRSN:"People",KRCT:"Korean Culture",STRY:"Stories",LOCA:"Locations",SOAR:"Society & Arts",NTSC:"Nature & Science",SPRT:"Sports",sub:{TRKRFD:"Traditional Korean Food",MDKRFD:"Modern Korean Food",WRLDFD:"World Cuisine",MTRFRT:"Ingredients & Fruits",GEFDKL:"Food Facts",HTETHB:"Healthy Eating",DISILL:"Diseases",EXCISE:"Exercise",GEHTKL:"Health Facts",GESSKL:"Seasons",SNWRAN:"Snow & Rain",WTHFCT:"Weather Forecast",GEWTKL:"Weather Facts",JODYPS:"Joseon Dynasty",MDKRPS:"Modern Korea",THKDPS:"Three Kingdoms",WRLART:"World Artists",WRLPSN:"World Figures",KRLANG:"Korean Language",TRPLCT:"Traditional Games",HERITG:"Heritage",EVTFES:"Events & Festivals",GECTKL:"General Knowledge",FRYTAL:"Fairy Tales",AMZING:"Amazing Stories",DAYSTR:"Everyday Stories",KRLDMK:"Korean Landmarks",SELNMK:"Seoul Landmarks",WRDTRB:"World Travel",NAVIGT:"Navigation",KRSOCI:"Korea",ECONEW:"Economy & News",GENART:"Arts",GELFKL:"Life Tips",ANIMAL:"Animals",PLANTS:"Plants",ETHPLT:"Earth",TOLELC:"Tools & Electronics",GESCKL:"Science Facts",INVDSP:"Individual Sports",MARART:"Martial Arts",TEAMSP:"Team Sports",FOOTBL:"Soccer",GESPKL:"Sports Facts"}},nl={maxUses:"Max uses (leave blank for unlimited)",redirect:"Redirect URL (leave blank for app home)",creating:"Creating\u2026",create:"Create link",created:"\u2713 Link created",copied:"Copied!",copy:"Copy",loading:"Loading\u2026",empty:"No links created yet.",uses_one:"Used {{count}} time",uses_other:"Used {{count}} times",expiresAt:"Expires: {{date}}",createdAt:"Created: {{date}}",confirmDelete:"Delete this link?",deactivate:"Deactivate",delete:"Delete",status:{active:"Active",expired:"Expired",inactive:"Inactive"}},ol={passwordPlaceholder:"Enter password"},rl={direction:{left:"L",right:"R",label:"Side"},wornDate:"Date Worn",deviceType:"Device Type",brand:"Brand",fitType:"Fit Type",productName:"Product Name",validationError:{brandAndProduct:"Please enter brand and product name."},addNew:"Add New Device",selectFromList:"Select from List",removeDevice:"Remove",type:{hearingAid:"Hearing Aid",cochlearImplant:"Cochlear Implant",other:"Other"}},al={stat:{totalCustomers:"Total Customers",monthlyVisits:"This Month's Visits"},chart:{visitDetail:"Visit Details",trainingDetail:"Training Details",weekly:"Weekly",daily:"Daily",periodMonth:"Month",periodWeek:"Week",weeklyPrefix:"Weekly",monthlyPrefix:"Monthly",visit:"Visits",reservation:"Reservations",trainingDone:"Completed",trainingInProgress:"In Progress",weekRange:"{{start}}\u2013{{end}}",week:"W{{n}}"},subscriptionStatus:{active:"{{pct}}% Active",expired:"{{pct}}% Expired",unused:"{{pct}}% Unused"}},il={editBanner:{message:"Saving will update the contrast pair table you're editing."},phonemeSelect:{title:"Phoneme Selection",vs:"vs"},caution:"Caution",mode:{include:"Phoneme Include",pick:"Phoneme Contrast",contrast:"Specify Contrast",infoTitle:"Contrast Mode",infoInclude:"Include \u2014 finds words containing all selected phonemes, plus their minimal pair.",infoPick:"Contrast \u2014 matches only if the selected phoneme is the actual point of difference in the pair.",infoContrast:"Specify Contrast \u2014 directly choose phonemes for the base word and the contrasting word to find pairs."},count:"{{n}}",countLabel:"Number of phonemes",input:{char:"Choose Letters",pron:"Choose Sound",infoTitle:"Input mode",infoChar:"Choose Letters \u2014 finds words by the selected phonemes (spelling), then finds their standard-pronunciation contrast pairs.",infoPron:"Choose Sound \u2014 finds standard-pronunciation contrast pairs directly from the selected phonemes."},phonemeN:"Syllable {{n}}",phonemeSingleLabel:"Syllable",phonemeContrastSingleLabel:"Contrast Syllable",ordinals:["First","Second","Third","Fourth"],phonemeOrdinalLabel:"{{ordinal}} Syllable",phonemeContrastOrdinalLabel:"Contrast {{ordinal}} Syllable",composition:"Answer Word Composition",syllableCount:"Syllables",syllableN:"{{n}} syll.",syllableNPlus:"{{n}}+ syll.",onset:"Onset",vowel:"Vowel",coda:"Coda",filter:{searchOptionsTitle:"Contrast Settings",searchModeLabel:"Contrast Mode",countLabel:"Input Syllable Count",inputModeLabel:"Input mode",phonemeOrder:"Input Syllable Position",phonemeOrderInfo:["Match: the pair must differ at exactly the same position (syllable).","Any: the differing position doesn't matter."],orderAny:"Any",orderMatch:"Match",difficultyInfo:["Level 1 \u2014 everyday vocabulary acquired before school age and used for life","Level 2 \u2014 difficulty of grades 1\u20132","Level 3 \u2014 difficulty of grades 3\u20134","Level 4 \u2014 difficulty of grades 5\u20136","No level \u2014 frequent everyday words outside the national standard list, plus coinages and loanwords"],selectLabel:"Select",onlyHasImage:"Only words with images",onlySameStructure:"Only same phoneme structure"},searchLabel:{error:"Failed to load data",loading:"Loading\u2026"},confirmMessage:"The word table with {{count}} selected {{unit}} will be lost.",resetOptions:"Reset Options",phonemeContrast:"Contrast Syllable {{n}}",infoNotes:["The preview character is an example of the selected phoneme combination. The actual search covers all words containing the phoneme.","Initial consonant '\u3147' cannot be selected. \u3147 at the start of a word is effectively silent.","If only onset and coda are selected, the vowel is automatically displayed as '\u314F'.","Increasing the phoneme count searches for minimal pairs between each phoneme."]},ul={sentenceTyping:{roundCount:"{{rounds}} rounds \xB7 {{timeLimit}}s each"},wordDefense:{me:"Me"},dictation:{title:"Dictation",desc:"Practice writing down exactly what you hear.",comingSoon:"Coming soon: audio playback, input field, answer comparison"},result:{heading:"Level {{number}} Answer",retry:"Try Again"},common:{accuracy:"{{pct}}% accuracy"},soundMatch:{title:"Sound Match",desc:"Quickly match words or sentences that share the same sound.",comingSoon:"Coming soon: play button, timer, score tracking"},orderSequence:{title:"Sentence Ordering",desc:"Arrange scattered sentence fragments in the correct order.",comingSoon:"Coming soon: sentence sets, ordering interface"},speedListen:{title:"Speed Listen",desc:"A challenge game to count the number of words in a sentence within a time limit.",comingSoon:"Coming soon: time limit, scoreboard"},noiseChallenge:{title:"Noise Challenge",desc:"Practice distinguishing sentences amid background noise.",comingSoon:"Coming soon: various noise levels, score tracking"},fastListen:{title:"Fast Listen",desc:"Listen to short sentences at speed and select the key word.",comingSoon:"Coming soon: speed by difficulty, timer"},shadowing:{title:"Shadowing",desc:"Practice pronunciation and intonation by repeating sentences aloud.",comingSoon:"Coming soon: playback, recording, comparison feedback"},phonemeHunt:{title:"Phoneme Hunt",desc:"Find words that contain a specific phoneme (sound).",comingSoon:"Coming soon: phoneme filter, hint feature"}},ll={lead:`IHAB builds trust
23
23
  through sound
24
- and aids recovery.`,site:{title:"Site",malgwi:"Malgwi",soundDirection:"Sound Direction System",vrSoundDirection:"VR Sound Direction System",hearingTest:"Hearing Test Pro"},sns:{title:"SNS",naverBlog:"Naver Blog",kakao:"KAKAO Talk Open Chat"},policy:{title:"Policy",terms:"Terms of Service",privacy:"Privacy Policy"},ceo:"CEO",address:"Address",support:"Support",ceoName:"Ji-hye Han",addressValue:"302, 3F, Haechan Bldg, 32 Sicheong-gil, Chuncheon, Gangwon, Korea"},sl={trainingPhone:{topic:"Gardening",prev:"Prev",next:"Next",speed:"Speed 3",noiseType:"Crowd noise",settings:"Settings",start:{caption:"Press the play (\u25B6) button below and listen carefully. After listening, check the sentence."},feedback:{caption:"Plant the well-grown seedlings in the garden bed and cover them carefully with plastic film."},done:{heardWell:"Heard clearly",listenAgain:"Listen again"}}},cl={timeHM:"{{hh}}:{{mm}}",timeH:"{{hh}}:{{mm}}"},dl={options:"Training Options",difficulty:"Difficulty",exclude:"Exclude",chosung:"Initial Consonant",excludeOptions:{none:"None",noImage:"No Image"}},gl={answer:"Answer",distractor:"Distractor"},ml={phaseWordDownload:"Download Word Data",phaseImageCheck:"Check Images",phasePairAnalysis:"Analyze Word Pairs",downloadingCount_one:"Downloading {{n}} word",downloadingCount_other:"Downloading {{n}} words",checkingPage:"Checking page {{page}} list",imageCount:"{{done}} / {{total}} items"},Cl={clearAriaLabel:"Clear input"},hl={ariaLabel:"Select tab"},pl={ariaLabel:"Tabs"},fl={dragPrompt:"Drag and drop files here",browseButton:"Choose Files",removeAriaLabel:"Remove {{name}}"},Sl={ariaLabel:"User avatar"},yl={relativeDay:{today:"Today",yesterday:"Yesterday",daysAgo:"{{n}}d ago"},reason:{notLoggedIn:"Login required."},list:{title:"Received Homework"},status:{expired:"Expired",done:"Done {{count}}\xD7 \xB7 {{date}}",notDone:"Not done"}},bl={weekly:{title:"Weekly Training",daily:"Daily Listening",crossword:"Crossword"},homework:{title:"Homework Progress",totalRate:"Overall rate",count:"Total",done:"Done",remaining:"Remaining"},today:{tooltipTotal:"Total",tooltipDone:"Done"},filter:{countSuffix:" sessions"},time:{countLabel_one:"{{n}} session",countLabel_other:"{{n}} sessions",empty:"No training records"},daily:{title:"Today's Listening Record",empty:"No completed sessions"},crossword:{title:"Crossword Quiz",empty:"No completed levels"},visit:{title:"Linked Visit Records"},detail:"Details",detailFor:"{{name}} details",trainingType:{LISTEN_IN_NOISE:"Sentence in Noise",SHORT_STORY:"Short Story",LONG_STORY:"Long Story",ORDERING_SENTENCE:"Sentence Ordering"}},wl={import:"Add to my trainings",publisher:"Publisher",time:{justNow:"just now",minutesAgo:"{{n}}m ago",hoursAgo:"{{n}}h ago",daysAgo:"{{n}}d ago",weeksAgo:"{{n}}w ago",monthsAgo:"{{n}}mo ago",yearsAgo:"{{n}}y ago"},badge:{shared:"Store"},publish:{descPlaceholder:"One-line description for the Training Store (optional)"}},Tl={manage:{unit:"item(s)"}},El={cancelLabel:"Cancel"},Dl={subtitle:"Select a topic to start listening practice."},vl={steps:"Step {{current}} of {{total}}"},Al={panelTitle:"Training misses",viewItems:"Items",viewTypes:"Types",colPending:"Left",colTrend:"Change",colRuns:"Runs",unitItem:" items",skippedOnly_one:"{{n}} older record was excluded \u2014 it does not say what was answered.",skippedOnly_other:"{{n}} older records were excluded \u2014 they do not say what was answered.",summaryLabel:"Recorded",summaryValue:"{{items}} items \xB7 {{pending}} still missed",nextLabel:"Next to work on",nextCount:"{{count}}",nextCountCapped:"{{shown}} of {{total}}",picked:"\u2192 {{what}}",typeClear:"All caught up",typePending:"{{pending}} of {{total}} left",flat:"no change",runs_one:"{{count}} run",runs_other:"{{count}} runs",avgDuration:"{{sec}}s avg"},Ll={resetColumns:"Reset column widths",scrollRegion:"Horizontally scrollable table",rowActionHint:"Press a row to open its details"},Nl={panelTitle:"Word table scores",viewWords:"Words",viewTables:"Tables",colLatest:"When",colTrend:"Change",unitTime:" times",summaryLabel:"Scored",summaryValue:"{{times}} times \xB7 {{words}} words",nextLabel:"Focus next",nextCount:"{{count}}",allClear:"All correct last time.",times:"{{count}}x",flat:"no change",recentLabel:"Recent scorings",nextCountCapped:"{{shown}} of {{total}}"},_l={ariaLabel:"Banner",dotAriaLabel:"Banner {{index}} of {{count}}"},Rl={selectYearMonth:"Select year and month",chooseDate:"Choose a date"},kl={previewRegion:"Report preview \u2014 scrollable sideways"},Pl={description:"Description",textbox:"Text",training:"Training guide",menu:"Menu"},Bl={devNone:"No acquisition data",place:{labial:"Bilabial",alveolar:"Alveolar",palatal:"Palatal",velar:"Velar",glottal:"Glottal"}},Ol={clearSelection:"Clear selection"},Ml={showResult:"Show {{type}} result"},Il={selected:"Selected",remove:"Remove",exclude:"Excluded",nthSelected:"Selection {{n}}"},jl={loading:"Loading"},$l={state:{active:"playing",played:"heard",correct:"correct",wrong:"wrong"}},Fl={ariaLabel:"Breadcrumb"},xl={empty:"No items yet."},Wl={main:"Main gradient",soft:"Soft",sub:"Sub color",deep:"Deep gradient",softSub:"Soft sub",warm:"Warm (accent)",dark:"Dark",radial:"Radial gradient",diagonal:"Diagonal pattern",dots:"Dot pattern",outline:"Outline",success:"Success / done",naver:"Naver blog notice",instagram:"Instagram notice"},Gl={common:Lu,calendar:Nu,passCard:_u,searchField:Ru,rating:ku,colorPicker:Pu,dropdown:Bu,accordion:Ou,header:Mu,nav:Iu,settings:ju,usage:$u,account:Fu,help:xu,training:Wu,trainingSettings:Gu,customers:Hu,payment:Ku,coupons:Yu,visits:Vu,company:Uu,trainingType:zu,myWordTraining:qu,myWordTable:Ju,keyWords:Qu,wordTable:Zu,wordSearch:Xu,wordPrint:el,topic:tl,accessLinkManager:nl,login:ol,device:rl,manager:al,wordPairs:il,game:ul,footer:ll,landing:sl,date:cl,trainingSetPage:dl,wordTrainingPreview:gl,wordData:ml,textField:Cl,segmentedControl:hl,tabs:pl,fileUpload:fl,avatar:Sl,myHomework:yl,trainingStatus:bl,store:wl,homework:Tl,inquiry:El,trainingPlanRun:Dl,progress:vl,trainingMiss:Al,table:Ll,wordScore:Nl,topBanner:_l,datePicker:Rl,report:kl,tooltip:Pl,phonemeProfile:Bl,bulkBar:Ol,debug:Ml,badge:Il,loader:jl,soundCompass:$l,breadcrumb:Fl,board:xl,promoBannerBg:Wl};const Hl="0.334.0",Kl=[{code:"ko",label:"\uD55C\uAD6D\uC5B4"},{code:"en",label:"English"}],Lt="ko",Yl="ihab_display_language";function Wn(){if(typeof window>"u")return Lt;try{const e=localStorage.getItem(Yl);if(e&&Kl.some(t=>t.code===e))return e}catch{}return Lt}function Gn(e){try{document.documentElement.lang=e}catch{}}q.on("languageChanged",Gn),Gn(Wn()),q.use(zn.initReactI18next).init({resources:{ko:{translation:Au},en:{translation:Gl}},lng:Wn(),fallbackLng:Lt,interpolation:{escapeValue:!1},react:{useSuspense:!1}});const Vl=new Map;try{q.store?.on?.("added",()=>Vl.clear())}catch{}let Ve=null,Hn=null,Kn=null;function Ul(){const e=Tn();if(e&&e.entries.length>0){const t=tn();if(Ve&&Hn===e&&Kn===t)return Ve;const n=new Set,o=[];for(const a of e.entries)!a.word||n.has(a.word)||(n.add(a.word),o.push({w:a.word,s:a.syllables,p:t?.[a.word]?[...t[a.word].cho??[],...t[a.word].jung??[],...t[a.word].jong??[]]:[],pron:a.pronunciation||a.word,grade:a.grade}));return Ve=o,Hn=e,Kn=t,Ve}return[]}new Proxy([],{get(e,t){const n=Ul(),o=n[t];return typeof o=="function"?o.bind(n):o}});const zl={free:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},personal_standard:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},mgr_free:{maxCustomers:5,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},none:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},lite_word:{maxCustomers:10,visitWord:!0,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!1},lite_sentence:{maxCustomers:10,visitWord:!1,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!0},lite:{maxCustomers:10,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},standard:{maxCustomers:30,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},pro:{maxCustomers:50,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0},enterprise:{maxCustomers:1/0,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!0,managerManagement:!0,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!0,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!0,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!0,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0}},ql={none:0,free:1,personal_standard:2,mgr_free:10,lite_word:11,lite_sentence:11,lite:12,standard:13,pro:14,enterprise:15},Jl=new Set(["mgr_free","lite_word","lite_sentence","lite","standard","pro","enterprise"]);function Ql(e){return Jl.has(e)}const Zl={free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1},personal_standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null},mgr_free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1,trainingItemMax:5,customerMax:5,homeworkSendDaily:1},lite:{sentenceTrainingDaily:5,wordTrainingDaily:5,gameDaily:5,trainingItemMax:10,customerMax:10,homeworkSendDaily:10},standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:30,customerMax:30,homeworkSendDaily:30},pro:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:50,homeworkSendDaily:50},enterprise:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:null,homeworkSendDaily:null}};function Xl(e){const t=(e??"").toLowerCase();return t==="speechear_free"||t==="free"?"free":t.startsWith("manager_free")||t.startsWith("mgr_free")?"mgr_free":t.startsWith("manager_enterprise")?"enterprise":t.startsWith("manager_pro")?"pro":t.startsWith("manager_standard")?"standard":t.startsWith("manager_lite_word")?"lite_word":t.startsWith("manager_lite_sentence")?"lite_sentence":t.startsWith("manager_lite")||t.startsWith("mgr_lite")?"lite":t.startsWith("mgr_standard")?"standard":t.startsWith("mgr_pro")?"pro":t.startsWith("content_")||t.startsWith("speechear_")||t.startsWith("light_")||t==="light"?"personal_standard":"none"}const es=5,ts=5;function ns({rank:e,voteCount:t,quota:n=5}){return e<n&&t>0}const os={selected:"ALREADY_SELECTED",added:"ALREADY_ADDED",rejected:"ALREADY_REJECTED"},Yn="chunk-reload-ts";function Vn(){try{return Number(sessionStorage.getItem(Yn)||0)}catch{return 0}}function Nt(e=Date.now()){if(e-Vn()<=1e4)return!1;try{sessionStorage.setItem(Yn,String(e))}catch{}return window.location.reload(),!0}function Un(e=Date.now()){const t=Vn();return t>0&&e-t<=1e4}function rs(){if(typeof window>"u")return()=>{};const e=n=>{Nt()&&n.preventDefault()},t=n=>{const o=n.target;o instanceof HTMLLinkElement&&o.rel==="stylesheet"&&Nt()};return window.addEventListener("vite:preloadError",e),window.addEventListener("error",t,!0),()=>{window.removeEventListener("vite:preloadError",e),window.removeEventListener("error",t,!0)}}function as(e,t){return e?!!t&&t.access_token===e.access_token:!0}function is(e,t){return qn.lazy(async()=>{const n=await t();if(n&&typeof n=="object"&&"default"in n)return n;if(Un())return new Promise(()=>{});throw new Error(`[lazyPage] ${e}: \uD654\uBA74 \uBAA8\uB4C8\uC744 \uBC1B\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(default \uB0B4\uBCF4\uB0B4\uAE30 \uC5C6\uC74C). \uBC30\uD3EC \uC9C1\uD6C4\uB77C\uBA74 \uC0C8\uB85C\uACE0\uCE68\uC73C\uB85C \uD480\uB9BD\uB2C8\uB2E4.`)})}function us(...e){let t=!1;const n=()=>{if(!t)for(const u of e)u().catch(()=>{})},o=globalThis.requestIdleCallback;if(o){const u=o(n,{timeout:2e3});return()=>{t=!0;const r=globalThis.cancelIdleCallback;r?.(u)}}const a=setTimeout(n,300);return()=>{t=!0,clearTimeout(a)}}const ls=e=>({word:e.Word,pronunciation:e.SP,colloquialPronunciation:e.CP??void 0,grade:String(e.Grade),pos:e.POS,wordType:e.Class,homonum:e.Homonum!=null?Number(e.Homonum):void 0});exports.CAPABILITY=pn,exports.CHOSEONG=E,exports.CORE_VERSION=Hl,exports.JONGSEONG=N,exports.JUNGSEONG=D,exports.LONG_STORIES=Ee,exports.NETWORK_ERROR_MESSAGE=Tt,exports.NOISE_DATAS=we,exports.ORDER_SETS=De,exports.PERSONAL_PHONE_REGEX=Rn,exports.PHONE_REGEX=_n,exports.PLAN_FEATURES=zl,exports.PLAN_LIMITS=Zl,exports.SHORT_STORIES=Te,exports.TIER_RANK=ql,exports.TOPIC_TYPES=si,exports.TRAINING_TYPES=li,exports.TRAINING_TYPE_I18N_KEY=ci,exports.WORD_SUGGESTION_ACCOUNT_LIMIT=ts,exports.WORD_SUGGESTION_EXISTING_ERROR=os,exports.WORD_SUGGESTION_WEEKLY_QUOTA=es,exports.applyFontScale=jn,exports.applyTheme=On,exports.balancedColumns=or,exports.buildChangeWholeSyllableProblem=Ur,exports.buildDropCompoundProblem=Hr,exports.buildDropContrast3Problem=Gr,exports.buildDropContrastProblem=Wr,exports.buildDropFinalConsonantProblem=Kr,exports.buildMultiPartPosContrast=tr,exports.buildPairIndex=Zo,exports.buildRemoveConsonantProblem=Yr,exports.buildSyllableMaskIndex=Vr,exports.bulkSetImageExistence=_o,exports.cardQuestionTitle=Ir,exports.checkImageExists=Gt,exports.classifyPairDifficulty=Oo,exports.clearAudioExistsCache=ho,exports.clearImageExistenceCache=Ro,exports.clearPairIndexCache=Xo,exports.columnsFitting=nr,exports.composeSyllable=W,exports.computeDailySelection=Fn,exports.configureImageResolver=Do,exports.configureNoiseSettingsStore=ya,exports.configurePronunciationResolver=po,exports.configureStorage=ro,exports.configureTTS=co,exports.configureTrainingCategories=qa,exports.copyText=Aa,exports.createDecompCache=Bo,exports.createTTSUrlResolver=va,exports.dateToDb=Ka,exports.downloadCsvText=na,exports.downloadSound=io,exports.ensureTrainingDataLoaded=ui,exports.escapeCsvField=ea,exports.fileExists=Pt,exports.filterContrastCandidates=nn,exports.finalToPhoneme=ke,exports.firstChoseongOf=Kt,exports.formatCount=Va,exports.formatDateKo=Na,exports.formatDateLocale=Ra,exports.formatDateLongKo=_a,exports.formatDateLongLocale=ka,exports.formatDatetimeKo=Pa,exports.formatPhone=Fa,exports.formatRelativeTime=ja,exports.formatTimeHM=Ya,exports.formatYmd=$a,exports.getAssetBaseUrl=Rt,exports.getDailySelection=oi,exports.getElementAnalyser=bo,exports.getElementVolume=To,exports.getErrorMessage=qr,exports.getImageExistenceStats=No,exports.getImageExistsCached=Ao,exports.getImageResolver=xt,exports.getNoiseBaseUrl=uo,exports.getNoiseFileGain=lo,exports.getPairIndex=tn,exports.getPlanTier=Xl,exports.getPronunciationResolver=fo,exports.getSavedFontScale=In,exports.getSavedTheme=Bn,exports.getSignedOrPublicUrl=Bt,exports.getTTSFallbackUrlResolver=mo,exports.getTTSUrlResolver=go,exports.getTodayKst=Dt,exports.getTodayKstDate=Oa,exports.getTopicTypes=Ja,exports.getTrainingPools=ri,exports.getTrainingTypes=Qa,exports.getWordPool=Tn,exports.hasQuestionWordConstraint=Ar,exports.hasSel=O,exports.hasStructureContrast=ut,exports.initFontScale=ti,exports.initTheme=Za,exports.installSkewRecovery=rs,exports.isAllChoseong=Vt,exports.isManagerTier=Ql,exports.isManualOnlyType=Nr,exports.isNetworkErrorMessage=bn,exports.isPersonalPhone=Ga,exports.isSessionForThisTab=as,exports.isSyllablePattern=Qt,exports.isThisWeekPick=ns,exports.isTrainingDataLoaded=ii,exports.isValidPhone=Wa,exports.isValidQuestionWord=Lr,exports.itemCorrectness=En,exports.jamoToNamesForSpeech=jr,exports.kstStartOfDay=Ia,exports.lazyPage=is,exports.loadGameLeaderboard=Sa,exports.loadMyGameRanks=fa,exports.loadNoiseSettings=ba,exports.loadTrainingData=xn,exports.logCrossword=ca,exports.logTrainingCompletion=la,exports.logTrainingTime=ia,exports.matchSyllables=oe,exports.matchesChoseongSearch=Mo,exports.matchesSyllablePattern=Xt,exports.matchesWordQuery=Io,exports.mergeQuestionText=yn,exports.minimalPairDistractors=er,exports.normalizeDate=Ha,exports.officialSoundPath=Da,exports.parseLocalYmd=Ln,exports.parseSortValue=Xr,exports.parseSyllable=f,exports.patternToComposition=Yo,exports.phonemePartsOf=Rr,exports.pickEuRo=hn,exports.pickEulReul=gn,exports.pickEunNeun=mn,exports.pickIga=dn,exports.pickWaGwa=Cn,exports.prefetchChunk=us,exports.prewarmImageCache=Lo,exports.primarySelPart=xe,exports.readLevel=Eo,exports.recoverFromSkew=Nt,exports.reorderArray=Er,exports.reportAppliedNoiseSettings=Ta,exports.resolveAssetUrl=no,exports.resolveSoundPath=ao,exports.resumeAudioMeter=yo,exports.routeElementAudio=$t,exports.sample=K,exports.saveNoiseSettings=wa,exports.searchAndRankWords=zo,exports.setAssetBaseUrl=to,exports.setCrosswordLogger=sa,exports.setElementVolume=wo,exports.setGameLeaderboardLoader=ha,exports.setGameRanksLoader=Ca,exports.setGameScoreSubmitter=ma,exports.setTrainingCompletionLogger=ua,exports.setTrainingTimeLogger=aa,exports.setWordPool=ra,exports.shuffle=P,exports.skewReloadPending=Un,exports.sortToValue=Zr,exports.soundOf=bt,exports.speak=Qn,exports.stopSpeaking=Zn,exports.submitGameScore=pa,exports.syllMatchesComp=Q,exports.syllableContrasts=re,exports.syllableLength=xo,exports.syllablePron=Fe,exports.toBase64UrlSafe=Ea,exports.toChoseong=Yt,exports.toItemResults=da,exports.toKstHm=Ba,exports.toKstYmd=be,exports.toStandardPronunciation=pr,exports.toStorageName=He,exports.toUserErrorMessage=Qr,exports.toWordEntry=ls,exports.validateSyllableSearchInput=Uo,exports.withEuRo=Tr,exports.withEulReul=yr,exports.withEunNeun=br,exports.withIga=Sr,exports.withWaGwa=wr,exports.wordContainsChoseong=jo,exports.wordContainsJongseong=Fo,exports.wordContainsJungseong=$o,exports.wordHasConsonantAt=Ho,exports.wordHasNoCoda=Wo,exports.wordHasSyllableMatching=Go,exports.wrongItems=ga;
24
+ and aids recovery.`,site:{title:"Site",malgwi:"Malgwi",soundDirection:"Sound Direction System",vrSoundDirection:"VR Sound Direction System",hearingTest:"Hearing Test Pro"},sns:{title:"SNS",naverBlog:"Naver Blog",kakao:"KAKAO Talk Open Chat"},policy:{title:"Policy",terms:"Terms of Service",privacy:"Privacy Policy"},ceo:"CEO",address:"Address",support:"Support",ceoName:"Ji-hye Han",addressValue:"302, 3F, Haechan Bldg, 32 Sicheong-gil, Chuncheon, Gangwon, Korea"},sl={trainingPhone:{topic:"Gardening",prev:"Prev",next:"Next",speed:"Speed 3",noiseType:"Crowd noise",settings:"Settings",start:{caption:"Press the play (\u25B6) button below and listen carefully. After listening, check the sentence."},feedback:{caption:"Plant the well-grown seedlings in the garden bed and cover them carefully with plastic film."},done:{heardWell:"Heard clearly",listenAgain:"Listen again"}}},cl={timeHM:"{{hh}}:{{mm}}",timeH:"{{hh}}:{{mm}}"},dl={options:"Training Options",difficulty:"Difficulty",exclude:"Exclude",chosung:"Initial Consonant",excludeOptions:{none:"None",noImage:"No Image"}},gl={answer:"Answer",distractor:"Distractor"},ml={phaseWordDownload:"Download Word Data",phaseImageCheck:"Check Images",phasePairAnalysis:"Analyze Word Pairs",downloadingCount_one:"Downloading {{n}} word",downloadingCount_other:"Downloading {{n}} words",checkingPage:"Checking page {{page}} list",imageCount:"{{done}} / {{total}} items"},Cl={clearAriaLabel:"Clear input"},hl={ariaLabel:"Select tab"},pl={ariaLabel:"Tabs"},fl={dragPrompt:"Drag and drop files here",browseButton:"Choose Files",removeAriaLabel:"Remove {{name}}"},Sl={ariaLabel:"User avatar"},yl={relativeDay:{today:"Today",yesterday:"Yesterday",daysAgo:"{{n}}d ago"},reason:{notLoggedIn:"Login required."},list:{title:"Received Homework"},status:{expired:"Expired",done:"Done {{count}}\xD7 \xB7 {{date}}",notDone:"Not done"}},bl={weekly:{title:"Weekly Training",daily:"Daily Listening",crossword:"Crossword"},homework:{title:"Homework Progress",totalRate:"Overall rate",count:"Total",done:"Done",remaining:"Remaining"},today:{tooltipTotal:"Total",tooltipDone:"Done"},filter:{countSuffix:" sessions"},time:{countLabel_one:"{{n}} session",countLabel_other:"{{n}} sessions",empty:"No training records"},daily:{title:"Today's Listening Record",empty:"No completed sessions"},crossword:{title:"Crossword Quiz",empty:"No completed levels"},visit:{title:"Linked Visit Records"},detail:"Details",detailFor:"{{name}} details",trainingType:{LISTEN_IN_NOISE:"Sentence in Noise",SHORT_STORY:"Short Story",LONG_STORY:"Long Story",ORDERING_SENTENCE:"Sentence Ordering"}},wl={import:"Add to my trainings",publisher:"Publisher",time:{justNow:"just now",minutesAgo:"{{n}}m ago",hoursAgo:"{{n}}h ago",daysAgo:"{{n}}d ago",weeksAgo:"{{n}}w ago",monthsAgo:"{{n}}mo ago",yearsAgo:"{{n}}y ago"},badge:{shared:"Store"},publish:{descPlaceholder:"One-line description for the Training Store (optional)"}},Tl={manage:{unit:"item(s)"}},El={cancelLabel:"Cancel"},Dl={subtitle:"Select a topic to start listening practice."},vl={steps:"Step {{current}} of {{total}}"},Al={panelTitle:"Training misses",viewItems:"Items",viewTypes:"Types",colPending:"Left",colTrend:"Change",colRuns:"Runs",unitItem:" items",skippedOnly_one:"{{n}} older record was excluded \u2014 it does not say what was answered.",skippedOnly_other:"{{n}} older records were excluded \u2014 they do not say what was answered.",summaryLabel:"Recorded",summaryValue:"{{items}} items \xB7 {{pending}} still missed",nextLabel:"Next to work on",nextCount:"{{count}}",nextCountCapped:"{{shown}} of {{total}}",picked:"\u2192 {{what}}",typeClear:"All caught up",typePending:"{{pending}} of {{total}} left",flat:"no change",runs_one:"{{count}} run",runs_other:"{{count}} runs",avgDuration:"{{sec}}s avg"},Ll={resetColumns:"Reset column widths",scrollRegion:"Horizontally scrollable table",rowActionHint:"Press a row to open its details"},Nl={panelTitle:"Word table scores",viewWords:"Words",viewTables:"Tables",colLatest:"When",colTrend:"Change",unitTime:" times",summaryLabel:"Scored",summaryValue:"{{times}} times \xB7 {{words}} words",nextLabel:"Focus next",nextCount:"{{count}}",allClear:"All correct last time.",times:"{{count}}x",flat:"no change",recentLabel:"Recent scorings",nextCountCapped:"{{shown}} of {{total}}"},_l={ariaLabel:"Banner",dotAriaLabel:"Banner {{index}} of {{count}}"},Rl={selectYearMonth:"Select year and month",chooseDate:"Choose a date"},kl={previewRegion:"Report preview \u2014 scrollable sideways"},Pl={description:"Description",textbox:"Text",training:"Training guide",menu:"Menu"},Bl={devNone:"No acquisition data",place:{labial:"Bilabial",alveolar:"Alveolar",palatal:"Palatal",velar:"Velar",glottal:"Glottal"}},Ol={clearSelection:"Clear selection"},Ml={showResult:"Show {{type}} result"},Il={selected:"Selected",remove:"Remove",exclude:"Excluded",nthSelected:"Selection {{n}}"},jl={loading:"Loading"},$l={state:{active:"playing",played:"heard",correct:"correct",wrong:"wrong"}},Fl={ariaLabel:"Breadcrumb"},xl={empty:"No items yet."},Wl={main:"Main gradient",soft:"Soft",sub:"Sub color",deep:"Deep gradient",softSub:"Soft sub",warm:"Warm (accent)",dark:"Dark",radial:"Radial gradient",diagonal:"Diagonal pattern",dots:"Dot pattern",outline:"Outline",success:"Success / done",naver:"Naver blog notice",instagram:"Instagram notice"},Gl={common:Lu,calendar:Nu,passCard:_u,searchField:Ru,rating:ku,colorPicker:Pu,dropdown:Bu,accordion:Ou,header:Mu,nav:Iu,settings:ju,usage:$u,account:Fu,help:xu,training:Wu,trainingSettings:Gu,customers:Hu,payment:Ku,coupons:Yu,visits:Vu,company:Uu,trainingType:zu,myWordTraining:qu,myWordTable:Ju,keyWords:Qu,wordTable:Zu,wordSearch:Xu,wordPrint:el,topic:tl,accessLinkManager:nl,login:ol,device:rl,manager:al,wordPairs:il,game:ul,footer:ll,landing:sl,date:cl,trainingSetPage:dl,wordTrainingPreview:gl,wordData:ml,textField:Cl,segmentedControl:hl,tabs:pl,fileUpload:fl,avatar:Sl,myHomework:yl,trainingStatus:bl,store:wl,homework:Tl,inquiry:El,trainingPlanRun:Dl,progress:vl,trainingMiss:Al,table:Ll,wordScore:Nl,topBanner:_l,datePicker:Rl,report:kl,tooltip:Pl,phonemeProfile:Bl,bulkBar:Ol,debug:Ml,badge:Il,loader:jl,soundCompass:$l,breadcrumb:Fl,board:xl,promoBannerBg:Wl};const Hl="0.336.0",Kl=[{code:"ko",label:"\uD55C\uAD6D\uC5B4"},{code:"en",label:"English"}],Lt="ko",Yl="ihab_display_language";function Wn(){if(typeof window>"u")return Lt;try{const e=localStorage.getItem(Yl);if(e&&Kl.some(t=>t.code===e))return e}catch{}return Lt}function Gn(e){try{document.documentElement.lang=e}catch{}}q.on("languageChanged",Gn),Gn(Wn()),q.use(zn.initReactI18next).init({resources:{ko:{translation:Au},en:{translation:Gl}},lng:Wn(),fallbackLng:Lt,interpolation:{escapeValue:!1},react:{useSuspense:!1}});const Vl=new Map;try{q.store?.on?.("added",()=>Vl.clear())}catch{}let Ve=null,Hn=null,Kn=null;function Ul(){const e=Tn();if(e&&e.entries.length>0){const t=tn();if(Ve&&Hn===e&&Kn===t)return Ve;const n=new Set,o=[];for(const a of e.entries)!a.word||n.has(a.word)||(n.add(a.word),o.push({w:a.word,s:a.syllables,p:t?.[a.word]?[...t[a.word].cho??[],...t[a.word].jung??[],...t[a.word].jong??[]]:[],pron:a.pronunciation||a.word,grade:a.grade}));return Ve=o,Hn=e,Kn=t,Ve}return[]}new Proxy([],{get(e,t){const n=Ul(),o=n[t];return typeof o=="function"?o.bind(n):o}});const zl={free:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},personal_standard:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},mgr_free:{maxCustomers:5,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},none:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},lite_word:{maxCustomers:10,visitWord:!0,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!1},lite_sentence:{maxCustomers:10,visitWord:!1,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!0},lite:{maxCustomers:10,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},standard:{maxCustomers:30,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},pro:{maxCustomers:50,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0},enterprise:{maxCustomers:1/0,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!0,managerManagement:!0,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!0,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!0,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!0,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0}},ql={none:0,free:1,personal_standard:2,mgr_free:10,lite_word:11,lite_sentence:11,lite:12,standard:13,pro:14,enterprise:15},Jl=new Set(["mgr_free","lite_word","lite_sentence","lite","standard","pro","enterprise"]);function Ql(e){return Jl.has(e)}const Zl={free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1},personal_standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null},mgr_free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1,trainingItemMax:5,customerMax:5,homeworkSendDaily:1},lite:{sentenceTrainingDaily:5,wordTrainingDaily:5,gameDaily:5,trainingItemMax:10,customerMax:10,homeworkSendDaily:10},standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:30,customerMax:30,homeworkSendDaily:30},pro:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:50,homeworkSendDaily:50},enterprise:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:null,homeworkSendDaily:null}};function Xl(e){const t=(e??"").toLowerCase();return t==="speechear_free"||t==="free"?"free":t.startsWith("manager_free")||t.startsWith("mgr_free")?"mgr_free":t.startsWith("manager_enterprise")?"enterprise":t.startsWith("manager_pro")?"pro":t.startsWith("manager_standard")?"standard":t.startsWith("manager_lite_word")?"lite_word":t.startsWith("manager_lite_sentence")?"lite_sentence":t.startsWith("manager_lite")||t.startsWith("mgr_lite")?"lite":t.startsWith("mgr_standard")?"standard":t.startsWith("mgr_pro")?"pro":t.startsWith("content_")||t.startsWith("speechear_")||t.startsWith("light_")||t==="light"?"personal_standard":"none"}const es=5,ts=5;function ns({rank:e,voteCount:t,quota:n=5}){return e<n&&t>0}const os={selected:"ALREADY_SELECTED",added:"ALREADY_ADDED",rejected:"ALREADY_REJECTED"},Yn="chunk-reload-ts";function Vn(){try{return Number(sessionStorage.getItem(Yn)||0)}catch{return 0}}function Nt(e=Date.now()){if(e-Vn()<=1e4)return!1;try{sessionStorage.setItem(Yn,String(e))}catch{}return window.location.reload(),!0}function Un(e=Date.now()){const t=Vn();return t>0&&e-t<=1e4}function rs(){if(typeof window>"u")return()=>{};const e=n=>{Nt()&&n.preventDefault()},t=n=>{const o=n.target;o instanceof HTMLLinkElement&&o.rel==="stylesheet"&&Nt()};return window.addEventListener("vite:preloadError",e),window.addEventListener("error",t,!0),()=>{window.removeEventListener("vite:preloadError",e),window.removeEventListener("error",t,!0)}}function as(e,t){return e?!!t&&t.access_token===e.access_token:!0}function is(e,t){return qn.lazy(async()=>{const n=await t();if(n&&typeof n=="object"&&"default"in n)return n;if(Un())return new Promise(()=>{});throw new Error(`[lazyPage] ${e}: \uD654\uBA74 \uBAA8\uB4C8\uC744 \uBC1B\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(default \uB0B4\uBCF4\uB0B4\uAE30 \uC5C6\uC74C). \uBC30\uD3EC \uC9C1\uD6C4\uB77C\uBA74 \uC0C8\uB85C\uACE0\uCE68\uC73C\uB85C \uD480\uB9BD\uB2C8\uB2E4.`)})}function us(...e){let t=!1;const n=()=>{if(!t)for(const u of e)u().catch(()=>{})},o=globalThis.requestIdleCallback;if(o){const u=o(n,{timeout:2e3});return()=>{t=!0;const r=globalThis.cancelIdleCallback;r?.(u)}}const a=setTimeout(n,300);return()=>{t=!0,clearTimeout(a)}}const ls=e=>({word:e.Word,pronunciation:e.SP,colloquialPronunciation:e.CP??void 0,grade:String(e.Grade),pos:e.POS,wordType:e.Class,homonum:e.Homonum!=null?Number(e.Homonum):void 0});exports.CAPABILITY=pn,exports.CHOSEONG=E,exports.CORE_VERSION=Hl,exports.JONGSEONG=N,exports.JUNGSEONG=D,exports.LONG_STORIES=Ee,exports.NETWORK_ERROR_MESSAGE=Tt,exports.NOISE_DATAS=we,exports.ORDER_SETS=De,exports.PERSONAL_PHONE_REGEX=Rn,exports.PHONE_REGEX=_n,exports.PLAN_FEATURES=zl,exports.PLAN_LIMITS=Zl,exports.SHORT_STORIES=Te,exports.TIER_RANK=ql,exports.TOPIC_TYPES=si,exports.TRAINING_TYPES=li,exports.TRAINING_TYPE_I18N_KEY=ci,exports.WORD_SUGGESTION_ACCOUNT_LIMIT=ts,exports.WORD_SUGGESTION_EXISTING_ERROR=os,exports.WORD_SUGGESTION_WEEKLY_QUOTA=es,exports.applyFontScale=jn,exports.applyTheme=On,exports.balancedColumns=or,exports.buildChangeWholeSyllableProblem=Ur,exports.buildDropCompoundProblem=Hr,exports.buildDropContrast3Problem=Gr,exports.buildDropContrastProblem=Wr,exports.buildDropFinalConsonantProblem=Kr,exports.buildMultiPartPosContrast=tr,exports.buildPairIndex=Zo,exports.buildRemoveConsonantProblem=Yr,exports.buildSyllableMaskIndex=Vr,exports.bulkSetImageExistence=_o,exports.cardQuestionTitle=Ir,exports.checkImageExists=Gt,exports.classifyPairDifficulty=Oo,exports.clearAudioExistsCache=ho,exports.clearImageExistenceCache=Ro,exports.clearPairIndexCache=Xo,exports.columnsFitting=nr,exports.composeSyllable=W,exports.computeDailySelection=Fn,exports.configureImageResolver=Do,exports.configureNoiseSettingsStore=ya,exports.configurePronunciationResolver=po,exports.configureStorage=ro,exports.configureTTS=co,exports.configureTrainingCategories=qa,exports.copyText=Aa,exports.createDecompCache=Bo,exports.createTTSUrlResolver=va,exports.dateToDb=Ka,exports.downloadCsvText=na,exports.downloadSound=io,exports.ensureTrainingDataLoaded=ui,exports.escapeCsvField=ea,exports.fileExists=Pt,exports.filterContrastCandidates=nn,exports.finalToPhoneme=ke,exports.firstChoseongOf=Kt,exports.formatCount=Va,exports.formatDateKo=Na,exports.formatDateLocale=Ra,exports.formatDateLongKo=_a,exports.formatDateLongLocale=ka,exports.formatDatetimeKo=Pa,exports.formatPhone=Fa,exports.formatRelativeTime=ja,exports.formatTimeHM=Ya,exports.formatYmd=$a,exports.getAssetBaseUrl=Rt,exports.getDailySelection=oi,exports.getElementAnalyser=bo,exports.getElementVolume=To,exports.getErrorMessage=qr,exports.getImageExistenceStats=No,exports.getImageExistsCached=Ao,exports.getImageResolver=xt,exports.getNoiseBaseUrl=uo,exports.getNoiseFileGain=lo,exports.getPairIndex=tn,exports.getPlanTier=Xl,exports.getPronunciationResolver=fo,exports.getSavedFontScale=In,exports.getSavedTheme=Bn,exports.getSignedOrPublicUrl=Bt,exports.getTTSFallbackUrlResolver=mo,exports.getTTSUrlResolver=go,exports.getTodayKst=Dt,exports.getTodayKstDate=Oa,exports.getTopicTypes=Ja,exports.getTrainingPools=ri,exports.getTrainingTypes=Qa,exports.getWordPool=Tn,exports.hasQuestionWordConstraint=Ar,exports.hasSel=O,exports.hasStructureContrast=ut,exports.initFontScale=ti,exports.initTheme=Za,exports.installSkewRecovery=rs,exports.isAllChoseong=Vt,exports.isManagerTier=Ql,exports.isManualOnlyType=Nr,exports.isNetworkErrorMessage=bn,exports.isPersonalPhone=Ga,exports.isSessionForThisTab=as,exports.isSyllablePattern=Qt,exports.isThisWeekPick=ns,exports.isTrainingDataLoaded=ii,exports.isValidPhone=Wa,exports.isValidQuestionWord=Lr,exports.itemCorrectness=En,exports.jamoToNamesForSpeech=jr,exports.kstStartOfDay=Ia,exports.lazyPage=is,exports.loadGameLeaderboard=Sa,exports.loadMyGameRanks=fa,exports.loadNoiseSettings=ba,exports.loadTrainingData=xn,exports.logCrossword=ca,exports.logTrainingCompletion=la,exports.logTrainingTime=ia,exports.matchSyllables=oe,exports.matchesChoseongSearch=Mo,exports.matchesSyllablePattern=Xt,exports.matchesWordQuery=Io,exports.mergeQuestionText=yn,exports.minimalPairDistractors=er,exports.normalizeDate=Ha,exports.officialSoundPath=Da,exports.parseLocalYmd=Ln,exports.parseSortValue=Xr,exports.parseSyllable=f,exports.patternToComposition=Yo,exports.phonemePartsOf=Rr,exports.pickEuRo=hn,exports.pickEulReul=gn,exports.pickEunNeun=mn,exports.pickIga=dn,exports.pickWaGwa=Cn,exports.prefetchChunk=us,exports.prewarmImageCache=Lo,exports.primarySelPart=xe,exports.readLevel=Eo,exports.recoverFromSkew=Nt,exports.reorderArray=Er,exports.reportAppliedNoiseSettings=Ta,exports.resolveAssetUrl=no,exports.resolveSoundPath=ao,exports.resumeAudioMeter=yo,exports.routeElementAudio=$t,exports.sample=K,exports.saveNoiseSettings=wa,exports.searchAndRankWords=zo,exports.setAssetBaseUrl=to,exports.setCrosswordLogger=sa,exports.setElementVolume=wo,exports.setGameLeaderboardLoader=ha,exports.setGameRanksLoader=Ca,exports.setGameScoreSubmitter=ma,exports.setTrainingCompletionLogger=ua,exports.setTrainingTimeLogger=aa,exports.setWordPool=ra,exports.shuffle=P,exports.skewReloadPending=Un,exports.sortToValue=Zr,exports.soundOf=bt,exports.speak=Qn,exports.stopSpeaking=Zn,exports.submitGameScore=pa,exports.syllMatchesComp=Q,exports.syllableContrasts=re,exports.syllableLength=xo,exports.syllablePron=Fe,exports.toBase64UrlSafe=Ea,exports.toChoseong=Yt,exports.toItemResults=da,exports.toKstHm=Ba,exports.toKstYmd=be,exports.toStandardPronunciation=pr,exports.toStorageName=He,exports.toUserErrorMessage=Qr,exports.toWordEntry=ls,exports.validateSyllableSearchInput=Uo,exports.withEuRo=Tr,exports.withEulReul=yr,exports.withEunNeun=br,exports.withIga=Sr,exports.withWaGwa=wr,exports.wordContainsChoseong=jo,exports.wordContainsJongseong=Fo,exports.wordContainsJungseong=$o,exports.wordHasConsonantAt=Ho,exports.wordHasNoCoda=Wo,exports.wordHasSyllableMatching=Go,exports.wrongItems=ga;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ihabdevteam/core",
3
- "version": "0.334.0",
3
+ "version": "0.336.0",
4
4
  "private": false,
5
5
  "main": "dist/ihabdevteam-core.cjs.js",
6
6
  "module": "dist/packages/core/src/index.js",