<?php
/**
 * patch-photos.php — photo-boost pentru admin (admingrandfather.com)
 *  · upload rapid: pozele se micșorează (max 2000px) și se convertesc în WebP în browser, apoi pe server
 *  · galerie: drag & drop / ‹ › pentru ordine, ★ main photo, ✕ delete — fără reîncărcarea paginii
 *  · convertește în WebP și pozele existente
 *   https://admingrandfather.com/patch-photos.php?key=CHEIA
 * Șterge fișierul după folosire.
 */
const KEY = 'd2d9ccce89a137df2bd7d628d791ac24';
if (!isset($_GET['key']) || !hash_equals(KEY, (string)$_GET['key'])) { http_response_code(404); exit('Not found'); }
error_reporting(E_ALL); ini_set('display_errors', '1');
@ini_set('memory_limit', '512M'); @set_time_limit(300);

const PB_MAX = 2000; const PB_Q = 82;
$DOC   = rtrim($_SERVER['DOCUMENT_ROOT'] ?: __DIR__, '/');
$ADMIN = $DOC . '/admin';
$FORM  = $ADMIN . '/vehicle_form.php';
$API   = $ADMIN . '/photo_api.php';
$INI   = $ADMIN . '/.user.ini';
$UP    = $DOC . '/uploads/vehicles';
$TRASH = dirname($DOC) . '/.trash';
$API_CODE = base64_decode('PD9waHAKLyoqCiAqIGFkbWluL3Bob3RvX2FwaS5waHAg4oCUIHBob3RvLWJvb3N0CiAqIEdhbGVyaWUgdmVoaWN1bDogdXBsb2FkICjihpIgV2ViUCwgbWF4IDIwMDBweCksIHJlb3JkZXIsIHNldCBtYWluLCBkZWxldGUuIFLEg3NwdW5kZSBKU09OLgogKi8KcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnLy4uL2NvcmUvYm9vdHN0cmFwLnBocCc7CkF1dGg6OnJlcXVpcmVSb2xlKCdzdXBlcl9hZG1pbicpOwpAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJzUxMk0nKTsKQHNldF90aW1lX2xpbWl0KDEyMCk7CmhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04Jyk7CmhlYWRlcignQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUnKTsKCmNvbnN0IFBCX01BWCAgPSAyMDAwOyAgIC8vIGxhdHVyYSBtYXhpbcSDLCBweApjb25zdCBQQl9RICAgID0gODI7ICAgICAvLyBjYWxpdGF0ZSBXZWJQCmNvbnN0IFBCX0RJUiAgPSBfX0RJUl9fIC4gJy8uLi91cGxvYWRzL3ZlaGljbGVzJzsKCmZ1bmN0aW9uIHBiX291dChhcnJheSAkYSwgaW50ICRjb2RlID0gMjAwKSB7IGh0dHBfcmVzcG9uc2VfY29kZSgkY29kZSk7IGVjaG8ganNvbl9lbmNvZGUoJGEpOyBleGl0OyB9CgppZiAoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10gIT09ICdQT1NUJykgcGJfb3V0KFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdQT1NUIG9ubHknXSwgNDA1KTsKaWYgKGVtcHR5KCRfUE9TVFsnY3NyZiddKSB8fCAhaGFzaF9lcXVhbHMoY3NyZl90b2tlbigpLCAoc3RyaW5nKSAkX1BPU1RbJ2NzcmYnXSkpIHBiX291dChbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnU2VjdXJpdHkgdG9rZW4gZXhwaXJlZCDigJQgcmVsb2FkIHRoZSBwYWdlLiddLCA0MDApOwoKLyoqIENvbnZlcnRlyJl0ZSBvcmljZSBqcGcvcG5nL3dlYnAvZ2lmIMOubiBXZWJQLCBjdSBvcmllbnRhcmUgRVhJRiBjb3JlY3TEgyDImWkgcmVkaW1lbnNpb25hcmUuICovCmZ1bmN0aW9uIHBiX3RvX3dlYnAoc3RyaW5nICRzcmMsIHN0cmluZyAkZHN0LCBpbnQgJG1heCA9IFBCX01BWCwgaW50ICRxID0gUEJfUSk6IGJvb2wgewogICAgaWYgKGNsYXNzX2V4aXN0cygnSW1hZ2ljaycpKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJGltID0gbmV3IEltYWdpY2soJHNyYyk7CiAgICAgICAgICAgIGlmICgkaW0tPmdldE51bWJlckltYWdlcygpID4gMSkgJGltID0gJGltLT5jb2FsZXNjZUltYWdlcygpLT5nZXRJbWFnZSgpOwogICAgICAgICAgICBpZiAobWV0aG9kX2V4aXN0cygkaW0sICdhdXRvT3JpZW50JykpICRpbS0+YXV0b09yaWVudCgpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJGltLT5nZXRJbWFnZU9yaWVudGF0aW9uKCkpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIEltYWdpY2s6Ok9SSUVOVEFUSU9OX0JPVFRPTVJJR0hUOiAkaW0tPnJvdGF0ZUltYWdlKCcjMDAwJywgMTgwKTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBJbWFnaWNrOjpPUklFTlRBVElPTl9SSUdIVFRPUDogICAgJGltLT5yb3RhdGVJbWFnZSgnIzAwMCcsIDkwKTsgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgSW1hZ2ljazo6T1JJRU5UQVRJT05fTEVGVEJPVFRPTTogICRpbS0+cm90YXRlSW1hZ2UoJyMwMDAnLCAtOTApOyBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRpbS0+c2V0SW1hZ2VPcmllbnRhdGlvbihJbWFnaWNrOjpPUklFTlRBVElPTl9UT1BMRUZUKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGltLT5nZXRJbWFnZVdpZHRoKCkgPiAkbWF4IHx8ICRpbS0+Z2V0SW1hZ2VIZWlnaHQoKSA+ICRtYXgpICRpbS0+dGh1bWJuYWlsSW1hZ2UoJG1heCwgJG1heCwgdHJ1ZSk7CiAgICAgICAgICAgICRpbS0+c2V0SW1hZ2VGb3JtYXQoJ3dlYnAnKTsKICAgICAgICAgICAgJGltLT5zZXRJbWFnZUNvbXByZXNzaW9uUXVhbGl0eSgkcSk7CiAgICAgICAgICAgICRpbS0+c3RyaXBJbWFnZSgpOwogICAgICAgICAgICAkb2sgPSAkaW0tPndyaXRlSW1hZ2UoJGRzdCk7CiAgICAgICAgICAgICRpbS0+Y2xlYXIoKTsKICAgICAgICAgICAgaWYgKCRvayAmJiBpc19maWxlKCRkc3QpICYmIGZpbGVzaXplKCRkc3QpID4gMCkgcmV0dXJuIHRydWU7CiAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlICRlKSB7IC8qIMOubmNlYXJjxIMgR0QgKi8gfQogICAgfQogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2ltYWdld2VicCcpKSByZXR1cm4gZmFsc2U7CiAgICAkaW5mbyA9IEBnZXRpbWFnZXNpemUoJHNyYyk7CiAgICBpZiAoISRpbmZvKSByZXR1cm4gZmFsc2U7CiAgICBzd2l0Y2ggKCRpbmZvWzJdKSB7CiAgICAgICAgY2FzZSBJTUFHRVRZUEVfSlBFRzogJGltZyA9IEBpbWFnZWNyZWF0ZWZyb21qcGVnKCRzcmMpOyBicmVhazsKICAgICAgICBjYXNlIElNQUdFVFlQRV9QTkc6ICAkaW1nID0gQGltYWdlY3JlYXRlZnJvbXBuZygkc3JjKTsgYnJlYWs7CiAgICAgICAgY2FzZSBJTUFHRVRZUEVfV0VCUDogJGltZyA9IEBpbWFnZWNyZWF0ZWZyb213ZWJwKCRzcmMpOyBicmVhazsKICAgICAgICBjYXNlIElNQUdFVFlQRV9HSUY6ICAkaW1nID0gQGltYWdlY3JlYXRlZnJvbWdpZigkc3JjKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCEkaW1nKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoJGluZm9bMl0gPT09IElNQUdFVFlQRV9KUEVHICYmIGZ1bmN0aW9uX2V4aXN0cygnZXhpZl9yZWFkX2RhdGEnKSkgewogICAgICAgICRvID0gKGludCkgKEBleGlmX3JlYWRfZGF0YSgkc3JjKVsnT3JpZW50YXRpb24nXSA/PyAxKTsKICAgICAgICBpZiAoJG8gPT09IDMpICRpbWcgPSBpbWFnZXJvdGF0ZSgkaW1nLCAxODAsIDApOwogICAgICAgIGVsc2VpZiAoJG8gPT09IDYpICRpbWcgPSBpbWFnZXJvdGF0ZSgkaW1nLCAtOTAsIDApOwogICAgICAgIGVsc2VpZiAoJG8gPT09IDgpICRpbWcgPSBpbWFnZXJvdGF0ZSgkaW1nLCA5MCwgMCk7CiAgICB9CiAgICAkdyA9IGltYWdlc3goJGltZyk7ICRoID0gaW1hZ2VzeSgkaW1nKTsKICAgICRzID0gbWluKDEsICRtYXggLyBtYXgoJHcsICRoKSk7CiAgICBpZiAoJHMgPCAxKSB7CiAgICAgICAgJG53ID0gKGludCkgcm91bmQoJHcgKiAkcyk7ICRuaCA9IChpbnQpIHJvdW5kKCRoICogJHMpOwogICAgICAgICRkc3RJbWcgPSBpbWFnZWNyZWF0ZXRydWVjb2xvcigkbncsICRuaCk7CiAgICAgICAgaW1hZ2VhbHBoYWJsZW5kaW5nKCRkc3RJbWcsIGZhbHNlKTsgaW1hZ2VzYXZlYWxwaGEoJGRzdEltZywgdHJ1ZSk7CiAgICAgICAgaW1hZ2Vjb3B5cmVzYW1wbGVkKCRkc3RJbWcsICRpbWcsIDAsIDAsIDAsIDAsICRudywgJG5oLCAkdywgJGgpOwogICAgICAgIGltYWdlZGVzdHJveSgkaW1nKTsgJGltZyA9ICRkc3RJbWc7CiAgICB9IGVsc2VpZiAoIWltYWdlaXN0cnVlY29sb3IoJGltZykpIHsKICAgICAgICBpbWFnZXBhbGV0dGV0b3RydWVjb2xvcigkaW1nKTsKICAgIH0KICAgIGltYWdlc2F2ZWFscGhhKCRpbWcsIHRydWUpOwogICAgJG9rID0gaW1hZ2V3ZWJwKCRpbWcsICRkc3QsICRxKTsKICAgIGltYWdlZGVzdHJveSgkaW1nKTsKICAgIHJldHVybiAkb2sgJiYgaXNfZmlsZSgkZHN0KSAmJiBmaWxlc2l6ZSgkZHN0KSA+IDA7Cn0KCmZ1bmN0aW9uIHBiX3ZlaGljbGVfaWRfb2ZfaW1hZ2UoaW50ICRpZCk6ID9hcnJheSB7CiAgICAkc3QgPSBkYigpLT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHZlaGljbGVfaW1hZ2VzIFdIRVJFIGlkID0gPyBMSU1JVCAxIik7CiAgICAkc3QtPmV4ZWN1dGUoWyRpZF0pOwogICAgcmV0dXJuICRzdC0+ZmV0Y2goKSA/OiBudWxsOwp9CmZ1bmN0aW9uIHBiX3JlbnVtYmVyKGludCAkdmlkLCA/YXJyYXkgJGlkcyA9IG51bGwpOiB2b2lkIHsKICAgIGlmICgkaWRzID09PSBudWxsKSB7CiAgICAgICAgJHN0ID0gZGIoKS0+cHJlcGFyZSgiU0VMRUNUIGlkIEZST00gdmVoaWNsZV9pbWFnZXMgV0hFUkUgdmVoaWNsZV9pZCA9ID8gT1JERVIgQlkgc29ydF9vcmRlciBBU0MsIGlkIEFTQyIpOwogICAgICAgICRzdC0+ZXhlY3V0ZShbJHZpZF0pOwogICAgICAgICRpZHMgPSBhcnJheV9tYXAoJ2ludHZhbCcsICRzdC0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9DT0xVTU4pKTsKICAgIH0KICAgICR1cCA9IGRiKCktPnByZXBhcmUoIlVQREFURSB2ZWhpY2xlX2ltYWdlcyBTRVQgc29ydF9vcmRlciA9ID8gV0hFUkUgaWQgPSA/IEFORCB2ZWhpY2xlX2lkID0gPyIpOwogICAgJG4gPSAwOwogICAgZm9yZWFjaCAoJGlkcyBhcyAkaWQpICR1cC0+ZXhlY3V0ZShbKyskbiwgKGludCkgJGlkLCAkdmlkXSk7Cn0KCiRhY3Rpb24gPSAoc3RyaW5nKSAoJF9QT1NUWydhY3Rpb24nXSA/PyAnJyk7CgppZiAoJGFjdGlvbiA9PT0gJ3VwbG9hZCcpIHsKICAgICR2aWQgPSAoaW50KSAoJF9QT1NUWyd2ZWhpY2xlX2lkJ10gPz8gMCk7CiAgICAkc3QgPSBkYigpLT5wcmVwYXJlKCJTRUxFQ1QgaWQgRlJPTSB2ZWhpY2xlcyBXSEVSRSBpZCA9ID8gTElNSVQgMSIpOwogICAgJHN0LT5leGVjdXRlKFskdmlkXSk7CiAgICBpZiAoISRzdC0+ZmV0Y2goKSkgcGJfb3V0KFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdWZWhpY2xlIG5vdCBmb3VuZC4nXSwgNDA0KTsKCiAgICAkZiA9ICRfRklMRVNbJ3Bob3RvJ10gPz8gbnVsbDsKICAgIGlmICghJGYgfHwgJGZbJ2Vycm9yJ10gIT09IFVQTE9BRF9FUlJfT0spIHsKICAgICAgICAkY29kZSA9ICRmWydlcnJvciddID8/IC0xOwogICAgICAgICRtc2cgPSBpbl9hcnJheSgkY29kZSwgW1VQTE9BRF9FUlJfSU5JX1NJWkUsIFVQTE9BRF9FUlJfRk9STV9TSVpFXSwgdHJ1ZSkgPyAnRmlsZSB0b28gbGFyZ2UgZm9yIHRoZSBzZXJ2ZXIgbGltaXQuJyA6ICdVcGxvYWQgZmFpbGVkIChjb2RlICcgLiAkY29kZSAuICcpLic7CiAgICAgICAgcGJfb3V0KFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICRtc2ddLCA0MDApOwogICAgfQogICAgJGluZm8gPSBAZ2V0aW1hZ2VzaXplKCRmWyd0bXBfbmFtZSddKTsKICAgIGlmICghJGluZm8gfHwgIWluX2FycmF5KCRpbmZvWzJdLCBbSU1BR0VUWVBFX0pQRUcsIElNQUdFVFlQRV9QTkcsIElNQUdFVFlQRV9XRUJQLCBJTUFHRVRZUEVfR0lGXSwgdHJ1ZSkpIHBiX291dChbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnTm90IGEgc3VwcG9ydGVkIGltYWdlLiddLCA0MDApOwoKICAgIGlmICghaXNfZGlyKFBCX0RJUikpIEBta2RpcihQQl9ESVIsIDA3NTUsIHRydWUpOwogICAgJG5hbWUgPSAndmVoJyAuICR2aWQgLiAnLScgLiB1bmlxaWQoKSAuICcud2VicCc7CiAgICAkZHN0ID0gUEJfRElSIC4gJy8nIC4gJG5hbWU7CgogICAgLy8gZGVqYSBXZWJQIGxhIGRpbWVuc2l1bmVhIGNvcmVjdMSDIChjb252ZXJ0aXQgw65uIGJyb3dzZXIpIOKGkiBkb2FyIMOubCBtdXTEg20KICAgIGlmICgkaW5mb1syXSA9PT0gSU1BR0VUWVBFX1dFQlAgJiYgbWF4KCRpbmZvWzBdLCAkaW5mb1sxXSkgPD0gUEJfTUFYKSB7CiAgICAgICAgaWYgKCFtb3ZlX3VwbG9hZGVkX2ZpbGUoJGZbJ3RtcF9uYW1lJ10sICRkc3QpKSBwYl9vdXQoWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0NvdWxkIG5vdCBzYXZlIHRoZSBmaWxlLiddLCA1MDApOwogICAgfSBlbHNlaWYgKCFwYl90b193ZWJwKCRmWyd0bXBfbmFtZSddLCAkZHN0KSkgewogICAgICAgIHBiX291dChbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnQ291bGQgbm90IGNvbnZlcnQgdGhlIGltYWdlLiddLCA1MDApOwogICAgfQogICAgQGNobW9kKCRkc3QsIDA2NDQpOwoKICAgICRteCA9IGRiKCktPnByZXBhcmUoIlNFTEVDVCBDT0FMRVNDRShNQVgoc29ydF9vcmRlciksIDApIEZST00gdmVoaWNsZV9pbWFnZXMgV0hFUkUgdmVoaWNsZV9pZCA9ID8iKTsKICAgICRteC0+ZXhlY3V0ZShbJHZpZF0pOwogICAgJG9yZGVyID0gKGludCkgJG14LT5mZXRjaENvbHVtbigpICsgMTsKICAgIGRiKCktPnByZXBhcmUoIklOU0VSVCBJTlRPIHZlaGljbGVfaW1hZ2VzICh2ZWhpY2xlX2lkLCBwYXRoLCBzb3J0X29yZGVyKSBWQUxVRVMgKD8sPyw/KSIpLT5leGVjdXRlKFskdmlkLCAkbmFtZSwgJG9yZGVyXSk7CiAgICBwYl9vdXQoWydvaycgPT4gdHJ1ZSwgJ2lkJyA9PiAoaW50KSBkYigpLT5sYXN0SW5zZXJ0SWQoKSwgJ3BhdGgnID0+ICRuYW1lLCAndXJsJyA9PiAnLi4vdXBsb2Fkcy92ZWhpY2xlcy8nIC4gJG5hbWUsICdrYicgPT4gcm91bmQoZmlsZXNpemUoJGRzdCkgLyAxMDI0KV0pOwp9CgppZiAoJGFjdGlvbiA9PT0gJ3Jlb3JkZXInKSB7CiAgICAkdmlkID0gKGludCkgKCRfUE9TVFsndmVoaWNsZV9pZCddID8/IDApOwogICAgJGlkcyA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoYXJyYXlfbWFwKCdpbnR2YWwnLCAoYXJyYXkpICgkX1BPU1RbJ2lkcyddID8/IFtdKSkpKTsKICAgIGlmICghJHZpZCB8fCAhJGlkcykgcGJfb3V0KFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdOb3RoaW5nIHRvIHJlb3JkZXIuJ10sIDQwMCk7CiAgICBwYl9yZW51bWJlcigkdmlkLCAkaWRzKTsKICAgIHBiX291dChbJ29rJyA9PiB0cnVlXSk7Cn0KCmlmICgkYWN0aW9uID09PSAnc2V0X21haW4nKSB7CiAgICAkaW1nID0gcGJfdmVoaWNsZV9pZF9vZl9pbWFnZSgoaW50KSAoJF9QT1NUWydpZCddID8/IDApKTsKICAgIGlmICghJGltZykgcGJfb3V0KFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdQaG90byBub3QgZm91bmQuJ10sIDQwNCk7CiAgICAkdmlkID0gKGludCkgJGltZ1sndmVoaWNsZV9pZCddOwogICAgJHN0ID0gZGIoKS0+cHJlcGFyZSgiU0VMRUNUIGlkIEZST00gdmVoaWNsZV9pbWFnZXMgV0hFUkUgdmVoaWNsZV9pZCA9ID8gT1JERVIgQlkgc29ydF9vcmRlciBBU0MsIGlkIEFTQyIpOwogICAgJHN0LT5leGVjdXRlKFskdmlkXSk7CiAgICAkaWRzID0gYXJyYXlfbWFwKCdpbnR2YWwnLCAkc3QtPmZldGNoQWxsKFBETzo6RkVUQ0hfQ09MVU1OKSk7CiAgICAkaWRzID0gYXJyYXlfbWVyZ2UoWyhpbnQpICRpbWdbJ2lkJ11dLCBhcnJheV92YWx1ZXMoYXJyYXlfZGlmZigkaWRzLCBbKGludCkgJGltZ1snaWQnXV0pKSk7CiAgICBwYl9yZW51bWJlcigkdmlkLCAkaWRzKTsKICAgIHBiX291dChbJ29rJyA9PiB0cnVlXSk7Cn0KCmlmICgkYWN0aW9uID09PSAnZGVsZXRlJykgewogICAgJGltZyA9IHBiX3ZlaGljbGVfaWRfb2ZfaW1hZ2UoKGludCkgKCRfUE9TVFsnaWQnXSA/PyAwKSk7CiAgICBpZiAoISRpbWcpIHBiX291dChbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnUGhvdG8gbm90IGZvdW5kLiddLCA0MDQpOwogICAgJGZpbGUgPSBQQl9ESVIgLiAnLycgLiBiYXNlbmFtZSgoc3RyaW5nKSAkaW1nWydwYXRoJ10pOwogICAgZGIoKS0+cHJlcGFyZSgiREVMRVRFIEZST00gdmVoaWNsZV9pbWFnZXMgV0hFUkUgaWQgPSA/IiktPmV4ZWN1dGUoWyhpbnQpICRpbWdbJ2lkJ11dKTsKICAgIGlmIChpc19maWxlKCRmaWxlKSkgQHVubGluaygkZmlsZSk7CiAgICBwYl9yZW51bWJlcigoaW50KSAkaW1nWyd2ZWhpY2xlX2lkJ10pOwogICAgcGJfb3V0KFsnb2snID0+IHRydWVdKTsKfQoKcGJfb3V0KFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdVbmtub3duIGFjdGlvbi4nXSwgNDAwKTsK');
$GALLERY  = base64_decode('PD9waHAgaWYgKCRpZCk6ID8+CjwhLS0gcGhvdG8tYm9vc3QgZ2FsbGVyeSAtLT4KPHN0eWxlPgoucGItZHJvcHtib3JkZXI6MnB4IGRhc2hlZCAjYzljZWQ2O2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjIycHg7dGV4dC1hbGlnbjpjZW50ZXI7dHJhbnNpdGlvbjouMTVzO2N1cnNvcjpwb2ludGVyfQoucGItZHJvcC5pcy1vdmVye2JvcmRlci1jb2xvcjojMjU2M2ViO2JhY2tncm91bmQ6cmdiYSgzNyw5OSwyMzUsLjA2KX0KLnBiLWRyb3AgYntkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZToxNXB4O21hcmdpbi1ib3R0b206NnB4fQoucGItcXVldWV7bWFyZ2luLXRvcDoxMnB4O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjZweH0KLnBiLXF7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtmb250LXNpemU6MTJweH0KLnBiLXEgLmJhcntmbGV4OjE7aGVpZ2h0OjZweDtiYWNrZ3JvdW5kOiNlNWU3ZWI7Ym9yZGVyLXJhZGl1czo5OXB4O292ZXJmbG93OmhpZGRlbn0KLnBiLXEgLmJhciBpe2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7d2lkdGg6MDtiYWNrZ3JvdW5kOiMyNTYzZWI7dHJhbnNpdGlvbjp3aWR0aCAuMnN9Ci5wYi1xLmRvbmUgLmJhciBpe2JhY2tncm91bmQ6IzE2YTM0YX0ucGItcS5lcnIgLmJhciBpe2JhY2tncm91bmQ6I2RjMjYyNjt3aWR0aDoxMDAlIWltcG9ydGFudH0KLnBiLXEgLm5te3dpZHRoOjM4JTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9Ci5wYi1ncmlke2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZmlsbCxtaW5tYXgoMTUwcHgsMWZyKSk7Z2FwOjEycHg7bWFyZ2luLXRvcDoxNnB4fQoucGItaXRlbXtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXItcmFkaXVzOjhweDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDojZjNmNGY2O2FzcGVjdC1yYXRpbzo0LzM7Y3Vyc29yOmdyYWI7Ym94LXNoYWRvdzowIDFweCAzcHggcmdiYSgwLDAsMCwuMTIpO3VzZXItc2VsZWN0Om5vbmV9Ci5wYi1pdGVtIGltZ3t3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29iamVjdC1maXQ6Y292ZXI7ZGlzcGxheTpibG9jaztwb2ludGVyLWV2ZW50czpub25lfQoucGItaXRlbS5kcmFnZ2luZ3tvcGFjaXR5Oi4zNX0ucGItaXRlbS5vdmVye291dGxpbmU6M3B4IHNvbGlkICMyNTYzZWJ9Ci5wYi1pdGVtLmJ1c3l7b3BhY2l0eTouNTtwb2ludGVyLWV2ZW50czpub25lfQoucGItYmFkZ2V7cG9zaXRpb246YWJzb2x1dGU7dG9wOjZweDtsZWZ0OjZweDtiYWNrZ3JvdW5kOiMxNmEzNGE7Y29sb3I6I2ZmZjtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo3MDA7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6OTlweDtkaXNwbGF5Om5vbmV9Ci5wYi1pdGVtOmZpcnN0LWNoaWxkIC5wYi1iYWRnZXtkaXNwbGF5OmJsb2NrfQoucGItbnVte3Bvc2l0aW9uOmFic29sdXRlO3RvcDo2cHg7cmlnaHQ6NnB4O2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuNik7Y29sb3I6I2ZmZjtmb250LXNpemU6MTFweDtwYWRkaW5nOjFweCA3cHg7Ym9yZGVyLXJhZGl1czo5OXB4fQoucGItdG9vbHN7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDo0cHg7cGFkZGluZzo2cHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodHJhbnNwYXJlbnQscmdiYSgwLDAsMCwuNykpfQoucGItdG9vbHMgYnV0dG9ue2ZsZXg6MTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjVweCAwO2ZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OjcwMDtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjkyKTtjb2xvcjojMTExfQoucGItdG9vbHMgYnV0dG9uW2RhdGEtYWN0PWRlbF17YmFja2dyb3VuZDojZGMyNjI2O2NvbG9yOiNmZmZ9Ci5wYi10b29scyBidXR0b25bZGF0YS1hY3Q9bWFpbl17YmFja2dyb3VuZDojZmFjYzE1fQoucGItaXRlbTpmaXJzdC1jaGlsZCAucGItdG9vbHMgYnV0dG9uW2RhdGEtYWN0PW1haW5de29wYWNpdHk6LjQ7cG9pbnRlci1ldmVudHM6bm9uZX0KPC9zdHlsZT4KPGRpdiBjbGFzcz0iY2FyZCIgaWQ9InBiQ2FyZCIgZGF0YS12aWQ9Ijw/PSAoaW50KSAkaWQgPz4iIGRhdGEtY3NyZj0iPD89IGgoY3NyZl90b2tlbigpKSA/PiI+CiAgPGgyIHN0eWxlPSJtYXJnaW4tdG9wOjA7Zm9udC1zaXplOjE2cHgiPlBob3RvcyAoPHNwYW4gaWQ9InBiQ291bnQiPjw/PSBjb3VudCgkaW1hZ2VzKSA/Pjwvc3Bhbj4pPC9oMj4KICA8ZGl2IGNsYXNzPSJwYi1kcm9wIiBpZD0icGJEcm9wIj4KICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0icGJGaWxlcyIgYWNjZXB0PSJpbWFnZS8qIiBtdWx0aXBsZSBoaWRkZW4+CiAgICA8Yj5Ecm9wIHBob3RvcyBoZXJlIG9yIGNsaWNrIHRvIGNob29zZTwvYj4KICAgIDxzcGFuIGNsYXNzPSJtdXRlZCI+QW55IHNpemUg4oCUIHBob3RvcyBhcmUgcmVzaXplZCB0byBtYXggMjAwMHB4IGFuZCBjb252ZXJ0ZWQgdG8gV2ViUCBiZWZvcmUgdXBsb2FkLiBUaGUgZmlyc3QgcGhvdG8gaXMgdGhlIG1haW4gcGhvdG8uPC9zcGFuPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBiLXF1ZXVlIiBpZD0icGJRdWV1ZSI+PC9kaXY+CiAgPGRpdiBjbGFzcz0icGItZ3JpZCIgaWQ9InBiR3JpZCI+CiAgICA8P3BocCBmb3JlYWNoICgkaW1hZ2VzIGFzICRpbWcpOiA/PgogICAgPGRpdiBjbGFzcz0icGItaXRlbSIgZHJhZ2dhYmxlPSJ0cnVlIiBkYXRhLWlkPSI8Pz0gKGludCkgJGltZ1snaWQnXSA/PiI+CiAgICAgIDxpbWcgc3JjPSIuLi91cGxvYWRzL3ZlaGljbGVzLzw/PSBoKCRpbWdbJ3BhdGgnXSkgPz4iIGFsdD0iIiBsb2FkaW5nPSJsYXp5Ij4KICAgICAgPHNwYW4gY2xhc3M9InBiLWJhZGdlIj5NQUlOPC9zcGFuPjxzcGFuIGNsYXNzPSJwYi1udW0iPjwvc3Bhbj4KICAgICAgPGRpdiBjbGFzcz0icGItdG9vbHMiPgogICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWFjdD0ibGVmdCIgdGl0bGU9Ik1vdmUgbGVmdCI+4oC5PC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtYWN0PSJtYWluIiB0aXRsZT0iU2V0IGFzIG1haW4gcGhvdG8iPuKYhTwvYnV0dG9uPgogICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWFjdD0icmlnaHQiIHRpdGxlPSJNb3ZlIHJpZ2h0Ij7igLo8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1hY3Q9ImRlbCIgdGl0bGU9IkRlbGV0ZSI+4pyVPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8P3BocCBlbmRmb3JlYWNoOyA/PgogIDwvZGl2PgogIDxwIGNsYXNzPSJtdXRlZCIgaWQ9InBiSGludCIgc3R5bGU9Im1hcmdpbjoxMnB4IDAgMCI+PD89ICRpbWFnZXMgPyAnRHJhZyBwaG90b3MgdG8gcmVvcmRlciwgb3IgdXNlIOKAuSDigLogwrcg4piFIHNldHMgdGhlIG1haW4gcGhvdG8gwrcg4pyVIGRlbGV0ZXMuJyA6ICdObyBwaG90b3MgeWV0LicgPz48L3A+CjwvZGl2Pgo8c2NyaXB0PgooZnVuY3Rpb24oKXsKICB2YXIgY2FyZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGJDYXJkJyk7IGlmKCFjYXJkKSByZXR1cm47CiAgdmFyIFZJRD1jYXJkLmRhdGFzZXQudmlkLCBDU1JGPWNhcmQuZGF0YXNldC5jc3JmLCBBUEk9J3Bob3RvX2FwaS5waHAnLCBNQVg9MjAwMCwgUT0wLjgyOwogIHZhciBncmlkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYkdyaWQnKSwgZHJvcD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGJEcm9wJyksIGlucHV0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYkZpbGVzJyksCiAgICAgIHF1ZXVlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYlF1ZXVlJyksIGNvdW50RWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BiQ291bnQnKSwgaGludD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGJIaW50Jyk7CgogIGZ1bmN0aW9uIHBvc3QoZGF0YSl7CiAgICB2YXIgZmQ9bmV3IEZvcm1EYXRhKCk7IGZkLmFwcGVuZCgnY3NyZicsQ1NSRik7CiAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKGZ1bmN0aW9uKGspeyB2YXIgdj1kYXRhW2tdOyBpZihBcnJheS5pc0FycmF5KHYpKSB2LmZvckVhY2goZnVuY3Rpb24oeCl7ZmQuYXBwZW5kKGsrJ1tdJyx4KX0pOyBlbHNlIGlmKHYgaW5zdGFuY2VvZiBCbG9iKSBmZC5hcHBlbmQoayx2LGRhdGEuX25hbWV8fCdwaG90by53ZWJwJyk7IGVsc2UgaWYoayE9PSdfbmFtZScpIGZkLmFwcGVuZChrLHYpOyB9KTsKICAgIHJldHVybiBmZXRjaChBUEkse21ldGhvZDonUE9TVCcsYm9keTpmZCxjcmVkZW50aWFsczonc2FtZS1vcmlnaW4nfSkudGhlbihmdW5jdGlvbihyKXsgcmV0dXJuIHIuanNvbigpLmNhdGNoKGZ1bmN0aW9uKCl7IHJldHVybiB7b2s6ZmFsc2UsZXJyb3I6J1NlcnZlciBlcnJvciAoJytyLnN0YXR1cysnKSd9OyB9KTsgfSk7CiAgfQogIGZ1bmN0aW9uIHJlZnJlc2goKXsKICAgIHZhciBpdGVtcz1ncmlkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYi1pdGVtJyk7IGNvdW50RWwudGV4dENvbnRlbnQ9aXRlbXMubGVuZ3RoOwogICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdCxpKXsgaXQucXVlcnlTZWxlY3RvcignLnBiLW51bScpLnRleHRDb250ZW50PWkrMTsgfSk7CiAgICBoaW50LnRleHRDb250ZW50PWl0ZW1zLmxlbmd0aD8nRHJhZyBwaG90b3MgdG8gcmVvcmRlciwgb3IgdXNlIOKAuSDigLogwrcg4piFIHNldHMgdGhlIG1haW4gcGhvdG8gwrcg4pyVIGRlbGV0ZXMuJzonTm8gcGhvdG9zIHlldC4nOwogIH0KICB2YXIgc2F2ZVQ7IGZ1bmN0aW9uIHNhdmVPcmRlcigpeyBjbGVhclRpbWVvdXQoc2F2ZVQpOyBzYXZlVD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICB2YXIgaWRzPVtdLm1hcC5jYWxsKGdyaWQucXVlcnlTZWxlY3RvckFsbCgnLnBiLWl0ZW0nKSxmdW5jdGlvbihlbCl7cmV0dXJuIGVsLmRhdGFzZXQuaWR9KTsKICAgIHBvc3Qoe2FjdGlvbjoncmVvcmRlcicsdmVoaWNsZV9pZDpWSUQsaWRzOmlkc30pLnRoZW4oZnVuY3Rpb24ocil7IGlmKCFyLm9rKSBhbGVydChyLmVycm9yfHwnQ291bGQgbm90IHNhdmUgdGhlIG9yZGVyLicpOyB9KTsKICB9LDM1MCk7IH0KCiAgLyogLS0tLS0tLS0tLSBjb252ZXJ0IGluIGJyb3dzZXI6IG1heCAyMDAwcHgsIFdlYlAgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIGxvYWRCaXRtYXAoZmlsZSl7CiAgICBpZih3aW5kb3cuY3JlYXRlSW1hZ2VCaXRtYXApeyByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoZmlsZSx7aW1hZ2VPcmllbnRhdGlvbjonZnJvbS1pbWFnZSd9KS5jYXRjaChmdW5jdGlvbigpeyByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoZmlsZSk7IH0pLmNhdGNoKGZ1bmN0aW9uKCl7IHJldHVybiBsb2FkSW1nKGZpbGUpOyB9KTsgfQogICAgcmV0dXJuIGxvYWRJbWcoZmlsZSk7CiAgfQogIGZ1bmN0aW9uIGxvYWRJbWcoZmlsZSl7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMscmVqKXsgdmFyIHU9VVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKSwgaW09bmV3IEltYWdlKCk7IGltLm9ubG9hZD1mdW5jdGlvbigpe3JlcyhpbSl9OyBpbS5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqKG5ldyBFcnJvcignQ2Fubm90IHJlYWQgaW1hZ2UnKSl9OyBpbS5zcmM9dTsgfSk7IH0KICBmdW5jdGlvbiBjb252ZXJ0KGZpbGUpewogICAgcmV0dXJuIGxvYWRCaXRtYXAoZmlsZSkudGhlbihmdW5jdGlvbihibXApewogICAgICB2YXIgdz1ibXAud2lkdGgsaD1ibXAuaGVpZ2h0LHM9TWF0aC5taW4oMSxNQVgvTWF0aC5tYXgodyxoKSksY3c9TWF0aC5yb3VuZCh3KnMpLGNoPU1hdGgucm91bmQoaCpzKTsKICAgICAgdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IGMud2lkdGg9Y3c7IGMuaGVpZ2h0PWNoOwogICAgICB2YXIgY3R4PWMuZ2V0Q29udGV4dCgnMmQnKTsgY3R4LmltYWdlU21vb3RoaW5nUXVhbGl0eT0naGlnaCc7IGN0eC5kcmF3SW1hZ2UoYm1wLDAsMCxjdyxjaCk7CiAgICAgIGlmKGJtcC5jbG9zZSkgYm1wLmNsb3NlKCk7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpeyBjLnRvQmxvYihmdW5jdGlvbihiKXsKICAgICAgICBpZihiICYmIGIudHlwZT09PSdpbWFnZS93ZWJwJykgcmV0dXJuIHJlcyhiKTsKICAgICAgICBjLnRvQmxvYihmdW5jdGlvbihqKXsgcmVzKGp8fGZpbGUpOyB9LCdpbWFnZS9qcGVnJywwLjg2KTsgICAvLyBicm93c2VyIGbEg3LEgyBXZWJQIOKGkiBKUEVHOyBzZXJ2ZXJ1bCDDrmwgY29udmVydGXImXRlCiAgICAgIH0sJ2ltYWdlL3dlYnAnLFEpOyB9KTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCl7IHJldHVybiBmaWxlOyB9KTsgICAvLyBudSBwb2F0ZSBjaXRpIChleC4gSEVJQykg4oaSIHRyaW1pdGUgb3JpZ2luYWx1bCwgY29udmVydGXImXRlIHNlcnZlcnVsCiAgfQoKICBmdW5jdGlvbiBhZGRJdGVtKHIpewogICAgdmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGQuY2xhc3NOYW1lPSdwYi1pdGVtJzsgZC5kcmFnZ2FibGU9dHJ1ZTsgZC5kYXRhc2V0LmlkPXIuaWQ7CiAgICBkLmlubmVySFRNTD0nPGltZyBzcmM9Iicrci51cmwrJyIgYWx0PSIiPjxzcGFuIGNsYXNzPSJwYi1iYWRnZSI+TUFJTjwvc3Bhbj48c3BhbiBjbGFzcz0icGItbnVtIj48L3NwYW4+PGRpdiBjbGFzcz0icGItdG9vbHMiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWFjdD0ibGVmdCIgdGl0bGU9Ik1vdmUgbGVmdCI+4oC5PC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtYWN0PSJtYWluIiB0aXRsZT0iU2V0IGFzIG1haW4gcGhvdG8iPuKYhTwvYnV0dG9uPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWFjdD0icmlnaHQiIHRpdGxlPSJNb3ZlIHJpZ2h0Ij7igLo8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1hY3Q9ImRlbCIgdGl0bGU9IkRlbGV0ZSI+4pyVPC9idXR0b24+PC9kaXY+JzsKICAgIGdyaWQuYXBwZW5kQ2hpbGQoZCk7IHJlZnJlc2goKTsKICB9CgogIGZ1bmN0aW9uIGhhbmRsZShmaWxlcyl7CiAgICBmaWxlcz1bXS5maWx0ZXIuY2FsbChmaWxlcyxmdW5jdGlvbihmKXsgcmV0dXJuIC9eaW1hZ2VcLy8udGVzdChmLnR5cGUpfHwvXC4oanBlP2d8cG5nfHdlYnB8Z2lmfGhlaWN8aGVpZikkL2kudGVzdChmLm5hbWUpOyB9KTsKICAgIGlmKCFmaWxlcy5sZW5ndGgpIHJldHVybjsKICAgIHZhciByb3dzPWZpbGVzLm1hcChmdW5jdGlvbihmKXsgdmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IHIuY2xhc3NOYW1lPSdwYi1xJzsgci5pbm5lckhUTUw9JzxzcGFuIGNsYXNzPSJubSI+PC9zcGFuPjxzcGFuIGNsYXNzPSJiYXIiPjxpPjwvaT48L3NwYW4+PHNwYW4gY2xhc3M9InN0Ij53YWl0aW5nPC9zcGFuPic7IHIucXVlcnlTZWxlY3RvcignLm5tJykudGV4dENvbnRlbnQ9Zi5uYW1lOyBxdWV1ZS5hcHBlbmRDaGlsZChyKTsgcmV0dXJuIHI7IH0pOwogICAgdmFyIGk9MCwgcnVubmluZz0wLCBDT05DPTM7CiAgICBmdW5jdGlvbiBuZXh0KCl7CiAgICAgIHdoaWxlKHJ1bm5pbmc8Q09OQyAmJiBpPGZpbGVzLmxlbmd0aCl7IChmdW5jdGlvbihmLHJvdyl7CiAgICAgICAgcnVubmluZysrOyB2YXIgYmFyPXJvdy5xdWVyeVNlbGVjdG9yKCdpJyksIHN0PXJvdy5xdWVyeVNlbGVjdG9yKCcuc3QnKTsKICAgICAgICBzdC50ZXh0Q29udGVudD0nY29udmVydGluZyc7IGJhci5zdHlsZS53aWR0aD0nMjUlJzsKICAgICAgICBjb252ZXJ0KGYpLnRoZW4oZnVuY3Rpb24oYmxvYil7CiAgICAgICAgICBzdC50ZXh0Q29udGVudD0ndXBsb2FkaW5nICcrTWF0aC5yb3VuZChibG9iLnNpemUvMTAyNCkrJyBLQic7IGJhci5zdHlsZS53aWR0aD0nNjAlJzsKICAgICAgICAgIHZhciBubT0oZi5uYW1lLnJlcGxhY2UoL1wuW14uXSskLywnJyl8fCdwaG90bycpKyhibG9iLnR5cGU9PT0naW1hZ2Uvd2VicCc/Jy53ZWJwJzooYmxvYi50eXBlPT09J2ltYWdlL2pwZWcnPycuanBnJzonJykpOwogICAgICAgICAgcmV0dXJuIHBvc3Qoe2FjdGlvbjondXBsb2FkJyx2ZWhpY2xlX2lkOlZJRCxwaG90bzpibG9iLF9uYW1lOm5tfSk7CiAgICAgICAgfSkudGhlbihmdW5jdGlvbihyKXsKICAgICAgICAgIGlmKHImJnIub2speyBhZGRJdGVtKHIpOyByb3cuY2xhc3NMaXN0LmFkZCgnZG9uZScpOyBiYXIuc3R5bGUud2lkdGg9JzEwMCUnOyBzdC50ZXh0Q29udGVudD0nZG9uZSDCtyAnK3Iua2IrJyBLQic7IHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgcm93LnJlbW92ZSgpOyB9LDI1MDApOyB9CiAgICAgICAgICBlbHNlIHsgcm93LmNsYXNzTGlzdC5hZGQoJ2VycicpOyBzdC50ZXh0Q29udGVudD0ociYmci5lcnJvcil8fCdmYWlsZWQnOyB9CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKXsgcm93LmNsYXNzTGlzdC5hZGQoJ2VycicpOyBzdC50ZXh0Q29udGVudD0nbmV0d29yayBlcnJvcic7IH0pCiAgICAgICAgICAuZmluYWxseShmdW5jdGlvbigpeyBydW5uaW5nLS07IG5leHQoKTsgfSk7CiAgICAgIH0pKGZpbGVzW2ldLHJvd3NbaV0pOyBpKys7IH0KICAgIH0KICAgIG5leHQoKTsKICB9CgogIGRyb3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7IGlucHV0LmNsaWNrKCk7IH0pOwogIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsZnVuY3Rpb24oKXsgaGFuZGxlKGlucHV0LmZpbGVzKTsgaW5wdXQudmFsdWU9Jyc7IH0pOwogIFsnZHJhZ2VudGVyJywnZHJhZ292ZXInXS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyBkcm9wLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbihldil7IGlmKGV2LmRhdGFUcmFuc2ZlciAmJiBbXS5pbmRleE9mLmNhbGwoZXYuZGF0YVRyYW5zZmVyLnR5cGVzLCdGaWxlcycpPi0xKXsgZXYucHJldmVudERlZmF1bHQoKTsgZHJvcC5jbGFzc0xpc3QuYWRkKCdpcy1vdmVyJyk7IH0gfSk7IH0pOwogIFsnZHJhZ2xlYXZlJywnZHJvcCddLmZvckVhY2goZnVuY3Rpb24oZSl7IGRyb3AuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKCl7IGRyb3AuY2xhc3NMaXN0LnJlbW92ZSgnaXMtb3ZlcicpOyB9KTsgfSk7CiAgZHJvcC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJyxmdW5jdGlvbihldil7IGV2LnByZXZlbnREZWZhdWx0KCk7IGlmKGV2LmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGgpIGhhbmRsZShldi5kYXRhVHJhbnNmZXIuZmlsZXMpOyB9KTsKCiAgLyogLS0tLS0tLS0tLSBidXR0b25zIC0tLS0tLS0tLS0gKi8KICBncmlkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihldil7CiAgICB2YXIgYj1ldi50YXJnZXQuY2xvc2VzdCgnYnV0dG9uW2RhdGEtYWN0XScpOyBpZighYikgcmV0dXJuOwogICAgdmFyIGl0PWIuY2xvc2VzdCgnLnBiLWl0ZW0nKSwgYWN0PWIuZGF0YXNldC5hY3Q7CiAgICBpZihhY3Q9PT0nbGVmdCcgJiYgaXQucHJldmlvdXNFbGVtZW50U2libGluZyl7IGdyaWQuaW5zZXJ0QmVmb3JlKGl0LGl0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpOyByZWZyZXNoKCk7IHNhdmVPcmRlcigpOyB9CiAgICBpZihhY3Q9PT0ncmlnaHQnICYmIGl0Lm5leHRFbGVtZW50U2libGluZyl7IGdyaWQuaW5zZXJ0QmVmb3JlKGl0Lm5leHRFbGVtZW50U2libGluZyxpdCk7IHJlZnJlc2goKTsgc2F2ZU9yZGVyKCk7IH0KICAgIGlmKGFjdD09PSdtYWluJyl7IGl0LmNsYXNzTGlzdC5hZGQoJ2J1c3knKTsgcG9zdCh7YWN0aW9uOidzZXRfbWFpbicsaWQ6aXQuZGF0YXNldC5pZH0pLnRoZW4oZnVuY3Rpb24ocil7IGl0LmNsYXNzTGlzdC5yZW1vdmUoJ2J1c3knKTsgaWYoci5vayl7IGdyaWQuaW5zZXJ0QmVmb3JlKGl0LGdyaWQuZmlyc3RDaGlsZCk7IHJlZnJlc2goKTsgfSBlbHNlIGFsZXJ0KHIuZXJyb3J8fCdDb3VsZCBub3Qgc2V0IG1haW4gcGhvdG8uJyk7IH0pOyB9CiAgICBpZihhY3Q9PT0nZGVsJyl7IGlmKCFjb25maXJtKCdEZWxldGUgdGhpcyBwaG90bz8nKSkgcmV0dXJuOyBpdC5jbGFzc0xpc3QuYWRkKCdidXN5Jyk7IHBvc3Qoe2FjdGlvbjonZGVsZXRlJyxpZDppdC5kYXRhc2V0LmlkfSkudGhlbihmdW5jdGlvbihyKXsgaWYoci5vayl7IGl0LnJlbW92ZSgpOyByZWZyZXNoKCk7IH0gZWxzZSB7IGl0LmNsYXNzTGlzdC5yZW1vdmUoJ2J1c3knKTsgYWxlcnQoci5lcnJvcnx8J0NvdWxkIG5vdCBkZWxldGUuJyk7IH0gfSk7IH0KICB9KTsKCiAgLyogLS0tLS0tLS0tLSBkcmFnICYgZHJvcCByZW9yZGVyIC0tLS0tLS0tLS0gKi8KICB2YXIgZHJhZ0VsPW51bGw7CiAgZ3JpZC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLGZ1bmN0aW9uKGUpeyB2YXIgaXQ9ZS50YXJnZXQuY2xvc2VzdCgnLnBiLWl0ZW0nKTsgaWYoIWl0KSByZXR1cm47IGRyYWdFbD1pdDsgaXQuY2xhc3NMaXN0LmFkZCgnZHJhZ2dpbmcnKTsgZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZD0nbW92ZSc7IHRyeXsgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9wbGFpbicsaXQuZGF0YXNldC5pZCk7IH1jYXRjaCh4KXt9IH0pOwogIGdyaWQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsZnVuY3Rpb24oKXsgaWYoZHJhZ0VsKSBkcmFnRWwuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dpbmcnKTsgZ3JpZC5xdWVyeVNlbGVjdG9yQWxsKCcub3ZlcicpLmZvckVhY2goZnVuY3Rpb24obyl7by5jbGFzc0xpc3QucmVtb3ZlKCdvdmVyJyl9KTsgZHJhZ0VsPW51bGw7IH0pOwogIGdyaWQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLGZ1bmN0aW9uKGUpeyBpZighZHJhZ0VsKSByZXR1cm47IGUucHJldmVudERlZmF1bHQoKTsgdmFyIHQ9ZS50YXJnZXQuY2xvc2VzdCgnLnBiLWl0ZW0nKTsgZ3JpZC5xdWVyeVNlbGVjdG9yQWxsKCcub3ZlcicpLmZvckVhY2goZnVuY3Rpb24obyl7IGlmKG8hPT10KSBvLmNsYXNzTGlzdC5yZW1vdmUoJ292ZXInKTsgfSk7IGlmKHQmJnQhPT1kcmFnRWwpIHQuY2xhc3NMaXN0LmFkZCgnb3ZlcicpOyB9KTsKICBncmlkLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLGZ1bmN0aW9uKGUpeyBpZighZHJhZ0VsKSByZXR1cm47IGUucHJldmVudERlZmF1bHQoKTsgdmFyIHQ9ZS50YXJnZXQuY2xvc2VzdCgnLnBiLWl0ZW0nKTsgaWYodCYmdCE9PWRyYWdFbCl7IHZhciBpdGVtcz1bXS5zbGljZS5jYWxsKGdyaWQuY2hpbGRyZW4pOyBpZihpdGVtcy5pbmRleE9mKGRyYWdFbCk8aXRlbXMuaW5kZXhPZih0KSkgZ3JpZC5pbnNlcnRCZWZvcmUoZHJhZ0VsLHQubmV4dFNpYmxpbmcpOyBlbHNlIGdyaWQuaW5zZXJ0QmVmb3JlKGRyYWdFbCx0KTsgcmVmcmVzaCgpOyBzYXZlT3JkZXIoKTsgfSB9KTsKCiAgcmVmcmVzaCgpOwp9KSgpOwo8L3NjcmlwdD4KPD9waHAgZW5kaWY7ID8+Cg==');
$INI_CODE = "; photo-boost\nupload_max_filesize = 32M\npost_max_size = 64M\nmax_file_uploads = 60\nmemory_limit = 512M\nmax_execution_time = 300\n";

