From 48b64408c8549457e3b1506419c3dd5a504168ae Mon Sep 17 00:00:00 2001 From: Bedirhan Yenilmez Date: Fri, 26 Jan 2024 21:32:14 +0300 Subject: [PATCH 01/11] Sync development with main (#33) * Update package.json * Update package * Revert last 2 commits * add typescript 4.9.5 --- package-lock.json | 218 +++++++++++++++++++++------------------------- package.json | 5 +- 2 files changed, 104 insertions(+), 119 deletions(-) diff --git a/package-lock.json b/package-lock.json index 275e2e5..fead043 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "gradeful", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gradeful", - "version": "1.0.0", + "version": "1.1.0", "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "base64-compressor": "^1.0.3", @@ -17,7 +17,8 @@ "react-scripts": "5.0.1", "react-sortablejs": "^6.1.4", "tailwind-scrollbar": "^3.0.5", - "tailwindcss": "^3.4.1" + "tailwindcss": "^3.4.1", + "typescript": "^4.9.5" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -77,9 +78,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -87,11 +88,11 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -107,9 +108,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", - "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.9.tgz", + "integrity": "sha512-xPndlO7qxiJbn0ATvfXQBjCS7qApc9xmKHArgI/FTEFxXas5dnjC/VqM37lfZun9dclRYcn+YQAr6uDFy0bB2g==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -189,9 +190,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz", + "integrity": "sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -454,14 +455,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" @@ -482,9 +483,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -559,12 +560,12 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.7.tgz", - "integrity": "sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.9.tgz", + "integrity": "sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.23.7", + "@babel/helper-create-class-features-plugin": "^7.23.9", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-decorators": "^7.23.3" }, @@ -986,9 +987,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", - "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1360,9 +1361,9 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", @@ -1700,16 +1701,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", - "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", + "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "semver": "^6.3.1" }, "engines": { @@ -1877,9 +1878,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", - "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", + "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", "dev": true, "dependencies": { "@babel/compat-data": "^7.23.5", @@ -1909,7 +1910,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", "@babel/plugin-transform-block-scoping": "^7.23.4", @@ -1931,7 +1932,7 @@ "@babel/plugin-transform-member-expression-literals": "^7.23.3", "@babel/plugin-transform-modules-amd": "^7.23.3", "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.23.3", @@ -1957,9 +1958,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2042,9 +2043,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2054,23 +2055,23 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -2079,8 +2080,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2089,9 +2090,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -3622,9 +3623,9 @@ "dev": true }, "node_modules/@rushstack/eslint-patch": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.0.tgz", - "integrity": "sha512-Jh4t/593gxs0lJZ/z3NnasKlplXT2f+4y/LZYuaKZW5KAaiVFL/fThhs+17EbUd53jUVJ0QudYCBGbN/psvaqg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz", + "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==", "dev": true }, "node_modules/@sinclair/typebox": { @@ -4020,9 +4021,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "version": "4.17.42", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.42.tgz", + "integrity": "sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==", "dev": true, "dependencies": { "@types/node": "*", @@ -4104,9 +4105,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", + "version": "20.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.7.tgz", + "integrity": "sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -5476,29 +5477,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5882,9 +5867,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001579", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", - "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", + "version": "1.0.30001580", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001580.tgz", + "integrity": "sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA==", "dev": true, "funding": [ { @@ -7187,9 +7172,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.640", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.640.tgz", - "integrity": "sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA==", + "version": "1.4.647", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.647.tgz", + "integrity": "sha512-Z/fTNGwc45WrYQhPaEcz5tAJuZZ8G7S/DBnhS6Kgp4BxnS40Z/HqlJ0hHg3Z79IGVzuVartIlTcjw/cQbPLgOw==", "dev": true }, "node_modules/emittery": { @@ -13624,9 +13609,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -17863,17 +17848,16 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14.17" + "node": ">=4.2.0" } }, "node_modules/unbox-primitive": { @@ -18175,19 +18159,19 @@ } }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.90.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz", + "integrity": "sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", + "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.11.5", "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", @@ -18201,7 +18185,7 @@ "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", + "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, diff --git a/package.json b/package.json index bc4ac66..aa6033c 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "react-scripts": "5.0.1", "react-sortablejs": "^6.1.4", "tailwind-scrollbar": "^3.0.5", - "tailwindcss": "^3.4.1" + "tailwindcss": "^3.4.1", + "typescript": "^4.9.5" } -} \ No newline at end of file +} From e354ae3e92d835bf572f19169c8b7cb7664ce655 Mon Sep 17 00:00:00 2001 From: Bedirhan Yenilmez Date: Wed, 31 Jan 2024 14:56:44 +0300 Subject: [PATCH 02/11] Create build.yml --- .github/workflows/build.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..a3cd55e --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,28 @@ +# This workflow will do a clean installation of node dependencies, cache/restore them and build the source code across different versions of node +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs + +name: build + +on: + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [14.x, 16.x, 18.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run build --if-present From 8650d3860d0647cbf51cdf1f42e75158d147ecc2 Mon Sep 17 00:00:00 2001 From: Bedirhan Yenilmez Date: Wed, 31 Jan 2024 15:15:31 +0300 Subject: [PATCH 03/11] Update build.yml --- .github/workflows/build.yml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a3cd55e..9035bf4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,24 +5,18 @@ name: build on: pull_request: - branches: [ "main" ] + branches: [ "main", "development" ] jobs: build: runs-on: ubuntu-latest - strategy: - matrix: - node-version: [14.x, 16.x, 18.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - steps: - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }} + - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: ${{ matrix.node-version }} - cache: 'npm' + cache: npm - run: npm ci - run: npm run build --if-present From 83ad2b9340917f72a95bef8e92056e8198b25777 Mon Sep 17 00:00:00 2001 From: Bedirhan Yenilmez <76536654+beyenilmez@users.noreply.github.com> Date: Wed, 31 Jan 2024 15:21:08 +0300 Subject: [PATCH 04/11] Delete .eslintrc.js --- .github/configs/.eslintrc.js | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 .github/configs/.eslintrc.js diff --git a/.github/configs/.eslintrc.js b/.github/configs/.eslintrc.js deleted file mode 100644 index 787aae2..0000000 --- a/.github/configs/.eslintrc.js +++ /dev/null @@ -1,34 +0,0 @@ -module.exports = { - "env": { - "browser": true, - "es2021": true - }, - "extends": [ - "eslint:recommended", - "plugin:react/recommended" - ], - "overrides": [ - { - "env": { - "node": true - }, - "files": [ - ".eslintrc.{js,cjs}" - ], - "parserOptions": { - "sourceType": "script" - } - } - ], - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": [ - "react" - ], - "rules": { - // suppress errors for missing 'import React' in files - "react/react-in-jsx-scope": "off" - } -} From 0c698bbf3de7080c2e79b1ba07bca94f65e7fd51 Mon Sep 17 00:00:00 2001 From: Bedirhan Yenilmez <76536654+beyenilmez@users.noreply.github.com> Date: Wed, 31 Jan 2024 20:59:39 +0300 Subject: [PATCH 05/11] add license generation with webpack --- .eslintrc.js | 2 +- config-overrides.js | 12 +++++ package-lock.json | 106 +++++++++++++++++++++++++++++++++++++++++++- package.json | 10 +++-- 4 files changed, 124 insertions(+), 6 deletions(-) create mode 100644 config-overrides.js diff --git a/.eslintrc.js b/.eslintrc.js index d528a4b..1c7fb68 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -34,7 +34,7 @@ module.exports = { "version": "detect" } }, - "ignorePatterns": ["tailwind.config.js", "src/presets/*"], + "ignorePatterns": ["tailwind.config.js", "config-overrides.js", "src/presets/*"], "rules": { // suppress errors for missing 'import React' in files "react/react-in-jsx-scope": "off" diff --git a/config-overrides.js b/config-overrides.js new file mode 100644 index 0000000..da2ea58 --- /dev/null +++ b/config-overrides.js @@ -0,0 +1,12 @@ +const LicensePlugin = require('webpack-license-plugin'); + +module.exports = function override(config, env) { + // Add the LicensePlugin to the plugins array + config.plugins.push( + new LicensePlugin({ + outputFilename: 'licenses.json' + }), + ); + + return config; +}; diff --git a/package-lock.json b/package-lock.json index fead043..9c885fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,13 +12,15 @@ "base64-compressor": "^1.0.3", "eslint": "^8.56.0", "react": "^18.2.0", + "react-app-rewired": "^2.2.1", "react-dom": "^18.2.0", "react-feather": "^2.0.10", "react-scripts": "5.0.1", "react-sortablejs": "^6.1.4", "tailwind-scrollbar": "^3.0.5", "tailwindcss": "^3.4.1", - "typescript": "^4.9.5" + "typescript": "^4.9.5", + "webpack-license-plugin": "^4.4.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -13105,6 +13107,22 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -15403,6 +15421,30 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, + "node_modules/react-app-rewired": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.2.1.tgz", + "integrity": "sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==", + "dev": true, + "dependencies": { + "semver": "^5.6.0" + }, + "bin": { + "react-app-rewired": "bin/index.js" + }, + "peerDependencies": { + "react-scripts": ">=2.1.3" + } + }, + "node_modules/react-app-rewired/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -16673,6 +16715,37 @@ "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, + "node_modules/spdx-exceptions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", + "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-expression-validate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-validate/-/spdx-expression-validate-2.0.0.tgz", + "integrity": "sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -18414,6 +18487,37 @@ } } }, + "node_modules/webpack-license-plugin": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/webpack-license-plugin/-/webpack-license-plugin-4.4.2.tgz", + "integrity": "sha512-n6BWea7g/ogWF/Nd3eOXVj9NLThaa5XYUNENNu4/0kPzxU6kPAKBe5XtQ2uKrrzM6OBOAyjkzzorZ8dAjHOycw==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "lodash": "^4.17.21", + "needle": "^3.2.0", + "spdx-expression-validate": "^2.0.0", + "webpack-sources": "^3.2.3" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.0 < 6.0.0" + } + }, + "node_modules/webpack-license-plugin/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/webpack-manifest-plugin": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", diff --git a/package.json b/package.json index aa6033c..6a26c72 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,9 @@ "private": true, "homepage": ".", "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", + "start": "react-app-rewired start", + "build": "react-app-rewired build", + "test": "react-app-rewired test", "eject": "react-scripts eject", "lint": "eslint . --config .eslintrc.js --ext .js,.jsx" }, @@ -27,12 +27,14 @@ "base64-compressor": "^1.0.3", "eslint": "^8.56.0", "react": "^18.2.0", + "react-app-rewired": "^2.2.1", "react-dom": "^18.2.0", "react-feather": "^2.0.10", "react-scripts": "5.0.1", "react-sortablejs": "^6.1.4", "tailwind-scrollbar": "^3.0.5", "tailwindcss": "^3.4.1", - "typescript": "^4.9.5" + "typescript": "^4.9.5", + "webpack-license-plugin": "^4.4.2" } } From 932936d4c6b424bac5089f23226416d79e1611b6 Mon Sep 17 00:00:00 2001 From: Bedirhan Yenilmez <76536654+beyenilmez@users.noreply.github.com> Date: Wed, 31 Jan 2024 21:46:59 +0300 Subject: [PATCH 06/11] add about page --- package.json | 12 +++++++--- src/components/SettingsWindow.jsx | 37 +++++++++++++++++++++++++++++++ src/components/Window.jsx | 2 +- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 6a26c72..fd9deb0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "gradeful", - "version": "1.1.0", + "version": "1.2.0", + "description": "A grade tracker to monitor your progress throughout your university education.", "private": true, "homepage": ".", "scripts": { @@ -36,5 +37,10 @@ "tailwindcss": "^3.4.1", "typescript": "^4.9.5", "webpack-license-plugin": "^4.4.2" - } -} + }, + "author": { + "name": "beyenilmez", + "url": "https://github.com/beyenilmez" + }, + "license": "MIT" +} \ No newline at end of file diff --git a/src/components/SettingsWindow.jsx b/src/components/SettingsWindow.jsx index 33f8773..4ea9624 100644 --- a/src/components/SettingsWindow.jsx +++ b/src/components/SettingsWindow.jsx @@ -443,6 +443,27 @@ function GradeScaleSettings() { ) } +function About() { + return ( +
+
+
+ v-{"1.2.0"} +
+ + Github + + + View Licenses + +
+
+ ) +} function SettingsWindow(props) { const [settingsTab, setSettingsTab] = useState("information"); @@ -481,6 +502,19 @@ function SettingsWindow(props) { > Grade scale +
@@ -489,6 +523,9 @@ function SettingsWindow(props) {
+
+ +
diff --git a/src/components/Window.jsx b/src/components/Window.jsx index 9f54b33..7538ae6 100644 --- a/src/components/Window.jsx +++ b/src/components/Window.jsx @@ -13,7 +13,7 @@ function Window(props) { `}>
{/* Uni logo */} -
- - - - -
+ {/* Uni logo */}
diff --git a/src/components/LoadURLPopup.jsx b/src/components/LoadURLPopup.jsx index 97361dd..67762b3 100644 --- a/src/components/LoadURLPopup.jsx +++ b/src/components/LoadURLPopup.jsx @@ -4,6 +4,8 @@ import Button from "./Button"; import { decode } from "base64-compressor"; import Window from "./Window"; +import {ReactComponent as Logo} from "../logo.svg" + function LoadURLPopup() { // Context const { setUniversityData, save } = useUniData(); @@ -68,14 +70,7 @@ function LoadURLPopup() { dark:bg-slate-650 bg-slate-350" > {/* Uni logo */} -
- - - - -
+ {/* Uni logo */}
diff --git a/src/components/NavBar.jsx b/src/components/NavBar.jsx index 5d84d6e..854b516 100644 --- a/src/components/NavBar.jsx +++ b/src/components/NavBar.jsx @@ -9,6 +9,7 @@ import Button from "./Button"; import ExportToFileWindow from "./ExportToFileWindow"; import ImportFromFileWindow from "./ImportFromFileWindow"; +import {ReactComponent as Logo} from "../logo.svg" function NavBar(props) { // Context @@ -44,14 +45,7 @@ function NavBar(props) { className="rounded-xl p-5 mt-5 dark:bg-slate-650 bg-slate-300 border dark:border-slate-550 border-slate-400 drop-shadow flex items-center h-24"> {/* Uni logo */} -
- - - - -
+ {/* Uni logo */} {/* Uni name and department */} diff --git a/src/logo.svg b/src/logo.svg index 9dfc1c0..155067a 100644 --- a/src/logo.svg +++ b/src/logo.svg @@ -1 +1,54 @@ - \ No newline at end of file + + + \ No newline at end of file From 151a555cbdc7191acc982049fcb16dafa5cc9dde Mon Sep 17 00:00:00 2001 From: Bedirhan Yenilmez <76536654+beyenilmez@users.noreply.github.com> Date: Sat, 10 Feb 2024 01:42:11 +0300 Subject: [PATCH 08/11] add quickstart popup --- src/App.jsx | 2 + src/components/QuickStartWindow.jsx | 517 ++++++++++++++++++++++++++++ src/components/UniContext.jsx | 2 +- src/components/Window.jsx | 10 +- src/presets/department.js | 13 + 5 files changed, 541 insertions(+), 3 deletions(-) create mode 100644 src/components/QuickStartWindow.jsx create mode 100644 src/presets/department.js diff --git a/src/App.jsx b/src/App.jsx index 97c16b3..ed6dbfe 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -5,6 +5,7 @@ import ExportURLPopup from "./components/ExportURLPopup"; import LoadURLPopup from "./components/LoadURLPopup"; import Grid from "./components/Grid"; import { InactiveProvider } from "./components/InactiveContext"; +import QucikStartWindow from "./components/QuickStartWindow"; document.body.className = 'bg-slate-250 dark:bg-slate-750 dark:text-slate-200 text-slate-800 slate'; @@ -21,6 +22,7 @@ function App() { + ); } diff --git a/src/components/QuickStartWindow.jsx b/src/components/QuickStartWindow.jsx new file mode 100644 index 0000000..4b17314 --- /dev/null +++ b/src/components/QuickStartWindow.jsx @@ -0,0 +1,517 @@ +import { useEffect, useState } from "react"; +import { useUniData } from "./UniContext"; +import Button from "./Button"; +import { decode } from "base64-compressor"; +import { Plus, Minus } from 'react-feather'; +import Window from "./Window"; +import Selector from "./Selector"; + +import presets from '../presets/department'; +import gradeScalePresets from '../presets/gradeScale'; +import { University } from "../utils/Program"; + +function PageZero() { + const { editJSON, setEditJSON } = useUniData(); + + const [uniNameValue, setUniNameValue] = useState(); + const [departmentNameValue, setDepartmentNameValue] = useState(); + + const [sourceValue, setSourceValue] = useState(""); + + async function decodeData(data) { + try { + const decoded = await decode(data); + setEditJSON({ ...editJSON, "preset": decoded }); + + setUniNameValue(decoded.name); + setDepartmentNameValue(decoded.department); + } catch (e) { + console.log(e); + } + } + + function setPreset(preset) { + decodeData(preset.data); + setSourceValue(preset.source); + } + + useEffect(() => { + if (editJSON["preset"]) { + setEditJSON({ ...editJSON, "preset": { ...editJSON["preset"], name: `${uniNameValue}`, department: `${departmentNameValue}` } }); + } + }, [uniNameValue, departmentNameValue]); + + return ( +
+ +
Select a preset (This will load the courses from the preset)
+ + + Presets + + + {sourceValue && ( + + Source + + )} + +
+ or +
+ +
+
University name
+ setUniNameValue(e.target.value)} + /> +
+
+
Department
+ setDepartmentNameValue(e.target.value)} + /> +
+
+ ) +} + +function GradeScaleSettings() { + // Context + const { editJSON, setEditJSON } = useUniData(); + + // <--- States start ---> + const [scoreTable, setScoreTable] = useState(editJSON["preset"].scoreTable); + const [gradeTable, setGradeTable] = useState(editJSON["preset"].gradeTable); + const [multiplierTable, setMultiplierTable] = useState(editJSON["preset"].multiplierTable); + + const [saveActive, setSaveActive] = useState(false); + const [discardActive, setDiscardActive] = useState(false); + + // <--- States end ---> + + // <--- Effects start ---> + + useEffect(() => { + let equals = true; + + scoreTable.forEach((score, i) => { + if (score != editJSON["preset"].scoreTable[i]) { + equals = false; + } + }) + + gradeTable.forEach((grade, i) => { + if (grade != editJSON["preset"].gradeTable[i]) { + equals = false; + } + }) + + multiplierTable.forEach((multiplier, i) => { + if (multiplier != editJSON["preset"].multiplierTable[i]) { + equals = false; + } + }) + + if (scoreTable.length !== editJSON["preset"].scoreTable.length || gradeTable.length !== editJSON["preset"].gradeTable.length || multiplierTable.length !== editJSON["preset"].multiplierTable.length) { + equals = false; + } + + if (equals) { + setSaveActive(false); + setDiscardActive(false); + return; + } else { + setSaveActive(true); + setDiscardActive(true); + } + + scoreTable.forEach((score) => { + if (score.length === 0 || (score !== '0' && score !== 0 && score !== '.' && Number(score) === 0)) { + setSaveActive(false); + } + }) + + gradeTable.forEach((grade) => { + if (grade.length === 0) { + setSaveActive(false); + } + }) + + multiplierTable.forEach((multiplier) => { + if (multiplier.length === 0 || multiplier === '.' || (multiplier !== '0' && multiplier !== 0 && multiplier !== '.' && Number(multiplier) === 0)) { + setSaveActive(false); + } + }) + }, [scoreTable, gradeTable, multiplierTable]) + + // <--- Effects end ---> + + // <--- Functions start ---> + + function deleteRow(i) { + if (gradeTable.length === 1) { + return; + } + + const newScoreTable = scoreTable.filter((_, index) => index !== (i === scoreTable.length ? i - 1 : i)); + const newGradeTable = gradeTable.filter((_, index) => index !== i); + const newMultiplierTable = multiplierTable.filter((_, index) => index !== i); + + setGradeScale({ scoreTable: newScoreTable, gradeTable: newGradeTable, multiplierTable: newMultiplierTable }); + } + + function addRow(i) { + const newScoreTable = [...scoreTable.slice(0, i), '', ...scoreTable.slice(i)]; + const newGradeTable = [...gradeTable.slice(0, i), '', ...gradeTable.slice(i)]; + const newMultiplierTable = [...multiplierTable.slice(0, i), '', ...multiplierTable.slice(i)]; + + setGradeScale({ scoreTable: newScoreTable, gradeTable: newGradeTable, multiplierTable: newMultiplierTable }); + } + + function discardChanges() { + setScoreTable(editJSON["preset"].scoreTable); + setGradeTable(editJSON["preset"].gradeTable); + setMultiplierTable(editJSON["preset"].multiplierTable); + + setSaveActive(false); + setDiscardActive(false); + } + + function saveChanges() { + const uni = new University(editJSON["preset"]); + + uni.setGradeTable(gradeTable); + uni.setScoreTable(scoreTable); + uni.setMultiplierTable(multiplierTable); + + setEditJSON({ ...editJSON, preset: uni }); + + setSaveActive(false); + setDiscardActive(false); + } + + function setGradeScale(item) { + const newScoreTable = item.scoreTable; + const newGradeTable = item.gradeTable; + const newMultiplierTable = item.multiplierTable; + + setScoreTable(newScoreTable); + setGradeTable(newGradeTable); + setMultiplierTable(newMultiplierTable); + } + // <--- Functions end ---> + + // Render + return ( +
+
+ You can customize your grade scale here. +
+
+
+
+ Percentage +
+
+
+
+ + +
+ - +
+
+ + {scoreTable.map((score, index) => ( +
+ { + const newScoreTable = [...scoreTable]; + newScoreTable[index] = e.target.value; + setScoreTable(newScoreTable); + }} + /> +
+ - +
+
+ ))} +
+ +
+ {scoreTable.map((score, index) => ( + { + const newScoreTable = [...scoreTable]; + newScoreTable[index] = e.target.value; + setScoreTable(newScoreTable); + }} + /> + ))} + + +
+
+
+ +
+ +
+
+ Grade +
+
+ {gradeTable.map((grade, index) => ( + { + const newGradeTable = [...gradeTable]; + newGradeTable[index] = e.target.value.toUpperCase(); + setGradeTable(newGradeTable); + }} + /> + ))} +
+
+ +
+ +
+
+ GPA +
+
+ {multiplierTable.map((multiplier, index) => ( + { + const newMultiplierTable = [...multiplierTable]; + newMultiplierTable[index] = e.target.value.replace(/\.\./g, '.').replace(/[^0-9.]/g, ''); + setMultiplierTable(newMultiplierTable); + }} + /> + ))} +
+
+ +
+ +
+
+   +
+
+ {gradeTable.map((grade, index) => ( +
+ + +
+ ))} +
+
+
+ +
+
{"Please save your changes by clicking the \"Save\" button."}
+ +
+ + Presets + +
+ + +
+
+
+
+ ) +} + +function QucikStartWindow() { + const { editJSON, setUniversityData, save } = useUniData(); + + const [page, setPage] = useState(0); + + const [showQuickStart, setShowQuickStart] = useState(false); + + useEffect(() => { + const firstVisit = localStorage.getItem("visited"); + + if (firstVisit !== "visited") { + setShowQuickStart(true); + } + }, []) + + return ( + localStorage.setItem("visited", "visited")}> +
+
+
+ Step {page + 1}/2 - {page === 0 ? "Information" : "Grade scale"} +
+
+
+ +
+
+ +
+
+
+ + +
+
+
+
+ ); +} + +export default QucikStartWindow; \ No newline at end of file diff --git a/src/components/UniContext.jsx b/src/components/UniContext.jsx index 5f3815b..9904eb8 100644 --- a/src/components/UniContext.jsx +++ b/src/components/UniContext.jsx @@ -8,7 +8,7 @@ export const UniProvider = (props) => { const jsonData = localStorage.getItem('university'); const [universityData, setUniversityData] = useState(jsonData ? JSON.parse(jsonData) : new University()); - const [editJSON, setEditJSON] = useState({}); + const [editJSON, setEditJSON] = useState({"preset": new University()}); const [saveNextChange, setSaveNextChange] = useState(false); const [reloadNextChange, setReloadNextChange] = useState(false); diff --git a/src/components/Window.jsx b/src/components/Window.jsx index 7538ae6..ac56852 100644 --- a/src/components/Window.jsx +++ b/src/components/Window.jsx @@ -27,7 +27,12 @@ function Window(props) { '> {props.title}
@@ -514,4 +525,4 @@ function QucikStartWindow() { ); } -export default QucikStartWindow; \ No newline at end of file +export default QuickStartWindow; \ No newline at end of file From 478fe4e9ee069a0c99e984b7be87cfd71f535337 Mon Sep 17 00:00:00 2001 From: Bedirhan Yenilmez <76536654+beyenilmez@users.noreply.github.com> Date: Sun, 11 Feb 2024 23:49:02 +0300 Subject: [PATCH 10/11] #38 - decimal credit and score inputs --- src/components/Course.jsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/Course.jsx b/src/components/Course.jsx index dcd9ab9..3cd42e3 100644 --- a/src/components/Course.jsx +++ b/src/components/Course.jsx @@ -193,7 +193,7 @@ function CourseExport(props) { onChange={(e) => setNameValue(e.target.value)} > -
@@ -213,15 +213,15 @@ function CourseExport(props) {
-
From 7bf84058edf404e61455950640ac72668c546717 Mon Sep 17 00:00:00 2001 From: Bedirhan Yenilmez <76536654+beyenilmez@users.noreply.github.com> Date: Sun, 11 Feb 2024 23:51:45 +0300 Subject: [PATCH 11/11] fix deuceng preset decimal credits --- src/presets/department.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/presets/department.js b/src/presets/department.js index b3caaa1..c4d9111 100644 --- a/src/presets/department.js +++ b/src/presets/department.js @@ -4,7 +4,7 @@ const presets = [ name: "Dokuz Eylül University, Computer Engineering", search: ["deu", "deü", "deuceng", "deüceng", "deu ceng", "deü ceng"], source: "https://debis.deu.edu.tr/ders-katalog/2022-2023/eng/bolum_1210_eng.html", - data: "H4sIAAAAAAAACu2dwXIbOZKGX4VRZxqRQGYCCd_UtnvaMe6xZ609bEz4gAJQUk1TpLdI9qx7Yt59AyXKpiQWZUolqaObPjBsuogiwQ9A5p8_wH9Xq9xdLKuX__h31abqZWUhR9aN1Y22GRSRZW-cqaZVXKy7Zb59aXJaBwHlLGiyFqpptYyL7tqVGhqfbDA1BiKlSXt0lqtpNQ8XuXpZ_XxaTavPuYt5vgpn5Rku7cTzxTLPq5dNmC3ztFrmWY6rnDZP_Gd6o3nKIVhQBB4EvjX-YzsPs_u0_2lahfVq8SrM4sfyiaqXq26dvz35ly6kr0-28zhbp1yev3oq_9_nME-lvatLQly1v359yVl5_WmoZ7l6-Y_q5KSaVj_0Dz9U0-pV__Cqmlav-4fX1bT6sX_4sfq06eKr13qYCk8Fpo6nDqaWpxamDJ-m1cV6tmo_z9rcXV1LU1Q8xalRPDVTrXiqp6B4Wq4uLLzdT8GmT1_9_GaiDeDkxeTtfNUt0jqu2sV8slpMXi0uPq9XuZu8mZ-185y7dn5WTavVYhVmH7a-Ath8iOplVW364vKv397z5b9jl1O7ql5WeAASGzZ9SimCYmvKHxlk04NpjMWoWFuy1ozMpgcG8giKNDjvyB3pfAI6efJi8rpdxi6v8gbLUCgNs8nHVbeOq3Uh4bnQjCISRDEY8QJmEM3gXc11IiXIzli_j8ye24PIDN4nEokKgTR4s0XmyfJsjPZrmwBEaeM9aGOP5D8--VpPXkxOZmeLrl2dXywnYZ4mH7rFWRcuLtr52eTts0HfMDcOFGvx1mkchD7FCME6UM540p63sPzQLf6Z4-omOBqO5DycHC7kbHp48kNY5jR5l0M3f1ZqsiEucaMV7S31LOykJoPlukEdFfkypdqtj3f5dT8tM5sG_8DQ_PXD64kGKNC8Cl3X5m7yYRbm89FCPn04LIzWa1JaPAPz4Lqa0dfJgiWljdEiMmrEl9Gn2msdlUOxjIzHde8xQfz55PQbiLO4nq2XY81XdDiCLkJMokhIg7AeRFAiOGPLfFVmXrB7GcSDGZRoamEtSozxxm4h-C7Ut0K7ezRPTePqqLxh0s7IEfHHRPzDT_8z0bpH_MP5l2Ubn5LwTzt7--pbud37m2Z-d9296cvT3F1M9FXvvdp0hIHNE28vP2q6-g-YVmefw6bXDpoKnI3ZN6CMJvLO-UEdjTQaHTSWRAwBnfGDs0ZtvXBoSpSDjhj3zxqHZmy5tnUMdS3KO3Hebmdsf1-3v92Koe5xg4xWCykxAIYdHeeNh88bO0C7LobYyYvJaY7n8zaGWdHmZu3yfJz5wxw4LEgjBeMzKUQCATMc0SfjtSEjyhFZEDeu-pETSiKuQWkx3jrhcdWPnDB4BE0Knddg-bhEPgHq2tyhfjxTIksanTc2RUUEhBoH5Y9G-8ZHLqoZosNt9WME6hsdDKAEUOgEnXGwPzC8R_uYyTIoBGPEWn2k_gmop8mLybvFWRsnr_OyPZs_G-S1J_ZRGXJgjB6MYxqUxK5uQGkiZBB71PiehBQ2ezS-55sbkydnotJi2QrTIDZUx5oSinJivHdejyrcNFRnh00AZTz5UhM5Tl6PieRGuDHXhJtnUm5IY9NE76NCEi9GBsXDxpIWCCzKE4ul7SV0BOWmscQYfSOKHBnB7RxsDOmmsSx1jC6qMu0af0T8MRHfCDdmW7g5KjcPUW7MTeVG-_GVG8-WOKriBkHT25p2KzeOEGqwOSqPDFY875o1-itdRHQ5kiJvpEi-N4f1_rd4KxqqtoC5_v6di7XNriHlnAdjHV7LbCd311V2yTxDN6uFvGSKyghIMbpcv9nd-sBBN0sNNjGIsoY8Mt2YeQ-6kdnXhdEmH1wSxcLeWHtXCYfunia3b3acMW-PsK041Zhe6n4dVmE0t84d381W9HoDBSJNuoaSuaMmdINDXDAF65yQYgYg5x-8cg_yKWQMiU-giBHQwF6V4DtikOE7OWw4SyjuODA4hmB7HAiHDISdNsu2i-t2dSlvvSmd2y3mbRzJz3Zo6OzIoSWdStovCLsj556ljMn4VJPS4JyAPHRh2rNUSBYMofGijGbnYFuIute6tPdeGWNIOSox7FnLzdF40I1oz7okDfuGYynrMngkHEFeOw7HQ4YjX-ondajbWbv60o_Aj8VaulyNNgAPFVAcudrbRkhZIm0uHcw7R6AXp8EAROV1kWfxoQLKIKlenMnJCyhkDWJxBPPnkdRDSHW9A7ppcpfnq7bU_f533VugL5eNd-08h67USnLdhedaOQRC3fje3lc8oTuLgT1OQUfb-DKdCzmPdi-4B0bj0xt3yoZ9Q4q0dt65u0J_ewR3JHBPX7-7MnKdrrtf2uX55F2Yn61LPz9VsfqPKJngLcnEjiiZaKhTbRL7hB4UofbkcLfZpb-UIuvAZcx7EXsZBO4SWgNQ02RdY1TGesde344WDx3116TQAAyGbINStlcYIL13UjlUaS3Nk01FyWWDaC4t7w8UEf7M08cgaNfXPXOlHLzvzsK8_a1f8_ol7-cwD2f5Is9XT7_cbdB30fRVT_C27DYbRN_6lGMKogwY1gbhGvsPJ9_6JkYslVpvQLzfW8M4nHwbtIfkSDEhC95VZDiCPwb4tG19mZzMw-zLsn2GlGSDepCGY1QerBHeM8sLRGcxR2U9kDikvajrg1kUaKxxOvaOF-NB9qpyh1oaAxQxn21TbLvOo9u_meBQQ01pnupaB1DsxWgyR0PNU4yl4pj8upn5pIvn7Sr3KvSzrRxJtCsb3IWM40H7WAAftCGrRSF4r2k77354dbo0j8QJQAk7LONpv0P48KXDBw5N7UVJkSdAjg7hp-BdJi8mf1tf5K53CD_32pHKZmQEVfbQWKuHw6SQo9hExa-OTm7tXz5Id0WobqAYcg6SUlTaot8Wq-9VbLzReF2bxhTRHFFEkz8aMZ6Acw2TF5P3de9-e9-1eb7K6SvtfY7wXP7JDfiI2QAoZgQC2Knj9vRkzIGsBuXAM-r99b_D04NMgLlOoEQjamvumoS_QwM7wjkM50b4MjuEr9HsQn9S7Yse2S6UOXnUyFgELRanSYa0ryaUvS-gyZNyLIZYBge4rkUnjzYqR448b6vQH7r44BGuayEAXYsiy9a5_YfeHBzF6VqsMdaVOiUC2u3d-EcF4D7K-QBnW6sbfjPN1GGZt9Suyccvy1W-eAYDzSX0nBtXgrSy28vYQWdtMEx1E7KJSpxoAj_qSUyl-dRYiaK01sTHVPppoCwGltPzvOi-TBbN9lFMzxFkFRytFkN9bGOLgdsO4mizMRA0KWOoHGF0xw7Bg3m0mUwxbykxDlHrvbgfnKobm60xJeCw4NBeO0fniPuj4V4MIu8_5y6syp6aUWbeB6BODNmQYseaEYdnXkkgKfiovDBb3rYujoK6JNNASKWobrzbP7EfTrokRgchKsFSANquZhxJfzTSi8HkY3s2D7PL1HnD-qRZdL-bgyDLBxHABhCUccYYhp3SaX9lAKm9t6Cc9iJ8y2Oy9U7vH31v7pSdSQ0ocRaNd3dFIkePyVjsnpyeXHlMPnTtPLafZ3lZApOTVVitu196kn9ql6tNvHJ6nr_m5P-Vf13M1n05-YFJ-ffG0qb6QyblfCspp5ENKTEHcDWZssEY2GseTspNQxx05LIzR4u2PBgQYgZPDnJJmr1D3r9IHryMYYaaHAopQuM83dzd8uDWExVlTyHb79mZf0zJ79T0dlJ2fZHsN7cu5jF_XvXTzPZhFFca3zMl5qbhFENTrHhAVrMdDA-xSeTQaVBstBeNd4SHhxa5sUnWNI0FxQRCeIcd5R7NJzJ1hv60MkNjeJGP6N-JPl0ZsV4tLi7W5eyhb-7jr_Hh3_LqX4vul2cbAhYgOyuKtdbWusFSI2l2FhuKSqMgMcG2ILvzxIqDOSXNPgoTKO-YjNm_s_w-zUfUIURVQiIPeDyR6CmGQbGSfFw0q3-FLo-XDn0v8XSbeOO4LkefWmfIDx6SGoh8QqcjKCoFAiu3diw_TBMg8k0x9UdFAtbRyPEOUYCU6_oymrIOj6ewPgXtciuxenNR55Ryes4qRHnr0RJKTSUG0CDfdn_fNKgnnXNToy0GdePI0N5z5w6svJXmG0jkMSon1heF9lhbf0wuNwm_eWjCfyzDPyTjt7cyfh41428CSe1io205isOjYL9dZHfGT964xvaHIxOLN3awDE9NpCyGivuWjZht4fp4Ttk9x-vAd7W1jtBl1XCXiDyqQeuQE-Y34PgcOJHynslYGkwXWOsIWTeiUAswwVYo_xw_R_AnwcYXbD6uLy5yNzntQjvmb1ccHIDW2DQBRRT3p3XQQMRRYCnxEZQDe1AjXTt2eQTfA-vU5JClbDvS3ggcfQ-PiuLbj3-Z0GWJ4X2M689Xvzv1Uw6z1fllqSw0efVlLDL_pDGFuxlT4OghRYwJuewPNU4bzzwYUjAGyDliMVuwRdSDaTX7uuYAREVyAk_b504fV4Z7D8cd39T1lYF2rQxPVMa7af5nDOiocb2YCKz1YADKgWyduGwE9cjGGjPu0lB6rvfmaeTiOD8q44_K4mZpMN-xNDxdhfkmmgwuWlLiy_4rGvoFm8DC2jJHUFjCG6SRoxZhDDZcJmma9Xf8DNwRzhEmyh7Oj3neLrrJt35-GsXujxilyM0oZQTh49Pv8DNfV3e0_o5Puemm14tf1r9N3nyZrWeT_563v-Zu2a6-VNMq5c-hW_XnNbysdjrK_vP_BDx0B8R6AAA~" + data: "H4sIAAAAAAAACu2dwXIbOZKGX4VRZxqRQGYCCd_UtnvaMe6xZ609bEz4gAJQUk1TpLdI9qx7Yt59AyXKpiQWZUolqaObPjBsuogiwQ9A5p8_wH9Xq9xdLKuX__h31abqZWUhR9aN1Y22GRSRZW-cqaZVXKy7Zb59aXJaBwHlLGiyFqpptYyL7tqVGhqfbDA1BiKlSXt0lqtpNQ8XuXpZ_XxaTavPuYt5vgpn5Rku7cTzxTLPq5dNmC3ztFrmWY6rnDZP_Gd6o3nKIVhQBB4EvjX-YzsPs_u0_2lahfVq8SrM4sfyiaqXq26dvz35ly6kr0-28zhbp1yev3oq_9_nME-lvatLQly1v359yVl5_WmoZ7l6-Y_q5KSaVj_0Dz9U0-pV__Cqmlav-4fX1bT6sX_4sfq06eKr13qYCk8Fpo6nDqaWpxamDJ-m1cV6tmo_z9rcXV1LU1Q8xalRPDVTrXiqp6B4Wq4uLLzdT8GmT1_9_GaiDeDkxeTtfNUt0jqu2sV8slpMXi0uPq9XuZu8mZ-185y7dn5WTavVYhVmH7a-Ath8iOplVW364vKv397z5b9jl1O7ql5WeAASGzZ9SimCYmvKHxlk04NpjMWoWFuy1ozMpgcG8giKNDjvyB3pfAI6efJi8rpdxi6v8gbLUCgNs8nHVbeOq3Uh4bnQjCISRDEY8QJmEM3gXc11IiXIzli_j8ye24PIDN4nEokKgTR4s0XmyfJsjPZrmwBEaeM9aGOP5D8--VpPXkxOZmeLrl2dXywnYZ4mH7rFWRcuLtr52eTts0HfMDcOFGvx1mkchD7FCME6UM540p63sPzQLf6Z4-omOBqO5DycHC7kbHp48kNY5jR5l0M3f1ZqsiEucaMV7S31LOykJoPlukEdFfkypdqtj3f5dT8tM5sG_8DQ_PXD64kGKNC8Cl3X5m7yYRbm89FCPn04LIzWa1JaPAPz4Lqa0dfJgiWljdEiMmrEl9Gn2msdlUOxjIzHde8xQfz55PQbiLO4nq2XY81XdDiCLkJMokhIg7AeRFAiOGPLfFVmXrB7GcSDGZRoamEtSozxxm4h-C7Ut0K7ezRPTePqqLxh0s7IEfHHRPzDT_8z0bpH_MP5l2Ubn5LwTzt7--pbud37m2Z-d9296cvT3F1M9FXvvdp0hIHNE28vP2q6-g-YVmefw6bXDpoKnI3ZN6CMJvLO-UEdjTQaHTSWRAwBnfGDs0ZtvXBoSpSDjhj3zxqHZmy5tnUMdS3KO3Hebmdsf1-3v92Koe5xg4xWCykxAIYdHeeNh88bO0C7LobYyYvJaY7n8zaGWdHmZu3yfJz5wxw4LEgjBeMzKUQCATMc0SfjtSEjyhFZEDeu-pETSiKuQWkx3jrhcdWPnDB4BE0Knddg-bhEPgHq2tyhfjxTIksanTc2RUUEhBoH5Y9G-8ZHLqoZosNt9WME6hsdDKAEUOgEnXGwPzC8R_uYyTIoBGPEWn2k_gmop8mLybvFWRsnr_OyPZs_G-S1J_ZRGXJgjB6MYxqUxK5uQGkiZBB71PiehBQ2ezS-55sbkydnotJi2QrTIDZUx5oSinJivHdejyrcNFRnh00AZTz5UhM5Tl6PieRGuDHXhJtnUm5IY9NE76NCEi9GBsXDxpIWCCzKE4ul7SV0BOWmscQYfSOKHBnB7RxsDOmmsSx1jC6qMu0af0T8MRHfCDdmW7g5KjcPUW7MTeVG-_GVG8-WOKriBkHT25p2KzeOEGqwOSqPDFY875o1-itdRHQ5kiJvpEi-N4f1_rd4KxqqtoC5_v6di7XNriHlnAdjHV7LbCd311V2yTxDN6uFvGSKyghIMbpcv9nd-sBBN0sNNjGIsoY8Mt2YeQ-6kdnXhdEmH1wSxcLeWHtXCYfunia3b3acMW-PsK041Zhe6n4dVmE0t84d381W9HoDBSJNuoaSuaMmdINDXDAF65yQYgYg5x-8cg_yKWQMiU-giBHQwF6V4DtikOE7OWw4SyjuODA4hmB7HAiHDISdNsu2i-t2dSlvvSmd2y3mbRzJz3Zo6OzIoSWdStovCLsj556ljMn4VJPS4JyAPHRh2rNUSBYMofGijGbnYFuIute6tPdeGWNIOSox7FnLzdF40I1oz7okDfuGYynrMngkHEFeOw7HQ4YjX-ondajbWbv60o_Aj8VaulyNNgAPFVAcudrbRkhZIm0uHcw7R6AXp8EAROV1kWfxoQLKIKlenMnJCyhkDWJxBPPnkdRDSHW9A7ppcpfnq7bU_f533VugL5eNd-08h67USnLdhedaOQRC3fje3lc8oTuLgT1OQUfb-DKdCzmPdi-4B0bj0xt3yoZ9Q4q0dt65u0J_ewR3JHBPX7-7MnKdrrtf2uX55F2Yn61LPz9VsfqPKJngLcnEjiiZaKhTbRL7hB4UofbkcLfZpb-UIuvAZcx7EXsZBO4SWgNQ02RdY1TGesde344WDx3116TQAAyGbINStlcYIL13UjlUaS3Nk01FyWWDaC4t7w8UEf7M08cgaNfXPXOlHLzvzsK8_a1f8_ol7-cwD2f5Is9XT7_cbdB30fRVT_C27DYbRN_6lGMKogwY1gbhGvsPJ9_6JkYslVpvQLzfW8M4nHwbtIfkSDEhC95VZDiCPwb4tG19mZzMw-zLsn2GlGSDepCGY1QerBHeM8sLRGcxR2U9kDikvajrg1kUaKxxOvaOF-NB9qpyh1oaAxQxn21TbLvOo9u_meBQQ01pnupaB1DsxWgyR0PNU4yl4pj8upn5pIvn7Sr3KvSzrRxJtCsb3IWM40H7WAAftCGrRSF4r2k77354dbo0j8QJQAk7LONpv0P48KXDBw5N7UVJkSdAjg7hp-BdJi8mf1tf5K53CD_32pHKZmQEVfbQWKuHw6SQo9hExa-OTm7tXz5Id0WobqAYcg6SUlTaot8Wq-9VbLzReF2bxhTRHFFEkz8aMZ6Acw2TF5P3de9-e9-1eb7K6SvtfY7wXP7JDfiI2QAoZgQC2Knj9vRkzIGsBuXAM-r99b_D04NMgLlOoEQjamvumoS_QwM7wjkM50b4MjuEr9HsQn9S7Yse2S6UOXnUyFgELRanSYa0ryaUvS-gyZNyLIZYBge4rkUnjzYqR448b6vQH7r44BGuayEAXYsiy9a5_YfeHBzF6VqsMdaVOiUC2u3d-EcF4D7K-QBnW6sbfjPN1GGZt9Suyccvy1W-eAYDzSX0nBtXgrSy28vYQWdtMEx1E7KJSpxoAj_qSUyl-dRYiaK01sTHVPppoCwGltPzvOi-TBbN9lFMzxFkFRytFkN9bGOLgdsO4mizMRA0KWOoHGF0xw7Bg3m0mUwxbykxDlHrvbgfnKobm60xJeCw4NBeO0fniPuj4V4MIu8_5y6syp6aUWbeB6BODNmQYseaEYdnXkkgKfiovDBb3rYujoK6JNNASKWobrzbP7EfTrokRgchKsFSANquZhxJfzTSi8HkY3s2D7PL1HnD-qRZdL-bgyDLBxHABhCUccYYhp3SaX9lAKm9t6Cc9iJ8y2Oy9U7vH31v7pSdSQ0ocRaNd3dFIkePyVjsnpyeXHlMPnTtPLafZ3lZApOTVVitu196kn9ql6tNvHJ6nr_m5P-Vf13M1n05-YFJ-ffG0qb6QyblfCspp5ENKTEHcDWZssEY2GseTspNQxx05LIzR4u2PBgQYgZPDnJJmr1D3r9IHryMYYaaHAopQuM83dzd8uDWExVlTyHb79mZf0zJ79T0dlJ2fZHsN7cu5jF_XvXTzPZhFFca3zMl5qbhFENTrHhAVrMdDA-xSeTQaVBstBeNd4SHhxa5sUnWNI0FxQRCeIcd5R7NJzJ1hv60MkNjeJGP6N-JPl0ZsV4tLi7W5eyhb-7jr_Hh3_LqX4vul6caAopvDQILkJ0VxVpra91gsZE0O4sNRaVRkJhgW5LdeWbFwaSSZh-FCZR3TMbs31t-n-Yj6hCiKkGRBzyeSfQUA6GYST4umtW_QpfHS4i-l3m6TbxxXJfDT60z5AePSQ1EPqHTERSVEoGVW3uWH6YKEPmm2PqjIgHraOSIhyhAynV9GU9Zh8dzWJ-CdrmVWr25qHNKOT1nHaK89WgJpaYSBWiQb_u_b1rUk865qdEWi7pxZGjvyXMH1t5K8w0k8hiVE-uLRnusrj8ml5uU3zw05T8W4h-S89tbOT8rHjXrbwJJ7WKjbTmOw6Ngv2Vkd9ZP3rjG9gckE4s3drAUT02kLIaKA5eNmG3x-nhW2T1H7MB3tbWS0GXlcJeQPKpJ65BT5jfg-Bw4kfKeyVgaTBhY6whZN6JQCzDBVjD_HD9J8CfBxhdsPq4vLnI3Oe1CO-bvVxwcgtbYNAFFFPcndtBAzFFgKRESlEN7UCNdO3p5BO8D69TkkKVsPdLeCBy9D4-K4tuPf5nQZZnhfYzrz1e_PfVTDrPV-WW5LDR59WUsMv-kUYW7GVXg6CFFjAm57BE1ThvPPBhSMAbIOWIxXLBF1IOJNfu65gBERXQCT9tnTx9XhnsPxx3f1PWVgXatDE9Uyru5AYAxoKPG9XIisNaDASgHsnXishnUIxtrzLhLQ-m53p-nkYvr_KiOPyqLm6XBfMfS8HRV5ptoMrhoSYkve7Bo6FdsAgtryxxBYQlvkEaOWoQx2HCZpGnW3_FTcEc4R5goezg_5nm76Cbf-vlpNLs_YpQiN6OUEYSPT7_Dz3xd39H6uwSeTUe9Xvyy_m3y5stsPZv897z9NXfLdvWlmlYpfw7dqj-14WW101f2n_8HmJ-12sp6AAA~" } ]