From b2ebc2d8f82d1d683f156b40717ee931a2078e62 Mon Sep 17 00:00:00 2001 From: chinonso098 Date: Wed, 4 Sep 2024 07:27:26 -0400 Subject: [PATCH] file services refactor --- index.json | 1 + package-lock.json | 158 ++++- package.json | 4 +- src/app/shared/system-service/file.service.ts | 555 +++++++----------- .../system-apps/terminal/terminal.commands.ts | 3 +- 5 files changed, 353 insertions(+), 368 deletions(-) create mode 100644 index.json diff --git a/index.json b/index.json new file mode 100644 index 00000000..8c5d76d1 --- /dev/null +++ b/index.json @@ -0,0 +1 @@ +{"version":1,"entries":{"/Desktop/fileexplorer.url":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158117,"size":149,"blocks":8,"atimeMs":1722520950022.816,"mtimeMs":1722482956053.0615,"ctimeMs":1722482956053.0615,"birthtimeMs":1722471464438.2598,"atime":"2024-08-01T14:02:30.023Z","mtime":"2024-08-01T03:29:16.053Z","ctime":"2024-08-01T03:29:16.053Z","birthtime":"2024-08-01T00:17:44.438Z"},"/Desktop/heat.url":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158118,"size":143,"blocks":8,"atimeMs":1722520949505.4397,"mtimeMs":1722478073201.2432,"ctimeMs":1722478073201.2432,"birthtimeMs":1722471464438.3376,"atime":"2024-08-01T14:02:29.505Z","mtime":"2024-08-01T02:07:53.201Z","ctime":"2024-08-01T02:07:53.201Z","birthtime":"2024-08-01T00:17:44.438Z"},"/Desktop/hello.url":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158119,"size":125,"blocks":8,"atimeMs":1722520950032.0552,"mtimeMs":1722485481995.3804,"ctimeMs":1722485481995.3804,"birthtimeMs":1722471464438.403,"atime":"2024-08-01T14:02:30.032Z","mtime":"2024-08-01T04:11:21.995Z","ctime":"2024-08-01T04:11:21.995Z","birthtime":"2024-08-01T00:17:44.438Z"},"/Desktop/surfs.url":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158120,"size":150,"blocks":8,"atimeMs":1722520950038.7212,"mtimeMs":1722478084166.0422,"ctimeMs":1722478084166.0422,"birthtimeMs":1722471464438.466,"atime":"2024-08-01T14:02:30.039Z","mtime":"2024-08-01T02:08:04.166Z","ctime":"2024-08-01T02:08:04.166Z","birthtime":"2024-08-01T00:17:44.438Z"},"/Desktop/taskmanager.url":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158121,"size":140,"blocks":8,"atimeMs":1722520949512.6328,"mtimeMs":1722478088609.324,"ctimeMs":1722478088609.324,"birthtimeMs":1722471464438.6108,"atime":"2024-08-01T14:02:29.513Z","mtime":"2024-08-01T02:08:08.609Z","ctime":"2024-08-01T02:08:08.609Z","birthtime":"2024-08-01T00:17:44.439Z"},"/Desktop/terminal.url":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158122,"size":130,"blocks":8,"atimeMs":1722520949545.3928,"mtimeMs":1722478108978.9082,"ctimeMs":1722478108978.9082,"birthtimeMs":1722471464438.8142,"atime":"2024-08-01T14:02:29.545Z","mtime":"2024-08-01T02:08:28.979Z","ctime":"2024-08-01T02:08:28.979Z","birthtime":"2024-08-01T00:17:44.439Z"},"/Desktop/titanium.url":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158123,"size":150,"blocks":8,"atimeMs":1722520949516.5422,"mtimeMs":1722478117393.663,"ctimeMs":1722478117393.663,"birthtimeMs":1722471464438.9204,"atime":"2024-08-01T14:02:29.517Z","mtime":"2024-08-01T02:08:37.394Z","ctime":"2024-08-01T02:08:37.394Z","birthtime":"2024-08-01T00:17:44.439Z"},"/Desktop":{"dev":16777231,"mode":16877,"nlink":9,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158116,"size":288,"blocks":0,"atimeMs":1722471465298.2605,"mtimeMs":1722471464438.9233,"ctimeMs":1722471464438.9233,"birthtimeMs":1722471464438.2104,"atime":"2024-08-01T00:17:45.298Z","mtime":"2024-08-01T00:17:44.439Z","ctime":"2024-08-01T00:17:44.439Z","birthtime":"2024-08-01T00:17:44.438Z"},"/Documents/Credits.md":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158124,"size":1772,"blocks":8,"atimeMs":1722471472688.5298,"mtimeMs":1722471464439.2107,"ctimeMs":1722471464439.2107,"birthtimeMs":1722471464438.9985,"atime":"2024-08-01T00:17:52.689Z","mtime":"2024-08-01T00:17:44.439Z","ctime":"2024-08-01T00:17:44.439Z","birthtime":"2024-08-01T00:17:44.439Z"},"/Documents/Dynamic Programming.txt":{"dev":16777231,"mode":33261,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230169,"size":7675,"blocks":16,"atimeMs":1725416781696.319,"mtimeMs":1725416780822.8413,"ctimeMs":1725416780822.8413,"birthtimeMs":1725416780822.5156,"atime":"2024-09-04T02:26:21.696Z","mtime":"2024-09-04T02:26:20.823Z","ctime":"2024-09-04T02:26:20.823Z","birthtime":"2024-09-04T02:26:20.823Z"},"/Documents/PDFs/CyberPower_UM_EC650LCD 2.pdf":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230171,"size":236767,"blocks":464,"atimeMs":1725417146092.5073,"mtimeMs":1725416780824.312,"ctimeMs":1725416780824.312,"birthtimeMs":1725416780822.924,"atime":"2024-09-04T02:32:26.093Z","mtime":"2024-09-04T02:26:20.824Z","ctime":"2024-09-04T02:26:20.824Z","birthtime":"2024-09-04T02:26:20.823Z"},"/Documents/PDFs/MotherBoard/PRO-B650-P-WIFI.pdf":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230173,"size":767515,"blocks":1504,"atimeMs":1725417146092.636,"mtimeMs":1725416780829.3984,"ctimeMs":1725416780829.3984,"birthtimeMs":1725416780824.4165,"atime":"2024-09-04T02:32:26.093Z","mtime":"2024-09-04T02:26:20.829Z","ctime":"2024-09-04T02:26:20.829Z","birthtime":"2024-09-04T02:26:20.824Z"},"/Documents/PDFs/MotherBoard":{"dev":16777231,"mode":16877,"nlink":3,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230172,"size":96,"blocks":0,"atimeMs":1725416780938.8828,"mtimeMs":1725416780824.4226,"ctimeMs":1725416780824.4226,"birthtimeMs":1725416780824.3655,"atime":"2024-09-04T02:26:20.939Z","mtime":"2024-09-04T02:26:20.824Z","ctime":"2024-09-04T02:26:20.824Z","birthtime":"2024-09-04T02:26:20.824Z"},"/Documents/PDFs":{"dev":16777231,"mode":16877,"nlink":4,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230170,"size":128,"blocks":0,"atimeMs":1725416780938.7405,"mtimeMs":1725416780824.37,"ctimeMs":1725416780824.37,"birthtimeMs":1725416780822.872,"atime":"2024-09-04T02:26:20.939Z","mtime":"2024-09-04T02:26:20.824Z","ctime":"2024-09-04T02:26:20.824Z","birthtime":"2024-09-04T02:26:20.823Z"},"/Documents/Screen-Shots/Sample ScreenShot.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230175,"size":1892916,"blocks":3704,"atimeMs":1725417146093.069,"mtimeMs":1725416780834.3596,"ctimeMs":1725416780834.3596,"birthtimeMs":1725416780829.4856,"atime":"2024-09-04T02:32:26.093Z","mtime":"2024-09-04T02:26:20.834Z","ctime":"2024-09-04T02:26:20.834Z","birthtime":"2024-09-04T02:26:20.829Z"},"/Documents/Screen-Shots":{"dev":16777231,"mode":16877,"nlink":3,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230174,"size":96,"blocks":0,"atimeMs":1725416780939.2776,"mtimeMs":1725416780829.492,"ctimeMs":1725416780829.492,"birthtimeMs":1725416780829.447,"atime":"2024-09-04T02:26:20.939Z","mtime":"2024-09-04T02:26:20.829Z","ctime":"2024-09-04T02:26:20.829Z","birthtime":"2024-09-04T02:26:20.829Z"},"/Documents/starting a new proj in VSCode.txt":{"dev":16777231,"mode":33261,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230176,"size":5928,"blocks":16,"atimeMs":1725416781846.902,"mtimeMs":1725416780835.2122,"ctimeMs":1725416780835.2122,"birthtimeMs":1725416780834.493,"atime":"2024-09-04T02:26:21.847Z","mtime":"2024-09-04T02:26:20.835Z","ctime":"2024-09-04T02:26:20.835Z","birthtime":"2024-09-04T02:26:20.834Z"},"/Documents":{"dev":16777231,"mode":16877,"nlink":7,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575092,"size":224,"blocks":0,"atimeMs":1725416781163.5657,"mtimeMs":1725416780834.4978,"ctimeMs":1725416780834.4978,"birthtimeMs":1720371496243.496,"atime":"2024-09-04T02:26:21.164Z","mtime":"2024-09-04T02:26:20.834Z","ctime":"2024-09-04T02:26:20.834Z","birthtime":"2024-07-07T16:58:16.243Z"},"/Downloads/anothertest.txt":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575097,"size":11,"blocks":8,"atimeMs":1720371502424.2,"mtimeMs":1720371496248.3032,"ctimeMs":1720371496248.3032,"birthtimeMs":1720371496248.268,"atime":"2024-07-07T16:58:22.424Z","mtime":"2024-07-07T16:58:16.248Z","ctime":"2024-07-07T16:58:16.248Z","birthtime":"2024-07-07T16:58:16.248Z"},"/Downloads":{"dev":16777231,"mode":16877,"nlink":3,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575096,"size":96,"blocks":0,"atimeMs":1720371501453.7756,"mtimeMs":1720371496248.2705,"ctimeMs":1720371496248.2705,"birthtimeMs":1720371496248.2207,"atime":"2024-07-07T16:58:21.454Z","mtime":"2024-07-07T16:58:16.248Z","ctime":"2024-07-07T16:58:16.248Z","birthtime":"2024-07-07T16:58:16.248Z"},"/Games/D3D.url":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230177,"size":144,"blocks":8,"atimeMs":1725416781417.8145,"mtimeMs":1725416780835.401,"ctimeMs":1725416780835.401,"birthtimeMs":1725416780835.349,"atime":"2024-09-04T02:26:21.418Z","mtime":"2024-09-04T02:26:20.835Z","ctime":"2024-09-04T02:26:20.835Z","birthtime":"2024-09-04T02:26:20.835Z"},"/Games/Data/D3D.jsdos":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230179,"size":5914056,"blocks":11552,"atimeMs":1725417146094.0999,"mtimeMs":1725416780839.4487,"ctimeMs":1725416780839.4487,"birthtimeMs":1725416780835.4817,"atime":"2024-09-04T02:32:26.094Z","mtime":"2024-09-04T02:26:20.839Z","ctime":"2024-09-04T02:26:20.839Z","birthtime":"2024-09-04T02:26:20.835Z"},"/Games/Data/Digger.jsdos":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230180,"size":28986,"blocks":64,"atimeMs":1725416781157.884,"mtimeMs":1725416780839.9006,"ctimeMs":1725416780839.9006,"birthtimeMs":1725416780839.7212,"atime":"2024-09-04T02:26:21.158Z","mtime":"2024-09-04T02:26:20.840Z","ctime":"2024-09-04T02:26:20.840Z","birthtime":"2024-09-04T02:26:20.840Z"},"/Games/Data/Doom.jsdos":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230181,"size":2454129,"blocks":4800,"atimeMs":1725417146097.1006,"mtimeMs":1725416780841.6257,"ctimeMs":1725416780841.6257,"birthtimeMs":1725416780839.938,"atime":"2024-09-04T02:32:26.097Z","mtime":"2024-09-04T02:26:20.842Z","ctime":"2024-09-04T02:26:20.842Z","birthtime":"2024-09-04T02:26:20.840Z"},"/Games/Data/Jill of the Jungle.jsdos":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230182,"size":310744,"blocks":608,"atimeMs":1725417146098.3035,"mtimeMs":1725416780842.4207,"ctimeMs":1725416780842.4207,"birthtimeMs":1725416780841.713,"atime":"2024-09-04T02:32:26.098Z","mtime":"2024-09-04T02:26:20.842Z","ctime":"2024-09-04T02:26:20.842Z","birthtime":"2024-09-04T02:26:20.842Z"},"/Games/Data/Machine Nation.jsdos":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230183,"size":321393,"blocks":632,"atimeMs":1725417146098.4707,"mtimeMs":1725416780843.213,"ctimeMs":1725416780843.213,"birthtimeMs":1725416780842.459,"atime":"2024-09-04T02:32:26.098Z","mtime":"2024-09-04T02:26:20.843Z","ctime":"2024-09-04T02:26:20.843Z","birthtime":"2024-09-04T02:26:20.842Z"},"/Games/Data/Shadow Knight.jsdos":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230184,"size":165395,"blocks":328,"atimeMs":1725417146098.6506,"mtimeMs":1725416780843.6763,"ctimeMs":1725416780843.6763,"birthtimeMs":1725416780843.2673,"atime":"2024-09-04T02:32:26.099Z","mtime":"2024-09-04T02:26:20.844Z","ctime":"2024-09-04T02:26:20.844Z","birthtime":"2024-09-04T02:26:20.843Z"},"/Games/Data":{"dev":16777231,"mode":16877,"nlink":8,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230178,"size":256,"blocks":0,"atimeMs":1725416780940.2942,"mtimeMs":1725416780843.2698,"ctimeMs":1725416780843.2698,"birthtimeMs":1725416780835.436,"atime":"2024-09-04T02:26:20.940Z","mtime":"2024-09-04T02:26:20.843Z","ctime":"2024-09-04T02:26:20.843Z","birthtime":"2024-09-04T02:26:20.835Z"},"/Games/Diggers.url":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230185,"size":155,"blocks":8,"atimeMs":1725416782090.4968,"mtimeMs":1725416780843.855,"ctimeMs":1725416780843.855,"birthtimeMs":1725416780843.8167,"atime":"2024-09-04T02:26:22.090Z","mtime":"2024-09-04T02:26:20.844Z","ctime":"2024-09-04T02:26:20.844Z","birthtime":"2024-09-04T02:26:20.844Z"},"/Games/Doom.url":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230186,"size":147,"blocks":8,"atimeMs":1725416782090.4968,"mtimeMs":1725416780843.993,"ctimeMs":1725416780843.993,"birthtimeMs":1725416780843.9526,"atime":"2024-09-04T02:26:22.090Z","mtime":"2024-09-04T02:26:20.844Z","ctime":"2024-09-04T02:26:20.844Z","birthtime":"2024-09-04T02:26:20.844Z"},"/Games/Flash-Games /logo-anim.swf":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230188,"size":27725,"blocks":56,"atimeMs":1725416781160.994,"mtimeMs":1725416780844.177,"ctimeMs":1725416780844.177,"birthtimeMs":1725416780844.0867,"atime":"2024-09-04T02:26:21.161Z","mtime":"2024-09-04T02:26:20.844Z","ctime":"2024-09-04T02:26:20.844Z","birthtime":"2024-09-04T02:26:20.844Z"},"/Games/Flash-Games ":{"dev":16777231,"mode":16877,"nlink":3,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230187,"size":96,"blocks":0,"atimeMs":1725416781160.9744,"mtimeMs":1725416780844.0908,"ctimeMs":1725416780844.0908,"birthtimeMs":1725416780844.0278,"atime":"2024-09-04T02:26:21.161Z","mtime":"2024-09-04T02:26:20.844Z","ctime":"2024-09-04T02:26:20.844Z","birthtime":"2024-09-04T02:26:20.844Z"},"/Games/icons/d3d.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158144,"size":17247,"blocks":40,"atimeMs":1722525891197.9065,"mtimeMs":1722471464478.6296,"ctimeMs":1722471464478.6296,"birthtimeMs":1722471464478.59,"atime":"2024-08-01T15:24:51.198Z","mtime":"2024-08-01T00:17:44.479Z","ctime":"2024-08-01T00:17:44.479Z","birthtime":"2024-08-01T00:17:44.479Z"},"/Games/icons/diggers.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158145,"size":2556,"blocks":8,"atimeMs":1722525891291.0447,"mtimeMs":1722471464478.7056,"ctimeMs":1722471464478.7056,"birthtimeMs":1722471464478.663,"atime":"2024-08-01T15:24:51.291Z","mtime":"2024-08-01T00:17:44.479Z","ctime":"2024-08-01T00:17:44.479Z","birthtime":"2024-08-01T00:17:44.479Z"},"/Games/icons/doom.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158146,"size":11861,"blocks":24,"atimeMs":1722525891348.5063,"mtimeMs":1722471464478.8115,"ctimeMs":1722471464478.8115,"birthtimeMs":1722471464478.7307,"atime":"2024-08-01T15:24:51.349Z","mtime":"2024-08-01T00:17:44.479Z","ctime":"2024-08-01T00:17:44.479Z","birthtime":"2024-08-01T00:17:44.479Z"},"/Games/icons/doom1.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158147,"size":17253,"blocks":40,"atimeMs":1722525891426.2498,"mtimeMs":1722471464478.8804,"ctimeMs":1722471464478.8804,"birthtimeMs":1722471464478.837,"atime":"2024-08-01T15:24:51.426Z","mtime":"2024-08-01T00:17:44.479Z","ctime":"2024-08-01T00:17:44.479Z","birthtime":"2024-08-01T00:17:44.479Z"},"/Games/icons":{"dev":16777231,"mode":16877,"nlink":6,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158143,"size":192,"blocks":0,"atimeMs":1722471464708.2021,"mtimeMs":1722471464478.839,"ctimeMs":1722471464478.839,"birthtimeMs":1722471464478.5544,"atime":"2024-08-01T00:17:44.708Z","mtime":"2024-08-01T00:17:44.479Z","ctime":"2024-08-01T00:17:44.479Z","birthtime":"2024-08-01T00:17:44.479Z"},"/Games":{"dev":16777231,"mode":16877,"nlink":8,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575098,"size":256,"blocks":0,"atimeMs":1725416781163.6924,"mtimeMs":1725416780844.0342,"ctimeMs":1725416780844.0342,"birthtimeMs":1720371496248.3306,"atime":"2024-09-04T02:26:21.164Z","mtime":"2024-09-04T02:26:20.844Z","ctime":"2024-09-04T02:26:20.844Z","birthtime":"2024-07-07T16:58:16.248Z"},"/Music/jazz-club-in-new-orleans.mp3":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575117,"size":3843552,"blocks":7512,"atimeMs":1720371516524.2178,"mtimeMs":1720371496271.6357,"ctimeMs":1720371496271.6357,"birthtimeMs":1720371496256.8044,"atime":"2024-07-07T16:58:36.524Z","mtime":"2024-07-07T16:58:16.272Z","ctime":"2024-07-07T16:58:16.272Z","birthtime":"2024-07-07T16:58:16.257Z"},"/Music/titanium.mp3":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575118,"size":3398400,"blocks":6640,"atimeMs":1722210473467.551,"mtimeMs":1720371496285.2253,"ctimeMs":1720371496285.2253,"birthtimeMs":1720371496271.88,"atime":"2024-07-28T23:47:53.468Z","mtime":"2024-07-07T16:58:16.285Z","ctime":"2024-07-07T16:58:16.285Z","birthtime":"2024-07-07T16:58:16.272Z"},"/Music":{"dev":16777231,"mode":16877,"nlink":4,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575116,"size":128,"blocks":0,"atimeMs":1720371501459.1423,"mtimeMs":1720371496271.8835,"ctimeMs":1720371496271.8835,"birthtimeMs":1720371496256.7542,"atime":"2024-07-07T16:58:21.459Z","mtime":"2024-07-07T16:58:16.272Z","ctime":"2024-07-07T16:58:16.272Z","birthtime":"2024-07-07T16:58:16.257Z"},"/Pictures/Samples/Chill on the Moon.jpg":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158149,"size":476451,"blocks":936,"atimeMs":1722525891491.2158,"mtimeMs":1722471464481.021,"ctimeMs":1722471464481.021,"birthtimeMs":1722471464478.976,"atime":"2024-08-01T15:24:51.491Z","mtime":"2024-08-01T00:17:44.481Z","ctime":"2024-08-01T00:17:44.481Z","birthtime":"2024-08-01T00:17:44.479Z"},"/Pictures/Samples/Sparkling Water.jpg":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158150,"size":209776,"blocks":416,"atimeMs":1722525891755.4927,"mtimeMs":1722471464482.0151,"ctimeMs":1722471464482.0151,"birthtimeMs":1722471464481.242,"atime":"2024-08-01T15:24:51.755Z","mtime":"2024-08-01T00:17:44.482Z","ctime":"2024-08-01T00:17:44.482Z","birthtime":"2024-08-01T00:17:44.481Z"},"/Pictures/Samples/Sunset Car.jpg":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158151,"size":309267,"blocks":608,"atimeMs":1722525891956.6865,"mtimeMs":1722471464483.6257,"ctimeMs":1722471464483.6257,"birthtimeMs":1722471464482.0535,"atime":"2024-08-01T15:24:51.957Z","mtime":"2024-08-01T00:17:44.484Z","ctime":"2024-08-01T00:17:44.484Z","birthtime":"2024-08-01T00:17:44.482Z"},"/Pictures/Samples/Sunset.jpg":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158152,"size":176939,"blocks":352,"atimeMs":1722525892214.9204,"mtimeMs":1722471464484.8757,"ctimeMs":1722471464484.8757,"birthtimeMs":1722471464483.699,"atime":"2024-08-01T15:24:52.215Z","mtime":"2024-08-01T00:17:44.485Z","ctime":"2024-08-01T00:17:44.485Z","birthtime":"2024-08-01T00:17:44.484Z"},"/Pictures/Samples/mystical.jpg":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158153,"size":1648271,"blocks":3224,"atimeMs":1722525892413.43,"mtimeMs":1722471464489.6135,"ctimeMs":1722471464489.6135,"birthtimeMs":1722471464484.9143,"atime":"2024-08-01T15:24:52.413Z","mtime":"2024-08-01T00:17:44.490Z","ctime":"2024-08-01T00:17:44.490Z","birthtime":"2024-08-01T00:17:44.485Z"},"/Pictures/Samples/no_img.jpeg":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158154,"size":393023,"blocks":768,"atimeMs":1722525892671.3223,"mtimeMs":1722471464490.8823,"ctimeMs":1722471464490.8823,"birthtimeMs":1722471464489.7153,"atime":"2024-08-01T15:24:52.671Z","mtime":"2024-08-01T00:17:44.491Z","ctime":"2024-08-01T00:17:44.491Z","birthtime":"2024-08-01T00:17:44.490Z"},"/Pictures/Samples":{"dev":16777231,"mode":16877,"nlink":8,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158148,"size":256,"blocks":0,"atimeMs":1722471465298.8967,"mtimeMs":1722471464489.7178,"ctimeMs":1722471464489.7178,"birthtimeMs":1722471464478.937,"atime":"2024-08-01T00:17:45.299Z","mtime":"2024-08-01T00:17:44.490Z","ctime":"2024-08-01T00:17:44.490Z","birthtime":"2024-08-01T00:17:44.479Z"},"/Pictures/favicon.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575127,"size":948,"blocks":8,"atimeMs":1720371503608.0945,"mtimeMs":1720371496293.3257,"ctimeMs":1720371496293.3257,"birthtimeMs":1720371496293.283,"atime":"2024-07-07T16:58:23.608Z","mtime":"2024-07-07T16:58:16.293Z","ctime":"2024-07-07T16:58:16.293Z","birthtime":"2024-07-07T16:58:16.293Z"},"/Pictures/favicon1.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575128,"size":55274,"blocks":112,"atimeMs":1720371516529.3381,"mtimeMs":1720371496293.5403,"ctimeMs":1720371496293.5403,"birthtimeMs":1720371496293.3525,"atime":"2024-07-07T16:58:36.529Z","mtime":"2024-07-07T16:58:16.294Z","ctime":"2024-07-07T16:58:16.294Z","birthtime":"2024-07-07T16:58:16.293Z"},"/Pictures/favicon_nice.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575129,"size":1566,"blocks":8,"atimeMs":1720379864492.4517,"mtimeMs":1720371496293.6194,"ctimeMs":1720371496293.6194,"birthtimeMs":1720371496293.5742,"atime":"2024-07-07T19:17:44.492Z","mtime":"2024-07-07T16:58:16.294Z","ctime":"2024-07-07T16:58:16.294Z","birthtime":"2024-07-07T16:58:16.294Z"},"/Pictures/heat.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575130,"size":3706,"blocks":8,"atimeMs":1720379864540.0288,"mtimeMs":1720371496293.699,"ctimeMs":1720371496293.699,"birthtimeMs":1720371496293.646,"atime":"2024-07-07T19:17:44.540Z","mtime":"2024-07-07T16:58:16.294Z","ctime":"2024-07-07T16:58:16.294Z","birthtime":"2024-07-07T16:58:16.294Z"},"/Pictures":{"dev":16777231,"mode":16877,"nlink":7,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575119,"size":224,"blocks":0,"atimeMs":1722471465378.2886,"mtimeMs":1722471464478.9395,"ctimeMs":1722471464478.9395,"birthtimeMs":1720371496285.5002,"atime":"2024-08-01T00:17:45.378Z","mtime":"2024-08-01T00:17:44.479Z","ctime":"2024-08-01T00:17:44.479Z","birthtime":"2024-07-07T16:58:16.286Z"},"/Videos/nuts.mp4":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575132,"size":26541727,"blocks":51840,"atimeMs":1720371516529.4255,"mtimeMs":1720371496314.552,"ctimeMs":1720371496314.552,"birthtimeMs":1720371496293.766,"atime":"2024-07-07T16:58:36.529Z","mtime":"2024-07-07T16:58:16.315Z","ctime":"2024-07-07T16:58:16.315Z","birthtime":"2024-07-07T16:58:16.294Z"},"/Videos/surfs.mp4":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575133,"size":13431995,"blocks":26240,"atimeMs":1720371516542.2715,"mtimeMs":1720371496322.5056,"ctimeMs":1720371496322.5056,"birthtimeMs":1720371496315.1,"atime":"2024-07-07T16:58:36.542Z","mtime":"2024-07-07T16:58:16.323Z","ctime":"2024-07-07T16:58:16.323Z","birthtime":"2024-07-07T16:58:16.315Z"},"/Videos":{"dev":16777231,"mode":16877,"nlink":4,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575131,"size":128,"blocks":0,"atimeMs":1720371501466.1846,"mtimeMs":1720371496315.103,"ctimeMs":1720371496315.103,"birthtimeMs":1720371496293.7249,"atime":"2024-07-07T16:58:21.466Z","mtime":"2024-07-07T16:58:16.315Z","ctime":"2024-07-07T16:58:16.315Z","birthtime":"2024-07-07T16:58:16.294Z"},"/icons/arrow_down.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575135,"size":23087,"blocks":48,"atimeMs":1720379865594.303,"mtimeMs":1720371496322.9314,"ctimeMs":1720371496322.9314,"birthtimeMs":1720371496322.786,"atime":"2024-07-07T19:17:45.594Z","mtime":"2024-07-07T16:58:16.323Z","ctime":"2024-07-07T16:58:16.323Z","birthtime":"2024-07-07T16:58:16.323Z"},"/icons/arrow_next.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575136,"size":9700,"blocks":24,"atimeMs":1720379865730.1807,"mtimeMs":1720371496323.0466,"ctimeMs":1720371496323.0466,"birthtimeMs":1720371496322.9727,"atime":"2024-07-07T19:17:45.730Z","mtime":"2024-07-07T16:58:16.323Z","ctime":"2024-07-07T16:58:16.323Z","birthtime":"2024-07-07T16:58:16.323Z"},"/icons/arrow_next_1.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230189,"size":164,"blocks":8,"atimeMs":1725416782103.06,"mtimeMs":1725416780844.4824,"ctimeMs":1725416780844.4824,"birthtimeMs":1725416780844.2407,"atime":"2024-09-04T02:26:22.103Z","mtime":"2024-09-04T02:26:20.844Z","ctime":"2024-09-04T02:26:20.844Z","birthtime":"2024-09-04T02:26:20.844Z"},"/icons/arrow_up.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575137,"size":23080,"blocks":48,"atimeMs":1720379865860.8665,"mtimeMs":1720371496323.201,"ctimeMs":1720371496323.201,"birthtimeMs":1720371496323.0718,"atime":"2024-07-07T19:17:45.861Z","mtime":"2024-07-07T16:58:16.323Z","ctime":"2024-07-07T16:58:16.323Z","birthtime":"2024-07-07T16:58:16.323Z"},"/icons/audioplayer.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575138,"size":1493,"blocks":8,"atimeMs":1720379865989.2925,"mtimeMs":1720371496323.2961,"ctimeMs":1720371496323.2961,"birthtimeMs":1720371496323.2593,"atime":"2024-07-07T19:17:45.989Z","mtime":"2024-07-07T16:58:16.323Z","ctime":"2024-07-07T16:58:16.323Z","birthtime":"2024-07-07T16:58:16.323Z"},"/icons/camera_48.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158155,"size":1564,"blocks":8,"atimeMs":1722525893202.1492,"mtimeMs":1722471464491.1138,"ctimeMs":1722471464491.1138,"birthtimeMs":1722471464491.051,"atime":"2024-08-01T15:24:53.202Z","mtime":"2024-08-01T00:17:44.491Z","ctime":"2024-08-01T00:17:44.491Z","birthtime":"2024-08-01T00:17:44.491Z"},"/icons/chkmark26.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575140,"size":402,"blocks":8,"atimeMs":1720379866125.7812,"mtimeMs":1720371496323.409,"ctimeMs":1720371496323.409,"birthtimeMs":1720371496323.3755,"atime":"2024-07-07T19:17:46.126Z","mtime":"2024-07-07T16:58:16.323Z","ctime":"2024-07-07T16:58:16.323Z","birthtime":"2024-07-07T16:58:16.323Z"},"/icons/chkmark32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575141,"size":233,"blocks":8,"atimeMs":1720379866184.1377,"mtimeMs":1720371496323.472,"ctimeMs":1720371496323.472,"birthtimeMs":1720371496323.432,"atime":"2024-07-07T19:17:46.184Z","mtime":"2024-07-07T16:58:16.323Z","ctime":"2024-07-07T16:58:16.323Z","birthtime":"2024-07-07T16:58:16.323Z"},"/icons/circle.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575142,"size":379,"blocks":8,"atimeMs":1720379866245.2898,"mtimeMs":1720371496323.534,"ctimeMs":1720371496323.534,"birthtimeMs":1720371496323.4995,"atime":"2024-07-07T19:17:46.245Z","mtime":"2024-07-07T16:58:16.324Z","ctime":"2024-07-07T16:58:16.324Z","birthtime":"2024-07-07T16:58:16.323Z"},"/icons/cmd.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575143,"size":45913,"blocks":96,"atimeMs":1720371516548.7996,"mtimeMs":1720371496323.626,"ctimeMs":1720371496323.626,"birthtimeMs":1720371496323.556,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.324Z","ctime":"2024-07-07T16:58:16.324Z","birthtime":"2024-07-07T16:58:16.324Z"},"/icons/code-editor-2_48.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158156,"size":1116,"blocks":8,"atimeMs":1722525893275.7622,"mtimeMs":1722471464491.1936,"ctimeMs":1722471464491.1936,"birthtimeMs":1722471464491.1538,"atime":"2024-08-01T15:24:53.276Z","mtime":"2024-08-01T00:17:44.491Z","ctime":"2024-08-01T00:17:44.491Z","birthtime":"2024-08-01T00:17:44.491Z"},"/icons/code-editor_64.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158157,"size":1563,"blocks":8,"atimeMs":1722525893333.0618,"mtimeMs":1722471464491.9402,"ctimeMs":1722471464491.9402,"birthtimeMs":1722471464491.9094,"atime":"2024-08-01T15:24:53.333Z","mtime":"2024-08-01T00:17:44.492Z","ctime":"2024-08-01T00:17:44.492Z","birthtime":"2024-08-01T00:17:44.492Z"},"/icons/config.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575146,"size":58532,"blocks":120,"atimeMs":1720371516548.8704,"mtimeMs":1720371496324.0173,"ctimeMs":1720371496324.0173,"birthtimeMs":1720371496323.765,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.324Z","ctime":"2024-07-07T16:58:16.324Z","birthtime":"2024-07-07T16:58:16.324Z"},"/icons/content_view.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575147,"size":54709,"blocks":112,"atimeMs":1720371516548.916,"mtimeMs":1720371496324.1921,"ctimeMs":1720371496324.1921,"birthtimeMs":1720371496324.0474,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.324Z","ctime":"2024-07-07T16:58:16.324Z","birthtime":"2024-07-07T16:58:16.324Z"},"/icons/cross_mark_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575148,"size":253,"blocks":8,"atimeMs":1720379866671.706,"mtimeMs":1720371496324.2595,"ctimeMs":1720371496324.2595,"birthtimeMs":1720371496324.2224,"atime":"2024-07-07T19:17:46.672Z","mtime":"2024-07-07T16:58:16.324Z","ctime":"2024-07-07T16:58:16.324Z","birthtime":"2024-07-07T16:58:16.324Z"},"/icons/desktop.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575149,"size":49132,"blocks":96,"atimeMs":1720371516548.973,"mtimeMs":1720371496324.415,"ctimeMs":1720371496324.415,"birthtimeMs":1720371496324.2825,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.324Z","ctime":"2024-07-07T16:58:16.324Z","birthtime":"2024-07-07T16:58:16.324Z"},"/icons/desktop_folder.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575150,"size":53658,"blocks":112,"atimeMs":1720371516549.0112,"mtimeMs":1720371496324.6829,"ctimeMs":1720371496324.6829,"birthtimeMs":1720371496324.4463,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.325Z","ctime":"2024-07-07T16:58:16.325Z","birthtime":"2024-07-07T16:58:16.324Z"},"/icons/details_pane.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575151,"size":45578,"blocks":96,"atimeMs":1720371516549.0525,"mtimeMs":1720371496324.9387,"ctimeMs":1720371496324.9387,"birthtimeMs":1720371496324.7122,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.325Z","ctime":"2024-07-07T16:58:16.325Z","birthtime":"2024-07-07T16:58:16.325Z"},"/icons/details_view.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575152,"size":54851,"blocks":112,"atimeMs":1720371516549.0872,"mtimeMs":1720371496325.1882,"ctimeMs":1720371496325.1882,"birthtimeMs":1720371496324.9678,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.325Z","ctime":"2024-07-07T16:58:16.325Z","birthtime":"2024-07-07T16:58:16.325Z"},"/icons/documents.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575153,"size":49019,"blocks":96,"atimeMs":1720371516549.1265,"mtimeMs":1720371496325.266,"ctimeMs":1720371496325.266,"birthtimeMs":1720371496325.2166,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.325Z","ctime":"2024-07-07T16:58:16.325Z","birthtime":"2024-07-07T16:58:16.325Z"},"/icons/documents_folder.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575154,"size":53535,"blocks":112,"atimeMs":1720371516549.163,"mtimeMs":1720371496325.3494,"ctimeMs":1720371496325.3494,"birthtimeMs":1720371496325.295,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.325Z","ctime":"2024-07-07T16:58:16.325Z","birthtime":"2024-07-07T16:58:16.325Z"},"/icons/downloads.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575155,"size":46950,"blocks":96,"atimeMs":1720371516549.2017,"mtimeMs":1720371496325.4897,"ctimeMs":1720371496325.4897,"birthtimeMs":1720371496325.3782,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.325Z","ctime":"2024-07-07T16:58:16.325Z","birthtime":"2024-07-07T16:58:16.325Z"},"/icons/downloads.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158158,"size":913,"blocks":8,"atimeMs":1722525893722.8232,"mtimeMs":1722471464492.0193,"ctimeMs":1722471464492.0193,"birthtimeMs":1722471464491.9893,"atime":"2024-08-01T15:24:53.723Z","mtime":"2024-08-01T00:17:44.492Z","ctime":"2024-08-01T00:17:44.492Z","birthtime":"2024-08-01T00:17:44.492Z"},"/icons/downloads1.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158159,"size":969,"blocks":8,"atimeMs":1722525893795.724,"mtimeMs":1722471464492.0798,"ctimeMs":1722471464492.0798,"birthtimeMs":1722471464492.0452,"atime":"2024-08-01T15:24:53.796Z","mtime":"2024-08-01T00:17:44.492Z","ctime":"2024-08-01T00:17:44.492Z","birthtime":"2024-08-01T00:17:44.492Z"},"/icons/downloads_folder.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575158,"size":52770,"blocks":104,"atimeMs":1720371516549.2607,"mtimeMs":1720371496326.018,"ctimeMs":1720371496326.018,"birthtimeMs":1720371496325.6301,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.326Z","ctime":"2024-07-07T16:58:16.326Z","birthtime":"2024-07-07T16:58:16.326Z"},"/icons/econo.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575159,"size":875,"blocks":8,"atimeMs":1720379857820.3416,"mtimeMs":1720371496326.08,"ctimeMs":1720371496326.08,"birthtimeMs":1720371496326.0474,"atime":"2024-07-07T19:17:37.820Z","mtime":"2024-07-07T16:58:16.326Z","ctime":"2024-07-07T16:58:16.326Z","birthtime":"2024-07-07T16:58:16.326Z"},"/icons/empty_folder.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575160,"size":51902,"blocks":104,"atimeMs":1720371516549.317,"mtimeMs":1720371496326.4263,"ctimeMs":1720371496326.4263,"birthtimeMs":1720371496326.1074,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.326Z","ctime":"2024-07-07T16:58:16.326Z","birthtime":"2024-07-07T16:58:16.326Z"},"/icons/empty_recycle.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575161,"size":53417,"blocks":112,"atimeMs":1720371516549.3545,"mtimeMs":1720371496326.6082,"ctimeMs":1720371496326.6082,"birthtimeMs":1720371496326.4539,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.327Z","ctime":"2024-07-07T16:58:16.327Z","birthtime":"2024-07-07T16:58:16.326Z"},"/icons/emulator-1.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158160,"size":1556,"blocks":8,"atimeMs":1722525893873.5037,"mtimeMs":1722471464492.1357,"ctimeMs":1722471464492.1357,"birthtimeMs":1722471464492.1067,"atime":"2024-08-01T15:24:53.874Z","mtime":"2024-08-01T00:17:44.492Z","ctime":"2024-08-01T00:17:44.492Z","birthtime":"2024-08-01T00:17:44.492Z"},"/icons/emulator-2.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158161,"size":739,"blocks":8,"atimeMs":1722525893931.999,"mtimeMs":1722471464492.1875,"ctimeMs":1722471464492.1875,"birthtimeMs":1722471464492.1587,"atime":"2024-08-01T15:24:53.932Z","mtime":"2024-08-01T00:17:44.492Z","ctime":"2024-08-01T00:17:44.492Z","birthtime":"2024-08-01T00:17:44.492Z"},"/icons/extral_large_image.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575164,"size":59230,"blocks":120,"atimeMs":1720371516549.4202,"mtimeMs":1720371496326.9368,"ctimeMs":1720371496326.9368,"birthtimeMs":1720371496326.7388,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.327Z","ctime":"2024-07-07T16:58:16.327Z","birthtime":"2024-07-07T16:58:16.327Z"},"/icons/file.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575165,"size":48338,"blocks":96,"atimeMs":1720371516549.4644,"mtimeMs":1720371496327.1375,"ctimeMs":1720371496327.1375,"birthtimeMs":1720371496326.9675,"atime":"2024-07-07T16:58:36.549Z","mtime":"2024-07-07T16:58:16.327Z","ctime":"2024-07-07T16:58:16.327Z","birthtime":"2024-07-07T16:58:16.327Z"},"/icons/file_explorer.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575166,"size":54229,"blocks":112,"atimeMs":1720371516549.5027,"mtimeMs":1720371496327.3215,"ctimeMs":1720371496327.3215,"birthtimeMs":1720371496327.1655,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.327Z","ctime":"2024-07-07T16:58:16.327Z","birthtime":"2024-07-07T16:58:16.327Z"},"/icons/file_explorer.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158162,"size":1605,"blocks":8,"atimeMs":1722525894006.092,"mtimeMs":1722471464492.2761,"ctimeMs":1722471464492.2761,"birthtimeMs":1722471464492.2344,"atime":"2024-08-01T15:24:54.006Z","mtime":"2024-08-01T00:17:44.492Z","ctime":"2024-08-01T00:17:44.492Z","birthtime":"2024-08-01T00:17:44.492Z"},"/icons/flash48.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158163,"size":1164,"blocks":8,"atimeMs":1722525894067.6086,"mtimeMs":1722471464492.3296,"ctimeMs":1722471464492.3296,"birthtimeMs":1722471464492.2996,"atime":"2024-08-01T15:24:54.068Z","mtime":"2024-08-01T00:17:44.492Z","ctime":"2024-08-01T00:17:44.492Z","birthtime":"2024-08-01T00:17:44.492Z"},"/icons/flash_67.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158164,"size":1587,"blocks":8,"atimeMs":1722525894145.7268,"mtimeMs":1722471464492.3828,"ctimeMs":1722471464492.3828,"birthtimeMs":1722471464492.3533,"atime":"2024-08-01T15:24:54.146Z","mtime":"2024-08-01T00:17:44.492Z","ctime":"2024-08-01T00:17:44.492Z","birthtime":"2024-08-01T00:17:44.492Z"},"/icons/floppy.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575170,"size":47226,"blocks":96,"atimeMs":1720371516549.5876,"mtimeMs":1720371496327.6475,"ctimeMs":1720371496327.6475,"birthtimeMs":1720371496327.535,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.328Z","ctime":"2024-07-07T16:58:16.328Z","birthtime":"2024-07-07T16:58:16.328Z"},"/icons/folder.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575171,"size":52252,"blocks":104,"atimeMs":1720371516549.627,"mtimeMs":1720371496327.89,"ctimeMs":1720371496327.89,"birthtimeMs":1720371496327.6753,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.328Z","ctime":"2024-07-07T16:58:16.328Z","birthtime":"2024-07-07T16:58:16.328Z"},"/icons/games.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575172,"size":63792,"blocks":128,"atimeMs":1720371516549.6646,"mtimeMs":1720371496328.1438,"ctimeMs":1720371496328.1438,"birthtimeMs":1720371496327.9192,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.328Z","ctime":"2024-07-07T16:58:16.328Z","birthtime":"2024-07-07T16:58:16.328Z"},"/icons/generic-program.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575173,"size":45289,"blocks":96,"atimeMs":1720371516549.709,"mtimeMs":1720371496328.265,"ctimeMs":1720371496328.265,"birthtimeMs":1720371496328.1743,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.328Z","ctime":"2024-07-07T16:58:16.328Z","birthtime":"2024-07-07T16:58:16.328Z"},"/icons/grey_history_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575174,"size":572,"blocks":8,"atimeMs":1720379858207.6033,"mtimeMs":1720371496328.3352,"ctimeMs":1720371496328.3352,"birthtimeMs":1720371496328.2988,"atime":"2024-07-07T19:17:38.208Z","mtime":"2024-07-07T16:58:16.328Z","ctime":"2024-07-07T16:58:16.328Z","birthtime":"2024-07-07T16:58:16.328Z"},"/icons/grey_nav_expand_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575175,"size":248,"blocks":8,"atimeMs":1720379858285.392,"mtimeMs":1720371496328.3962,"ctimeMs":1720371496328.3962,"birthtimeMs":1720371496328.3616,"atime":"2024-07-07T19:17:38.285Z","mtime":"2024-07-07T16:58:16.328Z","ctime":"2024-07-07T16:58:16.328Z","birthtime":"2024-07-07T16:58:16.328Z"},"/icons/grey_nav_forward_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575176,"size":197,"blocks":8,"atimeMs":1720379858357.457,"mtimeMs":1720371496328.4524,"ctimeMs":1720371496328.4524,"birthtimeMs":1720371496328.423,"atime":"2024-07-07T19:17:38.357Z","mtime":"2024-07-07T16:58:16.328Z","ctime":"2024-07-07T16:58:16.328Z","birthtime":"2024-07-07T16:58:16.328Z"},"/icons/grey_nav_refresh_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575177,"size":638,"blocks":8,"atimeMs":1720379858427.6567,"mtimeMs":1720371496328.5056,"ctimeMs":1720371496328.5056,"birthtimeMs":1720371496328.4749,"atime":"2024-07-07T19:17:38.428Z","mtime":"2024-07-07T16:58:16.329Z","ctime":"2024-07-07T16:58:16.329Z","birthtime":"2024-07-07T16:58:16.328Z"},"/icons/image.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575178,"size":52553,"blocks":104,"atimeMs":1720371516549.8037,"mtimeMs":1720371496328.6824,"ctimeMs":1720371496328.6824,"birthtimeMs":1720371496328.5288,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.329Z","ctime":"2024-07-07T16:58:16.329Z","birthtime":"2024-07-07T16:58:16.329Z"},"/icons/info_48.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158165,"size":1294,"blocks":8,"atimeMs":1722525894205.5051,"mtimeMs":1722471464492.4438,"ctimeMs":1722471464492.4438,"birthtimeMs":1722471464492.4055,"atime":"2024-08-01T15:24:54.206Z","mtime":"2024-08-01T00:17:44.492Z","ctime":"2024-08-01T00:17:44.492Z","birthtime":"2024-08-01T00:17:44.492Z"},"/icons/js-dos-logo.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575180,"size":40753,"blocks":80,"atimeMs":1720379858561.2947,"mtimeMs":1720371496329.002,"ctimeMs":1720371496329.002,"birthtimeMs":1720371496328.7651,"atime":"2024-07-07T19:17:38.561Z","mtime":"2024-07-07T16:58:16.329Z","ctime":"2024-07-07T16:58:16.329Z","birthtime":"2024-07-07T16:58:16.329Z"},"/icons/large_image.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575181,"size":57066,"blocks":112,"atimeMs":1720371516549.8894,"mtimeMs":1720371496329.1892,"ctimeMs":1720371496329.1892,"birthtimeMs":1720371496329.037,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.329Z","ctime":"2024-07-07T16:58:16.329Z","birthtime":"2024-07-07T16:58:16.329Z"},"/icons/list_of_thumbnails_view.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575182,"size":55296,"blocks":112,"atimeMs":1720371516549.9292,"mtimeMs":1720371496329.4194,"ctimeMs":1720371496329.4194,"birthtimeMs":1720371496329.226,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.329Z","ctime":"2024-07-07T16:58:16.329Z","birthtime":"2024-07-07T16:58:16.329Z"},"/icons/markdown-2_50.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158166,"size":571,"blocks":8,"atimeMs":1722525894268.2522,"mtimeMs":1722471464492.5166,"ctimeMs":1722471464492.5166,"birthtimeMs":1722471464492.4878,"atime":"2024-08-01T15:24:54.268Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.492Z"},"/icons/markdown-50.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158167,"size":636,"blocks":8,"atimeMs":1722525894342.8325,"mtimeMs":1722471464492.566,"ctimeMs":1722471464492.566,"birthtimeMs":1722471464492.5393,"atime":"2024-08-01T15:24:54.343Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/markdown-file_50.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158168,"size":566,"blocks":8,"atimeMs":1722525894418.2092,"mtimeMs":1722471464492.627,"ctimeMs":1722471464492.627,"birthtimeMs":1722471464492.5889,"atime":"2024-08-01T15:24:54.418Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/medium_icons_view.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575186,"size":74500,"blocks":152,"atimeMs":1720371516550.0173,"mtimeMs":1720371496329.8962,"ctimeMs":1720371496329.8962,"birthtimeMs":1720371496329.6292,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.330Z","ctime":"2024-07-07T16:58:16.330Z","birthtime":"2024-07-07T16:58:16.330Z"},"/icons/music.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158169,"size":482,"blocks":8,"atimeMs":1722525894489.7976,"mtimeMs":1722471464492.7644,"ctimeMs":1722471464492.7644,"birthtimeMs":1722471464492.7366,"atime":"2024-08-01T15:24:54.490Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/music_file.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575188,"size":52599,"blocks":104,"atimeMs":1720371516550.0771,"mtimeMs":1720371496330.2024,"ctimeMs":1720371496330.2024,"birthtimeMs":1720371496329.98,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.330Z","ctime":"2024-07-07T16:58:16.330Z","birthtime":"2024-07-07T16:58:16.330Z"},"/icons/music_folder.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575189,"size":56848,"blocks":112,"atimeMs":1720371516550.1213,"mtimeMs":1720371496330.2861,"ctimeMs":1720371496330.2861,"birthtimeMs":1720371496330.2324,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.330Z","ctime":"2024-07-07T16:58:16.330Z","birthtime":"2024-07-07T16:58:16.330Z"},"/icons/my_computer.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575190,"size":52530,"blocks":104,"atimeMs":1720371516550.1638,"mtimeMs":1720371496330.4663,"ctimeMs":1720371496330.4663,"birthtimeMs":1720371496330.3186,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.330Z","ctime":"2024-07-07T16:58:16.330Z","birthtime":"2024-07-07T16:58:16.330Z"},"/icons/nav_expand_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575191,"size":225,"blocks":8,"atimeMs":1720379858974.9807,"mtimeMs":1720371496330.5256,"ctimeMs":1720371496330.5256,"birthtimeMs":1720371496330.4954,"atime":"2024-07-07T19:17:38.975Z","mtime":"2024-07-07T16:58:16.331Z","ctime":"2024-07-07T16:58:16.331Z","birthtime":"2024-07-07T16:58:16.330Z"},"/icons/nav_left_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575192,"size":176,"blocks":8,"atimeMs":1720379859049.1958,"mtimeMs":1720371496330.5764,"ctimeMs":1720371496330.5764,"birthtimeMs":1720371496330.5474,"atime":"2024-07-07T19:17:39.049Z","mtime":"2024-07-07T16:58:16.331Z","ctime":"2024-07-07T16:58:16.331Z","birthtime":"2024-07-07T16:58:16.331Z"},"/icons/nav_right_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575193,"size":180,"blocks":8,"atimeMs":1720379859121.5312,"mtimeMs":1720371496330.6287,"ctimeMs":1720371496330.6287,"birthtimeMs":1720371496330.5981,"atime":"2024-07-07T19:17:39.122Z","mtime":"2024-07-07T16:58:16.331Z","ctime":"2024-07-07T16:58:16.331Z","birthtime":"2024-07-07T16:58:16.331Z"},"/icons/nav_up-32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575194,"size":224,"blocks":8,"atimeMs":1720379860039.5793,"mtimeMs":1720371496330.6821,"ctimeMs":1720371496330.6821,"birthtimeMs":1720371496330.6519,"atime":"2024-07-07T19:17:40.040Z","mtime":"2024-07-07T16:58:16.331Z","ctime":"2024-07-07T16:58:16.331Z","birthtime":"2024-07-07T16:58:16.331Z"},"/icons/navigation_pane.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575195,"size":45502,"blocks":96,"atimeMs":1720371516550.2612,"mtimeMs":1720371496330.8325,"ctimeMs":1720371496330.8325,"birthtimeMs":1720371496330.707,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.331Z","ctime":"2024-07-07T16:58:16.331Z","birthtime":"2024-07-07T16:58:16.331Z"},"/icons/non_empty_folder.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575196,"size":63881,"blocks":128,"atimeMs":1720371516550.2954,"mtimeMs":1720371496330.9106,"ctimeMs":1720371496330.9106,"birthtimeMs":1720371496330.8616,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.331Z","ctime":"2024-07-07T16:58:16.331Z","birthtime":"2024-07-07T16:58:16.331Z"},"/icons/non_empty_recycle.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575197,"size":75417,"blocks":152,"atimeMs":1720371516550.3376,"mtimeMs":1720371496331.236,"ctimeMs":1720371496331.236,"birthtimeMs":1720371496330.941,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.331Z","ctime":"2024-07-07T16:58:16.331Z","birthtime":"2024-07-07T16:58:16.331Z"},"/icons/pdf-48.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158170,"size":692,"blocks":8,"atimeMs":1722525894549.6104,"mtimeMs":1722471464492.8447,"ctimeMs":1722471464492.8447,"birthtimeMs":1722471464492.8127,"atime":"2024-08-01T15:24:54.550Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/photos_48.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158171,"size":1415,"blocks":8,"atimeMs":1722525894882.5054,"mtimeMs":1722471464492.898,"ctimeMs":1722471464492.898,"birthtimeMs":1722471464492.8699,"atime":"2024-08-01T15:24:54.883Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/picture_folder.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575200,"size":58082,"blocks":120,"atimeMs":1720371516550.4146,"mtimeMs":1720371496331.6116,"ctimeMs":1720371496331.6116,"birthtimeMs":1720371496331.3726,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.332Z","ctime":"2024-07-07T16:58:16.332Z","birthtime":"2024-07-07T16:58:16.331Z"},"/icons/pictures.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575201,"size":54170,"blocks":112,"atimeMs":1720371516550.4543,"mtimeMs":1720371496331.688,"ctimeMs":1720371496331.688,"birthtimeMs":1720371496331.6406,"atime":"2024-07-07T16:58:36.550Z","mtime":"2024-07-07T16:58:16.332Z","ctime":"2024-07-07T16:58:16.332Z","birthtime":"2024-07-07T16:58:16.332Z"},"/icons/pin_24.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158172,"size":451,"blocks":8,"atimeMs":1722525894936.5835,"mtimeMs":1722471464492.9468,"ctimeMs":1722471464492.9468,"birthtimeMs":1722471464492.9202,"atime":"2024-08-01T15:24:54.937Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/preview_pane.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575203,"size":45249,"blocks":96,"atimeMs":1720371516550.5073,"mtimeMs":1720371496331.8262,"ctimeMs":1720371496331.8262,"birthtimeMs":1720371496331.7732,"atime":"2024-07-07T16:58:36.551Z","mtime":"2024-07-07T16:58:16.332Z","ctime":"2024-07-07T16:58:16.332Z","birthtime":"2024-07-07T16:58:16.332Z"},"/icons/red-x_50.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158173,"size":1104,"blocks":8,"atimeMs":1722525894991.6545,"mtimeMs":1722471464492.995,"ctimeMs":1722471464492.995,"birthtimeMs":1722471464492.9683,"atime":"2024-08-01T15:24:54.992Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/search_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575205,"size":553,"blocks":8,"atimeMs":1720379860613.454,"mtimeMs":1720371496331.9407,"ctimeMs":1720371496331.9407,"birthtimeMs":1720371496331.9082,"atime":"2024-07-07T19:17:40.613Z","mtime":"2024-07-07T16:58:16.332Z","ctime":"2024-07-07T16:58:16.332Z","birthtime":"2024-07-07T16:58:16.332Z"},"/icons/small_icons_view.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575206,"size":85612,"blocks":168,"atimeMs":1720371516550.572,"mtimeMs":1720371496332.2341,"ctimeMs":1720371496332.2341,"birthtimeMs":1720371496331.963,"atime":"2024-07-07T16:58:36.551Z","mtime":"2024-07-07T16:58:16.332Z","ctime":"2024-07-07T16:58:16.332Z","birthtime":"2024-07-07T16:58:16.332Z"},"/icons/taskmanger.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575207,"size":36317,"blocks":72,"atimeMs":1720379860687.3433,"mtimeMs":1720371496332.385,"ctimeMs":1720371496332.385,"birthtimeMs":1720371496332.263,"atime":"2024-07-07T19:17:40.687Z","mtime":"2024-07-07T16:58:16.332Z","ctime":"2024-07-07T16:58:16.332Z","birthtime":"2024-07-07T16:58:16.332Z"},"/icons/taskmanger_2.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575208,"size":13443,"blocks":32,"atimeMs":1720379860748.2915,"mtimeMs":1720371496332.496,"ctimeMs":1720371496332.496,"birthtimeMs":1720371496332.4175,"atime":"2024-07-07T19:17:40.748Z","mtime":"2024-07-07T16:58:16.332Z","ctime":"2024-07-07T16:58:16.332Z","birthtime":"2024-07-07T16:58:16.332Z"},"/icons/terminal-2_48.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158174,"size":1246,"blocks":8,"atimeMs":1722525895070.0479,"mtimeMs":1722471464493.0718,"ctimeMs":1722471464493.0718,"birthtimeMs":1722471464493.0388,"atime":"2024-08-01T15:24:55.070Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/terminal_48.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158175,"size":867,"blocks":8,"atimeMs":1722525895141.8682,"mtimeMs":1722471464493.1262,"ctimeMs":1722471464493.1262,"birthtimeMs":1722471464493.097,"atime":"2024-08-01T15:24:55.142Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/text-editor_48.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158176,"size":652,"blocks":8,"atimeMs":1722525895199.3623,"mtimeMs":1722471464493.186,"ctimeMs":1722471464493.186,"birthtimeMs":1722471464493.156,"atime":"2024-08-01T15:24:55.199Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/tiles_view.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575212,"size":57271,"blocks":112,"atimeMs":1720371516550.717,"mtimeMs":1720371496332.8525,"ctimeMs":1720371496332.8525,"birthtimeMs":1720371496332.6904,"atime":"2024-07-07T16:58:36.551Z","mtime":"2024-07-07T16:58:16.333Z","ctime":"2024-07-07T16:58:16.333Z","birthtime":"2024-07-07T16:58:16.333Z"},"/icons/unknown.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575213,"size":48049,"blocks":96,"atimeMs":1720371516550.7615,"mtimeMs":1720371496332.9253,"ctimeMs":1720371496332.9253,"birthtimeMs":1720371496332.8809,"atime":"2024-07-07T16:58:36.551Z","mtime":"2024-07-07T16:58:16.333Z","ctime":"2024-07-07T16:58:16.333Z","birthtime":"2024-07-07T16:58:16.333Z"},"/icons/unpin_24.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158177,"size":537,"blocks":8,"atimeMs":1722525895256.8782,"mtimeMs":1722471464493.2422,"ctimeMs":1722471464493.2422,"birthtimeMs":1722471464493.2131,"atime":"2024-08-01T15:24:55.257Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/unpin_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158178,"size":567,"blocks":8,"atimeMs":1722525895315.2136,"mtimeMs":1722471464493.3235,"ctimeMs":1722471464493.3235,"birthtimeMs":1722471464493.2908,"atime":"2024-08-01T15:24:55.315Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/video.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575216,"size":60870,"blocks":120,"atimeMs":1720371516550.835,"mtimeMs":1720371496333.2334,"ctimeMs":1720371496333.2334,"birthtimeMs":1720371496333.0525,"atime":"2024-07-07T16:58:36.551Z","mtime":"2024-07-07T16:58:16.333Z","ctime":"2024-07-07T16:58:16.333Z","birthtime":"2024-07-07T16:58:16.333Z"},"/icons/video_file.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575217,"size":55324,"blocks":112,"atimeMs":1720371516550.8757,"mtimeMs":1720371496333.3176,"ctimeMs":1720371496333.3176,"birthtimeMs":1720371496333.262,"atime":"2024-07-07T16:58:36.551Z","mtime":"2024-07-07T16:58:16.333Z","ctime":"2024-07-07T16:58:16.333Z","birthtime":"2024-07-07T16:58:16.333Z"},"/icons/video_folder.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575218,"size":62480,"blocks":128,"atimeMs":1720371516550.914,"mtimeMs":1720371496333.3953,"ctimeMs":1720371496333.3953,"birthtimeMs":1720371496333.3462,"atime":"2024-07-07T16:58:36.551Z","mtime":"2024-07-07T16:58:16.333Z","ctime":"2024-07-07T16:58:16.333Z","birthtime":"2024-07-07T16:58:16.333Z"},"/icons/videoplayer-2_48.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158179,"size":1246,"blocks":8,"atimeMs":1722525895672.6582,"mtimeMs":1722471464493.3833,"ctimeMs":1722471464493.3833,"birthtimeMs":1722471464493.3481,"atime":"2024-08-01T15:24:55.673Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/videoplayer.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575220,"size":358,"blocks":8,"atimeMs":1720379861428.079,"mtimeMs":1720371496333.5125,"ctimeMs":1720371496333.5125,"birthtimeMs":1720371496333.4795,"atime":"2024-07-07T19:17:41.428Z","mtime":"2024-07-07T16:58:16.334Z","ctime":"2024-07-07T16:58:16.334Z","birthtime":"2024-07-07T16:58:16.333Z"},"/icons/vs-code_48.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158180,"size":1868,"blocks":8,"atimeMs":1722525895732.0977,"mtimeMs":1722471464493.4363,"ctimeMs":1722471464493.4363,"birthtimeMs":1722471464493.4075,"atime":"2024-08-01T15:24:55.732Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/vs-code_64.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158181,"size":3012,"blocks":8,"atimeMs":1722525895806.992,"mtimeMs":1722471464493.4849,"ctimeMs":1722471464493.4849,"birthtimeMs":1722471464493.4575,"atime":"2024-08-01T15:24:55.807Z","mtime":"2024-08-01T00:17:44.493Z","ctime":"2024-08-01T00:17:44.493Z","birthtime":"2024-08-01T00:17:44.493Z"},"/icons/white_history_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575223,"size":497,"blocks":8,"atimeMs":1720379861861.7175,"mtimeMs":1720371496333.6677,"ctimeMs":1720371496333.6677,"birthtimeMs":1720371496333.64,"atime":"2024-07-07T19:17:41.862Z","mtime":"2024-07-07T16:58:16.334Z","ctime":"2024-07-07T16:58:16.334Z","birthtime":"2024-07-07T16:58:16.334Z"},"/icons/x_32.png":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158182,"size":253,"blocks":8,"atimeMs":1722525896306.86,"mtimeMs":1722471464493.7188,"ctimeMs":1722471464493.7188,"birthtimeMs":1722471464493.5254,"atime":"2024-08-01T15:24:56.307Z","mtime":"2024-08-01T00:17:44.494Z","ctime":"2024-08-01T00:17:44.494Z","birthtime":"2024-08-01T00:17:44.494Z"},"/icons/zip_folder.ico":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575225,"size":53859,"blocks":112,"atimeMs":1720371516551.038,"mtimeMs":1720371496333.8848,"ctimeMs":1720371496333.8848,"birthtimeMs":1720371496333.7407,"atime":"2024-07-07T16:58:36.551Z","mtime":"2024-07-07T16:58:16.334Z","ctime":"2024-07-07T16:58:16.334Z","birthtime":"2024-07-07T16:58:16.334Z"},"/icons":{"dev":16777231,"mode":16877,"nlink":94,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575134,"size":3008,"blocks":0,"atimeMs":1725416781169.3042,"mtimeMs":1725416780844.2458,"ctimeMs":1725416780844.2458,"birthtimeMs":1720371496322.7202,"atime":"2024-09-04T02:26:21.169Z","mtime":"2024-09-04T02:26:20.844Z","ctime":"2024-09-04T02:26:20.844Z","birthtime":"2024-07-07T16:58:16.323Z"},"/simple.txt":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":23158183,"size":574,"blocks":8,"atimeMs":1722471474116.0154,"mtimeMs":1722471464493.8396,"ctimeMs":1722471464493.8396,"birthtimeMs":1722471464493.8027,"atime":"2024-08-01T00:17:54.116Z","mtime":"2024-08-01T00:17:44.494Z","ctime":"2024-08-01T00:17:44.494Z","birthtime":"2024-08-01T00:17:44.494Z"},"/watr-fluid.mp3":{"dev":16777231,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":24230190,"size":5182693,"blocks":10128,"atimeMs":1725417146098.874,"mtimeMs":1725416780871.0623,"ctimeMs":1725416780871.0623,"birthtimeMs":1725416780844.516,"atime":"2024-09-04T02:32:26.099Z","mtime":"2024-09-04T02:26:20.871Z","ctime":"2024-09-04T02:26:20.871Z","birthtime":"2024-09-04T02:26:20.845Z"},"/":{"dev":16777231,"mode":16877,"nlink":12,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":22575083,"size":384,"blocks":0,"atimeMs":1725420887080.986,"mtimeMs":1725420883573.3955,"ctimeMs":1725420883573.3955,"birthtimeMs":1720371496242.8938,"atime":"2024-09-04T03:34:47.081Z","mtime":"2024-09-04T03:34:43.573Z","ctime":"2024-09-04T03:34:43.573Z","birthtime":"2024-07-07T16:58:16.243Z"}}} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 21721b92..aeff3347 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,8 @@ "@angular/platform-browser": "^18.0.0", "@angular/platform-browser-dynamic": "^18.0.0", "@angular/router": "^18.0.0", + "@zenfs/core": "^0.16.4", + "@zenfs/dom": "^0.2.14", "angular2-draggable": "^16.0.0", "browserfs": "^1.4.3", "emulators": "^0.73.7", @@ -6418,7 +6420,6 @@ "version": "22.0.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.0.2.tgz", "integrity": "sha512-yPL6DyFwY5PiMVEwymNeqUTKsDczQBJ/5T7W/46RwLU/VH+AA8aT5TZkvBviLKLbbm0hlfftEkGrNzfRk/fofQ==", - "dev": true, "dependencies": { "undici-types": "~6.11.1" } @@ -6444,6 +6445,20 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, + "node_modules/@types/readable-stream": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.15.tgz", + "integrity": "sha512-oAZ3kw+kJFkEqyh7xORZOku1YAKvsFTogRY8kVl4vHpEKiDkfnSA/My8haRE7fvmix5Zyy+1pwzOi7yycGLBJw==", + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, + "node_modules/@types/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/@types/retry": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", @@ -7142,6 +7157,94 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/@zenfs/core": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@zenfs/core/-/core-0.16.4.tgz", + "integrity": "sha512-QYT0tB3iHWo6q4KlSTl1zr2LWLgayNOHGPw5x+s926weH3Nrnw2Npe2gfLK05UFvXhhTynee8DgYGjFhgqBUmg==", + "dependencies": { + "@types/node": "^20.12.12", + "@types/readable-stream": "^4.0.10", + "buffer": "^6.0.3", + "eventemitter3": "^5.0.1", + "minimatch": "^9.0.3", + "readable-stream": "^4.5.2", + "utilium": "^0.4.0" + }, + "bin": { + "build": "scripts/build.js", + "make-index": "scripts/make-index.js" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/@zenfs/core/node_modules/@types/node": { + "version": "20.16.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.4.tgz", + "integrity": "sha512-ioyQ1zK9aGEomJ45zz8S8IdzElyxhvP1RVWnPrXDf6wFaUb+kk1tEcVVJkF7RPGM0VWI7cp5U57oCPIn5iN1qg==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@zenfs/core/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@zenfs/core/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/@zenfs/core/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@zenfs/core/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/@zenfs/dom": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/@zenfs/dom/-/dom-0.2.14.tgz", + "integrity": "sha512-2HRjrCUE7GsrZrZX0PACdbY+REt2n/aOykjPj4NdaxdP9f8M8w98E/2V5sa0KjGzgyhzMEF5FjJd0begPx8xHw==", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@zenfs/core": ">=0.12.10" + } + }, "node_modules/@zkochan/js-yaml": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", @@ -7170,6 +7273,17 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -7783,14 +7897,12 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -7927,7 +8039,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -10150,6 +10261,14 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -10160,7 +10279,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, "engines": { "node": ">=0.8.x" } @@ -11238,7 +11356,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -16404,7 +16521,6 @@ "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -18252,6 +18368,14 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -18836,7 +18960,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -19535,7 +19658,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -20461,8 +20583,7 @@ "node_modules/undici-types": { "version": "6.11.1", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.11.1.tgz", - "integrity": "sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==", - "dev": true + "integrity": "sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -20632,6 +20753,19 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/utilium": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/utilium/-/utilium-0.4.4.tgz", + "integrity": "sha512-TjhvLLoSi3WmzAR1QMFwGykW31cEOzbVoPqqopY6UYcm+5MfsF0ep3+DuJmAnOlU/zglGDwR96j0hjiHfwP4og==", + "dependencies": { + "eventemitter3": "^5.0.1" + } + }, + "node_modules/utilium/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", diff --git a/package.json b/package.json index 4b96e83f..d96c76a9 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "ng": "ng", "start": "ng serve", "build": "npm run build:fs && ng build", - "build:fs": "cd src/osdrive && node ../../node_modules/browserfs/dist/scripts/make_http_index.js > ../osdrive.json", + "build:fs": "npx make-index src/osdrive", "clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build", @@ -36,6 +36,8 @@ "@angular/platform-browser": "^18.0.0", "@angular/platform-browser-dynamic": "^18.0.0", "@angular/router": "^18.0.0", + "@zenfs/core": "^0.16.4", + "@zenfs/dom": "^0.2.14", "angular2-draggable": "^16.0.0", "browserfs": "^1.4.3", "emulators": "^0.73.7", diff --git a/src/app/shared/system-service/file.service.ts b/src/app/shared/system-service/file.service.ts index 13a37d62..606f463e 100644 --- a/src/app/shared/system-service/file.service.ts +++ b/src/app/shared/system-service/file.service.ts @@ -1,7 +1,7 @@ import { Injectable } from "@angular/core"; import { FileInfo } from "src/app/system-files/fileinfo"; import { ShortCut } from "src/app/system-files/shortcut"; -import {extname, basename, resolve, dirname} from 'path'; +import { extname, basename, resolve, dirname, join } from 'path'; import { Constants } from "src/app/system-files/constants"; import { FSModule } from "browserfs/dist/node/core/FS"; import { FileEntry } from 'src/app/system-files/fileentry'; @@ -13,6 +13,11 @@ import { Buffer } from 'buffer'; import osDriveFileSystemIndex from '../../../osdrive.json'; import ini from 'ini'; +import OSFileSystemIndex from '../../../../index.json'; +import {configure, fs, Overlay, Fetch, FileContents} from '@zenfs/core'; +import {IndexedDB} from '@zenfs/dom'; +import { IndexData } from "@zenfs/core/backends/index/index.js"; + @Injectable({ providedIn: 'root' }) @@ -22,6 +27,7 @@ export class FileService{ static instace:FileService; private _fileInfo!:FileInfo; private _consts:Constants = new Constants(); + private _isFileSystemInit = false; private _fileSystem!:FSModule; private _directoryFileEntires:FileEntry[]=[]; private _fileExistsMap!:Map; @@ -37,116 +43,45 @@ export class FileService{ FileService.instace = this; } - private async initBrowserFsAsync():Promise{ - if(!this._fileSystem){ - return new Promise((resolve, reject) => { - BrowserFS.configure({ - fs: "MountableFileSystem", - options:{ - '/':{ - fs: 'OverlayFS', - options:{ - readable:{fs: 'XmlHttpRequest', options:{index: osDriveFileSystemIndex, baseUrl:'osdrive'}}, - writable:{fs:"IndexedDB", options: {storeName: "browser-fs-cache"}} - }, - }, - }}, - (err) =>{ - if(err){ - console.log('initBrowserFs Error:', err) - reject(); - } - }); - this._fileSystem = BrowserFS.BFSRequire('fs') - resolve(); - }); - } - } - - private changeFolderIcon(fileName:string, iconPath:string):string{ - - if(fileName === 'Music'){ - return '/osdrive/icons/music_folder.ico'; - }else if(fileName === 'Videos'){ - return '/osdrive/icons/video_folder.ico'; - - }else if(fileName === 'Pictures'){ - return '/osdrive/icons/picture_folder.ico'; - } - else if(fileName === 'Desktop'){ - return '/osdrive/icons/desktop_folder.ico'; - } - else if(fileName === 'Documents'){ - return '/osdrive/icons/documents_folder.ico'; - } - else if(fileName === 'Downloads'){ - return '/osdrive/icons/downloads_folder.ico'; - } - return iconPath; - } - public async checkIfDirectory(path: string):Promise { - - return new Promise((resolve, reject) =>{ - this._fileSystem.stat(path,(err, stats) =>{ - if(err){ - console.log('checkIfDirectory error:',err) - reject(err) - } - - const isDirectory = (stats)? stats.isDirectory(): false; - resolve(isDirectory); - }); - }); - } - - public async checkIfExistsAsync(dirPath:string):Promise{ - - return new Promise((resolve) =>{ - this._fileSystem.exists(`${dirPath}`,(exits) =>{ - if(exits){ - console.log('checkIfExistsAsync :Already exists',exits); - resolve(true) - }else{ - console.log('checkIfExistsAsync :Does not exists',exits); - resolve(false); - } - }); - }) - } - - public async copyFileAsync(sourcePath:string, destinationPath:string):Promise{ - const fileName = this.getFileName(sourcePath); - //console.log(`Destination: ${destinationPath}/${fileName}`); - return new Promise((resolve, reject) =>{ - this._fileSystem.readFile(sourcePath,(err, contents = Buffer.from('')) =>{ - if(err){ - console.log('copyFileAsync error:',err) - reject(false) - }else{ - this._fileSystem.writeFile(`${destinationPath}/${fileName}`, contents, {flag: 'wx'}, (err) =>{ - if(err?.code === 'EEXIST' ){ - console.log('copyFileAsync Error: file already exists',err); - // if file exists, increment it simple.txt, simple(1).txt ... - const itrName = this.iterateFileName(`${destinationPath}/${fileName}`); - this._fileSystem.writeFile(itrName,contents,(err) =>{ - if(err){ - console.log('copyFileAsync Iterate Error:',err); - reject(false); - } - resolve(true); - }); - }else{ - console.log('copyFileAsync Error:',err); - this._fileExistsMap.set(`${destinationPath}/${fileName}`,0); - resolve(true); - } - }); - } - }); - }); - } + private async initZenFSAsync(): Promise { + if (this._isFileSystemInit) { + return; + } + await configure({ + mounts: { + '/': { + backend: Overlay, + readable: { backend: Fetch, index: OSFileSystemIndex as IndexData, baseUrl: 'osdrive' }, + writable: { backend: IndexedDB, storeName: 'fs-cache' }, + }, + }, + }); + this._isFileSystemInit = true; + } + + private changeFolderIcon(fileName: string, iconPath: string): string { + const baseUrl = '/osdrive'; + const iconMaybe = `/icons/${fileName.toLocaleLowerCase()}_folder.ico`; + return fs.existsSync(iconMaybe) ? `${baseUrl}${iconMaybe}` : iconPath; + } + + public async checkIfDirectory(path: string): Promise { + const stats = await fs.promises.stat(path); + return stats?.isDirectory(); + } + + public async checkIfExistsAsync(dirPath: string): Promise { + return fs.promises.exists(dirPath); + } + + public async copyFileAsync(sourcePath: string, destinationPath: string): Promise { + const fileName = this.fileName(sourcePath); + console.log(`Destination: ${destinationPath}/${fileName}`); + await fs.promises.copyFile(sourcePath, `${destinationPath}/${fileName}`); + return true; + } public async copyHandler(arg0:string, sourcePathArg:string, destinationArg:string):Promise{ @@ -189,7 +124,7 @@ export class FileService{ } - public async createFolderAsync(directory:string, fileName:string):Promise{ + public async createFolderAsync_OLD(directory:string, fileName:string):Promise{ return new Promise((resolve, reject) =>{ this._fileSystem.mkdir(`${directory}/${fileName}`,0o777,(err) =>{ if(err?.code === 'EEXIST' ){ @@ -211,7 +146,12 @@ export class FileService{ }); } - public async deleteFolderAsync(directory:string):Promise{ + public async createFolderAsync(directory: string, fileName: string): Promise { + await fs.promises.mkdir(join(directory, fileName)); + return true; + } + + public async deleteFolderAsync_OLD(directory:string):Promise{ return new Promise((resolve, reject) =>{ this._fileSystem.exists(`${directory}/`, (err) =>{ if(err){ @@ -229,19 +169,17 @@ export class FileService{ }) } - public async deleteFileAsync(path:string): Promise { - return new Promise((resolve, reject) =>{ - this._fileSystem.unlink(path,(err) =>{ - if(err){ - console.log('deleteFileAsync error:',err) - reject(false) - } - resolve(true); - }); - }) - } + public async deleteFolderAsync(directory: string): Promise { + await fs.promises.rmdir(directory); + return true; + } + + public async deleteFileAsync(path: string): Promise { + await fs.promises.unlink(path); + return true; + } - public async getExtraFileMetaDataAsync(path: string): Promise { + public async getExtraFileMetaDataAsync_OLD(path: string): Promise { return new Promise((resolve, reject) =>{ this._fileSystem.exists(`${path}`,(exits) =>{ @@ -261,23 +199,20 @@ export class FileService{ }); } - public async getFileAsync(path:string): Promise { - if (!path) { - console.error('getFileAsync error: Path must not be empty'); - return Promise.reject(new Error('Path must not be empty')); - } + public async getExtraFileMetaDataAsync(path: string) { + const stats = await fs.promises.stat(path); + return new FileMetaData(stats?.ctime, stats?.mtime, stats?.size, stats?.mode); + } - return new Promise((resolve, reject) =>{ - this._fileSystem.readFile(path,(err, contents = Buffer.from('')) =>{ - if(err){ - console.log('getFileAsync error:',err) - reject(err) - }else{ - resolve(contents.toString()); - } - }); - }); - } + + public async getFileAsync(path: string): Promise { + if (!path) { + console.error('getFileAsync error: Path must not be empty'); + throw new Error('Path must not be empty'); + } + + return await fs.promises.readFile(path, 'utf8'); + } /** * @@ -290,48 +225,28 @@ export class FileService{ * If the file is read successfully, it converts the file contents (buffer) into a Blob URL using the bufferToUrl method. * It then resolves the promise with the Blob URL. */ - public async getFileBlobAsync(path:string): Promise { - if (!path) { - console.error('getFileBlobAsync error: Path must not be empty'); - return Promise.reject(new Error('Path must not be empty')); - } - return new Promise((resolve, reject) =>{ - this._fileSystem.readFile(path,(err, contents = Buffer.from('')) =>{ - if(err){ - console.log('getFileBlobAsync error:',err) - reject(err); - } + public async getFileBlobAsync(path: string): Promise { + if (!path) { + console.error('getFileBlobAsync error: Path must not be empty'); + throw new Error('Path must not be empty'); + } - contents = contents || new Uint8Array(); - const fileUrl = this.bufferToUrl(contents); - resolve(fileUrl); - }); - }); - } + const contents = await fs.promises.readFile(path); + return URL.createObjectURL(new Blob([contents])); + } - public async getEntriesFromDirectoryAsync(path:string):Promise{ - if (!path) { - console.error('getEntriesFromDirectoryAsync error: Path must not be empty'); - return Promise.reject(new Error('Path must not be empty')); - } + public async getEntriesFromDirectoryAsync(path: string): Promise { + if (!path) { + console.error('getEntriesFromDirectoryAsync error: Path must not be empty'); + return Promise.reject(new Error('Path must not be empty')); + } - await this.initBrowserFsAsync(); - - return new Promise((resolve, reject) => { - const fs = this._fileSystem; - setTimeout(() => { - fs.readdir(path, function(err, files) { - if(err){ - console.log("Oops! a boo boo happened, filesystem wasn't ready:", err); - reject([]); - }else{ - resolve(files || []); - } - }); - }, this.SECONDS_DELAY); - }); - } + /** This is where ZenFS is initialized */ + await this.initZenFSAsync(); + return await fs.promises.readdir(path); + + } public getFileEntriesFromDirectory(fileList:string[], directory:string):FileEntry[]{ @@ -349,6 +264,10 @@ export class FileService{ return `${basename(path, extname(path))}${ extname(path)}`; } + private fileName(path: string): string { + return `${basename(path, extname(path))}${extname(path)}`; + } + public async getFileInfoAsync(path:string):Promise{ const extension = extname(path); this._fileInfo = new FileInfo(); @@ -467,66 +386,52 @@ export class FileService{ return this._fileInfo; } - public async getShortCutFromB64DataUrlAsync(path:string, contentType:string):Promise { + public async getShortCutFromB64DataUrlAsync(path: string, contentType: string): Promise { - return new Promise((resolve, reject) =>{ - this._fileSystem.readFile(path, (err, contents = Buffer.from('')) =>{ - if(err){ - console.log('getShortCutFromB64DataUrlAsync error:',err) - reject(err) - } + const contents = await fs.promises.readFile(path); + + const stringData = contents.toString('utf-8'); + if (this.isUtf8Encoded(stringData)) { + if (stringData.substring(0, 10) == 'data:image' || stringData.substring(0, 10) == 'data:video' || stringData.substring(0, 10) == 'data:audio') { + // Extract Base64-encoded string from Data URL + const base64Data = contents.toString().split(',')[1]; + const encoding: BufferEncoding = 'base64'; + const cntntData = Buffer.from(base64Data, encoding); + const fileUrl = this.bufferToUrl(cntntData); + + if (stringData.substring(0, 10) == 'data:image') + return new ShortCut(fileUrl, basename(path, extname(path)), '', fileUrl, ''); + else + return new ShortCut('', basename(path, extname(path)), '', fileUrl, ''); + } else { + const fileUrl = this.bufferToUrl2(contents); + if (contentType === 'image') + return new ShortCut(fileUrl, basename(path, extname(path)), '', fileUrl, ''); + else + return new ShortCut('', basename(path, extname(path)), '', fileUrl, ''); + } + } + + return new ShortCut('', basename(path, extname(path)), '', this.bufferToUrl2(contents), ''); + } - const encoding:BufferEncoding = 'utf8'; - const stringData = contents.toString(encoding); - - if(this.isUtf8Encoded(stringData)){ - if(stringData.substring(0, 10) == 'data:image' || stringData.substring(0, 10) == 'data:video' || stringData.substring(0, 10) == 'data:audio'){ - - // Extract Base64-encoded string from Data URL - const base64Data = contents.toString().split(',')[1]; - const encoding:BufferEncoding = 'base64'; - const cntntData = Buffer.from(base64Data, encoding); - const fileUrl = this.bufferToUrl(cntntData); - - if(stringData.substring(0, 10) == 'data:image') - resolve(new ShortCut(fileUrl, basename(path, extname(path)),'',fileUrl,'')); - else - resolve(new ShortCut('', basename(path, extname(path)),'',fileUrl,'')); - }else{ - const fileUrl = this.bufferToUrl2(contents) - if(contentType === 'image') - resolve(new ShortCut(fileUrl, basename(path, extname(path)),'',fileUrl,'')); - else - resolve(new ShortCut('', basename(path, extname(path)),'',fileUrl,'')); - } - }else{ - resolve(new ShortCut('', basename(path, extname(path)),'',this.bufferToUrl2(contents),'')); - } - }); - }); - } - public async getShortCutFromURLAsync(path:string):Promise{ - return new Promise((resolve, reject) =>{ - this._fileSystem.readFile(path, function(err, contents = Buffer.from('')){ - if(err){ - console.log('getShortCutAsync error:',err) - reject(new ShortCut('','','','','')); - } - const stage = contents? contents.toString(): Buffer.from('').toString(); - const shortCut = ini.parse(stage) as unknown || {InternetShortcut:{ FileName:'hi', IconPath:'', FileType:'',ContentPath:'', OpensWith:''}}; - if (typeof shortCut === 'object') { - const iSCut = (shortCut as {InternetShortcut:unknown})?.['InternetShortcut']; - const fileName= (iSCut as {FileName:unknown})?.['FileName'] as string; - const iconPath = (iSCut as {IconPath:unknown})?.['IconPath'] as string; - const fileType = (iSCut as {FileType:unknown})?.['FileType'] as string; - const contentPath = (iSCut as {ContentPath:unknown})?.['ContentPath'] as string; - const opensWith = (iSCut as {OpensWith:unknown})?.['OpensWith'] as string; - resolve(new ShortCut(iconPath,fileName,fileType,contentPath,opensWith)); - } - }); - }); + const contents = await fs.promises.readFile(path); + + const stage = contents? contents.toString(): Buffer.from('').toString(); + const shortCut = ini.parse(stage) as unknown || {InternetShortcut:{ FileName:'', IconPath:'', FileType:'',ContentPath:'', OpensWith:''}}; + if (typeof shortCut === 'object') { + const iSCut = (shortCut as {InternetShortcut:unknown})?.['InternetShortcut']; + const fileName= (iSCut as {FileName:unknown})?.['FileName'] as string; + const iconPath = (iSCut as {IconPath:unknown})?.['IconPath'] as string; + const fileType = (iSCut as {FileType:unknown})?.['FileType'] as string; + const contentPath = (iSCut as {ContentPath:unknown})?.['ContentPath'] as string; + const opensWith = (iSCut as {OpensWith:unknown})?.['OpensWith'] as string; + return new ShortCut(iconPath,fileName,fileType,contentPath,opensWith); + } + + return new ShortCut('','','','',''); } public async movehandler(destinationArg:string, folderQueue:string[]):Promise{ @@ -572,56 +477,40 @@ export class FileService{ } public async writeFilesAsync(directory:string, files:File[]):Promise{ - - return new Promise((resolve, reject) =>{ - files.forEach((file)=>{ - const fileReader = new FileReader() - fileReader.readAsDataURL(file); - - fileReader.onload = (evt) =>{ - - this._fileSystem.writeFile(`${directory}/${file.name}`,evt.target?.result, {flag: 'wx'}, (err) =>{ - if(err?.code === 'EEXIST' ){ - console.log('writeFileAsync Error: file already exists',err); - - const itrName = this.iterateFileName(`${directory}/${file.name}`); - this._fileSystem.writeFile(itrName,evt.target?.result,(err) =>{ - if(err){ - console.log('writeFileAsync Iterate Error:',err); - reject(err); - } - resolve(true); - }); - }else{ - this._fileExistsMap.set(`${directory}/${file.name}`,0); - resolve(true); - } - }); + files.forEach((file)=>{ + const fileReader = new FileReader() + fileReader.readAsDataURL(file); + + fileReader.onload = async (evt) =>{ + const exists = await fs.promises.exists(`${directory}/${file.name}`); + if(exists){ + console.log('writeFileAsync Error: file already exists'); + const itrName = this.iterateFileName(`${directory}/${file.name}`); + await fs.promises.writeFile(itrName,evt.target?.result as FileContents, {flag: 'wx'}) + }else{ + await fs.promises.writeFile(`${directory}/${file.name}`,evt.target?.result as FileContents, {flag: 'wx'}) + this._fileExistsMap.set(`${directory}/${file.name}`,0); } - }) - }); + } + }) + + // write is not done when true is returned + return true } public async writeFileAsync(directory:string, file:FileInfo):Promise{ - return new Promise((resolve, reject) =>{ - this._fileSystem.writeFile(`${directory}/${file.getFileName}`, file.getContentPath, {flag: 'wx'}, (err) =>{ - if(err?.code === 'EEXIST' ){ - console.log('writeFileAsync Error: file already exists',err); - const itrName = this.iterateFileName(`${directory}/${file.getFileName}`); - this._fileSystem.writeFile(itrName,file.getContentPath,(err) =>{ - if(err){ - console.log('writeFileAsync Iterate Error:',err); - reject(false); - } - resolve(true); - }); - }else{ - this._fileExistsMap.set(`${directory}/${file.getFileName}`,0); - resolve(true); - } - }); - }); + const exists = await fs.promises.exists(`${directory}/${file.getFileName}`); + if(exists){ + console.log('writeFileAsync Error: file already exists'); + const itrName = this.iterateFileName(`${directory}/${file.getFileName}`); + await fs.promises.writeFile(itrName, file.getContentPath, {flag: 'wx'}) + }else{ + await fs.promises.writeFile(`${directory}/${file.getFileName}`, file.getContentPath, {flag: 'wx'}) + this._fileExistsMap.set(`${directory}/${file.getFileName}`,0); + } + + return true; } @@ -664,27 +553,19 @@ export class FileService{ } public async renameAsync(path:string, newFileName:string, isFile:boolean): Promise { - - return new Promise((resolve, reject) =>{ - let rename = ''; let type = '' - if(isFile){ rename = `${dirname(path)}/${newFileName}${extname(path)}`; type = 'file'; - }else{ rename = `${dirname(path)}/${newFileName}`; type = 'folder'; } - - this._fileSystem.exists(`${rename}`, (err) =>{ - if(err){ - console.log(`renameAsync Error: ${type} already exists`,err); - reject(false); - }else{ - this._fileSystem.rename(`${path}`,rename,(err) =>{ - if(err){ - console.log(`renameAsync Error: ${type} rename`,err); - reject(false); - } - resolve(true); - }); - } - }); - }); + + let rename = ''; let type = '' + if(isFile){ rename = `${dirname(path)}/${newFileName}${extname(path)}`; type = 'file'; + }else{ rename = `${dirname(path)}/${newFileName}`; type = 'folder'; } + + const exists = await fs.promises.exists(rename); + if(exists){ + console.log(`renameAsync Error: ${type} already exists`); + return false + } + + await fs.promises.rename(path, rename); + return true; } public resetDirectoryFiles(){ @@ -693,38 +574,14 @@ export class FileService{ //virtual filesystem, use copy and then delete public async moveFileAsync(currentPath:string, newPath:string): Promise { - - return new Promise((resolve, reject) =>{ - const fileName = this.getFileName(currentPath); - const newlocation = `${newPath}/${fileName}`; - this._fileSystem.readFile(currentPath, (err, contents = Buffer.from('')) =>{ - if(err){ - console.log('getFile in moveAsync error:',err) - reject(false) - }else{ - this._fileSystem.writeFile(`${newlocation}`, contents,(err)=>{ - if(err){ - console.log('writeFile in moveAsync error:',err); - reject(false); - }else{ - this._fileSystem.unlink(currentPath,(err) =>{ - if(err){ - console.log('unlink file error:',err) - reject(err) - } - console.log('successfully unlinked') - resolve(true); - }); - console.log('successfully renamed') - resolve(true); - } - }); - console.log('successfully fetched') - resolve(true); - } - }); - }); + const fileName = this.fileName(currentPath); + const newlocationPath = `${newPath}/${fileName}`; + + await fs.promises.copyFile(currentPath, newlocationPath); + await fs.promises.unlink(currentPath); + + return true; } public iterateFileName(path:string):string{ @@ -738,30 +595,20 @@ export class FileService{ return `${dirname(path)}/${filename} (${count})${extension}`; } - public async setFolderValuesAsync(path: string):Promise{ - return new Promise((resolve, reject) =>{ - this._fileSystem.exists(`${path}`,(exits) =>{ - if(exits){ - this._fileSystem.stat(path,(err, stats) =>{ - if(err){ - console.log('setFolderValuesAsync error:',err) - reject(new ShortCut('','','','','')); - } - - const isDirectory = (stats)? stats.isDirectory(): false; - const iconFile = `/osdrive/icons/${isDirectory ? 'folder.ico' : 'unknown.ico'}` - const fileType = 'folder'; - const opensWith ='fileexplorer' - resolve(new ShortCut(iconFile, basename(path, extname(path)),fileType,basename(path, extname(path)) ,opensWith )); - }); - }else{ - console.log('setFolderValuesAsync :Does not exists',exits); - resolve(new ShortCut('','','','','' )); - } - }); - - }); + public async setFolderValuesAsync(path: string):Promise{ + const exists = await fs.promises.exists(path); + + if(exists){ + const stats = await fs.promises.stat(path); + const isDirectory = stats?.isDirectory(); + const iconFile = `/osdrive/icons/${isDirectory ? 'folder.ico' : 'unknown.ico'}` + const fileType = 'folder'; + const opensWith ='fileexplorer' + return new ShortCut(iconFile, basename(path, extname(path)),fileType,basename(path, extname(path)) ,opensWith ); + } + + return new ShortCut('','','','','' ) } private bufferToUrl(buffer:Buffer):string{ @@ -787,7 +634,7 @@ export class FileService{ } catch (error) { return false; } - } + } addEventOriginator(eventOrig:string):void{ this._eventOriginator = eventOrig; diff --git a/src/app/system-apps/terminal/terminal.commands.ts b/src/app/system-apps/terminal/terminal.commands.ts index 77c10fb5..92dd3f4e 100644 --- a/src/app/system-apps/terminal/terminal.commands.ts +++ b/src/app/system-apps/terminal/terminal.commands.ts @@ -370,10 +370,11 @@ ${(file.getIsFile)? '-':'d'}${this.addspaces(strPermission,10)} ${this.addspaces this.fallBackDirPath = this.getFallBackPath(directory); } - // console.log('directory:', directory); + console.log('directory:', directory); // console.log('fallBackDirPath:', this.fallBackDirPath); const firstDirectoryCheck = await this._fileService.checkIfExistsAsync(directory); + console.log('firstDirectoryCheck:', firstDirectoryCheck); let secondDirectoryCheck = false; if(!firstDirectoryCheck){