/* DB + funcțiile site-ului (definesc deja h()) */
$pdo = null; $dbErr = '';
try { ob_start(); require_once $DOC . '/core/bootstrap.php'; ob_end_clean(); $pdo = db(); } catch (Throwable $e) { if (ob_get_level()) ob_end_clean(); $dbErr = $e->getMessage(); }
if (!function_exists('h')) { function h($s) { return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } }
if (!function_exists('parses')) { function parses($c) { if (!defined('TOKEN_PARSE')) return true; try { token_get_all($c, TOKEN_PARSE); return true; } catch (Throwable $e) { return false; } } }
/** Convertește orice jpg/png/webp/gif în WebP, cu orientare EXIF corectă și redimensionare. */
if (!function_exists('pb_to_webp')) { function pb_to_webp(string $src, string $dst, int $max = PB_MAX, int $q = PB_Q): bool {
    if (class_exists('Imagick')) {
        try {
            $im = new Imagick($src);
            if ($im->getNumberImages() > 1) $im = $im->coalesceImages()->getImage();
            if (method_exists($im, 'autoOrient')) $im->autoOrient();
            else {
                switch ($im->getImageOrientation()) {
                    case Imagick::ORIENTATION_BOTTOMRIGHT: $im->rotateImage('#000', 180); break;
                    case Imagick::ORIENTATION_RIGHTTOP:    $im->rotateImage('#000', 90);  break;
                    case Imagick::ORIENTATION_LEFTBOTTOM:  $im->rotateImage('#000', -90); break;
                }
                $im->setImageOrientation(Imagick::ORIENTATION_TOPLEFT);
            }
            if ($im->getImageWidth() > $max || $im->getImageHeight() > $max) $im->thumbnailImage($max, $max, true);
            $im->setImageFormat('webp');
            $im->setImageCompressionQuality($q);
            $im->stripImage();
            $ok = $im->writeImage($dst);
            $im->clear();
            if ($ok && is_file($dst) && filesize($dst) > 0) return true;
        } catch (Throwable $e) { /* încearcă GD */ }
    }
    if (!function_exists('imagewebp')) return false;
    $info = @getimagesize($src);
    if (!$info) return false;
    switch ($info[2]) {
        case IMAGETYPE_JPEG: $img = @imagecreatefromjpeg($src); break;
        case IMAGETYPE_PNG:  $img = @imagecreatefrompng($src); break;
        case IMAGETYPE_WEBP: $img = @imagecreatefromwebp($src); break;
        case IMAGETYPE_GIF:  $img = @imagecreatefromgif($src); break;
        default: return false;
    }
    if (!$img) return false;
    if ($info[2] === IMAGETYPE_JPEG && function_exists('exif_read_data')) {
        $o = (int) (@exif_read_data($src)['Orientation'] ?? 1);
        if ($o === 3) $img = imagerotate($img, 180, 0);
        elseif ($o === 6) $img = imagerotate($img, -90, 0);
        elseif ($o === 8) $img = imagerotate($img, 90, 0);
    }
    $w = imagesx($img); $h = imagesy($img);
    $s = min(1, $max / max($w, $h));
    if ($s < 1) {
        $nw = (int) round($w * $s); $nh = (int) round($h * $s);
        $dstImg = imagecreatetruecolor($nw, $nh);
        imagealphablending($dstImg, false); imagesavealpha($dstImg, true);
        imagecopyresampled($dstImg, $img, 0, 0, 0, 0, $nw, $nh, $w, $h);
        imagedestroy($img); $img = $dstImg;
    } elseif (!imageistruecolor($img)) {
        imagepalettetotruecolor($img);
    }
    imagesavealpha($img, true);
    $ok = imagewebp($img, $dst, $q);
    imagedestroy($img);
    return $ok && is_file($dst) && filesize($dst) > 0;
}

}
$GAL_RE = '/<\?php if \(\$id\): \?>\s*<div class="card">\s*<h2 style="margin-top:0;font-size:16px">Photos \(.*?<\?php endif; \?>\s*(?=<\?php admin_foot\(\); \?>)/s';

