From 5f21a4423c03d27cf38e994ebce18a458ca2fe15 Mon Sep 17 00:00:00 2001 From: erjer-odoo Date: Tue, 18 Nov 2025 19:24:39 +0000 Subject: [PATCH] [ADD] Inventory: add RFID support doc X-original-commit: b1b22cecbfad8efe62187a0b8639120be48cd420 --- .../inventory_and_mrp/barcode/setup.rst | 1 + .../inventory_and_mrp/barcode/setup/rfid.rst | 86 ++++++++++++++++++ .../barcode/setup/rfid/download-apk.png | Bin 0 -> 10258 bytes 3 files changed, 87 insertions(+) create mode 100644 content/applications/inventory_and_mrp/barcode/setup/rfid.rst create mode 100644 content/applications/inventory_and_mrp/barcode/setup/rfid/download-apk.png diff --git a/content/applications/inventory_and_mrp/barcode/setup.rst b/content/applications/inventory_and_mrp/barcode/setup.rst index 7654f27cd9..9ac42de691 100644 --- a/content/applications/inventory_and_mrp/barcode/setup.rst +++ b/content/applications/inventory_and_mrp/barcode/setup.rst @@ -13,3 +13,4 @@ Setup setup/software setup/serial_numbers_lots setup/operation_types + setup/rfid diff --git a/content/applications/inventory_and_mrp/barcode/setup/rfid.rst b/content/applications/inventory_and_mrp/barcode/setup/rfid.rst new file mode 100644 index 0000000000..7a2aebf9e8 --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/setup/rfid.rst @@ -0,0 +1,86 @@ +==== +RFID +==== + +.. |EPC| replace:: :abbr:`EPC (electronic product code)` + +RFID stands for Radio Frequency Identification. RFID enables the tracking of items using radio +waves: RFID tags are attached to products in inventory, and RFID readers can read those tags to +transmit information to a computer. RFID helps automate processes by keeping inventory accurate and +tracking internal and external moves. + +RFID tags transmit electronic product codes (|EPC|), which are unique identifiers to distinguish +individual items. The |EPC| in Odoo is based on GS1 standards to consistently identify products +worldwide. GS1 nomenclature establishes common rules for encoding information within a barcode to +facilitate the global exchange of goods. + +.. seealso:: + :doc:`../operations/gs1_nomenclature` + +Hardware +======== + +The following are required to begin working with RFID in Odoo: + +- Zebra TCX Series mobile computer, or +- Android Smartphone + +Paired with: + +- Zebra RFD40 (can read and write RFID tags) + +Configuration +============= + +Before using RFID tags to manage inventory, the Android Package Kit (APK) with RFID support must be +installed on the mobile computer or smartphone. + +.. important:: + Before installing the APK on an individual device, first enable the ability to install unknown + apps in the device settings. Find this setting in the device's :guilabel:`App` or :guilabel:`App + & Notification` settings, under the :guilabel:`Special access` or :guilabel:`Special app access` + section. + +Then, download the APK. On the :guilabel:`Downloads` page, under the :guilabel:`Mobile Application` +section, click :guilabel:`Download` next to the :guilabel:`Android` option, then select +:guilabel:`Download APK (with Zebra RFID support)` from the drop-down menu. Download this file via a +computer and transfer the APK via USB or Bluetooth, or use the device's web browser to download the +APK. + +.. image:: rfid/download-apk.png + :alt: Download the APK from the Download page. + +Install the APK. If :guilabel:`Install unknown apps` is enabled for the device's web browser, +install the APK directly from the browser download notification. If :guilabel:`Install unknown apps` +is enabled for the device's file manager, open it and navigate to the location where the file is +stored, then tap it to install the APK. + +Then, when reading or writing RFID tags, ensure that the Zebra device and the smart device are +paired and connected. + +Set a compatible barcode +======================== + +Before you can manage inventory using RFID tags, a compatible barcode must be assigned to the +products. Set the product barcode in the product form. + +.. seealso:: + :ref:`Set product barcodes ` + +To work with RFID, the product barcode must be GTIN-14-compatible, and inventory tracking must be +enabled for the product. Product barcodes that are not GTIN-14-compatible must be upgraded to work +with RFID. + +.. note:: + Tracking by serial number or lots does not need to be enabled for this feature to work properly. + +Limitations +=========== + +- The serial number that is part of the |EPC| must only be numeric, as SGTIN-96 is the only + supported encoding scheme for RFID tags in Odoo. Alphanumeric serial numbers are **not** + supported. +- For products tracked by lot, the lot can be scanned in, but it will be considered as one lot with + a quantity of `1`. It does not count individual products in a receipt. +- Only ultra-high frequency (UHF) RFID tags are supported. +- Products need to be GS1-registered because barcodes must be unique. diff --git a/content/applications/inventory_and_mrp/barcode/setup/rfid/download-apk.png b/content/applications/inventory_and_mrp/barcode/setup/rfid/download-apk.png new file mode 100644 index 0000000000000000000000000000000000000000..f216ba229b9a6c349cf71c03f8dd61b0fb01ae61 GIT binary patch literal 10258 zcmb7~bx<5Zx9EEphd>DK7Tnz}KmtL6yGyVTJh*HUAOx2HL4vzG1YLqda18_r?hxF0 zoBLJWTd(dPuijR5^~`k7IkVm8^smpE`Kd+RA~ySVu0>gwwL{$YK6^YZfQ;o)I(YuiiQ?$4jK%gf8VyZgJlyX)(l zyW6Ytv-8u_)4xZ@hlhV}Zf>uxt`qITH#W9<%Hf`3wig$d=jRtEC#U=S2gk=JdwctY z_{=*yyRWTWX{mV4%^VH%ZQr@W%FAnn1Qm>p?Td=4Ha52=CuZpBghoat)KpF8e=qj+ z4=KLXXJZzPk545f=IHJoNKMIEU0oaeIkLRGy0EYu5)v&Zt7UKJ;q2@`H@CpYEu*XR zx*@3|Kk!>^ZPWX}@W{x-u&^(hnifuPef<4HeSLy&9v+esGiGP!^u(pMF7MYjx1wWG z($n*|TEfm(2QF^!*x04p+Pd=c$|RZis;U~FNvW-_ZSX7lOi%y%_#pxg@43G@JsK@- zZRwB{Q&!-WYHDgfyuClZyqnv*w91(u8=G1_y}LbH2z&8{nv9c=j4MP-cBmlM%`^D! zbhC71=WMQ?jZ34mv-jct()fk^-Q`hcR#Enk#hmQohKANZZ8@S^u!o1+hM5CiQ3Gd5 zL6g|-yQ?i#`!CD=Wp{f6Gz>D6>qoV|T89URDsFlHuR>^;RQ=`Ld?g(oZg)>NCkt(* zzSyV)XTdjk5D7!Ab5yj)O2n9c5iY}^ZL8EdNxVNSH2bJ_YcFB37@R9o(X76 zD8Hdnj)M_k{d=;JYb4?1hW$LlH1DuBhwN$!A4W0VQh8u=CMrmm-`nVr@ z+`ekA?O`hkX7}5a7jhkG^3?}e7iVv7uEj6X+_++xLFFgf4q71nUtS830l)?Se3@0M4f9};QcwOSk6F7f_xIX$%e@Ft7ol+E>A)g(9M~M@ z?c8Hs{@pBqvg8odUF5gk{atK(H>-A*(1U0xJ;GA_B64PE(3In~1TDlBdy@6`+gXE} zyrB@?@1cp<&xJ$9PW!}oA$|~j+*y84J_pC1y12}hLFn4MYj>3IDtQ*@$qL!h_ThmX z`h`xa*uffuGG35U47=Va$_Ynw_{if&3T=+-{!rCFNBH=##Y&hV8P_}~2v(+xZNSJp z5U)3wJ|l!a%CT|4zxIpmF9@?9a(h4i(vd@H?(^7}Jd5LMqvx7YpFLlJUWWuu zM(WgNvALZKW>eEAI6JwHO_ILBSyREtjlW23Zig(=;tS7@^O0noY_z>&!Rc}=y>bb@ znYEv14L!YdFvrkWJapDDqwDXw;*yapCFTdi{CF_S(VVkgj&&V3`EhImTKsHVVqIy8 zr*fn*mhUQEQ)>g$v>4b6xr%#m8XI4!2a9>_!g}SkI{iw%U#<1W6Xj=e-s_h92znIH zq$y=>?smpiyfvihKq?`8o*9%fT}4+qPB6sSrD7EK6ms3zL9c4mbHRx@*7DP2ItoKg zOmeklW1PBCj5RUC`PKTFGgi{?0i`0p=5bOy_@PTE3t>GDmpY_hp0#40oapPg;A>0P zK%;Gb^D_(AV3iUqj8UdN!oLNk-kELJ{WleJV-79IKYT&6x5*bvT@&U891k8h>@#-s z9OIvj6=X|ak|vdUJ{tdQNly+Y^V}A}Y!BKTQf;Hpc1}sr4+2_zA3L@PF?MQ2-`QC2 zziUAr=+_YBMS1^>YXD6BJjSyxqwkfR@O?XN)W>S(_NGA8Mv?mR!Kc1Qu#j|EKuh~D z4Fr5#jp>cGC8?YBCu7XJEML{0MB>I${$c%)0vNTAhH{0p#bvh08UmJ$n;)$g3Qn>t z*C^{bi8A!APXr-XvXRf&Ka|AZ1U4Jg)50@Kw=4-xv9Q8RTkI8Gh|nvW`C#dN;Q8CL zxD(34PQpo!O9`YcvDeY={Y+}51PLUD7!X@Z78aKMq7S00BAA9cV!>EyzcmuSxs$T( zS_~>O^koM1%t2sh`(skDU2DL{<9GareK^)YJy6L= zP2GWn(3Aj2;aKf??V6x&e#rd`b0>RuNJd* zO68cFRp9gsj4mRas>`bzfxCCDnmfZP45PwBECVio7;w=mZ(`?A-xZ=%?vh`ewL~OI z^J+m!TbaMAW7HZXzxsnL!=NS%akU;gkt!7l@MWb3b#2-^DJ(7Zw9@y7Qdj!ao|6`u zCfEJrCk+f@%+e}4vPC2qqXSiA@lK;&CX>iFQQ6PVeDEDMQ8kH3hb~j~>aPi`PFqBK zE9SR+EQstsFhyBxL^A5x=b&6zilg+Z2{h2jF^qbB_$#=GOpNvuzl0Bm2OXD`Wtp?s z!tp1+YOEVln^dD#GM4@K%2lrL~`%p$H4IvZB% zn8F8MWU8G;&5sm2i)5G-jleBtLAc>m!px^EGhrobw@;yXg}-D^>I#w!)$fepMAKoR zd1{#IrdofV)o3O?YtP#Ib71~Ng>o_a@2Aj@ABg;8Q2)WA>aGJ{HcPZT1!$zc$rPBw;o)EK&N~dNpwgiE-%D8`hBn^eNLP?PkAV$y_f?zW;VhjDh!EE-}ZQa?^ zLC*OS6CH^2O8Kw4Ygswx-~2mc9g$bOm4E(C@(~n75Bv%J{7}f}1Osp?A{xy9CHVik z@IQ)h0rDlQ#bRL8>E7e?_aqR=c|I7Mh)>`9xMD-SdwJ|@_1f6$R3MTO7_csXA1I#=2nG3)QeqHOEYb5Pa=4oUQkEoF>^>YDpN&Pcl-$SJ30v~{yRmHnhz!19y^Un(e$?F_3!&N7{aU0K#rkYV&DhfQ zQE@Nn3By2-7GCO`Q;Lbldg*1(SgVT$+JZ#nsHR^>FUM4wMESQRsv{n1+_#PwT(z#^J~T6|&#FF_t$302yV$=Oh@6=) z*&DM+aQR~5Q^)t|Tog^aTo?%{XH{5lZG*L9=jWYg=kA6NncvTt(+kQF_GVhyuS+%$ z?Mrc$k{8M@qmhBZP+*9(yf$fPZzm*v;AwO5h)hf|y>?f{7cGS z*kY1z{nh%GP-XRbq{J}Ni;v#3#xr8>8PHMpE2;!SEHvp8jNmlX7*&Wv&2~}tYx6S~O2Ma-la#MQaS@=z=7#+7vW3l5(o?% zIw~d3Z*g$=x8*`j$n3yrf0x;uiu=_f6?f{nAJ1YQ`3MzZ)4qecUEre z+dif1n)WD{orLTcITaOV95%y;vLHoDyxpnwzzvv%gP!^*znORNt;w-7>zjqd`j_ov zzXvS~r&Zc1dE8T6=byklCih4l#Xl}){mG`28?lWldNX*FcG}4g4B#=|e`=-W++M5U zVbdHx2V0zum+WFIJKI>z({C@=uggqJC4XHXR!DW=WYJ#si5>cXcx!lfGc)$B+%yxU zNxxcVjVUV!{#tfo$x2bR(Kp^vb=mep#xiB2S&~d{QrKqQdV`@IMXSS*Rj*L_oYeB2 zW7~2U4|GSxzx-Ueq%@vn@Lwy$VAO9Vvae6!p@uq11<5vGvxH6WEV+RlEVf)Pl9gVs zbg+Okl5^}*P>%*5bvX@nxg9nO*0j+tubSXr6Q9*Tx9T_RHUb-eT#=WX#Xd&MyUC~E zCcT=7^{)&qX^S2H7G$WCtyMRY#ImL)jNs3JAqHP;;8{J!35 zM3KHK=xsm!9*px8G^n<|+b8~>0N~SrqY$rBlZJ!OA<-J8r|7e4%ZFxkqjg z5~gO<$m>t*Z&w+%Jd|}`Q&~RJa{pRPy!BeG`l=KA-ur#*X1o9WVCEEYMaJHb%40q> zE$M6I1On;1+yfuRtZN=iI0WJ$?g}9Yqj+` zkpdk4AQT+S(D(2m9N94GY02-I4cla{}6k!~+A( zUcl7SuDZxBSv4m=`bgQ558K-%PUB9M^^5G<>tnv9Bz4VWmGqr?JO{&`?`K=+hXx;= zsX-+z_=dl*fS=Byg}vL$)Fg4E#x=1m0_*wXc>40e7Wz)4U%O}cGlZW;d?(){dvyVc zCH*O(N;Feb{GoRg2@x}_Y-!E^Ds^VZbnl|sA$dI{IM!CXV^o)ZF4H5fCJ@WIiai{s z4uio?6Kr{Tt7lMdICy7qu)e}clrYhh$9;T_w9hT9y#LprumXk75G#6-jPoNI1W3&% z$#Uh5{6c`@5Df+pKM0~g5d{&}0dzz`v>-yx{{(n2L=CDEVkQ8EgUAF>03ccSDqgR; zqbEF2=lvflkrPZMM2GzQm&fuoA6vVGpA92K;Fj!UIGpm6Q&6-xNZ3NS8HM8b5E{CQ zubD6!vM^Me`=TR}MV=y5l$Hd3FvEQ$%2`h~7(F7b`WnGan4bEB)(|eqgye@Oe29nY zYMPJ|b*Xmt#RxY+Wmm;U+*KS%ti^hc$GFY=6mTFE9+%#uo!!wpN_7}nBUb{jwhh?N zMyl8V1wEV>4S>E02(CL)R}~-l_Z(~bVC#Al&jT5@Mh8h`L`MkJ2aO)6us8oG8cK)- z!%7;gX9Ih75GfS1?@y6sn5Y;YG4QCDoYg!9js|Zn=+3%+tcW~d0cce%lzB4H@_7l2 z5~t(Qhur&L?D#-B9Ro%N-E%-k1-NXW5*P5Jaqs0|zlA_y!b&YJ23ccO!K7K)4`^`N zA`Bu7S**W$9p}UW_CXiyfCw?z5V$WDNIdfTyTxcs_GuMDtDXl@rr5N7UESDi>ja}` zHfzA+8mMXvi7vt4eK62ZGkS;oexftf^$(gZyH zP%iw<0l@@D-o8pbeQ`7(ZGr)Irbdlsyn$KIcz4*%zGs&uZ#UG%fZ`Q0Ru^>L18Pb) ziLND{&WA!HsX`OOcsT@xPplDu28Sx?fu&BJA|n@#+$`N7T<<8ZvqXwAVWZe(JSKwB z?q6*`8(a9zYj0k?mmVrv{fP!+LqV8rj4lB9{hj%#`*kTlx@4Y-%4dhh^i_MAd&#NU zD^zMpLykAYk5V3}B^0@K&E%-kh9^x@{}K$uP?#-QB8nz677Iy6v3 z{mC{WnswMr15hBnwjE&=VB=)Q#7529G7m%2Og@3aQ4oWO1S`_ctPyqGfi9iJKi|nEzaNnlV(-1}Zd^lT zH-Schc&~`SukOjtNpFN(vLP>9+<9IXP0|`gl_*ldby$%?6J*j=oi$c0 z$`#tsh)-rCxZ6^om2wHoubed~Hy?Enfw5bXY8Sqy$L0N)VReu2JG#Y4>2-@}7(R$b z6sc8_{yo-KCX?3kdQxRXzAhF`)JKf4K1yI+WROn#g(zpjy;z2#Lmo>8=C!&}8fh2l zF2+plx%N62FPp~X!wV{F zh%_tVlQ$>>UI6Hm0OyT-C~ct7R6)Fe-#HR)cst~gH_pcxLc?O7x1&GYQbm*;L zyCnS7|6a75E7Eu+Pb<$=eqKPDY=Z7xX4T&jMzi9Of!bGumRfA%{Pg)_S?3785;A6~ z%$ee6zQkXsZNHd(m9OKTM;}4CeaNOQvB{~UDUl&QVky*GN@ApdJ!W3fUqT*Uz4l1z11r2tShhamrjP1TmGmEQ7Y|Zz?req-V zfgCKR{5?(=yS}O(EA>nUU`_!jZ@`t!_J#u*&4js|2*GFw)GYMB7(;^~2{J&3z(sw3 zT!!@4lTs zfr1>Qtt-pD1yd8ztBOxEkmdf~krt(NKW+S=o;ED2hxm((N{L0Ub>SDZfP@mbU9PuM z6pWhM1h!d2f3_Od^DX(E?Z=}4&@$Gk~_}>l(p%8>z3izLJ1Do47s-}%j5}k8G^W_-z%xY3OWfwC) z4y^4hc|jW&E?nsWa`e0746^kT1Pue-zWWT0`}kS4 zY4cAm&pL1SzCV@^y!73DJ{EYpEbvH{{e46m#{Jn2qu%@lK@Amn{B7RzcA!dr_n8wJ{qm|BB*nt?zTj^3ZF* zEee}%)=6XJ=ii_FE70z6GRsHZek9;}$QM{9fA9BR@_uWF=}b4^f}lqVkWd5fm7O!s zFuT9ob=-=!r;V5=(=>0ayg4 zS#PeG9?tIK+&))L_`^C?yFixHI&+boUuaBvCea0Ju~UBgPZiJj{9<2aM1L%r-7Ow{ zUco^h$Pq({#v6zlR%`2eNHexsZPswSr+@S4+M%5@ewrvkvrZCz?O24g5$7V+@xjYa0iVl=;! z#YG*^b)`B&NSydFNdG3@G>A6fpzWySr;yS~Y`;K*u{{0xSWfAEdU__!5W9jwI_G-= z>LgwW;FW~&RB``qqjc`xvHGoTQ%@s`6?;$1(h`h2Z-phDchf5LQCGzA7d00Zu23EL`zDGv@>tYmeLI*Jj8HIo)N+GrfS4GI!d$}|zuJ@>Lt4k@WY%Txy) z>CcK{cTs?q8JM;<6V2{pq{Gq|sZe&JTQJF!*&yt8$A?i#ny}l@@#K?L37r&wOAZTP z?@v&vEYQkcZ4u)Lazf@_P`Uo%g`l4~HDZJB(H@aGL=j zC4{LX{o8265Y~%2=@Z| zJI{&3`~3U+#RLqqi;xt^wTDMO5JfY?2&zPuK?k@{5Cp(~UeElu8&SX$eFa~M0pM=} zWRb`V%z?BX6!IT$gZ-CkbO?~iK&`aA>9NBFqnjw)U5;r-lKseks22sMHQ9PT_32vPOf$mNteX zMQ8QJDwyJG_TU!NlpLkduV>qK9ja0(8WZfh1b$Bm;DxD!sa0swsAzCe@nkwfO}^(< zCLXy{@6}RDQuO^@Ig8gm3NHDPOY0?!H|^sZ>U4i7Y^LB`Am4cR76oP;uCsFbT@+Y+ zAY*f8F{ufz#CQ>c25;(ePWtLnxf-GjtC7H{E`V`}=MijmxLc291tE>4 zkuZ13x{Xa^GSb$8FCsqXeXRO2RKB!_SfX9bt!*vU$SImA--*^Sv)+Hv87F*}oCWwR zD)=!$-=$J!N;7wX@c-2hIzF7LPE@;~#uqP?CQb8oc4P<^tIuZZyL*lVyt$MjV?-&8Y-gEK}sHkRdQTOnDW`E`@ z73E9uiu@R!K7%$ButY8)!}0zmvi-XL@HFM+@TYCO!fY+J4rQCixS=JQ?mv|xCnG@^ zPFT^|95bNlgsLSp=^CZv3|^*XPcl4SsI%S`@X)HN5`vh$sc&4tPWdJM;>y$af_$#W zyB9(+Oyr}M6f+xwBvwB^`0{w6-!rasr(IR_eQA5$?{o!*Zk<;KYj$~?c!|0D34IzV zR>n163nj5qY~(5|?n)Yp<3fgdEF84Bb9dXv7W_^FB;A$7uMTMPel_5T&CBM|z}ga55D|Ao|;AxzjRx$#K;O?;0VYx>$X zYPM#V-PFt>F6+{T;Jre%UMc?%X32^MPPARJHL1 z0RY=i04IyrZR3iU=;st1PqAJ_hUT5r^eUUWv$->+S3yQKwX<|nU!STLV5~(?f2IGG z&CAk_tk$K&s23^7PYPPRHd()oH-l8o+RYywiu|GcV#mVPMWyjrXxRdy#Wb8+Ih3!* ziTXtBqgXyi2^S&ge2OkT+N*_S!o>P2SKS~Y_p3tGcyZf;#bl~6c{p0K9%1ks8Bx|c zEqk7%V~xT;gyDW~s)iUN{)Rzd>&=(E3F_M|*mh_#*f|Qu^!kInDj*lb%J&p8uO0us1>i6Ud$Y*oBHjQY5tFq|w~tZ0 z6@;M>WwGOb9z#A>z9u($yt2m|8=WjmvzBd0f%uE4;7=j#q@q^qz8=cs*%=7B&lDLD zj#le3J?`)BFDhcGNSWFMnkU$-pPBle^JuzmJ#O*hjn{0>!x{f-Tl1@S0kv{NwjV=F z@jJHkC@vfe4?UR(OP@@2B>9mwGC{S<$L1#^?Oet7dMuLMmz7RRrYjT*{ zCydG6Z`G{%?4e)n$w0MC2`L|BbgYRzcvQj-^msil4<5}9j~J4F!u%QHmD>2`=*2Nk z3tRs$BJ?hiYEQsSa0+75hagt0p^b8Ms(n~?4LH)nA$?+ieONhGcS`tB;nQWIX5JPr zmr@wStchsG79XS|1@T!_lEZ6@uiZX3A#xbmrbQeEb23Z>-{j6dyDQ*Z)8S-wqR}TM z+MZy)7l4HFd^lC(MuVMVBHk}x(9%;YxF&RC79ly$J)fZjE}y=blZcwRXn4F(DCTKa z_=VI5Xs}kY51bU3XfbkNwC(R;5x^{rt%~z?OjldbbNl2qn2m}!)I674Hd}0VIu4R3aYQFgBKTvER{d}U89q7TQc>nCdB*a ztS~IRHA@sYUipt!>6ml~toa!&ViA!>6c~W@Qo}g`@RkEP|5;zw9v(|);Fx*Y?yg}x zG9v-fRFBNaQDM!n*l*3(^`lvDm+IWC8lA*YD-roRDqvCwfT33==~#;mec*D5reW%4=dsIZN44X z&x)`5x?!R#m(%U9{ z#Jv@Q{Py>qt^&iXay_5obJaMmZ$s&pZ2*P?PnI*u`x$*Ry-ag|YH4}NeTuVe4k&!LPv_gK+dSM4=Em8Q7B6p}JqvJJ+D1~% zxZc}{uDCmz9lBV$tU22%c3=G&S670Dh+h{H?(d&w7&SFo?Ju3=2n9aQtMx|t3hGlq z532KebX2rdT_QG@z_+yK{H0hw_XEqISNF0_F+Q8m30m3=np`$Sg6=&6%H3c8vb`MA zEeNo?b#^~ce0%UCc@yWr|9HD0Y3xjUyQ}+f^zhu|YB!QgDy`)#{q%Z$hpWx!Yp9n5W3Qm6ZXca^JGoeiViz6eN5Q2UDaYYDBsTljfN+2Ewqw%jd7; J%4N(x{2xF;)`0*3 literal 0 HcmV?d00001