From dfd8a43df273e587af7d783d832aa085f84c3a79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Daniel=20Guti=C3=A9rrez=20Mar=C3=ADn?= Date: Fri, 26 Sep 2014 20:28:56 -0500 Subject: [PATCH 1/6] Added first version support for uploading to s3 --- examples/app.js | 32 ++++++++++- examples/config.js | 1 + .../28071_10151274648580240_1606415380_n.jpg | Bin 0 -> 12845 bytes .../28071_10151274648580240_1606415380_n.jpg | Bin 0 -> 34192 bytes .../28071_10151274648580240_1606415380_n.jpg | Bin 0 -> 12665 bytes .../28071_10151274648580240_1606415380_n.jpg | Bin 0 -> 5952 bytes .../28071_10151274648580240_1606415380_n.jpg | Bin 0 -> 2087 bytes lib/uploadhandler.js | 54 ++++++++++++++++-- package.json | 5 +- 9 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 examples/public/uploads/location/28071_10151274648580240_1606415380_n.jpg create mode 100644 examples/public/uploads/location/large/28071_10151274648580240_1606415380_n.jpg create mode 100644 examples/public/uploads/location/medium/28071_10151274648580240_1606415380_n.jpg create mode 100644 examples/public/uploads/location/small/28071_10151274648580240_1606415380_n.jpg create mode 100644 examples/public/uploads/location/thumbnail/28071_10151274648580240_1606415380_n.jpg diff --git a/examples/app.js b/examples/app.js index 429526d..b6f3310 100644 --- a/examples/app.js +++ b/examples/app.js @@ -8,7 +8,8 @@ * */ var express = require('express'), http = require('http'), - upload = require('../'); + upload = require('../'), + AWS = require('aws-sdk'); var swig = require('swig'); @@ -29,6 +30,13 @@ swig.setDefaults({ cache: false // default 'memory' }); +var varS3Region = 'THE REGION FROM AMAZON', + s3Bucket = 'YOUR BUCKET NAME'; +AWS.config.update({ + "accessKeyId" : "YOUR ACCESS KEY ID", + "secretAccessKey": "YOUR SECRET ACCESS KEY", + "region" : varS3Region +}); // jquery-file-upload helper app.use('/upload/default', function (req, res, next) { @@ -36,7 +44,16 @@ app.use('/upload/default', function (req, res, next) { tmpDir: dirs.temp, uploadDir: __dirname + dirs.default, uploadUrl: dirs.default_url, - imageVersions: resizeConf.default + imageVersions: resizeConf.default, + s3Bucket: function () { + return s3Bucket; + }, + s3Region: function () { + return varS3Region; + }, + s3Url: function () { + return dirs.default_s3_url; + } })(req, res, next); }); @@ -44,7 +61,16 @@ app.use('/upload/location', upload.fileHandler({ tmpDir: dirs.temp, uploadDir: __dirname + dirs.location, uploadUrl: dirs.location_url, - imageVersions: resizeConf.location + imageVersions: resizeConf.location, + s3Bucket: function () { + return s3Bucket; + }, + s3Region: function () { + return varS3Region; + }, + s3Url: function () { + return dirs.default_s3_url; + } })); app.use('/upload/location/list', function (req, res, next) { diff --git a/examples/config.js b/examples/config.js index b4138cc..7270c86 100644 --- a/examples/config.js +++ b/examples/config.js @@ -50,6 +50,7 @@ exports.directors = { default: '/public/uploads/default', default_url: '/uploads/default', + default_s3_url: '/uploads', location: '/public/uploads/location', location_url: '/uploads/location' diff --git a/examples/public/uploads/location/28071_10151274648580240_1606415380_n.jpg b/examples/public/uploads/location/28071_10151274648580240_1606415380_n.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e80882ffd8d20794510137c469bc1ec64ad6e3f GIT binary patch literal 12845 zcmb_?1yo$m(&ykhFu1z}m%$~t`{3?_LvV-SuE8x>(BSUw8ZLHQjxy?yde+^}MXSYym(DGV(G27+3%R=Jf@5`2&Dw0=(?NlFCa; zny9I(%E&8817Kbyu;>mJj&86Z0Kn17-Bn#yf>KvcpAu>P^;bjyH~=F+z|6wUSzJv` z3Gjbxx66OW000(P|MvBNRQulxP%WWu7O$eG*N?G@BgvYe|T{CuT$W9^~Ix0Q@(v{G|Wz%(DQ1)^GrT zaP2=l+5!LoGYkM|nYHk6_59Zu0OHs4B+NLR1;Phpd$e1SC?14_o9dD=2}~&TK?VWh zW%SeD*%u+YKHI;_wl`p5@QCB(<>ebd5`ct&fQSH(gouEMjD&=YiiL)Xf`W>N2|~vr z#3Lpm#3LjiA%8j1b)NB%=EVt7$jt5R1{QPG&Ec$ zQbJOu|L68H0Kh_qVFX;j0jL2mSTL|yFfT&@l2-%4!Th~v|J`8WVc-xD0Z6YxA{fB` zDtq-lEF3(-|4p<8K!$ya8iN6bG}t|Yq_j08{F&B znaO?&=+{FD0q3vxD{1o6{n?)&6VcQ^Atu5X0T_Wk`vI8W-_iyE_)*u6Lo-{-N)Jk5 zGF;ar*VfapG>I11NjS^N!?QN(U(><)b`Cdp+kH8b$;hlYrLhw9FnJ`PZG0DgE?o|k@fuE> zbYJ&Vh))sI<3&g8Qyrq6%X5hAm@%sm3HM@}@EZ&^FallGkpWC64fDm5mxlNEY^+fu z@$ot5fB6*tJDKPt;7P;pZxD+r`OvXLRTFf;16oMM4)H;ZSkZD;qGk&Y41Phi+4F1R)?KV zAq_Pi9St-$XB48Ncnd)pSgjFCOv>FT%)^xrY^ivp{}?X^qd<#Jlpm$@cxBGs@lIE* zEHHF4y%S$Lo@Qm4^knt*y*gYE+T%JN*!s0m?haC()Ykmtn}&|z879Czp5lmDGXso7Y5NSH;^TMOty3q5Rsxtt&90nAD3`vxtruVQ=JwiiN|$Q} zx=E`O#96Mjb(OyhUuk(L`qo=gZu-K9wjH{>!LL|7p$((6HTfYm=tI=stqp2jo|_z0 zeZbV8uOJbp*7O*8v;ahZNT6}WA zSF0~Ap|%a{dt)DEt5CRLD+_n7av!yVFw~#WM@3LdJA>??FGVPDS2ioa(JVCP6#p5D zDKxKkq^St}Bv73E$*t|I29-aSxmBABvAJlBP8|W0UA07BiTDVHs^-0t&$w(?yh>}# z^1;cBY}KNDWO48Ik+jG6GOhpuN_nrRy4E+;YJyzX-k#pdPF&=i*F$kX%iKg#u~tXB zWETj+#>URp2A2m5bFO4reU*fqYXxbmzh|3NUJGRs&_yHiK8abd`)UVC$heqdIX@B% zcjmaBgD-w7?F&=-wfU{MhfaJHye9NA+)b+ceDtG^y^BJbor-D7f#@#MR-BcIiiRU! z+>#C@z9(RS+#AM(a~pBs(fgY91dZ7U-^F86EK*d7tp+3XSm5kT^)>pifB-OXaIlE5 zaIewppTGt4O2A`b<4_@ha4D%d!Qyya5;U|N+-fgt0OZ%`27>_m0+?b4j1N&+#_hn$ z4-PCkz5sSQo>I|%sj-js^-{q;g`w4!83hQQY`q>{zx={IT2}y+?1Yu`7q6A=nC)^% zl3RGHx)tRRB+z|$ilF&r{|g$ZR6CCMz{ftG_CWVQ>-}M@D(3Y)RW0d1vB<1eEnTiH zRoXFL<}a>qe+U;onL>Iv{sN#uBPUAMVftZY(!~84&%B-)yGr{_Qe2X!j*hsD3)Owm z&ztwdo6Fb{JEWRG|8K3y0ZTz@y zxXSpacd}qy*Fs4qTudXl3^5%sjkdt=7GE97L@M$MiwbLO8C;Q*CytK~u|b~KT9ouN z1I@Y}5o{H)73Rm;9R=}X%;)uS>~4&v@m$yw6>zu>L}bvIVMJDN9n&OsRpw+BrxN0v z(8vj0_Ow-lUU^n-9*&O8q#TI{PSdw6`W(AJhMy^THBDd48~Ru|nwF9ADku3oNM!JJ z!-I4YqO`S9Q+&pO4huwB`*_?rmqNc1y?A2roF?CJ%1x%>r&wOuk?T5!`lq_RXrSFb6?0ElF{@f0ux7%v4aX7j@zLhO7t zYX|n;ka&8p4tnksh3Y{T@CCcpvJ+hQzXEq{VO76U48+}q!!>__V%WJ+j<8H1QO>zw0LufX1CfHCGWrI7|b z4-@txFWHr9t8S%^l#cu60OnO}CoPtacd6?|Y_a$ZJc#g1Bq{kM)G;!Gg8PdzdAN(z zA-&}q3o0FMDy12wP6~f==y+lani9?IY|SqjnpnJ8SGb#6lpa>`3zjT#jb$2d<|j#k z!g7__-QK3zf>vD7Ig8r7>gUvRPGUZK=341u6s2Wdkw_$HMV_T1(y%o(4LUmQrT97? zQZqK;{5gBt(w15i3;G-t22u}mz7zj zZqH=reoNApV#eLS?>}XSuAk*}tXg8ZhTo3?`%$KK3t|TmozlK&V3Q0MQhiyFrX5AK zM*A=z1e>wM-`SHbrO20kp4gS~An$f!Og!xerbW zjWg%r())bH?;u)>U4+*;gE@Z=XjY$Y-_z`_%z4S~>}hZ|Mya@taTaWdgVOd!Z5Zvm zQ&VRgd8}O|>x#b-T{)ctsT6-kAtao+B=@lz9ToGaPwSGvH=UPRvo{FveYeo?JA5)q z)ncg*8)jBcSCHMyiM42Vjme=whX_v!lfG?ORMeoh`z@u%6X16JUHL3R5nnaRuQ01# z?Tg&1w=kxb=1f@@*pUP3mf}>gmEB=Chzo_A-9s8}{PvBc) zwr;^s-w#%}=g&fbI9=*lr+`6DAT%hLP)!!grMNU(um*VXV&zSM2JYXwDx)0+Gu zO}_QY^1p|^dp3Dp2C1AB{_A?BnJ;Zk;)nE@|ClX$;}~E{g+9g;O~j$lx7bd^v(ZLZgR1`G6RE;tTO@qbzCH8T>0xjVMAgH%+=$`!>czcvUo-K1zbKEAC=&&Mii zo<5l;5m!D3U-u(RkCIf+g^A1~ot91Fl(xozyVMDnMT#@c6V|=-U1C+C+0Lb9>|shF zpA?06WW4mo!MWslEXBO*N~dh}T~xP@cNb?gZe(JW^YI*^R2Xx-u(HNhTK#ARB^8( zyD_HOl*3cyqG#lWNjkPm1Rv|y>*o0jmtf(L;9fBk(!b#n78U2~mBZmsbAZJmW-iI_ zVuduW!Cd{g5^Cz^^>hD)n-E1`ag$O=k(wz;`19v0wm`hufny`Z+KY~_`X@&3!xuYx z(LP@kM#Lsm^cP*LsWEiVOf>Fu;Br9RYw{Q*n88H`T6do5&!keft#P4e}l4p?b z))2efm#C05O3_S%jbBK^aNdL4_O&Pd18SQn%C$}r;h6F}=?KvQI)_u3!iK|`XsN)n zZt49tx7O%RC8b=la%@7;959T&*Zjimw6P7dURhk;K@SnIz`)TOlAlBE%3_MajhR15 zsEoS3)5+tmlM0m}V)!Iu$~n3B65SU5~D`Uv^d5qrI{R!Jwvz%Oa5JHjCJ z75%EH4S132<+i5T1ph@;goGVWuhxS!e1SKQH0)$iET0Jrn!Gy>*z7a&@s7w zw1#rzQ~>cxkxsXZ5v+*IVfiKyPN#uB^o4Q$;BAwar6LK8{QO%i$+Ub2F1`UGYW$xe zL@xl_NbiG$ZTz2@*g|ikw&|@0LXHHzLyBx{GY2XoiOt9bgz7%iZPLfYQ82WY1b&<% z@NzM9yf@@G(PTcX!Pt|RrOeVZ&{*FMAXpH5Bfe(|?M&;W<}y0$wQ}PdQ%7PGxLnox zg4<~qadgi1i@^6`8Q1qYUZMLf9x{w%2{%dG-D!hE`JB8K*aLocU1WrojezBB$F3ow z>jl8Sq@gnVJ;RVjdHI}2*i4Y2y!N6(S3Rr7$9+zazc;9D#wb7H&Y-s>K4JQu=Wpec zDkNKt7XU>=m~&;1z=jD7fl$Y@EYxm#q0TX=b7B)FEo2j*2iNHN(aJ~yqD4%%Y#dYB zErK7=D|XsSp}Lu>yynOtU$Bo;%d_p$1b0~6g6$ZVvn?cJb#l8JJC<481;t-CLRNLm6*nE zJJCD%EQ(y8U|H*Tf;#yXg`pFb(Qe{^!FmGW`lF>iYA6N|(WJIxY$JjpLjmjl;zhy> zV1;FwEHVKy(h-rJO|8#S`2ujcU@19R@%}A_=Uh}7QJg-kUZS}`cKba%gS=~Qf*%MY zbo;ji!vK0MCBB9;82Hza_OE~j^ZHPWLqKLOl)=e`^%vWh9BTdlPJl$IUI3Lv&}Y*2 zLwkEgU^PK$b;LcSlKRBl>kqNnF4|MlUGM9&Zj`?`dP~oKgL$U(XGFA`YvUQMCMfnz<+73t-Xl z+l8rZ2ivw6`QVB>*BV;aZA>S7eXEk6L@x3JLh8rxR1{{XJ^r6e&xjqKX0#$Z&XaDB zRX?sz>-jiVf03VKyT(k6#Cw?Ne{`3g1hJ<#b~kk5+?)q_!*{*IdJ! zuKKqWdStFuBC>`Ba~5H)Tb*hhqt4SFg|^oO!|b0IRszPi=~DfbFodHA^||Y91ERTy z5#{OnE_lAZ6P}CFHG~+W`w%}NEs6wRN5R+QJrZOjD>U8IjnJ_m;5E}VUIuIQM|C55 zlc60NA}b{glSqcHBBZ>TvRzqd@DnlSTxs#Hf*`gy$RkfT{rDvw2g708W1BKrne5>t zISHB!vyAq8JEwvvwoo`xO++Ar{sYLLA*XI4^ZceDA!0f#c4cVggD7EM6u3=@jBTAV z-LxH>L6aJY7$pvo4&$`FFO5hX4ZtlS!JQk5vp6TCiXeQ#WVlYQmsOAJ@6R$cpwzH1 zoIrWU-8W7AZLjHx!D%2(oN?rdt7Q-vd!uHFCYu`jSt7nyf%Ot`T1 z;nB6g=WO#s|J-YlqvL2SRJ>yx1;;!tE$Yi)gJV5eF!QNea-s-J3q$#2yXhB#RIzq{ z6y?u);G+=#YEG}O#V9tmGUT)7;HkQ_z)S-l9|& zK}ScMqFco4EDj&W4;)jUqU3T+dHA+3xF?g3!OTsweaCny_7|3&^|v#|^iHgXlCX64 zh4e#}U-u>)&zGYe%s&dT5v?R?uT>rPi-hOD2`emt7B**&2&J>`^t4b{r|{|}Z>k%w zWMvAWE8NmJ4b1c2vyTkh*DtCY=u3=~FjW?jw4v}8OAdp+ZV|OybB13?1r+7AN$)oX zH1rI|5d~v9)DPvxp{QVkO7hx4@c?hY47AInlH>67(8z>_O?S z+y|Xz?h$dxzzJ9AB>C3|5!X&AS#j?B*XWzukk zB5>+8-&oLH#)s69h6HqS_t5YVPDi9jUyE;1&VAa9c`dx z@z}utQ4aWGZX4xJnuQm~!a{PLgz2sZ@icDLdNqnSFGp2Y2~i+?+Zksf(}*nwZ;ir@zk@=A7G}qlqr1>eAtM~U z!u6hB6O%6hnLiFMfY4x5!=-Cmg7t5Y_(ZWOepiJyVUa80>C~S!c?$_X9$FX7#11eZ;P2oBk6?4W+_o!w3v}!!4gsu;-Iy{N*M9)0tPp zihEUNQJJoPN}Vn{KdI>`*!I>qJnyJj@sn$b%n)5Lzl+xHH74z4J^mxkX>I_i_qcnG zLio~5B>y$^T6Lz4Zfu>r13y|M)Pfe_`S*K^9kwdjK1K9D9W1{&VvR$=#As#XW}gGQ zh$*`h&l(iZpqJwc)C;brEsXii3XDxbJrRn?T>E$1EJ}feY2HL+O|JBTFkx0k*jo`1 zhwGx$9KVOhN5ku%7?oZCLA`tnklMmtBpM0loqic3EGyHQ0S)A@TJG%Ss`V4Sl4|E6AG4?nP(KEl zLLte24ZUIR_^BZ(hb?UHAh zq%fq)=LoqGlD>7VK3!pdvGdag%IdId~IU z5vG*yQuFvmyMyP+UZJrhfruxttMxE9Qc2JV^LzS^65m}j@2aVOHviS^hFw+zh3(~$ zuGwQnZ2K8FyuH}b$rBuO&Ua!5?UkI6{8zI67p}qmw`?5-3-lMSy}~t);KKUupCmx5jTXf+%$wLd zFtixatbrAWU(JMVfuF+Lq)C(8!)0-&-;xGb$w`Cp=n5;* z9JU)9P9!UQ1ZZy*PVrM?(az{|;af|YT1GNLquLDN){7l;2-V~d<<_w&KT-!D>%Wz` zNV;3OW;X}+uN$DY_H8njK3OEgBN>le@-t>lMMX12AaNwO9zw0C`hJ0r2exrk;<+W3 z>KDJFWz2J@`}j&*6&s=ZVRuM6c?(gN*FT!!)!n6XC{!pNuh%#f> zeOLlbF!D7IH38k|tDDHNUQzYmUC;j%3I5AXlx8mfxae<%0Q6kR{Y>7gHZk~|`sP}m zGKt%djKtSu;W;|M{Fap1o3~$Rs=L8B`|t%YADDcd_$h#OHd9v|F%sG4&nm*+Ecif0 zj?00iU_s7Nfq7(Mf;T#J0~i(eDLzVbj8d{x>YkS5!U@@5m^99ghm^D^+D1~%RLN?w zX*zwNjmC`TyZn*uU?Ll;jYC#_J@AAz&Z;*|0+JxRQo*w|%r7N^pLEKZUO0J1Lpqdq z?Vx;^-J}o}C+X*%?9I~%@im!CorvPS9qk#3$f2pnSrDt{hV^3(b6>iT$SBh3vrPKF zAh`;kAyYvgHNrH`F<-c*T+4~!e1>+B%9O9ph=l{ewlVOdoFRBHr%T_A_MG8tid@{f z0e&ACv@mquT0d$amEwIITV6TQweTHe-`=F67LOpoQk@(%f5%Li5Zh@CJ(~I*L1#LY z^(pDP45W|eZKo6Y;0}?@#hU}x)86_-zB+;)^tz|>PkQt3dJPQVpY+Deb-D!66y|Lq8s8HE z&oR(wfczk~4dk0zdrR5zZjr!LxexJM-fQVrKe&H`p+6a>&bOrix}Q#imtl(IZc8oEx{MSIVeNn>ID!L7Zfmj zA4sv@KYWZgLjiX}Fu3)nB<<@L(Fz}cHHHPV&d|swiC=%lwLUjkW4_z5WNN7eNhE53KGGO&$Oh9XOWi&u9c#x5Jy+ZYP7e4?GA3fF~~eU(vQ=gg_@kUo#635!#+J zphn&m5;1cfunm5XBVwPBs5>7=X#ycibyV8xMKSLzzqg(vlJ;o3IDrFJpwb6X1wAZI z+7?Grzc`O=THHST$Z9{L(|e5M{N}r^kl>}(hYw@v9d6I$HVK>X*6@#dcs#<>eGp@z(cE-?-Ru!Qvygs z!mF#dVh@j!)id(|-}map{`HLLKoP#Os%xUdOuR0WzZhq( z_vYYxw3*|FvH8p{E-?#2zqk|`EiH`3s00{?awdd!E+zz-t0CG-T$5=9mIeZQeiX+b z$J}*#H;C^~zmp2@6k(hQ3LI|}94N{Rd-V9D+Lmgxd<~8`A~h}1Zd6rkCVRf?oUv(p zMy(C8_cMu!EXTFhYxQJ@ivXlW#aP){P)?fg1J&(>kJaA0rjUL{XQ+7KK59#V&owxA z)FmX-QSJ^&utwg37KD;c*EIX)i48r{#NDaqu&#R2Q{W&gs9o94+T*rdZwhf@`dT`j z8PRwEP~M6&R4}Juc{kdYfp9o`khz+%BUG8-g11a^gKe6yRwlR)GJ1qMRt#CGU2*kq z-rOd9#k7xB({o?mk}g>BV&S(CSahEKj?#wCSp@fuX(M3RJk9urr#UvL*#%OX6#N1Z z3U{z#=TC&Rq?>c-Knh295RjF*vZBTGwnE8x76+K=2MM_C))qzgb8?O=Ft-qRz;iKqaUhL$fw*0%1mW?_&}(J$LrQ!UP;15)RB0Ii{7KEtgz4;-=~} zT%@%F=RTPnqvF+KNwF%4yH75bX#bc6|BRVkR%h}`pz|Ag*VYX92}Y+&<1|dP{92x) zmRo_8Cb6Sa=_!fG;gb>P=M!@~CVZM4l?ZF$V09h@0F-oS+*h!b7aA2lRlR=!}f zYyZ~eHcpfL1^^Oj+Zd|iQ<^v3_DKlNOWLIp57i)y8&Q@iBr@f{c|wFQXOGgF^WK4A zAmjG+ZP2#5Y+m$xTwP}*{L&hAaJ4o$jyR%(SCtlMTjuzgU~3{msh;nekOou71LlM3$7lI?gdE-wv($)-d-P9zaXp z0}DKJESTR~As)GuRNQrkPK&sW5CK~U18x0rh8lxQO1;wX-8S3u*TA_>8yvm~_Rq`3 zGuTu@nX$0Tf-}g#w;+^GO;ic^@EsJNHWfi8Gv!5yMHDt2^|_SnaIopq1Sf%)iTuP+ zznc`$e<}!}jDnoHUU3MBP9d*Yd(70mA`~0N05vTs!$PphsU; zTLDHjPTEh|3y6CqWpkitclpOm5}lRM6oZ<=vz4815vb9Rb1I;v*;Uom5&(T7IE$~O zrUg(};Ym90yF_4jNj2^4mxrwD7e&0&mQCRNi5FdpUkp)X^~;)0t<5Uzt4ur{ntj|& z%3!$3SJUI|md;YnKyzjAYU4-4(+aR69xU3VYr@mBzkClWU`AcLe;&f8m$Txp4$uF2 z9j+HUalVfX_s+E{sKO^9;y^6|j@~x(kq5;1T|A(l0|Woh7ug)rPA&7}lOxpAnI$g{ z4CYbJVUlW1^xqM@-0HP&mB$ijy2T^C99Po4=!IYr>u2O8RG3i*r}6u4(4VP(P`c2sA6* zARGWk+^CDq5#NS8F)WC+(c@2R)rkbSfts}xwM%3(>eQlLkzHf~~s)q41gxUI+|DwY1#T>%XFtx}wmZGcx`08x@NeJ>4b6 z_lskLD=mJ&y-~?%%QcWE5DJ2(Q~6Jao(L4j##-L&u<_}{O*xoE7qE~Nq%RXm8xW)H z^r2+qU3sZdCE?A2q$UMeFV_dWm+hG3U9)9__cb%VvZZaDgPbd|u*x(gT^z*Sf9N7W z8skQFSzs6%Jkr3B;L*;%J~LZ%{9 zy+D+MDv9~lty(gGU!QqV^L#4cBeFmR?eXo9ojQ;+CB#DLxXi}FxdoTe+JDq$fDFD& zCY75L7-U1SSmB#iX)b5x%4QO^RSRw8!WW+(_70*$RIcfD-FDD#M8Qb2`&gia%t$sO zZ-Xw-(C7LC#wDLqD({jMflA^ByfYu##Nx0FprV4r8b6qSh|;yxq(t#n*T72c+we3Z?cDp}n3wKZd8&Y*oW;~59X^(v(A3!;q29)(awWOo4x5cU zT3w1n>$s>jcqA(qGjl{Ig+nV&A?+%|${e|9(UfRI<@L`DGD&t^r-zyR zdCTll{-#DtT4IEj)s`-KGT+$lRkVNy97@ktls2v$8SS2_LkgXJRi#W#7;hZ*Yt@wa z@Srtw;JHN?jwr&d@;<(4L7Hb;%H8kn>a(DcpY|lZTj)t@0fYtHF?PZ~C5jIBF9qYc zgXg{hqa5%>ulmXHm@xQAqR_u< z9hh|%U5RpA18yGyqb-^QfZ7v$u+GuYXd_kzCB2k>JJm1c*#FUA=3x_=lKV$Db^*(e z^co~DWN<~OCt>DjC&ByUD5M<{w}AWHo+KW<_rX(mk*=9T)Yu|~)MoE(Bf4~>-Ez*3 z$r8W|@Y*Vk`D z;l+SyycKZ)e>>Q0^gsugud2=7l8TcW!x}Erm|9U2KXI>Xn2=^DzvtD8K*st>%vdXK5(aM}WAW7yB zpkfF2;y_v%M51cT`3|r~Gu;gO6b70@yp?+B4eNcJSZm*8_OlwI!CHG#lw~P0ZVaq6 zBIE@10PSG!N+QYklc)QSb?_~|33*#VLw}$ZKi(0ik5(a7o51No0gg9X#WkX*0qUt! zM%fQcmeomIT+yEES#&j-4nvM5#T+eh*y*1~ILQlWS+!qR&>D8q5x^Iwt;*i1?#uPU zJ3vuuKp!OO9R#RnH`N8pVndB4w(hH+?_wWsdWJvfq0@_$C3a6d7zHCurm|&fzr01- z?+qCqf+;jzlpA4Vn`!hI!pl-HTy;yBT{Z-K>QX4(Z~mg&F#VWHBFf=IlDfCITvYAc zI@E61@m8w3dULmv$B#ejd}z~t4t>Grv+{)9H=^=O#o+7V?NHRl4KZ`aExFc)04FUS zaXef(g1W;l_57y|6(SpQL=d1Vy}TEU;dMpV_@5!4Wt z>=h5#Xajp^&}7haM?6DS`Lim*(C9dO6A-uduH6YSgoo~v$s7f*idJ)4DvMh$JS7-5 zRk(MtFL>i8#-I*w?C<`KSq-0WnN4n?>lW>Z^#d2ZVglsm%N<7f)W;8;0Shv5 zla(u5-Adw3FU*aB8Fa&s7;v2eN^R zEs|=)6zgKBG3@{k3jfr1AwplR5_xEo~zyYOliwpf0W$lC#UKn8=aUxxaVa zK6ds3ZvP$}1$o(?=}(^#?(Z``4E6b6@wBxHgmm3X?P3&Cm!7zmvUEwCm1QrbKktr5&}y`*`_qWrOik1(c5AjU5gbb+ z27AaYt;QGB_O>6$kG}XWZbF8`MkFZ{)4SYkk$^plU+-ga9PXa73Gb|=O}H$3^#pFy z2vpvN8NQ6Qc8ZBQ0`&$?v$@Ys!NWz3-kQmnizEn+t)7wni_b;i)*JG`!w~#EHIbsI zcH_bemDBg?5h+eZJiFT%_7x8r*0cMr5s6B_iF)S*M$T1tobLGiA~*6~p5}iK{!Uzv q{PC<3C>q?gF#qo6Np$cr-{*NI@cY#24ZrW7gEdjE=UJSW)&Bug=KcEs literal 0 HcmV?d00001 diff --git a/examples/public/uploads/location/large/28071_10151274648580240_1606415380_n.jpg b/examples/public/uploads/location/large/28071_10151274648580240_1606415380_n.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b6ca320ede22e2f903dbed664364e5d5b866a06 GIT binary patch literal 34192 zcmb5VWl$Z@6E1x4;C^s-4-UcI-8}^V;qLBwaCevBuEE_Uc;Mg=IB0OW{Hxx2>wdkn zwYyW*yWP`U(=yNWeyn}$0x;yI<)i^nP*8yX9e|HbfCK;@77iW`79JiB9svRV3latr z5+WiJ4jMWN1|AMRJ{}GbNJv6MMo2_O3sF)%U^kgF z7l82PlPZn@fP#gBfrf>Fhe3dWfra^02^t0y77mMoT?`(ZQjNpZ83BhXIH?F%T%Ger za^t`PnA+tEC~=L)B^jb=R{Y6>5DEbEDd7K-0Dyvq`4sU~D0i0Pq4I zE$nU(UYBYI%@-(v3b^GYc651ctT4d82?WW?hLYs+j>V(yG;P8#YcQK+dPcRf#J3Cj zv*arJvx+t1qjkBZVrO7Vg{CSozX~FumogN9(nXxUPBfAR@smlB%WmgaewV{>n3&x( z3dJ8`Mch>b0D53Xv3yGrG+yrI(9G;V0SN9sjjhw8h#R>iX9?~9RfI$N3sztBQ8X6 zJD{lnYCvsx8_EeLL`Qis^rw<>w;L^m))xb~llf1uAW+>PIJBJ>V610TX{?rqW%;=t z{O_h(9H4P`Ixu~+Ya_z2C$C}TVRZi`(d)C+KfyVURTkl!@s zt>%;X=UAcsWcNi+Z|Lu;P^kSl!+4@p{QxMb9d~7rmH}cm>IksJ<1izFB z4ZEx1kQ}KG%aAVM4q&^-f+P`gr7XP16IPoId4^!Zg1BqG<{Z;rE1W~n*Kfi_7 zo_CwSJV(l#??u59?6s)&ekDm}7rY1C}=Tu)>eQ$p9$rvP1$mA1p!c&BCBGUufwHLwp;0=c7 zTJcYr9R8K=pYivA#p~c-6d!=SFYzymqfYN5pIxNdSa8;9JTVQ`QP22WsTukQfK=r= zeCUD>=L7I~^T}q-k5hfiz z8MI-G{PTyxr)n{edVh&Y;{)mR|_vTNyM1amou+G*Usrasfj*&K?W=5w~=bYL8< zzLc87AAH1~auUt);ibjuGRyHR&K71SD52j!J`FENEs_Y@E(GkGH+R(INj18z9EBia zUJ+jsuEiUDi$=AZG~BZOrma9GB?-bj3-nn&V5V*;a3^D>jT8NQCbXg~Es-x~eO� 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