From a74d422b30b2142d4b2195aa86d58acf0c506bfe Mon Sep 17 00:00:00 2001 From: Nazar Klovanych Date: Wed, 12 Aug 2020 19:24:25 +0300 Subject: [PATCH] Exif Reader IMplementation --- .../Model/Jpeg/Segment/ReadExif.php | 74 ++++++++++++++++++ .../Test/_files/exif-image.jpeg | Bin 0 -> 22905 bytes .../Magento/MediaGalleryMetadata/etc/di.xml | 1 + 3 files changed, 75 insertions(+) create mode 100644 app/code/Magento/MediaGalleryMetadata/Model/Jpeg/Segment/ReadExif.php create mode 100644 app/code/Magento/MediaGalleryMetadata/Test/_files/exif-image.jpeg diff --git a/app/code/Magento/MediaGalleryMetadata/Model/Jpeg/Segment/ReadExif.php b/app/code/Magento/MediaGalleryMetadata/Model/Jpeg/Segment/ReadExif.php new file mode 100644 index 0000000000000..0c142403affd1 --- /dev/null +++ b/app/code/Magento/MediaGalleryMetadata/Model/Jpeg/Segment/ReadExif.php @@ -0,0 +1,74 @@ +metadataFactory = $metadataFactory; + } + + /** + * @inheritdoc + */ + public function execute(FileInterface $file): MetadataInterface + { + $title = null; + $description = null; + $keywords = []; + + foreach ($file->getSegments() as $segment) { + if ($this->isExifSegment($segment)) { + } + } + return $this->metadataFactory->create([ + 'title' => $title, + 'description' => $description, + 'keywords' => !empty($keywords) ? $keywords : null + ]); + } + + /** + * Does segment contain Exif data + * + * @param SegmentInterface $segment + * @return bool + */ + private function isExifSegment(SegmentInterface $segment): bool + { + return $segment->getName() === self::EXIF_SEGMENT_NAME + && strncmp( + substr($segment->getData(), self::EXIF_DATA_START_POSITION, 4), + self::EXIF_SEGMENT_START, + self::EXIF_DATA_START_POSITION + ) == 0; + } +} diff --git a/app/code/Magento/MediaGalleryMetadata/Test/_files/exif-image.jpeg b/app/code/Magento/MediaGalleryMetadata/Test/_files/exif-image.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7c1dbc3a6a465fa7f9026e088f623387de657a4c GIT binary patch literal 22905 zcmeFZ2Ut_h`Y*Zw=_=Bs6Qqbr??{WNh@cn+DS{Ab0wTRbAPCZ=gMg?M0RcsgNK-%} zT|hy4lM;F-p@aY_XW>`&x4*s5|2gN}^W1aKbN7mqjI(A)*=k?7eI~o!q^h++6>02Ydh=_pcUy{mRSA%c{vLtI5j?$;+uJ%Bv~J z0y=;{-~`+SBmrl@9tZ&Z05`xBumijfx?@VB`D0vEcaskNnGZ~2{gtN&8&61L`!k=O z5($8102^4Ios#^k{E!OROG?T=^0`$1piM6IA9JNn$)))t4-gMJ|97MPcV!Z?a%!@& z0Px4Jw$TMWJ@9!WTTgp?S1(65ZwiKa*wNeDT}?*D)l1si&dtVN+SbiQ#^2gqMowB* z2GD@|yIb2j+j|Sy*gH76Y6`E{poN8;>@H9*clA>9*A)KMxEh#0D3%cx`c=i-SyR}|;JVNSH&1&ZMQKH8 zSt;;E`pOG~ZFt(Gu}E|7i;UK2$$HKWRS&X*W*?8M(7(&&tTk%gD=1fiu;$L3>L5tQlZa&_c!eIZu4a~*;&u0HE1^%e$4pPevB-wwb`k%Ld zk?oI%yq)g;W7PlD{K1`ns%mHZ=Q!MbJn#RSoSm(V{e62EdslBSu&&$z(OlfsE_m8o zd)r?Glcw;&TbGhmmXeph`Nz8bt&)M8ozvZb|Dw{L16Dhz^jn+YTm7xUgEs$c@VC_? z3^Lc`@bl}Q*spuXR8&tD zdU?dT4v2^+{=^sNQ@#MK3;>Zjg@#HPpk}3_VWpxp0T9rWp{4qD{dx@iqN1ibL`z4{ zz{tc5R;V}zP*c&+P#>b9r9J4DDj2*E9Ac$qJ0Yh{$9}__Uf6>}{z38!29fin^_+&? zSWyKV&oD-&<6PW4ykaNCPn|xasHCi-dRFbiMV(8!m-Y0GZW^1In%y$D1tHbpFUH zvHW>az(%ORHVz#+L=XNu#>~ik?0@>AjDf!F8OjK7n1%{mOf;+j6d)1v9-RXIFGw_$ zAO9DPwfnyqYu;0Tmlr{?F~?8k(`NmQFuu_ynhkJns5DW4k&ea?fz9$9prv{)_mh$5 z@NthE8(Dh_5Q+)r-a?6}cDX-c3K`^7;_R*2vM8Itkhxm#rhQJJOHEzclQI23eiIz5 zgP_HZ;?Xq;H+w@)jxy%?PLcbmKTsoQ3q&Gm`eo0Nk1Op6KA4hXZdSV=*c#=Q*C#o< z|KWUnWKj4|*|nn#YZ4j4Q*p;_kKR|@UdoO~ppCu#JaiA;y>)Tdhh3=e&U`NsNz4h zreht`Y?M!LQvTSc%I%`ho%c$mO18Qz^rtmbOdXI`EI4(11XiZeLn|HG(|IFvpCNJ6kNax&S6;07= zQzCS+5z4s7)6L&efXvkmc*%a^!n-3_LBk5foC&;*3q|@Yot?bjy^LhjQX(u*-Ty9F z=7)Dt@ilCjI1RL(Z#?TO_y(p4EL!R6a1ydrAQtR5`cW#Uwce0ZIy}E=9ewm7qVNT6 zw*(T_<^Ha!o~(w0hi=QgCYatxX>nC~{k&BO(kRSd!csh4dBpRkiK0a3<9>b5dspt3 z-z7YkQtKN#(`^_#rsPdBg6eB=hYV=(;vi`S1ia#p3c7~aB)zhv{nS)0B177?bx&PY zq@%0#mDqseW(8EqKO#+xz6vEUC=s-+K4B-O9TMtzu9i9uBAt5u>{ndnvHaU-)Lv-4 z*45NrgqOMx#&Vt>Nw@oyu_;A%MzweKk%OmYs2%&~P^ld$@ULX9g&nJeQM!c%uAl3f~ivvR{3q2@)ypo zr@}LFGBF=D1QxB)0Z^HUz`DBFb={Spe3Nz7Ps}S-b`)y|Ye`%%(;bCnitC1Y2D{M`NYBs(pK_R{aC-gHFO zD|Cvs+*O!wzD7!K3zQi|D(vM%euT=jpAORCRM$cUKuz~thG{unTN?In*2cnmU1qAQ zv%*?A^ex8{?Ty<`)_o^f?~B|EOiU{w>OWb;&mWc)y5nF?0SrWWZVGm!?-&`SxUVV5 zzFNV)NBeaLq8HPeo?B$hDt>;aoR?@{o0B&&|6!>sl_)-m=J203vJ`2k_O6a-YgrAS ziGxh}sooS^(Fw+38}V1L=n%Tu@QC_q4>iS5{vlwjvTbRY(G*!{^BhtcSz;UGlEiR3A?)%cE}Ui2r!IZsHX#a| z*a|tkR*PmGN_G5Rss7ayzY%DSRZb-hP<<}_9`eoDxkEzp(tw4)d4@HYBEt_lXQFhC z`s6FMA?9mS@T2Z#`+bFWETN4ZmI7+|rpWebBWVt+PQI!A$Vdxf)}S-w;bYT< zL{QTVLoW9t#^9LRjzUZR($XiXuJhzfv=k5iEPO`?0hw}R@=vTEdA2|n@15;^*Gmw) zO$Qmj1d))bPSIS(9u>l9xLQcqoLJjR>4)aPbnhaKu_%GrPfaopU#46 zi1H^epbE*{A$@|1SXkOiLUdKM;=_iBGz!pT1ILS<{Yk$A*9t90Jy}4hpXroSJ(E4i ztirXs_crI-_GTTVe(t8_VHYvg-L=}@G3W(+>=!r(f)jVLW7Ucaearsb;mRIF1}hTH z14{J6uU4FYlwk9(^;HN6;-#+We@f|Gqp3b??U@kOCqMaUABKrq^$T*Cb%Lys$^qRcN4N zk*$KK_gTcnUW=l9P+J;jMsVCX2g;@YR}+NN_YWzAibA_+ni`h()=Cwck6k(Pa@ndJ zCz7Uj)#}psB~_Q21chFuog)ayz6)uBj^x8aszOEMcwNs*`Q~g;fW;e7eQX$O1}o-f z8d;`+&7t1=hRN2xN}tT?8<9J2z0O=@Tws2G9X1bdPmXo{N?v&U*y#Q%_+_Fj$O3ND zUE)Rq91FY(nA+hVyBjEyeDvfb{_dAG6>n4-xKKI;=?DR{_e?$F-ELh~8FA&fA0OqP zHzTbs_jCNAH|mANjx;YeQ^Mri1nDE%bWf(1Y(Fg{$oKj1Qz)L8K~Ck`?O4;8!0a?2 z4g{Q?`7oK zJOyG>yQn1fn}?IirunuSwu&}#-o*t=Z8|D0-h=P&U^#I|S|0L0HT5;^b|vfP4Ju8c z==~j9Ml2S{r+cURq%2g~STY&Oq8^c#b_|bre-7XhfD;=z43RqckPKNhlL&Zqb+Ezs!FT*)>+59xcS6QR7~L8oJkU_Wl7>Q;n}1g z!D~ABN`05FOkIPmgsj1{0kZ*}_L<4hA&qS3FjT#VnNxSk871SF$9t`uFCh)@ls?9B zSV!lrGZyr&J*_6P6i@(riRDpb?11w1+j;_@`?!Q1`=j-gFMg|e?Cu`Gv*5ga34I!B zkKC2qGbMS{P=IbJc!>{*4hBfe5Gj(WP%qQ-GJ3Pvt!#og-eBz(S^U zS3UN19MP;AM)^)5iXX!|8;$F#!sKX6899uqg~M#bBLGh?IGU5#K)hPPHNjJBYG-lh zhZOpMa(HNqH{jsRMZPUTXA>8Q#SBwleM%8G7K!>c42Z+X1OBK`JskT5Yh(eM7L z9bq(e5vhyUx=4s^EAB>6)j!$3>VKMWUu~sqI64*1B*65S_ zE=%EE!&0!d{;2%#k%BnWne3Ms36ewuuXyZQote_&x=oeg+0*tjk*Qh{GxmEga#_aK zhf=3h;-7HUX84`{t$~{#!&g*3tlYgm>Gp{JLfRdFTlhIM zxcO50@sX_9-O53af^IFQH9Zdb=f@bnYBGFBs!vp!5}&swAeZM@NMe!bTo!-=e2v9) z?b8iYfQ7W&qaS`J^#Qs6U1Fj1|3$=xQvetAr^$(TFDO9e_D;kvY1;L>G>yWEkS|tH zfYk|-wD@A(Q3}we8$ki8D8Saw#IR+zM)-!@B7A#?o*c&+V`0Td0g_{{PykdhbW0B2 zVdgfa+YcEfpfRv+vhJEO#|`*s(QcuqmK<*4A(5sq%d|N#&R33q#n4N%z&AlI-FA!L z?+YrlPMka-coHY`?4>^|wu8`>+EF2b?=Rr{7DFnl-IQO7y3BRY^@-okkX zH`k*zJQ5Pl6jFnhledfORvk$T9ze3i=tc(If3N6u^=fdz>}wb%;jK&mVhuV)Hy0uI z)FSaw2z$1llW6L#_jm7#ma%(2Oo53$B^98Wkr6o?Mztp>fOR~S0_d}$?@3HxJt#n# zDFt97CO+OfUt%l!3MoNsK+7VX*LNjYkweN86yQP%8dkDNkFTQuDWzPba2JqLXC;Pl zaIy{*zlAiKCo+OVUnhN%`7sMBk!~$Dg4e9mMhB@Z|0MmewAq}}R^+u?nh)B+uEx<9 z>i7{3Sed3FPH*)tksHhzr5_t^ORJ^vG!}0g24nqEt!j9gP{@WEQHlb<#VLSJMF_ke z;g!%h`10Z7Pm66Y9eUPApuIOi$5JKo)?I}o76J_WYNc^6{Z}PUl4i@$!H{RrJH>gA z$WNiMu(q5LB>9S4G;|DPz#g-bFU}KaCkn7DRR;=T-!2NEXM>_bO=q75r;sg9^a3ko zk|W)9i81c*?WG)YN@5=J?}BVsZ(jmjH4Z)K<@gD5%sr9?Y78L)HgFr=LIF1^=H(u7S4aD_Ki zE1Lp@MIhw0SO~3L@o(}NiwNyMuU+Q85pe(b=~ls#*-x6oPtiJP8`vW#_CwvFMU$P> zfTyU4F1+!;HM2Ko4j=XEl1<}TYwwp?MPWY@uM${GK0nrSEy1Lc-a0?nWOXg-(oVRx za3$&UkW590D+Q?6BA=oF4eYq&T0W#oMj@dcQg$cjvDJl)Dz_49T%zGrDAX5}&%mj? zIw#UQE%1djye4o?9kCg36F2HV=9DhVuae`-ln%$|M{9(SInv-9@F|1`0l1p!xvJL- zqbQ;DMa9q3it`9rmDJ;3kn<&TR|7wxa*?iXRKrABEUJD27{a9L^q@}oSshAsjVMeN zsQP*f%{v3VgN&HKW)oe)o2p9PdNugC(VmxXj>(2$pa3T(qA0-j zYB6%b{W|>*H1?X?uF8JS{*iIyLb1fUIYENV_?-frqyXT{wXW$Ranc4apQ8mIjMtJt zC=t9faa}RxB+mAAvv;nncYU@mm(9se6K)R97p*4m-*vWPACxAuBSdPBR}I{0eSObS zMelHdmzyh$sa=csJPmqg)&681oM5oeiEt#0QTvZJWyIz>RcCHS%oW-_-B?ilnkKye zjqlx}fXY!*_qkB$jU0SG>51)gi>d@+$#Z9q`@KQSec63T8<-t1>FGZQs!N8DZU_z0 z&qp9Cg6LE@Huh~)q$=Pc``6YFI?AoK%ql%kOvcMOJo4 zkeoMaFybqkxWs9JYX8<|(^yQF$_*{|k9`+Y;kW5`Yx~26l7>4M1(i3LSY&TQ|rwBy;m(A8q_`)mf5trWjV;h1Tp=3 z=g*0J)aZZf+{DWgxzdt9C8a;AUmxQMw>gOi?WIE{GMv@Wy>y zQz{Q-j?AWoa|Mx3WHou9po_jMxx01_z86~P$6a*-Wm+L4MpsF>XnXFFUE%jQljOI< z(k~nzuG%{mF?ukZ)w0+U5zTk^KVwF-y{V1!i_kEh2l-3x?JZ}B{pfsf!kk2+Oo;FL z#&G4@h)4EE)kVuAAqF7R${^=nQh=YJZgO+pP6=gd9YkEn^@qb!O>xpMT?&Spcjjv{ zgYkSH{7X+W;h(`qo3p&cJ(izwvyZ>o*45vZL;uma7VQnpHF-vW{|Ei@z^i>b^0z&8 zmm1vn@+egbpc}R{{Fm zUt-sre92<|NmWB@!uyB)J)Jt|QTpZZSVROU>lEZxj@L9zdQ%Ad4f2QaP zwZGSz3YE69GIzqKPE2&B4-95zQGraGMW(ny5!#5SR^d~Y z3Wl{wZ0{|s8WrDg*d;~JCeVu~q;(*IK$Xdb<0ChJhEsscv#7?2p_-;Z$U`knr)+VY z*o-f))ic{y1|AwwOwpAe9Db($plTBZ7=^CWZ>d;`Pa#JxOv1w7&ArF5#BY6-e%m>G zBEecCdOR*^{Z7EbCFhOaDVCPR#ED91tTgcmHV9T-hOH<&b|(xbq{k?Bv1*4l?Gol| ztnc_2^&_oi*mWX1U$crytaz-3k3-?lV~h!%?N^!wM`u!gQh@1ls-5xF{afTtwf-fu zTmG9cJ-Y?h!|A1D`D@YPxO;naJsZ8(D<17N*nO(Zy3i_lRY1TZsl6jfdqpQimas`? ztibVU_qr;v(D+C8Hf@|&k$RKN$1@|)a6CX{Y^5`I4-bVRxCr|=UA!HxWMQYoiK|w6`wT(y){KwE%&DvPWYqaI((!9lBLJ2J9q#sx)Xj2W4nXp7ILAmbybWN>p zOTOz>CMK+>gu-?Y3Fe`*x?*xzDsm!1&i25VeK!z+>v7FWKk6d$5mMki6&}J1?i%( zL@OLENymm?yb_E z=EIb>V~?)*3j>+9F;%WHAC!~hy!u#jiSViQqXd>l^Qc&&Y2ee4w8BgF*$xZz=K%gP zxf90cL{k7BMXDatI6@UZngE$}uIeSirY)5R)}#dwJ%Py|^N36kSScC`b;h+$C$2i- zET+k5nQ$VT^j6nVtBx6SC*KqCV^dX3(uV__c=mR$Y#e=JqXN+(fP&)CBq3w!$|)Zi zh;w=!hu&k=s>|QEd*%st#*WiQTglOD3e7-B%n*4PS*DyXq2o6F%+6j+@9Fpw?bj_Q z>+8BN=;fKbL z-hN-pFR)tND^RWvdzQ1Z{PA5jt$6%K!Tp$Qnly3l?|^@H1E+EDdO|D((_|Ol8U1!gKa^?(+_(DE*+fzX{x|t-4vje*vWv*=ZF+K~1aBomodSr^ zWrFU*b zKLYPTXNvqUkQ;fC1$>a4hTsCit;yawsnBu?Kun)FhOBX*00pI{p@Zm%@ko2Kc0{z&tr!2|yaWixF1zJY|1J`;gtSz%Ys3 zD#HAv%auv-)_4ou?hf-KCwG;OoVk&cPH(MQc3Sf);xu&J2;O5H0!P;C)o~#m32xei zPem6pw_>1WsLV@xmCw^34B;82XLsb80Ma3X<#Y#2%mj-Dbb3{V`FMpB|4QhLuC#K8 zV6bhHJjBCtHN+gWyOhYMV#nB~F4Pg{(bCvkV89 zYyDaD%)}aUMFsS>@^Vq19cgyIkuo%nxZ$Gk;Xk}loHR%$$;~B|soPcALMBg2_F_bt z-e$juM_xJyfJXuhyU)>bwmVyCV4;y6GSRg!_`_2`_xY|IE zVqX{Glri1awBN-q^~}tyKyG;W+>Bz33!}};uhU)%3diK>+!Z$8NtdOq^XAdvw>Jyhq54C89 zh(?46k7*eW3#qOsqS$QP%vbpgt`Bw%58ats%fB`jo~LFieYZ|#vYk>dLB(WqU^CBF z_IgLwUS}be*Je#45_epB>iS4wwKDWkXon-mNvtNpfpZ&shH9yEPuRuDpPJD6z`isH zrqNZ4Mt6UGk@nyaYm)X71L_NG)OJ!csva4W3@6-Wb;F=J3NlQR53g1|m8WfzAh)NR z+!!{Kxt}vJLL`G=MFJt@2yD_NvMPdoVXwI+Qe;l9i$7T{v4lgMGy>qd2x9BRKJP?m5W>|yLSDh~0*@oh^%bdG0phfVR0zA#20Pb$2 z&nVDB2#fZA=Rz~d{bRL_z9}%PqTmSy$i6}M33T;7v$3>O|a~ zGYJKIW&G*39c+3tPl=IWpPsk-qW}?~u=(UD19l2Pr#wOQ4Ao?Mv^hbr$YFvmcy~jwwjfy63IZ&Ducmbj>?8)k z)?1NC--s)@RK>bfEz;~#{P?=YzTOjE{=}c#lI)<0(Lp|DmA48Qql=sJ0j6o;tzG!zNNz%%i8}e)9RHY2zn&DS#S4dPCTu0HQKe zDx}yzGg{(b&|2IMtD8NCx-@EMFS;3VLO?-{mjx=2b77&Heq_e}cjHSS{J1s1 zsO~3PeK8>6795rWQ zUj2#Cg&UbN_O!!gL~DHP+A+Z|+uaE|^PXntI{ni63eUc#6PW?4Q`L-S9eI;2f)ll} z&va)jfA6tze=8uW^BXkuHEz>kOaAqc*@#oR@}A4X^UM~Pd${xA)yXZ?uM_Xko#_WS zAZ=yP}i^e94mU!Lfh z0sA5Svhp~)&Z~v0JG11@PIF z!qHKTP{P3;+N+~WD^%C6r*_NOwER#9e#kBMCr(oBart1}4o}=WT{7Wx+>Z-) zSga`>SKF@n{FU|Y!0JE8MbT3R|2J8hwv7`TkY4EW9E5b(MAMmoBwrYDBOyR7_~H@y z)`2qADke`hBad3ek-q0WlGyjB0E&s7iKDt?T?nXA2g8vI1E{!?m5INX>?$OJ)}BZ7 zHarFTSp&qEQ;>{gt^>2HmT-##h^aR~@Z7y1^!`EupNHloA4j%b!$y%J6)6Dels>5# z)k_2ysxOKxwhM^~K7pQ)MPrapOy^iuL8D8|MrNOG6f}lCO&7OA?vMv3HcW&mzba7rG}^()u^MlephFu}(nZ zTEWc(-R&q&D+;we44}Dr#l6W-HW>=iTrS%Q2-c~>Ie-+ z`o4(Tw;iav2;%xD#t_z|+-;xkSP=I5P#9a-3i)1pu9>?~Z8x>-LvkPM0NP878KG7| zfMIJIv#F|>(N`*rKiV&feaorMs^4S<)x54} z{SxNn%K*Ik`FNt<;e^l^tFtZItCpbO#6B@u`Cys?@Hh)XahA{h@K&71-WIT*@*mj< zZo1sAZL*QZ2yERo;V*7otpGyKEI_aZ&{(c#@TL&a?yV-*A3SRX{5y2285_1_!Cj0D z;bc_fs^;{wmTZYWrIgwytHKE_%34u=*+YA>P<@g#D2S=iu8EQ33>L&q>Rr4Q zujn5#ZW7Nd7ht}$cr`^m-NBPn`>yCD)ek0;J1G_9nx8}(Fw~$AG~%D4r6|B;esx;K zPU|S28MngX2xkFXs8^KJ+DTv!@!>S8FL4-3Ht6~S#UFu@7>j8(rpZj2E}{^Kq!_|x zTDv^iV?q4mH6*9f-i`g^x0`+TTP}Gyt)gZQS+1_?2uTGW_|nO zq$-glJ$J3$Vh2BsYwBMBh57`<+!?}Lkr=h9uQi4loy$6wZSZ#T=S%IaG`q0`I#bO6 zfW(`3p!DO=Zke`;c&EV|Lv-nD^)~}^%0+B94h;@h>^gvJNtzJlax?;ij7a}L_o@1$ zi}?agyAD&iY?!7%HaH3(_b~D=mZvWgYjp8BQ3LB8nw;IyG}UPGa_A7z8QdiZ zv!VdsL3{k83VD3+M-KKnj6rV-KD;q+`hd9uQ?hTdnE*>~ew%|8bhlmkl*`iL77F>$ z6^nFqQ84Wz%Dq|KbMG#E#A90{zpiyJ-9*qF3OUWcXZiz+s>$d;mGP8KNFc;13< zIWb;pYl5GE`ch?dNNw!7in|2lvskLEJ=`<(xJb9x2-+UpK(i$aZ`3-N;z@1mU+a#@-a3BJhY#64a`SSKiO;|7a}T%<595uzfY2!j&5H-4hW z_05(=#mDqhhsn0ZhphcB(gm#PgcRHxdH3vvli$02-V&*82xEyBv7x$;@1LV+y zT}6qF)?a&gLNZa{9^Pg#sG^RUF8PFjmUTT0Izx-40OUF!2#J~r*n<9xjYix8-`>50 zz6OyicGV!jp{_<^&Sja0;X!O7^$D(vgs2Dme?PcIH3`{eMVtk>0aQ6`6-2PzVfcoZ zAXtKW0^LgIC5LK&ydo?U1zq6-S6H4&sG52o7{%tl@>5s+QiHN4=ht1m$t|sZ;tz6{ z!TlV;5P@d}(mB{9r%)==rWf~xK6k!D`+-}i#cXuuM2wp8d;?3O+HBfWj?_lA4;~mQWactj6cHGiUlvy` z3~!*T`Cp+R6vBSMet${-6#9<}|9=o!VF3m=B&}tEu$=4xEce0LR2wXq`?CPV=_tT2 zpw0u@n2`_lS^)R($D!ZZH}ii5N3=GAOJs6lPpM@3%)ZL6qQ+lEph`I?BVU~cEe(Df zP1Bjgbr=&U{&E_S;O@cV)pf0Zv6lW_Gz7Ss=%HiaqK*mCoq}I>+xaF#fX{L6hVR3X zZDz5cMGyAGpSBkae*&%8A*My6SNPmO4cBHh_y~l;PJ?z+{$7seB#fAdTx|=9>QGww zCtwaY^7qIFq!xB(p9~>_Q5ZeRB`3O=OGHy^+`ukR&BtiSy>QIP2)yWb(wRr7D#h&k+b^3o z*V_x&xn1Jd3PUx;@y7^vLQW7pD{yrAtQiK_Fr?E}GdrbD-%$`S+*A}(_ay5QZaxqJzJM0YWbm+n!Glye26AK_bb&*KxAESE;ahZzkq9>O=sqb z9QlnSGP~|V?I7FxbT#_?|XWB z0q5ljK7W;Sgb0kLQN7jas(q7;l7=5wvyQTyX%A@32ik*V=|OwsHnLu!*6XGD7@-C; zHuH*edndWrT;kZ_l4Fi@#$ATF`FFhHTXU86Fz~LyX4J6lG<;=uDv_Y4A#-G|s9?xo ze%M*f=2Hsrb|W)gqgJ}sE+=U|Qsco00ZwK*jRTE^D*~>g`h(x@adlQ#`4@?Lq|55@ zLXat;P;ZI$5E-H!7FG{q?3zMxk4yTS9It%TxXR`EpvmLJQlNeHso7}GU6I$I1~^Xv z9NjqO7sfey6~8Ml%|t{G-|F!4wh-XFn{v~3b$0LywgZ2GFoD}?mP4E)y+EP7$CTP@ z-flux`JU8wrSXfCHB*as!_vqcXTJgjqba{Qq7DwyvRBjuWxv=x=AU3veNLNkCQ?qg z$bmcD^3MKI0dxvwE(=lyAG z|5WBoWH-;t1Y_e4`4WZQsPqokv%ArRbqsXX4L6PPi_9fBU})Te+zuzCC*2-V+&QKg zcPl?m;xzQExHDb7D!<1$$R`MQ9rq%HJA{83%2JUo+xn_`|5a#P*p$2=&$;!AFJGr6 zlCzz$>h*QtCdS`@Yh>5wdF}0oVa#XswsDduO{{N^m|$;dcyR+ z8u2V)=cSJG)V@QwVc8`MgG)mXKZX0Ldup3r-MCRN;JYfWNL7SQoStul#G7AKiwfKJ z&&ECGDc{Ys{rsRbMUc(&9C>f{=uz&;!4HEN6sXN7v!VP%nLr1uQghBDm;O!mMz!JF zp=!skMBX$aue`lI11W1=ZBwHFc4FBd-?MqfziCRsdW|oLTLtf5r(Z_3phgrhMPJ5v zozd(|azF1ivkaHl__6q@PoH6m+jR{3O1Q3Ohk;>`O)m+_xX6wsczMyIJTt|Px7P%; z6w(>&yls*!!k-tg<{oa^7AZO2It*n5k?C>qKA+1<6Y)>WO)9e;GNp4IPGrx8%-Vm% zh_o#k1&F*b^wey`+Yb32oK%m-14nWHRHGq77J6K|hekC8*sRXSV(2(;k8|?@?QCoosZ5%i|EoMfOoNg3J z52*uHPMs`4ecCPDg=jswAKLy!?0Z@A{0J$!29$gNJO6fI* z4v%byRShYf>QhW+@5&IG{`N3if96<#A>&!12M$t?94Dn zqPpZj`FEVKos&0~6Cy*QFP=(Zi*!KiDK_MXx#eq%i3@qlY-c9F`#1>KKn$hkA{4f+ zYnDKo(N!6%Jkup^E0)qzz2{UQC&;apK3SW?R!%3A^|sF!hHBN2&>)uv%jjVHTfa;k z{uwaR`9>u8#hK56hRry(=EB7WH zc2NFZ5OpkXa^Jc@NsAUuNF$m}>y$IAf5}vzpO(N6(InWZ>aTrnvHb5D<`F@kzNH-A zOfy-6-Y*wm*2UJv+G8eIM#K`H6`fDAsON6bJveiNzBZrQw|P!5;BT{Dw57BwD&h;Dy0P5*8Xa1uu2hhF=0Te%7K9&Vh8!9~&h(%iNz^+x zyHWR7d&Y^1sTOU#)Gh@ylI`>-L!tivl`U(Ftk?IJaF!Ql@rS_T+yQcUu7&Tnj zIhE5xWsg#|X!GDvb;UHhy`&H5nK=!w1G5UbD5t`2mC|yBdikh?%RjBt z9%Hrnk2%t8OyF5b#aoWv&hRkEF}L)dx#9MODzD0+nfOkf{2D<4vm6Nx*%NdO*C$?Y z6I%DrlfMX_!ftQRKhk2l=o5eZ(ztitaBU@har7tB2F(wLZ!|PVJ^QCZSV?cd(6O8_ zLsZ1JMcX^JZ?wF~XsN7mSr!_vCu_homEYviP%uJ=^|nfrTl6>^!4xAg!9(cWzF)pC zCQ7ZFsrY2qCMK{p!5;{|28f2JEupc7G6{YIVH2>Pa!s}KPn`0rvUQIn=*NiL(|n}0 zSaNOyQM^OsUUWrKj8ui?c?pt}=vT}0y9Sld-1zt_TbN2utr?0*2A$45YSA>(m4LoS z0TRAz#?e+l*~So%X7X)@4$ih>x zH@-_l^~sO#>Tx3jbtPBV4E)_z2KS}>VR%H3T{W9DYUOh^HlS${+Ol0! z%(N<%&E|X`-)At~oH;VRF0(JmfbUY;RXOHwdcNRuoz<=wT7m#CGA5ud?9{R2y4Wv4 zOupx@ia2{69FcfQfEsl>f=3a&$w;Ug)CIE3uK{i&Sg}xmeDgYaR2lN0iVP6;@V4hj z5NM3keN9Xz&12xiR1h6QlTK&NH+1cu9zO;mtSvbpgv$u8;3T+U-rj>BAtdVKIOG@$ zdfrV|n+;(sbCWJ}B>&*IL7Rkd6GOnb=!%5SapcNp>+0d#?+>?vBz~0-{`O>w2@mY3u5<|oZ zGMI|QQ4OPz_g|N;nzU{Hypp(f>8MAx%E5Wu5L2QJAqCArbP$ip`>=mVg2|$pCwRqB zzDa?fDzzqe(z|Whs_W5iCEpVKrjb=|rn*mM4SpANcdlKCBX|4n7`(py)=QJ!b<}Uy zrEjD9@2-yjY7o~KmR-q^S;iKtt z?LmGW-?uE5oHG=lS2f`%%ia4&r+q>qPz|UZ>*wF+Mw2{4dHt#PKM6!kbN zLiM`eF$+xwe$%|cnLZ8KA`1Zvo`kgN({07?zE^^WgmrduKHDIiOQJetcSCM5>mQ4| zJ^SwUX)WVQ68vYtffE`b$Uty%nDM{+MXFJH*mbt?X9sz6`T@B;w61?)3k++(xIZp7 zx>?+ONg}Ts5^Y<$jWf1HT>M$M<1z-GKeMD4x}n1X{JUf-QR2^4&$|_`{0XzFej~Ya z&iUEpyP^p*)!ELk^Frmea*h&^+7|>P3e6YWFELa`oZuFC9~#Is1hVECRyXQzgA%+k zw`m;!S0V31+sy{xpYq#jg~nE*X^1o`iR)XL+d&r2(bnneemCvd1zxnd%GEG$3)imW zeMzrt#rH2-Et}s>E`;SYLycMkfZU1DSO3mj_%Ir{TlIt5@yoc6MJrw;dcsn*3Vw}i+XQPvR* z(>oHR2*+MW5BE>8DYd-fW6g@U^JB4%64}mW`MA81NMB3T48z&gN7n?Gip!m0Y zuPDIH*YN_?%IcLnE=9RaLE$%u#-O?L*rLr=`5D&lT)KKD)s5nNFX%Ip|0l%eujtLM{F~247rK2u4hT5Is?a(M zRji`9!8GCKkFV3S+hTh$Et#i2_99LfjOa6{PnCu#e?80pnx_6;ANV&w?l77E+ooy$ z{h|L;G@BFnuAXi2!Eym>DSKy*3V(C=hfN=N7?~_`MLnsON9sgSV>KP>2ImJXBnWJC z<319io~OKhG%uX~Dl#$`h7y;fX=st1kMr|tc>+dA^Haegk#{cd$7pA$RVJCHFONsgZIj{^^4Qw*Wy>b6*UkmN*@k zT7AMkMp^dfjC;O@*Tf?{EE4iTx#ZQZIl3wH*|iE)Yg=X-_i6AXiv%~G$8E?Op_Th_!4(AtIGseno^hHZ?JAr+-(CzvCScCa!v(gafje)#P$Z1 z9>?5rxGs(9<6*9K2hph!f^mPC%c9$@IKh!hVd(T22+gFC(?c@A0|F>%PF7>&q|5#7m zTCF(EtSBMY%~s&UrbfuF&tK-QHP;0Srg0nfZWQ>w%QNHp`Spu;*`06s@!ja;@)}+5 z!)xR=*6a13jhsIfxF|m@U-ri{m%Z1L^7%6(e=gnWq+Vdv@z5gw=(fJcw%T9RAHF~2 z&r)N&MX)08NbTC`Iol^EzDxOf`teit->aB@r|s42di?Ml`+=t`z2;Od|8u^6dj7P1 z>Gcv7GiN^MJ+x-0X1z*DyxpdsFK;RUM;+hzpLfEs&yI Magento\MediaGalleryMetadata\Model\Jpeg\Segment\ReadXmp Magento\MediaGalleryMetadata\Model\Jpeg\Segment\ReadIptc + Magento\MediaGalleryMetadata\Model\Jpeg\Segment\ReadExif