diff --git a/api_v1/scanner/deleteWithAuth.js b/api_v1/scanner/deleteWithAuth.js new file mode 100644 index 0000000..d24ff2d --- /dev/null +++ b/api_v1/scanner/deleteWithAuth.js @@ -0,0 +1,19 @@ +// scanner/deleteWithAuth.js +const { API_KEY } = require('../config'); + +module.exports = async function deleteWithAuth(url) { + // import dinamico compatibile con CommonJS + const fetch = (await import('node-fetch')).default; + + const res = await fetch(url, { + method: 'DELETE', + headers: { + 'x-api-key': API_KEY, + 'Content-Type': 'application/json' + } + }); + + if (!res.ok) { + throw new Error(`DELETE failed: ${res.status}`); + } +}; diff --git a/api_v1/scanner/indexStore.js b/api_v1/scanner/indexStore.js index 258b682..e4795d6 100644 --- a/api_v1/scanner/indexStore.js +++ b/api_v1/scanner/indexStore.js @@ -3,45 +3,50 @@ const path = require('path'); const fsp = require('fs/promises'); const { WEB_ROOT, INDEX_PATH } = require('../config'); -// NOTE: siamo in .../api_v1/scanner → per arrivare alla root progetto servono due '..' const absIndexPath = path.resolve(__dirname, '..', '..', WEB_ROOT, INDEX_PATH); const absIndexTmp = absIndexPath + '.tmp'; const PRETTY = process.env.INDEX_PRETTY === 'true'; /** - * Carica l'indice. Formato canonico: mappa { [id]: meta }. - * Retro-compat: se il file è un array, convertilo in mappa. + * Carica l'indice strutturato: + * { + * user: { + * cartella: { + * id: { id, user, cartella, path, hash } + * } + * } + * } */ async function loadPreviousIndex() { try { const raw = await fsp.readFile(absIndexPath, 'utf8'); const json = JSON.parse(raw); - if (Array.isArray(json)) { - const map = {}; - for (const p of json) { - if (p && p.id) map[p.id] = p; - } - return map; + if (json && typeof json === 'object' && !Array.isArray(json)) { + return json; } - return json && typeof json === 'object' ? json : {}; + console.log("[INDEX] Formato vecchio → forzo rescan completo"); + return {}; } catch { return {}; } } /** - * Salva l'indice (mappa) in modo atomico: scrive su .tmp e poi rename. + * Salva l'indice in modo atomico. */ -async function saveIndex(indexMap) { +async function saveIndex(indexTree) { const dir = path.dirname(absIndexPath); await fsp.mkdir(dir, { recursive: true }); - const data = PRETTY ? JSON.stringify(indexMap, null, 2) : JSON.stringify(indexMap); + + const data = PRETTY + ? JSON.stringify(indexTree, null, 2) + : JSON.stringify(indexTree); await fsp.writeFile(absIndexTmp, data, 'utf8'); await fsp.rename(absIndexTmp, absIndexPath); } -module.exports = { loadPreviousIndex, saveIndex, absIndexPath }; \ No newline at end of file +module.exports = { loadPreviousIndex, saveIndex, absIndexPath }; diff --git a/api_v1/scanner/indexStore.js.ok b/api_v1/scanner/indexStore.js.ok new file mode 100644 index 0000000..e4795d6 --- /dev/null +++ b/api_v1/scanner/indexStore.js.ok @@ -0,0 +1,52 @@ +// scanner/indexStore.js +const path = require('path'); +const fsp = require('fs/promises'); +const { WEB_ROOT, INDEX_PATH } = require('../config'); + +const absIndexPath = path.resolve(__dirname, '..', '..', WEB_ROOT, INDEX_PATH); +const absIndexTmp = absIndexPath + '.tmp'; + +const PRETTY = process.env.INDEX_PRETTY === 'true'; + +/** + * Carica l'indice strutturato: + * { + * user: { + * cartella: { + * id: { id, user, cartella, path, hash } + * } + * } + * } + */ +async function loadPreviousIndex() { + try { + const raw = await fsp.readFile(absIndexPath, 'utf8'); + const json = JSON.parse(raw); + + if (json && typeof json === 'object' && !Array.isArray(json)) { + return json; + } + + console.log("[INDEX] Formato vecchio → forzo rescan completo"); + return {}; + } catch { + return {}; + } +} + +/** + * Salva l'indice in modo atomico. + */ +async function saveIndex(indexTree) { + const dir = path.dirname(absIndexPath); + await fsp.mkdir(dir, { recursive: true }); + + const data = PRETTY + ? JSON.stringify(indexTree, null, 2) + : JSON.stringify(indexTree); + + await fsp.writeFile(absIndexTmp, data, 'utf8'); + await fsp.rename(absIndexTmp, absIndexPath); +} + +module.exports = { loadPreviousIndex, saveIndex, absIndexPath }; diff --git a/api_v1/scanner/l.js b/api_v1/scanner/l.js new file mode 100644 index 0000000..0e1293a --- /dev/null +++ b/api_v1/scanner/l.js @@ -0,0 +1,73 @@ +// tools/listFolderIds.js +const fs = require('fs'); +const fsp = require('fs/promises'); +const path = require('path'); +const readline = require('readline'); +const { WEB_ROOT, INDEX_PATH } = require('../config'); + +async function buildIdsListForFolder(userName, cartella) { + const indexPath = path.resolve(__dirname, '..', '..', WEB_ROOT, INDEX_PATH); + const idsIndex = []; + + console.log("\n[LIST] buildIdsListForFolder()"); + console.log("[LIST] user =", userName); + console.log("[LIST] cartella=", cartella); + console.log("[LIST] indexPath =", indexPath); + + if (!fs.existsSync(indexPath)) { + console.log("[LIST] index.json non trovato"); + return idsIndex; + } + + try { + const raw = await fsp.readFile(indexPath, 'utf8'); + const index = JSON.parse(raw); + + const userObj = index[userName]; + if (!userObj) { + console.log(`[LIST] Nessuna entry per user=${userName}`); + return idsIndex; + } + + const folder = userObj[cartella]; + if (!folder) { + console.log(`[LIST] Nessuna cartella "${cartella}" per user=${userName}`); + return idsIndex; + } + + const ids = Object.keys(folder).filter(k => k !== "_folderHash"); + idsIndex.push(...ids); + + console.log(`\n[LIST] ID trovati in ${userName}/${cartella}: ${idsIndex.length}`); + idsIndex.forEach(id => console.log(" -", id)); + console.log(""); + + return idsIndex; + + } catch (err) { + console.log("[LIST] Errore leggendo/parsing index.json:", err.message); + return idsIndex; + } +} + +async function main() { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + const ask = (q) => new Promise(res => rl.question(q, res)); + + try { + const user = await ask('User: '); + const cartella = await ask('Cartella: '); + + await buildIdsListForFolder(user.trim(), cartella.trim()); + } finally { + rl.close(); + } +} + +main().catch(err => { + console.error("Errore:", err); +}); diff --git a/api_v1/scanner/orphanCleanup.js b/api_v1/scanner/orphanCleanup.js new file mode 100644 index 0000000..abb8bbe --- /dev/null +++ b/api_v1/scanner/orphanCleanup.js @@ -0,0 +1,136 @@ +// scanner/orphanCleanup.js +const fs = require('fs'); +const fsp = require('fs/promises'); +const path = require('path'); +const { WEB_ROOT, INDEX_PATH } = require('../config'); + +module.exports = function createCleanupFunctions(db) { + + async function buildIdsListForFolder(userName, cartella) { + const indexPath = path.resolve(__dirname, '..', '..', WEB_ROOT, INDEX_PATH); + const idsIndex = []; + + console.log("\n[ORPHAN] buildIdsListForFolder()"); + console.log("[ORPHAN] user =", userName); + console.log("[ORPHAN] cartella =", cartella); + console.log("[ORPHAN] indexPath =", indexPath); + + if (!fs.existsSync(indexPath)) { + console.log("[ORPHAN] index.json non trovato"); + return idsIndex; + } + + try { + const raw = await fsp.readFile(indexPath, 'utf8'); + const index = JSON.parse(raw); + + const userObj = index[userName]; + if (!userObj) return idsIndex; + + const folder = userObj[cartella]; + if (!folder) return idsIndex; + + const ids = Object.keys(folder).filter(k => k !== "_folderHash"); + idsIndex.push(...ids); + + console.log(`[ORPHAN] ID trovati in ${userName}/${cartella}: ${idsIndex.length}`); + idsIndex.forEach(id => console.log(" -", id)); + + return idsIndex; + + } catch (err) { + console.log("[ORPHAN] Errore leggendo index.json:", err.message); + return idsIndex; + } + } + + function removeIdFromList(idsIndex, id) { + const newList = idsIndex.filter(x => x !== id); + + if (newList.length !== idsIndex.length) { + console.log(`[ORPHAN] Rimosso ID dalla lista: ${id}`); + } else { + console.log(`[ORPHAN] ID NON presente nella lista: ${id}`); + } + + console.log(`[ORPHAN] ID rimanenti (${newList.length}):`); + newList.forEach(x => console.log(" -", x)); + console.log(""); + + return newList; + } + + async function deleteFromIndexById(id) { + const indexPath = path.resolve(__dirname, '..', '..', WEB_ROOT, INDEX_PATH); + + if (!fs.existsSync(indexPath)) return false; + + const raw = await fsp.readFile(indexPath, 'utf8'); + const index = JSON.parse(raw); + + let deleted = false; + + for (const user of Object.keys(index)) { + for (const cartella of Object.keys(index[user])) { + const folder = index[user][cartella]; + if (folder[id]) { + delete folder[id]; + deleted = true; + console.log(`✔ Eliminato ID ${id} da ${user}/${cartella}`); + } + } + } + + if (deleted) { + await fsp.writeFile(indexPath, JSON.stringify(index, null, 2)); + } + + return deleted; + } + + async function deleteThumbsById(id) { + const col = db.get('photos'); + const rec = col.find({ id }).value(); + + if (!rec) { + console.log(`[ORPHAN] Nessun record DB per ID ${id}`); + return false; + } + + const thumbs = [rec.thub1, rec.thub2].filter(Boolean); + let deleted = false; + + for (const t of thumbs) { + const abs = path.resolve(__dirname, '../public' + t); + if (fs.existsSync(abs)) { + await fsp.rm(abs, { force: true }); + console.log(`✔ Eliminato thumb: ${abs}`); + deleted = true; + } + } + + return deleted; + } + + function deleteFromDB(id) { + const col = db.get('photos'); + const exists = col.find({ id }).value(); + + if (exists) { + col.remove({ id }).write(); + console.log(`✔ Eliminato ID ${id} dal DB`); + return true; + } + + console.log(`[ORPHAN] ID ${id} non presente nel DB`); + return false; + } + + return { + buildIdsListForFolder, + removeIdFromList, + deleteFromIndexById, + deleteThumbsById, + deleteFromDB + }; +}; diff --git a/api_v1/scanner/processFile.js b/api_v1/scanner/processFile.js index d886844..4caebc9 100644 --- a/api_v1/scanner/processFile.js +++ b/api_v1/scanner/processFile.js @@ -2,7 +2,6 @@ const path = require('path'); const fsp = require('fs/promises'); const ExifReader = require('exifreader'); const sharp = require('sharp'); - const { sha256, inferMimeFromExt, parseExifDateUtc } = require('./utils'); const { extractGpsFromExif, extractGpsWithExiftool } = require('./gps'); const { createVideoThumbnail, createThumbnails } = require('./thumbs'); @@ -39,16 +38,21 @@ async function processFile(userName, cartella, fileRelPath, absPath, ext, st) { await createThumbnails(absPath, absThumbMin, absThumbAvg); } + // --- EXIF --- let tags = {}; - try { tags = await ExifReader.load(absPath, { expanded: true }); } catch {} + try { + tags = await ExifReader.load(absPath, { expanded: true }); + } catch {} const timeRaw = tags?.exif?.DateTimeOriginal?.value?.[0] || null; const takenAtIso = parseExifDateUtc(timeRaw); + // --- GPS --- let gps = isVideo ? await extractGpsWithExiftool(absPath) : extractGpsFromExif(tags); + // --- DIMENSIONI --- let width = null, height = null, duration = null; if (isVideo) { @@ -67,6 +71,27 @@ async function processFile(userName, cartella, fileRelPath, absPath, ext, st) { } catch {} } + // --- ROTAZIONE EXIF → GRADI REALI --- + let rotation = null; + try { + const raw = + tags?.exif?.Orientation?.value ?? + tags?.image?.Orientation?.value ?? + tags?.ifd0?.Orientation?.value ?? + null; + + const val = Array.isArray(raw) ? raw[0] : raw; + + const map = { + 1: 0, + 3: 180, + 6: 90, + 8: 270 + }; + + rotation = map[val] ?? null; + } catch {} + const mime_type = inferMimeFromExt(ext); const id = sha256(`${userName}/${cartella}/${fileRelPath}`); @@ -76,12 +101,10 @@ async function processFile(userName, cartella, fileRelPath, absPath, ext, st) { // --- GESTIONE PATH FULL / RELATIVI --- // - // relativi (comportamento attuale) const relPath = fileRelPath; const relThub1 = fileRelPath.replace(/\.[^.]+$/, '_min.jpg'); const relThub2 = fileRelPath.replace(/\.[^.]+$/, '_avg.jpg'); - // completi (solo se PATH_FULL = true) const fullPath = PATH_FULL ? path.posix.join('/photos', userName, cartella, fileRelPath) : relPath; @@ -107,6 +130,7 @@ async function processFile(userName, cartella, fileRelPath, absPath, ext, st) { mime_type, width, height, + rotation, // <── ROTAZIONE IN GRADI REALI size_bytes: st.size, mtimeMs: st.mtimeMs, duration: isVideo ? duration : null, diff --git a/api_v1/scanner/scanCartella.js b/api_v1/scanner/scanCartella.js index ba2bd51..cc9ce05 100644 --- a/api_v1/scanner/scanCartella.js +++ b/api_v1/scanner/scanCartella.js @@ -1,99 +1,92 @@ -// scanner/scanCartella.js -const path = require('path'); -const fsp = require('fs/promises'); -const processFile = require('./processFile'); -const { sha256 } = require('./utils'); -const { SUPPORTED_EXTS } = require('../config'); - -/** - * Scansiona ricorsivamente una cartella e ritorna SOLO i cambiamenti - * (nuovi/modificati) rispetto a previousIndex (mappa { id: meta }). - * - * @param {string} userName - Nome utente (es. "Fabio" o "Common") - * @param {string} cartella - Nome della cartella logica sotto "original" (es. "2017Irlanda19-29ago") - * @param {string} absCartella - Percorso assoluto della cartella da scansionare (p.es. .../photos//original/) - * @param {Object} previousIndex- Mappa dell'indice precedente: { : meta } - * @returns {Promise>} changes - Lista dei soli meta cambiati o nuovi - */ -async function scanCartella(userName, cartella, absCartella, previousIndex) { - const changes = []; - - async function walk(currentAbs, relPath = '') { - let entries = []; - try { - entries = await fsp.readdir(currentAbs, { withFileTypes: true }); - } catch (err) { - // Cartella non leggibile: logga e prosegui (non bloccare la scansione globale) - console.error(`[SCAN] Impossibile leggere: ${currentAbs} - ${err.message}`); - return; - } - - for (const e of entries) { - const absPath = path.join(currentAbs, e.name); - - if (e.isDirectory()) { - await walk(absPath, path.join(relPath, e.name)); - continue; - } - - // Filtra estensioni non supportate - const ext = path.extname(e.name).toLowerCase(); - if (!SUPPORTED_EXTS.has(ext)) continue; - - // Percorso relativo POSIX (usato per mantenere slash '/') - const fileRelPath = relPath ? `${relPath}/${e.name}` : e.name; - - // ID deterministico: user/cartella/relPath - const id = sha256(`${userName}/${cartella}/${fileRelPath}`); - - // Confronto con indice precedente per saltare "unchanged" - let st; - try { - st = await fsp.stat(absPath); - } catch (err) { - // File sparito o non accessibile: salta - console.warn(`[SCAN] stat fallita: ${absPath} - ${err.message}`); - continue; - } - - const prev = previousIndex[id]; - const unchanged = - prev && - prev.size_bytes === st.size && - prev.mtimeMs === st.mtimeMs; - - if (unchanged) continue; // nulla da aggiornare - - // Estrae metadati (EXIF, mime, dimensioni, thumbs, ecc.) - const meta = await processFile( - userName, - cartella, - fileRelPath, - absPath, - ext, - st - ); - - // ID sempre presente - meta.id = id; - - // 🔧 Canonicalizza SEMPRE il path pubblicato nell’index: - // /photos//original// - { - // Normalizza separatori e rimuove eventuali leading-slash multipli - const relPosix = String(fileRelPath).replace(/\\/g, '/').replace(/^\/+/, ''); - // Costruisci il path canonico e comprimi eventuali '//' in '/' - const canonical = `/photos/${userName}/original/${cartella}/${relPosix}`.replace(/\/+/g, '/'); - meta.path = canonical; - // NB: thub1/thub2 rimangono quelli prodotti da processFile (ok per immagini e video) - } - - changes.push(meta); - } - } - - await walk(absCartella); - return changes; -} - -module.exports = scanCartella; \ No newline at end of file +// scanner/scanCartella.js +const path = require('path'); +const fsp = require('fs/promises'); +const processFile = require('./processFile'); +const { sha256 } = require('./utils'); +const { SUPPORTED_EXTS } = require('../config'); + +async function scanCartella(userName, cartella, absCartella, previousIndexTree) { + const changes = []; + + async function walk(currentAbs, relPath = '') { + console.log(`[SCAN] Entrato in cartella: ${currentAbs}`); + + let entries = []; + try { + entries = await fsp.readdir(currentAbs, { withFileTypes: true }); + } catch (err) { + console.error(`[SCAN] Impossibile leggere: ${currentAbs} - ${err.message}`); + return; + } + + for (const e of entries) { + const absPath = path.join(currentAbs, e.name); + + if (e.isDirectory()) { + await walk(absPath, path.join(relPath, e.name)); + continue; + } + + const ext = path.extname(e.name).toLowerCase(); + if (!SUPPORTED_EXTS.has(ext)) continue; + + const fileRelPath = relPath ? `${relPath}/${e.name}` : e.name; + console.log(`[SCAN] FILE TROVATO → ${fileRelPath}`); + + const id = sha256(`${userName}/${cartella}/${fileRelPath}`); + + let st; + try { + st = await fsp.stat(absPath); + } catch { + continue; + } + + const hash = sha256(`${st.size}-${st.mtimeMs}`); + const prev = previousIndexTree?.[userName]?.[cartella]?.[id]; + + console.log(`[SCAN] CHECK → id=${id}, hash=${hash}, prevHash=${prev?.hash}`); + + // 🔥 NON facciamo più SKIP qui. + // Anche se il file è invariato, lo passiamo a scanPhoto.js + // così può rimuovere l'ID da idsIndex. + if (prev && prev.hash === hash) { + console.log(`[SCAN] FILE INVARIATO (passato a scanPhoto) → ${fileRelPath}`); + + const meta = { + id, + user: userName, + cartella, + path: `/photos/${userName}/original/${cartella}/${fileRelPath}`, + _indexHash: hash, + unchanged: true + }; + + changes.push(meta); + continue; + } + + console.log(`[SCAN] PROCESSING → ${userName}/${cartella}/${fileRelPath}`); + + const meta = await processFile( + userName, + cartella, + fileRelPath, + absPath, + ext, + st + ); + + meta.id = id; + meta.path = `/photos/${userName}/original/${cartella}/${fileRelPath}`; + meta._indexHash = hash; + + changes.push(meta); + } + } + + await walk(absCartella); + return changes; +} + +module.exports = scanCartella; diff --git a/api_v1/scanner/scanCartella.js.new b/api_v1/scanner/scanCartella.js.new new file mode 100644 index 0000000..c57b048 --- /dev/null +++ b/api_v1/scanner/scanCartella.js.new @@ -0,0 +1,78 @@ +// scanner/scanCartella.js +const path = require('path'); +const fsp = require('fs/promises'); +const processFile = require('./processFile'); +const { sha256 } = require('./utils'); +const { SUPPORTED_EXTS } = require('../config'); + +async function scanCartella(userName, cartella, absCartella, previousIndexTree) { + const changes = []; + + async function walk(currentAbs, relPath = '') { + console.log(`[SCAN] Entrato in cartella: ${currentAbs}`); + + let entries = []; + try { + entries = await fsp.readdir(currentAbs, { withFileTypes: true }); + } catch (err) { + console.error(`[SCAN] Impossibile leggere: ${currentAbs} - ${err.message}`); + return; + } + + for (const e of entries) { + const absPath = path.join(currentAbs, e.name); + + if (e.isDirectory()) { + await walk(absPath, path.join(relPath, e.name)); + continue; + } + + const ext = path.extname(e.name).toLowerCase(); + if (!SUPPORTED_EXTS.has(ext)) continue; + + const fileRelPath = relPath ? `${relPath}/${e.name}` : e.name; + console.log(`[SCAN] FILE TROVATO → ${fileRelPath}`); + + const id = sha256(`${userName}/${cartella}/${fileRelPath}`); + + let st; + try { + st = await fsp.stat(absPath); + } catch { + continue; + } + + const hash = sha256(`${st.size}-${st.mtimeMs}`); + const prev = previousIndexTree?.[userName]?.[cartella]?.[id]; + + console.log(`[SCAN] CHECK → id=${id}, hash=${hash}, prevHash=${prev?.hash}`); + + if (prev && prev.hash === hash) { + console.log(`[SCAN] SKIP (unchanged) → ${fileRelPath}`); + continue; + } + + console.log(`[SCAN] PROCESSING → ${userName}/${cartella}/${fileRelPath}`); + + const meta = await processFile( + userName, + cartella, + fileRelPath, + absPath, + ext, + st + ); + + meta.id = id; + meta.path = `/photos/${userName}/original/${cartella}/${fileRelPath}`; + meta._indexHash = hash; + + changes.push(meta); + } + } + + await walk(absCartella); + return changes; +} + +module.exports = scanCartella; diff --git a/api_v1/scanner/scanCartella.js.ok b/api_v1/scanner/scanCartella.js.ok new file mode 100644 index 0000000..c57b048 --- /dev/null +++ b/api_v1/scanner/scanCartella.js.ok @@ -0,0 +1,78 @@ +// scanner/scanCartella.js +const path = require('path'); +const fsp = require('fs/promises'); +const processFile = require('./processFile'); +const { sha256 } = require('./utils'); +const { SUPPORTED_EXTS } = require('../config'); + +async function scanCartella(userName, cartella, absCartella, previousIndexTree) { + const changes = []; + + async function walk(currentAbs, relPath = '') { + console.log(`[SCAN] Entrato in cartella: ${currentAbs}`); + + let entries = []; + try { + entries = await fsp.readdir(currentAbs, { withFileTypes: true }); + } catch (err) { + console.error(`[SCAN] Impossibile leggere: ${currentAbs} - ${err.message}`); + return; + } + + for (const e of entries) { + const absPath = path.join(currentAbs, e.name); + + if (e.isDirectory()) { + await walk(absPath, path.join(relPath, e.name)); + continue; + } + + const ext = path.extname(e.name).toLowerCase(); + if (!SUPPORTED_EXTS.has(ext)) continue; + + const fileRelPath = relPath ? `${relPath}/${e.name}` : e.name; + console.log(`[SCAN] FILE TROVATO → ${fileRelPath}`); + + const id = sha256(`${userName}/${cartella}/${fileRelPath}`); + + let st; + try { + st = await fsp.stat(absPath); + } catch { + continue; + } + + const hash = sha256(`${st.size}-${st.mtimeMs}`); + const prev = previousIndexTree?.[userName]?.[cartella]?.[id]; + + console.log(`[SCAN] CHECK → id=${id}, hash=${hash}, prevHash=${prev?.hash}`); + + if (prev && prev.hash === hash) { + console.log(`[SCAN] SKIP (unchanged) → ${fileRelPath}`); + continue; + } + + console.log(`[SCAN] PROCESSING → ${userName}/${cartella}/${fileRelPath}`); + + const meta = await processFile( + userName, + cartella, + fileRelPath, + absPath, + ext, + st + ); + + meta.id = id; + meta.path = `/photos/${userName}/original/${cartella}/${fileRelPath}`; + meta._indexHash = hash; + + changes.push(meta); + } + } + + await walk(absCartella); + return changes; +} + +module.exports = scanCartella; diff --git a/api_v1/scanner/scanPhoto.js b/api_v1/scanner/scanPhoto.js index 761e291..563b909 100644 --- a/api_v1/scanner/scanPhoto.js +++ b/api_v1/scanner/scanPhoto.js @@ -1,134 +1,189 @@ -// scanner/scanPhoto.js -const path = require('path'); -const fsp = require('fs/promises'); -const { loadPreviousIndex, saveIndex } = require('./indexStore'); -const scanUserRoot = require('./scanUser'); -const postWithAuth = require('./postWithAuth'); -const { - WEB_ROOT, - SEND_PHOTOS, - BASE_URL, - WRITE_INDEX, -} = require('../config'); - -const COMMON = 'Common'; // Nome canonico e case-sensitive per la shared folder - -/** - * Restituisce la prima directory esistente tra le candidate - * @param {string[]} candidates - * @returns {Promise} - */ -async function firstExistingDir(candidates) { - for (const dir of candidates) { - try { - const st = await fsp.stat(dir); - if (st.isDirectory()) return dir; - } catch { /* ignore */ } - } - return null; -} - -/** - * Scansione foto con indice separato: - * - Carica indice precedente (mappa { id: meta }) - * - Produce SOLO i cambiamenti (nuovi/modificati) - * - Merge e salvataggio atomico dell'indice - * - POST verso /photos solo del delta (se abilitato) - * - Admin: include la cartella "Common" - * - * Nota path: usiamo un path ASSOLUTO per /public/photos - * partendo da .../api_v1/scanner -> '..', '..' per salire alla root del progetto. - */ -async function scanPhoto(dir, userName) { - try { - const previousIndexMap = await loadPreviousIndex(); - const nextIndexMap = { ...previousIndexMap }; - - // Path assoluto alla radice photos (es: /public/photos) - const photosRoot = path.resolve(__dirname, '..', '..', WEB_ROOT, 'photos'); - - let changes = []; - - if (userName === 'Admin') { - // 1) Scansiona TUTTI gli utenti tranne la/e cartella/e common - let entries = []; - try { - entries = await fsp.readdir(photosRoot, { withFileTypes: true }); - } catch (e) { - console.error(`[SCAN] photosRoot non accessibile: ${photosRoot}`, e.message); - entries = []; - } - - for (const e of entries) { - if (!e.isDirectory()) continue; - // salta qualunque "common" (qualunque casing) per non doppiare - if (e.name.toLowerCase() === COMMON.toLowerCase()) continue; - - const userDir = path.join(photosRoot, e.name, 'original'); - try { - const st = await fsp.stat(userDir); - if (!st.isDirectory()) continue; - } catch { - continue; - } - - const userChanges = await scanUserRoot(e.name, userDir, previousIndexMap); - for (const m of userChanges) nextIndexMap[m.id] = m; - changes.push(...userChanges); - } - - // 2) Scansiona la cartella COMMON (case strict), con fallback legacy (solo lettura) a 'common' - const commonPreferred = path.join(photosRoot, COMMON, 'original'); // .../photos/Common/original - const commonLegacy = path.join(photosRoot, 'common', 'original'); // .../photos/common/original (legacy) - - const commonDir = await firstExistingDir([commonPreferred, commonLegacy]); - if (commonDir) { - // Forziamo SEMPRE userName = 'Common' per ID/thumbnails coerenti in 'Common' - const commonChanges = await scanUserRoot(COMMON, commonDir, previousIndexMap); - for (const m of commonChanges) nextIndexMap[m.id] = m; - changes.push(...commonChanges); - console.log(`[SCAN] Common indicizzati da ${commonDir}: +${commonChanges.length}`); - } else { - console.log(`[SCAN] Nessuna cartella "${COMMON}" trovata sotto ${photosRoot} (atteso: ${commonPreferred})`); - } - - } else { - // Non-Admin (per completezza; in server.js /scan è Admin-only) - const userDir = path.join(photosRoot, userName, 'original'); - try { - const st = await fsp.stat(userDir); - if (st.isDirectory()) { - const userChanges = await scanUserRoot(userName, userDir, previousIndexMap); - for (const m of userChanges) nextIndexMap[m.id] = m; - changes.push(...userChanges); - } - } catch { - // utente senza dir 'original' -> nessuna modifica - } - } - - // Salva indice (mappa) in modo atomico - if (WRITE_INDEX) { - await saveIndex(nextIndexMap); - } - - // POST solo dei cambiamenti (delta) - if (SEND_PHOTOS && BASE_URL && changes.length) { - for (const p of changes) { - try { - await postWithAuth(`${BASE_URL}/photos`, p); - } catch (err) { - console.error('Errore invio:', err.message); - } - } - } - - console.log(`SCAN COMPLETATA per utente ${userName}: ${changes.length} file aggiornati`); - return changes; - } catch (e) { - console.error('Errore generale scanPhoto:', e); - throw e; - } -} - -module.exports = scanPhoto; \ No newline at end of file +// scanner/scanPhoto.js +const path = require('path'); +const fs = require('fs'); +const fsp = require('fs/promises'); + +const { loadPreviousIndex, saveIndex } = require('./indexStore'); +const scanCartella = require('./scanCartella'); +const postWithAuth = require('./postWithAuth'); + +const { + WEB_ROOT, + SEND_PHOTOS, + BASE_URL, + WRITE_INDEX +} = require('../config'); + +const createCleanupFunctions = require('./orphanCleanup'); + +async function scanPhoto(dir, userName, db) { + console.log(`[SCAN] Avvio scanPhoto per user=${userName}`); + + const previousIndexTree = await loadPreviousIndex(); + const nextIndexTree = JSON.parse(JSON.stringify(previousIndexTree || {})); + + const { + buildIdsListForFolder, + removeIdFromList, + deleteThumbsById, + deleteFromDB + } = createCleanupFunctions(db); + + const photosRoot = path.resolve(__dirname, '..', '..', WEB_ROOT, 'photos'); + const userDir = path.join(photosRoot, userName, 'original'); + + let changes = []; + + // --------------------------------------------------------- + // SCAN DI UNA SINGOLA CARTELLA + // --------------------------------------------------------- + async function scanSingleFolder(user, cartella, absCartella) { + console.log(`\n==============================================`); + console.log(`[SCAN] CARTELLA → ${user}/${cartella}`); + console.log(`[DEBUG] SCANSIONE CARTELLA PATH: ${absCartella}`); + console.log("=============================================="); + + let idsIndex = await buildIdsListForFolder(user, cartella); + + const folderFiles = await scanCartella( + user, + cartella, + absCartella, + previousIndexTree + ); + + for (const m of folderFiles) { + const prev = previousIndexTree?.[m.user]?.[m.cartella]?.[m.id]; + + // 🔥 FILE INVARIATO + if (prev && prev.hash === m._indexHash) { + + console.log("\n================ FILE INVARIATO ================"); + console.log("[FILE]:", m.path); + + console.log("[ID OGGI]:", JSON.stringify(m.id)); + console.log("[ID INDEX]:", JSON.stringify(prev.id)); + console.log("[UGUALI?]:", m.id === prev.id); + + console.log("[LEN OGGI]:", m.id.length); + console.log("[LEN INDEX]:", prev.id.length); + + console.log("----- BYTE PER BYTE -----"); + const max = Math.min(m.id.length, prev.id.length, 64); + for (let i = 0; i < max; i++) { + const a = m.id[i]; + const b = prev.id[i]; + console.log( + i.toString().padStart(2, "0"), + a, + b, + a === b ? "==" : "!=" + ); + } + + console.log("----- idsIndex PRIMA -----"); + console.log(idsIndex.map(x => JSON.stringify(x))); + + const found = idsIndex.includes(m.id); + console.log("[ID PRESENTE IN idsIndex?]:", found); + + const newList = idsIndex.filter(x => x !== m.id); + + console.log("----- idsIndex DOPO -----"); + console.log(newList.map(x => JSON.stringify(x))); + + idsIndex = newList; + + console.log("=================================================\n"); + continue; + } + + // 🔥 FILE NUOVO O MODIFICATO + nextIndexTree[m.user] ??= {}; + nextIndexTree[m.user][m.cartella] ??= {}; + nextIndexTree[m.user][m.cartella][m.id] = { + id: m.id, + user: m.user, + cartella: m.cartella, + path: m.path, + hash: m._indexHash + }; + + idsIndex = removeIdFromList(idsIndex, m.id); + changes.push(m); + } + + // --------------------------------------------------------- + // ORFANI + // --------------------------------------------------------- + if (idsIndex.length > 0) { + console.log(`[ORPHAN] ID orfani trovati nella cartella ${cartella}:`); + idsIndex.forEach(id => console.log(" -", id)); + } else { + console.log(`[ORPHAN] Nessun ID orfano nella cartella ${cartella}`); + } + + for (const orphanId of idsIndex) { + console.log(`\n[ORPHAN] Eliminazione ID → ${orphanId}`); + + const thumbsDeleted = await deleteThumbsById(orphanId); + console.log(` → thumbsDeleted = ${thumbsDeleted}`); + + const dbDeleted = deleteFromDB(orphanId); + console.log(` → dbDeleted = ${dbDeleted}`); + + const userTree = nextIndexTree[user]; + if (userTree && userTree[cartella] && userTree[cartella][orphanId]) { + delete userTree[cartella][orphanId]; + console.log(` → nextIndexTree updated (removed ${orphanId})`); + } + + console.log(`[ORPHAN] COMPLETATO → ${orphanId}`); + } + + console.log(`==============================================\n`); + } + + // --------------------------------------------------------- + // SCAN SOTTOCARTELLE + // --------------------------------------------------------- + let entries = []; + try { + entries = await fsp.readdir(userDir, { withFileTypes: true }); + } catch { + console.log(`[SCAN] Nessuna directory per utente ${userName}`); + return []; + } + + for (const e of entries) { + if (!e.isDirectory()) continue; + const cartella = e.name; + const absCartella = path.join(userDir, cartella); + await scanSingleFolder(userName, cartella, absCartella); + } + + // --------------------------------------------------------- + // SALVO INDEX + // --------------------------------------------------------- + if (WRITE_INDEX) { + await saveIndex(nextIndexTree); + } + + // --------------------------------------------------------- + // INVIO AL SERVER + // --------------------------------------------------------- + if (SEND_PHOTOS && BASE_URL && changes.length) { + for (const p of changes) { + try { + await postWithAuth(`${BASE_URL}/photos`, p); + } catch (err) { + console.error('Errore invio:', err.message); + } + } + } + + console.log(`SCAN COMPLETATA: ${changes.length} file aggiornati`); + return changes; +} + +module.exports = scanPhoto; diff --git a/api_v1/scanner/scanPhoto.js.new b/api_v1/scanner/scanPhoto.js.new new file mode 100644 index 0000000..b7b6d54 --- /dev/null +++ b/api_v1/scanner/scanPhoto.js.new @@ -0,0 +1,176 @@ +// scanner/scanPhoto.js +const path = require('path'); +const fs = require('fs'); +const fsp = require('fs/promises'); + +const { loadPreviousIndex, saveIndex } = require('./indexStore'); +const scanCartella = require('./scanCartella'); +const postWithAuth = require('./postWithAuth'); + +const { + WEB_ROOT, + SEND_PHOTOS, + BASE_URL, + WRITE_INDEX +} = require('../config'); + +const createCleanupFunctions = require('./orphanCleanup'); + +async function scanPhoto(dir, userName, db) { + console.log(`[SCAN] Avvio scanPhoto per user=${userName}`); + + // Log di configurazione (utile per diagnosi) + console.log('[SCAN] Config:', { + WEB_ROOT, + SEND_PHOTOS, + BASE_URL, + WRITE_INDEX + }); + + // 1) Carico l’indice precedente (fonte unica durante la run) + const previousIndexTree = await loadPreviousIndex(); // <— RAM source + // 2) Clono l’indice per costruire il nuovo + const nextIndexTree = JSON.parse(JSON.stringify(previousIndexTree || {})); + + // Funzioni di cleanup (solo thumbs + DB) + // NOTA: con Opzione A NON leggiamo più l'indice da file e NON aggiorniamo index.json "in itinere" + const { + // buildIdsListForFolder, // <— NON usato in Opzione A + removeIdFromList, + deleteThumbsById, + deleteFromDB + // deleteFromIndexById // <— NON usato in Opzione A + } = createCleanupFunctions(db); // [1](https://electrolux-my.sharepoint.com/personal/fabio_micheluz_electrolux_com/Documents/File%20di%20Microsoft%20Copilot%20Chat/orphanCleanup.js.txt) + + const photosRoot = path.resolve(__dirname, '..', '..', WEB_ROOT, 'photos'); + const userDir = path.join(photosRoot, userName, 'original'); + + let changes = []; + + // --------------------------------------------------------- + // SCAN DI UNA SINGOLA CARTELLA + // --------------------------------------------------------- + async function scanSingleFolder(user, cartella, absCartella) { + console.log(`\n==============================================`); + console.log(`[SCAN] CARTELLA → ${user}/${cartella}`); + console.log("=============================================="); + + // Costruisci idsIndex dall'indice in RAM (previousIndexTree) + // Fonte unica di verità per questa run → evita drift con il file su disco. + let idsIndex = Object.keys(previousIndexTree?.[user]?.[cartella] || {}) + .filter(k => k !== '_folderHash'); // <— niente metadati + console.log(`[ORPHAN] ID iniziali in RAM (${idsIndex.length}):`); + idsIndex.forEach(id => console.log(" -", id)); + + // File reali trovati nella cartella + const folderFiles = await scanCartella( + user, + cartella, + absCartella, + previousIndexTree + ); // [2](https://electrolux-my.sharepoint.com/personal/fabio_micheluz_electrolux_com/Documents/File%20di%20Microsoft%20Copilot%20Chat/scanCartella.js.txt) + + for (const m of folderFiles) { + const prev = previousIndexTree?.[m.user]?.[m.cartella]?.[m.id]; + + // 🔥 FILE INVARIATO + if (prev && prev.hash === m._indexHash) { + console.log(`[SCAN] SKIP (unchanged) → ${m.path}`); + // Rimuovo SOLO dalla lista orfani (dalla RAM) + idsIndex = removeIdFromList(idsIndex, m.id); // [1](https://electrolux-my.sharepoint.com/personal/fabio_micheluz_electrolux_com/Documents/File%20di%20Microsoft%20Copilot%20Chat/orphanCleanup.js.txt) + continue; + } + + // 🔥 FILE NUOVO O MODIFICATO → aggiorno nextIndexTree + nextIndexTree[m.user] ??= {}; + nextIndexTree[m.user][m.cartella] ??= {}; + nextIndexTree[m.user][m.cartella][m.id] = { + id: m.id, + user: m.user, + cartella: m.cartella, + path: m.path, + hash: m._indexHash + }; + + // Rimuovo dalla lista orfani (in RAM) + idsIndex = removeIdFromList(idsIndex, m.id); // [1](https://electrolux-my.sharepoint.com/personal/fabio_micheluz_electrolux_com/Documents/File%20di%20Microsoft%20Copilot%20Chat/orphanCleanup.js.txt) + changes.push(m); + } + + // --------------------------------------------------------- + // ORFANI → rimuovo SOLO da nextIndexTree + thumbs + DB + // --------------------------------------------------------- + if (idsIndex.length > 0) { + console.log(`[ORPHAN] ID orfani trovati nella cartella ${cartella}:`); + idsIndex.forEach(id => console.log(" -", id)); + } else { + console.log(`[ORPHAN] Nessun ID orfano nella cartella ${cartella}`); + } + + for (const orphanId of idsIndex) { + console.log(`\n[ORPHAN] Eliminazione ID → ${orphanId}`); + + // 1) Cancello thumbs + const thumbsDeleted = await deleteThumbsById(orphanId); // [1](https://electrolux-my.sharepoint.com/personal/fabio_micheluz_electrolux_com/Documents/File%20di%20Microsoft%20Copilot%20Chat/orphanCleanup.js.txt) + console.log(` → thumbsDeleted = ${thumbsDeleted}`); + + // 2) Cancello dal DB + const dbDeleted = deleteFromDB(orphanId); // [1](https://electrolux-my.sharepoint.com/personal/fabio_micheluz_electrolux_com/Documents/File%20di%20Microsoft%20Copilot%20Chat/orphanCleanup.js.txt) + console.log(` → dbDeleted = ${dbDeleted}`); + + // 3) Cancello SOLO da nextIndexTree (in RAM) + const userTree = nextIndexTree[user]; + if (userTree && userTree[cartella] && userTree[cartella][orphanId]) { + delete userTree[cartella][orphanId]; + console.log(` → nextIndexTree updated (removed ${orphanId})`); + } + + console.log(`[ORPHAN] COMPLETATO → ${orphanId}`); + } + + console.log(`==============================================\n`); + } + + // --------------------------------------------------------- + // SCAN SOLO SOTTOCARTELLE — niente _root + // --------------------------------------------------------- + let entries = []; + try { + entries = await fsp.readdir(userDir, { withFileTypes: true }); + } catch { + console.log(`[SCAN] Nessuna directory per utente ${userName}`); + return []; + } + + for (const e of entries) { + if (!e.isDirectory()) continue; + const cartella = e.name; + const absCartella = path.join(userDir, cartella); + await scanSingleFolder(userName, cartella, absCartella); + } + + // --------------------------------------------------------- + // SALVO SOLO nextIndexTree (scrittura unica a fine run) + // --------------------------------------------------------- + if (WRITE_INDEX) { + await saveIndex(nextIndexTree); // [1](https://electrolux-my.sharepoint.com/personal/fabio_micheluz_electrolux_com/Documents/File%20di%20Microsoft%20Copilot%20Chat/orphanCleanup.js.txt) + } + + // --------------------------------------------------------- + // INVIO AL SERVER + // --------------------------------------------------------- + if (SEND_PHOTOS && BASE_URL && changes.length) { + for (const p of changes) { + try { + await postWithAuth(`${BASE_URL}/photos`, p); + } catch (err) { + console.error('Errore invio:', err.message); + } + } + } + + console.log(`SCAN COMPLETATA: ${changes.length} file aggiornati`); + return changes; +} + +module.exports = scanPhoto; diff --git a/api_v1/scanner/scanPhoto.js.ok b/api_v1/scanner/scanPhoto.js.ok new file mode 100644 index 0000000..a6ef7cc --- /dev/null +++ b/api_v1/scanner/scanPhoto.js.ok @@ -0,0 +1,153 @@ +// scanner/scanPhoto.js +const path = require('path'); +const fsp = require('fs/promises'); +const { loadPreviousIndex, saveIndex } = require('./indexStore'); +const scanUserRoot = require('./scanUser'); +const postWithAuth = require('./postWithAuth'); +const { WEB_ROOT, SEND_PHOTOS, BASE_URL, WRITE_INDEX } = require('../config'); + +const COMMON = 'Common'; + +async function scanPhoto(dir, userName) { + console.log(`[SCAN] Avvio scanPhoto per user=${userName}`); + + const previousIndexTree = await loadPreviousIndex(); + console.log(`[SCAN] previousIndexTree keys:`, Object.keys(previousIndexTree)); + + const nextIndexTree = JSON.parse(JSON.stringify(previousIndexTree || {})); + const photosRoot = path.resolve(__dirname, '..', '..', WEB_ROOT, 'photos'); + + console.log(`[SCAN] photosRoot = ${photosRoot}`); + + let changes = []; + + // --------------------------------------------------------- + // 1) ADMIN → scansiona tutti gli utenti + // --------------------------------------------------------- + if (userName === 'Admin') { + let entries = []; + try { + entries = await fsp.readdir(photosRoot, { withFileTypes: true }); + } catch { + console.error(`[SCAN] photosRoot non accessibile`); + return []; + } + + console.log(`[SCAN] Trovati ${entries.length} utenti/cartelle`); + + for (const e of entries) { + if (!e.isDirectory()) continue; + + const user = e.name; + if (user.toLowerCase() === COMMON.toLowerCase()) continue; + + const userDir = path.join(photosRoot, user, 'original'); + + try { + const st = await fsp.stat(userDir); + if (!st.isDirectory()) continue; + } catch { + continue; + } + + console.log(`[SCAN] → Scansiono utente: ${user}`); + + const userChanges = await scanUserRoot(user, userDir, previousIndexTree); + + for (const m of userChanges) { + nextIndexTree[m.user] ??= {}; + nextIndexTree[m.user][m.cartella] ??= {}; + nextIndexTree[m.user][m.cartella][m.id] = { + id: m.id, + user: m.user, + cartella: m.cartella, + path: m.path, + hash: m._indexHash + }; + } + + changes.push(...userChanges); + } + + // Common + const commonDir = path.join(photosRoot, COMMON, 'original'); + try { + const st = await fsp.stat(commonDir); + if (st.isDirectory()) { + console.log(`[SCAN] → Scansiono Common`); + const commonChanges = await scanUserRoot(COMMON, commonDir, previousIndexTree); + + for (const m of commonChanges) { + nextIndexTree[COMMON] ??= {}; + nextIndexTree[COMMON][m.cartella] ??= {}; + nextIndexTree[COMMON][m.cartella][m.id] = { + id: m.id, + user: m.user, + cartella: m.cartella, + path: m.path, + hash: m._indexHash + }; + } + + changes.push(...commonChanges); + } + } catch {} + } + + // --------------------------------------------------------- + // 2) NON-ADMIN → scansiona SOLO l’utente richiesto + // --------------------------------------------------------- + else { + const userDir = path.join(photosRoot, userName, 'original'); + + try { + const st = await fsp.stat(userDir); + if (st.isDirectory()) { + console.log(`[SCAN] → Scansiono utente singolo: ${userName}`); + + const userChanges = await scanUserRoot(userName, userDir, previousIndexTree); + + for (const m of userChanges) { + nextIndexTree[m.user] ??= {}; + nextIndexTree[m.user][m.cartella] ??= {}; + nextIndexTree[m.user][m.cartella][m.id] = { + id: m.id, + user: m.user, + cartella: m.cartella, + path: m.path, + hash: m._indexHash + }; + } + + changes.push(...userChanges); + } + } catch { + console.log(`[SCAN] Nessuna directory per utente ${userName}`); + } + } + + // --------------------------------------------------------- + // SALVA INDEX + // --------------------------------------------------------- + if (WRITE_INDEX) { + await saveIndex(nextIndexTree); + } + + // --------------------------------------------------------- + // INVIA AL SERVER + // --------------------------------------------------------- + if (SEND_PHOTOS && BASE_URL && changes.length) { + for (const p of changes) { + try { + await postWithAuth(`${BASE_URL}/photos`, p); + } catch (err) { + console.error('Errore invio:', err.message); + } + } + } + + console.log(`SCAN COMPLETATA: ${changes.length} file aggiornati`); + return changes; +} + +module.exports = scanPhoto; diff --git a/api_v1/scanner/scanUser.js b/api_v1/scanner/scanUser.js index fcd2399..b1afbe9 100644 --- a/api_v1/scanner/scanUser.js +++ b/api_v1/scanner/scanUser.js @@ -6,16 +6,13 @@ const processFile = require('./processFile'); const { sha256 } = require('./utils'); const { SUPPORTED_EXTS } = require('../config'); -/** - * Scansiona la root dell'utente (p.es. ...//original) e: - * - indicizza i file direttamente al root (cartella virtuale "_root") - * - per ogni sottocartella, chiama scanCartella - */ -async function scanUserRoot(userName, userDir, previousIndex) { +async function scanUserRoot(userName, userDir, previousIndexTree) { + console.log(`[SCAN] scanUserRoot → user=${userName}, dir=${userDir}`); + const results = []; const entries = await fsp.readdir(userDir, { withFileTypes: true }); - // 1) File direttamente al root (virtual folder "_root") + // 1) File nella root for (const e of entries) { if (e.isDirectory()) continue; @@ -29,13 +26,17 @@ async function scanUserRoot(userName, userDir, previousIndex) { const cartella = '_root'; const id = sha256(`${userName}/${cartella}/${fileRelPath}`); - const prev = previousIndex[id]; - const unchanged = - prev && - prev.size_bytes === st.size && - prev.mtimeMs === st.mtimeMs; + const hash = sha256(`${st.size}-${st.mtimeMs}`); + const prev = previousIndexTree?.[userName]?.[cartella]?.[id]; - if (unchanged) continue; + console.log(`[SCAN] ROOT CHECK → ${fileRelPath}, hash=${hash}, prevHash=${prev?.hash}`); + + if (prev && prev.hash === hash) { + console.log(`[SCAN] SKIP ROOT (unchanged) → ${fileRelPath}`); + continue; + } + + console.log(`[SCAN] PROCESSING ROOT → ${fileRelPath}`); const meta = await processFile( userName, @@ -45,20 +46,28 @@ async function scanUserRoot(userName, userDir, previousIndex) { ext, st ); + meta.id = id; + meta.path = `/photos/${userName}/original/${cartella}/${fileRelPath}`; + meta._indexHash = hash; + results.push(meta); } - // 2) Sottocartelle (comportamento classico) + // 2) Sottocartelle for (const e of entries) { if (!e.isDirectory()) continue; + const cartella = e.name; const absCartella = path.join(userDir, cartella); - const files = await scanCartella(userName, cartella, absCartella, previousIndex); + + console.log(`[SCAN] → Scansiono cartella: ${cartella}`); + + const files = await scanCartella(userName, cartella, absCartella, previousIndexTree); results.push(...files); } return results; } -module.exports = scanUserRoot; \ No newline at end of file +module.exports = scanUserRoot; diff --git a/api_v1/scanner/scanUser.js.ok b/api_v1/scanner/scanUser.js.ok new file mode 100644 index 0000000..b1afbe9 --- /dev/null +++ b/api_v1/scanner/scanUser.js.ok @@ -0,0 +1,73 @@ +// scanner/scanUser.js +const path = require('path'); +const fsp = require('fs/promises'); +const scanCartella = require('./scanCartella'); +const processFile = require('./processFile'); +const { sha256 } = require('./utils'); +const { SUPPORTED_EXTS } = require('../config'); + +async function scanUserRoot(userName, userDir, previousIndexTree) { + console.log(`[SCAN] scanUserRoot → user=${userName}, dir=${userDir}`); + + const results = []; + const entries = await fsp.readdir(userDir, { withFileTypes: true }); + + // 1) File nella root + for (const e of entries) { + if (e.isDirectory()) continue; + + const ext = path.extname(e.name).toLowerCase(); + if (!SUPPORTED_EXTS.has(ext)) continue; + + const absPath = path.join(userDir, e.name); + const st = await fsp.stat(absPath); + + const fileRelPath = e.name; + const cartella = '_root'; + const id = sha256(`${userName}/${cartella}/${fileRelPath}`); + + const hash = sha256(`${st.size}-${st.mtimeMs}`); + const prev = previousIndexTree?.[userName]?.[cartella]?.[id]; + + console.log(`[SCAN] ROOT CHECK → ${fileRelPath}, hash=${hash}, prevHash=${prev?.hash}`); + + if (prev && prev.hash === hash) { + console.log(`[SCAN] SKIP ROOT (unchanged) → ${fileRelPath}`); + continue; + } + + console.log(`[SCAN] PROCESSING ROOT → ${fileRelPath}`); + + const meta = await processFile( + userName, + cartella, + fileRelPath, + absPath, + ext, + st + ); + + meta.id = id; + meta.path = `/photos/${userName}/original/${cartella}/${fileRelPath}`; + meta._indexHash = hash; + + results.push(meta); + } + + // 2) Sottocartelle + for (const e of entries) { + if (!e.isDirectory()) continue; + + const cartella = e.name; + const absCartella = path.join(userDir, cartella); + + console.log(`[SCAN] → Scansiono cartella: ${cartella}`); + + const files = await scanCartella(userName, cartella, absCartella, previousIndexTree); + results.push(...files); + } + + return results; +} + +module.exports = scanUserRoot; diff --git a/api_v1/scanner/t.js b/api_v1/scanner/t.js new file mode 100644 index 0000000..fb7fdd3 --- /dev/null +++ b/api_v1/scanner/t.js @@ -0,0 +1,36 @@ +// idsIndex-test.js + +// Questa è la stessa funzione che usi nel tuo programma +function removeIdFromList(idsIndex, id) { + return idsIndex.filter(x => x !== id); +} + +// Simuliamo idsIndex come lo costruisce il tuo programma: +// un array di stringhe (ID) +const idsIndex = [ + "b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e", + "09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b", + "dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7" +]; + +// Prendiamo il primo ID +const idToRemove = idsIndex[0]; + +// LOG iniziali +console.log("=== TEST RIMOZIONE ID ==="); +console.log("idsIndex iniziale:", idsIndex); +console.log("ID da rimuovere:", idToRemove); +console.log("--------------------------"); + +// Rimozione +const newList = removeIdFromList(idsIndex, idToRemove); + +// LOG finali +console.log("idsIndex dopo removeIdFromList:", newList); + +// Verifica manuale +if (newList.includes(idToRemove)) { + console.log("❌ ERRORE: l'ID NON è stato rimosso!"); +} else { + console.log("✅ OK: l'ID è stato rimosso correttamente."); +} diff --git a/api_v1/server.js b/api_v1/server.js index 708b963..c6fa79d 100644 --- a/api_v1/server.js +++ b/api_v1/server.js @@ -105,6 +105,183 @@ function resetDB() { console.log('DB resettato'); } +// ----------------------------------------------------- +// Rimuove tutte le directories thumbs se user = Admin altrimenti solo quella dello user (Public/photos//thumbs) +// ----------------------------------------------------- + +async function removeAllThumbs(user) { + const photosRoot = path.resolve(__dirname, '../public/photos'); + + if (!fs.existsSync(photosRoot)) { + console.log('Nessuna cartella photos trovata, niente thumbs da cancellare'); + return; + } + + // Se NON è Admin → cancella solo la sua cartella + if (user !== 'Admin') { + const thumbsDir = path.join(photosRoot, user, 'thumbs'); + + try { + await fsp.rm(thumbsDir, { recursive: true, force: true }); + console.log(`✔ thumbs rimosse per utente "${user}": ${thumbsDir}`); + } catch (err) { + console.error(`✖ errore rimuovendo thumbs per "${user}":`, err); + } + + console.log(`🎉 Cancellazione thumbs completata per utente "${user}"`); + return; + } + + // Se è Admin → cancella TUTTE le thumbs + const entries = await fsp.readdir(photosRoot, { withFileTypes: true }); + + let removed = 0; + let total = 0; + + for (const entry of entries) { + if (!entry.isDirectory()) continue; + + const userDir = path.join(photosRoot, entry.name); + const thumbsDir = path.join(userDir, 'thumbs'); + + total++; + + try { + await fsp.rm(thumbsDir, { recursive: true, force: true }); + removed++; + console.log(`✔ thumbs rimossa: ${thumbsDir}`); + } catch (err) { + console.error(`✖ errore rimuovendo ${thumbsDir}:`, err); + } + } + + // LOG FINALE ADMIN + if (removed === total) { + console.log(`🎉 Tutte le cartelle thumbs (${removed}) sono state cancellate`); + } else { + console.log(`⚠ Cancellate ${removed} cartelle thumbs su ${total}`); + } +} + +// ----------------------------------------------------- +// Cancella una foto da index.json usando l'id +// ----------------------------------------------------- + +async function deleteFromIndexById(id) { + const indexPath = path.resolve(__dirname, '..', WEB_ROOT, INDEX_PATH); + + if (!fs.existsSync(indexPath)) { + console.log("index.json non trovato"); + return false; + } + + const raw = await fsp.readFile(indexPath, 'utf8'); + const index = JSON.parse(raw); + + let deleted = false; + + for (const user of Object.keys(index)) { + const userObj = index[user]; + if (!userObj || typeof userObj !== 'object') continue; + + for (const cartella of Object.keys(userObj)) { + const folder = userObj[cartella]; + if (!folder || typeof folder !== 'object') continue; + + if (folder[id]) { + delete folder[id]; + deleted = true; + console.log(`✔ Eliminato ID ${id} da ${user}/${cartella}`); + } + } + } + + if (deleted) { + await fsp.writeFile(indexPath, JSON.stringify(index, null, 2)); + } + + return deleted; +} + +// ----------------------------------------------------- +// Cancella i thumbs usando l'id +// ----------------------------------------------------- +async function deleteThumbsById(id) { + console.log(`\n=== DELETE THUMBS FOR ID: ${id} ===`); + + const db = router.db; + const col = db.get('photos'); + const rec = col.find({ id }).value(); + + if (!rec) { + console.log("Record non trovato nel DB → impossibile cancellare thumbs"); + return false; + } + + const thumb1 = rec.thub1; + const thumb2 = rec.thub2; + + if (!thumb1 && !thumb2) { + console.log("Nessun thumb registrato nel DB"); + return false; + } + + // Costruzione corretta del percorso assoluto + const absThumb1 = thumb1 ? path.resolve(__dirname, '../public' + thumb1) : null; + const absThumb2 = thumb2 ? path.resolve(__dirname, '../public' + thumb2) : null; + + console.log(`Thumb1 path: ${absThumb1}`); + console.log(`Thumb2 path: ${absThumb2}`); + + let deleted = false; + + if (absThumb1) { + const exists1 = fs.existsSync(absThumb1); + console.log(`Thumb1 exists: ${exists1}`); + + if (exists1) { + await fsp.rm(absThumb1, { force: true }); + console.log("✔ Eliminato thumb1"); + deleted = true; + } else { + console.log("✖ thumb1 NON trovato"); + } + } + + if (absThumb2) { + const exists2 = fs.existsSync(absThumb2); + console.log(`Thumb2 exists: ${exists2}`); + + if (exists2) { + await fsp.rm(absThumb2, { force: true }); + console.log("✔ Eliminato thumb2"); + deleted = true; + } else { + console.log("✖ thumb2 NON trovato"); + } + } + + console.log(`=== FINE DELETE THUMBS ID: ${id} ===\n`); + return deleted; +} + +// ----------------------------------------------------- +// Elimina uno user dal DB e lo salva +// ----------------------------------------------------- + + +function deleteUserRecords(username) { + const db = router.db; // lowdb instance + const col = db.get('photos'); + + // Rimuove i record e salva su disco + const removed = col.remove({ user: username }).write(); + + console.log(`Eliminati ${removed.length} record per user "${username}"`); + return removed.length; +} + + // ----------------------------------------------------- // HOME // ----------------------------------------------------- @@ -192,7 +369,7 @@ server.use((req, res, next) => { // - Admin: scansiona tutti gli utenti + Common // - Non-Admin: scansiona solo la propria area (NO Common) // ----------------------------------------------------- -server.get('/scan', async (req, res) => { +server.get('/scanold', async (req, res) => { try { if (req.user && req.user.name === 'Admin') { await scanPhoto(undefined, 'Admin'); @@ -216,6 +393,30 @@ server.get('/scan', async (req, res) => { } }); +server.get('/scan', async (req, res) => { + try { + if (req.user && req.user.name === 'Admin') { + await scanPhoto(undefined, 'Admin', router.db); + return res.send({ + status: 'Scansione completata', + user: 'Admin', + scope: 'tutti gli utenti + Common', + }); + } + + // Non-Admin → solo la sua area (niente Common) + await scanPhoto(undefined, req.user.name, router.db); + res.send({ + status: 'Scansione completata', + user: req.user.name, + scope: 'utente corrente', + }); + } catch (err) { + console.error('Errore scan:', err); + res.status(500).json({ error: 'Errore durante lo scan', details: err.message }); + } +}); + // ----------------------------------------------------- // FILE STATICI // ----------------------------------------------------- @@ -240,27 +441,167 @@ server.get('/initDB', async (req, res) => { try { resetDB(); - // /public/photos/index.json (coerente con indexStore.js) + // Rimuove index.json const absIndexPath = path.resolve(__dirname, '..', WEB_ROOT, INDEX_PATH); - try { await fsp.unlink(absIndexPath); console.log('initDB: index.json rimosso ->', absIndexPath); } catch (err) { - if (err && err.code === 'ENOENT') { - console.log('initDB: index.json non trovato, niente da cancellare:', absIndexPath); + if (err.code === 'ENOENT') { + console.log('initDB: index.json non trovato:', absIndexPath); } else { console.error('initDB: errore cancellando index.json:', err); } } - res.json({ status: 'DB resettato', indexRemoved: true, indexPath: absIndexPath }); + // rimuove tutte le cartelle thumbs + await removeAllThumbs('Admin'); + + res.json({ + status: 'DB resettato', + indexRemoved: true, + thumbsRemoved: true, + indexPath: absIndexPath + }); + } catch (err) { console.error('initDB: errore generale:', err); res.status(500).json({ status: 'errore', message: err.message }); } }); +// ----------------------------------------------------- +// DELETE FOTO da DB + index.json + thumbs +// ----------------------------------------------------- +server.delete('/delphoto/:id', async (req, res) => { + const { id } = req.params; + + try { + const db = router.db; + const col = db.get('photos'); + + const existing = col.find({ id }).value(); + + // 1) Cancella thumbs PRIMA DI TUTTO + const deletedThumbs = await deleteThumbsById(id); + + let deletedDB = false; + + // 2) Cancella dal DB + if (existing) { + col.remove({ id }).write(); + deletedDB = true; + console.log(`DELPHOTO → foto cancellata dal DB: ${id}`); + } else { + console.log(`DELPHOTO → foto NON trovata nel DB: ${id}`); + } + + // 3) Cancella da index.json + const deletedIndex = await deleteFromIndexById(id); + + return res.json({ + ok: true, + id, + deletedThumbs, + deletedDB, + deletedIndex + }); + + } catch (err) { + console.error('DELPHOTO errore:', err); + return res.status(500).json({ ok: false, error: err.message }); + } +}); + + + +// ----------------------------------------------------- +// RESET DB SOLO PER UN UTENTE +// - Admin: deve specificare ?user= +// - Non-Admin: cancella solo i propri dati +// ----------------------------------------------------- +server.get('/initDBuser', async (req, res) => { + try { + let targetUser = req.user.name; + + // Admin può specificare chi cancellare + if (req.user.name === 'Admin') { + targetUser = req.query.user; + if (!targetUser) { + return res.status(400).json({ + error: "Admin deve specificare ?user=" + }); + } + } + + // 1) Cancella record DB + const deleted = deleteUserRecords(targetUser); + + // 2) Cancella thumbs + await removeAllThumbs(targetUser); + + res.json({ + status: "OK", + user: targetUser, + deletedRecords: deleted, + thumbsRemoved: true + }); + + } catch (err) { + console.error("initDBuser errore:", err); + res.status(500).json({ error: "Errore durante initDBuser", details: err.message }); + } +}); + + +// ----------------------------------------------------- +// FIND ID IN INDEX.JSON + RETURN RECORD (SOLO LETTURA) +// ----------------------------------------------------- +server.get('/findIdIndex/:id', async (req, res) => { + const { id } = req.params; + + try { + const indexPath = path.resolve(__dirname, '..', WEB_ROOT, INDEX_PATH); + + if (!fs.existsSync(indexPath)) { + return res.json({ ok: false, found: false, message: "index.json non trovato" }); + } + + const raw = await fsp.readFile(indexPath, 'utf8'); + const index = JSON.parse(raw); + + for (const user of Object.keys(index)) { + const userObj = index[user]; + if (!userObj || typeof userObj !== 'object') continue; + + for (const cartella of Object.keys(userObj)) { + const folder = userObj[cartella]; + if (!folder || typeof folder !== 'object') continue; + + // dentro la cartella: chiavi = id, più _folderHash + if (folder[id]) { + return res.json({ + ok: true, + found: true, + user, + cartella, + record: folder[id] + }); + } + } + } + + return res.json({ ok: true, found: false }); + + } catch (err) { + console.error("Errore findIdIndex:", err); + return res.status(500).json({ ok: false, error: err.message }); + } +}); + + + + // ----------------------------------------------------- // UPSERT anti-duplicato per /photos (prima del router) // Se id esiste -> aggiorna; altrimenti crea @@ -303,4 +644,4 @@ setInterval(() => { for (const [tok, exp] of denylist.entries()) { if (exp < nowSec) denylist.delete(tok); } -}, 60 * 1000); \ No newline at end of file +}, 60 * 1000); diff --git a/package-lock.json b/package-lock.json index 50c62bf..6cdcda3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { - "name": "ssj", - "version": "1.0.0", + "name": "gallery-jwt-json-server", + "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "ssj", - "version": "1.0.0", - "license": "ISC", + "name": "gallery-jwt-json-server", + "version": "0.0.1", + "license": "MIT", "dependencies": { "async": "^3.2.6", "axios": "^1.13.5", diff --git a/public/admin.html b/public/admin.html index 3511b5a..2590c44 100644 --- a/public/admin.html +++ b/public/admin.html @@ -12,7 +12,12 @@ + + + + +

 
@@ -32,6 +37,63 @@ if (!token) {
   window.location.href = "index.html";
 }
 
