From 720c72eec41d4d7d76dd404494365c7decbbecbd Mon Sep 17 00:00:00 2001 From: billwuhao Date: Sun, 23 Mar 2025 07:25:57 +0800 Subject: [PATCH] v1.0.0 --- .github/workflows/publish_action.yml | 22 +++++++++ README-CN.md | 27 +++++++++++ README.md | 29 ++++++++++- __init__.py | 3 ++ gemmaxnode.py | 69 +++++++++++++++++++++++++++ images/2025-03-23_07-12-01.png | Bin 0 -> 36456 bytes pyproject.toml | 15 ++++++ requirements.txt | 0 8 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/publish_action.yml create mode 100644 README-CN.md create mode 100644 __init__.py create mode 100644 gemmaxnode.py create mode 100644 images/2025-03-23_07-12-01.png create mode 100644 pyproject.toml create mode 100644 requirements.txt diff --git a/.github/workflows/publish_action.yml b/.github/workflows/publish_action.yml new file mode 100644 index 0000000..ef9d8d9 --- /dev/null +++ b/.github/workflows/publish_action.yml @@ -0,0 +1,22 @@ +name: Publish to Comfy registry +on: + workflow_dispatch: + push: + branches: + - master + - main + paths: + - "pyproject.toml" + +jobs: + publish-node: + name: Publish Custom Node to registry + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v4 + - name: Publish Custom Node + uses: Comfy-Org/publish-node-action@main + with: + ## Add your own personal access token to your Github Repository secrets and reference it here. + personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} diff --git a/README-CN.md b/README-CN.md new file mode 100644 index 0000000..07692cb --- /dev/null +++ b/README-CN.md @@ -0,0 +1,27 @@ +[中文](README-CN.md)|[English](README.md) + +# 小米 GemmaX 的 ComfyUI 节点: 基于 Gemma 多语言翻译, 支持 28 种语言. + +![](https://github.com/billwuhao/ComfyUI_gemmax/blob/main/images/2025-03-23_07-12-01.png) + +## 📣 更新 + +[2025-03-23]⚒️: 发布版本 v1.0.0. + +## 安装 + +``` +cd ComfyUI/custom_nodes +git clone https://github.com/billwuhao/ComfyUI_gemmax.git +``` + +## 模型下载 + +将下列模型人选其一, 下载放到 `ComfyUI/models/TTS` 目录下. + +[GemmaX2-28-2B-v0.1](https://huggingface.co/ModelSpace/GemmaX2-28-2B-v0.1) +[GemmaX2-28-9B-v0.1](https://huggingface.co/ModelSpace/GemmaX2-28-9B-v0.1) + +## 鸣谢 + +[gemmax](https://github.com/xiaomi-research/gemmax) diff --git a/README.md b/README.md index 55c3f70..fd7b94c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,27 @@ -# ComfyUI_gemmax -XiaoMi GemmaX: Support 28 languages, Multilingual Translator based on Gemma. A node for ComfyUI. +[中文](README-CN.md)|[English](README.md) + +# ComfyUI Nodes for Xiaomi GemmaX: Multi-language translation based on Gemma, supporting 28 languages. + +![](https://github.com/billwuhao/ComfyUI_gemmax/blob/main/images/2025-03-23_07-12-01.png) + +## 📣 Updates + +[2025-03-23]⚒️: Released version v1.0.0. + +## Installation + +``` +cd ComfyUI/custom_nodes +git clone https://github.com/billwuhao/ComfyUI_gemmax.git +``` + +## Model Download + +Choose one of the following models and download it to the `ComfyUI/models/TTS` directory. + +[GemmaX2-28-2B-v0.1](https://huggingface.co/ModelSpace/GemmaX2-28-2B-v0.1) +[GemmaX2-28-9B-v0.1](https://huggingface.co/ModelSpace/GemmaX2-28-9B-v0.1) + +## Acknowledgements + +[gemmax](https://github.com/xiaomi-research/gemmax) diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..90f92f8 --- /dev/null +++ b/__init__.py @@ -0,0 +1,3 @@ +from .gemmaxnode import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS + +__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS'] diff --git a/gemmaxnode.py b/gemmaxnode.py new file mode 100644 index 0000000..9cd9ec0 --- /dev/null +++ b/gemmaxnode.py @@ -0,0 +1,69 @@ +from transformers import AutoModelForCausalLM, AutoTokenizer +import folder_paths +import os +import torch + +models_dir = folder_paths.models_dir +model_path = os.path.join(models_dir, "TTS") + +LANGUAGES = ["Arabic", "Bengali", "Czech", "German", "English", "Spanish", "Persian", "French", "Hebrew", "Hindi", + "Indonesian", "Italian", "Japanese", "Khmer", "Korean", "Lao", "Malay", "Burmese", "Dutch", "Polish", + "Portuguese", "Russian", "Thai", "Tagalog", "Turkish", "Urdu", "Vietnamese", "中文"] + +class GemmaxRun: + tokenizer = None + model_cache = None + device = "cuda" if torch.cuda.is_available() else "cpu" + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "model":(["GemmaX2-28-2B-v0.1", "GemmaX2-28-9B-v0.1"],{"default": "GemmaX2-28-2B-v0.1"}), + "source_language": (LANGUAGES, {"default": "English"}), + "target_language": (LANGUAGES, {"default": "中文"}), + "text": ("STRING",), + "max_new_tokens": ("INT", {"default": 200, "min": 1,}), + "unload_model": ("BOOLEAN", {"default": False}), + }, + } + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("translations",) + FUNCTION = "translate" + CATEGORY = "MW/MW-gemmax" + def translate(self, model, source_language, target_language, text, max_new_tokens, unload_model): + model_id = model_path + "/" + model + if self.model_cache is None: + model = AutoModelForCausalLM.from_pretrained(model_id).eval().to(self.device) + tokenizer = AutoTokenizer.from_pretrained(model_id) + self.tokenizer = tokenizer + self.model_cache = model + else: + model = self.model_cache + tokenizer = self.tokenizer + + text = "将文本从{}翻译成{}:\n\n{}:{}\n\n{}:".format(source_language, target_language, source_language, text, target_language) + + inputs = tokenizer(text, return_tensors="pt").to(self.device) + outputs = model.generate(**inputs, max_new_tokens=max_new_tokens) + translations = tokenizer.decode(outputs[0], skip_special_tokens=True) + + translations = translations.split(f"\n\n{target_language}:")[-1] + + if unload_model: + import gc + self.tokenizer = None + self.model_cache = None + gc.collect() + torch.cuda.empty_cache() + + return (translations,) + + +NODE_CLASS_MAPPINGS = { + "GemmaxRun": GemmaxRun, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "GemmaxRun": "Gemmax Run", +} \ No newline at end of file diff --git a/images/2025-03-23_07-12-01.png b/images/2025-03-23_07-12-01.png new file mode 100644 index 0000000000000000000000000000000000000000..d70adb8c441e492c71d265004d537e5993c6e995 GIT binary patch literal 36456 zcmY(r1z1(j_dR@&mhO}W=~Se<8UhX~T%*@_uBIZ3@tE{61VI?`a#AlL2q6f9;CN9Ufk(0<=4-(h)OT{a zP7s9I@$e5Wi3O7kJc#2gt>dg=Z|>}B;%EkG*u8yc;^b^*Kr}E1K~#{ul=v&Rk2_7C zuk)S4b`~2?%z25T^QJDMfGrwnkM->7|TPOik|9ys`h{K}( z_dN;?(qGd#xc_@9H=3xCy_H^Mc}d8yb-SqXYHA4WqG`6o2_8a;`zCtw=+RSRvHnE0uF(GK=0=JU-d*zgdA>}h8El@ zA9EFlUuJa>gV%~)b$OTC zzpmrzPX$5v+?VKo&Aq2ZV+rH8^<*P>F*7o)jOj%7$0>LV)v2R;jRt`(c%gg@${#REXtgQTs z*r-ySTaQne@dXJfeDC=Lb;|1>VNnRU{T*tR+~Xb_G(as6u-2TJLpi zvu|Tn{wa9ASf!CLBY_;j*Dj*?Q(P&|s3(eG?MA+EeEei3jB@pq61-s%HOGtCx#xDV z&e37lE`JxPFI%aoxMUvIScliA+FD|0AX5+-5*8Mgl$4Z~mR^2@C48c0VPT=Fibcqi z(O;Xh68<#nyAG?7_i0k?J3T!zEktN{cNe0Hb3us1epOt`cXxLPW>95NRdrBRR{YQO zpXs@oXjzw^^~V?2U1@h;r(Rc__cv``Zeqxisp;l#6sBk8)(@#^saJ!q zo(r>j6;&Zs!4pWs-Qb=>F)5gf7~AhSQJulfPj-Vd%pd>B0t+T$jG*{U?^H7Q7W;Z= z`cM7wSmq?cxD&XyMr#`h_35`k{|lny;GLbF)>iRqK~ByONlEnVAJWpM78V9wLPJ6v z9UY;?ib0Xh*|YHT_WV8x&?nXYUS|VVmGK zEa>}mkyM|6Q)s7ooFBQ!ovAd3i1k-n-LP z(b3VTr>D2Kw{KWzmnj*HU&U~W<061zOvRSq%0pcD3Uet0Z%p_J$AG+C6lSC_uK8>& z{0Y&TH@2tw4_HJ_zw#`eL&I{QIJS{4-+x&VH>SS6K0F*1eP_v80FLVU^Y_lquPB}b zQ7vQF4aHM}C66|ciwJ>}fDtH!y_W{d)BN|5qK8lYXGJheEW?h^^{j^suwBzAz#I;} ztAq;_$mLg@4^6IMi)Zli-%Eezx=S+M(Zk#m5T-^G%4+(M4#ly>VKp<`TU+Fq$Y|w! z0s>cK+D5jswdJLyc4OZ(%XcZnE#ZP6YZ!qX07fvsp(X>dNvuC_?h8GfFfrB>p$;oC zgV2I+;C2rK*ppNu0^j{^H|N|YWM;QX*`#-;Tn#he>a6Cj?qB^<%Tp`WZ-4JCo(!@# zO_lI>d>FMMj(TIhZO;ZfIfQelZa1$6Rr7vA;i@gMVvl z>&}ji`Ebwg-?h%0@nzGTD0d)|ITw-hN*)e2Hnx)bdJh|$s2x+OkAYV~-DH)Ik~9;m zsw=tm5@cxOInI98orAUCX~F}d01uugcde%^gEBep1UVDykgABB)+&cWG9$H2`Cd~}^S%xSvc+p)H-O`>z5a%_wTwJ0> zN%^NvsKS3K_bD2)dPeF^Pz2K535+oxq#HP6kddA|d9pE(*&dk6WdlZ6S67$P_lB#X zy0-SB6`Asl3}@6JHR_K4Fp+we?ZVI7Sl=7ki1N6&xXsPYAYw72A)`fd;ua>K9(pOJ znN(tD9CYbQI(jb3>FXed@QH}Z3>pZbNp8*%si<%s5n9a9 zmDxI{9XAV$rwLXd20$v-KPSff%fTtNYyv&4Ma3ctY;KP$jRT1Q(_>7R=B$;9I6nAI zbLVev!m)p)U}F%^Z&yP>xf7LIq;c8xiv@p)urL(TY;F)xb*92 zxTXkkoNldx?ftcl>_$#sQjQ1Q#%4E!1hAmmMv=_UrjHYA?@9Oq{WY#DL88SOd`C{S z&CW=LB2nBRhMfa%K$^|FMG{>=kzxN=%wkyg86g8m$ll;NEBAoWt`DX;%Rq zlyE7DgC^Wa8jZHZiERu^UTTzpFua0-f+(3hLrPf=ehm%v%yv|XC+kvA%VRq)a~r0n zbRjie9MYM)Z84&blpMbFLX?05>BJ;rZrZ+71iVWYT!gqVzD$*hsbX9v>h!4SXp>c> zp~d1ahEyHBl4YVDq%?E)sjgH@NFM?zFHW|^x==-$yv7DY3|scs+<5$9Q zexcCJr{TZ|rRV5tAHYUj7)k)Ah=>S3|JRXCXMxON%T@QRmD;}?Pw^0_>A?|9-i!*1 zp+#xi*(vT_bFBO6dN<0w^nsW*%uRMKyP+ySiN2)E=H#I^u7iSD+yBzaILl2d#Q)H+ zm$|3jvw^;FcG2@ai8!{@?8>P}LPCNm*}8~GUO1Q*7rq!pg@?njVNRtmfrNVODV)NL zEOxj8sJdXGh2&v?ngu@12+X<`L@`~Hh$)l?RTqx`P`Jpu+Pn6TlRD75*SRb80=(Bp z@0O*isv6rK1hQS9?TN>203sR~@`-H%1o1i7M3Ca?n8CaJ1SN#k+XR$=g5fVZ2E*?v z{R!|k#x41#sm9Hr@1S_AD@v<^t5Yu4V$sb9b4Q?6L;&4vaoHU%cdG9Yh-1U?lw`PU zf8GlKY4{;U7w0M&-hrD3mvVFyLTf;qkv-)FYG$8*l|KC~~FDp9CSz@f7Vi?M;9R>RHPF^aG)1h)_Zu*j41KdND+=yjI>1#J%{cO z&dc)pwiIb=P(k(dUdz_Y;Gd4ozc?SaDQUGn2N%6$8Q9ool(EjoI}L}GL$nx*Wj%0% z7!WJkR(D18r3tzXq80EnJWy%-9D2-{6>Xsuz=Rr~%kL*Nn1D-*LbLvkJS91qS43oh zf&CJ_fXHI$fQ*##{)wji?2=>M=%CEA`sRg4TxHovACNf1dfyuwh?T!=@N5`49{CSG zRW;P;!Gs^`7XT0doz(i+Y!nG&k;T+7Pg zmyZ}tEnqEnt*FcQ^>n0`iB|Am5)uEp+SpL#(?4A}o7MWtpOv;`?gt+^fLjGuslzBs zBaZFh-w7k3q@37v78-1rv%5r>8OBGYq2AovE!8pj^b(rG2Uq3w*;JVJ*ikG_N4 zO=uCIg}wsTJvBum9<`yUae`S?7z-}F3oIbOe_+_io#CkpsjI0$5FQ@he$%<(XF+g+lf%s&(6#o zb8~z_F&l5sW^io7sKT(-(^7sb$5Ab3eqnQu zEh-=}uc#|8FaP;)80L0BEml=7E-vE>!A#}gN(ISduCA^$3ROxB8hF{*Fd(gx*GXw< z;q=JJ$k`rSUo98V#e*^=k+GuxF)VTcw=W>CnY}NYdL7sWB4-FaD<$K_pXY5cdFoF_ zi~$MDQLISjhSbXI12kih%gNl5HE~Z{QKA6Y1<2tQ49XeV+^gHjT3&`l#}V(kT!R}@ z$r8FeGvMao$@aP0lylKlaBw&r8p4JW6BDH>3<9Xy!{q{y=;7l503si^RsVQ8 zxD|kg0M6g{dT(K^$kOoH+*%p@g03{l<8S{l1$(~fcL1;Nnt=p{Og4ADZYWd>G9#Gn zch?}5J=Eo=hyGr1$;rtH3ACaE$2alxij|{kuUVnVGq^wx({KNELPyVMq3V}Cuk#qjlWVWI3YyN;e-q~SOW zO9q-OH$}EnQc@!4cSKNhad!U5?}P;HxLg+~XNX)Z!hgK-au=H3b*Y$|9Uo6lPk*hZ zW?VCq#ywkZ+O;`SI8mY(+EA#P{nO)gEB(2(f})}>7JUhbRF)I=39Q^T1s4K!4!oWz zMtmTIP>+kj6T>i21^l}8kMLjQ`KR>^iY{#+LR2o|<%uR>_ zTI7q_a8K!_M>QxQ+VIy>wZVc?Q8e?TJTQE=W1as2XgPS|*)^eq#b73C50Ac%G}gvZ zc+T&4gO7ewBsU_RT1Eg~tmG$rI;t^KW1k{5XI%6fOxmw#vaVmhUMcAnX_fT!^t3(B zc3TcF%<|Y;i4~6?2v-d78>#M8!O&()*HSm5qW?X7JOD?jq$UX@$K61?2TClpnu!4nAPNu^Ky)id8 ztaI$#x5Y)k5fB~lPo11B=slWUCfiTni z`!}EOotL>e1GKun&K+vSMO+@3wsJt5$QKnlvWcG}%j9-@_1?K#hNx?P-Y~jG9$RWP z=lKKZ2XGx59Vv6atc@b2M;A(U=!g8|_nqid7f5jf?(Xi8DZM`If`P_BNB>g%?H))A zP)=>F+sZFMBx#@hPQ z%ks>!Jt-$$p{|2krwvSYdd)X)q*}2?IP9Bm&tjekrh1y>pkrdfl;Q>kREk^eYKRC4 znWxK=+4PWdt1NbMX7yg8zwX{~5xiu?mAb)BC6>g?hzRvlDO_>SZbbs%=o64nWi6q= zpX8t5(61ajCZOdB*!mJ4)@Ev_;vY)S9WF0VIYq^y($ZgvuwuVCI}S!hzV}=BP-RsW zC}My`)|Qm?+tpaSd6V;EWoT%~G*Tzn@lCU6NbqpIKcl=}IRJ(9@KK2{$F2!` zjclVJ-jon;4aT$Iq6$$Pk4;R-b zpD_S=(i@4*D@aOofaVk{a>WRpoSwq9EG`z9ns#bFnv{lZTJT+CI#OqWlFPQIqfQDHt28UYIO>I&107=K(NnE`3@^}L-r>V(%q(C|1tOy8%K%nWC_yHmUgbAqQ)l|wj z#e~prSpYf^?yq`aUgm`J&8J;m41hwv{8Y0BOZ&GqBO9C9AwMy3c3x%WD}yMLs?|I>>_d2M z9i87UtKt#hidI@R!>Phj7ai+DLPOsRWP-)V$DSi*L1g|OI`}@kT?Dl`%mRwkHg~Az z&@dNa&&X*t<=i>Ex#CbGc5bD6iEdO z#&qVL=Ut}2sdc;Q{$jd_{#Brgu2;(WOG(M|jDA)@z%CD=4VJQjwqUfXATwGN*Z>b8 zwcOlo$3g-uR*hQ`#*h3Q?S9$I8*%l+e*gXZcQjEV!nSN8(k|llUgU>BW^F|o0|}hi z#lv?LSR02DFfWdwz+@&rU*N#Vh9Tj_k|87~bTns1yH^R(@^FH9*dTJrkc2lVn z+dx%PmY3%ujSistF0W8})nP$^TJG1i0%p+15IISTA&`4c{hJu6n3l1NOY)Paf`G0D z(e%Kgelp`AP|INBd`kJ&-7T+FX;t;wTetg$_X!N{#w8zj8w*+-XN2S&@o*59&}wFc zMMPrU(KdHM??ocuhztuPG6ZTQGvb+;4-|RDAqZUOL))jU_9jxIe}S?{M`Q9%qf&MWfhf}*jVf4@72{Vj*dsJ&DWW$wR3h0m2XG76Q0sft*x0o0Ioj7R{(%GyncYg zhldVIHiIDH%~acFz=9*z0&{-+_>q$%=6G7RcA;?QbC~ylxMoBWlHap zVZZuv^Zs;z)Dwjr-xjLmtZ5RHlHyK;I1X<*f0OGuXhX1aPN!WbyAT$XFsfoIq89IS zKk;Z9v+Cr_j~h2NEKBk7LJ5#V2_P~xuW+CGVHV##YQwwWy5J3Pc~=#s&wm&SKe9YN zJ|3vwbxBN1;7UkHNtv0MBhrC(!nfL1O!v78)jX+ZZuprgHbUHxPRTf!7_cNcu;NBc z?P_LrU1YyF22h1@;x-cZ_V;UklyT28YIHj^x;r9@K2=gt0cf>A2h<#w!)0lPUqf5( zSAXMl8VJ37{rWK^=(2MGBvlIEn?t`@%(M)e@!8>F|0-oAr7*pz2P7;PgFO0p9{-B{ zhh5J`Pduo@*trt{brxcv{;beUcP+!QKj%KD@Ri~ zcPIe`9|{Nrgt1|f z5ybytmWi&JvQgi}5yvj?GUi>VV`5?!>+uOw+uwjzm6jGER17Z7(lYFcsMETVi3xQi5e)-K3cBUk4!=Kq`b1q2 z2k3xmwn+30z^b4T)!0bR@(~o5YETQFGB8Y90uacpND2XjSA4lORs_l&t%V#IN*Zco zcQmG`hwdTt*ML36jneg20PBLl9S+fujFeQuT|-C5?dHN^mneitel{*K5g!6=AjhPn z^mOKCecTqwN0B^f$;n6%Y&#pkCS-ASYQSy@GB1vRiar{RfWt3Dfd&0N^{AQYclg-D zlK4j9P|t7v7Yghr&}b0ETZqYyNT`PRr4EZHij32qf<%LQfg8Lx1)6=_`;KnI6-~#E;*_7 zzOG*2(1Uq+dJb!-@8vP-iWdA(W0Q!AjRoi`q+H^eZMd!V*RNlv6X3opPV)Y`LD4=( zp~*rOD57plwxrn_-*L;UuGX@XD6|xoqM@0kAAjX`+R3sP-7_xKCodG3+&fW$g?(ap9Rjt?M5$Kn`9X54oFaWB_ zBFNPSwzefg`(C+XhoI(xB|5y+F)h<*u5{hTmbC%YTSW2H^z>Z%3U%l>D$X7kN7-(+ z*1t#)beJb6qAoLSlR1p`dZni}ovpg9ese$mMx@cl$T+x@l93TPtelpY_lwRy^+&+- z(Cnb07W#o~|8d7|`$mAW^715e$)>zN4QG8-J}muw|I8Dc3wZ-Cu(jp5@r?-TM0$B; z<+C0h8Eh#bP?EH@iBvoSsEDI~9Tbz`tsJ^p_T!3U(rm=2|A5+7< zk|0NiFVWc|L7e(F0A#3ufJa(3AZtjE9A*F&jZL{xq@<=M#Wt^fNfJvqF+LvPyH&;T zq~zp?V~havvbUk_t)#EPBC)b!4(EbVzznU}??PeQw^}Z5R(s^G??*(Y@WgI5#LA~^ zfVu|gjDdl{jFe}m|YKG7XuIf;Xwn^Z-{SyTY-vk*5k`A18kFF!nQoh8*>SmkVg zLRzbmEmGo8l}g82l6*}AVmiAmWtT&7;I_3Z^W^B{k9Yot)j)7l-SqV9!V&kK$@1?L zO4w5G5YCHctE{y(G)9tGv{wrO%s#pL+2{j0aP z7hJnAFE7y1;GvDd?EB?^(Am?|v-x5ft?|w2*4PXC`M&P%R&LPOgw$TYer;fY@zCK1 z<7S;N;326)cJ)zx}al%adF+Lnw*3{DIr9#EN)&iI_x zqo!=kISgGIo&-8se$}V_lA`lh&f!ONPmcmn(tsakbd+u{M8L@BGJnd(5U{Y>eg-3b z{iwp8-rn{}rvMZVzH9&vFTEc54^qcpz5$1un@$$2>%-M;Dt9gq|UvPFFtTl~SGEpO9`V@EVzEJt3L zzO}OYR$6*?x~X+kRQb9DT0H+&Gw*@6=Mx$C@yJccyrNA2F=j=nfUX@vXHro+lC}21dB8n#mv|<0qh0 zexyEF?M`@DZz?J(;G}$Ow*V}^u$}%)e@&vL^ZNCcvp|_)Qv?w#2+M)hGa&56JCWh- zQxkOC{X;i~r%yo{{q7h!M&suDJ>5CinucB!5hAoV5OVR38gYueKZXfCe{ZT_xO8y9 zc}%CItlX*n0>P+PMn(o|F|RPFbIkwo zP~BR05m71T31(R2+|{bqFH;i8nC*wi%|QFI27LBS4&6#8k&zTe$j<=gN|1z;l9qZu z@>#(czl%khnwpw?{Xn%&QTvSLgfjAMrw2Ww-{sicNN;9sd6{5&rBKy3IW28-JEIEl zC?!Q_Zh*-dC3P`S1F(UPCdkhp&cQ~aOCmaVHL`}qO4QgkhW5u&I4~RQjAFNcE}eyc z{&r?haAWVcH9H4K&Fd0NauyB_?Q?<-dPeBoaY0+k(W00J+3aZ{4T=ONk6P%3DJuJ% zqTSxIX_p8w85s-9wYuXEcgw%yQx(noySqB|&Tqv|KbV0Yx#-XY3BXer;@CiUd`F<` zsBrX)jZC}D2;4ooxk;vtHd@0pVSqk^h<>ffB za6M+(tS_HbqC^V(- z>hytj%=es)MOW+AsHo(tuO_Q^lXuOP9h2eYwYWXFzF*FHR4AqDRbs`p@d$a9&;N-* zEJ*Xl#!^!2d6S^A6z9g74$JX6XhjB9FIMPC&d7+ejtMvDv3=9&IIuNxrmL8m(lVD9 z6foR~{F$F0@Dbn94o7PPu6U1H)C@3e2HXZm=HDAV+?(lj%&vQ|yUmNvk1r3Uq&x8lc7E@En%TeIYMLi& zdT5))CnWI4thi^vFo8Ki>@OE9E4*vozKt@#eSy84fQ8TOuJfswMSM_V@_zZ9 zcdYxI%vJtmp)3-R!(+Ux4fW@nr&kB{On(X~15)i5y>chEHD~cDFEeCcS@E5gpFY)Kz0(K+<7SRc3)BUDOB&iR z_vo2j3eYNZjcu@)>t^cS?B2wePofI@3k(_miff`uVMb=!`~G@#nQW0k({|I(9U$V! zK4?4#imS`+w5Fk9shgFfMrU5RJjqL>I-B7 z`7eNK@_4uGCcEq}hDeo`ul;>XzrUqREVxIrfi{Qe2GS$D&;t*1#nsWb>UQ6;~47ygkSsG3vqa7x!z;QCU?r??+Eh|F>H+TNy1R!I_zux>;p_ zwB!$7(E$~WJ%#}IVC3K^D=jT8D?|1Jef;u0iRYb<(Xp`LTR=VpC<1QOK=iU(b<)Mh z=MJdipId<7sAt~<)ZS8%m%?%3{eb2`ub2G$I@u^q^f|9|I6DYia*9~w5)<;SO^mCa zY)vhjFUGpa1{I|V&4TXh=N5c14P_TUcV=x8x}OOMO^;0R2nZ=?-~pd9Dp*lCWS}d7 z1ZkJ*>w+fm>Vy^teeZan98N*cGu9auRaIH8v+k$a zi>+s8E)8?+6UOK@|AzKKP_!go4Gbjs0{jI1QbT^ot?98*I>?2v zfCsxw%!*ry5C38m?Cq;yuI_i zzm2`$?DDm}nu!~{zurJA5e>5|d+}FeMB{1K)53xRa3etO&Cj_Rpnld3d^#hW5ektM z*WIR($AlGunZBDh2boy*rwhyO^TwP25pl*b$arJ6R#>`3%1wZ=c@(&C2-`0!l*5j+5PTd@oXtG?UK2|(YcY(U=?(AZZP*6xu< zrMG9(_S&~+J)%Z+XG>Ka_jkQUDRTzh=SvJhKtK%OUCh>rq^@dxy=X z$jmk9RWvu<+uPrd%q(E|bUElNC`5F^sGmz?cL@1Ev?6Uli?7oyoVZEy5z>51Z5W`Z zeP+WPDusAOwpLbc1eV|=uc8W2AelUesd%%%8l>jC=H@duVVQZi{di9T3Q$SxcQWiN4E&ehi>eZ`j#T&LL$7F5K>^PBQr^O#WUa^DY<#GjJaP?0xLu+5VOF9DYMwRnq z_0ZXhvglp=Q{U9AEMC%R);-XDKm`yg#mf#At!d%3^kSc7{FZY2o$GLfG?vhPOI(%g zmB%%(JFl*l-EK~Ima${{zCeeB23H<)HAkv|6|qkIP`eM{^&T5t<^3tOuebB^GzBV; zRn^NKi~y8J4rihbbC?jAe}Gm2($R8v=cho1o@JV(M}XK>QVf$vgj=)_y(Xb(MWa{# zUID2Y88yG@#(h=+IA&zF*HJj1UI<(0uI{>DUXfj+L0z7pc)T;@~*g=#+cCk*Y*E&>sR@JHTO02R#Z1)eC4zFV( zBp`Ug_inMIX8y!UoSy zPc>h?(g))X914z8A(!Y_{R}gfBVLKsSHTy^u)|s7g3om>$?EA z`h&;w$M+6Cs{<&%6ak%yrldbR>g8auLpG2XqTMf47=&jg*O!+sUo8EDY4~^hh|eob z-P6z?SFQh(v*dMlP*9Fu6zLlh+AvGnb2)Uh_V#w1BaugbXoVb;XgiRxa)sSw$hmU44H>?Beb;R-I01H21hQ8P38 zdd%EVYQf0TklK=$s$!Su+u+#R8ge~+m;-rp-i!v3?RcX}_iq~ZqZvvJhvJDQ4o6I~ zH>C`|8=foCFIJC~UK%zboobl4YoN;sE9}YjW_V-U-!t?6;`}*ly_0%jUNsR;c61*) zX%W`Du~y{emK2qofpLNx-Tad;^r7~qTQ*JBZ`o_*bI5JD`>Z5K@89=cTaxFYj3VF= zatU3;u3|8bOEgkIkHmz)RA8w83jaI|W&CS-<7TF8Cur*2u zgmU6)qQ?Eq*XaAkxF_Td{NpzZ={$e9>8d)z(Ip>wXb>62*V_9p&wtZ7=&1SXR^ju$ zxN#HPXb=AArv?r&GsmsN1!LZEW97;@)0dlq8xanp%vW_Bm%*qe7?A z%D{nu`m3(18$OJ$EAK8M+4*MZFG06HWkz~BJ`d&A=~ez&K5&w!+$|_lly&9stXgca zOs_pOCEk%gMS0Za5HJ6){lFRtR}@p0V$eCqSDA(o!GYWuRt=i;U;jibTMG;RRqU1; zP*xWN0X*!WkvLl1G>on7_zT|V&x-r}nxi~}a8s+Xu^?z#Gy?CWKM;k}(nxA%ZYh=T z505Q;F`;}>W@SZHGDVmqb3_3Yp2)Hzb)OQ|#0>(&N8X0<2HlpHy3dJTy`V+;pCi?GP< zf#$p;5B1nNn(BSf5b&KMR0{QuC({c|l>sD=AG-vd0w>g6e`J`MP+a9+5m`hRd{zBL z(u;_-cFVDF%U9uY4NSi_jw8N!3>(&!#luCr^d(tfKag$-JfuJq;Dg*gHMFez?z7?n z=^U>-&%V93pos0-b?MR!vjVJaF$|eUVs)stM~+@0=ptUMi&Ajj|T=eYor~{pNVj|s|IkwGgHJKQ$BAJ#XEL`Zt=bGXYf`{B*%+)P<-?NE5V|6U#9}%h7@`f*?rzSfDZk`FrkK)xpEt2FO6ZambclvA+b5o zwk=DLpze2k&s$D?NL$J;gumsEk{Z75fZZ?1EN*I|L#8NJ9Hh5CRSP#}FWUO^tu z+pW{<-aTZ$<)h_DBLn9;{Q#fQ82t72qfE!CJlFTM2#7?&dA<_+D`a)hz|Jj=Y*4YuK+8nTr|^@I z+G#8;Hf9si-{Xi!|D8X|K~zw1=B$es-?UdD*+jvz?=7)+vDWsVd_~|l1CSZC_`m_a zHT{DZkeWb8PtT_F9qfD>Gp_*Y6Huq~^YgBHjU}m{46+V~I*g~19bQfNXhr9`xIGdt zV{go~g@q(@97j{8p62L5^xf3_M+oa^Q z?7F|Xzq4q_n|s4ef*wMJTa6?vUK zizYk1Uj5CtxFK)8l>_%~Tkl0xCPamID+S98TSaX{V~+21SP7FVmgRwTnm5dd>h^02 z=<{aeU2Lx_8T*6*sOLI#69T^5R3V@=Lt@(bnGLRlv)T~EmR;p_Gv6gNSTrabfgn7S zBVPQ^y-6F^iyD9uv%0$48A${j*1pI6F94JBH)Ka?t6A{rUB`=Ap}`3Q^YZm+UP>6) zy%m;o$ntCSsc_T9NZbO)%P3&OM4kYC;Y|J)hfBllc3Cq+AhEbq8o*BWKQED>WOjq;@o_>a48H6|Px&BLQ-MtO zuo!?ir5^pSIZOwOGG_r?3CSp=)Tk+@;cazgFbNu53vfjg!h?OI`>U&TOk7}d1|Sw6 z!7-@v%x9tn!GJG^`{!fpM&5ZE5~&zD(K0cP@W028Ps*>DMM1{^hK6_m5{5B4Qaiwy zMyd;=tFIgtxFJ?HLyzmonPD7Lt)el@XVsOJmQ0P7!?`7TH9x`0fIS`6l=8t$k(-+< z8H&l2?=wEx`BLN7vFCj9qx7MH8nMN5T*5bB+JbmG$BqtKHyX?I%GF=TMAB3Cr$F90m=ry z+ri>mZ_0D6qTe8r9-J$Avaz59oyG$k2YN7~SHrOYOX3N4PMyEcb9;$h=Y01C0Q2O+}J)z~(c$PE>^=hq&4kxt;ALHDNV^QbsU zwOKDAwZ>lf*c%N?jLYF0&)!&@sL$sU z5y$J0`-Y+&uXhOlun`-`b)0NPOH1MdfLzg$3m^z#13j6m&w-5@9EoB-bN8qV8hk@0o5plxT~Xv zBwK3F{cCUAkf!C|L6(lmB)EKbs(^n*xb>ik*!rH(Rilq-s%}cyKp1rVa$$W|RgYRm zM-!KIqq%LsK1I-N#1g&Xgig-SYrs8dYpoOrHQ_{n2{DT*lb7FZ}) z${JsSMX#p^j1v*0>s1qmo?zh&AMS(iBo~C7#XGEqc@ZHnj2IXg9L+b5z?16aRH08q z9T*tsV{c__yx0+r2cF}{TL0bq0S?X5|WI7(61jM-J_uI+2 z%P<$7=1f$S#5bb%mxH1=2a*Kx=G+Gz9YB zjATuhO!K+gYmfVv5a@8=*iIO8GS>^~{3RvoOE}LGiVe}6xtG}v|z9s(}|#}mx1<3Z8EbV09+gT=)~FpT)Sjv!qDcWDz)LVBJE zgU#7Ma(ZySgWlia)8e0diZ74B?{(a(^=SJ(5%J>V;lZ#i5*R77h=?$qF(Ghn$Aj3KC%z`c=GW;k(kx=qP*hkS9u4f3WOV3ImPbp z*lX);5=w?6w9nMS`R-u2P4_s`g%4X9%O)NG5oO6O4un6eeQ=%79DDME3#h03{7n28 zkw!N#U=D^u?6IxdIs%G=o9Q?*8U@FonZtz$c4{ zU7wMe`4Myo1k*E62?j;)g*rSxnucL$**6}_`1<;qo3GpZ9Fx^<|2|($P|bad7A?)l z1`>H&_3#0T>n%Lka0HGi7hPSFESMHYI1EgrMBtwY0+!W7Hjr8thK6!*&zFOV48at1 zxXs=ilCp_IJOo`tCb zI2FWVB&{^`7qtK;jXD~i^D?WX_a#?&&{{vA#CWV{ghyLQ_V!PG?!LwF*Zcg zWMc!i^JEe1PBh=0g2Du>=hj}4Iq&V*BRQ?YU)1`8nc zha9xORo>C)nmv$!%QIW#t$6~2+pL=81%4Xwy_)GzvhKrpG z=#&7RXxQ>ZGwIC$s&h4n1$h;fWJ*_o%%%7@Uup?ib^JW~VC8fi!I8py!?eHyq;bTLh>r35To zMx0gMYT7X7i6773MiR0~bid%^`wd&>cwH%%%aivYtc4sNR57zMF`Tj9IyXxCETYCq3RI2_8#x=5|rj9xJvT9`J( zV|1!mod+Kaiu_FfV3a!_bhRk?eWk2P^e2*<9d9D};Y_wzm+oP088Ta$(XHyl#4U3c z#$UoVOomwG2NU7Q<~xcdcOTG1y*NAQxCokpA^F{0A0b~OFWG5X@|&c+0S-~1_!F4A z1xd$)Kc4Xa3j6MOtpB#}FOkzo_K3)q>||wy>`-R*EXhjB9_6(6PIf|mDk0gFy^510 zJDali_8e!|b=}W>zn=T`dd|O;f5E@(?nZT~)=1zh!Qk-8Kvt6*EU?26>ln3AWF2D>N{$P0~oFH)7Md2?R7OvfZAGP|!sFgsT zfuKc_dJO9DQ@O(?B~?~kpQwhNlQ-uplTRX;Ulq?6xrQC>=>1;Tvy}Rr9Odi1JW|S> zgd_K*@A;;AX3Roq3E0#N`cpGASFU8Uq7~vVO1jzYu8h$+0ii?w)e2jlKJJkYxlJ?l zQfU24Nr{m8gY0=0sDO(bP9zU?lnJCpTM@d2%)!x7MjDRbXn&Z_@Fw=0&`u$+Gihv^ z)caKBXh)h^;QNAa?2$$Ay^6O?Z-b@ z28yTG6;B8&b<2X3v$AKQ^k;8xz?@=j`3GZKdLtV;h`(`~sJ|E{qsYu>ueegeS)z%@ z{@~T=0fSXUw+ve{vtP>R8#YIyQRNq9a}i zx-&M;iXpL7+?ZleJI44t+ZjksmI)=$nfCVYoh~*r8-J#V_V=Zim%1TPQTXaX-@v53(90@;Fy9Y%T9JZ~V zNzUX83P-c>s7B5DFHhOggg0Eg7YK`=V8642@sv$y(CoVp8>VEeXJRyjx+9Pd>GWP^7gDC z6H_`-W$fGHf}U%Cgz3&9u?8=8L7fo(hVD!N@W?^LAR?wIb?b%}GXa$Une&vA(X4DJ z^YVa5i8wP$>Z*!)?Z^i_mL$|MA%;}~ul8#{4rcY*he#Kr>mw>z>ziND?O(Sen?tR0 zOrgk(V(kI~#=`>t*vqYs*8hmaH_b_wJabd{h)N8(q6lml{QUfys;VGc40~eUC`Yy- zSKFt=RIJ4>;e(HkHNJ-%kMsMzl^=EVt1B6`el5g-PfK*ZTR&?h#Wp#_NhgX2p8H0v z`RfmONaL)W^{UnIi2nM4ns0>9r1~_6(k}4?KV1uIp6ndtZ-2}Ei%mSoDtF4hW%ccs zMN0GI+Y&29Aw1>#M)5NhrslI}y!c(*U1o~+ev7>_teV;*7-nAMBb}YjE|DD`N!n%B zJtg&(Hcw*Xp;eRo)%A)_DL3_Cb!>Xw&D|Z=w@2w6Ht~wG03tuG8B06a%-?1JdULSC z)Op#T7y$-#wyTwjEvK;J{d0^R==z9hco+WsVN+EiyM5{U^%`JJi;D&9(q3Fb0nIPf z!$1<;ep5$7U0tV`plO|e{DdL#`7l18puD*w^;Bt=oWO1K!`B!KijSroPFV)8ncWw> z^dgvuZ*%qB7sQViXimtygi^}Az44UltWdICb5$GdjrK5qA!sG9fdaMk)yxoWR!igQ z+QiA1Kid%1(WxUFVi3s!V1QEv@$&#_%Z`@-n-ISk>H#~G19pGU%*@pO5!R9fDC=`n z23d>YQT65Ei+8LPSzk@%({cItfbt#jl5B7{obr^pE_Qft_g2LSAFXwqg@eOe@b1}( zywu>#oG&Xa)xD!hiAT;2C=7qfA84}ShD%n6!Omi0%@kH5?)jJ_RPOdse^ge(eO;4p zTAa1*elTmpTJA`q(H zb!H?s@K$WXf$#;T&Y!gR1o|=vBC*2=mxaQ;@ReOmE+ym0>lhL#av$m}OUM&qp1o zTf%hu7(0=1*nBLD(=Ua>%YhvU?0YF))LzN=)3rce~-W9BOImrcjJscURX{Iua1vf(in}jdV;*(RL9K%%K7TO>Aa~ zno*_8ouk;UrxSsFKHm{ z9bJnD`CZfNiXTmj2CAV7jE*K%6ILRNv$n^6h>(NBL!e~9a1Ci#j8*~Opy$F>wGiS| z%~U5-eEZi<9n%KNkC&+#gt!hq_SQe9-WF^5FEc(>dV|4-Nd#>t7Hrc2ur2CeVB0+_ zt5>gI&wyh(@dsAPqe!6?*}-Q~$v~+}qcEa=WRpU~Hd&opB_>RW#@LPCshO>xIz$k0 zL5@_WLXVlaaOL;u4X(ez1ng)w<8@vjY zAY5;dwo;(E()5&rVMBQ1VY!=9o^1H7c7fZ4CT3+;r`JARc_5PgsCV4o{0zU?Rki3h zvKO|M1`g@puaitaX2ET-5PZA8e!=`cbCK6lXVn!;2Y$e^r`PRFxITGq&S4QifWT(7 zZYrii9}PWuOEvAYMyOAudo?fE;yu-#Qw&d40?Vo0Y4x%G~-5%2@(0>99%%xnNOlT5{ zT1&Zeqon{qWEV72=j{%-Bxp$m{P(*+>jdCMZDAp_I_mJWOrAa!MNDd* zF6YL`#6zl{0l`S4<6D9l3k3ul|Ml(qs>QR6>+VMH^bwd>@=i`GfIpQ%_64-sP^>c| zncgcB1^r>tfQAs8@vjhG_WJ_PN5%M zkB1&{395Rqx?iND`&s8LW+wg@bB(}TApo!67;3)13hgA$=(w@T^W<Y2%>kwX)W>hcu*fn9;Tkr- zU59VKdH-H%tlYLM8J-7|q?<|}1>Eue`L%w?oyLWHk+(2@+I4sw%dm0B7=d~OH4Gc1{cp>?{Yb^5)x*JW>Q63`=nn&>%F z(eM=rz|)JdQ<&Dw0|%es`p@s*n@NN58{!@8?K^FR@4ovH&^S8n)A%U;5^7^#QTS&2 zZGnLM@RW8=z%;5z^&cUoYF10?(g5WM7n#vpGuQKC`|B!OZ3Z=QZzfjt$jciGQ_g#( zH*E*BUlY0{=qZIYw1F8kRXM%s8^gq?VX0f#RJs3y!-(kqMG{F=KYK1+g+h%E>#&b@ zYW8J91cU_ODelGHnN2Z&wE=k+>w2o-A9Bj}C8@aGAbqko4WgP9epB24^%QP!Izcr0$dCqWNYV9)!`&%Rf5uPH?!&aH&Egfvg34(|e!Je5Zmd*I>qK}eqA9C(}#ow z*_XD_hRe0H-<1ofWU)g0EO9T^$a9wuxFM)Q=4h>HI3)z8d4myPx`5%kuZ|x>!p|8w zd;8yz1(12}yMosHA>j5_YV05cGMUfty^+3F~bIur=Fq~-2)P{sGdsTx`kMzaHOcD z>pxcFm(p5|CMkx+(#08mCe$~q&1qQ{?41th{&Z#W!_@oM^|Rxu|9SaJ*43W~Lq$MdB}ZbmN#n_E{hm6P)-N;n;w43Y|LI~E%c#2Z^{1nA zV`ag&J*5k?t~pY(k=7grKiyvS@>v^EDYM!(va*Cz5Z)2J5grigzI42<>&;NhYxWd} z?DOts2tm!^uOWi-Ic z_dMzm9~1AGc`M9M5Z`vIOd_l8zAg`Q`^ePS7XQ6J{vIx?fiZsj7+@uZ(ffPDZ4tx~ zozb*JLGobzn$6=?5WWzAk+A;w&<^S>5GfZGMQCZ3k}Y)q4ZvBPE9Bo zIF1w+R#x%_7TS7hx-UV~k+M2kwV71x6ZDNyc#D-J z*G=-`j_+BdJbu zC}B*SV()QmwcU%fUsw|Gaxdr~8XbiMB2kG{ug9MzCoLfvZZhec~otKWiL{cCx5?CnNeCUh(;(Gp|NuV6*fLuL1|`~bjW z`4Oe#9@FP6Cl%$}p;j(%ct&YM(u88^h?7N-88o;d8lQQXIc&&XDuJz~F_{<%S2>vQ z=A|(?+GTtKnBI1ewaQbDq$xPi%L=ab$ zx=kLt)0Ri(pq)skz%Lv`4ns|w;>3s1Ga+R87@;Aq+uYa)Z6?S+>2=INAMHJHnCUTA zMFas)i?7(+)+S-A)N}@KjkMjFs1ZpPOL!!QfzOr z-xIk|;W(14!+sX>z6CXaUr-1v@sO&o{P457CW)-Cx@NnzP3#rs&2x9ckS0*z0-^=v z`_OBx3L1G#=&lY;?xEN0%MqY~5+Je$Rv7uvuG!9O1nb<&Sv@K4#TU5kJU#b;7rPFT zFVa5C<%8%X>Ih!Y9QOU$hQhc*MjAn0qb)%;|5LC z;SQorzaXvbF+%X$kHR%W7*KL@vZ! zybg3ZdVmuNZ*>q|ooMg}aq5^AJ3VFxZAn-CQA?gJ*0rs1iL$o{0Q81Z9E4lbZp$z^ zN|80}%Zt5&+{gwM#~a4>%QZ7!E9Ihj-uCcq`_km5wNc88M<=Y%_uH437&<(%jLQ@f zr8`$1{M9>+r0LCoJw8LKi+F8m>D1=_@bEB-1^B7O9|m~HK6pel3(5?6u~`xs8Mmq` z?UL=h8y}fWdbK8w-9CfJk>+5gJAnaZ>i3qUeEW)YO#xRyF6IqD2uDwWi*NPBaZQ;bOqO&9PS0|>2dG-B6q(U zYA!Z-cP1?U=1V(B+{=t*JdN)AXa3LxB`>IS-k9$lPZEg0Xx~33ft34f#>+MGVx7?!*87_?|2>CxpmJg+wi;GhJU_es90d>Dm}mC_3KBJF~&}puG#Ps zT|P=16{n*3E&L*a#75(OF>GwgN)P#Eb%M@XF$>~X@OyHTdFAoBSIrgehmTc{e0Anh z-}@`wz&~b~Jmh6Q*DC*|cVo)6|I96Ptm*j`9uvWQNPAbZzIE%I>1Q@FRBzH*M2_4I zCkC<#NJGTL#5T<^Ob8OMHcp?*CsVO$*mTH)x#*cihD0*7*}6brC&|suTzw{Jo{2h zlv%KA{Rus-v&uI?+fSY()(QMBoeCq)0{bsw^)`IV_7BxY4XiXxnd%eAT6cbexu(dp7GH>CsjPWgzT2cbWq=Pygw5|2pPTxlx_ti0Grv$alBY zI1>s>N*=kni42P2CI)e3dQ5=@06u*k5SGotZe1!5aW}B?R{0)2eLqd@nVFTA)>SCo z5s0x%WTIN$J)~~9jOcPLCN&9*dPTNak(08?pgY6OXB${zpCCjBJ83pw zsD6=Nq3$A6X0u~E)YlMRFya6E`bHHSIyS5%EUSK9CvzSGJvH66U^v1{$~s zlxD`3r$SJsx=BK;h?*(c&)=mattb}A*ax+}!31pXH&;f+$KT&6l!30sfg5yX5Qc!3Dow3t+ZR+kag8akyT<8sBpZc;wT;afP7jdcim$@Oq zl1=xY`rKWBVdZI;)q zEFp4vrqRP+;rBTx!rD!KnH3G3#eL>xa5dPnuC5LX42$mW?2w*6pQe!yv6fyPv#x~q zP52EU-|wQHUBw7Elvr$he0-qJ1Q$398iE?!o;)F!_mP=^6r&CsaHF%KL4b3=UxIT+ zbwaa;myZwF&0akDc_n9O0ci;tnel;vYl4EkBO}Jf##gAUSI6r_2#N-HRw(nQS%S{1 zRD@ImKn1~|RkC9$=@e>zU|jeg6!@!|bCKx04w3Kl-%s)1-$-fTC2a-2`~?OE>ab=! z5q1W8dQaeG`h#q~Sj5hI;yV)|+Kzwk{*5kAk{WeP+x)#bjW!K*>`ut=>2{qzEM-zX z^U}5xHo|${Q$Bl>A*XBSPuDiHPHWvrp}d{44DXTJB#Ba5xTIjIHqzR9)|YB!d3pQr zSY-6~>S_T?)PVi+@87R(7&tqxg3-MvUE->UNaCzu%lPJM=rw z_7x*wWd*bPTm6U1${{Xys_!|7GSqoP^Xl#{_H{G$ekRB*3+@6k570;d+vd3WgM;dk z$>M1h_O4urTAyMY~rTpr|)U9+#afaNjer#)8AH2Aj|U|71RhySIWS zR*T=gqjpl%ijIm>odKX5lyr7+kgWEgBCW*=;?n>QhIJu~@Ss^k%dFNTt{&iHMkx=$ z!^S3k7bu*e)K9IK0sYRGKmtl7KAxh2g82}bOCYx@z2B3GR+s9zQt5dKkt@H^1F7#s zZI5!a+po>OGPS($E`OlU>rd-D6?S<7p*iJ(evWkT;iz@_R?Tse;J!9ByZo-WxStj{ z91$f}G^AXj*p6K}BDuEqeduebL`6j@!sDU^w}d9kP|{DPsAte$Qm2gN2*LDo$?{=1 zTEcot9okH++XqBOr!Y2-V7_6Yz?=wo@N`T-MGb~>EpcX|AR^y~NC1)kngz+jA;%kw zPY-alX^!ip=uqRC4P)4Ds}D1DBT%T$EXzF8ufcplnZg_LI3Y)Bx!7;J2pSCC9hOv> zK?@6zEC3yC??-S{`W+vnfpQfP#{60%b8}fSF@wsQ zGl;GzN62MRWUd!`5r$mCd4f+JW=S`EW@mk?LF=05!Y>7MEELT#ZJS*>2lw}|7p!$M zqXoLKljv`eYFxI;z3bC$I-F0dOx)_kFH~U?06>LkBDYveIQ(Oowd?2Oq(~)g3c`h` zg+Jg)&pDERTMmfKj630FkfHRwWHqHpiP*y0Cbb zdxbPXfNeCif0@$WJFp@KaSwpg@N~}kq}8dSAfg$?0@7PXQrf8%1R0Pk$rQ>V(C}bk z9+ipWMmdqxX#@hz`6E<>$7YD{wrXf?_%UQO4rU)xDL24Kp1fMnFz1L7iOE z^P*RMr@YwL5guL#A<(TbNlkBIW?eCQWT38p{P;1PU6NtR0aVJTk!6ul*D8~bS@u9r zKmzW9>UG}(5timZ+Xp`N4*EKb3=FWI{_U6{bv}=m{hE*vW_XxqG~?_&$Vmj0JCCca zt?hx7DE$4{*e$KTJZM!SMwU-HwEX%eCME_3X4gH?EO9VHNkbIclXoyTs>Gqw1fQ&# z_wqFs`P}<{N7Kw#$`3a|*95=^hm~NbgQ)+(VnO&QIg%|Ybh&L)kfi_TPww?k&_yn?42w<2zD;{loH`ub&oLC5s3-VO+-w$kf`>vP+O>(+A zxjW&THC+i?Qv$D1nhoIOoCy!0%t&h%VfO}O7BzkR;K+zN>b6hC0x#gD@Q$m)ef=Qe z7IZu`r4t7f(7ZL~_bj$@fRvAtOS64w3#|Ib5GK&gNs=4QBn{V_HTN-*wPzEa?|wPg z(A5i3eX_fu^IEt_J4+^REU$HLTNv$)a79+nw_)sVi#D>9s-wj0D{_>Qq0Iv9eF+mQ zIuyK#>Gab&-^=vY>&F+#xu9LowjzW#EFlT<9jpyi1 z=(r)N1Xl6|!4}rtornr57}jP+MxBexZmf(MRLUWjiHZ~(^`8Q^KQlm{l9H0g&;v*H z)HVtJP5>zw^x&zsRuL_)?i6kqe$V{GwN=HQBi*sb$eIygHtT7Y*Jy=7KIoyMm`wdd zh3FFe1JRf;dXCo`bU$7k{mK-sbJ1B}Yj@kfuX7?lYEUhIC;4g&+}^m`ybdXIUY5~O za^n8|BW=QIK1%y*rl~ol7>}jS5Cc2GPu@K%lGbBm%(S@o(b%p`N&b3cE&LEF%M9U4D$(t)yT6=DVqqRg{Q*@%saTZYQX$ zOXuCtB0ZZ4%o={{>jD(=(K4=EDGhtJ0HY}7dOC}Ls;_4v4FNSTiX|wz4G92j0%Y3I zb&r5Ghv^Iz4sz*BGI6WQKTebqbqYhfpSis!hc4C&dxzJ9YjM<*w^E3oYf_)HQ*@Y0`c@bR*enBcwPaWjyE z<1p?NLNf!vwcsWhB6r!Co36`s!RY2SAL{eHhDklsKkp_p ztE^&Jrs(tHPkMD?))mhrsxZdvjozE+SD1x{x?N`xx)E=S;t!D_M@Ne;m#gPXm2%^< zSP&GMFAhRQYF%Q8KC>QP(sxM8v3m7v5>ErZrtsVuW3^V_R#;vaz6$^(*Wb4@rS8`t zOA~RtUnpD9&-7R)<||@ zfuEGi;3r|Z_u;M)MYg&_Z+RPPrSSOBk3aq z`6Ec)$Dp~$FUcGY%EZ1_a^3^1aqR>RC%;OHrSzTunHOJaUd^C8dGyWL8BhpB_bfj} zSZK_mWwnqBqMZSDBo_3yLn}I^S79o4cbXSGUfYQrZ2F(CeByFzinvF#-U!H0|PDveWN2PCIC@Sm&E17`z%H<$8umCl^l zHA&4y-u}C(nbS9HZI`beX*We)t)86Rc=R+<0FU~{uij9&Nm4{iOGc?O|OyIDJr=` zO90=>PQ=#Aw;wSoSK!vH%>~swbXPZJgl`1I-w-^Dw7`@Q4Yq8|SsNPcQEI~c`-eoZ zr6v`_#kUK)hqTW8C!1CNnkjErv`sfxul+IJo*Y=?YB;i)J$+AA2HAiJ5)^Dff~d*8 z)BodEZ6WA!ocjmJ8BNXJ4P`#>`Z8tl(e=EG`TYIL{>QgFN9#|vi=7=DYQZl*MEeT^ zOy5FI2$rfdQ76S-F%^jpUO*o-wQd`R!cD7m&2ef_gzqEqZXv6YnHB1TK8DFbp_(ConnO*SmC)2A+gQP(VhEUgX5lNg2TnmAdW zppYlMC<#G%5KaU~sj$p|j#+LVC

uDCI)}#JX4HUV)~$+Ec3S5%kfPbYYyVIjS8m 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 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..bf458a6 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,15 @@ +[project] +name = "gemmax-mw" +description = "XiaoMi GemmaX: Support 28 languages, Multilingual Translator based on Gemma. A node for ComfyUI." +version = "1.0.0" +license = {file = "LICENSE"} +dependencies = [] + +[project.urls] +Repository = "https://github.com/billwuhao/ComfyUI_gemmax" +# Used by Comfy Registry https://comfyregistry.org + +[tool.comfy] +PublisherId = "mw" +DisplayName = "MW-ComfyUI_gemmax" +Icon = "" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e69de29