I have an upload Api that as a response object delivers (along with other stuff inside a Json object) a base64 encoded jpeg image.
I create the encoded image as so:
$im; // gd image resource
ob_start();
imagejpeg($im);
$data = base64_encode(ob_get_clean());
The data then is put inside a form field using javascript and submitted.
How can I create a GD resource from that again so that I actually can save that image as a file?
Everything in PHP.
You can use imagecreatefromstring() function:
$data = base64_decode($_POST['image_as_base64']);
$formImage = imagecreatefromstring($data);
"String" does not mean a "real" string. In that case it means bytes/blob data.
How can I create a GD resource from that again so that I actually can save that image as a file?
Are you sure you need to do that extra step? How about:
file_put_contents('MyFile.jpg', base64_decode($_POST['MyFormField']));
I did by this way:
// input is in format: data:image/png;base64,...
$str="data:image/png;base64,";
$data=str_replace($str,"",$_POST['image']);
$data = base64_decode($data);
file_put_contents('tmp/'.mktime().'.png', $data);
Related
Iam getting base64 image in a json like below format
{
"profilepic":"iVBORw0KGgoAAAANSUhEUgAAAPAAAABGCAYAAADyxhn6AAAMYml..."
}
I have a PHP code like below, where i decode this base64 image and save it in server, i tried to run the code and am not able to see the image in particular folder location.
Can anyone help me to identify the problem here?
<?php
header("Access-Control-Allow-Origin: *");
$str_json = file_get_contents('php://input'); //($_POST doesn't work here)
$response = json_decode($str_json, true); // decoding received JSON to array
$photo = $response["profilepic"];
// Obtain the original content (usually binary data)
$bin = base64_decode($photo);
// Load GD resource from binary data
$im = imageCreateFromString($bin);
// Make sure that the GD library was able to load the image
// This is important, because you should not miss corrupted or unsupported images
if (!$im) {
die('Base64 value is not a valid image');
}
// Specify the location where you want to save the image
$img_file = 'test/'.uniqid().'.jpg';
// Save the GD resource as PNG in the best possible quality (no compression)
// This will strip any metadata or invalid contents (including, the PHP backdoor)
// To block any possible exploits, consider increasing the compression level
imagejpeg($im, $img_file, 80);
$imgPath = 'http://serverip/'.$img_file;
?>
Please help me to identify the issue
How I can store decoded image to laravel public image path and hash image name ?
I tried like this, but didnt work and doesn't get any error message;
if (!empty($request->image)) {
$file = base64_decode($request->image)->hashName();
base64_decode($request->image)->store('user-uploads/avatar');
asset('user-uploads/avatar/' . $file);
}
This code works fine but I use API and via curl sending image then needed base64 decoding:
if ($request->hasFile('image')) {
$file = $request->file('image')->hashName();
$request->image->store('user-uploads/avatar');
asset('user-uploads/avatar/' . $file);
}
What you suggest save image and send image url to api and downloads image too path or send base64 image encode and in api decode, like I'm trying at the moment?
You can't call functions on the output of base64_decode, as it returns as string.
I would suggest you post the name of the file along with the base 64 encoded content, which can then be saved using laravel's storage helpers:
Storage::disk('local')->put('image.png', base64_decode($request->image))
How to store base64 image using the Laravel's filesytem (File Storage) methods?
For example, I can decode base64 image like this:
base64_decode($encoded_image);
but all of the Laravel's methods for storing files can accept either a Illuminate\Http\File or Illuminate\Http\UploadedFile instance.
So I guess I'd have to convert base64 image (or decoded base64 image) to Illuminate\Http\File or Illuminate\Http\UploadedFile, but how?
Just use put to store the encoded contents:
Storage::put('file.jpg', $encoded_image);
All it's doing is wrapping file_put_contents.
Then to read it back out:
$data = base64_decode(Storage::get('file.jpg'));
Which, you guess it, is wrapping file_get_contents.
You can upload your base64 Image using laravel File Storage like this
$base64_image = $request->input('base64_image'); // your base64 encoded
#list($type, $file_data) = explode(';', $base64_image);
#list(, $file_data) = explode(',', $file_data);
$imageName = str_random(10).'.'.'png';
Storage::disk('local')->put($imageName, base64_decode($file_data));
Hope it will help you
I'm developing a laravel RESTful app that accepts image strings from users and must store them.
images are encoded and sent to my app. I know that I have to Receive and decode image like this:
$imageData = base64_decode($imageData);
$source = imagecreatefromstring($imageData);
but I dont know how to save them to files, without knowing the format of the image?is there any way to find out the image extension, so that I can use functions like:
imagepng
You can use getimagesizefromstring();
$size = getimagesizefromstring($imageData);
if ($size['mime'])
return $size['mime'];
I need to quickly generate an image (base64 encoded JPEG) to simulate an API call.
Of course I can:
public function readImageApiCall($imageId)
{
return function () use ($imageid) {
return ['result' => base64_encode(file_get_contents('myimage.jpg'))];
}
}
But I don't care the actual image content, i just need a valid JPEG image without the need of placing a dummy image in the filesystem.
You can do it with gd PHP extension and imagejpeg (you must capture output buffer)
A sample to how to create an image from scrach
http://www.thesitewizard.com/php/create-image.shtml
a link to PHP manual
http://php.net/manual/en/function.imagejpeg.php
But, why you don't set it in the code?
$result = "/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAZAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAwMDAwMDAwMDAwEBAQEBAQECAQECAgIBAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD/8AAEQgAYABgAwERAAIRAQMRAf/EAaIAAAAGAgMBAAAAAAAAAAAAAAcIBgUECQMKAgEACwEAAAYDAQEBAAAAAAAAAAAABgUEAwcCCAEJAAoLEAACAQMEAQMDAgMDAwIGCXUBAgMEEQUSBiEHEyIACDEUQTIjFQlRQhZhJDMXUnGBGGKRJUOhsfAmNHIKGcHRNSfhUzaC8ZKiRFRzRUY3R2MoVVZXGrLC0uLyZIN0k4Rlo7PD0+MpOGbzdSo5OkhJSlhZWmdoaWp2d3h5eoWGh4iJipSVlpeYmZqkpaanqKmqtLW2t7i5usTFxsfIycrU1dbX2Nna5OXm5+jp6vT19vf4+foRAAIBAwIEBAMFBAQEBgYFbQECAxEEIRIFMQYAIhNBUQcyYRRxCEKBI5EVUqFiFjMJsSTB0UNy8BfhgjQlklMYY0TxorImNRlUNkVkJwpzg5NGdMLS4vJVZXVWN4SFo7PD0+PzKRqUpLTE1OT0laW1xdXl9ShHV2Y4doaWprbG1ub2Z3eHl6e3x9fn90hYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdE87Y/mF/A3ojd56+7o+Zvxd6r32k4pqjZu/u9utNr7oopzIkIjyWCy+5KXJ4wmWQKPuIogT/AKx9+48OvDOBx6NfQ5zC5PD0O4cbl8ZkMBk8fSZbG5yir6Wqw+RxVfTx1VBk6HJwSyUVXj62lmSSGaN2jljcMpIIPvVRWnXumZN/7EklWGPeu0nmZxGsSbkwzStITpCLGK0sXLcWte/vZxxx17pVq6uqsjB1dQyuvqRlYXVlYXUgg8H8+66hWmf2Gn7eHXuuXu3Xuve/de697917r3v3Xuve/de6pF70/mi92ZHsntDr34b9HdV7m2T012FmunN+/Jz5Ido7h2R1dXdybRp6KfsHrnqDrXrTZO/O0O3KrrSoykFBn8o52/hKLLiahSrmmhl0iTl3lPe+abhrfaIi7IAXYkBVB4VJ9c0HHB6Ltw3Sz21Q101C3AUqTTopmd+c38zasnNQPkR8ONqrIilcZtD4W9t7ooacsOCub3p8wMFX5Bbj9ZoaYG36B9PcoWvsTv8AKga4u7RDTy1tT8wKdByTnSzU9kUpz8hX9vDorH+zDfzDvkDHvLCfODvzEY7qLHbgzmL2d1D8NaHPfHOfufbKTy0uMz/fna9BvPePbW3MDk8f65NpbNz2JacTGOuyjovgYx2n2IuzcFt8vI47RZCKRAs7qOFC1Aur18s/kxdc6RaNNlEzORxagAPpTzA9fPoGK/A9cbW2tW7B2J1P1H171/Wfc/fbI2T1ztXDYDK/dhlq5dxyPjarNbyr60MfuKzM1eRq6lmZpZXJJMtWHJvK2yQfT2VlCRw1SqJHzx1E1/MDHp0GZt23S9asszqfRTpH8vTqtTrz40dF4rd/aeyN57JqOxaHZGawuf61232XvfsPeOwdpdYb5oKmr25tXZvWmU3Yev8AA4HaG5MNmcdBDHjWtT08IJt6QCLL2/5QXcr2Oe0DSrKHjBdgpjkBZVCAgAKVdceSU6Op993RoITFKQjAqcAGq+deOePSj3T0n8ep4zAvx1+PVHDC14Y8b0l1pjAjXuGWWh21DUen8evi/s6Xk7lWNdP7vtqfNSf8JPSQ7ruZz48v7ek9s3I776Ryn8S+NfdHePxnydPMs8Z6T7X3fgdqyTKQ3jyXVmeyO5eos3RkqNUFXgZY2AtYfX2Tbj7c8p7gpC2/07/xQtpp89Lalb7KVPlTpXb7/ukJGqQyJ6NQ/wA+ravjJ/woQ+UXx5y2L298+tm4z5J9HSz01DVfI7onZJ2x3tsFKiZKeLMdn9GYaSp2p2Jt+GR1+7r9p/wuspotUv8ADJyNPuHOafbjdNjH1Ngxu7GvFVIkUeWpCTUepX9g6FW379a3nbL+nIPXgfsPV52P/no/ytcnR01fSfJqsanqoIqiIydD/JKGTxzIHUPFL0+rpIt7MpF1YEGxFvYJ/dO6DjBNX/SHH24x+fRv9RB/Gv7R0me1P5/H8qrqPrncHZe4PklW5PFYGBSMNgOnu6Z9yZjITt4sfhcVj8r1/iKVclk6kiKE1lRSUwdh5Jo1uwYeyvIlLzRSLGOJKkD9pH/F9WE0TYRlJ+RHTt/Ku/nDdPfzUH78x+w+r9/9Nbl6I3bhcNkNqdjZLa2Vy+f2zufEnLbe3bS1GzsjmMJSCqjjkSekWrqfCwUpNKrEq1LFJBIYpVKyDiCKH9nVlYMKg1HVmfcvZuC6V6h7U7j3TIIts9Tdcb37L3DIziMJhNi7Zye6Mqxc/ptQ4t/bYyerdaeebxMPXHwF27g+3NmVvYtdjvjHuPvDu/r2LzQ5Dfnave8G4vlH3LgJvDJFOmRy+9+w6jHSOWDqtOoa4S3vK32/2y22r23lu7qHxhcQzTyR5BkRFYiMEZ7goyKenz6jTfLl7jf1jhfRR1QHHbUZOQf2dAv8Mew9vbv2fv8A2dtjr7aGzMf1Hv2TZVZm+qZKys6P3zuCfC47L57IdR5avHly+G2xW1H8HrqiJ6iknrqNp6eeSKZSBx7fb2m97PN4NobWOGYJjELtSrGE6mJA4UqfUkGoBRvtq9pcr4kolZ01VwStDSjU4fLHy6NDmZ55pIqKjinqaiolipaWlpo3mqKqqqJFihgggiVpZpppXCoigs7EAC59jC6mjhjZ5SFjUEkk0AA4knonjUswC1LE0AHn0FGe21uiaWRP4WfRIUkU5DFiRWVihieM1+tZFIsQQDf2C5Oa+WXBpuFl/wA5kr+wkU6N026/1Zgl/wB5PRKO0snB1H3jvXd/YWDz1Fgti/CftPt7deBk8+3MpnsR1Jn23Htmgoa2uoKn7WLdmYzjYmnr1gqEjatLRLIw0kGczcz2+1NNvO2SwzH924KsJF8QTqqDtNDRZHJz5+XRxYWEl0q2kwZSZvMUNNDFqfaFp+fSO6f3XlvlD0J0/wB89fddPiv9Je2M7W5zY21N2/6R4to7lwXYG8tnNhEyLU9Fn1r6/D7foco9BV07VVN/EFAeWIxOUvKXOtvu20C53y4tIb/xGFC6x1GKGjN/g6d3TaTa3Jjs0kaAKPKufPPXGi6837k5szDSbN3LJPt/IjFZ+KbEVlG+FzDiZhicotdHTmhypWB2+2k0zhULFbAn2K7neNqs40lurq2jjkXUhaRQHXhVTwOcGnRXHbXExKxxuSvHHDqHWdXdoU0NblG2Fuw0mNglra6rosRV18eNo6dTJNX1rY1KpqKip40LSTSaYo1BLMB7Izvm13UoWK6tpHPACQGvyFOP2dLxZXUSd8b6fWnS/wD5Pnwt+HXyF+dPyB+N/wAmepcVvih7R65x3yN6X3LNk89RZnBZrFZttrdtbKjqqTMQwVG3qmvr6HKwU/iBhlq2AYq2lYO59sbnZ95aS2kkW3uV8Ud1RU/EB9mKfb0MdlnS7sgJApkQ0P8Ak62b92f8Jwv5U+8MFUYLIdDVVDDURxqKzBbz3dhK6nmgdZqSupZ8bmqfRkKOdFkimYOyOL/4ewPJe3UwCyySMopgsxBp/RJpX8seXRsIkU1AHRh/5dH8pT4/fy0a3sabpDL7vzi9k5aTObgzW/MtPuTeeXr3p6Sho4s3uWqfyVmM29jaIQY6mjiijgE08japJWPtmaWSeQzSktI3Enq4VVFFFB05/wA4jIT1fwU3x1LQ1L02U+UHZ3x6+JdH42VXlx/yQ73686r3kihiNXj693Dl5WtchIyfoD71GmtwM+n7SB1pm0gnzof8HVTnbOdgzXYG98pRqkdHW7rzz46FPSkGOTIzw46njQelYoKGKNFX6BVA+nvP3lyyNjstpagUMVqi/npFf8v29Qjfzma8llPEyEj9vHos/aOQye2us94ZfbOdxGzK7au18xuHH5XI4ClzeBxkG26CpzlTDXYA1uIilxNTTUTxTCKenljSQvG6uoPsw3R5bXa5p7aVIHghZw5A0oFU8V4UNKfIdJ7dVluFSQFlYgEVoTU4+3/J0W/Pdn5Xp74n787nyWcy+Q3L1x8Wuw+1mzGelK5RuwMv11kanbCS2CfYCn7N3djqWjgXikhSKFb+MH3G3Pe4PYe3lw7ljPLbRp3VDa5yrvxyCuorT8IFOhFtECT7+qIoEaSlqegQU/mf8/Vb/wABP5fPxEb4CdI9i/IzoHrzc+B7W2Vu3uDvT5A76rd24P8AuFsOff27du0h292Xjdx4rD7Fl2VsTaMNXDDTCSpq83VtDLBVyPHSe4P5d5c5Ql5MuN73+bRuAL+EokAbtHaBHxOpv28ehffbhuY3VbWzWsApq7a/bnquHrDdu69qfybfmxnp8juHNbI358neqPiP8Ocpu1ZqjeP90d4ZTMdwd+7Y208rM1NtfIYbqXaL5GgowKCLM10jRqk01R5I8jvJ4tulthX6eVlyf6JrT/KaeYz5dH7QxvcJIf7VQf5in+cfn0Zv5wfD74qdHfC7vTAYnpjZOF318cNpdM4Db3cuDl3LTdm7l70rN/df7N37VblzVRuKfGbgwu5nqN2VP8OkolhoIKSnNGsBp/WPOY+VNp2Xk2x3Oj/vi4KFiW7TqVmPb5UAH7eiTb9yurvdZIKj6ZNWKZxgdKbt7r2Luztf+Sr8O+44M32T/B/iS3yk7229W5PLTZ3f7VvV8u6MTszL1GOni3FksoNj9F0u3YjBJ/ETRzBYnDEOAxpe/n27arlx4KKFNTTSruWOT5UNfTowH6C3Fyg7iaj7QKf4egL+ffU23ukJ/izun47dXY/40/PDdvduLxnVmzeiot0bF3VurYlRRJS4vcmZ60rMzlBgKmbsqrx+MwFYIaA7hgkyMc0VbHSrKhhzntuw7RexQbBIzSiuqjaqEUpRh5njTpjabi9uY3e9FF8qin+odbC/8tzCNkP52+zcjtZcbHi9ldZ98z5kbfjjjwOndPafUuBkjwgpyKaLAy5bE5J6GNB4hSRL47KBY39wvFG37THcVN39MxavHiq5+dQek+xqomuWT+zMgp6efW9N7i4cOhF173vr3VQ/82Ss15T+W7t7VaPI/wAxHZu6pwxXxOvUvxr+T3bVEZQx5FPnNmUc6/0khU/j2a7HALnd7aEiqtPGCPUFx0lvX8O0kf0Rj/LqiPu7vDCdR4/bbz4LcvYG/wDsTcsWyuqOp9jU1NXb97S3zWQS1xwm3qetqKPH0VFjqGKSsymUrpoMfiaCJ56iRVCq2cfNHM+1cm7Wdw3EsatpjjUAs7DIUVIpjifwjNOod23bbneLowW1KKasx4AHP+r16LJ8nth/PTBbR6o7E+UnRmx+n/g7uzsHa+1+6sz1xvnN9pbrw025q6Kg642/21uKs2ps3bWB6b3X2DNjsVuLJ4FcnFapSlmqY6SokkaFI/d2HmrdINp3KFbLYZJR4ndrZs9iOaACIvpD6e7SaE6dXQwPK37ttpbq3czXyodIIoF9SPVgMj0Pz6Qnz9617n7y+IHe3SvRW2qTc3aHZmZ6m2hU4Su3Zs/Y/wBlsKi7Bpt77yzT5Pemd25iGo8dlti4ekqoYpmmWCuZ/GYklZT73ftt33LY7e0223mnLXOpwgLU7WKkgeTEmh4YHy6L+VpLe3vJJ7mQL+mSNR+Ik5oTx6AVf5ePwU6x23getz1BX9xUOyYMfT1mZ3x3h3rPtHem8KClgi3DvVdg7T35sraFFRZ/OLUVNJTwUkKpRyRo/kfVIwf2r2j2M7fBLusl19a0YZ1VkorHJShXgOBzXz6Mbrmm88Z0tVTwgaA5qRXjnHDoQt7p1rubbnX2y959Nddbj2J0vvXbPYXS/X1HDuLY+wutN1bRiySYYYbaWwM/trFZbbzzZWeetx+TSsjyVVJJPUvLLUVLzH1/7d8tXlvbWaI8NtbE4jOXqakuW4k0ywyPLpBDvl9DI8upWkcZqDj7PLHQab0pNmdpbX3pszuvYGH7f2fvndOC37uHb+dzm8drms3rtis3DX4nNrmNg7i2tmEUvuvIx1FKZjS1EdVyiyRwyRmXMnKu28yWcVpetJHFA1V0Ux2hafmAKHyOfPpix3KewlaWPTqk41B884p/PoIe7fjPQd5fNftX5S/InDY3O9R7U6h6E2J8Ytu7F7bx+0JN57toNmbMps9lEoOrtzt2RsbZ3XbxbinFNK2FljyM9BTGRwJ42hS25MuN15luIbyGeDa4ydLYFVTsQBmBBrQE0r5noWybqttt6PEyPctkjyqcnhkfLpSbI2b0p05m8tvrqLpbYnW+/wCvoq+LI9v5LcHYvY/aOPoa2hmocvNiN+9u753lJs2asw8klPUV+KhoK8UjvGKlYnkVh3YcicvbVL9cRLIyZGtlKjzLEUANOORjonuN5vbhPCwoJ4KP9R6v/wD+E4fQlTvjP9nfN2uo5I9ub6FPsrqKWVCEqOpuuq3cmDxW4IF/3SOw+wMtnsnCD6v4bjqFiBrHuIudN9G+b080ObWNdCnyNCSSPkSehVtVmbK0EbV8Ru4145626PYR6Muve/de6pi/m81px+6v5b1QoBk/2cTsuGAN9PuKj4CfMyKK351AtcexNyanic1WCVoDcp/h6Lt3NNsm/wCaZ/wdVBfy/uqMX8gv5vW+snuuOPKYb4ufGfrHbu18XUqZIMdlu9s1vTe/YWagUqVjr83tzYGHw0kikSGinljuFZgZI997+S45sisKn6e3tEKrXAMhZiT/AEsUr6UHl0H+SoFTajcU/UlkJJ/0uB1tNfKfpzbPfXxh7/6K3PjaGt2x2p0t2R13X0NTTRSUkVLubZ2Ww0E0ULRskM2NmqUnp3VdUEsSOlmVSISHHz/Lj+XQxz5cevn67X7D21tal+NXdO8e4chjdtfJD4lbP3ZmtmVdS+f2NW/I8bZ6ck3vuHCz4/H5LIbb3DlshHuGTJY9p48ctc0ziGGqklEmT/Km7xWthte43F06Wd3bXCMhJZRNCwVXHEhnAIYVpwpwzHm52hee6hhjUzRSKQwwdJqSD5Gh4Gnn0MOfyJkckvYSMoDEcgPpJkF/8Df3JLsHf7TQfmaD/D0QH0GT5dV84/5ddO5uOth3jumh60z2Dz+4drZ3D73FdgqCDcG2cxV4fJ0+I3PlKCg29uCnSSmWQPTTs6LIqyKjC3sE2XPHL10Xhu7iO1vonZHjkJFGVipo1KEGlQcdG02z30dGijaWFgCrLTIPyrjrJkfk/wDHOlg1N3p1U+u1lpN7YPITPf8ASsdPj6qpqJHY/RVUsTxa/t675s5dSKq31qw/ouG/wdaj2u/1Zgk/l/n6TWP+SHXGV3NtTFYyTLPtnedJkhguxK7b+48PtDObjpp8emL2ptrI5LC0y7mymZpaiqqEamLQxR0Tksb+knXmbbpLqKNTILOdSUmaNwjMPhVTpodVGNa/h6Vtt86QtK1A6nK1GpR6sPLowDUtPWB6OqpoKqmrAaSqpamJJ6app5wYJ6apglDwzQTROVkRgVZSQQQfZ+QHUq47SKEeoP8An6Q1K9w4jI63AP8AhObTU9N/Kn+O8dMIgsVDn6RljjWIRPRbnzdPJTKi/pgpZ1eOMfp0LcWB94k3yKl5Kq4USMAPICvl+3qTImLRrXiFH+AdXoe0vTnXvfuvdUk/zvvtNsdd/B3ufN1S4rZXTf8AMB6mqOw9y1DCLF7S2j3H1d3V8cYtxZyre0VBhqbePcOIgnnkZYoVqNTkKD7PuV7pbLmOxunwqXURPyHiLU/sr0i3GMy2MqD4jG1P2dEI/lBKmD/mr/NzCZBUgyW5Pj78Xd30ED3SqajxdH2vsnIHxtYmGmyODdSRwGkF/r7kT3tQrzm8pp4c1tA6kf6Uig/o0BP2n59EHJjA7IiZ1B2Br9vW0vn4JqnBZqmpo2lqKjE5GCniWwaSaWjmjijUsVUM8jAC5A59w6KVzw6FnXzK+vH2hiMzi6fqXY2Ez28+i/ilS7D+SPQnY1JkNpb+2L2t11tP4ZbH3mdodf7jx8MG2+y8b2rlM3G+WngpcbkvvMjUGsmd1YzJynfx2ttYS26rcXYmukkhY1+JIhEY0NVQ6nJ10yST5dBfdYpJJLhJG8OMqhVwKfxagzcSOHQvpvvG7ogrnoRWQ1OMqJqLI09ZSVcCx5CkrK3E5SKgrpoYqLPUeMz+JrcfLWUTzUxrKGeIPqjYe51tdwt7/WYCdSOFYHiCSa5xqAZWQsMaxToGSwvCwJIIOQR6eX2VGaenV+f/AAnX6x627T+MPyawHYezNt76xOP+YXd89HR7mxdJl4KSoyG4Fqcg9IlVHIKVpKhtLlLE+MXPHvEvnEgc1bh4ZOj6p6ft6kvah/usg/5pL1ffjfhF8ScJUpW4noDrTF1EUyVEUmP27S0RinjbXHLGaYRFXjbkEHj2HCzN8RJp69L6D06+bxuLo3Abd76y3SeW3Nu3p7t3o+u+QGA3J0FuDN1+GnpN97Q6t7c33t/fm3dtZOeLI7j6/wB3Z3E0u4YMpj2kxWVx9atN5PFqiE0cnx2+42FrGl4wuoWnCxah2EW0zxvQ8FEmSPPUFPQV3dpoJpXENYmWOrfxAvQqT+dBXh0J9HS7iweem2/mqiDMU9HmchhsTuUR09JkNxSYfAbE3RNla/F4+ngxeMirsfv6BIY4OL0UzkBXQCTofHjuTbXRPhhiA5wSNKOSacKCQCvnQ9B+QQnMJ4+XoCzKBXzoVI62+P8AhOBUtN/LG6ygXW1DTbu7TXDTNcpVYNu1t9phquFzxJT1WOhjeNh6WRgRwfeK+6lTuEwShTxXoR59x6kW3/sErx0Cv7Or6fZf091737r3SG7L6z6+7l2Bu7qvtbZu3uwuuN+4HI7X3nsrdmMpszt3cuAysBp67F5XG1kckFTTzIbi41I6q6FXVSPfPr3Vffw9/lM/F74N9tbv7a6JG/YMtvLG0GErl33v7efZeXo9t4WnyNPtrZeN3Tv3cW4cxQ7G2wmXqWocZCY40kkDu0jID7U3N5d3rh7yR5XVVUFiWIVa6QCfIVOOm44ooV0xKFWtcCmfM/aerPfabpzqlf8Amnfyqsh8v6jD/IL4w7k2F038yNlbQ3dsSTcm6dpUlXsrv3rDeK7aky3VPceTxNGd0Un8Nr9n46t23n6f7uqwFZTsq08sE8ioZbRuk+z38V/BmSNwc+YBrTHrTj5cek91bpdwNbyfAwI/b1riVf8AK/8A5uOay238Xk/ij1FtLJYfF7swGT3Oe69wbm2S82Y7J3HvXF5Shx21uq6nPZDHY6l3JNCYvJFLO4LGWPWdMr/67TKiulmPqxEy1Mg0gtM8owFBIXWcEnPHoOHlYFyRPSMsppp8lQJQelSK9bOv8nj4Gbs+A3xxyfX2/M1HuLe+8t4bj7D3pnIqCPERZrem9M/l9zbnyNFg46zJNg8HDU5aKhx1LLUS1S0dEjzkSOwEQX11NfXst7caTPNIXbTwq2cDoTxRJBEsMddCKAK+g6tu9penOiT/ADH/AJd/xC+ee1W218lOoMNu3JU1HLSbc7Ew09ZtDtjZReOsijn2f2TtubHbrw3hXITj7cVD0cqzypNDJHJIjWidoX8SMkPQ5HHNPP8AL9mOFeqsquKMAR/LjX/D1To//CY34wVuYil3P8hPlH2BtqGqaX+6+9O3twjG1tO+GxG3HpMrJtFtqZqvppdu4CioZYzXok8FOokBYkk7n5l3y5TRNdzstDxc+YVafZRVH2DpOtlaJ8MaD8vRi3+Ek9X4fHb499d/GPq/b/UvWGJo8JtPbdFRY/GY3G0FLisZj6DG0NNjMbjcViqJVpcZi8dj6OOKGFdRAUszO7MxI6kgA+XSrh0OfvXXuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6//9k=";