$form = is_file($FORM) ? (string) file_get_contents($FORM) : '';
$st = [];
$st['form']    = $form === '' ? 'missing' : (strpos($form, 'photo-boost gallery') !== false ? 'done' : (preg_match($GAL_RE, $form) ? 'todo' : 'nomatch'));
$st['api']     = is_file($API) && strpos((string) file_get_contents($API), 'photo-boost') !== false ? 'done' : 'todo';
$st['ini']     = is_file($INI) && strpos((string) file_get_contents($INI), 'photo-boost') !== false ? 'done' : 'todo';
$st['webp']    = function_exists('imagewebp') || class_exists('Imagick');


/* ---------- AJAX: conversie pe loturi ---------- */
if (($_POST['do'] ?? '') === 'convert' && $pdo) {
    header('Content-Type: application/json');
    $bk = $TRASH . '/photo-originals-' . preg_replace('/\D/', '', (string) ($_POST['stamp'] ?? date('Ymd')));
    @mkdir($bk, 0755, true);
    $after = (int) ($_POST['after'] ?? 0);
    $q = $pdo->prepare("SELECT id, path FROM vehicle_images WHERE LOWER(path) NOT LIKE '%.webp' AND id > ? ORDER BY id LIMIT 5");
    $q->execute([$after]);
    $rows = $q->fetchAll(PDO::FETCH_ASSOC);
    $done = 0; $skip = []; $saved = 0; $last = $after;
    $up = $pdo->prepare("UPDATE vehicle_images SET path = ? WHERE id = ?");
    foreach ($rows as $r) {
        $last = (int) $r['id'];
        $src = $UP . '/' . basename($r['path']);
        if (!is_file($src)) { $skip[] = $r['path'] . ' (fișierul lipsește)'; continue; }
        $new = preg_replace('/\.[a-z0-9]+$/i', '', basename($r['path'])) . '.webp';
        if (is_file($UP . '/' . $new)) $new = preg_replace('/\.webp$/', '-' . substr(uniqid(), -5) . '.webp', $new);
        $dst = $UP . '/' . $new;
        $before = filesize($src);
        if (pb_to_webp($src, $dst)) {
            @chmod($dst, 0644);
            $up->execute([$new, $r['id']]);
            $saved += $before - filesize($dst);
            @rename($src, $bk . '/' . basename($src));
            $done++;
        } else { @unlink($dst); $skip[] = $r['path'] . ' (nu se poate converti)'; }
    }
    $lq = $pdo->prepare("SELECT COUNT(*) FROM vehicle_images WHERE LOWER(path) NOT LIKE '%.webp' AND id > ?");
    $lq->execute([$last]);
    $left = (int) $lq->fetchColumn();
    echo json_encode(['ok' => true, 'done' => $done, 'saved' => $saved, 'skip' => $skip, 'left' => $left, 'last' => $last]); exit;
}

