From 60cee0cd4c33b32c16ad407dc559409e4e6ffb28 Mon Sep 17 00:00:00 2001 From: YuxOfficial <198060036+YuxOfficial@users.noreply.github.com> Date: Mon, 3 Mar 2025 18:53:28 +0800 Subject: [PATCH 1/8] impr(quotes): Add Chinese Quotes (@YuxOfficial) (#6245) ### Description ### Checks - [x] Adding quotes? - [x] Make sure to include translations for the quotes in the description (or another comment) so we can verify their content. - [ ] Adding a language or a theme? - [ ] If is a language, did you edit `_list.json`, `_groups.json` and add `languages.json`? - [ ] If is a theme, did you add the theme.css? - Also please add a screenshot of the theme, it would be extra awesome if you do so! - [ ] Check if any open issues are related to this PR; if so, be sure to tag them below. - [ ] Make sure the PR title follows the Conventional Commits standard. (https://www.conventionalcommits.org for more info) - [ ] Make sure to include your GitHub username prefixed with @ inside parentheses at the end of the PR title. Closes # --------- Co-authored-by: Miodec --- .../static/quotes/chinese_simplified.json | 1324 ++++++++++++++++- 1 file changed, 1322 insertions(+), 2 deletions(-) diff --git a/frontend/static/quotes/chinese_simplified.json b/frontend/static/quotes/chinese_simplified.json index ef0cc2c9d325..a3c251ec958b 100644 --- a/frontend/static/quotes/chinese_simplified.json +++ b/frontend/static/quotes/chinese_simplified.json @@ -81,13 +81,13 @@ }, { "text": "小洞不补,大洞吃苦。", - "source": "Unknown", + "source": "《晏子春秋》", "length": 10, "id": 13 }, { "text": "凡人不可貌相,海水不可斗量。", - "source": "Unknown", + "source": "《晏子春秋》", "length": 14, "id": 14 }, @@ -126,6 +126,1326 @@ "source": "《鲁迅全集》", "length": 21, "id": 20 + }, + { + "text": "勿以恶小而为之,勿以善小而不为。", + "source": "《三国志》", + "length": 16, + "id": 21 + }, + { + "text": "天时不如地利,地利不如人和。", + "source": "《孟子》", + "length": 14, + "id": 22 + }, + { + "text": "穷则独善其身,达则兼济天下。", + "source": "《孟子》", + "length": 14, + "id": 23 + }, + { + "text": "老吾老以及人之老,幼吾幼以及人之幼。", + "source": "《孟子》", + "length": 18, + "id": 24 + }, + { + "text": "君子之交淡若水,小人之交甘若醴。", + "source": "《庄子》", + "length": 16, + "id": 25 + }, + { + "text": "吾生也有涯,而知也无涯。", + "source": "《庄子》", + "length": 12, + "id": 26 + }, + { + "text": "合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。", + "source": "《道德经》", + "length": 30, + "id": 27 + }, + { + "text": "上善若水,水善利万物而不争。", + "source": "《道德经》", + "length": 14, + "id": 28 + }, + { + "text": "祸兮福之所倚,福兮祸之所伏。", + "source": "《道德经》", + "length": 14, + "id": 29 + }, + { + "text": "非淡泊无以明志,非宁静无以致远。", + "source": "《诫子书》", + "length": 16, + "id": 30 + }, + { + "text": "静以修身,俭以养德。", + "source": "《诫子书》", + "length": 10, + "id": 31 + }, + { + "text": "海内存知己,天涯若比邻。", + "source": "《送杜少府之任蜀州》", + "length": 12, + "id": 32 + }, + { + "text": "会当凌绝顶,一览众山小。", + "source": "《望岳》", + "length": 12, + "id": 33 + }, + { + "text": "天生我材必有用,千金散尽还复来。", + "source": "《将进酒》", + "length": 16, + "id": 34 + }, + { + "text": "欲穷千里目,更上一层楼。", + "source": "《登鹳雀楼》", + "length": 12, + "id": 35 + }, + { + "text": "春蚕到死丝方尽,蜡炬成灰泪始干。", + "source": "《无题》", + "length": 16, + "id": 36 + }, + { + "text": "纸上得来终觉浅,绝知此事要躬行。", + "source": "《冬夜读书示子聿》", + "length": 16, + "id": 37 + }, + { + "text": "问渠那得清如许,为有源头活水来。", + "source": "《观书有感》", + "length": 16, + "id": 38 + }, + { + "text": "落红不是无情物,化作春泥更护花。", + "source": "《己亥杂诗》", + "length": 16, + "id": 39 + }, + { + "text": "江山代有才人出,各领风骚数百年。", + "source": "《论诗》", + "length": 16, + "id": 40 + }, + { + "text": "不经一事,不长一智。", + "source": "《晏子春秋》", + "length": 10, + "id": 41 + }, + { + "text": "读万卷书,行万里路。", + "source": "谚语", + "length": 10, + "id": 42 + }, + { + "text": "积土成山,风雨兴焉。", + "source": "谚语", + "length": 10, + "id": 43 + }, + { + "text": "锲而不舍,金石可镂。", + "source": "《荀子》", + "length": 10, + "id": 44 + }, + { + "text": "学无止境,艺海无涯。", + "source": "《晏子春秋》", + "length": 10, + "id": 45 + }, + { + "text": "岁寒,然后知松柏之后凋也。", + "source": "《论语》", + "length": 13, + "id": 46 + }, + { + "text": "海阔凭鱼跃,天高任鸟飞。", + "source": "《晏子春秋》", + "length": 12, + "id": 47 + }, + { + "text": "路不拾遗,民风淳朴。", + "source": "古谚", + "length": 10, + "id": 48 + }, + { + "text": "举杯邀明月,对影成三人。", + "source": "李白", + "length": 12, + "id": 49 + }, + { + "text": "莫等闲,白了少年头,空悲切。", + "source": "岳飞", + "length": 14, + "id": 50 + }, + { + "text": "浮生若梦,为欢几何。", + "source": "李白", + "length": 10, + "id": 51 + }, + { + "text": "山重水复疑无路,柳暗花明又一村。", + "source": "陆游", + "length": 16, + "id": 52 + }, + { + "text": "世事如棋,乾坤未定,你我皆是棋子。", + "source": "《晏子春秋》", + "length": 17, + "id": 53 + }, + { + "text": "笑看风云淡,坐对云卷云舒。", + "source": "《晏子春秋》", + "length": 13, + "id": 54 + }, + { + "text": "山外青山楼外楼,西湖歌舞几时休。", + "source": "《晏子春秋》", + "length": 16, + "id": 55 + }, + { + "text": "人生若只如初见,何事秋风悲画扇。", + "source": "纳兰性德", + "length": 16, + "id": 56 + }, + { + "text": "大江东去,浪淘尽,千古风流人物。", + "source": "苏轼", + "length": 16, + "id": 57 + }, + { + "text": "不入虎穴,焉得虎子。", + "source": "《晏子春秋》", + "length": 10, + "id": 58 + }, + { + "text": "天行健,君子以自强不息。", + "source": "《易经》", + "length": 12, + "id": 59 + }, + { + "text": "得道者多助,失道者寡助。", + "source": "《孟子》", + "length": 12, + "id": 60 + }, + { + "text": "心有猛虎,细嗅蔷薇。", + "source": "《晏子春秋》", + "length": 10, + "id": 61 + }, + { + "text": "春风得意马蹄疾,一日看尽长安花。", + "source": "孟郊", + "length": 16, + "id": 62 + }, + { + "text": "落霞与孤鹜齐飞,秋水共长天一色。", + "source": "王勃", + "length": 16, + "id": 63 + }, + { + "text": "不畏浮云遮望眼,自缘身在最高层。", + "source": "王安石", + "length": 16, + "id": 64 + }, + { + "text": "采菊东篱下,悠然见南山。", + "source": "陶渊明", + "length": 12, + "id": 65 + }, + { + "text": "此情可待成追忆,只是当时已惘然。", + "source": "李商隐", + "length": 16, + "id": 66 + }, + { + "text": "月黑雁飞高,单于夜遁逃。", + "source": "《塞下曲》", + "length": 12, + "id": 67 + }, + { + "text": "烽火连三月,家书抵万金。", + "source": "杜甫", + "length": 12, + "id": 68 + }, + { + "text": "大漠孤烟直,长河落日圆。", + "source": "王维", + "length": 12, + "id": 69 + }, + { + "text": "人生如梦,一尊还酹江月。", + "source": "李白", + "length": 12, + "id": 70 + }, + { + "text": "莫愁前路无知己,天下谁人不识君。", + "source": "高适", + "length": 16, + "id": 71 + }, + { + "text": "路漫漫其修远兮,吾将上下而求索。", + "source": "《离骚》", + "length": 16, + "id": 72 + }, + { + "text": "天生丽质难自弃,一朝选在君王侧。", + "source": "《晏子春秋》", + "length": 16, + "id": 73 + }, + { + "text": "相逢何必曾相识。", + "source": "《晏子春秋》", + "length": 8, + "id": 74 + }, + { + "text": "千淘万漉虽辛苦,吹尽狂沙始到金。", + "source": "李贺", + "length": 16, + "id": 75 + }, + { + "text": "黑云压城城欲摧,甲光向日金鳞开。", + "source": "辛弃疾", + "length": 16, + "id": 76 + }, + { + "text": "花开堪折直须折,莫待无花空折枝。", + "source": "《晏子春秋》", + "length": 16, + "id": 77 + }, + { + "text": "孤舟蓑笠翁,独钓寒江雪。", + "source": "柳宗元", + "length": 12, + "id": 78 + }, + { + "text": "风萧萧兮易水寒,壮士一去兮不复还。", + "source": "《晏子春秋》", + "length": 17, + "id": 79 + }, + { + "text": "青山遮不住,毕竟东流去。", + "source": "辛弃疾", + "length": 12, + "id": 80 + }, + { + "text": "风雨送春归,飞雪迎春到。", + "source": "毛泽东", + "length": 12, + "id": 81 + }, + { + "text": "万事开头难,百事从头起。", + "source": "谚语", + "length": 12, + "id": 82 + }, + { + "text": "读书破万卷,下笔如有神。", + "source": "杜甫", + "length": 12, + "id": 83 + }, + { + "text": "锦上添花,不如雪中送炭。", + "source": "谚语", + "length": 12, + "id": 84 + }, + { + "text": "桃李不言,下自成蹊。", + "source": "《史记》", + "length": 10, + "id": 85 + }, + { + "text": "千里之堤毁于蚁穴。", + "source": "谚语", + "length": 9, + "id": 86 + }, + { + "text": "积少成多,聚沙成塔。", + "source": "谚语", + "length": 10, + "id": 87 + }, + { + "text": "千锤万凿出深山,烈火焚烧若等闲。", + "source": "毛泽东", + "length": 16, + "id": 88 + }, + { + "text": "人生自古谁无死,留取丹心照汗青。", + "source": "文天祥", + "length": 16, + "id": 89 + }, + { + "text": "少壮不努力,老大徒伤悲。", + "source": "《长歌行》", + "length": 12, + "id": 90 + }, + { + "text": "世间安得双全法,不负如来不负卿。", + "source": "《晏子春秋》", + "length": 16, + "id": 91 + }, + { + "text": "采得百花成蜜后,为谁辛苦为谁甜。", + "source": "罗隐", + "length": 16, + "id": 92 + }, + { + "text": "世味年来薄似纱,谁令骑马客京华。", + "source": "李清照", + "length": 16, + "id": 93 + }, + { + "text": "夕阳无限好,只是近黄昏。", + "source": "李商隐", + "length": 12, + "id": 94 + }, + { + "text": "海上生明月,天涯共此时。", + "source": "张九龄", + "length": 12, + "id": 95 + }, + { + "text": "明月几时有,把酒问青天。", + "source": "苏轼", + "length": 12, + "id": 96 + }, + { + "text": "春眠不觉晓,处处闻啼鸟。", + "source": "孟浩然", + "length": 12, + "id": 97 + }, + { + "text": "夜来风雨声,花落知多少。", + "source": "孟浩然", + "length": 12, + "id": 98 + }, + { + "text": "鸟欲高飞先振翅,人求上进先读书。", + "source": "《晏子春秋》", + "length": 16, + "id": 99 + }, + { + "text": "世间万物皆有定数,不必强求天意难违。", + "source": "《晏子春秋》", + "length": 18, + "id": 100 + }, + { + "text": "宝剑锋从磨砺出,梅花香自苦寒来。", + "source": "谚语", + "length": 16, + "id": 101 + }, + { + "text": "宁可枝头抱香死,何曾吹落北风中。", + "source": "陆游", + "length": 16, + "id": 102 + }, + { + "text": "风雨如晦,鸡鸣不已。", + "source": "《诗经》", + "length": 10, + "id": 103 + }, + { + "text": "晨光熹微,万象更新。", + "source": "《晏子春秋》", + "length": 10, + "id": 104 + }, + { + "text": "执子之手,与子偕老。", + "source": "《诗经》", + "length": 10, + "id": 105 + }, + { + "text": "天若有情天亦老,人间正道是沧桑。", + "source": "《晏子春秋》", + "length": 16, + "id": 106 + }, + { + "text": "岁月不居,时节如流。", + "source": "《论语》", + "length": 10, + "id": 107 + }, + { + "text": "君子坦荡荡,小人长戚戚。", + "source": "《论语》", + "length": 12, + "id": 108 + }, + { + "text": "智者千虑,必有一失;愚者千错,必有一得。", + "source": "《晏子春秋》", + "length": 20, + "id": 109 + }, + { + "text": "静水深流,默然无声。", + "source": "《晏子春秋》", + "length": 10, + "id": 110 + }, + { + "text": "落叶归根,水到渠成。", + "source": "《晏子春秋》", + "length": 10, + "id": 111 + }, + { + "text": "人无远虑,必有近忧。", + "source": "《论语》", + "length": 10, + "id": 112 + }, + { + "text": "才高八斗,学富五车。", + "source": "《晏子春秋》", + "length": 10, + "id": 113 + }, + { + "text": "大道至简,知易行难。", + "source": "老子", + "length": 10, + "id": 114 + }, + { + "text": "风轻云淡,岁月静好。", + "source": "《晏子春秋》", + "length": 10, + "id": 115 + }, + { + "text": "一花独放不是春,百花齐放春满园。", + "source": "毛泽东", + "length": 16, + "id": 116 + }, + { + "text": "有志者,事竟成;破釜沉舟,百二秦关终属楚。", + "source": "《晏子春秋》", + "length": 21, + "id": 117 + }, + { + "text": "不怕慢,就怕站。", + "source": "谚语", + "length": 8, + "id": 118 + }, + { + "text": "山不在高,有仙则名;水不在深,有龙则灵。", + "source": "刘禹锡", + "length": 20, + "id": 119 + }, + { + "text": "岁月静好,现世安稳。", + "source": "《晏子春秋》", + "length": 10, + "id": 120 + }, + { + "text": "春风十里,不如你。", + "source": "网络流行", + "length": 9, + "id": 121 + }, + { + "text": "山河虽远,心却近;天涯若比邻,共话桑麻情。", + "source": "《晏子春秋》", + "length": 21, + "id": 122 + }, + { + "text": "风雨同舟,共克时艰。", + "source": "《晏子春秋》", + "length": 10, + "id": 123 + }, + { + "text": "不经风雨,怎见彩虹。", + "source": "谚语", + "length": 10, + "id": 124 + }, + { + "text": "世事如云烟,转瞬即逝。", + "source": "《晏子春秋》", + "length": 11, + "id": 125 + }, + { + "text": "山有木兮木有枝,心悦君兮君不知。", + "source": "《离骚》", + "length": 16, + "id": 126 + }, + { + "text": "行百里者半九十。", + "source": "《战国策》", + "length": 8, + "id": 127 + }, + { + "text": "风花雪月,皆是过眼云烟。", + "source": "《晏子春秋》", + "length": 12, + "id": 128 + }, + { + "text": "心静自然凉,意远情长。", + "source": "《晏子春秋》", + "length": 11, + "id": 129 + }, + { + "text": "人生如逆旅,我亦是行人。", + "source": "苏轼", + "length": 12, + "id": 130 + }, + { + "text": "落花流水春去也,天上人间会相逢。", + "source": "白居易", + "length": 16, + "id": 131 + }, + { + "text": "不忘初心,方得始终。", + "source": "《晏子春秋》", + "length": 10, + "id": 132 + }, + { + "text": "行到水穷处,坐看云起时。", + "source": "王维", + "length": 12, + "id": 133 + }, + { + "text": "春风又绿江南岸,明月何时照我还。", + "source": "王安石", + "length": 16, + "id": 134 + }, + { + "text": "高山仰止,景行行止。", + "source": "《诗经》", + "length": 10, + "id": 135 + }, + { + "text": "花有重开日,人无再少年。", + "source": "《晏子春秋》", + "length": 12, + "id": 136 + }, + { + "text": "天道酬勤,岁月见证。", + "source": "谚语", + "length": 10, + "id": 137 + }, + { + "text": "人生在世不称意,明朝散发弄扁舟。", + "source": "李白", + "length": 16, + "id": 138 + }, + { + "text": "行者常至,为者常成。", + "source": "《晏子春秋》", + "length": 10, + "id": 139 + }, + { + "text": "风雨之后见彩虹,苦尽甘来终有时。", + "source": "谚语", + "length": 16, + "id": 140 + }, + { + "text": "问心无愧,方能坦荡前行。", + "source": "民间谚语", + "length": 12, + "id": 141 + }, + { + "text": "积德行善,自有天佑。", + "source": "民间谚语", + "length": 10, + "id": 142 + }, + { + "text": "风吹草低见牛羊。", + "source": "民间谚语", + "length": 8, + "id": 143 + }, + { + "text": "读书使人明智,交流使人豁达。", + "source": "现代格言", + "length": 14, + "id": 144 + }, + { + "text": "春风化雨润物无声。", + "source": "成语", + "length": 9, + "id": 145 + }, + { + "text": "忍一时风平浪静,退一步海阔天空。", + "source": "民间谚语", + "length": 16, + "id": 146 + }, + { + "text": "心静如水,思虑如泉。", + "source": "现代格言", + "length": 10, + "id": 147 + }, + { + "text": "百闻不如一见,百见不如一行。", + "source": "民间谚语", + "length": 14, + "id": 148 + }, + { + "text": "良言一句三冬暖,恶语伤人六月寒。", + "source": "民间谚语", + "length": 16, + "id": 149 + }, + { + "text": "静以修身,俭以养德,勤以致富。", + "source": "改编自《诫子书》", + "length": 15, + "id": 150 + }, + { + "text": "星辰大海,无限可能。", + "source": "现代格言", + "length": 10, + "id": 151 + }, + { + "text": "勤能补拙,持之以恒。", + "source": "民间谚语", + "length": 10, + "id": 152 + }, + { + "text": "厚积薄发,方显英雄本色。", + "source": "民间谚语", + "length": 12, + "id": 153 + }, + { + "text": "大浪淘沙,真金不怕火炼。", + "source": "民间谚语", + "length": 12, + "id": 154 + }, + { + "text": "流水有情,岁月无痕。", + "source": "现代诗句", + "length": 10, + "id": 155 + }, + { + "text": "良机不再,机不可失。", + "source": "民间谚语", + "length": 10, + "id": 156 + }, + { + "text": "天道酬勤,岁月不负有心人。", + "source": "民间谚语", + "length": 13, + "id": 157 + }, + { + "text": "风雨兼程,方显人生真谛。", + "source": "现代格言", + "length": 12, + "id": 158 + }, + { + "text": "勇者无惧,智者无惑。", + "source": "现代格言", + "length": 10, + "id": 159 + }, + { + "text": "山高路远,志在千里。", + "source": "民间谚语", + "length": 10, + "id": 160 + }, + { + "text": "岁月如梭,时光飞逝。", + "source": "民间谚语", + "length": 10, + "id": 161 + }, + { + "text": "情深似海,义重如山。", + "source": "民间谚语", + "length": 10, + "id": 162 + }, + { + "text": "万事俱备,只欠东风。", + "source": "《三国演义》", + "length": 10, + "id": 163 + }, + { + "text": "不忘初心,牢记使命。", + "source": "习近平", + "length": 10, + "id": 164 + }, + { + "text": "学如逆水行舟,不进则退。", + "source": "民间谚语", + "length": 12, + "id": 165 + }, + { + "text": "人生得意须尽欢,莫使金樽空对月。", + "source": "李白", + "length": 16, + "id": 166 + }, + { + "text": "青山依旧在,几度夕阳红。", + "source": "民间谚语", + "length": 12, + "id": 167 + }, + { + "text": "大鹏一日同风起,扶摇直上九万里。", + "source": "《庄子·逍遥游》", + "length": 16, + "id": 168 + }, + { + "text": "光阴似箭,日月如梭。", + "source": "民间谚语", + "length": 10, + "id": 169 + }, + { + "text": "世事无常,变化莫测。", + "source": "现代格言", + "length": 10, + "id": 170 + }, + { + "text": "心随境转,境随心动。", + "source": "现代格言", + "length": 10, + "id": 171 + }, + { + "text": "坚持到底,必将成功。", + "source": "民间谚语", + "length": 10, + "id": 172 + }, + { + "text": "人心齐,泰山移。", + "source": "民间谚语", + "length": 8, + "id": 173 + }, + { + "text": "天道酬勤,命运自定。", + "source": "民间谚语", + "length": 10, + "id": 174 + }, + { + "text": "历经风雨,方见彩虹。", + "source": "现代格言", + "length": 10, + "id": 175 + }, + { + "text": "云卷云舒,任凭时光流转。", + "source": "现代诗句", + "length": 12, + "id": 176 + }, + { + "text": "博学多才,方能胸有成竹。", + "source": "现代格言", + "length": 12, + "id": 177 + }, + { + "text": "厚积薄发,成功在望。", + "source": "民间谚语", + "length": 10, + "id": 178 + }, + { + "text": "心怀梦想,步步登高。", + "source": "现代格言", + "length": 10, + "id": 179 + }, + { + "text": "天地之间,自有真情流露。", + "source": "现代诗句", + "length": 12, + "id": 180 + }, + { + "text": "时不我待,抓紧每分每秒。", + "source": "民间谚语", + "length": 12, + "id": 181 + }, + { + "text": "行胜于言,实干兴邦。", + "source": "民间谚语", + "length": 10, + "id": 182 + }, + { + "text": "心有多大,舞台就有多大。", + "source": "现代格言", + "length": 12, + "id": 183 + }, + { + "text": "山水有相逢,缘分不可强求。", + "source": "民间谚语", + "length": 13, + "id": 184 + }, + { + "text": "笑看人生风雨,坦然面对苦难。", + "source": "现代格言", + "length": 14, + "id": 185 + }, + { + "text": "春花秋月何时了,往事知多少。", + "source": "李商隐", + "length": 14, + "id": 186 + }, + { + "text": "故人虽远,情谊永存心间。", + "source": "现代格言", + "length": 12, + "id": 187 + }, + { + "text": "书山有路勤为径,学海无涯苦作舟。", + "source": "民间谚语", + "length": 16, + "id": 188 + }, + { + "text": "莫道桑榆晚,为霞尚满天。", + "source": "民间谚语", + "length": 12, + "id": 189 + }, + { + "text": "成功源于不懈的努力与坚持。", + "source": "现代格言", + "length": 13, + "id": 190 + }, + { + "text": "志当存高远,心须向阳开。", + "source": "现代格言", + "length": 12, + "id": 191 + }, + { + "text": "梦在远方,路在脚下。", + "source": "现代格言", + "length": 10, + "id": 192 + }, + { + "text": "千锤百炼,才能成就不凡之器。", + "source": "民间谚语", + "length": 14, + "id": 193 + }, + { + "text": "功夫不负有心人,付出总会有回报。", + "source": "民间谚语", + "length": 16, + "id": 194 + }, + { + "text": "岁寒知松柏,风霜见真情。", + "source": "《论语》", + "length": 12, + "id": 195 + }, + { + "text": "莫叹人生多苦难,笑对风云任逍遥。", + "source": "现代格言", + "length": 16, + "id": 196 + }, + { + "text": "山川异域,风月同天。", + "source": "现代格言", + "length": 10, + "id": 197 + }, + { + "text": "心若向阳,无畏悲伤。", + "source": "现代格言", + "length": 10, + "id": 198 + }, + { + "text": "静听松风,细看云卷云舒。", + "source": "现代诗句", + "length": 12, + "id": 199 + }, + { + "text": "岁月沉淀智慧,时光铸就经典。", + "source": "现代格言", + "length": 14, + "id": 200 + }, + { + "text": "寒梅傲雪,独自绽放芬芳。", + "source": "成语", + "length": 12, + "id": 201 + }, + { + "text": "心灵的成长,源于不断的挑战与磨练。", + "source": "现代格言", + "length": 17, + "id": 202 + }, + { + "text": "路在脚下,梦在心中,未来可期。", + "source": "现代格言", + "length": 15, + "id": 203 + }, + { + "text": "时光不负努力,未来定有光明。", + "source": "现代格言", + "length": 14, + "id": 204 + }, + { + "text": "人生的每一步,都是成长的印记。", + "source": "现代格言", + "length": 15, + "id": 205 + }, + { + "text": "心存希望,便能创造奇迹。", + "source": "现代格言", + "length": 12, + "id": 206 + }, + { + "text": "梦想不是空谈,而是脚踏实地的行动。", + "source": "现代格言", + "length": 17, + "id": 207 + }, + { + "text": "勇敢追梦,别让遗憾留在心间。", + "source": "现代格言", + "length": 14, + "id": 208 + }, + { + "text": "勤奋是成功的阶梯,汗水是成功的印记。", + "source": "现代格言", + "length": 18, + "id": 209 + }, + { + "text": "细节决定成败,态度塑造未来。", + "source": "现代格言", + "length": 14, + "id": 210 + }, + { + "text": "愿你前路光明,梦想成真。", + "source": "现代格言", + "length": 12, + "id": 211 + }, + { + "text": "世间所有的相遇都是久别重逢。", + "source": "现代格言", + "length": 14, + "id": 212 + }, + { + "text": "勇气不是没有恐惧,而是战胜恐惧。", + "source": "现代格言", + "length": 16, + "id": 213 + }, + { + "text": "只要心中有爱,生活便充满温暖。", + "source": "现代格言", + "length": 15, + "id": 214 + }, + { + "text": "经历风雨,方能见彩虹。", + "source": "现代格言", + "length": 11, + "id": 215 + }, + { + "text": "失败是成功之母,挫折是成长的催化剂。", + "source": "现代格言", + "length": 18, + "id": 216 + }, + { + "text": "梦想照进现实,勇气点燃未来。", + "source": "现代格言", + "length": 14, + "id": 217 + }, + { + "text": "成功没有捷径,唯有不断拼搏。", + "source": "现代格言", + "length": 14, + "id": 218 + }, + { + "text": "敢于梦想,勇于实现。", + "source": "现代格言", + "length": 10, + "id": 219 + }, + { + "text": "每一个黎明,都是希望的开始。", + "source": "现代格言", + "length": 14, + "id": 220 + }, + { + "text": "山河无恙,人间自有真情在。", + "source": "现代格言", + "length": 13, + "id": 221 + }, + { + "text": "心若自由,天地便宽广无限。", + "source": "现代格言", + "length": 13, + "id": 222 + }, + { + "text": "每一次努力,都是对未来的投资。", + "source": "现代格言", + "length": 15, + "id": 223 + }, + { + "text": "只要心中有梦,何惧前路漫漫。", + "source": "现代格言", + "length": 14, + "id": 224 + }, + { + "text": "天边的彩虹,总在风雨后出现。", + "source": "现代格言", + "length": 14, + "id": 225 + }, + { + "text": "学会感恩,生活便会回馈温暖。", + "source": "现代格言", + "length": 14, + "id": 226 + }, + { + "text": "逆境中成长,磨砺出不凡的灵魂。", + "source": "现代格言", + "length": 15, + "id": 227 + }, + { + "text": "永不放弃,是成功者最美的信念。", + "source": "现代格言", + "length": 15, + "id": 228 + }, + { + "text": "坚定信仰,必能突破重围。", + "source": "现代格言", + "length": 12, + "id": 229 + }, + { + "text": "人生如画,彩笔由心。", + "source": "现代格言", + "length": 10, + "id": 230 + }, + { + "text": "追求卓越,铸就非凡人生。", + "source": "现代格言", + "length": 12, + "id": 231 + }, + { + "text": "每天都是全新的开始。", + "source": "现代格言", + "length": 10, + "id": 232 + }, + { + "text": "生活的美好,在于发现平凡中的奇迹。", + "source": "现代格言", + "length": 17, + "id": 233 + }, + { + "text": "守望初心,坚定前行。", + "source": "现代格言", + "length": 10, + "id": 234 + }, + { + "text": "不惧风浪,勇敢追寻远方的梦。", + "source": "现代格言", + "length": 14, + "id": 235 + }, + { + "text": "笑对人生,无惧风雨兼程。", + "source": "现代格言", + "length": 12, + "id": 236 + }, + { + "text": "追梦的路上,从不缺少坚持与努力。", + "source": "现代格言", + "length": 16, + "id": 237 + }, + { + "text": "心若无畏,前路必定光明。", + "source": "现代格言", + "length": 12, + "id": 238 + }, + { + "text": "昨日种种,皆成过往烟云;今日努力,定将铸就辉煌未来。", + "source": "现代格言", + "length": 26, + "id": 239 + }, + { + "text": "心灵的自由,是无拘无束的飞翔。", + "source": "现代诗句", + "length": 15, + "id": 240 } ] } From 3a5b3783f25a6614ab1b001c47d83ee2b39a9ae3 Mon Sep 17 00:00:00 2001 From: sledgehammer999 Date: Mon, 3 Mar 2025 12:55:40 +0200 Subject: [PATCH 2/8] fix: Remove invalid words from Greek lang (@sledgehammer999) (#6300) ### Description These words aren't valid greek words. --- frontend/static/languages/greek_10k.json | 64 --------- frontend/static/languages/greek_1k.json | 7 - frontend/static/languages/greek_25k.json | 164 ----------------------- frontend/static/languages/greek_5k.json | 39 +----- 4 files changed, 1 insertion(+), 273 deletions(-) diff --git a/frontend/static/languages/greek_10k.json b/frontend/static/languages/greek_10k.json index 5b610b4bde00..3ec4e2ac4846 100644 --- a/frontend/static/languages/greek_10k.json +++ b/frontend/static/languages/greek_10k.json @@ -280,7 +280,6 @@ "ίσχυε", "ίσων", "ίσως", - "α", "αέρα", "αέριο", "αίγυπτο", @@ -360,7 +359,6 @@ "αδύνατη", "αδύνατο", "αδύνατον", - "αεγχπ", "αειφορία", "αειφόρο", "αειφόρος", @@ -395,7 +393,6 @@ "αθλητισμό", "αθλητισμός", "αθώων", - "αι", "αιγίδα", "αιγύπτου", "αιθιοπία", @@ -428,7 +425,6 @@ "ακαθάριστο", "ακαθάριστου", "ακατανόητο", - "ακε", "ακεραιότητα", "ακεραιότητας", "ακολουθήσει", @@ -855,7 +851,6 @@ "ανοιχτό", "ανοχή", "ανοχής", - "αντ", "αντάλλαγμα", "αντέδρασε", "αντί", @@ -1675,7 +1670,6 @@ "αύξηση", "αύξησης", "αύριο", - "β", "βάζει", "βάθος", "βάλει", @@ -1817,7 +1811,6 @@ "βιώσιμης", "βιώσιμο", "βιώσιμων", - "βλ", "βλάβες", "βλάπτει", "βλάπτουν", @@ -1906,7 +1899,6 @@ "βόρεια", "βόρειας", "βόρειο", - "γ", "γάδου", "γάζα", "γάζας", @@ -1933,7 +1925,6 @@ "γαλλική", "γαλλικής", "γαλλικό", - "γδ", "γείτονές", "γείτονες", "γεγονός", @@ -2070,7 +2061,6 @@ "γραφειοκρατική", "γραφειοκρατικό", "γρηγορότερα", - "γτο", "γυναίκα", "γυναίκας", "γυναίκες", @@ -2080,7 +2070,6 @@ "γύρος", "γύρου", "γύρω", - "δ", "δάνεια", "δάση", "δέκα", @@ -2147,7 +2136,6 @@ "δασμούς", "δασμών", "δασών", - "δδ", "δε", "δείγμα", "δείκτες", @@ -2165,7 +2153,6 @@ "δεδομένο", "δεδομένου", "δεδομένων", - "δεε", "δει", "δεικτών", "δεινά", @@ -2219,7 +2206,6 @@ "δεύτερον", "δεύτερος", "δεύτερου", - "δηλ", "δηλαδή", "δηλώνει", "δηλώνεται", @@ -2748,7 +2734,6 @@ "διπλώματα", "διπλώματος", "δις", - "δισ", "δισεκατομμυρίων", "δισεκατομμύρια", "δισεκατομμύριο", @@ -2757,8 +2742,6 @@ "διότι", "διώκονται", "διώξεις", - "δντ", - "δοε", "δοθεί", "δοθούν", "δοκιμές", @@ -2879,7 +2862,6 @@ "δώσουμε", "δώσουν", "δώσω", - "ε", "εάν", "είδα", "είδαμε", @@ -2970,7 +2952,6 @@ "εγχώριο", "εγχώριου", "εγώ", - "εδ", "εδάφη", "εδάφιο", "εδάφους", @@ -2980,7 +2961,6 @@ "εδραίωση", "εδραιωθεί", "εδώ", - "εε", "εθελοντικές", "εθελοντική", "εθελοντικής", @@ -3069,7 +3049,6 @@ "εισφορών", "εισόδημα", "εισόδου", - "ειτ", "εκ", "εκάστοτε", "εκατ", @@ -3173,7 +3152,6 @@ "εκσυγχρονισμού", "εκσυγχρονισμό", "εκσυγχρονισμός", - "εκτ", "εκτάκτου", "εκτάρια", "εκτάσεις", @@ -3264,7 +3242,6 @@ "ελεύθερου", "ελεύθερων", "ελιγμών", - "ελκ", "ελκυστική", "ελλάδα", "ελλάδας", @@ -3770,7 +3747,6 @@ "επαφής", "επαφίεται", "επαφών", - "επγ", "επείγον", "επείγοντα", "επείγουσα", @@ -4186,7 +4162,6 @@ "εσείς", "εσθονία", "εσθονίας", - "εσκ", "εστίαση", "εστιάζει", "εστιάζεται", @@ -4207,7 +4182,6 @@ "ετήσιας", "ετήσιες", "ετήσιο", - "ετα", "εταίρο", "εταίροι", "εταίρος", @@ -4224,12 +4198,9 @@ "εταιρικής", "εταιρικών", "εταιριών", - "ετεπ", "ετησίως", "ετικέτα", "ετοιμότητα", - "ετπ", - "ετπα", "ετών", "ευάλωτα", "ευάλωτες", @@ -4440,7 +4411,6 @@ "ζώνης", "ζώων", "η", - "ηβ", "ηγέτες", "ηγέτη", "ηγέτης", @@ -4489,7 +4459,6 @@ "ηπείρου", "ηρεμία", "ης", - "θ", "θάλασσα", "θάλασσας", "θάλασσες", @@ -4645,7 +4614,6 @@ "θόρυβο", "θύμα", "θύματα", - "ι", "ιανουάριο", "ιανουαρίου", "ιαπωνία", @@ -4694,8 +4662,6 @@ "ιερουσαλήμ", "ιθαγένεια", "ιθαγένειας", - "ιι", - "ιιι", "ικανές", "ικανή", "ικανοί", @@ -4801,7 +4767,6 @@ "ιταλικό", "ιχθύων", "ιό", - "κ", "κάθε", "κάλεσε", "κάλλιστα", @@ -4854,7 +4819,6 @@ "κίνησης", "κίνητρα", "κίνητρο", - "κα", "καίρια", "καίριας", "καίριο", @@ -5023,7 +4987,6 @@ "κανόνας", "κανόνες", "κανόνων", - "καπ", "καπνίσματος", "καπνού", "καπνό", @@ -5249,7 +5212,6 @@ "καύκασο", "καύσης", "καύσιμα", - "κγπ", "κείμενα", "κείμενο", "κειμένου", @@ -5309,7 +5271,6 @@ "κινούνται", "κιόλας", "κιότο", - "κκ", "κλάδο", "κλάδος", "κλάδου", @@ -5341,8 +5302,6 @@ "κλωνοποίησης", "κλωστοϋφαντουργίας", "κλωστοϋφαντουργικών", - "κμ", - "κοα", "κογκρέσο", "κοινά", "κοινές", @@ -5548,7 +5507,6 @@ "κώδικα", "κώδικας", "κώδικες", - "λ", "λάβαμε", "λάβει", "λάβετε", @@ -5672,7 +5630,6 @@ "λισαβόνας", "λισσαβόνας", "λιτότητας", - "λλά", "λογαριασμοί", "λογαριασμούς", "λογαριασμό", @@ -5692,7 +5649,6 @@ "λονδίνου", "λουξεμβούργο", "λουξεμβούργου", - "λπ", "λυθεί", "λυπάμαι", "λυπεί", @@ -5715,7 +5671,6 @@ "λύση", "λύσης", "λύσουμε", - "μ", "μάαστριχτ", "μάδας", "μάθαμε", @@ -6142,7 +6097,6 @@ "μόνον", "μόνος", "μόσχα", - "ν", "νάρκες", "νέα", "νέας", @@ -6584,7 +6538,6 @@ "ούτε", "ούτω", "ούτως", - "π", "πάγωμα", "πάει", "πάθος", @@ -6636,7 +6589,6 @@ "πίστωση", "πίσω", "πίτροπε", - "πα", "παίζει", "παίζουν", "παίξει", @@ -7196,7 +7148,6 @@ "πνεύματος", "ποδοσφαίρου", "ποδόσφαιρο", - "ποε", "ποιά", "ποιές", "ποια", @@ -7331,7 +7282,6 @@ "πούλμαν", "πούμε", "πούτιν", - "πρ", "πράγμα", "πράγματα", "πράγματι", @@ -7930,7 +7880,6 @@ "ριζοσπαστικής", "ροές", "ροή", - "ρομ", "ρομά", "ρουάντα", "ρουμανία", @@ -7972,8 +7921,6 @@ "ρώμης", "ρώσους", "ρώτησε", - "ς", - "σ", "σέβεται", "σέβομαι", "σέβονται", @@ -8011,9 +7958,7 @@ "σαφώς", "σαχάρα", "σαχάρας", - "σγπ", "σε", - "σεβ", "σεβασμού", "σεβασμό", "σεβασμός", @@ -8181,7 +8126,6 @@ "σπουδαιότητα", "σπουδαιότητας", "σπουδών", - "σρι", "στ", "στάδια", "στάδιο", @@ -8844,7 +8788,6 @@ "σύστημα", "σώμα", "σώματος", - "τ", "τάμπερε", "τάξεως", "τάξη", @@ -9069,7 +9012,6 @@ "τούτο", "τούτοις", "τούτου", - "τπε", "τράπεζα", "τράπεζας", "τράπεζες", @@ -9192,7 +9134,6 @@ "τύχη", "τύχουν", "τώρα", - "υ", "υγεία", "υγείας", "υγειονομική", @@ -9469,7 +9410,6 @@ "υρώπη", "υρώπης", "υστέρων", - "υτό", "υφίστανται", "υφίσταται", "υφιστάμενα", @@ -9493,7 +9433,6 @@ "υψηλότερο", "υψηλών", "υόρκη", - "φ", "φάκελο", "φάνηκε", "φάρμακα", @@ -9663,7 +9602,6 @@ "φύσεως", "φύση", "φύσης", - "χ", "χάγης", "χάλυβα", "χάνει", @@ -9916,12 +9854,10 @@ "ωφελήσει", "ωφελεί", "ωφεληθούν", - "ό", "όγκο", "όγκος", "όγκου", "όζοντος", - "όλ", "όλα", "όλες", "όλη", diff --git a/frontend/static/languages/greek_1k.json b/frontend/static/languages/greek_1k.json index dfe27d832f06..fb5fa2eca3b1 100644 --- a/frontend/static/languages/greek_1k.json +++ b/frontend/static/languages/greek_1k.json @@ -55,7 +55,6 @@ "ίδια", "ίδιο", "ίσως", - "α", "αίτημα", "αγορά", "αγοράς", @@ -267,7 +266,6 @@ "δύσκολο", "δώσει", "δώσουμε", - "ε", "εάν", "είδους", "είμαι", @@ -282,7 +280,6 @@ "εγκρίνει", "εγώ", "εδώ", - "εε", "εθνικά", "εθνικές", "εθνικό", @@ -434,7 +431,6 @@ "ιρλανδία", "ισχύ", "ισχύει", - "κ", "κάθε", "κάνει", "κάνουμε", @@ -642,7 +638,6 @@ "πάρα", "πέντε", "πέρα", - "πα", "παγκόσμια", "παγκόσμιο", "παιδιά", @@ -785,7 +780,6 @@ "πώς", "ρωσία", "ρόλο", - "σ", "σήμερα", "σίγουρα", "σαν", @@ -979,7 +973,6 @@ "ψηφοφορία", "ως", "ωστόσο", - "ό", "όλα", "όλες", "όλη", diff --git a/frontend/static/languages/greek_25k.json b/frontend/static/languages/greek_25k.json index 25073b0b9200..72a61deba41f 100644 --- a/frontend/static/languages/greek_25k.json +++ b/frontend/static/languages/greek_25k.json @@ -2,8 +2,6 @@ "name": "greek_25k", "bcp47": "el-GR", "words": [ - "ά", - "άαστριχτ", "άγγλος", "άγιος", "άγκυρα", @@ -95,7 +93,6 @@ "άμυλο", "άμυνα", "άμυνας", - "άν", "άναρχη", "άναρχης", "άνδεων", @@ -604,7 +601,6 @@ "ήταν", "ήτοι", "ήττα", - "ί", "ίβλο", "ίδια", "ίδιας", @@ -620,7 +616,6 @@ "ίδρυσή", "ίδρυση", "ίδρυσης", - "ίμαι", "ίνα", "ίναι", "ίνες", @@ -640,8 +635,6 @@ "ίσως", "ίχνη", "ίχνος", - "ΰ", - "α", "αέρα", "αέρας", "αέρια", @@ -874,8 +867,6 @@ "αδύνατη", "αδύνατο", "αδύνατον", - "αεγχπ", - "αεε", "αειφορία", "αειφορίας", "αειφόρο", @@ -955,7 +946,6 @@ "αθώος", "αθώους", "αθώων", - "αι", "αιγίδα", "αιγαίο", "αιγαίου", @@ -1064,7 +1054,6 @@ "ακατέργαστου", "ακατανόητη", "ακατανόητο", - "ακε", "ακεραιότητα", "ακεραιότητας", "ακινήτων", @@ -1176,7 +1165,6 @@ "ακύρωσε", "ακύρωση", "ακύρωσης", - "αλ", "αλήθεια", "αλήθειας", "αλήθειες", @@ -1232,7 +1220,6 @@ "αλκοολούχων", "αλκοόλ", "αλκοόλης", - "αλλ", "αλλά", "αλλάζει", "αλλάζοντας", @@ -2230,7 +2217,6 @@ "ανοχή", "ανοχής", "ανούσια", - "αντ", "αντάλλαγμα", "αντάξια", "αντάξιο", @@ -3986,7 +3972,6 @@ "ασιατικές", "ασιατική", "ασιατικών", - "ασκ", "ασκήθηκαν", "ασκήθηκε", "ασκήσαμε", @@ -4090,7 +4075,6 @@ "ασφαλούς", "ασφαλών", "ασφαλώς", - "ασχ", "ασχέτως", "ασχολήθηκα", "ασχολήθηκαν", @@ -4110,8 +4094,6 @@ "ασύλου", "ασύμβατες", "ασύμβατη", - "ατ", - "ατά", "ατέλειες", "ατασθαλίες", "ατασθαλιών", @@ -4235,7 +4217,6 @@ "αυστριακό", "αυστριακός", "αυστριακών", - "αυτ", "αυτά", "αυτάρκεια", "αυτάρκειας", @@ -4437,7 +4418,6 @@ "αύξηση", "αύξησης", "αύριο", - "β", "βάζει", "βάζοντας", "βάζουμε", @@ -4652,7 +4632,6 @@ "βεβαιώσω", "βεβιασμένα", "βεβιασμένη", - "βεκ", "βελγίου", "βελγικές", "βελγική", @@ -4792,7 +4771,6 @@ "βιώσιμων", "βιώσουμε", "βιώσουν", - "βλ", "βλάβες", "βλάβη", "βλάβης", @@ -4989,7 +4967,6 @@ "βόρειων", "βότκα", "βότκας", - "γ", "γάδου", "γάζα", "γάζας", @@ -5062,7 +5039,6 @@ "γαλλικός", "γαλλικών", "γαλλο", - "γδ", "γείτονά", "γείτονές", "γείτονα", @@ -5230,7 +5206,6 @@ "γηράσκει", "γης", "γι", - "γιά", "γιέλτσιν", "για", "γιαννάκου", @@ -5414,8 +5389,6 @@ "γροιλανδία", "γροιλανδίας", "γσδε", - "γτ", - "γτο", "γυναίκα", "γυναίκας", "γυναίκες", @@ -5440,7 +5413,6 @@ "γύρου", "γύρους", "γύρω", - "δ", "δάκρυα", "δάνεια", "δάνειο", @@ -5602,7 +5574,6 @@ "δασοκομία", "δασοκομίας", "δασών", - "δδ", "δε", "δεί", "δείγμα", @@ -5625,7 +5596,6 @@ "δείχνοντας", "δείχνουμε", "δείχνουν", - "δεδ", "δεδομένα", "δεδομένες", "δεδομένη", @@ -5633,7 +5603,6 @@ "δεδομένο", "δεδομένου", "δεδομένων", - "δεε", "δει", "δεικτών", "δειλά", @@ -5641,7 +5610,6 @@ "δεινά", "δεινή", "δεινών", - "δεκ", "δεκάδες", "δεκάδων", "δεκάρα", @@ -5726,7 +5694,6 @@ "δεσμών", "δεσπόζουσα", "δεσπόζουσας", - "δευ", "δευτέρα", "δευτέρας", "δευτέρου", @@ -5761,7 +5728,6 @@ "δεύτερος", "δεύτερου", "δη", - "δηλ", "δηλαδή", "δηλωθεί", "δηλώνει", @@ -5781,7 +5747,6 @@ "δηλώσουμε", "δηλώσουν", "δηλώσω", - "δημ", "δημαγωγία", "δημητρακόπουλου", "δημητριακά", @@ -7079,7 +7044,6 @@ "διπλώματος", "διπλών", "δις", - "δισ", "δισεκατ", "δισεκατομμυρίου", "δισεκατομμυρίων", @@ -7118,12 +7082,8 @@ "διώκονται", "διώξεις", "διώξεων", - "δκδ", - "δνο", - "δντ", "δοαε", "δογματική", - "δοε", "δοθέντος", "δοθεί", "δοθούν", @@ -7177,7 +7137,6 @@ "δορυφόρου", "δορυφόρους", "δορυφόρων", - "δος", "δοτών", "δουβλίνο", "δουβλίνου", @@ -7200,7 +7159,6 @@ "δούμε", "δούναβη", "δούναβης", - "δπδ", "δπχπ", "δρ", "δράμα", @@ -7434,7 +7392,6 @@ "δώσουν", "δώστε", "δώσω", - "ε", "εάν", "είδα", "είδαμε", @@ -7472,9 +7429,6 @@ "είχαν", "είχατε", "είχε", - "εαατ", - "εαβ", - "εακαα", "εαρινή", "εαρινό", "εαυτού", @@ -7621,7 +7575,6 @@ "εγκυρότητα", "εγκύους", "εγκύων", - "εγμ", "εγρήγορση", "εγταα", "εγτπε", @@ -7638,7 +7591,6 @@ "εγχώριων", "εγωισμό", "εγώ", - "εδ", "εδάφη", "εδάφιο", "εδάφους", @@ -7664,11 +7616,6 @@ "εδρεύουν", "εδρών", "εδώ", - "εε", - "εεα", - "εεε", - "εες", - "εζες", "εθίγη", "εθίγησαν", "εθελοντές", @@ -7720,7 +7667,6 @@ "εθνοτικής", "εθνοτικών", "εθνών", - "ει", "ειδάλλως", "ειδήμονες", "ειδήσεις", @@ -7883,7 +7829,6 @@ "εισόδημά", "εισόδημα", "εισόδου", - "ειτ", "εκ", "εκάστοτε", "εκάστου", @@ -7938,7 +7883,6 @@ "εκδώσει", "εκδώσουμε", "εκδώσουν", - "εκε", "εκεί", "εκείνα", "εκείνες", @@ -8143,7 +8087,6 @@ "εκσυγχρονισμός", "εκσυγχρονιστεί", "εκσυγχρονιστούν", - "εκτ", "εκτάκτου", "εκτάκτων", "εκτάρια", @@ -8281,7 +8224,6 @@ "εκχωρούνται", "εκχώρηση", "εκχώρησης", - "ελ", "ελάμβανε", "ελάτε", "ελάττωμα", @@ -8385,7 +8327,6 @@ "ελιγμούς", "ελιγμών", "ελικόπτερα", - "ελκ", "ελκυστήρες", "ελκυστήρων", "ελκυστικά", @@ -8870,7 +8811,6 @@ "ενθουσιώδη", "ενθουσιώδης", "ενθυμούμαστε", - "ενι", "ενιαία", "ενιαίας", "ενιαίες", @@ -9442,7 +9382,6 @@ "εορτασμού", "εορτασμό", "εορτασμός", - "εοχ", "επ", "επάγγελμά", "επάγγελμα", @@ -9710,7 +9649,6 @@ "επαφίεται", "επαφών", "επαχθείς", - "επγ", "επε", "επείγει", "επείγον", @@ -10725,7 +10663,6 @@ "ερμηνεύσει", "ερμηνεύσουμε", "ερντογάν", - "ερς", "ερυθραία", "ερυθραίας", "ερυθρού", @@ -10758,13 +10695,11 @@ "ερώτησής", "ερώτηση", "ερώτησης", - "ες", "εσάς", "εσδα", "εσείς", "εσθονία", "εσθονίας", - "εσκ", "εσκεμμένα", "εσκεμμένη", "εσπευσμένα", @@ -10811,7 +10746,6 @@ "εσωτερικών", "εσόδων", "εσύ", - "ετά", "ετέθη", "ετέθησαν", "ετέρου", @@ -10825,7 +10759,6 @@ "ετήσιους", "ετήσιων", "ετίθετο", - "ετα", "εταίρο", "εταίροι", "εταίρος", @@ -10847,8 +10780,6 @@ "εταιρικό", "εταιρικών", "εταιριών", - "ετε", - "ετεπ", "ετησίων", "ετησίως", "ετικέτα", @@ -10863,9 +10794,6 @@ "ετοιμότητά", "ετοιμότητα", "ετοιμότητας", - "ετπ", - "ετπα", - "ετππ", "ετσι", "ετυμηγορία", "ετών", @@ -10994,7 +10922,6 @@ "ευπρόσδεκτο", "ευπρόσδεκτοι", "ευπρόσδεκτος", - "ευρ", "ευρέος", "ευρέως", "ευρήματα", @@ -11252,7 +11179,6 @@ "εύστοχο", "εύχεται", "εύχομαι", - "ζ", "ζάγκρεμπ", "ζάχαρη", "ζάχαρης", @@ -11374,7 +11300,6 @@ "ζώου", "ζώων", "η", - "ηβ", "ηγέτες", "ηγέτη", "ηγέτης", @@ -11392,7 +11317,6 @@ "ηγηθεί", "ηγηθούμε", "ηγούνται", - "ηε", "ηθικά", "ηθικές", "ηθική", @@ -11476,8 +11400,6 @@ "ηχηρό", "ηχορύπανση", "ηχορύπανσης", - "θ", - "θά", "θάλασσές", "θάλασσα", "θάλασσας", @@ -11809,12 +11731,9 @@ "θύματα", "θύματος", "θύμισε", - "ι", "ιάπωνες", - "ια", "ιανουάριο", "ιανουαρίου", - "ιαπ", "ιαπωνία", "ιαπωνίας", "ιαπωνική", @@ -11934,8 +11853,6 @@ "ιθαγενών", "ιθυνόντων", "ιθύνοντες", - "ιι", - "ιιι", "ικανά", "ικανές", "ικανή", @@ -12196,7 +12113,6 @@ "ισότιμου", "ισότιμους", "ισότιμων", - "ιτ", "ιταλία", "ιταλίας", "ιταλικά", @@ -12219,7 +12135,6 @@ "ιωάννη", "ιό", "ιός", - "κ", "κάδμιο", "κάθαρση", "κάθε", @@ -12313,7 +12228,6 @@ "κίνησης", "κίνητρα", "κίνητρο", - "κα", "καΐρου", "καί", "καίρια", @@ -12518,7 +12432,6 @@ "καιρός", "καιρώ", "καιρών", - "κακ", "κακά", "κακάο", "κακές", @@ -12685,7 +12598,6 @@ "κανόνας", "κανόνες", "κανόνων", - "καπ", "καπιταλισμού", "καπιταλισμό", "καπιταλισμός", @@ -12732,7 +12644,6 @@ "καρτών", "καρχαρία", "καρχαριών", - "κας", "κασμίρ", "κασπία", "κασπίας", @@ -13345,8 +13256,6 @@ "καύσης", "καύσιμα", "καύσιμο", - "κγπ", - "κε", "κείμενα", "κείμενο", "κείμενό", @@ -13497,9 +13406,6 @@ "κιργιζιστάν", "κιόλας", "κιότο", - "κκ", - "κκε", - "κκερ", "κλάδο", "κλάδοι", "κλάδος", @@ -13569,9 +13475,6 @@ "κλωστοϋφαντουργίας", "κλωστοϋφαντουργικά", "κλωστοϋφαντουργικών", - "κμ", - "κο", - "κοα", "κογκρέσο", "κογκρέσου", "κογκό", @@ -13759,7 +13662,6 @@ "κούρδους", "κούρδων", "κούρσα", - "κπα", "κπαα", "κράτες", "κράτη", @@ -14071,7 +13973,6 @@ "κώδικας", "κώδικες", "κώδωνα", - "λ", "λάβαμε", "λάβατε", "λάβει", @@ -14191,7 +14092,6 @@ "λατινική", "λατινικής", "λατρείας", - "λαχ", "λαχανικά", "λαχανικών", "λαϊκά", @@ -14207,7 +14107,6 @@ "λαός", "λαών", "λβανία", - "λδκ", "λείπει", "λείπουν", "λείψει", @@ -14357,7 +14256,6 @@ "λιτότητα", "λιτότητας", "λιχτενστάιν", - "λλά", "λογής", "λογαριασμοί", "λογαριασμού", @@ -14412,8 +14310,6 @@ "λουξεμβουργιανή", "λουξεμβούργο", "λουξεμβούργου", - "λπ", - "λπίζω", "λυδία", "λυθεί", "λυθούν", @@ -14456,7 +14352,6 @@ "λύσης", "λύσουμε", "λύσουν", - "μ", "μάαστριχτ", "μάγχης", "μάδα", @@ -14707,7 +14602,6 @@ "μαύρο", "μαύρου", "μαύρων", - "μβα", "με", "μείγμα", "μείγματος", @@ -15462,7 +15356,6 @@ "μπόρεσε", "μπύρα", "μπύρας", - "μσε", "μυαλά", "μυαλό", "μυανμάρ", @@ -15512,7 +15405,6 @@ "μόχλευσης", "μύθο", "μύθος", - "ν", "νάπολη", "νάπολης", "νάπτυξης", @@ -15640,7 +15532,6 @@ "νιώθουν", "νιώθω", "νιώσουν", - "νο", "νοέμβριο", "νοήματος", "νοείται", @@ -16329,7 +16220,6 @@ "οπισθοδρόμησης", "οπισθοχώρηση", "οπλοστάσιο", - "οπο", "οποία", "οποίαν", "οποίας", @@ -16621,7 +16511,6 @@ "ούτε", "ούτω", "ούτως", - "π", "πάγια", "πάγου", "πάγωμα", @@ -16700,7 +16589,6 @@ "πέτυχε", "πέφτει", "πέφτουν", - "πή", "πήγα", "πήγαιναν", "πήγαινε", @@ -16732,7 +16620,6 @@ "πίτροπο", "πίτροπος", "πίτσμπουργκ", - "πα", "παίζει", "παίζεται", "παίζουμε", @@ -17489,7 +17376,6 @@ "παύσης", "παύσουν", "πγδμ", - "πδπ", "πεί", "πείθει", "πείθουν", @@ -18005,7 +17891,6 @@ "πλήττονται", "πλήττοντας", "πλήττουν", - "πλα", "πλαίσια", "πλαίσιο", "πλαίσιό", @@ -18179,7 +18064,6 @@ "ποδοσφαίρου", "ποδοσφαιριστών", "ποδόσφαιρο", - "ποε", "ποιά", "ποιές", "ποια", @@ -18238,7 +18122,6 @@ "ποιότητάς", "ποιότητα", "ποιότητας", - "πολ", "πολέμιοι", "πολέμου", "πολέμους", @@ -18455,9 +18338,6 @@ "πούλμαν", "πούμε", "πούτιν", - "ππ", - "πππ", - "πρ", "πράγα", "πράγας", "πράγμα", @@ -19457,7 +19337,6 @@ "προώθησε", "προώθηση", "προώθησης", - "πρς", "πρωί", "πρωθυπουργέ", "πρωθυπουργοί", @@ -19631,7 +19510,6 @@ "πρώτου", "πρώτους", "πρώτων", - "πσε", "πτέρυγα", "πτέρυγας", "πτέρυγες", @@ -19702,7 +19580,6 @@ "πωλούν", "πωλούνται", "πως", - "πό", "πόδι", "πόδια", "πόζναν", @@ -19752,8 +19629,6 @@ "πώληση", "πώλησης", "πώς", - "ρ", - "ράκ", "ράφια", "ρήγμα", "ρήνου", @@ -19850,14 +19725,12 @@ "ριζωμένες", "ριζωμένη", "ριστεράς", - "ρκκ", "ρλανδία", "ροές", "ροή", "ροής", "ροζέ", "ρολόι", - "ρομ", "ρομά", "ρουάντα", "ρουκέτες", @@ -19875,7 +19748,6 @@ "ρούμι", "ρούχα", "ροών", - "ρτ", "ρυζιού", "ρυθμίζει", "ρυθμίζεται", @@ -19957,10 +19829,7 @@ "ρώτησα", "ρώτησαν", "ρώτησε", - "ς", - "σ", "σάββατο", - "σάο", "σάρκα", "σάς", "σέβεται", @@ -20030,11 +19899,7 @@ "σαχέλ", "σαχράουι", "σβήσει", - "σγπ", - "σδ", - "σδλπ", "σε", - "σεβ", "σεβασμού", "σεβασμό", "σεβασμός", @@ -20050,8 +19915,6 @@ "σεβόμαστε", "σεβόμενη", "σεβόμενοι", - "σεε", - "σει", "σειρά", "σειράς", "σειρές", @@ -20093,7 +19956,6 @@ "σερβικής", "σερβικού", "σερβικό", - "σες", "σετ", "σεων", "σεϋχέλλες", @@ -20351,7 +20213,6 @@ "σλοβενική", "σλοβενικής", "σλόγκαν", - "σμδ", "σοβαρά", "σοβαρές", "σοβαρή", @@ -20461,13 +20322,10 @@ "σπουδαστές", "σπουδαστών", "σπουδών", - "σπς", "σπόρους", "σπόρων", "σραήλ", "σρεμπρένιτσα", - "σρι", - "σσκ", "στ", "στάδια", "στάδιο", @@ -20774,7 +20632,6 @@ "στόχου", "στόχους", "στόχων", - "συ", "συγγενείς", "συγγενικών", "συγγενών", @@ -22148,7 +22005,6 @@ "σώσει", "σώσουμε", "σώσουν", - "τ", "τάδε", "τάμπερε", "τάξεις", @@ -22261,7 +22117,6 @@ "ταμείου", "ταμείων", "ταμπού", - "ταν", "τανζανία", "τανζανίας", "ταξί", @@ -22289,7 +22144,6 @@ "ταπεινωτική", "ταραχές", "ταραχών", - "τας", "τασσόμαστε", "τατζικιστάν", "ταυτίζεται", @@ -22425,7 +22279,6 @@ "τερματισμός", "τερματιστεί", "τερματιστούν", - "τες", "τεσσάρων", "τεστ", "τετάρτη", @@ -22691,7 +22544,6 @@ "τούτοις", "τούτου", "τούτων", - "τπε", "τράπεζές", "τράπεζα", "τράπεζας", @@ -22994,7 +22846,6 @@ "τύχης", "τύχουν", "τώρα", - "υ", "υγεία", "υγείας", "υγειονομικά", @@ -23699,10 +23550,6 @@ "υστερούμε", "υστερούν", "υστρία", - "υτά", - "υτή", - "υτό", - "υτός", "υφάσματα", "υφήλιο", "υφίστανται", @@ -23724,7 +23571,6 @@ "υφισταμένων", "υφυπουργός", "υχαριστώ", - "υχε", "υψίστης", "υψηλά", "υψηλές", @@ -23750,7 +23596,6 @@ "υψώσουμε", "υόρκη", "υόρκης", - "φ", "φάκελο", "φάκελοι", "φάκελος", @@ -23854,7 +23699,6 @@ "φεβρουαρίου", "φεντεραλιστές", "φεντεραλιστική", - "φερ", "φερεγγυότητα", "φερεγγυότητας", "φετινή", @@ -23887,7 +23731,6 @@ "φθινοπώρου", "φθινόπωρο", "φιάσκο", - "φιλ", "φιλία", "φιλίας", "φιλανδία", @@ -24198,7 +24041,6 @@ "φώκιας", "φώκιες", "φώτα", - "χ", "χάγη", "χάγης", "χάθηκαν", @@ -24449,7 +24291,6 @@ "χουσεΐν", "χούντα", "χούντας", - "χρ", "χρέη", "χρέος", "χρέους", @@ -24701,7 +24542,6 @@ "χώρου", "χώρους", "χώρων", - "ψ", "ψάρι", "ψάρια", "ψέμα", @@ -24793,7 +24633,6 @@ "ψυχρός", "ψωμί", "ψύξης", - "ω", "ωθήσει", "ωθήσεις", "ωθήσουμε", @@ -24839,7 +24678,6 @@ "ωφελούν", "ωφελούνται", "ωφελούσε", - "ό", "όγδοο", "όγδοου", "όγκο", @@ -24847,7 +24685,6 @@ "όγκου", "όζον", "όζοντος", - "όλ", "όλα", "όλες", "όλη", @@ -24949,7 +24786,6 @@ "όψεως", "όψη", "όψιν", - "ύ", "ύδατά", "ύδατα", "ύδατος", diff --git a/frontend/static/languages/greek_5k.json b/frontend/static/languages/greek_5k.json index 2e247d5fa7f4..6fd2eb4e8109 100644 --- a/frontend/static/languages/greek_5k.json +++ b/frontend/static/languages/greek_5k.json @@ -169,7 +169,6 @@ "ίσης", "ίσων", "ίσως", - "α", "αέρα", "αέριο", "αίγυπτο", @@ -205,7 +204,6 @@ "αδύνατη", "αδύνατο", "αδύνατον", - "αεγχπ", "αειφόρο", "αειφόρου", "αεπ", @@ -228,7 +226,6 @@ "αιτιολογική", "αιτιολόγηση", "αιώνα", - "ακε", "ακεραιότητα", "ακολουθήσει", "ακολουθήσουμε", @@ -425,7 +422,6 @@ "ανοικτή", "ανοιχτά", "ανοιχτή", - "αντ", "αντί", "αντίδραση", "αντίδρασης", @@ -794,7 +790,6 @@ "αύξηση", "αύξησης", "αύριο", - "β", "βάθος", "βάρος", "βάρους", @@ -863,7 +858,6 @@ "βιώσιμη", "βιώσιμης", "βιώσιμο", - "βλ", "βλέπει", "βλέπουμε", "βλέπουν", @@ -994,14 +988,12 @@ "γραφείο", "γραφειοκρατία", "γραφειοκρατίας", - "γτο", "γυναίκα", "γυναίκας", "γυναίκες", "γυναικών", "γύρο", "γύρω", - "δ", "δάνεια", "δάση", "δέκα", @@ -1330,11 +1322,10 @@ "διορισμό", "διπλή", "διπλωμάτων", - "δισ", + "δις", "δισεκατομμυρίων", "δισεκατομμύρια", "διότι", - "δντ", "δοθεί", "δοθούν", "δοκιμές", @@ -1400,7 +1391,6 @@ "δώσουμε", "δώσουν", "δώσω", - "ε", "εάν", "είδαμε", "είδη", @@ -1460,7 +1450,6 @@ "εδαφική", "εδραίωση", "εδώ", - "εε", "εθελοντική", "εθνικά", "εθνικές", @@ -1553,7 +1542,6 @@ "εκστρατεία", "εκστρατείες", "εκσυγχρονισμό", - "εκτ", "εκτέλεση", "εκτέλεσης", "εκτίμησή", @@ -1602,7 +1590,6 @@ "ελεύθερο", "ελεύθερου", "ελεύθερων", - "ελκ", "ελλάδα", "ελλάδας", "ελλείψεις", @@ -2053,7 +2040,6 @@ "εσωτερικών", "εσόδων", "ετήσια", - "ετα", "εταίρο", "εταίροι", "εταίρος", @@ -2065,9 +2051,7 @@ "εταιρειών", "εταιρική", "εταιρικής", - "ετεπ", "ετησίως", - "ετπ", "ετών", "ευαίσθητο", "ευαισθησία", @@ -2295,7 +2279,6 @@ "θυμόμαστε", "θύμα", "θύματα", - "ι", "ιανουάριο", "ιανουαρίου", "ιαπωνία", @@ -2371,7 +2354,6 @@ "ιταλία", "ιταλίας", "ιταλική", - "κ", "κάθε", "κάλυψη", "κάναμε", @@ -2407,7 +2389,6 @@ "κίνηση", "κίνητρα", "κίνητρο", - "κα", "καίρια", "καίριας", "καίριο", @@ -2494,7 +2475,6 @@ "κανόνας", "κανόνες", "κανόνων", - "καπ", "καπνού", "καρδιά", "καρκίνου", @@ -2601,7 +2581,6 @@ "κατόπιν", "καυσίμων", "καύσιμα", - "κγπ", "κείμενα", "κείμενο", "κειμένου", @@ -2761,7 +2740,6 @@ "κύριος", "κύρος", "κώδικα", - "λ", "λάβαμε", "λάβει", "λάβετε", @@ -2838,7 +2816,6 @@ "λονδίνο", "λουξεμβούργο", "λουξεμβούργου", - "λπ", "λυπάμαι", "λυπηρό", "λυπούμαι", @@ -2854,7 +2831,6 @@ "λύσεων", "λύση", "λύσης", - "μ", "μάαστριχτ", "μάθουμε", "μάθω", @@ -3080,7 +3056,6 @@ "μόνοι", "μόνον", "μόνος", - "ν", "νέα", "νέας", "νέες", @@ -3311,7 +3286,6 @@ "οχημάτων", "ούτε", "ούτως", - "π", "πάει", "πάλι", "πάνε", @@ -3334,7 +3308,6 @@ "πίεσης", "πίστη", "πίσω", - "πα", "παίρνει", "παγκοσμίου", "παγκοσμίως", @@ -3620,7 +3593,6 @@ "πλοίων", "πνευματικής", "πνεύμα", - "ποε", "ποιά", "ποια", "ποιες", @@ -3987,7 +3959,6 @@ "ρατσισμού", "ρεαλιστική", "ρητά", - "ρομ", "ρομά", "ρουμανία", "ρουμανίας", @@ -4008,8 +3979,6 @@ "ρύπανση", "ρύπανσης", "ρώμης", - "ς", - "σ", "σέβεται", "σέβονται", "σένγκεν", @@ -4030,7 +3999,6 @@ "σαφείς", "σαφώς", "σε", - "σεβ", "σεβασμού", "σεβασμό", "σεβασμός", @@ -4454,7 +4422,6 @@ "σύστημα", "σώμα", "σώματος", - "τ", "τάξη", "τάξης", "τάσεις", @@ -4746,7 +4713,6 @@ "υπόλοιπο", "υπόψη", "υρώπη", - "υτό", "υφίστανται", "υφίσταται", "υφιστάμενες", @@ -4760,7 +4726,6 @@ "υψηλό", "υψηλότερα", "υψηλότερο", - "φ", "φάρμακα", "φάση", "φάσμα", @@ -4835,7 +4800,6 @@ "φύσεως", "φύση", "φύσης", - "χ", "χάραξη", "χάρη", "χάριν", @@ -4948,7 +4912,6 @@ "ωραία", "ως", "ωστόσο", - "ό", "όλα", "όλες", "όλη", From 660d856f9617c36784f3b13e5d430206c690123c Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Mon, 3 Mar 2025 12:08:30 +0100 Subject: [PATCH 3/8] refactor: use bearer auth instead of uid auth for tests (@fehmer) (#6318) --- backend/__tests__/__testData__/auth.ts | 44 +++ .../__tests__/api/controllers/admin.spec.ts | 57 ++-- .../__tests__/api/controllers/ape-key.spec.ts | 41 +-- .../__tests__/api/controllers/config.spec.ts | 24 +- .../api/controllers/configuration.spec.ts | 26 +- .../api/controllers/leaderboard.spec.ts | 51 +-- .../__tests__/api/controllers/preset.spec.ts | 63 ++-- backend/__tests__/api/controllers/psa.spec.ts | 6 +- .../__tests__/api/controllers/quotes.spec.ts | 75 +++-- .../__tests__/api/controllers/result.spec.ts | 48 ++- .../__tests__/api/controllers/user.spec.ts | 315 +++++++++--------- 11 files changed, 404 insertions(+), 346 deletions(-) diff --git a/backend/__tests__/__testData__/auth.ts b/backend/__tests__/__testData__/auth.ts index bd836d580e8f..844bf9bbd829 100644 --- a/backend/__tests__/__testData__/auth.ts +++ b/backend/__tests__/__testData__/auth.ts @@ -4,6 +4,8 @@ import { hash } from "bcrypt"; import { ObjectId } from "mongodb"; import { base64UrlEncode } from "../../src/utils/misc"; import * as ApeKeyDal from "../../src/dal/ape-keys"; +import { DecodedIdToken } from "firebase-admin/auth"; +import * as AuthUtils from "../../src/utils/auth"; export async function mockAuthenticateWithApeKey( uid: string, @@ -35,3 +37,45 @@ export async function mockAuthenticateWithApeKey( return base64UrlEncode(`${apeKeyId}.${apiKey}`); } + +export function mockBearerAuthentication(uid: string) { + const mockDecodedToken = { + uid, + email: "newuser@mail.com", + iat: Date.now(), + } as DecodedIdToken; + const verifyIdTokenMock = vi.spyOn(AuthUtils, "verifyIdToken"); + + return { + /** + * Reset the mock and return a default token. Call this method in the `beforeEach` of all tests. + */ + beforeEach: (): void => { + verifyIdTokenMock.mockReset(); + verifyIdTokenMock.mockResolvedValue(mockDecodedToken); + }, + /** + * Reset the mock results in the authentication to fail. + */ + noAuth: (): void => { + verifyIdTokenMock.mockReset(); + }, + /** + * verify the authentication has been called + */ + expectToHaveBeenCalled: (): void => { + expect(verifyIdTokenMock).toHaveBeenCalled(); + }, + /** + * modify the token returned by the mock. This can be used to e.g. return a stale token. + * @param customize + */ + modifyToken: (customize: Partial): void => { + verifyIdTokenMock.mockReset(); + verifyIdTokenMock.mockResolvedValue({ + ...mockDecodedToken, + ...customize, + }); + }, + }; +} diff --git a/backend/__tests__/api/controllers/admin.spec.ts b/backend/__tests__/api/controllers/admin.spec.ts index dfe81861e9e4..fcf26a005a0f 100644 --- a/backend/__tests__/api/controllers/admin.spec.ts +++ b/backend/__tests__/api/controllers/admin.spec.ts @@ -9,10 +9,12 @@ import GeorgeQueue from "../../../src/queues/george-queue"; import * as AuthUtil from "../../../src/utils/auth"; import _ from "lodash"; import { enableRateLimitExpects } from "../../__testData__/rate-limit"; +import { mockBearerAuthentication } from "../../__testData__/auth"; const mockApp = request(app); const configuration = Configuration.getCachedConfiguration(); const uid = new ObjectId().toHexString(); +const mockAuth = mockBearerAuthentication(uid); enableRateLimitExpects(); describe("AdminController", () => { @@ -22,6 +24,7 @@ describe("AdminController", () => { isAdminMock.mockReset(); await enableAdminEndpoints(true); isAdminMock.mockResolvedValue(true); + mockAuth.beforeEach(); }); describe("check for admin", () => { @@ -31,7 +34,7 @@ describe("AdminController", () => { //WHEN const { body } = await mockApp .get("/admin") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -44,17 +47,17 @@ describe("AdminController", () => { }); it("should fail if user is no admin", async () => { await expectFailForNonAdmin( - mockApp.get("/admin").set("authorization", `Uid ${uid}`) + mockApp.get("/admin").set("Authorization", `Bearer ${uid}`) ); }); it("should fail if admin endpoints are disabled", async () => { await expectFailForDisabledEndpoint( - mockApp.get("/admin").set("authorization", `Uid ${uid}`) + mockApp.get("/admin").set("Authorization", `Bearer ${uid}`) ); }); it("should be rate limited", async () => { await expect( - mockApp.get("/admin").set("authorization", `Uid ${uid}`) + mockApp.get("/admin").set("Authorization", `Bearer ${uid}`) ).toBeRateLimited({ max: 1, windowMs: 5000 }); }); }); @@ -82,7 +85,7 @@ describe("AdminController", () => { const { body } = await mockApp .post("/admin/toggleBan") .send({ uid: victimUid }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -109,7 +112,7 @@ describe("AdminController", () => { const { body } = await mockApp .post("/admin/toggleBan") .send({ uid: victimUid }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -132,7 +135,7 @@ describe("AdminController", () => { const { body } = await mockApp .post("/admin/toggleBan") .send({}) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -148,7 +151,7 @@ describe("AdminController", () => { const { body } = await mockApp .post("/admin/toggleBan") .send({ uid: new ObjectId().toHexString(), extra: "value" }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -162,7 +165,7 @@ describe("AdminController", () => { mockApp .post("/admin/toggleBan") .send({ uid: new ObjectId().toHexString() }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); it("should fail if admin endpoints are disabled", async () => { @@ -171,7 +174,7 @@ describe("AdminController", () => { mockApp .post("/admin/toggleBan") .send({ uid: new ObjectId().toHexString() }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); it("should be rate limited", async () => { @@ -187,7 +190,7 @@ describe("AdminController", () => { mockApp .post("/admin/toggleBan") .send({ uid: victimUid }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ).toBeRateLimited({ max: 1, windowMs: 5000 }); }); }); @@ -220,7 +223,7 @@ describe("AdminController", () => { .send({ reports: [{ reportId: reportOne.id }, { reportId: reportTwo.id }], }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); expect(body).toEqual({ @@ -236,7 +239,7 @@ describe("AdminController", () => { const { body } = await mockApp .post("/admin/report/accept") .send({}) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -249,7 +252,7 @@ describe("AdminController", () => { const { body } = await mockApp .post("/admin/report/accept") .send({ reports: [] }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -264,7 +267,7 @@ describe("AdminController", () => { const { body } = await mockApp .post("/admin/report/accept") .send({ reports: [{ reportId: "1", extra2: "value" }], extra: "value" }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -280,7 +283,7 @@ describe("AdminController", () => { mockApp .post("/admin/report/accept") .send({ reports: [] }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); it("should fail if admin endpoints are disabled", async () => { @@ -289,7 +292,7 @@ describe("AdminController", () => { mockApp .post("/admin/report/accept") .send({ reports: [] }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); it("should be rate limited", async () => { @@ -301,7 +304,7 @@ describe("AdminController", () => { mockApp .post("/admin/report/accept") .send({ reports: [{ reportId: "1" }] }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ).toBeRateLimited({ max: 1, windowMs: 5000 }); }); }); @@ -337,7 +340,7 @@ describe("AdminController", () => { { reportId: reportTwo.id }, ], }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); expect(body).toEqual({ @@ -353,7 +356,7 @@ describe("AdminController", () => { const { body } = await mockApp .post("/admin/report/reject") .send({}) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -366,7 +369,7 @@ describe("AdminController", () => { const { body } = await mockApp .post("/admin/report/reject") .send({ reports: [] }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -381,7 +384,7 @@ describe("AdminController", () => { const { body } = await mockApp .post("/admin/report/reject") .send({ reports: [{ reportId: "1", extra2: "value" }], extra: "value" }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -397,7 +400,7 @@ describe("AdminController", () => { mockApp .post("/admin/report/reject") .send({ reports: [] }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); it("should fail if admin endpoints are disabled", async () => { @@ -406,7 +409,7 @@ describe("AdminController", () => { mockApp .post("/admin/report/reject") .send({ reports: [] }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); it("should be rate limited", async () => { @@ -418,7 +421,7 @@ describe("AdminController", () => { mockApp .post("/admin/report/reject") .send({ reports: [{ reportId: "1" }] }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ).toBeRateLimited({ max: 1, windowMs: 5000 }); }); }); @@ -439,7 +442,7 @@ describe("AdminController", () => { const { body } = await mockApp .post("/admin/sendForgotPasswordEmail") .send({ email: "meowdec@example.com" }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -458,7 +461,7 @@ describe("AdminController", () => { mockApp .post("/admin/sendForgotPasswordEmail") .send({ email: "meowdec@example.com" }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ).toBeRateLimited({ max: 1, windowMs: 5000 }); }); }); diff --git a/backend/__tests__/api/controllers/ape-key.spec.ts b/backend/__tests__/api/controllers/ape-key.spec.ts index 7c05fbf2b5fa..5933f486aca5 100644 --- a/backend/__tests__/api/controllers/ape-key.spec.ts +++ b/backend/__tests__/api/controllers/ape-key.spec.ts @@ -5,10 +5,12 @@ import { ObjectId } from "mongodb"; import * as Configuration from "../../../src/init/configuration"; import * as UserDal from "../../../src/dal/user"; import _ from "lodash"; +import { mockBearerAuthentication } from "../../__testData__/auth"; const mockApp = request(app); const configuration = Configuration.getCachedConfiguration(); const uid = new ObjectId().toHexString(); +const mockAuth = mockBearerAuthentication(uid); describe("ApeKeyController", () => { const getUserMock = vi.spyOn(UserDal, "getPartialUser"); @@ -18,6 +20,7 @@ describe("ApeKeyController", () => { getUserMock.mockResolvedValue(user(uid, {})); vi.useFakeTimers(); vi.setSystemTime(1000); + mockAuth.beforeEach(); }); afterEach(() => { @@ -41,7 +44,7 @@ describe("ApeKeyController", () => { //WHEN const { body } = await mockApp .get("/ape-keys") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -66,12 +69,12 @@ describe("ApeKeyController", () => { }); it("should fail if apeKeys endpoints are disabled", async () => { await expectFailForDisabledEndpoint( - mockApp.get("/ape-keys").set("authorization", `Uid ${uid}`) + mockApp.get("/ape-keys").set("Authorization", `Bearer ${uid}`) ); }); it("should fail if user has no apeKey permissions", async () => { await expectFailForNoPermissions( - mockApp.get("/ape-keys").set("authorization", `Uid ${uid}`) + mockApp.get("/ape-keys").set("Authorization", `Bearer ${uid}`) ); }); }); @@ -96,7 +99,7 @@ describe("ApeKeyController", () => { //WHEN const { body } = await mockApp .post("/ape-keys") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ name: "test", enabled: true }) .expect(200); @@ -131,7 +134,7 @@ describe("ApeKeyController", () => { const { body } = await mockApp .post("/ape-keys") .send({}) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -145,7 +148,7 @@ describe("ApeKeyController", () => { const { body } = await mockApp .post("/ape-keys") .send({ name: "test", enabled: true, extra: "value" }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -163,7 +166,7 @@ describe("ApeKeyController", () => { const { body } = await mockApp .post("/ape-keys") .send({ name: "test", enabled: false }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(409); //THEN @@ -176,7 +179,7 @@ describe("ApeKeyController", () => { mockApp .post("/ape-keys") .send({ name: "test", enabled: false }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); it("should fail if user has no apeKey permissions", async () => { @@ -184,7 +187,7 @@ describe("ApeKeyController", () => { mockApp .post("/ape-keys") .send({ name: "test", enabled: false }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); }); @@ -205,7 +208,7 @@ describe("ApeKeyController", () => { const { body } = await mockApp .patch(`/ape-keys/${apeKeyId}`) .send({ name: "new", enabled: false }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -220,7 +223,7 @@ describe("ApeKeyController", () => { const { body } = await mockApp .patch(`/ape-keys/${apeKeyId}`) .send({ name: "new" }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -238,7 +241,7 @@ describe("ApeKeyController", () => { //WHEN await mockApp .patch(`/ape-keys/`) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(404); }); it("should fail with extra properties", async () => { @@ -248,7 +251,7 @@ describe("ApeKeyController", () => { const { body } = await mockApp .patch(`/ape-keys/${apeKeyId}`) .send({ name: "new", extra: "value" }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -262,7 +265,7 @@ describe("ApeKeyController", () => { mockApp .patch(`/ape-keys/${apeKeyId}`) .send({ name: "test", enabled: false }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); it("should fail if user has no apeKey permissions", async () => { @@ -270,7 +273,7 @@ describe("ApeKeyController", () => { mockApp .patch(`/ape-keys/${apeKeyId}`) .send({ name: "test", enabled: false }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); }); @@ -289,7 +292,7 @@ describe("ApeKeyController", () => { //WHEN const { body } = await mockApp .delete(`/ape-keys/${apeKeyId}`) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -302,14 +305,14 @@ describe("ApeKeyController", () => { //WHEN await mockApp .delete(`/ape-keys/`) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(404); }); it("should fail if apeKeys endpoints are disabled", async () => { await expectFailForDisabledEndpoint( mockApp .delete(`/ape-keys/${apeKeyId}`) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); @@ -317,7 +320,7 @@ describe("ApeKeyController", () => { await expectFailForNoPermissions( mockApp .delete(`/ape-keys/${apeKeyId}`) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) ); }); }); diff --git a/backend/__tests__/api/controllers/config.spec.ts b/backend/__tests__/api/controllers/config.spec.ts index a3c50fb6882b..3cbf6dc89b56 100644 --- a/backend/__tests__/api/controllers/config.spec.ts +++ b/backend/__tests__/api/controllers/config.spec.ts @@ -2,9 +2,15 @@ import request from "supertest"; import app from "../../../src/app"; import * as ConfigDal from "../../../src/dal/config"; import { ObjectId } from "mongodb"; +import { mockBearerAuthentication } from "../../__testData__/auth"; const mockApp = request(app); +const uid = new ObjectId().toHexString(); +const mockAuth = mockBearerAuthentication(uid); describe("ConfigController", () => { + beforeEach(() => { + mockAuth.beforeEach(); + }); describe("get config", () => { const getConfigMock = vi.spyOn(ConfigDal, "getConfig"); @@ -16,14 +22,14 @@ describe("ConfigController", () => { //GIVEN getConfigMock.mockResolvedValue({ _id: new ObjectId(), - uid: "123456789", + uid: uid, config: { language: "english" }, }); //WHEN const { body } = await mockApp .get("/configs") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -32,7 +38,7 @@ describe("ConfigController", () => { data: { language: "english" }, }); - expect(getConfigMock).toHaveBeenCalledWith("123456789"); + expect(getConfigMock).toHaveBeenCalledWith(uid); }); }); describe("update config", () => { @@ -49,7 +55,7 @@ describe("ConfigController", () => { //WHEN const { body } = await mockApp .patch("/configs") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ language: "english" }) .expect(200); @@ -60,7 +66,7 @@ describe("ConfigController", () => { data: null, }); - expect(saveConfigMock).toHaveBeenCalledWith("123456789", { + expect(saveConfigMock).toHaveBeenCalledWith(uid, { language: "english", }); }); @@ -68,7 +74,7 @@ describe("ConfigController", () => { //WHEN const { body } = await mockApp .patch("/configs") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ unknownValue: "unknown" }) .expect(422); @@ -85,7 +91,7 @@ describe("ConfigController", () => { //WHEN const { body } = await mockApp .patch("/configs") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ autoSwitchTheme: "yes", confidenceMode: "pretty" }) .expect(422); @@ -117,7 +123,7 @@ describe("ConfigController", () => { const { body } = await mockApp .delete("/configs") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -126,7 +132,7 @@ describe("ConfigController", () => { data: null, }); - expect(deleteConfigMock).toHaveBeenCalledWith("123456789"); + expect(deleteConfigMock).toHaveBeenCalledWith(uid); }); }); }); diff --git a/backend/__tests__/api/controllers/configuration.spec.ts b/backend/__tests__/api/controllers/configuration.spec.ts index e5cc0fb81660..ce38520197da 100644 --- a/backend/__tests__/api/controllers/configuration.spec.ts +++ b/backend/__tests__/api/controllers/configuration.spec.ts @@ -8,26 +8,20 @@ import * as Configuration from "../../../src/init/configuration"; import type { Configuration as ConfigurationType } from "@monkeytype/contracts/schemas/configuration"; import { ObjectId } from "mongodb"; import * as Misc from "../../../src/utils/misc"; -import { DecodedIdToken } from "firebase-admin/auth"; -import * as AuthUtils from "../../../src/utils/auth"; import * as AdminUuids from "../../../src/dal/admin-uids"; +import { mockBearerAuthentication } from "../../__testData__/auth"; const mockApp = request(app); const uid = new ObjectId().toHexString(); -const mockDecodedToken = { - uid, - email: "newuser@mail.com", - iat: 0, -} as DecodedIdToken; describe("Configuration Controller", () => { const isDevEnvironmentMock = vi.spyOn(Misc, "isDevEnvironment"); - const verifyIdTokenMock = vi.spyOn(AuthUtils, "verifyIdToken"); + const mockAuth = mockBearerAuthentication(uid); const isAdminMock = vi.spyOn(AdminUuids, "isAdmin"); beforeEach(() => { isAdminMock.mockReset(); - verifyIdTokenMock.mockReset(); + mockAuth.beforeEach(); isDevEnvironmentMock.mockReset(); isDevEnvironmentMock.mockReturnValue(true); @@ -52,7 +46,7 @@ describe("Configuration Controller", () => { describe("getConfigurationSchema", () => { it("should get without authentication on dev", async () => { //GIVEN - + mockAuth.noAuth(); //WHEN const { body } = await mockApp.get("/configuration/schema").expect(200); @@ -73,7 +67,6 @@ describe("Configuration Controller", () => { it("should get with authentication on prod", async () => { //GIVEN isDevEnvironmentMock.mockReturnValue(false); - verifyIdTokenMock.mockResolvedValue(mockDecodedToken); //WHEN const { body } = await mockApp @@ -87,12 +80,11 @@ describe("Configuration Controller", () => { data: CONFIGURATION_FORM_SCHEMA, }); - expect(verifyIdTokenMock).toHaveBeenCalled(); + mockAuth.expectToHaveBeenCalled(); }); it("should fail with non-admin user on prod", async () => { //GIVEN isDevEnvironmentMock.mockReturnValue(false); - verifyIdTokenMock.mockResolvedValue(mockDecodedToken); isAdminMock.mockResolvedValue(false); //WHEN @@ -103,7 +95,7 @@ describe("Configuration Controller", () => { //THEN expect(body.message).toEqual("You don't have permission to do this."); - expect(verifyIdTokenMock).toHaveBeenCalled(); + mockAuth.expectToHaveBeenCalled(); expect(isAdminMock).toHaveBeenCalledWith(uid); }); }); @@ -120,6 +112,7 @@ describe("Configuration Controller", () => { it("should update without authentication on dev", async () => { //GIVEN + mockAuth.noAuth(); const patch = { users: { premium: { @@ -145,6 +138,7 @@ describe("Configuration Controller", () => { it("should fail update without authentication on prod", async () => { //GIVEN + mockAuth.noAuth(); isDevEnvironmentMock.mockReturnValue(false); //WHEN @@ -159,7 +153,6 @@ describe("Configuration Controller", () => { it("should update with authentication on prod", async () => { //GIVEN isDevEnvironmentMock.mockReturnValue(false); - verifyIdTokenMock.mockResolvedValue(mockDecodedToken); //WHEN await mockApp @@ -170,14 +163,13 @@ describe("Configuration Controller", () => { //THEN expect(patchConfigurationMock).toHaveBeenCalled(); - expect(verifyIdTokenMock).toHaveBeenCalled(); + mockAuth.expectToHaveBeenCalled(); }); it("should fail for non admin users on prod", async () => { //GIVEN isDevEnvironmentMock.mockReturnValue(false); isAdminMock.mockResolvedValue(false); - verifyIdTokenMock.mockResolvedValue(mockDecodedToken); //WHEN await mockApp diff --git a/backend/__tests__/api/controllers/leaderboard.spec.ts b/backend/__tests__/api/controllers/leaderboard.spec.ts index 46a612f87f75..a0afc50c2579 100644 --- a/backend/__tests__/api/controllers/leaderboard.spec.ts +++ b/backend/__tests__/api/controllers/leaderboard.spec.ts @@ -6,12 +6,16 @@ import * as LeaderboardDal from "../../../src/dal/leaderboards"; import * as DailyLeaderboards from "../../../src/utils/daily-leaderboards"; import * as WeeklyXpLeaderboard from "../../../src/services/weekly-xp-leaderboard"; import * as Configuration from "../../../src/init/configuration"; -import { mockAuthenticateWithApeKey } from "../../__testData__/auth"; +import { + mockAuthenticateWithApeKey, + mockBearerAuthentication, +} from "../../__testData__/auth"; import { XpLeaderboardEntry } from "@monkeytype/contracts/schemas/leaderboards"; const mockApp = request(app); const configuration = Configuration.getCachedConfiguration(); const uid = new ObjectId().toHexString(); +const mockAuth = mockBearerAuthentication(uid); const allModes = [ "10", @@ -27,6 +31,9 @@ const allModes = [ ]; describe("Loaderboard Controller", () => { + beforeEach(() => { + mockAuth.beforeEach(); + }); describe("get leaderboard", () => { const getLeaderboardMock = vi.spyOn(LeaderboardDal, "get"); @@ -260,7 +267,7 @@ describe("Loaderboard Controller", () => { const { body } = await mockApp .get("/leaderboards/rank") .query({ language: "english", mode: "time", mode2: "60" }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -291,7 +298,7 @@ describe("Loaderboard Controller", () => { for (const mode of ["time", "words", "quote", "zen", "custom"]) { const response = await mockApp .get("/leaderboards/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ language: "english", mode, mode2: "custom" }); expect(response.status, "for mode " + mode).toEqual(200); } @@ -302,7 +309,7 @@ describe("Loaderboard Controller", () => { for (const mode2 of allModes) { const response = await mockApp .get("/leaderboards/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ language: "english", mode: "words", mode2 }); expect(response.status, "for mode2 " + mode2).toEqual(200); @@ -311,7 +318,7 @@ describe("Loaderboard Controller", () => { it("fails for missing query", async () => { const { body } = await mockApp .get("/leaderboards/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -331,7 +338,7 @@ describe("Loaderboard Controller", () => { mode: "unknownMode", mode2: "unknownMode2", }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -352,7 +359,7 @@ describe("Loaderboard Controller", () => { mode2: "60", extra: "value", }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -372,7 +379,7 @@ describe("Loaderboard Controller", () => { mode: "time", mode2: "60", }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(503); expect(body.message).toEqual( @@ -743,7 +750,7 @@ describe("Loaderboard Controller", () => { //WHEN const { body } = await mockApp .get("/leaderboards/daily/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ language: "english", mode: "time", mode2: "60" }) .expect(200); @@ -768,7 +775,7 @@ describe("Loaderboard Controller", () => { const { body } = await mockApp .get("/leaderboards/daily/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(503); expect(body.message).toEqual( @@ -779,7 +786,7 @@ describe("Loaderboard Controller", () => { for (const mode of ["time", "words", "quote", "zen", "custom"]) { const response = await mockApp .get("/leaderboards/daily/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ language: "english", mode, mode2: "custom" }); expect(response.status, "for mode " + mode).toEqual(200); } @@ -788,7 +795,7 @@ describe("Loaderboard Controller", () => { for (const mode2 of allModes) { const response = await mockApp .get("/leaderboards/daily/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ language: "english", mode: "words", mode2 }); expect(response.status, "for mode2 " + mode2).toEqual(200); @@ -797,7 +804,7 @@ describe("Loaderboard Controller", () => { it("fails for missing query", async () => { const { body } = await mockApp .get("/leaderboards/daily/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -817,7 +824,7 @@ describe("Loaderboard Controller", () => { mode: "unknownMode", mode2: "unknownMode2", }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -838,7 +845,7 @@ describe("Loaderboard Controller", () => { mode2: "60", extra: "value", }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -853,7 +860,7 @@ describe("Loaderboard Controller", () => { //WHEN const { body } = await mockApp .get("/leaderboards/daily/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ language: "english", mode: "time", @@ -1098,7 +1105,7 @@ describe("Loaderboard Controller", () => { //WHEN const { body } = await mockApp .get("/leaderboards/xp/weekly/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -1136,7 +1143,7 @@ describe("Loaderboard Controller", () => { const { body } = await mockApp .get("/leaderboards/xp/weekly/rank") .query({ weeksBefore: 1 }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -1157,7 +1164,7 @@ describe("Loaderboard Controller", () => { const { body } = await mockApp .get("/leaderboards/xp/weekly/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(503); expect(body.message).toEqual( @@ -1168,7 +1175,7 @@ describe("Loaderboard Controller", () => { it("fails for weeksBefore not one", async () => { const { body } = await mockApp .get("/leaderboards/xp/weekly/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ weeksBefore: 2, }) @@ -1183,7 +1190,7 @@ describe("Loaderboard Controller", () => { it("fails for unknown query", async () => { const { body } = await mockApp .get("/leaderboards/xp/weekly/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ extra: "value", }) @@ -1202,7 +1209,7 @@ describe("Loaderboard Controller", () => { //WHEN const { body } = await mockApp .get("/leaderboards/xp/weekly/rank") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(404); expect(body.message).toEqual("XP leaderboard for this week not found."); diff --git a/backend/__tests__/api/controllers/preset.spec.ts b/backend/__tests__/api/controllers/preset.spec.ts index 4239f26eb6fb..3d9f5eb80acb 100644 --- a/backend/__tests__/api/controllers/preset.spec.ts +++ b/backend/__tests__/api/controllers/preset.spec.ts @@ -2,9 +2,16 @@ import request from "supertest"; import app from "../../../src/app"; import * as PresetDal from "../../../src/dal/preset"; import { ObjectId } from "mongodb"; +import { mockBearerAuthentication } from "../../__testData__/auth"; const mockApp = request(app); +const uid = new ObjectId().toHexString(); +const mockAuth = mockBearerAuthentication(uid); describe("PresetController", () => { + beforeEach(() => { + mockAuth.beforeEach(); + }); + describe("get presets", () => { const getPresetsMock = vi.spyOn(PresetDal, "getPresets"); @@ -16,13 +23,13 @@ describe("PresetController", () => { //GIVEN const presetOne = { _id: new ObjectId(), - uid: "123456789", + uid: uid, name: "test1", config: { language: "english" }, }; const presetTwo = { _id: new ObjectId(), - uid: "123456789", + uid: uid, name: "test2", settingGroups: ["hideElements"], config: { @@ -38,7 +45,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .get("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -64,7 +71,7 @@ describe("PresetController", () => { ], }); - expect(getPresetsMock).toHaveBeenCalledWith("123456789"); + expect(getPresetsMock).toHaveBeenCalledWith(uid); }); it("should return empty array if user has no presets", async () => { //GIVEN @@ -73,7 +80,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .get("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -82,7 +89,7 @@ describe("PresetController", () => { data: [], }); - expect(getPresetsMock).toHaveBeenCalledWith("123456789"); + expect(getPresetsMock).toHaveBeenCalledWith(uid); }); }); @@ -100,7 +107,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .post("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ name: "new", @@ -117,7 +124,7 @@ describe("PresetController", () => { data: { presetId: "1" }, }); - expect(addPresetMock).toHaveBeenCalledWith("123456789", { + expect(addPresetMock).toHaveBeenCalledWith(uid, { name: "new", config: { language: "english", tags: ["one", "two"] }, }); @@ -129,7 +136,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .post("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ name: "new", @@ -149,7 +156,7 @@ describe("PresetController", () => { data: { presetId: "1" }, }); - expect(addPresetMock).toHaveBeenCalledWith("123456789", { + expect(addPresetMock).toHaveBeenCalledWith(uid, { name: "new", settingGroups: ["hideElements"], config: { @@ -164,7 +171,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .post("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ name: "update", @@ -189,7 +196,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .post("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ name: "new", config: {} }) .expect(200); @@ -200,7 +207,7 @@ describe("PresetController", () => { data: { presetId: "1" }, }); - expect(addPresetMock).toHaveBeenCalledWith("123456789", { + expect(addPresetMock).toHaveBeenCalledWith(uid, { name: "new", config: {}, }); @@ -209,7 +216,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .post("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({}) .expect(422); @@ -224,7 +231,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .post("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ _id: "1", @@ -255,7 +262,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .post("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ name: "new", @@ -293,7 +300,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .patch("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ _id: "1", @@ -311,7 +318,7 @@ describe("PresetController", () => { data: null, }); - expect(editPresetMock).toHaveBeenCalledWith("123456789", { + expect(editPresetMock).toHaveBeenCalledWith(uid, { _id: "1", name: "new", config: { language: "english", tags: ["one", "two"] }, @@ -324,7 +331,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .patch("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ _id: "1", @@ -345,7 +352,7 @@ describe("PresetController", () => { data: null, }); - expect(editPresetMock).toHaveBeenCalledWith("123456789", { + expect(editPresetMock).toHaveBeenCalledWith(uid, { _id: "1", name: "new", settingGroups: ["hideElements"], @@ -365,7 +372,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .patch("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ _id: "1", name: "new", config: {} }) .expect(200); @@ -376,7 +383,7 @@ describe("PresetController", () => { data: null, }); - expect(editPresetMock).toHaveBeenCalledWith("123456789", { + expect(editPresetMock).toHaveBeenCalledWith(uid, { _id: "1", name: "new", config: {}, @@ -386,7 +393,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .patch("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({}) .expect(422); @@ -401,7 +408,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .patch("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ _id: "1", @@ -434,7 +441,7 @@ describe("PresetController", () => { //WHEN const { body } = await mockApp .patch("/presets") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .accept("application/json") .send({ _id: "1", @@ -473,7 +480,7 @@ describe("PresetController", () => { const { body } = await mockApp .delete("/presets/1") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -482,7 +489,7 @@ describe("PresetController", () => { data: null, }); - expect(deletePresetMock).toHaveBeenCalledWith("123456789", "1"); + expect(deletePresetMock).toHaveBeenCalledWith(uid, "1"); }); it("should fail without preset _id", async () => { //GIVEN @@ -491,7 +498,7 @@ describe("PresetController", () => { //WHEN await mockApp .delete("/presets/") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .expect(404); expect(deletePresetMock).not.toHaveBeenCalled(); diff --git a/backend/__tests__/api/controllers/psa.spec.ts b/backend/__tests__/api/controllers/psa.spec.ts index 9dcff487fda4..99ec2249b1cb 100644 --- a/backend/__tests__/api/controllers/psa.spec.ts +++ b/backend/__tests__/api/controllers/psa.spec.ts @@ -3,7 +3,10 @@ import app from "../../../src/app"; import * as PsaDal from "../../../src/dal/psa"; import * as Prometheus from "../../../src/utils/prometheus"; import { ObjectId } from "mongodb"; +import { mockBearerAuthentication } from "../../__testData__/auth"; const mockApp = request(app); +const uid = new ObjectId().toHexString(); +const mockAuth = mockBearerAuthentication(uid); describe("Psa Controller", () => { describe("get psa", () => { @@ -13,6 +16,7 @@ describe("Psa Controller", () => { afterEach(() => { getPsaMock.mockReset(); recordClientVersionMock.mockReset(); + mockAuth.beforeEach(); }); it("get psas without authorization", async () => { @@ -62,7 +66,7 @@ describe("Psa Controller", () => { it("get psas with authorization", async () => { await mockApp .get("/psas") - .set("authorization", `Uid 123456789`) + .set("Authorization", `Bearer ${uid}`) .expect(200); }); diff --git a/backend/__tests__/api/controllers/quotes.spec.ts b/backend/__tests__/api/controllers/quotes.spec.ts index 3a6a5fe8a669..4aeafa62bf1f 100644 --- a/backend/__tests__/api/controllers/quotes.spec.ts +++ b/backend/__tests__/api/controllers/quotes.spec.ts @@ -10,11 +10,13 @@ import * as Captcha from "../../../src/utils/captcha"; import { ObjectId } from "mongodb"; import _ from "lodash"; import { ApproveQuote } from "@monkeytype/contracts/schemas/quotes"; +import { mockBearerAuthentication } from "../../__testData__/auth"; const mockApp = request(app); const configuration = Configuration.getCachedConfiguration(); const uid = new ObjectId().toHexString(); +const mockAuth = mockBearerAuthentication(uid); describe("QuotesController", () => { const getPartialUserMock = vi.spyOn(UserDal, "getPartialUser"); @@ -24,6 +26,7 @@ describe("QuotesController", () => { const user = { quoteMod: true, name: "Bob" } as any; getPartialUserMock.mockReset().mockResolvedValue(user); + mockAuth.beforeEach(); }); describe("getQuotes", () => { @@ -58,7 +61,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .get("/quotes") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -82,7 +85,7 @@ describe("QuotesController", () => { //WHEN await mockApp .get("/quotes") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -98,7 +101,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .get("/quotes") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(403); //THEN @@ -113,7 +116,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .get("/quotes") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(403); //THEN @@ -178,7 +181,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send(newQuote) .expect(200); @@ -207,7 +210,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(503); //THEN @@ -219,7 +222,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -243,7 +246,7 @@ describe("QuotesController", () => { captcha: "captcha", extra: "value", }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -265,7 +268,7 @@ describe("QuotesController", () => { language: "english", captcha: "captcha", }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -297,7 +300,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/approve") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId, editText: "editedText", @@ -329,7 +332,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/approve") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId, editText: null, editSource: null }) .expect(200); @@ -357,7 +360,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/approve") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId }) .expect(200); @@ -378,7 +381,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/approve") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -391,7 +394,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/approve") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: new ObjectId().toHexString(), extra: "value" }) .expect(422); @@ -408,7 +411,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/approve") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: new ObjectId().toHexString() }) .expect(403); @@ -436,7 +439,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/reject") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId }) .expect(200); @@ -451,7 +454,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/reject") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); @@ -468,7 +471,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/reject") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId, extra: "value" }) .expect(422); @@ -486,7 +489,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/reject") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId }) .expect(403); @@ -523,7 +526,7 @@ describe("QuotesController", () => { const { body } = await mockApp .get("/quotes/rating") .query({ quoteId: 42, language: "english" }) - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -538,7 +541,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .get("/quotes/rating") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -551,7 +554,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .get("/quotes/rating") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ quoteId: 42, language: "english", extra: "value" }) .expect(422); @@ -586,7 +589,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/rating") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: 23, rating: 4, @@ -616,7 +619,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/rating") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: 23, rating: 2, @@ -648,7 +651,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/rating") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: 23, rating: 4, @@ -674,7 +677,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/rating") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -691,7 +694,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/rating") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: 23, language: "english", rating: 5, extra: "value" }) .expect(422); @@ -705,7 +708,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/rating") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: 23, language: "english", rating: 0 }) .expect(422); @@ -721,7 +724,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/rating") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: 23, language: "english", rating: 6 }) .expect(422); @@ -736,7 +739,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/rating") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: 23, language: "english", rating: 2.5 }) .expect(422); //THEN @@ -768,7 +771,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/report") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: "23", //quoteId is string on this endpoint quoteLanguage: "english", @@ -802,7 +805,7 @@ describe("QuotesController", () => { it("should report quote without comment", async () => { await mockApp .post("/quotes/report") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: "23", //quoteId is string on this endpoint quoteLanguage: "english", @@ -814,7 +817,7 @@ describe("QuotesController", () => { it("should report quote with empty comment", async () => { await mockApp .post("/quotes/report") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ quoteId: "23", //quoteId is string on this endpoint quoteLanguage: "english", @@ -828,7 +831,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/report") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -849,7 +852,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/report") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(503); //THEN @@ -864,7 +867,7 @@ describe("QuotesController", () => { //WHEN const { body } = await mockApp .post("/quotes/report") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(403); //THEN diff --git a/backend/__tests__/api/controllers/result.spec.ts b/backend/__tests__/api/controllers/result.spec.ts index bffa1e53851e..7e76109b4fd9 100644 --- a/backend/__tests__/api/controllers/result.spec.ts +++ b/backend/__tests__/api/controllers/result.spec.ts @@ -5,31 +5,23 @@ import * as Configuration from "../../../src/init/configuration"; import * as ResultDal from "../../../src/dal/result"; import * as UserDal from "../../../src/dal/user"; import * as LogsDal from "../../../src/dal/logs"; -import * as AuthUtils from "../../../src/utils/auth"; -import { DecodedIdToken } from "firebase-admin/lib/auth/token-verifier"; import { ObjectId } from "mongodb"; -import { mockAuthenticateWithApeKey } from "../../__testData__/auth"; +import { + mockAuthenticateWithApeKey, + mockBearerAuthentication, +} from "../../__testData__/auth"; import { enableRateLimitExpects } from "../../__testData__/rate-limit"; import { DBResult } from "../../../src/utils/result"; -const uid = "123456"; - -const mockDecodedToken: DecodedIdToken = { - uid, - email: "newuser@mail.com", - iat: 0, -} as DecodedIdToken; const mockApp = request(app); - const configuration = Configuration.getCachedConfiguration(); enableRateLimitExpects(); +const uid = new ObjectId().toHexString(); +const mockAuth = mockBearerAuthentication(uid); describe("result controller test", () => { - const verifyIdTokenMock = vi.spyOn(AuthUtils, "verifyIdToken"); - beforeEach(() => { - verifyIdTokenMock.mockReset(); - verifyIdTokenMock.mockResolvedValue(mockDecodedToken); + mockAuth.beforeEach(); }); describe("getResults", () => { @@ -87,7 +79,7 @@ describe("result controller test", () => { .expect(200); //THEN - expect(resultMock).toHaveBeenCalledWith(mockDecodedToken.uid, { + expect(resultMock).toHaveBeenCalledWith(uid, { limit: 1000, offset: 0, onOrAfterTimestamp: NaN, @@ -106,7 +98,7 @@ describe("result controller test", () => { //THEN - expect(resultMock).toHaveBeenCalledWith(mockDecodedToken.uid, { + expect(resultMock).toHaveBeenCalledWith(uid, { limit: 1000, offset: 0, onOrAfterTimestamp: now, @@ -122,7 +114,7 @@ describe("result controller test", () => { .expect(200); //THEN - expect(resultMock).toHaveBeenCalledWith(mockDecodedToken.uid, { + expect(resultMock).toHaveBeenCalledWith(uid, { limit: 250, offset: 500, onOrAfterTimestamp: NaN, @@ -158,7 +150,7 @@ describe("result controller test", () => { //THEN - expect(resultMock).toHaveBeenCalledWith(mockDecodedToken.uid, { + expect(resultMock).toHaveBeenCalledWith(uid, { limit: 800, offset: 600, onOrAfterTimestamp: NaN, @@ -175,7 +167,7 @@ describe("result controller test", () => { //THEN - expect(resultMock).toHaveBeenCalledWith(mockDecodedToken.uid, { + expect(resultMock).toHaveBeenCalledWith(uid, { limit: 10, //limit is reduced to stay within max limit offset: 990, onOrAfterTimestamp: NaN, @@ -231,7 +223,7 @@ describe("result controller test", () => { .expect(200); //THEN - expect(resultMock).toHaveBeenCalledWith(mockDecodedToken.uid, { + expect(resultMock).toHaveBeenCalledWith(uid, { limit: 100, offset: 900, onOrAfterTimestamp: NaN, @@ -266,7 +258,7 @@ describe("result controller test", () => { .expect(200); //THEN - expect(resultMock).toHaveBeenCalledWith(mockDecodedToken.uid, { + expect(resultMock).toHaveBeenCalledWith(uid, { limit: 1000, //the default limit for regular users offset: 0, onOrAfterTimestamp: NaN, @@ -430,10 +422,8 @@ describe("result controller test", () => { it("should delete", async () => { //GIVEN - verifyIdTokenMock.mockResolvedValue({ - ...mockDecodedToken, - iat: Date.now() - 1000, - }); + mockAuth.modifyToken({ iat: Date.now() - 1000 }); + //WHEN const { body } = await mockApp .delete("/results") @@ -449,6 +439,10 @@ describe("result controller test", () => { expect(logToDbMock).toHaveBeenCalledWith("user_results_deleted", "", uid); }); it("should fail to delete with non-fresh token", async () => { + //GIVEN + mockAuth.modifyToken({ iat: 0 }); + + //WHEN/THEN await mockApp .delete("/results") .set("Authorization", `Bearer ${uid}`) @@ -704,7 +698,7 @@ describe("result controller test", () => { restartCount: 4, tags: ["tagOneId", "tagTwoId"], testDuration: 15.1, - uid: "123456", + uid: uid, wpm: 80, }) ); diff --git a/backend/__tests__/api/controllers/user.spec.ts b/backend/__tests__/api/controllers/user.spec.ts index edbf16c66ade..bd277df3d935 100644 --- a/backend/__tests__/api/controllers/user.spec.ts +++ b/backend/__tests__/api/controllers/user.spec.ts @@ -3,7 +3,6 @@ import app from "../../../src/app"; import * as Configuration from "../../../src/init/configuration"; import { generateCurrentTestActivity } from "../../../src/api/controllers/user"; import * as UserDal from "../../../src/dal/user"; -import { DecodedIdToken } from "firebase-admin/auth"; import * as AuthUtils from "../../../src/utils/auth"; import * as BlocklistDal from "../../../src/dal/blocklist"; import * as ApeKeys from "../../../src/dal/ape-keys"; @@ -23,7 +22,10 @@ import * as LogDal from "../../../src/dal/logs"; import { ObjectId } from "mongodb"; import { PersonalBest } from "@monkeytype/contracts/schemas/shared"; import { pb } from "../../dal/leaderboards.spec"; -import { mockAuthenticateWithApeKey } from "../../__testData__/auth"; +import { + mockAuthenticateWithApeKey, + mockBearerAuthentication, +} from "../../__testData__/auth"; import { randomUUID } from "node:crypto"; import _ from "lodash"; import { MonkeyMail, UserStreak } from "@monkeytype/contracts/schemas/users"; @@ -33,17 +35,12 @@ import * as WeeklyXpLeaderboard from "../../../src/services/weekly-xp-leaderboar const mockApp = request(app); const configuration = Configuration.getCachedConfiguration(); -const uid = "123456789"; - -const mockDecodedToken: DecodedIdToken = { - uid, - email: "newuser@mail.com", - iat: Date.now(), -} as DecodedIdToken; +const uid = new ObjectId().toHexString(); +const mockAuth = mockBearerAuthentication(uid); describe("user controller test", () => { beforeEach(() => { - vi.spyOn(AuthUtils, "verifyIdToken").mockResolvedValue(mockDecodedToken); + mockAuth.beforeEach(); }); describe("user creation flow", () => { beforeEach(async () => { @@ -54,20 +51,20 @@ describe("user controller test", () => { const newUser = { name: "NewUser", - uid: "123456789", + uid, email: "newuser@mail.com", captcha: "captcha", }; await mockApp .post("/users/signup") - .set("authorization", "Uid 123456789|newuser@mail.com") + .set("Authorization", `Bearer ${uid}`) .send(newUser) .expect(200); const response = await mockApp .get("/users") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .send() .expect(200); @@ -106,7 +103,7 @@ describe("user controller test", () => { const newUser = { name: "NewUser", - uid: "123456789", + uid: uid, email: "newuser@mail.com", captcha: "captcha", }; @@ -114,7 +111,7 @@ describe("user controller test", () => { //WHEN const result = await mockApp .post("/users/signup") - .set("authorization", "Uid 123456789|newuser@mail.com") + .set("Authorization", `Bearer ${uid}`) .send(newUser) .expect(409); @@ -126,7 +123,7 @@ describe("user controller test", () => { }); //user will be created in firebase from the frontend, make sure we remove it - expect(firebaseDeleteUserMock).toHaveBeenCalledWith("123456789"); + expect(firebaseDeleteUserMock).toHaveBeenCalledWith(uid); expect(verifyCaptchaMock).toHaveBeenCalledWith("captcha"); }); @@ -134,10 +131,13 @@ describe("user controller test", () => { for (const domain of ["tidal.lol", "selfbot.cc"]) { //GIVEN firebaseDeleteUserMock.mockResolvedValue(); + mockAuth.modifyToken({ + email: `newuser@${domain}`, + }); const newUser = { name: "NewUser", - uid: "123456789", + uid: uid, email: `newuser@${domain}`, captcha: "captcha", }; @@ -145,7 +145,7 @@ describe("user controller test", () => { //WHEN const result = await mockApp .post("/users/signup") - .set("authorization", `Uid 123456789|newuser@${domain}`) + .set("Authorization", `Bearer ${uid}`) .send(newUser) .set({ Accept: "application/json", @@ -156,7 +156,7 @@ describe("user controller test", () => { expect(result.body.message).toEqual("Invalid domain"); //user will be created in firebase from the frontend, make sure we remove it - expect(firebaseDeleteUserMock).toHaveBeenCalledWith("123456789"); + expect(firebaseDeleteUserMock).toHaveBeenCalledWith(uid); } }); @@ -167,7 +167,7 @@ describe("user controller test", () => { const newUser = { name: "NewUser", - uid: "123456789", + uid: uid, email: "newuser@mail.com", captcha: "captcha", }; @@ -175,19 +175,16 @@ describe("user controller test", () => { //WHEN const result = await mockApp .post("/users/signup") - .set("authorization", "Uid 123456789|newuser@mail.com") + .set("Authorization", `Bearer ${uid}`) .send(newUser) .expect(409); //THEN expect(result.body.message).toEqual("Username unavailable"); - expect(usernameAvailableMock).toHaveBeenCalledWith( - "NewUser", - "123456789" - ); + expect(usernameAvailableMock).toHaveBeenCalledWith("NewUser", uid); //user will be created in firebase from the frontend, make sure we remove it - expect(firebaseDeleteUserMock).toHaveBeenCalledWith("123456789"); + expect(firebaseDeleteUserMock).toHaveBeenCalledWith(uid); }); it("should fail if capture is invalid", async () => { //GIVEN @@ -195,7 +192,7 @@ describe("user controller test", () => { const newUser = { name: "NewUser", - uid: "123456789", + uid: uid, email: "newuser@mail.com", captcha: "captcha", }; @@ -203,7 +200,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/signup") - .set("authorization", "Uid 123456789|newuser@mail.com") + .set("Authorization", `Bearer ${uid}`) .send(newUser) .expect(422); @@ -213,7 +210,7 @@ describe("user controller test", () => { it("should fail if username too long", async () => { //GIVEN const newUser = { - uid: "123456789", + uid: uid, email: "newuser@mail.com", captcha: "captcha", }; @@ -221,7 +218,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/signup") - .set("authorization", "Uid 123456789|newuser@mail.com") + .set("Authorization", `Bearer ${uid}`) .send({ ...newUser, name: new Array(17).fill("x").join("") }) .expect(422); @@ -236,7 +233,7 @@ describe("user controller test", () => { it("should fail if username contains profanity", async () => { //GIVEN const newUser = { - uid: "123456789", + uid: uid, email: "newuser@mail.com", captcha: "captcha", }; @@ -244,7 +241,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/signup") - .set("authorization", "Uid 123456789|newuser@mail.com") + .set("Authorization", `Bearer ${uid}`) .send({ ...newUser, name: "miodec" }) .expect(422); @@ -289,7 +286,7 @@ describe("user controller test", () => { //"HEN const { body } = await mockApp .get("/users/verificationEmail") - .set("authorization", `Uid ${uid}|newuser@mail.com`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -316,7 +313,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/verificationEmail") - .set("authorization", `Uid ${uid}|newuser@mail.com`) + .set("Authorization", `Bearer ${uid}`) .expect(500); //THEN @@ -331,7 +328,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/verificationEmail") - .set("authorization", `Uid ${uid}|newuser@mail.com`) + .set("Authorization", `Bearer ${uid}`) .expect(400); //THEN @@ -346,7 +343,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/verificationEmail") - .set("authorization", `Uid ${uid}|newuser@mail.com`) + .set("Authorization", `Bearer ${uid}`) .expect(400); //THEN @@ -371,7 +368,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/verificationEmail") - .set("authorization", `Uid ${uid}|newuser@mail.com`) + .set("Authorization", `Bearer ${uid}`) .expect(429); //THEN @@ -393,7 +390,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/verificationEmail") - .set("authorization", `Uid ${uid}|newuser@mail.com`) + .set("Authorization", `Bearer ${uid}`) .expect(500); //THEN @@ -413,7 +410,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/verificationEmail") - .set("authorization", `Uid ${uid}|newuser@mail.com`) + .set("Authorization", `Bearer ${uid}`) .expect(500); //THEN @@ -496,7 +493,7 @@ describe("user controller test", () => { //when await mockApp .get("/users/testActivity") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .send() .expect(503); }); @@ -511,7 +508,7 @@ describe("user controller test", () => { //when const response = await mockApp .get("/users/testActivity") - .set("authorization", "Uid 123456789") + .set("Authorization", `Bearer ${uid}`) .send() .expect(200); @@ -608,6 +605,7 @@ describe("user controller test", () => { const blocklistAddMock = vi.spyOn(BlocklistDal, "add"); beforeEach(() => { + mockAuth.beforeEach(); [ firebaseDeleteUserMock, deleteUserMock, @@ -639,7 +637,6 @@ describe("user controller test", () => { it("should add user to blocklist if banned", async () => { //GIVEN - const uid = mockDecodedToken.uid; const user = { uid, name: "name", @@ -652,7 +649,7 @@ describe("user controller test", () => { //WHEN await mockApp .delete("/users/") - .set("Authorization", "Bearer 123456789") + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -675,7 +672,6 @@ describe("user controller test", () => { }); it("should delete user without adding to blocklist if not banned", async () => { //GIVEN - const uid = mockDecodedToken.uid; const user = { uid, name: "name", @@ -687,7 +683,7 @@ describe("user controller test", () => { //WHEN await mockApp .delete("/users/") - .set("Authorization", "Bearer 123456789") + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -754,7 +750,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/reset") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -792,7 +788,7 @@ describe("user controller test", () => { //WHEN await mockApp .patch("/users/reset") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -805,7 +801,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/reset") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(403); //THEN @@ -834,7 +830,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/name") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ name: "newName" }) .expect(200); @@ -859,7 +855,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/name") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ name: "newName" }) .expect(409); @@ -875,7 +871,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/name") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ name: "newName" }) .expect(403); @@ -892,7 +888,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/name") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ name: "newName" }) .expect(409); @@ -912,7 +908,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/name") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ name: "newName" }) .expect(200); @@ -928,7 +924,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/name") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -941,7 +937,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/name") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ name: "newName", extra: "value" }) .expect(422); @@ -955,7 +951,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/name") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ name: "miodec" }) .expect(422); @@ -988,7 +984,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .delete("/users/personalBests") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -1027,7 +1023,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/optOutOfLeaderboards") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -1051,7 +1047,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/optOutOfLeaderboards") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ extra: "value" }); //TODO.expect(422); @@ -1078,7 +1074,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/email") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ newEmail, previousEmail: "previousEmail@example.com" }) .expect(200); @@ -1118,7 +1114,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/email") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ newEmail: "newEmail@example.com", previousEmail: "previousEmail@example.com", @@ -1148,7 +1144,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/email") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ newEmail: "newEmail@example.com", previousEmail: "previousEmail@example.com", @@ -1175,7 +1171,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/email") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ newEmail: "newEmail@example.com", previousEmail: "previousEmail@example.com", @@ -1202,7 +1198,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/email") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ newEmail: "newEmail@example.com", previousEmail: "previousEmail@example.com", @@ -1229,7 +1225,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/email") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ newEmail: "newEmail@example.com", previousEmail: "previousEmail@example.com", @@ -1247,7 +1243,7 @@ describe("user controller test", () => { //WHEN await mockApp .patch("/users/email") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ newEmail: "newEmail@example.com", previousEmail: "previousEmail@example.com", @@ -1258,7 +1254,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/email") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); expect(body).toEqual({ @@ -1270,7 +1266,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/email") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ newEmail: "newEmail@example.com", previousEmail: "previousEmail@example.com", @@ -1295,7 +1291,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/password") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ newPassword: "sw0rdf1sh" }) .expect(200); @@ -1310,7 +1306,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/password") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -1323,7 +1319,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/password") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ newPassword: "sw0rdf1sh", extra: "value" }) .expect(422); @@ -1337,7 +1333,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/password") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ newPassword: "test" }) .expect(422); @@ -1362,7 +1358,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/discord/oauth") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -1379,7 +1375,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/discord/oauth") - .set("authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(503); //THEN @@ -1435,7 +1431,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/discord/link") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ tokenType: "tokenType", accessToken: "accessToken", @@ -1488,7 +1484,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/discord/link") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ tokenType: "tokenType", accessToken: "accessToken", @@ -1521,7 +1517,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/discord/link") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ tokenType: "tokenType", accessToken: "accessToken", @@ -1539,7 +1535,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/discord/link") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ tokenType: "tokenType", accessToken: "accessToken", @@ -1557,7 +1553,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/discord/link") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ tokenType: "tokenType", accessToken: "accessToken", @@ -1580,7 +1576,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/discord/link") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ tokenType: "tokenType", accessToken: "accessToken", @@ -1599,7 +1595,6 @@ describe("user controller test", () => { it("should fail if discordId is blocked", async () => { //GIVEN - const uid = mockDecodedToken.uid; const user = { uid, name: "name", @@ -1611,7 +1606,7 @@ describe("user controller test", () => { //WHEN const result = await mockApp .post("/users/discord/link") - .set("Authorization", "Bearer 123456789") + .set("Authorization", `Bearer ${uid}`) .send({ tokenType: "tokenType", accessToken: "accessToken", @@ -1630,7 +1625,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/discord/link") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -1647,7 +1642,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/discord/link") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ tokenType: "tokenType", accessToken: "accessToken", @@ -1684,7 +1679,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/discord/unlink") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -1709,7 +1704,7 @@ describe("user controller test", () => { const { body } = await mockApp .post("/users/discord/unlink") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(403); //THEN @@ -1725,7 +1720,7 @@ describe("user controller test", () => { const { body } = await mockApp .post("/users/discord/unlink") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(404); //THEN @@ -1811,7 +1806,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/resultFilterPresets") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send(validPreset) .expect(200); @@ -1832,7 +1827,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/resultFilterPresets") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -1860,7 +1855,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/resultFilterPresets") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ ...validPreset, extra: "value" }) .expect(422); @@ -1876,7 +1871,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/resultFilterPresets") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ validPreset }) .expect(503); @@ -1901,7 +1896,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .delete("/users/resultFilterPresets/myId") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -1918,7 +1913,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .delete("/users/resultFilterPresets/myId") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(503); //THEN @@ -1952,7 +1947,7 @@ describe("user controller test", () => { const { body } = await mockApp .post("/users/tags") .send({ tagName: "tagName" }) - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -1968,7 +1963,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/tags") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -1983,7 +1978,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/tags") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ tagName: "tagName", extra: "value" }) .expect(422); @@ -2007,7 +2002,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .delete(`/users/tags/${tagId}/personalBest`) - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -2032,7 +2027,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch(`/users/tags`) - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ tagId, newName: "newName" }) .expect(200); @@ -2047,7 +2042,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch(`/users/tags`) - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -2060,7 +2055,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch(`/users/tags`) - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ tagId: new ObjectId().toHexString(), newName: "newName", @@ -2089,7 +2084,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .delete(`/users/tags/${tagId}`) - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -2126,7 +2121,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/tags") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -2156,7 +2151,7 @@ describe("user controller test", () => { language: "english", rank: 7, }) - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -2178,7 +2173,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/leaderboardMemory") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -2196,7 +2191,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/leaderboardMemory") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ mode: "time", mode2: "60", @@ -2235,7 +2230,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/customThemes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -2266,7 +2261,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/customThemes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ name: "customTheme", colors: new Array(10).fill("#000000") as any, @@ -2287,7 +2282,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/customThemes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -2300,7 +2295,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/customThemes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ name: "customTheme", colors: new Array(10).fill("#000000") as any, @@ -2318,7 +2313,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/customThemes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ name: "customThemecustomThemecustomThemecustomTheme", colors: new Array(9).fill("#000") as any, @@ -2349,7 +2344,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .delete("/users/customThemes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ themeId }) .expect(200); @@ -2364,7 +2359,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .delete("/users/customThemes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -2377,7 +2372,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .delete("/users/customThemes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ themeId: new ObjectId().toHexString(), extra: "value" }) .expect(422); @@ -2405,7 +2400,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/customThemes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ themeId, theme, @@ -2423,7 +2418,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/customThemes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -2436,7 +2431,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/customThemes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ themeId: new ObjectId().toHexString(), theme: { @@ -2472,7 +2467,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/personalBests") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ mode: "time", mode2: "15" }) .expect(200); @@ -2499,7 +2494,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/personalBests") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -2512,7 +2507,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/personalBests") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ mode: "time", mode2: "15", extra: "value" }) .expect(422); @@ -2526,7 +2521,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/personalBests") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .query({ mode: "mood", mode2: "happy" }) .expect(422); @@ -2562,7 +2557,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/stats") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -2602,7 +2597,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/favoriteQuotes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -2622,7 +2617,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/favoriteQuotes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ language: "english", quoteId: "7" }) .expect(200); @@ -2642,7 +2637,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/favoriteQuotes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -2655,7 +2650,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/favoriteQuotes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ language: "english", quoteId: "7", extra: "value" }) .expect(422); @@ -2676,7 +2671,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .delete("/users/favoriteQuotes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ language: "english", quoteId: "7" }) .expect(200); @@ -2691,7 +2686,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .delete("/users/favoriteQuotes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -2704,7 +2699,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .delete("/users/favoriteQuotes") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ language: "english", quoteId: "7", extra: "value" }) .expect(422); @@ -2954,7 +2949,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/profile") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ ...newProfile, selectedBadgeId: 2, @@ -2998,7 +2993,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/profile") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ ...newProfile, selectedBadgeId: -1, @@ -3030,7 +3025,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/profile") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ extra: "value", socialProfiles: { @@ -3052,7 +3047,7 @@ describe("user controller test", () => { //WHEN await mockApp .patch("/users/profile") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ bio: "Line1\n\n\nLine2\n\n\n\nLine3", keyboard: " string with many spaces ", @@ -3074,7 +3069,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/profile") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ bio: "miodec", keyboard: "miodec", @@ -3102,7 +3097,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/profile") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ bio: new Array(251).fill("x").join(""), keyboard: new Array(76).fill("x").join(""), @@ -3132,7 +3127,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/profile") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ socialProfiles: { website: "http://monkeytype.com", @@ -3155,7 +3150,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/profile") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({}) .expect(503); @@ -3194,7 +3189,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/inbox") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -3215,7 +3210,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .get("/users/inbox") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(503); //THEN @@ -3235,7 +3230,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/inbox") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ mailIdsToDelete: [mailIdOne], mailIdsToMarkRead: [mailIdOne, mailIdTwo], @@ -3258,7 +3253,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/inbox") - .set("Authorization", `Uid ${uid}`); + .set("Authorization", `Bearer ${uid}`); //.expect(200); console.log(body); @@ -3274,7 +3269,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/inbox") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ mailIdsToDelete: [], mailIdsToMarkRead: [], @@ -3297,7 +3292,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .patch("/users/inbox") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(503); //THEN @@ -3327,7 +3322,7 @@ describe("user controller test", () => { const { body } = await mockApp .post("/users/report") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ uid: uidToReport, reason: "Suspected cheating", @@ -3361,7 +3356,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/report") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -3378,7 +3373,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/report") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ uid: new ObjectId().toHexString(), reason: "Suspected cheating", @@ -3401,7 +3396,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/report") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ uid: new ObjectId().toHexString(), reason: "Suspected cheating", @@ -3420,7 +3415,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/report") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ uid: new Array(51).fill("x").join(""), reason: "unfriendly", @@ -3445,7 +3440,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/report") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ uid: new ObjectId().toHexString(), reason: "Suspected cheating", @@ -3464,7 +3459,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/report") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ uid: new ObjectId().toHexString(), reason: "Suspected cheating", @@ -3492,7 +3487,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/setStreakHourOffset") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ hourOffset: -2 }) .expect(200); @@ -3518,7 +3513,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/setStreakHourOffset") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ hourOffset: -2 }) .expect(403); @@ -3531,7 +3526,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/setStreakHourOffset") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(422); //THEN @@ -3543,19 +3538,19 @@ describe("user controller test", () => { it("should fail with invalid offset", async () => { await mockApp .post("/users/setStreakHourOffset") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ hourOffset: -12 }) .expect(422); await mockApp .post("/users/setStreakHourOffset") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ hourOffset: 13 }) .expect(422); await mockApp .post("/users/setStreakHourOffset") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .send({ hourOffset: "UTC-8" }) .expect(422); }); @@ -3572,7 +3567,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/revokeAllTokens") - .set("Authorization", `Uid ${uid}`) + .set("Authorization", `Bearer ${uid}`) .expect(200); //THEN @@ -3598,7 +3593,7 @@ describe("user controller test", () => { //GIVEN vi.useFakeTimers().setSystemTime(1712102400000); const user = { - uid: mockDecodedToken.uid, + uid: uid, testActivity: { "2024": fillYearWithDay(94), }, @@ -3608,7 +3603,7 @@ describe("user controller test", () => { //WHEN const result = await mockApp .get("/users/currentTestActivity") - .set("Authorization", "Bearer 123456789") + .set("Authorization", `Bearer ${uid}`) .send() .expect(200); @@ -3631,7 +3626,7 @@ describe("user controller test", () => { it("gets", async () => { //GIVEN const user = { - uid: mockDecodedToken.uid, + uid: uid, streak: { lastResultTimestamp: 1712102400000, length: 42, @@ -3644,7 +3639,7 @@ describe("user controller test", () => { //WHEN const result = await mockApp .get("/users/streak") - .set("Authorization", "Bearer 123456789") + .set("Authorization", `Bearer ${uid}`) .send() .expect(200); From 4a22c0647b99c00070601f841876c13c2eec7e90 Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Mon, 3 Mar 2025 12:31:09 +0100 Subject: [PATCH 4/8] fix: legacy test settings urls not importing correctly (@fehmer) (#6314) Some people have old links with test settings we should support. --- frontend/src/ts/utils/url-handler.ts | 46 +++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/frontend/src/ts/utils/url-handler.ts b/frontend/src/ts/utils/url-handler.ts index f0d16bbdb2bd..756d4304215a 100644 --- a/frontend/src/ts/utils/url-handler.ts +++ b/frontend/src/ts/utils/url-handler.ts @@ -135,7 +135,20 @@ export function loadCustomThemeFromUrl(getOverride?: string): void { const TestSettingsSchema = z.tuple([ ModeSchema.nullable(), Mode2Schema.nullable(), - CustomText.CustomTextSettingsSchema.nullable(), + CustomText.CustomTextSettingsSchema.partial({ + pipeDelimiter: true, + limit: true, + mode: true, + }) + //legacy values + .extend({ + isTimeRandom: z.boolean().optional(), + isWordRandom: z.boolean().optional(), + word: z.number().int().optional(), + time: z.number().int().optional(), + delimiter: z.string().optional(), + }) + .nullable(), z.boolean().nullable(), //punctuation z.boolean().nullable(), //numbers z.string().nullable(), //language @@ -186,9 +199,34 @@ export function loadTestSettingsFromUrl(getOverride?: string): void { if (de[2] !== null) { const customTextSettings = de[2]; CustomText.setText(customTextSettings.text); - CustomText.setLimitMode(customTextSettings.limit.mode); - CustomText.setLimitValue(customTextSettings.limit.value); - CustomText.setPipeDelimiter(customTextSettings.pipeDelimiter); + + if (customTextSettings.limit !== undefined) { + CustomText.setLimitMode(customTextSettings.limit.mode); + CustomText.setLimitValue(customTextSettings.limit.value); + } + //convert legacy values + else { + if (customTextSettings.isWordRandom) { + CustomText.setLimitMode("word"); + } else if (customTextSettings.isTimeRandom) { + CustomText.setLimitMode("time"); + } + if (customTextSettings.word !== undefined) { + CustomText.setLimitValue(customTextSettings.word); + } else if (customTextSettings.time !== undefined) { + CustomText.setLimitValue(customTextSettings.time); + } + } + + if (customTextSettings.pipeDelimiter) { + CustomText.setPipeDelimiter(customTextSettings.pipeDelimiter); + } + //convert legacy values + else if (customTextSettings.delimiter === "|") { + CustomText.setPipeDelimiter(true); + } + + CustomText.setMode(customTextSettings.mode ?? "repeat"); applied["custom text settings"] = ""; } From 2b2d1a153ea6e2d1d757bfefc5ad7c87fd7f912e Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Mon, 3 Mar 2025 13:48:50 +0100 Subject: [PATCH 5/8] build: use tsup instead of esbuild for packages (@fehmer) (#6309) --- packages/contracts/package.json | 14 +- packages/contracts/tsup.config.js | 3 + packages/esbuild-config/index.js | 95 ---- packages/esbuild-config/package.json | 14 - packages/funbox/package.json | 10 +- packages/funbox/tsup.config.js | 3 + .../.eslintrc.cjs | 0 packages/tsup-config/package.json | 24 + packages/tsup-config/src/index.ts | 23 + packages/tsup-config/tsconfig.json | 15 + packages/tsup-config/tsup.config.js | 10 + packages/util/package.json | 16 +- packages/util/tsup.config.js | 3 + pnpm-lock.yaml | 511 ++++++++++++++---- 14 files changed, 503 insertions(+), 238 deletions(-) create mode 100644 packages/contracts/tsup.config.js delete mode 100755 packages/esbuild-config/index.js delete mode 100644 packages/esbuild-config/package.json create mode 100644 packages/funbox/tsup.config.js rename packages/{esbuild-config => tsup-config}/.eslintrc.cjs (100%) create mode 100644 packages/tsup-config/package.json create mode 100644 packages/tsup-config/src/index.ts create mode 100644 packages/tsup-config/tsconfig.json create mode 100644 packages/tsup-config/tsup.config.js create mode 100644 packages/util/tsup.config.js diff --git a/packages/contracts/package.json b/packages/contracts/package.json index b2d0cc4562d9..f9c37c4a7fc9 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -2,25 +2,25 @@ "name": "@monkeytype/contracts", "private": true, "scripts": { - "dev": "rimraf ./dist && monkeytype-esbuild --watch", - "build": "rimraf ./dist && npm run madge && monkeytype-esbuild", + "dev": "tsup-node --watch", + "build": "npm run madge && tsup-node", "test": "vitest run", "madge": " madge --circular --extensions ts ./src", "ts-check": "tsc --noEmit", "lint": "eslint \"./**/*.ts\"" }, - "dependencies": { + "peerDependencies": { "@ts-rest/core": "3.51.0", "zod": "3.23.8" }, "devDependencies": { - "@monkeytype/esbuild": "workspace:*", "@monkeytype/eslint-config": "workspace:*", + "@monkeytype/tsup-config": "workspace:*", "@monkeytype/typescript-config": "workspace:*", "chokidar": "3.6.0", "eslint": "8.57.1", "madge": "8.0.0", - "rimraf": "6.0.1", + "tsup": "8.4.0", "typescript": "5.5.4", "vitest": "2.1.9" }, @@ -28,12 +28,12 @@ ".": { "types": "./src/index.ts", "import": "./dist/index.mjs", - "require": "./dist/index.cjs" + "require": "./dist/index.js" }, "./*": { "types": "./src/*.ts", "import": "./dist/*.mjs", - "require": "./dist/*.cjs" + "require": "./dist/*.js" } } } diff --git a/packages/contracts/tsup.config.js b/packages/contracts/tsup.config.js new file mode 100644 index 000000000000..18ad6a0dacdb --- /dev/null +++ b/packages/contracts/tsup.config.js @@ -0,0 +1,3 @@ +import { extendConfig } from "@monkeytype/tsup-config"; + +export default extendConfig(); diff --git a/packages/esbuild-config/index.js b/packages/esbuild-config/index.js deleted file mode 100755 index 6da919b4a63c..000000000000 --- a/packages/esbuild-config/index.js +++ /dev/null @@ -1,95 +0,0 @@ -const esbuild = require("esbuild"); -const { readdirSync, statSync } = require("fs"); -const { join, extname } = require("path"); -const chokidar = require("chokidar"); - -//check if watch parameter is passed -const isWatch = process.argv.includes("--watch"); - -// Recursive function to get all .ts files in a directory -const getAllFiles = (dirPath, arrayOfFiles = []) => { - const files = readdirSync(dirPath); - - files.forEach((file) => { - const filePath = join(dirPath, file); - if (statSync(filePath).isDirectory()) { - arrayOfFiles = getAllFiles(filePath, arrayOfFiles); - } else if (extname(file) === ".ts") { - arrayOfFiles.push(filePath); - } - }); - - return arrayOfFiles; -}; - -// Get all TypeScript files from the src directory and subdirectories -const entryPoints = getAllFiles("./src"); - -// Function to generate output file names -const getOutfile = (entryPoint, format) => { - const relativePath = entryPoint.replace(/src[/\\]/, ""); - const fileBaseName = relativePath.replace(".ts", ""); - return `./dist/${fileBaseName}.${format === "esm" ? "mjs" : "cjs"}`; -}; - -// Common build settings -const commonSettings = { - bundle: true, - sourcemap: true, - minify: true, -}; - -function buildAll(silent, stopOnError) { - console.log("Building all files..."); - entryPoints.forEach((entry) => { - build(entry, silent, stopOnError); - }); -} - -function build(entry, silent, stopOnError) { - if (!silent) console.log("Building", entry); - - // ESM build - esbuild - .build({ - ...commonSettings, - entryPoints: [entry], - format: "esm", - outfile: getOutfile(entry, "esm"), - }) - .catch((e) => { - console.log(`Failed to build ${entry} to ESM:`, e); - if (stopOnError) process.exit(1); - }); - - // CommonJS build - esbuild - .build({ - ...commonSettings, - entryPoints: [entry], - format: "cjs", - outfile: getOutfile(entry, "cjs"), - }) - .catch((e) => { - console.log(`Failed to build ${entry} to CJS:`, e); - if (stopOnError) process.exit(1); - }); -} - -if (isWatch) { - buildAll(true, false); - console.log("Starting watch mode..."); - chokidar.watch("./src/**/*.ts").on( - "change", - (_path) => { - console.log("File change detected..."); - // build(path, false, false); - buildAll(false, false); - }, - { - ignoreInitial: true, - } - ); -} else { - buildAll(false, true); -} diff --git a/packages/esbuild-config/package.json b/packages/esbuild-config/package.json deleted file mode 100644 index 19a2205999bf..000000000000 --- a/packages/esbuild-config/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "@monkeytype/esbuild", - "private": true, - "scripts": { - "lint": "eslint \"./**/*.js\"" - }, - "bin": { - "monkeytype-esbuild": "./index.js" - }, - "devDependencies": { - "esbuild": "0.25.0", - "eslint": "8.57.1" - } -} diff --git a/packages/funbox/package.json b/packages/funbox/package.json index e13b73c71f10..6d7c51642deb 100644 --- a/packages/funbox/package.json +++ b/packages/funbox/package.json @@ -2,20 +2,20 @@ "name": "@monkeytype/funbox", "private": true, "scripts": { - "dev": "rimraf ./dist && monkeytype-esbuild --watch", - "build": "rimraf ./dist && npm run madge && monkeytype-esbuild", + "dev": "tsup-node --watch", + "build": "npm run madge && tsup-node", "madge": " madge --circular --extensions ts ./src", "ts-check": "tsc --noEmit", "lint": "eslint \"./**/*.ts\"" }, "devDependencies": { - "@monkeytype/esbuild": "workspace:*", "@monkeytype/eslint-config": "workspace:*", + "@monkeytype/tsup-config": "workspace:*", "@monkeytype/typescript-config": "workspace:*", "chokidar": "3.6.0", "eslint": "8.57.1", "madge": "8.0.0", - "rimraf": "6.0.1", + "tsup": "8.4.0", "typescript": "5.5.4", "vitest": "2.1.9" }, @@ -26,7 +26,7 @@ ".": { "types": "./src/index.ts", "import": "./dist/index.mjs", - "require": "./dist/index.cjs" + "require": "./dist/index.js" } } } diff --git a/packages/funbox/tsup.config.js b/packages/funbox/tsup.config.js new file mode 100644 index 000000000000..28181ee3ec44 --- /dev/null +++ b/packages/funbox/tsup.config.js @@ -0,0 +1,3 @@ +import { extendConfig } from "@monkeytype/tsup-config"; + +export default extendConfig(() => ({ entry: ["src/index.ts"] })); diff --git a/packages/esbuild-config/.eslintrc.cjs b/packages/tsup-config/.eslintrc.cjs similarity index 100% rename from packages/esbuild-config/.eslintrc.cjs rename to packages/tsup-config/.eslintrc.cjs diff --git a/packages/tsup-config/package.json b/packages/tsup-config/package.json new file mode 100644 index 000000000000..9b8340f67b83 --- /dev/null +++ b/packages/tsup-config/package.json @@ -0,0 +1,24 @@ +{ + "name": "@monkeytype/tsup-config", + "private": true, + "scripts": { + "dev": "tsup-node --watch", + "build": "tsup-node", + "ts-check": "tsc --noEmit" + }, + "peerDependencies": { + "tsup": "8.4.0" + }, + "devDependencies": { + "@monkeytype/typescript-config": "workspace:*", + "eslint": "8.57.1", + "typescript": "5.5.4" + }, + "exports": { + ".": { + "types": "./src/index.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + } + } +} diff --git a/packages/tsup-config/src/index.ts b/packages/tsup-config/src/index.ts new file mode 100644 index 000000000000..a9320f09534b --- /dev/null +++ b/packages/tsup-config/src/index.ts @@ -0,0 +1,23 @@ +import { defineConfig, Options } from "tsup"; + +export function extendConfig( + customizer?: (options: Options) => Options + // tsup uses MaybePromise which is not exported + // eslint-disable-next-line @typescript-eslint/no-explicit-any +): (options: Options) => any { + return (options) => { + const overrideOptions = customizer?.(options); + const config: Options = { + entry: ["src/**/*.ts"], + splitting: false, + sourcemap: true, + clean: !(options.watch === true || options.watch === "true"), + format: ["cjs", "esm"], + dts: false, + minify: true, + ...(overrideOptions || {}), + }; + + return defineConfig(config); + }; +} diff --git a/packages/tsup-config/tsconfig.json b/packages/tsup-config/tsconfig.json new file mode 100644 index 000000000000..e632a1d38f12 --- /dev/null +++ b/packages/tsup-config/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "@monkeytype/typescript-config/base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "declaration": true, + "declarationMap": true, + "moduleResolution": "Node", + "module": "ES6", + "target": "ES2015", + "lib": ["es2016"] + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/tsup-config/tsup.config.js b/packages/tsup-config/tsup.config.js new file mode 100644 index 000000000000..1af236eb1c90 --- /dev/null +++ b/packages/tsup-config/tsup.config.js @@ -0,0 +1,10 @@ +import { defineConfig } from "tsup"; + +export default defineConfig((_options) => ({ + entry: ["src/index.ts"], + splitting: false, + sourcemap: false, + clear: !_options.watch, + format: ["cjs", "esm"], + dts: false, +})); diff --git a/packages/util/package.json b/packages/util/package.json index 4357f710f0c5..dbf86ae4342b 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,36 +1,30 @@ { "name": "@monkeytype/util", - "private": true, "scripts": { - "dev": "rimraf ./dist && monkeytype-esbuild --watch", - "build": "rimraf ./dist && npm run madge && monkeytype-esbuild", + "dev": "tsup-node --watch", + "build": "npm run madge && tsup-node", "test": "vitest run", "madge": " madge --circular --extensions ts ./src", "ts-check": "tsc --noEmit", "lint": "eslint \"./**/*.ts\"" }, "devDependencies": { - "@monkeytype/esbuild": "workspace:*", "@monkeytype/eslint-config": "workspace:*", + "@monkeytype/tsup-config": "workspace:*", "@monkeytype/typescript-config": "workspace:*", "chokidar": "3.6.0", "eslint": "8.57.1", "madge": "8.0.0", - "rimraf": "6.0.1", + "tsup": "8.4.0", "typescript": "5.5.4", "vitest": "2.1.9", "zod": "3.23.8" }, "exports": { - ".": { - "types": "./src/index.ts", - "import": "./dist/index.mjs", - "require": "./dist/index.cjs" - }, "./*": { "types": "./src/*.ts", "import": "./dist/*.mjs", - "require": "./dist/*.cjs" + "require": "./dist/*.js" } } } diff --git a/packages/util/tsup.config.js b/packages/util/tsup.config.js new file mode 100644 index 000000000000..18ad6a0dacdb --- /dev/null +++ b/packages/util/tsup.config.js @@ -0,0 +1,3 @@ +import { extendConfig } from "@monkeytype/tsup-config"; + +export default extendConfig(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 111b007c06eb..300521f55e27 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -473,12 +473,12 @@ importers: specifier: 3.23.8 version: 3.23.8 devDependencies: - '@monkeytype/esbuild': - specifier: workspace:* - version: link:../esbuild-config '@monkeytype/eslint-config': specifier: workspace:* version: link:../eslint-config + '@monkeytype/tsup-config': + specifier: workspace:* + version: link:../tsup-config '@monkeytype/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -491,9 +491,9 @@ importers: madge: specifier: 8.0.0 version: 8.0.0(typescript@5.5.4) - rimraf: - specifier: 6.0.1 - version: 6.0.1 + tsup: + specifier: 8.4.0 + version: 8.4.0(postcss@8.5.1)(tsx@4.16.2)(typescript@5.5.4)(yaml@2.5.0) typescript: specifier: 5.5.4 version: 5.5.4 @@ -501,15 +501,6 @@ importers: specifier: 2.1.9 version: 2.1.9(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.31.3) - packages/esbuild-config: - devDependencies: - esbuild: - specifier: 0.25.0 - version: 0.25.0 - eslint: - specifier: 8.57.1 - version: 8.57.1 - packages/eslint-config: devDependencies: '@typescript-eslint/eslint-plugin': @@ -540,12 +531,12 @@ importers: specifier: workspace:* version: link:../util devDependencies: - '@monkeytype/esbuild': - specifier: workspace:* - version: link:../esbuild-config '@monkeytype/eslint-config': specifier: workspace:* version: link:../eslint-config + '@monkeytype/tsup-config': + specifier: workspace:* + version: link:../tsup-config '@monkeytype/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -558,9 +549,9 @@ importers: madge: specifier: 8.0.0 version: 8.0.0(typescript@5.5.4) - rimraf: - specifier: 6.0.1 - version: 6.0.1 + tsup: + specifier: 8.4.0 + version: 8.4.0(postcss@8.5.1)(tsx@4.16.2)(typescript@5.5.4)(yaml@2.5.0) typescript: specifier: 5.5.4 version: 5.5.4 @@ -590,16 +581,32 @@ importers: specifier: 3.1.4 version: 3.1.4 + packages/tsup-config: + dependencies: + tsup: + specifier: 8.4.0 + version: 8.4.0(postcss@8.5.1)(tsx@4.16.2)(typescript@5.5.4)(yaml@2.5.0) + devDependencies: + '@monkeytype/typescript-config': + specifier: workspace:* + version: link:../typescript-config + eslint: + specifier: 8.57.1 + version: 8.57.1 + typescript: + specifier: 5.5.4 + version: 5.5.4 + packages/typescript-config: {} packages/util: devDependencies: - '@monkeytype/esbuild': - specifier: workspace:* - version: link:../esbuild-config '@monkeytype/eslint-config': specifier: workspace:* version: link:../eslint-config + '@monkeytype/tsup-config': + specifier: workspace:* + version: link:../tsup-config '@monkeytype/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -612,9 +619,9 @@ importers: madge: specifier: 8.0.0 version: 8.0.0(typescript@5.5.4) - rimraf: - specifier: 6.0.1 - version: 6.0.1 + tsup: + specifier: 8.4.0 + version: 8.4.0(postcss@8.5.1)(tsx@4.16.2)(typescript@5.5.4)(yaml@2.5.0) typescript: specifier: 5.5.4 version: 5.5.4 @@ -2611,96 +2618,191 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.34.8': + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.32.0': resolution: {integrity: sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.34.8': + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.32.0': resolution: {integrity: sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.34.8': + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.32.0': resolution: {integrity: sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.34.8': + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.32.0': resolution: {integrity: sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.34.8': + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.32.0': resolution: {integrity: sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.34.8': + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.32.0': resolution: {integrity: sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.32.0': resolution: {integrity: sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.32.0': resolution: {integrity: sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.34.8': + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.32.0': resolution: {integrity: sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.34.8': + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.32.0': resolution: {integrity: sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.32.0': resolution: {integrity: sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.32.0': resolution: {integrity: sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.32.0': resolution: {integrity: sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.34.8': + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.32.0': resolution: {integrity: sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.34.8': + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.32.0': resolution: {integrity: sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.34.8': + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.32.0': resolution: {integrity: sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.34.8': + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.32.0': resolution: {integrity: sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.34.8': + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.32.0': resolution: {integrity: sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.34.8': + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} + cpu: [x64] + os: [win32] + '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -3152,11 +3254,6 @@ packages: resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -3631,6 +3728,12 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} @@ -3753,6 +3856,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -3986,6 +4093,10 @@ packages: resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} engines: {node: '>= 0.10.0'} + consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} + console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} @@ -4955,6 +5066,14 @@ packages: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -5333,11 +5452,6 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@11.0.0: - resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} - engines: {node: 20 || >=22} - hasBin: true - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -6072,10 +6186,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.0.1: - resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} - engines: {node: 20 || >=22} - jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} @@ -6097,6 +6207,10 @@ packages: jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + jquery-color@2.2.0: resolution: {integrity: sha512-4VoxsLMw860EQGNT/TmP3Lbr7/1OCQlBPS4ILj7bxRApJrPQfpqzdIOTY8Ll9nGY7UHtWqDuzR7cUcS1lcWjVw==} peerDependencies: @@ -6307,6 +6421,10 @@ packages: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + limiter@1.1.5: resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} @@ -6331,6 +6449,10 @@ packages: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -6461,10 +6583,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.0.0: - resolution: {integrity: sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==} - engines: {node: 20 || >=22} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -6656,10 +6774,6 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -7466,10 +7580,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} - path-to-regexp@0.1.10: resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} @@ -7553,6 +7663,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -7577,6 +7691,10 @@ packages: resolution: {integrity: sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==} hasBin: true + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -7605,6 +7723,24 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -7880,6 +8016,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + readline-sync@1.4.10: resolution: {integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==} engines: {node: '>= 0.8.0'} @@ -8096,11 +8236,6 @@ packages: engines: {node: 14 >=14.20 || 16 >=16.20 || >=18} hasBin: true - rimraf@6.0.1: - resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} - engines: {node: 20 || >=22} - hasBin: true - rollup-plugin-visualizer@5.12.0: resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} engines: {node: '>=14'} @@ -8121,6 +8256,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.34.8: + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + router@1.3.8: resolution: {integrity: sha512-461UFH44NtSfIlS83PUg2N7OZo86BC/kB3dY77gJdsODsBhhw7+2uE0tzTINxrY9CahCUVk1VhpWCA5i1yoIEg==} engines: {node: '>= 0.8'} @@ -8653,6 +8793,11 @@ packages: subset-font@2.3.0: resolution: {integrity: sha512-RcB2cu/14zYxGceTnnptlc8uTuxMkVYdyu3Kj+CA1nye6bI1s1cSSp+ApzpkMzl8iAmEUt+zAE0VHvhVpTO/Ig==} + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + summary@2.1.0: resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} @@ -8808,6 +8953,10 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -8920,6 +9069,9 @@ packages: resolution: {integrity: sha512-9GnOA3yiFaqZeHBEZXWa6kqc61FVhAhxQU5g3KLyGrhRr7OsDGRzs+1z35ctvD+hTTEhrBza6D41+qz+3qs7Zw==} engines: {node: '>=18'} + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -8951,6 +9103,25 @@ packages: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} + tsup@8.4.0: + resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + tsx@4.16.2: resolution: {integrity: sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==} engines: {node: '>=18.0.0'} @@ -9815,7 +9986,7 @@ snapshots: '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + picocolors: 1.1.1 '@babel/compat-data@7.25.2': {} @@ -11052,7 +11223,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.4.0 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -11672,7 +11843,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -12020,60 +12191,117 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.32.0': optional: true + '@rollup/rollup-android-arm-eabi@4.34.8': + optional: true + '@rollup/rollup-android-arm64@4.32.0': optional: true + '@rollup/rollup-android-arm64@4.34.8': + optional: true + '@rollup/rollup-darwin-arm64@4.32.0': optional: true + '@rollup/rollup-darwin-arm64@4.34.8': + optional: true + '@rollup/rollup-darwin-x64@4.32.0': optional: true + '@rollup/rollup-darwin-x64@4.34.8': + optional: true + '@rollup/rollup-freebsd-arm64@4.32.0': optional: true + '@rollup/rollup-freebsd-arm64@4.34.8': + optional: true + '@rollup/rollup-freebsd-x64@4.32.0': optional: true + '@rollup/rollup-freebsd-x64@4.34.8': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.32.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.32.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.32.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.34.8': + optional: true + '@rollup/rollup-linux-arm64-musl@4.32.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.34.8': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.32.0': optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.32.0': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.32.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.32.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.34.8': + optional: true + '@rollup/rollup-linux-x64-gnu@4.32.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.34.8': + optional: true + '@rollup/rollup-linux-x64-musl@4.32.0': optional: true + '@rollup/rollup-linux-x64-musl@4.34.8': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.32.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.34.8': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.32.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.34.8': + optional: true + '@rollup/rollup-win32-x64-msvc@4.32.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.34.8': + optional: true + '@sideway/address@4.1.5': dependencies: '@hapi/hoek': 9.3.0 @@ -12612,15 +12840,13 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk@8.3.3: dependencies: - acorn: 8.12.1 - - acorn@8.12.1: {} + acorn: 8.14.0 acorn@8.14.0: {} @@ -13170,6 +13396,11 @@ snapshots: dependencies: run-applescript: 7.0.0 + bundle-require@5.1.0(esbuild@0.25.0): + dependencies: + esbuild: 0.25.0 + load-tsconfig: 0.2.5 + bytes@3.0.0: {} bytes@3.1.2: {} @@ -13330,6 +13561,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chownr@2.0.0: {} ci-info@2.0.0: {} @@ -13579,6 +13814,8 @@ snapshots: transitivePeerDependencies: - supports-color + consola@3.4.0: {} + console-control-strings@1.1.0: {} content-disposition@0.5.4: @@ -14515,7 +14752,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.4.0 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -14554,8 +14791,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -14860,6 +15097,10 @@ snapshots: dependencies: websocket-driver: 0.7.4 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fecha@4.2.3: {} fengari-interop@0.1.3(fengari@0.1.4): @@ -15472,15 +15713,6 @@ snapshots: package-json-from-dist: 1.0.0 path-scurry: 1.11.1 - glob@11.0.0: - dependencies: - foreground-child: 3.2.1 - jackspeak: 4.0.1 - minimatch: 10.0.1 - minipass: 7.1.2 - package-json-from-dist: 1.0.0 - path-scurry: 2.0.0 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -15877,7 +16109,7 @@ snapshots: import-from-esm@1.3.4: dependencies: - debug: 4.3.6(supports-color@5.5.0) + debug: 4.4.0 import-meta-resolve: 4.1.0 transitivePeerDependencies: - supports-color @@ -15910,7 +16142,7 @@ snapshots: ansi-escapes: 4.3.2 figures: 3.2.0 inquirer: 8.2.6 - picocolors: 1.0.1 + picocolors: 1.1.1 run-async: 2.4.1 rxjs: 7.8.1 @@ -16273,12 +16505,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.0.1: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jake@10.9.2: dependencies: async: 3.2.5 @@ -16306,6 +16532,8 @@ snapshots: jose@4.15.9: {} + joycon@3.1.1: {} + jquery-color@2.2.0(jquery@3.7.1): dependencies: jquery: 3.7.1 @@ -16542,6 +16770,8 @@ snapshots: lilconfig@2.1.0: {} + lilconfig@3.1.3: {} + limiter@1.1.5: {} lines-and-columns@1.2.4: {} @@ -16584,6 +16814,8 @@ snapshots: pinkie-promise: 2.0.1 strip-bom: 2.0.0 + load-tsconfig@0.2.5: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -16691,8 +16923,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.0.0: {} - lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -16896,10 +17126,6 @@ snapshots: min-indent@1.0.1: {} - minimatch@10.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -17945,11 +18171,6 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-scurry@2.0.0: - dependencies: - lru-cache: 11.0.0 - minipass: 7.1.2 - path-to-regexp@0.1.10: {} path-to-regexp@0.1.7: {} @@ -18024,6 +18245,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + pidtree@0.6.0: {} pify@2.3.0: {} @@ -18046,6 +18269,8 @@ snapshots: quick-format-unescaped: 4.0.4 sonic-boom: 1.4.1 + pirates@4.0.6: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -18072,6 +18297,14 @@ snapshots: possible-typed-array-names@1.0.0: {} + postcss-load-config@6.0.1(postcss@8.5.1)(tsx@4.16.2)(yaml@2.5.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.1 + tsx: 4.16.2 + yaml: 2.5.0 + postcss-value-parser@4.2.0: {} postcss-values-parser@6.0.2(postcss@8.5.1): @@ -18208,7 +18441,7 @@ snapshots: proxy-agent@6.4.0: dependencies: agent-base: 7.1.1 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.4.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 lru-cache: 7.18.3 @@ -18407,6 +18640,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + readline-sync@1.4.10: {} rechoir@0.6.2: @@ -18622,11 +18857,6 @@ snapshots: dependencies: glob: 10.4.5 - rimraf@6.0.1: - dependencies: - glob: 11.0.0 - package-json-from-dist: 1.0.0 - rollup-plugin-visualizer@5.12.0(rollup@2.79.1): dependencies: open: 8.4.2 @@ -18665,6 +18895,31 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.32.0 fsevents: 2.3.3 + rollup@4.34.8: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 + fsevents: 2.3.3 + router@1.3.8: dependencies: array-flatten: 3.0.0 @@ -19279,6 +19534,16 @@ snapshots: lodash: 4.17.21 p-limit: 3.1.0 + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + summary@2.1.0: {} superagent@7.1.6: @@ -19447,7 +19712,7 @@ snapshots: terser@5.31.3: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.12.1 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -19514,6 +19779,11 @@ snapshots: tinyexec@0.3.2: {} + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@1.0.2: {} tinyrainbow@1.2.0: {} @@ -19612,6 +19882,8 @@ snapshots: '@ts-graphviz/common': 2.1.2 '@ts-graphviz/core': 2.0.3 + ts-interface-checker@0.1.13: {} + ts-node@10.9.2(@types/node@20.5.1)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -19620,7 +19892,7 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.5.1 - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 @@ -19649,6 +19921,33 @@ snapshots: tsscmp@1.0.6: {} + tsup@8.4.0(postcss@8.5.1)(tsx@4.16.2)(typescript@5.5.4)(yaml@2.5.0): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.0) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.0 + debug: 4.4.0 + esbuild: 0.25.0 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.1)(tsx@4.16.2)(yaml@2.5.0) + resolve-from: 5.0.0 + rollup: 4.34.8 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.12 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.1 + typescript: 5.5.4 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsx@4.16.2: dependencies: esbuild: 0.21.5 @@ -19837,7 +20136,7 @@ snapshots: universal-analytics@0.5.3: dependencies: - debug: 4.3.6(supports-color@5.5.0) + debug: 4.4.0 uuid: 8.3.2 transitivePeerDependencies: - supports-color From 7d7118f7443c2045fee0c0f42e1461a213d1d70e Mon Sep 17 00:00:00 2001 From: Miodec Date: Mon, 3 Mar 2025 16:15:49 +0100 Subject: [PATCH 6/8] ci: anticheat shouldnt block ci if force ci labels are present --- .github/workflows/monkey-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/monkey-ci.yml b/.github/workflows/monkey-ci.yml index 5caddde928e6..ff1b895458d1 100644 --- a/.github/workflows/monkey-ci.yml +++ b/.github/workflows/monkey-ci.yml @@ -59,7 +59,7 @@ jobs: - '.github/workflows/**/*' - name: Check Anti-cheat - if: steps.filter.outputs.anti-cheat == 'true' + if: steps.filter.outputs.anti-cheat == 'true' && !contains(github.event.pull_request.labels.*.name, 'force-ci') && !contains(github.event.pull_request.labels.*.name, 'force-full-ci') run: exit 1 - name: Check Workflow Changes From f80dde4c89ecc863391b765ed44220d8b07aad18 Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Mon, 3 Mar 2025 17:43:08 +0100 Subject: [PATCH 7/8] chore(self hosting): run selfhosted backend in prod mode (@fehmer) (#6326) Co-authored-by: Miodec --- .github/workflows/publish-docker-images.yml | 2 + backend/src/anticheat/index.ts | 10 +++- backend/src/constants/base-configuration.ts | 7 +++ backend/src/dal/leaderboards.ts | 46 ++++++++++++++++--- backend/src/init/configuration.ts | 30 +++++++++++- backend/src/init/email-client.ts | 7 ++- backend/src/server.ts | 6 ++- docker/backend-configuration.json | 3 ++ docker/backend/Dockerfile | 15 +++--- docker/backend/applyConfig.sh | 22 --------- docker/backend/entry-point.sh | 1 - docs/SELF_HOSTING.md | 34 +------------- packages/contracts/src/rate-limit/index.ts | 2 +- .../contracts/src/schemas/configuration.ts | 6 +++ 14 files changed, 116 insertions(+), 75 deletions(-) delete mode 100755 docker/backend/applyConfig.sh diff --git a/.github/workflows/publish-docker-images.yml b/.github/workflows/publish-docker-images.yml index 792b92561f99..66c91453babf 100644 --- a/.github/workflows/publish-docker-images.yml +++ b/.github/workflows/publish-docker-images.yml @@ -48,6 +48,8 @@ jobs: push: true tags: ${{ env.BE_REPO }}:latest,${{ steps.bemeta.outputs.tags }} labels: ${{ steps.bemeta.outputs.labels }} + build-args: | + server_version: {{version}} - name: Backend publish description uses: peter-evans/dockerhub-description@e98e4d1628a5f3be2be7c231e50981aee98723ae diff --git a/backend/src/anticheat/index.ts b/backend/src/anticheat/index.ts index 57c52aa34a31..715b799e590e 100644 --- a/backend/src/anticheat/index.ts +++ b/backend/src/anticheat/index.ts @@ -1,10 +1,16 @@ +const hasAnticheatImplemented = process.env["BYPASS_ANTICHEAT"] === "true"; + import { CompletedEvent, KeyStats, } from "@monkeytype/contracts/schemas/results"; +import Logger from "../utils/logger"; export function implemented(): boolean { - return false; + if (hasAnticheatImplemented) { + Logger.warning("BYPASS_ANTICHEAT is enabled! Running without anti-cheat."); + } + return hasAnticheatImplemented; } export function validateResult( @@ -13,6 +19,7 @@ export function validateResult( _uaStringifiedObject: string, _lbOptOut: boolean ): boolean { + Logger.warning("No anticheat module found, result will not be validated."); return true; } @@ -22,5 +29,6 @@ export function validateKeys( _keyDurationStats: KeyStats, _uid: string ): boolean { + Logger.warning("No anticheat module found, key data will not be validated."); return true; } diff --git a/backend/src/constants/base-configuration.ts b/backend/src/constants/base-configuration.ts index 6e5c44a8e8dc..c4c77a770280 100644 --- a/backend/src/constants/base-configuration.ts +++ b/backend/src/constants/base-configuration.ts @@ -96,6 +96,7 @@ export const BASE_CONFIGURATION: Configuration = { xpRewardBrackets: [], }, leaderboards: { + minTimeTyping: 2 * 60 * 60, weeklyXp: { enabled: false, expirationTimeInDays: 0, // This should atleast be 15 @@ -548,6 +549,12 @@ export const CONFIGURATION_FORM_SCHEMA: ObjectSchema = { type: "object", label: "Leaderboards", fields: { + minTimeTyping: { + type: "number", + label: "Minimum typing time the user needs to get on a leaderboard", + hint: "Typing time in seconds. Change is only applied after restarting the server.", + min: 0, + }, weeklyXp: { type: "object", label: "Weekly XP", diff --git a/backend/src/dal/leaderboards.ts b/backend/src/dal/leaderboards.ts index da1ac3d2ba04..76cf52932b23 100644 --- a/backend/src/dal/leaderboards.ts +++ b/backend/src/dal/leaderboards.ts @@ -3,13 +3,16 @@ import Logger from "../utils/logger"; import { performance } from "perf_hooks"; import { setLeaderboard } from "../utils/prometheus"; import { isDevEnvironment } from "../utils/misc"; -import { getCachedConfiguration } from "../init/configuration"; +import { + getCachedConfiguration, + getLiveConfiguration, +} from "../init/configuration"; import { addLog } from "./logs"; import { Collection, ObjectId } from "mongodb"; import { LeaderboardEntry } from "@monkeytype/contracts/schemas/leaderboards"; import { omit } from "lodash"; -import { DBUser } from "./user"; +import { DBUser, getUsersCollection } from "./user"; import MonkeyError from "../utils/error"; export type DBLeaderboardEntry = LeaderboardEntry & { @@ -269,7 +272,11 @@ export async function update( }; } -async function createIndex(key: string): Promise { +async function createIndex( + key: string, + minTimeTyping: number, + dropIfMismatch = true +): Promise { const index = { [`${key}.wpm`]: -1, [`${key}.acc`]: -1, @@ -293,16 +300,41 @@ async function createIndex(key: string): Promise { $gt: 0, }, timeTyping: { - $gt: isDevEnvironment() ? 0 : 7200, + $gt: minTimeTyping, }, }, }; - await db.collection("users").createIndex(index, partial); + try { + await getUsersCollection().createIndex(index, partial); + } catch (e) { + if (!dropIfMismatch) throw e; + if ( + (e as Error).message.startsWith( + "An existing index has the same name as the requested index" + ) + ) { + Logger.warning(`Index ${key} not matching, dropping and recreating...`); + + const existingIndex = (await getUsersCollection().listIndexes().toArray()) + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + .map((it) => it.name as string) + .find((it) => it.startsWith(key)); + + if (existingIndex !== undefined && existingIndex !== null) { + await getUsersCollection().dropIndex(existingIndex); + return createIndex(key, minTimeTyping, false); + } else { + throw e; + } + } + } } export async function createIndicies(): Promise { - await createIndex("lbPersonalBests.time.15.english"); - await createIndex("lbPersonalBests.time.60.english"); + const minTimeTyping = (await getLiveConfiguration()).leaderboards + .minTimeTyping; + await createIndex("lbPersonalBests.time.15.english", minTimeTyping); + await createIndex("lbPersonalBests.time.60.english", minTimeTyping); if (isDevEnvironment()) { Logger.info("Updating leaderboards in dev mode..."); diff --git a/backend/src/init/configuration.ts b/backend/src/init/configuration.ts index 4ac4322087a8..99d316d52846 100644 --- a/backend/src/init/configuration.ts +++ b/backend/src/init/configuration.ts @@ -6,10 +6,21 @@ import { identity } from "../utils/misc"; import { BASE_CONFIGURATION } from "../constants/base-configuration"; import { Configuration } from "@monkeytype/contracts/schemas/configuration"; import { addLog } from "../dal/logs"; -import { PartialConfiguration } from "@monkeytype/contracts/configuration"; +import { + PartialConfiguration, + PartialConfigurationSchema, +} from "@monkeytype/contracts/configuration"; import { getErrorMessage } from "../utils/error"; +import { join } from "path"; +import { existsSync, readFileSync } from "fs"; +import { parseWithSchema as parseJsonWithSchema } from "@monkeytype/util/json"; +import { z } from "zod"; const CONFIG_UPDATE_INTERVAL = 10 * 60 * 1000; // 10 Minutes +const SERVER_CONFIG_FILE_PATH = join( + __dirname, + "../backend-configuration.json" +); function mergeConfigurations( baseConfiguration: Configuration, @@ -138,3 +149,20 @@ export async function patchConfiguration( return true; } + +export async function updateFromConfigurationFile(): Promise { + if (existsSync(SERVER_CONFIG_FILE_PATH)) { + Logger.info( + `Reading server configuration from file ${SERVER_CONFIG_FILE_PATH}` + ); + const json = readFileSync(SERVER_CONFIG_FILE_PATH, "utf-8"); + const data = parseJsonWithSchema( + json, + z.object({ + configuration: PartialConfigurationSchema, + }) + ); + + await patchConfiguration(data.configuration); + } +} diff --git a/backend/src/init/email-client.ts b/backend/src/init/email-client.ts index 8d2ebb71f81d..b98bbd983cc2 100644 --- a/backend/src/init/email-client.ts +++ b/backend/src/init/email-client.ts @@ -44,9 +44,12 @@ export async function init(): Promise { Logger.warning( "No email client configuration provided. Running without email." ); - return; + } else if (process.env["BYPASS_EMAILCLIENT"] === "true") { + Logger.warning("BYPASS_EMAILCLIENT is enabled! Running without email."); + } else { + throw new Error("No email client configuration provided"); } - throw new Error("No email client configuration provided"); + return; } try { diff --git a/backend/src/server.ts b/backend/src/server.ts index 2f4a0a5fef9f..b4415dcc4b95 100644 --- a/backend/src/server.ts +++ b/backend/src/server.ts @@ -1,7 +1,10 @@ import "dotenv/config"; import * as db from "./init/db"; import jobs from "./jobs"; -import { getLiveConfiguration } from "./init/configuration"; +import { + getLiveConfiguration, + updateFromConfigurationFile, +} from "./init/configuration"; import app from "./app"; import { Server } from "http"; import { version } from "./version"; @@ -30,6 +33,7 @@ async function bootServer(port: number): Promise { Logger.info("Fetching live configuration..."); await getLiveConfiguration(); Logger.success("Live configuration fetched"); + await updateFromConfigurationFile(); Logger.info("Initializing email client..."); await EmailClient.init(); diff --git a/docker/backend-configuration.json b/docker/backend-configuration.json index 1fc3cddb62d9..4b9cfa0bbda8 100644 --- a/docker/backend-configuration.json +++ b/docker/backend-configuration.json @@ -11,6 +11,9 @@ }, "dailyLeaderboards": { "enabled": false + }, + "leaderboards":{ + "minTimeTyping": 0 } } } \ No newline at end of file diff --git a/docker/backend/Dockerfile b/docker/backend/Dockerfile index e9b3774c417e..ecb9442ed76d 100644 --- a/docker/backend/Dockerfile +++ b/docker/backend/Dockerfile @@ -20,9 +20,8 @@ RUN pnpm deploy --filter backend --prod /prod/backend ## target image FROM node:20.16.0-alpine3.19 -##install wget, used by the applyConfig script -RUN apk update --no-cache && \ - apk add --no-cache wget +## get server_version from build-arg, default to UNKNOWN +ARG server_version=UNKNOWN # COPY to target COPY --from=builder /prod/backend/node_modules /app/backend/node_modules @@ -37,10 +36,14 @@ WORKDIR /app/backend/dist ## logs RUN mkdir -p /app/backend/dist/logs -COPY ["docker/backend/entry-point.sh", "docker/backend/applyConfig.sh", "./"] +COPY ["docker/backend/entry-point.sh", "./"] -#run in dev mode (no anticheat) -ENV MODE=dev +RUN echo "${server_version}" > /app/backend/dist/server.version + +#run in prod mode, but don't require anti-cheat or email client +ENV MODE=prod +ENV BYPASS_ANTICHEAT=true +ENV BYPASS_EMAILCLIENT=true EXPOSE 5005 USER node diff --git a/docker/backend/applyConfig.sh b/docker/backend/applyConfig.sh deleted file mode 100755 index f3360b396b19..000000000000 --- a/docker/backend/applyConfig.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -if [ -f backend-configuration.json ]; then - echo "waiting for backend..." - - timeout 30 sh -c 'until nc -z $0 $1; do sleep 1; done' localhost 5005 - - if [ $? -ne 0 ]; then - echo "failed to apply config" - exit 1 - fi - - echo "apply server config" - - wget -qO- --method=PATCH \ - --body-data="`cat backend-configuration.json`" \ - --header='Content-Type:application/json' \ - http://localhost:5005/configuration - - echo "server config applied" -else - echo "skip backend configuration" -fi diff --git a/docker/backend/entry-point.sh b/docker/backend/entry-point.sh index 5e31809b65ff..86be423ec69a 100644 --- a/docker/backend/entry-point.sh +++ b/docker/backend/entry-point.sh @@ -1,3 +1,2 @@ #!/bin/sh -./applyConfig.sh & node server.js \ No newline at end of file diff --git a/docs/SELF_HOSTING.md b/docs/SELF_HOSTING.md index 80d4e25ce15d..c9900af9f095 100644 --- a/docs/SELF_HOSTING.md +++ b/docs/SELF_HOSTING.md @@ -162,39 +162,7 @@ Contains your firebase config, only needed if you want to allow users to signup. ### backend-configuration.json -Configuration of the backend. - -If you don't want to update this file manually you can - -- open the backend url in your browser, e.g. `http://localhost:5005/configure/` -- adjust the settings and click `Save Changes` -- click `Export Configuration` -- save the file as `backend-configuration.json`, overwriting the existing one. - -Example output from `http://localhost:5005/configuration`: -```json -{ - "message": "Configuration retrieved", - "data": - { - "maintenance": false, - "results": {}, - .... - } -} -``` - -Example content from `backend-configuration.json`: -``` -{ - "maintenance": false, - "results": {}, - .... -} -``` - -If you have `curl` and `jq` installed you can also run `curl -wO- http://localhost:5005/configuration | jq ".data" > backend-configuration.json` to update the configuration file. - +Configuration of the backend. Check the [default configuration](https://github.com/monkeytypegame/monkeytype/blob/master/backend/src/constants/base-configuration.ts#L8) for possible values. > [!NOTE] > The configuration is applied on container startup only. You have to restart the container for your changes to become active. diff --git a/packages/contracts/src/rate-limit/index.ts b/packages/contracts/src/rate-limit/index.ts index 14a72bc347be..927aab9f9198 100644 --- a/packages/contracts/src/rate-limit/index.ts +++ b/packages/contracts/src/rate-limit/index.ts @@ -13,7 +13,7 @@ export const limits = { }, adminLimit: { - window: 5000, //5 seconds + window: 5000, max: 1, }, diff --git a/packages/contracts/src/schemas/configuration.ts b/packages/contracts/src/schemas/configuration.ts index 6a6cc3d095e8..1d4b404f23e5 100644 --- a/packages/contracts/src/schemas/configuration.ts +++ b/packages/contracts/src/schemas/configuration.ts @@ -111,6 +111,12 @@ export const ConfigurationSchema = z.object({ xpRewardBrackets: z.array(RewardBracketSchema), }), leaderboards: z.object({ + minTimeTyping: z + .number() + .min(0) + .describe( + "Minimum typing time (in seconds) the user needs to get on a leaderboard" + ), weeklyXp: z.object({ enabled: z.boolean(), expirationTimeInDays: z.number().nonnegative(), From 1b5529ccaa59eb4c7b0740950bae1846c80db9aa Mon Sep 17 00:00:00 2001 From: ButterflyOfFire <42316180+BoFFire@users.noreply.github.com> Date: Mon, 3 Mar 2025 17:46:08 +0100 Subject: [PATCH 8/8] feat(languages): add Kabyle 200, 1k, 2k, 5k, 10k (@BoFFire) (#6325) ### Description Added kabyle language corpora. ### Checks - [x] If is a language, did you edit `_list.json`, `_groups.json` and add `languages.json`? - [x] Check if any open issues are related to this PR; if so, be sure to tag them below. - [x] Make sure the PR title follows the Conventional Commits standard. (https://www.conventionalcommits.org for more info) --------- Co-authored-by: Miodec --- frontend/static/languages/_groups.json | 4 + frontend/static/languages/kabyle.json | 207 + frontend/static/languages/kabyle_10k.json | 10007 ++++++++++++++++++++ frontend/static/languages/kabyle_1k.json | 1007 ++ frontend/static/languages/kabyle_2k.json | 2007 ++++ frontend/static/languages/kabyle_5k.json | 5007 ++++++++++ 6 files changed, 18239 insertions(+) create mode 100644 frontend/static/languages/kabyle.json create mode 100644 frontend/static/languages/kabyle_10k.json create mode 100644 frontend/static/languages/kabyle_1k.json create mode 100644 frontend/static/languages/kabyle_2k.json create mode 100644 frontend/static/languages/kabyle_5k.json diff --git a/frontend/static/languages/_groups.json b/frontend/static/languages/_groups.json index 111e9d730fba..b309454c834b 100644 --- a/frontend/static/languages/_groups.json +++ b/frontend/static/languages/_groups.json @@ -581,6 +581,10 @@ "occitan_10k" ] }, + { + "name": "kabyle", + "languages": ["kabyle", "kabyle_1k", "kabyle_2k", "kabyle_5k", "kabyle_10k"] + }, { "name": "zulu", "languages": ["zulu"] diff --git a/frontend/static/languages/kabyle.json b/frontend/static/languages/kabyle.json new file mode 100644 index 000000000000..264c2402a7cf --- /dev/null +++ b/frontend/static/languages/kabyle.json @@ -0,0 +1,207 @@ +{ + "name": "kabyle", + "bcp47": "kab", + "orderedByFrequency": false, + "words": [ + "abrid", + "acku", + "acḥal", + "ahat", + "akk", + "akked", + "akken", + "alamma", + "almi", + "amaynut", + "amdan", + "amek", + "ameqqran", + "ameqran", + "amezwaru", + "anwa", + "argaz", + "armi", + "aseggas", + "aselway", + "asmi", + "ass-a", + "assaɣ", + "awal", + "axxam", + "aya", + "ayagi", + "aɣelnaw", + "aṭas", + "bgayet", + "bɣiɣ", + "cwiṭ", + "d-yenna", + "dagi", + "dakken", + "dayen", + "daɣen", + "ddaw", + "ddunit", + "deffir", + "deg-s", + "dɣa", + "fell-as", + "fransa", + "ideg", + "ilaq", + "iman-is", + "imdanen", + "imezdaɣ", + "iruḥ", + "iseggasen", + "isem", + "isem-is", + "iwakken", + "iyi", + "kečč", + "kraḍ", + "ladɣa", + "leqbayel", + "lezzayer", + "llan", + "llant", + "lliɣ", + "lḥal", + "maca", + "mazal", + "mačči", + "mebla", + "medden", + "melmi", + "meqqren", + "merra", + "meɣres", + "mliḥ", + "mmi-s", + "naɣ", + "nekk", + "nettat", + "nezmer", + "neɣ", + "niḍen", + "nneɣ", + "nni", + "nnig", + "nniḍen", + "nsen", + "qqaren", + "rebbi", + "rnu", + "snat", + "syin", + "sɣur", + "taddart", + "taggara", + "taggayt", + "tamaziɣt", + "tamdint", + "tamezwarut", + "tameṭṭut", + "tamurt", + "taqbaylit", + "tayri", + "tazwara", + "taɛrabt", + "taɣiwant", + "tebɣiḍ", + "temdint", + "teqbaylit", + "terbaɛt", + "tesɛa", + "tezmert", + "teɣzi", + "tidet", + "tikkelt", + "tikli", + "tikwal", + "tili", + "tizi", + "tiɣremt", + "tmaziɣt", + "tmura", + "tmurt", + "tudert", + "tugna", + "tutlayin", + "tutlayt", + "tuɣal", + "twilayt", + "tzemreḍ", + "tɣiwant", + "ubrid", + "ugafa", + "ulac", + "umaḍal", + "umdan", + "umi", + "unfafad", + "uqbel", + "useggas", + "uxxam", + "wakud", + "waman", + "wass", + "wawal", + "waya", + "wayen", + "wayeḍ", + "waṭas", + "wiyaḍ", + "wudem", + "wussan", + "xas", + "yakk", + "yal", + "yebda", + "yebrir", + "yebɣa", + "yelhan", + "yella", + "yellan", + "yelli", + "yemdanen", + "yemma", + "yemmut", + "yenna", + "yenna-d", + "yennayer", + "yeqqim", + "yerna", + "yernu", + "yessefk", + "yesɛa", + "yesɛan", + "yexdem", + "yezmer", + "yezmir", + "yezrin", + "yid-s", + "yili", + "yiman-is", + "yimdanen", + "yimezdaɣen", + "yir", + "yiseggasen", + "yisem", + "yiwen", + "yiwet", + "yiḍ", + "yuɣal", + "zdat", + "zedɣen-tt", + "zemreɣ", + "zik", + "ɣas", + "ɣef", + "ɣer", + "ɣur", + "ɣur-s", + "ẓeṛ", + "ẓriɣ" + ] +} diff --git a/frontend/static/languages/kabyle_10k.json b/frontend/static/languages/kabyle_10k.json new file mode 100644 index 000000000000..5a9a567ef471 --- /dev/null +++ b/frontend/static/languages/kabyle_10k.json @@ -0,0 +1,10007 @@ +{ + "name": "kabyle_10k", + "bcp47": "kab", + "orderedByFrequency": false, + "words": [ + "-ad", + "-amezwaru-iw", + "-as", + "-is", + "-nni", + "-paris", + "-ssuffɣen", + "-tt", + "-wis", + "a-t", + "a-t-an", + "ababat", + "abadu", + "abaɣur", + "abeddel", + "abelkim", + "abeqqeḍ", + "aberkan", + "abernus", + "aberrani", + "aberraḥ", + "abeɛda", + "abeḥri", + "ableɣ", + "ablidi", + "ablug", + "abranis", + "abrid", + "abrid-a", + "abrid-agi", + "abrid-is", + "abrid-nsen", + "abriṭani", + "abruy", + "abuciḍan", + "abugaṭu", + "abuniqi", + "abusṭawi", + "abǧawi", + "accemma", + "acciwen", + "acebbub", + "acebbub-is", + "acebcal", + "acebḥan", + "acegger", + "acemma", + "acemmek", + "acengu", + "acennay", + "acetki", + "acewwiq", + "aci", + "acimi", + "acinwat", + "acku", + "acmumeḥ", + "acraḍ", + "acu-t", + "acu-ten", + "acu-tent", + "acu-tt", + "acukan", + "acuɣer", + "acuɣeṛ", + "acḥal", + "acḥal-aya", + "ad-as", + "ad-d", + "adabu", + "adamsan", + "adawsan", + "adaynin", + "addad", + "addaden", + "addal", + "adday", + "addayen", + "addon", + "addud", + "addud-is", + "adduf", + "adeg", + "adeg-aɣella", + "adekkar", + "adellel", + "adelsan", + "aderbal", + "aderrer", + "aderwic", + "aderɣal", + "adfel", + "adig", + "adigan", + "adisan", + "adiwenni", + "adjal", + "adlis", + "adlis-a", + "adlis-agi", + "adlis-is", + "adlis-nni", + "adrar", + "adras", + "adraɛ", + "adrim", + "adrum", + "adu-tfesna", + "adu-twacult", + "adzayri", + "adɣar", + "af-d", + "afares", + "afaris", + "afaylu", + "afaylu-agi", + "afecku", + "afeggag", + "afella", + "afellay", + "afellaḥ", + "afen", + "afenǧal", + "aferdis", + "aferraɛ", + "afessas", + "afeɣ", + "afgan", + "afmiḍi", + "afrag", + "afran", + "afransis", + "afraq", + "afrensis", + "afriwen", + "afriwen-is", + "afrux", + "afud", + "afurk", + "afus", + "afus-ik", + "afus-is", + "afus-iw", + "afɣanistan", + "afṛensis", + "agafa", + "agafan", + "agalis", + "agaman", + "agaraw", + "agatu", + "agbur", + "agdal", + "agdazal", + "agdil", + "agdud", + "agdudan", + "ageffur", + "agejdan", + "ageldan", + "ageldun", + "agellid", + "agellus", + "agelmim", + "agemmay", + "agemmuḍ", + "agensan", + "agensas", + "agensu", + "agerdas", + "agerruj", + "agezdu", + "agezlan", + "ageṭṭum", + "aggay", + "agilal", + "agim", + "agiṭar", + "aglam", + "aglawan", + "aglim", + "aglim-is", + "aglizi", + "agmam", + "agman", + "agmar", + "agmuḍ", + "agmuḍan", + "agrakal", + "agraw", + "agrawliw", + "agraɣlan", + "agreɣlan", + "agrigi", + "agris", + "agrud", + "agrudem", + "agujil", + "agummu", + "agwni", + "agzam", + "agzul", + "ahad", + "ahat", + "aheggi", + "ahendi", + "aheyyi", + "ahil", + "ahilen", + "ahmed-nacer", + "ahras", + "ahrawan", + "ajapuni", + "ajdid", + "ajenwi", + "ajerred", + "ajerriḍ", + "ajeǧǧig", + "ajgu", + "ajiniral", + "ajjed", + "ak-", + "ak-d-iniɣ", + "akabar", + "akamruni", + "akanadi", + "akaram", + "akat", + "akatar", + "akaten", + "akayad", + "akaɣeḍ", + "akellex", + "akemmel", + "akemmus", + "aken", + "akenni", + "akessar", + "akeyyef", + "akk", + "akk-a", + "akk-agi", + "akk-d", + "akk-en", + "akk-n", + "akk-nni", + "akkagi", + "akked", + "akken", + "akken-it", + "akkenni", + "akkin", + "akkit", + "akkw", + "aklan", + "aklasiki", + "akli", + "akman", + "akruran", + "aksil", + "akter", + "aktum", + "akud", + "akufi", + "akukru", + "akw", + "akwd", + "al-d", + "aladɣa", + "alama", + "alami", + "alamma", + "alammi", + "alarmi", + "alatin", + "alatini", + "albanya", + "albaɛḍ", + "alegdis", + "alemmas", + "aleqqaq", + "aleqqem", + "allal", + "allalen", + "allaɣ", + "allaɣ-is", + "allaɣ-iw", + "allen-ik", + "allen-is", + "allen-iw", + "allen-nsen", + "allus", + "alluy", + "almani", + "almend", + "almi", + "alqayan", + "alqem", + "alsan", + "alugen", + "aluḍ", + "alɣem", + "alɣu", + "alɣuɣ", + "amagday", + "amagnu", + "amagrad", + "amahil", + "amajur", + "amakar", + "amaklas", + "amalal", + "amalay", + "amallal", + "amalu", + "aman-nni", + "amarag", + "amaray", + "amarikan", + "amarikani", + "amarir", + "amarraw", + "amaru", + "amaruz", + "amasal", + "amasay", + "amasiḥi", + "amaslaḍ", + "amassan", + "amastan", + "amaswaḍ", + "amatar", + "amatu", + "amawal", + "amaway", + "amaynu", + "amaynut", + "amazan", + "amazday", + "amazellaw", + "amazigh", + "amazighe", + "amaziɣ", + "amazrar", + "amazray", + "amazzal", + "amaɣnu", + "amaḍal", + "amaḍlan", + "amaṭṭaf", + "amaẓrag", + "amcic", + "amcic-nni", + "amcum", + "amda", + "amdakel", + "amdakkel", + "amdal", + "amdan", + "amdan-nni", + "amdya", + "amectuḥ", + "amecwar", + "amecwar-is", + "amecwaṛ", + "amecṭuḥ", + "ameddakel", + "ameddakel-is", + "ameddakkel", + "amedya", + "amedyaz", + "ameggaz", + "amegrud", + "amejjay", + "amek", + "amekkan", + "amekla", + "ameksa", + "amellal", + "amelwi", + "amelyun", + "amenkad", + "amenkud", + "amennuɣ", + "amennuɣ-is", + "amensay", + "amenyaf", + "amenzu", + "amenḍar", + "amenẓaw", + "ameqqran", + "ameqqṛan", + "ameqran", + "ameqṛan", + "amerkanti", + "amernu", + "amesbaṭli", + "amesgunef", + "ameskan", + "ameskar", + "ameslaw", + "ameslay", + "amesni", + "amesri", + "amessarti", + "amestan", + "ameyyez", + "amezday", + "amezdaɣ", + "amezgun", + "amezruy", + "amezwar", + "amezwaru", + "amezwer", + "amezzay", + "amezzwaru", + "ameɣbun", + "ameɣlal", + "ameɣnas", + "ameɣras", + "ameɣri", + "ameɣtu", + "ameḥbus", + "ameṛkanti", + "ameṛṛuk", + "ameẓlu", + "ameẓyan", + "ameẓẓuɣ", + "ameẓẓyan", + "amgarad", + "amgaru", + "amgired", + "amhad", + "amhaz", + "amidadi", + "amidya", + "amihaw", + "amihi", + "amiran", + "amizur", + "amizzwer", + "amiḍan", + "amjahed", + "amkan", + "amkan-is", + "amkuẓ", + "ammar", + "ammas", + "ammud", + "amnadi", + "amnar", + "amnay", + "amneɣ", + "amnir", + "amqim", + "amqqran", + "amrabeḍ", + "amrar", + "amray", + "amraḥ", + "amrig", + "amruc", + "amsal", + "amsaltu", + "amsaɣ", + "amseddas", + "amsefrak", + "amseksum", + "amselḥu-anemhal", + "amseḍru", + "amsugen", + "amtawa", + "amtawi", + "amtiweg", + "amud", + "amuddir", + "amulli", + "amuqran", + "amur-is", + "amurakuc", + "amusnak", + "amusnaw", + "amussnaw", + "amussu", + "amussu-a", + "amuḍin", + "amwanes", + "amyag", + "amyaraw", + "amyaru", + "amyiwen", + "amyurar", + "amyurar-a", + "amzun", + "amɛellem", + "amɣar", + "amɣaw", + "amḍan", + "amḍiq", + "amḍiq-is", + "amḥaddi", + "anabaḍ", + "anaddal", + "anadi", + "anaf", + "anafag", + "anafuk", + "anagar", + "anagi", + "anagraw", + "anamek", + "anamek-is", + "anasiw", + "anaw", + "anawen", + "anazuṛ", + "anaḍ", + "anaṭlas", + "anaẓur", + "anda-nniḍen", + "anda-t", + "anda-tt", + "anebbaḍ", + "anebdu", + "anect", + "anect-a", + "anect-agi", + "anect-nni", + "anecta", + "anedbal", + "anef", + "anef-as", + "anef-iyi", + "aneflay", + "aneggaf", + "aneggar", + "aneggaru", + "aneggaru-a", + "aneggaru-agi", + "aneggez", + "anegmar", + "anegzum", + "anehhar", + "anejmuɛ", + "anekcam", + "anekcum", + "anekruf", + "anelmad", + "anemgal", + "anemhal", + "anep", + "aneqqis", + "anermis", + "anerni", + "anesbaɣur", + "anezgum", + "anezri", + "anezway", + "anezwu", + "anezḍay", + "aneɣ", + "aneɣfal", + "aneɣlaf", + "aneɣmas", + "aneṣli", + "aneẓruf", + "anfa", + "anfafad", + "anfafad-a", + "anfufed", + "angal", + "angaz", + "anican", + "anida", + "anida-t", + "anida-ten", + "anida-tt", + "anili", + "aniwer", + "aniɣer", + "anmeggag", + "anmetti", + "annar", + "annay", + "annaɣ", + "annect-a", + "annect-agi", + "annect-en", + "annect-nni", + "annecta", + "ansay", + "ansayen", + "ansuf", + "antraktika", + "anumidi", + "anuḍaf", + "anwa", + "anwa-t", + "anwi", + "anyir", + "anzaren", + "anzi", + "anɛam", + "anɣal", + "anɣel", + "anṣuf", + "anẓar", + "anẓid", + "anẓul", + "apyanu", + "apṛuksi", + "aqader", + "aqamum", + "aqbal", + "aqbayli", + "aqbu", + "aqbur", + "aqbuṛ", + "aqcic", + "aqcic-nni", + "aqdim", + "aqeddac", + "aqendur", + "aqerru", + "aqerru-s", + "aqerruy", + "aqerruy-is", + "aqerruy-iw", + "aqeṛṛu", + "aqjun", + "aqjun-nni", + "aql-ak", + "aql-aɣ", + "aql-i", + "aql-ik", + "aql-ikem", + "aql-iyi", + "aqlaɣ", + "aqli", + "aqmaḍ", + "aqrab", + "aqrur", + "aquran", + "arama", + "arameɣtu", + "aratak", + "araz", + "araǧu", + "ardekal", + "aredqal", + "arekti", + "areqqaq", + "arewway", + "arezki", + "arezqi", + "areẓqi", + "argaz", + "argaz-a", + "argaz-agi", + "argaz-is", + "argaz-iw", + "argaz-nni", + "arif", + "arim", + "aristote", + "arjentin", + "arkawal", + "armad", + "armeɣtu", + "armi", + "arminya", + "armud", + "arnu", + "arrac", + "arraw", + "arraw-is", + "arraw-iw", + "arraw-nsen", + "arraz", + "arrazen", + "arrif", + "arumani", + "arumi", + "arurad", + "arured", + "arusi", + "arussin", + "aruɣ", + "arwas", + "arway", + "as-d", + "as-d-", + "as-d-yezzin", + "as-fken", + "as-inin", + "as-iniɣ", + "as-nniɣ", + "as-qqaren", + "as-tini", + "as-tiniḍ", + "as-yefk", + "as-yehwa", + "as-yehwan", + "as-yenna", + "as-yennan", + "as-yeqqar", + "as-yini", + "asafar", + "asafar-a", + "asafu", + "asaka", + "asalay", + "asalel", + "asali", + "asallaf-is", + "asalu", + "asamar", + "asammar", + "asarag", + "asaru", + "asaru-nni", + "asawen", + "asayes", + "asaḍ", + "asaḍas", + "asaḍuf", + "asbadu", + "asbeddi", + "asdawan", + "asduklan", + "asebded", + "asebtar", + "asebter", + "asedger", + "asefk", + "asefrak", + "asefrek", + "asefru", + "asegbar", + "aseggas", + "aseggas-a", + "aseggem", + "asegmi", + "asegwas", + "asegzawal", + "asegzi", + "asekcem", + "asekker", + "asekkeṛ", + "asekkil", + "asekkir", + "asekkud", + "aseklan", + "asekles", + "aseklu", + "asekyed", + "asekḥer", + "aselkem", + "aselket", + "aselkim", + "aselkin", + "aselmad", + "aselmed", + "aselsu", + "aselway", + "asemday", + "asemdu", + "asemlal", + "asemmad", + "asemmaḍ", + "asemmili", + "asemmiḍ", + "asemran", + "asemres", + "asemɣer", + "asen", + "asen-", + "asen-d", + "asenduq", + "asenfar", + "asenfar-a", + "asenfaṛ", + "asenker", + "asennan", + "asenqad", + "asenqed", + "asenqes", + "asensu", + "asent", + "asentel", + "asentel-agi", + "asentel-inek", + "asentem", + "asenǧaq", + "aseqdac", + "aseqdac-agi", + "aseqdec", + "aseqqamu", + "aserdas", + "aserdasi", + "aserdun", + "aserreḥ", + "asertan", + "asertay", + "aserti", + "asesmel", + "asesteb", + "asettengel", + "asewwi", + "asexdem", + "aseɣti", + "aseɣwen", + "aseɣzef", + "aseɣẓan", + "aseḥbes", + "aseḥbiber", + "asfaylu", + "asfel", + "asfugel", + "asfuggel", + "asget", + "asgunfu", + "asideg", + "asider", + "asif", + "asiggez", + "asigna", + "asignew", + "asikel", + "asileɣ", + "asirem", + "asismel", + "asiwel", + "asiweḍ", + "asizdeg", + "asiɣzef", + "asiḍen", + "asiẓi", + "asiẓreg", + "askan", + "askasi", + "aslem", + "asleɣmay", + "asma", + "asmekti", + "asmel", + "asmel-inek", + "asmi", + "asmil", + "asmizzwer", + "asmutti", + "asnas", + "asnawan", + "asnerni", + "asnifel", + "asnirem", + "asnudran", + "asnulfu", + "asqamu", + "asqerdec", + "asqif", + "asrag", + "ass-", + "ass-a", + "ass-agi", + "ass-mi", + "ass-n", + "ass-nni", + "assa", + "assaɣ", + "assaɣen", + "assmi", + "assufeɣ", + "asteqsi", + "asuddem", + "asuddes", + "asudu", + "asuf", + "asuffeɣ", + "asulay", + "asumer", + "asun", + "asunded", + "asuneɣ", + "asurdu", + "asuref", + "asurif", + "asusam", + "asusru", + "asuter", + "asuɣu", + "asuḍḍen", + "asuṭad", + "aswir", + "asya", + "asɛeddi", + "asɣal", + "asɣan", + "asɣar", + "asḥissef", + "atan", + "ataram", + "atas", + "ataya", + "aterras", + "atg", + "atikni", + "atmaten", + "atmaten-is", + "atnan", + "atni", + "atrar", + "atraren", + "attan", + "attekki", + "atug", + "avidyu", + "avirus", + "avirus-a", + "awadem", + "awah", + "awal", + "awal-a", + "awal-agi", + "awal-ik", + "awal-is", + "awal-iw", + "awal-nsen", + "awalen", + "awanak", + "awanek", + "awaqqur", + "awelleh", + "awen", + "awennez", + "awennit", + "awennit-agi", + "aweqqas", + "awer", + "awexxer", + "awez", + "awezlan", + "awezzlan", + "awezɣi", + "awgelhan", + "awgelhen", + "awi", + "awi-d", + "awi-t", + "awid", + "awint", + "awitay", + "awiǧit", + "awiɣ", + "awniri", + "awras", + "awraɣ", + "awren", + "awrir", + "awtem", + "awtul", + "awudem", + "awurman", + "awway", + "awḍen", + "awḍeɣ", + "awḥid", + "axatar", + "axater", + "axateṛ", + "axaṭer", + "axeddam", + "axeddim", + "axeddim-is", + "axeddim-iw", + "axeddim-nni", + "axemmem", + "axessar", + "axeṣṣar", + "axir", + "axiṛ", + "axxam", + "axxam-a", + "axxam-is", + "axxam-iw", + "axxam-nneɣ", + "axxam-nni", + "axxam-nsen", + "ay-a", + "ay-agi", + "ay-n", + "ay-nni", + "aya", + "ayagi", + "ayalas", + "ayaziḍ", + "aydeg", + "aydi", + "ayeffus", + "ayefki", + "ayefus", + "ayen-nni", + "ayen-nniḍen", + "ayendin", + "ayenni", + "ayfus", + "ayi", + "ayla", + "ayla-nsen", + "ayla-s", + "ayla-w", + "aylal", + "aymi", + "ayt", + "ayyes", + "ayyi", + "ayyur", + "ayyuren", + "ayɣef", + "ayɣer", + "ayɣeṛ", + "azadur", + "azagir", + "azaglu", + "azal-is", + "azalen", + "azamul", + "azamul-is", + "azarug", + "azarug-is", + "azayez", + "azaɣar", + "azbu", + "azdal", + "azday", + "azedgan", + "azeggaɣ", + "azegrir", + "azegrir-agi", + "azegza", + "azegzaw", + "azekka", + "azekka-nni", + "azelmaḍ", + "azem", + "azemmur", + "azemni", + "azemz", + "azen", + "azenziɣ", + "azeqqur", + "azerfan", + "azewwaɣ", + "azeṭṭa", + "azgen", + "azger", + "azilal", + "aziraz", + "azmul", + "azniq", + "azrar", + "azref", + "azrem", + "azrir", + "azuk", + "azuk-is", + "azul", + "azuran", + "azuzer", + "azwaw", + "azwel", + "azwu", + "azzayri", + "azɣal", + "azɣar", + "aččar", + "aččuran", + "aɛdaw", + "aɛebbi", + "aɛebbuḍ", + "aɛeddi", + "aɛeggal", + "aɛekkaz", + "aɛeqqa", + "aɛessas", + "aɛeyyer", + "aɛiwed", + "aɛlayan", + "aɛli", + "aɛmar", + "aɛmer", + "aɛni", + "aɛrab", + "aɛraben", + "aɛrur", + "aɛudiw", + "aɛwin", + "aɛyiɣ", + "aɛzal", + "aɛziz", + "aɛzizen", + "aɣ-", + "aɣ-d", + "aɣ-d-", + "aɣ-d-yenna", + "aɣanib", + "aɣaram", + "aɣarim", + "aɣawas", + "aɣbalu", + "aɣbar", + "aɣbel", + "aɣbel-a", + "aɣebbar", + "aɣella", + "aɣelluy", + "aɣelnaw", + "aɣelsan", + "aɣen", + "aɣerbaz", + "aɣerfan", + "aɣerman", + "aɣerrabu", + "aɣersiw", + "aɣewwar", + "aɣewwaṛ", + "aɣezfan", + "aɣezzfan", + "aɣeɣ", + "aɣilas", + "aɣilif", + "aɣir", + "aɣisan", + "aɣlad", + "aɣlan", + "aɣlif", + "aɣmis", + "aɣrab", + "aɣref", + "aɣrib", + "aɣrud", + "aɣrum", + "aɣtas", + "aɣucaf", + "aɣurar", + "aɣurbiz", + "aɣyul", + "aɣṛum", + "aḍar", + "aḍebsi", + "aḍfas", + "aḍris", + "aḍu", + "aḥader", + "aḥbas", + "aḥbib", + "aḥebbus", + "aḥeddad", + "aḥeqqani", + "aḥeqqi", + "aḥerfi", + "aḥezzeb", + "aḥlil", + "aḥmayan", + "aḥmed", + "aḥnin", + "aḥraz", + "aḥric", + "aḥric-a", + "aḥuddu", + "aḥulfu", + "aṛezqi", + "aṛumani", + "aṛumi", + "aṣqif", + "aṭan", + "aṭas", + "aṭaṣ", + "aṭelyani", + "aṭlas", + "aṭlasi", + "aṭṭan", + "aṭṭan-a", + "aṭṭan-agi", + "aṭṭanen", + "aṭṭas", + "aẓar", + "aẓar-is", + "aẓawali", + "aẓawan", + "aẓayer", + "aẓaṛ", + "aẓeffun", + "aẓekka", + "aẓelmaḍ", + "aẓeṭṭa", + "aẓidan", + "aẓru", + "bab-as", + "bab-is", + "baba-k", + "baba-m", + "baba-s", + "baba-tsen", + "bacir", + "bade-wurtemberg", + "badi", + "badis", + "bakir", + "banen", + "banen-d", + "banent", + "barṣa", + "basse-saxe", + "batnet", + "baṭel", + "baṭlimus", + "bbw", + "bdan", + "bdant", + "bdiɣ", + "bdu", + "bdun", + "bduɣ", + "beccar", + "bedd", + "beddel", + "bedden", + "beddent", + "beddeɣ", + "beddlen", + "beddlent", + "beddleɣ", + "beddu", + "bedlen", + "begsen", + "bejaia", + "belaid", + "belkacem", + "belqa", + "belqasem", + "belɛebbas", + "belɛen", + "belɛid", + "benmuhub", + "bennay", + "bennun", + "benɛuf", + "beqqeḍ", + "beqqu", + "beramtane", + "berka", + "berkukes", + "berqa", + "berriken", + "berru", + "bessif", + "bexlaf", + "bezzaf", + "beɛden", + "beḍḍu", + "beṛka", + "beṛṛa", + "beṭṭu", + "bgayet", + "bih", + "biljik", + "bir", + "bisekstil", + "bnadem", + "bnan", + "bni", + "bnin", + "bniɣ", + "bnun", + "bordj", + "brahim", + "brandshortname", + "brizil", + "briṭanya", + "brtv", + "budawed", + "budrar", + "bufarik", + "bugud", + "bukus", + "bulgarya", + "bulifa", + "buluɣin", + "bumedyen", + "bumerdas", + "bumilkar", + "burgiba", + "burj", + "burkina", + "bururu", + "burǧ", + "busnya", + "bussaɛd", + "busɛada", + "busṭun", + "butefliqa", + "buturin", + "buzgan", + "buɛlam", + "buɛli", + "buɛririǧ", + "buɣni", + "buḍyaf", + "buṣuf", + "bxir", + "bɣan", + "bɣant", + "bɣin", + "bɣiɣ", + "bɣu", + "bɣun", + "bɣuɣ", + "bḍan", + "bḍu", + "bḍun", + "c'est", + "cabḥa", + "cadli", + "carlu", + "caɛban", + "cbaḥa", + "cbirdu", + "ccama", + "ccan", + "ccbaḥa", + "ccedda", + "ccehwa", + "ccek", + "ccekk", + "ccer", + "ccerfa", + "ccerq", + "ccerṭ", + "ccetla", + "ccetwa", + "ccfawat", + "ccfaya", + "ccif", + "ccil", + "ccinwa", + "ccix", + "ccix-nni", + "cciɛa", + "cciɛat", + "cciṭan", + "cclef", + "ccna", + "ccnawi", + "ccrab", + "ccreɛ", + "ccuq", + "ccwal", + "ccwi", + "ccɣel", + "ccɣel-a", + "ccɣel-agi", + "ccɣel-is", + "ccḍeḥ", + "ccṛeɛ", + "cebḥen", + "cedda", + "cedhaɣ", + "cemmini", + "cennun", + "cennuɣ", + "ceyyɛen", + "ceɣleɣ", + "ceḍḥeɣ", + "cfawat", + "cfiɣ", + "cfu", + "chabane", + "cherif", + "cican", + "cikkeɣ", + "cili", + "cinwa", + "cix", + "ciṭ", + "ciṭuḥ", + "ciṭṭuḥ", + "cliɛen", + "cliɛeɣ", + "cnuɣ", + "creɛ", + "creḍ", + "crif", + "ctamber", + "ctember", + "cukkeɣ", + "cwal", + "cwit", + "cwiya", + "cwiyya", + "cwiṭ", + "cɣel", + "cɣel-a", + "cṛeɛ", + "d-afen", + "d-afeɣ", + "d-asen", + "d-aseɣ", + "d-awin", + "d-awiɣ", + "d-awḍen", + "d-aɣen", + "d-aɣeɣ", + "d-banen", + "d-cliɛeɣ", + "d-ffɣen", + "d-ffɣeɣ", + "d-fkan", + "d-fken", + "d-gren", + "d-iban", + "d-ibanen", + "d-ibedd", + "d-ibedden", + "d-igan", + "d-igellun", + "d-iger", + "d-iheyya", + "d-ikecmen", + "d-ilal", + "d-ilin", + "d-ilint", + "d-ilul", + "d-ilulen", + "d-imeslay", + "d-immalen", + "d-inin", + "d-iniɣ", + "d-inna", + "d-iteddun", + "d-iteffeɣ", + "d-iteffɣen", + "d-itteddun", + "d-ittunefken", + "d-iwekked", + "d-izgan", + "d-iɛeddan", + "d-iḍefren", + "d-iḍerrun", + "d-iḥella", + "d-iḥelli", + "d-jemɛen", + "d-kecmen", + "d-kkren", + "d-kkreɣ", + "d-mazal", + "d-naf", + "d-nawi", + "d-naɣ", + "d-nebder", + "d-nemmeslay", + "d-nenna", + "d-nernu", + "d-nerr", + "d-nesmekti", + "d-newwi", + "d-nger", + "d-nini", + "d-nnan", + "d-nniɣ", + "d-nufa", + "d-nufi", + "d-nuɣal", + "d-qqaren", + "d-qqareɣ", + "d-rnun", + "d-rren", + "d-rreɣ", + "d-sbedden", + "d-sersen", + "d-suffɣen", + "d-taf", + "d-tafeḍ", + "d-tas", + "d-taseḍ", + "d-taweḍ", + "d-tawi", + "d-tawiḍ", + "d-tban", + "d-tebda", + "d-teffeɣ", + "d-tefk", + "d-tefka", + "d-tefkeḍ", + "d-tekcem", + "d-tekka", + "d-tella", + "d-telli", + "d-tenna", + "d-tenniḍ", + "d-teqqar", + "d-teqqareḍ", + "d-terr", + "d-terreḍ", + "d-ters", + "d-tesnulfuḍ", + "d-tessiẓrig", + "d-tessuffeɣ", + "d-tettban", + "d-tettili", + "d-tewweḍ", + "d-tewwi", + "d-tewwiḍ", + "d-tezga", + "d-tezzi", + "d-teǧǧa", + "d-teɣli", + "d-tili", + "d-tini", + "d-tiniḍ", + "d-tlul", + "d-ttaken", + "d-ttawin", + "d-tufiḍ", + "d-tusa", + "d-tusiḍ", + "d-tuɣal", + "d-tuɣaleḍ", + "d-tuɣeḍ", + "d-ufan", + "d-ufiɣ", + "d-uran", + "d-usan", + "d-usiɣ", + "d-uɣalen", + "d-uɣaleɣ", + "d-uɣeɣ", + "d-wekden", + "d-wwin", + "d-wwiɣ", + "d-wwḍen", + "d-yaf", + "d-yali", + "d-yas", + "d-yasen", + "d-yaweḍ", + "d-yawi", + "d-yawin", + "d-yaɣ", + "d-ye", + "d-yebda", + "d-yebdan", + "d-yebder", + "d-yecliɛ", + "d-yedda", + "d-yeddan", + "d-yeddem", + "d-yeffeɣ", + "d-yeffɣen", + "d-yefk", + "d-yefka", + "d-yefkan", + "d-yefken", + "d-yefɣen", + "d-yeggran", + "d-yeggri", + "d-yegla", + "d-yeglan", + "d-yeglu", + "d-yeglun", + "d-yegran", + "d-yegren", + "d-yegri", + "d-yekcem", + "d-yekk", + "d-yekka", + "d-yekkan", + "d-yekker", + "d-yekkren", + "d-yeldi", + "d-yelhan", + "d-yelhu", + "d-yella", + "d-yellan", + "d-yelli", + "d-yemmalen", + "d-yemmeslay", + "d-yemmeslayen", + "d-yenna", + "d-yennan", + "d-yenni", + "d-yennulfa", + "d-yennulfan", + "d-yeqqar", + "d-yeqqaren", + "d-yeqqim", + "d-yeqqimen", + "d-yerbeḥ", + "d-yerna", + "d-yernan", + "d-yernu", + "d-yernun", + "d-yerr", + "d-yerra", + "d-yerran", + "d-yerren", + "d-yerri", + "d-yersen", + "d-yerzan", + "d-yesbedd", + "d-yesbedden", + "d-yesken", + "d-yesnulfa", + "d-yesnulfan", + "d-yesnulfu", + "d-yessawalen", + "d-yessawel", + "d-yessawlen", + "d-yessefhem", + "d-yessufeɣ", + "d-yessuffeɣ", + "d-yettak", + "d-yettaken", + "d-yettakken", + "d-yettas", + "d-yettasen", + "d-yettawi", + "d-yettawin", + "d-yettban", + "d-yettbanen", + "d-yetteddun", + "d-yettili", + "d-yettilin", + "d-yettmeslayen", + "d-yettunefken", + "d-yettuɣal", + "d-yettuɣalen", + "d-yettwamudden", + "d-yewwet", + "d-yewweḍ", + "d-yewwi", + "d-yewwin", + "d-yewwḍen", + "d-yexdem", + "d-yexleq", + "d-yezga", + "d-yezgan", + "d-yezzi", + "d-yezzin", + "d-yeǧǧa", + "d-yeǧǧan", + "d-yeɣli", + "d-yeɣlin", + "d-yeḍra", + "d-yeḍran", + "d-yeḍru", + "d-yeṭṭef", + "d-yeṭṭfen", + "d-yili", + "d-yilin", + "d-yini", + "d-yu", + "d-yufa", + "d-yufan", + "d-yufi", + "d-yufrar", + "d-yufraren", + "d-yuli", + "d-yura", + "d-yuran", + "d-yusa", + "d-yusan", + "d-yusi", + "d-yuzgan", + "d-yuɣ", + "d-yuɣal", + "d-yuɣalen", + "d-yuɣen", + "d-zzin", + "d-ǧǧan", + "d-ṭṭfeɣ", + "dacu", + "dadda", + "dagi", + "daki", + "dakk-n", + "dakken", + "dallet", + "danmaṛk", + "daw-a", + "daxel", + "daxel-is", + "daya", + "dayen", + "dayi", + "daymi", + "daɛda", + "daɛwessu", + "daɣ", + "daɣen", + "ddabex", + "ddan", + "ddan-d", + "ddant", + "ddar", + "ddaw", + "ddaw-as", + "ddel", + "ddem", + "ddemma", + "ddeqs", + "ddeqs-is", + "dderya", + "ddewla", + "ddexxan", + "ddheb", + "ddin", + "ddiq", + "ddiɣ", + "ddmen", + "ddmeɣ", + "ddnub", + "ddqayeq", + "ddqiqa", + "ddren", + "ddreɛ", + "ddreɣ", + "ddu", + "ddukklen", + "dduklen", + "ddula", + "ddun", + "ddunit", + "ddunit-a", + "ddunit-is", + "ddunit-iw", + "ddunnit", + "ddunt", + "ddur", + "ddurt", + "ddurt-a", + "dduɣ", + "dduḥ", + "dduṛ", + "dduṛt", + "ddwa", + "ddwawi", + "ddyana", + "ddɣel", + "deffir", + "deffir-i", + "deffir-s", + "defla", + "deg-", + "deg-i", + "deg-k", + "deg-m", + "deg-neɣ", + "deg-nneɣ", + "deg-s", + "deg-sen", + "deg-sent", + "deg-wen", + "degmi", + "degs", + "degsen", + "degsent", + "delles", + "demma", + "deqqal", + "deqs", + "deɛwessu", + "dges", + "dgi", + "di-n", + "dihin", + "dihya", + "dima", + "dimecq", + "dindin", + "dinn", + "dinna", + "diri", + "diri-t", + "diri-tt", + "diɣ", + "diɣen", + "diɣenna", + "djamal", + "djamel", + "djerad", + "djurdjura", + "dqayeq", + "dqiqa", + "drareni", + "draɛ", + "dris", + "dujamber", + "dujember", + "dujembeṛ", + "dujenber", + "dular", + "dunit", + "dunnit", + "duru", + "duǧember", + "dvd", + "dwala", + "dzayer", + "dɣa", + "e-mail", + "efk", + "efk-as", + "efk-iyi-d", + "ents", + "er-s", + "err-d", + "err-it", + "ettut", + "ečč", + "eǧǧ", + "eǧǧ-it", + "eǧǧ-iten", + "eǧǧ-iyi", + "eɛreḍ", + "facal", + "facebook", + "fahim", + "faken", + "falesṭin", + "faqen", + "faqeɣ", + "farid", + "fateḥ", + "faḍma", + "faṭima", + "federer", + "fehmen", + "fehmeɣ", + "fell-", + "fell-ak", + "fell-akent", + "fell-am", + "fell-aneɣ", + "fell-as", + "fell-asen", + "fell-asent", + "fell-awen", + "fell-aɣ", + "fell-i", + "fella-s", + "fellasen", + "felli", + "fenyan", + "ferhat", + "fernen", + "ferneɣ", + "ferqen", + "ferru", + "ferruǧa", + "ferɛun", + "ferḥat", + "ferḥen", + "ferḥeɣ", + "fessusen", + "feṛḥen", + "feṛḥeɣ", + "ffer", + "ffeɣ", + "ffren", + "ffreɣ", + "ffɣen", + "ffɣen-d", + "ffɣent", + "ffɣeɣ", + "fhimeɣ", + "filezilla", + "firefox", + "firmus", + "fiḥel", + "fkan", + "fkan-as", + "fkan-d", + "fken", + "fkeɣ", + "fkiɣ", + "fkiɣ-as", + "flaṭun", + "fodil", + "fran-tt", + "fransa", + "franṣa", + "friqiya", + "friqya", + "frun", + "fukken", + "fukkeɣ", + "furar", + "fursen", + "furulu", + "fuṛar", + "fuṛaṛ", + "fɣen", + "fɣeɣ", + "fṛansa", + "galma", + "gar-", + "gar-aneɣ", + "gar-as", + "gar-asen", + "gar-asent", + "gar-i", + "garasen", + "gcompris", + "gedlen", + "gemmu", + "ger-asen", + "gezmen", + "geɣ", + "gganeɣ", + "ggten", + "ggummaɣ", + "ginya", + "giɣ", + "gma", + "gma-k", + "gma-s", + "gmas", + "gnen", + "gneɣ", + "google", + "gren", + "gren-d", + "greɣ", + "guraya", + "gzan", + "gzem", + "gziɣ", + "gzun", + "ha-t-a", + "ha-t-an", + "ha-ten-an", + "ha-tt-an", + "hadj-said", + "haoira", + "harun", + "hata", + "hatan", + "hattan", + "haǧira", + "hca", + "heddren", + "heddreɣ", + "heddṛen", + "hedreɣ", + "heggan", + "heggaɣ", + "hewwari", + "heḍṛeɣ", + "hibel", + "hiempsal", + "hilal", + "hirziguvina", + "hocine", + "hrawen", + "html", + "http", + "https", + "huawei", + "hudden", + "i-d", + "ibabaten", + "iban-d", + "iban-iyi-d", + "ibanen", + "ibarek", + "ibaskiyen", + "ibawen", + "ibaɛden", + "ibda", + "ibed", + "ibedd", + "ibeddel", + "ibedden", + "ibeddi", + "ibeddilen", + "ibeddlen", + "ibeddu", + "ibeddun", + "ibelkimen", + "ibenk", + "ibenkan", + "ibennun", + "ibeqqeḍ", + "iberdan", + "iberkanen", + "iberraniyen", + "iberreḥ-d", + "ibeɛden", + "ibeṛṛaniyen", + "ibiten", + "ibrir", + "ibudraren", + "ibugen", + "ibulisen", + "ibureɣsen", + "iburɣas", + "ibɣa", + "ibɣan", + "ibɣu", + "icawiyen", + "icban", + "iccer", + "icebba-yi", + "icebḥen", + "iceggiren", + "icemten", + "icenfiren", + "icenga", + "icennayen", + "icennu", + "icennun", + "iceqfan", + "icerken", + "icerreg", + "iceɣben", + "iceṭṭiḍen", + "icna", + "icuban", + "icudd", + "icudden", + "icukk", + "id-", + "idamen", + "idammen", + "idamsanen", + "idawsanen", + "idd", + "idda", + "iddem", + "iddew", + "iddu", + "ideflawen", + "ideg", + "ideggan", + "idegger", + "idelsanen", + "iderma", + "iderman", + "idernen", + "idgan", + "idiganen", + "idinaren", + "idir", + "idiren", + "idireɣ", + "idis", + "idisan", + "idlisen", + "idlisen-a", + "idlisen-is", + "idmaren", + "idrasen", + "idrimen", + "idrimen-is", + "idrimen-nni", + "iduba", + "idularen", + "idum", + "idumen", + "idurar", + "iduzewlen", + "idzayriyen", + "ieu", + "ifadden", + "ifak", + "ifakk", + "ifaq", + "ifarisen", + "ifassen", + "ifassen-ik", + "ifassen-is", + "ifassen-iw", + "ifassen-nsen", + "ifassen-nwen", + "ifat", + "ifatusen", + "ifawatayen", + "ifaz", + "ifazen", + "ifecka", + "ifehhem", + "ifehmen", + "ifek", + "ifelfel", + "ifellaḥen", + "ifer", + "iferdisen", + "ifernen", + "iferqen", + "iferran", + "iffer", + "iffeɣ", + "ifganen", + "ifka", + "iflisen", + "ifransisen", + "ifrax", + "ifremliyen", + "ifri", + "ifriqiyen", + "ifsan", + "ifuk", + "ifukal", + "ifukk", + "ifures", + "ifurkan", + "ifurken", + "ifut", + "ifuyla", + "ifyar", + "iga", + "iga-d", + "igadiren", + "igamanen", + "igan", + "igarawen", + "igawawen", + "igazen", + "igber", + "igburen", + "igdawalen", + "igduden", + "igebren", + "igedlen", + "igejdanen", + "igelfan", + "igelliden", + "igellil", + "igellilen", + "igellu", + "igellu-d", + "igellun", + "igelmimen", + "igemmaḍ", + "igen", + "igenni", + "igensasen", + "igenwan", + "iger", + "iger-d", + "igerdan", + "igerrez", + "igerrzen", + "igerzen", + "igezmen", + "igezzem", + "ighil", + "igider", + "igiman", + "igli", + "igliziyen", + "igmamen", + "igmanen", + "igmaḍ", + "igran", + "igrawen", + "igraɣlanen", + "igujilen", + "igumma", + "igzem", + "igzem-itt", + "igḍaḍ", + "igṭaṭ", + "ihedder", + "iheddeṛ", + "iheddren", + "ihegga", + "iheggaren", + "ihelken", + "iheyya", + "ihin", + "ihudd", + "ihuzz", + "ii-", + "iii-", + "ijbed", + "ijdi", + "ijdiden", + "ijebbden", + "ijebbed", + "ijehden", + "ijerriḍen", + "ijerḥen", + "ijeǧǧigen", + "ijga", + "ijider", + "ijqiwen", + "ikabaren", + "ikaramen", + "ikayaden", + "ikcem", + "ikcem-d", + "ikecmen", + "ikellex", + "ikemmel", + "ikemmusen", + "ikerrec", + "ikerri", + "ikesben", + "ikeččem", + "ikilumitren", + "ikka", + "ikker", + "ikkes", + "ikruraren", + "ikukra", + "ikurdiyen", + "ilal", + "ilaq", + "ilaq-ak", + "ilaq-as", + "ilaq-aɣ", + "ilaq-iyi", + "ilaqen", + "ilat", + "ilaw", + "ilef", + "ilel", + "ilelli", + "ilelliyen", + "ilem", + "ilemmasen", + "ilemmed", + "ilemẓi", + "ilemẓiyen", + "ileqman", + "iles", + "ileḥḥu", + "ileḥḥun", + "ilhan", + "ili", + "ili-k", + "ili-kem", + "ilili", + "ilin", + "ilindi", + "ilint", + "iliɣ", + "illan", + "illel", + "illu", + "illul", + "ilmaten", + "ilmawen", + "ilmend", + "ilmeẓyen", + "ilu", + "ilugan", + "ilul", + "ilul-d", + "ilulen", + "ilɣa", + "imac", + "imagraden", + "imahilen", + "imakaren", + "imal", + "imalas", + "imalasen", + "imalen", + "iman-", + "iman-ik", + "iman-im", + "iman-is", + "iman-iw", + "iman-nkent", + "iman-nnes", + "iman-nneɣ", + "iman-nsen", + "iman-nsent", + "iman-nwen", + "imarikaniyen", + "imasalen", + "imasayen", + "imasiḥiyen", + "imassanen", + "imassayen", + "imastanen", + "imawalen", + "imawen", + "imawlan", + "imawlan-is", + "imawlan-iw", + "imawlan-nsen", + "imayl", + "imaylen", + "imaynuten", + "imazanen", + "imazellawen", + "imaziɣen", + "imazrayen", + "imcac", + "imceddalen", + "imdanen", + "imdanen-a", + "imdukal", + "imdukkal", + "imecṭaḥ", + "imeddukal", + "imeddukal-is", + "imeddukal-iw", + "imeddukkal", + "imedlen", + "imedlis", + "imedyaten", + "imedyazen", + "imegruden", + "imejjayen", + "imekli", + "imeksawen", + "imekwan", + "imellalen", + "imelliẓ", + "imelyan", + "imelyaren", + "imelyaṛen", + "imelyunen", + "imennuɣen", + "imensi", + "imenza", + "imenzayen", + "imenɛen", + "imenɣi", + "imenɣiyen", + "imenẓawen", + "imeqqranen", + "imeqranen", + "imerkantiyen", + "imesdurar", + "imeskaren", + "imesla", + "imeslay-d", + "imeslayen", + "imeslayen-is", + "imesli", + "imessartiyen", + "imettiyen", + "imezdaɣ", + "imezdaɣ-is", + "imezdaɣen", + "imezdi", + "imezgi", + "imezwura", + "imeɣban", + "imeɣnasen", + "imeɣrasen", + "imeɣri", + "imeɣriyen", + "imeɣta", + "imeḍqan", + "imeḥbas", + "imeṭṭawen", + "imeṭṭi", + "imeẓla", + "imeẓyanen", + "imeẓẓuɣen", + "imeẓẓyanen", + "imferǧen", + "imggaliyen", + "imi-s", + "imidyaten", + "imihiyen", + "iminig", + "iminigen", + "imir", + "imir-a", + "imir-n", + "imir-nni", + "imira", + "imiranen", + "imiren", + "imiḍanen", + "imjuhad", + "imkuẓen", + "immut", + "immuten", + "imnadiyen", + "imnayen", + "imniren", + "imnudag", + "imrabḍen", + "imrayen", + "imrigen", + "imru", + "imsaɣen", + "imseɣret", + "imsujji", + "imsulta", + "imtiwgen", + "imttekkiyen", + "imucaɣ", + "imudd", + "imuddiren", + "imuhaɣ", + "imukan", + "imula", + "imuqel", + "imurar", + "imuras", + "imuren", + "imusnawen", + "imussnawen", + "imuta", + "imuḍan", + "imuṭan", + "imwekkel", + "imyura", + "imyuraren", + "imzireg", + "imzizdig", + "imzizdigen", + "imɣan", + "imɣaren", + "imɣi", + "imḍanen", + "imḍebber", + "imḍebbren", + "imḍebren", + "in-article", + "inaddalen", + "inadi", + "inadiyen", + "inagan", + "inagduden", + "inagrawen", + "inaw", + "inazuren", + "inaẓuren", + "inebgawen", + "inebgi", + "ineflayen", + "inefɛen", + "inegger", + "ineggez", + "ineggura", + "inegren", + "inegzumen", + "inejmuɛen", + "inek", + "inekcam", + "inekcumen", + "inelmaden", + "inem", + "inemhalen", + "inemlayen", + "ineqq", + "ineqqen", + "ineqqisen", + "inermisen", + "ineslem", + "ineɣ", + "ineɣlafen", + "ineɣmasen", + "ineḍruyen", + "ineṣliyen", + "ineṭṭeḍ", + "ini", + "ini-as", + "ini-asen", + "ini-d", + "ini-iyi-d", + "ini-yas", + "ini-yi-d", + "ini-ynes", + "inig", + "inigan", + "inigen", + "inigi", + "inisi", + "init-as", + "initen", + "inixef", + "iniɣ", + "inmettiyen", + "inna-yas", + "innexsys", + "inselmen", + "inu", + "inuba", + "inuda", + "inumak", + "inumidiyen", + "inurar", + "inurifen", + "inuva", + "inzan", + "inzi", + "inɣa", + "ipiksilen", + "ipikur", + "iqabel", + "iqbayliyen", + "iqburen", + "iqbuṛen", + "iqdimen", + "iqebbel", + "iqeblen", + "iqedcen", + "iqeddacen", + "iqeddcen", + "iqeddec", + "iqelleb", + "iqerben", + "iqerra", + "iqerreb", + "iqeṛṛa", + "iqjan", + "iqqar", + "iqqenen", + "iqqim", + "iqqimen", + "iqubel", + "iqublen", + "iqwem", + "iraten", + "irden", + "irebbi", + "irebraben", + "irebḥen", + "irefden", + "irem", + "iremden", + "irennu", + "ireqqen", + "irewlen", + "irgazen", + "irkelli", + "irland", + "irmad", + "irmawen", + "irna", + "irnawen", + "iru", + "iruh", + "irumaniyen", + "irumiyen", + "irumyen", + "irusiyen", + "iruḥ", + "iruḥ-d", + "iruḥen", + "isafaren", + "isafen", + "isaffen", + "isalan", + "isalen", + "isali", + "isallan", + "isallen", + "isalli", + "isaragen", + "isawalen", + "isawel", + "isaɣuren", + "isdawanen", + "isebdaden", + "isebded", + "isebtar", + "isebtaren", + "iseddagen", + "isefk", + "isefka", + "isefra", + "isefrek", + "iseg", + "isegassen", + "iseggasen", + "iseggasen-a", + "iseggem", + "iseggwasen", + "isegwasen", + "isehlen", + "isekkilen", + "isekla", + "isekles", + "isekna", + "isel", + "iselkimen", + "isell", + "isellek", + "isellem", + "iselmaden", + "iselman", + "iselsa", + "iselwayen", + "isem", + "isem-a", + "isem-agi", + "isem-ik", + "isem-im", + "isem-ines", + "isem-is", + "isem-iw", + "isem-nsen", + "isemda", + "isemlen", + "isemli", + "isemliyen", + "isemma", + "isemmaḍen", + "isenfaren", + "isennanen", + "isenned", + "isenqaden", + "isental", + "iseqdac", + "iseqdacen", + "iserdasen", + "iserdasen-is", + "iserreḥ", + "isers", + "isertanen", + "isertayen", + "isertiyen", + "isew", + "iseɣ", + "iseɣwan", + "iseɣzaf", + "iseɣẓanen", + "iseḥḥan", + "isfuyla", + "isger", + "isig", + "isirew", + "isiɣzaf", + "isiɣzifen", + "isiḍen", + "iskanen", + "isli", + "ismawen", + "ismawen-is", + "ismawen-nsen", + "ismenyifen", + "ismilen", + "isnajyanen", + "isnasen", + "isnudranen", + "ispamen", + "isragen", + "israyel", + "israyil", + "issawel", + "issaweḍ", + "issefk", + "isseggasen", + "isseqdac", + "issin", + "issinen", + "issineɣ", + "issuter", + "isteqsiyen", + "isu", + "isufar", + "isumar", + "isura", + "isurdiyen", + "isurifen", + "isuter", + "isuɣ", + "isuḍaf", + "iswi", + "iswi-ines", + "iswi-nneɣ", + "iswi-nsen", + "iswi-s", + "iswiren", + "iswiyen", + "isɛa", + "isɛan", + "isɛi", + "isɛu", + "isɣaren", + "isɣewnen", + "isɣunen", + "isṭunya", + "itbir", + "iteddu", + "iteddu-d", + "iteddun", + "iteffeɣ", + "itekka", + "itekkan", + "itekkes", + "itent", + "iterrasen", + "itess", + "itett", + "itetten", + "itezzi", + "itezzin", + "itran", + "itraren", + "itri", + "itteddu", + "itteddun", + "itteffeɣ", + "ittekka", + "ittekki", + "ittmeslay", + "ittnadi", + "ittwali", + "iucn", + "iv-", + "ivirusen", + "iwacu", + "iwaken", + "iwakken", + "iwala", + "iwalan", + "iwali", + "iwaliten", + "iwata", + "iwatan", + "iwaɛren", + "iwaḍiyen", + "iwehha", + "iwejden", + "iwekked-d", + "iwellihen", + "iwenniten", + "iwet", + "iwetmen", + "iwexxer", + "iweɛren", + "iweɛṛen", + "iweṣṣa", + "iwgelhanen", + "iwimi", + "iwiǧiten", + "iwlalen", + "iwmi", + "iwtal", + "iwudam", + "iwulem", + "iwulmen", + "iwumi", + "iwunak", + "iwurmanen", + "iwwi", + "ix-", + "ixdem", + "ixeddamen", + "ixeddem", + "ixeddim", + "ixeddmen", + "ixedmen", + "ixef", + "ixef-is", + "ixelleṣ", + "ixelqen", + "ixemmem", + "ixerban", + "ixesren", + "ixf", + "ixfawen", + "ixulef", + "ixulfen", + "ixus", + "ixussen", + "ixuṣ", + "ixuṣṣ", + "ixuṣṣen", + "ixxamen", + "ixxamen-nsen", + "iyi", + "iyi-", + "iyi-d", + "iyi-d-tiniḍ", + "iyi-d-yenna", + "iylalen", + "iylan", + "iyya", + "izad", + "izaden", + "izamulen", + "izan", + "izdayen", + "izdeɣ", + "izedɣen", + "izeggaɣen", + "izegrar", + "izegren", + "izegza", + "izegzawen", + "izem", + "izemren", + "izen", + "izen-agi", + "izenqan", + "izerfan", + "izerfan-is", + "izerman", + "izerzer", + "izga", + "izgaren", + "izi", + "izimer", + "izirig", + "izirigen", + "izlan", + "izli", + "izmawen", + "izmer", + "izmiren", + "izmireɣ", + "iznan", + "izri", + "izumal", + "izunyuren", + "izuyaz", + "izwilen", + "izzayriyen", + "iǧadarmiyen", + "iǧehden", + "iɛawed", + "iɛawen", + "iɛawnen", + "iɛdawen", + "iɛedda", + "iɛedda-d", + "iɛeddan", + "iɛeddi", + "iɛeddin", + "iɛeggalen", + "iɛekkuren", + "iɛelleq", + "iɛerḍen", + "iɛessasen", + "iɛetmaniyen", + "iɛewwel", + "iɛewwiqen", + "iɛeṭṭel", + "iɛeẓẓugen", + "iɛiwed", + "iɛiwen", + "iɛraben", + "iɛudiwen", + "iɛum", + "iɛǧeb-iyi", + "iɣab", + "iɣallen", + "iɣaḍ", + "iɣaḍ-iyi", + "iɣbaren", + "iɣbula", + "iɣeblan", + "iɣed", + "iɣef", + "iɣelli", + "iɣelnawen", + "iɣer", + "iɣerbazen", + "iɣerdayen", + "iɣerfan", + "iɣermanen", + "iɣersiwen", + "iɣes", + "iɣess", + "iɣewwaren", + "iɣewwaṛen", + "iɣil", + "iɣimi", + "iɣlanen", + "iɣmisen", + "iɣrem", + "iɣriben", + "iɣsan", + "iɣtasen", + "iɣunab", + "iɣzer", + "iɣzif", + "iḍ-a", + "iḍ-agi", + "iḍ-nni", + "iḍarren", + "iḍarren-is", + "iḍebsiyen", + "iḍefren", + "iḍegger", + "iḍelli", + "iḍelmen", + "iḍemnen", + "iḍerru", + "iḍerrun", + "iḍes", + "iḍran", + "iḍrisen", + "iḍudan", + "iḍul", + "iḍulan", + "iḍumman", + "iḥader", + "iḥar", + "iḥareb", + "iḥaz", + "iḥbes", + "iḥder", + "iḥebbes", + "iḥebsen", + "iḥeddaden", + "iḥedran", + "iḥedren", + "iḥekkmen", + "iḥekmen", + "iḥella-d", + "iḥemlen", + "iḥemmel", + "iḥemmel-itt", + "iḥemmel-iyi", + "iḥemmlen", + "iḥettem", + "iḥettmen", + "iḥricen", + "iḥudd", + "iḥulfa", + "iḥulfan", + "iḥus", + "iḥuza", + "iḥuzan", + "iṛeggem", + "iṛumaniyen", + "iṛumiyen", + "iṛumyen", + "iṛuḥ", + "iṛuḥen", + "iṣeggem", + "iṣeḥḥa", + "iṣeḥḥan", + "iṣuṛdiyen", + "iṭarren", + "iṭerkiyen", + "iṭij", + "iṭṭef", + "iẓekwan", + "iẓer", + "iẓeḍwan", + "iẓra", + "iẓri", + "iẓuran", + "iẓuran-is", + "j'ai", + "japun", + "javascript", + "jebden", + "jeddi", + "jeddi-s", + "jelfa", + "jemɛen", + "jennad", + "jeǧǧiga", + "jeḥḥa", + "jida", + "jijel", + "jjiḥ", + "jmiɛ", + "jsk", + "jsmb", + "jurjura", + "jurjya", + "k-t-id", + "kabylie", + "kaci", + "kahina", + "kamirun", + "kanada", + "katalunya", + "kateb", + "kayus", + "kbd", + "kcem", + "kebek", + "kecc", + "keccini", + "kecmen", + "kecmen-d", + "kecment", + "kecmeɣ", + "kem", + "kemlen", + "kemm", + "kemmel", + "kemmini", + "kemmlen", + "kemmleɣ", + "kemnen", + "kennemti", + "kennu", + "kenwi", + "kerheɣ", + "kerma", + "kesben", + "keč", + "kečč", + "keččini", + "keččmen", + "keṛheɣ", + "kfan", + "kfiɣ", + "kfun", + "kifkif", + "kifkif-iten", + "kilu", + "kirgizistan", + "kkan", + "kkan-d", + "kkaten", + "kkateɣ", + "kkawen", + "kker", + "kkes", + "kkes-d", + "kkin", + "kkiɣ", + "kkren", + "kkren-d", + "kkreɣ", + "kkreɣ-d", + "kksen", + "kkseɣ", + "kovalev", + "krad", + "kraḍ", + "kraḍet", + "kraḍt", + "kren", + "krim", + "ksen", + "kter", + "kuiper", + "kul", + "kulci", + "kulec", + "kullec", + "kulumbya", + "kulunil", + "kunemti", + "kungu", + "kunwi", + "kuruna", + "kurya", + "kuz", + "kuṛuna", + "kuṛunavirus", + "kuẓ", + "kṛad", + "kṛaḍ", + "labas", + "ladɣa", + "lakked", + "lakul", + "lalman", + "laman", + "lamana", + "lamaɛna", + "lameɛna", + "langliz", + "laqen", + "laquo", + "larbi", + "larbɛa", + "larebɛa", + "lasel", + "latay", + "lateṛ", + "latinit", + "lawan", + "lawan-a", + "lawan-is", + "lawan-nni", + "laxert", + "laɛfu", + "laɛmer", + "laɛmeṛ", + "laɛnaya", + "laɛqel", + "laɛtab", + "laɛwayed", + "laɛzib", + "laɛḍil", + "laḥsab", + "laṛebɛa", + "laṣel", + "laṣel-is", + "laṣel-nsen", + "laẓ", + "lbabur", + "lbacir", + "lbak", + "lbal", + "lbanka", + "lbankat", + "lbaraka", + "lbatima", + "lbaylek", + "lbaz", + "lbaḍna", + "lbaṭaṭa", + "lbaṭel", + "lbenna", + "lber", + "lberj", + "lberrani", + "lbeɛd", + "lbir", + "lbira", + "lbirra", + "lbiru", + "lbiɛ", + "lbumba", + "lbumbat", + "lburǧ", + "lbusṭa", + "ldap", + "ldi", + "ldin", + "ldint", + "ldiɣ", + "ldzayer", + "leb", + "lebda", + "leblida", + "lebni", + "lebsel", + "lebwaqi", + "lebyar", + "lebɛid", + "lebɣi", + "lebɣi-nsen", + "lebɣi-s", + "lebḥar", + "lebḥer", + "lebḥeṛ", + "lebṣel", + "lecyax", + "lecɣal", + "lecɣal-a", + "ledwar", + "ledzayer", + "lefhama", + "lefjer", + "leflani", + "legliz", + "legniz", + "legrig", + "lehdur", + "lehduṛ", + "lehlak", + "lehmum", + "lehna", + "lehwa", + "lehḍur", + "lejdud", + "lejdud-is", + "lejdud-nneɣ", + "lejwameɛ", + "lekdeb", + "lekmal", + "lekmal-is", + "lekwaɣeḍ", + "lemcawrat", + "lemden", + "lemdeɣ", + "lemdiyyet", + "lemgarda", + "lemleḥ", + "lemmden", + "lemmdeɣ", + "lemmer", + "lemqadra", + "lemqam", + "lemri", + "lemtel", + "lemɛawna", + "lemɛiwna", + "lemɣawla", + "lemḥadra", + "leqbayel", + "leqder", + "leqdic", + "leqdic-a", + "leqdic-agi", + "leqdic-is", + "leqdic-nsen", + "leqdicat", + "leqhawi", + "leqqayen", + "leqqem", + "leqran", + "leqrar", + "leqraya", + "leqraya-s", + "leqriḥ", + "leqrun", + "leqser", + "leqseḥ", + "leqwanen", + "leqyud", + "leqṣer", + "lerbaḥ", + "lerwaḥ", + "leryuy", + "leslaḥ", + "lesnin", + "leswam", + "leswaq", + "letnayen", + "letniyen", + "lettkal", + "lewhayem", + "lewhi", + "lewkkil", + "lewnis", + "lewqat", + "lewḥuc", + "lewṣayat", + "lexbar", + "lexbaṛ", + "lexber", + "lexdeɛ", + "lexla", + "lexlas", + "lexlawi", + "lexlaṣ", + "lexmis", + "lexrif", + "lexsara", + "lexsas", + "lexyal", + "lexyuḍ", + "lexṣas", + "lexṣaṣ", + "lezzayer", + "leǧnas", + "leǧnun", + "leǧwameɛ", + "leɛfu", + "leɛgez", + "leɛmer", + "leɛmer-is", + "leɛmeṛ", + "leɛmeṛ-is", + "leɛnaya", + "leɛnaya-k", + "leɛnaya-m", + "leɛqed", + "leɛqel", + "leɛqel-is", + "leɛrac", + "leɛtab", + "leɛwayed", + "leɛyub", + "leɛzib", + "leɛǧeb", + "leɛḍil", + "leɣla", + "leɣlaḍ", + "leɣrama", + "leḥbab", + "leḥbus", + "leḥcic", + "leḥdaqa", + "leḥder", + "leḥkem", + "leḥlal", + "leḥlu", + "leḥmala", + "leḥnana", + "leḥram", + "leḥrir", + "leḥris", + "leḥsab", + "leḥsabat", + "leḥwal", + "leḥwayeǧ", + "leḥya", + "leḥyuḍ", + "leḥzen", + "leḥḥun", + "leḥḥuɣ", + "leṣnaf", + "lfakya", + "lfal", + "lfarina", + "lfayda", + "lferḥ", + "lfeṛḥ", + "lfeṭṭa", + "lfirma", + "lgaz", + "lgirra", + "lhan", + "lhan-d", + "lhem", + "lhemm", + "lhend", + "lhiba", + "limam", + "limamat", + "limarat", + "line-height", + "linux", + "liser", + "lislam", + "listiɛmar", + "litwanya", + "lixsas", + "lixṣaṣ", + "liḥala", + "liḥalat", + "ljal", + "ljameɛ", + "ljehd", + "ljemɛa", + "lka", + "lkaf", + "lkanun", + "lkar", + "lkarṭa", + "lkas", + "lkazirna", + "lkaɣeḍ", + "lkaṛ", + "lkiran", + "lkisan", + "lkuca", + "lla", + "llah", + "llakul", + "llan", + "llan-d", + "llan-t", + "llant", + "llant-d", + "llaẓ", + "llebsa", + "lleft", + "llin", + "llint", + "lliɣ", + "llsas", + "llufan", + "llufanat", + "lluzin", + "lluzinat", + "lluẓen", + "lluẓeɣ", + "lmakla", + "lmal", + "lmalayek", + "lmalaykat", + "lmarikan", + "lmasiḥ", + "lmaɛna", + "lmaḍerra", + "lmegget", + "lmektub", + "lmelk", + "lmelḥ", + "lmend", + "lmendad", + "lmendad-ik", + "lmendad-im", + "lmendad-nkent", + "lmendad-nwen", + "lmerruk", + "lmersa", + "lmerta", + "lmerḥum", + "lmerṣa", + "lmeytin", + "lmeyyet", + "lmeɛna", + "lmeɛna-s", + "lmeɛqul", + "lmeɣreb", + "lmeḥna", + "lmeṛṛuk", + "lmilud", + "lmina", + "lmir", + "lmitra", + "lmitrat", + "lmizan", + "lmuhub", + "lmul", + "lmulud", + "lmuludeyya", + "lmumen", + "lmumnin", + "lmus", + "lmut", + "lmut-is", + "lmuta", + "lmuziga", + "lmuḥal", + "lounes", + "lounis", + "lpari", + "lpitrul", + "lqahwa", + "lqanun", + "lqay", + "lqayed", + "lqayen", + "lqaɛ", + "lqaɛa", + "lqaḍi", + "lqebṭan", + "lqecc", + "lqed", + "lqedd", + "lqedd-is", + "lqehwa", + "lqella", + "lqelɛa", + "lqem", + "lqem-agi", + "lqern", + "lqerḥ", + "lqeḍyan", + "lqid", + "lqima", + "lqis", + "lqut", + "lsan", + "lsas", + "lsiɣ", + "lubnan", + "lukyus", + "luleɣ", + "luluf", + "lumur", + "lumuṛ", + "lunis", + "lunǧa", + "lurup", + "lustṛali", + "luḍa", + "lwad", + "lwajeb", + "lwali", + "lwaǧeb", + "lwaḥi", + "lwaḥid", + "lwelha", + "lwelha-nsen", + "lwennas", + "lweqt", + "lweqt-nni", + "lweɛd", + "lweḥc", + "lwilaya", + "lwilayat", + "lwiz", + "lxalat", + "lxaṭer", + "lxedma", + "lxelɛa", + "lxemsa", + "lxetyar", + "lxeḍra", + "lxilaf", + "lxilafa", + "lxiq", + "lxir", + "lxiḍ", + "lxiṛ", + "lxuf", + "lyazid", + "lzzayer", + "lǧal", + "lǧal-ik", + "lǧal-im", + "lǧal-nkent", + "lǧal-nwen", + "lǧameɛ", + "lǧar", + "lǧehd", + "lǧemɛa", + "lǧennet", + "lǧerra", + "lǧerḥ", + "lǧib", + "lǧib-is", + "lǧida", + "lǧiha", + "lǧil", + "lǧiran", + "lǧuǧa", + "lɛada", + "lɛali", + "lɛamma", + "lɛar", + "lɛarc", + "lɛebd", + "lɛejlan", + "lɛeqqal", + "lɛerbi", + "lɛerc", + "lɛesker", + "lɛeskeṛ", + "lɛib", + "lɛid", + "lɛiraq", + "lɣaci", + "lɣella", + "lɣerb", + "lɣerba", + "lɣerḍ", + "lɣiḍ", + "lɣiḍ-nsen", + "lḥal", + "lḥala", + "lḥalat", + "lḥamu", + "lḥan", + "lḥara", + "lḥasun", + "lḥaǧ", + "lḥaǧa", + "lḥaṣul", + "lḥaṣun", + "lḥebs", + "lḥed", + "lḥedd", + "lḥekkam", + "lḥemmam", + "lḥenni", + "lḥeq", + "lḥeqq", + "lḥerma", + "lḥerrac", + "lḥers", + "lḥess", + "lḥif", + "lḥir", + "lḥirak", + "lḥirfat", + "lḥiǧ", + "lḥiɣ", + "lḥiḍ", + "lḥukuma", + "lḥuma", + "lḥun", + "lḥusin", + "lḥuɣ", + "m-t-id", + "maca", + "macahu", + "macci", + "maci", + "maggu", + "magu", + "makken", + "malika", + "mammeri", + "marikan", + "masensen", + "masinisa", + "mass-nsen", + "matoub", + "matub", + "mayu", + "mayyu", + "mazal", + "mazal-aɣ", + "mazal-ik", + "mazal-ikem", + "mazal-it", + "mazal-iten", + "mazal-itent", + "mazal-itt", + "mazal-iyi", + "mači", + "mačči", + "maɛlic", + "maɛmar", + "maɛna", + "maɛtub", + "maɣef", + "maɣres", + "maḍi", + "maḥmud", + "maṛtina", + "maṛyus", + "maṣer", + "mbarek", + "mbaɛd", + "mbaɛid", + "mbeɛd", + "mcb", + "mdash", + "mdel", + "mebla", + "mebɛid", + "mechur", + "mechuren", + "mecklenburg-vorpommern", + "mecṭuḥ", + "medden", + "medlen", + "medlent", + "meffer", + "meghzifene", + "mehdi", + "mejdub", + "mejjir", + "meksa", + "mellal", + "mellul", + "mellulen", + "melmi", + "melyun", + "mendas", + "mengellat", + "menguellet", + "menhu", + "mennad", + "mennaw", + "mennaɣ", + "mensur", + "menwala", + "menɛen", + "menṣur", + "meqbel", + "meqqar", + "meqqer", + "meqqeṛ", + "meqqran", + "meqqren", + "meqqret", + "meqqrit", + "meqran", + "meqren", + "merr", + "merra", + "merra-nsen", + "merruk", + "merzug", + "merṛa", + "meskin", + "meskint", + "meslayen", + "meslayeɣ", + "mesmamda", + "messali", + "messi", + "mestɣanem", + "mesɛud", + "mesṭafa", + "metallica", + "metwal", + "meyya", + "mezali", + "mezdad", + "mezweɣ", + "mezyan", + "meɛlum", + "meɛna", + "meɛni", + "meɛtub", + "meɛṭub", + "meɣres", + "meḥmud", + "meḥsub", + "meṛṛa", + "meṛṛuk", + "meẓyan", + "meẓẓi", + "meẓẓiy", + "meẓẓiyen", + "meẓẓiyet", + "meẓẓiyeɣ", + "meẓẓiyeḍ", + "meẓẓiyit", + "mgal-is", + "mgaraden", + "mgaradent", + "mhenni", + "mhidi", + "micli", + "microsoft", + "mikibsa", + "miksik", + "mimun", + "mitilus", + "miḥyaf", + "mkul", + "mlalen", + "mlaleɣ", + "mlaleɣ-d", + "mlikec", + "mlilen", + "mlileɣ", + "mliḥ", + "mmektaɣ-d", + "mmel", + "mmeslay", + "mmeslayen", + "mmeslayeɣ", + "mmi", + "mmi-k", + "mmi-m", + "mmi-s", + "mmis", + "mmten", + "mmteɣ", + "mmuten", + "mmuteɣ", + "mnayel", + "mohand", + "mokrane", + "mozilla", + "mraw", + "msakit", + "msefhamen", + "msonormal", + "mtawan", + "mtld", + "mucaɛ", + "mucaɛen", + "mulac", + "mulay", + "mulud", + "muqel", + "muqleɣ", + "muqqren", + "murad", + "muretanya", + "muriṭanya", + "musku", + "mustapha", + "musṭafa", + "muḥ", + "muḥal", + "muḥamed", + "muḥemed", + "muḥemmed", + "muḥend", + "muḥli", + "muḥya", + "mxalfa", + "mysql", + "myussanen", + "mɛamar", + "mɛatqa", + "mɛemmer", + "mɛemmri", + "mɛemri", + "mɛesker", + "mɣa", + "mḥemmed", + "mḥend", + "mḥme", + "n'est", + "nabil", + "nacer", + "nadal", + "nadam", + "naddam", + "nadi", + "nadin", + "nadit", + "nadiɣ", + "nali", + "naqal", + "naru", + "nasira", + "naweḍ", + "nawi", + "naɣ", + "naṣer", + "nban", + "nbedd", + "nbeddel", + "nbsp", + "ncallah", + "nebda", + "nebder", + "nebdu", + "nebnu", + "nebɛid", + "nebɣa", + "nebɣi", + "neddem", + "neddi", + "neddu", + "neffeɣ", + "nefhem", + "nefk", + "nefka", + "nefren", + "nefru", + "negren", + "negzi", + "negzu", + "nejmaɛen", + "nekcem", + "nekk", + "nekkenti", + "nekker", + "nekkes", + "nekki", + "nekkini", + "nekkni", + "nekni", + "neldi", + "nelhi", + "nelmed", + "nelḥa", + "nemlal", + "nemlil", + "nemmeslay", + "nemmeslay-d", + "nemmet", + "nemmut", + "nemsefham", + "nemyussan", + "nemɛin", + "nemẓer", + "nen", + "nenna", + "nenna-d", + "nennum", + "neq", + "neqbel", + "neqqar", + "neqqen", + "neqqim", + "neqsen", + "nerbeḥ", + "nerfed", + "nermes", + "nerna", + "nernu", + "nerr", + "nerra", + "nerreẓ", + "nerwel", + "nerǧu", + "nesla", + "nesli", + "nesmekti", + "nessali", + "nessaram", + "nessawal", + "nessaweḍ", + "nessen", + "nesseḥbiber", + "nessin", + "nessiweḍ", + "nessusem", + "nessuter", + "nessutur", + "nesteqsa", + "nesɛa", + "nesɛedda", + "nesɛi", + "nesɛu", + "nesḥassef", + "nettaf", + "nettak", + "nettamen", + "nettaru", + "nettaru-t", + "nettat", + "nettawi", + "nettidir", + "nettili", + "nettini", + "nettkel", + "nettmeslay", + "nettnadi", + "nettnaɣ", + "nettraju", + "nettraǧu", + "nettruḥu", + "nettu", + "netturar", + "nettuɣal", + "nettwali", + "nettwassen", + "nettxemmim", + "newjed", + "newwal", + "newweḍ", + "newwi", + "newwi-d", + "newwiḍ", + "nexdem", + "nexdim", + "nezdeɣ", + "nezdi", + "nezga", + "nezger", + "nezmer", + "nezmir", + "nezweǧ", + "nezzah", + "nezzeh", + "nečč", + "nečča", + "neǧǧ", + "neǧǧa", + "neɛreḍ", + "neɛya", + "neɣ", + "neɣri", + "neḍfer", + "neḥbes", + "neḥsa", + "neḥwaǧ", + "neṭṭef", + "neẓra", + "neẓri", + "nfaq", + "nger", + "ngum", + "nhegga", + "niden", + "nidir", + "nijirya", + "nili", + "nini", + "niqal", + "nisma", + "nissin", + "nitenti", + "nitni", + "niɣ", + "niḍen", + "nkemmel", + "nlaq", + "nmuqel", + "nmuqqel", + "nna", + "nnan", + "nnan-as", + "nnan-d", + "nnan-iyi-d", + "nnaɣ", + "nnaɣen", + "nnaɣeɣ", + "nnaḍur", + "nnbi", + "nndama", + "nnefs", + "nnefxa", + "nnefṣ", + "nnehta", + "nnejmaɛen", + "nneqma", + "nnes", + "nneyya", + "nneɛma", + "nneɣ", + "nnfaq", + "nnfaɛ", + "nnfeɛ", + "nnger", + "nni", + "nniden", + "nnif", + "nnig", + "nnig-s", + "nnijer", + "nnil", + "nniqal", + "nniven", + "nniya", + "nniɣ", + "nniɣ-ak", + "nniɣ-ak-d", + "nniɣ-as", + "nniɣ-asen", + "nniɣ-d", + "nniḍen", + "nnsen", + "nnsent", + "nnuba", + "nnumen", + "nnumeɣ", + "nnuɣen", + "nqabel", + "nqebbel", + "nqelleb", + "nruḥ", + "nsan", + "nsell", + "nsen", + "nsent", + "nteddu", + "ntett", + "nubil", + "nudan", + "nudaɣ", + "nufa", + "nufa-d", + "nufi", + "nugad", + "nugi", + "nuja", + "nukni", + "numidya", + "numin", + "nurar", + "nurdin", + "nuredin", + "nusa-d", + "nutenti", + "nutni", + "nuɣ", + "nuɣal", + "nuɣal-d", + "nwala", + "nwali", + "nwan", + "nwen", + "nwiɣ", + "nxeddem", + "nxemmem", + "nɛawed", + "nɛedda", + "nɛeddi", + "nɛeṭṭel", + "nɣan", + "nɣan-t", + "nɣel", + "nɣen", + "nɣer", + "nɣil", + "nɣiɣ", + "nḥader", + "nḥemmel", + "nṛuḥ", + "nẓer", + "oamal", + "onu", + "openstreetmap", + "opep", + "panthera", + "paragway", + "photoshop", + "php", + "pmid", + "png", + "poedit", + "productname", + "protonmail", + "pulunya", + "qabel", + "qablen", + "qadren", + "qaren", + "qasi", + "qaṭar", + "qbala", + "qbel", + "qbilen", + "qeblen", + "qebleɣ", + "qedcen", + "qeddcen", + "qerben", + "qerṭaj", + "qessiḥen", + "qessiḥet", + "qim", + "qimen", + "qirṭa", + "qiṣer", + "qlilit", + "qqar", + "qqaren", + "qqaren-as", + "qqaren-asen", + "qqaren-d", + "qqarent", + "qqareɣ", + "qqareɣ-as", + "qqaṛen", + "qqen", + "qqim", + "qqimemt", + "qqimen", + "qqiment", + "qqimet", + "qqimeɣ", + "qqlen", + "qqleɣ", + "qqnen", + "qrad", + "qrib", + "qsenṭina", + "qublen", + "qudren", + "qṛib", + "qṣer", + "rabaḥ", + "rabeḥ", + "rachid", + "racid", + "radyu", + "ramdane", + "raquo", + "rbaḥa", + "rbaṭ", + "rbeḥ", + "rebbi", + "rebrab", + "rebɛa", + "rebɛin", + "rebḥen", + "rebḥeɣ", + "refden", + "refdent", + "refdeɣ", + "reffu", + "reglen", + "remdane", + "remḍan", + "remṭan", + "rennun", + "rewlen", + "rewleɣ", + "reyyec", + "rezqi", + "rfan", + "rfed", + "rfiɣ", + "riad", + "riɣ", + "rmed", + "rnan", + "rnan-d", + "rniɣ", + "rnu", + "rnu-as", + "rnu-d", + "rnu-yas", + "rnun", + "rnut-as", + "rnuɣ", + "rqiq", + "rqiqen", + "rradyu", + "rran", + "rran-d", + "rran-t", + "rran-tt", + "rrant", + "rray", + "rray-a", + "rray-is", + "rray-iw", + "rray-nsen", + "rrbeḥ", + "rrebrab", + "rregmat", + "rrehba", + "rren", + "rret", + "rrezg", + "rreɣ", + "rreḥba", + "rreḥma", + "rrif", + "rriyal", + "rriɣ", + "rriɣ-as", + "rriḥa", + "rrsas", + "rruman", + "rrus", + "rruḥ", + "rrwaḥ", + "rsen", + "rsent", + "rsf", + "rsquo", + "ruma", + "rumanya", + "rusya", + "ruɣ", + "ruḥ", + "ruḥen", + "ruḥent", + "ruḥet", + "ruḥeɣ", + "rwan", + "rwaḥ", + "rzan", + "rziɣ", + "rzu", + "rzun", + "rzuɣ", + "rǧiɣ", + "rǧu", + "rǧuɣ", + "rẓan", + "rẓen", + "s-d-", + "s-yefkan", + "s-yehwa", + "s-yenna", + "s-yini", + "sabaw", + "sadeq", + "sagen", + "sakin", + "sakkin", + "salah", + "salamano", + "salaḥ", + "saldae", + "saleḥ", + "salhi", + "sali-d", + "salima", + "salustyus", + "salḥi", + "sanda", + "sandikat", + "sani", + "sarameɣ", + "sars", + "sawalen", + "sawalen-as", + "sawlen", + "sawḍen", + "saxe-anhalt", + "saɛa", + "saɛdi", + "saɛid", + "saɛudiya", + "saɛudya", + "sbadu", + "sbaḥ", + "sbedd", + "sbedden", + "sbedden-d", + "sbenyul", + "sbeḥ", + "sbitar", + "sbitarat", + "sbiṭar", + "sbiṭarat", + "sdat", + "sdat-i", + "sdaxel", + "sdeffir", + "sebba", + "sebded", + "sebt", + "sebɛa", + "seddaw", + "seddis", + "seddu", + "sefrek", + "sefsex", + "seg-a", + "seg-mi", + "seg-neɣ", + "seg-s", + "seg-sen", + "seg-sent", + "seggem", + "seggmeɣ", + "seghir", + "segmi", + "sekcem", + "sekker", + "sekkeṛ", + "sekkura", + "sekles", + "seksu", + "selkem", + "selken", + "selket", + "sellen", + "selleɣ", + "selɛa", + "semman", + "semman-as", + "semmeḍ", + "semmus", + "semmuset", + "semrasen", + "semselsi", + "semɛun", + "sen-", + "senfel", + "senker", + "senkez", + "sennig", + "senqed", + "sentem", + "senteḍ", + "senṭeḍ", + "seqdacen", + "seqdec", + "seqsaɣ", + "serbya", + "sermed", + "serreḥ", + "sersen", + "serseɣ", + "serḥen", + "setta", + "setti", + "sewḥel", + "sexdamen", + "sexsi", + "sezg", + "seɛɛun", + "seɣwer", + "seḥbes", + "seḥbibren", + "sfehmeɣ", + "sfeḍ", + "sgunfu", + "sidna", + "sifaks", + "sifeḍ", + "siggez", + "silu", + "simi", + "simmal", + "sin-a", + "sin-nni", + "singapur", + "sinigal", + "sinima", + "sinna", + "sireg", + "sirta", + "sisleg", + "siwa", + "siwel", + "siwel-iyi-d", + "skecmen", + "sken-d", + "skibyu", + "skud", + "slen", + "sleɣ", + "sli", + "sliman", + "slimane", + "sliɣ", + "sliɣ-as", + "smaɛel", + "smaɛil", + "smaɛni", + "smaḥ", + "smenyifeɣ", + "smezdi", + "smid", + "smizzwer", + "smutti", + "snat", + "snen", + "sneqsen", + "snes", + "snesla", + "sneɣ", + "snifel", + "snirem", + "snitra", + "snulfan-d", + "snulfu-d", + "sofiane", + "sonatrach", + "spanya", + "spenyul", + "sqedcen", + "srabes", + "srid", + "ssabun", + "ssadaqa", + "ssaramen", + "ssarameɣ", + "ssarmeɣ", + "ssawalen", + "ssawalen-as", + "ssawlen", + "ssawlen-d", + "ssawḍen", + "ssawḍent", + "ssawḍeɣ", + "ssaɛa", + "ssaɛid", + "ssaḥel", + "ssber", + "ssbeḥ", + "ssbiṭar", + "sseba", + "ssebba", + "ssebbat", + "ssebt", + "ssef", + "sselɛa", + "sselṭan", + "ssem", + "ssenf", + "sseqdacen", + "sser", + "ssexdamen", + "sseḥ", + "sseḥra", + "sshala", + "ssif", + "ssifa", + "ssikkis", + "ssiman", + "ssin", + "ssinen", + "ssineɣ", + "ssinima", + "ssired", + "ssit", + "ssiwleɣ", + "ssiwḍen", + "ssker", + "sskeṛ", + "sslam", + "ssmana", + "ssmaḥ", + "ssmid", + "ssnen", + "ssneɣ", + "ssqef", + "ssuffɣen", + "ssufɣen", + "ssulin", + "ssuma", + "ssuq", + "ssuref-iyi", + "ssusmen", + "ssusmeɣ", + "ssut", + "ssutren", + "ssutreɣ", + "ssuturen", + "ssuvyat", + "ssuɣat", + "sswayeɛ", + "sswid", + "ssya", + "ssyin", + "ssɛaya", + "ssɛida", + "steqsaɣ", + "steqsi", + "stufaɣ", + "sudad", + "sufel", + "sufell", + "sufella", + "suffɣen", + "sufyan", + "sumata", + "summam", + "suneɣ", + "suqraṭ", + "suref-aɣ", + "suref-iyi", + "surfaɣ", + "susem", + "susmen", + "sutren", + "sutreɣ", + "suturen", + "swacu", + "swadda", + "swaswa", + "swayes", + "swayeɛ", + "swel", + "sweɣ", + "swi", + "swid", + "swis", + "swiɣ", + "sxedmen", + "sya", + "syagi", + "syen", + "syin", + "syinn", + "syinna", + "sɛan", + "sɛant", + "sɛawi", + "sɛeddan", + "sɛeddayen", + "sɛeddaɣ", + "sɛeddin", + "sɛeddiɣ", + "sɛid", + "sɛin", + "sɛint", + "sɛiɣ", + "sɛun", + "sɛunt", + "sɛuɣ", + "sɣur", + "sɣur-i", + "sɣuṛ", + "sḍis", + "sḥassfeɣ", + "sṭif", + "t-id", + "t-id-", + "t-ixedmen", + "t-nexdem", + "t-txedmeḍ", + "t-tɛawen", + "t-walaɣ", + "t-xedmen", + "t-xedmeɣ", + "t-yawi", + "t-yenɣan", + "t-yenṭeḍ", + "t-yerran", + "t-yewwin", + "t-yexdem", + "t-yečč", + "t-yeǧǧan", + "t-yuɣen", + "ta-", + "tabadut", + "tabaskit", + "tabaḍnit", + "tabbou", + "tabbu", + "tabburt", + "tabdart", + "taberkant", + "taberranit", + "tabeṛṛanit", + "tabniqt", + "tabrat", + "tabratt", + "tabriṭanit", + "tabzert", + "tabzimt", + "tabɣest", + "tabṛat", + "tacacit", + "tacawit", + "tacciwin", + "tacekkart", + "tacelḥit", + "tacennayt", + "taceqquft", + "tacerqit", + "tacinwat", + "taciɛit", + "tadabut", + "tadamsa", + "tadamsant", + "tadawsa", + "tadawsant", + "tadayra", + "tadayṛa", + "tadbelt", + "taddart", + "taddart-a", + "taddart-agi", + "taddart-is", + "taddart-iw", + "taddart-nneɣ", + "taddart-nni", + "taddayt", + "taddert", + "taddukli", + "tadelsant", + "tadfert", + "tadfi", + "tadigant", + "tadist", + "tadiwennit", + "tadrimt", + "tadukkli", + "tadukli", + "taduli", + "tadusi", + "tadwilt", + "tadyant", + "tadyant-a", + "tadzayrit", + "tadɣaɣat", + "taf", + "tafada", + "tafasa", + "tafaska", + "tafat", + "tafeggagt", + "tafejrit", + "tafekka", + "tafekka-s", + "tafekka-ynes", + "tafellayt", + "tafellaḥt", + "tafelsuft", + "tafelwit", + "tafem", + "taferka", + "tafesna", + "tafessast", + "tafeḍ", + "taffa", + "tafidiralit", + "taflest", + "tafransist", + "tafrant", + "tafrara", + "tafrawant", + "tafrawt", + "tafrayt", + "tafrensist", + "tafrikt", + "tafriqit", + "tafriqt", + "tafsut", + "taftart", + "taftilt", + "taftist", + "tafukt", + "tafunast", + "tafyirt", + "tafṛansist", + "tafṛensist", + "tagamant", + "tagant", + "tagara", + "tagarra", + "tagduda", + "tagejdant", + "tagelda", + "tageldant", + "tageldit", + "tageldunt", + "tagella", + "tagellidt", + "tagelmust", + "tagemmunt", + "tagensant", + "taggara", + "taggara-a", + "taggayin", + "taggayt", + "taggazt", + "taggaẓt", + "tagi", + "tagiṭart", + "taglizit", + "tagmant", + "tagmat", + "tagmatt", + "tagmuḍant", + "tagnit", + "tagnit-a", + "tagnitt", + "tagrawla", + "tagrawt", + "tagraɣlant", + "tagrest", + "tagreɣlant", + "tagrigit", + "tagrumma", + "taguni", + "tagut", + "tagwaranit", + "tajapunit", + "tajdidt", + "tajerrumt", + "tajeǧǧigt", + "tajmaɛt", + "tajmilt", + "tajumma", + "tajumma-nnes", + "tajumma-ynes", + "takanadit", + "takarḍa", + "takatut", + "takebbanit", + "takerrust", + "takerḍa", + "takeṛṛust", + "takeṛṛust-a", + "takeṛṛust-is", + "takeṛṛust-iw", + "takeṛṛust-nni", + "takfarinas", + "taklit", + "taklut", + "takmamt", + "takrit", + "takriḍt", + "takrura", + "takrurant", + "takti", + "takura", + "takurdit", + "takurt", + "talaba", + "taladna", + "talalit", + "talast", + "talatinit", + "talatint", + "taldayt", + "taleb", + "talemmast", + "talemmiẓt", + "talitwanit", + "tallalt", + "tallast", + "tallelt", + "tallit-a", + "tallit-agi", + "tallit-is", + "tallit-nni", + "talliyin", + "tallunin", + "tallunt", + "talmanit", + "talmant", + "talmest", + "talmest-a", + "talqayant", + "talqayt", + "talsa", + "talsant", + "talseḍ", + "taluft", + "taluft-a", + "taluft-agi", + "taluksemburgit", + "talwit", + "talɣa", + "talɣiwin", + "talɣut", + "talɣuɣa", + "tama-", + "tama-a", + "tama-nneɣ", + "tama-nni", + "tama-nniḍen", + "tama-nsen", + "tama-s", + "tama-w", + "tamacahut", + "tamacahutt", + "tamacint", + "tamadda", + "tamaddudt", + "tamadlant", + "tamagdayt", + "tamagit", + "tamagnut", + "tamanaɣt", + "tamanaɣt-is", + "tamaneɣt", + "tamaneɣt-is", + "tamaneɣt-nnes", + "tamarikanit", + "tamart", + "tamarut", + "tamasit", + "tamasiḥit", + "tamatut", + "tamawt", + "tamaynut", + "tamaynutt", + "tamazight", + "tamaziɣt", + "tamazrayt", + "tamazɣa", + "tamaḍalt", + "tamaḍlant", + "tamcumt", + "tamda", + "tamdint", + "tamdint-a", + "tamectuḥt", + "tamecṭuḥt", + "tameddit", + "tameddit-a", + "tameddit-nni", + "tameddurt", + "tameddurt-is", + "tameddurtcategory", + "tamedyazt", + "tamedyezt", + "tamegdayt", + "tamehla", + "tamellalt", + "tamemt", + "tamendawt", + "tamensayt", + "tament", + "tamentilt", + "tamenzut", + "tamenḍawt", + "tameqqrant", + "tameqqṛant", + "tameqrant", + "tamerkantit", + "tamesbanit", + "tamesgida", + "tamesguneft", + "tameskant", + "tameslayt", + "tamettant", + "tamettant-is", + "tamezdayt", + "tamezduɣt", + "tamezgunt", + "tamezwart", + "tamezwarut", + "tamezwert", + "tameɣbunt", + "tameɣra", + "tameɣtut", + "tameṭṭut", + "tameṭṭut-is", + "tameṭṭut-iw", + "tameṭṭut-nni", + "tameẓla", + "tameẓyant", + "tameẓẓuɣt", + "tamhalt", + "tamhazt", + "tamhelt", + "tamirant", + "tamiwin", + "tamkarḍit", + "tamlilt", + "tammazalt", + "tamment", + "tamnaḍt", + "tamnaṭ", + "tamnekda", + "tamneḍ", + "tamrikt", + "tamrilt", + "tamsalt", + "tamsalt-a", + "tamselyut", + "tamsirt", + "tamsiwt", + "tamsulta", + "tamtilt", + "tamu", + "tamudemt", + "tamudi", + "tamuqrant", + "tamurt", + "tamurt-a", + "tamurt-is", + "tamurt-iw", + "tamurt-nneɣ", + "tamurt-nsen", + "tamusni", + "tamussni", + "tamuɣli", + "tamuɣli-s", + "tamyiwent", + "tamzikt", + "tamzwarut", + "tamɣart", + "tamɣawt", + "tanaddalt", + "tanamsadt", + "tanarit", + "tanast", + "tanattalt", + "tanaḍt", + "tanaṣlit", + "tanaẓurt", + "tanbaḍt", + "taneflit", + "tanegga", + "taneggarut", + "taneggarut-a", + "tanekra", + "tanelmadt", + "tanemhalt", + "tanemlayt", + "tanemmirt", + "tanesbaɣurt", + "tanezduɣt", + "tanezzayt", + "tanezzut", + "taneɣlaft", + "taneɣruft", + "taneṣlit", + "tanfalit", + "tanfust", + "tangalt", + "tanglizit", + "tanila", + "tanina", + "taninna", + "tankult", + "tanmaḍalt", + "tanmehla", + "tanmettit", + "tannumi", + "tanqiḍt", + "tansa", + "tansa-agi", + "tansiwin", + "tantala", + "tantaliwin", + "tanumi", + "tanzagt", + "tanzanya", + "tanzeggit", + "tanzeɣt", + "taqacuct", + "taqbaylit", + "taqbilt", + "taqbuct", + "taqburt", + "taqcict", + "taqcict-nni", + "taqdimt", + "taqecwalt", + "taqeffalt", + "taqendurt", + "taqsit", + "taqsiḍt", + "taqsiṭ", + "tarakalt", + "tarameɣtut", + "tarbaɛt", + "tarbaɛt-a", + "tardast", + "taredsa", + "tarennawt", + "tarewla", + "targa", + "targit", + "tarifit", + "tarigla", + "tarka", + "tarmeɣtut", + "tarmit", + "tarrawt", + "tarrayin", + "tarrayt", + "taru", + "tarumanit", + "tarumit", + "taruradt", + "tarusi", + "tarusit", + "tarussint", + "taruḍ", + "tarwa", + "tarwa-s", + "tarwiḥt", + "tarzeft", + "tasa", + "tasa-s", + "tasa-w", + "tasaft", + "tasaggazt", + "tasakrart", + "tasartut", + "tasarut", + "tasarutt", + "tasawent", + "tasaɛudit", + "tasdawit", + "tasebgast", + "tasebḥit", + "taseddart", + "tasedmirt", + "tasefsit", + "tasegda", + "tasekkurt", + "tasekla", + "taselmadt", + "taselwayt", + "taselwit", + "tasemhuyt", + "tasemrant", + "tasengama", + "tasensartut", + "tasenselkimt", + "taseqqamut", + "taserdasant", + "taserdasit", + "tasertant", + "tasertayt", + "tasertit", + "taserɣint", + "taseɛdit", + "tasfift", + "tasga", + "tasilt", + "tasinin", + "tasint", + "taskala", + "taskant", + "tasleḍt", + "tasmekta", + "tasmilt", + "tasmuḍi", + "tasnallunt", + "tasnamurt", + "tasnawit", + "tasnudert", + "tasnujjya", + "taspanit", + "taspenyulit", + "taspenyult", + "tasqamut", + "tasraft", + "tassemt", + "tastayt", + "tastaɣt", + "tasuddest", + "tasudut", + "tasuffeɣt", + "tasuqelt", + "tasuqilt", + "tasuqqilt", + "tasusmi", + "tasut", + "tasuta", + "tasuvyatit", + "taswast", + "taswist", + "taswiɛt", + "taswiɛt-a", + "tasɣunt", + "tatoeba", + "tatrart", + "tatut", + "tavidyut", + "tavsa", + "tawacult", + "tawacult-a", + "tawacult-is", + "tawala", + "tawant", + "tawaɣit", + "tawaɣit-a", + "tawaṭṭfa", + "tawennaḍt", + "tawennaṭ", + "tawenza", + "taweḍ", + "tawi", + "tawil", + "tawila", + "tawilat", + "tawilayt", + "tawinest", + "tawiḍ", + "tawla", + "tawlaft", + "tawraɣt", + "tawriqt", + "tawrirt", + "tawsit", + "tawsit-a", + "tawtemt", + "tawtilt", + "tawuri", + "tawurmant", + "tawurta", + "tawwurt", + "tawḍeḍ", + "tawḥidt", + "tawṛiqt", + "taxatart", + "taxatemt", + "taxazabit", + "taxxamt", + "tayaziṭ", + "taydiyyin", + "tayeb", + "tayeffust", + "tayemmat", + "tayet", + "tayett", + "tayev", + "tayeḍ", + "tayri", + "tayuga", + "tayunt", + "taywalt", + "taza", + "tazart", + "tazayezt", + "tazayzant", + "tazedgant", + "tazeggaɣt", + "tazegzawt", + "tazelmaḍt", + "tazelmaṭ", + "tazelɣa", + "tazemmurt", + "tazeqqa", + "tazla", + "tazmalt", + "tazmert", + "tazmert-is", + "tazmilt", + "tazmiḍalt", + "tazneḍ", + "tazrart", + "tazrawt", + "tazrirt", + "tazunegzirt", + "tazurant", + "tazwara", + "tazwart", + "tazwert", + "tazzant", + "tazzayrit", + "tazzla", + "tazzwara", + "tazɣent", + "tazɣent-a", + "taččart", + "taǧǧalt", + "taɛdart", + "taɛebrit", + "taɛessast", + "taɛkemt", + "taɛkumt", + "taɛlayant", + "taɛrabin", + "taɛrabt", + "taɛzizt", + "taɛṛabt", + "taɣ", + "taɣamsa", + "taɣara", + "taɣawsa", + "taɣaṭ", + "taɣbalut", + "taɣda", + "taɣdemt", + "taɣect", + "taɣect-is", + "taɣellist", + "taɣelnawt", + "taɣerbit", + "taɣerdayt", + "taɣerfant", + "taɣerma", + "taɣert", + "taɣessa", + "taɣezfant", + "taɣeḍ", + "taɣiwant", + "taɣlamt", + "taɣtast", + "taɣtest", + "taɣuct", + "taɣulin", + "taɣult", + "taɣult-a", + "taɣuri", + "taɣuṛi", + "taɣwalit", + "taɣzut", + "taḍrist", + "taḍsa", + "taḍṣa", + "taḥanut", + "taḥbult", + "taḥerfit", + "taḥkayt", + "taṛumanit", + "taṛumit", + "taṣebḥit", + "taṭalyanit", + "taṭelyanit", + "taẓallit", + "taẓayant", + "taẓayt", + "taẓeyt", + "taẓrigt", + "taẓuri", + "taẓɣelt", + "tban", + "tban-d", + "tbaḍnit", + "tbedd", + "tbeddel", + "tbeddeleḍ", + "tbeddleḍ", + "tbeddu", + "tbeqqeḍeḍ", + "tbeskert", + "tbettit", + "tbettiyin", + "tcawit", + "tcebbeḥ", + "tcekkart", + "tcennayt", + "tcennu", + "tceqqufin", + "tceqquft", + "tcirḍart", + "tcudd", + "td-a-rec", + "tdabut", + "tdamsa", + "tdawsa", + "tdayra", + "tddukkla", + "tddukliwin", + "tdefrin", + "tdersi", + "tdiwennit", + "tdukkla", + "tdukkli", + "tdukkliwin", + "tdukla", + "tdukli", + "tdukliwin", + "tduli", + "tdusi", + "te-", + "tebbun", + "tebburt", + "tebda", + "tebda-d", + "tebdart", + "tebded", + "tebdu", + "tebduḍ", + "tebna", + "tebniqin", + "tebniqt", + "tebra", + "tebrat", + "tebratin", + "tebratt", + "tebrek", + "tebrez", + "tebzert", + "tebzimin", + "tebzimt", + "tebɛed", + "tebɣa", + "tebɣam", + "tebɣamt", + "tebɣest", + "tebɣi", + "tebɣid", + "tebɣim", + "tebɣiḍ", + "tebɣu", + "tebɣuḍ", + "tebḍa", + "tebḥirin", + "tebḥirt", + "tecba", + "tecbeḥ", + "tecceḍ", + "teccna", + "teccuyt", + "tecfawit", + "tecfiḍ", + "tecmumeḥ", + "tecna", + "tecrawt", + "tecraḍ", + "tecɛel", + "tecɣel", + "tedbelt", + "tedda-d", + "teddem", + "teddez", + "teddiḍ", + "teddreḍ", + "teddu", + "teddun", + "teddunt", + "tedduɣ", + "tedduḍ", + "tedmi", + "tedrimt", + "tedwilin", + "tedwilt", + "tedyanin", + "tedyant", + "tedyant-a", + "tedɣaɣatin", + "teffe", + "teffer", + "teffeɣ", + "teffeɣ-d", + "teffiɣ", + "teffɣen", + "teffɣeḍ", + "tefhem", + "tefk", + "tefka", + "tefka-as", + "tefka-d", + "tefkeḍ", + "tefkiḍ", + "teflel", + "teflest", + "tefra", + "tefranin", + "tefransist", + "tefrant", + "tefrayt", + "tefremlit", + "tefren", + "tefrensist", + "tefreḥ", + "tefri", + "tefrikt", + "tefriqt", + "tefrit", + "tefru", + "tefses", + "tefsi", + "tefsut", + "teftilin", + "teftilt", + "teftisin", + "teftist", + "tefyar", + "tefyirt", + "tefṛansist", + "tefṛensist", + "tefṛeḥ", + "tegber", + "tegda", + "tegduda", + "teggra-d", + "teggug", + "tegguma", + "tegla", + "tegla-d", + "teglizit", + "teglizt", + "teglu", + "tegmat", + "tegnatin", + "tegnawt", + "tegnewt", + "tegneḍ", + "tegnit", + "tegnit-a", + "tegnit-agi", + "tegnit-nni", + "tegnitt", + "tegra-d", + "tegrawin", + "tegrawla", + "tegrawt", + "tegrest", + "tegreḍ", + "tegrigit", + "tegrumma", + "tegti", + "tegzem", + "tegzem-itt", + "tegzi", + "tegzirin", + "tegzirt", + "tehri", + "tejmaɛt", + "tejmilt", + "tekcem", + "tekcem-d", + "tekfa", + "tekfu", + "tekka", + "tekka-d", + "tekkat", + "tekkaw", + "tekker", + "tekker-d", + "tekkes", + "tekki", + "tekkseḍ", + "teklut", + "tekmamin", + "tekmamt", + "tekres", + "tekriḍt", + "tekrura", + "tekseḍ", + "tekti", + "tektiwin", + "teldayt", + "teldi", + "teldiḍ", + "telenẓar", + "telha", + "telhu", + "tella-d", + "tellam", + "tellamt", + "telli", + "telliḍ", + "telluẓ", + "telmant", + "telmas", + "telmas-is", + "telmed", + "telmest", + "telmest-a", + "telmeẓyin", + "telqay", + "telqayt", + "telqey", + "telsa", + "telwit", + "telɣa", + "telɣut", + "telɣuɣa", + "telḥa", + "telḥeq", + "telḥu", + "temda", + "temdel", + "temdinin", + "temdint", + "temdint-a", + "temdint-agi", + "temdint-nni", + "temgarad", + "temguri", + "temhalt", + "temharsa", + "temhazt", + "temhelt", + "temkarḍit", + "temkerḍit", + "temlal", + "temlil", + "temlileyyin", + "temlilit", + "temlilit-a", + "temlilit-nni", + "temliliyin", + "temlilt", + "temmal", + "temmed", + "temmeslay", + "temmeslayeḍ", + "temmet", + "temmeɣ", + "temmug", + "temmuger", + "temmut", + "temmuteḍ", + "temnaḍin", + "temnaḍt", + "temnaḍt-a", + "temnaṭ", + "temnaṭ-a", + "temraradin", + "temrikt", + "temsal", + "temsal-a", + "temsalt", + "temsalt-a", + "temsalt-agi", + "temsetla", + "temseɣẓaẓ", + "temsilt", + "temsirin", + "temsirt", + "temsiwt", + "temsizlin", + "temsizzelt", + "temsulta", + "temsuṭaṭ", + "temxallaf", + "temɛict", + "temɣarin", + "temɣart", + "temɣawla", + "temɣer", + "temɣunt", + "temḥaddit", + "temḥeqranit", + "temẓi", + "temẓi-s", + "temẓin", + "ten-id", + "ten-id-ssutren", + "ten-yeǧǧan", + "tenbaḍt", + "tendeh", + "tenfalit", + "tenfaliyin", + "tenga", + "tengalt", + "tenger", + "tenhert", + "tenmegla", + "tenmehla", + "tenna", + "tenna-as", + "tenna-d", + "tenna-iyi-d", + "tenna-k", + "tenna-yas", + "tenna-yi-d", + "tennerna", + "tennerni", + "tenniḍ", + "tenniḍ-d", + "tennulfa-d", + "tennum", + "tennuɣ", + "tenqes", + "tenqiḍin", + "tensa", + "tensawt", + "tent-", + "tenwa", + "tenwiḍ", + "tenza", + "tenzeggit", + "tenɣa", + "tenṭelt", + "tenṭeq", + "teqbaylit", + "teqbel", + "teqbilin", + "teqbilt", + "teqbucin", + "teqbuct", + "teqcelt", + "teqcicin", + "teqcict", + "teqcict-nni", + "teqliɛt", + "teqqar", + "teqqar-as", + "teqqar-d", + "teqqareḍ", + "teqqel", + "teqqen", + "teqqim", + "teqqim-d", + "teqqimem", + "teqqimemt", + "teqqimeḍ", + "teqqneḍ", + "teqqur", + "teqreb", + "teqseḥ", + "teqsiḍt", + "teqṣebt", + "terbabt", + "terbaɛt", + "terbaɛt-a", + "terbaɛt-is", + "terbeḥ", + "terbuyaɛ", + "terfa", + "terfed", + "terfiḍ", + "tergagayt", + "terked", + "termit", + "termitin", + "terna-d", + "terniḍ", + "ternu", + "ternum-as", + "ternuḍ", + "terra-as-d", + "terra-d", + "terra-t", + "terra-ten", + "terra-tt", + "terrem", + "terreḍ", + "terreẓ", + "terriḍ", + "ters", + "ters-d", + "tersasin", + "terwel", + "terwi", + "terwiḥin", + "terwiḥt", + "tesbaduḍ", + "tesbeddeḍ", + "tesdatin", + "tesdawit", + "tesdawiyin", + "tesdidin", + "tesferkeḍ", + "tesfeḍ", + "tesfifin", + "tesfift", + "tesga", + "teshel", + "teskant", + "teskecmeḍ", + "teskelseḍ", + "teslam", + "teslent", + "tesleḍ", + "tesleḍt", + "teslit", + "tesliḍ", + "tesmekta", + "tesmeḍ", + "tesmilt", + "tesmuttiḍ", + "tesnawit", + "tesnerni", + "tesnilest", + "tesnudert", + "tesnujjya", + "tespenyult", + "tesqamut", + "tesqamut-a", + "tesqamutt", + "tesqedceḍ", + "tesquma", + "tesqunt", + "tesraft", + "tesreḍt", + "tesriḍ", + "tesriḥ", + "tessaram", + "tessared", + "tessawal", + "tessawel", + "tessaweḍ", + "tessefray", + "tessefraḥ", + "tessekcem", + "tessen", + "tessenqes", + "tesseqdac", + "tesseqdec", + "tessers", + "tesseɣ", + "tessineḍ", + "tessiweḍ", + "tessnem", + "tessnemt", + "tessneḍ", + "tessuffeɣ-d", + "tessusem", + "tessuter", + "tessutreḍ", + "tessutur", + "testayin", + "testayt", + "testeqsa", + "testeqsa-t", + "testeɛṛef", + "teswa", + "teswast", + "tesweḍ", + "teswiɛin", + "teswiɛt", + "teswiɛt-a", + "teswiɛt-nni", + "tesɛa", + "tesɛam", + "tesɛamt", + "tesɛedda", + "tesɛeddi", + "tesɛi", + "tesɛiḍ", + "tesɛu", + "tesɛuḍ", + "tesɣunin", + "tesɣunt", + "tesṛuḥ", + "tetqelleq", + "tett", + "tettaf", + "tettafeḍ", + "tettagad", + "tettak", + "tettak-d", + "tettaked", + "tettali", + "tettamneḍ", + "tettara", + "tettarra", + "tettaru", + "tettaruḍ", + "tettas-d", + "tettawaṭ", + "tettaweḍ", + "tettawi", + "tettawi-d", + "tettazzal", + "tettaǧǧa", + "tettaɣ", + "tettaṭṭaf", + "tettban", + "tettban-d", + "tettbanem-d", + "tettbaneḍ-d", + "tettbeddil", + "tetteddu", + "tettedduḍ", + "tetteffeɣ", + "tetteg", + "tettekka", + "tettekki", + "tettemcabi", + "tettemɣay-d", + "tetten", + "tettett", + "tettezzi", + "tetteɣ", + "tettfakka", + "tettidir", + "tettiki", + "tettili", + "tettili-d", + "tettimɣur", + "tettkel", + "tettkemmil", + "tettmeslay", + "tettmeslayeḍ", + "tettnadi", + "tettnadiḍ", + "tettnaɣ", + "tettnerni", + "tettraǧu", + "tettru", + "tettruḥu", + "tettu", + "tettun", + "tettunefk", + "tetturar", + "tettusemma", + "tettuseqdac", + "tettuɣ", + "tettuɣal", + "tettuḍ", + "tettwaf", + "tettwakkes", + "tettwali", + "tettwalim", + "tettwaliḍ", + "tettwaru", + "tettwasen", + "tettwassen", + "tettwaxdem", + "tettxemmim", + "tettxemmimeḍ", + "tettɛeṭṭil", + "tettɣimi", + "tetḥeqqeḍ", + "tewhem", + "tewjed", + "tewlafin", + "tewlaft", + "tewrirt", + "tewsatin", + "tewser", + "tewsit", + "tewsit-a", + "tewsitin", + "tewtemt", + "tewtilin", + "tewwet", + "tewweḍ", + "tewweḍ-d", + "tewwi", + "tewwi-d", + "tewwi-t", + "tewwiḍ", + "tewwiḍ-d", + "tewwura", + "tewwurt", + "tewzel", + "tewɛer", + "tewɛeṛ", + "texdem", + "texriṭ", + "texser", + "texsi", + "text-align", + "texxamin", + "texxamt", + "texxamt-is", + "texxamt-iw", + "texxamt-nni", + "texṣer", + "teywalt", + "tezdeg", + "tezdemt", + "tezdeɣ", + "tezdi", + "tezga", + "tezga-d", + "tezgad", + "tezgel", + "tezger", + "tezgiḍ", + "tezha", + "tezlatin", + "tezlatin-is", + "tezlit", + "tezlitt", + "tezmart", + "tezmer", + "tezmert", + "tezmert-is", + "tezmert-nsen", + "tezmilin", + "tezmir", + "tezmirem", + "tezmiremt", + "tezmireḍ", + "tezmiḍalt", + "tezniqt", + "tezrart", + "tezrawin", + "tezrawt", + "tezreḍ", + "tezri", + "tezrigin", + "tezriḍ", + "tezwar", + "tezwara", + "tezwert", + "tezweǧ", + "tezweɣ", + "tezyiwin-is", + "tezzi", + "tezzi-d", + "tezzin", + "tezɣent", + "tezɣent-a", + "tečč", + "tečča", + "teččam", + "teččem", + "teččeḍ", + "teččiḍ", + "teččur", + "teččuṛ", + "teǧhed", + "teǧǧ", + "teǧǧa", + "teǧǧa-d", + "teǧǧeḍ", + "teǧǧi", + "teǧǧiḍ", + "teɛkemt", + "teɛna", + "teɛrabt", + "teɛreḍ", + "teɛya", + "teɛǧeb-iyi", + "teɣbula", + "teɣdeft", + "teɣdemt", + "teɣdira", + "teɣlamt", + "teɣleb", + "teɣleq", + "teɣli", + "teɣli-d", + "teɣlift", + "teɣmert", + "teɣra", + "teɣremt", + "teɣreḍ", + "teɣri", + "teɣriḍ", + "teɣsert", + "teɣtasin", + "teɣtast", + "teɣtest", + "teɣwalt", + "teɣzef", + "teɣzent", + "teɣzi", + "teɣzut", + "teḍfer", + "teḍra", + "teḍra-d", + "teḍru", + "teḍsa", + "teḍṣa", + "teḥbes", + "teḥbis", + "teḥbubt", + "teḥdayin", + "teḥkayt", + "teḥkem", + "teḥma", + "teḥrez", + "teḥwaj", + "teḥwaǧ", + "teḥwaǧeḍ", + "teḥzen", + "teḥṣa", + "teṛmist", + "teṭṭafar", + "teṭṭef", + "teṭṭef-d", + "teṭṭef-it", + "teṭṭerḍeq", + "teṭṭes", + "teṭṭfeḍ", + "teṭṭseḍ", + "teẓgi", + "teẓra", + "teẓram", + "teẓramt", + "teẓrem", + "teẓreḍ", + "teẓri", + "teẓrigin", + "teẓrigt", + "teẓriḍ", + "teẓwer", + "teẓɣelt", + "teẓṛiḍ", + "teẓẓel", + "tfak", + "tfakk", + "tfaq", + "tfasa", + "tfaska", + "tfaskiwin", + "tfednin", + "tfeggagt", + "tfehmeḍ", + "tfekka", + "tfekka-s", + "tfekkiwin", + "tfellaḥt", + "tfelsafit", + "tfelsuft", + "tfelwit", + "tferka", + "tferkit", + "tferkiwin", + "tferneḍ", + "tfesna", + "tfesniwin", + "tfidiralit", + "tfinaɣ", + "tfizikt", + "tfuk", + "tfukk", + "tfukt", + "tfunasin", + "tfunast", + "tga", + "tgama", + "tgara", + "tgecrar", + "tgejda", + "tgejdit", + "tgelda", + "tgeldit", + "tgeldunt", + "tgella", + "tgellidt", + "tgem", + "tgemmi", + "tgemt", + "tgen", + "tger", + "tger-d", + "tgerrez", + "tgezmi", + "tgeḍ", + "tgiḍ", + "tguni", + "thedder", + "thegga", + "thuringe", + "thuski", + "ti-", + "tibawt", + "tiberkanin", + "tiberraniyin", + "tibexsisin", + "tibniqin", + "tibratin", + "tibzimin", + "tibḥirt", + "ticcert", + "ticeqqufin", + "ticki", + "ticraḍ", + "ticreḍt", + "tidaddanin", + "tidak", + "tidayṛiwin", + "tiddas", + "tiddest", + "tiddi", + "tiddi-ines", + "tiddi-ynes", + "tiddin", + "tiddukkla", + "tiddukla", + "tiddukliwin", + "tidelsanin", + "tidep", + "tidet", + "tidett", + "tidiganin", + "tidir", + "tidireḍ", + "tidmi", + "tidukkla", + "tidukla", + "tidyanin", + "tifaskiwin", + "tifawit", + "tifekkiwin", + "tiferkit", + "tifernin", + "tifesniwin", + "tifin", + "tifinaɣ", + "tifra", + "tifranin", + "tifrart", + "tifrat", + "tiftilin", + "tifyar", + "tigamanin", + "tigawin", + "tigawt", + "tigawt-a", + "tigawt-agi", + "tigdi", + "tigduda", + "tigejda", + "tigejdanin", + "tigejdit", + "tigellilt", + "tigelmusin", + "tigemmi", + "tigezmi", + "tigezt", + "tiggayin", + "tigget", + "tiggi", + "tiggtin", + "tigi", + "tignatin", + "tignawt", + "tignewt", + "tignit", + "tignitin", + "tigraɣlanin", + "tigri", + "tigrin", + "tigrummiwin", + "tigti", + "tigzi", + "tigzirin", + "tigzirt", + "tihawt", + "tihert", + "tihin", + "tijeǧǧigin", + "tijɛal", + "tikal", + "tikci", + "tikebbaniyin", + "tikeli", + "tikelt", + "tikelt-a", + "tikelt-nniḍen", + "tikerkas", + "tikeryas", + "tikkal", + "tikkelt", + "tikkelt-a", + "tikkelt-agi", + "tikkelt-nniḍen", + "tikkwal", + "tikli", + "tikli-s", + "tikliwin", + "tikmamin", + "tiknariyin", + "tikta", + "tikti", + "tikti-a", + "tikti-agi", + "tiktiwin", + "tiktiwin-is", + "tikwal", + "tilalliyin", + "tilas", + "tilawin", + "tilawt", + "tilelli", + "tilellit", + "tilelliyin", + "tilemmasin", + "tilemt", + "tilemẓit", + "tili", + "tilibizyu", + "tilifun", + "tilim", + "tilin", + "tilisa", + "tilist", + "tiliwa", + "tilizri", + "tiliɣri", + "tiliḍ", + "tiliẓri", + "tillawt", + "tilleli", + "tilmas", + "tilmas-a", + "tilmawin", + "tilufa", + "tilɣa", + "tilɣuɣa", + "timacinin", + "timad-is", + "timahilin", + "timanit", + "timawit", + "timaynutin", + "timaziɣin", + "timdinin", + "timdinincategory", + "timecṭaḥ", + "timecṭuḥin", + "timekkasin", + "timella", + "timellalin", + "timenna", + "timental", + "timentelt", + "timenza", + "timenɣiwt", + "timeqqranin", + "timeqranin", + "timerna", + "timerniwt", + "timesbaniyin", + "timeskebrin", + "timestuga", + "timetti", + "timettiyin", + "timezgit", + "timezwura", + "timeɣriwin", + "timeẓliyin", + "timeẓri", + "timeẓyanin", + "timiqwa", + "timiwa", + "timizar", + "timiḍi", + "timlilit", + "timlilit-a", + "timliliyin", + "timmad", + "timmad-is", + "timmad-iw", + "timmad-nsen", + "timmidwa", + "timmunent", + "timmuzɣa", + "timnaḍin", + "timraradin", + "timsal", + "timsedrarin", + "timsefra", + "timseksumin", + "timselɣa", + "timsenjlit", + "timseɣẓaẓ", + "timsirin", + "timsizzelt", + "timsuṭad", + "timucent", + "timucuha", + "timunent", + "timunnent", + "timura", + "timuzɣa", + "timuɣliwin", + "timɣarin", + "timẓin", + "tinefrunin", + "tineggura", + "tinegwa", + "tineslemt", + "tineɣrufin", + "tineṣliyin", + "tiniri", + "tiniḍ", + "tinn", + "tinna", + "tinnagrawt", + "tinqiḍin", + "tinselmin", + "tipaza", + "tiqbayliyin", + "tiqburin", + "tiqcicin", + "tiqdimin", + "tiqeffalin", + "tiqenṭert", + "tiqit", + "tira-s", + "tirawt", + "tirebbaɛ", + "tirebbuyaɛ", + "tirect", + "tiregwa", + "tiremt", + "tirga", + "tirgin", + "tiririt", + "tiririyin", + "tirlandit", + "tirmit", + "tirmitin", + "tirni", + "tirrugza", + "tirugza", + "tirwiḥin", + "tirẓi", + "tis-snat", + "tisdatin", + "tiseddarin", + "tiseddaṛin", + "tisefsiyin", + "tisekta", + "tiserɣuda", + "tisin", + "tisirag", + "tislit", + "tismin", + "tisselbi", + "tissi", + "tissirt", + "tissit", + "tissiyin", + "tissulya", + "tisuda", + "tisuffaɣ", + "tisuqilin", + "tisura", + "tisṭunit", + "tividyutin", + "tiwaculin", + "tiwal", + "tiwelhiwin", + "tiwizi", + "tiwlafin", + "tiwsatin", + "tiwsitin", + "tiwtilin", + "tiwuriwin", + "tiwwura", + "tiwwura-nsen", + "tixsi", + "tixtiṛiyin", + "tixxamin", + "tiyaḍ", + "tiyemmatin", + "tiyersi", + "tiyita", + "tiyitwin", + "tiyiḍ", + "tiyta", + "tizeggaɣin", + "tizegzawin", + "tizegzewt", + "tizeɣt", + "tizeɣwa", + "tizgelt", + "tizi", + "tizi-", + "tizi-uzzu", + "tizi-wezzu", + "tiziri", + "tizit", + "tizizwa", + "tizlatin", + "tizlatin-is", + "tizlit", + "tizlit-a", + "tizlitt", + "tizmilin", + "tizmireḍ", + "tizrarin", + "tizrawin", + "tizrigin", + "tizwal", + "tizzayriyin", + "tizzegzut", + "tiɛrabin", + "tiɣawsiwin", + "tiɣawt", + "tiɣbula", + "tiɣelnawin", + "tiɣilt", + "tiɣimit", + "tiɣin", + "tiɣiwanin", + "tiɣmert", + "tiɣmi", + "tiɣra", + "tiɣremt", + "tiɣri", + "tiɣriwin", + "tiɣtasin", + "tiḍullest", + "tiḥerci", + "tiḥizit", + "tiḥuna", + "tiṭ", + "tiṭ-is", + "tiẓegwa", + "tiẓgi", + "tiẓraf", + "tiẓri", + "tiẓrigin", + "tiẓurin", + "tjaddit", + "tjerrumt", + "tjeǧǧigin", + "tjumma", + "tkadimit", + "tkamyunt", + "tkarḍa", + "tkarḍiwin", + "tkatut", + "tkaɣreft", + "tkebbanit", + "tkebbanit-a", + "tkebbaniyin", + "tkecmeḍ", + "tkemmel", + "tkemmeleḍ", + "tkemmleḍ", + "tkerkas", + "tkerrusin", + "tkerrust", + "tkeryas", + "tkerḍa", + "tkessawt", + "tkeṛṛust", + "tkura", + "tkurdit", + "tkurt", + "tkuzint", + "tlalit", + "tlallit", + "tlaq", + "tlata", + "tlatin", + "tlatinit", + "tlatint", + "tlawin", + "tlelli", + "tlelliyin", + "tlemdeḍ", + "tlemmast", + "tlemsan", + "tlemẓit", + "tleqqemeḍ", + "tleḥḥu", + "tlisa", + "tliwa", + "tliẓri", + "tls", + "tlufa", + "tlul", + "tlul-d", + "tmacahut", + "tmacahutt", + "tmacinin", + "tmacint", + "tmagit", + "tmanaɣt", + "tmaneɣt", + "tmanya", + "tmanyin", + "tmara", + "tmasit", + "tmasiḥit", + "tmassurin", + "tmazirt", + "tmaziɣt", + "tmazzalt", + "tmazɣa", + "tmeddit", + "tmeddurt", + "tmeddurt-is", + "tmedkin", + "tmedleḍ", + "tmedyazt", + "tmedyezt", + "tmehla", + "tmekkast", + "tmellalin", + "tmellalt", + "tmendawt", + "tmendit", + "tmenna", + "tmenqas", + "tmental", + "tmentelt", + "tmentilt", + "tmenɣiwin", + "tmenɣiwt", + "tmenḍawt", + "tmeqbert", + "tmerna", + "tmerniwt", + "tmerrit", + "tmerwin", + "tmes", + "tmesbaniyin", + "tmesgida", + "tmeskanin", + "tmeslayin", + "tmeslayt", + "tmesliwt", + "tmess", + "tmettant", + "tmettant-is", + "tmetti", + "tmettiyin", + "tmezdayt", + "tmezduɣt", + "tmezgida", + "tmezwura", + "tmeɣra", + "tmeɣra-nni", + "tmeɣriwin", + "tmeɣṛa", + "tmeṭṭut", + "tmeṭṭut-ik", + "tmeṭṭut-is", + "tmeṭṭut-iw", + "tmeṭṭut-nni", + "tmeẓri", + "tmeẓyant", + "tmeẓẓuɣt", + "tmiwa", + "tmiḍi", + "tmu", + "tmucuha", + "tmuddeḍ", + "tmudemt", + "tmudmin", + "tmugri", + "tmunent", + "tmunnent", + "tmura", + "tmura-nniḍen", + "tmura-ya", + "tmurt", + "tmurt-", + "tmurt-a", + "tmurt-agi", + "tmurt-is", + "tmurt-iw", + "tmurt-nneɣ", + "tmurt-nni", + "tmurt-nsen", + "tmusni", + "tmussni", + "tmussniwin", + "tmuɣli", + "tmuɣli-s", + "tmuɣliwin", + "tnac", + "tnadiḍ", + "tnafa", + "tnaka", + "tnamit", + "tnarit", + "tnaẓurt", + "tneflit", + "tnefsit", + "tnegga", + "tnegluft", + "tnegwa", + "tnekkra", + "tnekra", + "tneqqiḍin", + "tneqḍin", + "tneslemt", + "tnezduɣin", + "tnezduɣt", + "tnezzayt", + "tnezzut", + "tneɣ", + "tneɣlaft", + "tneɣrit", + "tneɣrufin", + "tneɣruft", + "tneẓruft", + "tneẓẓi", + "tnila", + "tniri", + "tnuda", + "tpaliḍt", + "tqabel", + "tqacuct", + "tqebleḍ", + "tqecwalt", + "tqeddec", + "tqeffalin", + "tqeffalt", + "tqendurt", + "tqenṭert", + "tqubbet", + "tquftin", + "trakalt", + "traḍ", + "tre", + "trebba", + "trebbaɛ", + "trebbaɛ-a", + "trebbuyaɛ", + "tredsa", + "tregwa", + "trennawt", + "trennu", + "trewla", + "tririt", + "trisiti", + "triḍ", + "tru", + "trugza", + "trumit", + "trusi", + "trusit", + "truḥ", + "truḥem", + "truḥemt", + "truḥeḍ", + "truẓi", + "tsaggazt", + "tsartut", + "tsarut", + "tsarutt", + "tsaɛtin", + "tsebḥit", + "tseddarin", + "tseddart", + "tseddast", + "tseddawit", + "tseddi", + "tsefsit", + "tsekkurt", + "tsekla", + "tsekliwin", + "tselwit", + "tsemhuyin", + "tsemhuyt", + "tsengama", + "tsenselkimt", + "tseqdaceḍ", + "tseqqamut", + "tserreḥ", + "tsers", + "tsertit", + "tserɣint", + "tserɣuda", + "tsinin", + "tsuddut", + "tsuffaɣ", + "tsuffeɣt", + "tsuqilin", + "tsuqilt", + "tsuqqilt", + "tsura", + "tsusmi", + "tsut", + "tsuta", + "tsutwin", + "tsuɣ", + "tt-", + "tt-id", + "tt-id-", + "tt-iwala", + "tt-ixedmen", + "tt-xedmeɣ", + "tt-yettmeslayen", + "tt-yeǧǧan", + "tt-yuɣ", + "ttafen", + "ttafeɣ", + "ttagad", + "ttagaden", + "ttagadeɣ", + "ttaggad", + "ttaken", + "ttaken-d", + "ttalin", + "ttamnen", + "ttamneɣ", + "ttar", + "ttarguɣ", + "ttarra", + "ttarran", + "ttarun", + "ttaruɣ", + "ttasen-d", + "ttawil", + "ttawilat", + "ttawin", + "ttawin-d", + "ttawint", + "ttawiɣ", + "ttawḍen", + "ttazzalen", + "ttaǧǧa", + "ttaǧǧan", + "ttaɣen", + "ttaṛ", + "ttaṭṭafen", + "ttbanen", + "ttbanen-d", + "ttbeddilen", + "ttbut", + "tteddun", + "tteffaḥ", + "tteffren", + "ttekkan", + "ttekki", + "ttekkin", + "tteklen", + "ttekleɣ", + "ttemcabin", + "ttemcabint", + "ttemlilin", + "ttemsefhamen", + "tteryel", + "ttesriḥ", + "ttetteḍ", + "ttfaṣil", + "ttgen", + "tti", + "ttidiren", + "ttidiren-t", + "ttidirent", + "ttidireɣ", + "ttif", + "ttili", + "ttilin", + "ttilint", + "ttilint-d", + "ttiliɣ", + "ttin", + "ttinin", + "ttinin-as", + "ttiɛad", + "ttkemmilen", + "ttlata", + "ttmeslayen", + "ttmeslayen-tt", + "ttmeslayent", + "ttmeslayeɣ", + "ttmettaten", + "ttmuqulen", + "ttmuquleɣ", + "ttn", + "ttnadin", + "ttnadint", + "ttnadiɣ", + "ttnaɣen", + "ttqadaren", + "ttqelliben", + "ttrad", + "ttrajun", + "ttraǧun", + "ttraǧuɣ", + "ttrebga", + "ttru", + "ttrun", + "ttruɣ", + "ttruḥun", + "ttruḥuɣ", + "ttsuɣun", + "ttun", + "tturaren", + "tturareɣ", + "tturk", + "ttuɣ", + "ttuɣalen", + "ttuɣaleɣ", + "ttwakksen", + "ttwaleqqemen", + "ttwali", + "ttwalin", + "ttwalint", + "ttwaliɣ", + "ttwanɣan", + "ttwarun", + "ttwasnen", + "ttwasqedcen", + "ttwassnen", + "ttwaɛezlen", + "ttwaḥebsen", + "ttwaṭṭfen", + "ttwessin", + "ttxemmimen", + "ttxemmimeɣ", + "ttxil", + "ttxil-k", + "ttxil-kent", + "ttxil-k·m", + "ttxil-m", + "ttxil-wet", + "ttxilek", + "ttɛassan", + "ttɛeddin", + "ttɣilen", + "ttɣimin", + "ttḥulfuɣ", + "tubeṛ", + "tubiret", + "tucbiḥt", + "tuccar", + "tuccar-is", + "tuccent", + "tuccḍa", + "tuccḍiwin", + "tucḍa", + "tudayt", + "tuddar", + "tuddma", + "tuddsa", + "tuddsiwin", + "tudert", + "tudert-ik", + "tudert-is", + "tudert-iw", + "tudert-nneɣ", + "tudert-nsen", + "tudlift", + "tudmawant", + "tudrin", + "tufa-d", + "tufat", + "tuffirt", + "tuffiɣt", + "tuffra", + "tuffɣa", + "tuffɣiwin", + "tufi", + "tufiḍ", + "tufra", + "tufrint", + "tufɣa", + "tuga", + "tugad", + "tugar", + "tugdi", + "tugdin", + "tugdudt", + "tugdut", + "tuget", + "tugett", + "tuggad", + "tuggdi", + "tugget", + "tugi", + "tugiḍ", + "tugna", + "tugna-a", + "tugna-agi", + "tugniwin", + "tugra", + "tujjma", + "tujjya", + "tukci", + "tukerḍa", + "tuki", + "tukkist", + "tukksa", + "tuklal", + "tuksa", + "tukza", + "tulawin", + "tuli", + "tuli-d", + "tullas", + "tullisin", + "tullist", + "tulluɣt", + "tullya", + "tulmisin", + "tulya", + "tumant", + "tumast", + "tumen", + "tumert", + "tumin", + "tummant", + "tummidt", + "tunigin", + "tunnigt", + "tunsibt", + "tunṣibin", + "tunṣibt", + "tuqna", + "tuqqna", + "tuqqniwin", + "turagt", + "turar", + "turareḍ", + "turarin", + "turart", + "turda", + "turdiwin", + "turew", + "turigeḍ", + "turiḍ", + "turkya", + "turmidt", + "turuft", + "turza", + "tusa", + "tusa-d", + "tusligin", + "tusligt", + "tusna", + "tusnakt", + "tusridt", + "tussda", + "tussit", + "tussna", + "tussnant", + "tussniwin", + "tusut", + "tutlayin", + "tutlayin-agi", + "tutlayt", + "tutlayt-a", + "tutlayt-agi", + "tutlayt-ik", + "tutlayt-is", + "tutlayt-nneɣ", + "tutlayt-nsen", + "tutrict", + "tutrimin", + "tutrimt", + "tuttra", + "tuttriwin", + "tuyat", + "tuyat-is", + "tuyes", + "tuzga-d", + "tuzna", + "tuzwirt", + "tuzyint", + "tuzzel", + "tuzzma", + "tuzzna", + "tuzzuft", + "tuzzya", + "tuččit", + "tuǧa", + "tuɣ", + "tuɣ-d", + "tuɣ-it", + "tuɣac", + "tuɣal", + "tuɣal-d", + "tuɣalem", + "tuɣaleḍ", + "tuɣalin", + "tuɣdaḍt", + "tuɣeḍ", + "tuɣmas", + "tuɣmest", + "tuḍen", + "tuḍfirt", + "tuḥwaǧ", + "tuṛufit", + "tuṛuft", + "tuṭṭfa", + "tuṭṭfiwin", + "tuẓult", + "tuẓwayt", + "tvidyut", + "tvidyutin", + "twaculin", + "twaculin-nsen", + "twacult", + "twacult-a", + "twacult-is", + "twacult-iw", + "twala", + "twalam", + "twalamt", + "twalaḍ", + "twali", + "twalim", + "twaliḍ", + "twaɣit", + "twaɣit-a", + "twaṭṭfa", + "twehmeḍ", + "twejdeḍ", + "twekked-d", + "twennaḍt", + "twennaṭ", + "twenza", + "twetmin", + "twilayin", + "twilayt", + "twinas", + "twinest", + "twizi", + "twuri", + "twuriwin", + "twuɣa", + "txazabit", + "txeddem", + "txeddmem", + "txeddmemt", + "txeddmeḍ", + "txedmem", + "txedmemt", + "txedmeḍ", + "txelleṣ", + "txemmem", + "txessarin", + "txidas", + "txuṣ", + "txuṣṣ", + "tyemmat", + "tyerza", + "tyita", + "tyitwin", + "tyuga", + "tzad", + "tzedɣeḍ", + "tzemmar", + "tzemmurt", + "tzemrem", + "tzemremt", + "tzemreḍ", + "tzeqqa", + "tzerzayt", + "tzewǧeḍ", + "tzeɣwa", + "tziri", + "tzizwa", + "tzunegzirt", + "tɛawed", + "tɛawen", + "tɛebrit", + "tɛedda", + "tɛeddi", + "tɛerḍeḍ", + "tɛessast", + "tɛeṭṭel", + "tɛiwed", + "tɛummeḍ", + "tɣaltin", + "tɣamsa", + "tɣara", + "tɣawla", + "tɣawsa", + "tɣawsiwin", + "tɣellist", + "tɣemmar", + "tɣenjawin", + "tɣenjawt", + "tɣerdayt", + "tɣerma", + "tɣermiwin", + "tɣerɣert", + "tɣessa", + "tɣil", + "tɣileḍ", + "tɣimit", + "tɣiwanin", + "tɣiwant", + "tɣiwant-a", + "tɣult", + "tɣuri", + "tɣuṛi", + "tḍegger", + "tḍerru", + "tḍul", + "tḥanut", + "tḥar", + "tḥebseḍ", + "tḥemmel", + "tḥemmel-it", + "tḥemmlem", + "tḥemmlemt", + "tḥemmleḍ", + "tḥeqqeɣ", + "tḥettem", + "tḥudd", + "tḥulfa", + "tḥuna", + "tḥuss", + "tḥuza", + "tṛumit", + "tṛuḥ", + "tṛuḥem", + "tṛuḥemt", + "tṛuḥeḍ", + "tṣebḥit", + "tṣeddarin", + "tṣeḥḥa", + "tẓa", + "tẓallit", + "tẓegwa", + "tẓer", + "tẓergeḍ", + "tẓuri", + "tẓurin", + "uand", + "ubabat", + "ubadu", + "ubaxix", + "ubdid", + "ubeddel", + "ubekkaḍ", + "ubelkim", + "ubellez", + "ubeqqa", + "ubeqqeḍ", + "uberkan", + "ubeḥri", + "ubleɣ", + "ubrid", + "ubrid-a", + "ubrid-is", + "ubugaṭu", + "ubuntu", + "ucareɛ", + "ucbiḥ", + "uccanen", + "uccen", + "ucebbub", + "ucegger", + "ucengu", + "ucennay", + "ucetki", + "ucmumeḥ", + "udabu", + "udawi", + "uday", + "udayen", + "udcir", + "uddis", + "uddisen", + "udekkar", + "udellel", + "udem", + "udem-ik", + "udem-is", + "udem-iw", + "udfel", + "udiwenni", + "udiɣ", + "udlif", + "udlifen", + "udlis", + "udlis-a", + "udlis-is", + "udmawan", + "udmawanen", + "udmawen", + "udrar", + "udras", + "udraɛ", + "udrim", + "udrum", + "udrurem", + "uefa", + "ufan", + "ufan-d", + "ufares", + "ufaylu", + "ufecku", + "ufeggag", + "ufekrun", + "ufella", + "ufellaḥ", + "uferdis", + "ufesyan", + "uffir", + "uffiren", + "uffiɣ", + "uffiɣen", + "ufgan", + "ufham", + "ufi", + "ufin", + "ufiɣ", + "ufiɣ-d", + "ufiɣ-t", + "ufrag", + "ufran", + "ufransis", + "ufraq", + "ufrin", + "ufrinen", + "ufurk", + "ufus", + "ufus-is", + "ufus-iw", + "ugacur", + "ugaden", + "ugadeɣ", + "ugafa", + "ugafa-agmuḍan", + "ugafa-utrim", + "ugalis", + "ugama", + "ugani", + "ugaraw", + "ugaren", + "ugbur", + "ugdal", + "ugdil", + "ugdud", + "ugeffur", + "ugeldun", + "ugellid", + "ugellus", + "ugelmim", + "ugemmay", + "ugemmaḍ", + "ugemmun", + "ugemmuḍ", + "ugensas", + "ugensu", + "ugerruj", + "ugezdu", + "uggaden", + "uggadeɣ", + "uggug", + "ugilal", + "ugin", + "ugiɣ", + "uglam", + "uglim", + "ugmuḍ", + "ugni", + "ugraw", + "ugris", + "ugrud", + "ugrudem", + "ugudu", + "ugujil", + "ugur", + "ugur-a", + "ugur-agi", + "uguren", + "ugzum", + "uheggi", + "uheyyi", + "uhidṛujin", + "uhu", + "ujbad", + "ujemmal", + "ujenwi", + "ujerred", + "ujerriḍ", + "ujeǧǧig", + "ujgu", + "ujmaɛ", + "ukabar", + "ukabar-a", + "ukala", + "ukamyun", + "ukan", + "ukaram", + "ukaram-agi", + "ukatar", + "ukayad", + "ukaɣeḍ", + "ukaṛbun", + "ukeffadu", + "ukellex", + "ukemmel", + "ukemmus", + "ukersi", + "ukessar", + "ukeččum", + "ukiɣ", + "ukkud", + "ukkuz", + "ukkuẓ", + "uklalen", + "ukman", + "ukman-a", + "ukraḍyur", + "uksawen", + "uksijin", + "uksum", + "ukud", + "ukufi", + "ukukru", + "ukumisar", + "ukuẓ", + "ul-ik", + "ul-is", + "ul-iw", + "ulabud", + "ulac", + "ulac-it", + "ulac-iten", + "ulac-itt", + "ulad", + "ulamek", + "ulamma", + "ulampiyen", + "ulawen", + "ulayɣer", + "ulday", + "ulemmas", + "uleqqem", + "uleqrar", + "uletma", + "uletma-s", + "ulin", + "ulmad", + "ulmud", + "ulzuz", + "ulɣu", + "umadal", + "umadaɣ", + "umagrad", + "umahil", + "umalas", + "umalu", + "umanar", + "umaray", + "umaru", + "umasal", + "umastan", + "umata", + "umatar", + "umatu", + "umawal", + "umaynut", + "umazan", + "umazellaw", + "umaziɣ", + "umazrar", + "umaɣnu", + "umaḍal", + "umaṭun", + "umaṭṭaf", + "umaẓrag", + "umbaɛd", + "umbeɛd", + "umcic", + "umdal", + "umdan", + "umecwar", + "umecwaṛ", + "umeddakel", + "umeddakel-is", + "umeddakel-iw", + "umeddakkel", + "umedya", + "umedyaz", + "umejjay", + "umeksa", + "umellal", + "umelyun", + "umenkad", + "umenkud", + "umennuɣ", + "umennuɣ-is", + "umenzu", + "umenɣi", + "umenẓaw", + "umeqqran", + "umeqran", + "umerreḥ", + "umerri", + "umerruk", + "umerḥum", + "umeskan", + "umeskar", + "umeslaw", + "umeslay", + "umesni", + "umesten", + "umezdaɣ", + "umezgun", + "umezruy", + "umezruy-is", + "umezwaru", + "umeɣbun", + "umeɣnas", + "umeɣrad", + "umeɣras", + "umeḥbus", + "umeṛṛuk", + "umeṭreḥ", + "umeẓlu", + "umeẓẓuɣ", + "umfezzu", + "umgarad", + "umgaru", + "umgired", + "umhaz", + "umi", + "umidya", + "umihi", + "umineɣ", + "umizzwer", + "umiḍan", + "umiḍan-agi", + "umiḍan-ik", + "umkan", + "umkan-is", + "ummesten", + "ummid", + "umnar", + "umnekcam", + "umnen", + "umneɣ", + "umnir", + "umrar", + "umraḥ", + "umsaltu", + "umsaɣ", + "umsefrak", + "umsenɣi", + "umtawa", + "umtawi", + "umtiweg", + "umuddir", + "umulli", + "umur", + "umusnaw", + "umussnaw", + "umussu", + "umuɣ", + "umuɣen", + "umuḍin", + "umwan", + "umyag", + "umyaraw", + "umyaru", + "umyurar", + "umyurar-a", + "umɣar", + "umḍal", + "umḍan", + "umḍin", + "umḍiq", + "umḍiq-is", + "umṣada", + "unabad", + "unabaḍ", + "unadi", + "unafag", + "unagen", + "unagraw", + "unamek", + "unamziɣ", + "unaray", + "unasiw", + "unazir", + "unazuṛ", + "unaẓur", + "unbir", + "unebdu", + "unect", + "unedbal", + "uneflay", + "uneggez", + "unegmu", + "unegzum", + "unehhar", + "unejmuɛ", + "unekcum", + "unelmad", + "unemhal", + "uneqqis", + "unermis", + "unerni", + "unezgum", + "unezri", + "unezwu", + "unezzarfu", + "uneɣlaf", + "uneɣmas", + "uneẓruf", + "unfafad", + "unfafad-a", + "unfufed", + "ungal", + "ungal-a", + "ungal-is", + "ungalen", + "ungar", + "ungif", + "unicode", + "unmalu", + "unnar", + "unnig", + "unnigen", + "unsib", + "unsiben", + "unti", + "unuɣ", + "unuḍaf", + "unyir", + "unz", + "unṣib", + "unṭaḍ", + "unẓul", + "unẓul-amalu", + "upitṛul", + "upyanu", + "upṛuksi", + "uqabel", + "uqacuc", + "uqader", + "uqasi", + "uqbayli", + "uqbel", + "uqbil", + "uqbu", + "uqcic", + "uqeddac", + "uqensul", + "uqenṣul", + "uqerru", + "uqerru-s", + "uqerruy", + "uqerruy-is", + "uqerruy-iw", + "uqeṛṛu", + "uqjun", + "uqrab", + "ur-d", + "ur-i", + "ur-k", + "ur-s", + "urameɣtu", + "uran-d", + "urar", + "urar-a", + "uraren", + "urarent", + "urareɣ", + "urasya", + "uraǧu", + "urdun", + "urekti", + "urezqi", + "ureɣ", + "urfan", + "urgaz", + "urgaz-is", + "urgaz-iw", + "urgaz-nni", + "urgaɣ", + "urigami", + "uriɣ", + "url", + "urmas", + "urmid", + "urmir", + "urmud", + "urrif", + "ursu", + "urt", + "urtan", + "urti", + "urtiyen", + "urugway", + "urumi", + "urunjas", + "urupa", + "uruppa", + "urured", + "urway", + "urǧin", + "urɛad", + "usafag", + "usafar", + "usagen", + "usakal", + "usaki", + "usalay", + "usali", + "usalun", + "usamar", + "usamer", + "usammar", + "usammer", + "usan-d", + "usarag", + "usaru", + "usaru-nni", + "usawal", + "usawen", + "usayes", + "usaḍuf", + "usbeddi", + "usdid", + "usebded", + "usebges", + "usebtar", + "usebter", + "usebter-is", + "usebɣes", + "useddu", + "usedwel", + "usefrak", + "usefrek", + "usefru", + "usefti", + "useggas", + "useggas-a", + "useggas-nni", + "useggem", + "useggwas", + "usegmi", + "usegnaf", + "usegwas", + "usegzel", + "usejji", + "usekcem", + "usekker", + "usekkil", + "usekkud", + "usekles", + "useklu", + "usekyed", + "uselkem", + "uselket", + "uselkim", + "uselkin", + "usellek", + "uselmad", + "uselmed", + "uselway", + "uselḥu", + "usemdu", + "usemmiḍ", + "usemmiṭ", + "usemres", + "usemɣer", + "usenduq", + "usenfar", + "usenfar-a", + "usenfaṛ", + "usenkar", + "usenker", + "usennan", + "usenqed", + "usenqes", + "usensu", + "usentel", + "usentel-a", + "usentem", + "usenɣes", + "useqdac", + "useqdec", + "useqqamu", + "userdas", + "userdun", + "userhu", + "userreḥ", + "userwes", + "usesmel", + "usesteb", + "usewwi", + "usexdem", + "useyyer", + "usečču", + "useɛlem", + "useɣti", + "useɣwen", + "useɣzef", + "useɣẓan", + "useḍru", + "useḥbes", + "useḥbiber", + "usfaylu", + "usfugel", + "usfuggel", + "usgunef", + "usgunfu", + "usideg", + "usider", + "usifeḍ", + "usiggez", + "usigna", + "usihel", + "usikel", + "usileɣ", + "usirem", + "usismel", + "usiti", + "usiwel", + "usiweḍ", + "usizdeg", + "usiɣ", + "usiɣ-d", + "usiɣzef", + "usiḍen", + "usiẓreg", + "uskan", + "uskar", + "uskasi", + "uslelli", + "usleɣmay", + "uslig", + "usligen", + "usmekti", + "usmel", + "usmel-agi", + "usmel-inek", + "usnan", + "usnefli", + "usneftaɣ", + "usnerni", + "usnifel", + "usnuffes", + "usnulfu", + "usqamu", + "usqerdec", + "usrag", + "usrid", + "ussan", + "ussan-a", + "ussan-agi", + "ussan-d", + "ussan-nni", + "usseggwas", + "usselmed", + "ussid", + "ussis", + "ussisen", + "ussnan", + "ussnanen", + "ussu", + "ustehzi", + "usteqsi", + "usteɛfu", + "ustralya", + "ustṛalya", + "usubbu", + "usud", + "usuddem", + "usuddes", + "usudu", + "usufeɣ", + "usuffeɣ", + "usugen", + "usuneɣ", + "usurdi", + "usurif", + "usuter", + "uswir", + "usɛeddi", + "usɣan", + "usɣar", + "usḥissef", + "usṭralya", + "utaram", + "utilifun", + "utrim", + "uttekki", + "uvidyu", + "uvirus", + "uvirus-agi", + "uwanak", + "uwanek", + "uwekked", + "uwelleh", + "uwennez", + "uwennit", + "uwexxer", + "uwgelhen", + "uwiǧit", + "uwren", + "uwtem", + "uxeddam", + "uxeddim", + "uxeddim-is", + "uxemmem", + "uxxam", + "uxxam-is", + "uxxam-iw", + "uxxam-nneɣ", + "uxxam-nni", + "uyalas", + "uyaziḍ", + "uyeffus", + "uyefki", + "uyeḥya", + "uzadur", + "uzaglu", + "uzagur", + "uzagur-is", + "uzal", + "uzamul", + "uzarug", + "uzaɣar", + "uzeggaɣ", + "uzegrir", + "uzegrir-agi", + "uzegzaw", + "uzekka", + "uzelmaḍ", + "uzemmur", + "uzemz", + "uzeḍḍa", + "uzeṭṭa", + "uzgen", + "uzger", + "uzilal", + "uziweɣ", + "uzlig", + "uzmul", + "uzmumeg", + "uzniq", + "uzrar", + "uzraɛ", + "uzref", + "uzrem", + "uzuzer", + "uzwel", + "uzwir", + "uzwiren", + "uzwu", + "uzzal", + "uzzayri", + "uzzig", + "uzzigen", + "uzzlen", + "uzzu", + "uzɣal", + "uzɣan", + "učči", + "uɛebbuḍ", + "uɛeddi", + "uɛeggal", + "uɛeggeḍ", + "uɛekkaz", + "uɛekki", + "uɛeqqa", + "uɛessas", + "uɛeyyer", + "uɛiwed", + "uɛiwen", + "uɛrur", + "uɛzal", + "uɛḍil", + "uɣa", + "uɣal", + "uɣal-d", + "uɣalen", + "uɣalen-d", + "uɣalent", + "uɣaleɣ", + "uɣaleɣ-d", + "uɣanib", + "uɣanim", + "uɣawas", + "uɣbalu", + "uɣbar", + "uɣbel", + "uɣbel-a", + "uɣdim", + "uɣebbar", + "uɣella", + "uɣelluy", + "uɣen", + "uɣen-d", + "uɣent", + "uɣerbaz", + "uɣerman", + "uɣerrabu", + "uɣersiw", + "uɣeɣ", + "uɣeɣ-d", + "uɣilas", + "uɣilif", + "uɣiwel", + "uɣiwen", + "uɣlad", + "uɣlif", + "uɣmis", + "uɣmis-a", + "uɣrab", + "uɣref", + "uɣris", + "uɣrum", + "uɣtas", + "uɣur", + "uɣyul", + "uḍad", + "uḍan", + "uḍar", + "uḍar-is", + "uḍaṛ", + "uḍebsi", + "uḍfar", + "uḍfas", + "uḍfir", + "uḍnen", + "uḍneɣ", + "uḍris", + "uḍɛif", + "uḍḍun", + "uḥader", + "uḥareb", + "uḥbas", + "uḥdiq", + "uḥebbus", + "uḥeddad", + "uḥewwes", + "uḥezzeb", + "uḥraz", + "uḥric", + "uḥric-a", + "uḥric-agi", + "uḥuddu", + "uḥulfu", + "uḥwaǧeɣ", + "uṛumi", + "uṭaksi", + "uṭṭun", + "uṭṭun-is", + "uṭṭunen", + "uẓar", + "uẓawan", + "uẓeffun", + "uẓekka", + "uẓeḍḍa", + "uẓeṭṭa", + "uẓru", + "vava", + "vi-", + "vii-", + "viii-", + "vlc", + "wabbu", + "waccaren", + "wacciwen", + "wacemma", + "wacu", + "wacḥal", + "wadad", + "wadda", + "waddad", + "waddaden", + "waddal", + "waddalen", + "waddar", + "waddud", + "wadduf", + "wadeg", + "wadig", + "wadur", + "wafriwen", + "wafud", + "wagar-asen", + "wagaz", + "wagazen", + "wagennun", + "waggagen", + "waggay", + "waggur", + "wagguren", + "wagi", + "wagim", + "wagimen", + "wagu", + "wagur", + "waguren", + "wahil", + "wahilen", + "wajjed", + "wakal", + "wakal-is", + "wakat", + "wakaten", + "wakk", + "wakk-n", + "wakka", + "waklan", + "wakli", + "wakraren", + "wakud", + "wakuden", + "wala", + "walan", + "walant", + "walaɣ", + "walaɣ-t", + "walbaɛḍ", + "walebɛaḍ", + "walid", + "walim", + "walin", + "walit", + "waliɣ", + "wallal", + "wallalen", + "wallaɣ", + "wallaɣ-is", + "wallaɣ-iw", + "wallaɣen", + "wallen", + "wallen-ik", + "wallen-is", + "wallen-iw", + "wallen-nsen", + "wallus", + "walluy", + "walu", + "waluḍ", + "wama", + "waman", + "waman-nni", + "wamber", + "wamek", + "wamma", + "wammag", + "wammas", + "wammasen", + "wammud", + "wamur", + "wanag", + "wanaw", + "wanect", + "wanect-a", + "wanecta", + "wanida", + "wannag", + "wannar", + "wannay", + "wannect", + "wannect-a", + "wannuz", + "wansayen", + "wansi", + "wanu", + "wanwa", + "wanzaren", + "wanẓul", + "waqil", + "waqila", + "wara", + "wargaz", + "warim", + "warrac", + "warraw", + "warraw-is", + "warraw-iw", + "warraw-nsen", + "warraz", + "warrazen", + "wartilan", + "warẓigen", + "wasif", + "wasmi", + "wass", + "wass-a", + "wass-agi", + "wass-is", + "wass-nni", + "wassa", + "wassaɣ", + "wassaɣen", + "wassen", + "wassif", + "wasun", + "watmaten", + "watmaten-is", + "wavu", + "wawal", + "wawal-a", + "wawal-agi", + "wawal-is", + "wawalen", + "wawras", + "wawway", + "wawwaḍ", + "way-a", + "way-agi", + "way-n", + "way-nni", + "waya", + "wayagi", + "wayed", + "wayen", + "wayen-nniḍen", + "wayenni", + "wayes", + "wayev", + "wayeḍ", + "wayi", + "wayla", + "wayra", + "wayyur", + "wayyur-a", + "wayyuren", + "wazal", + "wazal-is", + "wazalen", + "wazemz", + "wazzug", + "wazzun", + "waɛli", + "waɛraben", + "waɛrur", + "waɣir", + "waɣir-a", + "waɣiren", + "waɣzen", + "waḍu", + "waṭan", + "waṭas", + "waṭlas", + "waṭṭan", + "waṭṭan-a", + "waṭṭan-agi", + "waṭṭanen", + "waṭṭas", + "webrid", + "wedfel", + "wedlis", + "wedrar", + "wedrim", + "wedrum", + "wefrag", + "wefran", + "wegdil", + "wegdud", + "weglam", + "weglim", + "wegmuḍ", + "wegni", + "wegraw", + "wegris", + "wehmen", + "wehmeɣ", + "wehran", + "wehṛan", + "wejden", + "weksum", + "wellah", + "welleh", + "welmad", + "weltma", + "weltma-s", + "wember", + "wemcic", + "wemda", + "wemdan", + "wemgarad", + "wemgaru", + "wemkan", + "wemkan-is", + "wemtawa", + "wemyag", + "wemɣar", + "wemɣay", + "wemḍan", + "wemḍiq", + "wengar", + "wennar", + "wennez", + "wenṭaṭ", + "wenẓul", + "wenẓul-agmuḍan", + "wenẓul-utrim", + "weqbel", + "weqcic", + "weqjun", + "weqmaḍ", + "werdiya", + "wergaz", + "wergaz-is", + "werjin", + "weroin", + "werǧin", + "werɛad", + "weslelli", + "wesmil", + "wesnerni", + "wesnulfu", + "wesqamu", + "weswir", + "wesɣan", + "wesɣar", + "wesɣaṛ", + "wewras", + "wexxam", + "wexxam-is", + "wezgen", + "wezger", + "wezrem", + "wezwu", + "wezzil", + "wezzilen", + "wezzilet", + "wezzu", + "wezɣal", + "weɛli", + "weɣlis", + "weɣmis", + "weɣref", + "weɣrem", + "weɣrum", + "weɣyul", + "weḍris", + "weḥd", + "weḥd-i", + "weḥd-k", + "weḥd-m", + "weḥd-s", + "weḥdes", + "weḥdi", + "weḥraz", + "weḥric", + "weṭlas", + "weẓru", + "weẓɣal", + "white-space", + "wi-fi", + "wicqa", + "wid-ak", + "wid-nni", + "widak", + "widak-nni", + "wideg", + "wigi", + "wihin", + "wikipedia", + "wis-sin", + "wissen", + "wiyad", + "wiyav", + "wiyaḍ", + "wiyi", + "wiyiḍ", + "wiza", + "wizgan", + "wlad", + "wordpress", + "wten", + "wuccanen", + "wuccen", + "wudayen", + "wudem", + "wudem-is", + "wudi", + "wudlif", + "wudmawen", + "wudus", + "wufrinen", + "wugar", + "wuggug", + "wuglan", + "wugur", + "wugur-a", + "wuguren", + "wukud", + "wul", + "wul-ik", + "wul-im", + "wul-is", + "wul-iw", + "wulac", + "wulawen", + "wulawen-nneɣ", + "wulawen-nsen", + "wulli", + "wulzuz", + "wulɣu", + "wumi", + "wumuɣ", + "wumuɣen", + "wunbir", + "wungal", + "wungalen", + "wunuɣ", + "wunuɣen", + "wurar", + "wuraren", + "wureɣ", + "wurfan", + "wurigami", + "wurrif", + "wurtan", + "wurti", + "wussan", + "wussan-a", + "wussan-nni", + "wussis", + "wusu", + "wuzzal", + "wučči", + "wuɣur", + "wuḍan", + "wuṭṭu", + "wuṭṭun", + "wuṭṭunen", + "wwin", + "wwin-d", + "wwin-t", + "wwint", + "wwiɣ", + "wwiɣ-d", + "wwten", + "wwteɣ", + "wwḍen", + "wwḍen-d", + "wwḍent", + "wwḍeɣ", + "wḍen", + "xaled", + "xali", + "xalifa", + "xalifi", + "xalti", + "xaqeɣ", + "xas", + "xaṭer", + "xaṭi", + "xdem", + "xdimeɣ", + "xeddam", + "xeddmen", + "xeddment", + "xeddmeɣ", + "xedme", + "xedmen", + "xedment", + "xedmeɣ", + "xeldun", + "xellṣeɣ", + "xemmem", + "xemmemeɣ", + "xemmeɣ", + "xemsa", + "xemsin", + "xerraṭa", + "xersum", + "xerṣum", + "xesren", + "xettab", + "xeṛsum", + "xilla", + "xir", + "xlan", + "xlifa", + "xliff", + "xliǧa", + "xml", + "xussen", + "xuḍi", + "xuṣṣen", + "xwalti", + "yacine", + "yaf", + "yahia", + "yakk", + "yakkan", + "yakuc", + "yakw", + "yal", + "yalas", + "yalec", + "yales", + "yall", + "yamina", + "yanni", + "yara", + "yarna", + "yasen", + "yasin", + "yaweḍ", + "yawi", + "yawin", + "yawḍen", + "yazen", + "yazid", + "yazzel", + "yaɛnan", + "yaɣ", + "yaɣen", + "yaẓ", + "ye-", + "yeb", + "yebda", + "yebda-d", + "yebdan", + "yebded", + "yebdu", + "yebdun", + "yebna", + "yebnan", + "yebni", + "yebnu", + "yebra", + "yebrir", + "yebru", + "yebɛed", + "yebɛid", + "yebɣa", + "yebɣan", + "yebɣi", + "yebɣu", + "yebɣun", + "yebḍa", + "yebḍan", + "yebṭan", + "yecban", + "yecbeḥ", + "yecceḍ", + "yecfa", + "yecliɛ", + "yecmumeḥ", + "yecna", + "yecnu", + "yecqan", + "yecrek", + "yecɣel", + "yedda", + "yedda-d", + "yeddan", + "yeddem", + "yeddem-d", + "yedder", + "yeddi", + "yeddmen", + "yeddren", + "yeddu", + "yeddukel", + "yeddukklen", + "yedduklen", + "yeddun", + "yedles", + "yedlisen", + "yedrimen", + "yeffe", + "yeffer", + "yeffeɣ", + "yeffeɣ-d", + "yeffeɣ-it", + "yeffiɣ", + "yeffren", + "yeffus", + "yeffɣen", + "yefhem", + "yefhim", + "yefk", + "yefka", + "yefka-as", + "yefka-d", + "yefka-yas", + "yefka-yi-d", + "yefkan", + "yefken", + "yeflalen", + "yefqeɛ", + "yefra", + "yefrax", + "yefren", + "yefreq", + "yefreḥ", + "yefri", + "yefru", + "yefsi", + "yefus", + "yefɣen", + "yefṛeḥ", + "yeg", + "yegber", + "yegda", + "yegdan", + "yegdel", + "yegduden", + "yeggan", + "yeggar", + "yeggra-d", + "yeggran", + "yeggten", + "yeggul", + "yegguma", + "yeggumma", + "yegguni", + "yeggunin", + "yegla", + "yegla-d", + "yeglan", + "yegled", + "yeglu", + "yeglun", + "yegmamen", + "yegmen", + "yegnen", + "yegra-d", + "yegran", + "yegren", + "yegza", + "yegzem", + "yegzi", + "yegzu", + "yehder", + "yehwa", + "yehwan", + "yejbed", + "yejjan", + "yejmeɛ", + "yejreḥ", + "yekcem", + "yekcem-d", + "yekfa", + "yekfan", + "yekfi", + "yekfu", + "yekk", + "yekka", + "yekka-d", + "yekkan", + "yekkat", + "yekkaten", + "yekkaw", + "yekker", + "yekker-d", + "yekkes", + "yekkes-as", + "yekkes-d", + "yekki", + "yekkin", + "yekkren", + "yekksen", + "yekmen", + "yekna", + "yekreh", + "yekres", + "yekseb", + "yekṛeh", + "yel-", + "yeldi", + "yeldi-d", + "yeldin", + "yelha", + "yelha-d", + "yelhan", + "yelhi", + "yelhu", + "yella", + "yella-d", + "yellan", + "yelli", + "yelli-s", + "yellilten", + "yellin", + "yellis", + "yellu", + "yelluẓ", + "yelmed", + "yelmeẓyen", + "yelsa", + "yelɣuɣen", + "yelḥa", + "yelḥan", + "yelḥeq", + "yelḥu", + "yem", + "yemcac", + "yemdanen", + "yemdel", + "yemdukal", + "yemdukal-is", + "yemgarad", + "yemgaraden", + "yemgarden", + "yemgerraden", + "yemlal", + "yemlal-d", + "yemlil", + "yemma", + "yemma-k", + "yemma-m", + "yemma-s", + "yemma-tsen", + "yemmag", + "yemmager", + "yemmal", + "yemmal-d", + "yemmalen", + "yemmas", + "yemmden", + "yemmed", + "yemmekta-d", + "yemmel", + "yemmeslay", + "yemmeslay-d", + "yemmeslayen", + "yemmesten", + "yemmet", + "yemmeɣ", + "yemmug", + "yemmugen", + "yemmuger", + "yemmuqel", + "yemmut", + "yemmuten", + "yemnayen", + "yemneɛ", + "yemrigen", + "yemut", + "yemxalaf", + "yemxalafen", + "yemxallaf", + "yemxallafen", + "yemyuraren", + "yemɣan", + "yemɣaren", + "yemɣi", + "yemḍebbren", + "yemḍebren", + "yemḍel", + "yenbeḍ", + "yendeh", + "yendem", + "yenfufed", + "yenger", + "yenna", + "yenna-", + "yenna-as", + "yenna-as-d", + "yenna-asen", + "yenna-aɣ-d", + "yenna-d", + "yenna-iyi-d", + "yenna-k", + "yenna-yas", + "yenna-yasen", + "yenna-yi-d", + "yennan", + "yennayer", + "yennaɣ", + "yennecraḥ", + "yennerna", + "yennerni", + "yenni", + "yennulfa-d", + "yennum", + "yennumen", + "yennuɣ", + "yennuɣen", + "yenqes", + "yensa", + "yensan", + "yenwa", + "yenwan", + "yenza", + "yenzan", + "yenɣa", + "yenɣa-t", + "yenɣan", + "yenḥafen", + "yenṭeq", + "yenṭerren", + "yenṭeḍ", + "yeqbayliyen", + "yeqbel", + "yeqbil", + "yeqdec", + "yeqjan", + "yeqleɛ", + "yeqnen", + "yeqqar", + "yeqqar-as", + "yeqqar-d", + "yeqqaren", + "yeqqaṛ", + "yeqqel", + "yeqqen", + "yeqqim", + "yeqqim-d", + "yeqqimen", + "yeqqin", + "yeqqlen", + "yeqqnen", + "yeqqur", + "yeqquren", + "yeqreb", + "yeqreb-it", + "yeqwa", + "yeqwan", + "yerbeḥ", + "yerfa", + "yerfed", + "yergazen", + "yergel", + "yerkeb", + "yermed", + "yerna", + "yerna-d", + "yernan", + "yernu", + "yerr", + "yerra", + "yerra-as", + "yerra-as-d", + "yerra-d", + "yerra-t", + "yerra-tt", + "yerran", + "yerren", + "yerreẓ", + "yerri", + "yers", + "yers-d", + "yersen", + "yerwa", + "yerwan", + "yerwel", + "yerwi", + "yerza", + "yerza-d", + "yerzan", + "yerzu", + "yerɣan", + "yerḥem", + "yerẓa", + "yerẓan", + "yes-", + "yes-s", + "yes-sen", + "yes-wen", + "yesbedd", + "yesbedden", + "yesdukkel", + "yesfeḍ", + "yesgunfu", + "yeshel", + "yeshetrif", + "yeshil", + "yeskaddeb", + "yeskelfen", + "yesken", + "yesker", + "yeskeṛ", + "yesla", + "yeslan", + "yesli", + "yesmar-d", + "yesmekta-d", + "yesnen", + "yesnerni", + "yesnulfa-d", + "yesnulfu", + "yesnuzun", + "yesra", + "yesres", + "yess", + "yessan", + "yessaram", + "yessaramen", + "yessarem", + "yessawal", + "yessawalen", + "yessawaḍ", + "yessawel", + "yessawel-d", + "yessaweḍ", + "yessawlen", + "yessawḍen", + "yessaɣ", + "yessebded", + "yessefhem", + "yessefk", + "yessefken", + "yessefra", + "yessefrak", + "yessefray", + "yessefraḥen", + "yessegza-d", + "yessekcem", + "yessekles", + "yesselmad", + "yesselmed", + "yessemres", + "yessen", + "yesseqdac", + "yesseqdacen", + "yesseqdec", + "yesser", + "yessers", + "yessetma", + "yessetmas", + "yessewham", + "yessewhamen", + "yessewhem", + "yessexdam", + "yessexdamen", + "yessexdem", + "yesseɣli", + "yessi", + "yessi-s", + "yessin", + "yessired", + "yessis", + "yessiwel", + "yessiweḍ", + "yessiwḍen", + "yesskanay-d", + "yesskanayen", + "yessnen", + "yessuddes", + "yessufeɣ", + "yessufeɣ-d", + "yessuffeɣ", + "yessuffeɣ-d", + "yessufuɣen", + "yessuli", + "yessulin", + "yessumer-d", + "yessuref", + "yessusem", + "yessuter", + "yessuter-as", + "yessuter-iyi-d", + "yessutren", + "yessutur", + "yessuturen", + "yesteqsa", + "yesteqsa-t", + "yesteqsa-tt", + "yesteqsi", + "yesteɛref", + "yeswa", + "yeswehmen", + "yeswi", + "yesɛa", + "yesɛan", + "yesɛedda", + "yesɛedday", + "yesɛeddi", + "yesɛi", + "yesɛu", + "yesɛun", + "yesḥassef", + "yetqelleq", + "yetran", + "yetri", + "yettabaɛen", + "yettaf", + "yettagad", + "yettaggad", + "yettak", + "yettak-d", + "yettaken", + "yettakken", + "yettali", + "yettalin", + "yettamen", + "yettamnen", + "yettara", + "yettargu", + "yettarra", + "yettarra-d", + "yettarran", + "yettaru", + "yettarun", + "yettas-d", + "yettasen", + "yettawaṭ", + "yettaweḍ", + "yettawi", + "yettawi-d", + "yettawin", + "yettazen", + "yettazzal", + "yettazzalen", + "yettaǧǧa", + "yettaǧǧan", + "yettaɣ", + "yettaɣen", + "yettaḍsa", + "yettaṭṭaf", + "yettaṭṭafen", + "yettaẓ", + "yettban", + "yettban-d", + "yettban-iyi-d", + "yettbanen", + "yettbeddil", + "yettbeddilen", + "yettbin", + "yettbin-d", + "yetteddu", + "yetteddun", + "yetteg", + "yettekka", + "yettekkan", + "yettekki", + "yettekkin", + "yettemcabi", + "yettemcabin", + "yettemɣayen", + "yettenfufud", + "yettergigi", + "yettheggi", + "yettidir", + "yettidiren", + "yettifliwen", + "yettili", + "yettili-d", + "yettilin", + "yettimɣur", + "yettkel", + "yettkelfen", + "yettkemmil", + "yettkemmilen", + "yettmeslay", + "yettmeslayen", + "yettmettat", + "yettmettaten", + "yettmuqul", + "yettnadi", + "yettnadin", + "yettnaɣ", + "yettnaɣen", + "yettnerni", + "yettnernin", + "yettqabalen", + "yettqellib", + "yettraju", + "yettrajun", + "yettraǧu", + "yettraǧun", + "yettrebbin", + "yettru", + "yettruḥu", + "yettruḥun", + "yettsuɣu", + "yettu", + "yettumeggez", + "yettun", + "yettunefk", + "yettunefken", + "yettuneḥsab", + "yetturar", + "yetturaren", + "yetturaǧu", + "yettusbadu", + "yettusbadun", + "yettusemma", + "yettusemman", + "yettuseqdac", + "yettusexdem", + "yettusqedcen", + "yettusxedmen", + "yettuwexren", + "yettuɣal", + "yettuɣalen", + "yettuḥettem", + "yettwabeddel", + "yettwabeqqeḍen", + "yettwabna", + "yettwabnan", + "yettwabḍan", + "yettwaddmen", + "yettwaf", + "yettwafen", + "yettwafernen", + "yettwafren", + "yettwagdel", + "yettwaggzen", + "yettwakelsen", + "yettwakkes", + "yettwakksen", + "yettwakren", + "yettwaleqqem", + "yettwali", + "yettwalin", + "yettwalqem", + "yettwamḍel", + "yettwanɣa", + "yettwanɣan", + "yettwaqbel", + "yettwarna", + "yettwarnan", + "yettwarnu", + "yettwaru", + "yettwarun", + "yettwasbedd", + "yettwasbedden", + "yettwasefrak", + "yettwasekles", + "yettwasemman", + "yettwasen", + "yettwaseqdac", + "yettwaseqdec", + "yettwaskelsen", + "yettwasnen", + "yettwasqedcen", + "yettwasra", + "yettwasran", + "yettwassen", + "yettwassnen", + "yettwasxedmen", + "yettwattun", + "yettwaxdem", + "yettwaxedmen", + "yettwazen", + "yettwaznen", + "yettwaḥbes", + "yettwaḥebsen", + "yettwaḥkem", + "yettwaḥsab", + "yettwaḥseb", + "yettwaṭṭef", + "yettwaṭṭfen", + "yettxemmim", + "yettzid", + "yettɛassa", + "yettɛassan", + "yettɛawad", + "yettɛawan", + "yettɛeddi", + "yettɛeṭṭil", + "yettɣimi", + "yettḥaraben", + "yettḥaz", + "yettḥulfu", + "yevran", + "yewhem", + "yewjed", + "yewjid", + "yewten", + "yeww", + "yewwa", + "yewwas", + "yewwet", + "yewwet-d", + "yewwev", + "yewweḍ", + "yewweḍ-d", + "yewwi", + "yewwi-d", + "yewwi-t", + "yewwi-tt", + "yewwin", + "yewwiḍ", + "yewwten", + "yewwḍen", + "yewɛer", + "yewɛeṛ", + "yewḍen", + "yewḥel", + "yexdem", + "yexdim", + "yexlef", + "yexser", + "yexsi", + "yextar", + "yexxamen", + "yexxamen-nsen", + "yexḍan", + "yexṣer", + "yezdeɣ", + "yezdin", + "yezemren", + "yezga", + "yezga-d", + "yezgan", + "yezgaren", + "yezgel", + "yezger", + "yezha", + "yezmer", + "yezmir", + "yeznan", + "yeznuzu", + "yeznuzun", + "yezra", + "yezreɛ", + "yezri", + "yezrin", + "yezwar", + "yezwaren", + "yezweǧ", + "yezwir", + "yezzenz", + "yezzi", + "yezzi-d", + "yezzin", + "yezɛef", + "yečč", + "yečča", + "yeččan", + "yeččur", + "yeččuren", + "yeččuṛ", + "yeččuṛen", + "yeǧhed", + "yeǧǧ", + "yeǧǧa", + "yeǧǧa-d", + "yeǧǧa-t", + "yeǧǧa-tt", + "yeǧǧan", + "yeǧǧen", + "yeǧǧi", + "yeɛfu", + "yeɛna", + "yeɛnan", + "yeɛni", + "yeɛqel", + "yeɛreq", + "yeɛreḍ", + "yeɛya", + "yeɛyan", + "yeɣlanen", + "yeɣleb", + "yeɣleq", + "yeɣli", + "yeɣli-d", + "yeɣlin", + "yeɣmisen", + "yeɣra", + "yeɣran", + "yeɣri", + "yeɣtes", + "yeɣṛa", + "yeḍfer", + "yeḍmen", + "yeḍra", + "yeḍra-d", + "yeḍran", + "yeḍri", + "yeḍrisen", + "yeḍru", + "yeḍrun", + "yeḍḥa-d", + "yeḍṛan", + "yeḥbes", + "yeḥbis", + "yeḥkem", + "yeḥla", + "yeḥlan", + "yeḥma", + "yeḥman", + "yeḥrec", + "yeḥrez", + "yeḥricen", + "yeḥseb", + "yeḥwaj", + "yeḥwaǧ", + "yeḥwaǧen", + "yeḥya", + "yeḥzen", + "yeḥḍer", + "yeḥṣa", + "yeṣfan", + "yeṭṭafar", + "yeṭṭafaren", + "yeṭṭef", + "yeṭṭef-d", + "yeṭṭef-it", + "yeṭṭef-itt", + "yeṭṭerḍeq", + "yeṭṭes", + "yeṭṭfen", + "yeṭṭsen", + "yeẓdan", + "yeẓra", + "yeẓran", + "yeẓri", + "yeẓwer", + "yeẓṛa", + "yeẓṛan", + "yeẓẓa", + "yeẓẓan", + "yeẓẓel", + "yi-", + "yi-d", + "yi-d-", + "yi-d-yenna", + "yi-iɛawnen", + "yibabaten", + "yibaskiyen", + "yibbwas", + "yibeddi", + "yibenk", + "yibenkan", + "yiberdan", + "yiberraniyen", + "yibiten", + "yibrir", + "yibuda", + "yibulisen", + "yiccer", + "yicenga", + "yicennayen", + "yiceṭṭiḍen", + "yid-", + "yid-es", + "yid-i", + "yid-k", + "yid-kent", + "yid-m", + "yid-neɣ", + "yid-nneɣ", + "yid-nteɣ", + "yid-s", + "yid-sen", + "yid-sent", + "yid-wen", + "yidammen", + "yideg", + "yideggan", + "yidelsan", + "yiderman", + "yides", + "yidgan", + "yidi", + "yidinaren", + "yidinaṛen", + "yidir", + "yidis", + "yidis-is", + "yidisan", + "yidles", + "yidles-nneɣ", + "yidlisen", + "yidmaren", + "yidrimen", + "yidsen", + "yiduba", + "yidularen", + "yidulaṛen", + "yidurar", + "yif", + "yif-it", + "yifarisen", + "yifassen", + "yifassen-is", + "yifassen-iw", + "yifassen-nsen", + "yifecka", + "yifelfel", + "yifellaḥen", + "yifen", + "yifer", + "yiferdisen", + "yifrax", + "yifremliyen", + "yifri", + "yifuyla", + "yifyar", + "yigad", + "yigaliyen", + "yigduden", + "yigelliden", + "yigelmimen", + "yigemmaḍ", + "yigen", + "yigen-ines", + "yigenni", + "yigensasen", + "yigenwan", + "yiger", + "yigerdan", + "yigiman", + "yigli", + "yigmamen", + "yigmaḍ", + "yigran", + "yigrawen", + "yigrawliwen", + "yigumma", + "yigḍaḍ", + "yigṭaṭ", + "yiheggaṛen", + "yijdi", + "yijeǧǧigen", + "yikabaren", + "yikaramen", + "yikayaden", + "yikemmusen", + "yikilumitren", + "yikurdiyen", + "yilef", + "yilel", + "yilem", + "yilemẓi", + "yilemẓiyen", + "yileqman", + "yiles", + "yiles-is", + "yili", + "yilin", + "yilindi", + "yillel", + "yilli", + "yillu", + "yilmeẓyen", + "yilsawen", + "yilugan", + "yimagraden", + "yimakaren", + "yimal", + "yimalas", + "yimalasen", + "yiman", + "yiman-", + "yiman-ik", + "yiman-im", + "yiman-is", + "yiman-iw", + "yiman-nnes", + "yiman-nneɣ", + "yiman-nsen", + "yimasayen", + "yimassanen", + "yimastanen", + "yimawlan", + "yimawlan-is", + "yimawlan-iw", + "yimawlan-nsen", + "yimayl", + "yimaylen", + "yimazanen", + "yimaziɣen", + "yimazzanen", + "yimcac", + "yimdanen", + "yimdukal-is", + "yimdukkal", + "yimeddaḥen", + "yimeddukal", + "yimeddukal-is", + "yimeddukal-iw", + "yimeddukkal", + "yimedyazen", + "yimejjayen", + "yimekli", + "yimelyan", + "yimelyaren", + "yimelyaṛen", + "yimelyunen", + "yimensi", + "yimenzayen", + "yimenɣi", + "yimenɣiyen", + "yimeqqranen", + "yimeslayen", + "yimesli", + "yimezdaɣ", + "yimezdaɣ-is", + "yimezdaɣen", + "yimezwura", + "yimeɛḍar", + "yimeɣban", + "yimeɣnasen", + "yimeɣrasen", + "yimeɣri", + "yimeɣriyen", + "yimeḍqan", + "yimeḥbas", + "yimeṭṭawen", + "yimeṭṭi", + "yimeẓla", + "yimi", + "yimi-s", + "yimidyaten", + "yiminig", + "yiminigen", + "yimir", + "yimir-n", + "yimir-nni", + "yimiren", + "yimjuhad", + "yimnadiyen", + "yimru", + "yimsaɣen", + "yimsenza", + "yimsiklen", + "yimsulta", + "yimtiwgen", + "yimuddiren", + "yimukan", + "yimura", + "yimuras", + "yimuren", + "yimusnawen", + "yimussnawen", + "yimuzzag", + "yimuḍan", + "yimuḍinen", + "yimxalafen", + "yimyura", + "yimyuraren", + "yimzadaɣen", + "yimɣan", + "yimɣaren", + "yimɣi", + "yimɣur", + "yimḍanen", + "yimḍebber", + "yimḍebbren", + "yimḍebren", + "yinaddalen", + "yinagrawen", + "yinaw", + "yinaẓuren", + "yinebgawen", + "yinejmuɛen", + "yinek", + "yinelmaden", + "yinermisen", + "yineɣlafen", + "yineɣmasen", + "yineḥbas", + "yinfafaden", + "yini", + "yinig", + "yinin", + "yinisi", + "yiniten", + "yinselmen", + "yinumak", + "yinumidiyen", + "yinurar", + "yinzan", + "yinzi", + "yiqbayliyen", + "yiqeddacen", + "yiqerra", + "yiqjan", + "yir", + "yiran", + "yiraten", + "yirden", + "yirebbi", + "yirebraben", + "yirem", + "yirgazen", + "yiri", + "yirmad", + "yirmuden", + "yirumaniyen", + "yirumyen", + "yirusiyen", + "yis-s", + "yis-sen", + "yis-wen", + "yisafagen", + "yisafaren", + "yisalan", + "yisalen", + "yisali", + "yisallen", + "yisalli", + "yisaragen", + "yisdawanen", + "yisebtar", + "yisefka", + "yisefra", + "yiseggasen", + "yiseggasen-a", + "yiseggasen-nni", + "yisekkilen", + "yisekla", + "yiselmaden", + "yiselman", + "yiselsa", + "yiselwayen", + "yisem", + "yisem-agi", + "yisem-is", + "yisem-iw", + "yisemlen", + "yisemli", + "yisenfaren", + "yisental", + "yiseqdacen", + "yiseqsiyen", + "yiserdasen", + "yiserdasen-is", + "yiseɣ", + "yiseɣẓanen", + "yisfuyla", + "yislan", + "yisleɣmayen", + "yismal", + "yismawen", + "yisnasen", + "yisragen", + "yissin", + "yisteqsiyen", + "yisufar", + "yisumar", + "yisura", + "yisuḍaf", + "yiswi", + "yiswiren", + "yiswiyen", + "yisɣaren", + "yisɣunen", + "yisṭuniyen", + "yitran", + "yitri", + "yiv", + "yiwaziwen", + "yiwaḍiyen", + "yiwellihen", + "yiwen", + "yiwenniten", + "yiwet", + "yiweẓla", + "yiwudam", + "yiwunak", + "yiwwas", + "yiwwet", + "yixeddamen", + "yixef", + "yixef-is", + "yixfawen", + "yixxamen", + "yixxamen-nsen", + "yizan", + "yizegrar", + "yizegza", + "yizem", + "yizen", + "yizenqan", + "yizerfan", + "yizerman", + "yizirig", + "yizirigen", + "yizli", + "yizmawen", + "yizmir", + "yiznan", + "yizri", + "yizzayriyen", + "yiǧadarmiyen", + "yiɛeggalen", + "yiɛeqqayen", + "yiɛeẓẓugen", + "yiɣallen", + "yiɣbula", + "yiɣeblan", + "yiɣerbazen", + "yiɣerfan", + "yiɣermanen", + "yiɣersiwen", + "yiɣes", + "yiɣewwaren", + "yiɣi", + "yiɣil", + "yiɣlanen", + "yiɣmisen", + "yiɣrem", + "yiɣsan", + "yiɣtasen", + "yiḍ", + "yiḍ-a", + "yiḍ-nni", + "yiḍan", + "yiḍarren", + "yiḍebsiyen", + "yiḍelli", + "yiḍes", + "yiḍrisen", + "yiḍudan", + "yiḍumman", + "yiḥder", + "yiḥedran", + "yiḥricen", + "yiḥulfan", + "yiṭ", + "yiṭes", + "yiṭij", + "yiẓra", + "yiẓuran", + "yuba", + "yudas", + "yuddsen", + "yuder", + "yudnen", + "yudsen", + "yufa", + "yufa-d", + "yufan", + "yufeg", + "yufi", + "yufrar", + "yufrar-d", + "yufraren", + "yugad", + "yugaden", + "yugar", + "yugar-iten", + "yugaren", + "yugerten", + "yuggad", + "yugi", + "yugin", + "yugnen", + "yugurten", + "yuker", + "yuki-d", + "yuklal", + "yuklalen", + "yukren", + "yuli", + "yuli-d", + "yulin", + "yulyu", + "yumen", + "yumes", + "yumin", + "yumnen", + "yumsen", + "yunag", + "yunez", + "yunyu", + "yura", + "yura-d", + "yura-t", + "yuran", + "yurar", + "yuraren", + "yurzen", + "yusa", + "yusa-d", + "yusan", + "yusef", + "yussan", + "yusu-d", + "yuweḍ", + "yuwi-d", + "yuyes", + "yuzen", + "yuzzel", + "yuɛer", + "yuɛren", + "yuɣ", + "yuɣ-d", + "yuɣal", + "yuɣal-d", + "yuɣalen", + "yuɣen", + "yuḍen", + "yuḍnen", + "yuḥwaǧ", + "yuḥwaǧen", + "yuẓa", + "yya", + "yyaw", + "yzemren", + "zaɛma", + "zdat", + "zdat-s", + "zdaxel", + "zdin", + "zeddi", + "zeddig", + "zeddigen", + "zeddiɣ", + "zedek", + "zedɣen", + "zedɣen-t", + "zedɣen-tt", + "zedɣent", + "zedɣeɣ", + "zeghmati", + "zegren", + "zekri", + "zelmaḍ", + "zelmeḍ", + "zemre", + "zemren", + "zemrent", + "zemreɣ", + "zewǧen", + "zeɛma", + "zgan", + "zgan-d", + "zgant", + "zgel", + "zgiɣ", + "zheṛ", + "zidan", + "zidane", + "zidat", + "zik", + "zik-nni", + "zikenni", + "ziland", + "zimu", + "zin", + "ziri", + "ziɣ", + "ziɣen", + "zman", + "zmiren", + "zmirent", + "zmireɣ", + "zrin", + "zriɣ", + "zun", + "zur", + "zuɣer", + "zwaren", + "zwaǧ", + "zyada", + "zzat", + "zzayer", + "zzeg", + "zzeg-s", + "zzerb", + "zzher", + "zzheṛ", + "zzhir", + "zzhu", + "zzi", + "zzin", + "zzin-d", + "zzit", + "zziɣ", + "zzman", + "zzux", + "zzwaǧ", + "zzyada", + "zzɛaf", + "zṛen", + "zṛiɣ", + "ččad", + "ččan", + "ččen", + "ččeɣ", + "ččina", + "ččiɣ", + "ččuren", + "ččurent", + "ǧamal", + "ǧamila", + "ǧaɛfer", + "ǧaɛut", + "ǧerba", + "ǧerǧer", + "ǧiǧel", + "ǧiǧǧi", + "ǧǧan", + "ǧǧemt-iyi", + "ǧǧen", + "ǧǧet-iyi", + "ǧǧeɣ", + "ǧǧin", + "ǧǧiɣ", + "ɛacen", + "ɛacur", + "ɛad", + "ɛalǧiya", + "ɛawden", + "ɛawdeɣ", + "ɛawnen", + "ɛayn", + "ɛazem", + "ɛaziz", + "ɛebban", + "ɛebbas", + "ɛebd", + "ɛebdelbaqi", + "ɛebdelkrim", + "ɛebdellah", + "ɛebdelqader", + "ɛebdelwaḥed", + "ɛebdelǧabar", + "ɛebdelɛaziz", + "ɛebdelḥamid", + "ɛebderreḥman", + "ɛecra", + "ɛecrin", + "ɛecwi", + "ɛecṛa", + "ɛeddan", + "ɛeddant", + "ɛeddaɣ", + "ɛeddi", + "ɛeddin", + "ɛeddiɣ", + "ɛeggu", + "ɛeknun", + "ɛellam", + "ɛellawa", + "ɛelmeɣ", + "ɛelǧiya", + "ɛemmar", + "ɛemmi", + "ɛemmi-s", + "ɛemran", + "ɛemruc", + "ɛennaba", + "ɛeqleɣ", + "ɛeryan", + "ɛerḍen", + "ɛerḍeɣ", + "ɛetman", + "ɛeyyaci", + "ɛeyyu", + "ɛezzuz", + "ɛezṛabeɛl", + "ɛeṭṭleɣ", + "ɛic", + "ɛica", + "ɛin", + "ɛinani", + "ɛiraq", + "ɛisa", + "ɛisi", + "ɛiwnen", + "ɛla", + "ɛlayen", + "ɛlaḥsab", + "ɛli", + "ɛmar", + "ɛmara", + "ɛmer", + "ɛni", + "ɛreḍ", + "ɛririǧ", + "ɛumar", + "ɛummeɣ", + "ɛuqba", + "ɛyan", + "ɛyiɣ", + "ɛziz", + "ɛzizen", + "ɛzuzu", + "ɣaf", + "ɣar", + "ɣas", + "ɣef", + "ɣellin", + "ɣelqen", + "ɣer", + "ɣer-i", + "ɣer-neɣ", + "ɣer-s", + "ɣer-sen", + "ɣetsen", + "ɣezzif", + "ɣezzifen", + "ɣezzifet", + "ɣezzifit", + "ɣeṛ", + "ɣilen", + "ɣileɣ", + "ɣillen", + "ɣiwel", + "ɣlay", + "ɣlayen", + "ɣlayet", + "ɣlin", + "ɣlint", + "ɣliɣ", + "ɣran", + "ɣren", + "ɣreɣ", + "ɣriɣ", + "ɣuct", + "ɣur", + "ɣur-", + "ɣur-es", + "ɣur-i", + "ɣur-k", + "ɣur-kent", + "ɣur-m", + "ɣur-neɣ", + "ɣur-nneɣ", + "ɣur-s", + "ɣur-sen", + "ɣur-sent", + "ɣur-wen", + "ɣures", + "ɣuri", + "ɣurwat", + "ɣuṛ-s", + "ɣɣaren", + "ɣɣaren-as", + "ḍefren", + "ḍefreɣ", + "ḍeggreɣ", + "ḍfer", + "ḍrant", + "ḥabib", + "ḥaca", + "ḥader", + "ḥadren", + "ḥafi", + "ḥala", + "ḥamid", + "ḥannibaɛl", + "ḥarben", + "ḥareɣ", + "ḥasan", + "ḥasi", + "ḥaǧ", + "ḥbes", + "ḥdac", + "ḥebsen", + "ḥebsent", + "ḥebseɣ", + "ḥed", + "ḥedd", + "ḥekkmen", + "ḥekkun-d", + "ḥekmen", + "ḥellu", + "ḥemlen", + "ḥemleɣ", + "ḥemmad", + "ḥemmam", + "ḥemmel", + "ḥemmlen", + "ḥemmlent", + "ḥemmleɣ", + "ḥemmleɣ-kem", + "ḥemmleɣ-tt", + "ḥemmu", + "ḥemmuda", + "ḥemza", + "ḥerzen", + "ḥesben", + "ḥettmen", + "ḥezneɣ", + "ḥeḍren", + "ḥilmi", + "ḥku", + "ḥkuɣ", + "ḥlan", + "ḥlawen", + "ḥmed", + "ḥmimi", + "ḥnifa", + "ḥninen", + "ḥrez", + "ḥsab", + "ḥsan", + "ḥsiɣ", + "ḥulfan", + "ḥulfaɣ", + "ḥusin", + "ḥusseɣ", + "ḥwaǧen", + "ḥwaǧeɣ", + "ḥṣiɣ", + "ṛebbi", + "ṛebɛa", + "ṛemḍan", + "ṛuma", + "ṛuḥ", + "ṛuḥen", + "ṛuḥeɣ", + "ṛṛadyu", + "ṛṛay", + "ṛṛay-is", + "ṛṛay-iw", + "ṛṛum", + "ṛṛuman", + "ṛṛuḥ", + "ṣaleḥ", + "ṣaḥariǧ", + "ṣbaḥ", + "ṣbeḥ", + "ṣebreɣ", + "ṣṣa", + "ṣṣber", + "ṣṣbeḥ", + "ṣṣenf", + "ṣṣeḥ", + "ṣṣfa", + "ṣṣifa", + "ṣṣura", + "ṣṣut", + "ṣṣut-is", + "ṣṣwab", + "ṣṣyada", + "ṭaher", + "ṭaleb", + "ṭam", + "ṭaqa", + "ṭariqa", + "ṭawes", + "ṭbel", + "ṭbib", + "ṭebbat", + "ṭelyan", + "ṭerf", + "ṭfen", + "ṭlam", + "ṭmana", + "ṭrables", + "ṭrad", + "ṭul", + "ṭumaṭic", + "ṭumubil", + "ṭumubilat", + "ṭṭabla", + "ṭṭafaren", + "ṭṭalyan", + "ṭṭaq", + "ṭṭaqa", + "ṭṭaqqa", + "ṭṭaref", + "ṭṭbel", + "ṭṭbib", + "ṭṭbiɛa", + "ṭṭef", + "ṭṭelyan", + "ṭṭerf", + "ṭṭerk", + "ṭṭfen", + "ṭṭfen-t", + "ṭṭfent", + "ṭṭfeɣ", + "ṭṭfeɣ-d", + "ṭṭiq", + "ṭṭlam", + "ṭṭmeɛ", + "ṭṭrad", + "ṭṭraḍ", + "ṭṭsen", + "ṭṭseɣ", + "ṭṭuqten", + "ṭṭṣeɣ", + "ẓedmen", + "ẓer", + "ẓeṛ", + "ẓiden", + "ẓran", + "ẓreg", + "ẓren", + "ẓreɣ", + "ẓrin", + "ẓriɣ", + "ẓṛeɣ", + "ẓṛiɣ", + "ẓẓay", + "ẓẓayen", + "ẓẓayet", + "ẓẓerb", + "ẓẓher" + ] +} diff --git a/frontend/static/languages/kabyle_1k.json b/frontend/static/languages/kabyle_1k.json new file mode 100644 index 000000000000..0812371dbc5a --- /dev/null +++ b/frontend/static/languages/kabyle_1k.json @@ -0,0 +1,1007 @@ +{ + "name": "kabyle_1k", + "bcp47": "kab", + "orderedByFrequency": false, + "words": [ + "-as", + "-paris", + "a-t", + "abeddel", + "abǧawi", + "acciwen", + "acebbub-is", + "acku", + "addad", + "addayen", + "adekkar", + "aderwic", + "adig", + "adlis", + "adlis-a", + "adlis-is", + "adrum", + "adɣar", + "afrensis", + "afus-iw", + "agafa", + "agaman", + "agatu", + "agdal", + "agdud", + "agerruj", + "agezdu", + "agmam", + "agrawliw", + "agreɣlan", + "agrigi", + "ahad", + "ahilen", + "ahmed-nacer", + "akk-d", + "aklan", + "aktum", + "alarmi", + "allen-iw", + "amagnu", + "amalal", + "amalu", + "aman-nni", + "amaruz", + "amastan", + "amaswaḍ", + "amazellaw", + "amaziɣ", + "amectuḥ", + "amecwar", + "amelwi", + "amesgunef", + "ameskar", + "amezday", + "amgarad", + "amrabeḍ", + "amseḍru", + "amsugen", + "amyiwen", + "amḥaddi", + "anaf", + "anasiw", + "anaw", + "anazuṛ", + "anda-t", + "anecta", + "aneggez", + "anican", + "annar", + "antraktika", + "anẓul", + "aqendur", + "aqerruy-is", + "aqlaɣ", + "aqrur", + "araz", + "arewway", + "arezki", + "argaz-iw", + "argaz-nni", + "arraw-is", + "arrif", + "aruɣ", + "as-d", + "as-tiniḍ", + "asawen", + "asbeddi", + "asduklan", + "asefk", + "aseggem", + "asegmi", + "asegzawal", + "asegzi", + "aseklan", + "asekyed", + "asenqad", + "aserdasi", + "asesteb", + "asfel", + "asikel", + "asnifel", + "ass-agi", + "asuddem", + "atnan", + "attekki", + "awen", + "awgelhan", + "awitay", + "awtem", + "axeddim-nni", + "ayalas", + "ayendin", + "azegrir", + "azegrir-agi", + "aɛdaw", + "aɛeyyer", + "aɛiwed", + "aɣarim", + "aɣezfan", + "aɣezzfan", + "aɣilas", + "aḥebbus", + "aḥeddad", + "aḥeqqi", + "aḥlil", + "aḥric", + "aḥulfu", + "aṛumi", + "aṣqif", + "bakir", + "begsen", + "belɛid", + "benmuhub", + "bennun", + "berqa", + "berriken", + "bessif", + "bni", + "bnin", + "briṭanya", + "burj", + "bururu", + "burǧ", + "bɣant", + "bɣiɣ", + "ccbaḥa", + "ccna", + "ccrab", + "ccɣel", + "ccɣel-a", + "cemmini", + "cennun", + "creḍ", + "cwiya", + "d-afen", + "d-afeɣ", + "d-fken", + "d-igan", + "d-ilulen", + "d-iḥella", + "d-nger", + "d-nini", + "d-teqqar", + "d-ters", + "d-tezzi", + "d-ufan", + "d-usiɣ", + "d-yas", + "d-ye", + "d-yefɣen", + "d-yeglan", + "d-yernan", + "d-yesbedd", + "d-yesnulfan", + "d-yettbanen", + "d-yettuɣalen", + "d-yeǧǧa", + "d-yuɣ", + "d-yuɣal", + "d-ǧǧan", + "daki", + "daɛwessu", + "ddan-d", + "ddar", + "ddaw-as", + "ddem", + "ddeqs-is", + "ddqiqa", + "ddren", + "ddunit-a", + "ddunit-iw", + "deg-sen", + "dimecq", + "err-d", + "fell-asent", + "fenyan", + "ferhat", + "fernen", + "ferru", + "ffeɣ", + "fiḥel", + "frun", + "fɣeɣ", + "gar-", + "geɣ", + "ggummaɣ", + "gneɣ", + "gzan", + "gzun", + "hatan", + "hattan", + "hudden", + "ibaskiyen", + "ibeddu", + "ibiten", + "ibureɣsen", + "iburɣas", + "icebba-yi", + "iceṭṭiḍen", + "icuban", + "idammen", + "idum", + "idurar", + "idzayriyen", + "ifassen", + "ifawatayen", + "ifaz", + "ifazen", + "igadiren", + "igerdan", + "igezzem", + "igider", + "igujilen", + "igzem", + "ijdiden", + "ijebbed", + "ijga", + "ikemmusen", + "ikka", + "ilelli", + "imalas", + "imastanen", + "imazanen", + "imennuɣen", + "imenɣi", + "imeqqranen", + "imeqranen", + "imesdurar", + "imeɣban", + "imeḥbas", + "imjuhad", + "imsaɣen", + "imsulta", + "imɣaren", + "inaddalen", + "ineggez", + "inejmuɛen", + "inelmaden", + "ineqq", + "ineqqisen", + "ineɣlafen", + "inuda", + "inzi", + "iqeddec", + "iqqim", + "iseg", + "isegwasen", + "isem", + "isem-ines", + "isental", + "iseqdacen", + "ismenyifen", + "ispamen", + "issefk", + "isura", + "isuter", + "isɛan", + "iterrasen", + "iwali", + "iwenniten", + "iwgelhanen", + "ixdem", + "ixelleṣ", + "ixfawen", + "ixulef", + "iylalen", + "izedɣen", + "izegza", + "izirig", + "izri", + "izumal", + "iɛedda-d", + "iɛelleq", + "iɣaḍ-iyi", + "iɣbaren", + "iɣersiwen", + "iɣess", + "iɣewwaren", + "iɣsan", + "iɣunab", + "iḍemnen", + "iḍes", + "iḍran", + "iḥader", + "iḥedran", + "iḥella-d", + "iḥettmen", + "iṛuḥ", + "japun", + "jemɛen", + "jennad", + "jjiḥ", + "kanada", + "kemlen", + "kifkif-iten", + "kkes", + "kkes-d", + "kkreɣ-d", + "kullec", + "kuz", + "kuẓ", + "larbi", + "laɛfu", + "lbacir", + "lbatima", + "lbeɛd", + "leflani", + "lekwaɣeḍ", + "lemmdeɣ", + "lemɣawla", + "leqran", + "leqraya-s", + "leqwanen", + "leryuy", + "lewṣayat", + "lexyuḍ", + "lexṣas", + "lexṣaṣ", + "leḥcic", + "leḥkem", + "leḥya", + "line-height", + "llakul", + "llan", + "llin", + "lliɣ", + "llufan", + "lmendad-ik", + "lmeɣreb", + "lmul", + "lqerḥ", + "lweqt-nni", + "lwiz", + "lxetyar", + "lxilafa", + "lxir", + "lɛada", + "lɛamma", + "lɛejlan", + "lɛerbi", + "lɣiḍ", + "lɣiḍ-nsen", + "lḥers", + "lḥif", + "maɣef", + "medlent", + "melyun", + "mengellat", + "menguellet", + "mennaw", + "messali", + "mezweɣ", + "mhidi", + "micli", + "mmeslay", + "mmuteɣ", + "mokrane", + "msefhamen", + "mucaɛen", + "musku", + "muḥend", + "mɛamar", + "nacer", + "nadin", + "naru", + "neffeɣ", + "nekkes", + "nemlal", + "nemmut", + "neqqar", + "nerfed", + "nettaf", + "nettu", + "nezdeɣ", + "nezweǧ", + "nezzah", + "neɣ", + "neẓri", + "nnaɣeɣ", + "nneɣ", + "nniven", + "nniɣ-d", + "nudan", + "nufa-d", + "nuredin", + "nuɣal-d", + "nɛeddi", + "protonmail", + "qerben", + "qirṭa", + "qiṣer", + "qqaren-d", + "qqarent", + "racid", + "rebbi", + "reglen", + "remḍan", + "rnut-as", + "rradyu", + "rriḥa", + "ruḥeɣ", + "sbedden-d", + "sebt", + "seddaw", + "sekkura", + "selɛa", + "senkez", + "senqed", + "serḥen", + "seɛɛun", + "sirta", + "siwa", + "siwel-iyi-d", + "smaɛil", + "sneqsen", + "snesla", + "sonatrach", + "spanya", + "spenyul", + "srabes", + "srid", + "ssawalen", + "ssem", + "ssiman", + "ssinen", + "sslam", + "ssufɣen", + "ssuq", + "ssuɣat", + "sufella", + "susem", + "swid", + "t-id", + "ta-", + "tabdart", + "tacawit", + "taciɛit", + "taddert", + "tadigant", + "tadɣaɣat", + "tafidiralit", + "tafriqt", + "taggayin", + "taggayt", + "taggazt", + "tajmilt", + "tallit-a", + "talsant", + "tama-s", + "tamedyezt", + "tamegdayt", + "tameqqṛant", + "tamesbanit", + "tameɣbunt", + "tameɣra", + "tamiwin", + "tamsalt-a", + "tamsirt", + "tamudi", + "tamurt", + "tamurt-nneɣ", + "tamurt-nsen", + "tamuɣli", + "tanamsadt", + "tankult", + "tantala", + "tanzagt", + "tanzanya", + "taqbilt", + "taqcict", + "tarennawt", + "targa", + "tasaggazt", + "tasarut", + "tasemrant", + "tasmekta", + "tawala", + "tawilat", + "tawḥidt", + "taxatart", + "taxatemt", + "tayri", + "tazayzant", + "taɣect-is", + "taɣert", + "taẓeyt", + "tban", + "tbeddleḍ", + "tcudd", + "tdukkliwin", + "tebdart", + "tebrat", + "tebɣid", + "tebḥirin", + "tecrawt", + "teddu", + "tedduḍ", + "tedyanin", + "tefka-as", + "tefṛansist", + "tegneḍ", + "tegreḍ", + "tegzirin", + "tekcem", + "tekcem-d", + "tellam", + "telɣut", + "telḥeq", + "temkarḍit", + "temlilit", + "temlilit-nni", + "temmut", + "temseɣẓaẓ", + "temsilt", + "temsizlin", + "temsizzelt", + "temsulta", + "temɣart", + "temɣer", + "ten-id-ssutren", + "tenger", + "tenna-iyi-d", + "tensa", + "teqqel", + "terbabt", + "termitin", + "terra-t", + "tesdatin", + "tesmekta", + "tesnerni", + "tesqedceḍ", + "tesriḍ", + "tessaweḍ", + "tesseqdac", + "tessutreḍ", + "tesweḍ", + "tesɛam", + "tetteddu", + "tettemcabi", + "tettezzi", + "tettili", + "tettraǧu", + "tettxemmim", + "tettxemmimeḍ", + "tewsit", + "tewtemt", + "tewwet", + "texsi", + "texxamin", + "texxamt", + "texxamt-is", + "tezgad", + "tezmart", + "tezmert", + "tezmiḍalt", + "teǧhed", + "teǧǧi", + "teɛna", + "teɣdeft", + "teɣremt", + "teɣtasin", + "teɣwalt", + "teɣzent", + "teḍfer", + "teḥwaj", + "teḥwaǧeḍ", + "teṭṭes", + "teẓramt", + "teẓrigt", + "tfekkiwin", + "tfellaḥt", + "tfidiralit", + "tfukk", + "tgejda", + "tgelda", + "tgen", + "tgiḍ", + "tguni", + "tidayṛiwin", + "tiddukla", + "tidukkla", + "tifinaɣ", + "tifrat", + "tigdi", + "tihin", + "tikal", + "tikci", + "tikeryas", + "tilas", + "tilelli", + "tilemt", + "tiliɣri", + "timental", + "timettiyin", + "timezwura", + "timeɣriwin", + "timmuzɣa", + "timsefra", + "timsuṭad", + "timura", + "tinn", + "tisṭunit", + "tizrigin", + "tiɣbula", + "tiɣilt", + "tiɣremt", + "tiḥizit", + "tkarḍa", + "tkatut", + "tkecmeḍ", + "tkerrusin", + "tkuzint", + "tlata", + "tlatinit", + "tlemsan", + "tmacinin", + "tmanyin", + "tmasiḥit", + "tmedkin", + "tmehla", + "tmental", + "tmeslayin", + "tmettant", + "tmeɣra-nni", + "tmeẓẓuɣt", + "tmuɣli-s", + "tmuɣliwin", + "tnadiḍ", + "tnarit", + "tnefsit", + "tnegwa", + "trakalt", + "trebbaɛ-a", + "tsaggazt", + "tseddawit", + "tsinin", + "tsusmi", + "tt-iwala", + "ttaṭṭafen", + "ttiliɣ", + "ttmuqulen", + "ttqelliben", + "ttraǧun", + "ttrun", + "tturaren", + "tturk", + "ttwaliɣ", + "ttwassnen", + "ttxilek", + "tuccar-is", + "tuccḍiwin", + "tudert-nneɣ", + "tugniwin", + "tuksa", + "tuli-d", + "tullisin", + "tullya", + "tulya", + "tumert", + "tunnigt", + "tunṣibin", + "tunṣibt", + "turarin", + "turda", + "turiḍ", + "turmidt", + "tusnakt", + "tussniwin", + "tuɣal-d", + "tuḍfirt", + "twaculin-nsen", + "twacult-iw", + "twali", + "twaṭṭfa", + "txelleṣ", + "tzemrem", + "tzewǧeḍ", + "tɛebrit", + "tɣuri", + "tɣuṛi", + "tḥuna", + "tẓer", + "ubadu", + "ubeqqa", + "ucebbub", + "ugadeɣ", + "ugama", + "ugemmun", + "uggug", + "ugujil", + "ugzum", + "ujgu", + "ukayad", + "ukkuz", + "ukman", + "uksum", + "ukufi", + "ulayɣer", + "uleqqem", + "uletma-s", + "umaray", + "umazrar", + "umennuɣ-is", + "umenzu", + "umenɣi", + "umeqran", + "umerri", + "umezdaɣ", + "umkan-is", + "umsaltu", + "umussnaw", + "umḍin", + "unect", + "unehhar", + "unermis", + "uneɣlaf", + "ungalen", + "unsib", + "unuɣ", + "unẓul", + "uqader", + "uraren", + "urasya", + "urt", + "urǧin", + "usafag", + "usalay", + "usali", + "usayes", + "usbeddi", + "usekkud", + "usennan", + "usenqed", + "userwes", + "usgunfu", + "usigna", + "uskan", + "uslig", + "usnerni", + "usnifel", + "usselmed", + "usudu", + "usufeɣ", + "uswir", + "usɣar", + "utrim", + "uvirus-agi", + "uxeddam", + "uzilal", + "uzwel", + "uzzu", + "uɛekkaz", + "uɣawas", + "uɣebbar", + "uɣelluy", + "uɣeɣ-d", + "uɣiwel", + "uɣref", + "uḥraz", + "viii-", + "waddud", + "wagar-asen", + "wagennun", + "waggur", + "waguren", + "wahilen", + "wakk", + "wakka", + "wallaɣ", + "wallen-iw", + "wama", + "waman-nni", + "wammasen", + "wansi", + "waqila", + "wasif", + "wass", + "wawras", + "way-n", + "way-nni", + "wayen-nniḍen", + "wayes", + "wazzug", + "waɛraben", + "waɣzen", + "wedrum", + "weltma-s", + "wennez", + "wenṭaṭ", + "wesqamu", + "wezzil", + "weɣmis", + "weḥraz", + "weẓru", + "widak", + "wihin", + "wordpress", + "wulzuz", + "wunbir", + "wungal", + "wusu", + "wuṭṭu", + "wwteɣ", + "xaqeɣ", + "xedmen", + "xemsa", + "xwalti", + "yakkan", + "yal", + "yalas", + "yamina", + "yebded", + "yecrek", + "yeddem", + "yeddi", + "yeffe", + "yefka-d", + "yefkan", + "yefsi", + "yeglu", + "yegra-d", + "yehwa", + "yejmeɛ", + "yekfi", + "yekka", + "yekkes-as", + "yekksen", + "yekna", + "yekseb", + "yelha", + "yella", + "yelḥa", + "yemlil", + "yemmugen", + "yemneɛ", + "yemyuraren", + "yenna", + "yenna-as-d", + "yenni", + "yeqwan", + "yergel", + "yernu", + "yerra-as", + "yerza-d", + "yes-s", + "yesbedd", + "yeshel", + "yeshetrif", + "yessan", + "yessaramen", + "yessawalen", + "yessawel-d", + "yessaɣ", + "yessefk", + "yessers", + "yesskanayen", + "yessuddes", + "yesteɛref", + "yesɛan", + "yesɛedday", + "yetran", + "yettaken", + "yettbanen", + "yettekkin", + "yettergigi", + "yettilin", + "yettmeslay", + "yettnernin", + "yettruḥun", + "yettuneḥsab", + "yettusbadun", + "yettwafernen", + "yettwalqem", + "yettwasekles", + "yettwasqedcen", + "yettwattun", + "yettwaḥebsen", + "yettwaṭṭef", + "yettḥulfu", + "yewwi", + "yexsi", + "yeznuzu", + "yezwaren", + "yezzi-d", + "yeččur", + "yeǧǧa-t", + "yeɛfu", + "yeɛya", + "yeḍmen", + "yeḍran", + "yeṭṭef-itt", + "yi-iɛawnen", + "yibabaten", + "yiberdan", + "yid-neɣ", + "yid-sent", + "yid-wen", + "yides", + "yidis", + "yif", + "yifen", + "yigad", + "yigen-ines", + "yigenni", + "yikayaden", + "yilugan", + "yiman-nsen", + "yimawlan-is", + "yimaylen", + "yimeddukal", + "yimesli", + "yimi-s", + "yimir", + "yimjuhad", + "yimru", + "yimuḍan", + "yinisi", + "yinumak", + "yiran", + "yiri", + "yirmuden", + "yiselsa", + "yisumar", + "yiwudam", + "yiwwas", + "yizmawen", + "yiznan", + "yiɛeqqayen", + "yugaden", + "yugar", + "yura", + "yura-d", + "yurzen", + "yussan", + "yuyes", + "yuɛer", + "yuɣalen", + "yuḥwaǧ", + "zdaxel", + "zekri", + "zelmeḍ", + "zgan-d", + "zik", + "ziland", + "ziɣen", + "ččuren", + "ǧiǧǧi", + "ǧǧet-iyi", + "ɛayn", + "ɛebdelqader", + "ɛebdelǧabar", + "ɛebdelḥamid", + "ɛecṛa", + "ɛeddant", + "ɛemmar", + "ɛennaba", + "ɛinani", + "ɛla", + "ɛlayen", + "ɛni", + "ɛzizen", + "ɣef", + "ɣer-i", + "ɣer-sen", + "ɣilen", + "ɣriɣ", + "ḥaca", + "ḥasi", + "ḥemmam", + "ḥemmlen", + "ḥilmi", + "ḥulfan", + "ḥwaǧeɣ", + "ṛṛuman", + "ṭfen", + "ṭṭaref", + "ṭṭuqten", + "ẓer", + "ẓeṛ", + "ẓreg" + ] +} diff --git a/frontend/static/languages/kabyle_2k.json b/frontend/static/languages/kabyle_2k.json new file mode 100644 index 000000000000..02162f0d38c4 --- /dev/null +++ b/frontend/static/languages/kabyle_2k.json @@ -0,0 +1,2007 @@ +{ + "name": "kabyle_2k", + "bcp47": "kab", + "orderedByFrequency": false, + "words": [ + "-is", + "abeddel", + "abeqqeḍ", + "aberkan", + "aberrani", + "aberraḥ", + "ablug", + "abrid-nsen", + "abruy", + "acciwen", + "acebbub-is", + "acebḥan", + "acmumeḥ", + "acu-t", + "acu-tent", + "adamsan", + "adawsan", + "adaynin", + "addud-is", + "adeg-aɣella", + "aderbal", + "adig", + "adigan", + "adlis", + "adlis-a", + "adrar", + "adraɛ", + "adrim", + "af-d", + "afecku", + "afella", + "afellay", + "afen", + "afransis", + "afɣanistan", + "agalis", + "agbur", + "agdud", + "agmuḍ", + "agrud", + "agujil", + "agwni", + "agzam", + "ahad", + "ahat", + "ajerred", + "akabar", + "akat", + "akeyyef", + "akk-en", + "akk-n", + "akken-it", + "aklan", + "aksil", + "akud", + "akufi", + "akukru", + "al-d", + "alatini", + "amaklas", + "amalay", + "amallal", + "aman-nni", + "amaray", + "amarikan", + "amarir", + "amaru", + "amasiḥi", + "amaslaḍ", + "amawal", + "amaziɣ", + "amazzal", + "amaɣnu", + "amda", + "ameddakel", + "amedya", + "amekkan", + "amenyaf", + "amenẓaw", + "ameqqṛan", + "ameqṛan", + "amesri", + "amezday", + "ameɣtu", + "ameẓlu", + "ameẓẓyan", + "amihaw", + "amkan-is", + "ammar", + "amnadi", + "amnar", + "amqqran", + "amrar", + "amraḥ", + "amsefrak", + "amusnaw", + "amussnaw", + "amussu", + "amɛellem", + "amɣar", + "amḍiq", + "anadi", + "anaḍ", + "anaẓur", + "anda-tt", + "anebdu", + "anect", + "anef", + "anef-as", + "aneggar", + "aneggaru", + "aneggaru-agi", + "anejmuɛ", + "anekruf", + "aneqqis", + "anezgum", + "anfafad-a", + "anida", + "anida-t", + "anida-ten", + "anili", + "annar", + "annaɣ", + "annect-a", + "anzaren", + "anɣal", + "aqendur", + "aqerruy-iw", + "aqjun-nni", + "aql-i", + "aql-iyi", + "aqrab", + "araz", + "arewway", + "armi", + "arraw-nsen", + "arrazen", + "as-fken", + "as-yennan", + "as-yeqqar", + "asammar", + "asaru-nni", + "asaḍ", + "asaḍas", + "asekcem", + "asekkeṛ", + "aselkem", + "aselket", + "aselkin", + "asemmaḍ", + "asemran", + "asemɣer", + "asenfar-a", + "asenker", + "asentel-agi", + "asenǧaq", + "aseqdec", + "aserdas", + "asertay", + "aserti", + "asfugel", + "asigna", + "asirem", + "asiwel", + "asiḍen", + "aslem", + "asma", + "ass-", + "asuddem", + "asuddes", + "asulay", + "asuref", + "asɣal", + "atas", + "atmaten", + "attan", + "awah", + "awal-nsen", + "awaqqur", + "awen", + "awennez", + "awez", + "awezlan", + "awi", + "awi-t", + "awint", + "awiǧit", + "awiɣ", + "awniri", + "awras", + "awudem", + "awurman", + "awḍen", + "awḥid", + "axeddim-iw", + "axeddim-nni", + "axir", + "axxam", + "axxam-nneɣ", + "ay-agi", + "ay-nni", + "ayagi", + "ayefus", + "ayendin", + "ayenni", + "ayɣer", + "azal-is", + "azamul-is", + "azarug-is", + "azdal", + "azday", + "azedgan", + "azemmur", + "azeqqur", + "azilal", + "aziraz", + "azniq", + "azref", + "azrem", + "azuk-is", + "azul", + "azwaw", + "azwu", + "aɛeyyer", + "aɛlayan", + "aɛmer", + "aɛrab", + "aɛzizen", + "aɣ-", + "aɣella", + "aɣisan", + "aɣrab", + "aɣrud", + "aɣrum", + "aɣyul", + "aḍris", + "aḥmayan", + "aḥmed", + "aḥraz", + "aḥric", + "aṛumani", + "aṭlasi", + "aẓawan", + "aẓelmaḍ", + "aẓeṭṭa", + "baba-tsen", + "badi", + "bdiɣ", + "beddlent", + "bedlen", + "begsen", + "belɛen", + "belɛid", + "beramtane", + "berkukes", + "berriken", + "beɛden", + "biljik", + "bnin", + "brandshortname", + "briṭanya", + "bufarik", + "bulgarya", + "bumilkar", + "burj", + "bururu", + "bussaɛd", + "buturin", + "buɛli", + "bɣin", + "bɣu", + "bɣuɣ", + "bḍun", + "caɛban", + "ccan", + "ccinwa", + "cciɛat", + "cclef", + "ccna", + "ccnawi", + "ccḍeḥ", + "ccṛeɛ", + "cennun", + "cfu", + "cnuɣ", + "creɛ", + "ctamber", + "cwiyya", + "cɣel", + "d-awin", + "d-awiɣ", + "d-fkan", + "d-ibedden", + "d-iger", + "d-ikecmen", + "d-ilal", + "d-ilin", + "d-inna", + "d-iteffeɣ", + "d-iwekked", + "d-iḥella", + "d-jemɛen", + "d-kkren", + "d-nebder", + "d-nufi", + "d-rreɣ", + "d-sbedden", + "d-sersen", + "d-tefka", + "d-tella", + "d-teqqareḍ", + "d-ters", + "d-tesnulfuḍ", + "d-tili", + "d-tini", + "d-tlul", + "d-ufiɣ", + "d-uran", + "d-yaweḍ", + "d-yawin", + "d-ye", + "d-yebda", + "d-yedda", + "d-yefka", + "d-yefken", + "d-yeglu", + "d-yekkren", + "d-yeldi", + "d-yemmeslay", + "d-yennulfan", + "d-yeqqar", + "d-yersen", + "d-yerzan", + "d-yesbedd", + "d-yessawel", + "d-yessawlen", + "d-yettakken", + "d-yettas", + "d-yettasen", + "d-yettawin", + "d-yewwin", + "d-yewwḍen", + "d-yezzi", + "d-yeǧǧan", + "d-yeḍra", + "d-yeṭṭef", + "d-yeṭṭfen", + "d-yili", + "d-yuɣal", + "dakk-n", + "daɛwessu", + "daɣen", + "ddabex", + "ddewla", + "ddheb", + "ddiɣ", + "ddnub", + "ddreɣ", + "ddukklen", + "dduklen", + "ddunit-is", + "ddur", + "deg-sen", + "degsen", + "degsent", + "dihin", + "dinna", + "dujember", + "dular", + "dunnit", + "efk-as", + "err-d", + "ettut", + "eǧǧ", + "facebook", + "falesṭin", + "fehmeɣ", + "fell-akent", + "fell-aneɣ", + "fenyan", + "ferru", + "ferḥat", + "feṛḥen", + "feṛḥeɣ", + "ffeɣ", + "ffren", + "filezilla", + "fkan", + "fkan-d", + "friqiya", + "fukken", + "furulu", + "fɣen", + "gar-", + "gar-as", + "garasen", + "gedlen", + "ggten", + "ginya", + "giɣ", + "gziɣ", + "ha-t-an", + "hibel", + "hilal", + "html", + "iban-iyi-d", + "ibaɛden", + "ibda", + "ibeddel", + "ibeddun", + "ibennun", + "ibulisen", + "icban", + "icemten", + "icennu", + "icennun", + "icerken", + "icerreg", + "icuban", + "icukk", + "idammen", + "idernen", + "idir", + "idlisen", + "idmaren", + "iduba", + "idularen", + "idzayriyen", + "ifadden", + "ifassen-ik", + "ifassen-nsen", + "ifat", + "iferqen", + "iffeɣ", + "ifganen", + "ifrax", + "ifukal", + "igadiren", + "igan", + "igduden", + "igebren", + "igerdan", + "igerrez", + "igliziyen", + "igzem-itt", + "ijdi", + "ijehden", + "ijerḥen", + "ijga", + "ijider", + "ikaramen", + "ikcem", + "ikcem-d", + "ikellex", + "ikerrec", + "ilaq-iyi", + "ilem", + "ileqman", + "iles", + "ileḥḥu", + "ilili", + "ilin", + "illu", + "ilmaten", + "ilmawen", + "ilmeẓyen", + "ilugan", + "imac", + "imal", + "imalasen", + "imalen", + "imasalen", + "imasayen", + "imasiḥiyen", + "imawlan-is", + "imawlan-iw", + "imayl", + "imazellawen", + "imecṭaḥ", + "imegruden", + "imejjayen", + "imeksawen", + "imelliẓ", + "imelyunen", + "imenɣi", + "imeqqranen", + "imeslayen-is", + "imesli", + "imezdaɣen", + "imezdi", + "imezgi", + "imeẓyanen", + "imi-s", + "imir-a", + "imiranen", + "imnudag", + "imrabḍen", + "imttekkiyen", + "imula", + "imuqel", + "imurar", + "imyuraren", + "imɣan", + "in-article", + "inagduden", + "inagrawen", + "inebgi", + "ineggura", + "inelmaden", + "inermisen", + "ineɣlafen", + "ineṣliyen", + "ini-asen", + "ini-d", + "inisi", + "iniɣ", + "inselmen", + "inuba", + "inumidiyen", + "iqburen", + "iqeddcen", + "irem", + "irgazen", + "irumaniyen", + "iruḥ-d", + "isali", + "isalli", + "isawalen", + "isebtaren", + "iseddagen", + "isefra", + "iseg", + "isegwasen", + "isekles", + "isem-ines", + "isemda", + "isenfaren", + "isennanen", + "iserdasen", + "iserdasen-is", + "isiɣzaf", + "isiɣzifen", + "isiḍen", + "ismawen", + "isnudranen", + "isseqdac", + "issin", + "isuɣ", + "iswi-s", + "isɣaren", + "itbir", + "iteffeɣ", + "iwacu", + "iwakken", + "iwata", + "iwetmen", + "iweṣṣa", + "iwiǧiten", + "ixesren", + "ixussen", + "ixuṣṣen", + "iyi", + "iyya", + "izaden", + "izdeɣ", + "izegrar", + "izegren", + "izen-agi", + "izi", + "izlan", + "izmiren", + "izri", + "izzayriyen", + "iɛeṭṭel", + "iɛraben", + "iɣaḍ-iyi", + "iɣbaren", + "iɣelli", + "iɣerfan", + "iɣermanen", + "iɣes", + "iɣsan", + "iɣunab", + "iḍ-agi", + "iḍegger", + "iḍerru", + "iḍudan", + "iḥebsen", + "iḥedren", + "iḥekmen", + "iḥemmlen", + "iṛumyen", + "iṣeggem", + "iṣeḥḥa", + "iṣuṛdiyen", + "iṭerkiyen", + "iṭṭef", + "iẓer", + "iẓuran", + "jelfa", + "jeǧǧiga", + "jsmb", + "jurjura", + "kaci", + "kbd", + "kecmen", + "kemlen", + "kenwi", + "kfun", + "kifkif-iten", + "kkiɣ", + "kren", + "kuiper", + "kul", + "kulec", + "kulumbya", + "kuruna", + "kuz", + "kuṛuna", + "lakked", + "laman", + "lamana", + "latay", + "lawan-nni", + "laṣel", + "laṣel-is", + "lbacir", + "lbaz", + "lbeɛd", + "lburǧ", + "lbusṭa", + "lebḥeṛ", + "legrig", + "lehlak", + "lehḍur", + "lejdud", + "lejdud-is", + "lemdeɣ", + "lemleḥ", + "lemmer", + "lemtel", + "lemɛiwna", + "lemɣawla", + "leqbayel", + "leqdic-nsen", + "leqdicat", + "leqhawi", + "leqqem", + "leqrun", + "leqser", + "leqṣer", + "lerwaḥ", + "leswam", + "letnayen", + "lewnis", + "lewqat", + "lexrif", + "lexyal", + "lexyuḍ", + "leǧnun", + "leɛmer", + "leɛrac", + "leɣrama", + "leḥcic", + "leḥris", + "leṣnaf", + "lfal", + "lfirma", + "lhem", + "limamat", + "listiɛmar", + "ljemɛa", + "lkiran", + "lkisan", + "lla", + "llan-t", + "llant-d", + "lleft", + "lmasiḥ", + "lmelḥ", + "lmendad", + "lmendad-ik", + "lmersa", + "lmerta", + "lmerṣa", + "lmeyyet", + "lmitrat", + "lmut", + "lmut-is", + "lmuta", + "lpari", + "lqanun", + "lqehwa", + "lqerḥ", + "luleɣ", + "lumur", + "lumuṛ", + "lurup", + "lwelha", + "lwennas", + "lweḥc", + "lxaṭer", + "lxelɛa", + "lxeḍra", + "lxiq", + "lǧameɛ", + "lǧar", + "lǧehd", + "lǧiha", + "lɛamma", + "lɛar", + "lɛarc", + "lɛesker", + "lɛib", + "lɣaci", + "lɣerḍ", + "lḥamu", + "lḥan", + "lḥed", + "lḥemmam", + "lḥerma", + "lḥif", + "lḥirak", + "lḥukuma", + "lḥuɣ", + "maci", + "maggu", + "masensen", + "mazal-ik", + "mazal-iten", + "maɣef", + "maɣres", + "maṣer", + "mbeɛd", + "mdel", + "mendas", + "menhu", + "menṣur", + "meqqar", + "meqqret", + "mesmamda", + "meyya", + "meɛṭub", + "meẓyan", + "meẓẓiyen", + "meẓẓiyeɣ", + "mgal-is", + "mgaradent", + "mhenni", + "microsoft", + "miksik", + "mlalen", + "mlikec", + "mlilen", + "mliḥ", + "mmel", + "mmeslay", + "mmi-s", + "mraw", + "msonormal", + "mucaɛ", + "mulac", + "mulud", + "muḥal", + "myussanen", + "mɣa", + "n'est", + "nadal", + "nali", + "naweḍ", + "nawi", + "ncallah", + "nebɣa", + "neddi", + "neddu", + "negren", + "nekker", + "neldi", + "nelmed", + "nemmeslay-d", + "nemmut", + "neqqar", + "neqsen", + "nerbeḥ", + "nerfed", + "nerna", + "nerra", + "nerwel", + "nesli", + "nessaram", + "nessawal", + "nesɛa", + "nettidir", + "nettkel", + "nettu", + "nettuɣal", + "nezdeɣ", + "nezdi", + "neǧǧa", + "neẓra", + "nger", + "nini", + "niḍen", + "nkemmel", + "nmuqel", + "nna", + "nndama", + "nnefxa", + "nnefṣ", + "nneqma", + "nneɛma", + "nni", + "nnil", + "nniqal", + "nniɣ-ak-d", + "nnsent", + "nnuba", + "nnumen", + "nnumeɣ", + "nsent", + "nubil", + "nufa-d", + "nugad", + "nuɣ", + "nxeddem", + "nẓer", + "photoshop", + "productname", + "qablen", + "qasi", + "qerben", + "qessiḥen", + "qim", + "rbaḥa", + "rbaṭ", + "rebrab", + "reglen", + "rewlen", + "rnan", + "rnut-as", + "rradyu", + "rran-d", + "rray-a", + "rray-is", + "rrbeḥ", + "rrebrab", + "rreḥba", + "rriyal", + "rrus", + "rsen", + "rusya", + "ruɣ", + "ruḥen", + "ruḥent", + "ruḥeɣ", + "rwaḥ", + "rzan", + "rzun", + "rẓen", + "s-yehwa", + "s-yenna", + "sagen", + "sakkin", + "salah", + "salḥi", + "sarameɣ", + "sbedden", + "sbedden-d", + "sdat-i", + "sdaxel", + "sekker", + "sekkeṛ", + "selɛa", + "semman-as", + "sen-", + "sennig", + "seqsaɣ", + "serreḥ", + "serḥen", + "sfehmeɣ", + "sifaks", + "siwa", + "siwel", + "sliɣ-as", + "ssaramen", + "sselṭan", + "ssem", + "sseqdacen", + "ssifa", + "ssired", + "ssker", + "sslam", + "ssuffɣen", + "ssulin", + "ssuma", + "ssusmen", + "ssut", + "ssutren", + "ssya", + "ssyin", + "steqsi", + "sudad", + "sutreɣ", + "sweɣ", + "sɛin", + "sɣuṛ", + "t-nexdem", + "t-walaɣ", + "t-xedmen", + "t-yenɣan", + "t-yewwin", + "tabaskit", + "tabbu", + "tabdart", + "taberranit", + "tabeṛṛanit", + "tabrat", + "tacinwat", + "tadawsant", + "taddart-agi", + "taddart-is", + "taddukli", + "tadelsant", + "tadfert", + "taduli", + "tadusi", + "tadwilt", + "tadyant-a", + "tafellayt", + "tafellaḥt", + "tafeḍ", + "tafrant", + "tafrawt", + "tafriqt", + "tafunast", + "tafṛensist", + "tageldunt", + "taglizit", + "tagnit", + "tagrawt", + "tagrigit", + "taguni", + "tajmilt", + "takanadit", + "takeṛṛust-iw", + "takmamt", + "takrit", + "takrura", + "takurt", + "talaba", + "talalit", + "taleb", + "talemmiẓt", + "talwit", + "talɣiwin", + "talɣut", + "tama-", + "tama-nneɣ", + "tamacahut", + "tamacahutt", + "tamagdayt", + "tamawt", + "tamazight", + "tamdint-a", + "tameddurt-is", + "tamehla", + "tamensayt", + "tamentilt", + "tamerkantit", + "tamesguneft", + "tamezduɣt", + "tamezwarut", + "tameṭṭut-is", + "tameẓẓuɣt", + "tamhalt", + "tamhazt", + "tamhelt", + "tamkarḍit", + "tamnaḍt", + "tamnekda", + "tamneḍ", + "tamrikt", + "tamtilt", + "tamu", + "tamurt-iw", + "tamzikt", + "tanamsadt", + "tanarit", + "tanaẓurt", + "taneflit", + "tanemhalt", + "tanemlayt", + "tanezzayt", + "taneɣruft", + "tanglizit", + "tankult", + "tanmaḍalt", + "tansa-agi", + "tantaliwin", + "taqbuct", + "taqcict", + "taqdimt", + "tarakalt", + "tarbaɛt-a", + "tarrayin", + "tarrayt", + "tarumit", + "tasa", + "tasaft", + "tasakrart", + "tasdawit", + "taselwit", + "tasertant", + "tasmekta", + "tasmuḍi", + "tasnudert", + "tasqamut", + "tastaɣt", + "tasuqqilt", + "taswist", + "taswiɛt-a", + "tasɣunt", + "tawala", + "tawant", + "tawaɣit-a", + "tawaṭṭfa", + "tawennaḍt", + "tawi", + "tawila", + "tawilat", + "tawḍeḍ", + "tayet", + "tayett", + "tayuga", + "tayunt", + "tazart", + "tazedgant", + "tazelmaḍt", + "tazelmaṭ", + "tazmilt", + "tazneḍ", + "tazrirt", + "taɛkemt", + "taɛlayant", + "taɣara", + "taɣawsa", + "taɣaṭ", + "taɣerbit", + "taɣerfant", + "taɣerma", + "taɣtast", + "taɣuct", + "taɣult-a", + "taɣuri", + "taḥanut", + "taḥerfit", + "taṭalyanit", + "taẓallit", + "taẓeyt", + "taẓɣelt", + "tban", + "tbeddel", + "tbeddeleḍ", + "tbeddleḍ", + "tcawit", + "tcennu", + "tceqqufin", + "tdersi", + "tdukkli", + "tebbun", + "tebda", + "tebduḍ", + "tebrek", + "tebɣamt", + "tebɣid", + "tebɣiḍ", + "tebɣu", + "tebḥirin", + "tecba", + "teddunt", + "tedwilt", + "tedyant", + "tedɣaɣatin", + "teffɣen", + "tefhem", + "tefkeḍ", + "tefkiḍ", + "teflest", + "tefransist", + "tefrant", + "tefrensist", + "tegber", + "tegda", + "tegla-d", + "tegmat", + "tegnit", + "tegrawt", + "tegreḍ", + "tekfu", + "tekkat", + "tekti", + "telha", + "tellamt", + "telluẓ", + "telmed", + "telmest", + "telmeẓyin", + "telsa", + "telwit", + "temdint", + "temguri", + "temlal", + "temlil", + "temliliyin", + "temlilt", + "temmed", + "temmeslay", + "temmeslayeḍ", + "temmug", + "temsal-a", + "temsilt", + "temsizlin", + "temsizzelt", + "temxallaf", + "temɣarin", + "temẓin", + "ten-id", + "tenna-as", + "tenna-k", + "tennerna", + "tenniḍ-d", + "tenzeggit", + "tenṭelt", + "teqbel", + "teqliɛt", + "teqqar-as", + "teqqim", + "teqqimem", + "teqqur", + "teqṣebt", + "terked", + "ternum-as", + "terra-t", + "ters", + "ters-d", + "terwiḥin", + "tesbaduḍ", + "tesmeḍ", + "tesnawit", + "tesqamut-a", + "tesriḍ", + "tessaram", + "tessefray", + "tessefraḥ", + "tessenqes", + "tesseqdec", + "tessneḍ", + "tessutreḍ", + "testeqsa", + "testeɛṛef", + "teswiɛin", + "teswiɛt", + "teswiɛt-nni", + "tesɛuḍ", + "tettali", + "tettarra", + "tettaru", + "tettawaṭ", + "tettawi", + "tettazzal", + "tettaɣ", + "tettbanem-d", + "tetteddu", + "tettemɣay-d", + "tetten", + "tettwaf", + "tettwali", + "tettxemmim", + "tettɣimi", + "tewsitin", + "tewweḍ-d", + "tewwi", + "tewwi-t", + "tewɛeṛ", + "texṣer", + "tezdi", + "tezger", + "tezgiḍ", + "tezlit", + "tezmert", + "tezmert-is", + "tezmir", + "tezmiremt", + "tezmiḍalt", + "tezrawin", + "tezɣent", + "tečča", + "teǧǧ", + "teǧǧa-d", + "teǧǧeḍ", + "teǧǧiḍ", + "teɛya", + "teɛǧeb-iyi", + "teɣleq", + "teɣli-d", + "teɣtasin", + "teɣtast", + "teɣzent", + "teɣzi", + "teḍra", + "teḍru", + "teḍsa", + "teḍṣa", + "teḥrez", + "teṭṭef", + "teẓra", + "teẓramt", + "tfekka", + "tfellaḥt", + "tferkit", + "tfizikt", + "tfukk", + "tfukt", + "tga", + "tgara", + "tgeḍ", + "thedder", + "tibawt", + "tibratin", + "tiddas", + "tiddest", + "tidet", + "tifin", + "tifranin", + "tiftilin", + "tigamanin", + "tigawt", + "tigri", + "tigrin", + "tigrummiwin", + "tijeǧǧigin", + "tikebbaniyin", + "tikkal", + "tikkelt-agi", + "tikkwal", + "tikti", + "tikti-a", + "tiktiwin", + "tilas", + "tilelliyin", + "tili", + "tilizri", + "tiliẓri", + "tilmas", + "timad-is", + "timdinin", + "timekkasin", + "timella", + "timenza", + "timeqranin", + "timettiyin", + "timezwura", + "timsirin", + "timunnent", + "timẓin", + "tiqburin", + "tiqdimin", + "tiqit", + "tirebbaɛ", + "tiremt", + "tirẓi", + "tiseddarin", + "tisin", + "tismin", + "tissit", + "tisuqilin", + "tiwizi", + "tiwsitin", + "tiwwura", + "tiwwura-nsen", + "tixtiṛiyin", + "tiyemmatin", + "tiyersi", + "tiyita", + "tizgelt", + "tizi-uzzu", + "tizlatin", + "tizrarin", + "tizrawin", + "tiɛrabin", + "tiɣilt", + "tiɣremt", + "tiɣri", + "tiṭ-is", + "tiẓegwa", + "tiẓrigin", + "tjerrumt", + "tkebbanit", + "tkebbaniyin", + "tkeṛṛust", + "tkurdit", + "tkuzint", + "tlalit", + "tlawin", + "tlemmast", + "tlemsan", + "tleqqemeḍ", + "tmacahut", + "tmellalt", + "tmenɣiwin", + "tmeslayin", + "tmeslayt", + "tmesliwt", + "tmezdayt", + "tmeɣra", + "tmeɣra-nni", + "tmeẓri", + "tmucuha", + "tmunent", + "tmura", + "tmura-ya", + "tmurt", + "tnarit", + "tneqḍin", + "tnezduɣin", + "tneẓẓi", + "tqeffalin", + "trakalt", + "trebbaɛ-a", + "tru", + "truḥ", + "truḥem", + "tsartut", + "tsuffeɣt", + "tsutwin", + "tt-", + "tt-yuɣ", + "ttaggad", + "ttarran", + "ttarun", + "ttawin-d", + "ttaǧǧa", + "tteffaḥ", + "ttemsefhamen", + "tteryel", + "ttfaṣil", + "ttif", + "ttilin", + "ttn", + "ttnadin", + "ttrebga", + "ttuɣ", + "ttwaleqqemen", + "ttwanɣan", + "ttwasnen", + "ttwasqedcen", + "ttwaṭṭfen", + "ttxemmimen", + "ttxil", + "ttɣimin", + "tubiret", + "tuccḍa", + "tucḍa", + "tuddar", + "tuddsa", + "tudrin", + "tuffirt", + "tugdi", + "tugdin", + "tugdudt", + "tuget", + "tuggdi", + "tugget", + "tugi", + "tukerḍa", + "tulawin", + "tuli-d", + "tullisin", + "tullya", + "tumin", + "turza", + "tusligt", + "tussit", + "tusut", + "tutlayt-a", + "tutlayt-agi", + "tutlayt-ik", + "tuzga-d", + "tuzwirt", + "tuzzel", + "tuɣ", + "tuɣalem", + "tuɣdaḍt", + "tuḍfirt", + "tuṛufit", + "tuẓwayt", + "tvidyutin", + "twala", + "twalaḍ", + "twalim", + "twaɣit", + "twaɣit-a", + "twehmeḍ", + "twinas", + "twizi", + "txelleṣ", + "tyemmat", + "tzemrem", + "tzunegzirt", + "tɛawed", + "tɛerḍeḍ", + "tɛessast", + "tɛummeḍ", + "tɣara", + "tɣawsa", + "tɣenjawin", + "tɣermiwin", + "tɣerɣert", + "tɣiwant-a", + "tɣuri", + "tḥemmlemt", + "tṣebḥit", + "tẓa", + "tẓer", + "ubadu", + "ubaxix", + "ubeddel", + "ubekkaḍ", + "ubrid-is", + "ubugaṭu", + "ucareɛ", + "uccen", + "ucetki", + "udabu", + "uday", + "udem-ik", + "udem-is", + "udiɣ", + "udrar", + "udras", + "udraɛ", + "udrum", + "udrurem", + "ufiɣ", + "ufraq", + "ufus-is", + "ufus-iw", + "ugaden", + "ugeffur", + "ugensu", + "ugilal", + "ugur-agi", + "uhu", + "ujeǧǧig", + "ujgu", + "ujmaɛ", + "ukala", + "ukemmel", + "ukessar", + "ukkuz", + "ukkuẓ", + "ulac-iten", + "ulday", + "uletma", + "umaru", + "umatu", + "umaynut", + "umaziɣ", + "umecwar", + "umecwaṛ", + "umeddakkel", + "umennuɣ-is", + "umenzu", + "umeskan", + "umezwaru", + "umeṭreḥ", + "umi", + "umizzwer", + "umkan-is", + "ummesten", + "umusnaw", + "umyaraw", + "umyaru", + "umyurar", + "umɣar", + "umḍiq-is", + "unafag", + "unazir", + "unect", + "unehhar", + "uneqqis", + "uneɣmas", + "unfafad", + "ungif", + "unmalu", + "unnar", + "upyanu", + "uqacuc", + "uqbayli", + "uqbu", + "uqensul", + "uqenṣul", + "uraren", + "urgaz-is", + "urgaɣ", + "url", + "urmid", + "urway", + "usaki", + "usali", + "usalun", + "usamer", + "usammar", + "usebtar", + "useggas-a", + "useggwas", + "usejji", + "usekyed", + "uselkin", + "usemmiḍ", + "usemmiṭ", + "usemɣer", + "usenfaṛ", + "usenkar", + "usenker", + "usenqed", + "usenqes", + "useɣti", + "useḥbes", + "usfugel", + "usgunef", + "usgunfu", + "usigna", + "usikel", + "usiwel", + "usiweḍ", + "usleɣmay", + "usmekti", + "usmel-agi", + "usneftaɣ", + "usnulfu", + "ussan-d", + "ussu", + "usṭralya", + "uttekki", + "uwanek", + "uwelleh", + "uwennit", + "uwgelhen", + "uxeddim-is", + "uxxam-nneɣ", + "uyalas", + "uyefki", + "uzamul", + "uzniq", + "uzrar", + "uzuzer", + "uzwiren", + "uɛekkaz", + "uɛiwed", + "uɣalen", + "uɣalent", + "uɣaleɣ", + "uɣaleɣ-d", + "uɣebbar", + "uɣen", + "uɣent", + "uɣersiw", + "uɣeɣ", + "uɣilas", + "uɣiwel", + "uɣris", + "uḍan", + "uḍar", + "uḥric", + "uṛumi", + "uṭṭun", + "uṭṭunen", + "viii-", + "vlc", + "wadad", + "waddal", + "waddud", + "wagaz", + "wagguren", + "wagi", + "wakaten", + "wakk", + "wakk-n", + "wallalen", + "wallaɣ-iw", + "walluy", + "wamber", + "wammasen", + "wanect", + "wannag", + "wansayen", + "wargaz", + "warrac", + "warraw-iw", + "wass-nni", + "wassen", + "wawal-a", + "wawal-is", + "wawway", + "wayen", + "wazalen", + "wazzun", + "waɛrur", + "waɣir-a", + "waṭlas", + "waṭṭan", + "waṭṭan-a", + "wefrag", + "wefran", + "weglam", + "wegmuḍ", + "wehmeɣ", + "wejden", + "welleh", + "weltma", + "wemkan", + "wenṭaṭ", + "weqmaḍ", + "werɛad", + "wesmil", + "wesɣan", + "wesɣar", + "wezɣal", + "weḥd-s", + "weḥdi", + "wid-nni", + "wideg", + "wizgan", + "wlad", + "wudem", + "wuggug", + "wukud", + "wul-is", + "wulɣu", + "wureɣ", + "wussan-nni", + "wuɣur", + "wuṭṭun", + "wwten", + "xaled", + "xalifa", + "xeddmeɣ", + "xedme", + "xellṣeɣ", + "xemsin", + "xerraṭa", + "xersum", + "yaf", + "yahia", + "yal", + "yalas", + "yales", + "yall", + "yara", + "yaweḍ", + "yawin", + "yebda-d", + "yebdan", + "yebdun", + "yebra", + "yebɣan", + "yebṭan", + "yecfa", + "yedder", + "yeddu", + "yeffe", + "yeffiɣ", + "yeffus", + "yefka-as", + "yefra", + "yeggran", + "yeggumma", + "yeggunin", + "yegla", + "yeglu", + "yegzem", + "yegzi", + "yehwa", + "yehwan", + "yejjan", + "yekk", + "yekka", + "yekkat", + "yekker", + "yekseb", + "yeldi-d", + "yelha-d", + "yella", + "yelḥeq", + "yemma", + "yemma-m", + "yemmal-d", + "yemmeslayen", + "yemmesten", + "yemxalafen", + "yemyuraren", + "yemɣaren", + "yenna-as-d", + "yenna-d", + "yenna-yasen", + "yennerni", + "yennulfa-d", + "yennum", + "yennumen", + "yensan", + "yenwa", + "yenṭeq", + "yeqbil", + "yeqqen", + "yergel", + "yerkeb", + "yerr", + "yerwan", + "yerza-d", + "yerzan", + "yerḥem", + "yerẓa", + "yes-s", + "yeshetrif", + "yeskelfen", + "yesli", + "yesmar-d", + "yesnen", + "yesnulfu", + "yesnuzun", + "yess", + "yessawel", + "yessaweḍ", + "yessaɣ", + "yessefken", + "yessefrak", + "yessekles", + "yessetma", + "yessi-s", + "yessin", + "yessiwḍen", + "yessnen", + "yessufeɣ", + "yessusem", + "yessuter-as", + "yessuturen", + "yesteqsi", + "yeswa", + "yesɛi", + "yetqelleq", + "yettaf", + "yettamen", + "yettas-d", + "yettazzal", + "yettaṭṭaf", + "yettaṭṭafen", + "yettban-d", + "yettbanen", + "yettbin-d", + "yettenfufud", + "yettheggi", + "yettili-d", + "yettmeslayen", + "yettnernin", + "yettraju", + "yettrebbin", + "yettruḥun", + "yettunefk", + "yettuneḥsab", + "yettusbadu", + "yettusemman", + "yettuwexren", + "yettuɣalen", + "yettwabeddel", + "yettwagdel", + "yettwakkes", + "yettwakksen", + "yettwaleqqem", + "yettwali", + "yettwanɣan", + "yettwarun", + "yettwasemman", + "yettwaseqdec", + "yettwasnen", + "yettwasqedcen", + "yettwaxedmen", + "yettwazen", + "yettwaḥkem", + "yettwaḥseb", + "yettxemmim", + "yettɛawad", + "yettḥaraben", + "yettḥaz", + "yettḥulfu", + "yewten", + "yewwet-d", + "yewwi", + "yewwi-tt", + "yewɛer", + "yewɛeṛ", + "yexdim", + "yexxamen-nsen", + "yezger", + "yezra", + "yeččan", + "yeɛfu", + "yeɛna", + "yeɛnan", + "yeɛqel", + "yeɛreḍ", + "yeɣleb", + "yeɣra", + "yeɣran", + "yeḍri", + "yeḍrun", + "yeḥma", + "yeḥrec", + "yeḥwaj", + "yeṭṭsen", + "yeẓdan", + "yeẓra", + "yeẓẓa", + "yi-d-yenna", + "yibenkan", + "yicenga", + "yid-es", + "yid-i", + "yid-wen", + "yideggan", + "yiderman", + "yidir", + "yiduba", + "yidularen", + "yifassen-is", + "yifecka", + "yifelfel", + "yifri", + "yigelliden", + "yigemmaḍ", + "yigenwan", + "yiger", + "yigerdan", + "yigrawen", + "yigumma", + "yijeǧǧigen", + "yikabaren", + "yilemẓi", + "yiles", + "yillu", + "yiman-", + "yiman-nnes", + "yiman-nsen", + "yimdukkal", + "yimeddukkal", + "yimejjayen", + "yimelyaren", + "yimensi", + "yimenzayen", + "yimenɣiyen", + "yimezwura", + "yimeɛḍar", + "yimeɣri", + "yimeɣriyen", + "yimeḥbas", + "yimeẓla", + "yimidyaten", + "yimir-nni", + "yimjuhad", + "yimuddiren", + "yimussnawen", + "yimɣi", + "yimḍanen", + "yimḍebbren", + "yimḍebren", + "yinebgawen", + "yinermisen", + "yinfafaden", + "yinzi", + "yiqerra", + "yir", + "yiran", + "yis-sen", + "yisalan", + "yiselsa", + "yisem-agi", + "yiseɣ", + "yismawen", + "yisnasen", + "yisteqsiyen", + "yiswiren", + "yisɣaren", + "yitri", + "yiv", + "yiweẓla", + "yiwunak", + "yixfawen", + "yixxamen", + "yizan", + "yizegza", + "yizenqan", + "yizmawen", + "yiɣes", + "yiɣi", + "yiɣil", + "yiɣrem", + "yiḍ-a", + "yiḍan", + "yiḍes", + "yiḍudan", + "yiḥder", + "yiḥulfan", + "yudnen", + "yufa-d", + "yufraren", + "yugaden", + "yugin", + "yuklalen", + "yuli", + "yulin", + "yusu-d", + "yuɛren", + "yuɣ", + "yuɣal-d", + "yuɣalen", + "yuɣen", + "yuḥwaǧen", + "zdaxel", + "zedɣeɣ", + "zeghmati", + "zemreɣ", + "zeɛma", + "zgan-d", + "ziɣ", + "zmiren", + "zzhir", + "zzhu", + "zziɣ", + "zzman", + "zṛiɣ", + "ččen", + "ččeɣ", + "ččiɣ", + "ǧaɛut", + "ǧǧen", + "ǧǧeɣ", + "ɛawnen", + "ɛebd", + "ɛebdelǧabar", + "ɛeddin", + "ɛelǧiya", + "ɛemmar", + "ɛerḍen", + "ɛerḍeɣ", + "ɛetman", + "ɛeṭṭleɣ", + "ɛla", + "ɛli", + "ɛmer", + "ɛririǧ", + "ɛyiɣ", + "ɣef", + "ɣezzifet", + "ɣileɣ", + "ɣillen", + "ɣlayen", + "ɣlin", + "ɣur-sent", + "ɣur-wen", + "ḍefreɣ", + "ḥafi", + "ḥamid", + "ḥareɣ", + "ḥbes", + "ḥdac", + "ḥekkmen", + "ḥellu", + "ḥemmad", + "ḥemmleɣ-tt", + "ḥilmi", + "ḥkuɣ", + "ḥlan", + "ḥninen", + "ḥsab", + "ḥsan", + "ḥwaǧen", + "ṛuma", + "ṛuḥ", + "ṛṛay-iw", + "ṣebreɣ", + "ṣṣfa", + "ṭam", + "ṭebbat", + "ṭerf", + "ṭṭelyan", + "ṭṭerk", + "ṭṭfen-t", + "ẓran", + "ẓṛeɣ", + "ẓẓay" + ] +} diff --git a/frontend/static/languages/kabyle_5k.json b/frontend/static/languages/kabyle_5k.json new file mode 100644 index 000000000000..8ee54ffb6bc5 --- /dev/null +++ b/frontend/static/languages/kabyle_5k.json @@ -0,0 +1,5007 @@ +{ + "name": "kabyle_5k", + "bcp47": "kab", + "orderedByFrequency": false, + "words": [ + "-ad", + "-as", + "-is", + "-nni", + "-paris", + "-wis", + "a-t-an", + "ababat", + "abadu", + "abelkim", + "abeqqeḍ", + "aberkan", + "abernus", + "aberraḥ", + "abeḥri", + "ableɣ", + "ablidi", + "abrid", + "abrid-agi", + "abrid-nsen", + "abriṭani", + "abuciḍan", + "abuniqi", + "abusṭawi", + "abǧawi", + "acciwen", + "acebbub", + "acebcal", + "acemmek", + "acinwat", + "acraḍ", + "acu-t", + "acu-tent", + "ad-as", + "ad-d", + "addal", + "adday", + "addayen", + "adduf", + "adeg-aɣella", + "adellel", + "adelsan", + "aderbal", + "aderɣal", + "adigan", + "adiwenni", + "adlis", + "adlis-is", + "adlis-nni", + "adrim", + "adrum", + "adu-twacult", + "adɣar", + "af-d", + "afares", + "afaris", + "afaylu-agi", + "afella", + "aferdis", + "afessas", + "afeɣ", + "afmiḍi", + "afrensis", + "afriwen", + "afriwen-is", + "afrux", + "afus", + "afɣanistan", + "agalis", + "agatu", + "agbur", + "agdazal", + "agdil", + "agdudan", + "agejdan", + "ageldan", + "ageldun", + "agellid", + "agelmim", + "agensas", + "agerdas", + "agerruj", + "agezlan", + "aggay", + "agilal", + "agim", + "aglizi", + "agman", + "agmar", + "agmuḍ", + "agmuḍan", + "agrakal", + "agreɣlan", + "agujil", + "agummu", + "agwni", + "agzul", + "ahad", + "ahendi", + "aheyyi", + "ahilen", + "ahmed-nacer", + "ajapuni", + "ajenwi", + "ajeǧǧig", + "ajjed", + "ak-", + "akabar", + "akatar", + "akaɣeḍ", + "akenni", + "akessar", + "akeyyef", + "akk-a", + "akk-agi", + "akk-d", + "akk-en", + "akk-nni", + "akkin", + "aklasiki", + "akruran", + "aksil", + "akufi", + "akwd", + "al-d", + "alami", + "alamma", + "alammi", + "alarmi", + "alatini", + "albanya", + "alemmas", + "allaɣ-iw", + "allen-nsen", + "allus", + "alluy", + "almani", + "almend", + "almi", + "alugen", + "alɣem", + "alɣuɣ", + "amagday", + "amagrad", + "amaklas", + "amalal", + "amalay", + "amallal", + "amarag", + "amaray", + "amarir", + "amaruz", + "amaswaḍ", + "amatu", + "amawal", + "amaway", + "amaynu", + "amazan", + "amazighe", + "amazzal", + "amaɣnu", + "amaṭṭaf", + "amcic-nni", + "amcum", + "amdakel", + "amdakkel", + "amdya", + "amecwar-is", + "ameddakkel", + "amedyaz", + "ameggaz", + "amegrud", + "amek", + "ameksa", + "amelyun", + "amennuɣ", + "amennuɣ-is", + "amensay", + "amenḍar", + "amenẓaw", + "amerkanti", + "amesbaṭli", + "ameskar", + "ameslaw", + "ameslay", + "amesri", + "amessarti", + "amezruy", + "amezwaru", + "amezwer", + "amezzwaru", + "ameɣlal", + "ameɣras", + "ameɣri", + "ameɣtu", + "ameḥbus", + "ameṛkanti", + "ameṛṛuk", + "ameẓlu", + "ameẓẓyan", + "amhad", + "amhaz", + "amidadi", + "amidya", + "amiran", + "amjahed", + "amkan", + "amkuẓ", + "amnar", + "amnay", + "amneɣ", + "amqqran", + "amrar", + "amrig", + "amsal", + "amsaltu", + "amseksum", + "amselḥu-anemhal", + "amtawa", + "amtiweg", + "amuddir", + "amusnaw", + "amussu", + "amwanes", + "amyag", + "amyaraw", + "amyiwen", + "amzun", + "amɛellem", + "amɣar", + "amɣaw", + "amḍan", + "amḥaddi", + "anadi", + "anafuk", + "anagar", + "anamek", + "anamek-is", + "anaw", + "anawen", + "anaẓur", + "anda-nniḍen", + "anda-tt", + "anebdu", + "anect", + "anect-nni", + "anedbal", + "anef", + "anef-as", + "anef-iyi", + "aneflay", + "aneggar", + "aneggaru-a", + "aneggaru-agi", + "aneggez", + "anegmar", + "anegzum", + "anehhar", + "anejmuɛ", + "anekcam", + "anekcum", + "anekruf", + "anemhal", + "anesbaɣur", + "anezgum", + "anezway", + "anezwu", + "aneɣ", + "aneɣfal", + "aneɣmas", + "anfa", + "anfafad", + "anican", + "anida-ten", + "anili", + "aniɣer", + "anmetti", + "annar", + "annay", + "annaɣ", + "annect-a", + "annecta", + "ansayen", + "anumidi", + "anwa-t", + "anyir", + "anɣal", + "anɣel", + "anṣuf", + "anẓar", + "anẓid", + "apṛuksi", + "aqader", + "aqbayli", + "aqbu", + "aqbuṛ", + "aqcic-nni", + "aqdim", + "aqjun", + "aqjun-nni", + "aql-ak", + "aql-aɣ", + "aql-ik", + "aql-iyi", + "aquran", + "arama", + "arameɣtu", + "aratak", + "araz", + "araǧu", + "ardekal", + "arekti", + "areqqaq", + "arewway", + "arezki", + "areẓqi", + "argaz", + "argaz-a", + "argaz-is", + "argaz-iw", + "argaz-nni", + "arif", + "aristote", + "arjentin", + "arkawal", + "armad", + "armeɣtu", + "arminya", + "armud", + "arrac", + "arraw-is", + "arraw-iw", + "arrif", + "arurad", + "arured", + "arusi", + "aruɣ", + "as-d-", + "as-inin", + "as-iniɣ", + "as-yehwa", + "as-yenna", + "as-yennan", + "asaka", + "asalel", + "asali", + "asallaf-is", + "asalu", + "asamar", + "asammar", + "asarag", + "asaru", + "asaru-nni", + "asawen", + "asaḍ", + "asaḍas", + "asbeddi", + "asebter", + "asefk", + "asefrak", + "asefrek", + "asefru", + "asegbar", + "aseggas", + "aseggem", + "asegwas", + "asegzawal", + "asegzi", + "asekker", + "asekkeṛ", + "asekkil", + "asekkir", + "aseklan", + "aseklu", + "aselkem", + "aselkim", + "asemdu", + "asemlal", + "asemmad", + "asemmili", + "asemmiḍ", + "asemran", + "asemɣer", + "asen", + "asen-d", + "asenfaṛ", + "asenker", + "asenqad", + "asenqed", + "asenqes", + "asensu", + "asent", + "asentel-agi", + "asentem", + "aseqdac-agi", + "aseqdec", + "aserdas", + "aserdun", + "asertan", + "aserti", + "asesmel", + "asesteb", + "asettengel", + "asewwi", + "asexdem", + "aseḥbes", + "aseḥbiber", + "asfel", + "asfugel", + "asfuggel", + "asgunfu", + "asideg", + "asif", + "asiggez", + "asigna", + "asignew", + "asirem", + "asiwel", + "asiweḍ", + "asizdeg", + "asiɣzef", + "asiẓi", + "asiẓreg", + "askan", + "asleɣmay", + "asma", + "asmekti", + "asmel-inek", + "asmutti", + "asnas", + "asnawan", + "asnerni", + "asnirem", + "asnudran", + "asnulfu", + "asrag", + "ass-", + "ass-a", + "ass-n", + "ass-nni", + "assa", + "assaɣ", + "assaɣen", + "assufeɣ", + "asteqsi", + "asunded", + "asurdu", + "asusam", + "asuter", + "aswir", + "asya", + "asɣal", + "asḥissef", + "atan", + "ataram", + "atas", + "ataya", + "atg", + "atmaten", + "atni", + "atrar", + "atraren", + "avidyu", + "avirus-a", + "awadem", + "awah", + "awal-agi", + "awal-is", + "awal-iw", + "awal-nsen", + "awanak", + "awanek", + "awaqqur", + "awelleh", + "awennez", + "awennit-agi", + "aweqqas", + "awer", + "awexxer", + "awezɣi", + "awid", + "awint", + "awiǧit", + "awniri", + "awraɣ", + "awrir", + "awudem", + "awurman", + "awḍen", + "axater", + "axateṛ", + "axeddim", + "axemmem", + "axxam-a", + "axxam-is", + "axxam-nneɣ", + "axxam-nni", + "ay-a", + "ay-nni", + "aya", + "aydeg", + "ayeffus", + "ayefus", + "ayen-nni", + "ayen-nniḍen", + "ayfus", + "ayla-nsen", + "ayla-s", + "ayt", + "ayyi", + "ayɣeṛ", + "azadur", + "azal-is", + "azalen", + "azarug-is", + "azaɣar", + "azdal", + "azedgan", + "azegza", + "azegzaw", + "azekka-nni", + "azem", + "azemni", + "azemz", + "azerfan", + "azewwaɣ", + "azeṭṭa", + "azgen", + "aziraz", + "azmul", + "azniq", + "azref", + "azrem", + "azuran", + "azzayri", + "aččar", + "aččuran", + "aɛdaw", + "aɛebbuḍ", + "aɛeggal", + "aɛekkaz", + "aɛeyyer", + "aɛlayan", + "aɛmar", + "aɛni", + "aɛzal", + "aɣ-", + "aɣ-d", + "aɣ-d-", + "aɣ-d-yenna", + "aɣanib", + "aɣarim", + "aɣawas", + "aɣbalu", + "aɣbel", + "aɣbel-a", + "aɣebbar", + "aɣella", + "aɣelnaw", + "aɣelsan", + "aɣerbaz", + "aɣerfan", + "aɣersiw", + "aɣewwaṛ", + "aɣezfan", + "aɣezzfan", + "aɣeɣ", + "aɣilas", + "aɣilif", + "aɣir", + "aɣlad", + "aɣlan", + "aɣlif", + "aɣmis", + "aɣrab", + "aɣref", + "aɣrib", + "aɣucaf", + "aɣurar", + "aɣṛum", + "aḍris", + "aḍu", + "aḥader", + "aḥbib", + "aḥeddad", + "aḥeqqani", + "aḥeqqi", + "aḥerfi", + "aḥezzeb", + "aḥlil", + "aḥmayan", + "aḥmed", + "aḥnin", + "aḥraz", + "aḥric", + "aḥuddu", + "aḥulfu", + "aṛezqi", + "aṛumani", + "aṛumi", + "aṭas", + "aṭelyani", + "aṭlasi", + "aṭṭan", + "aṭṭan-a", + "aṭṭan-agi", + "aẓayer", + "aẓeffun", + "aẓekka", + "aẓelmaḍ", + "baba-k", + "baba-m", + "baba-tsen", + "bade-wurtemberg", + "badi", + "badis", + "barṣa", + "basse-saxe", + "baṭlimus", + "bbw", + "bdan", + "bdant", + "bdun", + "beddeɣ", + "beddlen", + "beddu", + "bejaia", + "belkacem", + "belqasem", + "belɛebbas", + "belɛen", + "belɛid", + "bennay", + "bennun", + "beqqeḍ", + "beqqu", + "beramtane", + "berka", + "berqa", + "berru", + "bexlaf", + "bezzaf", + "bgayet", + "bih", + "bir", + "bisekstil", + "bni", + "bniɣ", + "brahim", + "brandshortname", + "briṭanya", + "budawed", + "budrar", + "bugud", + "bulgarya", + "bumerdas", + "bumilkar", + "burgiba", + "burkina", + "burǧ", + "bussaɛd", + "buɛlam", + "buɣni", + "buḍyaf", + "bxir", + "bɣiɣ", + "bɣun", + "bɣuɣ", + "bḍan", + "bḍun", + "c'est", + "cabḥa", + "cadli", + "carlu", + "caɛban", + "cbirdu", + "ccedda", + "ccehwa", + "ccek", + "ccer", + "ccerfa", + "ccetla", + "ccfawat", + "ccfaya", + "ccil", + "ccinwa", + "ccix-nni", + "cciṭan", + "ccna", + "ccrab", + "ccreɛ", + "ccwal", + "ccwi", + "ccɣel", + "ccḍeḥ", + "cebḥen", + "cedda", + "cedhaɣ", + "cemmini", + "cennun", + "ceɣleɣ", + "ceḍḥeɣ", + "chabane", + "cican", + "cili", + "cinwa", + "cix", + "ciṭ", + "cliɛen", + "ctamber", + "cukkeɣ", + "cwal", + "cwiyya", + "cwiṭ", + "cɣel", + "d-afeɣ", + "d-asen", + "d-aseɣ", + "d-awḍen", + "d-aɣen", + "d-cliɛeɣ", + "d-fken", + "d-ibedden", + "d-igellun", + "d-iger", + "d-iheyya", + "d-ikecmen", + "d-ilal", + "d-ilin", + "d-imeslay", + "d-immalen", + "d-inin", + "d-iteffɣen", + "d-itteddun", + "d-ittunefken", + "d-izgan", + "d-iḍerrun", + "d-iḥella", + "d-iḥelli", + "d-kecmen", + "d-kkren", + "d-kkreɣ", + "d-mazal", + "d-naf", + "d-nebder", + "d-nerr", + "d-nesmekti", + "d-nniɣ", + "d-nufa", + "d-qqaren", + "d-qqareɣ", + "d-rnun", + "d-rren", + "d-rreɣ", + "d-sbedden", + "d-sersen", + "d-suffɣen", + "d-taf", + "d-tas", + "d-taweḍ", + "d-tawi", + "d-tawiḍ", + "d-tebda", + "d-teffeɣ", + "d-tefk", + "d-tefkeḍ", + "d-tekcem", + "d-telli", + "d-tenna", + "d-teqqar", + "d-teqqareḍ", + "d-terreḍ", + "d-ters", + "d-tettban", + "d-tewweḍ", + "d-tewwi", + "d-tezzi", + "d-teɣli", + "d-tili", + "d-tlul", + "d-tusa", + "d-tusiḍ", + "d-uɣalen", + "d-uɣaleɣ", + "d-wwin", + "d-wwḍen", + "d-yali", + "d-yas", + "d-yasen", + "d-yawi", + "d-ye", + "d-yebder", + "d-yedda", + "d-yeddan", + "d-yeffeɣ", + "d-yeffɣen", + "d-yegla", + "d-yeglan", + "d-yeglu", + "d-yeglun", + "d-yekcem", + "d-yekk", + "d-yekker", + "d-yekkren", + "d-yeldi", + "d-yelhan", + "d-yelhu", + "d-yellan", + "d-yelli", + "d-yemmeslay", + "d-yemmeslayen", + "d-yennan", + "d-yennulfa", + "d-yeqqar", + "d-yeqqim", + "d-yeqqimen", + "d-yerbeḥ", + "d-yernan", + "d-yernu", + "d-yernun", + "d-yerra", + "d-yerran", + "d-yerren", + "d-yersen", + "d-yesbedden", + "d-yessawel", + "d-yessawlen", + "d-yessuffeɣ", + "d-yettak", + "d-yettaken", + "d-yettas", + "d-yettasen", + "d-yettban", + "d-yettbanen", + "d-yettilin", + "d-yettmeslayen", + "d-yettunefken", + "d-yewweḍ", + "d-yexdem", + "d-yexleq", + "d-yezga", + "d-yezgan", + "d-yeǧǧa", + "d-yeɣli", + "d-yeḍra", + "d-yeṭṭef", + "d-yili", + "d-yufa", + "d-yufan", + "d-yufi", + "d-yufraren", + "d-yuran", + "d-yusa", + "d-yuzgan", + "d-yuɣ", + "d-zzin", + "d-ǧǧan", + "d-ṭṭfeɣ", + "dacu", + "dadda", + "dallet", + "daw-a", + "daxel", + "daxel-is", + "daya", + "dayen", + "daɛda", + "daɣ", + "daɣen", + "ddabex", + "ddant", + "ddar", + "ddaw-as", + "ddel", + "ddeqs", + "ddeqs-is", + "ddiq", + "ddiɣ", + "ddmen", + "ddren", + "ddu", + "dduklen", + "ddula", + "ddun", + "ddunit-a", + "ddunt", + "ddur", + "ddurt", + "ddurt-a", + "dduḥ", + "dduṛ", + "ddwa", + "ddyana", + "ddɣel", + "deffir", + "deffir-i", + "deg-k", + "deg-nneɣ", + "degmi", + "degsen", + "dges", + "dgi", + "di-n", + "dihya", + "dindin", + "dinn", + "diɣenna", + "djamel", + "djerad", + "djurdjura", + "draɛ", + "dujember", + "dujembeṛ", + "dunnit", + "duru", + "dɣa", + "e-mail", + "efk", + "er-s", + "ettut", + "ečč", + "facal", + "fahim", + "faken", + "falesṭin", + "farid", + "faṭima", + "federer", + "fehmen", + "fehmeɣ", + "fell-", + "fell-ak", + "fell-akent", + "fell-aneɣ", + "fell-asent", + "fell-awen", + "fell-aɣ", + "fella-s", + "felli", + "fenyan", + "ferhat", + "ferru", + "ferruǧa", + "ferḥen", + "ferḥeɣ", + "fessusen", + "feṛḥeɣ", + "ffreɣ", + "ffɣen-d", + "ffɣeɣ", + "fhimeɣ", + "firmus", + "fiḥel", + "fkan-as", + "fkan-d", + "fken", + "fkeɣ", + "fkiɣ", + "fodil", + "franṣa", + "fukkeɣ", + "furulu", + "fuṛaṛ", + "fṛansa", + "gar-", + "gar-aneɣ", + "gar-asent", + "gar-i", + "garasen", + "ger-asen", + "gezmen", + "geɣ", + "gganeɣ", + "ggten", + "ggummaɣ", + "gma-k", + "gma-s", + "gmas", + "google", + "gren", + "gren-d", + "guraya", + "gzan", + "gzem", + "gziɣ", + "gzun", + "ha-t-a", + "ha-ten-an", + "ha-tt-an", + "harun", + "hata", + "hatan", + "haǧira", + "hca", + "heddren", + "heggan", + "heggaɣ", + "hewwari", + "heḍṛeɣ", + "hibel", + "hiempsal", + "hirziguvina", + "hrawen", + "huawei", + "i-d", + "ibabaten", + "iban-d", + "iban-iyi-d", + "ibanen", + "ibaskiyen", + "ibeddel", + "ibedden", + "ibeddi", + "ibeddlen", + "ibeddun", + "ibelkimen", + "ibenkan", + "ibennun", + "iberraniyen", + "iberreḥ-d", + "ibeɛden", + "ibiten", + "ibugen", + "ibulisen", + "iburɣas", + "ibɣan", + "ibɣu", + "icawiyen", + "icebba-yi", + "icebḥen", + "icenfiren", + "icennu", + "iceqfan", + "icerreg", + "iceɣben", + "iceṭṭiḍen", + "icuban", + "icudd", + "id-", + "idd", + "ideflawen", + "ideggan", + "iderman", + "idgan", + "idiganen", + "idir", + "idiren", + "idis", + "idisan", + "idlisen-a", + "idlisen-is", + "idmaren", + "idrasen", + "idrimen", + "idularen", + "idum", + "idurar", + "ifadden", + "ifakk", + "ifassen", + "ifassen-nsen", + "ifassen-nwen", + "ifatusen", + "ifawatayen", + "ifazen", + "ifecka", + "ifehhem", + "ifehmen", + "ifelfel", + "ifellaḥen", + "iferdisen", + "iffer", + "iffeɣ", + "iflisen", + "ifransisen", + "ifrax", + "ifremliyen", + "ifriqiyen", + "ifsan", + "ifukal", + "ifurkan", + "ifurken", + "ifut", + "ifyar", + "igadiren", + "igamanen", + "igan", + "igarawen", + "igawawen", + "igber", + "igdawalen", + "igebren", + "igedlen", + "igelfan", + "igellilen", + "igellu", + "igelmimen", + "igenni", + "igensasen", + "iger-d", + "igerdan", + "igerrzen", + "igerzen", + "ighil", + "igiman", + "igli", + "igmamen", + "igrawen", + "igraɣlanen", + "igujilen", + "igzem", + "igzem-itt", + "igṭaṭ", + "ihedder", + "iheddeṛ", + "iheddren", + "iheggaren", + "iheyya", + "ihuzz", + "ii-", + "ijbed", + "ijebbed", + "ijeǧǧigen", + "ijga", + "ijqiwen", + "ikabaren", + "ikellex", + "ikemmel", + "ikerri", + "ikesben", + "ikeččem", + "ikilumitren", + "ikkes", + "ilal", + "ilaq-ak", + "ilaq-aɣ", + "ilaq-iyi", + "ilaqen", + "ilat", + "ilaw", + "ilel", + "ilemmasen", + "ilemẓiyen", + "ileqman", + "ili-kem", + "iliɣ", + "illul", + "ilmaten", + "ilul", + "ilul-d", + "ilɣa", + "imac", + "imahilen", + "imakaren", + "imalen", + "iman-is", + "iman-nkent", + "iman-nnes", + "iman-nsen", + "iman-nsent", + "imasiḥiyen", + "imastanen", + "imawen", + "imawlan-is", + "imawlan-iw", + "imawlan-nsen", + "imayl", + "imcac", + "imdanen", + "imecṭaḥ", + "imeddukal-is", + "imeddukkal", + "imedlen", + "imedlis", + "imejjayen", + "imekwan", + "imelyaṛen", + "imelyunen", + "imenɣiyen", + "imesdurar", + "imesla", + "imeslayen", + "imeslayen-is", + "imesli", + "imessartiyen", + "imezdaɣ-is", + "imeḍqan", + "imeḥbas", + "imeṭṭi", + "imeẓla", + "imeẓẓuɣen", + "imeẓẓyanen", + "imferǧen", + "imggaliyen", + "iminig", + "iminigen", + "imir", + "imir-nni", + "imiranen", + "imiḍanen", + "imniren", + "imrabḍen", + "imrigen", + "imsaɣen", + "imtiwgen", + "imucaɣ", + "imudd", + "imuhaɣ", + "imula", + "imusnawen", + "imuta", + "imuḍan", + "imwekkel", + "imyuraren", + "imɣan", + "imɣi", + "imḍebber", + "imḍebbren", + "inagan", + "inaw", + "ineflayen", + "ineggura", + "inegzumen", + "inejmuɛen", + "inek", + "inelmaden", + "inem", + "inemhalen", + "ineqqen", + "ineqqisen", + "inermisen", + "ineɣ", + "ineɣlafen", + "ineḍruyen", + "ini-asen", + "ini-yi-d", + "ini-ynes", + "inig", + "inigan", + "inigi", + "initen", + "iniɣ", + "inmettiyen", + "inna-yas", + "innexsys", + "inu", + "inuba", + "inuda", + "inumak", + "inumidiyen", + "inurifen", + "inɣa", + "ipiksilen", + "ipikur", + "iqabel", + "iqburen", + "iqdimen", + "iqeblen", + "iqedcen", + "iqeddacen", + "iqeddcen", + "iqelleb", + "iqerra", + "iqqar", + "iqqenen", + "iqwem", + "irden", + "irefden", + "irgazen", + "irmad", + "irmawen", + "irumaniyen", + "irumiyen", + "iruḥ", + "iruḥ-d", + "isaffen", + "isalan", + "isalen", + "isallan", + "isallen", + "isalli", + "isawel", + "isdawanen", + "isebdaden", + "isebtaren", + "isefk", + "isefrek", + "iseg", + "isegassen", + "iseggasen", + "iseggasen-a", + "iseggem", + "isekla", + "isel", + "isellek", + "isellem", + "iselmaden", + "iselman", + "iselsa", + "isem", + "isem-ik", + "isem-im", + "isem-is", + "isem-iw", + "isemma", + "isemmaḍen", + "isenfaren", + "isennanen", + "isenned", + "isenqaden", + "iseqdacen", + "iserdasen-is", + "iserreḥ", + "isertanen", + "isertayen", + "isertiyen", + "iseɣ", + "iseɣwan", + "iseɣẓanen", + "iseḥḥan", + "isfuyla", + "isger", + "isig", + "isiɣzaf", + "isiḍen", + "isli", + "ismawen", + "ismawen-is", + "ismawen-nsen", + "ismenyifen", + "ismilen", + "isnajyanen", + "isnasen", + "ispamen", + "issaweḍ", + "issefk", + "isseggasen", + "issuter", + "isumar", + "isura", + "isurdiyen", + "isuter", + "isuɣ", + "iswi-nsen", + "isɛa", + "isɛan", + "isɣaren", + "iteddun", + "iteffeɣ", + "itekkan", + "itent", + "itetten", + "itezzin", + "itteddun", + "itteffeɣ", + "ittekki", + "ittmeslay", + "iwalan", + "iwali", + "iwata", + "iwatan", + "iwaɛren", + "iwaḍiyen", + "iwekked-d", + "iwellihen", + "iwenniten", + "iwet", + "iwetmen", + "iweɛṛen", + "iweṣṣa", + "iwlalen", + "iwmi", + "iwtal", + "iwudam", + "iwurmanen", + "iwwi", + "ixeddamen", + "ixeddem", + "ixeddmen", + "ixedmen", + "ixelqen", + "ixesren", + "ixf", + "ixulfen", + "ixus", + "ixussen", + "ixuṣ", + "ixuṣṣen", + "ixxamen", + "ixxamen-nsen", + "iyi", + "iyi-d-tiniḍ", + "iyi-d-yenna", + "iyya", + "izaden", + "izamulen", + "izdayen", + "izeggaɣen", + "izemren", + "izen-agi", + "izenqan", + "izerfan", + "izerfan-is", + "izerman", + "izerzer", + "izimer", + "izirig", + "izirigen", + "izlan", + "izli", + "izmawen", + "izmiren", + "iznan", + "izumal", + "izuyaz", + "izwilen", + "iǧadarmiyen", + "iɛawed", + "iɛedda-d", + "iɛeddan", + "iɛeddi", + "iɛekkuren", + "iɛelleq", + "iɛerḍen", + "iɛetmaniyen", + "iɛewwiqen", + "iɛeẓẓugen", + "iɛraben", + "iɛudiwen", + "iɛǧeb-iyi", + "iɣallen", + "iɣaḍ-iyi", + "iɣbaren", + "iɣeblan", + "iɣed", + "iɣef", + "iɣer", + "iɣerbazen", + "iɣes", + "iɣil", + "iɣimi", + "iɣlanen", + "iɣmisen", + "iɣrem", + "iɣunab", + "iɣzer", + "iḍ-agi", + "iḍarren-is", + "iḍelmen", + "iḍemnen", + "iḍerru", + "iḍerrun", + "iḍudan", + "iḍul", + "iḍumman", + "iḥar", + "iḥaz", + "iḥder", + "iḥebbes", + "iḥebsen", + "iḥeddaden", + "iḥedran", + "iḥedren", + "iḥekkmen", + "iḥella-d", + "iḥemlen", + "iḥemmel-iyi", + "iḥemmlen", + "iḥettem", + "iḥettmen", + "iḥricen", + "iḥulfan", + "iḥuza", + "iḥuzan", + "iṛumiyen", + "iṛuḥen", + "iṣeggem", + "iṣeḥḥa", + "iṣeḥḥan", + "iṭarren", + "iṭerkiyen", + "iṭij", + "iṭṭef", + "iẓer", + "iẓeḍwan", + "iẓra", + "iẓuran", + "jebden", + "jeddi", + "jelfa", + "jennad", + "jeǧǧiga", + "jijel", + "jmiɛ", + "jsmb", + "jurjura", + "jurjya", + "k-t-id", + "kabylie", + "kaci", + "kahina", + "kateb", + "kecmen-d", + "kecment", + "kecmeɣ", + "kem", + "kemlen", + "kemmlen", + "keččmen", + "keṛheɣ", + "kfan", + "kfun", + "kifkif-iten", + "kirgizistan", + "kkaten", + "kkateɣ", + "kkawen", + "kker", + "kkes-d", + "kkiɣ", + "kkreɣ", + "kksen", + "kovalev", + "krad", + "kraḍt", + "krim", + "ksen", + "kuiper", + "kulumbya", + "kulunil", + "kunemti", + "kunwi", + "kuruna", + "kuz", + "kuṛuna", + "kuṛunavirus", + "kṛad", + "kṛaḍ", + "ladɣa", + "lakked", + "lakul", + "lalman", + "laman", + "lameɛna", + "laqen", + "larbɛa", + "lawan-a", + "laɛfu", + "laɛnaya", + "laɛqel", + "laɛḍil", + "laṛebɛa", + "laṣel-is", + "laṣel-nsen", + "lbacir", + "lbak", + "lbal", + "lbanka", + "lbatima", + "lbaylek", + "lbaḍna", + "lbaṭaṭa", + "lbaṭel", + "lberrani", + "lbirra", + "lburǧ", + "lbusṭa", + "ldint", + "lebda", + "lebni", + "lebyar", + "lebɣi-nsen", + "lebɣi-s", + "lebḥer", + "lecyax", + "lecɣal", + "ledwar", + "lefhama", + "legliz", + "legniz", + "lehlak", + "lehmum", + "lehwa", + "lejdud-is", + "lejdud-nneɣ", + "lekmal", + "lekmal-is", + "lemden", + "lemdiyyet", + "lemgarda", + "lemmdeɣ", + "lemri", + "lemɛiwna", + "lemɣawla", + "lemḥadra", + "leqder", + "leqdic", + "leqdic-a", + "leqdic-agi", + "leqdic-nsen", + "leqhawi", + "leqqem", + "leqran", + "leqriḥ", + "leqseḥ", + "leqwanen", + "leqyud", + "leqṣer", + "lerbaḥ", + "lerwaḥ", + "leslaḥ", + "leswaq", + "letnayen", + "lettkal", + "lewhi", + "lewnis", + "lewqat", + "lewḥuc", + "lewṣayat", + "lexbaṛ", + "lexber", + "lexdeɛ", + "lexlas", + "lexlawi", + "lexrif", + "lexsara", + "lexyal", + "lexṣaṣ", + "lezzayer", + "leǧwameɛ", + "leɛfu", + "leɛmer", + "leɛmer-is", + "leɛmeṛ-is", + "leɛnaya-k", + "leɛnaya-m", + "leɛqed", + "leɛqel", + "leɛqel-is", + "leɛyub", + "leɛzib", + "leɣla", + "leɣlaḍ", + "leɣrama", + "leḥkem", + "leḥlu", + "leḥmala", + "leḥram", + "leḥrir", + "leḥris", + "leḥsabat", + "leḥya", + "leḥyuḍ", + "leḥḥuɣ", + "lfal", + "lfeṛḥ", + "lfeṭṭa", + "lhan", + "lhem", + "lhiba", + "limam", + "limamat", + "limarat", + "line-height", + "liser", + "lixsas", + "lixṣaṣ", + "liḥala", + "ljehd", + "ljemɛa", + "lka", + "lkanun", + "lkar", + "lkazirna", + "lkaɣeḍ", + "llah", + "llakul", + "llant-d", + "llebsa", + "lleft", + "lliɣ", + "llufanat", + "lluzin", + "lluzinat", + "lluẓeɣ", + "lmalayek", + "lmarikan", + "lmaɛna", + "lmaḍerra", + "lmektub", + "lmelk", + "lmelḥ", + "lmendad", + "lmendad-ik", + "lmendad-im", + "lmendad-nwen", + "lmerta", + "lmeɛna", + "lmeɛna-s", + "lmeɣreb", + "lmitrat", + "lmuhub", + "lmulud", + "lmuludeyya", + "lmumen", + "lmus", + "lmut", + "lmuḥal", + "lounes", + "lounis", + "lpari", + "lqanun", + "lqay", + "lqayed", + "lqaɛ", + "lqaḍi", + "lqebṭan", + "lqedd-is", + "lqehwa", + "lqem", + "lqem-agi", + "lqerḥ", + "lqid", + "lubnan", + "lumur", + "lwad", + "lwali", + "lwaǧeb", + "lwaḥid", + "lwelha", + "lwelha-nsen", + "lweqt-nni", + "lwilaya", + "lwiz", + "lxalat", + "lxedma", + "lxeḍra", + "lxilafa", + "lxiq", + "lxir", + "lyazid", + "lǧal-ik", + "lǧal-nwen", + "lǧar", + "lǧehd", + "lǧemɛa", + "lǧennet", + "lǧerra", + "lǧib-is", + "lǧida", + "lǧil", + "lǧiran", + "lɛada", + "lɛamma", + "lɛarc", + "lɛeqqal", + "lɛerc", + "lɛeskeṛ", + "lɛiraq", + "lɣaci", + "lɣella", + "lɣerba", + "lɣiḍ-nsen", + "lḥala", + "lḥalat", + "lḥara", + "lḥaǧ", + "lḥaṣul", + "lḥaṣun", + "lḥed", + "lḥekkam", + "lḥemmam", + "lḥeqq", + "lḥerrac", + "lḥir", + "lḥirak", + "lḥirfat", + "lḥiḍ", + "lḥukuma", + "lḥun", + "lḥusin", + "lḥuɣ", + "m-t-id", + "macahu", + "maci", + "maggu", + "magu", + "makken", + "malika", + "mammeri", + "marikan", + "masensen", + "masinisa", + "mass-nsen", + "matub", + "mayyu", + "mazal", + "mazal-aɣ", + "mazal-ikem", + "mazal-iten", + "mazal-itt", + "mači", + "maɣef", + "maɣres", + "maḍi", + "maḥmud", + "maṛtina", + "maṣer", + "mbarek", + "mbaɛd", + "mcb", + "mebla", + "mebɛid", + "mechur", + "mechuren", + "medden", + "meghzifene", + "mehdi", + "mellal", + "mellulen", + "melmi", + "melyun", + "mendas", + "mengellat", + "menguellet", + "menhu", + "mennaw", + "menwala", + "meqqer", + "meqqran", + "meqqren", + "meqren", + "merr", + "merra-nsen", + "meskin", + "meskint", + "meslayen", + "meslayeɣ", + "mesmamda", + "messali", + "messi", + "mestɣanem", + "mesɛud", + "mesṭafa", + "metallica", + "metwal", + "mezyan", + "meɛni", + "meɛṭub", + "meḥsub", + "meṛṛa", + "meṛṛuk", + "meẓyan", + "meẓẓiyen", + "meẓẓiyet", + "meẓẓiyeɣ", + "meẓẓiyeḍ", + "meẓẓiyit", + "mhenni", + "mhidi", + "miḥyaf", + "mlalen", + "mlilen", + "mlileɣ", + "mliḥ", + "mmektaɣ-d", + "mmel", + "mmeslay", + "mmeslayen", + "mmi-k", + "mmis", + "mmuteɣ", + "mnayel", + "mozilla", + "mraw", + "msefhamen", + "mtawan", + "mucaɛen", + "mulac", + "mulud", + "murad", + "muretanya", + "muriṭanya", + "musku", + "mustapha", + "muḥ", + "muḥli", + "mxalfa", + "mɛatqa", + "mɛemmri", + "mḥme", + "n'est", + "nabil", + "nacer", + "nadiɣ", + "naqal", + "naweḍ", + "nawi", + "naṣer", + "nbeddel", + "nebda", + "nebder", + "nebɣi", + "neddi", + "neffeɣ", + "nefhem", + "nefru", + "nekker", + "nekkes", + "nekki", + "nelhi", + "nelḥa", + "nemmeslay", + "nemmet", + "nemmut", + "nenna-d", + "nennum", + "neq", + "neqqar", + "neqqim", + "nermes", + "nerreẓ", + "nerwel", + "nerǧu", + "nesli", + "nessawal", + "nesseḥbiber", + "nessin", + "nessiweḍ", + "nesteqsa", + "nesɛedda", + "nettak", + "nettaru", + "nettaru-t", + "nettat", + "nettawi", + "nettili", + "nettini", + "nettnadi", + "nettraǧu", + "nettruḥu", + "nettu", + "netturar", + "nettuɣal", + "nettwassen", + "newjed", + "newwal", + "newwi", + "nexdim", + "nezdi", + "nezga", + "nezmir", + "nezweǧ", + "nezzeh", + "neǧǧ", + "neǧǧa", + "neɛreḍ", + "neḍfer", + "neḥbes", + "niqal", + "nisma", + "niɣ", + "niḍen", + "nkemmel", + "nlaq", + "nmuqel", + "nnan", + "nnan-as", + "nnaɣ", + "nnbi", + "nnefxa", + "nnefṣ", + "nnehta", + "nneqma", + "nnes", + "nneyya", + "nnfaq", + "nnger", + "nni", + "nnig", + "nnig-s", + "nnijer", + "nniqal", + "nniven", + "nniya", + "nniɣ", + "nniɣ-as", + "nniɣ-asen", + "nniḍen", + "nnsent", + "nnuba", + "nnumeɣ", + "nqabel", + "nqelleb", + "nruḥ", + "nsen", + "nsent", + "nteddu", + "ntett", + "nudaɣ", + "nufa", + "nufa-d", + "nugad", + "nugi", + "numin", + "nurar", + "nuredin", + "nutni", + "nuɣ", + "nuɣal", + "nxeddem", + "nɛawed", + "nɛedda", + "nɛeṭṭel", + "nɣan", + "nɣel", + "nɣil", + "nɣiɣ", + "nḥader", + "nḥemmel", + "nṛuḥ", + "onu", + "pmid", + "productname", + "protonmail", + "pulunya", + "qabel", + "qablen", + "qadren", + "qbala", + "qbilen", + "qebleɣ", + "qedcen", + "qerben", + "qessiḥet", + "qimen", + "qirṭa", + "qqar", + "qqaren", + "qqaren-as", + "qqaren-asen", + "qqaren-d", + "qqarent", + "qqareɣ-as", + "qqen", + "qqimemt", + "qqiment", + "qqlen", + "qqnen", + "qrad", + "qsenṭina", + "qṛib", + "racid", + "ramdane", + "rbaḥa", + "rebbi", + "rebɛa", + "rebɛin", + "rebḥen", + "refdent", + "refdeɣ", + "remdane", + "remṭan", + "reyyec", + "rezqi", + "rfan", + "rfiɣ", + "riad", + "riɣ", + "rnu-as", + "rnu-d", + "rnut-as", + "rnuɣ", + "rqiq", + "rqiqen", + "rradyu", + "rregmat", + "rren", + "rret", + "rrezg", + "rreɣ", + "rreḥba", + "rriɣ", + "rriḥa", + "rruman", + "rrwaḥ", + "rsent", + "rsf", + "rsquo", + "rumanya", + "ruɣ", + "ruḥ", + "ruḥeɣ", + "rzan", + "rziɣ", + "rzun", + "rzuɣ", + "rǧiɣ", + "rẓan", + "rẓen", + "s-d-", + "s-yefkan", + "s-yehwa", + "s-yenna", + "sabaw", + "sakin", + "salamano", + "saleḥ", + "salhi", + "sali-d", + "salima", + "sars", + "sawalen", + "sawalen-as", + "sawlen", + "sawḍen", + "saxe-anhalt", + "saɛid", + "sbedd", + "sbedden-d", + "sbitar", + "sbitarat", + "sbiṭarat", + "sdat", + "sdeffir", + "sebba", + "sebded", + "sebt", + "sebɛa", + "seddaw", + "seddu", + "sefrek", + "seg-sen", + "seggem", + "seggmeɣ", + "segmi", + "sekcem", + "sekker", + "sekkeṛ", + "seksu", + "selɛa", + "semman", + "semman-as", + "semmeḍ", + "semmus", + "semselsi", + "semɛun", + "sennig", + "seqsaɣ", + "serreḥ", + "sersen", + "serseɣ", + "serḥen", + "setta", + "sewḥel", + "seɛɛun", + "seɣwer", + "seḥbibren", + "sgunfu", + "siggez", + "silu", + "simi", + "singapur", + "sinigal", + "sinna", + "siwel-iyi-d", + "skibyu", + "slimane", + "sliɣ-as", + "smaɛni", + "smutti", + "snat", + "snesla", + "sneɣ", + "snifel", + "snirem", + "snitra", + "snulfu-d", + "sofiane", + "spanya", + "sqedcen", + "srid", + "ssarmeɣ", + "ssawalen", + "ssawlen-d", + "ssawḍen", + "ssawḍeɣ", + "ssaɛid", + "ssbeḥ", + "ssebba", + "sseqdacen", + "ssexdamen", + "sseḥra", + "sshala", + "ssikkis", + "ssiman", + "ssinen", + "ssineɣ", + "ssired", + "ssit", + "ssiwleɣ", + "ssiwḍen", + "sslam", + "ssmana", + "ssufɣen", + "ssulin", + "ssuma", + "ssuref-iyi", + "ssut", + "ssutren", + "ssuɣat", + "ssya", + "steqsaɣ", + "steqsi", + "sudad", + "sufel", + "suffɣen", + "sufyan", + "summam", + "suneɣ", + "suref-aɣ", + "surfaɣ", + "susem", + "susmen", + "swacu", + "swaswa", + "swayeɛ", + "swel", + "sweɣ", + "swid", + "swis", + "sya", + "syin", + "sɛan", + "sɛawi", + "sɛeddayen", + "sɛeddaɣ", + "sɛeddin", + "sɛeddiɣ", + "sɛid", + "sɛin", + "sɛun", + "sɛunt", + "sɛuɣ", + "sɣur-i", + "sɣuṛ", + "sḍis", + "sḥassfeɣ", + "sṭif", + "t-id", + "t-ixedmen", + "t-nexdem", + "t-txedmeḍ", + "t-walaɣ", + "t-xedmen", + "t-xedmeɣ", + "t-yewwin", + "t-yexdem", + "t-yečč", + "ta-", + "tabaskit", + "tabaḍnit", + "tabburt", + "tabdart", + "taberkant", + "tabzert", + "tabṛat", + "tacawit", + "tacciwin", + "tacelḥit", + "tacennayt", + "taceqquft", + "tadamsant", + "tadawsa", + "tadawsant", + "tadbelt", + "taddart", + "taddart-agi", + "taddart-nni", + "taddayt", + "taddukli", + "tadelsant", + "tadfert", + "tadigant", + "tadist", + "tadiwennit", + "tadrimt", + "tadukkli", + "tadwilt", + "tadyant", + "tadyant-a", + "tadzayrit", + "tafada", + "tafasa", + "tafaska", + "tafat", + "tafejrit", + "tafellaḥt", + "tafelwit", + "tafem", + "taferka", + "tafeḍ", + "taffa", + "tafrara", + "tafrawant", + "tafrayt", + "tafrensist", + "taftilt", + "taftist", + "tafukt", + "tafunast", + "tafyirt", + "tafṛansist", + "tagamant", + "tagant", + "tagara", + "tagarra", + "tagduda", + "tagelda", + "tageldant", + "tageldit", + "tageldunt", + "tagellidt", + "tagelmust", + "tagemmunt", + "taggara", + "taggara-a", + "tagi", + "tagiṭart", + "tagmant", + "tagnit", + "tagnit-a", + "tagnitt", + "tagrawla", + "tagrest", + "tagrigit", + "tagrumma", + "tagut", + "tagwaranit", + "tajapunit", + "tajeǧǧigt", + "tajmilt", + "takanadit", + "takarḍa", + "takatut", + "takebbanit", + "takerrust", + "takeṛṛust", + "takeṛṛust-is", + "takeṛṛust-nni", + "taklit", + "takmamt", + "takrurant", + "takura", + "takurdit", + "takurt", + "talaba", + "talalit", + "talast", + "talatinit", + "talatint", + "taldayt", + "taleb", + "talitwanit", + "tallast", + "tallelt", + "tallit-a", + "tallit-is", + "talmest-a", + "talqayant", + "talsa", + "talwit", + "talɣa", + "talɣiwin", + "tama-nniḍen", + "tama-w", + "tamacahutt", + "tamacint", + "tamadlant", + "tamagnut", + "tamanaɣt", + "tamanaɣt-is", + "tamaneɣt-is", + "tamarikanit", + "tamarut", + "tamasit", + "tamasiḥit", + "tamawt", + "tamaynut", + "tamaynutt", + "tamazight", + "tamaziɣt", + "tamazrayt", + "tamaḍalt", + "tamaḍlant", + "tamcumt", + "tamdint-a", + "tamectuḥt", + "tamecṭuḥt", + "tameddit", + "tameddurt", + "tameddurt-is", + "tameddurtcategory", + "tamemt", + "tamendawt", + "tament", + "tamentilt", + "tamenzut", + "tamenḍawt", + "tameqqṛant", + "tameqrant", + "tamesbanit", + "tamesgida", + "tamesguneft", + "tameslayt", + "tamettant-is", + "tamezduɣt", + "tameṭṭut-is", + "tameṭṭut-nni", + "tameẓyant", + "tamhazt", + "tamhelt", + "tamirant", + "tamkarḍit", + "tamnaḍt", + "tamnaṭ", + "tamnekda", + "tamneḍ", + "tamrilt", + "tamsalt", + "tamsalt-a", + "tamsulta", + "tamtilt", + "tamu", + "tamudemt", + "tamuqrant", + "tamurt-is", + "tamusni", + "tamuɣli-s", + "tamzwarut", + "tamɣawt", + "tanast", + "tanattalt", + "tanegga", + "taneggarut", + "taneggarut-a", + "tanekra", + "tanemmirt", + "tanesbaɣurt", + "tanezzayt", + "taneɣlaft", + "taneɣruft", + "taneṣlit", + "tanglizit", + "tanila", + "tanina", + "tankult", + "tanmaḍalt", + "tanqiḍt", + "tansa", + "tansa-agi", + "tansiwin", + "tantala", + "tantaliwin", + "tanzagt", + "tanzeɣt", + "taqcict-nni", + "taqdimt", + "taqeffalt", + "taqendurt", + "taqsit", + "taqsiḍt", + "taqsiṭ", + "tarbaɛt", + "tarbaɛt-a", + "tardast", + "taredsa", + "tarennawt", + "tarewla", + "targit", + "tarifit", + "tarka", + "tarmit", + "tarrayin", + "tarrayt", + "taru", + "tarumit", + "taruradt", + "tarusi", + "tarussint", + "taruḍ", + "tarwa-s", + "tarzeft", + "tasa", + "tasa-s", + "tasaft", + "tasartut", + "tasarut", + "tasarutt", + "tasawent", + "tasebḥit", + "taseddart", + "tasefsit", + "tasegda", + "tasekkurt", + "tasekla", + "taselmadt", + "tasemhuyt", + "tasengama", + "tasensartut", + "tasenselkimt", + "tasertant", + "tasertit", + "taserɣint", + "tasfift", + "tasga", + "tasinin", + "tasint", + "taskala", + "tasmuḍi", + "tasnawit", + "taspenyult", + "tastayt", + "tasuddest", + "tasudut", + "tasuqilt", + "tasuqqilt", + "tasusmi", + "tasut", + "tasuvyatit", + "taswiɛt", + "tatoeba", + "tatrart", + "tawacult", + "tawala", + "tawennaḍt", + "tawennaṭ", + "tawenza", + "tawi", + "tawil", + "tawilat", + "tawilayt", + "tawinest", + "tawiḍ", + "tawrirt", + "tawsit-a", + "tawtemt", + "tawtilt", + "tawuri", + "tawurmant", + "tawḍeḍ", + "tawṛiqt", + "taxazabit", + "taxxamt", + "tayaziṭ", + "taydiyyin", + "tayeb", + "tayet", + "tayuga", + "taywalt", + "tazayezt", + "tazeggaɣt", + "tazelmaṭ", + "tazelɣa", + "tazemmurt", + "tazeqqa", + "tazmalt", + "tazmilt", + "tazneḍ", + "tazrawt", + "tazunegzirt", + "tazwara", + "tazwart", + "tazzant", + "tazzwara", + "tazɣent", + "tazɣent-a", + "taɛdart", + "taɛebrit", + "taɛessast", + "taɛkumt", + "taɛlayant", + "taɛrabin", + "taɛrabt", + "taɛṛabt", + "taɣ", + "taɣara", + "taɣbalut", + "taɣect-is", + "taɣellist", + "taɣelnawt", + "taɣerbit", + "taɣerdayt", + "taɣtast", + "taɣuct", + "taɣulin", + "taɣult-a", + "taɣuri", + "taḍrist", + "taḍṣa", + "taḥkayt", + "taṛumanit", + "taṛumit", + "taṭalyanit", + "taṭelyanit", + "taẓallit", + "taẓayant", + "tban-d", + "tbaḍnit", + "tbeddel", + "tbeddeleḍ", + "tbeddleḍ", + "tbeddu", + "tbeskert", + "tbettiyin", + "tcekkart", + "tcennayt", + "tceqqufin", + "tceqquft", + "tcirḍart", + "td-a-rec", + "tdabut", + "tdamsa", + "tdawsa", + "tddukkla", + "tdersi", + "tdukkla", + "tdukkli", + "tdukli", + "tdukliwin", + "tduli", + "tdusi", + "tebburt", + "tebda", + "tebdart", + "tebded", + "tebdu", + "tebduḍ", + "tebniqin", + "tebniqt", + "tebratin", + "tebratt", + "tebzert", + "tebɣim", + "tebɣu", + "tebɣuḍ", + "tebḍa", + "tebḥirin", + "tebḥirt", + "tecba", + "tecceḍ", + "teccna", + "teccuyt", + "tecfawit", + "tecna", + "tecrawt", + "tedda-d", + "teddez", + "teddiḍ", + "teddu", + "tedduɣ", + "tedduḍ", + "tedmi", + "tedwilin", + "tedwilt", + "tedyanin", + "teffe", + "teffer", + "teffiɣ", + "teffɣen", + "tefka", + "tefka-as", + "tefka-d", + "teflel", + "tefranin", + "tefransist", + "tefrant", + "tefrayt", + "tefremlit", + "tefreḥ", + "tefri", + "tefriqt", + "tefru", + "tefses", + "tefsut", + "teftisin", + "teftist", + "tefyar", + "tefṛansist", + "tefṛeḥ", + "tegda", + "teggra-d", + "tegla", + "tegnatin", + "tegnawt", + "tegnit", + "tegrawin", + "tegrawla", + "tegreḍ", + "tegzem", + "tejmaɛt", + "tekka-d", + "tekker-d", + "tekkes", + "tekki", + "tekkseḍ", + "teklut", + "tekmamin", + "tekmamt", + "tekres", + "tekrura", + "tekseḍ", + "tekti", + "teldayt", + "teldi", + "teldiḍ", + "telenẓar", + "tella-d", + "tellam", + "telliḍ", + "telluẓ", + "telmed", + "telmest-a", + "telmeẓyin", + "telqayt", + "telqey", + "telsa", + "telɣut", + "telɣuɣa", + "telḥu", + "temdint", + "temdint-a", + "temdint-agi", + "temdint-nni", + "temgarad", + "temhelt", + "temlal", + "temlil", + "temlileyyin", + "temlilt", + "temmed", + "temmet", + "temmug", + "temmuger", + "temmuteḍ", + "temnaḍt", + "temnaṭ-a", + "temraradin", + "temsal", + "temsalt-a", + "temsetla", + "temseɣẓaẓ", + "temsirt", + "temsizlin", + "temsulta", + "temɛict", + "temɣarin", + "temɣart", + "temɣawla", + "temḥeqranit", + "temẓi-s", + "temẓin", + "ten-id-ssutren", + "tendeh", + "tenfalit", + "tenger", + "tenhert", + "tenna", + "tenna-as", + "tenna-k", + "tenna-yi-d", + "tenniḍ", + "tenqes", + "tenqiḍin", + "tensawt", + "tenwa", + "tenza", + "tenṭelt", + "teqbel", + "teqbilt", + "teqbuct", + "teqcict", + "teqcict-nni", + "teqqareḍ", + "teqqen", + "teqqim-d", + "teqqimemt", + "teqqimeḍ", + "teqqur", + "teqreb", + "teqseḥ", + "teqṣebt", + "terbabt", + "terbaɛt-a", + "terbuyaɛ", + "terfa", + "terfed", + "tergagayt", + "terniḍ", + "ternu", + "ternuḍ", + "terra-as-d", + "terra-d", + "terra-t", + "terra-tt", + "terrem", + "terreḍ", + "terriḍ", + "ters", + "terwel", + "terwi", + "terwiḥin", + "terwiḥt", + "tesdawit", + "tesdawiyin", + "tesdidin", + "tesferkeḍ", + "tesfeḍ", + "tesga", + "teskant", + "teskelseḍ", + "teslam", + "teslent", + "tesleḍ", + "tesleḍt", + "tesliḍ", + "tesmekta", + "tesmeḍ", + "tesmilt", + "tesmuttiḍ", + "tesnerni", + "tespenyult", + "tesqamut", + "tesqamut-a", + "tesqamutt", + "tesqedceḍ", + "tesquma", + "tesreḍt", + "tesriḍ", + "tesriḥ", + "tessawal", + "tessawel", + "tessefray", + "tessefraḥ", + "tessenqes", + "tesseqdac", + "tessineḍ", + "tessiweḍ", + "tessnem", + "tessnemt", + "tessneḍ", + "tessuffeɣ-d", + "tessusem", + "testeqsa-t", + "testeɛṛef", + "teswa", + "teswiɛt-a", + "teswiɛt-nni", + "tesɛa", + "tesɛam", + "tesɛamt", + "tesɛi", + "tesɛu", + "tesɣunt", + "tett", + "tettaf", + "tettafeḍ", + "tettagad", + "tettak-d", + "tettali", + "tettamneḍ", + "tettaru", + "tettas-d", + "tettawaṭ", + "tettawi", + "tettaɣ", + "tettaṭṭaf", + "tettban", + "tettbanem-d", + "tettedduḍ", + "tetteffeɣ", + "tetteg", + "tettekki", + "tettemɣay-d", + "tettfakka", + "tettidir", + "tettiki", + "tettili", + "tettili-d", + "tettkemmil", + "tettmeslay", + "tettmeslayeḍ", + "tettnadi", + "tettnadiḍ", + "tettnaɣ", + "tettnerni", + "tettru", + "tettruḥu", + "tettu", + "tettun", + "tettunefk", + "tettusemma", + "tettuɣ", + "tettuɣal", + "tettwakkes", + "tettwaliḍ", + "tettwasen", + "tettxemmim", + "tetḥeqqeḍ", + "tewhem", + "tewlafin", + "tewsatin", + "tewser", + "tewtemt", + "tewwi", + "tewwi-t", + "tewwura", + "tewwurt", + "tewɛer", + "texdem", + "texriṭ", + "texser", + "texxamt", + "texxamt-is", + "texxamt-iw", + "texxamt-nni", + "texṣer", + "tezdeg", + "tezdeɣ", + "tezgad", + "tezgel", + "tezgiḍ", + "tezha", + "tezlatin", + "tezlitt", + "tezmart", + "tezmert-is", + "tezmert-nsen", + "tezmilin", + "tezmirem", + "tezmiremt", + "tezmireḍ", + "tezreḍ", + "tezri", + "tezrigin", + "tezwar", + "tezwara", + "tezweǧ", + "tezyiwin-is", + "tezɣent", + "tezɣent-a", + "tečč", + "teččam", + "teččeḍ", + "teččiḍ", + "teččur", + "teččuṛ", + "teǧhed", + "teǧǧeḍ", + "teǧǧiḍ", + "teɛkemt", + "teɛǧeb-iyi", + "teɣleb", + "teɣmert", + "teɣra", + "teɣreḍ", + "teɣriḍ", + "teɣtest", + "teɣzef", + "teɣzi", + "teɣzut", + "teḍfer", + "teḍṣa", + "teḥbes", + "teḥma", + "teḥwaj", + "teḥwaǧ", + "teṛmist", + "teṭṭef-d", + "teṭṭef-it", + "teṭṭseḍ", + "teẓgi", + "teẓram", + "teẓramt", + "teẓreḍ", + "teẓrigin", + "teẓriḍ", + "teẓwer", + "teẓẓel", + "tfak", + "tfaska", + "tfeggagt", + "tfekka-s", + "tfelsafit", + "tfelsuft", + "tfelwit", + "tferka", + "tferkit", + "tferneḍ", + "tfesniwin", + "tfidiralit", + "tfunasin", + "tga", + "tgama", + "tgara", + "tgeldit", + "tgellidt", + "tgemt", + "tger", + "tger-d", + "tgiḍ", + "tguni", + "thegga", + "thuringe", + "tiberkanin", + "tibexsisin", + "tibzimin", + "tibḥirt", + "ticeqqufin", + "ticki", + "tiddi", + "tiddi-ynes", + "tiddin", + "tiddukla", + "tidelsanin", + "tidep", + "tidet", + "tidir", + "tifaskiwin", + "tifawit", + "tifekkiwin", + "tiferkit", + "tifernin", + "tifesniwin", + "tifinaɣ", + "tifra", + "tiftilin", + "tifyar", + "tigamanin", + "tigawt", + "tigawt-a", + "tigawt-agi", + "tigdi", + "tigelmusin", + "tigemmi", + "tigezmi", + "tigezt", + "tigget", + "tiggi", + "tiggtin", + "tignawt", + "tignewt", + "tignitin", + "tigri", + "tigrin", + "tigzi", + "tigzirin", + "tigzirt", + "tihawt", + "tihert", + "tihin", + "tijeǧǧigin", + "tikci", + "tikebbaniyin", + "tikeli", + "tikelt", + "tikelt-a", + "tikelt-nniḍen", + "tikerkas", + "tikeryas", + "tikkelt-a", + "tikkelt-agi", + "tikli", + "tikli-s", + "tikta", + "tikti-a", + "tikti-agi", + "tikwal", + "tilalliyin", + "tilelli", + "tilim", + "tilin", + "tilisa", + "tilist", + "tiliwa", + "tilizri", + "tiliɣri", + "tiliḍ", + "tiliẓri", + "tilmas-a", + "timacinin", + "timad-is", + "timahilin", + "timanit", + "timaynutin", + "timdinin", + "timecṭuḥin", + "timekkasin", + "timellalin", + "timenna", + "timental", + "timentelt", + "timerna", + "timesbaniyin", + "timetti", + "timettiyin", + "timeɣriwin", + "timeẓyanin", + "timiqwa", + "timizar", + "timiḍi", + "timmad", + "timmad-is", + "timmad-iw", + "timmad-nsen", + "timmunent", + "timraradin", + "timsal", + "timsedrarin", + "timsefra", + "timseɣẓaẓ", + "timsizzelt", + "timucent", + "timucuha", + "timunnent", + "timɣarin", + "tineggura", + "tinegwa", + "tineɣrufin", + "tineṣliyin", + "tiniri", + "tiniḍ", + "tinnagrawt", + "tinqiḍin", + "tinselmin", + "tipaza", + "tiqbayliyin", + "tiqcicin", + "tirebbuyaɛ", + "tiregwa", + "tirmit", + "tirni", + "tirrugza", + "tirẓi", + "tis-snat", + "tiseddaṛin", + "tisefsiyin", + "tisekta", + "tislit", + "tissi", + "tissirt", + "tissit", + "tissiyin", + "tisuda", + "tisuffaɣ", + "tiwal", + "tiwlafin", + "tiwsitin", + "tiwtilin", + "tiwwura", + "tiyersi", + "tiyita", + "tiyta", + "tizeggaɣin", + "tizegzewt", + "tizeɣwa", + "tizgelt", + "tizi", + "tizi-", + "tizi-wezzu", + "tizit", + "tizizwa", + "tizlatin-is", + "tizlit-a", + "tizlitt", + "tizmilin", + "tizmireḍ", + "tizrawin", + "tizzayriyin", + "tizzegzut", + "tiɣelnawin", + "tiɣimit", + "tiɣiwanin", + "tiɣmert", + "tiɣra", + "tiɣri", + "tiɣtasin", + "tiḥuna", + "tiṭ", + "tiẓgi", + "tiẓrigin", + "tiẓurin", + "tjaddit", + "tjumma", + "tkarḍiwin", + "tkatut", + "tkebbanit", + "tkebbanit-a", + "tkecmeḍ", + "tkemmel", + "tkemmeleḍ", + "tkerkas", + "tkeryas", + "tkessawt", + "tkeṛṛust", + "tkuzint", + "tlata", + "tlatin", + "tlelliyin", + "tlemdeḍ", + "tlisa", + "tliẓri", + "tls", + "tlufa", + "tmacahut", + "tmagit", + "tmaneɣt", + "tmara", + "tmasit", + "tmazirt", + "tmaziɣt", + "tmazzalt", + "tmeddit", + "tmeddurt", + "tmeddurt-is", + "tmedkin", + "tmedyazt", + "tmedyezt", + "tmellalt", + "tmenna", + "tmental", + "tmentilt", + "tmenɣiwt", + "tmenḍawt", + "tmerna", + "tmerniwt", + "tmerrit", + "tmerwin", + "tmesbaniyin", + "tmess", + "tmettant-is", + "tmetti", + "tmettiyin", + "tmezdayt", + "tmezduɣt", + "tmezgida", + "tmeɣriwin", + "tmeɣṛa", + "tmeṭṭut", + "tmeṭṭut-ik", + "tmeṭṭut-iw", + "tmeẓyant", + "tmeẓẓuɣt", + "tmiwa", + "tmu", + "tmucuha", + "tmuddeḍ", + "tmudemt", + "tmunent", + "tmunnent", + "tmurt-a", + "tmurt-is", + "tmurt-nneɣ", + "tmusni", + "tmuɣli", + "tmuɣliwin", + "tnaka", + "tnamit", + "tnarit", + "tnefsit", + "tnegga", + "tnekra", + "tneqḍin", + "tneslemt", + "tnezduɣin", + "tnezzut", + "tneɣlaft", + "tneɣrit", + "tneɣruft", + "tneẓruft", + "tnila", + "tnuda", + "tpaliḍt", + "tqacuct", + "tqebleḍ", + "tqecwalt", + "tqendurt", + "trakalt", + "tre", + "trebbaɛ", + "trebbaɛ-a", + "trebbuyaɛ", + "tredsa", + "tregwa", + "trennawt", + "trewla", + "triḍ", + "trumit", + "trusi", + "trusit", + "truḥeḍ", + "tsaggazt", + "tsartut", + "tsarut", + "tsaɛtin", + "tsebḥit", + "tseddarin", + "tseddart", + "tseddast", + "tsekla", + "tsekliwin", + "tsemhuyin", + "tsemhuyt", + "tsenselkimt", + "tseqdaceḍ", + "tsers", + "tserɣint", + "tserɣuda", + "tsuffaɣ", + "tsuffeɣt", + "tsura", + "tsusmi", + "tsut", + "tsutwin", + "tsuɣ", + "tt-", + "tt-xedmeɣ", + "tt-yettmeslayen", + "tt-yeǧǧan", + "ttagad", + "ttagaden", + "ttagadeɣ", + "ttaggad", + "ttaken", + "ttaken-d", + "ttalin", + "ttamneɣ", + "ttar", + "ttarguɣ", + "ttasen-d", + "ttawilat", + "ttawint", + "ttazzalen", + "ttaǧǧa", + "ttaɣen", + "ttaṛ", + "ttaṭṭafen", + "ttbeddilen", + "ttekkan", + "tteklen", + "ttekleɣ", + "ttemcabint", + "ttemlilin", + "tteryel", + "ttesriḥ", + "ttfaṣil", + "ttgen", + "ttidiren-t", + "ttili", + "ttilint", + "ttin", + "ttiɛad", + "ttmeslayen-tt", + "ttmettaten", + "ttmuquleɣ", + "ttnadin", + "ttnadint", + "ttnadiɣ", + "ttqadaren", + "ttqelliben", + "ttrad", + "ttrajun", + "ttraǧun", + "ttraǧuɣ", + "ttrebga", + "ttru", + "ttruɣ", + "ttruḥun", + "ttruḥuɣ", + "ttsuɣun", + "tturaren", + "tturareɣ", + "tturk", + "ttuɣ", + "ttwakksen", + "ttwaleqqemen", + "ttwaliɣ", + "ttwanɣan", + "ttwarun", + "ttwasnen", + "ttwaḥebsen", + "ttwaṭṭfen", + "ttxemmimen", + "ttxil-kent", + "ttxil-m", + "ttɛassan", + "ttɛeddin", + "ttɣimin", + "tuccar-is", + "tuddsa", + "tudert", + "tudert-ik", + "tudert-nneɣ", + "tudmawant", + "tufa-d", + "tufat", + "tuffiɣt", + "tuffra", + "tufi", + "tufra", + "tufrint", + "tuga", + "tugad", + "tugar", + "tugdut", + "tugett", + "tugget", + "tugi", + "tugiḍ", + "tugna-agi", + "tugniwin", + "tujjya", + "tukci", + "tukerḍa", + "tuki", + "tukksa", + "tuklal", + "tukza", + "tulawin", + "tuli-d", + "tullas", + "tullist", + "tulluɣt", + "tullya", + "tumant", + "tummant", + "tummidt", + "tunṣibin", + "tuqqna", + "tuqqniwin", + "turareḍ", + "turda", + "turdiwin", + "turigeḍ", + "turiḍ", + "turkya", + "turmidt", + "turuft", + "tusa-d", + "tusligin", + "tusligt", + "tusridt", + "tussda", + "tussna", + "tussnant", + "tussniwin", + "tutlayin", + "tutlayt-a", + "tutlayt-is", + "tutlayt-nneɣ", + "tuttra", + "tuttriwin", + "tuzwirt", + "tuzyint", + "tuzzel", + "tuzzma", + "tuzzuft", + "tuzzya", + "tuččit", + "tuɣ", + "tuɣ-it", + "tuɣdaḍt", + "tuɣeḍ", + "tuḍen", + "tuṛufit", + "tvidyut", + "twaculin", + "twacult", + "twacult-a", + "twacult-iw", + "twala", + "twaṭṭfa", + "twehmeḍ", + "twejdeḍ", + "twekked-d", + "twennaḍt", + "twennaṭ", + "twetmin", + "twilayin", + "twilayt", + "twinas", + "twuriwin", + "twuɣa", + "txazabit", + "txeddmem", + "txeddmemt", + "txedmem", + "txedmeḍ", + "txessarin", + "txidas", + "txuṣ", + "tyerza", + "tyitwin", + "tzad", + "tzemmar", + "tzemmurt", + "tzemrem", + "tzemreḍ", + "tzerzayt", + "tzewǧeḍ", + "tzeɣwa", + "tzizwa", + "tɛeddi", + "tɛerḍeḍ", + "tɛeṭṭel", + "tɣamsa", + "tɣawla", + "tɣawsiwin", + "tɣemmar", + "tɣerma", + "tɣil", + "tɣileḍ", + "tɣiwanin", + "tɣiwant", + "tɣiwant-a", + "tɣult", + "tḍegger", + "tḍerru", + "tḍul", + "tḥebseḍ", + "tḥemmlemt", + "tḥemmleḍ", + "tḥettem", + "tḥudd", + "tḥulfa", + "tḥuna", + "tḥuss", + "tḥuza", + "tṛumit", + "tṛuḥem", + "tṛuḥemt", + "tṛuḥeḍ", + "tẓallit", + "tẓer", + "tẓuri", + "tẓurin", + "uand", + "ubadu", + "ubaxix", + "ubdid", + "ubelkim", + "ubeqqeḍ", + "ubrid", + "ubrid-a", + "ubugaṭu", + "ubuntu", + "ucareɛ", + "uccanen", + "ucebbub", + "ucengu", + "ucmumeḥ", + "udcir", + "uddisen", + "udellel", + "udem-ik", + "udem-iw", + "udlif", + "udlis", + "udlis-a", + "udlis-is", + "udmawan", + "udmawen", + "udrar", + "udrurem", + "uefa", + "ufan", + "ufaylu", + "ufecku", + "ufeggag", + "ufekrun", + "ufella", + "ufellaḥ", + "uffiren", + "uffiɣen", + "ufgan", + "ufham", + "ufin", + "ufiɣ", + "ufransis", + "ufraq", + "ufurk", + "ufus", + "ufus-is", + "ugadeɣ", + "ugafa-agmuḍan", + "ugafa-utrim", + "ugani", + "ugaraw", + "ugbur", + "ugeffur", + "ugeldun", + "ugemmaḍ", + "ugemmun", + "ugezdu", + "uggadeɣ", + "uggug", + "ugin", + "uglam", + "uglim", + "ugni", + "ugrud", + "ugudu", + "ugur-agi", + "uguren", + "uheggi", + "uhu", + "ujeǧǧig", + "ujgu", + "ukabar", + "ukabar-a", + "ukala", + "ukaram-agi", + "ukatar", + "ukayad", + "ukaṛbun", + "ukeffadu", + "ukemmel", + "ukemmus", + "ukersi", + "ukessar", + "ukeččum", + "ukiɣ", + "ukkud", + "ukkuz", + "ukman", + "ukraḍyur", + "uksum", + "ukumisar", + "ukuẓ", + "ul-ik", + "ul-is", + "ul-iw", + "ulac-itt", + "ulad", + "ulamek", + "ulampiyen", + "ulawen", + "ulayɣer", + "uletma", + "ulin", + "ulmad", + "ulzuz", + "ulɣu", + "umadal", + "umagrad", + "umahil", + "umalu", + "umanar", + "umata", + "umatar", + "umawal", + "umaynut", + "umazellaw", + "umaziɣ", + "umaṭṭaf", + "umaẓrag", + "umbaɛd", + "umcic", + "umdan", + "umeddakel-is", + "umeddakkel", + "umedya", + "umejjay", + "umellal", + "umenkud", + "umenɣi", + "umeqqran", + "umerreḥ", + "umerruk", + "umeskar", + "umeslay", + "umesni", + "umesten", + "umezdaɣ", + "umezruy", + "umezruy-is", + "umezwaru", + "umeɣbun", + "umeɣras", + "umeṛṛuk", + "umeẓẓuɣ", + "umgaru", + "umgired", + "umhaz", + "umidya", + "umiḍan-agi", + "umiḍan-ik", + "ummesten", + "ummid", + "umnar", + "umnekcam", + "umneɣ", + "umnir", + "umrar", + "umsefrak", + "umsenɣi", + "umtawa", + "umulli", + "umur", + "umusnaw", + "umussnaw", + "umuḍin", + "umyag", + "umyaraw", + "umyaru", + "umḍiq", + "unasiw", + "unazuṛ", + "unect", + "uneflay", + "uneggez", + "unegmu", + "unegzum", + "unehhar", + "unelmad", + "unemhal", + "unerni", + "unezri", + "unezwu", + "unezzarfu", + "uneɣlaf", + "uneẓruf", + "unfafad", + "unfafad-a", + "ungal-a", + "ungar", + "ungif", + "unsiben", + "unti", + "unuɣ", + "unuḍaf", + "unyir", + "unz", + "unẓul", + "unẓul-amalu", + "upyanu", + "upṛuksi", + "uqabel", + "uqader", + "uqasi", + "uqbel", + "uqbil", + "uqcic", + "uqenṣul", + "uqerruy-iw", + "uqeṛṛu", + "ur-d", + "ur-s", + "urar", + "urasya", + "urezqi", + "urfan", + "urgaz-nni", + "url", + "urmid", + "urmud", + "urrif", + "ursu", + "urt", + "uruppa", + "urured", + "urɛad", + "usafar", + "usagen", + "usaki", + "usalay", + "usamer", + "usammar", + "usammer", + "usan-d", + "usarag", + "usawen", + "usayes", + "usebded", + "usebges", + "usebtar", + "usebter", + "usebɣes", + "useddu", + "usedwel", + "usefrek", + "usefru", + "useggas-nni", + "useggwas", + "usegmi", + "usegnaf", + "usegwas", + "usekcem", + "usekkud", + "usekles", + "usekyed", + "uselket", + "uselmed", + "usemmiḍ", + "usemres", + "usenfar", + "usenfar-a", + "usenfaṛ", + "usenkar", + "usentel", + "usentel-a", + "usentem", + "useqdac", + "userwes", + "usesmel", + "usewwi", + "useyyer", + "usečču", + "useɛlem", + "useɣti", + "useɣẓan", + "useḥbes", + "useḥbiber", + "usfuggel", + "usgunef", + "usgunfu", + "usider", + "usifeḍ", + "usiggez", + "usigna", + "usismel", + "usiti", + "usiḍen", + "uskan", + "usleɣmay", + "uslig", + "usmekti", + "usmel", + "usnan", + "usnefli", + "usneftaɣ", + "usnerni", + "usrag", + "usrid", + "ussan-a", + "ussan-d", + "usseggwas", + "usselmed", + "ussid", + "ussis", + "ussisen", + "ustralya", + "usuddem", + "usuddes", + "usudu", + "usuffeɣ", + "usuneɣ", + "usurdi", + "usurif", + "uswir", + "usɛeddi", + "usɣan", + "utilifun", + "uvidyu", + "uvirus", + "uwanek", + "uwekked", + "uwennit", + "uwexxer", + "uwren", + "uxeddim", + "uxemmem", + "uxxam", + "uxxam-iw", + "uxxam-nni", + "uyalas", + "uyaziḍ", + "uyeffus", + "uyefki", + "uyeḥya", + "uzagur", + "uzal", + "uzamul", + "uzarug", + "uzegrir", + "uzekka", + "uzeṭṭa", + "uzlig", + "uzniq", + "uzrar", + "uzraɛ", + "uzwir", + "uzzayri", + "uzzu", + "uzɣal", + "učči", + "uɛebbuḍ", + "uɛeddi", + "uɛeggal", + "uɛeqqa", + "uɛessas", + "uɛrur", + "uɛḍil", + "uɣal", + "uɣal-d", + "uɣalen", + "uɣalen-d", + "uɣaleɣ-d", + "uɣanib", + "uɣanim", + "uɣawas", + "uɣbalu", + "uɣbar", + "uɣbel-a", + "uɣelluy", + "uɣen-d", + "uɣerbaz", + "uɣerman", + "uɣeɣ-d", + "uɣilif", + "uɣiwel", + "uɣiwen", + "uɣlad", + "uɣrum", + "uɣyul", + "uḍad", + "uḍar", + "uḍar-is", + "uḍaṛ", + "uḍebsi", + "uḍfar", + "uḍnen", + "uḍɛif", + "uḍḍun", + "uḥader", + "uḥareb", + "uḥbas", + "uḥeddad", + "uḥric", + "uḥric-agi", + "uḥuddu", + "uṭaksi", + "uṭṭun", + "uṭṭun-is", + "uẓar", + "uẓawan", + "uẓeffun", + "uẓekka", + "vlc", + "waccaren", + "wacciwen", + "wacemma", + "wacḥal", + "waddad", + "waddar", + "waddud", + "wadeg", + "wafriwen", + "wagaz", + "waggagen", + "waggay", + "wagi", + "wagimen", + "wagu", + "waguren", + "wahil", + "wahilen", + "wakat", + "wakk-n", + "wakraren", + "wakud", + "walant", + "walaɣ-t", + "walid", + "walim", + "waliɣ", + "wallal", + "wallalen", + "wallaɣ", + "wallaɣ-is", + "wallaɣ-iw", + "wallen-ik", + "wallen-is", + "wallus", + "walluy", + "wama", + "waman-nni", + "wamber", + "wammag", + "wammud", + "wamur", + "wanag", + "wanaw", + "wanect", + "wanect-a", + "wannag", + "wannar", + "wannay", + "wannect-a", + "wannuz", + "wansayen", + "wargaz", + "warraw", + "warraw-iw", + "warrazen", + "warẓigen", + "wasif", + "wass", + "wass-a", + "wassa", + "wassaɣen", + "wassen", + "wassif", + "watmaten-is", + "wavu", + "wawal", + "wawal-a", + "wawalen", + "wawras", + "wawwaḍ", + "way-n", + "way-nni", + "wayed", + "wayes", + "wayi", + "wayyur", + "wazal", + "wazal-is", + "wazalen", + "wazemz", + "wazzun", + "waɛraben", + "waɛrur", + "waɣir", + "waɣir-a", + "waɣiren", + "waɣzen", + "waḍu", + "waṭas", + "waṭṭan", + "waṭṭas", + "webrid", + "wedfel", + "wedlis", + "wedrim", + "wedrum", + "wefrag", + "wegdil", + "wegdud", + "weglam", + "weglim", + "wehmen", + "wehṛan", + "weksum", + "wellah", + "welleh", + "welmad", + "weltma-s", + "wember", + "wemcic", + "wemgaru", + "wemkan", + "wemkan-is", + "wemyag", + "wemɣar", + "wemḍiq", + "wennar", + "wennez", + "wenṭaṭ", + "wenẓul", + "wenẓul-agmuḍan", + "wenẓul-utrim", + "weqbel", + "weqcic", + "weqmaḍ", + "werdiya", + "wergaz-is", + "werɛad", + "weslelli", + "wesnulfu", + "wesqamu", + "weswir", + "wesɣan", + "wesɣaṛ", + "wewras", + "wexxam", + "wezgen", + "wezrem", + "wezzil", + "wezzilet", + "wezzu", + "wezɣal", + "weɣmis", + "weɣyul", + "weḥd", + "weḥd-i", + "weḥd-m", + "weḥdes", + "weḥraz", + "weḥric", + "weṭlas", + "weẓru", + "white-space", + "wi-fi", + "wid-ak", + "widak-nni", + "wideg", + "wikipedia", + "wiyad", + "wiyaḍ", + "wiza", + "wuccanen", + "wuccen", + "wudayen", + "wudi", + "wufrinen", + "wuggug", + "wugur-a", + "wuguren", + "wul", + "wul-ik", + "wul-is", + "wul-iw", + "wulawen", + "wulli", + "wulzuz", + "wumi", + "wumuɣen", + "wunuɣen", + "wurar", + "wuraren", + "wurtan", + "wurti", + "wussan", + "wussan-a", + "wussis", + "wusu", + "wuɣur", + "wuṭṭun", + "wuṭṭunen", + "wwin-d", + "wwiɣ-d", + "wwten", + "wwḍeɣ", + "wḍen", + "xaled", + "xali", + "xalifa", + "xalifi", + "xaqeɣ", + "xaṭi", + "xeddam", + "xeddmen", + "xedme", + "xedmen", + "xemsa", + "xemsin", + "xerṣum", + "xilla", + "xliǧa", + "xml", + "xuṣṣen", + "xwalti", + "yacine", + "yakk", + "yal", + "yamina", + "yarna", + "yasen", + "yasin", + "yaweḍ", + "yawin", + "yawḍen", + "yazen", + "yazid", + "yaɣ", + "yaẓ", + "ye-", + "yeb", + "yebda-d", + "yebded", + "yebnan", + "yebnu", + "yebru", + "yebɛed", + "yebɣa", + "yebɣan", + "yebɣi", + "yebɣu", + "yebḍa", + "yebḍan", + "yebṭan", + "yecceḍ", + "yecfa", + "yecliɛ", + "yecna", + "yecnu", + "yedda", + "yedda-d", + "yeddan", + "yeddem-d", + "yedder", + "yeddi", + "yeddukel", + "yeddukklen", + "yedduklen", + "yeddun", + "yedlisen", + "yeffe", + "yeffeɣ", + "yeffɣen", + "yefhim", + "yefk", + "yefka-d", + "yefkan", + "yefrax", + "yefren", + "yefri", + "yefus", + "yefɣen", + "yegber", + "yegdel", + "yegduden", + "yeggan", + "yeggar", + "yeggra-d", + "yegguma", + "yegmamen", + "yegnen", + "yegren", + "yehwan", + "yejbed", + "yejmeɛ", + "yekcem-d", + "yekfa", + "yekfan", + "yekka", + "yekkat", + "yekker", + "yekkes-as", + "yekkes-d", + "yekksen", + "yekres", + "yekseb", + "yeldi", + "yeldin", + "yelha-d", + "yelhan", + "yelhi", + "yelhu", + "yella-d", + "yellan", + "yelli", + "yellilten", + "yellin", + "yellis", + "yelluẓ", + "yelɣuɣen", + "yelḥa", + "yelḥan", + "yelḥeq", + "yemdukal", + "yemdukal-is", + "yemgarad", + "yemgaraden", + "yemgarden", + "yemgerraden", + "yemlal", + "yemma-k", + "yemma-m", + "yemma-s", + "yemmager", + "yemmal", + "yemmal-d", + "yemmas", + "yemmed", + "yemmeslay-d", + "yemmeslayen", + "yemmet", + "yemmug", + "yemmuten", + "yemnayen", + "yemxalaf", + "yemxalafen", + "yemxallaf", + "yemɣaren", + "yemɣi", + "yemḍebren", + "yenbeḍ", + "yendem", + "yenfufed", + "yenger", + "yenna", + "yenna-asen", + "yenna-aɣ-d", + "yenna-d", + "yenna-k", + "yenna-yasen", + "yennan", + "yennayer", + "yennaɣ", + "yennecraḥ", + "yennerna", + "yennerni", + "yennulfa-d", + "yenqes", + "yenwan", + "yenzan", + "yenɣa", + "yenṭeq", + "yenṭerren", + "yenṭeḍ", + "yeqbayliyen", + "yeqbel", + "yeqbil", + "yeqdec", + "yeqleɛ", + "yeqnen", + "yeqqar-as", + "yeqqaṛ", + "yeqqim-d", + "yeqqnen", + "yeqqur", + "yeqreb", + "yeqreb-it", + "yeqwa", + "yeqwan", + "yerbeḥ", + "yergazen", + "yerkeb", + "yerna", + "yerna-d", + "yernan", + "yerr", + "yerra-d", + "yerran", + "yerren", + "yers-d", + "yerwel", + "yerza", + "yerzu", + "yerḥem", + "yerẓa", + "yes-", + "yes-s", + "yesdukkel", + "yeshetrif", + "yeshil", + "yeskaddeb", + "yesker", + "yesla", + "yeslan", + "yesmekta-d", + "yesres", + "yessan", + "yessaram", + "yessarem", + "yessawaḍ", + "yessawel", + "yessaweḍ", + "yessawlen", + "yessaɣ", + "yessebded", + "yessefra", + "yessefray", + "yessefraḥen", + "yessegza-d", + "yessekcem", + "yessekles", + "yessemres", + "yessen", + "yesseqdacen", + "yessetma", + "yessetmas", + "yessewham", + "yessewhamen", + "yessexdam", + "yesseɣli", + "yessi-s", + "yessin", + "yessis", + "yessiwel", + "yessiweḍ", + "yessiwḍen", + "yesskanay-d", + "yessnen", + "yessuddes", + "yessufeɣ-d", + "yessuffeɣ-d", + "yessumer-d", + "yessuref", + "yessuter-as", + "yessuter-iyi-d", + "yesteqsi", + "yesteɛref", + "yeswa", + "yeswi", + "yesɛan", + "yesɛeddi", + "yesɛi", + "yesḥassef", + "yetri", + "yettaf", + "yettagad", + "yettak", + "yettalin", + "yettamen", + "yettamnen", + "yettarra", + "yettarran", + "yettarun", + "yettawaṭ", + "yettawi", + "yettazzal", + "yettazzalen", + "yettaǧǧa", + "yettaǧǧan", + "yettaɣen", + "yettaḍsa", + "yettaṭṭafen", + "yettaẓ", + "yettban", + "yettbanen", + "yettbeddilen", + "yetteddu", + "yettekka", + "yettekkan", + "yettemcabi", + "yettergigi", + "yettidiren", + "yettifliwen", + "yettili-d", + "yettkel", + "yettmeslay", + "yettmeslayen", + "yettmettat", + "yettmuqul", + "yettnadi", + "yettnaɣ", + "yettnernin", + "yettqabalen", + "yettqellib", + "yettrajun", + "yettraǧu", + "yettraǧun", + "yettrebbin", + "yettru", + "yettruḥun", + "yettsuɣu", + "yettu", + "yettun", + "yettunefk", + "yettunefken", + "yetturar", + "yettusbadu", + "yettusbadun", + "yettusemma", + "yettusemman", + "yettuseqdac", + "yettuɣalen", + "yettwabeqqeḍen", + "yettwabnan", + "yettwabḍan", + "yettwaddmen", + "yettwakelsen", + "yettwakren", + "yettwaleqqem", + "yettwanɣa", + "yettwaqbel", + "yettwarna", + "yettwarnan", + "yettwaru", + "yettwarun", + "yettwasbedd", + "yettwasbedden", + "yettwasen", + "yettwaseqdac", + "yettwasnen", + "yettwassen", + "yettwassnen", + "yettwasxedmen", + "yettwattun", + "yettwazen", + "yettwaḥebsen", + "yettwaḥkem", + "yettwaḥsab", + "yettwaḥseb", + "yettɛassa", + "yettɛassan", + "yettɛawan", + "yettɛeṭṭil", + "yettɣimi", + "yewjid", + "yewten", + "yeww", + "yewwet-d", + "yewweḍ-d", + "yewwi-d", + "yewwi-tt", + "yewwin", + "yewwiḍ", + "yewɛeṛ", + "yewḥel", + "yexdim", + "yexlef", + "yexsi", + "yexxamen", + "yexxamen-nsen", + "yexṣer", + "yezdin", + "yezga-d", + "yezgan", + "yezger", + "yezha", + "yeznuzun", + "yezreɛ", + "yezwar", + "yezwir", + "yezzenz", + "yezzi", + "yezzin", + "yečč", + "yečča", + "yeččur", + "yeččuren", + "yeǧhed", + "yeǧǧa", + "yeǧǧa-d", + "yeǧǧa-t", + "yeǧǧa-tt", + "yeǧǧan", + "yeɛnan", + "yeɛreḍ", + "yeɣlanen", + "yeɣli-d", + "yeɣlin", + "yeɣra", + "yeɣran", + "yeɣri", + "yeḍra-d", + "yeḍri", + "yeḍru", + "yeḍrun", + "yeḥbis", + "yeḥkem", + "yeḥlan", + "yeḥma", + "yeḥrec", + "yeḥricen", + "yeḥseb", + "yeḥwaǧ", + "yeḥwaǧen", + "yeṭṭafar", + "yeṭṭafaren", + "yeṭṭef", + "yeṭṭef-itt", + "yeṭṭerḍeq", + "yeẓdan", + "yeẓẓan", + "yi-", + "yi-d", + "yi-d-", + "yibabaten", + "yibenkan", + "yiberdan", + "yibiten", + "yicenga", + "yid-i", + "yid-neɣ", + "yid-nneɣ", + "yid-s", + "yid-sen", + "yidammen", + "yideggan", + "yidelsan", + "yides", + "yidi", + "yidinaṛen", + "yidir", + "yidis", + "yidis-is", + "yidisan", + "yidlisen", + "yidmaren", + "yidrimen", + "yifassen-is", + "yifassen-nsen", + "yifecka", + "yifelfel", + "yifellaḥen", + "yifen", + "yifer", + "yifuyla", + "yifyar", + "yigelliden", + "yigelmimen", + "yiger", + "yigerdan", + "yigiman", + "yigmamen", + "yigmaḍ", + "yigrawen", + "yigrawliwen", + "yigṭaṭ", + "yikabaren", + "yikaramen", + "yikayaden", + "yikilumitren", + "yikurdiyen", + "yilef", + "yilem", + "yilemẓi", + "yilemẓiyen", + "yileqman", + "yiles", + "yilsawen", + "yilugan", + "yimagraden", + "yiman", + "yiman-ik", + "yiman-iw", + "yiman-nnes", + "yimassanen", + "yimastanen", + "yimawlan-is", + "yimawlan-nsen", + "yimayl", + "yimaylen", + "yimazanen", + "yimaziɣen", + "yimcac", + "yimdanen", + "yimdukkal", + "yimedyazen", + "yimejjayen", + "yimelyan", + "yimensi", + "yimenzayen", + "yimenɣi", + "yimesli", + "yimezdaɣ", + "yimezdaɣ-is", + "yimeɣban", + "yimeɣnasen", + "yimeɣriyen", + "yimeḍqan", + "yimeṭṭi", + "yimeẓla", + "yimi-s", + "yimidyaten", + "yiminig", + "yimir", + "yimiren", + "yimjuhad", + "yimru", + "yimsenza", + "yimsiklen", + "yimsulta", + "yimtiwgen", + "yimuddiren", + "yimukan", + "yimuras", + "yimuren", + "yimusnawen", + "yimussnawen", + "yimxalafen", + "yimyura", + "yimyuraren", + "yimḍebber", + "yinaw", + "yinaẓuren", + "yinek", + "yinelmaden", + "yinermisen", + "yineɣlafen", + "yineɣmasen", + "yineḥbas", + "yinfafaden", + "yini", + "yinig", + "yinin", + "yiniten", + "yinselmen", + "yinumak", + "yinumidiyen", + "yinurar", + "yinzi", + "yiqjan", + "yir", + "yiraten", + "yirden", + "yirebbi", + "yirebraben", + "yirem", + "yirgazen", + "yirmad", + "yirmuden", + "yirumyen", + "yisafagen", + "yisafaren", + "yisalan", + "yisalen", + "yisali", + "yisallen", + "yisebtar", + "yisefka", + "yisefra", + "yiseggasen", + "yisekkilen", + "yisekla", + "yiselman", + "yiselsa", + "yisem", + "yisem-is", + "yisem-iw", + "yiseqsiyen", + "yiserdasen", + "yiserdasen-is", + "yiseɣẓanen", + "yislan", + "yismal", + "yismawen", + "yisnasen", + "yissin", + "yisteqsiyen", + "yisufar", + "yisumar", + "yisuḍaf", + "yiswi", + "yiswiren", + "yiswiyen", + "yisɣaren", + "yisṭuniyen", + "yiwaziwen", + "yiwellihen", + "yiwenniten", + "yiwet", + "yiwudam", + "yiwwet", + "yixef", + "yixef-is", + "yixxamen-nsen", + "yizan", + "yizen", + "yizerman", + "yizirig", + "yizli", + "yizmawen", + "yizmir", + "yizri", + "yizzayriyen", + "yiɛeggalen", + "yiɛeqqayen", + "yiɣbula", + "yiɣeblan", + "yiɣerbazen", + "yiɣersiwen", + "yiɣil", + "yiɣmisen", + "yiɣsan", + "yiɣtasen", + "yiḍ-nni", + "yiḍarren", + "yiḍrisen", + "yiḍudan", + "yiḍumman", + "yiḥder", + "yiḥedran", + "yiḥricen", + "yiḥulfan", + "yiṭ", + "yiṭes", + "yiṭij", + "yudas", + "yuder", + "yudnen", + "yufa", + "yufa-d", + "yufan", + "yufrar", + "yufrar-d", + "yufraren", + "yugar", + "yugin", + "yuki-d", + "yuklal", + "yuli-d", + "yumen", + "yumes", + "yumin", + "yumnen", + "yumsen", + "yunag", + "yura-t", + "yuran", + "yuraren", + "yusan", + "yussan", + "yusu-d", + "yuwi-d", + "yuyes", + "yuzen", + "yuɛer", + "yuɛren", + "yuɣ", + "yuɣal", + "yuɣen", + "yuḥwaǧen", + "yuẓa", + "yya", + "yzemren", + "zaɛma", + "zdat", + "zdaxel", + "zeddig", + "zedek", + "zedɣen", + "zedɣen-t", + "zedɣen-tt", + "zeghmati", + "zegren", + "zekri", + "zewǧen", + "zeɛma", + "zgan", + "zgant", + "zgiɣ", + "zheṛ", + "zidat", + "zik", + "ziland", + "zin", + "ziri", + "ziɣen", + "zman", + "zmiren", + "zmirent", + "zmireɣ", + "zun", + "zwaren", + "zwaǧ", + "zyada", + "zzayer", + "zzeg", + "zzeg-s", + "zzher", + "zzheṛ", + "zzhu", + "zzin", + "zzit", + "zziɣ", + "zzman", + "zzwaǧ", + "zṛen", + "zṛiɣ", + "ččeɣ", + "ččiɣ", + "ččuren", + "ǧamila", + "ǧaɛfer", + "ǧaɛut", + "ǧiǧel", + "ǧǧemt-iyi", + "ǧǧen", + "ǧǧeɣ", + "ǧǧiɣ", + "ɛawden", + "ɛawdeɣ", + "ɛaziz", + "ɛebbas", + "ɛebdelqader", + "ɛebdelwaḥed", + "ɛebdelǧabar", + "ɛebdelḥamid", + "ɛebderreḥman", + "ɛecra", + "ɛecrin", + "ɛecṛa", + "ɛeddan", + "ɛeddi", + "ɛeddiɣ", + "ɛellawa", + "ɛelǧiya", + "ɛemruc", + "ɛennaba", + "ɛerḍeɣ", + "ɛeyyaci", + "ɛeṭṭleɣ", + "ɛin", + "ɛiraq", + "ɛla", + "ɛli", + "ɛmara", + "ɛni", + "ɛreḍ", + "ɛumar", + "ɛummeɣ", + "ɛyan", + "ɛzuzu", + "ɣef", + "ɣer", + "ɣer-i", + "ɣezzif", + "ɣezzifet", + "ɣeṛ", + "ɣilen", + "ɣileɣ", + "ɣiwel", + "ɣlay", + "ɣlayen", + "ɣlayet", + "ɣlin", + "ɣlint", + "ɣliɣ", + "ɣran", + "ɣren", + "ɣur-", + "ɣur-i", + "ɣur-m", + "ɣur-sen", + "ɣures", + "ɣuri", + "ɣurwat", + "ɣuṛ-s", + "ɣɣaren", + "ḍefren", + "ḍefreɣ", + "ḍrant", + "ḥabib", + "ḥader", + "ḥafi", + "ḥamid", + "ḥareɣ", + "ḥasan", + "ḥaǧ", + "ḥbes", + "ḥdac", + "ḥebsent", + "ḥebseɣ", + "ḥedd", + "ḥekmen", + "ḥemlen", + "ḥemleɣ", + "ḥemmad", + "ḥemmlen", + "ḥemmlent", + "ḥemmleɣ-tt", + "ḥemza", + "ḥeḍren", + "ḥilmi", + "ḥkuɣ", + "ḥlan", + "ḥmed", + "ḥrez", + "ḥsiɣ", + "ḥulfan", + "ḥusseɣ", + "ḥṣiɣ", + "ṛebɛa", + "ṛuḥ", + "ṛṛadyu", + "ṛṛay", + "ṛṛuman", + "ṛṛuḥ", + "ṣaḥariǧ", + "ṣbaḥ", + "ṣbeḥ", + "ṣebreɣ", + "ṣṣa", + "ṣṣber", + "ṣṣeḥ", + "ṣṣura", + "ṣṣut", + "ṣṣwab", + "ṭaher", + "ṭam", + "ṭariqa", + "ṭbel", + "ṭebbat", + "ṭlam", + "ṭmana", + "ṭrables", + "ṭumubil", + "ṭṭbiɛa", + "ṭṭerf", + "ṭṭerk", + "ṭṭfent", + "ṭṭfeɣ-d", + "ṭṭiq", + "ṭṭlam", + "ṭṭseɣ", + "ṭṭṣeɣ", + "ẓeṛ", + "ẓran", + "ẓreg", + "ẓreɣ", + "ẓriɣ", + "ẓṛiɣ", + "ẓẓay", + "ẓẓher" + ] +}