|
| 1 | +/* 推導《中原音韻》 |
| 2 | + * |
| 3 | + * 可選四家擬音方案: |
| 4 | + * |
| 5 | + * - 楊耐思. 中原音韻音系. 北京: 中國社會科學出版社, 1981. |
| 6 | + * - 寧繼福. 中原音韻表稿. 長春: 吉林文史出版社, 1985. |
| 7 | + * - 薛鳳生. 中原音韻音位系統. 魯國堯, 侍建國, 譯. 北京: 北京語言學院出版社, 1990. |
| 8 | + * - unt. 《中原音韻》音系簡述, 2021. https://zhuanlan.zhihu.com/p/353713058 |
| 9 | + * |
| 10 | + * @author unt |
| 11 | + */ |
| 12 | + |
| 13 | +const is = (...x) => 音韻地位.屬於(...x); |
| 14 | +const when = (...x) => 音韻地位.判斷(...x); |
| 15 | + |
| 16 | +if (!音韻地位) return [ |
| 17 | + ['顯示', [5, |
| 18 | + '音位(薛鳳生, 1990)', |
| 19 | + '音位(unt, 2021)', |
| 20 | + '音值(楊耐思, 1981)', |
| 21 | + '音值(寧繼福, 1985)', |
| 22 | + '音值(unt, 2021)', |
| 23 | + ]], |
| 24 | + ['標記古入聲字', true], |
| 25 | + ['包含部分例外音變', true], |
| 26 | + ['異讀分隔符(留空則爲換行)', ''], |
| 27 | + ['高元音開口呼', 選項.顯示?.includes('unt') ?? true ? [2, 'ɨ', 'ə'] : null], |
| 28 | +]; |
| 29 | + |
| 30 | +const 例外 = 選項.包含部分例外音變; |
| 31 | +let 層次 = 0; // 本方案只涉及 0 和 1 兩個層次。對入聲來說,0 代表白讀,1 代表文讀 |
| 32 | + |
| 33 | +function 調整音韻地位() { |
| 34 | + function 調整(表達式, 調整屬性) { if (is(表達式)) 音韻地位 = 音韻地位.調整(調整屬性); } |
| 35 | + // 輕唇化例外 |
| 36 | + 調整('明母 尤韻', { 等: '一', 韻: '侯' }); |
| 37 | + 調整('明母 東韻', { 等: '一' }); |
| 38 | + |
| 39 | + 調整('云母 通攝 平聲', { 母: '匣' }); // 熊 |
| 40 | + if (!例外) return; |
| 41 | + |
| 42 | + // 流攝脣音入遇攝字 |
| 43 | + 調整('明母 侯韻 上聲', { 韻: '模' }); // 母某牡畝(忽略:謀戊) |
| 44 | + 調整('尤韻 (並母 平上聲 或 幫滂母 去聲)', { 韻: '虞' }); // 浮、婦阜負、富、副 |
| 45 | + |
| 46 | + // 蟹攝二等入假攝字 |
| 47 | + if (when([ |
| 48 | + ['佳韻', [ |
| 49 | + ['並母 上聲', true], // 罷 |
| 50 | + ['見母 開口 平聲', true], // 佳 |
| 51 | + ['溪母 合口 平聲', true], // 咼 |
| 52 | + ['見匣母 合口 去聲', true], // 卦掛、畫 |
| 53 | + [層次 === 1 && '疑母 開口 平聲', true], // 涯\崖 |
| 54 | + [層次 === 1 && '生母 開口 去聲', true], // 洒\曬 |
| 55 | + ]], |
| 56 | + ['夬韻 匣母 合口 去聲', true], // 話 |
| 57 | + ])) 調整('蟹攝', { 韻: '麻' }); |
| 58 | + |
| 59 | + 調整('端母 蕭韻 上聲', { 母: '泥' }); // 鳥 |
| 60 | + 調整('生母 山韻 上聲', { 母: '初' }); // 産 |
| 61 | + 調整('書母 通攝 舒聲', { 母: '昌' }); // 舂 |
| 62 | + 調整('書母 鍾韻 入聲', { 母: '昌' }); // 束 |
| 63 | + if (層次 === 0) 調整('書母 支韻 開口 去聲', { 母: '昌' }); // 翅\施 |
| 64 | + 調整('見母 蕭韻 平聲', { 母: '曉' }); // 梟鴞驍 |
| 65 | + |
| 66 | + if (層次 === 0) { |
| 67 | + 調整('果攝 開口 (定泥母 去聲 或 透母 平聲)', { 韻: '麻', 等: '二' }); // 大那+他 |
| 68 | + 調整('端母 庚韻 上聲', { 韻: '麻' }); // 打 |
| 69 | + } |
| 70 | +} |
| 71 | + |
| 72 | +function get聲母() { |
| 73 | + return when([ |
| 74 | + [例外, [ |
| 75 | + ['崇母 止攝 仄聲', 'ʂ'], // 士 |
| 76 | + ['常母 平聲 (支韻 合口 或 魚尤宵韻)', 'tʂʰ'], // 垂蜍讎韶 |
| 77 | + ['常母 深攝 平聲', 'ʂ'], // 忱煁 |
| 78 | + ['船母 平聲 合口', 'tʂʰ'], // 船唇 |
| 79 | + [層次 === 1 && '船母 曾攝 舒聲', 'tʂʰ'], // 乗\繩 |
| 80 | + |
| 81 | + [層次 === 1 && '匣母 寒韻 合口 平聲', ''], // 丸\桓 |
| 82 | + ['匣母 肴韻 平聲', 'x'], // 爻。《中州樂府音韻類編》與哮小韻陰陽配對,《中州音韻》與遙小韻合併 |
| 83 | + ['以母 蟹攝 合口', 'ɻ'], // 鋭 |
| 84 | + [層次 === 0 && '脂韻 以母 合口 平聲', 'ʋ'], // 惟\遺 |
| 85 | + ['疑母', [ |
| 86 | + ['宕攝 三等 開口', 'ŋ'], // 仰、虐瘧 |
| 87 | + ['山攝 三四等 開口 入聲', 'n'], // 囓臬糵 |
| 88 | + ['咸攝 三四等 入聲', 'ŋ'], // 業鄴 |
| 89 | + [層次 === 1 && '梗攝 二等 入聲', 'ŋ'], // 額 |
| 90 | + ['效攝 一等 仄聲', 'ŋ'], // 傲奡鏊 |
| 91 | + ]], // 俺《廣韻》未收,不考慮 |
| 92 | + ]], |
| 93 | + |
| 94 | + ['東鍾微虞廢文元歌陽尤凡韻 三等 非 重紐A類', [ // “非 重紐A類”用於過濾𩦠小韻,“歌韻”用於包含縛小韻 |
| 95 | + ['幫滂並母', 'f'], ['明母', 'ʋ'], |
| 96 | + ]], |
| 97 | + ['幫母 或 並母 仄聲', 'p'], ['滂並母', 'pʰ'], ['明母', 'm'], |
| 98 | + ['端母 或 定母 仄聲', 't'], ['透定母', 'tʰ'], ['泥孃母', 'n'], ['來母', 'l'], |
| 99 | + ['見母 或 羣母 仄聲', 'k'], ['溪羣母', 'kʰ'], ['影疑云以母', ''], ['曉匣母', 'x'], |
| 100 | + ['精母 或 從母 仄聲', 'ts'], ['清從母', 'tsʰ'], ['心邪俟母', 's'], |
| 101 | + |
| 102 | + ['常母 平聲 陽聲韻', 'tʂʰ'], |
| 103 | + ['知莊章母 或 澄崇母 仄聲', 'tʂ'], ['徹澄初崇昌母', 'tʂʰ'], ['生俟常書船母', 'ʂ'], ['日母', 'ɻ'], |
| 104 | + ], '無聲母規則', true); |
| 105 | +} |
| 106 | + |
| 107 | +function get介音() { |
| 108 | + let 洪細 = when([ |
| 109 | + [例外 && '見影組 二等 開口 梗攝 平聲', [ |
| 110 | + ['曉母', ''], // 亨 |
| 111 | + ['匣母 耕韻', ''], // 莖 |
| 112 | + [層次 === 1 && '影母', ''], // 甖 |
| 113 | + ]], |
| 114 | + |
| 115 | + ['幫組 微廢韻', 'j'], |
| 116 | + ['幫組 東鍾微虞廢文元歌陽尤凡韻 三等 非 重紐A類', ''], |
| 117 | + ['莊組', ''], |
| 118 | + |
| 119 | + ['宕攝 合口 三等', ''], |
| 120 | + ['(精章組 或 日母) 止攝 開口', ''], |
| 121 | + ['通攝 三等 舒聲', [ |
| 122 | + ['知章組 非 孃母 或 日母', ''], |
| 123 | + ['見母 或 溪羣母 仄聲', ''], // 弓拱恐共 |
| 124 | + [層次 === 1 && '影母 平聲', ''], // 癰廱壅\邕嗈雍 |
| 125 | + ]], |
| 126 | + [層次 === 1 && '(知章組 或 日母) 通攝 入聲 非 孃母', ''], |
| 127 | + |
| 128 | + ['三四等 或 見影組 二等 非 合口', 'j'], |
| 129 | + ['', ''], |
| 130 | + ], '無洪細規則', true); |
| 131 | + |
| 132 | + let 開合 = when([ |
| 133 | + [例外, [ |
| 134 | + ['止蟹攝 四等 合口 匣母 平聲', ''], // 畦携 |
| 135 | + ['止蟹攝 重紐A類 合口 見母 去聲', ''], // 季 |
| 136 | + ['脂韻 以母 合口 平聲', ''], // 遺 |
| 137 | + [層次 === 1 && '以母 合口 山攝', ''], // 緣沿掾\捐鉛鳶 |
| 138 | + [層次 === 1 && '曉匣母 先韻 合口', ''], // 懸縣血 |
| 139 | + [層次 === 1 && '清青韻 合口', ''], |
| 140 | + |
| 141 | + ['見組 祭韻 合口', ''], // 鱖 |
| 142 | + |
| 143 | + [層次 === 0 && '疑母 歌韻 開口 上聲', 'w'], // 我 |
| 144 | + [層次 === 1 && '定母 宕江攝 入聲', ''], // 鐸 |
| 145 | + [層次 === 0 && '明母 宕江攝 入聲', ''], |
| 146 | + ['明母 豪韻', ''], |
| 147 | + |
| 148 | + ['止蟹攝 重紐B類 幫母 去聲', 'w'], // 秘祕賁\詖 |
| 149 | + ['止蟹攝 重紐A類', [ |
| 150 | + ['幫母 平聲', 'w'], // 卑(避諱) |
| 151 | + ['幫母 支韻 去聲', 'w'], // 臂 |
| 152 | + ['並母 仄聲', 'w'], // 婢避幣\斃 |
| 153 | + ['明母 去聲', 'w'], // 袂寐 |
| 154 | + ]], |
| 155 | + ]], |
| 156 | + |
| 157 | + ['幫組', [ |
| 158 | + ['(宕攝 或 曾攝 一等) 入聲', 'w'], |
| 159 | + ['一等 非 通宕曾流攝 或 文歌韻', 'w'], |
| 160 | + ['(止蟹攝 或 臻攝 入聲) 重紐B類', 'w'], // 蟹攝幫三實際上無 B 類 |
| 161 | + ]], |
| 162 | + |
| 163 | + ['果江攝 銳音 或 宕攝 莊組', 'w'], |
| 164 | + [層次 === 1 && '宕攝 入聲 銳音', 'w'], |
| 165 | + ['合口', 'w'], |
| 166 | + ['', ''], |
| 167 | + ], '無開合規則', true); |
| 168 | + |
| 169 | + return 洪細 + 開合; |
| 170 | +} |
| 171 | + |
| 172 | +function get韻基() { |
| 173 | + return when([ |
| 174 | + [例外, [ |
| 175 | + ['心母 止攝 開口 上聲 非 脂韻', 'jəj'], // 璽枲徙\死(避諱) |
| 176 | + [層次 === 1 && '昌母 止攝 開口 非 (之韻 上聲 或 支韻 去聲)', 'jəj'], // 蚩媸鴟幟熾\齒(元曲押支思)\\翅施 |
| 177 | + ['知母 開口 (脂韻 平聲 或 之韻 上聲)', 'ə'], // 胝(元曲無)、徵(元曲押支思) |
| 178 | + |
| 179 | + [層次 === 0 && '幫滂並母 尤韻 仄聲', 'waw'], // 缶覆 |
| 180 | + [層次 === 0 && '滂母 侯韻 上聲', 'waw'], // 剖 |
| 181 | + [層次 === 0 && '明母 侯韻 去聲', 'aw'], // 茂 |
| 182 | + ['泰韻 疑母 合口', 'aj'], // 外 |
| 183 | + ]], |
| 184 | + |
| 185 | + ['遇攝', 'u'], // 魚模韻 |
| 186 | + ['止攝 開口 (精莊章組 或 日母)', 'ə'], // 支思韻 |
| 187 | + ['果攝 (一等 或 幫組 三等)', 'ʌ'], // 歌戈韻 |
| 188 | + ['假攝 二等', 'a'], // 家麻韻 |
| 189 | + ['果假攝 三等', 'ɛ'], // 車遮韻 |
| 190 | + |
| 191 | + ['蟹攝 (一等 開口 或 二等 或 莊組) 或 止攝 莊組', 'aj'], // 皆來韻 |
| 192 | + ['止蟹攝', 'əj'], // 齊微韻 |
| 193 | + |
| 194 | + ['流攝', 'əw'], // 尤侯韻 |
| 195 | + ['效攝 (一二等 或 莊組)', 'aw'], // 蕭豪韻·一二等 |
| 196 | + ['效攝 三四等', 'ɛw'], // 蕭豪韻·三四等 |
| 197 | + |
| 198 | + ['舒聲', [ |
| 199 | + [例外 && 層次 === 1 && '曾梗攝 一二等 非 開口 或 庚韻 三等 合口', 'uŋ'], |
| 200 | + ['通攝', 'uŋ'], // 東鍾韻 |
| 201 | + ['宕江攝', 'aŋ'], // 江陽韻 |
| 202 | + ['曾梗攝', 'əŋ'], // 庚青韻 |
| 203 | + |
| 204 | + ['臻攝 非 元韻', 'ən'], // 真文韻 |
| 205 | + ['山攝 一等 非 開口', 'ʌn'], // 桓歡韻 |
| 206 | + ['山攝 (一二等 或 莊組) 或 元韻 幫組', 'an'], // 寒山韻 |
| 207 | + ['山攝 三四等 或 元韻', 'ɛn'], // 先天韻 |
| 208 | + |
| 209 | + ['深攝', is`幫組` ? 'ən' : 'əm'], // 侵尋韻 |
| 210 | + ['咸攝 (一二等 或 莊組) 或 嚴凡韻 幫組', is`幫組` ? 'an' : 'am'], // 監咸韻 |
| 211 | + ['咸攝 三四等', is`幫組` ? 'ɛn' : 'ɛm'], // 廉纖韻 |
| 212 | + ]], |
| 213 | + ['入聲', [ |
| 214 | + ['通攝', [ |
| 215 | + [層次 === 0 && '(精知章莊組 或 來日母) 東韻 三等', 'əw'], |
| 216 | + [層次 === 0 && '(知章莊組 或 日母) 鍾韻', 'əw'], // 燭褥+贖屬(元曲押魚模、尤侯)\辱(元曲只押魚模) |
| 217 | + ['', 'u'], |
| 218 | + ]], |
| 219 | + ['宕江攝', [ |
| 220 | + [層次 === 1, 'ʌ'], |
| 221 | + ['', 'aw'], |
| 222 | + ]], |
| 223 | + |
| 224 | + [例外, [ |
| 225 | + [層次 === 1 && '登韻 心母', 'ə'], // 塞(元曲押齊微) |
| 226 | + [層次 === 1 && '登韻 精母', 'aj'], // 則(元曲押齊微) |
| 227 | + [層次 === 1 && '曾梗攝 一等 溪母 開口', 'jaj'], // 刻(元曲押齊微、皆來) |
| 228 | + [層次 === 1 && '曾梗攝 二等 溪疑母 開口', 'ɛ'], // 客(元曲押皆來、車遮)、額(元曲只押皆來) |
| 229 | + [層次 === 0 && '文韻 並母', 'ʌ'], // 佛(元曲押魚模、歌戈) |
| 230 | + ['臻攝 一等 幫組 非 明母', 'ʌ'], // 勃 |
| 231 | + [層次 === 0 && '日母 深攝', 'u'], // 入 |
| 232 | + ]], |
| 233 | + ['臻攝 (一等 或 文韻 幫組 或 合口 非 元韻)', 'u'], // +麧(《中原音韻》未收) |
| 234 | + ['臻深攝 莊組 開口', 'ə'], |
| 235 | + ['曾梗臻深攝 (二等 或 莊組)', 'aj'], |
| 236 | + ['曾梗臻深攝 非 元韻', 'əj'], |
| 237 | + ['山咸攝 一等 非 (銳音 開口)', 'ʌ'], |
| 238 | + ['山咸攝 (一二等 或 莊組) 或 元嚴凡韻 幫組', 'a'], |
| 239 | + ['山咸攝 三四等 或 元韻', 'ɛ'], |
| 240 | + ]], |
| 241 | + ], '無韻基規則', true); |
| 242 | +} |
| 243 | + |
| 244 | +function get聲調() { |
| 245 | + return when([ |
| 246 | + [例外, [ |
| 247 | + ['匣母 蟹攝 上聲 開口', '³'], // 駭蟹\解獬 |
| 248 | + ['羣母 臻攝 上聲 合口 非 元韻', '³'], // 窘 |
| 249 | + |
| 250 | + ['羣母 梗攝 三等 開口 入聲', '⁴ʼ'], // 劇 |
| 251 | + ['生母 山攝 合口 入聲', '⁴ʼ'], // 刷 |
| 252 | + ['影疑母 通臻攝 一等 入聲 非 開口', '³ʼ'], // 屋沃兀 |
| 253 | + [層次 === 0 && '影母 眞韻 重紐A類 開口 入聲', '³ʼ'], // 一 |
| 254 | + ]], |
| 255 | + ['平聲 (全清 或 次清)', '¹'], |
| 256 | + ['平聲 (全濁 或 次濁)', '²'], |
| 257 | + ['上聲 非 全濁', '³'], |
| 258 | + ['上去聲', '⁴'], |
| 259 | + ['入聲', [ |
| 260 | + ['全濁', '²ʼ'], |
| 261 | + ['次濁 或 影母', '⁴ʼ'], // 影母入聲《中原音韻》按次濁歸派 |
| 262 | + ['', '³ʼ'], |
| 263 | + ]], |
| 264 | + ], '無聲調規則', true); |
| 265 | +} |
| 266 | + |
| 267 | +function get音節() { |
| 268 | + function 批量替換(str, pairs) { |
| 269 | + pairs.forEach(pair => { str = str.replace(new RegExp(pair[0], 'g'), pair[1]); }); |
| 270 | + return str; |
| 271 | + } |
| 272 | + let 聲母 = get聲母(); |
| 273 | + let 韻母 = get介音() + get韻基(); |
| 274 | + let 聲調 = get聲調(); |
| 275 | + 韻母 = 韻母.replace('wu', 'u'); |
| 276 | + 韻母 = 韻母.replace('jwəj', 'wəj'); |
| 277 | + 韻母 = 韻母.replace('jʌ', 'jwʌ'); |
| 278 | + |
| 279 | + if (選項.顯示.includes('unt')) { |
| 280 | + if (選項.顯示.includes('音值')) { |
| 281 | + 韻母 = 批量替換(韻母, [ |
| 282 | + ['jw', 'ɥ'], ['əj', 'əi'], |
| 283 | + ['jə', 'i'], ['ii', 'i'], |
| 284 | + ['wə', 韻母.includes('ŋ') ? 'wə' : 'u'], |
| 285 | + ['ɥə', 韻母.includes('ŋ') ? 'ɥi' : 'y'], |
| 286 | + ['wʌ', 'wɔ'], ['ɥʌ', 'jɔ'], |
| 287 | + ]); |
| 288 | + if (韻母 === 'ə' && 選項.高元音開口呼 === 'ə') 韻母 = 聲母.includes('s') ? 'ɹ̩' : 'ɻ̍'; |
| 289 | + if ('pmfʋ'.includes(聲母[0])) 韻母 = 韻母.replace('wɔ', 'ɔ'); |
| 290 | + if ('tnlsʂɻ'.includes(聲母[0]) && 韻母 === 'wɔ') 韻母 = 'ɔ'; |
| 291 | + } |
| 292 | + 韻母 = 韻母.replace('ə', 選項.高元音開口呼); |
| 293 | + } else if (選項.顯示.includes('楊耐思')) { |
| 294 | + 聲母 = 批量替換(聲母, [['ʰ', 'ʻ'], ['ʋ', 'v'], ['ʂ', 'ʃ'], ['ɻ', 'ʒ']]); |
| 295 | + 韻母 = 批量替換(韻母, [ |
| 296 | + ['j', 'i'], ['w', 'u'], |
| 297 | + ['əi', 'ei'], ['iei', 'i'], |
| 298 | + ['uau', ['k', 'kʻ', '', 'ŋ', 'x'].includes(聲母) ? 'uau' : 'au'], |
| 299 | + ['iau', ['k', 'kʻ', '', 'ŋ', 'x'].includes(聲母) ? 'iau' : 'iɛu'], |
| 300 | + ['ʌ', 'o'], ['iuo', 'io'], ['uon', 'on'], |
| 301 | + ['ia', 'i̯a'], ['i̯aŋ', 'iaŋ'], |
| 302 | + ]); |
| 303 | + if (韻母 === 'ə') 韻母 = 'ï'; |
| 304 | + } else if (選項.顯示.includes('寧繼福')) { |
| 305 | + 聲母 = 批量替換(聲母, [['ʰ', 'ʻ'], ['ɻ', 'ɽ']]); |
| 306 | + 韻母 = 批量替換(韻母, [ |
| 307 | + ['j', 'i'], ['w', 'u'], |
| 308 | + ['iəi', 'i'], ['uəi', 'ui'], ['əi', 'ei'], |
| 309 | + ['uau', 'pmfʋ'.includes(聲母[0]) ? 'ɑ-u' : 'a-u'], // - 用於佔位 |
| 310 | + ['iau', 聲調.includes('ʼ') ? 'ia-u' : 'a-u'], |
| 311 | + ['au', 聲母.includes('ʂ') || 'pmfʋ'.includes(聲母[0]) ? 'au' : 'ɑu'], |
| 312 | + ['iɛu', 'iau'], ['-u', 'u'], |
| 313 | + ['ʌ', 'ɔ'], ['iuɔ', 'iɔ'], |
| 314 | + ]); |
| 315 | + if (韻母 === 'ə') 韻母 = 'ï'; |
| 316 | + if ('pmfʋ'.includes(聲母[0]) && !'iu'.includes(韻母[0]) && !'iu'.includes(韻母.slice(-1))) 韻母 = 'u' + 韻母; |
| 317 | + if (is`孃母 效攝`) 韻母 = 'au'; |
| 318 | + } else if (選項.顯示.includes('薛鳳生')) { |
| 319 | + 聲母 = 批量替換(聲母, [['ʰ', 'h'], ['ʋ', 'v'], ['ʂ', 'sr'], ['ɻ', 'r'], ['ts', 'c'], ['x', 'h']]); |
| 320 | + 韻母 = 批量替換(韻母, [ |
| 321 | + ['j', 'y'], |
| 322 | + ['əŋ', 'eŋ'], ['ə', 'ɨ'], ['ɛ', 'e'], |
| 323 | + ['uŋ', 'woŋ'], ['u', 'wɨ'], ['ʌ', 'o'], |
| 324 | + ['waw', 聲母.includes('r') ? 'ow' : 'wow'], |
| 325 | + ['aw', 聲母.includes('r') || 'pmfv'.includes(聲母[0]) ? 'aw' : 'ow'], ['yow', 'yaw'], |
| 326 | + ]); |
| 327 | + if ('pmfv'.includes(聲母[0]) && !'yw'.includes(韻母[0])) 韻母 = 'w' + 韻母; |
| 328 | + if (is`孃母 效攝`) 韻母 = 'aw'; |
| 329 | + } |
| 330 | + |
| 331 | + if (!選項.標記古入聲字) 聲調 = 聲調[0]; |
| 332 | + return 聲母 + 韻母 + 聲調; |
| 333 | +} |
| 334 | + |
| 335 | +const 音韻地位備份 = 音韻地位; |
| 336 | +const 結果 = [0, 1].map(i => { |
| 337 | + 層次 = i; |
| 338 | + 音韻地位 = 音韻地位備份; |
| 339 | + 調整音韻地位(); |
| 340 | + return get音節(); |
| 341 | +}); |
| 342 | +return [...new Set(結果)].join(選項['異讀分隔符(留空則爲換行)'] || '\n'); |
0 commit comments