/* ---------- aplicare / restaurare ---------- */
$msg = [];
if (($_POST['do'] ?? '') === 'apply') {
    $bk = $TRASH . '/photo-boost-' . date('Ymd_His'); @mkdir($bk, 0755, true);
    if ($st['form'] === 'todo') {
        $new = preg_replace($GAL_RE, trim($GALLERY) . "\n", $form, 1);
        if ($new && $new !== $form && parses($new)) { copy($FORM, $bk . '/vehicle_form.php'); file_put_contents($FORM, $new); $msg[] = ['ok', 'admin/vehicle_form.php: galeria nouă instalată']; }
        else $msg[] = ['bad', 'admin/vehicle_form.php: rezultatul nu se parsează — neschimbat'];
    }
    if ($st['api'] !== 'done') { if (is_file($API)) copy($API, $bk . '/photo_api.php'); file_put_contents($API, $API_CODE); $msg[] = ['ok', 'admin/photo_api.php creat']; }
    if ($st['ini'] !== 'done') { if (is_file($INI)) { copy($INI, $bk . '/user.ini'); file_put_contents($INI, "\n" . $INI_CODE, FILE_APPEND); } else file_put_contents($INI, $INI_CODE); $msg[] = ['ok', 'admin/.user.ini: limite de upload mărite (32 MB / fișier)']; }
    if (function_exists('opcache_reset')) @opcache_reset();
    $msg[] = ['ok', 'Backup: ' . $bk];
}
if (($_POST['do'] ?? '') === 'restore') {
    $dirs = glob($TRASH . '/photo-boost-*', GLOB_ONLYDIR) ?: []; rsort($dirs);
    if (!$dirs) $msg[] = ['bad', 'Niciun backup.'];
    else {
        $b = $dirs[0];
        if (is_file($b . '/vehicle_form.php')) copy($b . '/vehicle_form.php', $FORM);
        if (is_file($b . '/photo_api.php')) copy($b . '/photo_api.php', $API); elseif (is_file($API)) @unlink($API);
        if (is_file($b . '/user.ini')) copy($b . '/user.ini', $INI); elseif (is_file($INI) && strpos((string) file_get_contents($INI), 'photo-boost') === 0) @unlink($INI);
        if (function_exists('opcache_reset')) @opcache_reset();
        $msg[] = ['ok', 'Restaurat din ' . $b];
    }
}
if ($msg) { $form = (string) @file_get_contents($FORM);
    $st['form'] = strpos($form, 'photo-boost gallery') !== false ? 'done' : (preg_match($GAL_RE, $form) ? 'todo' : 'nomatch');
    $st['api'] = is_file($API) && strpos((string) file_get_contents($API), 'photo-boost') !== false ? 'done' : 'todo';
    $st['ini'] = is_file($INI) && strpos((string) file_get_contents($INI), 'photo-boost') !== false ? 'done' : 'todo'; }

