diff --git a/.gitattributes b/.gitattributes
index 3dc380e..1890acc 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -3,3 +3,5 @@
**/*.jpeg filter=lfs diff=lfs merge=lfs -text
**/*.gif filter=lfs diff=lfs merge=lfs -text
**/*.pdf filter=lfs diff=lfs merge=lfs -text
+**/*.mp4 filter=lfs diff=lfs merge=lfs -text
+**/*.mov filter=lfs diff=lfs merge=lfs -text
diff --git a/animation/all_or_nothing/videos/travolta.mp4 b/animation/all_or_nothing/videos/travolta.mp4
index eb01911..9d6b4ee 100644
Binary files a/animation/all_or_nothing/videos/travolta.mp4 and b/animation/all_or_nothing/videos/travolta.mp4 differ
diff --git a/animation/memory_and_smart_pointers/.gitignore b/animation/memory_and_smart_pointers/.gitignore
new file mode 100644
index 0000000..829b1c7
--- /dev/null
+++ b/animation/memory_and_smart_pointers/.gitignore
@@ -0,0 +1,15 @@
+# Generated files
+node_modules
+output
+dist
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/animation/memory_and_smart_pointers/package-lock.json b/animation/memory_and_smart_pointers/package-lock.json
new file mode 100644
index 0000000..dad2ff3
--- /dev/null
+++ b/animation/memory_and_smart_pointers/package-lock.json
@@ -0,0 +1,1366 @@
+{
+ "name": "value_semantics",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "value_semantics",
+ "version": "0.0.0",
+ "dependencies": {
+ "@lezer/cpp": "^1.1.2",
+ "@motion-canvas/2d": "^3.16.0",
+ "@motion-canvas/core": "^3.16.0",
+ "@motion-canvas/ffmpeg": "^1.1.1"
+ },
+ "devDependencies": {
+ "@motion-canvas/ui": "^3.16.0",
+ "@motion-canvas/vite-plugin": "^3.15.1",
+ "typescript": "^5.2.2",
+ "vite": "^4.0.0"
+ }
+ },
+ "node_modules/@codemirror/language": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.2.tgz",
+ "integrity": "sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.23.0",
+ "@lezer/common": "^1.1.0",
+ "@lezer/highlight": "^1.0.0",
+ "@lezer/lr": "^1.0.0",
+ "style-mod": "^4.0.0"
+ }
+ },
+ "node_modules/@codemirror/state": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz",
+ "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A=="
+ },
+ "node_modules/@codemirror/view": {
+ "version": "6.32.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.32.0.tgz",
+ "integrity": "sha512-AgVNvED2QTsZp5e3syoHLsrWtwJFYWdx1Vr/m3f4h1ATQz0ax60CfXF3Htdmk69k2MlYZw8gXesnQdHtzyVmAw==",
+ "dependencies": {
+ "@codemirror/state": "^6.4.0",
+ "style-mod": "^4.1.0",
+ "w3c-keyname": "^2.2.4"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
+ "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
+ "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
+ "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
+ "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
+ "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
+ "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
+ "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
+ "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
+ "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
+ "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
+ "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+ "cpu": [
+ "loong64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
+ "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
+ "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
+ "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
+ "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
+ "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
+ "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
+ "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
+ "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
+ "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@ffmpeg-installer/darwin-arm64": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-arm64/-/darwin-arm64-4.1.5.tgz",
+ "integrity": "sha512-hYqTiP63mXz7wSQfuqfFwfLOfwwFChUedeCVKkBtl/cliaTM7/ePI9bVzfZ2c+dWu3TqCwLDRWNSJ5pqZl8otA==",
+ "cpu": [
+ "arm64"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@ffmpeg-installer/darwin-x64": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-x64/-/darwin-x64-4.1.0.tgz",
+ "integrity": "sha512-Z4EyG3cIFjdhlY8wI9aLUXuH8nVt7E9SlMVZtWvSPnm2sm37/yC2CwjUzyCQbJbySnef1tQwGG2Sx+uWhd9IAw==",
+ "cpu": [
+ "x64"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@ffmpeg-installer/ffmpeg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@ffmpeg-installer/ffmpeg/-/ffmpeg-1.1.0.tgz",
+ "integrity": "sha512-Uq4rmwkdGxIa9A6Bd/VqqYbT7zqh1GrT5/rFwCwKM70b42W5gIjWeVETq6SdcL0zXqDtY081Ws/iJWhr1+xvQg==",
+ "optionalDependencies": {
+ "@ffmpeg-installer/darwin-arm64": "4.1.5",
+ "@ffmpeg-installer/darwin-x64": "4.1.0",
+ "@ffmpeg-installer/linux-arm": "4.1.3",
+ "@ffmpeg-installer/linux-arm64": "4.1.4",
+ "@ffmpeg-installer/linux-ia32": "4.1.0",
+ "@ffmpeg-installer/linux-x64": "4.1.0",
+ "@ffmpeg-installer/win32-ia32": "4.1.0",
+ "@ffmpeg-installer/win32-x64": "4.1.0"
+ }
+ },
+ "node_modules/@ffmpeg-installer/linux-arm": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm/-/linux-arm-4.1.3.tgz",
+ "integrity": "sha512-NDf5V6l8AfzZ8WzUGZ5mV8O/xMzRag2ETR6+TlGIsMHp81agx51cqpPItXPib/nAZYmo55Bl2L6/WOMI3A5YRg==",
+ "cpu": [
+ "arm"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@ffmpeg-installer/linux-arm64": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm64/-/linux-arm64-4.1.4.tgz",
+ "integrity": "sha512-dljEqAOD0oIM6O6DxBW9US/FkvqvQwgJ2lGHOwHDDwu/pX8+V0YsDL1xqHbj1DMX/+nP9rxw7G7gcUvGspSoKg==",
+ "cpu": [
+ "arm64"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@ffmpeg-installer/linux-ia32": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-ia32/-/linux-ia32-4.1.0.tgz",
+ "integrity": "sha512-0LWyFQnPf+Ij9GQGD034hS6A90URNu9HCtQ5cTqo5MxOEc7Rd8gLXrJvn++UmxhU0J5RyRE9KRYstdCVUjkNOQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@ffmpeg-installer/linux-x64": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-x64/-/linux-x64-4.1.0.tgz",
+ "integrity": "sha512-Y5BWhGLU/WpQjOArNIgXD3z5mxxdV8c41C+U15nsE5yF8tVcdCGet5zPs5Zy3Ta6bU7haGpIzryutqCGQA/W8A==",
+ "cpu": [
+ "x64"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@ffmpeg-installer/win32-ia32": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-ia32/-/win32-ia32-4.1.0.tgz",
+ "integrity": "sha512-FV2D7RlaZv/lrtdhaQ4oETwoFUsUjlUiasiZLDxhEUPdNDWcH1OU9K1xTvqz+OXLdsmYelUDuBS/zkMOTtlUAw==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@ffmpeg-installer/win32-x64": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-x64/-/win32-x64-4.1.0.tgz",
+ "integrity": "sha512-Drt5u2vzDnIONf4ZEkKtFlbvwj6rI3kxw1Ck9fpudmtgaZIHD4ucsWB2lCZBXRxJgXR+2IMSti+4rtM4C4rXgg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@ffprobe-installer/darwin-arm64": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@ffprobe-installer/darwin-arm64/-/darwin-arm64-5.0.1.tgz",
+ "integrity": "sha512-vwNCNjokH8hfkbl6m95zICHwkSzhEvDC3GVBcUp5HX8+4wsX10SP3B+bGur7XUzTIZ4cQpgJmEIAx6TUwRepMg==",
+ "cpu": [
+ "arm64"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@ffprobe-installer/darwin-x64": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@ffprobe-installer/darwin-x64/-/darwin-x64-5.1.0.tgz",
+ "integrity": "sha512-J+YGscZMpQclFg31O4cfVRGmDpkVsQ2fZujoUdMAAYcP0NtqpC49Hs3SWJpBdsGB4VeqOt5TTm1vSZQzs1NkhA==",
+ "cpu": [
+ "x64"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@ffprobe-installer/ffprobe": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@ffprobe-installer/ffprobe/-/ffprobe-2.1.2.tgz",
+ "integrity": "sha512-ZNvwk4f2magF42Zji2Ese16SMj9BS7Fui4kRjg6gTYTxY3gWZNpg85n4MIfQyI9nimHg4x/gT6FVkp/bBDuBwg==",
+ "engines": {
+ "node": ">=14.21.2"
+ },
+ "optionalDependencies": {
+ "@ffprobe-installer/darwin-arm64": "5.0.1",
+ "@ffprobe-installer/darwin-x64": "5.1.0",
+ "@ffprobe-installer/linux-arm": "5.2.0",
+ "@ffprobe-installer/linux-arm64": "5.2.0",
+ "@ffprobe-installer/linux-ia32": "5.2.0",
+ "@ffprobe-installer/linux-x64": "5.2.0",
+ "@ffprobe-installer/win32-ia32": "5.1.0",
+ "@ffprobe-installer/win32-x64": "5.1.0"
+ }
+ },
+ "node_modules/@ffprobe-installer/linux-arm": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-arm/-/linux-arm-5.2.0.tgz",
+ "integrity": "sha512-PF5HqEhCY7WTWHtLDYbA/+rLS+rhslWvyBlAG1Fk8VzVlnRdl93o6hy7DE2kJgxWQbFaR3ZktPQGEzfkrmQHvQ==",
+ "cpu": [
+ "arm"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@ffprobe-installer/linux-arm64": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-arm64/-/linux-arm64-5.2.0.tgz",
+ "integrity": "sha512-X1VvWtlLs6ScP73biVLuHD5ohKJKsMTa0vafCESOen4mOoNeLAYbxOVxDWAdFz9cpZgRiloFj5QD6nDj8E28yQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@ffprobe-installer/linux-ia32": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-ia32/-/linux-ia32-5.2.0.tgz",
+ "integrity": "sha512-TFVK5sasXyXhbIG7LtPRDmtkrkOsInwKcL43iEvEw+D9vCS2rc//mn9/0Q+BR0UoJEiMK4+ApYr/3LLVUBPOCQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@ffprobe-installer/linux-x64": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-x64/-/linux-x64-5.2.0.tgz",
+ "integrity": "sha512-D3UeqTLYPNs7pBWPLUYGehPdRVqU8eACox4OZy3pZUZatxye2YKlvBwEfaLdL1v2Z4FOAlLUhms0kY8m8kqSRA==",
+ "cpu": [
+ "x64"
+ ],
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@ffprobe-installer/win32-ia32": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@ffprobe-installer/win32-ia32/-/win32-ia32-5.1.0.tgz",
+ "integrity": "sha512-5O3vOoNRxmut0/Nu9vSazTdSHasrr+zPT2B3Hm7kjmO3QVFcIfVImS6ReQnZeSy8JPJOqXts5kX5x/3KOX54XQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@ffprobe-installer/win32-x64": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@ffprobe-installer/win32-x64/-/win32-x64-5.1.0.tgz",
+ "integrity": "sha512-jMGYeAgkrdn4e2vvYt/qakgHRE3CPju4bn5TmdPfoAm1BlX1mY9cyMd8gf5vSzI8gH8Zq5WQAyAkmekX/8TSTg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@lezer/common": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz",
+ "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ=="
+ },
+ "node_modules/@lezer/cpp": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@lezer/cpp/-/cpp-1.1.2.tgz",
+ "integrity": "sha512-macwKtyeUO0EW86r3xWQCzOV9/CF8imJLpJlPv3sDY57cPGeUZ8gXWOWNlJr52TVByMV3PayFQCA5SHEERDmVQ==",
+ "dependencies": {
+ "@lezer/common": "^1.2.0",
+ "@lezer/highlight": "^1.0.0",
+ "@lezer/lr": "^1.0.0"
+ }
+ },
+ "node_modules/@lezer/highlight": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz",
+ "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==",
+ "dependencies": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@lezer/lr": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz",
+ "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==",
+ "dependencies": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@motion-canvas/2d": {
+ "version": "3.16.0",
+ "resolved": "https://registry.npmjs.org/@motion-canvas/2d/-/2d-3.16.0.tgz",
+ "integrity": "sha512-8vyCSNE9ZCkGB4Wz8yS48h0xQ79mbmbCkhpxu4ARBrFtSVLqgo/6kz2yifJi4wPK4pCDFw5knABjukOKtMaPMQ==",
+ "dependencies": {
+ "@codemirror/language": "^6.10.1",
+ "@lezer/common": "^1.2.1",
+ "@lezer/highlight": "^1.2.0",
+ "@motion-canvas/core": "^3.16.0",
+ "code-fns": "^0.8.2",
+ "mathjax-full": "^3.2.2",
+ "parse-svg-path": "^0.1.2"
+ }
+ },
+ "node_modules/@motion-canvas/core": {
+ "version": "3.16.0",
+ "resolved": "https://registry.npmjs.org/@motion-canvas/core/-/core-3.16.0.tgz",
+ "integrity": "sha512-egOrQjVOHWf+HMFH+AOLLSV/djf+YGGPxbz0Jbnva3C3VTH2l6MMKTdoYyGRI3w02gJO1pIo7bcePq3erlxulw==",
+ "dependencies": {
+ "@types/chroma-js": "^2.1.4",
+ "chroma-js": "^2.4.2"
+ }
+ },
+ "node_modules/@motion-canvas/ffmpeg": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@motion-canvas/ffmpeg/-/ffmpeg-1.1.1.tgz",
+ "integrity": "sha512-w2d7oFfR3hYHXeYtFGoHp6goY+vVL0LoZ2h1b/veTH5KvE7jrLp2Kl/XPHsYJ5ZDRHUT0Nhl05DBLdXYqdSqgg==",
+ "dependencies": {
+ "@ffmpeg-installer/ffmpeg": "^1.1.0",
+ "@ffprobe-installer/ffprobe": "^2.0.0",
+ "fluent-ffmpeg": "^2.1.2"
+ },
+ "peerDependencies": {
+ "@motion-canvas/core": "^3.7.0",
+ "@motion-canvas/vite-plugin": "^3.7.0",
+ "vite": "4.x"
+ }
+ },
+ "node_modules/@motion-canvas/ui": {
+ "version": "3.16.0",
+ "resolved": "https://registry.npmjs.org/@motion-canvas/ui/-/ui-3.16.0.tgz",
+ "integrity": "sha512-PJZnbkiJKED4nNDnN649zojfPMVRTvFOqxUExi6TdrckiLFsTJFy+dYbyMML223ekDrkmHuQU35tcs3svwfYrw==",
+ "dev": true,
+ "dependencies": {
+ "@motion-canvas/core": "^3.16.0",
+ "@preact/signals": "^1.2.1",
+ "preact": "^10.19.2"
+ }
+ },
+ "node_modules/@motion-canvas/vite-plugin": {
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/@motion-canvas/vite-plugin/-/vite-plugin-3.15.1.tgz",
+ "integrity": "sha512-yeRMJQxTcYVZGVMnNXQPm0SySQzJXnaRrggGJ2bnDHMsqxCRJt/RfIioK0LMvBaUB+UWlPsJUTMltHuq+J64JA==",
+ "dependencies": {
+ "fast-glob": "^3.3.1",
+ "follow-redirects": "^1.15.2",
+ "mime-types": "^2.1.35",
+ "source-map": "^0.6.1"
+ },
+ "peerDependencies": {
+ "vite": "4.x || 5.x"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@preact/signals": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@preact/signals/-/signals-1.3.0.tgz",
+ "integrity": "sha512-EOMeg42SlLS72dhoq6Vjq08havnLseWmPQ8A0YsgIAqMgWgx7V1a39+Pxo6i7SY5NwJtH4849JogFq3M67AzWg==",
+ "dev": true,
+ "dependencies": {
+ "@preact/signals-core": "^1.7.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ },
+ "peerDependencies": {
+ "preact": "10.x"
+ }
+ },
+ "node_modules/@preact/signals-core": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.8.0.tgz",
+ "integrity": "sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==",
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
+ "node_modules/@types/chroma-js": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.4.0.tgz",
+ "integrity": "sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw=="
+ },
+ "node_modules/@types/hast": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz",
+ "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
+ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="
+ },
+ "node_modules/@wooorm/starry-night": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@wooorm/starry-night/-/starry-night-1.7.0.tgz",
+ "integrity": "sha512-ktO0nkddrovIoNW2jAUT+Cdd9n1bWjy1Ir4CdcmgTaT6E94HLlQfu7Yv62falclBEwvsuVp3bSBw23wtta1fNw==",
+ "dependencies": {
+ "@types/hast": "^2.0.0",
+ "import-meta-resolve": "^2.0.0",
+ "vscode-oniguruma": "^1.0.0",
+ "vscode-textmate": "^9.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ=="
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chroma-js": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz",
+ "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
+ },
+ "node_modules/code-fns": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/code-fns/-/code-fns-0.8.2.tgz",
+ "integrity": "sha512-3VVeq3cnWxWiWKFLsVo+XWsOXBSW2gAx2uv0ViETLNmNuygEPHlCeDAv/Zy7xXqPgXtgLZyvIJZmx+ojTgOIGA==",
+ "dependencies": {
+ "@wooorm/starry-night": "^1.2.0"
+ }
+ },
+ "node_modules/commander": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz",
+ "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==",
+ "engines": {
+ "node": "^12.20.0 || >=14"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
+ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.18.20",
+ "@esbuild/android-arm64": "0.18.20",
+ "@esbuild/android-x64": "0.18.20",
+ "@esbuild/darwin-arm64": "0.18.20",
+ "@esbuild/darwin-x64": "0.18.20",
+ "@esbuild/freebsd-arm64": "0.18.20",
+ "@esbuild/freebsd-x64": "0.18.20",
+ "@esbuild/linux-arm": "0.18.20",
+ "@esbuild/linux-arm64": "0.18.20",
+ "@esbuild/linux-ia32": "0.18.20",
+ "@esbuild/linux-loong64": "0.18.20",
+ "@esbuild/linux-mips64el": "0.18.20",
+ "@esbuild/linux-ppc64": "0.18.20",
+ "@esbuild/linux-riscv64": "0.18.20",
+ "@esbuild/linux-s390x": "0.18.20",
+ "@esbuild/linux-x64": "0.18.20",
+ "@esbuild/netbsd-x64": "0.18.20",
+ "@esbuild/openbsd-x64": "0.18.20",
+ "@esbuild/sunos-x64": "0.18.20",
+ "@esbuild/win32-arm64": "0.18.20",
+ "@esbuild/win32-ia32": "0.18.20",
+ "@esbuild/win32-x64": "0.18.20"
+ }
+ },
+ "node_modules/esm": {
+ "version": "3.2.25",
+ "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fluent-ffmpeg": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz",
+ "integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==",
+ "dependencies": {
+ "async": "^0.2.9",
+ "which": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/import-meta-resolve": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz",
+ "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "node_modules/mathjax-full": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz",
+ "integrity": "sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==",
+ "dependencies": {
+ "esm": "^3.2.25",
+ "mhchemparser": "^4.1.0",
+ "mj-context-menu": "^0.6.1",
+ "speech-rule-engine": "^4.0.6"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/mhchemparser": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.1.1.tgz",
+ "integrity": "sha512-R75CUN6O6e1t8bgailrF1qPq+HhVeFTM3XQ0uzI+mXTybmphy3b6h4NbLOYhemViQ3lUs+6CKRkC3Ws1TlYREA=="
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mj-context-menu": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz",
+ "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA=="
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/parse-svg-path": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz",
+ "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ=="
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/preact": {
+ "version": "10.23.2",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.23.2.tgz",
+ "integrity": "sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==",
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "3.29.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
+ "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/speech-rule-engine": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz",
+ "integrity": "sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==",
+ "dependencies": {
+ "commander": "9.2.0",
+ "wicked-good-xpath": "1.3.0",
+ "xmldom-sre": "0.1.31"
+ },
+ "bin": {
+ "sre": "bin/sre"
+ }
+ },
+ "node_modules/style-mod": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz",
+ "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw=="
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.5.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+ "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/vite": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz",
+ "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==",
+ "dependencies": {
+ "esbuild": "^0.18.10",
+ "postcss": "^8.4.27",
+ "rollup": "^3.27.1"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "@types/node": ">= 14",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vscode-oniguruma": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
+ "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA=="
+ },
+ "node_modules/vscode-textmate": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-9.0.0.tgz",
+ "integrity": "sha512-Cl65diFGxz7gpwbav10HqiY/eVYTO1sjQpmRmV991Bj7wAoOAjGQ97PpQcXorDE2Uc4hnGWLY17xme+5t6MlSg=="
+ },
+ "node_modules/w3c-keyname": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
+ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/wicked-good-xpath": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz",
+ "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw=="
+ },
+ "node_modules/xmldom-sre": {
+ "version": "0.1.31",
+ "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz",
+ "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==",
+ "engines": {
+ "node": ">=0.1"
+ }
+ }
+ }
+}
diff --git a/animation/memory_and_smart_pointers/package.json b/animation/memory_and_smart_pointers/package.json
new file mode 100644
index 0000000..9955e40
--- /dev/null
+++ b/animation/memory_and_smart_pointers/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "value_semantics",
+ "private": true,
+ "version": "0.0.0",
+ "scripts": {
+ "start": "vite",
+ "serve": "vite",
+ "build": "tsc && vite build"
+ },
+ "dependencies": {
+ "@lezer/cpp": "^1.1.2",
+ "@motion-canvas/2d": "^3.16.0",
+ "@motion-canvas/core": "^3.16.0",
+ "@motion-canvas/ffmpeg": "^1.1.1"
+ },
+ "devDependencies": {
+ "@motion-canvas/ui": "^3.16.0",
+ "@motion-canvas/vite-plugin": "^3.15.1",
+ "typescript": "^5.2.2",
+ "vite": "^4.0.0"
+ }
+}
diff --git a/animation/memory_and_smart_pointers/src/global.css b/animation/memory_and_smart_pointers/src/global.css
new file mode 100644
index 0000000..201f5ff
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/global.css
@@ -0,0 +1 @@
+@import url('https://fonts.googleapis.com/css2?family=Fira+Mono:wght@400;500;700&display=swap');
diff --git a/animation/memory_and_smart_pointers/src/motion-canvas.d.ts b/animation/memory_and_smart_pointers/src/motion-canvas.d.ts
new file mode 100644
index 0000000..067c6a4
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/motion-canvas.d.ts
@@ -0,0 +1 @@
+///
diff --git a/animation/memory_and_smart_pointers/src/project.meta b/animation/memory_and_smart_pointers/src/project.meta
new file mode 100644
index 0000000..68d1eac
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/project.meta
@@ -0,0 +1,31 @@
+{
+ "version": 0,
+ "shared": {
+ "background": "rgb(10,20,30)",
+ "range": [
+ 0,
+ null
+ ],
+ "size": {
+ "x": 1920,
+ "y": 1080
+ },
+ "audioOffset": 0
+ },
+ "preview": {
+ "fps": 30,
+ "resolutionScale": 1
+ },
+ "rendering": {
+ "fps": 30,
+ "resolutionScale": 2,
+ "colorSpace": "srgb",
+ "exporter": {
+ "name": "@motion-canvas/ffmpeg",
+ "options": {
+ "fastStart": false,
+ "includeAudio": true
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/animation/memory_and_smart_pointers/src/project.ts b/animation/memory_and_smart_pointers/src/project.ts
new file mode 100644
index 0000000..3a4de14
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/project.ts
@@ -0,0 +1,41 @@
+import { makeProject } from '@motion-canvas/core';
+import { Code, LezerHighlighter } from '@motion-canvas/2d';
+import { parser } from '@lezer/cpp';
+import { tags } from '@lezer/highlight';
+import { HighlightStyle } from '@codemirror/language';
+
+const MyStyle = HighlightStyle.define([
+ { tag: tags.keyword, color: '#569CD6' }, // VSCode Keyword color
+ { tag: tags.controlKeyword, color: '#C586C0' }, // VSCode Control Keyword color
+ { tag: tags.operatorKeyword, color: '#C586C0' }, // VSCode Control Keyword color
+ { tag: tags.comment, color: 'gray' }, // VSCode Comment color
+ { tag: tags.className, color: '#4EC9B0' }, // VSCode Class Name color
+ { tag: tags.constant(tags.variableName), color: '#B5CEA8' }, // VSCode Constant color
+ { tag: tags.function(tags.variableName), color: '#DCDCAA' }, // VSCode Function color
+ { tag: tags.function(tags.propertyName), color: '#DCDCAA' }, // VSCode Function color
+ { tag: tags.propertyName, color: '#DCDCAA' }, // VSCode Function color
+ { tag: tags.number, color: '#B5CEA8' }, // VSCode Number color
+ { tag: tags.string, color: '#CE9178' }, // VSCode String color
+ { tag: tags.typeName, color: '#4EC9B0' }, // VSCode Type Name color
+ { tag: tags.squareBracket, color: '#C586C0' }, // VSCode Square Bracket color
+ { tag: tags.bracket, color: '#C586C0' }, // VSCode Bracket color
+ { tag: tags.brace, color: '#DDDD22' }, // VSCode Brace color
+ { tag: tags.processingInstruction, color: '#C586C0' }, // VSCode Brace color
+ { tag: tags.arithmeticOperator, color: '#D16969' }, // VSCode Arithmetic Operator color
+]);
+
+Code.defaultHighlighter = new LezerHighlighter(parser, MyStyle);
+
+import './global.css';
+
+import memory from './scenes/memory?scene';
+import stack from './scenes/stack?scene';
+import stack_persistent from './scenes/stack_persistent?scene';
+import heap from './scenes/heap?scene';
+import code from './scenes/code?scene';
+import memory_show from './scenes/memory_show?scene';
+
+export default makeProject({
+ scenes: [
+ code],
+});
diff --git a/animation/memory_and_smart_pointers/src/scenes/code.meta b/animation/memory_and_smart_pointers/src/scenes/code.meta
new file mode 100644
index 0000000..f0654cf
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/scenes/code.meta
@@ -0,0 +1,5 @@
+{
+ "version": 0,
+ "timeEvents": [],
+ "seed": 2771218248
+}
\ No newline at end of file
diff --git a/animation/memory_and_smart_pointers/src/scenes/code.tsx b/animation/memory_and_smart_pointers/src/scenes/code.tsx
new file mode 100644
index 0000000..c4e696a
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/scenes/code.tsx
@@ -0,0 +1,310 @@
+import { createRef } from '@motion-canvas/core/lib/utils';
+import { makeScene2D, Code, lines } from '@motion-canvas/2d';
+import { all, waitFor, waitUntil } from '@motion-canvas/core/lib/flow';
+import { DEFAULT } from '@motion-canvas/core/lib/signals';
+import { BBox, Vector2 } from '@motion-canvas/core/lib/types';
+
+export default makeScene2D(function* (view) {
+ const codeRef = createRef();
+ const code2Ref = createRef();
+
+ yield view.add(
);
+
+ yield view.add(
);
+
+
+ const duration = 1.0
+
+ const code_good_names = `\
+// 😱 Manual allocation is bad, especially in functions!
+namespace {
+
+struct Pool {
+ static int* GetPtr() { return &data_; }
+ inline static int data_{};
+};
+
+int* AllocateVariable() {
+ return new int;
+}
+
+int* AllocateArray(int size) {
+ return new int[size];
+}
+
+int* BorrowDataFromPool() {
+ return Pool::GetPtr();
+}
+
+} // namespace
+
+int main() {
+ auto* ptr_1 = AllocateVariable();
+ auto* ptr_2 = AllocateArray(20);
+ auto* ptr_3 = BorrowDataFromPool();
+ delete ptr_1;
+ delete[] ptr_2;
+ return 0;
+}`
+
+ const code_flipped_names_1 = `\
+// 😱 Manual allocation is bad, especially in functions!
+namespace {
+
+struct Pool {
+ static int* GetPtr() { return &data_; }
+ inline static int data_{};
+};
+
+// 😱 Implementation changed, but not the name!
+int* AllocateVariable() {
+ return Pool::GetPtr();
+}
+
+int* AllocateArray(int size) {
+ return new int[size];
+}
+
+int* BorrowDataFromPool() {
+ return Pool::GetPtr();
+}
+
+} // namespace
+
+int main() {
+ auto* ptr_1 = AllocateVariable();
+ auto* ptr_2 = AllocateArray(20);
+ auto* ptr_3 = BorrowDataFromPool();
+ delete[] ptr_2;
+ return 0;
+}`
+
+ const code_flipped_names_2 = `\
+// 😱 Manual allocation is bad, especially in functions!
+namespace {
+
+struct Pool {
+ static int* GetPtr() { return &data_; }
+ inline static int data_{};
+};
+
+// 😱 Implementation changed, but not the name!
+int* AllocateVariable() {
+ return Pool::GetPtr();
+}
+
+int* AllocateArray(int size) {
+ return new int[size];
+}
+
+// 😱 Implementation changed, but not the name!
+int* BorrowDataFromPool() {
+ return new int;
+}
+
+} // namespace
+
+int main() {
+ auto* ptr_1 = AllocateVariable();
+ auto* ptr_2 = AllocateArray(20);
+ auto* ptr_3 = BorrowDataFromPool();
+ delete ptr_3;
+ delete[] ptr_2;
+ return 0;
+}`
+
+ const code_bad_names = `\
+namespace {
+
+struct Pool {
+ static int* GetPtr() { return &data_; }
+ inline static int data_{};
+};
+
+int* Foo() {
+ return Pool::GetPtr();
+}
+
+int* Bar(int size) {
+ return new int[size];
+}
+
+int* Buzz() {
+ return new int;
+}
+
+} // namespace
+
+int main() {
+ auto* ptr_1 = Foo();
+ auto* ptr_2 = Bar(20);
+ auto* ptr_3 = Buzz();
+ delete ptr_3;
+ delete[] ptr_2;
+ return 0;
+}`
+
+ const code_with_include = `\
+#include "lib.hpp"
+
+int main() {
+ auto* ptr_1 = Foo();
+ auto* ptr_2 = Bar(20);
+ auto* ptr_3 = Buzz();
+ // 😱 What should we do with these pointers?
+ return 0;
+}`
+
+ const code_declarations = `\
+int* Foo();
+int* Bar(int number);
+int* Buzz();`
+
+
+ yield* codeRef().code(code_good_names, 0).wait(duration);
+ yield* waitFor(duration);
+
+ yield* codeRef().code(code_flipped_names_1, duration);
+ yield* codeRef().code(code_flipped_names_2, duration).wait(duration);
+ yield* waitFor(duration);
+
+ yield* codeRef().code(code_bad_names, duration).wait(duration);
+ yield* waitFor(duration);
+
+ yield* all(
+ code2Ref().code(code_with_include, duration).wait(duration),
+ codeRef().code(code_declarations, duration).wait(duration)
+ );
+ yield* waitFor(duration);
+
+ const code_object_empty = `\
+class Object {
+ private:
+ int* data_{};
+};`
+
+ yield* code2Ref().code('', 0);
+ yield* codeRef().code(code_object_empty, 0);
+ yield* codeRef().fontSize(35, 0);
+ yield* codeRef().x(-200, 0);
+ yield* waitFor(duration);
+
+ const code_object_construct = `\
+// 😱 Missing crucial special functions.
+class Object {
+ public:
+ explicit Object(int number) : data_{new int{number}} {}
+
+ private:
+ int* data_{};
+};`
+
+ yield* all(
+ codeRef().code(code_object_construct, duration).wait(duration),
+ codeRef().x(-450, duration)
+ );
+ yield* waitFor(duration);
+
+ const code_object_destroy = `\
+// 😱 Missing crucial special functions.
+class Object {
+ public:
+ explicit Object(int number) : data_{new int{number}} {}
+
+ ~Object() { delete data_; }
+
+ private:
+ int* data_{};
+};`
+
+ yield* all(
+ codeRef().code(code_object_destroy, duration).wait(duration),
+ codeRef().x(-450, duration)
+ );
+ yield* waitFor(duration);
+
+ const code_object_copy_move_complete = `\
+class Object {
+ public:
+ explicit Object(int number) : data_{new int{number}} {}
+
+ ~Object() { delete data_; }
+
+ Object(const Object& other)
+ : data_{other.data_ ? new int{*other.data_} : nullptr} {}
+
+ Object(Object&& other) : data_{other.data_} { other.data_ = nullptr; }
+
+ Object& operator=(const Object& other) {
+ if (other.data_) {
+ data_ = new int{*other.data_};
+ }
+ return *this;
+ }
+
+ Object& operator=(Object&& other) {
+ data_ = other.data_;
+ other.data_ = nullptr;
+ return *this;
+ }
+
+ private:
+ int* data_{};
+};`
+
+ yield* all(
+ codeRef().code(code_object_copy_move_complete, duration).wait(duration),
+ codeRef().x(-600, duration),
+ codeRef().fontSize(30, duration)
+ );
+ yield* waitFor(duration);
+
+
+ const unique_ptr = `\
+// Simplified.
+template
+class unique_ptr {
+ public:
+ explicit unique_ptr(T* ptr) : ptr_{ptr} {}
+
+ ~unique_ptr() { delete ptr_; }
+
+ unique_ptr(const unique_ptr& other) = delete;
+ unique_ptr& operator=(const unique_ptr& other) = delete;
+
+ unique_ptr(unique_ptr&& other) : ptr_{other.ptr_} { other.ptr_ = nullptr; }
+ unique_ptr& operator=(unique_ptr&& other) {
+ ptr_ = other.ptr_;
+ other.ptr_ = nullptr;
+ return *this;
+ }
+
+ // Missing getters and some other functions like reset.
+
+ private:
+ T* ptr_{};
+};
+`
+
+ yield* all(
+ codeRef().code(unique_ptr, 0).wait(duration),
+ codeRef().x(-600, duration),
+ codeRef().fontSize(30, duration)
+ );
+ yield* waitFor(duration);
+
+});
diff --git a/animation/memory_and_smart_pointers/src/scenes/example.meta b/animation/memory_and_smart_pointers/src/scenes/example.meta
new file mode 100644
index 0000000..2d62bec
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/scenes/example.meta
@@ -0,0 +1,5 @@
+{
+ "version": 0,
+ "timeEvents": [],
+ "seed": 1501821170
+}
\ No newline at end of file
diff --git a/animation/memory_and_smart_pointers/src/scenes/example.tsx b/animation/memory_and_smart_pointers/src/scenes/example.tsx
new file mode 100644
index 0000000..5ec127c
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/scenes/example.tsx
@@ -0,0 +1,400 @@
+import {makeScene2D} from '@motion-canvas/2d/lib/scenes';
+import {createRef} from '@motion-canvas/core/lib/utils';
+import {
+ CodeBlock,
+ edit,
+ insert,
+ lines,
+ word,
+ remove,
+ CodeModification,
+} from '@motion-canvas/2d/lib/components/CodeBlock';
+import {all, waitFor, waitUntil} from '@motion-canvas/core/lib/flow';
+import { DEFAULT } from '@motion-canvas/core/lib/signals';
+import { BBox, Vector2 } from '@motion-canvas/core/lib/types';
+
+export default makeScene2D(function* (view) {
+ const codeRef = createRef();
+
+ yield view.add();
+
+
+ const duration = 1.5
+
+ const store = (...args: [TemplateStringsArray, ...any]) => args;
+
+ function to_string([strings, ...values]: [TemplateStringsArray, ...any]): string {
+ return strings.reduce((acc, str, i) => {
+ const value = values[i] ?? '';
+ return acc + str + value;
+ }, ' ');
+ }
+
+ function append(
+ template_1: TemplateStringsArray, args_1: string[],
+ template_2: TemplateStringsArray, args_2: string[]) : [TemplateStringsArray, ...string[]] {
+ let new_template = Array.from(template_1);
+ let new_args: Array = args_1;
+ new_template[template_1.length - 1] += template_2[0]
+ new_template = new_template.concat(template_2.slice(1))
+ new_args = new_args.concat(args_2)
+ return [new_template as unknown as TemplateStringsArray, ...new_args];
+ }
+
+ const isCodeModification = (code: any): code is CodeModification => (code as CodeModification).from !== undefined;
+
+ function simplify(
+ args_in: [TemplateStringsArray, ...any]) : [TemplateStringsArray, ...string[]] {
+ const template = args_in[0]
+ const args = args_in.slice(1)
+ if (args.every((arg) => (typeof(arg) == "string") || isCodeModification(arg))) {
+ return args_in
+ }
+ let new_template: Array = [];
+ let new_args: Array = [];
+ let concatenate = false;
+ for (let i = 0; i <= args.length; i++) {
+ if (concatenate) {
+ concatenate = false;
+ new_template[new_template.length - 1] += template[i];
+ } else {
+ new_template.push(template[i]);
+ }
+ if (i == args.length) { break; }
+ if (typeof(args[i]) == "string" || isCodeModification(args[i])) {
+ new_args.push(args[i])
+ continue;
+ }
+ let simplified_arg = simplify(args[i]);
+ let simplified_template = simplified_arg[0]
+ let simplified_args = simplified_arg.slice(1)
+ const appended = append(
+ new_template as unknown as TemplateStringsArray,
+ new_args,
+ simplified_template,
+ simplified_args as string[]);
+ new_template = Array.from(appended[0])
+ new_args = appended.slice(1)
+ concatenate = true;
+ }
+ return [new_template as unknown as TemplateStringsArray, ...new_args]
+ }
+
+
+ const code = (operator:any = ``, main:any = ``, operator_move:any=``) => store`
+ #include
+ #include
+
+ struct HugeObject {
+ HugeObject() = default;
+
+ explicit HugeObject(std::size_t data_length)
+ : length{data_length}, ptr{AllocateMemory(length)} {}
+ ${operator}${operator_move}
+ ~HugeObject() { FreeMemory(ptr); }
+
+ std::size_t length{};
+ std::byte *ptr{};
+ };
+ ${main}
+ `
+
+ const copy = `ptr = AllocateMemory(length);
+ std::copy(object.ptr, object.ptr + length, ptr);`
+ const steal = `ptr = object.ptr;
+ object.ptr = nullptr;`
+
+ const operator_copy = (
+ const_word:any = `const `,
+ copy_or_steal:any = copy,
+ ) => store`
+ HugeObject &operator=(${const_word}HugeObject& object) {
+ if (this == &object) { return *this; }
+ FreeMemory(ptr);
+ length = object.length;
+ ${copy_or_steal}
+ return *this;
+ }
+ `
+
+ const operator_move = `
+
+ HugeObject &operator=(HugeObject&& object) {
+ if (this == &object) { return *this; }
+ FreeMemory(ptr);
+ length = object.length;
+ ptr = object.ptr;
+ object.ptr = nullptr;
+ return *this;
+ }
+ `
+
+ const assign_fail = `
+ // ❌ Does not compile.
+ storage.member_object = HugeObject{200};`
+
+ const assign_int_fail = `
+ // ❌ Does not compile either.
+ int& answer = 42;`
+
+ const main_fn = (comment:any = ``, assign_temp:any = ``) => store`
+ struct HugeObjectStorage {
+ HugeObject member_object;
+ };
+
+ int main() {
+ HugeObject object{100};
+ HugeObjectStorage storage{};
+ storage.member_object = object;${assign_temp}
+ return 0;
+ } ${comment}`
+
+ const comment = ` // storage and object are destroyed`
+
+ const zoom_fn = (in_zoom: number) => new Vector2(in_zoom, in_zoom);
+
+ yield * codeRef().edit(duration, false)(...simplify(code()));
+ yield * codeRef().selection([...word(7, 30, 28)], duration);
+ yield * waitFor(duration);
+ yield * codeRef().selection([...word(9, 20, 15)], duration);
+ yield * waitFor(duration);
+ yield * codeRef().edit(duration, true)(...code(edit(``, to_string(operator_copy()))));
+ yield * waitFor(duration);
+ yield * codeRef().selection([...lines(9)], duration);
+ yield * waitFor(duration);
+ yield * all(
+ codeRef().selection([...word(9, 26, 24)], duration),
+ codeRef().scale(zoom_fn(1.5), duration),
+ codeRef().position(new Vector2(-500, 200), duration),
+ );
+ yield * waitFor(duration);
+ yield * all(
+ codeRef().selection([...lines(14)], duration),
+ codeRef().scale(zoom_fn(1.2), duration),
+ codeRef().position(new Vector2(50, -200), duration),
+ );
+ yield * waitFor(duration);
+ yield * all(
+ codeRef().selection(DEFAULT, duration),
+ codeRef().scale(zoom_fn(0.7), duration),
+ codeRef().position(new Vector2(0, 0), duration),
+ );
+ yield * waitFor(duration);
+ yield * all(
+ codeRef().position(new Vector2(0, -300), duration),
+ codeRef().edit(duration, true)(...simplify(code(operator_copy(), edit(``, to_string(main_fn()))))),
+ );
+ yield * all(
+ codeRef().scale(zoom_fn(1.2), duration),
+ codeRef().position(new Vector2(400, -800), duration),
+ );
+ yield * codeRef().selection([...lines(29)], duration);
+ yield * codeRef().selection([...lines(30)], duration);
+ yield * codeRef().selection([...lines(31)], duration);
+ yield * codeRef().edit(duration, true)(...simplify(code(operator_copy(), main_fn(insert(comment)))));
+ yield * waitFor(duration);
+
+ // Show destructor
+ yield * all(
+ codeRef().selection(DEFAULT, duration),
+ codeRef().scale(zoom_fn(0.5), duration),
+ codeRef().position(new Vector2(0, 0), duration),
+ );
+ yield * waitFor(duration);
+ yield * all(
+ codeRef().selection(DEFAULT, duration),
+ codeRef().scale(zoom_fn(1.2), duration),
+ codeRef().selection([...lines(18 )], duration),
+ codeRef().position(new Vector2(200, 0), duration),
+ );
+ yield * waitFor(duration);
+
+ // Show const
+ yield * all(
+ codeRef().selection(DEFAULT, duration),
+ codeRef().scale(zoom_fn(0.5), duration),
+ codeRef().position(new Vector2(0, 0), duration),
+ );
+ yield * waitFor(duration);
+ yield * all(
+ codeRef().scale(zoom_fn(1.2), duration),
+ codeRef().selection([...lines(9, 16)], duration),
+ codeRef().position(new Vector2(50, 400), duration),
+ );
+ yield * waitFor(duration);
+ yield * all(
+ codeRef().scale(zoom_fn(3.0), duration),
+ codeRef().selection([...word(9, 26, 5)], duration),
+ codeRef().position(new Vector2(100, 1400), duration),
+ );
+ yield * waitFor(duration);
+
+ // Remove const
+ yield * all(
+ codeRef().edit(duration, false)(...simplify(code(operator_copy(edit('const ', '')), main_fn(comment)))),
+ codeRef().selection([...word(9, 26, 12)], duration),
+ );
+ yield * all(
+ codeRef().scale(zoom_fn(1.2), duration),
+ codeRef().position(new Vector2(50, 400), duration),
+ codeRef().selection([...lines(9, 16)], duration),
+ );
+ yield *codeRef().selection([...lines(13, 14)], duration);
+ yield * codeRef().edit(duration, true)(...simplify(code(operator_copy('', edit(copy, steal)), main_fn(comment))));
+ yield * waitFor(duration);
+
+ // Look at the main again
+ yield * all(
+ codeRef().selection(DEFAULT, duration),
+ codeRef().scale(zoom_fn(0.5), duration),
+ codeRef().position(new Vector2(0, 0), duration),
+ );
+ yield * waitFor(duration);
+ yield * all(
+ codeRef().scale(zoom_fn(1.2), duration),
+ codeRef().position(new Vector2(400, -800), duration),
+ );
+ yield * codeRef().selection([...lines(29)], duration);
+ yield * codeRef().selection([...lines(30)], duration);
+ yield * codeRef().selection([...lines(31)], duration);
+ yield * codeRef().selection(DEFAULT, duration);
+
+ yield * waitFor(duration);
+ // Assign temp
+ yield * all(
+ codeRef().scale(zoom_fn(1.3), duration),
+ codeRef().edit(duration, true)(
+ ...simplify(
+ code(
+ operator_copy('', steal),
+ main_fn(comment, insert(assign_fail))))),
+ codeRef().position(new Vector2(200, -1100), duration),
+ );
+ yield * waitFor(duration);
+ yield * codeRef().edit(duration, true)(
+ ...simplify(
+ code(
+ operator_copy('', steal),
+ main_fn(comment, edit(assign_fail, assign_int_fail)))));
+ yield * waitFor(duration);
+
+ yield * all(
+ codeRef().selection(DEFAULT, duration),
+ codeRef().scale(zoom_fn(0.5), duration),
+ codeRef().position(new Vector2(0, 0), duration),
+ codeRef().edit(duration, false)(
+ ...simplify(
+ code(
+ operator_copy('', steal),
+ main_fn(comment, remove(assign_int_fail))))),
+ );
+
+ // Add move operator
+ yield * waitFor(duration);
+ yield * all(
+ codeRef().scale(zoom_fn(1.0), duration),
+ codeRef().position([0, 260], duration),
+ codeRef().edit(duration, true)(
+ ...simplify(
+ code(
+ operator_copy(insert('const '),
+ edit(steal, copy)),
+ main_fn(comment),
+ insert(operator_move)))),
+ );
+ yield * waitFor(duration);
+ yield * codeRef().selection([...word(9, 26, 24), ...lines(13, 14)], duration);
+ yield * waitFor(duration);
+ yield * codeRef().selection([...word(18, 26, 19), ...lines(22, 23)], duration);
+ yield * waitFor(duration);
+
+ const comment_temp_bind = `// Can be bound to a temporary`
+ const comment_pick_overload = ` // The compiler picks Blah(int&&)`
+
+ const blah_code = (
+ comment_temp:any = ``,
+ comment_pick:any = ``,
+ blah_answer:any = ``,
+ blah_answer_comment:any = ``,
+ blah_move_answer:any = ``,
+ blah_move_answer_comment:any = ``,
+ ) => store`
+ #include
+
+ void Blah(int&) {
+ std::cout << "&" << std::endl;
+ }
+
+ void Blah(int&&) {
+ std::cout << "&&" << std::endl;
+ }
+
+ int main() {
+ int&& answer = 42; ${comment_temp}
+ Blah(42);${comment_pick}${blah_answer}${blah_answer_comment}${blah_move_answer}${blah_move_answer_comment}
+ }`
+
+
+ yield * waitFor(duration);
+ yield * all(
+ codeRef().edit(duration, false)(...blah_code()),
+ codeRef().selection(DEFAULT, duration),
+ codeRef().scale(zoom_fn(1.0), 0),
+ codeRef().position(new Vector2(0, 0), 0),
+ );
+ yield * waitFor(duration);
+ yield * codeRef().selection([...lines(11)], duration);
+ yield * codeRef().edit(duration, false)(...simplify(blah_code(insert(comment_temp_bind))));
+ yield * waitFor(duration);
+ yield * codeRef().selection([...lines(12)], duration);
+ yield * codeRef().edit(duration, false)(...simplify(blah_code(comment_temp_bind, insert(comment_pick_overload))));
+ yield * waitFor(duration);
+ yield * waitFor(duration);
+
+
+ const final_main = `
+ int main() {
+ HugeObject object{100};
+ HugeObjectStorage storage{};
+ storage.member_object = object;
+ storage.member_object = HugeObject{200};
+ storage.member_object = std::move(object);
+ return 0;
+ }`
+
+ yield * codeRef().selection(DEFAULT, 0),
+ yield * codeRef().edit(duration, false)`${final_main}`;
+ yield * waitFor(duration);
+ yield * codeRef().selection([...lines(4)], duration);
+ yield * codeRef().selection([...lines(5)], duration);
+ yield * codeRef().selection([...lines(6)], duration);
+ yield * waitFor(duration);
+
+ const rref_comment = ` // Prints "&&"`
+ const lref_comment = ` // Prints "&"`
+ const blah_answer_ref = `
+ Blah(answer);`
+ const blah_answer_rref = `
+ Blah(std::move(answer));`
+
+ // Final rref example
+ yield * codeRef().selection(DEFAULT, 0),
+ yield * codeRef().edit(duration, false)(...blah_code());
+ yield * codeRef().edit(duration, false)(...blah_code('', insert(rref_comment)));
+ yield * codeRef().edit(duration, false)(...blah_code('', rref_comment, insert(blah_answer_ref)));
+ yield * codeRef().edit(duration, false)(...blah_code(
+ '', rref_comment, blah_answer_ref, insert(lref_comment)));
+ yield * codeRef().edit(duration, false)(...blah_code(
+ '', rref_comment, blah_answer_ref, lref_comment, insert(blah_answer_rref)));
+ yield * codeRef().edit(duration, false)(...blah_code(
+ '', rref_comment, blah_answer_ref, lref_comment, blah_answer_rref, insert(rref_comment)));
+
+ yield * waitFor(duration);
+
+ yield * waitFor(duration);
+
+});
diff --git a/animation/memory_and_smart_pointers/src/scenes/heap.meta b/animation/memory_and_smart_pointers/src/scenes/heap.meta
new file mode 100644
index 0000000..41ae958
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/scenes/heap.meta
@@ -0,0 +1,5 @@
+{
+ "version": 0,
+ "timeEvents": [],
+ "seed": 4149161514
+}
\ No newline at end of file
diff --git a/animation/memory_and_smart_pointers/src/scenes/heap.tsx b/animation/memory_and_smart_pointers/src/scenes/heap.tsx
new file mode 100644
index 0000000..acbaf66
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/scenes/heap.tsx
@@ -0,0 +1,346 @@
+import { Node, lines, word, makeScene2D, Code, Txt, Rect, Grid, Line, Layout } from '@motion-canvas/2d';
+import { all, sequence, waitFor } from '@motion-canvas/core/lib/flow';
+import { Vector2 } from '@motion-canvas/core/lib/types';
+import { createRef } from '@motion-canvas/core/lib/utils';
+import { createSignal, DEFAULT } from '@motion-canvas/core/lib/signals';
+import { CodeBlock, edit, insert, range } from '@motion-canvas/2d/lib/components/CodeBlock';
+
+const RED = '#ff6470';
+const GREEN = '#99C47A';
+const BLUE = '#68ABDF';
+const WHITE = '#FFFFFF';
+
+export default makeScene2D(function* (view) {
+
+ const grid_ref = createRef();
+ const address_ref = createRef();
+ const data_rect_ref_1 = createRef();
+ const data_rect_ref_2 = createRef();
+
+ const table_layout =
+
+ table_layout.add(
+ )
+ table_layout.add(
+
+
+ )
+ table_layout.add(
+ )
+ table_layout.add(
+ )
+
+ var stack_refs = []
+ var line_refs = []
+
+ for (let i = 4; i >= 0; i--) {
+ const text_ref = createRef();
+ const line_ref = createRef();
+ stack_refs.push(text_ref);
+ line_refs.push(line_ref);
+ table_layout.add(
+
+
+
+
+
+
+
+
+ );
+ }
+ stack_refs.reverse();
+
+ const command_txt_ref = createRef()
+
+ table_layout.add(
+
+
+
+ )
+
+ view.add(table_layout)
+ view.add()
+ view.add()
+ const code_stack = `\
+#include
+
+int main() {
+ int size = 2;
+ int* ptr = nullptr;
+ {
+ int array[size]; // 😱 Don't use C-style arrays!
+ array[0] = 42;
+ array[1] = 23;
+ ptr = array;
+ std::cout << "Before stack cleanup.\\n";
+ for (int i = 0; i < size; ++i) {
+ std::cout << ptr[i] << std::endl;
+ }
+ }
+ // 😱 Code below leads to undefined behavior!
+ std::cout << "After stack cleanup.\\n";
+ for (int i = 0; i < size; ++i) {
+ std::cout << ptr[i] << std::endl;
+ }
+ return 0;
+}`
+
+ const code_heap = `\
+#include
+
+int main() {
+ int size = 2;
+ int* ptr = nullptr;
+ {
+ // 😱 Don't use unprotected new and new[]!
+ int* array = new int[size];
+ array[0] = 42;
+ array[1] = 23;
+ ptr = array;
+ std::cout << "Before stack cleanup.\\n";
+ for (int i = 0; i < size; ++i) {
+ std::cout << ptr[i] << std::endl;
+ }
+ }
+ std::cout << "After stack cleanup.\\n";
+ for (int i = 0; i < size; ++i) {
+ std::cout << ptr[i] << std::endl;
+ }
+ delete[] ptr; // 😱 What points to our data?
+ return 0;
+}`
+ const code_ref = createRef()
+
+ yield view.add(
+
);
+
+ const duration = 1.0
+
+ // Frame
+ yield* all(
+ code_ref().code(code_stack, duration),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ code_ref().code(code_heap, duration),
+ waitFor(3 * duration)
+ );
+
+ yield* all(
+ table_layout.x(-600, duration),
+ grid_ref().end(1, 2 * duration),
+ grid_ref().start(0, 2 * duration),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ stack_refs[0]().code(`size = 2`, duration),
+ code_ref().selection(lines(3), duration),
+ command_txt_ref().text('push(int)', duration / 3),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ stack_refs[1]().code(`ptr = nullptr`, duration),
+ code_ref().selection(lines(4), duration),
+ command_txt_ref().text('', duration / 3).to('push(int*)', duration / 3),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ command_txt_ref().text('', duration / 3).to('malloc(8)', duration / 3),
+ code_ref().selection(word(7, 16, 15), duration),
+ sequence(0.1,
+ address_ref().text('0x8eceb0', duration / 2),
+ data_rect_ref_1().opacity(0.8, duration),
+ data_rect_ref_2().opacity(0.8, duration),
+ ),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ stack_refs[2]().code(`array = 0x8eceb0`, duration),
+ command_txt_ref().text('', duration / 3).to('push(int*)', duration / 3),
+ code_ref().selection(lines(7), duration),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ command_txt_ref().text('', duration / 3),
+ code_ref().selection(lines(8), duration),
+ data_rect_ref_1().fill(BLUE, duration),
+ waitFor(duration)
+ );
+
+ // Frame
+ yield* all(
+ code_ref().selection(lines(8, 9), duration),
+ data_rect_ref_2().fill(BLUE, duration),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ stack_refs[1]().code(`ptr = 0x8eceb0`, duration),
+ code_ref().selection(lines(10), duration),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ code_ref().selection(lines(11, 14), duration),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ sequence(0.1,
+ stack_refs[2]().code('⁉️', duration)),
+ code_ref().selection(lines(15), duration),
+ command_txt_ref().text('', duration / 3).to('pop()', duration / 3),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ code_ref().selection(lines(16, 19), duration),
+ command_txt_ref().text('', duration / 3),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ sequence(0.1,
+ data_rect_ref_1().opacity(0, duration),
+ data_rect_ref_2().opacity(0, duration)),
+ code_ref().selection(lines(20), duration),
+ waitFor(3 * duration)
+ );
+
+ // Frame
+ yield* all(
+ sequence(0.1,
+ stack_refs[1]().code('⁉️', duration),
+ stack_refs[0]().code('⁉️', duration)),
+ code_ref().selection(lines(22), duration),
+ command_txt_ref().text('', duration / 3),
+ waitFor(3 * duration)
+ );
+
+
+
+ // Frame
+ yield* all(
+ code_ref().selection(DEFAULT, duration),
+ command_txt_ref().text('', duration / 3),
+ waitFor(3 * duration)
+ );
+
+ yield* waitFor(3.0);
+
+});
diff --git a/animation/memory_and_smart_pointers/src/scenes/memory.meta b/animation/memory_and_smart_pointers/src/scenes/memory.meta
new file mode 100644
index 0000000..5ce0a4c
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/scenes/memory.meta
@@ -0,0 +1,5 @@
+{
+ "version": 0,
+ "timeEvents": [],
+ "seed": 1938444845
+}
\ No newline at end of file
diff --git a/animation/memory_and_smart_pointers/src/scenes/memory.tsx b/animation/memory_and_smart_pointers/src/scenes/memory.tsx
new file mode 100644
index 0000000..15ce6ee
--- /dev/null
+++ b/animation/memory_and_smart_pointers/src/scenes/memory.tsx
@@ -0,0 +1,188 @@
+import { makeScene2D } from '@motion-canvas/2d/lib/scenes';
+import { Node, Circle, Rect, Grid, Line } from '@motion-canvas/2d/lib/components';
+import { all, waitFor } from '@motion-canvas/core/lib/flow';
+import { Vector2 } from '@motion-canvas/core/lib/types';
+import { createRef } from '@motion-canvas/core/lib/utils';
+import { createSignal } from '@motion-canvas/core/lib/signals';
+import { CodeBlock } from '@motion-canvas/2d/lib/components/CodeBlock';
+import {Video} from '@motion-canvas/2d/lib/components';
+import travolta from '../../videos/travolta.mp4';
+
+const RED = '#ff6470';
+const GREEN = '#99C47A';
+const BLUE = '#68ABDF';
+
+export default makeScene2D(function* (view) {
+ const data_ref = createRef();
+ const other_data_ref = createRef();
+ const object_ref = createRef();
+ const other_object_ref = createRef();
+ const line_1 = createRef();
+ const line_2 = createRef();
+ const node_ref = createRef();
+ const travolta_ref = createRef