From 81b174f5b39f5b0300d5540760c4a3a61592dadd Mon Sep 17 00:00:00 2001 From: Kevin-Umali Date: Sun, 24 Sep 2023 13:49:36 +0800 Subject: [PATCH] Implemented generated idea counter --- README.md | 1324 ------------------ client/src/api/backend-api.ts | 57 + client/src/api/open-ai-api.ts | 149 -- client/src/pages/Home.tsx | 39 +- client/src/pages/HowToGuideDetail.tsx | 2 +- client/src/pages/HowToGuideList.tsx | 2 +- client/src/pages/ProjectDetail.tsx | 2 +- client/src/pages/ProjectDetailById.tsx | 2 +- server/prisma/schema.prisma | 7 + server/src/controllers/counter.controller.ts | 61 + server/src/controllers/share.controller.ts | 2 +- server/src/routes/counter.routes.ts | 9 + server/src/routes/index.routes.ts | 4 +- server/src/server.ts | 4 +- server/src/utils/index.ts | 6 + 15 files changed, 189 insertions(+), 1481 deletions(-) create mode 100644 client/src/api/backend-api.ts delete mode 100644 client/src/api/open-ai-api.ts create mode 100644 server/src/controllers/counter.controller.ts create mode 100644 server/src/routes/counter.routes.ts diff --git a/README.md b/README.md index 685fd24..34589b1 100644 --- a/README.md +++ b/README.md @@ -11,1327 +11,3 @@ A platform that provides unique DIY (Do It Yourself) project suggestions using O 1. Clone the repository. 2. Set up both the client and server by following their respective READMEs. - -``` -make-me-project -├─ .git -│ ├─ COMMIT_EDITMSG -│ ├─ config -│ ├─ description -│ ├─ FETCH_HEAD -│ ├─ HEAD -│ ├─ hooks -│ │ ├─ applypatch-msg.sample -│ │ ├─ commit-msg.sample -│ │ ├─ fsmonitor-watchman.sample -│ │ ├─ post-update.sample -│ │ ├─ pre-applypatch.sample -│ │ ├─ pre-commit.sample -│ │ ├─ pre-merge-commit.sample -│ │ ├─ pre-push.sample -│ │ ├─ pre-rebase.sample -│ │ ├─ pre-receive.sample -│ │ ├─ prepare-commit-msg.sample -│ │ ├─ push-to-checkout.sample -│ │ └─ update.sample -│ ├─ index -│ ├─ info -│ │ └─ exclude -│ ├─ objects -│ │ ├─ 00 -│ │ │ └─ 1d19326971447c709df941337e87f5f1ccdb06 -│ │ ├─ 01 -│ │ │ ├─ 09207ded1cfcfd75e641adb4123ac7b26b22e6 -│ │ │ ├─ 3eb7276a52a1f8beff156442766c124b17125f -│ │ │ ├─ 3ebbfe1c7ce6c9c2484d7799990f246614d7b3 -│ │ │ ├─ 50b76e10be10093c838d6bf22a5cf726ed7e0c -│ │ │ ├─ 693bc33bc0f4097e336e0790c8b94efed9f22f -│ │ │ └─ 7f53116a9e2805ccb12efc3c7fcd7e4384735d -│ │ ├─ 02 -│ │ │ ├─ 3568e08ea0396305c7f7dfc3a36db6c2feafba -│ │ │ ├─ 42c0e25b2dde085c34b8e6354c1afd4ff5f1f4 -│ │ │ ├─ b1f890cd55599f15f317160b0c0059cfa47b98 -│ │ │ └─ fa31f70284a65cf42719f754b436bb0180bf26 -│ │ ├─ 03 -│ │ │ ├─ 452b9f43725cd15f8cb09ffe9b7a2a334d1540 -│ │ │ └─ 8cd7ecda21bd685091c20d0e7333031a55fa54 -│ │ ├─ 04 -│ │ │ ├─ 3857dc98f624056bc8f78d40241e4a16ace95f -│ │ │ └─ 3ce81b50a206c461ff970839027b0ab7143068 -│ │ ├─ 05 -│ │ │ ├─ 46b08e56d7052bd93bf3141dfc735a9e7603db -│ │ │ └─ 8c6cdea710b53e83593075a6badad3d3260cfe -│ │ ├─ 06 -│ │ │ ├─ 1f420a8a18d9cef406d04e70b1143250bacff1 -│ │ │ ├─ 39a65504cca5caf04eb6f41d792eadc9735d3e -│ │ │ ├─ 41c76da07c8981d65f9080ce34e2ed51c4fdd1 -│ │ │ ├─ 55ba1ad5eb8436ff2299568669a5bd24699959 -│ │ │ ├─ 7635341a505d993e96aaacfa067065d7ff7259 -│ │ │ └─ d4a6bcb4b5036bdb8c332e4f037d2633d517ea -│ │ ├─ 07 -│ │ │ ├─ 01421e88a7d9248303e8c639cecf5e9ba8b639 -│ │ │ ├─ 05d5fc46be67e097cd5c498c23a8d0ffa40d7d -│ │ │ ├─ 91af2f72e9559ba8379c2e53916b8391fd90cf -│ │ │ ├─ 95e82c83b76286a8c21825b25def5fb554cd96 -│ │ │ ├─ ab9b4c5a00579d523a737c4485b5ed495bd53f -│ │ │ └─ f777df6bb549455f44f2cbb1f23d3598c609ea -│ │ ├─ 08 -│ │ │ ├─ 01b064e5171c97ac5fc656ed472ecd98003beb -│ │ │ ├─ 45b873b065939feb06e4a18711cc524be73e7e -│ │ │ ├─ 46ab839b8b1780947ffbbd3e8d38aa461fdca0 -│ │ │ └─ aab587fa78649d6734146485ae47b7aa77bc6a -│ │ ├─ 09 -│ │ │ ├─ 39c6fe7eb172e310625b8efb11559abd814293 -│ │ │ ├─ 8ed30900ec1e1caf5ceacc9869913bca3adc66 -│ │ │ └─ e93304f970e7a68972ecf67bc0eda8c3eba9d4 -│ │ ├─ 0a -│ │ │ ├─ 38be4ee0e268b21ae72a7e81b0bf7cb30d86f8 -│ │ │ ├─ 7bce4fd570ab5f2f7ad89f8456ee0ad26de1f5 -│ │ │ └─ eac2cc68c3a22469f2b97eb63aa4d78b6fcd16 -│ │ ├─ 0b -│ │ │ ├─ 0a0eacf58913e3048a00ea18d4e09b1e0cacf4 -│ │ │ ├─ 4b899a219aa9d9e438664b1d9c86d6d0b306a1 -│ │ │ ├─ 58cf944c95267e31f7c9096666e5dee09e0f9c -│ │ │ ├─ 66e7db4cbb049ba2418fa4d7cf6bfa5735bd10 -│ │ │ ├─ 791f34ecfad4492986af1cd95c59a5f61a0516 -│ │ │ ├─ 9ef69dbab6b2684afb038b9bbeacb4cb125e3d -│ │ │ ├─ d7b988ec100af5fd3cea5fad9a5cf2b7799aae -│ │ │ └─ ff9c9c293c5c187305845df9de4994d93a858d -│ │ ├─ 0c -│ │ │ ├─ 0017d6e7b4c98e65d9465a98b8eea019fc79de -│ │ │ ├─ 04128a6068de068e3cc1486026f8e27c43a188 -│ │ │ ├─ 6f61a3c496d26fe47902de01d67fc886ada1bb -│ │ │ └─ f5aabbc79049984801d221cfa2e2a404b36a0d -│ │ ├─ 0d -│ │ │ ├─ 013299b7d8add57054e01316b962d4d31b5eef -│ │ │ ├─ 40cd1072877068a247f8ed21ecc3abdc20ed11 -│ │ │ └─ cbb1d98cf0eaaa3268a336a159ed6180795424 -│ │ ├─ 0e -│ │ │ ├─ 6686c6cdb2f77e2b7c9d5d6984ef4dd8d74799 -│ │ │ ├─ 91d88fc83f5c1f74aa86187f5e3e9f6bbf8fa5 -│ │ │ └─ f34b8d7147c9b9cfceea506ba3859da52e708e -│ │ ├─ 0f -│ │ │ ├─ 1092780b0a8121d3be47663739a0138db4441e -│ │ │ ├─ 263904e49426ca01fc127018e079f86ab84d62 -│ │ │ ├─ 45b9da5deb45a3a717b940a628639fbe449dd5 -│ │ │ ├─ 6ffa8e25a810f63efc98092038e2c16434cb0c -│ │ │ ├─ cc93b3ee6b4d36a77562599f7b7988d3701faf -│ │ │ └─ ccb1279dfa2d2d34a62daecfd30d69f9a9302b -│ │ ├─ 10 -│ │ │ ├─ 1676fca292ab2d2aafffb105641f62021812f6 -│ │ │ ├─ 79ac39c584ce16321961c0317e36d5a64d696d -│ │ │ └─ 8e50c6e6d66b6c48f3b383601198ef47a71417 -│ │ ├─ 11 -│ │ │ └─ f02fe2a0061d6e6e1f271b21da95423b448b32 -│ │ ├─ 13 -│ │ │ ├─ 1689870daf379e7c61b544d651c1a8507d9f29 -│ │ │ ├─ 51aa1c3868a8bffdc0f05b4bf5326da975d9ad -│ │ │ └─ 60a78ad2a33faae1baa6b28169d493684614fa -│ │ ├─ 14 -│ │ │ └─ e19e88e28be52273bbf7f2670621fbe07cfa81 -│ │ ├─ 15 -│ │ │ ├─ 6bcd1d327542ac67049fef6a059c59a9966c89 -│ │ │ └─ 6ef7707fc3b9ab71bf2ed8a3ac8649c7ee1074 -│ │ ├─ 16 -│ │ │ ├─ 6e40e5e76ae3565fc3e75eb4f5c502febf61f3 -│ │ │ ├─ a7b29deb1e672448d85f18b2389b837ee63c74 -│ │ │ └─ b43343b7d14f36717a787aaa654ea293162cec -│ │ ├─ 17 -│ │ │ ├─ 01c44a5f1051c27fb009616858d23fc3a781bd -│ │ │ ├─ 516777ccc502c57b84d37a6a8036667d7324d4 -│ │ │ └─ db67f1b0530f6c660145c9775cbc1ee83f3196 -│ │ ├─ 18 -│ │ │ ├─ 023630f9ead548ec7bbb143a8af0e7cb2caee3 -│ │ │ ├─ 0c13ad7c834b359d6799d02a6a2bf0b042645b -│ │ │ ├─ 2456149492e01e7df24b697d0598484db08191 -│ │ │ ├─ 2e3c047e0282faeb8981918998ce29a8206920 -│ │ │ ├─ b95ec9a122e59a9a16ad2fb3d225f0a47cb296 -│ │ │ └─ d129159cfd253ef957e2c92d6351aae409cd7f -│ │ ├─ 19 -│ │ │ ├─ 1a3b7cc45f15126b7305df08f205f774dd1efd -│ │ │ ├─ 36da4894500aeef6cf446a7677d7ace5873a4a -│ │ │ ├─ a60c938c9f89a92fe415e9c279d0b9a0350ae1 -│ │ │ └─ b6f141b196882ecb4fdab34ac1902cd1c5ca1f -│ │ ├─ 1a -│ │ │ ├─ 08521b5a001793a0a2c705d442a29949b1f051 -│ │ │ ├─ 21b79d3e61b44fef89f3efaf35ab203b0186c7 -│ │ │ ├─ 3571734241ddfddf9d40b14d65a408f312563e -│ │ │ ├─ 38fb3dcce0209ec04029b5f92384c294de0548 -│ │ │ ├─ 8d71bad4e34af464981ac7469d92bf135ce7ad -│ │ │ ├─ 93744b9c172a927ade3297847da5bb27d23ea2 -│ │ │ ├─ adbd0ac88cd6788a5765216f215c2b90900e4b -│ │ │ └─ b0e7a21a856f07017c70fb0c7364d3f35cb7a9 -│ │ ├─ 1b -│ │ │ ├─ 0c86021d0d54ff0bb25578e7031e3a257731df -│ │ │ ├─ 12d489b080f3dd9e45ee2457daa12a09abaf5d -│ │ │ ├─ bfd346581a35788c25942f8e622d7452604d48 -│ │ │ ├─ dee6ab5fed9ae897c511d562527d092452d97c -│ │ │ └─ e28b95cfa62b12aa7b2e97e0cd87c6e4a3556f -│ │ ├─ 1c -│ │ │ └─ f4fc598cf2cf40bb57e954a728d4b7502f26cf -│ │ ├─ 1d -│ │ │ ├─ 111a8f32fd996d040121e6753c058e78da6e74 -│ │ │ ├─ 51f106b6eaf741503e49f3fbfaafc6169284e6 -│ │ │ ├─ 5adc8adc9d29adbbb4d11100101339fe88ffa1 -│ │ │ └─ de24df3c4b23479c7f6d3503d59411762513aa -│ │ ├─ 1e -│ │ │ ├─ 6c310a032352fbdf4e87331a4d832df2d291c5 -│ │ │ └─ 8ed7bb761885c41ee39b962351d5bdc1ec3302 -│ │ ├─ 1f -│ │ │ ├─ 8fcf4b5da1681281bacf5574357a043ceeaf61 -│ │ │ └─ eab203b427a54b7d65ff1b76cb06c7801b20b9 -│ │ ├─ 20 -│ │ │ ├─ 1dcdf4f3f9487cf743879b4627face4ddbc436 -│ │ │ ├─ 49a7f3041718ac0f5a644138b5ca75898018d1 -│ │ │ ├─ a820fe6ffddf471e11c406a242b341f2e9b8bf -│ │ │ └─ bbbee423e0e517699a4df7bb0cbcc44a7772ae -│ │ ├─ 21 -│ │ │ ├─ 93ef331cc7ce2df30c05f4be50347c19458d4a -│ │ │ └─ a2621843228ec272ca4c01ab0eb2f7e78ce4b2 -│ │ ├─ 22 -│ │ │ ├─ 53dd84f0f58867dba2455e2e3622c2db3be23a -│ │ │ └─ c75ef256cd5d130b95da62bfb0515bcc0f1455 -│ │ ├─ 23 -│ │ │ ├─ 3203b13e7950fed6d9e2f8b513a5b315893c75 -│ │ │ └─ 9f1126506c9673ec79f08c7cc2deb4de5ddc5b -│ │ ├─ 24 -│ │ │ ├─ 883de808be6a7480542114a86034312c026dec -│ │ │ └─ a011bf3a2600d5aa7a028f1dacb16b794abb79 -│ │ ├─ 25 -│ │ │ ├─ 1b859584364bfc558dfba8726345a99381d2ba -│ │ │ └─ bc8afbfbd5bce19ae83ce08ff60fc6d83e4835 -│ │ ├─ 26 -│ │ │ ├─ 225aeeb82167289ac8185551900590c3a7a77f -│ │ │ ├─ 2593a191c6c9744963e0c2594e00a691de4355 -│ │ │ ├─ 32dc697fa4335d39ffc33ba54d7398e544be5e -│ │ │ ├─ 57f265c9e1022ed06a232f4da4db578d3d3fb0 -│ │ │ ├─ 71778bfb27059c18af95497064c094f2183ba8 -│ │ │ └─ fdea084dc5c11bb39cc51feebc391bd04a9e8e -│ │ ├─ 27 -│ │ │ ├─ 4386971fc4483e2c74dc703b2f4ceeae3deebe -│ │ │ └─ 9ec17253363abc4841872d26981dd844137fa6 -│ │ ├─ 28 -│ │ │ ├─ 694874d2ceb99304db8cc46e91e09c848b8cfc -│ │ │ └─ 94bd6fb8f5b71a0c0b9a2e736edc5ad0446161 -│ │ ├─ 29 -│ │ │ └─ c6e85fd3248d26520354a84ee70e961f3475d1 -│ │ ├─ 2a -│ │ │ ├─ 5ebb2e140b1ef8e4069e30117e48ff8a76df77 -│ │ │ ├─ cce884d1b8eba7bfcc9ae20ebd88dc00391da0 -│ │ │ └─ e5124439427e2d94716f8f265e701a5b0e5dd7 -│ │ ├─ 2b -│ │ │ ├─ 0d57cc2245f3fd7c3d78387bcacafcd8359a1f -│ │ │ ├─ 2df89e154670d7371084efc5b72ec4ddd11de0 -│ │ │ ├─ 5641d8ba48d85263691bd316f09cfb059b2898 -│ │ │ ├─ 5680b7157b924cb9a5c6d258ea850bc7f33bc4 -│ │ │ └─ baf3a7a46949b610f8060ea2f3573054b7727e -│ │ ├─ 2d -│ │ │ ├─ 6fab916dbeaa399eda911d75bc162db9d1a360 -│ │ │ ├─ 878919b4d8f5f41586daf3a709a0560f510d6e -│ │ │ ├─ a3c43de9cd717ed8f11ed0c908897f854ce0ae -│ │ │ ├─ bf6af2b6f3b5701c83caaea7ed2210192023a8 -│ │ │ └─ c0b542fabafb3db4a07d73f535db9dec69648f -│ │ ├─ 2e -│ │ │ ├─ 068af4552d7c14f728ab65b332e6ce4bd9eead -│ │ │ ├─ 597dec47271beb631e590e5918dfce78af5a57 -│ │ │ ├─ 7b4455282343167cfaf1e5ad601313982f97bc -│ │ │ └─ 84c3b5ce56c5ceda6c4b3285548fdf51bf5d7f -│ │ ├─ 2f -│ │ │ ├─ 1738a3d6f611d10e63321e785bb07aa4dbf239 -│ │ │ ├─ 247afde7286bb1c0d0a03ed572655b3340d505 -│ │ │ ├─ 3368ef58e938d8016e762d4ca91aad338e6f50 -│ │ │ ├─ 6d2239c94a0e4d3645fb72ee2567e0d37eb1c4 -│ │ │ ├─ a2e22dec12895e2901ce8b914a3479aa9f6fdd -│ │ │ └─ f83fcd49cdc7a39be5a568216a17c6e53ee172 -│ │ ├─ 30 -│ │ │ └─ 71131bd24e5ace8e3ea5816296e6b00dd23f84 -│ │ ├─ 31 -│ │ │ ├─ 064767b24215b38dc461981161eb05d3cd8c81 -│ │ │ ├─ 828122b3af631cd59ef274ea469869b8da5875 -│ │ │ ├─ a520a32c3938c5e7f51c3a964e090a0e0015f7 -│ │ │ └─ d2b6613b040f3cfa7dd310fc5245934d8ca537 -│ │ ├─ 32 -│ │ │ ├─ 0bb2b9d77eaab6fbaee024ccc4a18d5f6636b3 -│ │ │ ├─ 7086269e4ffa61c09fd8df9b8e7c074571063a -│ │ │ └─ d27d215911f1c73407c3dbbaf6c8821a1d7ad5 -│ │ ├─ 33 -│ │ │ ├─ 289ac9ffc85eab57098263700598b7bf1f2cb2 -│ │ │ ├─ 6187a2b3102b333de73f62a52432a0fc70b276 -│ │ │ └─ f7e6a0a074350d87da092bea9d72b6a0222611 -│ │ ├─ 34 -│ │ │ ├─ 1410a59602163c7c79cb318203a814806bf370 -│ │ │ ├─ 1443f67b64bf677013b42a4b0be4cf33dea374 -│ │ │ ├─ 48767716bf8cdfe05ae1083a36f203c4325325 -│ │ │ ├─ 589b10917f1843fe52271e567a20f4b8923cec -│ │ │ └─ 8768432a29dd553961e731ca90f67a3c38aa13 -│ │ ├─ 35 -│ │ │ ├─ 03dc0a17204e86e5e94ce87dc79ddeee37eb97 -│ │ │ ├─ 332e01c86b5eea5c8fd62b792e8efbc5449b18 -│ │ │ ├─ 65dd9471a2ae5caa7a8ba58c27d111117c64ac -│ │ │ ├─ a1585391214e96bdb19c4725c0b1e01731f8bf -│ │ │ ├─ b9bcd6a5352de0798613a771273a86d111b983 -│ │ │ └─ cd69a8c001a6247792649ed045aee68f21d126 -│ │ ├─ 36 -│ │ │ ├─ 11a6b523fe851a404b82b38d38ffb22921d2f4 -│ │ │ ├─ 542285863330887923979b4c00579738907d49 -│ │ │ ├─ 804a39bacad6e8145f52f90bd384249b22e324 -│ │ │ ├─ 865401957aafa10b30717834d17467b6bac857 -│ │ │ └─ db38cad9aa1e51d54109cdec0482b4021d14e5 -│ │ ├─ 37 -│ │ │ ├─ 5081a8786d2f813f06d9511629a84adfcf7794 -│ │ │ ├─ 65dcc72dc9d6ad945e9a4fd8cb056a2e737e11 -│ │ │ ├─ ab79504136f67a8f9795d0db4fe93001c9a2fe -│ │ │ └─ be7d8b6597858cba39d923e8d706e6eb9a0694 -│ │ ├─ 38 -│ │ │ ├─ 60bdd07e331fe3c2ddea09a00eed08f18b5dad -│ │ │ ├─ 93dda5bb54eee5fa34e14c00e9cf024651a9ba -│ │ │ └─ fd78fb1a81de0d775727fadd7d9f5a8eae8249 -│ │ ├─ 39 -│ │ │ ├─ 41874e854ba51975c321f38de648128f5ec6b3 -│ │ │ └─ 668cd83237e11ecfca7f3c96cd09746337db20 -│ │ ├─ 3a -│ │ │ ├─ 457086349217097a282316f093aca351d84a7c -│ │ │ └─ 7ee5ab6ca6776749d073cf5efa20e52579badd -│ │ ├─ 3b -│ │ │ ├─ 1af2c653a14c2b5c904979f17d06f115f921f1 -│ │ │ ├─ 32410c2be4bcd5b89a5cc1f08e357cbac88a80 -│ │ │ └─ f6fba120e34cb9c3205d70c0c439f5b7175f73 -│ │ ├─ 3c -│ │ │ ├─ 1fe3dcafc0ba90f0845000170ddd1313f2e93f -│ │ │ └─ 65a9db60e27ab93210f9da97c150ec1e3c69c6 -│ │ ├─ 3d -│ │ │ ├─ 3c232dcb226892cdf6181c6f4f4f40f2325fcc -│ │ │ ├─ cb9e405da0fc44f1e5d9b3b63d5067deb2d178 -│ │ │ └─ d882467bc711438f7eb1d07bbc8f3456ff67bb -│ │ ├─ 3e -│ │ │ ├─ 5c4ce504b33ef44d9a14adeb67bf2ba2206276 -│ │ │ ├─ bfed87c48203a04aa3bd2db7446225df40973f -│ │ │ ├─ f98b1898a75df235681a4a068a2859774499dc -│ │ │ └─ fb8013460619d4496e9ac705d895525eaed524 -│ │ ├─ 3f -│ │ │ ├─ 066e08d7ac5576b59accde049a89c5cfc552d6 -│ │ │ ├─ 0f8e71f75f8ecdc6b486c371ac21377067f45b -│ │ │ ├─ 1e6212e4769532bb9a051af588955057819ad5 -│ │ │ ├─ 2b7e39f8a50a19b4fb881cb7b477d56f0a1893 -│ │ │ ├─ 2f803a0a5a01a6e295618053bc6763089e5757 -│ │ │ ├─ 79a764b5e5a905789e7cbdc3b1c14b7f5c51a6 -│ │ │ ├─ cf23f04315e39bf8d1aabff0284a7b7f20e287 -│ │ │ └─ ee4be7f376f9cb111e95df4e4956ac9f3288d8 -│ │ ├─ 40 -│ │ │ ├─ 8429ee0384a6841a18106af9d7dbb14fcafe61 -│ │ │ └─ c689b232a972eb7e50edf6aa478da907a7101e -│ │ ├─ 41 -│ │ │ └─ 1a9fead3b546ece8a716879b7adb9715e340a9 -│ │ ├─ 42 -│ │ │ ├─ 7cc887f3e3a250981cfdc94d1bf19f54128ec0 -│ │ │ ├─ 872c59f5b01c9155864572bc2fbd5833a7406c -│ │ │ ├─ 9b270d637f5ffebd874a831f7beed687d1179e -│ │ │ ├─ b90da368f75604aada0d3d52a6214145b76fda -│ │ │ ├─ bd76aeed487f8c65adc834e69212c03951b935 -│ │ │ ├─ c087cee550b709d12ec8780348ffa61ad898e2 -│ │ │ └─ f5a18797b763567179b1e00695f835f0350201 -│ │ ├─ 43 -│ │ │ └─ d0ded7a351c34cdaa9ed34207dbd81c2dadb38 -│ │ ├─ 44 -│ │ │ ├─ a56bfe0f31a1b562836709064383abc6beedde -│ │ │ └─ a907e580f1055a36d44111fda9463ed1cd2d26 -│ │ ├─ 45 -│ │ │ ├─ 67f945e81a73dc2e589f153913910fa2f5fea9 -│ │ │ ├─ 7741fba37a6884c50edf123a49672ccd7e7709 -│ │ │ ├─ ac99324648b71a3a3993d634b3fe2c8c7d51ef -│ │ │ └─ c24696c14675637d70ddb6a3bf83189d12394a -│ │ ├─ 46 -│ │ │ ├─ d40c5d65bf58c8a029c9d5ad473afc15b7e22e -│ │ │ └─ eea93ac6b9d467401ba5c14488218a28c78463 -│ │ ├─ 47 -│ │ │ ├─ 0086846e1eb14f7fb490870d36d19eb2b491d0 -│ │ │ ├─ 43774c898b0eb6e63fa9783b2f33227c7a49b6 -│ │ │ ├─ 5fddbf0f269fa59c6b7b70cfbae8a5633925f1 -│ │ │ ├─ b5986d2d57d48eee1e9944893377216eb4f9cf -│ │ │ ├─ b8718333617a581dec1410778567454ba820a5 -│ │ │ ├─ c23f29068caa951b6f9d2a748fbfc291b6b492 -│ │ │ └─ d977f52555e46974c4b3b0e1db780edb5a1708 -│ │ ├─ 48 -│ │ │ ├─ 1862d4fb9d4491bafb0b12d5b0ad307b273445 -│ │ │ ├─ 6a25bcd4fabb0144d7bf5852c741077c25613e -│ │ │ └─ a95521cff8b139c2ee034aa6c4acbf6c57cfb1 -│ │ ├─ 49 -│ │ │ ├─ 922603cd4c398176a5b7e252a19ac39fe29f67 -│ │ │ └─ c9e21b5825f24419af942c503e1be5776ed9b5 -│ │ ├─ 4a -│ │ │ └─ e2478b7df554ba2b80510807dbb987cff0fe42 -│ │ ├─ 4b -│ │ │ ├─ 0be6a73d0a94d7eab45488932f543593740d24 -│ │ │ ├─ 308bde5e9fe94b864e11efa2b138a0be3216f3 -│ │ │ ├─ 87453a66f717e934e6af1147efb53e347868e2 -│ │ │ └─ b136a8af34bd3be74c268ca1c7f24c03285b33 -│ │ ├─ 4c -│ │ │ ├─ 0e679bcb4b9ba9b2910492ffb9d2935ea4a5fe -│ │ │ ├─ a0e5d14bc214585d56a6fbc5c16dc825be57ce -│ │ │ ├─ abd494a6f779ebfe47365aa89707f57cbe3d55 -│ │ │ ├─ ef899876d9eab979438b2b59e13b12dc265604 -│ │ │ └─ f892a1ac22f9d8691030f6c709bd1cab9039db -│ │ ├─ 4d -│ │ │ ├─ 848bc36f6b862e5db3effa59ebed515730284e -│ │ │ ├─ 9802a89e299942d0ddef0240077019c5676ea7 -│ │ │ └─ e510c11f97fc5ab32537d78c587545ad399506 -│ │ ├─ 4e -│ │ │ ├─ 6ba55559464d5f6fe14edbf69a17462f78175f -│ │ │ ├─ 82cda261aa3e771df73d2f3c9932cadac1b76b -│ │ │ └─ ea13d923774977341cbe13f2b4d7e154a90bf4 -│ │ ├─ 4f -│ │ │ ├─ 214db403ea992f1c247f4aa9603e53f0ad1619 -│ │ │ ├─ 3b9fa020acbed2e10d2c32e2566991c00ba47b -│ │ │ ├─ 9ade778195f9f8e8494cbc3990bb9d7296f252 -│ │ │ └─ cf252dfbb6a5425b18e76382b6e57b722842e6 -│ │ ├─ 51 -│ │ │ ├─ 37e85f2ab1aabe7f29724ba34e898c3b66f97a -│ │ │ ├─ a7460ba9ae862d89e061ac7b2ae128bcc35fb0 -│ │ │ └─ d8161e633ed73f8b08073250ab295b0d2b2851 -│ │ ├─ 52 -│ │ │ ├─ 08dd254b4d4afa24f2fc2a71d9cd25ae72f7c3 -│ │ │ ├─ 0d091f8c8340c1e339f1ebe196a5e87f1126ef -│ │ │ ├─ 204a67bd672ccdba8b05e2a374bbd7844df253 -│ │ │ ├─ 37e18fdc8aa344a56444b5e423065befe2bcf0 -│ │ │ ├─ 728e8170ed82d94dbeac8c42cb1759d8d91abd -│ │ │ ├─ 754b12732162e622618ada57eca4df2d0b8153 -│ │ │ ├─ c2fd0ccb3d591f6731847dbe6017bb1f9d81e4 -│ │ │ ├─ cf7608e8f002d446d3ebdfef22bf7535ef10a4 -│ │ │ ├─ d921058cb7dd9c0e77ae9a180cccd751c4b2f9 -│ │ │ └─ eef0a2975d9cd9bd232ab6da076bab5a42944d -│ │ ├─ 53 -│ │ │ ├─ 0ab8b5f69651474a46c6d24251cac078fe3cc9 -│ │ │ ├─ 208d01c53a4d0c9846d439ecb35ae3158b9eae -│ │ │ ├─ 2ea87399fba95b3a4c2b0bea44d526336227de -│ │ │ ├─ 4b61aac13176ba2550013a146b72d7d0da1daa -│ │ │ └─ cd1379cbbf203dcfc218415288df1bee8b1ab1 -│ │ ├─ 54 -│ │ │ ├─ 0ef81bba74be9d4388e043f637b979418cb9ae -│ │ │ ├─ 51129e9f4ecc29cf623b1395ef0e232d2dacfc -│ │ │ └─ 7c6c444d06b4f2e3c1773ac52d87ffbe453ccb -│ │ ├─ 55 -│ │ │ └─ 63794407cecff94be06a2afe1f2342d2f6210d -│ │ ├─ 56 -│ │ │ ├─ 0be726e80608cd05030dcd86e41b34b530e64c -│ │ │ ├─ 466d993303e0e368564c632e42ecedf5116f95 -│ │ │ ├─ 82ed556ef0c65cb0f0b3eed1feb051f24f391c -│ │ │ ├─ 8d04e8f9b32971739a272540fdd5cd5443bac0 -│ │ │ ├─ c06a2508e21a125c9398fd937374effd5e510e -│ │ │ └─ df089a80aaed86f9ff485dd9c033c542ab12b0 -│ │ ├─ 57 -│ │ │ └─ 60bc4cf0aeed81b363a84b96d80b65069a5376 -│ │ ├─ 58 -│ │ │ ├─ 1e1a9449fb60f38340e338f2db80387515d87c -│ │ │ ├─ 81357364f41aea98c1c01ab2b9056adc79689f -│ │ │ └─ d0853cca6ca71dbcd2e51540cf30329ce14be1 -│ │ ├─ 5a -│ │ │ └─ 2f51d56513f279eb42c324d0af6b8803f3114d -│ │ ├─ 5b -│ │ │ ├─ 2b9b52fa91e75ac2699107f8f9e46f4909bc58 -│ │ │ ├─ 405e00a7846d15adaaff4ea1645532d109f9bd -│ │ │ ├─ 4c386f9269b30a21f15145cd966c50017c2a3f -│ │ │ ├─ 65efecee8fc9b77d22c53aa905fe0c4d70e89b -│ │ │ ├─ 7e5ac020eef518463f1072b7d180b5f7d97691 -│ │ │ └─ e554704d26d85f366ede82f71379bc5e816553 -│ │ ├─ 5c -│ │ │ ├─ 2767e9e9160b08ff0e3708dc449014d7dc839b -│ │ │ ├─ 5773877d795586321bc29d3cba68c4f0abf295 -│ │ │ ├─ 7b812101de671a255ba6b7935753de08bb0faa -│ │ │ ├─ 808c2e8a3ae46a2f1a3ee073b9007f05f5a0b0 -│ │ │ ├─ 8245fae7da17b711cb4c5ac73b090f54823559 -│ │ │ ├─ aadc7ee9b249ec14fcc301bad579fae357fb2f -│ │ │ └─ bbf1bffd0368c80903b0ae6185197a4d3756e2 -│ │ ├─ 5d -│ │ │ ├─ 0009759b28a2a5d765e979ed5bf5d2cae247a8 -│ │ │ └─ 82581a13f9900f9dc653b2df9f0027ee8bdda1 -│ │ ├─ 5e -│ │ │ └─ 0e0f190078522d600929e2822dfacf2c11d8cd -│ │ ├─ 5f -│ │ │ ├─ 83e4a24d534c3dc3e52fb497ccd0dec06f8881 -│ │ │ └─ b368c25b8e6d0a88f049dde1c1a658b11eba5b -│ │ ├─ 60 -│ │ │ ├─ 5724d78a3147c0d024d2f63ef9f49b3850a70a -│ │ │ └─ d2371640287b782065c95e0f4d0e56acbbaa94 -│ │ ├─ 61 -│ │ │ ├─ 14a8a6f9073dcfee4d492664e940cc296d62b2 -│ │ │ ├─ 45f58307750f080bc2f21ed9ea81aa3dfde971 -│ │ │ ├─ 6ff837d3ff01e028c208062fc699c7f1c8d418 -│ │ │ ├─ 8200b92bffe3fdf4346f7529b809ed2a19f4b9 -│ │ │ ├─ 84080708ea6e698819a84968f46dd3276302cd -│ │ │ ├─ aebb398049d543c61630d84ef6d7cedbf7438c -│ │ │ ├─ bc81f6b4114b6f85f2c820c771d9daf8202b19 -│ │ │ ├─ d62ddb872c747d7a558201992f3ca717198995 -│ │ │ └─ f06c3fc27201fb43c43fe25701288e3be9332d -│ │ ├─ 62 -│ │ │ ├─ 28cb6f51f64131a47f8d1b65a481081f52399b -│ │ │ └─ afa3a7425dc6a1eeafd1333afc15d429c5d10d -│ │ ├─ 63 -│ │ │ ├─ 0f64180aade3565b3ffef9f3b85522a89f2458 -│ │ │ ├─ 5b76836cbcb4440f69bc446ff4e2a6dc95753a -│ │ │ ├─ 6018af5d0d2048bcf19359ac1ed49f23a56106 -│ │ │ ├─ 7e8550cf9929a6f39420a8acc4c33521a55969 -│ │ │ ├─ 9cae37961afa4bc9deffdbdad62bf20962a4e4 -│ │ │ ├─ d890227e80c704e3f0c0d9952a124641279afa -│ │ │ └─ dbdc33f647275b48e10f5163bd598ea5800478 -│ │ ├─ 64 -│ │ │ ├─ a8ecf73d9c0789dc878ba125b6ae1a5390b16d -│ │ │ └─ bd00a351e938f4b569cf22710ea7ec77fcd013 -│ │ ├─ 65 -│ │ │ ├─ 1fec56b74a7a551839b85277b7d49ac677c80b -│ │ │ ├─ 21cce38bb8a02b2ef627789d323fe06278d823 -│ │ │ ├─ 5f643146a2566185629fd5927c4a2156382453 -│ │ │ ├─ b5672235e8209a2cbd5983684bd68424845550 -│ │ │ ├─ cda810690eddec64c09c4157e28a4c5cd99ea8 -│ │ │ └─ e5c51fc0aae682d645a3fbdab25e94840ac242 -│ │ ├─ 66 -│ │ │ ├─ 37a0e08ba86084211a90672830f43d8a8c1a3e -│ │ │ └─ 499052ffdeb9f940563589b96d8d83166d8144 -│ │ ├─ 67 -│ │ │ ├─ 0e692ff64c6505151432d8ce7edf82f702654c -│ │ │ ├─ 5cd863d43d97e3ea145772fae8cd40cce2f033 -│ │ │ ├─ 8df037ffbcc4b322fd006da137c5610eb312a1 -│ │ │ └─ f835b37199c845e60bfd7262d0189d3732ddac -│ │ ├─ 68 -│ │ │ ├─ 684f2385092575701cdfb2b7eed428095a984c -│ │ │ ├─ 9313bc99bdbbd3e121767f5e684c769e5f66e4 -│ │ │ ├─ 9aec910f806ba91cd2f44611085a38dce36915 -│ │ │ ├─ c4b03ab40c38ef4c8479561758947ebb09a04d -│ │ │ └─ f1ccf548ffd85f7de39f7e55e4796fe466ad70 -│ │ ├─ 69 -│ │ │ ├─ 200d149f4dfc96712a65ec33d15d9f45565456 -│ │ │ ├─ b0d13befdda88edea5eda78533cc38ca453c64 -│ │ │ └─ ea2b5188754a96b8f27a88641438478fc281b7 -│ │ ├─ 6a -│ │ │ ├─ 250cd31ea8698f66996ec591a850057aac85aa -│ │ │ ├─ 8436dabcd9bbfe1d090ccc06f00085c30c1458 -│ │ │ ├─ 8d3e49ac6a274aff3aafecf992a9ecd6f8563d -│ │ │ └─ c66c95a4ce86386d68ab7125f811082b22a5d0 -│ │ ├─ 6b -│ │ │ ├─ 4e73f02d3ebac002244f9aed76d96f5fa19943 -│ │ │ ├─ 68efda015fa5897fc11cf66ab2989f03691c66 -│ │ │ ├─ 9697af17d606fa413dd378af23abe8adb4fb7b -│ │ │ └─ f51cb88088bfde4f8ed254f35977d28a0fe76c -│ │ ├─ 6c -│ │ │ ├─ 916de8971894bcfa01f10022734737fb5bc07e -│ │ │ └─ f5acde3873d90f7fba0e147d8a18df3fa68a4c -│ │ ├─ 6d -│ │ │ ├─ 4b76deba3f6bd60345e565e9a4e67fa93fde50 -│ │ │ ├─ 76b98af7e48f853eb2b4709ade084304f96eed -│ │ │ ├─ b9408c0ebeec4ce39f9c8de9426dff9d70d888 -│ │ │ └─ f9d3d144765263adbeef535a757ec403a8ddc4 -│ │ ├─ 6e -│ │ │ ├─ 48000c7c98fd844af784fb2fdf7060f13ed0b1 -│ │ │ ├─ 784f1a39e6d448c6e29cde4a8467766766dfaf -│ │ │ ├─ c63091e3730c3f950bf33555a8f0abad4e5b38 -│ │ │ └─ c6c6545999947bd0f7447621e41165a2eefce7 -│ │ ├─ 6f -│ │ │ ├─ 01d117795bc13c38c0ac363c6f6e1d179d3422 -│ │ │ ├─ 27bb66a3469f5c7b71b7abe8b47636dc0fcefb -│ │ │ ├─ 4e68b8d39782c1db894fc8ba6bea79402bca13 -│ │ │ ├─ 7d3e652d32e1ca7fa861547b61f52f10ed10d5 -│ │ │ ├─ ada390fb88d8e1dae3454216aa3995141a1785 -│ │ │ ├─ e064acb7787e78d74bb6f8fe605bcc30970aa2 -│ │ │ └─ e396d692ec46c46c3d2a8b9d8b62075d8972e6 -│ │ ├─ 70 -│ │ │ └─ 3b82dbcb0bfda7500e614f8002559be4a6fd78 -│ │ ├─ 71 -│ │ │ ├─ 04d5baeccdab39288c201c738844033afc612a -│ │ │ ├─ 487e574e8c2f88183f5fa1069aa45291ef3a5c -│ │ │ ├─ 6a9bf620cf5aeb2eef0a8c3563c80bbe281493 -│ │ │ ├─ 8a5b15e3fc2423d7bce9d92f46c1034ee6eecb -│ │ │ ├─ 92b4c7b26a958c4bfb7e2d437236d3e00160cc -│ │ │ ├─ b5c823f6488885f7e5a5262257b4223ee8b658 -│ │ │ └─ bbf1df4102d2463e71719d4e75e1657aeb3817 -│ │ ├─ 72 -│ │ │ ├─ 3b2ddacdf4bf8d2fa54bc1d0a639e41c2741ec -│ │ │ ├─ 4acebbb3429946ccffc1a259d23cb869603eb8 -│ │ │ ├─ 560e6607e030d921a5ce8aa9896afd07dfd9be -│ │ │ ├─ 7e9e9b8f9fe9d9a9097a70a2697caf9ad10ae2 -│ │ │ └─ d5ec10b39f96ed65adb00dc4c5b3ff33392471 -│ │ ├─ 73 -│ │ │ ├─ 4aaafa05b7d54ee5b47469558e6a79af561624 -│ │ │ └─ 5d8d519c1e611973b4657f8227311dc745b51b -│ │ ├─ 74 -│ │ │ └─ 0c0418a6ed0aec159bf30712016e61171e3d19 -│ │ ├─ 75 -│ │ │ ├─ 38de72b9737f238816818d8341fe95a51ec818 -│ │ │ ├─ 393284d7e474de2c7fb1ee7d09169a6790c7da -│ │ │ ├─ 63a9737c54262d34b7fa8e5095d2f2ebe03e04 -│ │ │ └─ ec66350527a8f4040671c72760238e6d80b976 -│ │ ├─ 76 -│ │ │ ├─ 81c2dfd35ac9e86fd05ae011349bebc060c578 -│ │ │ ├─ 88bf79dd9ee4c883fc6caa9a2612d2b070a47a -│ │ │ └─ c552fd9fec85c0d239d7b81832d63f088e813f -│ │ ├─ 77 -│ │ │ ├─ 3d9095ac6dd3b4a175fac941fbfa362dab54c3 -│ │ │ ├─ 51450e36a8341f1b98bcdd1a3a5715136f95dd -│ │ │ ├─ 56a3e31e81c175fc527e5f9e06269d404011d2 -│ │ │ ├─ 99291469cd3eb1c9512f9c8a74364c1868cfea -│ │ │ ├─ afcfb1876921dcf9eb5385e4a2e83ce7d7892a -│ │ │ └─ b2dd09dea676e8bc0112df52ddd86d905cd51e -│ │ ├─ 78 -│ │ │ ├─ 072b4555adcb29652f5c32976ebfafbc7513e4 -│ │ │ ├─ 44fde7d27afa59da7e164de5cc2685052d2220 -│ │ │ ├─ 6397831ee35305b43395144f0b57b44e6ff429 -│ │ │ ├─ e7a42494da56ba04fe8ccc0b64eabedd771fe5 -│ │ │ └─ f91682523981d2b323e3783c38d0adb685285a -│ │ ├─ 79 -│ │ │ ├─ 131ce309b76df1628b75c8a081303ff901380a -│ │ │ ├─ 75a019409a4ab6388f7a715f774dc3e17b0995 -│ │ │ └─ aa4bf0a11a4c6e7b767c888bba3165f7cb1b7a -│ │ ├─ 7a -│ │ │ ├─ 201f87f78f582cb6feafbc34eae1c24a5ae370 -│ │ │ ├─ 28c387cd79aa0fd8da8de89436500c293d029f -│ │ │ ├─ cc90285c96fbbe8b6f12ef32cd2384a72e6f62 -│ │ │ ├─ ea63046cb21115d797eb12272599738bc8a4a8 -│ │ │ └─ f6201cbc998b8ca778477150cd7e20d9e4be4e -│ │ ├─ 7b -│ │ │ ├─ 1bc821f760d145c90cc8c7c91f9303dea72646 -│ │ │ ├─ 29a54148062f183b24c10f3970229ae6f5bbcf -│ │ │ ├─ 40b0dad6c35b076eb2b4e0228c22a231628ab2 -│ │ │ └─ d9eeb4de09cbca1fd4d0119ae7346810d73ecc -│ │ ├─ 7c -│ │ │ ├─ 8b99d0f8626fbb522dd6df30b65d41a2f799e7 -│ │ │ └─ 962976302d984324f0c48ec20206f8f3339995 -│ │ ├─ 7d -│ │ │ ├─ 0d7fdee41d3b6f05e6c34155c5386cbabcb993 -│ │ │ ├─ 3b6a2e72708ae4674421580933679c51cc713a -│ │ │ └─ d82dc79af0019d147df8d7191d170db80ab566 -│ │ ├─ 7e -│ │ │ └─ 154687b63ab4c46c97f8987b677703b4b4fe08 -│ │ ├─ 7f -│ │ │ ├─ 35d5038e7152925b199e65daf807a18b0b9e38 -│ │ │ ├─ a3ea88d9f282f67589cb328eef535747dfbe50 -│ │ │ ├─ bbf0947b970cb0861b2a6217e2b95bf3f4e9f6 -│ │ │ └─ ff3fc0d8c5f633fe71d30b058e8a03d8d177f8 -│ │ ├─ 80 -│ │ │ ├─ 2dbd03f383d57aa774876831e410eb3f96d2ae -│ │ │ └─ 399b551c2e61a942a17aa8f29f598db85929a0 -│ │ ├─ 81 -│ │ │ ├─ 024208679f78e44ab655dec85704dac2a5b157 -│ │ │ ├─ 47342c4bb1acf11506aa2d48332f827f81cf16 -│ │ │ ├─ 4e6551bf8226822072b12311e56098b82b0df4 -│ │ │ ├─ 7a135f0bce755d814d97df1aebbfd4c526610d -│ │ │ └─ e35531c241c4ed33e3ea49fd1cef079bfb5758 -│ │ ├─ 82 -│ │ │ ├─ 126b6b98cf2e0c05a18431b4f135ad9b85d3f3 -│ │ │ ├─ 278a4b62f3257327614a21fd24cff76050d656 -│ │ │ ├─ d829614248b566782e2b59f01bf2870de1d054 -│ │ │ └─ eb2c3b40e72b8028f76162282d8a9c53836a66 -│ │ ├─ 84 -│ │ │ ├─ 62bf214baf83cf755bf900c718f7bb0afff13b -│ │ │ ├─ a61a4822404225d01b7aad69ec37abd33f307b -│ │ │ └─ c6298a9b9f7611dafc08709464885f19223d7a -│ │ ├─ 85 -│ │ │ ├─ 4335cef11107b7ee4340e128fd76a2eaa85785 -│ │ │ ├─ 94968edc4f3e0c90095105f210ee4855af9f33 -│ │ │ ├─ ac89eb25846ca61802809ff84038718f122cd4 -│ │ │ └─ b1bfa75f3f2150066b75ae976fcfe2784ff7bd -│ │ ├─ 86 -│ │ │ ├─ 641e9c085154507d55170afa1116c6329433c5 -│ │ │ ├─ 7be445daae54420e35dda6965e99d1b03a3a40 -│ │ │ ├─ f6911853e391cdf2f2909cc9c18ce2d2084342 -│ │ │ └─ f858511d6c7d7043238199d441f49cc6d24a0e -│ │ ├─ 87 -│ │ │ ├─ 62046da39901b039b0b503229eb82e23a1edbc -│ │ │ ├─ 7882442b65ea457207e3557a7df51eba74688c -│ │ │ ├─ 9a6997dbf7276d4f6f99ab9b2f4e1e37dd1248 -│ │ │ ├─ c2dd8fc7ef43d68feef4667999c1270af01028 -│ │ │ └─ d3ee69a4db4025256721548bb8cfbe5ef72798 -│ │ ├─ 88 -│ │ │ ├─ 8218b91ace5184be328a92736d5c954074b500 -│ │ │ ├─ 96d3cb6bf76d0e48b3931fdaba657c79cdb6dd -│ │ │ └─ b5ac14ee6fa0babda3487760baf5037ecc4a71 -│ │ ├─ 89 -│ │ │ ├─ 129884c1fad8d4ac9269391b75d255b4d6a2e1 -│ │ │ ├─ 366f6202026a1367b3d14f47f0e4d665bdb1ae -│ │ │ ├─ 438cb67b9276dc4ba66a80474e01fa7a42d531 -│ │ │ ├─ 607526d498add4d11288c08bdcc0e53a90472f -│ │ │ ├─ 63f5d4f96a714fc92a46e176dd65dee7963e01 -│ │ │ └─ eeb091a289e57aa1aaf2868449b8dfe882f4ae -│ │ ├─ 8a -│ │ │ ├─ 9222034cc9e43e15c71e6485ac7e7b28ba0047 -│ │ │ ├─ 9fad8ab1198f309d3dd17bae277690829ed8c6 -│ │ │ ├─ c639593b9332e4fdb25be3ae2d57fcd0696439 -│ │ │ └─ db204cea8fa63d989f8b664f02548af3cfb2b8 -│ │ ├─ 8b -│ │ │ ├─ 59ccf882dc106369ea5b19624dcdc46505f972 -│ │ │ ├─ 94f412dd29221cb3637facca190dd3eb78978b -│ │ │ └─ e4aaade553def241df383d9be4a2da356d0d8b -│ │ ├─ 8c -│ │ │ ├─ 43b71787f5af926ae98cb50c9be3a0f5e8151c -│ │ │ ├─ 8c2ca495afa8110f807aacac3eef14a3150627 -│ │ │ ├─ c3ff7e4737e5a196bece96ddbeee1eb79760d5 -│ │ │ ├─ cd7732baa6f5a8521bbc5f70b98a499479b9ff -│ │ │ └─ ceb7e3acdc241d8d26b3675ee43f70ed79ad1c -│ │ ├─ 8d -│ │ │ ├─ 1dcc5d35c2e952bb102ecdc3022e2b1d42d03c -│ │ │ ├─ 223c011aff56fe04f170667b08c8aff0eef2f4 -│ │ │ └─ 859ea01ade02a3b011dce115536dbb08e2a1f4 -│ │ ├─ 8e -│ │ │ └─ ac6dd3be999dea932b6791a9fb073029d1329f -│ │ ├─ 8f -│ │ │ ├─ 59d4a891c5641ebf535dc4cec202167ab5acf4 -│ │ │ ├─ 9da50d411d2a9762b6d59adb2a4110203dac27 -│ │ │ ├─ c7210301f106ad08a5ad10334d13afc6c5209a -│ │ │ ├─ ccff499d7120be7293c1fe98ceb18b0654fe85 -│ │ │ └─ fd003c254877e68572a2fdac0551d666c66c56 -│ │ ├─ 90 -│ │ │ ├─ 091548d938e81a16cfd836230499afe11a1512 -│ │ │ ├─ 4e1a7d0945a40c3b29dbfa57f896a36017d6d6 -│ │ │ ├─ 5a429992127c70a40724b1529b1c804888dfc1 -│ │ │ ├─ 5e13c0d343ad3d5c9f6a57133ae38103733737 -│ │ │ └─ bb796576136241daf0141505a34ab96100ed90 -│ │ ├─ 91 -│ │ │ ├─ 27458d5a03a41ceaec126f5be0168dab5699d7 -│ │ │ ├─ 52ca90d1afe5b28693432289c5ecfa0466f8d3 -│ │ │ ├─ 70bd45d8a5a0e73481f61362258a5defcbb231 -│ │ │ ├─ 782a668104a0bccfd4e2b4fe6f0831cf5984ef -│ │ │ ├─ d8f4bc2d91e0dd75bba090f3cbfba13d150091 -│ │ │ └─ f831154f608bffa99d299441e1931c6efb48b6 -│ │ ├─ 92 -│ │ │ └─ d5b1650e8954318a81570d928555feed019dc0 -│ │ ├─ 93 -│ │ │ ├─ 2348c5da96a95aec97336ef0e932aafc5a1beb -│ │ │ ├─ 30fd2d42dd601ab2bc3b41fd80ddfdef82460e -│ │ │ ├─ b377881b47233cca0564245c6095f2481ec0e8 -│ │ │ └─ bb5b0cbf1ce45192460bf35cccc438bff138a8 -│ │ ├─ 94 -│ │ │ ├─ 4030a61742df37dcccd4673b044693f123633b -│ │ │ ├─ 536dee044e81da81c530ca9de91572aff60fbd -│ │ │ └─ e1fa1fbcc4feb95fbe2be0890f577f79726a07 -│ │ ├─ 95 -│ │ │ ├─ 265ba32fd124ca4a999b99c16f743e0ff1ef94 -│ │ │ └─ d4b306a03526e72b52b16343afd1ddac3d9eb5 -│ │ ├─ 96 -│ │ │ ├─ 106075c6cfd02dfb18b069da034d7bccffe68b -│ │ │ ├─ 2e74038b63f8253dfe7c6eaeace23d95cb0c80 -│ │ │ └─ 83e0df511202e2c19ab520afb13e5cd6eaec5b -│ │ ├─ 97 -│ │ │ ├─ 1a52419736db08e4bf53c130be41fea800d90d -│ │ │ ├─ 359a69201b8f66747680bd06c8d54bfa5e2450 -│ │ │ ├─ 6b74be2efb703e6bb25b0f9b790788c29695aa -│ │ │ └─ a2364326f419c1ea20fdaefc41e45968830a57 -│ │ ├─ 98 -│ │ │ ├─ 810d6177c1834e837c5199b1dfc3449243faad -│ │ │ └─ e55ad29efbaf2d2aec1c8b6f5009d1f7b16aff -│ │ ├─ 99 -│ │ │ ├─ 0140366625c949a8ffee1da66ee3112d7fc711 -│ │ │ ├─ 0d5e438e90471f7e68f9ae0d8d19c428c3321f -│ │ │ ├─ a6720313537591711624d311c21eaadc7bb834 -│ │ │ ├─ a93fe64c18526b6c1978fdccc82a54d2f0b046 -│ │ │ ├─ ad384013be5d1ca5d89f4633b0023b752cf293 -│ │ │ ├─ d0b417ee2cd6a8adae68b8fd28aa5dee160e6a -│ │ │ └─ e01c3caa7cd23771fe594eef281200f2a209a4 -│ │ ├─ 9a -│ │ │ ├─ 3ee756261de5bbc58c4c2557ccf01088138648 -│ │ │ ├─ 623626519262ef5830832b60cb3e622f5382a9 -│ │ │ └─ b4c8855f0d88baec41d4a9ae9f2086f80d8a80 -│ │ ├─ 9b -│ │ │ ├─ 44d2fbcbff7262800867b04cfccb8f66972ae5 -│ │ │ ├─ 48af5fbd7c8e4395ab7cc447d2b1edb370472b -│ │ │ ├─ 6aa09bc762714d642aa06a4bf256d725fe5e3d -│ │ │ └─ ae3a3d5849d78fd5982ddfb65b0322b6638089 -│ │ ├─ 9c -│ │ │ ├─ 01fc769732bd30071067c78db9eab0c2cba832 -│ │ │ ├─ 0c95cfceddbffca7913b5ba3668824f7971801 -│ │ │ ├─ 680c8d4940eace1dd8df6fbeadf50b0b4ccc7e -│ │ │ ├─ 8879d12a1bc2b0548e9fc85621705e783a6054 -│ │ │ ├─ 93ee83e22466acb43d029a1a0bf622ef07bc88 -│ │ │ ├─ c36e2532600aeeae263b2dec784ccc3b79de8c -│ │ │ └─ d88f38beea8708b25ee3f797ebc453dffa4fb0 -│ │ ├─ 9d -│ │ │ ├─ 0c8388739679e24fb577b02be359d91872b7de -│ │ │ ├─ 78b052b42660da4e1faac503c0305603d9355c -│ │ │ ├─ c7ca2d867d85ce98d20512aaeeb40991e557d9 -│ │ │ ├─ ca1ed09edbef8d31cb4fe726814b47377458af -│ │ │ └─ fb545fb874011895faa280b0b23209e37ec861 -│ │ ├─ 9e -│ │ │ ├─ 058c1a899bb5a0f2680a84a41aee5b7f684cc7 -│ │ │ ├─ 475066e8179251e67e5684075fe83f9eeb15b0 -│ │ │ ├─ 49fa0639baaaaad41631689ab4df199890903a -│ │ │ ├─ 59e9a8845a815f8bb475dbb1f979f3700bf1a2 -│ │ │ └─ 76fb6cc9ecaed02ff429996e6e7c4be5c86ae8 -│ │ ├─ 9f -│ │ │ ├─ 3791bf066935187b4157674d3517d1073c7495 -│ │ │ ├─ 84697a8a5bd7bc12448e1f06cf2ec82e8b437a -│ │ │ ├─ 8e4416db31b3d27d65acaa75a658adcba9d294 -│ │ │ └─ cba323fe8afde1a1ff3070e5436049bc74c670 -│ │ ├─ a0 -│ │ │ ├─ 375fc0ea89099844077ca03427e6036d74f0fa -│ │ │ ├─ 4e6028777fadbf72bd444012685a5b6ac74e89 -│ │ │ └─ 55d21c97ed7625e06912442db51160c6731329 -│ │ ├─ a1 -│ │ │ ├─ 0703bfa76c03fd29c68eab0d75d7435ea2685b -│ │ │ ├─ 4774c3f6d3850e8759e3d388de6a2bc38f3eaf -│ │ │ └─ e7e4cda8d8db38b0552e597c62e112d65bad04 -│ │ ├─ a2 -│ │ │ ├─ 1a412cdd183a6ef43c2102b3b4cb611b1cacf7 -│ │ │ ├─ 34d7b5162f20e8986ca10d631b358031ad5189 -│ │ │ └─ 52a4631f731b2714c93b3e764eb1334ccb5467 -│ │ ├─ a4 -│ │ │ ├─ 019cb950c067e298b2b180157908efdb8877a8 -│ │ │ ├─ 4fd785361f883482634803b03124a84d1e950c -│ │ │ ├─ e05e5694bb8c8832e0265653dd161d96123b1d -│ │ │ └─ ed4fb544955ed1983bf9245b12bb0dcda36316 -│ │ ├─ a5 -│ │ │ ├─ dcddd7ee27db21b14df84c46c135dff82cd2bc -│ │ │ ├─ f190c5381cf8393be5511a8f203018994e67fe -│ │ │ └─ f548547f13afcba8af51cdad95c4bded8cf06e -│ │ ├─ a6 -│ │ │ ├─ 015d33fe114b007c3a6a6f3832eb539614f47e -│ │ │ ├─ 2dcf028271234a9f7c306ac2b77fa0282d3686 -│ │ │ ├─ 7951e1a912c86b5e6427ba9579589df2b72251 -│ │ │ └─ 9fa36a927833e0c0cecbfbfeb0741abce979aa -│ │ ├─ a7 -│ │ │ ├─ 32a3dee0f33402f59a71309632b9c03e86375d -│ │ │ ├─ 44eb08e29118ed487d251e8dfe143e5ced91dd -│ │ │ ├─ ae8cd092cd9a9c2bc740a02c55e64e3b0631a8 -│ │ │ ├─ fc6fbf23de2a53e36754bc4a2c306d0291d7b2 -│ │ │ └─ fd6c38ce04645bd221ec5f54cca9d219412d33 -│ │ ├─ a8 -│ │ │ ├─ 4770730a00a9c3f50e3a5d1e11b184284d1b73 -│ │ │ ├─ 4a750740c4c37ff9e2ea209288d0015fdd10a4 -│ │ │ └─ f1936e4fd6ca6ed4fa106148f171549d06bcee -│ │ ├─ a9 -│ │ │ ├─ 0134b74f0d4e4902c2f87fb3aa120ad48a2f70 -│ │ │ ├─ 6c7f7d66dd0c3068835556ba48a35242de2191 -│ │ │ └─ be53d283ce55d8938157103ed3621176dca32d -│ │ ├─ aa -│ │ │ ├─ 27392936fdbdf4c5886ac802c35f11ec30763b -│ │ │ ├─ 834d1d098d497b350e4b6ca06692b78fe333e9 -│ │ │ └─ e96e0032e3d500d770ba46b42da85063c14080 -│ │ ├─ ab -│ │ │ ├─ 17131f66cb80cb235b8ec074cfd88d80fa0f2e -│ │ │ ├─ 34c5eaec2d0394753b5a383e3f4f3022bf6f39 -│ │ │ ├─ 93081a1f38f91219ba68c21cf79000e4b1d497 -│ │ │ ├─ ac437b1c2070e56a0695a2c805586d4feec79e -│ │ │ └─ cbc98e951b56d5b7269b66afb1e53300baee9d -│ │ ├─ ad -│ │ │ ├─ 0cc6b9423cffa8b6e9c182fc2eb2e4a85a2240 -│ │ │ ├─ 3b7cce5b694e4a4a0b59e1b48e6ca47a5f7217 -│ │ │ ├─ 5703304ac22c61ba7203ee766af2a88eb0f057 -│ │ │ ├─ 7c871a54b0a68526a0508fd898507a89ac47e7 -│ │ │ ├─ 91be4408dfd66d93b82fc3facdc836b0d8c003 -│ │ │ ├─ a0274dfe1d412fca045988dbaf866a410edf6a -│ │ │ └─ f63bb5f1e46cd835ac00889ef21c48e6265a57 -│ │ ├─ ae -│ │ │ ├─ a5546eb84af66eda7412b34fba735ff40a0ce3 -│ │ │ ├─ ad43de364cd1cc107d5fc3a4ea6fea7d7bd01c -│ │ │ └─ b3ea459bb0e1e5dd7dbacd5133d48d89fc72dc -│ │ ├─ af -│ │ │ └─ 3555da48d3f31828744e9b00de570ac96522d6 -│ │ ├─ b0 -│ │ │ ├─ 2e4c018ca5f7e59d33661476191fd581e8720b -│ │ │ ├─ 707ebe4787fc7b84635a0f13aec80162cef8ae -│ │ │ ├─ 9b34e76183266c6cca14affec6bbaf091f3975 -│ │ │ ├─ b0cc64443d4887084baedada8a4cb2e5b62b1e -│ │ │ ├─ bd2deb9d9209340bd4738f58bee00a5a2d83a9 -│ │ │ └─ f5450124394b73492f923325a72b5fad24cf6f -│ │ ├─ b1 -│ │ │ ├─ 046638e0762269b34625c39d501be6acd73604 -│ │ │ ├─ 30949d646fdad3f5bb493b74dc69baa7eb5d92 -│ │ │ ├─ 79b857fa0c5342f350e6fc988030d94337c1db -│ │ │ ├─ 989b48976d0130cc2f654d6b3fc9125443dd1e -│ │ │ ├─ c1519fe4606bc36f1e21ad6444e5bc59a49c48 -│ │ │ ├─ cb84ca89622c8ee1fb29280c12e558cdfc0144 -│ │ │ └─ dbcbe987bc888358a4ecfae3d6d4a50289d12b -│ │ ├─ b2 -│ │ │ ├─ 424b000497786d193afcfdf3d0e734134734f6 -│ │ │ ├─ 5f7c44f4df5cf1018fea4525503760872b28af -│ │ │ ├─ 9838b50420ef983dffc976562c9c95c31a0f4c -│ │ │ └─ da239aebccf7b2d642e509e871235c0c6541ba -│ │ ├─ b3 -│ │ │ ├─ 034164ecda0e8241bb957410d6fb8ddd5652e7 -│ │ │ ├─ 49d006cd22422127fe12e4ae9f0501b7a3045b -│ │ │ ├─ d546f1ceed5a568d1100dd94d2e9a3598f327f -│ │ │ └─ d98ad63ff1757a63e5032526a5c0df614ea0e2 -│ │ ├─ b4 -│ │ │ ├─ 1f645438a1b17e38cf58b1591620d3bf28e1b1 -│ │ │ ├─ 72ea6627a6e8de00f2553c6a1d4e1b93537201 -│ │ │ ├─ ca4825ed91c256d381ed5881229226cd20870f -│ │ │ └─ df6d302f59b22bac408b9bcc8eb52320e56f3c -│ │ ├─ b5 -│ │ │ ├─ 0a9fcecaad194f47231fbe646df2f2f7a81263 -│ │ │ └─ 18aad1928272931fe834f73ba07e2c9169fcfa -│ │ ├─ b6 -│ │ │ ├─ 48e5737be6168bff5137cb1a5a897e55ce193d -│ │ │ ├─ a591478f2baa6280da35a2f5c37bd1ae488f71 -│ │ │ ├─ ea60c64d28b0aa957f85618025fba2d66d278e -│ │ │ └─ eb0544222e61d14d3dc37b62982e369bff8d0b -│ │ ├─ b7 -│ │ │ ├─ 43755fd252e24808561b98bc0ca7a1a82a55fa -│ │ │ ├─ 77ae264c03652b13cc8ca102428ae07ac91e3b -│ │ │ ├─ 988016daa5bf0b3d4fcdccaba52780a9983d9d -│ │ │ ├─ d18c6a25a5f56238d4d0f50048ad1f4bc9f887 -│ │ │ └─ ff48505c70b3abe885676ce410f1be7c6aa296 -│ │ ├─ b8 -│ │ │ ├─ 8b022395fdb1d1f7d5747386de7c72d410644b -│ │ │ ├─ 978355becd275af9440a2bb07e4f5242147700 -│ │ │ ├─ eb550776fa5820cd69c4546ca5725a276a934f -│ │ │ ├─ ecc16870ed6deb50c3e058b73079739f13af10 -│ │ │ └─ f69c60df06c5dbfd5a6ffca460e790720156bd -│ │ ├─ b9 -│ │ │ ├─ 37d15e6ae88cd78e81657b9f1c94e85345ce9f -│ │ │ ├─ 89dfa2ee69281a8af32a76a8206495db2df738 -│ │ │ └─ a6f8d4489717709a97cb1582730f1c2c1908b4 -│ │ ├─ ba -│ │ │ ├─ 104a9f77e2ff78bc805832b2978f27f3cfd866 -│ │ │ ├─ 14439969a6d6fc4e35f080eb49180bd5083310 -│ │ │ ├─ 59abe1b521b334d67981f5e199eabb4b674777 -│ │ │ ├─ 5c035b77bb30f7b839b991fa125e3da2dcaba8 -│ │ │ └─ 8c551958d294c728a0514c99307644b3101b8d -│ │ ├─ bb -│ │ │ ├─ 1116077931f0c64c4f4525e21a327c1fe98b5c -│ │ │ ├─ 16c0bcecfac3f167f00460700e6b1e3fd2a3b8 -│ │ │ ├─ 18b1b9ee79a371f62d7299092989c355d14b31 -│ │ │ ├─ 287b7d5c36d079048156090bfe03d8746fe481 -│ │ │ ├─ 2e86f1ae67d19202cd8f572060a12be48dc8a5 -│ │ │ ├─ 7f4b5cc743f2feae6cd90a30bfb665ad3b5595 -│ │ │ ├─ 80082b3a349d3bcc413059be4a9b2cce56cf26 -│ │ │ └─ acdfec2a3d6e5ef3ad9fe34d428d3942994d1b -│ │ ├─ bc -│ │ │ ├─ 33b259dfe358bf4893ec3e3c177edc806e9b50 -│ │ │ ├─ 3d9e7f9b11df2be191af6076e9e01b63840ef7 -│ │ │ ├─ 7a022b8df912458d259e14fc7aff3fd4c8e874 -│ │ │ └─ ad823f6cfcdcb45197f67c4af1b3b4108798cf -│ │ ├─ bd -│ │ │ ├─ 72679c4337b966622a602728631f0bbaceffa3 -│ │ │ ├─ 912855927dcf7490ae2432ed866a04d9b8ff73 -│ │ │ ├─ b9391236e226d6a68fa765b7594c005bead6d2 -│ │ │ └─ f0457cac0670f4bf421d9faf004a9d493612a6 -│ │ ├─ be -│ │ │ ├─ 734fc38621e44fc547619a85ee1fba97d01fae -│ │ │ └─ ca9a7922db9c97a5188ca69a69f5da43acff06 -│ │ ├─ bf -│ │ │ ├─ 6e762363ecfc1f6524834f1f26f3d4a3db3c0d -│ │ │ ├─ a2e3158c614123cac93be6200f5c290333919c -│ │ │ └─ e00c67f0a6f7bd1181eeba898e6d968dd63081 -│ │ ├─ c0 -│ │ │ ├─ aea8f88f1c03e060690e3c5ec3c30a492b9df2 -│ │ │ ├─ db76e2d7f9b137f4c1af25b07dc1980dde7d3e -│ │ │ ├─ dce510f01304062e4cdebec003b0a6b42f876c -│ │ │ └─ f63bd5a84420beee7d9019ffe56f6142703822 -│ │ ├─ c1 -│ │ │ ├─ 6772392d71038697bbf6264ccb3b8b119840ea -│ │ │ └─ e451d9707d198ff45b78f375288dffea46405d -│ │ ├─ c2 -│ │ │ └─ df7b64147f94e368f31fc8879e140ad1fc0fa4 -│ │ ├─ c3 -│ │ │ ├─ 6cce31d30cbf68bdd023e347a22f6eb052cc56 -│ │ │ ├─ 7aa2c7ac8f091c81e3f6b2717db986cd449035 -│ │ │ └─ dbcf5038aa7a86d0214f67e19b42fb919dd318 -│ │ ├─ c4 -│ │ │ └─ 5fc3257dedc0f3a4414b9148435f667ff51dff -│ │ ├─ c5 -│ │ │ ├─ 0a26664df4452669a999e8126a6134f5f4c715 -│ │ │ ├─ 5cc1e59583d8b4c5201523ff518a23ec71ae3c -│ │ │ └─ abfdc550c26a98f92c5a750759c43670b69a7b -│ │ ├─ c6 -│ │ │ ├─ 12d18409591b015af31c6039b81c936e7a6ccd -│ │ │ ├─ 6c6f29d51fdc9170805df85c38be9cdf26154c -│ │ │ └─ f2e667af9196148f6e59e2774343fcbfbcc91d -│ │ ├─ c7 -│ │ │ ├─ 36a3f99183447bf5f385b0c19f900be944ac17 -│ │ │ ├─ e27478a3eff8862ca150f10d1b93a5ac866af2 -│ │ │ └─ e3d66871726de3d13f3c1786edd8845f6c065d -│ │ ├─ c8 -│ │ │ ├─ 0c7b71b3b42ad7ed608cef17ae53b890c1bb66 -│ │ │ ├─ 8e7314eb7c639788a1f39d919ef0f333c4b0a2 -│ │ │ ├─ ad2e549bdc6801e0d1c80b0308d4b9bd4985ce -│ │ │ └─ dfd66e65b6b16b7466b93e053c7a493725fb74 -│ │ ├─ c9 -│ │ │ ├─ 71a56437ce59480ad12f913903a3d871dfbbc0 -│ │ │ ├─ b444d8335891201efa45efe30f501b1503e822 -│ │ │ └─ ee6c724e82d309a38a43b8cff90221881f4487 -│ │ ├─ ca -│ │ │ ├─ 0655905084adae235a83c28958c21d6e1a1346 -│ │ │ ├─ 269aad3bc242a9aca2d9921b6152802bc07be4 -│ │ │ ├─ 466fd466c07f5b0be80ed7a99207813e8f765c -│ │ │ ├─ 7e841e6e5dafac061a3a939abbcf35fcb6baa7 -│ │ │ ├─ 890a16443190cfc810a3890db1c20c2eb97e8b -│ │ │ └─ dd9bb5bf0c3d8c6da76f807866dd6bfee93f91 -│ │ ├─ cb -│ │ │ ├─ 0e9446802a8df4647c711789eba7914fe5b507 -│ │ │ ├─ 159449b6ab12d0b988db6c2f9bfa8975d0343b -│ │ │ ├─ 5ca764506322e7970fa8637828ac2752f59fe8 -│ │ │ ├─ 939de704aa29d5804be972453ffcbafd43229e -│ │ │ ├─ b5ffe1fe8acf765ede6058c3962291b97b79f2 -│ │ │ ├─ bb13bb01ac5c1ca38d633317e74adf5547045a -│ │ │ ├─ d1b4e1bacfa8e98971991190e929e61c9eb48a -│ │ │ └─ fabb7fbe009c8b9eea8219e541cf0b0660cb53 -│ │ ├─ cc -│ │ │ ├─ 458be89d23112f4c00e6d346e5f33ad3d8d07e -│ │ │ ├─ 5f41350c6feb43e1ae61364edd7aef36f07b78 -│ │ │ ├─ 668650a12f274facbbf6b98a984bb22a39947e -│ │ │ └─ 9b6316bd216df23f25022a1520056fc3187dee -│ │ ├─ cd -│ │ │ ├─ 051523bde762bf565a38f0efd9cd9b7c6a6021 -│ │ │ ├─ 7bca542eeeeb13c3e50783d74e6e1d76ec478b -│ │ │ ├─ 8f039662e703e41ae63879f53e5c75214bf1dd -│ │ │ └─ d6d9c7912fb700a343dcaa2a5bc197fba5b8a5 -│ │ ├─ ce -│ │ │ └─ 3c7d4c94f6daeee05421cc11beb9aa9f29fdab -│ │ ├─ cf -│ │ │ ├─ 526bc8940aae79eed2051431b98738b791db09 -│ │ │ └─ e9fbd3bf9e1f28b371aacf88c5e1e8eedf0626 -│ │ ├─ d0 -│ │ │ └─ ca0722ac8ce2350023e4f5cfc4756fa8e318f4 -│ │ ├─ d1 -│ │ │ ├─ 5cb8e27265b4992b26ba618bb6840e870f4e38 -│ │ │ └─ 60c1e42025d3ed20faba101d43f86fe29e9d7e -│ │ ├─ d2 -│ │ │ ├─ 4fdfc601b9ffe8ccc3fca5d3b873109dc56c4a -│ │ │ └─ 53d31198ae6b71fb35ca8a9650b797fdafed14 -│ │ ├─ d3 -│ │ │ ├─ 013c2e2756da2a8e24e302816a5bdc58cd8658 -│ │ │ ├─ 5fc97e5ad4dbb105b31887939aba4edea55721 -│ │ │ ├─ bb9968e548cec754983b8e430aa41ed6b8aca0 -│ │ │ └─ bdaa709dd54c9bd398369ef8613a84143ea6d2 -│ │ ├─ d4 -│ │ │ ├─ 35a5754185242a3ee5d99eeeb5df5a6479a76a -│ │ │ ├─ 3c8b3f8f9bf3a57bc31a079ce7110b1bf5f80c -│ │ │ ├─ 50147fc781245869067a05ab9189bcc6ca5703 -│ │ │ ├─ 5f6ada96e882b803e70ffaa2c3e046f678236c -│ │ │ ├─ b08fc369948daacc146dcde0f63c3a79039852 -│ │ │ └─ bb5c4398661928786d69a6f337ff769fa5462d -│ │ ├─ d5 -│ │ │ ├─ ab60a970b8bc3bcf5af92f726477451053710c -│ │ │ ├─ c9a50d9ada9c08ba16ce207d0ee50bd6a7db29 -│ │ │ ├─ d0adc8a613cefdf76706f94b805e6fa38076fe -│ │ │ ├─ e4f6ba5080b45a8ceb004e20cf5b9547729626 -│ │ │ └─ fd377c075b96b488411f98a5daa8bb7265204b -│ │ ├─ d6 -│ │ │ ├─ 7e7497df5f900c43b4d7e11eef75cc7ac62be6 -│ │ │ ├─ 89c99b9d82f47b8803978057072a295282810d -│ │ │ ├─ c953795300e4256c76542d6bb0fe06f08b5ad6 -│ │ │ └─ cd8643775c1111581cfe3b9cc7cc0ac234fe1f -│ │ ├─ d7 -│ │ │ ├─ 06694cf2cd00b05806c1d7304eafdfb94e07d5 -│ │ │ ├─ 186a506b81d5b5363970fdaa50f54a11034f5c -│ │ │ └─ a83392ca622e64a6af94b180f9733199c932fb -│ │ ├─ d8 -│ │ │ ├─ 6d5afb88482b6fe014f937681b5e9eb254fe99 -│ │ │ └─ fa05fcfac9451c42fd1bc5004702848e101533 -│ │ ├─ d9 -│ │ │ ├─ 34abf5ad49588984be8ab900090de8f354f586 -│ │ │ └─ 673ae544f3b5c7c54788d5090f826a069c1237 -│ │ ├─ da -│ │ │ ├─ 65a1cdf1770e6a6dcc8c4b439070e371ff8226 -│ │ │ └─ 8c8b73283c8266a66cc3c9a936690c768f57c3 -│ │ ├─ db -│ │ │ └─ 1387186299dd4d9a9353e81d080c6f0b083a12 -│ │ ├─ dc -│ │ │ ├─ 065f01a850f4caec74ae3b2d9caf2891676610 -│ │ │ ├─ 9aaf2055d4d0e977608417762f2abce242d22b -│ │ │ ├─ b1a8ad1deec8879a660809c01fbe48f3c1dd66 -│ │ │ └─ b9aa69d414681ca2899c4744a32f9dff0d2669 -│ │ ├─ dd -│ │ │ ├─ 0e4e977c3d752602239de25b6ace1b3fdfe95f -│ │ │ ├─ 2e5e2769ae15ee83b070ce301d0abce814f7ac -│ │ │ └─ tmp_obj_qIPXff -│ │ ├─ de -│ │ │ ├─ 068a8213109c84c33263089f9ea15037bb1910 -│ │ │ ├─ 11fdc9439c788331e45c959fb9319806ca6508 -│ │ │ ├─ 32f889ca9fb4ae3d36444a041211293ce9eba4 -│ │ │ └─ 34f55ae2c0fd13ea4e862561f18e121218cc98 -│ │ ├─ df -│ │ │ ├─ 0b86e2101abda4e600d92749a5c5240745b8bc -│ │ │ ├─ 5d698991d5f6c5023bdaf51ccf991d67fca902 -│ │ │ ├─ 7c98349912bf265dc647bdefd528d24e3b51ac -│ │ │ └─ d4fd99d16ec297885d8140b791b573f7dceea1 -│ │ ├─ e0 -│ │ │ ├─ 8c34fd89bfcae4d87abbdcfd6ee20afb2d8ca2 -│ │ │ └─ d8b5183bdb31acd2eb77ba01c2696c5f585b64 -│ │ ├─ e1 -│ │ │ ├─ 0cf01cd5bba8c3d16b6ef1671b7a4b74d96c2b -│ │ │ ├─ 356241b8a3ff9a39736927f3b7bac69015b93b -│ │ │ ├─ 89447dfd2df23aafb77cf0daefd4996046b379 -│ │ │ ├─ baddeebae8299976c5115ce3a1e87365aa89db -│ │ │ └─ ccf64e18c8fb589e9855f1f20f2280f48460c7 -│ │ ├─ e2 -│ │ │ ├─ 583ef9d3a4c91e3b948c964eb73a80f222d814 -│ │ │ └─ 8ba4468c1823d40e623e5db2d1f24cfbf89170 -│ │ ├─ e3 -│ │ │ ├─ 0bbb9d4ea6cfe1d588a5940efe50c1638f084a -│ │ │ └─ e00f92337bed352370d5db0fc46c3e790b187b -│ │ ├─ e4 -│ │ │ ├─ 2aa68a542d9e176b5fd050c35b1af11659b2a3 -│ │ │ ├─ 3a029389e54385a939ae233404518bed3dba08 -│ │ │ ├─ b78eae12304a075fa19675c4047061d6ab920d -│ │ │ └─ df322d47fe18be3281c38dd9a2ccf80e35c728 -│ │ ├─ e5 -│ │ │ ├─ 11dfe6e4eb3c7582f643d3bbd759b8340bc856 -│ │ │ ├─ 5873a12483ebbac471596c9e6d7dbb3c87ba31 -│ │ │ └─ b81c1dd5c429f1095f51c06514c41f542b774c -│ │ ├─ e6 -│ │ │ ├─ 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 -│ │ │ └─ f4725a2d010b2c1a9f3e026ae9d10942b33321 -│ │ ├─ e7 -│ │ │ ├─ 02e694e3964e87233dba76949eeec2f63c2364 -│ │ │ ├─ 6bbb1d67f08de4c71b853b460ae7a15dbe0ca2 -│ │ │ ├─ 979bf74d64b7adf05734e4e01d9d6d99ac9533 -│ │ │ ├─ af2f77107d73046421ef56c4684cbfdd3c1e89 -│ │ │ └─ fad81f60d181cdbd8b53aa698b3055c4af6b71 -│ │ ├─ e8 -│ │ │ ├─ dea8ba5ede15a6c57e144dbad91081d9f95a98 -│ │ │ ├─ e295f439774d9766aa223de42ada48f2acede7 -│ │ │ └─ f4329f84ab767b81da2d7c77825f8e9d174d7b -│ │ ├─ e9 -│ │ │ ├─ 091b4009fdcc1c1472d1e1d783cbdc5166e54f -│ │ │ ├─ 6d67af90a0d412a6fc33182b6efdbb4bf5bb63 -│ │ │ ├─ a6a328eb425f68d1fd8ab0c4206db6a315f4b2 -│ │ │ ├─ bb1d54f7d6382574f4e460e9dbe941513a91be -│ │ │ └─ dae3c5320848a30f296103636ddae0347129a4 -│ │ ├─ ea -│ │ │ ├─ 28d23fd64d5683bc5a27a9461b436e54c58fec -│ │ │ ├─ 29982981aa7c9503c3253351bff6e4f969ba69 -│ │ │ ├─ 595353b4b2f332e8080e5bfbac2177bfc7e68c -│ │ │ ├─ 94af1337ab57b92c9113175e34aab8737023ba -│ │ │ ├─ b6bf47c11ea5df6e600d420e790cd09b850736 -│ │ │ ├─ b7e5203c8ee3f4df38ab460fa7ed066e477902 -│ │ │ ├─ c4a4d8890cb702cf14d9ff187c7161e1491107 -│ │ │ ├─ d95373b58450859a8f6ffce16e848eb20f04e2 -│ │ │ └─ e37aefb279b311d56f720acbc988cca1eb6a67 -│ │ ├─ eb -│ │ │ ├─ 0536286f3081c6c0646817037faf5446e3547d -│ │ │ ├─ 0667ad2792cc1e2b19c0cfe9460c7329ea63a3 -│ │ │ ├─ 2380d978321e3642fb860d004cf880065b1691 -│ │ │ ├─ 70b4d2d5339b4ec33078f2e5ae6cde99e958dc -│ │ │ └─ e7f6636a3bd04a1c921815d7465708693d5993 -│ │ ├─ ec -│ │ │ ├─ 34baa2546f3f76820437f290a452ac7ad69feb -│ │ │ ├─ cf4cd4073f2f986bfb75cc10f9504d6207f6c3 -│ │ │ ├─ d3ee82ad44b05cbbabf444e5d1194765a569ce -│ │ │ └─ e84198cf81b3fa6e528465c6f8417eee0d8919 -│ │ ├─ ed -│ │ │ ├─ 09befd5ca288a43fdbbf2ab4add15ea51ab71b -│ │ │ ├─ 311ce7dde3d76282bb009787b5992720061c85 -│ │ │ └─ 803f61f6a493d89ee8c94167333dd359fe817f -│ │ ├─ ee -│ │ │ ├─ 2935d3aa8b7baa45264a4e7b4a431fa6674e78 -│ │ │ ├─ 49bd49ca33c6d9c4413c0e59f226d4cbec6b07 -│ │ │ ├─ c095e0971248d73fdb377da340a4a7e6a53e3c -│ │ │ └─ db4af72f496824cd52d96d548b49b54154c170 -│ │ ├─ ef -│ │ │ ├─ c7429ef613ab1d5619c32e18d060cbb462187e -│ │ │ └─ db19de852e6fed77fc479e87925504c828cc24 -│ │ ├─ f0 -│ │ │ └─ 2030d1907af5bde0e524616e99e2b896670774 -│ │ ├─ f1 -│ │ │ ├─ 0b7bba766ed3cb848ca8cac83cb17a8ded60c3 -│ │ │ ├─ 9d4aea9a1be28ab41147224562efdf9962b0f5 -│ │ │ ├─ cb227c51be6d9ab21438e108b30e59c25c988c -│ │ │ └─ ccc5e52cd50b02e652cb853f272366fa1345f4 -│ │ ├─ f2 -│ │ │ ├─ 004fc2de3f618b5d8c86b3f8121b587ab825d1 -│ │ │ ├─ 7ba14f09f2aef16b8bfe2ea2dacff7853215ef -│ │ │ └─ ef85f539c40082e4e413036a9828d99bfc2f1a -│ │ ├─ f3 -│ │ │ ├─ 1575ec773bb199aeb7c0d0f1612cfe1c7038f1 -│ │ │ ├─ 1b3837ce0c1f34b782de353c746ba15f620b83 -│ │ │ ├─ 2a3da81e61964a953b7f0959bff2e10f77e164 -│ │ │ ├─ 934031703bd10d928dc8f626b97798dc660d7d -│ │ │ ├─ c7e0bebeab56cd2ef595931697c7513546bb34 -│ │ │ └─ f4dc9319c33d8517aafaf661428b343cd78dfa -│ │ ├─ f4 -│ │ │ ├─ 14f99433dd4ec694069fee01ece090fb1bd7f7 -│ │ │ └─ cff77e6afe1182a8360448d3778e8ece4f9f86 -│ │ ├─ f5 -│ │ │ ├─ 36c55a55612413bf011f8772a08467b58a39b2 -│ │ │ ├─ 593c852f0bd0a19d435c10c4a9a1ccc93fa7b1 -│ │ │ ├─ d9fe331c0b23e6c7ed4fa0009ca9b097d28c82 -│ │ │ └─ e7fb7a4abde24623c2d7aa03f145d62d838c3c -│ │ ├─ f6 -│ │ │ ├─ 0c2656d4b838bbe1bd2d9570c259113dbc8456 -│ │ │ ├─ 96d17205dfb6add98d93e7be78ccc4c6475264 -│ │ │ └─ df23065c388157cbf32f4c09586a2ad7b58e47 -│ │ ├─ f7 -│ │ │ ├─ 182edcea2baa8778219d4aab2c0c1b21f1a30a -│ │ │ ├─ 5fb0ad34af415254afd0b800cff40bad6e6d3a -│ │ │ └─ d8dc781419d04a594e5e98e87107680ae0f414 -│ │ ├─ f8 -│ │ │ ├─ 182342a5fcd6b5b17db256fa4e200f258d8818 -│ │ │ ├─ 4474ab6de345811d1676c9556a30aac4d539d9 -│ │ │ ├─ 49eed9075a928461e0271bac08075468d67a02 -│ │ │ ├─ 52999c1b722cd5b9be2fb8e942acac3d61aa9c -│ │ │ ├─ def80021dbb3f39d3ad67730c2ad87e7748c6d -│ │ │ └─ fe57a58dc8597c3bbdfcf376e61da993b8ffc5 -│ │ ├─ fa -│ │ │ └─ d9803cba1cc150332eeeff11231920b5a42254 -│ │ ├─ fb -│ │ │ ├─ 13ec03cc308f12d8b6086a3d53c8d703d86fad -│ │ │ ├─ 5883369bbc9fec742e08bdb0bc4a4b68343bdb -│ │ │ ├─ 5c2ac93e7b5055b4c58daa4d5617255026385a -│ │ │ ├─ 65e3c0762730e419d8fe72feb8504fd52b2345 -│ │ │ ├─ 8c0d501cc8903ccb1d0abeaeed3e0804c40c61 -│ │ │ ├─ abcacd9e92615e4fb1290030f79e9f18b9e6fd -│ │ │ └─ ffa92c2bb7c748d6fc78f9f9dcac604dabb87d -│ │ ├─ fc -│ │ │ ├─ 24b0daa886a6713e19abb95aab1cdc6f4136c9 -│ │ │ ├─ 26cb0fcd98daa12b31c7f64e10a3161b06787f -│ │ │ └─ d628f8ef169ace753dd453de593bd7f4a74a56 -│ │ ├─ fd -│ │ │ ├─ 1ad421c2060f02a3b78cc2d03f4355c637f6b3 -│ │ │ ├─ 9131abffc97ac4e8d6ccee36be0be4cbbdc77e -│ │ │ ├─ be128cb80e98c96918f83b02b3665e311274f2 -│ │ │ ├─ d3363c5c4fd2997682709e414d59710c5e8520 -│ │ │ └─ dc7b2d8ce6e925f958f507acdfd1e0d9911f8f -│ │ ├─ fe -│ │ │ ├─ 00c1e027030320dfef3c122610152b86ef6d35 -│ │ │ ├─ 07fb7e8c0504216bf47430624f534bf799d74f -│ │ │ ├─ 6fc6ef6b5605f3ba78f8bca5a66ff8dcfe3986 -│ │ │ └─ c10445f44b89a190da032b148d4b4475086d2a -│ │ ├─ ff -│ │ │ ├─ 6ec9a6b5af27c739cb932c90a0afc0b2abb8e5 -│ │ │ └─ b73a10765698ba6ae1f8ccf5c3bc5d97cebb8b -│ │ ├─ info -│ │ └─ pack -│ ├─ ORIG_HEAD -│ ├─ packed-refs -│ └─ refs -│ ├─ heads -│ │ ├─ chore -│ │ │ └─ TL-DYS-16 -│ │ ├─ feature -│ │ │ ├─ content -│ │ │ ├─ database -│ │ │ ├─ detailed-steps -│ │ │ ├─ TL-DYS-24 -│ │ │ └─ TL-DYS-27 -│ │ ├─ main -│ │ └─ master -│ ├─ remotes -│ │ └─ origin -│ │ ├─ chore -│ │ │ └─ TL-DYS-16 -│ │ ├─ feature -│ │ │ ├─ content -│ │ │ ├─ database -│ │ │ ├─ detailed-steps -│ │ │ └─ TL-DYS-24 -│ │ └─ main -│ └─ tags -├─ .github -│ └─ workflows -│ └─ codeql.yml -├─ .gitignore -├─ .husky -│ ├─ pre-commit -│ └─ _ -│ ├─ .gitignore -│ └─ husky.sh -├─ client -│ ├─ .eslintrc.cjs -│ ├─ .gitignore -│ ├─ .vite -│ ├─ index.html -│ ├─ package.json -│ ├─ public -│ │ ├─ image -│ │ │ └─ icon.svg -│ │ └─ robots.txt -│ ├─ README.md -│ ├─ src -│ │ ├─ api -│ │ │ └─ open-ai-api.ts -│ │ ├─ App.tsx -│ │ ├─ assets -│ │ ├─ components -│ │ │ ├─ CustomMarkdown.tsx -│ │ │ ├─ ErrorFallback.tsx -│ │ │ ├─ Footer.tsx -│ │ │ ├─ generate -│ │ │ │ ├─ BudgetFilter.tsx -│ │ │ │ ├─ CategoryFilter.tsx -│ │ │ │ ├─ DifficultyFilter.tsx -│ │ │ │ ├─ index.ts -│ │ │ │ ├─ LoadingComponent.tsx -│ │ │ │ ├─ MaterialInput.tsx -│ │ │ │ ├─ MilestoneItems.tsx -│ │ │ │ ├─ ProjectTabs.tsx -│ │ │ │ ├─ PurposeFilter.tsx -│ │ │ │ ├─ SafetyCheck.tsx -│ │ │ │ ├─ TimeAvailabilityFilter.tsx -│ │ │ │ └─ ToolsAvailableInput.tsx -│ │ │ ├─ MetaTag.tsx -│ │ │ ├─ Navbar.tsx -│ │ │ └─ project-details -│ │ │ ├─ index.ts -│ │ │ ├─ ProjectImage.tsx -│ │ │ ├─ ProjectInfo.tsx -│ │ │ ├─ ProjectSteps.tsx -│ │ │ └─ ShareModal.tsx -│ │ ├─ constants -│ │ │ └─ index.ts -│ │ ├─ hooks -│ │ │ └─ useInterval.ts -│ │ ├─ main.tsx -│ │ ├─ pages -│ │ │ ├─ FAQ.tsx -│ │ │ ├─ Home.tsx -│ │ │ ├─ HowToGuideDetail.tsx -│ │ │ ├─ HowToGuideList.tsx -│ │ │ ├─ ProjectDetail.tsx -│ │ │ └─ ProjectDetailById.tsx -│ │ ├─ styles -│ │ │ ├─ App.css -│ │ │ └─ index.css -│ │ ├─ types -│ │ │ └─ index.ts -│ │ ├─ utils -│ │ │ └─ index.ts -│ │ └─ vite-env.d.ts -│ ├─ tsconfig.json -│ ├─ tsconfig.node.json -│ └─ vite.config.ts -├─ package.json -├─ README.md -└─ server - ├─ .eslintrc.json - ├─ .gitignore - ├─ jest.config.ts - ├─ nodemon.json - ├─ package.json - ├─ prisma - │ ├─ migrations - │ │ ├─ 20230918064719_init - │ │ │ └─ migration.sql - │ │ ├─ 20230918070252_init - │ │ │ └─ migration.sql - │ │ ├─ 20230918070427_init - │ │ │ └─ migration.sql - │ │ └─ migration_lock.toml - │ ├─ schema.prisma - │ └─ seed.ts - ├─ README.md - ├─ src - │ ├─ controllers - │ │ ├─ guide.controller.ts - │ │ ├─ openai.controller.ts - │ │ ├─ share.controller.ts - │ │ └─ unsplash.controller.ts - │ ├─ index.ts - │ ├─ middleware - │ │ ├─ cache-response.ts - │ │ ├─ error-handler.ts - │ │ ├─ request-limit.ts - │ │ └─ schema-validation.ts - │ ├─ routes - │ │ ├─ guide.routes.ts - │ │ ├─ index.routes.ts - │ │ ├─ openai.routes.ts - │ │ ├─ share.routes.ts - │ │ └─ unsplash.routes.ts - │ ├─ server.ts - │ ├─ utils - │ │ ├─ index.ts - │ │ └─ response-template.ts - │ └─ validators - │ ├─ explain.ts - │ ├─ idea.ts - │ ├─ image-search.ts - │ └─ share-link.ts - └─ tsconfig.json - -``` \ No newline at end of file diff --git a/client/src/api/backend-api.ts b/client/src/api/backend-api.ts new file mode 100644 index 0000000..d33f447 --- /dev/null +++ b/client/src/api/backend-api.ts @@ -0,0 +1,57 @@ +import { ProjectLocationState, RelatedImages } from "../types"; + +const API_URL = process.env.NODE_ENV === "development" ? "http://localhost:3000/api" : import.meta.env.VITE_OPEN_AI_API_URL; + +const fetchApi = async (endpoint: string, method: string = "GET", body?: object) => { + const options = { + method, + headers: { + "Content-Type": "application/json", + }, + body: body ? JSON.stringify(body) : undefined, + }; + + const response = await fetch(`${API_URL}${endpoint}`, options); + + if (!response.ok) { + throw new Error("Network response was not ok"); + } + + return await response.json(); +}; + +export const generateProjectIdeas = async (materials: string[], onlySpecified: boolean, difficulty: string, category: string, tools: string[], time: number, budget: number, endPurpose: string) => { + return fetchApi("/v1/generate/idea", "POST", { materials, onlySpecified, difficulty, category, tools, time, budget, endPurpose }); +}; + +export const generateProjectExplanations = async (title: string, materials: string[], tools: string[], time: string, budget: string, description: string) => { + return fetchApi("/v1/generate/explain", "POST", { title, materials, tools, time, budget, description }); +}; + +export const searchImages = async (query: string) => { + return fetchApi(`/v1/image/search?query=${encodeURIComponent(query)}`); +}; + +export const getGuideByPath = async (path: string) => { + return fetchApi(`/v1/guide/${path}`); +}; + +export const getAllGuides = async () => { + return fetchApi("/v1/guide"); +}; + +export const saveShareLinkData = async (projectDetails: ProjectLocationState | null, projectImage: RelatedImages | null, explanation: string | null) => { + return fetchApi("/v1/share", "POST", { projectDetails, projectImage, explanation }); +}; + +export const getShareLinkData = async (id: string) => { + return fetchApi(`/v1/share/${id}`); +}; + +export const getTotalCountOfGeneratedIdea = async () => { + return fetchApi("/v1/counter"); +}; + +export const incrementCounterOfGeneratedIdea = async () => { + return fetchApi("/v1/counter", "POST"); +}; diff --git a/client/src/api/open-ai-api.ts b/client/src/api/open-ai-api.ts deleted file mode 100644 index fbabcac..0000000 --- a/client/src/api/open-ai-api.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { ProjectLocationState, RelatedImages } from "../types"; - -const API_URL = process.env.NODE_ENV === "development" ? "http://localhost:3000/api" : import.meta.env.VITE_OPEN_AI_API_URL; - -export const generateProjectIdeas = async (materials: string[], onlySpecified: boolean, difficulty: string, category: string, tools: string[], time: number, budget: number, endPurpose: string) => { - const requestBody = { - materials, - onlySpecified, - difficulty, - category, - tools, - time, - budget, - endPurpose, - }; - - const response = await fetch(API_URL + "/v1/generate/idea", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(requestBody), - }); - - if (!response.ok) { - throw new Error("Network response was not ok"); - } - - const data = await response.json(); - return data; -}; - -export const generateProjectExplanations = async (title: string, materials: string[], tools: string[], time: string, budget: string, description: string) => { - const requestBody = { - title, - materials, - tools, - time, - budget, - description, - }; - - const response = await fetch(API_URL + "/v1/generate/explain", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(requestBody), - }); - - if (!response.ok) { - throw new Error("Network response was not ok"); - } - - const data = await response.json(); - return data; -}; - -export const searchImages = async (query: string) => { - const endpoint = `${API_URL}/v1/image/search?query=${encodeURIComponent(query)}`; - - const response = await fetch(endpoint, { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }); - - if (!response.ok) { - throw new Error("Network response was not ok"); - } - - const data = await response.json(); - return data; -}; - -export const getGuideByPath = async (path: string) => { - const endpoint = `${API_URL}/v1/guide/${path}`; - - const response = await fetch(endpoint, { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }); - - if (!response.ok) { - throw new Error("Network response was not ok"); - } - - const data = await response.json(); - return data; -}; - -export const getAllGuides = async () => { - const response = await fetch(API_URL + "/v1/guide", { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }); - - if (!response.ok) { - throw new Error("Network response was not ok"); - } - - const data = await response.json(); - return data; -}; - -export const saveShareLinkData = async (projectDetails: ProjectLocationState | null, projectImage: RelatedImages | null, explanation: string | null) => { - const requestBody = { - projectDetails, - projectImage, - explanation, - }; - - const response = await fetch(API_URL + "/v1/share", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(requestBody), - }); - - if (!response.ok) { - throw new Error("Network response was not ok"); - } - - const data = await response.json(); - return data; -}; - -export const getShareLinkData = async (id: string) => { - const endpoint = `${API_URL}/v1/share/${id}`; - const response = await fetch(endpoint, { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }); - - if (!response.ok) { - throw new Error("Network response was not ok"); - } - - const data = await response.json(); - return data; -}; diff --git a/client/src/pages/Home.tsx b/client/src/pages/Home.tsx index 3424a64..848b2cc 100644 --- a/client/src/pages/Home.tsx +++ b/client/src/pages/Home.tsx @@ -21,10 +21,11 @@ import { Icon, useBreakpointValue, Container, + useSafeLayoutEffect, } from "@chakra-ui/react"; import { FaRegLightbulb, FaInfoCircle } from "react-icons/fa"; -import { generateProjectIdeas } from "../api/open-ai-api"; +import { generateProjectIdeas, getTotalCountOfGeneratedIdea, incrementCounterOfGeneratedIdea } from "../api/backend-api"; import { categories, steps } from "../constants"; import { BudgetFilter, @@ -59,6 +60,8 @@ const Home = () => { const [projects, setProjects] = useState([]); + const [totalCount, setTotalCount] = useState(0); + const orientation: Orientation | undefined = useBreakpointValue({ base: "vertical", md: "horizontal", @@ -66,6 +69,29 @@ const Home = () => { const toast = useToast(); + const fetchTotalCount = async () => { + try { + const response = await getTotalCountOfGeneratedIdea(); + if (response?.data?.totalCount) { + setTotalCount(response.data.totalCount); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + toast({ + title: "An error occurred.", + description: error.message, + status: "error", + duration: 5000, + isClosable: true, + position: "top-right", + }); + } + }; + + useSafeLayoutEffect(() => { + fetchTotalCount(); + }, []); + const handleSubmit = useCallback(async () => { try { if (!safetyConfirmed) throw new Error("Please check the safety checkbox"); @@ -78,6 +104,9 @@ const Home = () => { setProjects(response.data.ideas); goToNext(); + + await incrementCounterOfGeneratedIdea(); + setTotalCount((count) => count + 1); } // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { @@ -135,6 +164,14 @@ const Home = () => { + {totalCount} + {totalCount !== null && ( + + + 🎉 Total generated ideas so far: {totalCount} 🎉 + + + )} {steps.map((step, index) => ( diff --git a/client/src/pages/HowToGuideDetail.tsx b/client/src/pages/HowToGuideDetail.tsx index 7d0d7fd..38935cc 100644 --- a/client/src/pages/HowToGuideDetail.tsx +++ b/client/src/pages/HowToGuideDetail.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from "react"; import { Box, Container, Heading, useToast } from "@chakra-ui/react"; import CustomMarkdown from "../components/CustomMarkdown"; import { useParams, useNavigate } from "react-router-dom"; -import { getGuideByPath } from "../api/open-ai-api"; +import { getGuideByPath } from "../api/backend-api"; import { HowToGuide } from "../types"; import { trimLeadingWhitespace } from "../utils"; import MetaTag from "../components/MetaTag"; diff --git a/client/src/pages/HowToGuideList.tsx b/client/src/pages/HowToGuideList.tsx index 3fee4be..da98206 100644 --- a/client/src/pages/HowToGuideList.tsx +++ b/client/src/pages/HowToGuideList.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from "react"; import { Box, Container, Heading, Text, LinkBox, LinkOverlay, VStack, useToast } from "@chakra-ui/react"; import { Link as RouterLink } from "react-router-dom"; -import { getAllGuides } from "../api/open-ai-api"; +import { getAllGuides } from "../api/backend-api"; import MetaTag from "../components/MetaTag"; type Guide = { diff --git a/client/src/pages/ProjectDetail.tsx b/client/src/pages/ProjectDetail.tsx index 25bc8af..9d1b821 100644 --- a/client/src/pages/ProjectDetail.tsx +++ b/client/src/pages/ProjectDetail.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from "react"; import { Container, SimpleGrid, Divider, useToast, useDisclosure, Box, Button, Text } from "@chakra-ui/react"; import { useLocation, useNavigate } from "react-router-dom"; -import { generateProjectExplanations, saveShareLinkData, searchImages } from "../api/open-ai-api"; +import { generateProjectExplanations, saveShareLinkData, searchImages } from "../api/backend-api"; import { ProjectImage, ProjectInfo, ProjectSteps, ShareModal } from "../components/project-details"; import { RelatedImages, ProjectLocationState } from "../types"; diff --git a/client/src/pages/ProjectDetailById.tsx b/client/src/pages/ProjectDetailById.tsx index 9d0c838..dc3a1b8 100644 --- a/client/src/pages/ProjectDetailById.tsx +++ b/client/src/pages/ProjectDetailById.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from "react"; import { Container, SimpleGrid, Divider, useToast, useDisclosure, Box, Button, Text } from "@chakra-ui/react"; import { useParams, useNavigate } from "react-router-dom"; -import { getShareLinkData } from "../api/open-ai-api"; +import { getShareLinkData } from "../api/backend-api"; import { ProjectImage, ProjectInfo, ProjectSteps, ShareModal } from "../components/project-details"; import { RelatedImages, ProjectLocationState } from "../types"; diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index 2b0d57c..558b140 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -32,3 +32,10 @@ model ProjectShareLink { projectImage Json explanation String? } + +model IdeaGenerationCounter { + id Int @id @default(autoincrement()) + count Int @default(0) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} diff --git a/server/src/controllers/counter.controller.ts b/server/src/controllers/counter.controller.ts new file mode 100644 index 0000000..e07da20 --- /dev/null +++ b/server/src/controllers/counter.controller.ts @@ -0,0 +1,61 @@ +import { Request, Response, NextFunction } from "express"; +import { sendSuccess } from "../utils/response-template"; +import { PrismaClient } from "@prisma/client"; +import { getStartOfDay } from "../utils"; + +export const getTotalCountOfGeneratedIdea = async (req: Request, res: Response, next: NextFunction) => { + try { + const prisma = req.app.get("prisma") as PrismaClient; + + const totalCount = await prisma.ideaGenerationCounter.aggregate({ + _sum: { + count: true, + }, + }); + + return sendSuccess(res, { totalCount: totalCount._sum.count ?? 0 }); + } catch (error) { + next(error); + } +}; + +export const incrementCounterOfGeneratedIdea = async (req: Request, res: Response, next: NextFunction) => { + try { + const prisma = req.app.get("prisma") as PrismaClient; + + const today = getStartOfDay(new Date()); + + const counter = await prisma.ideaGenerationCounter.findFirst({ + where: { + createdAt: { + gte: today, + lt: new Date(today.getTime() + 24 * 60 * 60 * 1000), + }, + }, + }); + + if (counter) { + await prisma.ideaGenerationCounter.update({ + where: { + id: counter.id, + }, + data: { + count: { + increment: 1, + }, + }, + }); + } else { + await prisma.ideaGenerationCounter.create({ + data: { + count: 1, + createdAt: today, + }, + }); + } + + return sendSuccess(res, {}, 201); + } catch (error) { + next(error); + } +}; diff --git a/server/src/controllers/share.controller.ts b/server/src/controllers/share.controller.ts index bc5d2cc..2d36b8e 100644 --- a/server/src/controllers/share.controller.ts +++ b/server/src/controllers/share.controller.ts @@ -44,7 +44,7 @@ export const saveProject = async (req: Request, res: Response, next: NextFunctio return; } - return sendSuccess(res, { id: savedProject.id }); + return sendSuccess(res, { id: savedProject.id }, 201); } catch (error) { next(error); } diff --git a/server/src/routes/counter.routes.ts b/server/src/routes/counter.routes.ts new file mode 100644 index 0000000..640e50c --- /dev/null +++ b/server/src/routes/counter.routes.ts @@ -0,0 +1,9 @@ +import express from "express"; +import { getTotalCountOfGeneratedIdea, incrementCounterOfGeneratedIdea } from "../controllers/counter.controller"; + +const router = express.Router(); + +router.get("", getTotalCountOfGeneratedIdea); +router.post("", incrementCounterOfGeneratedIdea); + +export default router; diff --git a/server/src/routes/index.routes.ts b/server/src/routes/index.routes.ts index 879a699..74abef4 100644 --- a/server/src/routes/index.routes.ts +++ b/server/src/routes/index.routes.ts @@ -3,6 +3,7 @@ import openaiRoutes from "./openai.routes"; import unsplashRoutes from "./unsplash.routes"; import guideRoutes from "./guide.routes"; import shareRoutes from "./share.routes"; +import counterRoutes from "./counter.routes"; const router = express.Router(); @@ -10,5 +11,6 @@ router.use("/generate", openaiRoutes); router.use("/image", unsplashRoutes); router.use("/guide", guideRoutes); router.use("/share", shareRoutes); +router.use("/counter", counterRoutes); -export { openaiRoutes, unsplashRoutes, guideRoutes, shareRoutes }; +export { openaiRoutes, unsplashRoutes, guideRoutes, shareRoutes, counterRoutes }; diff --git a/server/src/server.ts b/server/src/server.ts index cec6bf3..7370bcd 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -7,7 +7,7 @@ import { createApi } from "unsplash-js"; import * as nodeFetch from "node-fetch"; import { PrismaClient } from "@prisma/client"; -import { guideRoutes, unsplashRoutes, openaiRoutes, shareRoutes } from "./routes/index.routes"; +import { guideRoutes, unsplashRoutes, openaiRoutes, shareRoutes, counterRoutes } from "./routes/index.routes"; import { sendError } from "./utils/response-template"; import errorHandlerMiddleware from "./middleware/error-handler"; import limiter from "./middleware/request-limit"; @@ -63,6 +63,8 @@ app.use("/api/v1/share", oneDayCacheMiddleware, shareRoutes); const openaiCacheMiddleware = getConditionalCache("2 hours"); app.use("/api/v1/generate", openaiCacheMiddleware, openaiRoutes); +app.use("/api/v1/counter", counterRoutes); + app.get("*", (_, res: Response) => { sendError(res, "API Path Not Found", 404); }); diff --git a/server/src/utils/index.ts b/server/src/utils/index.ts index 520d091..c5f9b08 100644 --- a/server/src/utils/index.ts +++ b/server/src/utils/index.ts @@ -13,3 +13,9 @@ export const customEscape = (str: string): string => { export const escapeArrayStrings = (value: string[]): string[] => { return value.map((v) => (typeof v === "string" ? customEscape(v.trim()) : v)); }; + +export const getStartOfDay = (date: Date) => { + const startOfDay = new Date(date); + startOfDay.setHours(0, 0, 0, 0); + return startOfDay; +};