$stats = null;
if ($pdo) { try {
    $stats = $pdo->query("SELECT COUNT(*) total, SUM(LOWER(path) LIKE '%.webp') webp FROM vehicle_images")->fetch(PDO::FETCH_ASSOC);
} catch (Throwable $e) { $dbErr = $e->getMessage(); } }
$diskMb = 0; foreach (glob($UP . '/*') ?: [] as $f) $diskMb += is_file($f) ? filesize($f) : 0; $diskMb = round($diskMb / 1048576, 1);
$label = ['done' => '<b class="ok">✓ instalat</b>', 'todo' => '<b class="todo">→ de instalat</b>', 'nomatch' => '<b class="bad">✗ nu găsesc blocul Photos</b>', 'missing' => '<b class="bad">✗ fișier lipsă</b>'];
?><!doctype html><html lang="ro"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Photo boost</title>
<style>body{font:14px/1.5 system-ui,sans-serif;margin:0;padding:16px;background:#f6f7f9;color:#1d2330}section{background:#fff;border:1px solid #e2e5ea;border-radius:8px;padding:14px 18px;margin:14px 0;max-width:820px}
h2{margin:0 0 10px;font-size:17px}.ok{color:#127a3a}.bad{color:#b3261e}.todo{color:#1d4ed8}td{padding:5px 10px 5px 0}
button{background:#1d4ed8;color:#fff;border:0;padding:10px 16px;border-radius:6px;font-weight:600;cursor:pointer;margin-right:6px}button.gray{background:#6b7280}button:disabled{opacity:.5}
.bar{height:10px;background:#e5e7eb;border-radius:99px;overflow:hidden;margin:10px 0}.bar i{display:block;height:100%;width:0;background:#16a34a;transition:width .3s}pre{background:#11151c;color:#d6dbe4;padding:10px;border-radius:6px;font-size:12px;max-height:220px;overflow:auto}</style></head><body>
<h1>Photo boost</h1>
<?php if ($msg) { echo '<section>'; foreach ($msg as [$c, $m]) echo '<div class="' . $c . '"><b>' . h($m) . '</b></div>'; echo '</section>'; } ?>
<section><h2>1. Upload rapid + galerie</h2>
<table>
<tr><td>Galerie nouă în admin/vehicle_form.php</td><td><?= $label[$st['form']] ?></td></tr>
<tr><td>admin/photo_api.php</td><td><?= $label[$st['api']] ?></td></tr>
<tr><td>admin/.user.ini (limite upload)</td><td><?= $label[$st['ini']] ?></td></tr>
<tr><td>Server poate face WebP</td><td><?= $st['webp'] ? '<b class="ok">✓</b>' : '<b class="bad">✗</b>' ?></td></tr>
</table>
<form method="post" style="margin-top:12px">
<?php if (in_array('todo', [$st['form'], $st['api'], $st['ini']], true) && $st['form'] !== 'nomatch'): ?><button name="do" value="apply">Instalează</button><?php endif; ?>
<button class="gray" name="do" value="restore" onclick="return confirm('Revin la ultimul backup?')">Restaurează backup</button>
</form>
<?php if ($st['form'] === 'done'): ?><p>Testează: Admin → Inventory → Edit vehicle → secțiunea <b>Photos</b>.</p><?php endif; ?>
</section>
<section><h2>2. Convertește pozele existente în WebP</h2>
<?php if (!$pdo): ?><p class="bad">DB: <?= h($dbErr) ?></p><?php else: ?>
<p><?= (int) $stats['webp'] ?> din <?= (int) $stats['total'] ?> poze sunt deja WebP · folderul are <?= $diskMb ?> MB.<br>Originalele se mută în <code><?= h($TRASH) ?>/photo-originals-DATA/</code>.</p>
<button id="cv" <?= ((int) $stats['total'] - (int) $stats['webp']) ? '' : 'disabled' ?>>Convertește <?= (int) $stats['total'] - (int) $stats['webp'] ?> poze</button>
<div class="bar"><i id="cvBar"></i></div><div id="cvTxt"></div><pre id="cvLog" style="display:none"></pre>
<script>
(function(){var b=document.getElementById('cv');if(!b)return;var total=<?= max(1, (int) $stats['total'] - (int) $stats['webp']) ?>,saved=0,after=0,stamp='<?= date('YmdHis') ?>';
b.onclick=function(){b.disabled=true;step();};
function step(){var fd=new FormData();fd.append('do','convert');fd.append('stamp',stamp);fd.append('after',after);
fetch(location.href,{method:'POST',body:fd}).then(function(r){return r.json()}).then(function(d){saved+=d.saved;after=d.last;
document.getElementById('cvBar').style.width=Math.round((total-d.left)/total*100)+'%';
document.getElementById('cvTxt').textContent='Rămase: '+d.left+' · economisit: '+(saved/1048576).toFixed(1)+' MB';
if(d.skip.length){var l=document.getElementById('cvLog');l.style.display='block';l.textContent+=d.skip.join('\n')+'\n';}
if(d.left>0)step();else document.getElementById('cvTxt').textContent+=' · GATA';}).catch(function(){document.getElementById('cvTxt').textContent='Eroare — apasă din nou.';b.disabled=false;});}})();
</script>
<?php endif; ?></section>
<p class="bad"><b>Șterge patch-photos.php după folosire.</b></p>
</body></html>
