diff --git a/package-lock.json b/package-lock.json index d7fef9d..2496677 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "react-dom": "^18.2.0", "react-router-dom": "^6.18.0", "react-scripts": "5.0.1", + "react-spinners": "^0.13.8", "socket.io-client": "^4.7.2", "typescript": "^4.9.5", "web-vitals": "^2.1.4" @@ -14645,6 +14646,15 @@ } } }, + "node_modules/react-spinners": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz", + "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==", + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", diff --git a/package.json b/package.json index 63f827d..616e2ce 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "react-dom": "^18.2.0", "react-router-dom": "^6.18.0", "react-scripts": "5.0.1", + "react-spinners": "^0.13.8", "socket.io-client": "^4.7.2", "typescript": "^4.9.5", "web-vitals": "^2.1.4" diff --git a/public/1488.gif b/public/1488.gif new file mode 100644 index 0000000..44430b8 Binary files /dev/null and b/public/1488.gif differ diff --git a/server/file b/server/file deleted file mode 100644 index 234356c..0000000 --- a/server/file +++ /dev/null @@ -1,2302 +0,0 @@ -{ - "layer": [ - { - "index": 0, - "id": "31609b718dd2bed92b93b1ab00c0ff67419a3121d0144bef0dc6ca49718820a7", - "digestId": "sha256:50644c29ef5a27c9a40c393a73ece2479de78325cae7d762ef3cdc19bf42dd0a", - "sizeBytes": 5570176, - "command": "#(nop) ADD file:c92c248239f8c7b9b3c067650954815f391b7bcb09023f984972c082ace2a8d0 in / " - }, - { - "index": 1, - "id": "d11966cc6136dd7fe56abb21ebde009e79f2af6ddb72aeabf26ac04421525931", - "digestId": "sha256:c5032860739e1de2c7ea0433dd3393545188dfa9dc8f09b8b5e147aaca2ae94e", - "sizeBytes": 76314345, - "command": "addgroup -g 1000 node \u0026\u0026 adduser -u 1000 -G node -s /bin/sh -D node \u0026\u0026 apk add --no-cache libstdc++ \u0026\u0026 apk add --no-cache --virtual .build-deps curl \u0026\u0026 ARCH= \u0026\u0026 alpineArch=\"$(apk --print-arch)\" \u0026\u0026 case \"${alpineArch##*-}\" in x86_64) ARCH='x64' CHECKSUM=\"14dafe026366e7a9cc8d4737b1fcdcb6c534667e22bbeea63a29a1791ac6ac1f\" ;; *) ;; esac \u0026\u0026 if [ -n \"${CHECKSUM}\" ]; then set -eu; curl -fsSLO --compressed \"https://unofficial-builds.nodejs.org/download/release/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz\"; echo \"$CHECKSUM node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz\" | sha256sum -c - \u0026\u0026 tar -xJf \"node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz\" -C /usr/local --strip-components=1 --no-same-owner \u0026\u0026 ln -s /usr/local/bin/node /usr/local/bin/nodejs; else echo \"Building from source\" \u0026\u0026 apk add --no-cache --virtual .build-deps-full binutils-gold g++ gcc gnupg libgcc linux-headers make python \u0026\u0026 for key in 4ED778F539E3634C779C87C6D7062848A1AB005C 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C DD8F2338BAE7501E3DD5AC78C273792F7D83545D A48C2BEE680E841632CD4E44F07496B3EB3C1762 B9E2F5981AA6E0CD28160D9FF13993A75599653C ; do gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys \"$key\" || gpg --batch --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys \"$key\" || gpg --batch --keyserver hkp://pgp.mit.edu:80 --recv-keys \"$key\" ; done \u0026\u0026 curl -fsSLO --compressed \"https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION.tar.xz\" \u0026\u0026 curl -fsSLO --compressed \"https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc\" \u0026\u0026 gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \u0026\u0026 grep \" node-v$NODE_VERSION.tar.xz\\$\" SHASUMS256.txt | sha256sum -c - \u0026\u0026 tar -xf \"node-v$NODE_VERSION.tar.xz\" \u0026\u0026 cd \"node-v$NODE_VERSION\" \u0026\u0026 ./configure \u0026\u0026 make -j$(getconf _NPROCESSORS_ONLN) V= \u0026\u0026 make install \u0026\u0026 apk del .build-deps-full \u0026\u0026 cd .. \u0026\u0026 rm -Rf \"node-v$NODE_VERSION\" \u0026\u0026 rm \"node-v$NODE_VERSION.tar.xz\" SHASUMS256.txt.asc SHASUMS256.txt; fi \u0026\u0026 rm -f \"node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz\" \u0026\u0026 apk del .build-deps \u0026\u0026 node --version \u0026\u0026 npm --version" - }, - { - "index": 2, - "id": "e9f4ebbfd6566bc767f03724e525b162dc589044b5d403c561c5d755c1583950", - "digestId": "sha256:e56b7c9fd7ea7dae5043c1250ed2a59beda637f92592d8e80ed01ffac40c5aba", - "sizeBytes": 7837077, - "command": "apk add --no-cache --virtual .build-deps-yarn curl gnupg tar \u0026\u0026 for key in 6A010C5166006599AA17F08146C2130DFD2497F5 ; do gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys \"$key\" || gpg --batch --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys \"$key\" || gpg --batch --keyserver hkp://pgp.mit.edu:80 --recv-keys \"$key\" ; done \u0026\u0026 curl -fsSLO --compressed \"https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz\" \u0026\u0026 curl -fsSLO --compressed \"https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc\" \u0026\u0026 gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \u0026\u0026 mkdir -p /opt \u0026\u0026 tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \u0026\u0026 ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \u0026\u0026 ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \u0026\u0026 rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \u0026\u0026 apk del .build-deps-yarn \u0026\u0026 yarn --version" - }, - { - "index": 3, - "id": "06458f71c6c847f30258baa0790c149618cff9039f92c0ae00e6ee05348291a5", - "digestId": "sha256:630b99af65a5a3e031fcfe4da65177e4c07b7eaa4bd428b391c5ac80ab05960e", - "sizeBytes": 116, - "command": "#(nop) COPY file:238737301d47304174e4d24f4def935b29b3069c03c72ae8de97d94624382fce in /usr/local/bin/ " - }, - { - "index": 4, - "id": "940342e9eb5c6a72eb9d429fd7e8575541e38dd5500f5ba049a75fd6241a750a", - "digestId": "sha256:865a52cddc141ad9036921f5c7a980c3224afb6ce6ee2b2fbbbbbd15b0eaff98", - "sizeBytes": 0, - "command": "WORKDIR /app" - }, - { - "index": 5, - "id": "921f63ded98a71f98c350b00c1374009ad9dc41d8efd69623029ab7cba6d1756", - "digestId": "sha256:74ec235ec6595da49b0ed91783515a29bc0ef08505275e7a0adbed40740e1515", - "sizeBytes": 553, - "command": "COPY package.json /app # buildkit" - }, - { - "index": 6, - "id": "8d2bb710e90c0ae4bc233847c3590e913a38f8378cdb7bd8e62a775675162e2e", - "digestId": "sha256:793300befd0ea817c862d937b29c1a0366c5fa4e250f7a822c358c11f3944e51", - "sizeBytes": 4327431, - "command": "RUN /bin/sh -c npm install # buildkit" - }, - { - "index": 7, - "id": "1c5ee04ef9757d387e3ba1e9bad8658dea2db6409eed01837546b1af6a00613a", - "digestId": "sha256:a07914647b97bfe639fcebcf63bfd008f691c3a52214b378094f56ccbbcd10d7", - "sizeBytes": 6310945, - "command": "COPY . /app # buildkit" - } - ], - "image": { - "sizeBytes": 100360643, - "inefficientBytes": 4848041, - "efficiencyScore": 0.9746435761676019, - "fileReference": [ - { - "count": 3, - "sizeBytes": 643693, - "file": "/etc/ssl/certs/ca-certificates.crt" - }, - { - "count": 2, - "sizeBytes": 371764, - "file": "/app/node_modules/mime-db/db.json" - }, - { - "count": 2, - "sizeBytes": 226214, - "file": "/app/node_modules/express/History.md" - }, - { - "count": 2, - "sizeBytes": 138272, - "file": "/app/node_modules/qs/dist/qs.js" - }, - { - "count": 2, - "sizeBytes": 94640, - "file": "/app/node_modules/iconv-lite/encodings/tables/cp936.json" - }, - { - "count": 2, - "sizeBytes": 84712, - "file": "/app/node_modules/iconv-lite/encodings/tables/cp950.json" - }, - { - "count": 2, - "sizeBytes": 82128, - "file": "/app/node_modules/iconv-lite/encodings/tables/eucjp.json" - }, - { - "count": 2, - "sizeBytes": 76244, - "file": "/app/node_modules/iconv-lite/encodings/tables/cp949.json" - }, - { - "count": 2, - "sizeBytes": 71742, - "file": "/app/node_modules/qs/test/parse.js" - }, - { - "count": 2, - "sizeBytes": 70372, - "file": "/app/node_modules/qs/test/stringify.js" - }, - { - "count": 2, - "sizeBytes": 64068, - "file": "/app/node_modules/iconv-lite/encodings/sbcs-data-generated.js" - }, - { - "count": 2, - "sizeBytes": 63110, - "file": "/app/node_modules/mime/types.json" - }, - { - "count": 2, - "sizeBytes": 62974, - "file": "/app/node_modules/object-inspect/CHANGELOG.md" - }, - { - "count": 2, - "sizeBytes": 59322, - "file": "/app/node_modules/qs/CHANGELOG.md" - }, - { - "count": 2, - "sizeBytes": 56028, - "file": "/app/node_modules/express/lib/response.js" - }, - { - "count": 2, - "sizeBytes": 47564, - "file": "/app/node_modules/iconv-lite/encodings/tables/shiftjis.json" - }, - { - "count": 2, - "sizeBytes": 47004, - "file": "/app/node_modules/send/index.js" - }, - { - "count": 2, - "sizeBytes": 42830, - "file": "/app/node_modules/iconv-lite/encodings/dbcs-codec.js" - }, - { - "count": 2, - "sizeBytes": 41932, - "file": "/app/node_modules/qs/README.md" - }, - { - "count": 2, - "sizeBytes": 39110, - "file": "/app/node_modules/safe-buffer/README.md" - }, - { - "count": 2, - "sizeBytes": 38666, - "file": "/app/node_modules/ipaddr.js/lib/ipaddr.js" - }, - { - "count": 3, - "sizeBytes": 37531, - "file": "/lib/apk/db/installed" - }, - { - "count": 2, - "sizeBytes": 37164, - "file": "/app/node_modules/object-inspect/index.js" - }, - { - "count": 2, - "sizeBytes": 36394, - "file": "/app/node_modules/body-parser/README.md" - }, - { - "count": 2, - "sizeBytes": 36334, - "file": "/app/package-lock.json" - }, - { - "count": 2, - "sizeBytes": 35836, - "file": "/app/node_modules/debug/README.md" - }, - { - "count": 2, - "sizeBytes": 35434, - "file": "/app/node_modules/iconv-lite/encodings/tables/big5-added.json" - }, - { - "count": 2, - "sizeBytes": 32592, - "file": "/app/node_modules/body-parser/HISTORY.md" - }, - { - "count": 3, - "sizeBytes": 32256, - "file": "/lib/apk/db/scripts.tar" - }, - { - "count": 2, - "sizeBytes": 31470, - "file": "/app/node_modules/safer-buffer/tests.js" - }, - { - "count": 2, - "sizeBytes": 30248, - "file": "/app/node_modules/express/lib/router/index.js" - }, - { - "count": 2, - "sizeBytes": 29186, - "file": "/app/node_modules/express/lib/application.js" - }, - { - "count": 2, - "sizeBytes": 26646, - "file": "/app/node_modules/get-intrinsic/index.js" - }, - { - "count": 2, - "sizeBytes": 26602, - "file": "/app/node_modules/send/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 25588, - "file": "/app/node_modules/safer-buffer/Porting-Buffer.md" - }, - { - "count": 2, - "sizeBytes": 25162, - "file": "/app/node_modules/mime-db/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 25010, - "file": "/app/node_modules/express/lib/request.js" - }, - { - "count": 2, - "sizeBytes": 23414, - "file": "/app/node_modules/debug/CHANGELOG.md" - }, - { - "count": 2, - "sizeBytes": 22596, - "file": "/app/node_modules/cookie/README.md" - }, - { - "count": 2, - "sizeBytes": 21864, - "file": "/app/node_modules/depd/index.js" - }, - { - "count": 2, - "sizeBytes": 21188, - "file": "/app/node_modules/content-disposition/index.js" - }, - { - "count": 2, - "sizeBytes": 21074, - "file": "/app/node_modules/serve-static/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 20716, - "file": "/app/node_modules/qs/lib/stringify.js" - }, - { - "count": 2, - "sizeBytes": 19976, - "file": "/app/node_modules/depd/Readme.md" - }, - { - "count": 2, - "sizeBytes": 19476, - "file": "/app/node_modules/ipaddr.js/ipaddr.min.js" - }, - { - "count": 2, - "sizeBytes": 19266, - "file": "/app/node_modules/get-intrinsic/CHANGELOG.md" - }, - { - "count": 2, - "sizeBytes": 18952, - "file": "/app/node_modules/send/README.md" - }, - { - "count": 2, - "sizeBytes": 18946, - "file": "/app/node_modules/mime/CHANGELOG.md" - }, - { - "count": 2, - "sizeBytes": 18760, - "file": "/app/node_modules/qs/lib/parse.js" - }, - { - "count": 2, - "sizeBytes": 18430, - "file": "/app/node_modules/iconv-lite/encodings/utf7.js" - }, - { - "count": 2, - "sizeBytes": 17982, - "file": "/app/node_modules/function-bind/test/index.js" - }, - { - "count": 2, - "sizeBytes": 17624, - "file": "/app/node_modules/mime-types/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 17534, - "file": "/app/node_modules/get-intrinsic/test/GetIntrinsic.js" - }, - { - "count": 2, - "sizeBytes": 17476, - "file": "/app/node_modules/safe-buffer/index.d.ts" - }, - { - "count": 2, - "sizeBytes": 17402, - "file": "/app/node_modules/iconv-lite/lib/extend-node.js" - }, - { - "count": 2, - "sizeBytes": 16618, - "file": "/app/node_modules/ipaddr.js/README.md" - }, - { - "count": 2, - "sizeBytes": 16582, - "file": "/app/node_modules/iconv-lite/encodings/dbcs-data.js" - }, - { - "count": 2, - "sizeBytes": 16522, - "file": "/app/node_modules/safer-buffer/Readme.md" - }, - { - "count": 2, - "sizeBytes": 15624, - "file": "/app/node_modules/serve-static/README.md" - }, - { - "count": 2, - "sizeBytes": 15380, - "file": "/app/node_modules/has-symbols/CHANGELOG.md" - }, - { - "count": 2, - "sizeBytes": 14068, - "file": "/app/node_modules/object-inspect/test/values.js" - }, - { - "count": 2, - "sizeBytes": 13804, - "file": "/app/node_modules/raw-body/index.js" - }, - { - "count": 2, - "sizeBytes": 13646, - "file": "/app/node_modules/qs/lib/utils.js" - }, - { - "count": 2, - "sizeBytes": 13378, - "file": "/app/node_modules/finalhandler/index.js" - }, - { - "count": 2, - "sizeBytes": 13266, - "file": "/app/node_modules/object-inspect/test/indent-option.js" - }, - { - "count": 2, - "sizeBytes": 13068, - "file": "/app/node_modules/raw-body/README.md" - }, - { - "count": 2, - "sizeBytes": 13068, - "file": "/app/node_modules/iconv-lite/README.md" - }, - { - "count": 2, - "sizeBytes": 12782, - "file": "/app/node_modules/http-errors/index.js" - }, - { - "count": 2, - "sizeBytes": 12750, - "file": "/app/node_modules/media-typer/index.js" - }, - { - "count": 2, - "sizeBytes": 12230, - "file": "/app/node_modules/iconv-lite/encodings/internal.js" - }, - { - "count": 2, - "sizeBytes": 12030, - "file": "/app/node_modules/debug/src/node.js" - }, - { - "count": 2, - "sizeBytes": 12000, - "file": "/app/node_modules/proxy-addr/index.js" - }, - { - "count": 2, - "sizeBytes": 11924, - "file": "/app/node_modules/http-errors/README.md" - }, - { - "count": 2, - "sizeBytes": 11924, - "file": "/app/node_modules/raw-body/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 11910, - "file": "/app/node_modules/express/lib/utils.js" - }, - { - "count": 2, - "sizeBytes": 11594, - "file": "/app/node_modules/body-parser/lib/types/urlencoded.js" - }, - { - "count": 2, - "sizeBytes": 11214, - "file": "/app/node_modules/side-channel/CHANGELOG.md" - }, - { - "count": 2, - "sizeBytes": 11124, - "file": "/app/node_modules/type-is/index.js" - }, - { - "count": 2, - "sizeBytes": 10902, - "file": "/app/node_modules/function-bind/.travis.yml" - }, - { - "count": 2, - "sizeBytes": 10894, - "file": "/app/node_modules/type-is/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 10838, - "file": "/app/node_modules/express/Readme.md" - }, - { - "count": 2, - "sizeBytes": 10716, - "file": "/app/node_modules/negotiator/lib/mediaType.js" - }, - { - "count": 2, - "sizeBytes": 10504, - "file": "/app/node_modules/accepts/index.js" - }, - { - "count": 2, - "sizeBytes": 10448, - "file": "/app/node_modules/cookie/index.js" - }, - { - "count": 2, - "sizeBytes": 10410, - "file": "/app/node_modules/content-disposition/README.md" - }, - { - "count": 2, - "sizeBytes": 10366, - "file": "/app/node_modules/type-is/README.md" - }, - { - "count": 2, - "sizeBytes": 10320, - "file": "/app/node_modules/on-finished/README.md" - }, - { - "count": 2, - "sizeBytes": 10246, - "file": "/app/node_modules/iconv-lite/lib/index.js" - }, - { - "count": 2, - "sizeBytes": 10224, - "file": "/app/node_modules/qs/test/utils.js" - }, - { - "count": 2, - "sizeBytes": 10192, - "file": "/app/node_modules/accepts/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 10024, - "file": "/app/node_modules/body-parser/lib/types/json.js" - }, - { - "count": 2, - "sizeBytes": 10022, - "file": "/app/node_modules/iconv-lite/encodings/utf16.js" - }, - { - "count": 2, - "sizeBytes": 10004, - "file": "/app/node_modules/content-type/index.js" - }, - { - "count": 2, - "sizeBytes": 9892, - "file": "/app/node_modules/object-inspect/test/inspect.js" - }, - { - "count": 2, - "sizeBytes": 9802, - "file": "/app/node_modules/negotiator/README.md" - }, - { - "count": 2, - "sizeBytes": 9540, - "file": "/app/node_modules/bytes/Readme.md" - }, - { - "count": 2, - "sizeBytes": 9468, - "file": "/app/node_modules/debug/src/browser.js" - }, - { - "count": 2, - "sizeBytes": 9372, - "file": "/app/node_modules/iconv-lite/encodings/sbcs-data.js" - }, - { - "count": 2, - "sizeBytes": 9140, - "file": "/app/node_modules/serve-static/index.js" - }, - { - "count": 2, - "sizeBytes": 8860, - "file": "/app/node_modules/on-finished/index.js" - }, - { - "count": 2, - "sizeBytes": 8788, - "file": "/app/node_modules/debug/src/debug.js" - }, - { - "count": 2, - "sizeBytes": 8684, - "file": "/app/node_modules/iconv-lite/Changelog.md" - }, - { - "count": 2, - "sizeBytes": 8650, - "file": "/app/node_modules/body-parser/lib/read.js" - }, - { - "count": 2, - "sizeBytes": 8584, - "file": "/app/node_modules/finalhandler/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 8562, - "file": "/app/node_modules/express/lib/router/route.js" - }, - { - "count": 2, - "sizeBytes": 8516, - "file": "/app/node_modules/destroy/index.js" - }, - { - "count": 2, - "sizeBytes": 8396, - "file": "/app/node_modules/etag/README.md" - }, - { - "count": 2, - "sizeBytes": 8280, - "file": "/app/node_modules/function-bind/.jscs.json" - }, - { - "count": 2, - "sizeBytes": 8266, - "file": "/app/node_modules/finalhandler/README.md" - }, - { - "count": 2, - "sizeBytes": 8262, - "file": "/app/node_modules/proxy-addr/README.md" - }, - { - "count": 2, - "sizeBytes": 8246, - "file": "/app/node_modules/accepts/README.md" - }, - { - "count": 2, - "sizeBytes": 8188, - "file": "/app/node_modules/parseurl/README.md" - }, - { - "count": 2, - "sizeBytes": 8182, - "file": "/app/node_modules/mime-db/README.md" - }, - { - "count": 2, - "sizeBytes": 7946, - "file": "/app/node_modules/http-errors/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 7710, - "file": "/app/node_modules/encodeurl/README.md" - }, - { - "count": 2, - "sizeBytes": 7586, - "file": "/app/node_modules/express/package.json" - }, - { - "count": 2, - "sizeBytes": 7326, - "file": "/app/node_modules/mime-types/index.js" - }, - { - "count": 2, - "sizeBytes": 7295, - "file": "/app/node_modules/has-symbols/package.json" - }, - { - "count": 2, - "sizeBytes": 7226, - "file": "/app/node_modules/bytes/index.js" - }, - { - "count": 2, - "sizeBytes": 7137, - "file": "/app/node_modules/object-inspect/package.json" - }, - { - "count": 2, - "sizeBytes": 7118, - "file": "/app/node_modules/statuses/README.md" - }, - { - "count": 2, - "sizeBytes": 7012, - "file": "/app/node_modules/negotiator/lib/encoding.js" - }, - { - "count": 2, - "sizeBytes": 6962, - "file": "/app/node_modules/mime-types/README.md" - }, - { - "count": 2, - "sizeBytes": 6827, - "file": "/app/node_modules/get-intrinsic/package.json" - }, - { - "count": 2, - "sizeBytes": 6818, - "file": "/app/node_modules/negotiator/lib/language.js" - }, - { - "count": 2, - "sizeBytes": 6782, - "file": "/app/node_modules/side-channel/index.js" - }, - { - "count": 2, - "sizeBytes": 6774, - "file": "/app/node_modules/iconv-lite/lib/streams.js" - }, - { - "count": 2, - "sizeBytes": 6748, - "file": "/app/node_modules/fresh/README.md" - }, - { - "count": 2, - "sizeBytes": 6708, - "file": "/app/node_modules/call-bind/test/index.js" - }, - { - "count": 2, - "sizeBytes": 6662, - "file": "/app/node_modules/call-bind/CHANGELOG.md" - }, - { - "count": 2, - "sizeBytes": 6656, - "file": "/app/node_modules/path-to-regexp/index.js" - }, - { - "count": 2, - "sizeBytes": 6650, - "file": "/app/node_modules/express/lib/view.js" - }, - { - "count": 2, - "sizeBytes": 6592, - "file": "/app/node_modules/express/lib/router/layer.js" - }, - { - "count": 2, - "sizeBytes": 6240, - "file": "/app/node_modules/cookie/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 6162, - "file": "/app/node_modules/negotiator/lib/charset.js" - }, - { - "count": 2, - "sizeBytes": 6048, - "file": "/app/node_modules/send/node_modules/ms/index.js" - }, - { - "count": 2, - "sizeBytes": 5982, - "file": "/app/node_modules/proxy-addr/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 5918, - "file": "/app/node_modules/ipaddr.js/lib/ipaddr.js.d.ts" - }, - { - "count": 2, - "sizeBytes": 5868, - "file": "/app/node_modules/object-inspect/readme.markdown" - }, - { - "count": 2, - "sizeBytes": 5860, - "file": "/app/node_modules/vary/index.js" - }, - { - "count": 2, - "sizeBytes": 5800, - "file": "/app/node_modules/range-parser/index.js" - }, - { - "count": 2, - "sizeBytes": 5733, - "file": "/app/node_modules/qs/package.json" - }, - { - "count": 2, - "sizeBytes": 5697, - "file": "/app/node_modules/has-proto/package.json" - }, - { - "count": 2, - "sizeBytes": 5618, - "file": "/app/node_modules/parseurl/index.js" - }, - { - "count": 2, - "sizeBytes": 5582, - "file": "/app/node_modules/get-intrinsic/README.md" - }, - { - "count": 2, - "sizeBytes": 5564, - "file": "/app/node_modules/content-type/README.md" - }, - { - "count": 2, - "sizeBytes": 5528, - "file": "/app/node_modules/ms/index.js" - }, - { - "count": 2, - "sizeBytes": 5521, - "file": "/app/node_modules/call-bind/package.json" - }, - { - "count": 2, - "sizeBytes": 5469, - "file": "/app/node_modules/mime-db/package.json" - }, - { - "count": 2, - "sizeBytes": 5452, - "file": "/app/node_modules/mime/mime.js" - }, - { - "count": 2, - "sizeBytes": 5432, - "file": "/app/node_modules/vary/README.md" - }, - { - "count": 2, - "sizeBytes": 5422, - "file": "/app/node_modules/fresh/index.js" - }, - { - "count": 2, - "sizeBytes": 5362, - "file": "/app/node_modules/body-parser/index.js" - }, - { - "count": 2, - "sizeBytes": 5343, - "file": "/app/node_modules/send/package.json" - }, - { - "count": 2, - "sizeBytes": 5239, - "file": "/app/node_modules/side-channel/package.json" - }, - { - "count": 2, - "sizeBytes": 5234, - "file": "/app/node_modules/ee-first/README.md" - }, - { - "count": 2, - "sizeBytes": 5220, - "file": "/app/node_modules/statuses/index.js" - }, - { - "count": 2, - "sizeBytes": 5149, - "file": "/app/node_modules/body-parser/package.json" - }, - { - "count": 2, - "sizeBytes": 5101, - "file": "/app/node_modules/statuses/package.json" - }, - { - "count": 2, - "sizeBytes": 4998, - "file": "/app/node_modules/negotiator/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 4967, - "file": "/app/node_modules/http-errors/package.json" - }, - { - "count": 2, - "sizeBytes": 4958, - "file": "/app/node_modules/etag/index.js" - }, - { - "count": 2, - "sizeBytes": 4918, - "file": "/app/node_modules/destroy/README.md" - }, - { - "count": 2, - "sizeBytes": 4902, - "file": "/app/node_modules/negotiator/index.js" - }, - { - "count": 2, - "sizeBytes": 4875, - "file": "/app/node_modules/fresh/package.json" - }, - { - "count": 2, - "sizeBytes": 4861, - "file": "/app/node_modules/raw-body/package.json" - }, - { - "count": 2, - "sizeBytes": 4849, - "file": "/app/node_modules/function-bind/package.json" - }, - { - "count": 2, - "sizeBytes": 4818, - "file": "/app/node_modules/express/lib/express.js" - }, - { - "count": 2, - "sizeBytes": 4765, - "file": "/app/node_modules/range-parser/package.json" - }, - { - "count": 2, - "sizeBytes": 4758, - "file": "/app/node_modules/call-bind/test/callBound.js" - }, - { - "count": 2, - "sizeBytes": 4742, - "file": "/app/node_modules/media-typer/README.md" - }, - { - "count": 2, - "sizeBytes": 4729, - "file": "/app/node_modules/depd/package.json" - }, - { - "count": 2, - "sizeBytes": 4668, - "file": "/app/node_modules/mime/src/test.js" - }, - { - "count": 2, - "sizeBytes": 4641, - "file": "/app/node_modules/etag/package.json" - }, - { - "count": 2, - "sizeBytes": 4639, - "file": "/app/node_modules/content-disposition/package.json" - }, - { - "count": 2, - "sizeBytes": 4624, - "file": "/app/node_modules/object-inspect/test/number.js" - }, - { - "count": 2, - "sizeBytes": 4611, - "file": "/app/node_modules/mime-types/package.json" - }, - { - "count": 2, - "sizeBytes": 4577, - "file": "/app/node_modules/toidentifier/package.json" - }, - { - "count": 2, - "sizeBytes": 4572, - "file": "/app/node_modules/raw-body/index.d.ts" - }, - { - "count": 2, - "sizeBytes": 4571, - "file": "/app/node_modules/parseurl/package.json" - }, - { - "count": 2, - "sizeBytes": 4570, - "file": "/app/node_modules/body-parser/lib/types/text.js" - }, - { - "count": 2, - "sizeBytes": 4556, - "file": "/app/node_modules/range-parser/README.md" - }, - { - "count": 2, - "sizeBytes": 4512, - "file": "/app/node_modules/depd/History.md" - }, - { - "count": 2, - "sizeBytes": 4507, - "file": "/app/node_modules/finalhandler/package.json" - }, - { - "count": 2, - "sizeBytes": 4454, - "file": "/app/node_modules/object-inspect/test/fn.js" - }, - { - "count": 2, - "sizeBytes": 4432, - "file": "/app/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json" - }, - { - "count": 2, - "sizeBytes": 4417, - "file": "/app/node_modules/type-is/package.json" - }, - { - "count": 2, - "sizeBytes": 4413, - "file": "/app/node_modules/proxy-addr/package.json" - }, - { - "count": 2, - "sizeBytes": 4411, - "file": "/app/node_modules/accepts/package.json" - }, - { - "count": 2, - "sizeBytes": 4401, - "file": "/app/node_modules/on-finished/package.json" - }, - { - "count": 2, - "sizeBytes": 4393, - "file": "/app/node_modules/serve-static/package.json" - }, - { - "count": 2, - "sizeBytes": 4389, - "file": "/app/node_modules/debug/package.json" - }, - { - "count": 2, - "sizeBytes": 4382, - "file": "/app/node_modules/iconv-lite/encodings/sbcs-codec.js" - }, - { - "count": 2, - "sizeBytes": 4345, - "file": "/app/node_modules/vary/package.json" - }, - { - "count": 2, - "sizeBytes": 4343, - "file": "/app/node_modules/forwarded/package.json" - }, - { - "count": 2, - "sizeBytes": 4337, - "file": "/app/node_modules/encodeurl/package.json" - }, - { - "count": 2, - "sizeBytes": 4309, - "file": "/app/node_modules/cookie/package.json" - }, - { - "count": 2, - "sizeBytes": 4281, - "file": "/app/node_modules/content-type/package.json" - }, - { - "count": 2, - "sizeBytes": 4265, - "file": "/app/node_modules/setprototypeof/package.json" - }, - { - "count": 2, - "sizeBytes": 4238, - "file": "/app/node_modules/mime/README.md" - }, - { - "count": 2, - "sizeBytes": 4220, - "file": "/app/node_modules/safer-buffer/safer.js" - }, - { - "count": 2, - "sizeBytes": 4219, - "file": "/app/node_modules/negotiator/package.json" - }, - { - "count": 2, - "sizeBytes": 4209, - "file": "/app/node_modules/destroy/package.json" - }, - { - "count": 2, - "sizeBytes": 4164, - "file": "/app/node_modules/object-inspect/test/bigint.js" - }, - { - "count": 2, - "sizeBytes": 4107, - "file": "/app/node_modules/bytes/package.json" - }, - { - "count": 2, - "sizeBytes": 4095, - "file": "/app/node_modules/methods/package.json" - }, - { - "count": 2, - "sizeBytes": 4088, - "file": "/app/node_modules/has-symbols/README.md" - }, - { - "count": 2, - "sizeBytes": 4057, - "file": "/app/node_modules/merge-descriptors/package.json" - }, - { - "count": 2, - "sizeBytes": 4042, - "file": "/app/node_modules/has-symbols/test/tests.js" - }, - { - "count": 2, - "sizeBytes": 3937, - "file": "/app/node_modules/iconv-lite/package.json" - }, - { - "count": 2, - "sizeBytes": 3772, - "file": "/app/node_modules/send/node_modules/ms/readme.md" - }, - { - "count": 2, - "sizeBytes": 3769, - "file": "/app/node_modules/safe-buffer/package.json" - }, - { - "count": 2, - "sizeBytes": 3768, - "file": "/app/node_modules/body-parser/lib/types/raw.js" - }, - { - "count": 2, - "sizeBytes": 3730, - "file": "/app/node_modules/on-finished/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 3663, - "file": "/app/node_modules/ee-first/package.json" - }, - { - "count": 2, - "sizeBytes": 3609, - "file": "/app/node_modules/mime/package.json" - }, - { - "count": 2, - "sizeBytes": 3609, - "file": "/app/node_modules/unpipe/package.json" - }, - { - "count": 2, - "sizeBytes": 3606, - "file": "/app/node_modules/toidentifier/README.md" - }, - { - "count": 2, - "sizeBytes": 3581, - "file": "/app/node_modules/media-typer/package.json" - }, - { - "count": 2, - "sizeBytes": 3578, - "file": "/app/node_modules/statuses/codes.json" - }, - { - "count": 2, - "sizeBytes": 3550, - "file": "/app/node_modules/bytes/History.md" - }, - { - "count": 2, - "sizeBytes": 3522, - "file": "/app/node_modules/has-symbols/shams.js" - }, - { - "count": 2, - "sizeBytes": 3509, - "file": "/app/node_modules/has/package.json" - }, - { - "count": 2, - "sizeBytes": 3482, - "file": "/app/node_modules/side-channel/test/index.js" - }, - { - "count": 2, - "sizeBytes": 3472, - "file": "/app/node_modules/debug/karma.conf.js" - }, - { - "count": 2, - "sizeBytes": 3467, - "file": "/app/node_modules/safer-buffer/package.json" - }, - { - "count": 2, - "sizeBytes": 3464, - "file": "/app/node_modules/etag/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 3442, - "file": "/app/node_modules/ms/readme.md" - }, - { - "count": 2, - "sizeBytes": 3439, - "file": "/app/node_modules/ipaddr.js/package.json" - }, - { - "count": 2, - "sizeBytes": 3411, - "file": "/app/node_modules/utils-merge/package.json" - }, - { - "count": 2, - "sizeBytes": 3393, - "file": "/app/node_modules/array-flatten/package.json" - }, - { - "count": 2, - "sizeBytes": 3388, - "file": "/app/node_modules/methods/README.md" - }, - { - "count": 2, - "sizeBytes": 3368, - "file": "/app/node_modules/ee-first/index.js" - }, - { - "count": 2, - "sizeBytes": 3340, - "file": "/app/node_modules/safe-buffer/index.js" - }, - { - "count": 2, - "sizeBytes": 3308, - "file": "/app/node_modules/forwarded/README.md" - }, - { - "count": 2, - "sizeBytes": 3263, - "file": "/app/node_modules/send/node_modules/ms/package.json" - }, - { - "count": 2, - "sizeBytes": 3250, - "file": "/app/node_modules/inherits/README.md" - }, - { - "count": 2, - "sizeBytes": 3246, - "file": "/app/node_modules/has-proto/README.md" - }, - { - "count": 2, - "sizeBytes": 3200, - "file": "/app/node_modules/qs/LICENSE.md" - }, - { - "count": 2, - "sizeBytes": 3193, - "file": "/app/node_modules/ms/package.json" - }, - { - "count": 2, - "sizeBytes": 3172, - "file": "/app/node_modules/encodeurl/index.js" - }, - { - "count": 2, - "sizeBytes": 3156, - "file": "/app/node_modules/forwarded/index.js" - }, - { - "count": 2, - "sizeBytes": 3150, - "file": "/app/node_modules/object-inspect/test/element.js" - }, - { - "count": 2, - "sizeBytes": 3133, - "file": "/app/node_modules/cookie-signature/package.json" - }, - { - "count": 2, - "sizeBytes": 3092, - "file": "/app/node_modules/object-inspect/test/toStringTag.js" - }, - { - "count": 2, - "sizeBytes": 3092, - "file": "/app/node_modules/statuses/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 3072, - "file": "/app/node_modules/object-inspect/test/err.js" - }, - { - "count": 2, - "sizeBytes": 3067, - "file": "/app/node_modules/path-to-regexp/package.json" - }, - { - "count": 2, - "sizeBytes": 3065, - "file": "/app/node_modules/inherits/package.json" - }, - { - "count": 2, - "sizeBytes": 3024, - "file": "/app/node_modules/depd/lib/browser/index.js" - }, - { - "count": 2, - "sizeBytes": 3000, - "file": "/app/node_modules/fresh/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 2995, - "file": "/app/node_modules/escape-html/package.json" - }, - { - "count": 2, - "sizeBytes": 2980, - "file": "/app/node_modules/cookie-signature/Readme.md" - }, - { - "count": 2, - "sizeBytes": 2976, - "file": "/app/node_modules/function-bind/README.md" - }, - { - "count": 2, - "sizeBytes": 2966, - "file": "/app/node_modules/safer-buffer/dangerous.js" - }, - { - "count": 2, - "sizeBytes": 2926, - "file": "/app/node_modules/function-bind/implementation.js" - }, - { - "count": 2, - "sizeBytes": 2724, - "file": "/app/node_modules/escape-html/index.js" - }, - { - "count": 2, - "sizeBytes": 2702, - "file": "/app/node_modules/mime/src/build.js" - }, - { - "count": 2, - "sizeBytes": 2638, - "file": "/app/node_modules/utils-merge/README.md" - }, - { - "count": 2, - "sizeBytes": 2612, - "file": "/app/node_modules/call-bind/index.js" - }, - { - "count": 2, - "sizeBytes": 2608, - "file": "/app/node_modules/has-proto/CHANGELOG.md" - }, - { - "count": 2, - "sizeBytes": 2596, - "file": "/app/node_modules/object-inspect/.eslintrc" - }, - { - "count": 2, - "sizeBytes": 2500, - "file": "/app/node_modules/unpipe/README.md" - }, - { - "count": 2, - "sizeBytes": 2498, - "file": "/app/node_modules/express/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2490, - "file": "/app/node_modules/array-flatten/README.md" - }, - { - "count": 2, - "sizeBytes": 2460, - "file": "/app/node_modules/cookie-signature/index.js" - }, - { - "count": 2, - "sizeBytes": 2454, - "file": "/app/node_modules/iconv-lite/encodings/tables/gbk-added.json" - }, - { - "count": 2, - "sizeBytes": 2430, - "file": "/app/node_modules/merge-descriptors/index.js" - }, - { - "count": 2, - "sizeBytes": 2426, - "file": "/app/node_modules/merge-descriptors/README.md" - }, - { - "count": 2, - "sizeBytes": 2404, - "file": "/app/node_modules/finalhandler/SECURITY.md" - }, - { - "count": 2, - "sizeBytes": 2394, - "file": "/etc/passwd" - }, - { - "count": 2, - "sizeBytes": 2390, - "file": "/app/node_modules/array-flatten/array-flatten.js" - }, - { - "count": 2, - "sizeBytes": 2386, - "file": "/app/node_modules/body-parser/SECURITY.md" - }, - { - "count": 2, - "sizeBytes": 2378, - "file": "/app/node_modules/serve-static/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2376, - "file": "/app/node_modules/raw-body/SECURITY.md" - }, - { - "count": 2, - "sizeBytes": 2362, - "file": "/app/node_modules/raw-body/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2360, - "file": "/app/node_modules/methods/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2360, - "file": "/app/node_modules/cookie/SECURITY.md" - }, - { - "count": 2, - "sizeBytes": 2356, - "file": "/app/node_modules/range-parser/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2354, - "file": "/app/node_modules/negotiator/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2350, - "file": "/app/node_modules/cookie/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2348, - "file": "/app/node_modules/fresh/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2346, - "file": "/app/node_modules/parseurl/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2346, - "file": "/app/node_modules/destroy/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2344, - "file": "/app/node_modules/body-parser/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2344, - "file": "/app/node_modules/mime-db/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2344, - "file": "/app/node_modules/type-is/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2344, - "file": "/app/node_modules/statuses/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2340, - "file": "/app/node_modules/send/SECURITY.md" - }, - { - "count": 2, - "sizeBytes": 2336, - "file": "/app/node_modules/http-errors/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2334, - "file": "/app/node_modules/on-finished/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2334, - "file": "/app/node_modules/mime-types/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2334, - "file": "/app/node_modules/merge-descriptors/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2334, - "file": "/app/node_modules/accepts/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2314, - "file": "/app/node_modules/escape-html/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2306, - "file": "/app/node_modules/bytes/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2256, - "file": "/app/node_modules/send/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2238, - "file": "/app/node_modules/finalhandler/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2236, - "file": "/app/node_modules/unpipe/index.js" - }, - { - "count": 2, - "sizeBytes": 2228, - "file": "/app/node_modules/unpipe/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2218, - "file": "/app/node_modules/iconv-lite/lib/bom-handling.js" - }, - { - "count": 2, - "sizeBytes": 2216, - "file": "/app/node_modules/toidentifier/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2214, - "file": "/app/node_modules/debug/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2206, - "file": "/app/node_modules/path-to-regexp/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2206, - "file": "/app/node_modules/array-flatten/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2204, - "file": "/app/node_modules/path-to-regexp/Readme.md" - }, - { - "count": 2, - "sizeBytes": 2198, - "file": "/app/node_modules/ee-first/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2196, - "file": "/app/node_modules/mime/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2188, - "file": "/app/node_modules/content-disposition/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2188, - "file": "/app/node_modules/forwarded/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2188, - "file": "/app/node_modules/depd/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2188, - "file": "/app/node_modules/vary/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2188, - "file": "/app/node_modules/safer-buffer/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2188, - "file": "/app/node_modules/etag/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2188, - "file": "/app/node_modules/proxy-addr/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2178, - "file": "/app/node_modules/media-typer/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2178, - "file": "/app/node_modules/encodeurl/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2178, - "file": "/app/node_modules/content-type/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2174, - "file": "/app/node_modules/ipaddr.js/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2168, - "file": "/app/node_modules/utils-merge/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2162, - "file": "/app/node_modules/safe-buffer/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2158, - "file": "/app/node_modules/send/node_modules/ms/license.md" - }, - { - "count": 2, - "sizeBytes": 2154, - "file": "/app/node_modules/ms/license.md" - }, - { - "count": 2, - "sizeBytes": 2142, - "file": "/app/node_modules/side-channel/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2142, - "file": "/app/node_modules/object-inspect/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2142, - "file": "/app/node_modules/has-symbols/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2142, - "file": "/app/node_modules/call-bind/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2142, - "file": "/app/node_modules/get-intrinsic/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2134, - "file": "/app/node_modules/has-proto/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2128, - "file": "/app/node_modules/iconv-lite/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2120, - "file": "/app/node_modules/has/LICENSE-MIT" - }, - { - "count": 2, - "sizeBytes": 2118, - "file": "/app/node_modules/debug/Makefile" - }, - { - "count": 2, - "sizeBytes": 2104, - "file": "/app/node_modules/function-bind/LICENSE" - }, - { - "count": 2, - "sizeBytes": 2086, - "file": "/app/node_modules/parseurl/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 2080, - "file": "/app/node_modules/methods/index.js" - }, - { - "count": 2, - "sizeBytes": 2050, - "file": "/app/node_modules/qs/.eslintrc" - }, - { - "count": 2, - "sizeBytes": 2040, - "file": "/app/node_modules/content-disposition/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 1964, - "file": "/app/node_modules/iconv-lite/lib/index.d.ts" - }, - { - "count": 2, - "sizeBytes": 1866, - "file": "/app/node_modules/object-inspect/test/quoteStyle.js" - }, - { - "count": 2, - "sizeBytes": 1834, - "file": "/app/node_modules/range-parser/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 1770, - "file": "/app/node_modules/express/lib/middleware/query.js" - }, - { - "count": 2, - "sizeBytes": 1706, - "file": "/app/node_modules/express/lib/middleware/init.js" - }, - { - "count": 2, - "sizeBytes": 1688, - "file": "/app/node_modules/setprototypeof/README.md" - }, - { - "count": 2, - "sizeBytes": 1584, - "file": "/app/node_modules/vary/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 1506, - "file": "/app/node_modules/inherits/inherits_browser.js" - }, - { - "count": 2, - "sizeBytes": 1498, - "file": "/app/node_modules/inherits/LICENSE" - }, - { - "count": 2, - "sizeBytes": 1454, - "file": "/app/node_modules/setprototypeof/LICENSE" - }, - { - "count": 2, - "sizeBytes": 1446, - "file": "/app/node_modules/has-symbols/test/shams/core-js.js" - }, - { - "count": 2, - "sizeBytes": 1420, - "file": "/app/node_modules/iconv-lite/encodings/index.js" - }, - { - "count": 2, - "sizeBytes": 1414, - "file": "/app/node_modules/escape-html/Readme.md" - }, - { - "count": 2, - "sizeBytes": 1390, - "file": "/app/node_modules/cookie-signature/History.md" - }, - { - "count": 2, - "sizeBytes": 1388, - "file": "/app/node_modules/path-to-regexp/History.md" - }, - { - "count": 2, - "sizeBytes": 1381, - "file": "/etc/group" - }, - { - "count": 2, - "sizeBytes": 1380, - "file": "/app/node_modules/setprototypeof/test/index.js" - }, - { - "count": 2, - "sizeBytes": 1372, - "file": "/app/node_modules/has-symbols/test/shams/get-own-property-symbols.js" - }, - { - "count": 2, - "sizeBytes": 1366, - "file": "/app/node_modules/object-inspect/test/fakes.js" - }, - { - "count": 2, - "sizeBytes": 1308, - "file": "/app/node_modules/has-symbols/test/index.js" - }, - { - "count": 2, - "sizeBytes": 1206, - "file": "/app/node_modules/get-intrinsic/.eslintrc" - }, - { - "count": 2, - "sizeBytes": 1170, - "file": "/app/node_modules/object-inspect/.github/FUNDING.yml" - }, - { - "count": 2, - "sizeBytes": 1168, - "file": "/app/node_modules/get-intrinsic/.github/FUNDING.yml" - }, - { - "count": 2, - "sizeBytes": 1166, - "file": "/app/node_modules/side-channel/.github/FUNDING.yml" - }, - { - "count": 2, - "sizeBytes": 1164, - "file": "/app/node_modules/has-symbols/.github/FUNDING.yml" - }, - { - "count": 2, - "sizeBytes": 1160, - "file": "/app/node_modules/call-bind/.github/FUNDING.yml" - }, - { - "count": 2, - "sizeBytes": 1160, - "file": "/app/node_modules/has-proto/.github/FUNDING.yml" - }, - { - "count": 2, - "sizeBytes": 1138, - "file": "/app/node_modules/qs/.editorconfig" - }, - { - "count": 2, - "sizeBytes": 1106, - "file": "/app/package.json" - }, - { - "count": 2, - "sizeBytes": 1096, - "file": "/app/node_modules/qs/.github/FUNDING.yml" - }, - { - "count": 2, - "sizeBytes": 1068, - "file": "/app/node_modules/object-inspect/test-core-js.js" - }, - { - "count": 2, - "sizeBytes": 1046, - "file": "/app/node_modules/content-type/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 1028, - "file": "/app/node_modules/object-inspect/test/has.js" - }, - { - "count": 2, - "sizeBytes": 1008, - "file": "/app/node_modules/toidentifier/index.js" - }, - { - "count": 2, - "sizeBytes": 954, - "file": "/app/node_modules/has-proto/test/index.js" - }, - { - "count": 2, - "sizeBytes": 952, - "file": "/app/node_modules/qs/lib/formats.js" - }, - { - "count": 2, - "sizeBytes": 922, - "file": "/app/node_modules/media-typer/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 902, - "file": "/app/node_modules/object-inspect/test/circular.js" - }, - { - "count": 2, - "sizeBytes": 870, - "file": "/etc/shadow" - }, - { - "count": 2, - "sizeBytes": 854, - "file": "/app/node_modules/methods/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 840, - "file": "/app/node_modules/has-symbols/index.js" - }, - { - "count": 2, - "sizeBytes": 832, - "file": "/app/node_modules/object-inspect/test/browser/dom.js" - }, - { - "count": 2, - "sizeBytes": 826, - "file": "/app/node_modules/call-bind/callBound.js" - }, - { - "count": 2, - "sizeBytes": 814, - "file": "/app/node_modules/setprototypeof/index.js" - }, - { - "count": 2, - "sizeBytes": 800, - "file": "/app/node_modules/object-inspect/test/deep.js" - }, - { - "count": 2, - "sizeBytes": 800, - "file": "/app/node_modules/forwarded/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 782, - "file": "/app/node_modules/object-inspect/example/all.js" - }, - { - "count": 2, - "sizeBytes": 762, - "file": "/app/node_modules/utils-merge/index.js" - }, - { - "count": 2, - "sizeBytes": 746, - "file": "/app/node_modules/debug/src/inspector-log.js" - }, - { - "count": 2, - "sizeBytes": 730, - "file": "/app/node_modules/object-inspect/package-support.json" - }, - { - "count": 2, - "sizeBytes": 726, - "file": "/app/node_modules/merge-descriptors/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 662, - "file": "/app/node_modules/has/test/index.js" - }, - { - "count": 2, - "sizeBytes": 642, - "file": "/app/node_modules/debug/component.json" - }, - { - "count": 2, - "sizeBytes": 604, - "file": "/app/node_modules/object-inspect/test/undef.js" - }, - { - "count": 2, - "sizeBytes": 572, - "file": "/app/node_modules/function-bind/.editorconfig" - }, - { - "count": 2, - "sizeBytes": 536, - "file": "/app/node_modules/object-inspect/test/lowbyte.js" - }, - { - "count": 2, - "sizeBytes": 526, - "file": "/app/node_modules/debug/src/index.js" - }, - { - "count": 2, - "sizeBytes": 510, - "file": "/app/node_modules/object-inspect/test/holes.js" - }, - { - "count": 2, - "sizeBytes": 504, - "file": "/app/node_modules/function-bind/.npmignore" - }, - { - "count": 2, - "sizeBytes": 502, - "file": "/app/node_modules/object-inspect/example/inspect.js" - }, - { - "count": 2, - "sizeBytes": 500, - "file": "/app/node_modules/inherits/inherits.js" - }, - { - "count": 2, - "sizeBytes": 494, - "file": "/app/node_modules/call-bind/.eslintrc" - }, - { - "count": 2, - "sizeBytes": 478, - "file": "/app/node_modules/has/README.md" - }, - { - "count": 2, - "sizeBytes": 476, - "file": "/app/node_modules/encodeurl/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 472, - "file": "/app/node_modules/object-inspect/.nycrc" - }, - { - "count": 2, - "sizeBytes": 462, - "file": "/app/node_modules/function-bind/.eslintrc" - }, - { - "count": 2, - "sizeBytes": 448, - "file": "/app/node_modules/express/index.js" - }, - { - "count": 2, - "sizeBytes": 432, - "file": "/app/node_modules/qs/.nycrc" - }, - { - "count": 2, - "sizeBytes": 432, - "file": "/app/node_modules/call-bind/.nycrc" - }, - { - "count": 2, - "sizeBytes": 432, - "file": "/app/node_modules/side-channel/.nycrc" - }, - { - "count": 2, - "sizeBytes": 422, - "file": "/app/node_modules/qs/lib/index.js" - }, - { - "count": 2, - "sizeBytes": 394, - "file": "/app/node_modules/has-proto/index.js" - }, - { - "count": 2, - "sizeBytes": 378, - "file": "/app/node_modules/mime-db/index.js" - }, - { - "count": 2, - "sizeBytes": 360, - "file": "/app/node_modules/debug/.eslintrc" - }, - { - "count": 2, - "sizeBytes": 352, - "file": "/app/node_modules/function-bind/test/.eslintrc" - }, - { - "count": 2, - "sizeBytes": 344, - "file": "/app/node_modules/side-channel/.eslintrc" - }, - { - "count": 2, - "sizeBytes": 328, - "file": "/app/node_modules/has-symbols/.eslintrc" - }, - { - "count": 2, - "sizeBytes": 308, - "file": "/app/node_modules/.bin/mime" - }, - { - "count": 2, - "sizeBytes": 298, - "file": "/app/node_modules/mime/cli.js" - }, - { - "count": 2, - "sizeBytes": 280, - "file": "/app/node_modules/debug/.travis.yml" - }, - { - "count": 2, - "sizeBytes": 278, - "file": "/app/node_modules/get-intrinsic/.nycrc" - }, - { - "count": 2, - "sizeBytes": 278, - "file": "/app/node_modules/has-symbols/.nycrc" - }, - { - "count": 2, - "sizeBytes": 258, - "file": "/app/node_modules/has/src/index.js" - }, - { - "count": 2, - "sizeBytes": 256, - "file": "/app/node_modules/toidentifier/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 252, - "file": "/app/node_modules/object-inspect/example/fn.js" - }, - { - "count": 2, - "sizeBytes": 252, - "file": "/app/node_modules/function-bind/index.js" - }, - { - "count": 2, - "sizeBytes": 232, - "file": "/app/node_modules/object-inspect/example/circular.js" - }, - { - "count": 3, - "sizeBytes": 228, - "file": "/lib/apk/db/triggers" - }, - { - "count": 3, - "sizeBytes": 197, - "file": "/etc/apk/world" - }, - { - "count": 2, - "sizeBytes": 196, - "file": "/app/node_modules/side-channel/README.md" - }, - { - "count": 2, - "sizeBytes": 186, - "file": "/app/node_modules/setprototypeof/index.d.ts" - }, - { - "count": 2, - "sizeBytes": 158, - "file": "/app/node_modules/utils-merge/.npmignore" - }, - { - "count": 2, - "sizeBytes": 144, - "file": "/app/node_modules/debug/.npmignore" - }, - { - "count": 2, - "sizeBytes": 118, - "file": "/app/node_modules/unpipe/HISTORY.md" - }, - { - "count": 2, - "sizeBytes": 96, - "file": "/app/node_modules/call-bind/README.md" - }, - { - "count": 2, - "sizeBytes": 92, - "file": "/app/node_modules/debug/.coveralls.yml" - }, - { - "count": 2, - "sizeBytes": 86, - "file": "/app/node_modules/has-proto/.eslintrc" - }, - { - "count": 2, - "sizeBytes": 84, - "file": "/app/node_modules/object-inspect/util.inspect.js" - }, - { - "count": 2, - "sizeBytes": 80, - "file": "/app/node_modules/debug/node.js" - }, - { - "count": 2, - "sizeBytes": 58, - "file": "/app/node_modules/cookie-signature/.npmignore" - }, - { - "count": 2, - "sizeBytes": 20, - "file": "/app/node_modules/side-channel/.eslintignore" - }, - { - "count": 2, - "sizeBytes": 20, - "file": "/app/node_modules/call-bind/.eslintignore" - }, - { - "count": 2, - "sizeBytes": 0, - "file": "/bin/tar" - }, - { - "count": 2, - "sizeBytes": 0, - "file": "/usr/local/share" - }, - { - "count": 3, - "sizeBytes": 0, - "file": "/lib/apk/db/lock" - }, - { - "count": 2, - "sizeBytes": 0, - "file": "/usr/sbin" - }, - { - "count": 2, - "sizeBytes": 0, - "file": "/usr/share" - }, - { - "count": 3, - "sizeBytes": 0, - "file": "/etc/apk/protected_paths.d" - }, - { - "count": 2, - "sizeBytes": 0, - "file": "/app/node_modules/mime/.npmignore" - }, - { - "count": 3, - "sizeBytes": 0, - "file": "/var/cache/misc" - } - ] - } -} \ No newline at end of file diff --git a/server/file.json b/server/file.json index e69de29..901ea2a 100644 --- a/server/file.json +++ b/server/file.json @@ -0,0 +1,17 @@ +{ + "layer": [ + { + "index": 0, + "id": "af10c63fa8e077a49490c4796c73a9c1e08575bc52bbbdf67cefb58112738683", + "digestId": "sha256:dd4d83ab39e37b7b32fd9c3c6ba97ab1f7421fad7d3d0e8c2c02ff0d624232bd", + "sizeBytes": 52387835, + "command": "" + } + ], + "image": { + "sizeBytes": 52387835, + "inefficientBytes": 0, + "efficiencyScore": 1, + "fileReference": [] + } +} \ No newline at end of file diff --git a/server/idependent_machine_learning_model/linear_regression.py b/server/idependent_machine_learning_model/linear_regression.py deleted file mode 100644 index 03f1fe0..0000000 --- a/server/idependent_machine_learning_model/linear_regression.py +++ /dev/null @@ -1,16 +0,0 @@ -import numpy as np -from sklearn.datasets import make_regression -from sklearn.model_selection import train_test_split -from sklearn.linear_model import LinearRegression -from sklearn.metrics import mean_squared_error - -X, y = make_regression(n_samples=100, n_features=3, noise=0.1, random_state=42) - -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) - -model = LinearRegression() - -model.fit(X_train, y_train) # Training of model - - - diff --git a/server/main.py b/server/main.py index 583ec2f..6b3bc64 100644 --- a/server/main.py +++ b/server/main.py @@ -36,15 +36,6 @@ async def model(dockerFile : str): return {"model": "Currently working on it", "dockerFile": dockerFile} - -# @app.get("/containers") -# async def list_containers(): -# client = docker.DockerClient(base_url='tcp://localhost:2375') -# containers = client.containers.list(all=True) -# images = client.images.list(all=True) -# return [{ "arrtributes": c.attrs } for c in containers] - - @app.get("/inspect_image/{id}") async def list_containers(id : str): client = docker.DockerClient(base_url='tcp://localhost:2375') @@ -53,7 +44,7 @@ async def list_containers(id : str): image_id = id_container.attrs['Config']['Image'] image = client.images.get(image_id) command=["wsl", "dive", "--json", "file.json"] - command.insert(2, image_id) + command.insert(2,image_id) process= subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) process.wait() filehandler=open("file.json","r") @@ -64,28 +55,30 @@ async def list_containers(id : str): except docker.errors.NotFound: return {"message": "Container not found"} - # extraction of docker file - # history_json = json.dumps(image.history()) - - - # print(process.stdout) - - # return history_json - - #! Cleaninig is not been completed - - # model(history_json) +@app.get("/optimize_image/{image_name}") +async def create_container(image_name: str): + try: + client = docker.DockerClient(base_url='tcp://localhost:2375') + process=subprocess.run(["powershell","docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock dslim/slim build --http-probe {image_name}"], shell=True, stdout=subprocess.PIPE) + print(process.stdout) + print(image_name + '.slim') + command=["wsl", "dive", "--json", "file.json"] + command.insert(2,image_name + '.slim') + process= subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) + filehandler=open("file.json","r") + readFile = filehandler.read() + filehandler=open("file.json","w") + filehandler.truncate(0) + return json.loads(readFile) + except: + return {"message": "Error"} -@app.post("/create_container") -async def create_container(): - return [{"message": "Container will be re-create after the model is created"}] @app.websocket("/stats") async def status(websocket: WebSocket): await websocket.accept() client = docker.DockerClient(base_url='tcp://localhost:2375') - try: while True: containers = client.containers.list() diff --git a/src/App.tsx b/src/App.tsx index c1b995b..af03cf5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -3,7 +3,6 @@ import './App.css'; import Navbar from './Components/Navbar'; import Containers from './Components/Containers'; import Images from './Components/Images'; - import { useEffect, useState } from 'react'; import { Connection_Api } from './helpers/api'; import { BrowserRouter as Router } from 'react-router-dom'; diff --git a/src/Components/Containers.tsx b/src/Components/Containers.tsx index 903cf29..d1c60bd 100644 --- a/src/Components/Containers.tsx +++ b/src/Components/Containers.tsx @@ -1,8 +1,17 @@ -import React,{SetStateAction} from 'react' +import React,{SetStateAction,useState,useEffect} from 'react' import {useNavigate } from 'react-router-dom'; +export interface ContainerStats { + containerID: string; + containerName: string; + cpuUsagePercentage: number; + memoryUsageInMebibytes: number; + memoryLimitInBytes: number; + network: number; + pids: number; +} interface ContainersProps { containers: ContainerStats[] | null; @@ -12,8 +21,18 @@ interface ContainersProps { const Containers: React.FC = ({containers,ID}) => { let navigate = useNavigate(); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + if (containers) { + setIsLoading(false); + } + }, [containers]); + + const handleInspectImage = async(containerID:string) => { + try{ ID(containerID); navigate('/inspect_image'); @@ -21,65 +40,24 @@ const Containers: React.FC = ({containers,ID}) => { }catch(error){ console.log(error); } -const Containers = () => { - const [containerData, setContainerData] = useState(null); - - useEffect(() => { - async function fetchData() { - try { - const response:any = await Connection_Api(); - const containerStatsArray: ContainerStats[] = response.map((container:any) => { - const previousTotalUsage:number = container.stats.precpu_stats.cpu_usage.total_usage; - const currentTotalUsage:number = container.stats.cpu_stats.cpu_usage.total_usage; - const numberOfCPUs:number = container.stats.precpu_stats.online_cpus; - const cpuUsagePercentage:number = ((currentTotalUsage - previousTotalUsage) / numberOfCPUs) * 100; - const memoryUsageInBytes:number = container.stats.memory_stats.usage; - const memoryLimitInBytes:number = container.stats.memory_stats.limit; - const memoryUsageInMebibytes:number = memoryUsageInBytes / 1024 / 1024; - const rxBytes:number = container.stats.networks.eth0.rx_bytes; - const txBytes:number = container.stats.networks.eth0.tx_bytes; - const network:number = rxBytes / txBytes; - const containerName:string = container.stats.name; - const containerID:string = container.stats.id; - const pids:number = container.stats.pids_stats.current; - - return { - containerID, - containerName, - cpuUsagePercentage, - memoryUsageInMebibytes, - memoryLimitInBytes, - network, - pids, - }; - }); - - setContainerData(containerStatsArray); - } catch (error) { - console.error('Error fetching data:', error); - } - } - - fetchData(); - }, []); - - const handleInspectImage = (containerID:string) => { - const response = Inspect_Image_Api(containerID); } return (
-
Containers
-
+
Containers + +
+ +
-

Name

+

Name

-

Status

+

Status

-

Cpu Usage

+

Cpu Usage

@@ -87,52 +65,49 @@ const Containers = () => {
-

Network I/O

-
-
-
-

Inspect Layers

+

Network I/O

-

Optimize Container

+

Inspect Layers

-
- {containers && +
+ {isLoading ? ( + // Display loading GIF while data is being fetched +
+ Loading +
+ ) : ( + containers && containers.map((container, index) => ( -
-

{container.containerName}

+

{container.containerName}

-

Running

+

Running

-

{container.cpuUsagePercentage} %

+

{container.cpuUsagePercentage} %

-

{container.memoryUsageInMebibytes} MiB

+

{container.memoryUsageInMebibytes} MiB

-
-

{container.network} B

+
+

{container.network} B

-
-
- -
-
+
- ))} + )) + )}
); diff --git a/src/Components/Images.tsx b/src/Components/Images.tsx index 27f8a61..6d45cb2 100644 --- a/src/Components/Images.tsx +++ b/src/Components/Images.tsx @@ -7,13 +7,21 @@ import 'react-circular-progressbar/dist/styles.css'; export default function Images({ID}:any){ + + const [details_image,setdetails_image] = React.useState({}); + const [details_layers,setdetails_layers] = React.useState([]); + useEffect(() => { const handleInspectImage = async(ID:string) => { try{ console.log(ID) const response = await Inspect_Image_Api(ID); if(response.status === 200){ - console.log(response); + + console.log(response.data); + setdetails_image(response.data.image); + setdetails_layers(response.data.layer); + } }catch(error){ console.log(error); @@ -23,26 +31,41 @@ export default function Images({ID}:any){ },[ID]); return ( -
-

Analyzing:

+
+

Analyzing:

-
Total Size
-

size Bytes

+
Total Size
+

{details_image.sizeBytes} Bytes

-
Inefficient Bytes
-

Inneficent bytes

+
Inefficient Bytes
+

{details_image.inefficientBytes} Bytes

-
Efficiency Score
-

90

+
Efficiency Score
+

{Math.floor(details_image.efficiencyScore*100)} %

+ +
+
+
+ +
+
+ +
+
-
-
-

Layers

+ +
+

Layers

+
- + + - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + {details_layers.map((layer:any, index:number) => ( + + + + + + + + ))} + + +
IndexIDSizeCommandIndexDigest IDIDSizeCommand
rowextract IDsize bytesCommand
rowextract IDsize bytesCommand
rowextract IDsize bytesCommand
rowextract IDsize bytesCommand
{layer.index}{layer.digestId}{layer.id}{layer.sizeBytes} Bytes{layer.command}
diff --git a/src/Components/Navbar.tsx b/src/Components/Navbar.tsx index 21a1a8a..3b93330 100644 --- a/src/Components/Navbar.tsx +++ b/src/Components/Navbar.tsx @@ -4,10 +4,10 @@ const Navbar = () => { return (
-

+

Container Optimization

-

+

Shows usage manage and optimized containers

diff --git a/src/helpers/api.ts b/src/helpers/api.ts index d1181a8..974c597 100644 --- a/src/helpers/api.ts +++ b/src/helpers/api.ts @@ -1,5 +1,6 @@ // Purpose: API helper functions. import axios from 'axios' + export function Connection_Api() { return new Promise((resolve, reject) => { const ws = new WebSocket("ws://localhost:8000/stats");