+async function deletePhoto() {
+  const id = prompt("Inserisci l'ID della foto da cancellare:");
+  if (!id) return;
+
+  const res = await fetch(`${BASE_URL}/delphoto/${id}`, {
+    method: "DELETE",
+    headers: { "Authorization": "Bearer " + token }
+  });
+
+  const out = await res.json();
+  document.getElementById("out").textContent =
+    JSON.stringify(out, null, 2);
+
+  await readDB();
+}
+
+async function findIdIndex() {
+  const id = prompt("Inserisci l'ID da cercare in index.json:");
+  if (!id) return;
+
+  const res = await fetch(`${BASE_URL}/findIdIndex/${id}`, {
+    headers: { "Authorization": "Bearer " + token }
+  });
+
+  const out = await res.json();
+  document.getElementById("out").textContent =
+    JSON.stringify(out, null, 2);
+}
+
+async function resetDBuser() {
+  let url = `${BASE_URL}/initDBuser`;
+
+  // Se Admin → chiedi quale utente cancellare
+  const payload = parseJwt(token);
+  if (payload.name === "Admin") {
+    const user = prompt("Inserisci il nome dell'utente da cancellare:");
+    if (!user) return;
+    url += `?user=${encodeURIComponent(user)}`;
+  }
+
+  await fetch(url, {
+    headers: { "Authorization": "Bearer " + token }
+  });
+
+  await readDB();
+}
+
+// Utility per leggere il token JWT
+function parseJwt(t) {
+  try {
+    return JSON.parse(atob(t.split('.')[1]));
+  } catch {
+    return {};
+  }
+}
+
+
 async function loadConfig() {
   const res = await fetch('/config');
   const cfg = await res.json();
diff --git a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0092.JPG b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0092.JPG
index fb44c2e..8b82a4b 100644
Binary files a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0092.JPG and b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0092.JPG differ
diff --git a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0100.JPG b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0100.JPG
deleted file mode 100644
index cadc7d5..0000000
Binary files a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0100.JPG and /dev/null differ
diff --git a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0102.JPG b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0102.JPG
deleted file mode 100644
index 4401f38..0000000
Binary files a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0102.JPG and /dev/null differ
diff --git a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0104.JPG b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0104.JPG
deleted file mode 100644
index 7938c88..0000000
Binary files a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_0104.JPG and /dev/null differ
diff --git a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20210602_100637.jpg b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20210602_100637.jpg
new file mode 100644
index 0000000..5a720a3
Binary files /dev/null and b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20210602_100637.jpg differ
diff --git a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20210602_173903.jpg b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20210602_173903.jpg
new file mode 100644
index 0000000..904762d
Binary files /dev/null and b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20210602_173903.jpg differ
diff --git a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135543.jpg b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135543.jpg
new file mode 100644
index 0000000..de46c31
Binary files /dev/null and b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135543.jpg differ
diff --git a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135641.jpg b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135641.jpg
new file mode 100644
index 0000000..8c67906
Binary files /dev/null and b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135641.jpg differ
diff --git a/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135745.jpg b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135745.jpg
new file mode 100644
index 0000000..f5cf90d
Binary files /dev/null and b/public/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135745.jpg differ
diff --git a/public/photos/Fabio/original/2017Irlanda19-29ago/t.js b/public/photos/Fabio/original/2017Irlanda19-29ago/t.js
deleted file mode 100644
index 2a3d8e8..0000000
--- a/public/photos/Fabio/original/2017Irlanda19-29ago/t.js
+++ /dev/null
@@ -1,9 +0,0 @@
-const { exec } = require('child_process');
-const video = process.argv[2];
-const cmd = `exiftool -n -G1 -a -gps:all -quicktime:all -user:all "${video}"`;
-console.log("Eseguo:", cmd);
-exec(cmd, (err, stdout, stderr) => {
-  console.log("err:", err);
-  console.log("stderr:", stderr ? stderr.slice(0,1000) : "");
-  console.log("stdout (head):", stdout ? stdout.slice(0,2000) : "");
-});
diff --git a/public/photos/index.json b/public/photos/index.json
index 9598d39..baec05b 100644
--- a/public/photos/index.json
+++ b/public/photos/index.json
@@ -1 +1 @@
-{"a108438f4073dbd460157fff35ee00792c4267f7d242601ac9e61478ef850aee":{"id":"a108438f4073dbd460157fff35ee00792c4267f7d242601ac9e61478ef850aee","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0092.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0092_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0092_avg.jpg","gps":{"lat":44.17688333333333,"lng":11.956669444444444,"alt":38.888513513513516},"data":"2017:08:19 11:30:14","taken_at":"2017-08-19T11:30:14.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3492198,"mtimeMs":1772610987381.1497,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47011","city":"Castrocaro Terme e Terra del Sole","county_code":"FC","address":"Via Plebino Battanini, 19","timezone":"Europe/Rome","time":"+01:00"}},"b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e":{"id":"b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0099.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0099_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0099_avg.jpg","gps":{"lat":45.66611944444444,"lng":9.701108333333332,"alt":229.64888888888888},"data":"2017:08:23 09:49:00","taken_at":"2017-08-23T09:49:00.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3758888,"mtimeMs":1772610987384.483,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Lombardy","postcode":"24050","city":"Orio al Serio","county_code":"BG","address":"WorkEat","timezone":"Europe/Rome","time":"+01:00"}},"ef552a509446caaa2faf1fc3d285518bc243a4e087108282f662d9818e9063d9":{"id":"ef552a509446caaa2faf1fc3d285518bc243a4e087108282f662d9818e9063d9","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0100.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0100_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0100_avg.jpg","gps":{"lat":45.66613888888889,"lng":9.70108611111111,"alt":227.6668260038241},"data":"2017:08:23 09:49:01","taken_at":"2017-08-23T09:49:01.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":4131423,"mtimeMs":1772610987387.8162,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Lombardy","postcode":"24050","city":"Orio al Serio","county_code":"BG","address":"WorkEat","timezone":"Europe/Rome","time":"+01:00"}},"550d4f611da31ff221adb97220eae756cb74945e8b6d228ca5cbfc31216ac2e5":{"id":"550d4f611da31ff221adb97220eae756cb74945e8b6d228ca5cbfc31216ac2e5","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0102.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0102_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0102_avg.jpg","gps":{"lat":53.35111666666667,"lng":-6.251255555555556,"alt":38.25333333333333},"data":"2017:08:23 12:44:30","taken_at":"2017-08-23T12:44:30.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2534029,"mtimeMs":1772610987387.8162,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D01 K298","city":"Dublin","county_code":"D","address":"Molloy’s","timezone":"Europe/Dublin","time":"+01:00"}},"09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b":{"id":"09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0103.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0103_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0103_avg.jpg","gps":{"lat":53.344925,"lng":-6.256825,"alt":6.371601208459214},"data":"2017:08:23 13:08:20","taken_at":"2017-08-23T13:08:20.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3984165,"mtimeMs":1772610987391.1494,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D02 WN62","city":"Dublin","county_code":"D","address":"17 Botany Bay","timezone":"Europe/Dublin","time":"+01:00"}},"80b68da7f4153b6f32d9161a9593e10611b8977288e755c66f12a62779a690e2":{"id":"80b68da7f4153b6f32d9161a9593e10611b8977288e755c66f12a62779a690e2","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0104.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0104_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0104_avg.jpg","gps":{"lat":53.34393055555556,"lng":-6.248975,"alt":10.23343653250774},"data":"2017:08:23 13:27:57","taken_at":"2017-08-23T13:27:57.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1918664,"mtimeMs":1772610987394.483,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D02 Y729","city":"Dublin","county_code":"D","address":"O'Donovan","timezone":"Europe/Dublin","time":"+01:00"}},"dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7":{"id":"dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0106.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0106_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0106_avg.jpg","gps":{"lat":53.343941666666666,"lng":-6.249247222222222,"alt":7.379692832764505},"data":"2017:08:23 13:48:41","taken_at":"2017-08-23T13:48:41.000Z","mime_type":"image/jpeg","width":5326,"height":3950,"size_bytes":4338120,"mtimeMs":1772610987397.8162,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D02 Y729","city":"Dublin","county_code":"D","address":"The Lombard Townhouse","timezone":"Europe/Dublin","time":"+01:00"}},"751d8a15766bf2686bc87e60b33b4a8c38befe454428e6a5a82b00f26026c0e0":{"id":"751d8a15766bf2686bc87e60b33b4a8c38befe454428e6a5a82b00f26026c0e0","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0107.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0107_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0107_avg.jpg","gps":{"lat":53.344861111111115,"lng":-6.252305555555555,"alt":7.89636462289745},"data":"2017:08:23 13:59:45","taken_at":"2017-08-23T13:59:45.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3159006,"mtimeMs":1772610987401.1494,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D02 VX62","city":"Dublin","county_code":"D","address":"O’Neill’s of Pearse Street","timezone":"Europe/Dublin","time":"+01:00"}},"73dfd75dd639da9c7c0d4a6244f189a833d543bfdd4059b06f9f98e49f83c937":{"id":"73dfd75dd639da9c7c0d4a6244f189a833d543bfdd4059b06f9f98e49f83c937","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0108.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0108_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0108_avg.jpg","gps":{"lat":53.344791666666666,"lng":-6.252316666666666,"alt":7.7956509618065235},"data":"2017:08:23 13:59:47","taken_at":"2017-08-23T13:59:47.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3338305,"mtimeMs":1772610987404.4827,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D02 VX62","city":"Dublin","county_code":"D","address":"O’Neill’s of Pearse Street","timezone":"Europe/Dublin","time":"+01:00"}},"f32173d43d16b47eda3e7a32257ec956287d60b0516a5f6e46a8d1d433f53fd8":{"id":"f32173d43d16b47eda3e7a32257ec956287d60b0516a5f6e46a8d1d433f53fd8","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0109.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0109_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0109_avg.jpg","gps":{"lat":53.34500555555556,"lng":-6.253313888888889,"alt":8.374616171954964},"data":"2017:08:23 14:03:17","taken_at":"2017-08-23T14:03:17.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2815021,"mtimeMs":1772610987407.816,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D02 VX62","city":"Dublin","county_code":"D","address":"29 Pearse Street","timezone":"Europe/Dublin","time":"+01:00"}},"90c0a0932fdfa3eefb64156dec5b366c4af5245def4cc619d8eee29ca72cd7fe":{"id":"90c0a0932fdfa3eefb64156dec5b366c4af5245def4cc619d8eee29ca72cd7fe","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0110.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0110_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0110_avg.jpg","gps":{"lat":53.345688888888894,"lng":-6.261755555555555,"alt":11.630410654827969},"data":"2017:08:23 14:17:34","taken_at":"2017-08-23T14:17:34.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3207260,"mtimeMs":1772610987411.1492,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D02 N159","city":"Dublin","county_code":"D","address":"The Oliver St John Gogarty","timezone":"Europe/Dublin","time":"+01:00"}},"4d74430aa1fbc45154ad4e8bf43bff334065ebd2757367806d4b8c165c9a7935":{"id":"4d74430aa1fbc45154ad4e8bf43bff334065ebd2757367806d4b8c165c9a7935","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0112.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0112_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0112_avg.jpg","gps":{"lat":53.34568055555556,"lng":-6.261855555555556,"alt":11.982026143790849},"data":"2017:08:23 14:17:53","taken_at":"2017-08-23T14:17:53.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2674913,"mtimeMs":1772610987414.4827,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D02 ET66","city":"Dublin","county_code":"D","address":"23 Temple Bar","timezone":"Europe/Dublin","time":"+01:00"}},"1955c91d411219c131c210b97fe38eb78df83be6ca12cdc845b952bcb78abc6f":{"id":"1955c91d411219c131c210b97fe38eb78df83be6ca12cdc845b952bcb78abc6f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0113.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0113_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0113_avg.jpg","gps":{"lat":53.34517777777778,"lng":-6.265841666666667,"alt":15.984316185696361},"data":"2017:08:23 14:36:10","taken_at":"2017-08-23T14:36:10.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2788605,"mtimeMs":1772610987417.816,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D02 PW83","city":"Dublin","county_code":"D","address":"ESSEX STREET EAST (SE)","timezone":"Europe/Dublin","time":"+01:00"}},"14616f6446b0ffc01895f24db1656fa0b7a33da3b9e8c8e24065647faa2138f2":{"id":"14616f6446b0ffc01895f24db1656fa0b7a33da3b9e8c8e24065647faa2138f2","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0114.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0114_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0114_avg.jpg","gps":{"lat":53.339866666666666,"lng":-6.269975,"alt":12.443296305864118},"data":"2017:08:23 16:13:54","taken_at":"2017-08-23T16:13:54.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3447883,"mtimeMs":1772610987421.1492,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D07 CF98","city":"Dublin","county_code":"D","address":"St Patrick's Park Tea Gardens","timezone":"Europe/Dublin","time":"+01:00"}},"7668b4a6cf960b548a0bd1480444a3a039a4ca59d16656d2a1a3ca80a11eaa41":{"id":"7668b4a6cf960b548a0bd1480444a3a039a4ca59d16656d2a1a3ca80a11eaa41","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0116.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0116_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0116_avg.jpg","gps":{"lat":53.34003333333334,"lng":-6.270691666666667,"alt":11.41955017301038},"data":"2017:08:23 16:18:23","taken_at":"2017-08-23T16:18:23.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3513469,"mtimeMs":1772610987424.4824,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D07 CF98","city":"Dublin","county_code":"D","address":"Liberty Bell","timezone":"Europe/Dublin","time":"+01:00"}},"4a10ae72b84c6e205c8295dc1f94b5407d78f25576707fba0f3bb9093e70ce1c":{"id":"4a10ae72b84c6e205c8295dc1f94b5407d78f25576707fba0f3bb9093e70ce1c","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0119.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0119_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0119_avg.jpg","gps":{"lat":53.34229722222222,"lng":-6.283711111111111,"alt":20.334302325581394},"data":"2017:08:23 17:23:54","taken_at":"2017-08-23T17:23:54.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2353262,"mtimeMs":1772610987427.8157,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D08 VF83","city":"Dublin","county_code":"D","address":"Saint James' Gate","timezone":"Europe/Dublin","time":"+01:00"}},"490631b5d03e797f7ca50b5e42be1cdabafd54b20804b51d2c9565aef18de750":{"id":"490631b5d03e797f7ca50b5e42be1cdabafd54b20804b51d2c9565aef18de750","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0120.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0120_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0120_avg.jpg","gps":{"lat":53.34181944444445,"lng":-6.28665,"alt":23.09464285714286},"data":"2017:08:23 17:41:46","taken_at":"2017-08-23T17:41:46.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2912549,"mtimeMs":1772610987431.149,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D08 YV8A","city":"Dublin","county_code":"D","address":"The Store","timezone":"Europe/Dublin","time":"+01:00"}},"1a9759607a60387b7ff383fce2fce32f5e5aba91c0b0d3e09c1c2763c40334be":{"id":"1a9759607a60387b7ff383fce2fce32f5e5aba91c0b0d3e09c1c2763c40334be","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0122.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0122_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0122_avg.jpg","gps":{"lat":53.34172777777778,"lng":-6.286511111111111,"alt":23.021686746987953},"data":"2017:08:23 17:42:09","taken_at":"2017-08-23T17:42:09.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2351855,"mtimeMs":1772610987431.149,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D08 YV8A","city":"Dublin","county_code":"D","address":"1837","timezone":"Europe/Dublin","time":"+01:00"}},"486d095f85a006800b9d3760e2ef4ac7ba909d82ba1347800a273d99395962a3":{"id":"486d095f85a006800b9d3760e2ef4ac7ba909d82ba1347800a273d99395962a3","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0123.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0123_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0123_avg.jpg","gps":{"lat":53.34194166666667,"lng":-6.286716666666667,"alt":23.662634408602152},"data":"2017:08:23 18:27:09","taken_at":"2017-08-23T18:27:09.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1869483,"mtimeMs":1772610987434.4822,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D08 YV8A","city":"Dublin","county_code":"D","address":"Roasthouse","timezone":"Europe/Dublin","time":"+01:00"}},"69eb91132640feeb561e94bb3258ca69c41e27ca711cb814c2ac33270599167a":{"id":"69eb91132640feeb561e94bb3258ca69c41e27ca711cb814c2ac33270599167a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0124.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0124_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0124_avg.jpg","gps":{"lat":53.341975000000005,"lng":-6.286752777777778,"alt":23.81895093062606},"data":"2017:08:23 18:27:22","taken_at":"2017-08-23T18:27:22.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1800632,"mtimeMs":1772610987434.4822,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D08 YV8A","city":"Dublin","county_code":"D","address":"Roasthouse","timezone":"Europe/Dublin","time":"+01:00"}},"1da97cbc6e7914cbd33e4dbd51729cd45f1c77116c1f5be9531adeb6424eb6e2":{"id":"1da97cbc6e7914cbd33e4dbd51729cd45f1c77116c1f5be9531adeb6424eb6e2","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0125.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0125_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0125_avg.jpg","gps":{"lat":53.34193055555556,"lng":-6.285958333333333,"alt":22.37097064649739},"data":"2017:08:23 18:53:11","taken_at":"2017-08-23T18:53:11.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1643315,"mtimeMs":1772610987437.8157,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D08 YV8A","city":"Dublin","county_code":"D","address":"Gravity Bar","timezone":"Europe/Dublin","time":"+01:00"}},"7fbc8546424236f94107681a69ed37fa94159377cf378a44f9d0e907a2afd31a":{"id":"7fbc8546424236f94107681a69ed37fa94159377cf378a44f9d0e907a2afd31a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0126.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0126_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0126_avg.jpg","gps":{"lat":53.341911111111116,"lng":-6.286,"alt":22.44620811287478},"data":"2017:08:23 18:53:23","taken_at":"2017-08-23T18:53:23.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1450013,"mtimeMs":1772610987437.8157,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D08 YV8A","city":"Dublin","county_code":"D","address":"Gravity Bar","timezone":"Europe/Dublin","time":"+01:00"}},"35772196ab28b9fd957199f81b267c9b99097055bfdcf1749e0c772241681cac":{"id":"35772196ab28b9fd957199f81b267c9b99097055bfdcf1749e0c772241681cac","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0133.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0133_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0133_avg.jpg","gps":{"lat":53.34184166666667,"lng":-6.286008333333333,"alt":22.69865067466267},"data":"2017:08:23 18:53:53","taken_at":"2017-08-23T18:53:53.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1606095,"mtimeMs":1772610987441.149,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D08 YV8A","city":"Dublin","county_code":"D","address":"BELVIEW (SC)","timezone":"Europe/Dublin","time":"+01:00"}},"48b26b6f9aaf835dd90e6098194dedfbee75b85c20429d939188e70873dd4274":{"id":"48b26b6f9aaf835dd90e6098194dedfbee75b85c20429d939188e70873dd4274","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0134.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0134_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0134_avg.jpg","gps":{"lat":53.343222222222224,"lng":-6.281552777777778,"alt":23},"data":"2017:08:23 20:08:55","taken_at":"2017-08-23T20:08:55.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1839090,"mtimeMs":1772610987441.149,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D08 VF83","city":"Dublin","county_code":"D","address":"Arthur’s","timezone":"Europe/Dublin","time":"+01:00"}},"10ca45bc5aab42b5ba08da7d6a15d7f942478ca5e052f89054097c93d3dd6134":{"id":"10ca45bc5aab42b5ba08da7d6a15d7f942478ca5e052f89054097c93d3dd6134","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0135.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0135_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0135_avg.jpg","gps":{"lat":53.34328055555556,"lng":-6.281516666666667,"alt":23},"data":"2017:08:23 20:26:16","taken_at":"2017-08-23T20:26:16.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2013689,"mtimeMs":1772610987444.4822,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Dublin","postcode":"D16","city":"Dublin","county_code":"DN","address":"Morelli's","timezone":"Europe/Dublin","time":"+01:00"}},"c6b58236822fab393b8793af2991115182afaf13b26a27394c4d5d6a799d0969":{"id":"c6b58236822fab393b8793af2991115182afaf13b26a27394c4d5d6a799d0969","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0136.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0136_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0136_avg.jpg","gps":null,"data":null,"taken_at":null,"mime_type":"image/jpeg","width":3724,"height":2096,"size_bytes":1557955,"mtimeMs":1772610987444.4822,"duration":null,"location":null},"1d4945502b8686c4f4dc3ea94bfb37db7587d505e6c411bdf11976402c000e90":{"id":"1d4945502b8686c4f4dc3ea94bfb37db7587d505e6c411bdf11976402c000e90","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0137.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0137_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0137_avg.jpg","gps":{"lat":53.34129444444444,"lng":-6.2516,"alt":22.956375838926174},"data":"2017:08:24 08:36:55","taken_at":"2017-08-24T08:36:55.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2667599,"mtimeMs":1772610987447.8154,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D02 TD34","city":"Dublin","county_code":"D","address":"Hansel & Gretel","timezone":"Europe/Dublin","time":"+01:00"}},"bf2f60a20771c3647d605a7cc192b95a7e078b7c6530ad30462ee6a2794c9df0":{"id":"bf2f60a20771c3647d605a7cc192b95a7e078b7c6530ad30462ee6a2794c9df0","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0138.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0138_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0138_avg.jpg","gps":{"lat":53.34135555555556,"lng":-6.251561111111111,"alt":22.956375838926174},"data":"2017:08:24 08:36:59","taken_at":"2017-08-24T08:36:59.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2698118,"mtimeMs":1772610987451.1487,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Leinster","postcode":"D02 TD34","city":"Dublin","county_code":"D","address":"Dublin (Clare Street)","timezone":"Europe/Dublin","time":"+01:00"}},"7d753539885cd882a1fdf04241eda6bfb8332ba1ed32bfc078dbadb3e5eb321f":{"id":"7d753539885cd882a1fdf04241eda6bfb8332ba1ed32bfc078dbadb3e5eb321f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0139.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0139_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0139_avg.jpg","gps":{"lat":53.34143888888889,"lng":-6.251458333333333,"alt":22.981879954699888},"data":"2017:08:24 08:37:18","taken_at":"2017-08-24T08:37:18.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2656457,"mtimeMs":1772610987454.482,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Dublin","postcode":"D02","city":"Dublin","county_code":"DN","address":"20 Clare Street","timezone":"Europe/Dublin","time":"+01:00"}},"29eb6ed3cd8e3d85e0803d091291b75677e6de2702918a286047894e444d669b":{"id":"29eb6ed3cd8e3d85e0803d091291b75677e6de2702918a286047894e444d669b","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0140.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0140_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0140_avg.jpg","gps":{"lat":53.010505555555554,"lng":-6.326797222222222,"alt":129.97678275290215},"data":"2017:08:24 14:09:42","taken_at":"2017-08-24T14:09:42.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":4654237,"mtimeMs":1772610987457.8154,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Wicklow","postcode":"A98 X9C1","city":"The Municipal District of Wicklow","county_code":"WW","address":"Glendalough Cathedral","timezone":"Europe/Dublin","time":"+01:00"}},"ebaf024e4df7764c2c458484d6e6eef1ced76611dd70b84f82af46337ba13839":{"id":"ebaf024e4df7764c2c458484d6e6eef1ced76611dd70b84f82af46337ba13839","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0141.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0141_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0141_avg.jpg","gps":{"lat":53.00955277777778,"lng":-6.324516666666667,"alt":138.50180505415162},"data":"2017:08:24 14:22:33","taken_at":"2017-08-24T14:22:33.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3760564,"mtimeMs":1772610987461.1487,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Wicklow","postcode":"A98 X9C1","city":"The Municipal District of Wicklow","county_code":"WW","address":"Glendasan River","timezone":"Europe/Dublin","time":"+01:00"}},"c782108a839231c6dda63924f0b855747f98a4f56d8e93390f70877d4a452db6":{"id":"c782108a839231c6dda63924f0b855747f98a4f56d8e93390f70877d4a452db6","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0143.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0143_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0143_avg.jpg","gps":{"lat":52.650172222222224,"lng":-7.24905,"alt":71.83597883597884},"data":"2017:08:24 17:15:28","taken_at":"2017-08-24T17:15:28.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3627847,"mtimeMs":1772610987467.8152,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Kilkenny City","postcode":"R95 P77E","city":"Kilkenny","county_code":"KK","address":"Kilkenny Castle","timezone":"Europe/Dublin","time":"+01:00"}},"f56db1595a3b822e1e5cc119c101904285dca3f3f1b8edbf0bfa42999583cc2f":{"id":"f56db1595a3b822e1e5cc119c101904285dca3f3f1b8edbf0bfa42999583cc2f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0145.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0145_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0145_avg.jpg","gps":{"lat":52.519283333333334,"lng":-7.886636111111111,"alt":117.002457002457},"data":"2017:08:24 20:18:42","taken_at":"2017-08-24T20:18:42.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1900418,"mtimeMs":1772610987471.1484,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 PN72","city":"Cashel","county_code":"TA","address":"O Neills Restaurant","timezone":"Europe/Dublin","time":"+01:00"}},"5d03b5d0866a5cce0b6a12b78173c1f77eef5b1e5bfc5a4fd8e2cfd1c53a2b8e":{"id":"5d03b5d0866a5cce0b6a12b78173c1f77eef5b1e5bfc5a4fd8e2cfd1c53a2b8e","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0146.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0146_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0146_avg.jpg","gps":{"lat":52.519238888888886,"lng":-7.886694444444444,"alt":118.54961832061069},"data":"2017:08:24 20:18:49","taken_at":"2017-08-24T20:18:49.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1944490,"mtimeMs":1772610987471.1484,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 PN72","city":"Cashel","county_code":"TA","address":"O Neills Restaurant","timezone":"Europe/Dublin","time":"+01:00"}},"dd715de9995fd11a23fee1df7c1561ea45bd215e765e9e93b2efc3f2ca59c39c":{"id":"dd715de9995fd11a23fee1df7c1561ea45bd215e765e9e93b2efc3f2ca59c39c","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0147.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0147_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0147_avg.jpg","gps":{"lat":52.519283333333334,"lng":-7.886638888888888,"alt":117},"data":"2017:08:24 20:28:38","taken_at":"2017-08-24T20:28:38.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2020943,"mtimeMs":1772610987474.4817,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 PN72","city":"Cashel","county_code":"TA","address":"O Neills Restaurant","timezone":"Europe/Dublin","time":"+01:00"}},"8e1a2d2abbd36803ec8670f56869ae723c4c8c8fcd5e634ada9f988c942df1b8":{"id":"8e1a2d2abbd36803ec8670f56869ae723c4c8c8fcd5e634ada9f988c942df1b8","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0148.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0148_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0148_avg.jpg","gps":{"lat":52.519730555555554,"lng":-7.888702777777778,"alt":111.23896103896104},"data":"2017:08:25 10:14:14","taken_at":"2017-08-25T10:14:14.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2632829,"mtimeMs":1772610987477.8152,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 PN72","city":"Cashel","county_code":"TA","address":"Castle Ivy Lodge","timezone":"Europe/Dublin","time":"+01:00"}},"46412728d6155abe53abfec76c97898aad60e36322a46f4a4da280fba8c7c0cc":{"id":"46412728d6155abe53abfec76c97898aad60e36322a46f4a4da280fba8c7c0cc","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0149.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0149_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0149_avg.jpg","gps":{"lat":52.519733333333335,"lng":-7.889491666666666,"alt":117.0272373540856},"data":"2017:08:25 10:15:59","taken_at":"2017-08-25T10:15:59.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3300375,"mtimeMs":1772610987477.8152,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 R897","city":"Cashel","county_code":"TA","address":"The Rock Of Cashel","timezone":"Europe/Dublin","time":"+01:00"}},"999cc0997f51584fef2627c5c9bd87d2f41cd9fe52d930fdc85f791c6adc328e":{"id":"999cc0997f51584fef2627c5c9bd87d2f41cd9fe52d930fdc85f791c6adc328e","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0150.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0150_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0150_avg.jpg","gps":{"lat":52.519730555555554,"lng":-7.890758333333332,"alt":135.53086419753086},"data":"2017:08:25 10:22:34","taken_at":"2017-08-25T10:22:34.000Z","mime_type":"image/jpeg","width":5532,"height":3898,"size_bytes":4461504,"mtimeMs":1772610987484.4817,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 R897","city":"Cashel","county_code":"TA","address":"Rock of Cashel","timezone":"Europe/Dublin","time":"+01:00"}},"7ed0d6366274f3cadfc4caa618847c9c6c250e6b55127367d4ad1e3ca8322436":{"id":"7ed0d6366274f3cadfc4caa618847c9c6c250e6b55127367d4ad1e3ca8322436","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0152.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0152_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0152_avg.jpg","gps":{"lat":52.52006111111111,"lng":-7.8907,"alt":133.4918699186992},"data":"2017:08:25 10:24:04","taken_at":"2017-08-25T10:24:04.000Z","mime_type":"image/jpeg","width":5232,"height":3872,"size_bytes":4964535,"mtimeMs":1772610987487.815,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 R897","city":"Cashel","county_code":"TA","address":"The Cathedral","timezone":"Europe/Dublin","time":"+01:00"}},"4025ea19107cf40d092576e4aaa122bdfb027dc90592a50dd6fa8131838dae69":{"id":"4025ea19107cf40d092576e4aaa122bdfb027dc90592a50dd6fa8131838dae69","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0153.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0153_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0153_avg.jpg","gps":{"lat":52.52001111111111,"lng":-7.8906777777777775,"alt":133.92578125},"data":"2017:08:25 10:24:33","taken_at":"2017-08-25T10:24:33.000Z","mime_type":"image/jpeg","width":5300,"height":3908,"size_bytes":4837273,"mtimeMs":1772610987494.4814,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 R897","city":"Cashel","county_code":"TA","address":"Rock of Cashel","timezone":"Europe/Dublin","time":"+01:00"}},"d91b81a39d72056b2b7eb5bbf6058cf5b5df85cd5d9ca7e2a1bc7e9b897ebfb4":{"id":"d91b81a39d72056b2b7eb5bbf6058cf5b5df85cd5d9ca7e2a1bc7e9b897ebfb4","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0154.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0154_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0154_avg.jpg","gps":{"lat":52.520066666666665,"lng":-7.8907083333333325,"alt":133.5343137254902},"data":"2017:08:25 10:25:11","taken_at":"2017-08-25T10:25:11.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1697485,"mtimeMs":1772610987494.4814,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 R897","city":"Cashel","county_code":"TA","address":"The Cathedral","timezone":"Europe/Dublin","time":"+01:00"}},"49a2098503bd07db18c869b17419352a0a2232389b3cad98cbb013ad42882600":{"id":"49a2098503bd07db18c869b17419352a0a2232389b3cad98cbb013ad42882600","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0155.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0155_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0155_avg.jpg","gps":{"lat":52.52003611111111,"lng":-7.8905666666666665,"alt":134.34188034188034},"data":"2017:08:25 10:25:25","taken_at":"2017-08-25T10:25:25.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1680963,"mtimeMs":1772610987494.4814,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 R897","city":"Cashel","county_code":"TA","address":"The Cathedral","timezone":"Europe/Dublin","time":"+01:00"}},"a856fcea4cade1ed9c59dab96f180c06f18bc97a39654301ad623aed4a4979d7":{"id":"a856fcea4cade1ed9c59dab96f180c06f18bc97a39654301ad623aed4a4979d7","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0156.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0156_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0156_avg.jpg","gps":{"lat":52.519930555555554,"lng":-7.8905361111111105,"alt":133.32001452960407},"data":"2017:08:25 10:26:11","taken_at":"2017-08-25T10:26:11.000Z","mime_type":"image/jpeg","width":3024,"height":4032,"size_bytes":1502040,"mtimeMs":1772610987497.815,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 R897","city":"Cashel","county_code":"TA","address":"The Cathedral","timezone":"Europe/Dublin","time":"+01:00"}},"fd3df96d42b300c66332b98ce7639a79ae07aa0cbadf6ebbd283901bcca510c6":{"id":"fd3df96d42b300c66332b98ce7639a79ae07aa0cbadf6ebbd283901bcca510c6","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0157.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0157_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0157_avg.jpg","gps":{"lat":52.519755555555555,"lng":-7.8903888888888885,"alt":130.2235469448584},"data":"2017:08:25 10:27:23","taken_at":"2017-08-25T10:27:23.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1520788,"mtimeMs":1772610987497.815,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 R897","city":"Cashel","county_code":"TA","address":"Cormac's Chapel","timezone":"Europe/Dublin","time":"+01:00"}},"c8ada02d1e1b7155607e905de25546c0a079c39528fe6df0b601a9c7b5f5df93":{"id":"c8ada02d1e1b7155607e905de25546c0a079c39528fe6df0b601a9c7b5f5df93","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0160.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0160_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0160_avg.jpg","gps":{"lat":52.520469444444444,"lng":-7.890605555555555,"alt":129.35097493036213},"data":"2017:08:25 10:39:31","taken_at":"2017-08-25T10:39:31.000Z","mime_type":"image/jpeg","width":8178,"height":3754,"size_bytes":4954269,"mtimeMs":1772610987504.4814,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Cahir — Cashel","postcode":"E25 R897","city":"Cashel","county_code":"TA","address":"Rock of Cashel","timezone":"Europe/Dublin","time":"+01:00"}},"7351a37b3092015b6dee6e2911581ce590043619497ca84240b71e5ee37a0d2d":{"id":"7351a37b3092015b6dee6e2911581ce590043619497ca84240b71e5ee37a0d2d","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0162.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0162_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0162_avg.jpg","gps":{"lat":51.897780555555556,"lng":-8.474155555555555,"alt":9.365076057511981},"data":"2017:08:25 13:01:46","taken_at":"2017-08-25T13:01:46.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2747267,"mtimeMs":1772610987507.8147,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Munster","postcode":"T12 NC8Y","city":"Cork","county_code":"CO","address":"Mr. Bells","timezone":"Europe/Dublin","time":"+01:00"}},"23852fb024f46c21667b30107942c40d57429b37c0df1549ab32004a739d792f":{"id":"23852fb024f46c21667b30107942c40d57429b37c0df1549ab32004a739d792f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0163.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0163_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0163_avg.jpg","gps":{"lat":51.89773888888889,"lng":-8.47423888888889,"alt":9.51040525739321},"data":"2017:08:25 13:02:29","taken_at":"2017-08-25T13:02:29.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2808395,"mtimeMs":1772610987507.8147,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Munster","postcode":"T12 H244","city":"Cork","county_code":"CO","address":"English Market","timezone":"Europe/Dublin","time":"+01:00"}},"0ed7a1b65e9181db517fc4b75dcb3c8f398b7c3cd880ebc6d345886d070dc843":{"id":"0ed7a1b65e9181db517fc4b75dcb3c8f398b7c3cd880ebc6d345886d070dc843","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0164.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0164_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0164_avg.jpg","gps":{"lat":51.897780555555556,"lng":-8.474155555555555,"alt":8.269830508474577},"data":"2017:08:25 13:02:59","taken_at":"2017-08-25T13:02:59.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3137643,"mtimeMs":1772610987511.148,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Munster","postcode":"T12 NC8Y","city":"Cork","county_code":"CO","address":"Mr. Bells","timezone":"Europe/Dublin","time":"+01:00"}},"64ec16ebc0611619d7c397453119ffe1f80f211b7bc9c428f65f8d761c6aa61f":{"id":"64ec16ebc0611619d7c397453119ffe1f80f211b7bc9c428f65f8d761c6aa61f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0165.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0165_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0165_avg.jpg","gps":{"lat":51.89773888888889,"lng":-8.474166666666667,"alt":9.730654761904763},"data":"2017:08:25 13:25:17","taken_at":"2017-08-25T13:25:17.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2929880,"mtimeMs":1772610987514.4812,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Munster","postcode":"T12 H244","city":"Cork","county_code":"CO","address":"English Market","timezone":"Europe/Dublin","time":"+01:00"}},"8fa73c5ac88c878b12ec926377f54e4d01187d92cc150730c514284d34581b39":{"id":"8fa73c5ac88c878b12ec926377f54e4d01187d92cc150730c514284d34581b39","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0166.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0166_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0166_avg.jpg","gps":{"lat":51.89773611111111,"lng":-8.47423611111111,"alt":9.621908127208481},"data":"2017:08:25 13:25:24","taken_at":"2017-08-25T13:25:24.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2498451,"mtimeMs":1772610987517.8147,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Munster","postcode":"T12 H244","city":"Cork","county_code":"CO","address":"English Market","timezone":"Europe/Dublin","time":"+01:00"}},"ddab26bedbe3287cb210d46a2397336f879655c99224f90f8da1646ee111fee8":{"id":"ddab26bedbe3287cb210d46a2397336f879655c99224f90f8da1646ee111fee8","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0167.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0167_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0167_avg.jpg","gps":{"lat":51.894675,"lng":-8.479277777777778,"alt":7.381074168797954},"data":"2017:08:25 13:55:48","taken_at":"2017-08-25T13:55:48.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3020402,"mtimeMs":1772610987521.148,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Cork","postcode":"T23","city":"Cork","county_code":"CO","address":"Bishop Street","timezone":"Europe/Dublin","time":"+01:00"}},"a07cfd0dfca3d9377ea2f4fea5501c6403f90f4a42a5732bde8b5d31214a2a7a":{"id":"a07cfd0dfca3d9377ea2f4fea5501c6403f90f4a42a5732bde8b5d31214a2a7a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0170.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0170_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0170_avg.jpg","gps":{"lat":51.899947222222224,"lng":-8.469758333333333,"alt":14.086469175340273},"data":"2017:08:25 14:26:42","taken_at":"2017-08-25T14:26:42.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2161605,"mtimeMs":1772610987521.148,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Munster","postcode":"T12 ERW9","city":"Cork","county_code":"CO","address":"Merchant's Quay Shopping Centre","timezone":"Europe/Dublin","time":"+01:00"}},"7a9382798ebaa67e80804165044390a2fded193ec5aa9753e75b62d9d54ce39a":{"id":"7a9382798ebaa67e80804165044390a2fded193ec5aa9753e75b62d9d54ce39a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0171.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0171_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0171_avg.jpg","gps":{"lat":52.05671666666667,"lng":-9.939161111111112,"alt":23.29501385041551},"data":"2017:08:25 18:49:11","taken_at":"2017-08-25T18:49:11.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2913137,"mtimeMs":1772610987524.4812,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Kenmare Municipal District","postcode":"V93 H5W9","city":"Glenbeigh","county_code":"KY","address":"Ashes Bar","timezone":"Europe/Dublin","time":"+01:00"}},"9e8eb4959ed23f9dc3f8722bca1c5dd5a13ff7a6b95a0f0bf8df430d0e2ee9c3":{"id":"9e8eb4959ed23f9dc3f8722bca1c5dd5a13ff7a6b95a0f0bf8df430d0e2ee9c3","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0172.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0172_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0172_avg.jpg","gps":{"lat":52.05670833333333,"lng":-9.939161111111112,"alt":23.29501385041551},"data":"2017:08:25 18:49:26","taken_at":"2017-08-25T18:49:26.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3437757,"mtimeMs":1772610987527.8145,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Kenmare Municipal District","postcode":"V93 H5W9","city":"Glenbeigh","county_code":"KY","address":"Ashes Bar","timezone":"Europe/Dublin","time":"+01:00"}},"df20d33dc73c45e9832c4a83fa5e4fd625c58518dfab5e3465d55959539cf57a":{"id":"df20d33dc73c45e9832c4a83fa5e4fd625c58518dfab5e3465d55959539cf57a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0174.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0174_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0174_avg.jpg","gps":null,"data":null,"taken_at":null,"mime_type":"image/jpeg","width":3724,"height":2096,"size_bytes":1668522,"mtimeMs":1772610987531.1477,"duration":null,"location":null},"f46da4f2e78a8428eda4ea3a0363878cd50dd1d4b3798e4c858a34a217cc53d6":{"id":"f46da4f2e78a8428eda4ea3a0363878cd50dd1d4b3798e4c858a34a217cc53d6","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0175.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0175_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0175_avg.jpg","gps":null,"data":null,"taken_at":null,"mime_type":"image/jpeg","width":3724,"height":2096,"size_bytes":1781263,"mtimeMs":1772610987534.481,"duration":null,"location":null},"68c6d643cbe16143e9255bd3c84576e943b60412d506c090f4a7b93de3e9fd56":{"id":"68c6d643cbe16143e9255bd3c84576e943b60412d506c090f4a7b93de3e9fd56","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0176.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0176_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0176_avg.jpg","gps":{"lat":52.05294444444444,"lng":-9.941038888888889,"alt":50.20450885668277},"data":"2017:08:25 21:12:38","taken_at":"2017-08-25T21:12:38.000Z","mime_type":"image/jpeg","width":3763,"height":1657,"size_bytes":973684,"mtimeMs":1772610987534.481,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Kenmare Municipal District","postcode":"V93 H5W9","city":"Glenbeigh","county_code":"KY","address":"Castle View House","timezone":"Europe/Dublin","time":"+01:00"}},"6b4d4396b06a0513b53fa9d088c1a95bbfacb99ede015addb9e34ad973fd77f4":{"id":"6b4d4396b06a0513b53fa9d088c1a95bbfacb99ede015addb9e34ad973fd77f4","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0177.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0177_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0177_avg.jpg","gps":null,"data":null,"taken_at":null,"mime_type":"image/jpeg","width":3724,"height":2096,"size_bytes":1311890,"mtimeMs":1772610987534.481,"duration":null,"location":null},"dc17f07d88bdd90f4e439911484a2a31f91acb15fcb1201115f16157eec70e66":{"id":"dc17f07d88bdd90f4e439911484a2a31f91acb15fcb1201115f16157eec70e66","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0178.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0178_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0178_avg.jpg","gps":{"lat":52.05667777777777,"lng":-9.938977777777778,"alt":31.517301038062282},"data":"2017:08:26 08:01:20","taken_at":"2017-08-26T08:01:20.000Z","mime_type":"image/jpeg","width":7506,"height":3870,"size_bytes":4612510,"mtimeMs":1772610987541.1477,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Kenmare Municipal District","postcode":"V93 H5W9","city":"Glenbeigh","county_code":"KY","address":"Ashes Bar","timezone":"Europe/Dublin","time":"+01:00"}},"4f041976518502b14f0520489ac932cfd3f9e4e9226e38b09b483327b34ad3bf":{"id":"4f041976518502b14f0520489ac932cfd3f9e4e9226e38b09b483327b34ad3bf","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0179.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0179_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0179_avg.jpg","gps":{"lat":52.056602777777776,"lng":-9.939122222222222,"alt":32.31821086261981},"data":"2017:08:26 08:08:53","taken_at":"2017-08-26T08:08:53.000Z","mime_type":"image/jpeg","width":5624,"height":3958,"size_bytes":4484747,"mtimeMs":1772610987544.481,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Kenmare Municipal District","postcode":"V93 H5W9","city":"Glenbeigh","county_code":"KY","address":"Ashes Bar","timezone":"Europe/Dublin","time":"+01:00"}},"4a125c9271159191ab923bc14fb5398d08aef6ee5ba313a2f6b1599a52e4e0cc":{"id":"4a125c9271159191ab923bc14fb5398d08aef6ee5ba313a2f6b1599a52e4e0cc","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0180.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0180_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0180_avg.jpg","gps":{"lat":51.85628888888889,"lng":-10.367191666666667,"alt":259.4727272727273},"data":"2017:08:26 10:24:15","taken_at":"2017-08-26T10:24:15.000Z","mime_type":"image/jpeg","width":8968,"height":1560,"size_bytes":2873334,"mtimeMs":1772610987547.8142,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Kenmare Municipal District","postcode":"V23 PK58","city":"Kenmare Municipal District","county_code":"KY","address":"Cúm an Easpaig","timezone":"Europe/Dublin","time":"+01:00"}},"0bd35f8c46fa2ec4979d977d13bab6b8e0dc18365a0f25a7d87d81c5336c0378":{"id":"0bd35f8c46fa2ec4979d977d13bab6b8e0dc18365a0f25a7d87d81c5336c0378","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0182.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0182_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0182_avg.jpg","gps":{"lat":51.837830555555556,"lng":-9.898847222222221,"alt":-1.232899022801303},"data":"2017:08:26 12:05:14","taken_at":"2017-08-26T12:05:14.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2168733,"mtimeMs":1772610987551.1475,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Kenmare Municipal District","postcode":"V93 C940","city":"Sneem","county_code":"KY","address":"John Egan","timezone":"Europe/Dublin","time":"+01:00"}},"4065f86b9af59235a5727abaaccb54a9a91fa585b464da2c592db5ed300d8836":{"id":"4065f86b9af59235a5727abaaccb54a9a91fa585b464da2c592db5ed300d8836","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0183.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0183_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0183_avg.jpg","gps":{"lat":51.83782222222222,"lng":-9.89883888888889,"alt":-5.1377802077638055},"data":"2017:08:26 12:05:16","taken_at":"2017-08-26T12:05:16.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1891230,"mtimeMs":1772610987551.1475,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Kenmare Municipal District","postcode":"V93 C940","city":"Sneem","county_code":"KY","address":"John Egan","timezone":"Europe/Dublin","time":"+01:00"}},"76ea19c9ae626658b75942ad3fb9cf4caae2b2a4b845103dac42c006a3af3984":{"id":"76ea19c9ae626658b75942ad3fb9cf4caae2b2a4b845103dac42c006a3af3984","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0185.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0185_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0185_avg.jpg","gps":{"lat":51.83785555555556,"lng":-9.898961111111111,"alt":13.99988174077578},"data":"2017:08:26 12:08:23","taken_at":"2017-08-26T12:08:23.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1766923,"mtimeMs":1772610987554.4807,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Kenmare Municipal District","postcode":"V93 C940","city":"Sneem","county_code":"KY","address":"John Egan","timezone":"Europe/Dublin","time":"+01:00"}},"065a80861c5452dd07586b786aad63e9d74a822cbf10913201658c54023e63cd":{"id":"065a80861c5452dd07586b786aad63e9d74a822cbf10913201658c54023e63cd","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0188.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0188_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0188_avg.jpg","gps":{"lat":52.96539722222222,"lng":-9.434244444444445,"alt":159.0921228304406},"data":"2017:08:26 17:13:40","taken_at":"2017-08-26T17:13:40.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2935053,"mtimeMs":1772610987554.4807,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 KN9T","city":"West Clare Municipal District","county_code":"CE","address":"Grá & co.","timezone":"Europe/Dublin","time":"+01:00"}},"e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed":{"id":"e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0190.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0190_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0190_avg.jpg","gps":{"lat":52.965272222222225,"lng":-9.434625,"alt":165.5382585751979},"data":"2017:08:26 17:15:49","taken_at":"2017-08-26T17:15:49.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1852261,"mtimeMs":1772610987557.8142,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 KN9T","county_code":"CE","address":"Grá & co.","timezone":"Europe/Dublin","time":"+01:00"}},"c584bb41bc73b6b452c6964622ea7e4ccfddc741ed6e1d3757ed6015b59cf65f":{"id":"c584bb41bc73b6b452c6964622ea7e4ccfddc741ed6e1d3757ed6015b59cf65f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0193.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0193_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0193_avg.jpg","gps":{"lat":52.965294444444446,"lng":-9.434625,"alt":167.75757575757575},"data":"2017:08:26 17:15:54","taken_at":"2017-08-26T17:15:54.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1936144,"mtimeMs":1772610987561.1475,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 KN9T","county_code":"CE","address":"Grá & co.","timezone":"Europe/Dublin","time":"+01:00"}},"77b822134129d751070d73441dda90996dab21186c50be2ce79064e22bba94bd":{"id":"77b822134129d751070d73441dda90996dab21186c50be2ce79064e22bba94bd","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0203.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0203_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0203_avg.jpg","gps":{"lat":52.96421388888889,"lng":-9.437794444444444,"alt":174.47921225382933},"data":"2017:08:26 17:23:03","taken_at":"2017-08-26T17:23:03.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1843400,"mtimeMs":1772610987561.1475,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 KN9T","county_code":"CE","address":"Grá & co.","timezone":"Europe/Dublin","time":"+01:00"}},"be834d7663441134af0e4fc6619b1c3ae06b5ce0856beac123ac6972c5b270d7":{"id":"be834d7663441134af0e4fc6619b1c3ae06b5ce0856beac123ac6972c5b270d7","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0204.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0204_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0204_avg.jpg","gps":{"lat":52.96882222222222,"lng":-9.430027777777777,"alt":149.95366795366795},"data":"2017:08:26 17:40:27","taken_at":"2017-08-26T17:40:27.000Z","mime_type":"image/jpeg","width":4658,"height":3974,"size_bytes":4221357,"mtimeMs":1772610987564.4807,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 KN9T","city":"West Clare Municipal District","county_code":"CE","address":"The Cliffs of Moher","timezone":"Europe/Dublin","time":"+01:00"}},"6750d21dec9eb3436ce6c821b40e344ef0fb280e43081cbc5e584310711417b7":{"id":"6750d21dec9eb3436ce6c821b40e344ef0fb280e43081cbc5e584310711417b7","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0206.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0206_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0206_avg.jpg","gps":{"lat":52.96886111111111,"lng":-9.429549999999999,"alt":162.0505617977528},"data":"2017:08:26 17:41:05","taken_at":"2017-08-26T17:41:05.000Z","mime_type":"image/jpeg","width":7305,"height":2311,"size_bytes":4179034,"mtimeMs":1772610987571.1472,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 KN9T","city":"West Clare Municipal District","county_code":"CE","address":"The Cliffs of Moher","timezone":"Europe/Dublin","time":"+01:00"}},"ea8ae33ca15f21e84d75f5b853a88ca78d722b4f461478bdccfa9c059f6b69db":{"id":"ea8ae33ca15f21e84d75f5b853a88ca78d722b4f461478bdccfa9c059f6b69db","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0207.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0207_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0207_avg.jpg","gps":{"lat":52.96893611111111,"lng":-9.429127777777778,"alt":158.71615720524017},"data":"2017:08:26 17:42:55","taken_at":"2017-08-26T17:42:55.000Z","mime_type":"image/jpeg","width":1680,"height":4030,"size_bytes":1750381,"mtimeMs":1772610987574.4805,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 KN9T","city":"West Clare Municipal District","county_code":"CE","address":"The Cliffs of Moher","timezone":"Europe/Dublin","time":"+01:00"}},"3be962052af0da265a1bd9cb69ed6868798f47343a2e1dc774c77568c20139bf":{"id":"3be962052af0da265a1bd9cb69ed6868798f47343a2e1dc774c77568c20139bf","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0208.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0208_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0208_avg.jpg","gps":{"lat":52.96890277777778,"lng":-9.429177777777777,"alt":159.49257425742573},"data":"2017:08:26 17:43:05","taken_at":"2017-08-26T17:43:05.000Z","mime_type":"image/jpeg","width":4427,"height":2389,"size_bytes":2046548,"mtimeMs":1772610987574.4805,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 KN9T","city":"West Clare Municipal District","county_code":"CE","address":"The Cliffs of Moher","timezone":"Europe/Dublin","time":"+01:00"}},"3041f044b86b8888937659a1c691db34f0c8b52b6dec6a7db023c18e9cd24722":{"id":"3041f044b86b8888937659a1c691db34f0c8b52b6dec6a7db023c18e9cd24722","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0209.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0209_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0209_avg.jpg","gps":{"lat":52.969455555555555,"lng":-9.428788888888889,"alt":164.52023121387282},"data":"2017:08:26 17:45:03","taken_at":"2017-08-26T17:45:03.000Z","mime_type":"image/jpeg","width":6438,"height":3900,"size_bytes":4328104,"mtimeMs":1772610987581.1472,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 KN9T","city":"West Clare Municipal District","county_code":"CE","address":"The Cliffs of Moher","timezone":"Europe/Dublin","time":"+01:00"}},"50c16b24a37a6d76da00bc64b0a6f96ae858ba386dd5750ce0187a7cc3402027":{"id":"50c16b24a37a6d76da00bc64b0a6f96ae858ba386dd5750ce0187a7cc3402027","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0211.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0211_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0211_avg.jpg","gps":{"lat":53.008922222222225,"lng":-9.390380555555556,"alt":29.118190212373037},"data":"2017:08:26 20:38:14","taken_at":"2017-08-26T20:38:14.000Z","mime_type":"image/jpeg","width":3946,"height":2960,"size_bytes":703594,"mtimeMs":1772610987581.1472,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 FY67","city":"West Clare Municipal District","county_code":"CE","address":"Aille River","timezone":"Europe/Dublin","time":"+01:00"}},"df606e3b1a55f9f2c90e333bd113a0af2beb83a319aac9619b5b9cd729b13b0e":{"id":"df606e3b1a55f9f2c90e333bd113a0af2beb83a319aac9619b5b9cd729b13b0e","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0212.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0212_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0212_avg.jpg","gps":{"lat":53.00888888888889,"lng":-9.390277777777778,"alt":30.341211225997046},"data":"2017:08:26 20:38:56","taken_at":"2017-08-26T20:38:56.000Z","mime_type":"image/jpeg","width":3745,"height":1941,"size_bytes":468928,"mtimeMs":1772610987581.1472,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 FY67","city":"West Clare Municipal District","county_code":"CE","address":"Aille River","timezone":"Europe/Dublin","time":"+01:00"}},"2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070":{"id":"2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0214.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0214_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0214_avg.jpg","gps":{"lat":53.013308333333335,"lng":-9.3872,"alt":19.450097847358123},"data":"2017:08:27 08:23:04","taken_at":"2017-08-27T08:23:04.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2097953,"mtimeMs":1772610987584.4805,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 FY67","city":"Fitz's Cross","county_code":"CE","address":"Fisherman's Rest","timezone":"Europe/Dublin","time":"+01:00"}},"bc0155f7235dc0ede6921f43debb8ebe8ca44fb1db57447d26a63f6904f38bba":{"id":"bc0155f7235dc0ede6921f43debb8ebe8ca44fb1db57447d26a63f6904f38bba","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0215.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0215_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0215_avg.jpg","gps":{"lat":53.0132,"lng":-9.38715,"alt":18.498759305210918},"data":"2017:08:27 08:38:10","taken_at":"2017-08-27T08:38:10.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2489649,"mtimeMs":1772610987584.4805,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","postcode":"V95 FY67","city":"Fitz's Cross","county_code":"CE","address":"Fisherman's Rest","timezone":"Europe/Dublin","time":"+01:00"}},"a99f57f0bea2cb9b6caf3d0e60c3719e379d3d5bc2bbe37d1044c764214dd0b9":{"id":"a99f57f0bea2cb9b6caf3d0e60c3719e379d3d5bc2bbe37d1044c764214dd0b9","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0216.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0216_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0216_avg.jpg","gps":{"lat":53.04830833333333,"lng":-9.139725,"alt":140.78151260504202},"data":"2017:08:27 10:47:31","taken_at":"2017-08-27T10:47:31.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3009764,"mtimeMs":1772610987587.8137,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","city":"West Clare Municipal District","county_code":"CE","address":"The Portal Tomb","timezone":"Europe/Dublin","time":"+01:00"}},"915492fbf9fc1769985e4f5684d42728b5ee63092b148b887c6d07d1fb66fe8f":{"id":"915492fbf9fc1769985e4f5684d42728b5ee63092b148b887c6d07d1fb66fe8f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0217.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0217_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0217_avg.jpg","gps":{"lat":53.04877777777778,"lng":-9.139919444444445,"alt":142.0483870967742},"data":"2017:08:27 10:49:03","taken_at":"2017-08-27T10:49:03.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2757600,"mtimeMs":1772610987591.147,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","city":"West Clare Municipal District","county_code":"CE","address":"Poulnabrone Dolmen","timezone":"Europe/Dublin","time":"+01:00"}},"0c2e99aa7c89c4a124019241d0131a03877d49bef2e409be8421b93d0f15ed82":{"id":"0c2e99aa7c89c4a124019241d0131a03877d49bef2e409be8421b93d0f15ed82","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0218.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0218_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0218_avg.jpg","gps":{"lat":53.048788888888886,"lng":-9.139975,"alt":142.04854368932038},"data":"2017:08:27 10:49:10","taken_at":"2017-08-27T10:49:10.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3442902,"mtimeMs":1772610987594.4802,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"West Clare Municipal District","city":"West Clare Municipal District","county_code":"CE","address":"Poulnabrone Dolmen","timezone":"Europe/Dublin","time":"+01:00"}},"a80cdc2fe8bfed0bddc25931f17f5f263ea273cca34558d9e190effa5fcc7bc9":{"id":"a80cdc2fe8bfed0bddc25931f17f5f263ea273cca34558d9e190effa5fcc7bc9","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0223.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0223_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0223_avg.jpg","gps":{"lat":53.07643055555556,"lng":-9.159872222222223,"alt":100.63625304136254},"data":"2017:08:27 11:29:15","taken_at":"2017-08-27T11:29:15.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3891743,"mtimeMs":1772610987597.8135,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Clare","county_code":"CE","address":"Corkscrew Hill","timezone":"Europe/Dublin","time":"+01:00"}},"308808d70076dd738c2d8d7703332dd000fb5592084ff292e2e7d2e43cac75df":{"id":"308808d70076dd738c2d8d7703332dd000fb5592084ff292e2e7d2e43cac75df","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0227.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0227_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0227_avg.jpg","gps":{"lat":53.27153055555556,"lng":-9.053811111111111,"alt":12.426332288401253},"data":"2017:08:27 14:30:08","taken_at":"2017-08-27T14:30:08.000Z","mime_type":"image/jpeg","width":3162,"height":1743,"size_bytes":1551495,"mtimeMs":1772610987597.8135,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Connacht","postcode":"H91 XP9Y","city":"Galway","county_code":"G","address":"Avenue","timezone":"Europe/Dublin","time":"+01:00"}},"20bdd8d0c71b2e1b6a55586e2def4db18152371efbd966b98f055ba340bf471a":{"id":"20bdd8d0c71b2e1b6a55586e2def4db18152371efbd966b98f055ba340bf471a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0228.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0228_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0228_avg.jpg","gps":{"lat":53.48401666666667,"lng":-9.977619444444445,"alt":40.73868882733149},"data":"2017:08:27 18:13:44","taken_at":"2017-08-27T18:13:44.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1257412,"mtimeMs":1772610987601.147,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Conamara Municipal District","postcode":"H71 AK52","city":"Conamara Municipal District","county_code":"G","address":"Cregg House","timezone":"Europe/Dublin","time":"+01:00"}},"37df228c1e983e94e3abea8800b04660e647034fca4948ef45ed6ec69d468687":{"id":"37df228c1e983e94e3abea8800b04660e647034fca4948ef45ed6ec69d468687","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0229.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0229_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0229_avg.jpg","gps":{"lat":53.488727777777775,"lng":-10.022394444444446,"alt":16.373895976447496},"data":"2017:08:27 19:42:29","taken_at":"2017-08-27T19:42:29.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2405533,"mtimeMs":1772610987601.147,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Conamara Municipal District","postcode":"H71 Y277","city":"Clifden","county_code":"G","address":"Vivian","timezone":"Europe/Dublin","time":"+01:00"}},"1a4313d5086018efcd689dbca06040d99a75f7b331798b0fa2ced0d25dea95b7":{"id":"1a4313d5086018efcd689dbca06040d99a75f7b331798b0fa2ced0d25dea95b7","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0232.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0232_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0232_avg.jpg","gps":{"lat":53.48798888888889,"lng":-10.010555555555555,"alt":17.364317841079462},"data":"2017:08:28 08:43:03","taken_at":"2017-08-28T08:43:03.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":2066043,"mtimeMs":1772610987604.4802,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Conamara Municipal District","postcode":"H71 AK52","city":"Clifden","county_code":"G","address":"Burkes B & B","timezone":"Europe/Dublin","time":"+01:00"}},"6ab20a650288559438d81881ade44773873472c54d4d8cbbe69aaf2337c9d92b":{"id":"6ab20a650288559438d81881ade44773873472c54d4d8cbbe69aaf2337c9d92b","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0233.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0233_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0233_avg.jpg","gps":{"lat":53.5616,"lng":-9.917430555555555,"alt":25.366141732283463},"data":"2017:08:28 10:38:47","taken_at":"2017-08-28T10:38:47.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":4708675,"mtimeMs":1772610987611.1467,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Conamara Municipal District","postcode":"H91 K224","city":"Conamara Municipal District","county_code":"G","address":"Dawros River","timezone":"Europe/Dublin","time":"+01:00"}},"6cf111099d98f97b09cf7a397d9ef6c849693e8273bf6026e0af0f257c0240bc":{"id":"6cf111099d98f97b09cf7a397d9ef6c849693e8273bf6026e0af0f257c0240bc","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0234.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0234_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0234_avg.jpg","gps":{"lat":53.56163055555555,"lng":-9.917408333333332,"alt":25.604172461752434},"data":"2017:08:28 10:38:53","taken_at":"2017-08-28T10:38:53.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":4888844,"mtimeMs":1772610987614.48,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Conamara Municipal District","postcode":"H91 K224","city":"Conamara Municipal District","county_code":"G","address":"Dawros River","timezone":"Europe/Dublin","time":"+01:00"}},"e830691975e126ad19891ea10585409a551791e8d0e8c6eda7e9d5e7878ce6a2":{"id":"e830691975e126ad19891ea10585409a551791e8d0e8c6eda7e9d5e7878ce6a2","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0235.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0235_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0235_avg.jpg","gps":{"lat":53.56167222222222,"lng":-9.917269444444443,"alt":25.246113989637305},"data":"2017:08:28 10:39:10","taken_at":"2017-08-28T10:39:10.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":4413193,"mtimeMs":1772610987617.8132,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Conamara Municipal District","postcode":"H91 K224","city":"Conamara Municipal District","county_code":"G","address":"Dawros River","timezone":"Europe/Dublin","time":"+01:00"}},"9fabc411f90e2a1452f4880b21ee6cdfb14c1274ce8c7a9a23c30444f07b370b":{"id":"9fabc411f90e2a1452f4880b21ee6cdfb14c1274ce8c7a9a23c30444f07b370b","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0237.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0237_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0237_avg.jpg","gps":{"lat":53.56166944444444,"lng":-9.917263888888888,"alt":25.190361445783132},"data":"2017:08:28 10:39:24","taken_at":"2017-08-28T10:39:24.000Z","mime_type":"image/jpeg","width":3630,"height":3790,"size_bytes":3314673,"mtimeMs":1772610987621.1467,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Conamara Municipal District","postcode":"H91 K224","city":"Conamara Municipal District","county_code":"G","address":"Dawros River","timezone":"Europe/Dublin","time":"+01:00"}},"3846bf7e160007e43c6de5a612b3384ad4235276b7ac86284fd2a7e45a3b0a27":{"id":"3846bf7e160007e43c6de5a612b3384ad4235276b7ac86284fd2a7e45a3b0a27","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0241.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0241_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0241_avg.jpg","gps":{"lat":53.419936111111106,"lng":-6.940597222222222,"alt":72.56199677938808},"data":"2017:08:29 10:15:22","taken_at":"2017-08-29T10:15:22.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1745323,"mtimeMs":1772610987624.48,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Clane — Maynooth","city":"The Municipal District of Clane — Maynooth","county_code":"KE","address":"Ballna Bog","timezone":"Europe/Dublin","time":"+01:00"}},"b4fec8470cd605882c09ec97558d3a737d25a43488adfb903c3573f8b1fb5ebc":{"id":"b4fec8470cd605882c09ec97558d3a737d25a43488adfb903c3573f8b1fb5ebc","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0242.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0242_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0242_avg.jpg","gps":{"lat":53.18601111111111,"lng":-6.879438888888889,"alt":120.1146953405018},"data":"2017:08:29 11:17:46","taken_at":"2017-08-29T11:17:46.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":1242828,"mtimeMs":1772610987624.48,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Kildare","city":"The Municipal District of Kildare — Newbridge","county_code":"KE","address":"Rathbride House","timezone":"Europe/Dublin","time":"+01:00"}},"b864196e118aa2b40142438c2e28df587c53fb27e6d4e24fa9b98a00cecccdc9":{"id":"b864196e118aa2b40142438c2e28df587c53fb27e6d4e24fa9b98a00cecccdc9","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0243.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0243_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0243_avg.jpg","gps":{"lat":53.18579999999999,"lng":-6.8796083333333335,"alt":111.82454128440367},"data":"2017:08:29 11:18:06","taken_at":"2017-08-29T11:18:06.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3347118,"mtimeMs":1772610987627.8132,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"Kildare","city":"The Municipal District of Kildare — Newbridge","county_code":"KE","address":"Rathbride House","timezone":"Europe/Dublin","time":"+01:00"}},"b1f9d25d6d7217c01a3a67f59176d54ce73b1bb626a687d1447a5354e5cad020":{"id":"b1f9d25d6d7217c01a3a67f59176d54ce73b1bb626a687d1447a5354e5cad020","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0244.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0244_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0244_avg.jpg","gps":{"lat":53.144641666666665,"lng":-6.901408333333333,"alt":83.13207547169812},"data":"2017:08:29 11:37:56","taken_at":"2017-08-29T11:37:56.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":4832084,"mtimeMs":1772610987634.4797,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Kildare — Newbridge","postcode":"R51 AP20","city":"Tracey's Crossroads","county_code":"KE","address":"Japanese Gardens","timezone":"Europe/Dublin","time":"+01:00"}},"e9549aa2bb21ad70ff35ad1626cf15f6cb62a321e25e3e7ab832bd9e7430e186":{"id":"e9549aa2bb21ad70ff35ad1626cf15f6cb62a321e25e3e7ab832bd9e7430e186","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0245.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0245_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0245_avg.jpg","gps":{"lat":53.14463333333333,"lng":-6.901205555555556,"alt":104.18667917448406},"data":"2017:08:29 11:38:52","taken_at":"2017-08-29T11:38:52.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":4210606,"mtimeMs":1772610987637.813,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Kildare — Newbridge","postcode":"R51 AP20","city":"Tracey's Crossroads","county_code":"KE","address":"Japanese Gardens","timezone":"Europe/Dublin","time":"+01:00"}},"b8013a96d80b1a6c3b39384f0910ff1f4507fcbf6936b90472d066f75772e751":{"id":"b8013a96d80b1a6c3b39384f0910ff1f4507fcbf6936b90472d066f75772e751","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0246.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0246_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0246_avg.jpg","gps":{"lat":53.14440833333333,"lng":-6.901238888888889,"alt":122.44324324324324},"data":"2017:08:29 11:40:11","taken_at":"2017-08-29T11:40:11.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":4047020,"mtimeMs":1772610987644.4797,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Kildare — Newbridge","postcode":"R51 AP20","city":"Tracey's Crossroads","county_code":"KE","address":"Japanese Gardens","timezone":"Europe/Dublin","time":"+01:00"}},"d32b08d40cee22365e0193a7372cf85e997501d1e5e6d67b80aaddd569ee7030":{"id":"d32b08d40cee22365e0193a7372cf85e997501d1e5e6d67b80aaddd569ee7030","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0247.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0247_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0247_avg.jpg","gps":{"lat":53.144486111111114,"lng":-6.901394444444445,"alt":101.99131944444444},"data":"2017:08:29 11:41:36","taken_at":"2017-08-29T11:41:36.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":3155785,"mtimeMs":1772610987647.813,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Kildare — Newbridge","postcode":"R51 AP20","city":"Tracey's Crossroads","county_code":"KE","address":"Japanese Gardens","timezone":"Europe/Dublin","time":"+01:00"}},"0402bf83d35731c94314d6333cea4350e725209307a45fe6fe548ae04bf2e763":{"id":"0402bf83d35731c94314d6333cea4350e725209307a45fe6fe548ae04bf2e763","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0248.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0248_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0248_avg.jpg","gps":{"lat":53.14426111111111,"lng":-6.902130555555556,"alt":117.1704918032787},"data":"2017:08:29 11:45:12","taken_at":"2017-08-29T11:45:12.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":4551844,"mtimeMs":1772610987651.1462,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Kildare — Newbridge","postcode":"R51 AP20","city":"Tracey's Crossroads","county_code":"KE","address":"Japanese Gardens","timezone":"Europe/Dublin","time":"+01:00"}},"10e4a1c655829f11ad8f465cfc1e105e7430b9c0bf36f5589624cd5932c50457":{"id":"10e4a1c655829f11ad8f465cfc1e105e7430b9c0bf36f5589624cd5932c50457","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0249.JPG","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0249_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0249_avg.jpg","gps":{"lat":53.14420833333333,"lng":-6.902055555555556,"alt":90.47846889952153},"data":"2017:08:29 11:45:40","taken_at":"2017-08-29T11:45:40.000Z","mime_type":"image/jpeg","width":4032,"height":3024,"size_bytes":4772193,"mtimeMs":1772610987654.4795,"duration":null,"location":{"continent":"Europe","country":"Ireland","region":"The Municipal District of Kildare — Newbridge","postcode":"R51 AP20","city":"Tracey's Crossroads","county_code":"KE","address":"Japanese Gardens","timezone":"Europe/Dublin","time":"+01:00"}},"e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1":{"id":"e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/VID_20260221_095917.mp4","thub1":"/photos/Fabio/thumbs/2017Irlanda19-29ago/VID_20260221_095917_min.jpg","thub2":"/photos/Fabio/thumbs/2017Irlanda19-29ago/VID_20260221_095917_avg.jpg","gps":{"lat":44.1816,"lng":12.1251,"alt":null},"data":null,"taken_at":null,"mime_type":"video/mp4","width":1920,"height":1080,"size_bytes":12273606,"mtimeMs":1772610987667.8127,"duration":"5.472541","location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47034","city":"Forlimpopoli","county_code":"FC","address":"Via Sandro Pertini, 99999/SN2","timezone":"Europe/Rome","time":"+01:00"}},"277819445ad141e36c5322d345c9109cc20335a2a62c57c52c0779018a48ea5a":{"id":"277819445ad141e36c5322d345c9109cc20335a2a62c57c52c0779018a48ea5a","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_100423.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100423_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100423_avg.jpg","gps":{"lat":44.04981,"lng":12.457799999999999,"alt":87.023},"data":"2021:06:02 10:04:25","taken_at":"2021-06-02T10:04:25.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":2345345,"mtimeMs":1772610987681.146,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47822","city":"Santarcangelo di Romagna","county_code":"RN","address":"Via Calatoio Ponte, 60","timezone":"Europe/Rome","time":"+01:00"}},"cff41f5cd90ba1b38e20a58e23fa99ecb2da5507ce2da9f29af8db7444b1a5e6":{"id":"cff41f5cd90ba1b38e20a58e23fa99ecb2da5507ce2da9f29af8db7444b1a5e6","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_100428.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100428_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100428_avg.jpg","gps":{"lat":44.049799,"lng":12.457808972222221,"alt":87.511},"data":"2021:06:02 10:04:30","taken_at":"2021-06-02T10:04:30.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":2687563,"mtimeMs":1772610987684.4792,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47822","city":"Santarcangelo di Romagna","county_code":"RN","address":"Via Calatoio Ponte, 60","timezone":"Europe/Rome","time":"+01:00"}},"fb34ec5ab410854bfb2961374c44bbfa1719294ff2228c4c6e3bc6959b639672":{"id":"fb34ec5ab410854bfb2961374c44bbfa1719294ff2228c4c6e3bc6959b639672","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_100449.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100449_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100449_avg.jpg","gps":{"lat":44.04984497222222,"lng":12.457746972222221,"alt":85.388},"data":"2021:06:02 10:04:50","taken_at":"2021-06-02T10:04:50.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":2247013,"mtimeMs":1772610987687.8125,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47822","city":"Santarcangelo di Romagna","county_code":"RN","address":"Via Calatoio Ponte, 60","timezone":"Europe/Rome","time":"+01:00"}},"7370c617dfe9b1dbc32de40c9d6c7159932b7291f1cf3d92874f450554de5d65":{"id":"7370c617dfe9b1dbc32de40c9d6c7159932b7291f1cf3d92874f450554de5d65","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_100532.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100532_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100532_avg.jpg","gps":{"lat":44.04975997222222,"lng":12.458194972222222,"alt":86.572},"data":"2021:06:02 10:05:33","taken_at":"2021-06-02T10:05:33.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":2141056,"mtimeMs":1772610987691.1458,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47822","city":"Santarcangelo di Romagna","county_code":"RN","address":"Via Calatoio Ponte, 60","timezone":"Europe/Rome","time":"+01:00"}},"c178d6efa4694140a58f6babdd717572d76c3c884123e602e55f01feedc68e4b":{"id":"c178d6efa4694140a58f6babdd717572d76c3c884123e602e55f01feedc68e4b","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_100557.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100557_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100557_avg.jpg","gps":{"lat":44.049866,"lng":12.458328999999999,"alt":86.391},"data":"2021:06:02 10:05:58","taken_at":"2021-06-02T10:05:58.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":2500890,"mtimeMs":1772610987691.1458,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47822","city":"Santarcangelo di Romagna","county_code":"RN","address":"Via Calatoio Ponte, 60","timezone":"Europe/Rome","time":"+01:00"}},"4c0b3ef81a5a430d93a3a4e9e610f4ad921e2083a3f07e3bb4b9171fb52c2740":{"id":"4c0b3ef81a5a430d93a3a4e9e610f4ad921e2083a3f07e3bb4b9171fb52c2740","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_100637.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100637_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100637_avg.jpg","gps":{"lat":44.04998297222222,"lng":12.459061972222221,"alt":83.883},"data":"2021:06:02 10:06:38","taken_at":"2021-06-02T10:06:38.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":1840010,"mtimeMs":1772610987694.479,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47822","city":"Santarcangelo di Romagna","county_code":"RN","address":"Via Calatoio Ponte, 60","timezone":"Europe/Rome","time":"+01:00"}},"bf8272f5aa4777903f38cd79930c68df0fc4a3fa7ab225604ec8cdef26450866":{"id":"bf8272f5aa4777903f38cd79930c68df0fc4a3fa7ab225604ec8cdef26450866","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_100703.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100703_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100703_avg.jpg","gps":{"lat":44.050011999999995,"lng":12.459272972222221,"alt":85.344},"data":"2021:06:02 10:07:07","taken_at":"2021-06-02T10:07:07.000Z","mime_type":"image/jpeg","width":4160,"height":2340,"size_bytes":2436665,"mtimeMs":1772610987697.8123,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47822","city":"Santarcangelo di Romagna","county_code":"RN","address":"Via Calatoio Ponte, 60","timezone":"Europe/Rome","time":"+01:00"}},"9d6ef72bed1a9aa00d9d39d6bda73e328f35572278487dc6930bffb98e28eb76":{"id":"9d6ef72bed1a9aa00d9d39d6bda73e328f35572278487dc6930bffb98e28eb76","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_100736.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100736_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_100736_avg.jpg","gps":{"lat":44.05013997222222,"lng":12.459366999999999,"alt":85.283},"data":"2021:06:02 10:07:39","taken_at":"2021-06-02T10:07:39.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":1790844,"mtimeMs":1772610987697.8123,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47822","city":"Santarcangelo di Romagna","county_code":"RN","address":"Via Calatoio Ponte, 60","timezone":"Europe/Rome","time":"+01:00"}},"1287cd38bacd1435d414eb3c1f0e301afddcfe8ab107ded955f0deb8f32f88a9":{"id":"1287cd38bacd1435d414eb3c1f0e301afddcfe8ab107ded955f0deb8f32f88a9","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_104441.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_104441_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_104441_avg.jpg","gps":{"lat":44.06517697222222,"lng":12.55109,"alt":49.577},"data":"2021:06:02 10:44:43","taken_at":"2021-06-02T10:44:43.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":1529761,"mtimeMs":1772610987701.1458,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47900","city":"Rimini","county_code":"RN","address":"Via Predil, 44","timezone":"Europe/Rome","time":"+01:00"}},"d5326275a224529469e9cc4581c093d806cdf3b90f79ec9fe339ace0bf6a7233":{"id":"d5326275a224529469e9cc4581c093d806cdf3b90f79ec9fe339ace0bf6a7233","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_104444.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_104444_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_104444_avg.jpg","gps":{"lat":44.06517697222222,"lng":12.55109,"alt":49.577},"data":"2021:06:02 10:44:46","taken_at":"2021-06-02T10:44:46.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":1165321,"mtimeMs":1772610987701.1458,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47900","city":"Rimini","county_code":"RN","address":"Via Predil, 44","timezone":"Europe/Rome","time":"+01:00"}},"1a89d516ffd2c83ccc973549ed638b265e6dff3fb4ada924a1644913ba980b94":{"id":"1a89d516ffd2c83ccc973549ed638b265e6dff3fb4ada924a1644913ba980b94","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_140046.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_140046_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_140046_avg.jpg","gps":{"lat":43.963791,"lng":12.772057,"alt":163.016},"data":"2021:06:02 14:00:52","taken_at":"2021-06-02T14:00:52.000Z","mime_type":"image/jpeg","width":4160,"height":2340,"size_bytes":434099,"mtimeMs":1772610987701.1458,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Marche","postcode":"61011","city":"Gabicce Mare","county_code":"PU","address":"Piazza Valbruna, 3","timezone":"Europe/Rome","time":"+01:00"}},"110f4494fd59bd4aad6b83d6d4642da3f258b6be10fdd90020902ed9c6beb4e0":{"id":"110f4494fd59bd4aad6b83d6d4642da3f258b6be10fdd90020902ed9c6beb4e0","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_140118.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_140118_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_140118_avg.jpg","gps":{"lat":43.963791,"lng":12.772016,"alt":162.272},"data":"2021:06:02 14:01:19","taken_at":"2021-06-02T14:01:19.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":607653,"mtimeMs":1772610987704.479,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Marche","postcode":"61011","city":"Gabicce Mare","county_code":"PU","address":"Piazza Valbruna, 3","timezone":"Europe/Rome","time":"+01:00"}},"619185d1507975e54ada199f49e816cc8f0d5f1cd1f6d14b23d4e98b6233f664":{"id":"619185d1507975e54ada199f49e816cc8f0d5f1cd1f6d14b23d4e98b6233f664","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_140120.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_140120_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_140120_avg.jpg","gps":{"lat":43.963791972222225,"lng":12.772017972222223,"alt":162.581},"data":"2021:06:02 14:01:21","taken_at":"2021-06-02T14:01:21.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":679960,"mtimeMs":1772610987704.479,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Marche","postcode":"61011","city":"Gabicce Mare","county_code":"PU","address":"Piazza Valbruna, 3","timezone":"Europe/Rome","time":"+01:00"}},"0f5461fd05d6878fcf31132212c8e46f2d333fc229f7f64fdddb7cb4e6206bf3":{"id":"0f5461fd05d6878fcf31132212c8e46f2d333fc229f7f64fdddb7cb4e6206bf3","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_140215.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_140215_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_140215_avg.jpg","gps":{"lat":43.963791972222225,"lng":12.772017972222223,"alt":162.581},"data":"2021:06:02 14:01:21","taken_at":"2021-06-02T14:01:21.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":1022306,"mtimeMs":1772610987704.479,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Marche","postcode":"61011","city":"Gabicce Mare","county_code":"PU","address":"Piazza Valbruna, 3","timezone":"Europe/Rome","time":"+01:00"}},"e7896e8546bf33318f3398bb3b132be7538e6f6c886baa87651e3bf9d8749971":{"id":"e7896e8546bf33318f3398bb3b132be7538e6f6c886baa87651e3bf9d8749971","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_140246.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_140246_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_140246_avg.jpg","gps":{"lat":43.963791972222225,"lng":12.772017972222223,"alt":162.581},"data":"2021:06:02 14:01:21","taken_at":"2021-06-02T14:01:21.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":1356927,"mtimeMs":1772610987704.479,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Marche","postcode":"61011","city":"Gabicce Mare","county_code":"PU","address":"Piazza Valbruna, 3","timezone":"Europe/Rome","time":"+01:00"}},"8c497e1587bc4483acdb8da9ec13521b62e134e9a906cf82105c314cf027e862":{"id":"8c497e1587bc4483acdb8da9ec13521b62e134e9a906cf82105c314cf027e862","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_173903.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_173903_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_173903_avg.jpg","gps":{"lat":44.063016999999995,"lng":12.562424,"alt":41.03},"data":"2021:06:02 17:39:06","taken_at":"2021-06-02T17:39:06.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":1756574,"mtimeMs":1772610987707.8123,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47922","city":"Rimini","county_code":"RN","address":"Via Oscar Olivieri, 21a","timezone":"Europe/Rome","time":"+01:00"}},"500273784f166659371a65700d09e03a25e88d5e3d988d395403619adf404d09":{"id":"500273784f166659371a65700d09e03a25e88d5e3d988d395403619adf404d09","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_173923.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_173923_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_173923_avg.jpg","gps":{"lat":44.063052972222216,"lng":12.562461,"alt":39.682},"data":"2021:06:02 17:39:25","taken_at":"2021-06-02T17:39:25.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":2099114,"mtimeMs":1772610987711.1455,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47922","city":"Rimini","county_code":"RN","address":"Via Oscar Olivieri, 15","timezone":"Europe/Rome","time":"+01:00"}},"cca6a53793c64f5b9c5b1279b3a3aaefff2e834c0aea4231f5c3d87ea80e85fb":{"id":"cca6a53793c64f5b9c5b1279b3a3aaefff2e834c0aea4231f5c3d87ea80e85fb","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_180652.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_180652_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_180652_avg.jpg","gps":{"lat":44.05464597222222,"lng":12.47953,"alt":69.873},"data":"2021:06:02 18:06:55","taken_at":"2021-06-02T18:06:55.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":2863403,"mtimeMs":1772610987711.1455,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47922","city":"Rimini","county_code":"RN","address":"Via Spinello, 10","timezone":"Europe/Rome","time":"+01:00"}},"61567ca142aca04073dae9044138846b31e9d0b16bb5835726ede4e9a13a9094":{"id":"61567ca142aca04073dae9044138846b31e9d0b16bb5835726ede4e9a13a9094","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_180710.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_180710_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_180710_avg.jpg","gps":{"lat":44.054669999999994,"lng":12.47952,"alt":73.297},"data":"2021:06:02 18:07:12","taken_at":"2021-06-02T18:07:12.000Z","mime_type":"image/jpeg","width":4000,"height":2250,"size_bytes":1638034,"mtimeMs":1772610987714.4788,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47922","city":"Rimini","county_code":"RN","address":"Via Spinello, 10","timezone":"Europe/Rome","time":"+01:00"}},"d0c46b0dcbf4ce23554b2c4543a1a8a21b32dd4a8687e9656a4c2de0ca877e79":{"id":"d0c46b0dcbf4ce23554b2c4543a1a8a21b32dd4a8687e9656a4c2de0ca877e79","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_180723.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_180723_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_180723_avg.jpg","gps":{"lat":44.054688999999996,"lng":12.479525972222222,"alt":78.42},"data":"2021:06:02 18:07:28","taken_at":"2021-06-02T18:07:28.000Z","mime_type":"image/jpeg","width":4160,"height":2340,"size_bytes":1801324,"mtimeMs":1772610987714.4788,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47922","city":"Rimini","county_code":"RN","address":"Via Spinello, 10","timezone":"Europe/Rome","time":"+01:00"}},"512c3d1eb8d8d6c07bed434a1426dce46b4800b94b90b497033d7cc13a5d5995":{"id":"512c3d1eb8d8d6c07bed434a1426dce46b4800b94b90b497033d7cc13a5d5995","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_181011.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_181011_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_181011_avg.jpg","gps":{"lat":44.05465097222222,"lng":12.479513972222222,"alt":79.029},"data":"2021:06:02 18:10:14","taken_at":"2021-06-02T18:10:14.000Z","mime_type":"image/jpeg","width":4160,"height":2340,"size_bytes":1782820,"mtimeMs":1772610987717.812,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47922","city":"Rimini","county_code":"RN","address":"Via Spinello, 10","timezone":"Europe/Rome","time":"+01:00"}},"ee89614385eecd7fe0d8423ed650e5f0ab3a806f99ad9e06e2d17201604dac71":{"id":"ee89614385eecd7fe0d8423ed650e5f0ab3a806f99ad9e06e2d17201604dac71","user":"Jessica","cartella":"2021-Santarcangelo","path":"/photos/Jessica/original/2021-Santarcangelo/IMG_20210602_181034.jpg","thub1":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_181034_min.jpg","thub2":"/photos/Jessica/thumbs/2021-Santarcangelo/IMG_20210602_181034_avg.jpg","gps":{"lat":44.054632999999995,"lng":12.479537972222221,"alt":80.065},"data":"2021:06:02 18:10:36","taken_at":"2021-06-02T18:10:36.000Z","mime_type":"image/jpeg","width":4160,"height":2340,"size_bytes":1728734,"mtimeMs":1772610987717.812,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Emilia-Romagna","postcode":"47922","city":"Rimini","county_code":"RN","address":"Via Spinello, 10","timezone":"Europe/Rome","time":"+01:00"}},"d35415f357d66ea7e25d32f8c1320458a0c6811e3f68fb3329eb346f418c5e75":{"id":"d35415f357d66ea7e25d32f8c1320458a0c6811e3f68fb3329eb346f418c5e75","user":"Common","cartella":"varie","path":"/photos/Common/original/varie/IMG_20220619_135541.jpg","thub1":"/photos/Common/thumbs/varie/IMG_20220619_135541_min.jpg","thub2":"/photos/Common/thumbs/varie/IMG_20220619_135541_avg.jpg","gps":{"lat":46.42841388888888,"lng":11.779830555555556,"alt":2479.463},"data":"2022:06:19 13:55:41","taken_at":"2022-06-19T13:55:41.000Z","mime_type":"image/jpeg","width":2592,"height":4608,"size_bytes":4440865,"mtimeMs":1772610987737.8118,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Trentino – Alto Adige/Südtirol","postcode":"38036","city":"San Giovanni di Fassa - Sèn Jan","county_code":"TN","address":"Sas bianch","timezone":"Europe/Rome","time":"+01:00"}},"651341272c9802b6e1257e456c7908e4514618eed9532a242e58af730f7ca9b1":{"id":"651341272c9802b6e1257e456c7908e4514618eed9532a242e58af730f7ca9b1","user":"Common","cartella":"varie","path":"/photos/Common/original/varie/IMG_20220619_135542.jpg","thub1":"/photos/Common/thumbs/varie/IMG_20220619_135542_min.jpg","thub2":"/photos/Common/thumbs/varie/IMG_20220619_135542_avg.jpg","gps":{"lat":46.42841388888888,"lng":11.779830555555556,"alt":2479.488},"data":"2022:06:19 13:55:42","taken_at":"2022-06-19T13:55:42.000Z","mime_type":"image/jpeg","width":2592,"height":4608,"size_bytes":4420172,"mtimeMs":1772610987754.4783,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Trentino – Alto Adige/Südtirol","postcode":"38036","city":"San Giovanni di Fassa - Sèn Jan","county_code":"TN","address":"Sas bianch","timezone":"Europe/Rome","time":"+01:00"}},"e33955f02edb794d1eb27b88b743d9e1e99572ce7170dccdc4532c27da918cf3":{"id":"e33955f02edb794d1eb27b88b743d9e1e99572ce7170dccdc4532c27da918cf3","user":"Common","cartella":"varie","path":"/photos/Common/original/varie/IMG_20220619_135543.jpg","thub1":"/photos/Common/thumbs/varie/IMG_20220619_135543_min.jpg","thub2":"/photos/Common/thumbs/varie/IMG_20220619_135543_avg.jpg","gps":{"lat":46.42841388888888,"lng":11.779830555555556,"alt":2479.756},"data":"2022:06:19 13:55:43","taken_at":"2022-06-19T13:55:43.000Z","mime_type":"image/jpeg","width":2592,"height":4608,"size_bytes":4410362,"mtimeMs":1772610987771.1448,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Trentino – Alto Adige/Südtirol","postcode":"38036","city":"San Giovanni di Fassa - Sèn Jan","county_code":"TN","address":"Sas bianch","timezone":"Europe/Rome","time":"+01:00"}},"5374bc9368c46c441f429e1c636a422630db271d2d349069fed8f15eb2776aa0":{"id":"5374bc9368c46c441f429e1c636a422630db271d2d349069fed8f15eb2776aa0","user":"Common","cartella":"varie","path":"/photos/Common/original/varie/IMG_20220619_135636.jpg","thub1":"/photos/Common/thumbs/varie/IMG_20220619_135636_min.jpg","thub2":"/photos/Common/thumbs/varie/IMG_20220619_135636_avg.jpg","gps":{"lat":46.42834444444444,"lng":11.779872222222224,"alt":2479.633},"data":"2022:06:19 13:56:36","taken_at":"2022-06-19T13:56:36.000Z","mime_type":"image/jpeg","width":2592,"height":4608,"size_bytes":4367012,"mtimeMs":1772610987787.8113,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Trentino – Alto Adige/Südtirol","postcode":"38036","city":"San Giovanni di Fassa - Sèn Jan","county_code":"TN","address":"Sas bianch","timezone":"Europe/Rome","time":"+01:00"}},"a274264553e297f536498da7586b6a99bb86e580d129096fd9f6ea99a482eff8":{"id":"a274264553e297f536498da7586b6a99bb86e580d129096fd9f6ea99a482eff8","user":"Common","cartella":"varie","path":"/photos/Common/original/varie/IMG_20220619_135641.jpg","thub1":"/photos/Common/thumbs/varie/IMG_20220619_135641_min.jpg","thub2":"/photos/Common/thumbs/varie/IMG_20220619_135641_avg.jpg","gps":{"lat":46.42834444444444,"lng":11.779872222222224,"alt":2479.649},"data":"2022:06:19 13:56:41","taken_at":"2022-06-19T13:56:41.000Z","mime_type":"image/jpeg","width":2592,"height":4608,"size_bytes":4473038,"mtimeMs":1772610987794.4778,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Trentino – Alto Adige/Südtirol","postcode":"38036","city":"San Giovanni di Fassa - Sèn Jan","county_code":"TN","address":"Sas bianch","timezone":"Europe/Rome","time":"+01:00"}},"f51b76ab7c9db9c4d06e045483be5d625410f9aa2ae88b56d8bb77ea49e2df06":{"id":"f51b76ab7c9db9c4d06e045483be5d625410f9aa2ae88b56d8bb77ea49e2df06","user":"Common","cartella":"varie","path":"/photos/Common/original/varie/IMG_20220619_135643.jpg","thub1":"/photos/Common/thumbs/varie/IMG_20220619_135643_min.jpg","thub2":"/photos/Common/thumbs/varie/IMG_20220619_135643_avg.jpg","gps":{"lat":46.42834444444444,"lng":11.779872222222224,"alt":2479.655},"data":"2022:06:19 13:56:43","taken_at":"2022-06-19T13:56:43.000Z","mime_type":"image/jpeg","width":2592,"height":4608,"size_bytes":4399341,"mtimeMs":1772610987797.811,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Trentino – Alto Adige/Südtirol","postcode":"38036","city":"San Giovanni di Fassa - Sèn Jan","county_code":"TN","address":"Sas bianch","timezone":"Europe/Rome","time":"+01:00"}},"77ff06a696454bfd14ac01aa4bddebafd753eaab39bb7a341f287edd15fba767":{"id":"77ff06a696454bfd14ac01aa4bddebafd753eaab39bb7a341f287edd15fba767","user":"Common","cartella":"varie","path":"/photos/Common/original/varie/IMG_20220619_135741.jpg","thub1":"/photos/Common/thumbs/varie/IMG_20220619_135741_min.jpg","thub2":"/photos/Common/thumbs/varie/IMG_20220619_135741_avg.jpg","gps":{"lat":46.428275,"lng":11.779930555555556,"alt":2480.511},"data":"2022:06:19 13:57:41","taken_at":"2022-06-19T13:57:41.000Z","mime_type":"image/jpeg","width":2592,"height":4608,"size_bytes":4750412,"mtimeMs":1772610987804.4778,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Trentino – Alto Adige/Südtirol","postcode":"38036","city":"San Giovanni di Fassa - Sèn Jan","county_code":"TN","address":"Sas bianch","timezone":"Europe/Rome","time":"+01:00"}},"1f04a2b21e7b4b583327e0ad5b410c39f33bd1352d0d45fca3106355ab55c4de":{"id":"1f04a2b21e7b4b583327e0ad5b410c39f33bd1352d0d45fca3106355ab55c4de","user":"Common","cartella":"varie","path":"/photos/Common/original/varie/IMG_20220619_135744.jpg","thub1":"/photos/Common/thumbs/varie/IMG_20220619_135744_min.jpg","thub2":"/photos/Common/thumbs/varie/IMG_20220619_135744_avg.jpg","gps":{"lat":46.42827222222222,"lng":11.779936111111112,"alt":2480.213},"data":"2022:06:19 13:57:44","taken_at":"2022-06-19T13:57:44.000Z","mime_type":"image/jpeg","width":2592,"height":4608,"size_bytes":4782460,"mtimeMs":1772610987807.811,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Trentino – Alto Adige/Südtirol","postcode":"38036","city":"San Giovanni di Fassa - Sèn Jan","county_code":"TN","address":"Sas bianch","timezone":"Europe/Rome","time":"+01:00"}},"fda7ccac68d0b155bf0b6239d7566c1c1e05651e3c7a1a33c266e7be50216c1e":{"id":"fda7ccac68d0b155bf0b6239d7566c1c1e05651e3c7a1a33c266e7be50216c1e","user":"Common","cartella":"varie","path":"/photos/Common/original/varie/IMG_20220619_135745.jpg","thub1":"/photos/Common/thumbs/varie/IMG_20220619_135745_min.jpg","thub2":"/photos/Common/thumbs/varie/IMG_20220619_135745_avg.jpg","gps":{"lat":46.42827222222222,"lng":11.779936111111112,"alt":2480.466},"data":"2022:06:19 13:57:45","taken_at":"2022-06-19T13:57:45.000Z","mime_type":"image/jpeg","width":2592,"height":4608,"size_bytes":4749840,"mtimeMs":1772610987814.4775,"duration":null,"location":{"continent":"Europe","country":"Italy","region":"Trentino – Alto Adige/Südtirol","postcode":"38036","city":"San Giovanni di Fassa - Sèn Jan","county_code":"TN","address":"Sas bianch","timezone":"Europe/Rome","time":"+01:00"}}}
\ No newline at end of file
+{"Fabio":{"2017Irlanda19-29ago":{"a108438f4073dbd460157fff35ee00792c4267f7d242601ac9e61478ef850aee":{"id":"a108438f4073dbd460157fff35ee00792c4267f7d242601ac9e61478ef850aee","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0092.JPG","hash":"e05a1b32edf73536a0b757cd9d346703805ca38d265cd1d15662e1c6ba5bdaa6"},"b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e":{"id":"b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0099.JPG","hash":"982c4a2653d0175d33e18947cac266ba9fe91fd5e8db7d6dddf0e312b3ddeddb"},"09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b":{"id":"09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0103.JPG","hash":"a55089b27249cb8f92ba0fe75cb738d5d74b8d54857bef6f321901b0272a8344"},"dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7":{"id":"dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0106.JPG","hash":"ac2bf734619689cbdd690f393fdee70ec849266e5c26a51c63a585a16b5ca457"},"751d8a15766bf2686bc87e60b33b4a8c38befe454428e6a5a82b00f26026c0e0":{"id":"751d8a15766bf2686bc87e60b33b4a8c38befe454428e6a5a82b00f26026c0e0","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0107.JPG","hash":"d68479dd2c17fb12cde188cdb7edb3f9b6eca6581c97033bd9aeaf13fdc0b380"},"73dfd75dd639da9c7c0d4a6244f189a833d543bfdd4059b06f9f98e49f83c937":{"id":"73dfd75dd639da9c7c0d4a6244f189a833d543bfdd4059b06f9f98e49f83c937","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0108.JPG","hash":"9b93462683b6e643ebcaaf6db2d740ab65c466def132bd904484c885ffafbc57"},"f32173d43d16b47eda3e7a32257ec956287d60b0516a5f6e46a8d1d433f53fd8":{"id":"f32173d43d16b47eda3e7a32257ec956287d60b0516a5f6e46a8d1d433f53fd8","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0109.JPG","hash":"61c9c48ebe04677856f8f49013ccd0eb41c008ac3420c3d8acdf71ddbd76762a"},"90c0a0932fdfa3eefb64156dec5b366c4af5245def4cc619d8eee29ca72cd7fe":{"id":"90c0a0932fdfa3eefb64156dec5b366c4af5245def4cc619d8eee29ca72cd7fe","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0110.JPG","hash":"1e5d2d9e12ab612f04e1858182f978d0d2494269d8d7a5f957a35b266b51bd94"},"4d74430aa1fbc45154ad4e8bf43bff334065ebd2757367806d4b8c165c9a7935":{"id":"4d74430aa1fbc45154ad4e8bf43bff334065ebd2757367806d4b8c165c9a7935","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0112.JPG","hash":"e6acae4e1fd8fdf4b4de58c94ebb18ae3d8bc0d090008e51c80cbc4902169599"},"1955c91d411219c131c210b97fe38eb78df83be6ca12cdc845b952bcb78abc6f":{"id":"1955c91d411219c131c210b97fe38eb78df83be6ca12cdc845b952bcb78abc6f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0113.JPG","hash":"9ff6f17fe6978024ae45710033323669381205504b3b31920590a16e65bcbe47"},"14616f6446b0ffc01895f24db1656fa0b7a33da3b9e8c8e24065647faa2138f2":{"id":"14616f6446b0ffc01895f24db1656fa0b7a33da3b9e8c8e24065647faa2138f2","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0114.JPG","hash":"d8f7773411789781ae68f34f6efb066d9b4f46397eeb245c3c1a718222d69bd5"},"7668b4a6cf960b548a0bd1480444a3a039a4ca59d16656d2a1a3ca80a11eaa41":{"id":"7668b4a6cf960b548a0bd1480444a3a039a4ca59d16656d2a1a3ca80a11eaa41","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0116.JPG","hash":"decc1c6c5a71e9d46f1c0c121fab4094336ccdbefc422eb7878fd11b71dc9acb"},"4a10ae72b84c6e205c8295dc1f94b5407d78f25576707fba0f3bb9093e70ce1c":{"id":"4a10ae72b84c6e205c8295dc1f94b5407d78f25576707fba0f3bb9093e70ce1c","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0119.JPG","hash":"c39462dcd0d32381edcf8468caedaed71e13cde269a793c6d08d651843dee000"},"490631b5d03e797f7ca50b5e42be1cdabafd54b20804b51d2c9565aef18de750":{"id":"490631b5d03e797f7ca50b5e42be1cdabafd54b20804b51d2c9565aef18de750","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0120.JPG","hash":"23028eaa17e15124fdc30302e1323bb27c8df14d878ef7d9b2b1619acc574369"},"1a9759607a60387b7ff383fce2fce32f5e5aba91c0b0d3e09c1c2763c40334be":{"id":"1a9759607a60387b7ff383fce2fce32f5e5aba91c0b0d3e09c1c2763c40334be","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0122.JPG","hash":"749e1f188f6ded5e2972c490bb951764e418f06aca4ef691b8896f535cca14f0"},"486d095f85a006800b9d3760e2ef4ac7ba909d82ba1347800a273d99395962a3":{"id":"486d095f85a006800b9d3760e2ef4ac7ba909d82ba1347800a273d99395962a3","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0123.JPG","hash":"680ddff4d2b3707fbd9afd0541d92366945f5bf28a192a8d8e40bdf8085b0890"},"69eb91132640feeb561e94bb3258ca69c41e27ca711cb814c2ac33270599167a":{"id":"69eb91132640feeb561e94bb3258ca69c41e27ca711cb814c2ac33270599167a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0124.JPG","hash":"0bbbbced16965157c2c864bfe02c54e02bf492897241df0f9a7b6bc4959b2564"},"1da97cbc6e7914cbd33e4dbd51729cd45f1c77116c1f5be9531adeb6424eb6e2":{"id":"1da97cbc6e7914cbd33e4dbd51729cd45f1c77116c1f5be9531adeb6424eb6e2","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0125.JPG","hash":"66e533fe893f74a64a0e8096e1e08d104b86e03760f5ae2534775057a156d8cd"},"7fbc8546424236f94107681a69ed37fa94159377cf378a44f9d0e907a2afd31a":{"id":"7fbc8546424236f94107681a69ed37fa94159377cf378a44f9d0e907a2afd31a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0126.JPG","hash":"c4b13a53521724f6aef414261b4966369663de0a770f8acc99fea089ed83c7ba"},"35772196ab28b9fd957199f81b267c9b99097055bfdcf1749e0c772241681cac":{"id":"35772196ab28b9fd957199f81b267c9b99097055bfdcf1749e0c772241681cac","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0133.JPG","hash":"27b00db3b95fc0ac97f4bc3a51b023916e764c055577ce47698e881ae41fd421"},"48b26b6f9aaf835dd90e6098194dedfbee75b85c20429d939188e70873dd4274":{"id":"48b26b6f9aaf835dd90e6098194dedfbee75b85c20429d939188e70873dd4274","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0134.JPG","hash":"1ff7c57c2022c792fd4ece53ba9c1b22e48e1e9fea31865613ac28fc991f910c"},"10ca45bc5aab42b5ba08da7d6a15d7f942478ca5e052f89054097c93d3dd6134":{"id":"10ca45bc5aab42b5ba08da7d6a15d7f942478ca5e052f89054097c93d3dd6134","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0135.JPG","hash":"f1ce6899b5bd91e48b71b0ed4cd8c144066eda75ef122b8d1d422f276bd364ba"},"c6b58236822fab393b8793af2991115182afaf13b26a27394c4d5d6a799d0969":{"id":"c6b58236822fab393b8793af2991115182afaf13b26a27394c4d5d6a799d0969","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0136.JPG","hash":"b381a3bf398a5b2b5c03475bf2c2f6f1d1e2b97201179143f5991940e18132d7"},"1d4945502b8686c4f4dc3ea94bfb37db7587d505e6c411bdf11976402c000e90":{"id":"1d4945502b8686c4f4dc3ea94bfb37db7587d505e6c411bdf11976402c000e90","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0137.JPG","hash":"add727d1d7a2b74d9216b442ebe3cb73bb17703b92a1ab4394396d473e5869d3"},"bf2f60a20771c3647d605a7cc192b95a7e078b7c6530ad30462ee6a2794c9df0":{"id":"bf2f60a20771c3647d605a7cc192b95a7e078b7c6530ad30462ee6a2794c9df0","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0138.JPG","hash":"db1c8ad6e637723be76360218ac2078131d32500daf2019bf0dffaa80568ad27"},"7d753539885cd882a1fdf04241eda6bfb8332ba1ed32bfc078dbadb3e5eb321f":{"id":"7d753539885cd882a1fdf04241eda6bfb8332ba1ed32bfc078dbadb3e5eb321f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0139.JPG","hash":"116e108ed80752d839b81187a7fc90fe7226d1d57f33e38565b1a5a2dcdb1857"},"29eb6ed3cd8e3d85e0803d091291b75677e6de2702918a286047894e444d669b":{"id":"29eb6ed3cd8e3d85e0803d091291b75677e6de2702918a286047894e444d669b","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0140.JPG","hash":"4ada8933df1a0f3fc5dbde8f3b43785e2235ca7f918a671779cbcf62735d131d"},"ebaf024e4df7764c2c458484d6e6eef1ced76611dd70b84f82af46337ba13839":{"id":"ebaf024e4df7764c2c458484d6e6eef1ced76611dd70b84f82af46337ba13839","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0141.JPG","hash":"c292582e6ccebb4867652a366032b8ec55df65cb118eb4f29df2004152e9f667"},"c782108a839231c6dda63924f0b855747f98a4f56d8e93390f70877d4a452db6":{"id":"c782108a839231c6dda63924f0b855747f98a4f56d8e93390f70877d4a452db6","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0143.JPG","hash":"448cf05efd6092226853c135c92bc7c90483625320c450cd73584dd3caeb15e2"},"f56db1595a3b822e1e5cc119c101904285dca3f3f1b8edbf0bfa42999583cc2f":{"id":"f56db1595a3b822e1e5cc119c101904285dca3f3f1b8edbf0bfa42999583cc2f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0145.JPG","hash":"2bb5ac348f20a481f068eb18f230afd0d8c358d2df66df31c8ff061925e2ecf5"},"5d03b5d0866a5cce0b6a12b78173c1f77eef5b1e5bfc5a4fd8e2cfd1c53a2b8e":{"id":"5d03b5d0866a5cce0b6a12b78173c1f77eef5b1e5bfc5a4fd8e2cfd1c53a2b8e","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0146.JPG","hash":"a9db3cf53fa474aae6681678e6289c43395b69874f499f8e1fd58773913628d5"},"dd715de9995fd11a23fee1df7c1561ea45bd215e765e9e93b2efc3f2ca59c39c":{"id":"dd715de9995fd11a23fee1df7c1561ea45bd215e765e9e93b2efc3f2ca59c39c","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0147.JPG","hash":"e20c62641bab126f43808e184cc3ebf329c53f76be51b630291c5297b30cb315"},"8e1a2d2abbd36803ec8670f56869ae723c4c8c8fcd5e634ada9f988c942df1b8":{"id":"8e1a2d2abbd36803ec8670f56869ae723c4c8c8fcd5e634ada9f988c942df1b8","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0148.JPG","hash":"a201d37e96d26fda6421a4c0b54fb39cbc9d4396a206057d030f6c539fe3e04e"},"46412728d6155abe53abfec76c97898aad60e36322a46f4a4da280fba8c7c0cc":{"id":"46412728d6155abe53abfec76c97898aad60e36322a46f4a4da280fba8c7c0cc","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0149.JPG","hash":"969037179d4958d865494f8aec957a07e31c5eef3a61eb5a4365d7bb1d6212d3"},"999cc0997f51584fef2627c5c9bd87d2f41cd9fe52d930fdc85f791c6adc328e":{"id":"999cc0997f51584fef2627c5c9bd87d2f41cd9fe52d930fdc85f791c6adc328e","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0150.JPG","hash":"fe8dd10cf28ff7b87fe46295203c7afc8499315ae21b25eb2bf154669d36c3ea"},"7ed0d6366274f3cadfc4caa618847c9c6c250e6b55127367d4ad1e3ca8322436":{"id":"7ed0d6366274f3cadfc4caa618847c9c6c250e6b55127367d4ad1e3ca8322436","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0152.JPG","hash":"5712736d0840be6e3472062b05149775404482730a37f0a1a55ad2274cfc697c"},"4025ea19107cf40d092576e4aaa122bdfb027dc90592a50dd6fa8131838dae69":{"id":"4025ea19107cf40d092576e4aaa122bdfb027dc90592a50dd6fa8131838dae69","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0153.JPG","hash":"a420e3054b466d1fcbb3275ba6105b67303163fc9e42fdb4a54bed056bdc0edd"},"d91b81a39d72056b2b7eb5bbf6058cf5b5df85cd5d9ca7e2a1bc7e9b897ebfb4":{"id":"d91b81a39d72056b2b7eb5bbf6058cf5b5df85cd5d9ca7e2a1bc7e9b897ebfb4","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0154.JPG","hash":"f3411b86b280e4bfd41741fd856ca03aa6d21cf034cbf97e69ed786d5dd7f07b"},"49a2098503bd07db18c869b17419352a0a2232389b3cad98cbb013ad42882600":{"id":"49a2098503bd07db18c869b17419352a0a2232389b3cad98cbb013ad42882600","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0155.JPG","hash":"2cef6d8e4bbed63a8f0867b59f20bb307dac46e6d31ac9871ab17c2b96493be8"},"a856fcea4cade1ed9c59dab96f180c06f18bc97a39654301ad623aed4a4979d7":{"id":"a856fcea4cade1ed9c59dab96f180c06f18bc97a39654301ad623aed4a4979d7","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0156.JPG","hash":"d31b84426c08f16b5fc0046093a90bcb021e8ff3bdc619c1be1da1d6f7d7f7b5"},"fd3df96d42b300c66332b98ce7639a79ae07aa0cbadf6ebbd283901bcca510c6":{"id":"fd3df96d42b300c66332b98ce7639a79ae07aa0cbadf6ebbd283901bcca510c6","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0157.JPG","hash":"9ce475230ef84789bc111450446b0fa5e9e11a574f6d2d18da2c6c5cb0d73468"},"c8ada02d1e1b7155607e905de25546c0a079c39528fe6df0b601a9c7b5f5df93":{"id":"c8ada02d1e1b7155607e905de25546c0a079c39528fe6df0b601a9c7b5f5df93","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0160.JPG","hash":"69bb9a587f51c858b428967f25209f598f14d90e107a532a9874c413906a5876"},"7351a37b3092015b6dee6e2911581ce590043619497ca84240b71e5ee37a0d2d":{"id":"7351a37b3092015b6dee6e2911581ce590043619497ca84240b71e5ee37a0d2d","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0162.JPG","hash":"d48d6a17e9a1a0cd8e4dcc7a0e66b7543daf4240f62f7865474001065fb4e219"},"23852fb024f46c21667b30107942c40d57429b37c0df1549ab32004a739d792f":{"id":"23852fb024f46c21667b30107942c40d57429b37c0df1549ab32004a739d792f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0163.JPG","hash":"7ff10b3437ffb0bbb116363fd35ad3ab04a60c9bbf15a3927a55511739643ddb"},"0ed7a1b65e9181db517fc4b75dcb3c8f398b7c3cd880ebc6d345886d070dc843":{"id":"0ed7a1b65e9181db517fc4b75dcb3c8f398b7c3cd880ebc6d345886d070dc843","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0164.JPG","hash":"2800393ad77ada9667bdad9415a052bf5933abd3cdbef886c1cf5e57b85506b0"},"64ec16ebc0611619d7c397453119ffe1f80f211b7bc9c428f65f8d761c6aa61f":{"id":"64ec16ebc0611619d7c397453119ffe1f80f211b7bc9c428f65f8d761c6aa61f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0165.JPG","hash":"dfe229435ffe67d7d3f6b9d00713240fb45a4fad49ddd47a3a4f7cc41810c76c"},"8fa73c5ac88c878b12ec926377f54e4d01187d92cc150730c514284d34581b39":{"id":"8fa73c5ac88c878b12ec926377f54e4d01187d92cc150730c514284d34581b39","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0166.JPG","hash":"da44eb465b92c3db526f8254ec871bc9e7ce358212d6381f7c139a623025d50a"},"ddab26bedbe3287cb210d46a2397336f879655c99224f90f8da1646ee111fee8":{"id":"ddab26bedbe3287cb210d46a2397336f879655c99224f90f8da1646ee111fee8","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0167.JPG","hash":"687d19c9c925852c9ab34d43af38d0f82829679ad9659bffb693010d4be1660f"},"a07cfd0dfca3d9377ea2f4fea5501c6403f90f4a42a5732bde8b5d31214a2a7a":{"id":"a07cfd0dfca3d9377ea2f4fea5501c6403f90f4a42a5732bde8b5d31214a2a7a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0170.JPG","hash":"afeb6b097a8771c6a74e1f69ba30dd9a722c6c6c03c505dc0cd6d9f2d0d8976b"},"7a9382798ebaa67e80804165044390a2fded193ec5aa9753e75b62d9d54ce39a":{"id":"7a9382798ebaa67e80804165044390a2fded193ec5aa9753e75b62d9d54ce39a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0171.JPG","hash":"500377d308eb301aa315245d1814d5f6c25dcd570bbdeac9572232321df227da"},"9e8eb4959ed23f9dc3f8722bca1c5dd5a13ff7a6b95a0f0bf8df430d0e2ee9c3":{"id":"9e8eb4959ed23f9dc3f8722bca1c5dd5a13ff7a6b95a0f0bf8df430d0e2ee9c3","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0172.JPG","hash":"effb0ae68ad44775d4d612ecb306dc3a3544c71135c37c08346a5632e91a0894"},"df20d33dc73c45e9832c4a83fa5e4fd625c58518dfab5e3465d55959539cf57a":{"id":"df20d33dc73c45e9832c4a83fa5e4fd625c58518dfab5e3465d55959539cf57a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0174.JPG","hash":"84776c261e8cfd1e237a62e026434a11a827e70f42f22eb24f16bee0e95efdd7"},"f46da4f2e78a8428eda4ea3a0363878cd50dd1d4b3798e4c858a34a217cc53d6":{"id":"f46da4f2e78a8428eda4ea3a0363878cd50dd1d4b3798e4c858a34a217cc53d6","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0175.JPG","hash":"59503bef6d33720a07eb213e10ddd92331f49d8577c47d46e945f2c41874f6a7"},"68c6d643cbe16143e9255bd3c84576e943b60412d506c090f4a7b93de3e9fd56":{"id":"68c6d643cbe16143e9255bd3c84576e943b60412d506c090f4a7b93de3e9fd56","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0176.JPG","hash":"5a07f6bc04e3d2c73191dc7ddab56ec6abd9c79ddcba7fcee47ba22153066470"},"6b4d4396b06a0513b53fa9d088c1a95bbfacb99ede015addb9e34ad973fd77f4":{"id":"6b4d4396b06a0513b53fa9d088c1a95bbfacb99ede015addb9e34ad973fd77f4","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0177.JPG","hash":"2c2ffc54d07b32858677169f4053191d6bfe50e80b2c7e7a36efaa64ec7d7649"},"dc17f07d88bdd90f4e439911484a2a31f91acb15fcb1201115f16157eec70e66":{"id":"dc17f07d88bdd90f4e439911484a2a31f91acb15fcb1201115f16157eec70e66","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0178.JPG","hash":"b0604c2b5a3bc1d9189876fd2ce3a24cbd67b1b0ac3dca0e180b17cc3c65dd8d"},"4f041976518502b14f0520489ac932cfd3f9e4e9226e38b09b483327b34ad3bf":{"id":"4f041976518502b14f0520489ac932cfd3f9e4e9226e38b09b483327b34ad3bf","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0179.JPG","hash":"864224ffcdab714832a3579110e4f8129a9e07dae68b65f4a8424bc3679060cc"},"4a125c9271159191ab923bc14fb5398d08aef6ee5ba313a2f6b1599a52e4e0cc":{"id":"4a125c9271159191ab923bc14fb5398d08aef6ee5ba313a2f6b1599a52e4e0cc","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0180.JPG","hash":"9291192d45aa9d316f6095446172c7e6bd1b4842b40e412e85a4557fb50aadb1"},"0bd35f8c46fa2ec4979d977d13bab6b8e0dc18365a0f25a7d87d81c5336c0378":{"id":"0bd35f8c46fa2ec4979d977d13bab6b8e0dc18365a0f25a7d87d81c5336c0378","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0182.JPG","hash":"d0a08919b2db5db51edaacb2294c9076a3ac336da90eeefee991faee07d5f5f3"},"4065f86b9af59235a5727abaaccb54a9a91fa585b464da2c592db5ed300d8836":{"id":"4065f86b9af59235a5727abaaccb54a9a91fa585b464da2c592db5ed300d8836","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0183.JPG","hash":"6586fdbce995141f03995e1acaefb99def76947c004f5f7cfb71f3da439252a3"},"76ea19c9ae626658b75942ad3fb9cf4caae2b2a4b845103dac42c006a3af3984":{"id":"76ea19c9ae626658b75942ad3fb9cf4caae2b2a4b845103dac42c006a3af3984","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0185.JPG","hash":"b837f3057a70853287ae2d23a122bb54adc935633911b94aba1e91654fcbd2ff"},"065a80861c5452dd07586b786aad63e9d74a822cbf10913201658c54023e63cd":{"id":"065a80861c5452dd07586b786aad63e9d74a822cbf10913201658c54023e63cd","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0188.JPG","hash":"894b51914ad0aad2e8a5a1aac61eb679d8ac3d4007d49917e3911b81a4ae0430"},"e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed":{"id":"e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0190.JPG","hash":"0ad21ea56dc34ac6a2b6bd5f3920d9d21f18993c1ceeeb0bb05adbc6ce7d0194"},"c584bb41bc73b6b452c6964622ea7e4ccfddc741ed6e1d3757ed6015b59cf65f":{"id":"c584bb41bc73b6b452c6964622ea7e4ccfddc741ed6e1d3757ed6015b59cf65f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0193.JPG","hash":"05cdb489932466f70350a08f0767516f6b1b37ed0148f313acbbbd8add062e5b"},"77b822134129d751070d73441dda90996dab21186c50be2ce79064e22bba94bd":{"id":"77b822134129d751070d73441dda90996dab21186c50be2ce79064e22bba94bd","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0203.JPG","hash":"bf06caf3326caa654e7bc54e74ba690eb30c0699567f79b5f930629d45907bfa"},"be834d7663441134af0e4fc6619b1c3ae06b5ce0856beac123ac6972c5b270d7":{"id":"be834d7663441134af0e4fc6619b1c3ae06b5ce0856beac123ac6972c5b270d7","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0204.JPG","hash":"c89538c3c5a267c6baa266608827dd81bc77c32cbbdfb4d32454e6344b8e89dc"},"6750d21dec9eb3436ce6c821b40e344ef0fb280e43081cbc5e584310711417b7":{"id":"6750d21dec9eb3436ce6c821b40e344ef0fb280e43081cbc5e584310711417b7","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0206.JPG","hash":"968ca907c57cf9376594319ad8b3d4ce0314b5981ea2540aff3873e4dff4bc46"},"ea8ae33ca15f21e84d75f5b853a88ca78d722b4f461478bdccfa9c059f6b69db":{"id":"ea8ae33ca15f21e84d75f5b853a88ca78d722b4f461478bdccfa9c059f6b69db","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0207.JPG","hash":"942a338992fa0436595deafec35dd102e09af18580f97db7e0869e3d9cdd972f"},"3be962052af0da265a1bd9cb69ed6868798f47343a2e1dc774c77568c20139bf":{"id":"3be962052af0da265a1bd9cb69ed6868798f47343a2e1dc774c77568c20139bf","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0208.JPG","hash":"53981d120464b050f9df21a4fff19a9d4998a20a848288155d570aafc46323d7"},"3041f044b86b8888937659a1c691db34f0c8b52b6dec6a7db023c18e9cd24722":{"id":"3041f044b86b8888937659a1c691db34f0c8b52b6dec6a7db023c18e9cd24722","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0209.JPG","hash":"dbe5ed2815e1077c1d3a4710af75ef4741a4e0ebdf1021d05990bd8193527a5b"},"50c16b24a37a6d76da00bc64b0a6f96ae858ba386dd5750ce0187a7cc3402027":{"id":"50c16b24a37a6d76da00bc64b0a6f96ae858ba386dd5750ce0187a7cc3402027","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0211.JPG","hash":"67342193fc3a1f48762b5dcb8d6ae17bb0ebc663d10f55ec50bcfe9b77be4de7"},"df606e3b1a55f9f2c90e333bd113a0af2beb83a319aac9619b5b9cd729b13b0e":{"id":"df606e3b1a55f9f2c90e333bd113a0af2beb83a319aac9619b5b9cd729b13b0e","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0212.JPG","hash":"602c260b9152b95f0cc85bdbe4f30c735f52146715b841b4d96ad848af5676d6"},"2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070":{"id":"2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0214.JPG","hash":"855faa145cf1cbf0ed9b99e675f7922a360d4ba51e6c6e4b45ba9a43a3d8ddc4"},"bc0155f7235dc0ede6921f43debb8ebe8ca44fb1db57447d26a63f6904f38bba":{"id":"bc0155f7235dc0ede6921f43debb8ebe8ca44fb1db57447d26a63f6904f38bba","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0215.JPG","hash":"6cde9916fd7f4c3b4c1875f9f3b3859824cc2ad5d77e34bbc02fa8ba1c3c426d"},"a99f57f0bea2cb9b6caf3d0e60c3719e379d3d5bc2bbe37d1044c764214dd0b9":{"id":"a99f57f0bea2cb9b6caf3d0e60c3719e379d3d5bc2bbe37d1044c764214dd0b9","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0216.JPG","hash":"5ac06e6cba1e4476c1d3cde9be23dd6cfc38c39eca7049a50082f6d6e84a879b"},"915492fbf9fc1769985e4f5684d42728b5ee63092b148b887c6d07d1fb66fe8f":{"id":"915492fbf9fc1769985e4f5684d42728b5ee63092b148b887c6d07d1fb66fe8f","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0217.JPG","hash":"f9d2ae4f2818d2a9581f838685756cbf5f8135e40d2a4890f774508160b94ad5"},"0c2e99aa7c89c4a124019241d0131a03877d49bef2e409be8421b93d0f15ed82":{"id":"0c2e99aa7c89c4a124019241d0131a03877d49bef2e409be8421b93d0f15ed82","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0218.JPG","hash":"554b7ecac786f1213d4e2d2109b42d39b0de67e823f969a32c89b58ed85e042f"},"a80cdc2fe8bfed0bddc25931f17f5f263ea273cca34558d9e190effa5fcc7bc9":{"id":"a80cdc2fe8bfed0bddc25931f17f5f263ea273cca34558d9e190effa5fcc7bc9","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0223.JPG","hash":"070e2f63d0a617fb351f63249f66fdab6a4d256f3abe66b3220d925c0933520b"},"308808d70076dd738c2d8d7703332dd000fb5592084ff292e2e7d2e43cac75df":{"id":"308808d70076dd738c2d8d7703332dd000fb5592084ff292e2e7d2e43cac75df","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0227.JPG","hash":"bcf54758529e0e2c91bde0dfee540db2674ce8c7f840339e592f91342400f0f7"},"20bdd8d0c71b2e1b6a55586e2def4db18152371efbd966b98f055ba340bf471a":{"id":"20bdd8d0c71b2e1b6a55586e2def4db18152371efbd966b98f055ba340bf471a","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0228.JPG","hash":"c2163e08874bd99547eac1431a81a7afaf901deea88b17c6140dc87858468a81"},"37df228c1e983e94e3abea8800b04660e647034fca4948ef45ed6ec69d468687":{"id":"37df228c1e983e94e3abea8800b04660e647034fca4948ef45ed6ec69d468687","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0229.JPG","hash":"3814eeca2a30e67236a77fa5a8fbe08f248c9dcb5fe3f45412a8476a2f9ed2c3"},"1a4313d5086018efcd689dbca06040d99a75f7b331798b0fa2ced0d25dea95b7":{"id":"1a4313d5086018efcd689dbca06040d99a75f7b331798b0fa2ced0d25dea95b7","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0232.JPG","hash":"f73e7d3a299f266831bc744380b9a24c6355c0eec067e628d4e0071e7b750da1"},"6ab20a650288559438d81881ade44773873472c54d4d8cbbe69aaf2337c9d92b":{"id":"6ab20a650288559438d81881ade44773873472c54d4d8cbbe69aaf2337c9d92b","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0233.JPG","hash":"1de5d6d77747ff83c1c03cff5eb3414d228a676b01261f541665e6c6ccfb4d93"},"6cf111099d98f97b09cf7a397d9ef6c849693e8273bf6026e0af0f257c0240bc":{"id":"6cf111099d98f97b09cf7a397d9ef6c849693e8273bf6026e0af0f257c0240bc","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0234.JPG","hash":"3973b3311b27b63f56ad41b0ab43508f42f781ff696dd4252f966388fed2168a"},"e830691975e126ad19891ea10585409a551791e8d0e8c6eda7e9d5e7878ce6a2":{"id":"e830691975e126ad19891ea10585409a551791e8d0e8c6eda7e9d5e7878ce6a2","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0235.JPG","hash":"a3a7393adef54e2897595d2a6703400db2b017a6fd758379fa84d9060fd7c8e2"},"9fabc411f90e2a1452f4880b21ee6cdfb14c1274ce8c7a9a23c30444f07b370b":{"id":"9fabc411f90e2a1452f4880b21ee6cdfb14c1274ce8c7a9a23c30444f07b370b","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0237.JPG","hash":"0ad0204701f0be662ccf7901c3b670180cd04adc91c701de5dbfd002f0daf96d"},"3846bf7e160007e43c6de5a612b3384ad4235276b7ac86284fd2a7e45a3b0a27":{"id":"3846bf7e160007e43c6de5a612b3384ad4235276b7ac86284fd2a7e45a3b0a27","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0241.JPG","hash":"71f712979c095e392c4fe0fee2f245396bb1edab0e3b60d5d9d8bc25463b7f07"},"b4fec8470cd605882c09ec97558d3a737d25a43488adfb903c3573f8b1fb5ebc":{"id":"b4fec8470cd605882c09ec97558d3a737d25a43488adfb903c3573f8b1fb5ebc","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0242.JPG","hash":"f64a77cecba622793fc3a4e3f7c9cafcc302bb79d8ac0ab13db8e82cf8807682"},"b864196e118aa2b40142438c2e28df587c53fb27e6d4e24fa9b98a00cecccdc9":{"id":"b864196e118aa2b40142438c2e28df587c53fb27e6d4e24fa9b98a00cecccdc9","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0243.JPG","hash":"eec33ef604dfef63bc64037cbbf9e9ff6f0e59fa603c19e10aa33d835baae41e"},"b1f9d25d6d7217c01a3a67f59176d54ce73b1bb626a687d1447a5354e5cad020":{"id":"b1f9d25d6d7217c01a3a67f59176d54ce73b1bb626a687d1447a5354e5cad020","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0244.JPG","hash":"205787d22ee2a5f8da5419ccf26c1a7bd1a5437c4f09d76b24b9a56170ba27f2"},"e9549aa2bb21ad70ff35ad1626cf15f6cb62a321e25e3e7ab832bd9e7430e186":{"id":"e9549aa2bb21ad70ff35ad1626cf15f6cb62a321e25e3e7ab832bd9e7430e186","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0245.JPG","hash":"ab102dd194024136abd73f3254c1713685c75208eb812fa57f8f06bb23e90bc0"},"b8013a96d80b1a6c3b39384f0910ff1f4507fcbf6936b90472d066f75772e751":{"id":"b8013a96d80b1a6c3b39384f0910ff1f4507fcbf6936b90472d066f75772e751","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0246.JPG","hash":"c4effdb728c9a750106014beaafeb5559b3a34fcc20413095856377fec9feb70"},"d32b08d40cee22365e0193a7372cf85e997501d1e5e6d67b80aaddd569ee7030":{"id":"d32b08d40cee22365e0193a7372cf85e997501d1e5e6d67b80aaddd569ee7030","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0247.JPG","hash":"58a98b6f1be4b401b9dea5030cde1b1df7eff9d4137cf3c14a651e04ff92e576"},"0402bf83d35731c94314d6333cea4350e725209307a45fe6fe548ae04bf2e763":{"id":"0402bf83d35731c94314d6333cea4350e725209307a45fe6fe548ae04bf2e763","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0248.JPG","hash":"3cca4539ede8566a174c0db1821525e4760d425e6498a04b6fccf75312194af3"},"10e4a1c655829f11ad8f465cfc1e105e7430b9c0bf36f5589624cd5932c50457":{"id":"10e4a1c655829f11ad8f465cfc1e105e7430b9c0bf36f5589624cd5932c50457","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_0249.JPG","hash":"3142f2037b8416be9a4f00ef6158fc08b29aa8af184d1f1209bec3b1bd4f9241"},"a570da3c838dfd9f3035b658b8d7e873baf6399cf5d39674b37fb4ae4961879e":{"id":"a570da3c838dfd9f3035b658b8d7e873baf6399cf5d39674b37fb4ae4961879e","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_20210602_100637.jpg","hash":"3185d10449076758ffa8f53ef04586b92d0f1f7ae8657d09fa1c7bc85df4808a"},"283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1":{"id":"283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135543.jpg","hash":"d2def19e32419e9abcc433f1e68df596525735241973e102bdabebf0b91ce4fd"},"11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1":{"id":"11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135641.jpg","hash":"fde776b1421f975cd6610712a2dbc27fab2b4cbdc4d11163c6b78d8bf9573fc0"},"f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488":{"id":"f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135745.jpg","hash":"24ecfff40978cc000c0b8e077eb8d88f962b5ac40699f920c30b7e0d4989f298"},"e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1":{"id":"e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/VID_20260221_095917.mp4","hash":"a5ce9fadccb28321f8c2d6ad36f66d508b2953e3f037375e4a107f2fdc264734"},"5c59ae9398c232eaa2f9e472df32691eb55b335bf07eb4e873d374b4144dbc72":{"id":"5c59ae9398c232eaa2f9e472df32691eb55b335bf07eb4e873d374b4144dbc72","user":"Fabio","cartella":"2017Irlanda19-29ago","path":"/photos/Fabio/original/2017Irlanda19-29ago/IMG_20210602_173903.jpg","hash":"8845eb9827d36576c133b221687b414f08ca250608450fd0e9c4413f08f64d8f"}}}}
\ No newline at end of file